@robot-admin/naive-ui-components 0.6.28 → 0.6.30

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 (142) hide show
  1. package/dist/C_Chat-CJ8KESTM.css.map +1 -0
  2. package/dist/C_Chat-DzV4AFLd.css.map +1 -0
  3. package/dist/C_Chat.css +14 -8
  4. package/dist/{C_CollapsePanel-CWkFCqNQ.css.map → C_CollapsePanel-BkOivqn3.css.map} +1 -1
  5. package/dist/{C_CollapsePanel-pcVJA_4z.css.map → C_CollapsePanel-CedsEM0N.css.map} +1 -1
  6. package/dist/C_CollapsePanel.css +35 -35
  7. package/dist/C_CollapsePanel.js.map +1 -1
  8. package/dist/C_CollapsePanel2.js +1 -1
  9. package/dist/C_CollapsePanel2.js.map +1 -1
  10. package/dist/C_Editor-C49qURgb.css.map +1 -0
  11. package/dist/C_Editor-DuxBD9Qg.css.map +1 -0
  12. package/dist/C_Editor.css +60 -29
  13. package/dist/C_Editor.js.map +1 -1
  14. package/dist/C_Editor2.js +1 -1
  15. package/dist/C_Editor2.js.map +1 -1
  16. package/dist/C_Guide.d.cts +2 -2
  17. package/dist/C_Guide.d.ts +2 -2
  18. package/dist/C_Guide.js.map +1 -1
  19. package/dist/C_Guide2.js +1 -1
  20. package/dist/C_Guide2.js.map +1 -1
  21. package/dist/C_Markdown-7J0uPEuk.css.map +1 -0
  22. package/dist/C_Markdown-C7Lg0_9z.css.map +1 -0
  23. package/dist/C_Markdown.css +16 -10
  24. package/dist/C_OrgChart-ChZu346B.css.map +1 -0
  25. package/dist/C_OrgChart-DqBufOv5.css.map +1 -0
  26. package/dist/C_OrgChart.cjs +1 -0
  27. package/dist/C_OrgChart.css +282 -0
  28. package/dist/C_OrgChart.d.cts +2 -0
  29. package/dist/C_OrgChart.d.ts +2 -0
  30. package/dist/C_OrgChart.js +1 -0
  31. package/dist/C_OrgChart.js.map +1 -0
  32. package/dist/C_OrgChart2.js +2 -0
  33. package/dist/C_OrgChart2.js.map +1 -0
  34. package/dist/C_Progress.d.cts +1 -1
  35. package/dist/C_Progress.d.ts +1 -1
  36. package/dist/C_Signature.js.map +1 -1
  37. package/dist/C_Signature2.js.map +1 -1
  38. package/dist/C_Skeleton-BNPbaut7.css.map +1 -0
  39. package/dist/C_Skeleton-Djsjw8XY.css.map +1 -0
  40. package/dist/C_Skeleton.cjs +1 -0
  41. package/dist/C_Skeleton.css +253 -0
  42. package/dist/C_Skeleton.d.cts +2 -0
  43. package/dist/C_Skeleton.d.ts +2 -0
  44. package/dist/C_Skeleton.js +1 -0
  45. package/dist/C_Skeleton.js.map +1 -0
  46. package/dist/C_Skeleton2.js +2 -0
  47. package/dist/C_Skeleton2.js.map +1 -0
  48. package/dist/C_Steps.d.cts +1 -1
  49. package/dist/C_Steps.d.ts +1 -1
  50. package/dist/C_Table-B8hpzOcR.css.map +1 -0
  51. package/dist/C_Table-CGP3n_u0.css.map +1 -0
  52. package/dist/C_Table.css +94 -69
  53. package/dist/C_Table.d.cts +2 -2
  54. package/dist/C_Table.d.ts +2 -2
  55. package/dist/C_Table.js.map +1 -1
  56. package/dist/C_Table2.js +1 -1
  57. package/dist/C_Table2.js.map +1 -1
  58. package/dist/C_TagsView.d.cts +1 -1
  59. package/dist/C_TagsView.d.ts +1 -1
  60. package/dist/C_Theme.d.cts +1 -1
  61. package/dist/C_Theme.d.ts +1 -1
  62. package/dist/{C_Timeline-BKkimrZx.css.map → C_Timeline-DG70WtJP.css.map} +1 -1
  63. package/dist/{C_Timeline-DTuSCX6p.css.map → C_Timeline-Dzxmmdjg.css.map} +1 -1
  64. package/dist/C_Timeline.css +45 -45
  65. package/dist/C_Timeline.d.cts +1 -1
  66. package/dist/C_Timeline.d.ts +1 -1
  67. package/dist/C_Timeline.js.map +1 -1
  68. package/dist/C_Timeline2.js +1 -1
  69. package/dist/C_Timeline2.js.map +1 -1
  70. package/dist/C_Transfer.d.cts +1 -1
  71. package/dist/C_Transfer.d.ts +1 -1
  72. package/dist/{C_Upload-S30RmC9t.css.map → C_Upload-CFAxVGVz.css.map} +1 -1
  73. package/dist/{C_Upload-i8LB_29U.css.map → C_Upload-D8_QeSV0.css.map} +1 -1
  74. package/dist/C_Upload.css +14 -9
  75. package/dist/C_Upload.js.map +1 -1
  76. package/dist/C_Upload2.js +1 -1
  77. package/dist/C_Upload2.js.map +1 -1
  78. package/dist/C_VtableGantt.d.cts +1 -1
  79. package/dist/C_VtableGantt.d.ts +1 -1
  80. package/dist/constants.d.ts +1 -1
  81. package/dist/constants2.d.ts +2 -2
  82. package/dist/constants3.d.ts +3 -3
  83. package/dist/constants4.d.ts +5 -5
  84. package/dist/constants5.d.ts +2 -2
  85. package/dist/data.d.ts +1 -1
  86. package/dist/index.cjs +1 -1
  87. package/dist/index.cjs.map +1 -1
  88. package/dist/index.d.cts +22 -20
  89. package/dist/index.d.ts +22 -20
  90. package/dist/index.js +1 -1
  91. package/dist/index.js.map +1 -1
  92. package/dist/index.vue.d.ts +1 -1
  93. package/dist/index13.vue.d.ts +3 -3
  94. package/dist/index14.vue.d.ts +85 -7
  95. package/dist/index15.vue.d.ts +6 -6
  96. package/dist/index17.vue.d.ts +1 -1
  97. package/dist/index18.vue.d.ts +4 -4
  98. package/dist/index20.vue.d.ts +87 -40
  99. package/dist/index21.vue.d.ts +47 -27
  100. package/dist/index22.vue.d.ts +95 -79
  101. package/dist/index23.vue.d.ts +24 -7
  102. package/dist/index24.vue.d.ts +76 -100
  103. package/dist/index25.vue.d.ts +7 -70
  104. package/dist/index26.vue.d.ts +99 -649
  105. package/dist/index27.vue.d.ts +81 -0
  106. package/dist/index28.vue.d.ts +662 -0
  107. package/dist/index3.vue.d.ts +3 -3
  108. package/dist/index4.vue.d.ts +6 -6
  109. package/dist/index6.vue.d.ts +2 -2
  110. package/dist/index8.vue.d.ts +1 -1
  111. package/dist/resolver.cjs +1 -1
  112. package/dist/resolver.cjs.map +1 -1
  113. package/dist/resolver.d.cts +1 -1
  114. package/dist/resolver.d.ts +1 -1
  115. package/dist/resolver.js +1 -1
  116. package/dist/resolver.js.map +1 -1
  117. package/dist/style.css +832 -220
  118. package/dist/useCalendarEvents.d.ts +1 -1
  119. package/dist/useCollapsePanel.d.ts +8 -8
  120. package/dist/useCropperCore.d.ts +4 -4
  121. package/dist/useDraggableLayout.d.ts +8 -8
  122. package/dist/useDynamicFormState.d.ts +10 -10
  123. package/dist/useEdgeInteraction.d.ts +1 -1
  124. package/dist/useFullscreen.d.ts +2 -2
  125. package/dist/useInfiniteScroll.d.ts +2 -2
  126. package/dist/useModalEdit.d.ts +52 -6
  127. package/dist/useQRCode.d.ts +5 -5
  128. package/dist/useSearchState.d.ts +2 -2
  129. package/dist/useSignatureHistory.d.ts +3 -3
  130. package/dist/useSplitResize.d.ts +8 -8
  131. package/dist/useTimeSelection.d.ts +2 -2
  132. package/dist/useTreeOperations.d.ts +4 -4
  133. package/dist/useWorkflowValidation.d.ts +2 -2
  134. package/package.json +5 -1
  135. package/dist/C_Chat-CcdWgVE8.css.map +0 -1
  136. package/dist/C_Chat-Cx0woEEe.css.map +0 -1
  137. package/dist/C_Editor-D0_6UhIa.css.map +0 -1
  138. package/dist/C_Editor-OlxIF9-5.css.map +0 -1
  139. package/dist/C_Markdown-7iBnLDtL.css.map +0 -1
  140. package/dist/C_Markdown-BbTvdFCl.css.map +0 -1
  141. package/dist/C_Table-vZlcgH6x.css.map +0 -1
  142. package/dist/C_Table-wzAO43l0.css.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"C_Editor2.js","names":["editorId"],"sources":["../src/components/C_Editor/index.vue","../src/components/C_Editor/index.vue","../src/components/C_Editor/index.vue"],"sourcesContent":["/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-01\r\n * @Description: 富文本编辑器组件(简化主题版)\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div\r\n ref=\"editorContainer\"\r\n :id=\"editorId\"\r\n v-show=\"isInitialized\"\r\n class=\"w-full\"\r\n :class=\"{ 'editor-dark': isDark }\"\r\n @focusin=\"handleEditorFocus\"\r\n @focusout=\"handleEditorBlur\"\r\n ></div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport {\r\n ref,\r\n computed,\r\n watch,\r\n nextTick,\r\n onMounted,\r\n onBeforeUnmount,\r\n readonly,\r\n} from \"vue\";\r\nimport E from \"wangeditor\";\r\n\r\ndefineOptions({ name: \"C_Editor\" });\r\n\r\ninterface Props {\r\n editorId: string;\r\n modelValue?: string;\r\n placeholder?: string;\r\n disabled?: boolean;\r\n readonly?: boolean;\r\n height?: number;\r\n theme?: \"light\" | \"dark\";\r\n}\r\n\r\ninterface Emits {\r\n (e: \"update:modelValue\", value: string): void;\r\n (e: \"editor-mounted\", editor: any): void;\r\n (e: \"editor-change\", html: string): void;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n modelValue: \"\",\r\n placeholder: \"\",\r\n disabled: false,\r\n readonly: false,\r\n height: 240,\r\n theme: \"light\",\r\n});\r\n\r\nconst emit = defineEmits<Emits>();\r\n\r\nconst editorContainer = ref<HTMLElement | null>(null);\r\nconst editorInstance = ref<any>(null);\r\nconst isInitialized = ref<boolean>(false);\r\n\r\nconst isDark = computed(() => props.theme === \"dark\");\r\n\r\nconst initializeEditor = (): void => {\r\n if (!editorContainer.value || isInitialized.value) return;\r\n\r\n try {\r\n const editor = new E(editorContainer.value);\r\n const editorConfig = editor.config as any;\r\n editorConfig.placeholder = props.placeholder;\r\n editorConfig.height = props.height - 50;\r\n\r\n editorConfig.onchange = (html: string) => {\r\n emit(\"update:modelValue\", html);\r\n emit(\"editor-change\", html);\r\n };\r\n\r\n editor.create();\r\n\r\n nextTick(() => {\r\n if (props.modelValue) {\r\n editor.txt.html(props.modelValue);\r\n }\r\n if (props.readonly) {\r\n editor.disable();\r\n }\r\n editorInstance.value = editor;\r\n isInitialized.value = true;\r\n emit(\"editor-mounted\", editor);\r\n });\r\n } catch (error) {\r\n console.error(`[C_Editor] 编辑器初始化失败: ${props.editorId}`, error);\r\n }\r\n};\r\n\r\nconst destroyEditor = (): void => {\r\n if (editorInstance.value && isInitialized.value) {\r\n try {\r\n editorInstance.value.destroy();\r\n editorInstance.value = null;\r\n isInitialized.value = false;\r\n } catch (error) {\r\n console.error(`[C_Editor] 编辑器销毁失败: ${props.editorId}`, error);\r\n }\r\n }\r\n};\r\n\r\nconst setContent = (html: string): void => {\r\n if (editorInstance.value && isInitialized.value) {\r\n try {\r\n editorInstance.value.txt.html(html);\r\n } catch (error) {\r\n console.warn(`[C_Editor] 设置编辑器内容失败: ${props.editorId}`, error);\r\n }\r\n }\r\n};\r\n\r\nconst getContent = (): string => {\r\n if (editorInstance.value && isInitialized.value) {\r\n try {\r\n return editorInstance.value.txt.html();\r\n } catch (error) {\r\n console.warn(`[C_Editor] 获取编辑器内容失败: ${props.editorId}`, error);\r\n return \"\";\r\n }\r\n }\r\n return \"\";\r\n};\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (newValue) => {\r\n if (editorInstance.value && isInitialized.value) {\r\n const currentContent = editorInstance.value.txt.html();\r\n if (currentContent !== newValue) {\r\n editorInstance.value.txt.html(newValue || \"\");\r\n }\r\n }\r\n },\r\n);\r\n\r\nwatch(\r\n () => props.disabled,\r\n (disabled) => {\r\n if (editorInstance.value && isInitialized.value) {\r\n try {\r\n if (disabled) editorInstance.value.disable();\r\n else editorInstance.value.enable();\r\n } catch (error) {\r\n console.warn(`[C_Editor] 设置编辑器状态失败`, error);\r\n }\r\n }\r\n },\r\n);\r\n\r\nwatch(\r\n () => props.readonly,\r\n (readonlyVal) => {\r\n if (editorInstance.value && isInitialized.value) {\r\n try {\r\n if (readonlyVal) editorInstance.value.disable();\r\n else editorInstance.value.enable();\r\n } catch (error) {\r\n console.warn(`[C_Editor] 设置编辑器只读状态失败`, error);\r\n }\r\n }\r\n },\r\n);\r\n\r\nconst handleEditorFocus = (): void => {\r\n if (!editorContainer.value) return;\r\n const container = editorContainer.value.closest(\r\n \".form-demo\",\r\n ) as HTMLElement | null;\r\n if (container) {\r\n container.classList.add(\"editor-focused\");\r\n const containerWidth = container.scrollWidth;\r\n container.style.maxWidth = `${containerWidth}px`;\r\n }\r\n};\r\n\r\nconst handleEditorBlur = (): void => {\r\n if (!editorContainer.value) return;\r\n const container = editorContainer.value.closest(\r\n \".form-demo\",\r\n ) as HTMLElement | null;\r\n if (container) {\r\n container.classList.remove(\"editor-focused\");\r\n container.style.maxWidth = \"\";\r\n }\r\n};\r\n\r\nonMounted(() => {\r\n nextTick(() => {\r\n initializeEditor();\r\n });\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n destroyEditor();\r\n});\r\n\r\ndefineExpose({\r\n initializeEditor,\r\n destroyEditor,\r\n setContent,\r\n getContent,\r\n handleEditorFocus,\r\n handleEditorBlur,\r\n editorInstance: readonly(editorInstance),\r\n isInitialized: readonly(isInitialized),\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n/* 暗色主题样式 */\r\n.editor-dark :deep(.w-e-toolbar) {\r\n background-color: #1f2937 !important;\r\n border-color: #374151 !important;\r\n}\r\n\r\n.editor-dark :deep(.w-e-toolbar .w-e-menu .w-e-menu-item) {\r\n color: #e5e7eb !important;\r\n}\r\n\r\n.editor-dark :deep(.w-e-toolbar .w-e-menu .w-e-menu-item:hover) {\r\n background-color: #374151 !important;\r\n color: #ffffff !important;\r\n}\r\n\r\n.editor-dark :deep(.w-e-toolbar .w-e-menu .w-e-menu-item.w-e-active) {\r\n background-color: #2080f0 !important;\r\n color: #ffffff !important;\r\n}\r\n\r\n.editor-dark :deep(.w-e-text-container) {\r\n background-color: #111827 !important;\r\n border-color: #374151 !important;\r\n}\r\n\r\n.editor-dark :deep(.w-e-text-container .w-e-text) {\r\n background-color: #303033 !important;\r\n color: #e5e7eb !important;\r\n}\r\n\r\n.editor-dark :deep(.w-e-text-container .w-e-text:focus) {\r\n background-color: #111827 !important;\r\n color: #e5e7eb !important;\r\n}\r\n\r\n:deep(.w-e-toolbar),\r\n:deep(.w-e-text-container) {\r\n max-width: 100% !important;\r\n overflow-x: auto !important;\r\n box-sizing: border-box !important;\r\n}\r\n\r\n:deep(.w-e-text) {\r\n max-width: 100% !important;\r\n word-wrap: break-word !important;\r\n overflow-wrap: break-word !important;\r\n}\r\n\r\n:deep(.w-e-toolbar),\r\n:deep(.w-e-text-container),\r\n:deep(.w-e-text) {\r\n transition:\r\n background-color 0.3s ease,\r\n border-color 0.3s ease,\r\n color 0.3s ease !important;\r\n}\r\n\r\n.editor-focused {\r\n overflow: hidden !important;\r\n max-width: 100% !important;\r\n}\r\n</style>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-01\r\n * @Description: 富文本编辑器组件(简化主题版)\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div\r\n ref=\"editorContainer\"\r\n :id=\"editorId\"\r\n v-show=\"isInitialized\"\r\n class=\"w-full\"\r\n :class=\"{ 'editor-dark': isDark }\"\r\n @focusin=\"handleEditorFocus\"\r\n @focusout=\"handleEditorBlur\"\r\n ></div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport {\r\n ref,\r\n computed,\r\n watch,\r\n nextTick,\r\n onMounted,\r\n onBeforeUnmount,\r\n readonly,\r\n} from \"vue\";\r\nimport E from \"wangeditor\";\r\n\r\ndefineOptions({ name: \"C_Editor\" });\r\n\r\ninterface Props {\r\n editorId: string;\r\n modelValue?: string;\r\n placeholder?: string;\r\n disabled?: boolean;\r\n readonly?: boolean;\r\n height?: number;\r\n theme?: \"light\" | \"dark\";\r\n}\r\n\r\ninterface Emits {\r\n (e: \"update:modelValue\", value: string): void;\r\n (e: \"editor-mounted\", editor: any): void;\r\n (e: \"editor-change\", html: string): void;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n modelValue: \"\",\r\n placeholder: \"\",\r\n disabled: false,\r\n readonly: false,\r\n height: 240,\r\n theme: \"light\",\r\n});\r\n\r\nconst emit = defineEmits<Emits>();\r\n\r\nconst editorContainer = ref<HTMLElement | null>(null);\r\nconst editorInstance = ref<any>(null);\r\nconst isInitialized = ref<boolean>(false);\r\n\r\nconst isDark = computed(() => props.theme === \"dark\");\r\n\r\nconst initializeEditor = (): void => {\r\n if (!editorContainer.value || isInitialized.value) return;\r\n\r\n try {\r\n const editor = new E(editorContainer.value);\r\n const editorConfig = editor.config as any;\r\n editorConfig.placeholder = props.placeholder;\r\n editorConfig.height = props.height - 50;\r\n\r\n editorConfig.onchange = (html: string) => {\r\n emit(\"update:modelValue\", html);\r\n emit(\"editor-change\", html);\r\n };\r\n\r\n editor.create();\r\n\r\n nextTick(() => {\r\n if (props.modelValue) {\r\n editor.txt.html(props.modelValue);\r\n }\r\n if (props.readonly) {\r\n editor.disable();\r\n }\r\n editorInstance.value = editor;\r\n isInitialized.value = true;\r\n emit(\"editor-mounted\", editor);\r\n });\r\n } catch (error) {\r\n console.error(`[C_Editor] 编辑器初始化失败: ${props.editorId}`, error);\r\n }\r\n};\r\n\r\nconst destroyEditor = (): void => {\r\n if (editorInstance.value && isInitialized.value) {\r\n try {\r\n editorInstance.value.destroy();\r\n editorInstance.value = null;\r\n isInitialized.value = false;\r\n } catch (error) {\r\n console.error(`[C_Editor] 编辑器销毁失败: ${props.editorId}`, error);\r\n }\r\n }\r\n};\r\n\r\nconst setContent = (html: string): void => {\r\n if (editorInstance.value && isInitialized.value) {\r\n try {\r\n editorInstance.value.txt.html(html);\r\n } catch (error) {\r\n console.warn(`[C_Editor] 设置编辑器内容失败: ${props.editorId}`, error);\r\n }\r\n }\r\n};\r\n\r\nconst getContent = (): string => {\r\n if (editorInstance.value && isInitialized.value) {\r\n try {\r\n return editorInstance.value.txt.html();\r\n } catch (error) {\r\n console.warn(`[C_Editor] 获取编辑器内容失败: ${props.editorId}`, error);\r\n return \"\";\r\n }\r\n }\r\n return \"\";\r\n};\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (newValue) => {\r\n if (editorInstance.value && isInitialized.value) {\r\n const currentContent = editorInstance.value.txt.html();\r\n if (currentContent !== newValue) {\r\n editorInstance.value.txt.html(newValue || \"\");\r\n }\r\n }\r\n },\r\n);\r\n\r\nwatch(\r\n () => props.disabled,\r\n (disabled) => {\r\n if (editorInstance.value && isInitialized.value) {\r\n try {\r\n if (disabled) editorInstance.value.disable();\r\n else editorInstance.value.enable();\r\n } catch (error) {\r\n console.warn(`[C_Editor] 设置编辑器状态失败`, error);\r\n }\r\n }\r\n },\r\n);\r\n\r\nwatch(\r\n () => props.readonly,\r\n (readonlyVal) => {\r\n if (editorInstance.value && isInitialized.value) {\r\n try {\r\n if (readonlyVal) editorInstance.value.disable();\r\n else editorInstance.value.enable();\r\n } catch (error) {\r\n console.warn(`[C_Editor] 设置编辑器只读状态失败`, error);\r\n }\r\n }\r\n },\r\n);\r\n\r\nconst handleEditorFocus = (): void => {\r\n if (!editorContainer.value) return;\r\n const container = editorContainer.value.closest(\r\n \".form-demo\",\r\n ) as HTMLElement | null;\r\n if (container) {\r\n container.classList.add(\"editor-focused\");\r\n const containerWidth = container.scrollWidth;\r\n container.style.maxWidth = `${containerWidth}px`;\r\n }\r\n};\r\n\r\nconst handleEditorBlur = (): void => {\r\n if (!editorContainer.value) return;\r\n const container = editorContainer.value.closest(\r\n \".form-demo\",\r\n ) as HTMLElement | null;\r\n if (container) {\r\n container.classList.remove(\"editor-focused\");\r\n container.style.maxWidth = \"\";\r\n }\r\n};\r\n\r\nonMounted(() => {\r\n nextTick(() => {\r\n initializeEditor();\r\n });\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n destroyEditor();\r\n});\r\n\r\ndefineExpose({\r\n initializeEditor,\r\n destroyEditor,\r\n setContent,\r\n getContent,\r\n handleEditorFocus,\r\n handleEditorBlur,\r\n editorInstance: readonly(editorInstance),\r\n isInitialized: readonly(isInitialized),\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n/* 暗色主题样式 */\r\n.editor-dark :deep(.w-e-toolbar) {\r\n background-color: #1f2937 !important;\r\n border-color: #374151 !important;\r\n}\r\n\r\n.editor-dark :deep(.w-e-toolbar .w-e-menu .w-e-menu-item) {\r\n color: #e5e7eb !important;\r\n}\r\n\r\n.editor-dark :deep(.w-e-toolbar .w-e-menu .w-e-menu-item:hover) {\r\n background-color: #374151 !important;\r\n color: #ffffff !important;\r\n}\r\n\r\n.editor-dark :deep(.w-e-toolbar .w-e-menu .w-e-menu-item.w-e-active) {\r\n background-color: #2080f0 !important;\r\n color: #ffffff !important;\r\n}\r\n\r\n.editor-dark :deep(.w-e-text-container) {\r\n background-color: #111827 !important;\r\n border-color: #374151 !important;\r\n}\r\n\r\n.editor-dark :deep(.w-e-text-container .w-e-text) {\r\n background-color: #303033 !important;\r\n color: #e5e7eb !important;\r\n}\r\n\r\n.editor-dark :deep(.w-e-text-container .w-e-text:focus) {\r\n background-color: #111827 !important;\r\n color: #e5e7eb !important;\r\n}\r\n\r\n:deep(.w-e-toolbar),\r\n:deep(.w-e-text-container) {\r\n max-width: 100% !important;\r\n overflow-x: auto !important;\r\n box-sizing: border-box !important;\r\n}\r\n\r\n:deep(.w-e-text) {\r\n max-width: 100% !important;\r\n word-wrap: break-word !important;\r\n overflow-wrap: break-word !important;\r\n}\r\n\r\n:deep(.w-e-toolbar),\r\n:deep(.w-e-text-container),\r\n:deep(.w-e-text) {\r\n transition:\r\n background-color 0.3s ease,\r\n border-color 0.3s ease,\r\n color 0.3s ease !important;\r\n}\r\n\r\n.editor-focused {\r\n overflow: hidden !important;\r\n max-width: 100% !important;\r\n}\r\n</style>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-01\r\n * @Description: 富文本编辑器组件(简化主题版)\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div\r\n ref=\"editorContainer\"\r\n :id=\"editorId\"\r\n v-show=\"isInitialized\"\r\n class=\"w-full\"\r\n :class=\"{ 'editor-dark': isDark }\"\r\n @focusin=\"handleEditorFocus\"\r\n @focusout=\"handleEditorBlur\"\r\n ></div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport {\r\n ref,\r\n computed,\r\n watch,\r\n nextTick,\r\n onMounted,\r\n onBeforeUnmount,\r\n readonly,\r\n} from \"vue\";\r\nimport E from \"wangeditor\";\r\n\r\ndefineOptions({ name: \"C_Editor\" });\r\n\r\ninterface Props {\r\n editorId: string;\r\n modelValue?: string;\r\n placeholder?: string;\r\n disabled?: boolean;\r\n readonly?: boolean;\r\n height?: number;\r\n theme?: \"light\" | \"dark\";\r\n}\r\n\r\ninterface Emits {\r\n (e: \"update:modelValue\", value: string): void;\r\n (e: \"editor-mounted\", editor: any): void;\r\n (e: \"editor-change\", html: string): void;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n modelValue: \"\",\r\n placeholder: \"\",\r\n disabled: false,\r\n readonly: false,\r\n height: 240,\r\n theme: \"light\",\r\n});\r\n\r\nconst emit = defineEmits<Emits>();\r\n\r\nconst editorContainer = ref<HTMLElement | null>(null);\r\nconst editorInstance = ref<any>(null);\r\nconst isInitialized = ref<boolean>(false);\r\n\r\nconst isDark = computed(() => props.theme === \"dark\");\r\n\r\nconst initializeEditor = (): void => {\r\n if (!editorContainer.value || isInitialized.value) return;\r\n\r\n try {\r\n const editor = new E(editorContainer.value);\r\n const editorConfig = editor.config as any;\r\n editorConfig.placeholder = props.placeholder;\r\n editorConfig.height = props.height - 50;\r\n\r\n editorConfig.onchange = (html: string) => {\r\n emit(\"update:modelValue\", html);\r\n emit(\"editor-change\", html);\r\n };\r\n\r\n editor.create();\r\n\r\n nextTick(() => {\r\n if (props.modelValue) {\r\n editor.txt.html(props.modelValue);\r\n }\r\n if (props.readonly) {\r\n editor.disable();\r\n }\r\n editorInstance.value = editor;\r\n isInitialized.value = true;\r\n emit(\"editor-mounted\", editor);\r\n });\r\n } catch (error) {\r\n console.error(`[C_Editor] 编辑器初始化失败: ${props.editorId}`, error);\r\n }\r\n};\r\n\r\nconst destroyEditor = (): void => {\r\n if (editorInstance.value && isInitialized.value) {\r\n try {\r\n editorInstance.value.destroy();\r\n editorInstance.value = null;\r\n isInitialized.value = false;\r\n } catch (error) {\r\n console.error(`[C_Editor] 编辑器销毁失败: ${props.editorId}`, error);\r\n }\r\n }\r\n};\r\n\r\nconst setContent = (html: string): void => {\r\n if (editorInstance.value && isInitialized.value) {\r\n try {\r\n editorInstance.value.txt.html(html);\r\n } catch (error) {\r\n console.warn(`[C_Editor] 设置编辑器内容失败: ${props.editorId}`, error);\r\n }\r\n }\r\n};\r\n\r\nconst getContent = (): string => {\r\n if (editorInstance.value && isInitialized.value) {\r\n try {\r\n return editorInstance.value.txt.html();\r\n } catch (error) {\r\n console.warn(`[C_Editor] 获取编辑器内容失败: ${props.editorId}`, error);\r\n return \"\";\r\n }\r\n }\r\n return \"\";\r\n};\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (newValue) => {\r\n if (editorInstance.value && isInitialized.value) {\r\n const currentContent = editorInstance.value.txt.html();\r\n if (currentContent !== newValue) {\r\n editorInstance.value.txt.html(newValue || \"\");\r\n }\r\n }\r\n },\r\n);\r\n\r\nwatch(\r\n () => props.disabled,\r\n (disabled) => {\r\n if (editorInstance.value && isInitialized.value) {\r\n try {\r\n if (disabled) editorInstance.value.disable();\r\n else editorInstance.value.enable();\r\n } catch (error) {\r\n console.warn(`[C_Editor] 设置编辑器状态失败`, error);\r\n }\r\n }\r\n },\r\n);\r\n\r\nwatch(\r\n () => props.readonly,\r\n (readonlyVal) => {\r\n if (editorInstance.value && isInitialized.value) {\r\n try {\r\n if (readonlyVal) editorInstance.value.disable();\r\n else editorInstance.value.enable();\r\n } catch (error) {\r\n console.warn(`[C_Editor] 设置编辑器只读状态失败`, error);\r\n }\r\n }\r\n },\r\n);\r\n\r\nconst handleEditorFocus = (): void => {\r\n if (!editorContainer.value) return;\r\n const container = editorContainer.value.closest(\r\n \".form-demo\",\r\n ) as HTMLElement | null;\r\n if (container) {\r\n container.classList.add(\"editor-focused\");\r\n const containerWidth = container.scrollWidth;\r\n container.style.maxWidth = `${containerWidth}px`;\r\n }\r\n};\r\n\r\nconst handleEditorBlur = (): void => {\r\n if (!editorContainer.value) return;\r\n const container = editorContainer.value.closest(\r\n \".form-demo\",\r\n ) as HTMLElement | null;\r\n if (container) {\r\n container.classList.remove(\"editor-focused\");\r\n container.style.maxWidth = \"\";\r\n }\r\n};\r\n\r\nonMounted(() => {\r\n nextTick(() => {\r\n initializeEditor();\r\n });\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n destroyEditor();\r\n});\r\n\r\ndefineExpose({\r\n initializeEditor,\r\n destroyEditor,\r\n setContent,\r\n getContent,\r\n handleEditorFocus,\r\n handleEditorBlur,\r\n editorInstance: readonly(editorInstance),\r\n isInitialized: readonly(isInitialized),\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n/* 暗色主题样式 */\r\n.editor-dark :deep(.w-e-toolbar) {\r\n background-color: #1f2937 !important;\r\n border-color: #374151 !important;\r\n}\r\n\r\n.editor-dark :deep(.w-e-toolbar .w-e-menu .w-e-menu-item) {\r\n color: #e5e7eb !important;\r\n}\r\n\r\n.editor-dark :deep(.w-e-toolbar .w-e-menu .w-e-menu-item:hover) {\r\n background-color: #374151 !important;\r\n color: #ffffff !important;\r\n}\r\n\r\n.editor-dark :deep(.w-e-toolbar .w-e-menu .w-e-menu-item.w-e-active) {\r\n background-color: #2080f0 !important;\r\n color: #ffffff !important;\r\n}\r\n\r\n.editor-dark :deep(.w-e-text-container) {\r\n background-color: #111827 !important;\r\n border-color: #374151 !important;\r\n}\r\n\r\n.editor-dark :deep(.w-e-text-container .w-e-text) {\r\n background-color: #303033 !important;\r\n color: #e5e7eb !important;\r\n}\r\n\r\n.editor-dark :deep(.w-e-text-container .w-e-text:focus) {\r\n background-color: #111827 !important;\r\n color: #e5e7eb !important;\r\n}\r\n\r\n:deep(.w-e-toolbar),\r\n:deep(.w-e-text-container) {\r\n max-width: 100% !important;\r\n overflow-x: auto !important;\r\n box-sizing: border-box !important;\r\n}\r\n\r\n:deep(.w-e-text) {\r\n max-width: 100% !important;\r\n word-wrap: break-word !important;\r\n overflow-wrap: break-word !important;\r\n}\r\n\r\n:deep(.w-e-toolbar),\r\n:deep(.w-e-text-container),\r\n:deep(.w-e-text) {\r\n transition:\r\n background-color 0.3s ease,\r\n border-color 0.3s ease,\r\n color 0.3s ease !important;\r\n}\r\n\r\n.editor-focused {\r\n overflow: hidden !important;\r\n max-width: 100% !important;\r\n}\r\n</style>\r\n"],"mappings":"4mBEiDA,IAAM,EAAQ,EASR,EAAO,EAEP,EAAkB,EAAwB,KAAK,CAC/C,EAAiB,EAAS,KAAK,CAC/B,EAAgB,EAAa,GAAM,CAEnC,EAAS,MAAe,EAAM,QAAU,OAAO,CAE/C,MAA+B,CAC/B,MAAC,EAAgB,OAAS,EAAc,OAE5C,GAAI,CACF,IAAM,EAAS,IAAI,EAAE,EAAgB,MAAM,CACrC,EAAe,EAAO,OAC5B,EAAa,YAAc,EAAM,YACjC,EAAa,OAAS,EAAM,OAAS,GAErC,EAAa,SAAY,GAAiB,CACxC,EAAK,oBAAqB,EAAK,CAC/B,EAAK,gBAAiB,EAAK,EAG7B,EAAO,QAAQ,CAEf,MAAe,CACT,EAAM,YACR,EAAO,IAAI,KAAK,EAAM,WAAW,CAE/B,EAAM,UACR,EAAO,SAAS,CAElB,EAAe,MAAQ,EACvB,EAAc,MAAQ,GACtB,EAAK,iBAAkB,EAAO,EAC9B,OACK,EAAO,CACd,QAAQ,MAAM,wBAAwB,EAAM,WAAY,EAAM,GAI5D,MAA4B,CAChC,GAAI,EAAe,OAAS,EAAc,MACxC,GAAI,CACF,EAAe,MAAM,SAAS,CAC9B,EAAe,MAAQ,KACvB,EAAc,MAAQ,SACf,EAAO,CACd,QAAQ,MAAM,uBAAuB,EAAM,WAAY,EAAM,GAK7D,EAAc,GAAuB,CACzC,GAAI,EAAe,OAAS,EAAc,MACxC,GAAI,CACF,EAAe,MAAM,IAAI,KAAK,EAAK,OAC5B,EAAO,CACd,QAAQ,KAAK,yBAAyB,EAAM,WAAY,EAAM,GAK9D,MAA2B,CAC/B,GAAI,EAAe,OAAS,EAAc,MACxC,GAAI,CACF,OAAO,EAAe,MAAM,IAAI,MAAM,OAC/B,EAAO,CAEd,OADA,QAAQ,KAAK,yBAAyB,EAAM,WAAY,EAAM,CACvD,GAGX,MAAO,IAGT,MACQ,EAAM,WACX,GAAa,CACR,EAAe,OAAS,EAAc,OACjB,EAAe,MAAM,IAAI,MAAM,GAC/B,GACrB,EAAe,MAAM,IAAI,KAAK,GAAY,GAAG,EAIpD,CAED,MACQ,EAAM,SACX,GAAa,CACZ,GAAI,EAAe,OAAS,EAAc,MACxC,GAAI,CACE,EAAU,EAAe,MAAM,SAAS,CACvC,EAAe,MAAM,QAAQ,OAC3B,EAAO,CACd,QAAQ,KAAK,uBAAwB,EAAM,GAIlD,CAED,MACQ,EAAM,SACX,GAAgB,CACf,GAAI,EAAe,OAAS,EAAc,MACxC,GAAI,CACE,EAAa,EAAe,MAAM,SAAS,CAC1C,EAAe,MAAM,QAAQ,OAC3B,EAAO,CACd,QAAQ,KAAK,yBAA0B,EAAM,GAIpD,CAED,IAAM,MAAgC,CACpC,GAAI,CAAC,EAAgB,MAAO,OAC5B,IAAM,EAAY,EAAgB,MAAM,QACtC,aACD,CACD,GAAI,EAAW,CACb,EAAU,UAAU,IAAI,iBAAiB,CACzC,IAAM,EAAiB,EAAU,YACjC,EAAU,MAAM,SAAW,GAAG,EAAe,MAI3C,MAA+B,CACnC,GAAI,CAAC,EAAgB,MAAO,OAC5B,IAAM,EAAY,EAAgB,MAAM,QACtC,aACD,CACG,IACF,EAAU,UAAU,OAAO,iBAAiB,CAC5C,EAAU,MAAM,SAAW,YAI/B,MAAgB,CACd,MAAe,CACb,GAAkB,EAClB,EACF,CAEF,MAAsB,CACpB,GAAe,EACf,CAEF,EAAa,CACX,mBACA,gBACA,aACA,aACA,oBACA,mBACA,eAAgB,EAAS,EAAe,CACxC,cAAe,EAAS,EAAc,CACvC,CAAC,eA9MA,EAQO,MAAA,SAPD,kBAAJ,IAAI,EACH,GAAIA,EAAAA,SAEL,MAAK,EAAA,CAAC,SAAQ,CAAA,cACW,EAAA,MAAM,CAAA,CAAA,CAC9B,UAAS,EACT,WAAU,mBAJH,EAAA,MAAa,CAAA,CAAA"}
1
+ {"version":3,"file":"C_Editor2.js","names":["editorId"],"sources":["../src/components/C_Editor/index.vue","../src/components/C_Editor/index.vue","../src/components/C_Editor/index.vue"],"sourcesContent":["/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-01\r\n * @Description: 富文本编辑器组件(简化主题版)\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div\r\n ref=\"editorContainer\"\r\n :id=\"editorId\"\r\n v-show=\"isInitialized\"\r\n class=\"w-full\"\r\n :class=\"{ 'editor-dark': isDark }\"\r\n @focusin=\"handleEditorFocus\"\r\n @focusout=\"handleEditorBlur\"\r\n ></div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport {\r\n ref,\r\n computed,\r\n watch,\r\n nextTick,\r\n onMounted,\r\n onBeforeUnmount,\r\n readonly,\r\n} from \"vue\";\r\nimport E from \"wangeditor\";\r\n\r\ndefineOptions({ name: \"C_Editor\" });\r\n\r\ninterface Props {\r\n editorId: string;\r\n modelValue?: string;\r\n placeholder?: string;\r\n disabled?: boolean;\r\n readonly?: boolean;\r\n height?: number;\r\n theme?: \"light\" | \"dark\";\r\n}\r\n\r\ninterface Emits {\r\n (e: \"update:modelValue\", value: string): void;\r\n (e: \"editor-mounted\", editor: any): void;\r\n (e: \"editor-change\", html: string): void;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n modelValue: \"\",\r\n placeholder: \"\",\r\n disabled: false,\r\n readonly: false,\r\n height: 240,\r\n theme: \"light\",\r\n});\r\n\r\nconst emit = defineEmits<Emits>();\r\n\r\nconst editorContainer = ref<HTMLElement | null>(null);\r\nconst editorInstance = ref<any>(null);\r\nconst isInitialized = ref<boolean>(false);\r\n\r\nconst isDark = computed(() => props.theme === \"dark\");\r\n\r\nconst initializeEditor = (): void => {\r\n if (!editorContainer.value || isInitialized.value) return;\r\n\r\n try {\r\n const editor = new E(editorContainer.value);\r\n const editorConfig = editor.config as any;\r\n editorConfig.placeholder = props.placeholder;\r\n editorConfig.height = props.height - 50;\r\n\r\n editorConfig.onchange = (html: string) => {\r\n emit(\"update:modelValue\", html);\r\n emit(\"editor-change\", html);\r\n };\r\n\r\n editor.create();\r\n\r\n nextTick(() => {\r\n if (props.modelValue) {\r\n editor.txt.html(props.modelValue);\r\n }\r\n if (props.readonly) {\r\n editor.disable();\r\n }\r\n editorInstance.value = editor;\r\n isInitialized.value = true;\r\n emit(\"editor-mounted\", editor);\r\n });\r\n } catch (error) {\r\n console.error(`[C_Editor] 编辑器初始化失败: ${props.editorId}`, error);\r\n }\r\n};\r\n\r\nconst destroyEditor = (): void => {\r\n if (editorInstance.value && isInitialized.value) {\r\n try {\r\n editorInstance.value.destroy();\r\n editorInstance.value = null;\r\n isInitialized.value = false;\r\n } catch (error) {\r\n console.error(`[C_Editor] 编辑器销毁失败: ${props.editorId}`, error);\r\n }\r\n }\r\n};\r\n\r\nconst setContent = (html: string): void => {\r\n if (editorInstance.value && isInitialized.value) {\r\n try {\r\n editorInstance.value.txt.html(html);\r\n } catch (error) {\r\n console.warn(`[C_Editor] 设置编辑器内容失败: ${props.editorId}`, error);\r\n }\r\n }\r\n};\r\n\r\nconst getContent = (): string => {\r\n if (editorInstance.value && isInitialized.value) {\r\n try {\r\n return editorInstance.value.txt.html();\r\n } catch (error) {\r\n console.warn(`[C_Editor] 获取编辑器内容失败: ${props.editorId}`, error);\r\n return \"\";\r\n }\r\n }\r\n return \"\";\r\n};\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (newValue) => {\r\n if (editorInstance.value && isInitialized.value) {\r\n const currentContent = editorInstance.value.txt.html();\r\n if (currentContent !== newValue) {\r\n editorInstance.value.txt.html(newValue || \"\");\r\n }\r\n }\r\n },\r\n);\r\n\r\nwatch(\r\n () => props.disabled,\r\n (disabled) => {\r\n if (editorInstance.value && isInitialized.value) {\r\n try {\r\n if (disabled) editorInstance.value.disable();\r\n else editorInstance.value.enable();\r\n } catch (error) {\r\n console.warn(`[C_Editor] 设置编辑器状态失败`, error);\r\n }\r\n }\r\n },\r\n);\r\n\r\nwatch(\r\n () => props.readonly,\r\n (readonlyVal) => {\r\n if (editorInstance.value && isInitialized.value) {\r\n try {\r\n if (readonlyVal) editorInstance.value.disable();\r\n else editorInstance.value.enable();\r\n } catch (error) {\r\n console.warn(`[C_Editor] 设置编辑器只读状态失败`, error);\r\n }\r\n }\r\n },\r\n);\r\n\r\nconst handleEditorFocus = (): void => {\r\n if (!editorContainer.value) return;\r\n const container = editorContainer.value.closest(\r\n \".form-demo\",\r\n ) as HTMLElement | null;\r\n if (container) {\r\n container.classList.add(\"editor-focused\");\r\n const containerWidth = container.scrollWidth;\r\n container.style.maxWidth = `${containerWidth}px`;\r\n }\r\n};\r\n\r\nconst handleEditorBlur = (): void => {\r\n if (!editorContainer.value) return;\r\n const container = editorContainer.value.closest(\r\n \".form-demo\",\r\n ) as HTMLElement | null;\r\n if (container) {\r\n container.classList.remove(\"editor-focused\");\r\n container.style.maxWidth = \"\";\r\n }\r\n};\r\n\r\nonMounted(() => {\r\n nextTick(() => {\r\n initializeEditor();\r\n });\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n destroyEditor();\r\n});\r\n\r\ndefineExpose({\r\n initializeEditor,\r\n destroyEditor,\r\n setContent,\r\n getContent,\r\n handleEditorFocus,\r\n handleEditorBlur,\r\n editorInstance: readonly(editorInstance),\r\n isInitialized: readonly(isInitialized),\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n/* CSS 变量 — 支持外部主题覆盖 */\r\n:root {\r\n --c-editor-toolbar-bg: #ffffff;\r\n --c-editor-toolbar-border: #e5e7eb;\r\n --c-editor-menu-color: #333333;\r\n --c-editor-menu-hover-bg: #f3f4f6;\r\n --c-editor-menu-hover-color: #333333;\r\n --c-editor-menu-active-bg: var(--c-primary, #2080f0);\r\n --c-editor-menu-active-color: #ffffff;\r\n --c-editor-container-bg: #ffffff;\r\n --c-editor-container-border: #e5e7eb;\r\n --c-editor-text-bg: #ffffff;\r\n --c-editor-text-color: #333333;\r\n --c-editor-text-focus-bg: #ffffff;\r\n --c-editor-text-focus-color: #333333;\r\n --c-editor-transition-duration: 0.3s;\r\n}\r\n\r\n/* 暗色主题 — 覆盖 CSS 变量 */\r\n.editor-dark {\r\n --c-editor-toolbar-bg: #1f2937;\r\n --c-editor-toolbar-border: #374151;\r\n --c-editor-menu-color: #e5e7eb;\r\n --c-editor-menu-hover-bg: #374151;\r\n --c-editor-menu-hover-color: #ffffff;\r\n --c-editor-container-bg: #111827;\r\n --c-editor-container-border: #374151;\r\n --c-editor-text-bg: #303033;\r\n --c-editor-text-color: #e5e7eb;\r\n --c-editor-text-focus-bg: #111827;\r\n --c-editor-text-focus-color: #e5e7eb;\r\n}\r\n\r\n.editor-dark :deep(.w-e-toolbar) {\r\n background-color: var(--c-editor-toolbar-bg) !important;\r\n border-color: var(--c-editor-toolbar-border) !important;\r\n}\r\n\r\n.editor-dark :deep(.w-e-toolbar .w-e-menu .w-e-menu-item) {\r\n color: var(--c-editor-menu-color) !important;\r\n}\r\n\r\n.editor-dark :deep(.w-e-toolbar .w-e-menu .w-e-menu-item:hover) {\r\n background-color: var(--c-editor-menu-hover-bg) !important;\r\n color: var(--c-editor-menu-hover-color) !important;\r\n}\r\n\r\n.editor-dark :deep(.w-e-toolbar .w-e-menu .w-e-menu-item.w-e-active) {\r\n background-color: var(--c-editor-menu-active-bg) !important;\r\n color: var(--c-editor-menu-active-color) !important;\r\n}\r\n\r\n.editor-dark :deep(.w-e-text-container) {\r\n background-color: var(--c-editor-container-bg) !important;\r\n border-color: var(--c-editor-container-border) !important;\r\n}\r\n\r\n.editor-dark :deep(.w-e-text-container .w-e-text) {\r\n background-color: var(--c-editor-text-bg) !important;\r\n color: var(--c-editor-text-color) !important;\r\n}\r\n\r\n.editor-dark :deep(.w-e-text-container .w-e-text:focus) {\r\n background-color: var(--c-editor-text-focus-bg) !important;\r\n color: var(--c-editor-text-focus-color) !important;\r\n}\r\n\r\n:deep(.w-e-toolbar),\r\n:deep(.w-e-text-container) {\r\n max-width: 100% !important;\r\n overflow-x: auto !important;\r\n box-sizing: border-box !important;\r\n}\r\n\r\n:deep(.w-e-text) {\r\n max-width: 100% !important;\r\n word-wrap: break-word !important;\r\n overflow-wrap: break-word !important;\r\n}\r\n\r\n:deep(.w-e-toolbar),\r\n:deep(.w-e-text-container),\r\n:deep(.w-e-text) {\r\n transition:\r\n background-color var(--c-editor-transition-duration) ease,\r\n border-color var(--c-editor-transition-duration) ease,\r\n color var(--c-editor-transition-duration) ease !important;\r\n}\r\n\r\n.editor-focused {\r\n overflow: hidden !important;\r\n max-width: 100% !important;\r\n}\r\n</style>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-01\r\n * @Description: 富文本编辑器组件(简化主题版)\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div\r\n ref=\"editorContainer\"\r\n :id=\"editorId\"\r\n v-show=\"isInitialized\"\r\n class=\"w-full\"\r\n :class=\"{ 'editor-dark': isDark }\"\r\n @focusin=\"handleEditorFocus\"\r\n @focusout=\"handleEditorBlur\"\r\n ></div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport {\r\n ref,\r\n computed,\r\n watch,\r\n nextTick,\r\n onMounted,\r\n onBeforeUnmount,\r\n readonly,\r\n} from \"vue\";\r\nimport E from \"wangeditor\";\r\n\r\ndefineOptions({ name: \"C_Editor\" });\r\n\r\ninterface Props {\r\n editorId: string;\r\n modelValue?: string;\r\n placeholder?: string;\r\n disabled?: boolean;\r\n readonly?: boolean;\r\n height?: number;\r\n theme?: \"light\" | \"dark\";\r\n}\r\n\r\ninterface Emits {\r\n (e: \"update:modelValue\", value: string): void;\r\n (e: \"editor-mounted\", editor: any): void;\r\n (e: \"editor-change\", html: string): void;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n modelValue: \"\",\r\n placeholder: \"\",\r\n disabled: false,\r\n readonly: false,\r\n height: 240,\r\n theme: \"light\",\r\n});\r\n\r\nconst emit = defineEmits<Emits>();\r\n\r\nconst editorContainer = ref<HTMLElement | null>(null);\r\nconst editorInstance = ref<any>(null);\r\nconst isInitialized = ref<boolean>(false);\r\n\r\nconst isDark = computed(() => props.theme === \"dark\");\r\n\r\nconst initializeEditor = (): void => {\r\n if (!editorContainer.value || isInitialized.value) return;\r\n\r\n try {\r\n const editor = new E(editorContainer.value);\r\n const editorConfig = editor.config as any;\r\n editorConfig.placeholder = props.placeholder;\r\n editorConfig.height = props.height - 50;\r\n\r\n editorConfig.onchange = (html: string) => {\r\n emit(\"update:modelValue\", html);\r\n emit(\"editor-change\", html);\r\n };\r\n\r\n editor.create();\r\n\r\n nextTick(() => {\r\n if (props.modelValue) {\r\n editor.txt.html(props.modelValue);\r\n }\r\n if (props.readonly) {\r\n editor.disable();\r\n }\r\n editorInstance.value = editor;\r\n isInitialized.value = true;\r\n emit(\"editor-mounted\", editor);\r\n });\r\n } catch (error) {\r\n console.error(`[C_Editor] 编辑器初始化失败: ${props.editorId}`, error);\r\n }\r\n};\r\n\r\nconst destroyEditor = (): void => {\r\n if (editorInstance.value && isInitialized.value) {\r\n try {\r\n editorInstance.value.destroy();\r\n editorInstance.value = null;\r\n isInitialized.value = false;\r\n } catch (error) {\r\n console.error(`[C_Editor] 编辑器销毁失败: ${props.editorId}`, error);\r\n }\r\n }\r\n};\r\n\r\nconst setContent = (html: string): void => {\r\n if (editorInstance.value && isInitialized.value) {\r\n try {\r\n editorInstance.value.txt.html(html);\r\n } catch (error) {\r\n console.warn(`[C_Editor] 设置编辑器内容失败: ${props.editorId}`, error);\r\n }\r\n }\r\n};\r\n\r\nconst getContent = (): string => {\r\n if (editorInstance.value && isInitialized.value) {\r\n try {\r\n return editorInstance.value.txt.html();\r\n } catch (error) {\r\n console.warn(`[C_Editor] 获取编辑器内容失败: ${props.editorId}`, error);\r\n return \"\";\r\n }\r\n }\r\n return \"\";\r\n};\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (newValue) => {\r\n if (editorInstance.value && isInitialized.value) {\r\n const currentContent = editorInstance.value.txt.html();\r\n if (currentContent !== newValue) {\r\n editorInstance.value.txt.html(newValue || \"\");\r\n }\r\n }\r\n },\r\n);\r\n\r\nwatch(\r\n () => props.disabled,\r\n (disabled) => {\r\n if (editorInstance.value && isInitialized.value) {\r\n try {\r\n if (disabled) editorInstance.value.disable();\r\n else editorInstance.value.enable();\r\n } catch (error) {\r\n console.warn(`[C_Editor] 设置编辑器状态失败`, error);\r\n }\r\n }\r\n },\r\n);\r\n\r\nwatch(\r\n () => props.readonly,\r\n (readonlyVal) => {\r\n if (editorInstance.value && isInitialized.value) {\r\n try {\r\n if (readonlyVal) editorInstance.value.disable();\r\n else editorInstance.value.enable();\r\n } catch (error) {\r\n console.warn(`[C_Editor] 设置编辑器只读状态失败`, error);\r\n }\r\n }\r\n },\r\n);\r\n\r\nconst handleEditorFocus = (): void => {\r\n if (!editorContainer.value) return;\r\n const container = editorContainer.value.closest(\r\n \".form-demo\",\r\n ) as HTMLElement | null;\r\n if (container) {\r\n container.classList.add(\"editor-focused\");\r\n const containerWidth = container.scrollWidth;\r\n container.style.maxWidth = `${containerWidth}px`;\r\n }\r\n};\r\n\r\nconst handleEditorBlur = (): void => {\r\n if (!editorContainer.value) return;\r\n const container = editorContainer.value.closest(\r\n \".form-demo\",\r\n ) as HTMLElement | null;\r\n if (container) {\r\n container.classList.remove(\"editor-focused\");\r\n container.style.maxWidth = \"\";\r\n }\r\n};\r\n\r\nonMounted(() => {\r\n nextTick(() => {\r\n initializeEditor();\r\n });\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n destroyEditor();\r\n});\r\n\r\ndefineExpose({\r\n initializeEditor,\r\n destroyEditor,\r\n setContent,\r\n getContent,\r\n handleEditorFocus,\r\n handleEditorBlur,\r\n editorInstance: readonly(editorInstance),\r\n isInitialized: readonly(isInitialized),\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n/* CSS 变量 — 支持外部主题覆盖 */\r\n:root {\r\n --c-editor-toolbar-bg: #ffffff;\r\n --c-editor-toolbar-border: #e5e7eb;\r\n --c-editor-menu-color: #333333;\r\n --c-editor-menu-hover-bg: #f3f4f6;\r\n --c-editor-menu-hover-color: #333333;\r\n --c-editor-menu-active-bg: var(--c-primary, #2080f0);\r\n --c-editor-menu-active-color: #ffffff;\r\n --c-editor-container-bg: #ffffff;\r\n --c-editor-container-border: #e5e7eb;\r\n --c-editor-text-bg: #ffffff;\r\n --c-editor-text-color: #333333;\r\n --c-editor-text-focus-bg: #ffffff;\r\n --c-editor-text-focus-color: #333333;\r\n --c-editor-transition-duration: 0.3s;\r\n}\r\n\r\n/* 暗色主题 — 覆盖 CSS 变量 */\r\n.editor-dark {\r\n --c-editor-toolbar-bg: #1f2937;\r\n --c-editor-toolbar-border: #374151;\r\n --c-editor-menu-color: #e5e7eb;\r\n --c-editor-menu-hover-bg: #374151;\r\n --c-editor-menu-hover-color: #ffffff;\r\n --c-editor-container-bg: #111827;\r\n --c-editor-container-border: #374151;\r\n --c-editor-text-bg: #303033;\r\n --c-editor-text-color: #e5e7eb;\r\n --c-editor-text-focus-bg: #111827;\r\n --c-editor-text-focus-color: #e5e7eb;\r\n}\r\n\r\n.editor-dark :deep(.w-e-toolbar) {\r\n background-color: var(--c-editor-toolbar-bg) !important;\r\n border-color: var(--c-editor-toolbar-border) !important;\r\n}\r\n\r\n.editor-dark :deep(.w-e-toolbar .w-e-menu .w-e-menu-item) {\r\n color: var(--c-editor-menu-color) !important;\r\n}\r\n\r\n.editor-dark :deep(.w-e-toolbar .w-e-menu .w-e-menu-item:hover) {\r\n background-color: var(--c-editor-menu-hover-bg) !important;\r\n color: var(--c-editor-menu-hover-color) !important;\r\n}\r\n\r\n.editor-dark :deep(.w-e-toolbar .w-e-menu .w-e-menu-item.w-e-active) {\r\n background-color: var(--c-editor-menu-active-bg) !important;\r\n color: var(--c-editor-menu-active-color) !important;\r\n}\r\n\r\n.editor-dark :deep(.w-e-text-container) {\r\n background-color: var(--c-editor-container-bg) !important;\r\n border-color: var(--c-editor-container-border) !important;\r\n}\r\n\r\n.editor-dark :deep(.w-e-text-container .w-e-text) {\r\n background-color: var(--c-editor-text-bg) !important;\r\n color: var(--c-editor-text-color) !important;\r\n}\r\n\r\n.editor-dark :deep(.w-e-text-container .w-e-text:focus) {\r\n background-color: var(--c-editor-text-focus-bg) !important;\r\n color: var(--c-editor-text-focus-color) !important;\r\n}\r\n\r\n:deep(.w-e-toolbar),\r\n:deep(.w-e-text-container) {\r\n max-width: 100% !important;\r\n overflow-x: auto !important;\r\n box-sizing: border-box !important;\r\n}\r\n\r\n:deep(.w-e-text) {\r\n max-width: 100% !important;\r\n word-wrap: break-word !important;\r\n overflow-wrap: break-word !important;\r\n}\r\n\r\n:deep(.w-e-toolbar),\r\n:deep(.w-e-text-container),\r\n:deep(.w-e-text) {\r\n transition:\r\n background-color var(--c-editor-transition-duration) ease,\r\n border-color var(--c-editor-transition-duration) ease,\r\n color var(--c-editor-transition-duration) ease !important;\r\n}\r\n\r\n.editor-focused {\r\n overflow: hidden !important;\r\n max-width: 100% !important;\r\n}\r\n</style>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-01\r\n * @Description: 富文本编辑器组件(简化主题版)\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div\r\n ref=\"editorContainer\"\r\n :id=\"editorId\"\r\n v-show=\"isInitialized\"\r\n class=\"w-full\"\r\n :class=\"{ 'editor-dark': isDark }\"\r\n @focusin=\"handleEditorFocus\"\r\n @focusout=\"handleEditorBlur\"\r\n ></div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport {\r\n ref,\r\n computed,\r\n watch,\r\n nextTick,\r\n onMounted,\r\n onBeforeUnmount,\r\n readonly,\r\n} from \"vue\";\r\nimport E from \"wangeditor\";\r\n\r\ndefineOptions({ name: \"C_Editor\" });\r\n\r\ninterface Props {\r\n editorId: string;\r\n modelValue?: string;\r\n placeholder?: string;\r\n disabled?: boolean;\r\n readonly?: boolean;\r\n height?: number;\r\n theme?: \"light\" | \"dark\";\r\n}\r\n\r\ninterface Emits {\r\n (e: \"update:modelValue\", value: string): void;\r\n (e: \"editor-mounted\", editor: any): void;\r\n (e: \"editor-change\", html: string): void;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n modelValue: \"\",\r\n placeholder: \"\",\r\n disabled: false,\r\n readonly: false,\r\n height: 240,\r\n theme: \"light\",\r\n});\r\n\r\nconst emit = defineEmits<Emits>();\r\n\r\nconst editorContainer = ref<HTMLElement | null>(null);\r\nconst editorInstance = ref<any>(null);\r\nconst isInitialized = ref<boolean>(false);\r\n\r\nconst isDark = computed(() => props.theme === \"dark\");\r\n\r\nconst initializeEditor = (): void => {\r\n if (!editorContainer.value || isInitialized.value) return;\r\n\r\n try {\r\n const editor = new E(editorContainer.value);\r\n const editorConfig = editor.config as any;\r\n editorConfig.placeholder = props.placeholder;\r\n editorConfig.height = props.height - 50;\r\n\r\n editorConfig.onchange = (html: string) => {\r\n emit(\"update:modelValue\", html);\r\n emit(\"editor-change\", html);\r\n };\r\n\r\n editor.create();\r\n\r\n nextTick(() => {\r\n if (props.modelValue) {\r\n editor.txt.html(props.modelValue);\r\n }\r\n if (props.readonly) {\r\n editor.disable();\r\n }\r\n editorInstance.value = editor;\r\n isInitialized.value = true;\r\n emit(\"editor-mounted\", editor);\r\n });\r\n } catch (error) {\r\n console.error(`[C_Editor] 编辑器初始化失败: ${props.editorId}`, error);\r\n }\r\n};\r\n\r\nconst destroyEditor = (): void => {\r\n if (editorInstance.value && isInitialized.value) {\r\n try {\r\n editorInstance.value.destroy();\r\n editorInstance.value = null;\r\n isInitialized.value = false;\r\n } catch (error) {\r\n console.error(`[C_Editor] 编辑器销毁失败: ${props.editorId}`, error);\r\n }\r\n }\r\n};\r\n\r\nconst setContent = (html: string): void => {\r\n if (editorInstance.value && isInitialized.value) {\r\n try {\r\n editorInstance.value.txt.html(html);\r\n } catch (error) {\r\n console.warn(`[C_Editor] 设置编辑器内容失败: ${props.editorId}`, error);\r\n }\r\n }\r\n};\r\n\r\nconst getContent = (): string => {\r\n if (editorInstance.value && isInitialized.value) {\r\n try {\r\n return editorInstance.value.txt.html();\r\n } catch (error) {\r\n console.warn(`[C_Editor] 获取编辑器内容失败: ${props.editorId}`, error);\r\n return \"\";\r\n }\r\n }\r\n return \"\";\r\n};\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (newValue) => {\r\n if (editorInstance.value && isInitialized.value) {\r\n const currentContent = editorInstance.value.txt.html();\r\n if (currentContent !== newValue) {\r\n editorInstance.value.txt.html(newValue || \"\");\r\n }\r\n }\r\n },\r\n);\r\n\r\nwatch(\r\n () => props.disabled,\r\n (disabled) => {\r\n if (editorInstance.value && isInitialized.value) {\r\n try {\r\n if (disabled) editorInstance.value.disable();\r\n else editorInstance.value.enable();\r\n } catch (error) {\r\n console.warn(`[C_Editor] 设置编辑器状态失败`, error);\r\n }\r\n }\r\n },\r\n);\r\n\r\nwatch(\r\n () => props.readonly,\r\n (readonlyVal) => {\r\n if (editorInstance.value && isInitialized.value) {\r\n try {\r\n if (readonlyVal) editorInstance.value.disable();\r\n else editorInstance.value.enable();\r\n } catch (error) {\r\n console.warn(`[C_Editor] 设置编辑器只读状态失败`, error);\r\n }\r\n }\r\n },\r\n);\r\n\r\nconst handleEditorFocus = (): void => {\r\n if (!editorContainer.value) return;\r\n const container = editorContainer.value.closest(\r\n \".form-demo\",\r\n ) as HTMLElement | null;\r\n if (container) {\r\n container.classList.add(\"editor-focused\");\r\n const containerWidth = container.scrollWidth;\r\n container.style.maxWidth = `${containerWidth}px`;\r\n }\r\n};\r\n\r\nconst handleEditorBlur = (): void => {\r\n if (!editorContainer.value) return;\r\n const container = editorContainer.value.closest(\r\n \".form-demo\",\r\n ) as HTMLElement | null;\r\n if (container) {\r\n container.classList.remove(\"editor-focused\");\r\n container.style.maxWidth = \"\";\r\n }\r\n};\r\n\r\nonMounted(() => {\r\n nextTick(() => {\r\n initializeEditor();\r\n });\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n destroyEditor();\r\n});\r\n\r\ndefineExpose({\r\n initializeEditor,\r\n destroyEditor,\r\n setContent,\r\n getContent,\r\n handleEditorFocus,\r\n handleEditorBlur,\r\n editorInstance: readonly(editorInstance),\r\n isInitialized: readonly(isInitialized),\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n/* CSS 变量 — 支持外部主题覆盖 */\r\n:root {\r\n --c-editor-toolbar-bg: #ffffff;\r\n --c-editor-toolbar-border: #e5e7eb;\r\n --c-editor-menu-color: #333333;\r\n --c-editor-menu-hover-bg: #f3f4f6;\r\n --c-editor-menu-hover-color: #333333;\r\n --c-editor-menu-active-bg: var(--c-primary, #2080f0);\r\n --c-editor-menu-active-color: #ffffff;\r\n --c-editor-container-bg: #ffffff;\r\n --c-editor-container-border: #e5e7eb;\r\n --c-editor-text-bg: #ffffff;\r\n --c-editor-text-color: #333333;\r\n --c-editor-text-focus-bg: #ffffff;\r\n --c-editor-text-focus-color: #333333;\r\n --c-editor-transition-duration: 0.3s;\r\n}\r\n\r\n/* 暗色主题 — 覆盖 CSS 变量 */\r\n.editor-dark {\r\n --c-editor-toolbar-bg: #1f2937;\r\n --c-editor-toolbar-border: #374151;\r\n --c-editor-menu-color: #e5e7eb;\r\n --c-editor-menu-hover-bg: #374151;\r\n --c-editor-menu-hover-color: #ffffff;\r\n --c-editor-container-bg: #111827;\r\n --c-editor-container-border: #374151;\r\n --c-editor-text-bg: #303033;\r\n --c-editor-text-color: #e5e7eb;\r\n --c-editor-text-focus-bg: #111827;\r\n --c-editor-text-focus-color: #e5e7eb;\r\n}\r\n\r\n.editor-dark :deep(.w-e-toolbar) {\r\n background-color: var(--c-editor-toolbar-bg) !important;\r\n border-color: var(--c-editor-toolbar-border) !important;\r\n}\r\n\r\n.editor-dark :deep(.w-e-toolbar .w-e-menu .w-e-menu-item) {\r\n color: var(--c-editor-menu-color) !important;\r\n}\r\n\r\n.editor-dark :deep(.w-e-toolbar .w-e-menu .w-e-menu-item:hover) {\r\n background-color: var(--c-editor-menu-hover-bg) !important;\r\n color: var(--c-editor-menu-hover-color) !important;\r\n}\r\n\r\n.editor-dark :deep(.w-e-toolbar .w-e-menu .w-e-menu-item.w-e-active) {\r\n background-color: var(--c-editor-menu-active-bg) !important;\r\n color: var(--c-editor-menu-active-color) !important;\r\n}\r\n\r\n.editor-dark :deep(.w-e-text-container) {\r\n background-color: var(--c-editor-container-bg) !important;\r\n border-color: var(--c-editor-container-border) !important;\r\n}\r\n\r\n.editor-dark :deep(.w-e-text-container .w-e-text) {\r\n background-color: var(--c-editor-text-bg) !important;\r\n color: var(--c-editor-text-color) !important;\r\n}\r\n\r\n.editor-dark :deep(.w-e-text-container .w-e-text:focus) {\r\n background-color: var(--c-editor-text-focus-bg) !important;\r\n color: var(--c-editor-text-focus-color) !important;\r\n}\r\n\r\n:deep(.w-e-toolbar),\r\n:deep(.w-e-text-container) {\r\n max-width: 100% !important;\r\n overflow-x: auto !important;\r\n box-sizing: border-box !important;\r\n}\r\n\r\n:deep(.w-e-text) {\r\n max-width: 100% !important;\r\n word-wrap: break-word !important;\r\n overflow-wrap: break-word !important;\r\n}\r\n\r\n:deep(.w-e-toolbar),\r\n:deep(.w-e-text-container),\r\n:deep(.w-e-text) {\r\n transition:\r\n background-color var(--c-editor-transition-duration) ease,\r\n border-color var(--c-editor-transition-duration) ease,\r\n color var(--c-editor-transition-duration) ease !important;\r\n}\r\n\r\n.editor-focused {\r\n overflow: hidden !important;\r\n max-width: 100% !important;\r\n}\r\n</style>\r\n"],"mappings":"4mBEiDA,IAAM,EAAQ,EASR,EAAO,EAEP,EAAkB,EAAwB,KAAK,CAC/C,EAAiB,EAAS,KAAK,CAC/B,EAAgB,EAAa,GAAM,CAEnC,EAAS,MAAe,EAAM,QAAU,OAAO,CAE/C,MAA+B,CAC/B,MAAC,EAAgB,OAAS,EAAc,OAE5C,GAAI,CACF,IAAM,EAAS,IAAI,EAAE,EAAgB,MAAM,CACrC,EAAe,EAAO,OAC5B,EAAa,YAAc,EAAM,YACjC,EAAa,OAAS,EAAM,OAAS,GAErC,EAAa,SAAY,GAAiB,CACxC,EAAK,oBAAqB,EAAK,CAC/B,EAAK,gBAAiB,EAAK,EAG7B,EAAO,QAAQ,CAEf,MAAe,CACT,EAAM,YACR,EAAO,IAAI,KAAK,EAAM,WAAW,CAE/B,EAAM,UACR,EAAO,SAAS,CAElB,EAAe,MAAQ,EACvB,EAAc,MAAQ,GACtB,EAAK,iBAAkB,EAAO,EAC9B,OACK,EAAO,CACd,QAAQ,MAAM,wBAAwB,EAAM,WAAY,EAAM,GAI5D,MAA4B,CAChC,GAAI,EAAe,OAAS,EAAc,MACxC,GAAI,CACF,EAAe,MAAM,SAAS,CAC9B,EAAe,MAAQ,KACvB,EAAc,MAAQ,SACf,EAAO,CACd,QAAQ,MAAM,uBAAuB,EAAM,WAAY,EAAM,GAK7D,EAAc,GAAuB,CACzC,GAAI,EAAe,OAAS,EAAc,MACxC,GAAI,CACF,EAAe,MAAM,IAAI,KAAK,EAAK,OAC5B,EAAO,CACd,QAAQ,KAAK,yBAAyB,EAAM,WAAY,EAAM,GAK9D,MAA2B,CAC/B,GAAI,EAAe,OAAS,EAAc,MACxC,GAAI,CACF,OAAO,EAAe,MAAM,IAAI,MAAM,OAC/B,EAAO,CAEd,OADA,QAAQ,KAAK,yBAAyB,EAAM,WAAY,EAAM,CACvD,GAGX,MAAO,IAGT,MACQ,EAAM,WACX,GAAa,CACR,EAAe,OAAS,EAAc,OACjB,EAAe,MAAM,IAAI,MAAM,GAC/B,GACrB,EAAe,MAAM,IAAI,KAAK,GAAY,GAAG,EAIpD,CAED,MACQ,EAAM,SACX,GAAa,CACZ,GAAI,EAAe,OAAS,EAAc,MACxC,GAAI,CACE,EAAU,EAAe,MAAM,SAAS,CACvC,EAAe,MAAM,QAAQ,OAC3B,EAAO,CACd,QAAQ,KAAK,uBAAwB,EAAM,GAIlD,CAED,MACQ,EAAM,SACX,GAAgB,CACf,GAAI,EAAe,OAAS,EAAc,MACxC,GAAI,CACE,EAAa,EAAe,MAAM,SAAS,CAC1C,EAAe,MAAM,QAAQ,OAC3B,EAAO,CACd,QAAQ,KAAK,yBAA0B,EAAM,GAIpD,CAED,IAAM,MAAgC,CACpC,GAAI,CAAC,EAAgB,MAAO,OAC5B,IAAM,EAAY,EAAgB,MAAM,QACtC,aACD,CACD,GAAI,EAAW,CACb,EAAU,UAAU,IAAI,iBAAiB,CACzC,IAAM,EAAiB,EAAU,YACjC,EAAU,MAAM,SAAW,GAAG,EAAe,MAI3C,MAA+B,CACnC,GAAI,CAAC,EAAgB,MAAO,OAC5B,IAAM,EAAY,EAAgB,MAAM,QACtC,aACD,CACG,IACF,EAAU,UAAU,OAAO,iBAAiB,CAC5C,EAAU,MAAM,SAAW,YAI/B,MAAgB,CACd,MAAe,CACb,GAAkB,EAClB,EACF,CAEF,MAAsB,CACpB,GAAe,EACf,CAEF,EAAa,CACX,mBACA,gBACA,aACA,aACA,oBACA,mBACA,eAAgB,EAAS,EAAe,CACxC,cAAe,EAAS,EAAc,CACvC,CAAC,eA9MA,EAQO,MAAA,SAPD,kBAAJ,IAAI,EACH,GAAIA,EAAAA,SAEL,MAAK,EAAA,CAAC,SAAQ,CAAA,cACW,EAAA,MAAM,CAAA,CAAA,CAC9B,UAAS,EACT,WAAU,mBAJH,EAAA,MAAa,CAAA,CAAA"}
@@ -1,2 +1,2 @@
1
- import { n as _default, t as GuideStep } from "./index14.vue.js";
2
- export { _default as C_Guide, type GuideStep };
1
+ import { a as GuideTheme, i as GuideStep, n as GuidePersistence, r as GuideProps, t as _default } from "./index14.vue.js";
2
+ export { _default as C_Guide, type GuidePersistence, type GuideProps, type GuideStep, type GuideTheme };
package/dist/C_Guide.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- import { n as _default, t as GuideStep } from "./index14.vue.js";
2
- export { _default as C_Guide, type GuideStep };
1
+ import { a as GuideTheme, i as GuideStep, n as GuidePersistence, r as GuideProps, t as _default } from "./index14.vue.js";
2
+ export { _default as C_Guide, type GuidePersistence, type GuideProps, type GuideStep, type GuideTheme };
@@ -1 +1 @@
1
- {"version":3,"file":"C_Guide.js","names":[],"sources":["../src/components/C_Guide/index.vue","../src/components/C_Guide/index.vue","../src/components/C_Guide/index.vue"],"sourcesContent":["/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-01\r\n * @Description: 用户引导组件(基于 driver.js)\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <NTooltip\r\n placement=\"bottom\"\r\n trigger=\"hover\"\r\n >\r\n <template #trigger>\r\n <NButton\r\n text\r\n @click=\"startGuide\"\r\n >\r\n <C_Icon\r\n name=\"mdi:sign-routes\"\r\n :size=\"18\"\r\n />\r\n </NButton>\r\n </template>\r\n <span>功能引导</span>\r\n </NTooltip>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { NTooltip, NButton } from 'naive-ui'\r\n import C_Icon from '../C_Icon/index.vue'\r\n import { driver } from 'driver.js'\r\n import 'driver.js/dist/driver.css'\r\n\r\n defineOptions({ name: 'C_Guide' })\r\n\r\n export interface GuideStep {\r\n element: string\r\n popover: {\r\n title: string\r\n description: string\r\n side?: 'top' | 'right' | 'bottom' | 'left'\r\n }\r\n }\r\n\r\n const props = withDefaults(\r\n defineProps<{\r\n steps?: GuideStep[]\r\n doneBtnText?: string\r\n nextBtnText?: string\r\n prevBtnText?: string\r\n }>(),\r\n {\r\n steps: () => [],\r\n doneBtnText: '完成',\r\n nextBtnText: '下一步',\r\n prevBtnText: '上一步',\r\n }\r\n )\r\n\r\n const startGuide = () => {\r\n if (!props.steps.length) {\r\n console.warn(\r\n '[C_Guide] 未提供引导步骤(steps),请通过 :steps prop 传入。'\r\n )\r\n return\r\n }\r\n\r\n const driverObj = driver({\r\n popoverClass: 'driverjs-theme',\r\n animate: true,\r\n showProgress: true,\r\n doneBtnText: props.doneBtnText,\r\n nextBtnText: props.nextBtnText,\r\n prevBtnText: props.prevBtnText,\r\n steps: props.steps,\r\n })\r\n\r\n driverObj.drive()\r\n }\r\n\r\n defineExpose({ startGuide })\r\n</script>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-01\r\n * @Description: 用户引导组件(基于 driver.js)\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <NTooltip\r\n placement=\"bottom\"\r\n trigger=\"hover\"\r\n >\r\n <template #trigger>\r\n <NButton\r\n text\r\n @click=\"startGuide\"\r\n >\r\n <C_Icon\r\n name=\"mdi:sign-routes\"\r\n :size=\"18\"\r\n />\r\n </NButton>\r\n </template>\r\n <span>功能引导</span>\r\n </NTooltip>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { NTooltip, NButton } from 'naive-ui'\r\n import C_Icon from '../C_Icon/index.vue'\r\n import { driver } from 'driver.js'\r\n import 'driver.js/dist/driver.css'\r\n\r\n defineOptions({ name: 'C_Guide' })\r\n\r\n export interface GuideStep {\r\n element: string\r\n popover: {\r\n title: string\r\n description: string\r\n side?: 'top' | 'right' | 'bottom' | 'left'\r\n }\r\n }\r\n\r\n const props = withDefaults(\r\n defineProps<{\r\n steps?: GuideStep[]\r\n doneBtnText?: string\r\n nextBtnText?: string\r\n prevBtnText?: string\r\n }>(),\r\n {\r\n steps: () => [],\r\n doneBtnText: '完成',\r\n nextBtnText: '下一步',\r\n prevBtnText: '上一步',\r\n }\r\n )\r\n\r\n const startGuide = () => {\r\n if (!props.steps.length) {\r\n console.warn(\r\n '[C_Guide] 未提供引导步骤(steps),请通过 :steps prop 传入。'\r\n )\r\n return\r\n }\r\n\r\n const driverObj = driver({\r\n popoverClass: 'driverjs-theme',\r\n animate: true,\r\n showProgress: true,\r\n doneBtnText: props.doneBtnText,\r\n nextBtnText: props.nextBtnText,\r\n prevBtnText: props.prevBtnText,\r\n steps: props.steps,\r\n })\r\n\r\n driverObj.drive()\r\n }\r\n\r\n defineExpose({ startGuide })\r\n</script>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-01\r\n * @Description: 用户引导组件(基于 driver.js)\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <NTooltip\r\n placement=\"bottom\"\r\n trigger=\"hover\"\r\n >\r\n <template #trigger>\r\n <NButton\r\n text\r\n @click=\"startGuide\"\r\n >\r\n <C_Icon\r\n name=\"mdi:sign-routes\"\r\n :size=\"18\"\r\n />\r\n </NButton>\r\n </template>\r\n <span>功能引导</span>\r\n </NTooltip>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { NTooltip, NButton } from 'naive-ui'\r\n import C_Icon from '../C_Icon/index.vue'\r\n import { driver } from 'driver.js'\r\n import 'driver.js/dist/driver.css'\r\n\r\n defineOptions({ name: 'C_Guide' })\r\n\r\n export interface GuideStep {\r\n element: string\r\n popover: {\r\n title: string\r\n description: string\r\n side?: 'top' | 'right' | 'bottom' | 'left'\r\n }\r\n }\r\n\r\n const props = withDefaults(\r\n defineProps<{\r\n steps?: GuideStep[]\r\n doneBtnText?: string\r\n nextBtnText?: string\r\n prevBtnText?: string\r\n }>(),\r\n {\r\n steps: () => [],\r\n doneBtnText: '完成',\r\n nextBtnText: '下一步',\r\n prevBtnText: '上一步',\r\n }\r\n )\r\n\r\n const startGuide = () => {\r\n if (!props.steps.length) {\r\n console.warn(\r\n '[C_Guide] 未提供引导步骤(steps),请通过 :steps prop 传入。'\r\n )\r\n return\r\n }\r\n\r\n const driverObj = driver({\r\n popoverClass: 'driverjs-theme',\r\n animate: true,\r\n showProgress: true,\r\n doneBtnText: props.doneBtnText,\r\n nextBtnText: props.nextBtnText,\r\n prevBtnText: props.prevBtnText,\r\n steps: props.steps,\r\n })\r\n\r\n driverObj.drive()\r\n }\r\n\r\n defineExpose({ startGuide })\r\n</script>\r\n"],"mappings":"6VE4CE,IAAM,EAAQ,EAeR,MAAmB,CACvB,GAAI,CAAC,EAAM,MAAM,OAAQ,CACvB,QAAQ,KACN,+CACD,CACD,QAaF,EAAA,EAAA,QAVyB,CACvB,aAAc,iBACd,QAAS,GACT,aAAc,GACd,YAAa,EAAM,YACnB,YAAa,EAAM,YACnB,YAAa,EAAM,YACnB,MAAO,EAAM,MACd,CAAC,CAEQ,OAAO,SAGnB,EAAa,CAAE,aAAY,CAAC,yDAxDjB,EAAA,SAAA,CAAA,CAfT,UAAU,SACV,QAAQ,UAEG,SAAA,EAAA,EAAA,aASC,EAAA,EAAA,EAAA,cAAA,EAAA,EAAA,OAAA,EAAA,QAAA,CAAA,CAPR,KAAA,GACC,QAAO,8BAKN,EAAA,EAAA,EAAA,aAAA,EAAA,EAAA,CAFA,KAAK,kBACJ,KAAM,yCAII,CAAA,AAAA,EAAA,MAAA,EAAA,EAAA,oBAAA,OAAA,KAAX,OAAI,GAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"C_Guide.js","names":[],"sources":["../src/components/C_Guide/index.vue","../src/components/C_Guide/index.vue","../src/components/C_Guide/index.vue"],"sourcesContent":["/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-01\r\n * @LastEditors: ChenYu ycyplus@gmail.com\r\n * @LastEditTime: 2026-03-06\r\n * @Description: 用户引导组件(基于 driver.js)— 增强版\r\n * 支持:步骤分组 / 键盘导航 / 步骤回调 / 主题自定义 / 完成持久化\r\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\r\n-->\r\n<template>\r\n <NTooltip\r\n v-if=\"props.showTrigger\"\r\n placement=\"bottom\"\r\n trigger=\"hover\"\r\n >\r\n <template #trigger>\r\n <NButton\r\n text\r\n @click=\"startGuide\"\r\n >\r\n <C_Icon\r\n :name=\"props.triggerIcon\"\r\n :size=\"18\"\r\n />\r\n </NButton>\r\n </template>\r\n <span>{{ props.triggerTooltip }}</span>\r\n </NTooltip>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { computed } from 'vue'\r\n import { NTooltip, NButton } from 'naive-ui'\r\n import C_Icon from '../C_Icon/index.vue'\r\n import { driver } from 'driver.js'\r\n import 'driver.js/dist/driver.css'\r\n import type { GuideProps, GuideStep } from './types'\r\n\r\n defineOptions({ name: 'C_Guide' })\r\n\r\n const props = withDefaults(defineProps<GuideProps>(), {\r\n steps: () => [],\r\n doneBtnText: '完成',\r\n nextBtnText: '下一步',\r\n prevBtnText: '上一步',\r\n showProgress: true,\r\n keyboard: true,\r\n animate: true,\r\n allowClose: true,\r\n popoverClass: 'driverjs-theme',\r\n showTrigger: true,\r\n triggerTooltip: '功能引导',\r\n triggerIcon: 'mdi:sign-routes',\r\n })\r\n\r\n const emit = defineEmits<{\r\n /** 引导开始 */\r\n start: []\r\n /** 引导完成(走完全部步骤) */\r\n complete: []\r\n /** 引导被用户关闭(未完成) */\r\n close: [currentStep: number]\r\n /** 步骤切换 */\r\n 'step-change': [stepIndex: number, step: GuideStep]\r\n }>()\r\n\r\n /** 持久化 key */\r\n const persistKey = computed(() => {\r\n const prefix = props.persistence?.keyPrefix ?? 'c_guide'\r\n return `${prefix}_completed`\r\n })\r\n\r\n /** 是否已完成引导 */\r\n const isCompleted = (): boolean => {\r\n if (!props.persistence?.enabled) return false\r\n try {\r\n return localStorage.getItem(persistKey.value) === 'true'\r\n } catch {\r\n return false\r\n }\r\n }\r\n\r\n /** 标记引导已完成 */\r\n const markCompleted = () => {\r\n if (!props.persistence?.enabled) return\r\n try {\r\n localStorage.setItem(persistKey.value, 'true')\r\n } catch {\r\n // localStorage 不可用时静默忽略\r\n }\r\n }\r\n\r\n /** 重置完成状态 */\r\n const resetCompleted = () => {\r\n try {\r\n localStorage.removeItem(persistKey.value)\r\n } catch {\r\n // 静默忽略\r\n }\r\n }\r\n\r\n /**\r\n * * @description: 过滤掉需要跳过的步骤\r\n * ! @return 有效步骤列表\r\n */\r\n const getActiveSteps = (): GuideStep[] => {\r\n return props.steps.filter(step => !step.skipIf?.())\r\n }\r\n\r\n /**\r\n * * @description: 构建主题相关的 CSS 变量\r\n * ! @return popoverClass 字符串\r\n */\r\n const buildPopoverClass = (): string => {\r\n const classes = [props.popoverClass]\r\n if (props.theme) {\r\n // 通过 CSS 变量注入主题\r\n const root = document.documentElement\r\n if (props.theme.popoverBgColor)\r\n root.style.setProperty(\r\n '--c-guide-popover-bg',\r\n props.theme.popoverBgColor\r\n )\r\n if (props.theme.popoverTextColor)\r\n root.style.setProperty(\r\n '--c-guide-popover-text',\r\n props.theme.popoverTextColor\r\n )\r\n if (props.theme.primaryColor)\r\n root.style.setProperty(\r\n '--c-guide-primary',\r\n props.theme.primaryColor\r\n )\r\n if (props.theme.overlayOpacity !== undefined)\r\n root.style.setProperty(\r\n '--c-guide-overlay-opacity',\r\n String(props.theme.overlayOpacity)\r\n )\r\n if (props.theme.borderRadius)\r\n root.style.setProperty(\r\n '--c-guide-radius',\r\n props.theme.borderRadius\r\n )\r\n }\r\n return classes.filter(Boolean).join(' ')\r\n }\r\n\r\n /**\r\n * * @description: 启动引导流程\r\n * ? @param {boolean} force 是否强制启动(忽略持久化状态)\r\n */\r\n const startGuide = (force = false) => {\r\n if (!force && isCompleted()) return\r\n\r\n const activeSteps = getActiveSteps()\r\n if (!activeSteps.length) {\r\n console.warn(\r\n '[C_Guide] 未提供引导步骤(steps),请通过 :steps prop 传入。'\r\n )\r\n return\r\n }\r\n\r\n let currentStepIndex = 0\r\n\r\n const driverObj = driver({\r\n popoverClass: buildPopoverClass(),\r\n animate: props.animate,\r\n showProgress: props.showProgress,\r\n allowClose: props.allowClose,\r\n doneBtnText: props.doneBtnText,\r\n nextBtnText: props.nextBtnText,\r\n prevBtnText: props.prevBtnText,\r\n steps: activeSteps.map(step => ({\r\n element: step.element,\r\n popover: step.popover,\r\n })),\r\n onHighlightStarted: (_el) => {\r\n const step = activeSteps[currentStepIndex]\r\n if (step) {\r\n step.onHighlightStarted?.(_el as Element | undefined, step)\r\n emit('step-change', currentStepIndex, step)\r\n }\r\n },\r\n onDeselected: (_el) => {\r\n const step = activeSteps[currentStepIndex]\r\n step?.onDeselected?.(_el as Element | undefined, step)\r\n currentStepIndex++\r\n },\r\n onDestroyStarted: () => {\r\n if (currentStepIndex >= activeSteps.length) {\r\n markCompleted()\r\n emit('complete')\r\n } else {\r\n emit('close', currentStepIndex)\r\n }\r\n driverObj.destroy()\r\n },\r\n })\r\n\r\n emit('start')\r\n driverObj.drive()\r\n }\r\n\r\n defineExpose({\r\n startGuide,\r\n resetCompleted,\r\n isCompleted,\r\n })\r\n</script>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-01\r\n * @LastEditors: ChenYu ycyplus@gmail.com\r\n * @LastEditTime: 2026-03-06\r\n * @Description: 用户引导组件(基于 driver.js)— 增强版\r\n * 支持:步骤分组 / 键盘导航 / 步骤回调 / 主题自定义 / 完成持久化\r\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\r\n-->\r\n<template>\r\n <NTooltip\r\n v-if=\"props.showTrigger\"\r\n placement=\"bottom\"\r\n trigger=\"hover\"\r\n >\r\n <template #trigger>\r\n <NButton\r\n text\r\n @click=\"startGuide\"\r\n >\r\n <C_Icon\r\n :name=\"props.triggerIcon\"\r\n :size=\"18\"\r\n />\r\n </NButton>\r\n </template>\r\n <span>{{ props.triggerTooltip }}</span>\r\n </NTooltip>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { computed } from 'vue'\r\n import { NTooltip, NButton } from 'naive-ui'\r\n import C_Icon from '../C_Icon/index.vue'\r\n import { driver } from 'driver.js'\r\n import 'driver.js/dist/driver.css'\r\n import type { GuideProps, GuideStep } from './types'\r\n\r\n defineOptions({ name: 'C_Guide' })\r\n\r\n const props = withDefaults(defineProps<GuideProps>(), {\r\n steps: () => [],\r\n doneBtnText: '完成',\r\n nextBtnText: '下一步',\r\n prevBtnText: '上一步',\r\n showProgress: true,\r\n keyboard: true,\r\n animate: true,\r\n allowClose: true,\r\n popoverClass: 'driverjs-theme',\r\n showTrigger: true,\r\n triggerTooltip: '功能引导',\r\n triggerIcon: 'mdi:sign-routes',\r\n })\r\n\r\n const emit = defineEmits<{\r\n /** 引导开始 */\r\n start: []\r\n /** 引导完成(走完全部步骤) */\r\n complete: []\r\n /** 引导被用户关闭(未完成) */\r\n close: [currentStep: number]\r\n /** 步骤切换 */\r\n 'step-change': [stepIndex: number, step: GuideStep]\r\n }>()\r\n\r\n /** 持久化 key */\r\n const persistKey = computed(() => {\r\n const prefix = props.persistence?.keyPrefix ?? 'c_guide'\r\n return `${prefix}_completed`\r\n })\r\n\r\n /** 是否已完成引导 */\r\n const isCompleted = (): boolean => {\r\n if (!props.persistence?.enabled) return false\r\n try {\r\n return localStorage.getItem(persistKey.value) === 'true'\r\n } catch {\r\n return false\r\n }\r\n }\r\n\r\n /** 标记引导已完成 */\r\n const markCompleted = () => {\r\n if (!props.persistence?.enabled) return\r\n try {\r\n localStorage.setItem(persistKey.value, 'true')\r\n } catch {\r\n // localStorage 不可用时静默忽略\r\n }\r\n }\r\n\r\n /** 重置完成状态 */\r\n const resetCompleted = () => {\r\n try {\r\n localStorage.removeItem(persistKey.value)\r\n } catch {\r\n // 静默忽略\r\n }\r\n }\r\n\r\n /**\r\n * * @description: 过滤掉需要跳过的步骤\r\n * ! @return 有效步骤列表\r\n */\r\n const getActiveSteps = (): GuideStep[] => {\r\n return props.steps.filter(step => !step.skipIf?.())\r\n }\r\n\r\n /**\r\n * * @description: 构建主题相关的 CSS 变量\r\n * ! @return popoverClass 字符串\r\n */\r\n const buildPopoverClass = (): string => {\r\n const classes = [props.popoverClass]\r\n if (props.theme) {\r\n // 通过 CSS 变量注入主题\r\n const root = document.documentElement\r\n if (props.theme.popoverBgColor)\r\n root.style.setProperty(\r\n '--c-guide-popover-bg',\r\n props.theme.popoverBgColor\r\n )\r\n if (props.theme.popoverTextColor)\r\n root.style.setProperty(\r\n '--c-guide-popover-text',\r\n props.theme.popoverTextColor\r\n )\r\n if (props.theme.primaryColor)\r\n root.style.setProperty(\r\n '--c-guide-primary',\r\n props.theme.primaryColor\r\n )\r\n if (props.theme.overlayOpacity !== undefined)\r\n root.style.setProperty(\r\n '--c-guide-overlay-opacity',\r\n String(props.theme.overlayOpacity)\r\n )\r\n if (props.theme.borderRadius)\r\n root.style.setProperty(\r\n '--c-guide-radius',\r\n props.theme.borderRadius\r\n )\r\n }\r\n return classes.filter(Boolean).join(' ')\r\n }\r\n\r\n /**\r\n * * @description: 启动引导流程\r\n * ? @param {boolean} force 是否强制启动(忽略持久化状态)\r\n */\r\n const startGuide = (force = false) => {\r\n if (!force && isCompleted()) return\r\n\r\n const activeSteps = getActiveSteps()\r\n if (!activeSteps.length) {\r\n console.warn(\r\n '[C_Guide] 未提供引导步骤(steps),请通过 :steps prop 传入。'\r\n )\r\n return\r\n }\r\n\r\n let currentStepIndex = 0\r\n\r\n const driverObj = driver({\r\n popoverClass: buildPopoverClass(),\r\n animate: props.animate,\r\n showProgress: props.showProgress,\r\n allowClose: props.allowClose,\r\n doneBtnText: props.doneBtnText,\r\n nextBtnText: props.nextBtnText,\r\n prevBtnText: props.prevBtnText,\r\n steps: activeSteps.map(step => ({\r\n element: step.element,\r\n popover: step.popover,\r\n })),\r\n onHighlightStarted: (_el) => {\r\n const step = activeSteps[currentStepIndex]\r\n if (step) {\r\n step.onHighlightStarted?.(_el as Element | undefined, step)\r\n emit('step-change', currentStepIndex, step)\r\n }\r\n },\r\n onDeselected: (_el) => {\r\n const step = activeSteps[currentStepIndex]\r\n step?.onDeselected?.(_el as Element | undefined, step)\r\n currentStepIndex++\r\n },\r\n onDestroyStarted: () => {\r\n if (currentStepIndex >= activeSteps.length) {\r\n markCompleted()\r\n emit('complete')\r\n } else {\r\n emit('close', currentStepIndex)\r\n }\r\n driverObj.destroy()\r\n },\r\n })\r\n\r\n emit('start')\r\n driverObj.drive()\r\n }\r\n\r\n defineExpose({\r\n startGuide,\r\n resetCompleted,\r\n isCompleted,\r\n })\r\n</script>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-01\r\n * @LastEditors: ChenYu ycyplus@gmail.com\r\n * @LastEditTime: 2026-03-06\r\n * @Description: 用户引导组件(基于 driver.js)— 增强版\r\n * 支持:步骤分组 / 键盘导航 / 步骤回调 / 主题自定义 / 完成持久化\r\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\r\n-->\r\n<template>\r\n <NTooltip\r\n v-if=\"props.showTrigger\"\r\n placement=\"bottom\"\r\n trigger=\"hover\"\r\n >\r\n <template #trigger>\r\n <NButton\r\n text\r\n @click=\"startGuide\"\r\n >\r\n <C_Icon\r\n :name=\"props.triggerIcon\"\r\n :size=\"18\"\r\n />\r\n </NButton>\r\n </template>\r\n <span>{{ props.triggerTooltip }}</span>\r\n </NTooltip>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { computed } from 'vue'\r\n import { NTooltip, NButton } from 'naive-ui'\r\n import C_Icon from '../C_Icon/index.vue'\r\n import { driver } from 'driver.js'\r\n import 'driver.js/dist/driver.css'\r\n import type { GuideProps, GuideStep } from './types'\r\n\r\n defineOptions({ name: 'C_Guide' })\r\n\r\n const props = withDefaults(defineProps<GuideProps>(), {\r\n steps: () => [],\r\n doneBtnText: '完成',\r\n nextBtnText: '下一步',\r\n prevBtnText: '上一步',\r\n showProgress: true,\r\n keyboard: true,\r\n animate: true,\r\n allowClose: true,\r\n popoverClass: 'driverjs-theme',\r\n showTrigger: true,\r\n triggerTooltip: '功能引导',\r\n triggerIcon: 'mdi:sign-routes',\r\n })\r\n\r\n const emit = defineEmits<{\r\n /** 引导开始 */\r\n start: []\r\n /** 引导完成(走完全部步骤) */\r\n complete: []\r\n /** 引导被用户关闭(未完成) */\r\n close: [currentStep: number]\r\n /** 步骤切换 */\r\n 'step-change': [stepIndex: number, step: GuideStep]\r\n }>()\r\n\r\n /** 持久化 key */\r\n const persistKey = computed(() => {\r\n const prefix = props.persistence?.keyPrefix ?? 'c_guide'\r\n return `${prefix}_completed`\r\n })\r\n\r\n /** 是否已完成引导 */\r\n const isCompleted = (): boolean => {\r\n if (!props.persistence?.enabled) return false\r\n try {\r\n return localStorage.getItem(persistKey.value) === 'true'\r\n } catch {\r\n return false\r\n }\r\n }\r\n\r\n /** 标记引导已完成 */\r\n const markCompleted = () => {\r\n if (!props.persistence?.enabled) return\r\n try {\r\n localStorage.setItem(persistKey.value, 'true')\r\n } catch {\r\n // localStorage 不可用时静默忽略\r\n }\r\n }\r\n\r\n /** 重置完成状态 */\r\n const resetCompleted = () => {\r\n try {\r\n localStorage.removeItem(persistKey.value)\r\n } catch {\r\n // 静默忽略\r\n }\r\n }\r\n\r\n /**\r\n * * @description: 过滤掉需要跳过的步骤\r\n * ! @return 有效步骤列表\r\n */\r\n const getActiveSteps = (): GuideStep[] => {\r\n return props.steps.filter(step => !step.skipIf?.())\r\n }\r\n\r\n /**\r\n * * @description: 构建主题相关的 CSS 变量\r\n * ! @return popoverClass 字符串\r\n */\r\n const buildPopoverClass = (): string => {\r\n const classes = [props.popoverClass]\r\n if (props.theme) {\r\n // 通过 CSS 变量注入主题\r\n const root = document.documentElement\r\n if (props.theme.popoverBgColor)\r\n root.style.setProperty(\r\n '--c-guide-popover-bg',\r\n props.theme.popoverBgColor\r\n )\r\n if (props.theme.popoverTextColor)\r\n root.style.setProperty(\r\n '--c-guide-popover-text',\r\n props.theme.popoverTextColor\r\n )\r\n if (props.theme.primaryColor)\r\n root.style.setProperty(\r\n '--c-guide-primary',\r\n props.theme.primaryColor\r\n )\r\n if (props.theme.overlayOpacity !== undefined)\r\n root.style.setProperty(\r\n '--c-guide-overlay-opacity',\r\n String(props.theme.overlayOpacity)\r\n )\r\n if (props.theme.borderRadius)\r\n root.style.setProperty(\r\n '--c-guide-radius',\r\n props.theme.borderRadius\r\n )\r\n }\r\n return classes.filter(Boolean).join(' ')\r\n }\r\n\r\n /**\r\n * * @description: 启动引导流程\r\n * ? @param {boolean} force 是否强制启动(忽略持久化状态)\r\n */\r\n const startGuide = (force = false) => {\r\n if (!force && isCompleted()) return\r\n\r\n const activeSteps = getActiveSteps()\r\n if (!activeSteps.length) {\r\n console.warn(\r\n '[C_Guide] 未提供引导步骤(steps),请通过 :steps prop 传入。'\r\n )\r\n return\r\n }\r\n\r\n let currentStepIndex = 0\r\n\r\n const driverObj = driver({\r\n popoverClass: buildPopoverClass(),\r\n animate: props.animate,\r\n showProgress: props.showProgress,\r\n allowClose: props.allowClose,\r\n doneBtnText: props.doneBtnText,\r\n nextBtnText: props.nextBtnText,\r\n prevBtnText: props.prevBtnText,\r\n steps: activeSteps.map(step => ({\r\n element: step.element,\r\n popover: step.popover,\r\n })),\r\n onHighlightStarted: (_el) => {\r\n const step = activeSteps[currentStepIndex]\r\n if (step) {\r\n step.onHighlightStarted?.(_el as Element | undefined, step)\r\n emit('step-change', currentStepIndex, step)\r\n }\r\n },\r\n onDeselected: (_el) => {\r\n const step = activeSteps[currentStepIndex]\r\n step?.onDeselected?.(_el as Element | undefined, step)\r\n currentStepIndex++\r\n },\r\n onDestroyStarted: () => {\r\n if (currentStepIndex >= activeSteps.length) {\r\n markCompleted()\r\n emit('complete')\r\n } else {\r\n emit('close', currentStepIndex)\r\n }\r\n driverObj.destroy()\r\n },\r\n })\r\n\r\n emit('start')\r\n driverObj.drive()\r\n }\r\n\r\n defineExpose({\r\n startGuide,\r\n resetCompleted,\r\n isCompleted,\r\n })\r\n</script>\r\n"],"mappings":"otBEwCE,IAAM,EAAQ,EAeR,EAAO,EAYP,GAAA,EAAA,EAAA,cAEG,GADQ,EAAM,aAAa,WAAa,UAC9B,YACjB,CAGI,MAA6B,CACjC,GAAI,CAAC,EAAM,aAAa,QAAS,MAAO,GACxC,GAAI,CACF,OAAO,aAAa,QAAQ,EAAW,MAAM,GAAK,YAC5C,CACN,MAAO,KAKL,MAAsB,CACrB,KAAM,aAAa,QACxB,GAAI,CACF,aAAa,QAAQ,EAAW,MAAO,OAAO,MACxC,IAMJ,MAAuB,CAC3B,GAAI,CACF,aAAa,WAAW,EAAW,MAAM,MACnC,IASJ,MACG,EAAM,MAAM,OAAO,GAAQ,CAAC,EAAK,UAAU,CAAC,CAO/C,MAAkC,CACtC,IAAM,EAAU,CAAC,EAAM,aAAa,CACpC,GAAI,EAAM,MAAO,CAEf,IAAM,EAAO,SAAS,gBAClB,EAAM,MAAM,gBACd,EAAK,MAAM,YACT,uBACA,EAAM,MAAM,eACb,CACC,EAAM,MAAM,kBACd,EAAK,MAAM,YACT,yBACA,EAAM,MAAM,iBACb,CACC,EAAM,MAAM,cACd,EAAK,MAAM,YACT,oBACA,EAAM,MAAM,aACb,CACC,EAAM,MAAM,iBAAmB,IAAA,IACjC,EAAK,MAAM,YACT,4BACA,OAAO,EAAM,MAAM,eAAe,CACnC,CACC,EAAM,MAAM,cACd,EAAK,MAAM,YACT,mBACA,EAAM,MAAM,aACb,CAEL,OAAO,EAAQ,OAAO,QAAQ,CAAC,KAAK,IAAI,EAOpC,GAAc,EAAQ,KAAU,CACpC,GAAI,CAAC,GAAS,GAAa,CAAE,OAE7B,IAAM,EAAc,GAAgB,CACpC,GAAI,CAAC,EAAY,OAAQ,CACvB,QAAQ,KACN,+CACD,CACD,OAGF,IAAI,EAAmB,EAEjB,GAAA,EAAA,EAAA,QAAmB,CACvB,aAAc,GAAmB,CACjC,QAAS,EAAM,QACf,aAAc,EAAM,aACpB,WAAY,EAAM,WAClB,YAAa,EAAM,YACnB,YAAa,EAAM,YACnB,YAAa,EAAM,YACnB,MAAO,EAAY,IAAI,IAAS,CAC9B,QAAS,EAAK,QACd,QAAS,EAAK,QACf,EAAE,CACH,mBAAqB,GAAQ,CAC3B,IAAM,EAAO,EAAY,GACrB,IACF,EAAK,qBAAqB,EAA4B,EAAK,CAC3D,EAAK,cAAe,EAAkB,EAAK,GAG/C,aAAe,GAAQ,CACrB,IAAM,EAAO,EAAY,GACzB,GAAM,eAAe,EAA4B,EAAK,CACtD,KAEF,qBAAwB,CAClB,GAAoB,EAAY,QAClC,GAAe,CACf,EAAK,WAAW,EAEhB,EAAK,QAAS,EAAiB,CAEjC,EAAU,SAAS,EAEtB,CAAC,CAEF,EAAK,QAAQ,CACb,EAAU,OAAO,SAGnB,EAAa,CACX,aACA,iBACA,cACD,CAAC,QApMM,EAAM,cAAA,EAAA,EAAA,YAAA,EAAA,EAAA,EAAA,cAAA,EAAA,EAAA,OAgBH,EAAA,SAAA,CAAA,OAfT,UAAU,SACV,QAAQ,UAEG,SAAA,EAAA,EAAA,aASC,EAAA,EAAA,EAAA,cAAA,EAAA,EAAA,OAAA,EAAA,QAAA,CAAA,CAPR,KAAA,GACC,QAAO,8BAKN,EAAA,EAAA,EAAA,aAAA,EAAA,EAAA,CAFC,KAAM,EAAM,YACZ,KAAM,yDAI0B,EAAA,EAAA,EAAA,oBAAA,OAAA,MAAA,EAAA,EAAA,iBAA9B,EAAM,eAAc,CAAA,EAAA,CAAA,CAAA"}
package/dist/C_Guide2.js CHANGED
@@ -1,2 +1,2 @@
1
- import{t as e}from"./C_Icon2.js";import{NButton as t,NTooltip as n}from"naive-ui";import{createBlock as r,createElementVNode as i,createVNode as a,defineComponent as o,openBlock as s,unref as c,withCtx as l}from"vue";import{driver as u}from"driver.js";import"driver.js/dist/driver.css";var d=o({name:`C_Guide`,__name:`index`,props:{steps:{default:()=>[]},doneBtnText:{default:`完成`},nextBtnText:{default:`下一步`},prevBtnText:{default:`上一步`}},setup(o,{expose:d}){let f=o,p=()=>{if(!f.steps.length){console.warn(`[C_Guide] 未提供引导步骤(steps),请通过 :steps prop 传入。`);return}u({popoverClass:`driverjs-theme`,animate:!0,showProgress:!0,doneBtnText:f.doneBtnText,nextBtnText:f.nextBtnText,prevBtnText:f.prevBtnText,steps:f.steps}).drive()};return d({startGuide:p}),(o,u)=>(s(),r(c(n),{placement:`bottom`,trigger:`hover`},{trigger:l(()=>[a(c(t),{text:``,onClick:p},{default:l(()=>[a(e,{name:`mdi:sign-routes`,size:18})]),_:1})]),default:l(()=>[u[0]||=i(`span`,null,`功能引导`,-1)]),_:1,__:[0]}))}});export{d as t};
1
+ import{t as e}from"./C_Icon2.js";import{NButton as t,NTooltip as n}from"naive-ui";import{computed as r,createBlock as i,createCommentVNode as a,createElementVNode as o,createVNode as s,defineComponent as c,openBlock as l,toDisplayString as u,unref as d,withCtx as f}from"vue";import{driver as p}from"driver.js";import"driver.js/dist/driver.css";var m=c({name:`C_Guide`,__name:`index`,props:{steps:{default:()=>[]},doneBtnText:{default:`完成`},nextBtnText:{default:`下一步`},prevBtnText:{default:`上一步`},showProgress:{type:Boolean,default:!0},keyboard:{type:Boolean,default:!0},animate:{type:Boolean,default:!0},allowClose:{type:Boolean,default:!0},theme:{},persistence:{},popoverClass:{default:`driverjs-theme`},showTrigger:{type:Boolean,default:!0},triggerTooltip:{default:`功能引导`},triggerIcon:{default:`mdi:sign-routes`}},emits:[`start`,`complete`,`close`,`step-change`],setup(c,{expose:m,emit:h}){let g=c,_=h,v=r(()=>`${g.persistence?.keyPrefix??`c_guide`}_completed`),y=()=>{if(!g.persistence?.enabled)return!1;try{return localStorage.getItem(v.value)===`true`}catch{return!1}},b=()=>{if(g.persistence?.enabled)try{localStorage.setItem(v.value,`true`)}catch{}},x=()=>{try{localStorage.removeItem(v.value)}catch{}},S=()=>g.steps.filter(e=>!e.skipIf?.()),C=()=>{let e=[g.popoverClass];if(g.theme){let e=document.documentElement;g.theme.popoverBgColor&&e.style.setProperty(`--c-guide-popover-bg`,g.theme.popoverBgColor),g.theme.popoverTextColor&&e.style.setProperty(`--c-guide-popover-text`,g.theme.popoverTextColor),g.theme.primaryColor&&e.style.setProperty(`--c-guide-primary`,g.theme.primaryColor),g.theme.overlayOpacity!==void 0&&e.style.setProperty(`--c-guide-overlay-opacity`,String(g.theme.overlayOpacity)),g.theme.borderRadius&&e.style.setProperty(`--c-guide-radius`,g.theme.borderRadius)}return e.filter(Boolean).join(` `)},w=(e=!1)=>{if(!e&&y())return;let t=S();if(!t.length){console.warn(`[C_Guide] 未提供引导步骤(steps),请通过 :steps prop 传入。`);return}let n=0,r=p({popoverClass:C(),animate:g.animate,showProgress:g.showProgress,allowClose:g.allowClose,doneBtnText:g.doneBtnText,nextBtnText:g.nextBtnText,prevBtnText:g.prevBtnText,steps:t.map(e=>({element:e.element,popover:e.popover})),onHighlightStarted:e=>{let r=t[n];r&&(r.onHighlightStarted?.(e,r),_(`step-change`,n,r))},onDeselected:e=>{let r=t[n];r?.onDeselected?.(e,r),n++},onDestroyStarted:()=>{n>=t.length?(b(),_(`complete`)):_(`close`,n),r.destroy()}});_(`start`),r.drive()};return m({startGuide:w,resetCompleted:x,isCompleted:y}),(r,c)=>g.showTrigger?(l(),i(d(n),{key:0,placement:`bottom`,trigger:`hover`},{trigger:f(()=>[s(d(t),{text:``,onClick:w},{default:f(()=>[s(e,{name:g.triggerIcon,size:18},null,8,[`name`])]),_:1})]),default:f(()=>[o(`span`,null,u(g.triggerTooltip),1)]),_:1})):a(`v-if`,!0)}});export{m as t};
2
2
  //# sourceMappingURL=C_Guide2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"C_Guide2.js","names":[],"sources":["../src/components/C_Guide/index.vue","../src/components/C_Guide/index.vue","../src/components/C_Guide/index.vue"],"sourcesContent":["/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-01\r\n * @Description: 用户引导组件(基于 driver.js)\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <NTooltip\r\n placement=\"bottom\"\r\n trigger=\"hover\"\r\n >\r\n <template #trigger>\r\n <NButton\r\n text\r\n @click=\"startGuide\"\r\n >\r\n <C_Icon\r\n name=\"mdi:sign-routes\"\r\n :size=\"18\"\r\n />\r\n </NButton>\r\n </template>\r\n <span>功能引导</span>\r\n </NTooltip>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { NTooltip, NButton } from 'naive-ui'\r\n import C_Icon from '../C_Icon/index.vue'\r\n import { driver } from 'driver.js'\r\n import 'driver.js/dist/driver.css'\r\n\r\n defineOptions({ name: 'C_Guide' })\r\n\r\n export interface GuideStep {\r\n element: string\r\n popover: {\r\n title: string\r\n description: string\r\n side?: 'top' | 'right' | 'bottom' | 'left'\r\n }\r\n }\r\n\r\n const props = withDefaults(\r\n defineProps<{\r\n steps?: GuideStep[]\r\n doneBtnText?: string\r\n nextBtnText?: string\r\n prevBtnText?: string\r\n }>(),\r\n {\r\n steps: () => [],\r\n doneBtnText: '完成',\r\n nextBtnText: '下一步',\r\n prevBtnText: '上一步',\r\n }\r\n )\r\n\r\n const startGuide = () => {\r\n if (!props.steps.length) {\r\n console.warn(\r\n '[C_Guide] 未提供引导步骤(steps),请通过 :steps prop 传入。'\r\n )\r\n return\r\n }\r\n\r\n const driverObj = driver({\r\n popoverClass: 'driverjs-theme',\r\n animate: true,\r\n showProgress: true,\r\n doneBtnText: props.doneBtnText,\r\n nextBtnText: props.nextBtnText,\r\n prevBtnText: props.prevBtnText,\r\n steps: props.steps,\r\n })\r\n\r\n driverObj.drive()\r\n }\r\n\r\n defineExpose({ startGuide })\r\n</script>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-01\r\n * @Description: 用户引导组件(基于 driver.js)\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <NTooltip\r\n placement=\"bottom\"\r\n trigger=\"hover\"\r\n >\r\n <template #trigger>\r\n <NButton\r\n text\r\n @click=\"startGuide\"\r\n >\r\n <C_Icon\r\n name=\"mdi:sign-routes\"\r\n :size=\"18\"\r\n />\r\n </NButton>\r\n </template>\r\n <span>功能引导</span>\r\n </NTooltip>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { NTooltip, NButton } from 'naive-ui'\r\n import C_Icon from '../C_Icon/index.vue'\r\n import { driver } from 'driver.js'\r\n import 'driver.js/dist/driver.css'\r\n\r\n defineOptions({ name: 'C_Guide' })\r\n\r\n export interface GuideStep {\r\n element: string\r\n popover: {\r\n title: string\r\n description: string\r\n side?: 'top' | 'right' | 'bottom' | 'left'\r\n }\r\n }\r\n\r\n const props = withDefaults(\r\n defineProps<{\r\n steps?: GuideStep[]\r\n doneBtnText?: string\r\n nextBtnText?: string\r\n prevBtnText?: string\r\n }>(),\r\n {\r\n steps: () => [],\r\n doneBtnText: '完成',\r\n nextBtnText: '下一步',\r\n prevBtnText: '上一步',\r\n }\r\n )\r\n\r\n const startGuide = () => {\r\n if (!props.steps.length) {\r\n console.warn(\r\n '[C_Guide] 未提供引导步骤(steps),请通过 :steps prop 传入。'\r\n )\r\n return\r\n }\r\n\r\n const driverObj = driver({\r\n popoverClass: 'driverjs-theme',\r\n animate: true,\r\n showProgress: true,\r\n doneBtnText: props.doneBtnText,\r\n nextBtnText: props.nextBtnText,\r\n prevBtnText: props.prevBtnText,\r\n steps: props.steps,\r\n })\r\n\r\n driverObj.drive()\r\n }\r\n\r\n defineExpose({ startGuide })\r\n</script>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-01\r\n * @Description: 用户引导组件(基于 driver.js)\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <NTooltip\r\n placement=\"bottom\"\r\n trigger=\"hover\"\r\n >\r\n <template #trigger>\r\n <NButton\r\n text\r\n @click=\"startGuide\"\r\n >\r\n <C_Icon\r\n name=\"mdi:sign-routes\"\r\n :size=\"18\"\r\n />\r\n </NButton>\r\n </template>\r\n <span>功能引导</span>\r\n </NTooltip>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { NTooltip, NButton } from 'naive-ui'\r\n import C_Icon from '../C_Icon/index.vue'\r\n import { driver } from 'driver.js'\r\n import 'driver.js/dist/driver.css'\r\n\r\n defineOptions({ name: 'C_Guide' })\r\n\r\n export interface GuideStep {\r\n element: string\r\n popover: {\r\n title: string\r\n description: string\r\n side?: 'top' | 'right' | 'bottom' | 'left'\r\n }\r\n }\r\n\r\n const props = withDefaults(\r\n defineProps<{\r\n steps?: GuideStep[]\r\n doneBtnText?: string\r\n nextBtnText?: string\r\n prevBtnText?: string\r\n }>(),\r\n {\r\n steps: () => [],\r\n doneBtnText: '完成',\r\n nextBtnText: '下一步',\r\n prevBtnText: '上一步',\r\n }\r\n )\r\n\r\n const startGuide = () => {\r\n if (!props.steps.length) {\r\n console.warn(\r\n '[C_Guide] 未提供引导步骤(steps),请通过 :steps prop 传入。'\r\n )\r\n return\r\n }\r\n\r\n const driverObj = driver({\r\n popoverClass: 'driverjs-theme',\r\n animate: true,\r\n showProgress: true,\r\n doneBtnText: props.doneBtnText,\r\n nextBtnText: props.nextBtnText,\r\n prevBtnText: props.prevBtnText,\r\n steps: props.steps,\r\n })\r\n\r\n driverObj.drive()\r\n }\r\n\r\n defineExpose({ startGuide })\r\n</script>\r\n"],"mappings":"2cE4CE,IAAM,EAAQ,EAeR,MAAmB,CACvB,GAAI,CAAC,EAAM,MAAM,OAAQ,CACvB,QAAQ,KACN,+CACD,CACD,OAGgB,EAAO,CACvB,aAAc,iBACd,QAAS,GACT,aAAc,GACd,YAAa,EAAM,YACnB,YAAa,EAAM,YACnB,YAAa,EAAM,YACnB,MAAO,EAAM,MACd,CAAC,CAEQ,OAAO,SAGnB,EAAa,CAAE,aAAY,CAAC,aAxE5B,EAgBW,EAAA,EAAA,CAAA,CAfT,UAAU,SACV,QAAQ,UAEG,QAAO,MASN,CARV,EAQU,EAAA,EAAA,CAAA,CAPR,KAAA,GACC,QAAO,kBAKN,CAHF,EAGE,EAAA,CAFA,KAAK,kBACJ,KAAM,6BAII,CAAA,AAAA,EAAA,KAAjB,EAAiB,OAAA,KAAX,OAAI,GAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"C_Guide2.js","names":[],"sources":["../src/components/C_Guide/index.vue","../src/components/C_Guide/index.vue","../src/components/C_Guide/index.vue"],"sourcesContent":["/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-01\r\n * @LastEditors: ChenYu ycyplus@gmail.com\r\n * @LastEditTime: 2026-03-06\r\n * @Description: 用户引导组件(基于 driver.js)— 增强版\r\n * 支持:步骤分组 / 键盘导航 / 步骤回调 / 主题自定义 / 完成持久化\r\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\r\n-->\r\n<template>\r\n <NTooltip\r\n v-if=\"props.showTrigger\"\r\n placement=\"bottom\"\r\n trigger=\"hover\"\r\n >\r\n <template #trigger>\r\n <NButton\r\n text\r\n @click=\"startGuide\"\r\n >\r\n <C_Icon\r\n :name=\"props.triggerIcon\"\r\n :size=\"18\"\r\n />\r\n </NButton>\r\n </template>\r\n <span>{{ props.triggerTooltip }}</span>\r\n </NTooltip>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { computed } from 'vue'\r\n import { NTooltip, NButton } from 'naive-ui'\r\n import C_Icon from '../C_Icon/index.vue'\r\n import { driver } from 'driver.js'\r\n import 'driver.js/dist/driver.css'\r\n import type { GuideProps, GuideStep } from './types'\r\n\r\n defineOptions({ name: 'C_Guide' })\r\n\r\n const props = withDefaults(defineProps<GuideProps>(), {\r\n steps: () => [],\r\n doneBtnText: '完成',\r\n nextBtnText: '下一步',\r\n prevBtnText: '上一步',\r\n showProgress: true,\r\n keyboard: true,\r\n animate: true,\r\n allowClose: true,\r\n popoverClass: 'driverjs-theme',\r\n showTrigger: true,\r\n triggerTooltip: '功能引导',\r\n triggerIcon: 'mdi:sign-routes',\r\n })\r\n\r\n const emit = defineEmits<{\r\n /** 引导开始 */\r\n start: []\r\n /** 引导完成(走完全部步骤) */\r\n complete: []\r\n /** 引导被用户关闭(未完成) */\r\n close: [currentStep: number]\r\n /** 步骤切换 */\r\n 'step-change': [stepIndex: number, step: GuideStep]\r\n }>()\r\n\r\n /** 持久化 key */\r\n const persistKey = computed(() => {\r\n const prefix = props.persistence?.keyPrefix ?? 'c_guide'\r\n return `${prefix}_completed`\r\n })\r\n\r\n /** 是否已完成引导 */\r\n const isCompleted = (): boolean => {\r\n if (!props.persistence?.enabled) return false\r\n try {\r\n return localStorage.getItem(persistKey.value) === 'true'\r\n } catch {\r\n return false\r\n }\r\n }\r\n\r\n /** 标记引导已完成 */\r\n const markCompleted = () => {\r\n if (!props.persistence?.enabled) return\r\n try {\r\n localStorage.setItem(persistKey.value, 'true')\r\n } catch {\r\n // localStorage 不可用时静默忽略\r\n }\r\n }\r\n\r\n /** 重置完成状态 */\r\n const resetCompleted = () => {\r\n try {\r\n localStorage.removeItem(persistKey.value)\r\n } catch {\r\n // 静默忽略\r\n }\r\n }\r\n\r\n /**\r\n * * @description: 过滤掉需要跳过的步骤\r\n * ! @return 有效步骤列表\r\n */\r\n const getActiveSteps = (): GuideStep[] => {\r\n return props.steps.filter(step => !step.skipIf?.())\r\n }\r\n\r\n /**\r\n * * @description: 构建主题相关的 CSS 变量\r\n * ! @return popoverClass 字符串\r\n */\r\n const buildPopoverClass = (): string => {\r\n const classes = [props.popoverClass]\r\n if (props.theme) {\r\n // 通过 CSS 变量注入主题\r\n const root = document.documentElement\r\n if (props.theme.popoverBgColor)\r\n root.style.setProperty(\r\n '--c-guide-popover-bg',\r\n props.theme.popoverBgColor\r\n )\r\n if (props.theme.popoverTextColor)\r\n root.style.setProperty(\r\n '--c-guide-popover-text',\r\n props.theme.popoverTextColor\r\n )\r\n if (props.theme.primaryColor)\r\n root.style.setProperty(\r\n '--c-guide-primary',\r\n props.theme.primaryColor\r\n )\r\n if (props.theme.overlayOpacity !== undefined)\r\n root.style.setProperty(\r\n '--c-guide-overlay-opacity',\r\n String(props.theme.overlayOpacity)\r\n )\r\n if (props.theme.borderRadius)\r\n root.style.setProperty(\r\n '--c-guide-radius',\r\n props.theme.borderRadius\r\n )\r\n }\r\n return classes.filter(Boolean).join(' ')\r\n }\r\n\r\n /**\r\n * * @description: 启动引导流程\r\n * ? @param {boolean} force 是否强制启动(忽略持久化状态)\r\n */\r\n const startGuide = (force = false) => {\r\n if (!force && isCompleted()) return\r\n\r\n const activeSteps = getActiveSteps()\r\n if (!activeSteps.length) {\r\n console.warn(\r\n '[C_Guide] 未提供引导步骤(steps),请通过 :steps prop 传入。'\r\n )\r\n return\r\n }\r\n\r\n let currentStepIndex = 0\r\n\r\n const driverObj = driver({\r\n popoverClass: buildPopoverClass(),\r\n animate: props.animate,\r\n showProgress: props.showProgress,\r\n allowClose: props.allowClose,\r\n doneBtnText: props.doneBtnText,\r\n nextBtnText: props.nextBtnText,\r\n prevBtnText: props.prevBtnText,\r\n steps: activeSteps.map(step => ({\r\n element: step.element,\r\n popover: step.popover,\r\n })),\r\n onHighlightStarted: (_el) => {\r\n const step = activeSteps[currentStepIndex]\r\n if (step) {\r\n step.onHighlightStarted?.(_el as Element | undefined, step)\r\n emit('step-change', currentStepIndex, step)\r\n }\r\n },\r\n onDeselected: (_el) => {\r\n const step = activeSteps[currentStepIndex]\r\n step?.onDeselected?.(_el as Element | undefined, step)\r\n currentStepIndex++\r\n },\r\n onDestroyStarted: () => {\r\n if (currentStepIndex >= activeSteps.length) {\r\n markCompleted()\r\n emit('complete')\r\n } else {\r\n emit('close', currentStepIndex)\r\n }\r\n driverObj.destroy()\r\n },\r\n })\r\n\r\n emit('start')\r\n driverObj.drive()\r\n }\r\n\r\n defineExpose({\r\n startGuide,\r\n resetCompleted,\r\n isCompleted,\r\n })\r\n</script>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-01\r\n * @LastEditors: ChenYu ycyplus@gmail.com\r\n * @LastEditTime: 2026-03-06\r\n * @Description: 用户引导组件(基于 driver.js)— 增强版\r\n * 支持:步骤分组 / 键盘导航 / 步骤回调 / 主题自定义 / 完成持久化\r\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\r\n-->\r\n<template>\r\n <NTooltip\r\n v-if=\"props.showTrigger\"\r\n placement=\"bottom\"\r\n trigger=\"hover\"\r\n >\r\n <template #trigger>\r\n <NButton\r\n text\r\n @click=\"startGuide\"\r\n >\r\n <C_Icon\r\n :name=\"props.triggerIcon\"\r\n :size=\"18\"\r\n />\r\n </NButton>\r\n </template>\r\n <span>{{ props.triggerTooltip }}</span>\r\n </NTooltip>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { computed } from 'vue'\r\n import { NTooltip, NButton } from 'naive-ui'\r\n import C_Icon from '../C_Icon/index.vue'\r\n import { driver } from 'driver.js'\r\n import 'driver.js/dist/driver.css'\r\n import type { GuideProps, GuideStep } from './types'\r\n\r\n defineOptions({ name: 'C_Guide' })\r\n\r\n const props = withDefaults(defineProps<GuideProps>(), {\r\n steps: () => [],\r\n doneBtnText: '完成',\r\n nextBtnText: '下一步',\r\n prevBtnText: '上一步',\r\n showProgress: true,\r\n keyboard: true,\r\n animate: true,\r\n allowClose: true,\r\n popoverClass: 'driverjs-theme',\r\n showTrigger: true,\r\n triggerTooltip: '功能引导',\r\n triggerIcon: 'mdi:sign-routes',\r\n })\r\n\r\n const emit = defineEmits<{\r\n /** 引导开始 */\r\n start: []\r\n /** 引导完成(走完全部步骤) */\r\n complete: []\r\n /** 引导被用户关闭(未完成) */\r\n close: [currentStep: number]\r\n /** 步骤切换 */\r\n 'step-change': [stepIndex: number, step: GuideStep]\r\n }>()\r\n\r\n /** 持久化 key */\r\n const persistKey = computed(() => {\r\n const prefix = props.persistence?.keyPrefix ?? 'c_guide'\r\n return `${prefix}_completed`\r\n })\r\n\r\n /** 是否已完成引导 */\r\n const isCompleted = (): boolean => {\r\n if (!props.persistence?.enabled) return false\r\n try {\r\n return localStorage.getItem(persistKey.value) === 'true'\r\n } catch {\r\n return false\r\n }\r\n }\r\n\r\n /** 标记引导已完成 */\r\n const markCompleted = () => {\r\n if (!props.persistence?.enabled) return\r\n try {\r\n localStorage.setItem(persistKey.value, 'true')\r\n } catch {\r\n // localStorage 不可用时静默忽略\r\n }\r\n }\r\n\r\n /** 重置完成状态 */\r\n const resetCompleted = () => {\r\n try {\r\n localStorage.removeItem(persistKey.value)\r\n } catch {\r\n // 静默忽略\r\n }\r\n }\r\n\r\n /**\r\n * * @description: 过滤掉需要跳过的步骤\r\n * ! @return 有效步骤列表\r\n */\r\n const getActiveSteps = (): GuideStep[] => {\r\n return props.steps.filter(step => !step.skipIf?.())\r\n }\r\n\r\n /**\r\n * * @description: 构建主题相关的 CSS 变量\r\n * ! @return popoverClass 字符串\r\n */\r\n const buildPopoverClass = (): string => {\r\n const classes = [props.popoverClass]\r\n if (props.theme) {\r\n // 通过 CSS 变量注入主题\r\n const root = document.documentElement\r\n if (props.theme.popoverBgColor)\r\n root.style.setProperty(\r\n '--c-guide-popover-bg',\r\n props.theme.popoverBgColor\r\n )\r\n if (props.theme.popoverTextColor)\r\n root.style.setProperty(\r\n '--c-guide-popover-text',\r\n props.theme.popoverTextColor\r\n )\r\n if (props.theme.primaryColor)\r\n root.style.setProperty(\r\n '--c-guide-primary',\r\n props.theme.primaryColor\r\n )\r\n if (props.theme.overlayOpacity !== undefined)\r\n root.style.setProperty(\r\n '--c-guide-overlay-opacity',\r\n String(props.theme.overlayOpacity)\r\n )\r\n if (props.theme.borderRadius)\r\n root.style.setProperty(\r\n '--c-guide-radius',\r\n props.theme.borderRadius\r\n )\r\n }\r\n return classes.filter(Boolean).join(' ')\r\n }\r\n\r\n /**\r\n * * @description: 启动引导流程\r\n * ? @param {boolean} force 是否强制启动(忽略持久化状态)\r\n */\r\n const startGuide = (force = false) => {\r\n if (!force && isCompleted()) return\r\n\r\n const activeSteps = getActiveSteps()\r\n if (!activeSteps.length) {\r\n console.warn(\r\n '[C_Guide] 未提供引导步骤(steps),请通过 :steps prop 传入。'\r\n )\r\n return\r\n }\r\n\r\n let currentStepIndex = 0\r\n\r\n const driverObj = driver({\r\n popoverClass: buildPopoverClass(),\r\n animate: props.animate,\r\n showProgress: props.showProgress,\r\n allowClose: props.allowClose,\r\n doneBtnText: props.doneBtnText,\r\n nextBtnText: props.nextBtnText,\r\n prevBtnText: props.prevBtnText,\r\n steps: activeSteps.map(step => ({\r\n element: step.element,\r\n popover: step.popover,\r\n })),\r\n onHighlightStarted: (_el) => {\r\n const step = activeSteps[currentStepIndex]\r\n if (step) {\r\n step.onHighlightStarted?.(_el as Element | undefined, step)\r\n emit('step-change', currentStepIndex, step)\r\n }\r\n },\r\n onDeselected: (_el) => {\r\n const step = activeSteps[currentStepIndex]\r\n step?.onDeselected?.(_el as Element | undefined, step)\r\n currentStepIndex++\r\n },\r\n onDestroyStarted: () => {\r\n if (currentStepIndex >= activeSteps.length) {\r\n markCompleted()\r\n emit('complete')\r\n } else {\r\n emit('close', currentStepIndex)\r\n }\r\n driverObj.destroy()\r\n },\r\n })\r\n\r\n emit('start')\r\n driverObj.drive()\r\n }\r\n\r\n defineExpose({\r\n startGuide,\r\n resetCompleted,\r\n isCompleted,\r\n })\r\n</script>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-01\r\n * @LastEditors: ChenYu ycyplus@gmail.com\r\n * @LastEditTime: 2026-03-06\r\n * @Description: 用户引导组件(基于 driver.js)— 增强版\r\n * 支持:步骤分组 / 键盘导航 / 步骤回调 / 主题自定义 / 完成持久化\r\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\r\n-->\r\n<template>\r\n <NTooltip\r\n v-if=\"props.showTrigger\"\r\n placement=\"bottom\"\r\n trigger=\"hover\"\r\n >\r\n <template #trigger>\r\n <NButton\r\n text\r\n @click=\"startGuide\"\r\n >\r\n <C_Icon\r\n :name=\"props.triggerIcon\"\r\n :size=\"18\"\r\n />\r\n </NButton>\r\n </template>\r\n <span>{{ props.triggerTooltip }}</span>\r\n </NTooltip>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { computed } from 'vue'\r\n import { NTooltip, NButton } from 'naive-ui'\r\n import C_Icon from '../C_Icon/index.vue'\r\n import { driver } from 'driver.js'\r\n import 'driver.js/dist/driver.css'\r\n import type { GuideProps, GuideStep } from './types'\r\n\r\n defineOptions({ name: 'C_Guide' })\r\n\r\n const props = withDefaults(defineProps<GuideProps>(), {\r\n steps: () => [],\r\n doneBtnText: '完成',\r\n nextBtnText: '下一步',\r\n prevBtnText: '上一步',\r\n showProgress: true,\r\n keyboard: true,\r\n animate: true,\r\n allowClose: true,\r\n popoverClass: 'driverjs-theme',\r\n showTrigger: true,\r\n triggerTooltip: '功能引导',\r\n triggerIcon: 'mdi:sign-routes',\r\n })\r\n\r\n const emit = defineEmits<{\r\n /** 引导开始 */\r\n start: []\r\n /** 引导完成(走完全部步骤) */\r\n complete: []\r\n /** 引导被用户关闭(未完成) */\r\n close: [currentStep: number]\r\n /** 步骤切换 */\r\n 'step-change': [stepIndex: number, step: GuideStep]\r\n }>()\r\n\r\n /** 持久化 key */\r\n const persistKey = computed(() => {\r\n const prefix = props.persistence?.keyPrefix ?? 'c_guide'\r\n return `${prefix}_completed`\r\n })\r\n\r\n /** 是否已完成引导 */\r\n const isCompleted = (): boolean => {\r\n if (!props.persistence?.enabled) return false\r\n try {\r\n return localStorage.getItem(persistKey.value) === 'true'\r\n } catch {\r\n return false\r\n }\r\n }\r\n\r\n /** 标记引导已完成 */\r\n const markCompleted = () => {\r\n if (!props.persistence?.enabled) return\r\n try {\r\n localStorage.setItem(persistKey.value, 'true')\r\n } catch {\r\n // localStorage 不可用时静默忽略\r\n }\r\n }\r\n\r\n /** 重置完成状态 */\r\n const resetCompleted = () => {\r\n try {\r\n localStorage.removeItem(persistKey.value)\r\n } catch {\r\n // 静默忽略\r\n }\r\n }\r\n\r\n /**\r\n * * @description: 过滤掉需要跳过的步骤\r\n * ! @return 有效步骤列表\r\n */\r\n const getActiveSteps = (): GuideStep[] => {\r\n return props.steps.filter(step => !step.skipIf?.())\r\n }\r\n\r\n /**\r\n * * @description: 构建主题相关的 CSS 变量\r\n * ! @return popoverClass 字符串\r\n */\r\n const buildPopoverClass = (): string => {\r\n const classes = [props.popoverClass]\r\n if (props.theme) {\r\n // 通过 CSS 变量注入主题\r\n const root = document.documentElement\r\n if (props.theme.popoverBgColor)\r\n root.style.setProperty(\r\n '--c-guide-popover-bg',\r\n props.theme.popoverBgColor\r\n )\r\n if (props.theme.popoverTextColor)\r\n root.style.setProperty(\r\n '--c-guide-popover-text',\r\n props.theme.popoverTextColor\r\n )\r\n if (props.theme.primaryColor)\r\n root.style.setProperty(\r\n '--c-guide-primary',\r\n props.theme.primaryColor\r\n )\r\n if (props.theme.overlayOpacity !== undefined)\r\n root.style.setProperty(\r\n '--c-guide-overlay-opacity',\r\n String(props.theme.overlayOpacity)\r\n )\r\n if (props.theme.borderRadius)\r\n root.style.setProperty(\r\n '--c-guide-radius',\r\n props.theme.borderRadius\r\n )\r\n }\r\n return classes.filter(Boolean).join(' ')\r\n }\r\n\r\n /**\r\n * * @description: 启动引导流程\r\n * ? @param {boolean} force 是否强制启动(忽略持久化状态)\r\n */\r\n const startGuide = (force = false) => {\r\n if (!force && isCompleted()) return\r\n\r\n const activeSteps = getActiveSteps()\r\n if (!activeSteps.length) {\r\n console.warn(\r\n '[C_Guide] 未提供引导步骤(steps),请通过 :steps prop 传入。'\r\n )\r\n return\r\n }\r\n\r\n let currentStepIndex = 0\r\n\r\n const driverObj = driver({\r\n popoverClass: buildPopoverClass(),\r\n animate: props.animate,\r\n showProgress: props.showProgress,\r\n allowClose: props.allowClose,\r\n doneBtnText: props.doneBtnText,\r\n nextBtnText: props.nextBtnText,\r\n prevBtnText: props.prevBtnText,\r\n steps: activeSteps.map(step => ({\r\n element: step.element,\r\n popover: step.popover,\r\n })),\r\n onHighlightStarted: (_el) => {\r\n const step = activeSteps[currentStepIndex]\r\n if (step) {\r\n step.onHighlightStarted?.(_el as Element | undefined, step)\r\n emit('step-change', currentStepIndex, step)\r\n }\r\n },\r\n onDeselected: (_el) => {\r\n const step = activeSteps[currentStepIndex]\r\n step?.onDeselected?.(_el as Element | undefined, step)\r\n currentStepIndex++\r\n },\r\n onDestroyStarted: () => {\r\n if (currentStepIndex >= activeSteps.length) {\r\n markCompleted()\r\n emit('complete')\r\n } else {\r\n emit('close', currentStepIndex)\r\n }\r\n driverObj.destroy()\r\n },\r\n })\r\n\r\n emit('start')\r\n driverObj.drive()\r\n }\r\n\r\n defineExpose({\r\n startGuide,\r\n resetCompleted,\r\n isCompleted,\r\n })\r\n</script>\r\n"],"mappings":"63BEwCE,IAAM,EAAQ,EAeR,EAAO,EAYP,EAAa,MAEV,GADQ,EAAM,aAAa,WAAa,UAC9B,YACjB,CAGI,MAA6B,CACjC,GAAI,CAAC,EAAM,aAAa,QAAS,MAAO,GACxC,GAAI,CACF,OAAO,aAAa,QAAQ,EAAW,MAAM,GAAK,YAC5C,CACN,MAAO,KAKL,MAAsB,CACrB,KAAM,aAAa,QACxB,GAAI,CACF,aAAa,QAAQ,EAAW,MAAO,OAAO,MACxC,IAMJ,MAAuB,CAC3B,GAAI,CACF,aAAa,WAAW,EAAW,MAAM,MACnC,IASJ,MACG,EAAM,MAAM,OAAO,GAAQ,CAAC,EAAK,UAAU,CAAC,CAO/C,MAAkC,CACtC,IAAM,EAAU,CAAC,EAAM,aAAa,CACpC,GAAI,EAAM,MAAO,CAEf,IAAM,EAAO,SAAS,gBAClB,EAAM,MAAM,gBACd,EAAK,MAAM,YACT,uBACA,EAAM,MAAM,eACb,CACC,EAAM,MAAM,kBACd,EAAK,MAAM,YACT,yBACA,EAAM,MAAM,iBACb,CACC,EAAM,MAAM,cACd,EAAK,MAAM,YACT,oBACA,EAAM,MAAM,aACb,CACC,EAAM,MAAM,iBAAmB,IAAA,IACjC,EAAK,MAAM,YACT,4BACA,OAAO,EAAM,MAAM,eAAe,CACnC,CACC,EAAM,MAAM,cACd,EAAK,MAAM,YACT,mBACA,EAAM,MAAM,aACb,CAEL,OAAO,EAAQ,OAAO,QAAQ,CAAC,KAAK,IAAI,EAOpC,GAAc,EAAQ,KAAU,CACpC,GAAI,CAAC,GAAS,GAAa,CAAE,OAE7B,IAAM,EAAc,GAAgB,CACpC,GAAI,CAAC,EAAY,OAAQ,CACvB,QAAQ,KACN,+CACD,CACD,OAGF,IAAI,EAAmB,EAEjB,EAAY,EAAO,CACvB,aAAc,GAAmB,CACjC,QAAS,EAAM,QACf,aAAc,EAAM,aACpB,WAAY,EAAM,WAClB,YAAa,EAAM,YACnB,YAAa,EAAM,YACnB,YAAa,EAAM,YACnB,MAAO,EAAY,IAAI,IAAS,CAC9B,QAAS,EAAK,QACd,QAAS,EAAK,QACf,EAAE,CACH,mBAAqB,GAAQ,CAC3B,IAAM,EAAO,EAAY,GACrB,IACF,EAAK,qBAAqB,EAA4B,EAAK,CAC3D,EAAK,cAAe,EAAkB,EAAK,GAG/C,aAAe,GAAQ,CACrB,IAAM,EAAO,EAAY,GACzB,GAAM,eAAe,EAA4B,EAAK,CACtD,KAEF,qBAAwB,CAClB,GAAoB,EAAY,QAClC,GAAe,CACf,EAAK,WAAW,EAEhB,EAAK,QAAS,EAAiB,CAEjC,EAAU,SAAS,EAEtB,CAAC,CAEF,EAAK,QAAQ,CACb,EAAU,OAAO,SAGnB,EAAa,CACX,aACA,iBACA,cACD,CAAC,QApMM,EAAM,aAAA,GAAA,CADd,EAiBW,EAAA,EAAA,CAAA,OAfT,UAAU,SACV,QAAQ,UAEG,QAAO,MASN,CARV,EAQU,EAAA,EAAA,CAAA,CAPR,KAAA,GACC,QAAO,kBAKN,CAHF,EAGE,EAAA,CAFC,KAAM,EAAM,YACZ,KAAM,6CAI0B,CAAvC,EAAuC,OAAA,KAAA,EAA9B,EAAM,eAAc,CAAA,EAAA,CAAA,CAAA"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"C_Markdown-7J0uPEuk.css","names":[],"sources":["../src/components/C_Markdown/index.vue?vue&type=style&index=0&scoped=67f4346d&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled *//* C_Markdown 组件样式文件 */\n.c-markdown-wrapper[data-v-67f4346d] {\n --c-markdown-dark-icon-color: #ffffff;\n --c-markdown-dark-hover-bg: rgba(255, 255, 255, 0.08);\n --c-markdown-dark-active-bg: rgba(255, 255, 255, 0.12);\n --c-markdown-dark-scrollbar-track: rgba(255, 255, 255, 0.05);\n --c-markdown-dark-scrollbar-thumb: rgba(255, 255, 255, 0.2);\n --c-markdown-dark-scrollbar-hover: rgba(255, 255, 255, 0.3);\n position: relative;\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor {\n border-radius: 6px;\n border: 1px solid var(--c-border);\n background-color: var(--c-bg-card);\n /* 禁用状态样式 */\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor:hover {\n border-color: var(--c-primary);\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor:focus-within {\n border-color: var(--c-primary);\n box-shadow: 0 0 0 2px var(--c-primary-opacity, rgba(24, 160, 88, 0.2));\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor.disabled {\n background-color: var(--c-bg-disabled, #fafafc);\n cursor: not-allowed;\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor.disabled .v-md-editor__editor {\n cursor: not-allowed;\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar {\n background-color: var(--c-bg-card);\n border-bottom: 1px solid var(--c-border);\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__editor-wrapper {\n background-color: var(--c-bg-card);\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__editor {\n background-color: var(--c-bg-card);\n color: var(--c-text-1);\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__editor textarea {\n color: var(--c-text-1);\n caret-color: var(--c-text-1);\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__preview-wrapper {\n background-color: var(--c-bg-card);\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__preview {\n background-color: var(--c-bg-card);\n color: var(--c-text-1);\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__toc-nav-wrapper {\n background-color: var(--c-bg-card);\n border-left: 1px solid var(--c-border);\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-item {\n color: var(--c-markdown-dark-icon-color);\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-item:hover {\n background-color: var(--c-markdown-dark-hover-bg);\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-item.is-active {\n background-color: var(--c-markdown-dark-active-bg);\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-item svg {\n fill: var(--c-markdown-dark-icon-color);\n opacity: 0.9;\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-item:hover svg {\n opacity: 1;\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item {\n background-color: transparent;\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item svg {\n fill: var(--c-markdown-dark-icon-color);\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item:hover {\n background-color: var(--c-markdown-dark-hover-bg);\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-divider {\n background-color: var(--c-border);\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__editor::-webkit-scrollbar,\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__preview::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-track,\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-track {\n background-color: var(--c-markdown-dark-scrollbar-track);\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-thumb,\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-thumb {\n background-color: var(--c-markdown-dark-scrollbar-thumb);\n border-radius: 4px;\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-thumb:hover,\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-thumb:hover {\n background-color: var(--c-markdown-dark-scrollbar-hover);\n}\n.c-markdown-wrapper .word-count[data-v-67f4346d] {\n position: absolute;\n bottom: 8px;\n right: 12px;\n font-size: 12px;\n color: var(--c-text-4);\n background: var(--c-bg-card);\n padding: 2px 6px;\n border-radius: 4px;\n z-index: 10;\n}\n.c-markdown-wrapper .word-count.exceed[data-v-67f4346d] {\n color: var(--c-error);\n}"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"C_Markdown-C7Lg0_9z.css","names":[],"sources":["../src/components/C_Markdown/index.vue?vue&type=style&index=0&scoped=67f4346d&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled *//* C_Markdown 组件样式文件 */\n.c-markdown-wrapper[data-v-67f4346d] {\n --c-markdown-dark-icon-color: #ffffff;\n --c-markdown-dark-hover-bg: rgba(255, 255, 255, 0.08);\n --c-markdown-dark-active-bg: rgba(255, 255, 255, 0.12);\n --c-markdown-dark-scrollbar-track: rgba(255, 255, 255, 0.05);\n --c-markdown-dark-scrollbar-thumb: rgba(255, 255, 255, 0.2);\n --c-markdown-dark-scrollbar-hover: rgba(255, 255, 255, 0.3);\n position: relative;\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor {\n border-radius: 6px;\n border: 1px solid var(--c-border);\n background-color: var(--c-bg-card);\n /* 禁用状态样式 */\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor:hover {\n border-color: var(--c-primary);\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor:focus-within {\n border-color: var(--c-primary);\n box-shadow: 0 0 0 2px var(--c-primary-opacity, rgba(24, 160, 88, 0.2));\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor.disabled {\n background-color: var(--c-bg-disabled, #fafafc);\n cursor: not-allowed;\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor.disabled .v-md-editor__editor {\n cursor: not-allowed;\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar {\n background-color: var(--c-bg-card);\n border-bottom: 1px solid var(--c-border);\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__editor-wrapper {\n background-color: var(--c-bg-card);\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__editor {\n background-color: var(--c-bg-card);\n color: var(--c-text-1);\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__editor textarea {\n color: var(--c-text-1);\n caret-color: var(--c-text-1);\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__preview-wrapper {\n background-color: var(--c-bg-card);\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__preview {\n background-color: var(--c-bg-card);\n color: var(--c-text-1);\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__toc-nav-wrapper {\n background-color: var(--c-bg-card);\n border-left: 1px solid var(--c-border);\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-item {\n color: var(--c-markdown-dark-icon-color);\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-item:hover {\n background-color: var(--c-markdown-dark-hover-bg);\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-item.is-active {\n background-color: var(--c-markdown-dark-active-bg);\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-item svg {\n fill: var(--c-markdown-dark-icon-color);\n opacity: 0.9;\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-item:hover svg {\n opacity: 1;\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item {\n background-color: transparent;\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item svg {\n fill: var(--c-markdown-dark-icon-color);\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item:hover {\n background-color: var(--c-markdown-dark-hover-bg);\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-divider {\n background-color: var(--c-border);\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__editor::-webkit-scrollbar,\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__preview::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-track,\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-track {\n background-color: var(--c-markdown-dark-scrollbar-track);\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-thumb,\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-thumb {\n background-color: var(--c-markdown-dark-scrollbar-thumb);\n border-radius: 4px;\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-thumb:hover,\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-thumb:hover {\n background-color: var(--c-markdown-dark-scrollbar-hover);\n}\n.c-markdown-wrapper .word-count[data-v-67f4346d] {\n position: absolute;\n bottom: 8px;\n right: 12px;\n font-size: 12px;\n color: var(--c-text-4);\n background: var(--c-bg-card);\n padding: 2px 6px;\n border-radius: 4px;\n z-index: 10;\n}\n.c-markdown-wrapper .word-count.exceed[data-v-67f4346d] {\n color: var(--c-error);\n}"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
@@ -1,5 +1,11 @@
1
1
  /* unplugin-vue-components disabled *//* C_Markdown 组件样式文件 */
2
2
  .c-markdown-wrapper[data-v-67f4346d] {
3
+ --c-markdown-dark-icon-color: #ffffff;
4
+ --c-markdown-dark-hover-bg: rgba(255, 255, 255, 0.08);
5
+ --c-markdown-dark-active-bg: rgba(255, 255, 255, 0.12);
6
+ --c-markdown-dark-scrollbar-track: rgba(255, 255, 255, 0.05);
7
+ --c-markdown-dark-scrollbar-thumb: rgba(255, 255, 255, 0.2);
8
+ --c-markdown-dark-scrollbar-hover: rgba(255, 255, 255, 0.3);
3
9
  position: relative;
4
10
  }
5
11
  .c-markdown-wrapper[data-v-67f4346d] .v-md-editor {
@@ -49,16 +55,16 @@
49
55
  border-left: 1px solid var(--c-border);
50
56
  }
51
57
  .c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-item {
52
- color: #ffffff;
58
+ color: var(--c-markdown-dark-icon-color);
53
59
  }
54
60
  .c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-item:hover {
55
- background-color: rgba(255, 255, 255, 0.08);
61
+ background-color: var(--c-markdown-dark-hover-bg);
56
62
  }
57
63
  .c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-item.is-active {
58
- background-color: rgba(255, 255, 255, 0.12);
64
+ background-color: var(--c-markdown-dark-active-bg);
59
65
  }
60
66
  .c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-item svg {
61
- fill: #ffffff;
67
+ fill: var(--c-markdown-dark-icon-color);
62
68
  opacity: 0.9;
63
69
  }
64
70
  .c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-item:hover svg {
@@ -68,10 +74,10 @@
68
74
  background-color: transparent;
69
75
  }
70
76
  .c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item svg {
71
- fill: #ffffff;
77
+ fill: var(--c-markdown-dark-icon-color);
72
78
  }
73
79
  .c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item:hover {
74
- background-color: rgba(255, 255, 255, 0.08);
80
+ background-color: var(--c-markdown-dark-hover-bg);
75
81
  }
76
82
  .c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-divider {
77
83
  background-color: var(--c-border);
@@ -83,16 +89,16 @@
83
89
  }
84
90
  .c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-track,
85
91
  .c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-track {
86
- background-color: rgba(255, 255, 255, 0.05);
92
+ background-color: var(--c-markdown-dark-scrollbar-track);
87
93
  }
88
94
  .c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-thumb,
89
95
  .c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-thumb {
90
- background-color: rgba(255, 255, 255, 0.2);
96
+ background-color: var(--c-markdown-dark-scrollbar-thumb);
91
97
  border-radius: 4px;
92
98
  }
93
99
  .c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-thumb:hover,
94
100
  .c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-thumb:hover {
95
- background-color: rgba(255, 255, 255, 0.3);
101
+ background-color: var(--c-markdown-dark-scrollbar-hover);
96
102
  }
97
103
  .c-markdown-wrapper .word-count[data-v-67f4346d] {
98
104
  position: absolute;
@@ -109,4 +115,4 @@
109
115
  color: var(--c-error);
110
116
  }
111
117
 
112
- /*# sourceMappingURL=C_Markdown-7iBnLDtL.css.map*/
118
+ /*# sourceMappingURL=C_Markdown-7J0uPEuk.css.map*/
@@ -0,0 +1 @@
1
+ {"version":3,"file":"C_OrgChart-ChZu346B.css","names":[],"sources":["../src/components/C_OrgChart/index.vue?vue&type=style&index=0&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled *//* C_OrgChart 组织架构图组件样式 */\n.c-orgchart {\n --c-orgchart-line-color: #d1d5db;\n --c-orgchart-line-width: 2px;\n --c-orgchart-node-spacing: 24px;\n --c-orgchart-level-spacing: 48px;\n --c-orgchart-node-bg: var(--card-color, #ffffff);\n --c-orgchart-node-border: var(--border-color, #e5e7eb);\n --c-orgchart-node-shadow: rgba(0, 0, 0, 0.06);\n --c-orgchart-node-hover-shadow: rgba(0, 0, 0, 0.12);\n --c-orgchart-label-color: var(--text-color-1, #262626);\n --c-orgchart-subtitle-color: var(--text-color-3, #999999);\n --c-orgchart-toggle-bg: var(--card-color, #ffffff);\n --c-orgchart-toggle-color: var(--text-color-2, #666666);\n --c-orgchart-avatar-size: 36px;\n --c-orgchart-controls-bg: var(--card-color, #ffffff);\n --c-orgchart-controls-shadow: rgba(0, 0, 0, 0.1);\n position: relative;\n width: 100%;\n height: 100%;\n min-height: 300px;\n overflow: hidden;\n cursor: grab;\n user-select: none;\n}\n.c-orgchart:active {\n cursor: grabbing;\n}\n.c-orgchart__viewport {\n display: inline-flex;\n justify-content: center;\n width: 100%;\n padding: 32px;\n transition: transform 0.15s ease;\n}\n\n/* ─── 节点包裹器(垂直布局) ─── */\n.c-orgchart--vertical .c-orgchart__node-wrapper {\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n.c-orgchart--vertical .c-orgchart__children {\n display: flex;\n justify-content: center;\n padding-top: var(--c-orgchart-level-spacing);\n gap: var(--c-orgchart-node-spacing);\n position: relative;\n /* 垂直连线:父→子 */\n /* 横连线:兄弟节点 */\n /* 兄弟之间的水平线 */\n}\n.c-orgchart--vertical .c-orgchart__children::before {\n content: \"\";\n position: absolute;\n top: 0;\n left: 50%;\n width: var(--c-orgchart-line-width);\n height: calc(var(--c-orgchart-level-spacing) / 2);\n background: var(--c-orgchart-line-color);\n transform: translateX(-50%);\n}\n.c-orgchart--vertical .c-orgchart__children > .c-orgchart__node-wrapper {\n position: relative;\n}\n.c-orgchart--vertical .c-orgchart__children > .c-orgchart__node-wrapper::before {\n content: \"\";\n position: absolute;\n top: calc(var(--c-orgchart-level-spacing) / -2);\n left: 50%;\n width: var(--c-orgchart-line-width);\n height: calc(var(--c-orgchart-level-spacing) / 2);\n background: var(--c-orgchart-line-color);\n transform: translateX(-50%);\n}\n.c-orgchart--vertical .c-orgchart__children > .c-orgchart__node-wrapper:not(:only-child)::after {\n content: \"\";\n position: absolute;\n top: calc(var(--c-orgchart-level-spacing) / -2);\n height: var(--c-orgchart-line-width);\n background: var(--c-orgchart-line-color);\n}\n.c-orgchart--vertical .c-orgchart__children > .c-orgchart__node-wrapper:not(:only-child):first-child::after {\n left: 50%;\n right: calc(-1 * var(--c-orgchart-node-spacing) / 2);\n}\n.c-orgchart--vertical .c-orgchart__children > .c-orgchart__node-wrapper:not(:only-child):last-child::after {\n left: calc(-1 * var(--c-orgchart-node-spacing) / 2);\n right: 50%;\n}\n.c-orgchart--vertical .c-orgchart__children > .c-orgchart__node-wrapper:not(:only-child):not(:first-child):not(:last-child)::after {\n left: calc(-1 * var(--c-orgchart-node-spacing) / 2);\n right: calc(-1 * var(--c-orgchart-node-spacing) / 2);\n}\n\n/* ─── 水平布局 ─── */\n.c-orgchart--horizontal .c-orgchart__node-wrapper {\n display: flex;\n align-items: center;\n}\n.c-orgchart--horizontal .c-orgchart__children {\n display: flex;\n flex-direction: column;\n justify-content: center;\n padding-left: var(--c-orgchart-level-spacing);\n gap: var(--c-orgchart-node-spacing);\n position: relative;\n}\n.c-orgchart--horizontal .c-orgchart__children::before {\n content: \"\";\n position: absolute;\n left: 0;\n top: 50%;\n height: var(--c-orgchart-line-width);\n width: calc(var(--c-orgchart-level-spacing) / 2);\n background: var(--c-orgchart-line-color);\n transform: translateY(-50%);\n}\n.c-orgchart--horizontal .c-orgchart__children > .c-orgchart__node-wrapper {\n position: relative;\n}\n.c-orgchart--horizontal .c-orgchart__children > .c-orgchart__node-wrapper::before {\n content: \"\";\n position: absolute;\n left: calc(var(--c-orgchart-level-spacing) / -2);\n top: 50%;\n width: calc(var(--c-orgchart-level-spacing) / 2);\n height: var(--c-orgchart-line-width);\n background: var(--c-orgchart-line-color);\n transform: translateY(-50%);\n}\n.c-orgchart--horizontal .c-orgchart__children > .c-orgchart__node-wrapper:not(:only-child)::after {\n content: \"\";\n position: absolute;\n left: calc(var(--c-orgchart-level-spacing) / -2);\n width: var(--c-orgchart-line-width);\n background: var(--c-orgchart-line-color);\n}\n.c-orgchart--horizontal .c-orgchart__children > .c-orgchart__node-wrapper:not(:only-child):first-child::after {\n top: 50%;\n bottom: calc(-1 * var(--c-orgchart-node-spacing) / 2);\n}\n.c-orgchart--horizontal .c-orgchart__children > .c-orgchart__node-wrapper:not(:only-child):last-child::after {\n top: calc(-1 * var(--c-orgchart-node-spacing) / 2);\n bottom: 50%;\n}\n.c-orgchart--horizontal .c-orgchart__children > .c-orgchart__node-wrapper:not(:only-child):not(:first-child):not(:last-child)::after {\n top: calc(-1 * var(--c-orgchart-node-spacing) / 2);\n bottom: calc(-1 * var(--c-orgchart-node-spacing) / 2);\n}\n\n/* ─── 圆角连线 ─── */\n.c-orgchart--line-rounded .c-orgchart__children::before,\n.c-orgchart--line-rounded .c-orgchart__node-wrapper::before,\n.c-orgchart--line-rounded .c-orgchart__node-wrapper::after {\n border-radius: 4px;\n}\n\n/* ─── 节点卡片 ─── */\n.c-orgchart__node {\n position: relative;\n background: var(--c-orgchart-node-bg);\n border: 1px solid var(--c-orgchart-node-border);\n border-radius: 8px;\n padding: 12px 16px;\n cursor: pointer;\n box-shadow: 0 2px 8px var(--c-orgchart-node-shadow);\n transition: box-shadow 0.2s ease, transform 0.2s ease;\n white-space: nowrap;\n}\n.c-orgchart__node:hover {\n box-shadow: 0 4px 16px var(--c-orgchart-node-hover-shadow);\n transform: translateY(-2px);\n}\n.c-orgchart__node--leaf {\n opacity: 0.9;\n}\n\n/* ─── 默认节点布局 ─── */\n.c-orgchart__node-default {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n.c-orgchart__avatar {\n width: var(--c-orgchart-avatar-size);\n height: var(--c-orgchart-avatar-size);\n border-radius: 50%;\n overflow: hidden;\n flex-shrink: 0;\n}\n.c-orgchart__avatar img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n.c-orgchart__info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n.c-orgchart__label {\n font-size: 14px;\n font-weight: 600;\n color: var(--c-orgchart-label-color);\n}\n.c-orgchart__subtitle {\n font-size: 12px;\n color: var(--c-orgchart-subtitle-color);\n}\n\n/* ─── 折叠按钮 ─── */\n.c-orgchart__toggle {\n position: absolute;\n bottom: -12px;\n left: 50%;\n transform: translateX(-50%);\n width: 24px;\n height: 24px;\n border-radius: 50%;\n border: 1px solid var(--c-orgchart-node-border);\n background: var(--c-orgchart-toggle-bg);\n color: var(--c-orgchart-toggle-color);\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1;\n transition: background 0.2s ease;\n}\n.c-orgchart__toggle:hover {\n background: color-mix(in srgb, var(--c-orgchart-node-border) 20%, var(--c-orgchart-toggle-bg));\n}\n.c-orgchart--horizontal .c-orgchart__toggle {\n bottom: auto;\n left: auto;\n right: -12px;\n top: 50%;\n transform: translateY(-50%);\n}\n\n/* ─── 缩放控制 ─── */\n.c-orgchart__controls {\n position: absolute;\n bottom: 16px;\n right: 16px;\n display: flex;\n align-items: center;\n gap: 4px;\n background: var(--c-orgchart-controls-bg);\n border-radius: 8px;\n padding: 4px;\n box-shadow: 0 2px 8px var(--c-orgchart-controls-shadow);\n z-index: 10;\n}\n.c-orgchart__control-btn {\n width: 32px;\n height: 32px;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: var(--c-orgchart-label-color);\n font-size: 16px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.2s ease;\n}\n.c-orgchart__control-btn:hover {\n background: color-mix(in srgb, var(--c-orgchart-node-border) 30%, transparent);\n}\n.c-orgchart__zoom-level {\n font-size: 12px;\n color: var(--c-orgchart-subtitle-color);\n min-width: 40px;\n text-align: center;\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;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"C_OrgChart-DqBufOv5.css","names":[],"sources":["../src/components/C_OrgChart/index.vue?vue&type=style&index=0&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled *//* C_OrgChart 组织架构图组件样式 */\n.c-orgchart {\n --c-orgchart-line-color: #d1d5db;\n --c-orgchart-line-width: 2px;\n --c-orgchart-node-spacing: 24px;\n --c-orgchart-level-spacing: 48px;\n --c-orgchart-node-bg: var(--card-color, #ffffff);\n --c-orgchart-node-border: var(--border-color, #e5e7eb);\n --c-orgchart-node-shadow: rgba(0, 0, 0, 0.06);\n --c-orgchart-node-hover-shadow: rgba(0, 0, 0, 0.12);\n --c-orgchart-label-color: var(--text-color-1, #262626);\n --c-orgchart-subtitle-color: var(--text-color-3, #999999);\n --c-orgchart-toggle-bg: var(--card-color, #ffffff);\n --c-orgchart-toggle-color: var(--text-color-2, #666666);\n --c-orgchart-avatar-size: 36px;\n --c-orgchart-controls-bg: var(--card-color, #ffffff);\n --c-orgchart-controls-shadow: rgba(0, 0, 0, 0.1);\n position: relative;\n width: 100%;\n height: 100%;\n min-height: 300px;\n overflow: hidden;\n cursor: grab;\n user-select: none;\n}\n.c-orgchart:active {\n cursor: grabbing;\n}\n.c-orgchart__viewport {\n display: inline-flex;\n justify-content: center;\n width: 100%;\n padding: 32px;\n transition: transform 0.15s ease;\n}\n\n/* ─── 节点包裹器(垂直布局) ─── */\n.c-orgchart--vertical .c-orgchart__node-wrapper {\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n.c-orgchart--vertical .c-orgchart__children {\n display: flex;\n justify-content: center;\n padding-top: var(--c-orgchart-level-spacing);\n gap: var(--c-orgchart-node-spacing);\n position: relative;\n /* 垂直连线:父→子 */\n /* 横连线:兄弟节点 */\n /* 兄弟之间的水平线 */\n}\n.c-orgchart--vertical .c-orgchart__children::before {\n content: \"\";\n position: absolute;\n top: 0;\n left: 50%;\n width: var(--c-orgchart-line-width);\n height: calc(var(--c-orgchart-level-spacing) / 2);\n background: var(--c-orgchart-line-color);\n transform: translateX(-50%);\n}\n.c-orgchart--vertical .c-orgchart__children > .c-orgchart__node-wrapper {\n position: relative;\n}\n.c-orgchart--vertical .c-orgchart__children > .c-orgchart__node-wrapper::before {\n content: \"\";\n position: absolute;\n top: calc(var(--c-orgchart-level-spacing) / -2);\n left: 50%;\n width: var(--c-orgchart-line-width);\n height: calc(var(--c-orgchart-level-spacing) / 2);\n background: var(--c-orgchart-line-color);\n transform: translateX(-50%);\n}\n.c-orgchart--vertical .c-orgchart__children > .c-orgchart__node-wrapper:not(:only-child)::after {\n content: \"\";\n position: absolute;\n top: calc(var(--c-orgchart-level-spacing) / -2);\n height: var(--c-orgchart-line-width);\n background: var(--c-orgchart-line-color);\n}\n.c-orgchart--vertical .c-orgchart__children > .c-orgchart__node-wrapper:not(:only-child):first-child::after {\n left: 50%;\n right: calc(-1 * var(--c-orgchart-node-spacing) / 2);\n}\n.c-orgchart--vertical .c-orgchart__children > .c-orgchart__node-wrapper:not(:only-child):last-child::after {\n left: calc(-1 * var(--c-orgchart-node-spacing) / 2);\n right: 50%;\n}\n.c-orgchart--vertical .c-orgchart__children > .c-orgchart__node-wrapper:not(:only-child):not(:first-child):not(:last-child)::after {\n left: calc(-1 * var(--c-orgchart-node-spacing) / 2);\n right: calc(-1 * var(--c-orgchart-node-spacing) / 2);\n}\n\n/* ─── 水平布局 ─── */\n.c-orgchart--horizontal .c-orgchart__node-wrapper {\n display: flex;\n align-items: center;\n}\n.c-orgchart--horizontal .c-orgchart__children {\n display: flex;\n flex-direction: column;\n justify-content: center;\n padding-left: var(--c-orgchart-level-spacing);\n gap: var(--c-orgchart-node-spacing);\n position: relative;\n}\n.c-orgchart--horizontal .c-orgchart__children::before {\n content: \"\";\n position: absolute;\n left: 0;\n top: 50%;\n height: var(--c-orgchart-line-width);\n width: calc(var(--c-orgchart-level-spacing) / 2);\n background: var(--c-orgchart-line-color);\n transform: translateY(-50%);\n}\n.c-orgchart--horizontal .c-orgchart__children > .c-orgchart__node-wrapper {\n position: relative;\n}\n.c-orgchart--horizontal .c-orgchart__children > .c-orgchart__node-wrapper::before {\n content: \"\";\n position: absolute;\n left: calc(var(--c-orgchart-level-spacing) / -2);\n top: 50%;\n width: calc(var(--c-orgchart-level-spacing) / 2);\n height: var(--c-orgchart-line-width);\n background: var(--c-orgchart-line-color);\n transform: translateY(-50%);\n}\n.c-orgchart--horizontal .c-orgchart__children > .c-orgchart__node-wrapper:not(:only-child)::after {\n content: \"\";\n position: absolute;\n left: calc(var(--c-orgchart-level-spacing) / -2);\n width: var(--c-orgchart-line-width);\n background: var(--c-orgchart-line-color);\n}\n.c-orgchart--horizontal .c-orgchart__children > .c-orgchart__node-wrapper:not(:only-child):first-child::after {\n top: 50%;\n bottom: calc(-1 * var(--c-orgchart-node-spacing) / 2);\n}\n.c-orgchart--horizontal .c-orgchart__children > .c-orgchart__node-wrapper:not(:only-child):last-child::after {\n top: calc(-1 * var(--c-orgchart-node-spacing) / 2);\n bottom: 50%;\n}\n.c-orgchart--horizontal .c-orgchart__children > .c-orgchart__node-wrapper:not(:only-child):not(:first-child):not(:last-child)::after {\n top: calc(-1 * var(--c-orgchart-node-spacing) / 2);\n bottom: calc(-1 * var(--c-orgchart-node-spacing) / 2);\n}\n\n/* ─── 圆角连线 ─── */\n.c-orgchart--line-rounded .c-orgchart__children::before,\n.c-orgchart--line-rounded .c-orgchart__node-wrapper::before,\n.c-orgchart--line-rounded .c-orgchart__node-wrapper::after {\n border-radius: 4px;\n}\n\n/* ─── 节点卡片 ─── */\n.c-orgchart__node {\n position: relative;\n background: var(--c-orgchart-node-bg);\n border: 1px solid var(--c-orgchart-node-border);\n border-radius: 8px;\n padding: 12px 16px;\n cursor: pointer;\n box-shadow: 0 2px 8px var(--c-orgchart-node-shadow);\n transition: box-shadow 0.2s ease, transform 0.2s ease;\n white-space: nowrap;\n}\n.c-orgchart__node:hover {\n box-shadow: 0 4px 16px var(--c-orgchart-node-hover-shadow);\n transform: translateY(-2px);\n}\n.c-orgchart__node--leaf {\n opacity: 0.9;\n}\n\n/* ─── 默认节点布局 ─── */\n.c-orgchart__node-default {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n.c-orgchart__avatar {\n width: var(--c-orgchart-avatar-size);\n height: var(--c-orgchart-avatar-size);\n border-radius: 50%;\n overflow: hidden;\n flex-shrink: 0;\n}\n.c-orgchart__avatar img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n.c-orgchart__info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n.c-orgchart__label {\n font-size: 14px;\n font-weight: 600;\n color: var(--c-orgchart-label-color);\n}\n.c-orgchart__subtitle {\n font-size: 12px;\n color: var(--c-orgchart-subtitle-color);\n}\n\n/* ─── 折叠按钮 ─── */\n.c-orgchart__toggle {\n position: absolute;\n bottom: -12px;\n left: 50%;\n transform: translateX(-50%);\n width: 24px;\n height: 24px;\n border-radius: 50%;\n border: 1px solid var(--c-orgchart-node-border);\n background: var(--c-orgchart-toggle-bg);\n color: var(--c-orgchart-toggle-color);\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1;\n transition: background 0.2s ease;\n}\n.c-orgchart__toggle:hover {\n background: color-mix(in srgb, var(--c-orgchart-node-border) 20%, var(--c-orgchart-toggle-bg));\n}\n.c-orgchart--horizontal .c-orgchart__toggle {\n bottom: auto;\n left: auto;\n right: -12px;\n top: 50%;\n transform: translateY(-50%);\n}\n\n/* ─── 缩放控制 ─── */\n.c-orgchart__controls {\n position: absolute;\n bottom: 16px;\n right: 16px;\n display: flex;\n align-items: center;\n gap: 4px;\n background: var(--c-orgchart-controls-bg);\n border-radius: 8px;\n padding: 4px;\n box-shadow: 0 2px 8px var(--c-orgchart-controls-shadow);\n z-index: 10;\n}\n.c-orgchart__control-btn {\n width: 32px;\n height: 32px;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: var(--c-orgchart-label-color);\n font-size: 16px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.2s ease;\n}\n.c-orgchart__control-btn:hover {\n background: color-mix(in srgb, var(--c-orgchart-node-border) 30%, transparent);\n}\n.c-orgchart__zoom-level {\n font-size: 12px;\n color: var(--c-orgchart-subtitle-color);\n min-width: 40px;\n text-align: center;\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;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./C_OrgChart.js`);exports.C_OrgChart=e.t;