@robot-admin/naive-ui-components 0.3.1 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/C_ActionBar-nnfbZCea.css.map +1 -0
- package/dist/C_ActionBar2.js +2 -2
- package/dist/C_ActionBar2.js.map +1 -1
- package/dist/C_AntV-DGjscTWa.css.map +1 -0
- package/dist/C_AntV2.js +6 -6
- package/dist/C_AntV2.js.map +1 -1
- package/dist/C_Barcode-DjTmDkbQ.css.map +1 -0
- package/dist/C_Barcode2.js +1 -1
- package/dist/C_Barcode2.js.map +1 -1
- package/dist/C_Captcha-Ccq3DMrR.css.map +1 -0
- package/dist/C_Captcha2.js +1 -1
- package/dist/C_Captcha2.js.map +1 -1
- package/dist/C_Cascade-IUUHIh7r.css.map +1 -0
- package/dist/C_Cascade2.js +2 -2
- package/dist/C_Cascade2.js.map +1 -1
- package/dist/C_City-Cv5BESaN.css.map +1 -0
- package/dist/C_City2.js +2 -2
- package/dist/C_City2.js.map +1 -1
- package/dist/C_Code-DPZlNSxL.css.map +1 -0
- package/dist/C_Code2.js +8 -7
- package/dist/C_Code2.js.map +1 -1
- package/dist/C_CollapsePanel-Fap-lv_5.css.map +1 -0
- package/dist/C_CollapsePanel2.js +1 -1
- package/dist/C_CollapsePanel2.js.map +1 -1
- package/dist/C_Cron-C0-8b5af.css.map +1 -0
- package/dist/C_Cron2.js +15 -14
- package/dist/C_Cron2.js.map +1 -1
- package/dist/C_Date2.js +1 -1
- package/dist/C_Date2.js.map +1 -1
- package/dist/C_Draggable-Bq6o0qXn.css.map +1 -0
- package/dist/C_Draggable2.js +1 -1
- package/dist/C_Draggable2.js.map +1 -1
- package/dist/C_Editor-OlxIF9-5.css.map +1 -0
- package/dist/C_Editor2.js +1 -1
- package/dist/C_Editor2.js.map +1 -1
- package/dist/C_FilePreview-B4XgTv-h.css.map +1 -0
- package/dist/C_FilePreview.cjs +1 -0
- package/dist/C_FilePreview.js +1 -0
- package/dist/C_FilePreview2.js +10 -9
- package/dist/C_FilePreview2.js.map +1 -1
- package/dist/C_Form-Cr9oX037.css.map +1 -0
- package/dist/C_Form.cjs +1 -0
- package/dist/C_Form.js +1 -0
- package/dist/C_Form2.js +69 -72
- package/dist/C_Form2.js.map +1 -1
- package/dist/C_FormSearch-DlIEoh7X.css.map +1 -0
- package/dist/C_FormSearch2.js +2 -2
- package/dist/C_FormSearch2.js.map +1 -1
- package/dist/C_FormulaEditor-Cm0CokN5.css.map +1 -0
- package/dist/C_FormulaEditor2.js +6 -6
- package/dist/C_FormulaEditor2.js.map +1 -1
- package/dist/C_FullCalendar-BULCIlVK.css.map +1 -0
- package/dist/C_FullCalendar2.js +2 -2
- package/dist/C_FullCalendar2.js.map +1 -1
- package/dist/C_Guide2.js +1 -1
- package/dist/C_Guide2.js.map +1 -1
- package/dist/C_Icon2.js.map +1 -1
- package/dist/C_ImageCropper-DrmUlaLi.css.map +1 -0
- package/dist/C_ImageCropper2.js +4 -4
- package/dist/C_ImageCropper2.js.map +1 -1
- package/dist/C_Language2.js +1 -1
- package/dist/C_Language2.js.map +1 -1
- package/dist/C_Map-WUMXSAfy.css.map +1 -0
- package/dist/C_Map2.js +2 -2
- package/dist/C_Map2.js.map +1 -1
- package/dist/C_Markdown-Dmv8yaM4.css.map +1 -0
- package/dist/C_Markdown2.js +4 -4
- package/dist/C_Markdown2.js.map +1 -1
- package/dist/C_NotificationCenter-DbgBiyqB.css.map +1 -0
- package/dist/C_NotificationCenter2.js +21 -20
- package/dist/C_NotificationCenter2.js.map +1 -1
- package/dist/C_Progress2.js +1 -1
- package/dist/C_Progress2.js.map +1 -1
- package/dist/C_QRCode-G7fiAkm4.css.map +1 -0
- package/dist/C_QRCode2.js +1 -1
- package/dist/C_QRCode2.js.map +1 -1
- package/dist/C_Signature-es-ZNPzr.css.map +1 -0
- package/dist/C_Signature2.js +2 -2
- package/dist/C_Signature2.js.map +1 -1
- package/dist/C_SplitPane-Br2eK8IG.css.map +1 -0
- package/dist/C_SplitPane2.js +1 -1
- package/dist/C_SplitPane2.js.map +1 -1
- package/dist/C_Steps-P9Qj9iDd.css.map +1 -0
- package/dist/C_Steps2.js +1 -1
- package/dist/C_Steps2.js.map +1 -1
- package/dist/C_Table-DAwAxr72.css.map +1 -0
- package/dist/C_Table.cjs +1 -0
- package/dist/C_Table.js +1 -0
- package/dist/C_Table2.js +3 -3
- package/dist/C_Table2.js.map +1 -1
- package/dist/C_Theme2.js +1 -1
- package/dist/C_Theme2.js.map +1 -1
- package/dist/C_Time-Bd_e1YDN.css.map +1 -0
- package/dist/C_Time2.js +2 -2
- package/dist/C_Time2.js.map +1 -1
- package/dist/C_Tree-DnGc_MPb.css.map +1 -0
- package/dist/C_Tree2.js +2 -2
- package/dist/C_Tree2.js.map +1 -1
- package/dist/C_Upload-i8LB_29U.css.map +1 -0
- package/dist/C_Upload2.js +5 -5
- package/dist/C_Upload2.js.map +1 -1
- package/dist/C_VideoPlayer-rm0MODUv.css.map +1 -0
- package/dist/C_VideoPlayer2.js +21 -20
- package/dist/C_VideoPlayer2.js.map +1 -1
- package/dist/C_VtableGantt-BpY-Rng3.css.map +1 -0
- package/dist/C_VtableGantt2.js +2 -2
- package/dist/C_VtableGantt2.js.map +1 -1
- package/dist/C_WaterFall-HWB-gPON.css.map +1 -0
- package/dist/C_WaterFall2.js +2 -2
- package/dist/C_WaterFall2.js.map +1 -1
- package/dist/C_WorkFlow-CSO86Cuc.css.map +1 -0
- package/dist/C_WorkFlow2.js +6 -6
- package/dist/C_WorkFlow2.js.map +1 -1
- package/dist/constants.d.ts +4 -4
- package/dist/constants2.d.ts +4 -4
- package/dist/constants3.d.ts +4 -4
- package/dist/constants4.d.ts +5 -5
- package/dist/constants5.d.ts +2 -2
- package/dist/data.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.vue.d.ts +1 -1
- package/dist/index10.vue.d.ts +7 -7
- package/dist/index11.vue.d.ts +2 -2
- package/dist/index12.vue.d.ts +5 -5
- package/dist/index12.vue.d.ts.map +1 -1
- package/dist/index13.vue.d.ts +1 -1
- package/dist/index14.vue.d.ts +1 -1
- package/dist/index16.vue.d.ts +1 -1
- package/dist/index2.vue.d.ts +6 -6
- package/dist/index3.vue.d.ts +2 -2
- package/dist/index4.vue.d.ts +2 -2
- package/dist/index5.vue.d.ts +2 -2
- package/dist/index6.vue.d.ts +1 -1
- package/dist/index8.vue.d.ts +3 -3
- package/dist/resolver.js.map +1 -1
- package/dist/style.css +1555 -1555
- package/dist/useCalendarEvents.d.ts +2 -2
- package/dist/useCollapsePanel.d.ts +2 -2
- package/dist/useCropperCore.d.ts +3 -3
- package/dist/useDraggableLayout.d.ts +8 -8
- package/dist/useDynamicFormState.d.ts +111 -111
- package/dist/useDynamicFormState.d.ts.map +1 -1
- package/dist/useEdgeInteraction.d.ts +2 -2
- package/dist/useInfiniteScroll.d.ts +1 -1
- package/dist/useModalEdit.d.ts +4 -4
- package/dist/useModalEdit.d.ts.map +1 -1
- package/dist/useQRCode.d.ts +4 -4
- package/dist/useQRCode.d.ts.map +1 -1
- package/dist/useSearchState.d.ts +2 -2
- package/dist/useSignatureHistory.d.ts +4 -4
- package/dist/useSplitResize.d.ts +6 -6
- package/dist/useSplitResize.d.ts.map +1 -1
- package/dist/useTimeSelection.d.ts +2 -2
- package/dist/useTreeOperations.d.ts +6 -6
- package/dist/useWorkflowValidation.d.ts +5 -5
- package/package.json +2 -1
- package/dist/C_ActionBar-DWN-woTc.css.map +0 -1
- package/dist/C_AntV-AFKyK6hH.css.map +0 -1
- package/dist/C_Barcode-P_EFj8dC.css.map +0 -1
- package/dist/C_Captcha-C-ef41xw.css.map +0 -1
- package/dist/C_Cascade-D9kNsjsV.css.map +0 -1
- package/dist/C_City-BCQ4ipiK.css.map +0 -1
- package/dist/C_Code-C9kvvEmO.css.map +0 -1
- package/dist/C_CollapsePanel-BUJHuYcU.css.map +0 -1
- package/dist/C_Cron-yx2Ob4Jl.css.map +0 -1
- package/dist/C_Draggable-C483syRC.css.map +0 -1
- package/dist/C_Editor-Bp0SyIEw.css.map +0 -1
- package/dist/C_FilePreview-CPqvhoCy.css.map +0 -1
- package/dist/C_Form-Jx7PY3sT.css.map +0 -1
- package/dist/C_FormSearch-DvRgxlRn.css.map +0 -1
- package/dist/C_FormulaEditor-DtGkt4T_.css.map +0 -1
- package/dist/C_FullCalendar-BF7H0YIx.css.map +0 -1
- package/dist/C_ImageCropper-BVJfUufl.css.map +0 -1
- package/dist/C_Map-DpzeuWdX.css.map +0 -1
- package/dist/C_Markdown-BEjxknqd.css.map +0 -1
- package/dist/C_NotificationCenter-0l3TY2Gn.css.map +0 -1
- package/dist/C_QRCode-DbdiAIPg.css.map +0 -1
- package/dist/C_Signature-zhHCbra9.css.map +0 -1
- package/dist/C_SplitPane-C6sBsfKY.css.map +0 -1
- package/dist/C_Steps-CODHN5Hs.css.map +0 -1
- package/dist/C_Table-DSNsntmT.css.map +0 -1
- package/dist/C_Time-BvZLYraL.css.map +0 -1
- package/dist/C_Tree-0GDv--jX.css.map +0 -1
- package/dist/C_Upload-BXd3YYLx.css.map +0 -1
- package/dist/C_VideoPlayer-DYG3RL0Q.css.map +0 -1
- package/dist/C_VtableGantt-fhItIiHE.css.map +0 -1
- package/dist/C_WaterFall-8sQDFXKg.css.map +0 -1
- package/dist/C_WorkFlow-J-dyIuh9.css.map +0 -1
package/dist/C_Theme2.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { computed, createBlock, createElementVNode, createVNode, defineComponent, normalizeClass, openBlock, toDisplayString, unref, withCtx } from "vue";
|
|
2
1
|
import { NButton, NTooltip } from "naive-ui";
|
|
2
|
+
import { computed, createBlock, createElementVNode, createVNode, defineComponent, normalizeClass, openBlock, toDisplayString, unref, withCtx } from "vue";
|
|
3
3
|
|
|
4
4
|
//#region src/components/C_Theme/index.vue?vue&type=script&setup=true&lang.ts
|
|
5
5
|
var index_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
|
package/dist/C_Theme2.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"C_Theme2.js","names":[],"sources":["../src/components/C_Theme/index.vue","../src/components/C_Theme/index.vue","../src/components/C_Theme/index.vue"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"C_Theme2.js","names":[],"sources":["../src/components/C_Theme/index.vue","../src/components/C_Theme/index.vue","../src/components/C_Theme/index.vue"],"sourcesContent":["/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-05-13\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 <NTooltip placement=\"bottom\" trigger=\"hover\">\r\n <template #trigger>\r\n <NButton text @click=\"cycleThemeMode\">\r\n <span :class=\"currentIcon\"></span>\r\n </NButton>\r\n </template>\r\n <span>{{ themeTooltip }}</span>\r\n </NTooltip>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed } from \"vue\";\r\nimport { NTooltip, NButton } from \"naive-ui\";\r\n\r\ndefineOptions({ name: \"C_Theme\" });\r\n\r\nexport type ThemeMode = \"system\" | \"light\" | \"dark\";\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: ThemeMode;\r\n }>(),\r\n { modelValue: \"system\" },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n \"update:modelValue\": [mode: ThemeMode];\r\n}>();\r\n\r\nconst currentIcon = computed(() => {\r\n switch (props.modelValue) {\r\n case \"light\":\r\n return \"i-mdi:white-balance-sunny\";\r\n case \"dark\":\r\n return \"i-mdi:moon-and-stars\";\r\n default:\r\n return \"i-mdi:sun-moon-stars\";\r\n }\r\n});\r\n\r\nconst themeTooltip = computed(() => {\r\n switch (props.modelValue) {\r\n case \"light\":\r\n return \"当前: 浅色模式 (点击切换)\";\r\n case \"dark\":\r\n return \"当前: 深色模式 (点击切换)\";\r\n default:\r\n return \"当前: 跟随系统 (点击切换)\";\r\n }\r\n});\r\n\r\nconst cycleThemeMode = () => {\r\n const modes: ThemeMode[] = [\"system\", \"light\", \"dark\"];\r\n const currentIndex = modes.indexOf(props.modelValue);\r\n const nextIndex = (currentIndex + 1) % modes.length;\r\n emit(\"update:modelValue\", modes[nextIndex]);\r\n};\r\n</script>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-05-13\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 <NTooltip placement=\"bottom\" trigger=\"hover\">\r\n <template #trigger>\r\n <NButton text @click=\"cycleThemeMode\">\r\n <span :class=\"currentIcon\"></span>\r\n </NButton>\r\n </template>\r\n <span>{{ themeTooltip }}</span>\r\n </NTooltip>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed } from \"vue\";\r\nimport { NTooltip, NButton } from \"naive-ui\";\r\n\r\ndefineOptions({ name: \"C_Theme\" });\r\n\r\nexport type ThemeMode = \"system\" | \"light\" | \"dark\";\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: ThemeMode;\r\n }>(),\r\n { modelValue: \"system\" },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n \"update:modelValue\": [mode: ThemeMode];\r\n}>();\r\n\r\nconst currentIcon = computed(() => {\r\n switch (props.modelValue) {\r\n case \"light\":\r\n return \"i-mdi:white-balance-sunny\";\r\n case \"dark\":\r\n return \"i-mdi:moon-and-stars\";\r\n default:\r\n return \"i-mdi:sun-moon-stars\";\r\n }\r\n});\r\n\r\nconst themeTooltip = computed(() => {\r\n switch (props.modelValue) {\r\n case \"light\":\r\n return \"当前: 浅色模式 (点击切换)\";\r\n case \"dark\":\r\n return \"当前: 深色模式 (点击切换)\";\r\n default:\r\n return \"当前: 跟随系统 (点击切换)\";\r\n }\r\n});\r\n\r\nconst cycleThemeMode = () => {\r\n const modes: ThemeMode[] = [\"system\", \"light\", \"dark\"];\r\n const currentIndex = modes.indexOf(props.modelValue);\r\n const nextIndex = (currentIndex + 1) % modes.length;\r\n emit(\"update:modelValue\", modes[nextIndex]);\r\n};\r\n</script>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-05-13\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 <NTooltip placement=\"bottom\" trigger=\"hover\">\r\n <template #trigger>\r\n <NButton text @click=\"cycleThemeMode\">\r\n <span :class=\"currentIcon\"></span>\r\n </NButton>\r\n </template>\r\n <span>{{ themeTooltip }}</span>\r\n </NTooltip>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed } from \"vue\";\r\nimport { NTooltip, NButton } from \"naive-ui\";\r\n\r\ndefineOptions({ name: \"C_Theme\" });\r\n\r\nexport type ThemeMode = \"system\" | \"light\" | \"dark\";\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: ThemeMode;\r\n }>(),\r\n { modelValue: \"system\" },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n \"update:modelValue\": [mode: ThemeMode];\r\n}>();\r\n\r\nconst currentIcon = computed(() => {\r\n switch (props.modelValue) {\r\n case \"light\":\r\n return \"i-mdi:white-balance-sunny\";\r\n case \"dark\":\r\n return \"i-mdi:moon-and-stars\";\r\n default:\r\n return \"i-mdi:sun-moon-stars\";\r\n }\r\n});\r\n\r\nconst themeTooltip = computed(() => {\r\n switch (props.modelValue) {\r\n case \"light\":\r\n return \"当前: 浅色模式 (点击切换)\";\r\n case \"dark\":\r\n return \"当前: 深色模式 (点击切换)\";\r\n default:\r\n return \"当前: 跟随系统 (点击切换)\";\r\n }\r\n});\r\n\r\nconst cycleThemeMode = () => {\r\n const modes: ThemeMode[] = [\"system\", \"light\", \"dark\"];\r\n const currentIndex = modes.indexOf(props.modelValue);\r\n const nextIndex = (currentIndex + 1) % modes.length;\r\n emit(\"update:modelValue\", modes[nextIndex]);\r\n};\r\n</script>\r\n"],"mappings":";;;;;;;;;;EC0BA,MAAM,QAAQ;EAOd,MAAM,OAAO;EAIb,MAAM,cAAc,eAAe;AACjC,WAAQ,MAAM,YAAd;IACE,KAAK,QACH,QAAO;IACT,KAAK,OACH,QAAO;IACT,QACE,QAAO;;IAEX;EAEF,MAAM,eAAe,eAAe;AAClC,WAAQ,MAAM,YAAd;IACE,KAAK,QACH,QAAO;IACT,KAAK,OACH,QAAO;IACT,QACE,QAAO;;IAEX;EAEF,MAAM,uBAAuB;GAC3B,MAAM,QAAqB;IAAC;IAAU;IAAS;IAAO;AAGtD,QAAK,qBAAqB,OAFL,MAAM,QAAQ,MAAM,WAAW,GAClB,KAAK,MAAM,QACF;;;uBAvD3C,YAOW,MAAA,SAAA,EAAA;IAPD,WAAU;IAAS,SAAQ;;IACxB,SAAO,cAGN,CAFV,YAEU,MAAA,QAAA,EAAA;KAFD,MAAA;KAAM,SAAO;;4BACc,CAAlC,mBAAkC,QAAA,EAA3B,OAAK,eAAE,YAAA,MAAW;;;2BAGE,CAA/B,mBAA+B,QAAA,MAAA,gBAAtB,aAAA,MAAY,EAAA,EAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"C_Time-Bd_e1YDN.css","names":[],"sources":["../src/components/C_Time/index.vue?vue&type=style&index=0&scoped=beaeb169&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled *//* 时间选择器组件样式 */\n.c-time-wrapper[data-v-beaeb169] {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n.time-range-container[data-v-beaeb169] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.time-single-container[data-v-beaeb169] {\n display: flex;\n align-items: center;\n}\n.range-separator[data-v-beaeb169] {\n color: var(--c-text-3, #666);\n font-size: 14px;\n white-space: nowrap;\n user-select: none;\n}"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
|
package/dist/C_Time2.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { t as export_helper_default } from "./export-helper.js";
|
|
2
|
-
import { Fragment, computed, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, isRef, mergeProps, openBlock, ref, unref, watch } from "vue";
|
|
3
2
|
import { NTimePicker } from "naive-ui";
|
|
3
|
+
import { Fragment, computed, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, isRef, mergeProps, openBlock, ref, unref, watch } from "vue";
|
|
4
4
|
|
|
5
5
|
//#region src/components/C_Time/composables/useTimeSelection.ts
|
|
6
6
|
/** 时间选择器逻辑 — 管理时间段/单选模式、智能限制 */
|
|
@@ -192,7 +192,7 @@ var index_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineCo
|
|
|
192
192
|
|
|
193
193
|
//#endregion
|
|
194
194
|
//#region src/components/C_Time/index.vue
|
|
195
|
-
var C_Time_default = /* @__PURE__ */ export_helper_default(index_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-
|
|
195
|
+
var C_Time_default = /* @__PURE__ */ export_helper_default(index_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-beaeb169"]]);
|
|
196
196
|
|
|
197
197
|
//#endregion
|
|
198
198
|
export { useTimeSelection as n, C_Time_default as t };
|
package/dist/C_Time2.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"C_Time2.js","names":["mode","startPlaceholder","endPlaceholder","placeholder"],"sources":["../src/components/C_Time/composables/useTimeSelection.ts","../src/components/C_Time/index.vue","../src/components/C_Time/index.vue","../src/components/C_Time/index.vue"],"sourcesContent":["import { ref, computed, watch } from 'vue'\r\nimport type { TimeProps } from '../types'\r\n\r\ntype EmitFn = {\r\n (\r\n event: 'change-range',\r\n startTime: number | null,\r\n endTime: number | null\r\n ): void\r\n (event: 'change-single', time: number | null): void\r\n (event: 'change-start', time: number | null): void\r\n (event: 'change-end', time: number | null): void\r\n}\r\n\r\n/** 时间选择器逻辑 — 管理时间段/单选模式、智能限制 */\r\nexport function useTimeSelection(props: TimeProps, emit: EmitFn) {\r\n /* ==================== 响应式状态 ==================== */\r\n const startTime = ref<number | null>(props.defaultStartTime ?? null)\r\n const endTime = ref<number | null>(props.defaultEndTime ?? null)\r\n const singleTime = ref<number | null>(props.defaultSingleTime ?? null)\r\n\r\n /* ==================== 计算属性 ==================== */\r\n const timeFormat = computed(() => {\r\n if (props.useSeconds) {\r\n return props.format?.includes('ss') ? props.format : 'HH:mm:ss'\r\n }\r\n return props.format ?? 'HH:mm'\r\n })\r\n\r\n const endTimeDisabled = computed(\r\n () => props.mode === 'range' && !startTime.value\r\n )\r\n\r\n const mergedStartAttrs = computed(() => ({\r\n ...props.attrs,\r\n ...props.startTimeProps,\r\n }))\r\n\r\n const mergedEndAttrs = computed(() => ({\r\n ...props.attrs,\r\n ...props.endTimeProps,\r\n }))\r\n\r\n const mergedAttrs = computed(() => ({ ...props.attrs }))\r\n\r\n /* ==================== 时间限制函数 ==================== */\r\n const isEndHourDisabled = (hour: number): boolean => {\r\n if (!startTime.value) return false\r\n return hour < new Date(startTime.value).getHours()\r\n }\r\n\r\n const isEndMinuteDisabled = (\r\n minute: number,\r\n selectedHour: number | null\r\n ): boolean => {\r\n if (!startTime.value || selectedHour === null) return false\r\n const startDate = new Date(startTime.value)\r\n return (\r\n selectedHour === startDate.getHours() && minute < startDate.getMinutes()\r\n )\r\n }\r\n\r\n const isEndSecondDisabled = (\r\n second: number,\r\n selectedMinute: number | null,\r\n selectedHour: number | null\r\n ): boolean => {\r\n if (\r\n !startTime.value ||\r\n !props.useSeconds ||\r\n selectedHour === null ||\r\n selectedMinute === null\r\n )\r\n return false\r\n const startDate = new Date(startTime.value)\r\n return (\r\n selectedHour === startDate.getHours() &&\r\n selectedMinute === startDate.getMinutes() &&\r\n second <= startDate.getSeconds()\r\n )\r\n }\r\n\r\n /* ==================== 事件处理 ==================== */\r\n const handleStartTimeChange = (value: number | null) => {\r\n startTime.value = value\r\n if (!value) {\r\n endTime.value = null\r\n } else if (\r\n props.enableTimeRestriction &&\r\n endTime.value &&\r\n endTime.value <= value\r\n ) {\r\n endTime.value = null\r\n }\r\n emit('change-start', value)\r\n if (props.mode === 'range') emit('change-range', value, endTime.value)\r\n }\r\n\r\n const handleEndTimeChange = (value: number | null) => {\r\n endTime.value = value\r\n emit('change-end', value)\r\n if (props.mode === 'range') emit('change-range', startTime.value, value)\r\n }\r\n\r\n const handleSingleTimeChange = (value: number | null) => {\r\n singleTime.value = value\r\n emit('change-single', value)\r\n }\r\n\r\n /* ==================== 模式切换监听 ==================== */\r\n watch(\r\n () => props.mode,\r\n () => {\r\n startTime.value = props.defaultStartTime ?? null\r\n endTime.value = props.defaultEndTime ?? null\r\n singleTime.value = props.defaultSingleTime ?? null\r\n }\r\n )\r\n\r\n /* ==================== 暴露方法 ==================== */\r\n const reset = () => {\r\n startTime.value = null\r\n endTime.value = null\r\n singleTime.value = null\r\n }\r\n\r\n return {\r\n startTime,\r\n endTime,\r\n singleTime,\r\n timeFormat,\r\n endTimeDisabled,\r\n mergedStartAttrs,\r\n mergedEndAttrs,\r\n mergedAttrs,\r\n isEndHourDisabled,\r\n isEndMinuteDisabled,\r\n isEndSecondDisabled,\r\n handleStartTimeChange,\r\n handleEndTimeChange,\r\n handleSingleTimeChange,\r\n reset,\r\n }\r\n}\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-05-29\r\n * @Description: 时间选择器 — 薄 UI 壳,逻辑由 useTimeSelection 驱动\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-time-wrapper\">\r\n <!-- 时间段选择模式 -->\r\n <div v-if=\"mode === 'range'\" class=\"time-range-container\">\r\n <NTimePicker\r\n v-model:value=\"startTime\"\r\n :placeholder=\"startPlaceholder\"\r\n :format=\"timeFormat\"\r\n :actions=\"['now', 'confirm']\"\r\n v-bind=\"mergedStartAttrs\"\r\n @update:value=\"handleStartTimeChange\"\r\n />\r\n <span class=\"range-separator\">至</span>\r\n <NTimePicker\r\n v-model:value=\"endTime\"\r\n :placeholder=\"endPlaceholder\"\r\n :format=\"timeFormat\"\r\n :actions=\"['now', 'confirm']\"\r\n :is-hour-disabled=\"\r\n props.enableTimeRestriction ? isEndHourDisabled : undefined\r\n \"\r\n :is-minute-disabled=\"\r\n props.enableTimeRestriction ? isEndMinuteDisabled : undefined\r\n \"\r\n :is-second-disabled=\"\r\n props.enableTimeRestriction ? isEndSecondDisabled : undefined\r\n \"\r\n :disabled=\"endTimeDisabled\"\r\n v-bind=\"mergedEndAttrs\"\r\n @update:value=\"handleEndTimeChange\"\r\n />\r\n </div>\r\n\r\n <!-- 单个时间选择模式 -->\r\n <div v-else class=\"time-single-container\">\r\n <NTimePicker\r\n v-model:value=\"singleTime\"\r\n :placeholder=\"placeholder\"\r\n :format=\"timeFormat\"\r\n :actions=\"['now', 'confirm']\"\r\n v-bind=\"mergedAttrs\"\r\n @update:value=\"handleSingleTimeChange\"\r\n />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { NTimePicker } from \"naive-ui\";\r\nimport { useTimeSelection } from \"./composables/useTimeSelection\";\r\nimport type { TimeProps, TimeEmits, TimeExpose } from \"./types\";\r\n\r\ndefineOptions({ name: \"C_Time\" });\r\n\r\nconst props = withDefaults(defineProps<TimeProps>(), {\r\n mode: \"range\",\r\n startPlaceholder: \"请选择开始时间\",\r\n endPlaceholder: \"请选择结束时间\",\r\n placeholder: \"请选择时间\",\r\n format: \"HH:mm\",\r\n useHours: true,\r\n useMinutes: true,\r\n useSeconds: false,\r\n hourStep: 1,\r\n minuteStep: 30,\r\n secondStep: 1,\r\n startTimeProps: () => ({}),\r\n endTimeProps: () => ({}),\r\n attrs: () => ({}),\r\n defaultStartTime: null,\r\n defaultEndTime: null,\r\n defaultSingleTime: null,\r\n enableTimeRestriction: false,\r\n});\r\n\r\nconst emit = defineEmits<TimeEmits>();\r\n\r\nconst {\r\n startTime,\r\n endTime,\r\n singleTime,\r\n timeFormat,\r\n endTimeDisabled,\r\n mergedStartAttrs,\r\n mergedEndAttrs,\r\n mergedAttrs,\r\n isEndHourDisabled,\r\n isEndMinuteDisabled,\r\n isEndSecondDisabled,\r\n handleStartTimeChange,\r\n handleEndTimeChange,\r\n handleSingleTimeChange,\r\n reset,\r\n} = useTimeSelection(props, emit);\r\n\r\ndefineExpose<TimeExpose>({\r\n reset,\r\n startTime,\r\n endTime,\r\n singleTime,\r\n});\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n@use \"./index.scss\";\r\n</style>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-05-29\r\n * @Description: 时间选择器 — 薄 UI 壳,逻辑由 useTimeSelection 驱动\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-time-wrapper\">\r\n <!-- 时间段选择模式 -->\r\n <div v-if=\"mode === 'range'\" class=\"time-range-container\">\r\n <NTimePicker\r\n v-model:value=\"startTime\"\r\n :placeholder=\"startPlaceholder\"\r\n :format=\"timeFormat\"\r\n :actions=\"['now', 'confirm']\"\r\n v-bind=\"mergedStartAttrs\"\r\n @update:value=\"handleStartTimeChange\"\r\n />\r\n <span class=\"range-separator\">至</span>\r\n <NTimePicker\r\n v-model:value=\"endTime\"\r\n :placeholder=\"endPlaceholder\"\r\n :format=\"timeFormat\"\r\n :actions=\"['now', 'confirm']\"\r\n :is-hour-disabled=\"\r\n props.enableTimeRestriction ? isEndHourDisabled : undefined\r\n \"\r\n :is-minute-disabled=\"\r\n props.enableTimeRestriction ? isEndMinuteDisabled : undefined\r\n \"\r\n :is-second-disabled=\"\r\n props.enableTimeRestriction ? isEndSecondDisabled : undefined\r\n \"\r\n :disabled=\"endTimeDisabled\"\r\n v-bind=\"mergedEndAttrs\"\r\n @update:value=\"handleEndTimeChange\"\r\n />\r\n </div>\r\n\r\n <!-- 单个时间选择模式 -->\r\n <div v-else class=\"time-single-container\">\r\n <NTimePicker\r\n v-model:value=\"singleTime\"\r\n :placeholder=\"placeholder\"\r\n :format=\"timeFormat\"\r\n :actions=\"['now', 'confirm']\"\r\n v-bind=\"mergedAttrs\"\r\n @update:value=\"handleSingleTimeChange\"\r\n />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { NTimePicker } from \"naive-ui\";\r\nimport { useTimeSelection } from \"./composables/useTimeSelection\";\r\nimport type { TimeProps, TimeEmits, TimeExpose } from \"./types\";\r\n\r\ndefineOptions({ name: \"C_Time\" });\r\n\r\nconst props = withDefaults(defineProps<TimeProps>(), {\r\n mode: \"range\",\r\n startPlaceholder: \"请选择开始时间\",\r\n endPlaceholder: \"请选择结束时间\",\r\n placeholder: \"请选择时间\",\r\n format: \"HH:mm\",\r\n useHours: true,\r\n useMinutes: true,\r\n useSeconds: false,\r\n hourStep: 1,\r\n minuteStep: 30,\r\n secondStep: 1,\r\n startTimeProps: () => ({}),\r\n endTimeProps: () => ({}),\r\n attrs: () => ({}),\r\n defaultStartTime: null,\r\n defaultEndTime: null,\r\n defaultSingleTime: null,\r\n enableTimeRestriction: false,\r\n});\r\n\r\nconst emit = defineEmits<TimeEmits>();\r\n\r\nconst {\r\n startTime,\r\n endTime,\r\n singleTime,\r\n timeFormat,\r\n endTimeDisabled,\r\n mergedStartAttrs,\r\n mergedEndAttrs,\r\n mergedAttrs,\r\n isEndHourDisabled,\r\n isEndMinuteDisabled,\r\n isEndSecondDisabled,\r\n handleStartTimeChange,\r\n handleEndTimeChange,\r\n handleSingleTimeChange,\r\n reset,\r\n} = useTimeSelection(props, emit);\r\n\r\ndefineExpose<TimeExpose>({\r\n reset,\r\n startTime,\r\n endTime,\r\n singleTime,\r\n});\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n@use \"./index.scss\";\r\n</style>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-05-29\r\n * @Description: 时间选择器 — 薄 UI 壳,逻辑由 useTimeSelection 驱动\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-time-wrapper\">\r\n <!-- 时间段选择模式 -->\r\n <div v-if=\"mode === 'range'\" class=\"time-range-container\">\r\n <NTimePicker\r\n v-model:value=\"startTime\"\r\n :placeholder=\"startPlaceholder\"\r\n :format=\"timeFormat\"\r\n :actions=\"['now', 'confirm']\"\r\n v-bind=\"mergedStartAttrs\"\r\n @update:value=\"handleStartTimeChange\"\r\n />\r\n <span class=\"range-separator\">至</span>\r\n <NTimePicker\r\n v-model:value=\"endTime\"\r\n :placeholder=\"endPlaceholder\"\r\n :format=\"timeFormat\"\r\n :actions=\"['now', 'confirm']\"\r\n :is-hour-disabled=\"\r\n props.enableTimeRestriction ? isEndHourDisabled : undefined\r\n \"\r\n :is-minute-disabled=\"\r\n props.enableTimeRestriction ? isEndMinuteDisabled : undefined\r\n \"\r\n :is-second-disabled=\"\r\n props.enableTimeRestriction ? isEndSecondDisabled : undefined\r\n \"\r\n :disabled=\"endTimeDisabled\"\r\n v-bind=\"mergedEndAttrs\"\r\n @update:value=\"handleEndTimeChange\"\r\n />\r\n </div>\r\n\r\n <!-- 单个时间选择模式 -->\r\n <div v-else class=\"time-single-container\">\r\n <NTimePicker\r\n v-model:value=\"singleTime\"\r\n :placeholder=\"placeholder\"\r\n :format=\"timeFormat\"\r\n :actions=\"['now', 'confirm']\"\r\n v-bind=\"mergedAttrs\"\r\n @update:value=\"handleSingleTimeChange\"\r\n />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { NTimePicker } from \"naive-ui\";\r\nimport { useTimeSelection } from \"./composables/useTimeSelection\";\r\nimport type { TimeProps, TimeEmits, TimeExpose } from \"./types\";\r\n\r\ndefineOptions({ name: \"C_Time\" });\r\n\r\nconst props = withDefaults(defineProps<TimeProps>(), {\r\n mode: \"range\",\r\n startPlaceholder: \"请选择开始时间\",\r\n endPlaceholder: \"请选择结束时间\",\r\n placeholder: \"请选择时间\",\r\n format: \"HH:mm\",\r\n useHours: true,\r\n useMinutes: true,\r\n useSeconds: false,\r\n hourStep: 1,\r\n minuteStep: 30,\r\n secondStep: 1,\r\n startTimeProps: () => ({}),\r\n endTimeProps: () => ({}),\r\n attrs: () => ({}),\r\n defaultStartTime: null,\r\n defaultEndTime: null,\r\n defaultSingleTime: null,\r\n enableTimeRestriction: false,\r\n});\r\n\r\nconst emit = defineEmits<TimeEmits>();\r\n\r\nconst {\r\n startTime,\r\n endTime,\r\n singleTime,\r\n timeFormat,\r\n endTimeDisabled,\r\n mergedStartAttrs,\r\n mergedEndAttrs,\r\n mergedAttrs,\r\n isEndHourDisabled,\r\n isEndMinuteDisabled,\r\n isEndSecondDisabled,\r\n handleStartTimeChange,\r\n handleEndTimeChange,\r\n handleSingleTimeChange,\r\n reset,\r\n} = useTimeSelection(props, emit);\r\n\r\ndefineExpose<TimeExpose>({\r\n reset,\r\n startTime,\r\n endTime,\r\n singleTime,\r\n});\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n@use \"./index.scss\";\r\n</style>\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"C_Time2.js","names":["mode","startPlaceholder","endPlaceholder","placeholder"],"sources":["../src/components/C_Time/composables/useTimeSelection.ts","../src/components/C_Time/index.vue","../src/components/C_Time/index.vue","../src/components/C_Time/index.vue"],"sourcesContent":["import { ref, computed, watch } from 'vue'\r\nimport type { TimeProps } from '../types'\r\n\r\ntype EmitFn = {\r\n (\r\n event: 'change-range',\r\n startTime: number | null,\r\n endTime: number | null\r\n ): void\r\n (event: 'change-single', time: number | null): void\r\n (event: 'change-start', time: number | null): void\r\n (event: 'change-end', time: number | null): void\r\n}\r\n\r\n/** 时间选择器逻辑 — 管理时间段/单选模式、智能限制 */\r\nexport function useTimeSelection(props: TimeProps, emit: EmitFn) {\r\n /* ==================== 响应式状态 ==================== */\r\n const startTime = ref<number | null>(props.defaultStartTime ?? null)\r\n const endTime = ref<number | null>(props.defaultEndTime ?? null)\r\n const singleTime = ref<number | null>(props.defaultSingleTime ?? null)\r\n\r\n /* ==================== 计算属性 ==================== */\r\n const timeFormat = computed(() => {\r\n if (props.useSeconds) {\r\n return props.format?.includes('ss') ? props.format : 'HH:mm:ss'\r\n }\r\n return props.format ?? 'HH:mm'\r\n })\r\n\r\n const endTimeDisabled = computed(\r\n () => props.mode === 'range' && !startTime.value\r\n )\r\n\r\n const mergedStartAttrs = computed(() => ({\r\n ...props.attrs,\r\n ...props.startTimeProps,\r\n }))\r\n\r\n const mergedEndAttrs = computed(() => ({\r\n ...props.attrs,\r\n ...props.endTimeProps,\r\n }))\r\n\r\n const mergedAttrs = computed(() => ({ ...props.attrs }))\r\n\r\n /* ==================== 时间限制函数 ==================== */\r\n const isEndHourDisabled = (hour: number): boolean => {\r\n if (!startTime.value) return false\r\n return hour < new Date(startTime.value).getHours()\r\n }\r\n\r\n const isEndMinuteDisabled = (\r\n minute: number,\r\n selectedHour: number | null\r\n ): boolean => {\r\n if (!startTime.value || selectedHour === null) return false\r\n const startDate = new Date(startTime.value)\r\n return (\r\n selectedHour === startDate.getHours() && minute < startDate.getMinutes()\r\n )\r\n }\r\n\r\n const isEndSecondDisabled = (\r\n second: number,\r\n selectedMinute: number | null,\r\n selectedHour: number | null\r\n ): boolean => {\r\n if (\r\n !startTime.value ||\r\n !props.useSeconds ||\r\n selectedHour === null ||\r\n selectedMinute === null\r\n )\r\n return false\r\n const startDate = new Date(startTime.value)\r\n return (\r\n selectedHour === startDate.getHours() &&\r\n selectedMinute === startDate.getMinutes() &&\r\n second <= startDate.getSeconds()\r\n )\r\n }\r\n\r\n /* ==================== 事件处理 ==================== */\r\n const handleStartTimeChange = (value: number | null) => {\r\n startTime.value = value\r\n if (!value) {\r\n endTime.value = null\r\n } else if (\r\n props.enableTimeRestriction &&\r\n endTime.value &&\r\n endTime.value <= value\r\n ) {\r\n endTime.value = null\r\n }\r\n emit('change-start', value)\r\n if (props.mode === 'range') emit('change-range', value, endTime.value)\r\n }\r\n\r\n const handleEndTimeChange = (value: number | null) => {\r\n endTime.value = value\r\n emit('change-end', value)\r\n if (props.mode === 'range') emit('change-range', startTime.value, value)\r\n }\r\n\r\n const handleSingleTimeChange = (value: number | null) => {\r\n singleTime.value = value\r\n emit('change-single', value)\r\n }\r\n\r\n /* ==================== 模式切换监听 ==================== */\r\n watch(\r\n () => props.mode,\r\n () => {\r\n startTime.value = props.defaultStartTime ?? null\r\n endTime.value = props.defaultEndTime ?? null\r\n singleTime.value = props.defaultSingleTime ?? null\r\n }\r\n )\r\n\r\n /* ==================== 暴露方法 ==================== */\r\n const reset = () => {\r\n startTime.value = null\r\n endTime.value = null\r\n singleTime.value = null\r\n }\r\n\r\n return {\r\n startTime,\r\n endTime,\r\n singleTime,\r\n timeFormat,\r\n endTimeDisabled,\r\n mergedStartAttrs,\r\n mergedEndAttrs,\r\n mergedAttrs,\r\n isEndHourDisabled,\r\n isEndMinuteDisabled,\r\n isEndSecondDisabled,\r\n handleStartTimeChange,\r\n handleEndTimeChange,\r\n handleSingleTimeChange,\r\n reset,\r\n }\r\n}\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-05-29\r\n * @Description: 时间选择器 — 薄 UI 壳,逻辑由 useTimeSelection 驱动\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-time-wrapper\">\r\n <!-- 时间段选择模式 -->\r\n <div v-if=\"mode === 'range'\" class=\"time-range-container\">\r\n <NTimePicker\r\n v-model:value=\"startTime\"\r\n :placeholder=\"startPlaceholder\"\r\n :format=\"timeFormat\"\r\n :actions=\"['now', 'confirm']\"\r\n v-bind=\"mergedStartAttrs\"\r\n @update:value=\"handleStartTimeChange\"\r\n />\r\n <span class=\"range-separator\">至</span>\r\n <NTimePicker\r\n v-model:value=\"endTime\"\r\n :placeholder=\"endPlaceholder\"\r\n :format=\"timeFormat\"\r\n :actions=\"['now', 'confirm']\"\r\n :is-hour-disabled=\"\r\n props.enableTimeRestriction ? isEndHourDisabled : undefined\r\n \"\r\n :is-minute-disabled=\"\r\n props.enableTimeRestriction ? isEndMinuteDisabled : undefined\r\n \"\r\n :is-second-disabled=\"\r\n props.enableTimeRestriction ? isEndSecondDisabled : undefined\r\n \"\r\n :disabled=\"endTimeDisabled\"\r\n v-bind=\"mergedEndAttrs\"\r\n @update:value=\"handleEndTimeChange\"\r\n />\r\n </div>\r\n\r\n <!-- 单个时间选择模式 -->\r\n <div v-else class=\"time-single-container\">\r\n <NTimePicker\r\n v-model:value=\"singleTime\"\r\n :placeholder=\"placeholder\"\r\n :format=\"timeFormat\"\r\n :actions=\"['now', 'confirm']\"\r\n v-bind=\"mergedAttrs\"\r\n @update:value=\"handleSingleTimeChange\"\r\n />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { NTimePicker } from \"naive-ui\";\r\nimport { useTimeSelection } from \"./composables/useTimeSelection\";\r\nimport type { TimeProps, TimeEmits, TimeExpose } from \"./types\";\r\n\r\ndefineOptions({ name: \"C_Time\" });\r\n\r\nconst props = withDefaults(defineProps<TimeProps>(), {\r\n mode: \"range\",\r\n startPlaceholder: \"请选择开始时间\",\r\n endPlaceholder: \"请选择结束时间\",\r\n placeholder: \"请选择时间\",\r\n format: \"HH:mm\",\r\n useHours: true,\r\n useMinutes: true,\r\n useSeconds: false,\r\n hourStep: 1,\r\n minuteStep: 30,\r\n secondStep: 1,\r\n startTimeProps: () => ({}),\r\n endTimeProps: () => ({}),\r\n attrs: () => ({}),\r\n defaultStartTime: null,\r\n defaultEndTime: null,\r\n defaultSingleTime: null,\r\n enableTimeRestriction: false,\r\n});\r\n\r\nconst emit = defineEmits<TimeEmits>();\r\n\r\nconst {\r\n startTime,\r\n endTime,\r\n singleTime,\r\n timeFormat,\r\n endTimeDisabled,\r\n mergedStartAttrs,\r\n mergedEndAttrs,\r\n mergedAttrs,\r\n isEndHourDisabled,\r\n isEndMinuteDisabled,\r\n isEndSecondDisabled,\r\n handleStartTimeChange,\r\n handleEndTimeChange,\r\n handleSingleTimeChange,\r\n reset,\r\n} = useTimeSelection(props, emit);\r\n\r\ndefineExpose<TimeExpose>({\r\n reset,\r\n startTime,\r\n endTime,\r\n singleTime,\r\n});\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n@use \"./index.scss\";\r\n</style>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-05-29\r\n * @Description: 时间选择器 — 薄 UI 壳,逻辑由 useTimeSelection 驱动\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-time-wrapper\">\r\n <!-- 时间段选择模式 -->\r\n <div v-if=\"mode === 'range'\" class=\"time-range-container\">\r\n <NTimePicker\r\n v-model:value=\"startTime\"\r\n :placeholder=\"startPlaceholder\"\r\n :format=\"timeFormat\"\r\n :actions=\"['now', 'confirm']\"\r\n v-bind=\"mergedStartAttrs\"\r\n @update:value=\"handleStartTimeChange\"\r\n />\r\n <span class=\"range-separator\">至</span>\r\n <NTimePicker\r\n v-model:value=\"endTime\"\r\n :placeholder=\"endPlaceholder\"\r\n :format=\"timeFormat\"\r\n :actions=\"['now', 'confirm']\"\r\n :is-hour-disabled=\"\r\n props.enableTimeRestriction ? isEndHourDisabled : undefined\r\n \"\r\n :is-minute-disabled=\"\r\n props.enableTimeRestriction ? isEndMinuteDisabled : undefined\r\n \"\r\n :is-second-disabled=\"\r\n props.enableTimeRestriction ? isEndSecondDisabled : undefined\r\n \"\r\n :disabled=\"endTimeDisabled\"\r\n v-bind=\"mergedEndAttrs\"\r\n @update:value=\"handleEndTimeChange\"\r\n />\r\n </div>\r\n\r\n <!-- 单个时间选择模式 -->\r\n <div v-else class=\"time-single-container\">\r\n <NTimePicker\r\n v-model:value=\"singleTime\"\r\n :placeholder=\"placeholder\"\r\n :format=\"timeFormat\"\r\n :actions=\"['now', 'confirm']\"\r\n v-bind=\"mergedAttrs\"\r\n @update:value=\"handleSingleTimeChange\"\r\n />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { NTimePicker } from \"naive-ui\";\r\nimport { useTimeSelection } from \"./composables/useTimeSelection\";\r\nimport type { TimeProps, TimeEmits, TimeExpose } from \"./types\";\r\n\r\ndefineOptions({ name: \"C_Time\" });\r\n\r\nconst props = withDefaults(defineProps<TimeProps>(), {\r\n mode: \"range\",\r\n startPlaceholder: \"请选择开始时间\",\r\n endPlaceholder: \"请选择结束时间\",\r\n placeholder: \"请选择时间\",\r\n format: \"HH:mm\",\r\n useHours: true,\r\n useMinutes: true,\r\n useSeconds: false,\r\n hourStep: 1,\r\n minuteStep: 30,\r\n secondStep: 1,\r\n startTimeProps: () => ({}),\r\n endTimeProps: () => ({}),\r\n attrs: () => ({}),\r\n defaultStartTime: null,\r\n defaultEndTime: null,\r\n defaultSingleTime: null,\r\n enableTimeRestriction: false,\r\n});\r\n\r\nconst emit = defineEmits<TimeEmits>();\r\n\r\nconst {\r\n startTime,\r\n endTime,\r\n singleTime,\r\n timeFormat,\r\n endTimeDisabled,\r\n mergedStartAttrs,\r\n mergedEndAttrs,\r\n mergedAttrs,\r\n isEndHourDisabled,\r\n isEndMinuteDisabled,\r\n isEndSecondDisabled,\r\n handleStartTimeChange,\r\n handleEndTimeChange,\r\n handleSingleTimeChange,\r\n reset,\r\n} = useTimeSelection(props, emit);\r\n\r\ndefineExpose<TimeExpose>({\r\n reset,\r\n startTime,\r\n endTime,\r\n singleTime,\r\n});\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n@use \"./index.scss\";\r\n</style>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-05-29\r\n * @Description: 时间选择器 — 薄 UI 壳,逻辑由 useTimeSelection 驱动\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-time-wrapper\">\r\n <!-- 时间段选择模式 -->\r\n <div v-if=\"mode === 'range'\" class=\"time-range-container\">\r\n <NTimePicker\r\n v-model:value=\"startTime\"\r\n :placeholder=\"startPlaceholder\"\r\n :format=\"timeFormat\"\r\n :actions=\"['now', 'confirm']\"\r\n v-bind=\"mergedStartAttrs\"\r\n @update:value=\"handleStartTimeChange\"\r\n />\r\n <span class=\"range-separator\">至</span>\r\n <NTimePicker\r\n v-model:value=\"endTime\"\r\n :placeholder=\"endPlaceholder\"\r\n :format=\"timeFormat\"\r\n :actions=\"['now', 'confirm']\"\r\n :is-hour-disabled=\"\r\n props.enableTimeRestriction ? isEndHourDisabled : undefined\r\n \"\r\n :is-minute-disabled=\"\r\n props.enableTimeRestriction ? isEndMinuteDisabled : undefined\r\n \"\r\n :is-second-disabled=\"\r\n props.enableTimeRestriction ? isEndSecondDisabled : undefined\r\n \"\r\n :disabled=\"endTimeDisabled\"\r\n v-bind=\"mergedEndAttrs\"\r\n @update:value=\"handleEndTimeChange\"\r\n />\r\n </div>\r\n\r\n <!-- 单个时间选择模式 -->\r\n <div v-else class=\"time-single-container\">\r\n <NTimePicker\r\n v-model:value=\"singleTime\"\r\n :placeholder=\"placeholder\"\r\n :format=\"timeFormat\"\r\n :actions=\"['now', 'confirm']\"\r\n v-bind=\"mergedAttrs\"\r\n @update:value=\"handleSingleTimeChange\"\r\n />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { NTimePicker } from \"naive-ui\";\r\nimport { useTimeSelection } from \"./composables/useTimeSelection\";\r\nimport type { TimeProps, TimeEmits, TimeExpose } from \"./types\";\r\n\r\ndefineOptions({ name: \"C_Time\" });\r\n\r\nconst props = withDefaults(defineProps<TimeProps>(), {\r\n mode: \"range\",\r\n startPlaceholder: \"请选择开始时间\",\r\n endPlaceholder: \"请选择结束时间\",\r\n placeholder: \"请选择时间\",\r\n format: \"HH:mm\",\r\n useHours: true,\r\n useMinutes: true,\r\n useSeconds: false,\r\n hourStep: 1,\r\n minuteStep: 30,\r\n secondStep: 1,\r\n startTimeProps: () => ({}),\r\n endTimeProps: () => ({}),\r\n attrs: () => ({}),\r\n defaultStartTime: null,\r\n defaultEndTime: null,\r\n defaultSingleTime: null,\r\n enableTimeRestriction: false,\r\n});\r\n\r\nconst emit = defineEmits<TimeEmits>();\r\n\r\nconst {\r\n startTime,\r\n endTime,\r\n singleTime,\r\n timeFormat,\r\n endTimeDisabled,\r\n mergedStartAttrs,\r\n mergedEndAttrs,\r\n mergedAttrs,\r\n isEndHourDisabled,\r\n isEndMinuteDisabled,\r\n isEndSecondDisabled,\r\n handleStartTimeChange,\r\n handleEndTimeChange,\r\n handleSingleTimeChange,\r\n reset,\r\n} = useTimeSelection(props, emit);\r\n\r\ndefineExpose<TimeExpose>({\r\n reset,\r\n startTime,\r\n endTime,\r\n singleTime,\r\n});\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n@use \"./index.scss\";\r\n</style>\r\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"C_Tree-DnGc_MPb.css","names":[],"sources":["../src/components/C_Tree/index.vue?vue&type=style&index=0&scoped=2c548e72&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled */.c-tree[data-v-2c548e72] {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n.c-tree .c-tree-toolbar[data-v-2c548e72] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: #fafafa;\n border-radius: 6px;\n margin-bottom: 12px;\n flex-shrink: 0;\n}\n.c-tree .c-tree-toolbar .toolbar-left .search-input[data-v-2c548e72] {\n width: 260px;\n}\n.c-tree .c-tree-toolbar .toolbar-right[data-v-2c548e72] {\n display: flex;\n gap: 8px;\n}\n.c-tree .c-tree-container[data-v-2c548e72] {\n flex: 1;\n min-height: 0;\n border: 1px solid #e0e0e6;\n border-radius: 6px;\n padding: 12px;\n overflow-y: auto;\n scrollbar-width: thin;\n scrollbar-color: rgba(0, 0, 0, 0.12) transparent;\n}\n.c-tree .c-tree-container[data-v-2c548e72]::-webkit-scrollbar {\n width: 6px;\n}\n.c-tree .c-tree-container[data-v-2c548e72]::-webkit-scrollbar-thumb {\n background: rgba(0, 0, 0, 0.12);\n border-radius: 3px;\n transition: background 0.2s;\n}\n.c-tree .c-tree-container[data-v-2c548e72]::-webkit-scrollbar-thumb:hover {\n background: rgba(0, 0, 0, 0.25);\n}\n.c-tree .c-tree-container[data-v-2c548e72]::-webkit-scrollbar-track {\n background: transparent;\n}\n.c-tree .c-tree-container .tree-instance[data-v-2c548e72] .n-tree .n-tree-node {\n margin-bottom: 4px;\n}\n.c-tree .c-tree-container .tree-instance[data-v-2c548e72] .n-tree .n-tree-node .n-tree-node-wrapper {\n padding: 2px 0;\n}\n.c-tree .c-tree-container .tree-instance[data-v-2c548e72] .n-tree .n-tree-node .n-tree-node-content {\n padding: 12px 8px;\n border-radius: 6px;\n transition: all 0.2s ease;\n align-items: center;\n min-height: 44px;\n}\n.c-tree .c-tree-container .tree-instance[data-v-2c548e72] .n-tree .n-tree-node .n-tree-node-content:hover {\n background-color: #f0f9ff;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);\n}\n.c-tree .c-tree-container .tree-instance[data-v-2c548e72] .n-tree .n-tree-node .n-tree-node-content:hover .tree-actions {\n opacity: 1 !important;\n}\n.c-tree .c-tree-container .tree-instance[data-v-2c548e72] .n-tree .n-tree-node .n-tree-node-content .n-tree-node-content__prefix {\n margin-right: 0;\n display: flex;\n align-items: center;\n}\n.c-tree .c-tree-container .tree-instance[data-v-2c548e72] .n-tree .n-tree-node .n-tree-node-content .n-tree-node-content__text {\n flex: 1;\n display: flex;\n align-items: center;\n}\n.c-tree .c-tree-container .tree-instance[data-v-2c548e72] .n-tree .n-tree-node .n-tree-node-content .n-tree-node-content__suffix {\n margin-left: auto;\n display: flex;\n align-items: center;\n}\n.c-tree .c-tree-container .tree-instance[data-v-2c548e72] .n-tree .n-tree-node .n-tree-node-switcher {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 8px;\n}\n.c-tree .c-tree-container .tree-instance[data-v-2c548e72] .n-tree .n-tree-node .n-tree-node-switcher .n-tree-node-switcher__icon {\n font-size: 14px;\n transition: transform 0.2s ease;\n}\n.c-tree .c-tree-container .tree-instance[data-v-2c548e72] .n-tree .n-tree-node.n-tree-node--selected .n-tree-node-content {\n background-color: #e6f3ff;\n border: 1px solid #1890ff;\n}\n.c-tree .c-tree-container .tree-instance[data-v-2c548e72] .n-tree .n-tree-node.n-tree-node--disabled .n-tree-node-content {\n opacity: 0.6;\n cursor: not-allowed;\n}\n.c-tree .c-tree-container .tree-instance[data-v-2c548e72] .n-tree .n-tree-node-indent {\n width: 24px;\n}\n.c-tree .c-tree-container .tree-instance[data-v-2c548e72] .n-tree-node:hover .tree-actions {\n opacity: 1 !important;\n}\n.c-tree .c-tree-container .tree-instance[data-v-2c548e72] .tree-actions {\n opacity: 0;\n transition: opacity 0.2s ease;\n}\n.c-tree .c-tree-container .tree-instance[data-v-2c548e72] .tree-actions:hover {\n opacity: 1 !important;\n}\n.c-tree[data-v-2c548e72] .n-tree-node-content:hover .tree-actions,\n.c-tree[data-v-2c548e72] .n-tree-node:hover .tree-actions {\n opacity: 1 !important;\n}\n.c-tree[data-v-2c548e72] .tree-actions {\n opacity: 0;\n transition: opacity 0.2s ease-in-out;\n}\n\n/* responsive */\n@media (max-width: 768px) {\n.c-tree .c-tree-toolbar[data-v-2c548e72] {\n flex-direction: column;\n gap: 12px;\n}\n.c-tree .c-tree-toolbar .toolbar-left .search-input[data-v-2c548e72] {\n width: 100%;\n}\n.c-tree .c-tree-toolbar .toolbar-right[data-v-2c548e72] {\n width: 100%;\n justify-content: center;\n}\n.c-tree[data-v-2c548e72] .tree-actions {\n opacity: 1 !important;\n}\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;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
|
package/dist/C_Tree2.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { t as C_Icon_default } from "./C_Icon2.js";
|
|
2
2
|
import { t as export_helper_default } from "./export-helper.js";
|
|
3
|
-
import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, h, isRef, openBlock, ref, renderSlot, toDisplayString, unref, withCtx } from "vue";
|
|
4
3
|
import { NButton, NInput, NPopconfirm, NSpace, NTag, NTree } from "naive-ui";
|
|
4
|
+
import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, h, isRef, openBlock, ref, renderSlot, toDisplayString, unref, withCtx } from "vue";
|
|
5
5
|
|
|
6
6
|
//#region src/components/C_Tree/data.ts
|
|
7
7
|
const presetConfigs = {
|
|
@@ -434,7 +434,7 @@ var index_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineCo
|
|
|
434
434
|
|
|
435
435
|
//#endregion
|
|
436
436
|
//#region src/components/C_Tree/index.vue
|
|
437
|
-
var C_Tree_default = /* @__PURE__ */ export_helper_default(index_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-
|
|
437
|
+
var C_Tree_default = /* @__PURE__ */ export_helper_default(index_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-2c548e72"]]);
|
|
438
438
|
|
|
439
439
|
//#endregion
|
|
440
440
|
export { useTreeOperations as n, presetConfigs as r, C_Tree_default as t };
|
package/dist/C_Tree2.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"C_Tree2.js","names":["C_Icon","showToolbar","searchable","searchPlaceholder","addable","addText","refreshable","draggable","showLine","keyField","labelField","childrenField"],"sources":["../src/components/C_Tree/data.ts","../src/components/C_Tree/composables/useTreeOperations.ts","../src/components/C_Tree/index.vue","../src/components/C_Tree/index.vue","../src/components/C_Tree/index.vue"],"sourcesContent":["import type { TreeMode, TreeProps } from \"./types\";\r\n\r\nexport const presetConfigs: Record<TreeMode, Partial<TreeProps>> = {\r\n menu: {\r\n draggable: true,\r\n showLine: true,\r\n iconConfig: {\r\n typeMap: {\r\n directory: \"mdi:folder\",\r\n menu: \"mdi:file-document\",\r\n button: \"mdi:button-cursor\",\r\n },\r\n },\r\n actions: [\r\n { key: \"add\", text: \"新增子菜单\", icon: \"mdi:plus\", type: \"primary\" },\r\n { key: \"edit\", text: \"编辑\", icon: \"mdi:pencil\", type: \"info\" },\r\n {\r\n key: \"delete\",\r\n text: \"删除\",\r\n icon: \"mdi:delete\",\r\n type: \"error\",\r\n confirm: \"确认删除该菜单吗?\",\r\n },\r\n ],\r\n },\r\n file: {\r\n draggable: false,\r\n showLine: false,\r\n iconConfig: {\r\n typeMap: {\r\n folder: \"mdi:folder\",\r\n file: \"mdi:file-document\",\r\n image: \"mdi:file-image\",\r\n video: \"mdi:file-video\",\r\n audio: \"mdi:file-music\",\r\n },\r\n },\r\n actions: [\r\n { key: \"open\", text: \"打开\", icon: \"mdi:folder-open\", type: \"primary\" },\r\n { key: \"rename\", text: \"重命名\", icon: \"mdi:rename-box\", type: \"info\" },\r\n {\r\n key: \"delete\",\r\n text: \"删除\",\r\n icon: \"mdi:delete\",\r\n type: \"error\",\r\n confirm: \"确认删除该文件吗?\",\r\n },\r\n ],\r\n },\r\n org: {\r\n draggable: false,\r\n showLine: true,\r\n iconConfig: {\r\n typeMap: {\r\n department: \"mdi:domain\",\r\n user: \"mdi:account\",\r\n manager: \"mdi:account-tie\",\r\n },\r\n },\r\n actions: [\r\n { key: \"add\", text: \"新增下级\", icon: \"mdi:plus\", type: \"primary\" },\r\n { key: \"edit\", text: \"编辑\", icon: \"mdi:pencil\", type: \"info\" },\r\n ],\r\n },\r\n custom: {},\r\n};\r\n","import { ref, computed, h } from \"vue\";\r\nimport { NTag, NButton, NPopconfirm, NSpace } from \"naive-ui\";\r\nimport C_Icon from \"../../C_Icon/index.vue\";\r\nimport { presetConfigs } from \"../data\";\r\nimport type {\r\n TreeOption,\r\n TreeNodeData,\r\n TreeProps,\r\n TreeExpose,\r\n DropInfo,\r\n} from \"../types\";\r\n\r\ntype EmitFn = {\r\n (\r\n event: \"node-select\",\r\n node: TreeNodeData | null,\r\n selectedKeys: (string | number)[],\r\n ): void;\r\n (event: \"node-action\", action: string, node: TreeNodeData): void;\r\n (event: \"node-drop\", info: DropInfo): void;\r\n (event: \"add\", parentNode?: TreeNodeData): void;\r\n (event: \"refresh\"): void;\r\n};\r\n\r\nexport function useTreeOperations(props: TreeProps, emit: EmitFn) {\r\n const internalSearchPattern = ref(\"\");\r\n const expandedKeys = ref<(string | number)[]>(\r\n props.defaultExpandedKeys ?? [],\r\n );\r\n const selectedKeys = ref<(string | number)[]>(\r\n props.defaultSelectedKeys ?? [],\r\n );\r\n const isAllExpanded = ref(props.defaultExpandAll ?? false);\r\n\r\n const keyField = computed(() => props.keyField ?? \"id\");\r\n const labelField = computed(() => props.labelField ?? \"name\");\r\n const childrenField = computed(() => props.childrenField ?? \"children\");\r\n const iconField = computed(() => props.iconField ?? \"icon\");\r\n\r\n const mergedConfig = computed(() => {\r\n const preset = presetConfigs[props.mode ?? \"custom\"] || {};\r\n return {\r\n ...preset,\r\n ...props,\r\n iconConfig: { ...preset.iconConfig, ...props.iconConfig },\r\n actions: props.actions?.length ? props.actions : preset.actions || [],\r\n };\r\n });\r\n\r\n const treeData = computed((): TreeOption[] => props.data as TreeOption[]);\r\n\r\n const currentSearchPattern = computed(\r\n () => props.searchPattern || internalSearchPattern.value,\r\n );\r\n\r\n const selectedNode = computed((): TreeNodeData | null => {\r\n if (selectedKeys.value.length === 0) return null;\r\n const findNode = (\r\n nodes: TreeNodeData[],\r\n id: string | number,\r\n ): TreeNodeData | null => {\r\n for (const node of nodes) {\r\n if (node[keyField.value] === id) return node;\r\n if (node[childrenField.value]) {\r\n const found = findNode(node[childrenField.value], id);\r\n if (found) return found;\r\n }\r\n }\r\n return null;\r\n };\r\n return findNode(props.data, selectedKeys.value[0]);\r\n });\r\n\r\n const getAllKeys = (nodes: TreeNodeData[]): (string | number)[] => {\r\n const keys: (string | number)[] = [];\r\n nodes.forEach((node) => {\r\n keys.push(node[keyField.value]);\r\n if (node[childrenField.value]) {\r\n keys.push(...getAllKeys(node[childrenField.value]));\r\n }\r\n });\r\n return keys;\r\n };\r\n\r\n const getNodeIcon = (node: TreeNodeData): string => {\r\n const config = mergedConfig.value.iconConfig!;\r\n if (node[iconField.value]) return node[iconField.value];\r\n if (node.type && config.typeMap?.[node.type])\r\n return config.typeMap[node.type];\r\n return config.default || \"mdi:circle-outline\";\r\n };\r\n\r\n const getNodeIconColor = (node: TreeNodeData): string => {\r\n const config = mergedConfig.value.iconConfig!;\r\n if (node.type && config.colorMap?.[node.type])\r\n return config.colorMap[node.type];\r\n return \"currentColor\";\r\n };\r\n\r\n const renderPrefix = ({ option }: { option: TreeOption }) => {\r\n const node = option as TreeNodeData;\r\n return h(C_Icon, {\r\n name: getNodeIcon(node),\r\n size: 18,\r\n color: getNodeIconColor(node),\r\n class: \"mr-3 flex-shrink-0\",\r\n });\r\n };\r\n\r\n const renderLabel = ({ option }: { option: TreeOption }) => {\r\n const node = option as TreeNodeData;\r\n const statusTags =\r\n props.statusConfigs\r\n ?.map((config) => {\r\n const value = node[config.field];\r\n const statusConfig = config.values[value];\r\n if (!statusConfig?.text) return null;\r\n return h(\r\n NTag,\r\n {\r\n type: statusConfig.type,\r\n size: \"small\",\r\n class: \"ml-2\",\r\n style: { fontSize: \"12px\" },\r\n },\r\n { default: () => statusConfig.text },\r\n );\r\n })\r\n .filter(Boolean) || [];\r\n\r\n return h(\r\n \"div\",\r\n {\r\n class: \"flex items-center flex-1 min-w-0 py-1\",\r\n style: { lineHeight: \"1.5\" },\r\n },\r\n [\r\n h(\r\n \"span\",\r\n { class: \"mr-3 font-medium text-sm\" },\r\n node[labelField.value],\r\n ),\r\n ...statusTags,\r\n ],\r\n );\r\n };\r\n\r\n const renderSuffix = ({ option }: { option: TreeOption }) => {\r\n const node = option as TreeNodeData;\r\n const actions = mergedConfig.value.actions || [];\r\n\r\n const actionButtons = actions\r\n .filter((action) => !action.show || action.show(node))\r\n .map((action) => {\r\n const buttonProps = {\r\n size: \"tiny\" as const,\r\n type: action.type || (\"default\" as const),\r\n secondary: true,\r\n style: { padding: \"4px 6px\", minWidth: \"24px\", height: \"24px\" },\r\n onClick: (e: Event) => {\r\n e.stopPropagation();\r\n handleNodeAction(action.key, node);\r\n },\r\n };\r\n const iconEl = h(C_Icon, {\r\n name: action.icon,\r\n size: 12,\r\n title: action.text,\r\n });\r\n\r\n if (action.confirm) {\r\n return h(\r\n NPopconfirm,\r\n { onPositiveClick: () => handleNodeAction(action.key, node) },\r\n {\r\n trigger: () =>\r\n h(\r\n NButton,\r\n {\r\n ...buttonProps,\r\n onClick: (e: Event) => e.stopPropagation(),\r\n },\r\n { icon: () => iconEl },\r\n ),\r\n default: () => action.confirm,\r\n },\r\n );\r\n }\r\n return h(NButton, buttonProps, { icon: () => iconEl });\r\n });\r\n\r\n return h(\r\n \"div\",\r\n {\r\n class: \"tree-actions\",\r\n style: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n marginLeft: \"8px\",\r\n opacity: \"0\",\r\n transition: \"opacity 0.2s ease\",\r\n },\r\n },\r\n [h(NSpace, { size: 4 }, { default: () => actionButtons })],\r\n );\r\n };\r\n\r\n const toggleExpandAll = (): void => {\r\n if (isAllExpanded.value) {\r\n expandedKeys.value = [];\r\n isAllExpanded.value = false;\r\n } else {\r\n expandedKeys.value = getAllKeys(props.data);\r\n isAllExpanded.value = true;\r\n }\r\n };\r\n\r\n const handleExpandedKeysChange = (keys: (string | number)[]): void => {\r\n expandedKeys.value = keys;\r\n isAllExpanded.value = keys.length === getAllKeys(props.data).length;\r\n };\r\n\r\n const handleSelectedKeysChange = (keys: (string | number)[]): void => {\r\n selectedKeys.value = keys;\r\n emit(\"node-select\", selectedNode.value, keys);\r\n };\r\n\r\n const handleDrop = (info: DropInfo): void => emit(\"node-drop\", info);\r\n\r\n const handleNodeAction = (action: string, node: TreeNodeData): void => {\r\n if (action === \"add\") {\r\n emit(\"add\", node);\r\n } else {\r\n emit(\"node-action\", action, node);\r\n }\r\n };\r\n\r\n const handleAdd = (): void => emit(\"add\");\r\n const handleRefresh = (): void => emit(\"refresh\");\r\n\r\n const expose: TreeExpose = {\r\n expandAll: () => {\r\n expandedKeys.value = getAllKeys(props.data);\r\n isAllExpanded.value = true;\r\n },\r\n collapseAll: () => {\r\n expandedKeys.value = [];\r\n isAllExpanded.value = false;\r\n },\r\n selectNode: (key: string | number) => {\r\n selectedKeys.value = [key];\r\n },\r\n getSelectedNode: () => selectedNode.value,\r\n expandedKeys,\r\n selectedKeys,\r\n };\r\n\r\n return {\r\n internalSearchPattern,\r\n expandedKeys,\r\n selectedKeys,\r\n isAllExpanded,\r\n treeData,\r\n currentSearchPattern,\r\n renderPrefix,\r\n renderLabel,\r\n renderSuffix,\r\n toggleExpandAll,\r\n handleExpandedKeysChange,\r\n handleSelectedKeysChange,\r\n handleDrop,\r\n handleAdd,\r\n handleRefresh,\r\n expose,\r\n };\r\n}\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-27\r\n * @Description: 树型组件 — 薄 UI 壳,逻辑由 useTreeOperations 驱动\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-tree\">\r\n <div v-if=\"showToolbar\" class=\"c-tree-toolbar\">\r\n <div class=\"toolbar-left\">\r\n <NInput\r\n v-if=\"searchable\"\r\n v-model:value=\"internalSearchPattern\"\r\n :placeholder=\"searchPlaceholder\"\r\n clearable\r\n class=\"search-input\"\r\n >\r\n <template #prefix>\r\n <C_Icon name=\"mdi:magnify\" :size=\"16\" />\r\n </template>\r\n </NInput>\r\n </div>\r\n <div class=\"toolbar-right\">\r\n <slot name=\"toolbar-actions\">\r\n <NButton v-if=\"addable\" type=\"primary\" @click=\"handleAdd()\">\r\n <template #icon>\r\n <C_Icon name=\"mdi:plus\" :size=\"16\" />\r\n </template>\r\n {{ addText }}\r\n </NButton>\r\n <NButton @click=\"toggleExpandAll\">\r\n <template #icon>\r\n <C_Icon name=\"mdi:file-tree\" :size=\"16\" />\r\n </template>\r\n {{ isAllExpanded ? \"收起全部\" : \"展开全部\" }}\r\n </NButton>\r\n <NButton v-if=\"refreshable\" @click=\"handleRefresh\">\r\n <template #icon>\r\n <C_Icon name=\"mdi:refresh\" :size=\"16\" />\r\n </template>\r\n 刷新\r\n </NButton>\r\n </slot>\r\n </div>\r\n </div>\r\n\r\n <div class=\"c-tree-container\">\r\n <NTree\r\n :data=\"treeData\"\r\n :pattern=\"currentSearchPattern\"\r\n :expanded-keys=\"expandedKeys\"\r\n :selected-keys=\"selectedKeys\"\r\n :draggable=\"draggable\"\r\n :show-line=\"showLine\"\r\n :render-prefix=\"renderPrefix\"\r\n :render-suffix=\"renderSuffix\"\r\n :render-label=\"renderLabel\"\r\n :key-field=\"keyField\"\r\n :label-field=\"labelField\"\r\n :children-field=\"childrenField\"\r\n @update:expanded-keys=\"handleExpandedKeysChange\"\r\n @update:selected-keys=\"handleSelectedKeysChange\"\r\n @drop=\"handleDrop\"\r\n class=\"tree-instance\"\r\n />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { NInput, NButton, NTree } from \"naive-ui\";\r\nimport C_Icon from \"../C_Icon/index.vue\";\r\nimport { useTreeOperations } from \"./composables/useTreeOperations\";\r\nimport type { TreeProps, TreeEmits, TreeExpose } from \"./types\";\r\n\r\ndefineOptions({ name: \"C_Tree\" });\r\n\r\nconst props = withDefaults(defineProps<TreeProps>(), {\r\n mode: \"custom\",\r\n keyField: \"id\",\r\n labelField: \"name\",\r\n childrenField: \"children\",\r\n searchPattern: \"\",\r\n searchable: true,\r\n searchPlaceholder: \"搜索...\",\r\n draggable: false,\r\n showLine: true,\r\n showToolbar: true,\r\n addable: true,\r\n addText: \"新增\",\r\n refreshable: true,\r\n iconField: \"icon\",\r\n iconConfig: () => ({\r\n default: \"mdi:circle-outline\",\r\n typeMap: {},\r\n colorMap: {},\r\n }),\r\n statusConfigs: () => [],\r\n actions: () => [],\r\n defaultExpandAll: false,\r\n defaultExpandedKeys: () => [],\r\n defaultSelectedKeys: () => [],\r\n});\r\n\r\nconst emit = defineEmits<TreeEmits>();\r\n\r\nconst {\r\n internalSearchPattern,\r\n expandedKeys,\r\n selectedKeys,\r\n isAllExpanded,\r\n treeData,\r\n currentSearchPattern,\r\n renderPrefix,\r\n renderLabel,\r\n renderSuffix,\r\n toggleExpandAll,\r\n handleExpandedKeysChange,\r\n handleSelectedKeysChange,\r\n handleDrop,\r\n handleAdd,\r\n handleRefresh,\r\n expose,\r\n} = useTreeOperations(props, emit);\r\n\r\ndefineExpose<TreeExpose>(expose);\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-27\r\n * @Description: 树型组件 — 薄 UI 壳,逻辑由 useTreeOperations 驱动\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-tree\">\r\n <div v-if=\"showToolbar\" class=\"c-tree-toolbar\">\r\n <div class=\"toolbar-left\">\r\n <NInput\r\n v-if=\"searchable\"\r\n v-model:value=\"internalSearchPattern\"\r\n :placeholder=\"searchPlaceholder\"\r\n clearable\r\n class=\"search-input\"\r\n >\r\n <template #prefix>\r\n <C_Icon name=\"mdi:magnify\" :size=\"16\" />\r\n </template>\r\n </NInput>\r\n </div>\r\n <div class=\"toolbar-right\">\r\n <slot name=\"toolbar-actions\">\r\n <NButton v-if=\"addable\" type=\"primary\" @click=\"handleAdd()\">\r\n <template #icon>\r\n <C_Icon name=\"mdi:plus\" :size=\"16\" />\r\n </template>\r\n {{ addText }}\r\n </NButton>\r\n <NButton @click=\"toggleExpandAll\">\r\n <template #icon>\r\n <C_Icon name=\"mdi:file-tree\" :size=\"16\" />\r\n </template>\r\n {{ isAllExpanded ? \"收起全部\" : \"展开全部\" }}\r\n </NButton>\r\n <NButton v-if=\"refreshable\" @click=\"handleRefresh\">\r\n <template #icon>\r\n <C_Icon name=\"mdi:refresh\" :size=\"16\" />\r\n </template>\r\n 刷新\r\n </NButton>\r\n </slot>\r\n </div>\r\n </div>\r\n\r\n <div class=\"c-tree-container\">\r\n <NTree\r\n :data=\"treeData\"\r\n :pattern=\"currentSearchPattern\"\r\n :expanded-keys=\"expandedKeys\"\r\n :selected-keys=\"selectedKeys\"\r\n :draggable=\"draggable\"\r\n :show-line=\"showLine\"\r\n :render-prefix=\"renderPrefix\"\r\n :render-suffix=\"renderSuffix\"\r\n :render-label=\"renderLabel\"\r\n :key-field=\"keyField\"\r\n :label-field=\"labelField\"\r\n :children-field=\"childrenField\"\r\n @update:expanded-keys=\"handleExpandedKeysChange\"\r\n @update:selected-keys=\"handleSelectedKeysChange\"\r\n @drop=\"handleDrop\"\r\n class=\"tree-instance\"\r\n />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { NInput, NButton, NTree } from \"naive-ui\";\r\nimport C_Icon from \"../C_Icon/index.vue\";\r\nimport { useTreeOperations } from \"./composables/useTreeOperations\";\r\nimport type { TreeProps, TreeEmits, TreeExpose } from \"./types\";\r\n\r\ndefineOptions({ name: \"C_Tree\" });\r\n\r\nconst props = withDefaults(defineProps<TreeProps>(), {\r\n mode: \"custom\",\r\n keyField: \"id\",\r\n labelField: \"name\",\r\n childrenField: \"children\",\r\n searchPattern: \"\",\r\n searchable: true,\r\n searchPlaceholder: \"搜索...\",\r\n draggable: false,\r\n showLine: true,\r\n showToolbar: true,\r\n addable: true,\r\n addText: \"新增\",\r\n refreshable: true,\r\n iconField: \"icon\",\r\n iconConfig: () => ({\r\n default: \"mdi:circle-outline\",\r\n typeMap: {},\r\n colorMap: {},\r\n }),\r\n statusConfigs: () => [],\r\n actions: () => [],\r\n defaultExpandAll: false,\r\n defaultExpandedKeys: () => [],\r\n defaultSelectedKeys: () => [],\r\n});\r\n\r\nconst emit = defineEmits<TreeEmits>();\r\n\r\nconst {\r\n internalSearchPattern,\r\n expandedKeys,\r\n selectedKeys,\r\n isAllExpanded,\r\n treeData,\r\n currentSearchPattern,\r\n renderPrefix,\r\n renderLabel,\r\n renderSuffix,\r\n toggleExpandAll,\r\n handleExpandedKeysChange,\r\n handleSelectedKeysChange,\r\n handleDrop,\r\n handleAdd,\r\n handleRefresh,\r\n expose,\r\n} = useTreeOperations(props, emit);\r\n\r\ndefineExpose<TreeExpose>(expose);\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-27\r\n * @Description: 树型组件 — 薄 UI 壳,逻辑由 useTreeOperations 驱动\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-tree\">\r\n <div v-if=\"showToolbar\" class=\"c-tree-toolbar\">\r\n <div class=\"toolbar-left\">\r\n <NInput\r\n v-if=\"searchable\"\r\n v-model:value=\"internalSearchPattern\"\r\n :placeholder=\"searchPlaceholder\"\r\n clearable\r\n class=\"search-input\"\r\n >\r\n <template #prefix>\r\n <C_Icon name=\"mdi:magnify\" :size=\"16\" />\r\n </template>\r\n </NInput>\r\n </div>\r\n <div class=\"toolbar-right\">\r\n <slot name=\"toolbar-actions\">\r\n <NButton v-if=\"addable\" type=\"primary\" @click=\"handleAdd()\">\r\n <template #icon>\r\n <C_Icon name=\"mdi:plus\" :size=\"16\" />\r\n </template>\r\n {{ addText }}\r\n </NButton>\r\n <NButton @click=\"toggleExpandAll\">\r\n <template #icon>\r\n <C_Icon name=\"mdi:file-tree\" :size=\"16\" />\r\n </template>\r\n {{ isAllExpanded ? \"收起全部\" : \"展开全部\" }}\r\n </NButton>\r\n <NButton v-if=\"refreshable\" @click=\"handleRefresh\">\r\n <template #icon>\r\n <C_Icon name=\"mdi:refresh\" :size=\"16\" />\r\n </template>\r\n 刷新\r\n </NButton>\r\n </slot>\r\n </div>\r\n </div>\r\n\r\n <div class=\"c-tree-container\">\r\n <NTree\r\n :data=\"treeData\"\r\n :pattern=\"currentSearchPattern\"\r\n :expanded-keys=\"expandedKeys\"\r\n :selected-keys=\"selectedKeys\"\r\n :draggable=\"draggable\"\r\n :show-line=\"showLine\"\r\n :render-prefix=\"renderPrefix\"\r\n :render-suffix=\"renderSuffix\"\r\n :render-label=\"renderLabel\"\r\n :key-field=\"keyField\"\r\n :label-field=\"labelField\"\r\n :children-field=\"childrenField\"\r\n @update:expanded-keys=\"handleExpandedKeysChange\"\r\n @update:selected-keys=\"handleSelectedKeysChange\"\r\n @drop=\"handleDrop\"\r\n class=\"tree-instance\"\r\n />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { NInput, NButton, NTree } from \"naive-ui\";\r\nimport C_Icon from \"../C_Icon/index.vue\";\r\nimport { useTreeOperations } from \"./composables/useTreeOperations\";\r\nimport type { TreeProps, TreeEmits, TreeExpose } from \"./types\";\r\n\r\ndefineOptions({ name: \"C_Tree\" });\r\n\r\nconst props = withDefaults(defineProps<TreeProps>(), {\r\n mode: \"custom\",\r\n keyField: \"id\",\r\n labelField: \"name\",\r\n childrenField: \"children\",\r\n searchPattern: \"\",\r\n searchable: true,\r\n searchPlaceholder: \"搜索...\",\r\n draggable: false,\r\n showLine: true,\r\n showToolbar: true,\r\n addable: true,\r\n addText: \"新增\",\r\n refreshable: true,\r\n iconField: \"icon\",\r\n iconConfig: () => ({\r\n default: \"mdi:circle-outline\",\r\n typeMap: {},\r\n colorMap: {},\r\n }),\r\n statusConfigs: () => [],\r\n actions: () => [],\r\n defaultExpandAll: false,\r\n defaultExpandedKeys: () => [],\r\n defaultSelectedKeys: () => [],\r\n});\r\n\r\nconst emit = defineEmits<TreeEmits>();\r\n\r\nconst {\r\n internalSearchPattern,\r\n expandedKeys,\r\n selectedKeys,\r\n isAllExpanded,\r\n treeData,\r\n currentSearchPattern,\r\n renderPrefix,\r\n renderLabel,\r\n renderSuffix,\r\n toggleExpandAll,\r\n handleExpandedKeysChange,\r\n handleSelectedKeysChange,\r\n handleDrop,\r\n handleAdd,\r\n handleRefresh,\r\n expose,\r\n} = useTreeOperations(props, emit);\r\n\r\ndefineExpose<TreeExpose>(expose);\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"C_Tree2.js","names":["C_Icon","showToolbar","searchable","searchPlaceholder","addable","addText","refreshable","draggable","showLine","keyField","labelField","childrenField"],"sources":["../src/components/C_Tree/data.ts","../src/components/C_Tree/composables/useTreeOperations.ts","../src/components/C_Tree/index.vue","../src/components/C_Tree/index.vue","../src/components/C_Tree/index.vue"],"sourcesContent":["import type { TreeMode, TreeProps } from \"./types\";\r\n\r\nexport const presetConfigs: Record<TreeMode, Partial<TreeProps>> = {\r\n menu: {\r\n draggable: true,\r\n showLine: true,\r\n iconConfig: {\r\n typeMap: {\r\n directory: \"mdi:folder\",\r\n menu: \"mdi:file-document\",\r\n button: \"mdi:button-cursor\",\r\n },\r\n },\r\n actions: [\r\n { key: \"add\", text: \"新增子菜单\", icon: \"mdi:plus\", type: \"primary\" },\r\n { key: \"edit\", text: \"编辑\", icon: \"mdi:pencil\", type: \"info\" },\r\n {\r\n key: \"delete\",\r\n text: \"删除\",\r\n icon: \"mdi:delete\",\r\n type: \"error\",\r\n confirm: \"确认删除该菜单吗?\",\r\n },\r\n ],\r\n },\r\n file: {\r\n draggable: false,\r\n showLine: false,\r\n iconConfig: {\r\n typeMap: {\r\n folder: \"mdi:folder\",\r\n file: \"mdi:file-document\",\r\n image: \"mdi:file-image\",\r\n video: \"mdi:file-video\",\r\n audio: \"mdi:file-music\",\r\n },\r\n },\r\n actions: [\r\n { key: \"open\", text: \"打开\", icon: \"mdi:folder-open\", type: \"primary\" },\r\n { key: \"rename\", text: \"重命名\", icon: \"mdi:rename-box\", type: \"info\" },\r\n {\r\n key: \"delete\",\r\n text: \"删除\",\r\n icon: \"mdi:delete\",\r\n type: \"error\",\r\n confirm: \"确认删除该文件吗?\",\r\n },\r\n ],\r\n },\r\n org: {\r\n draggable: false,\r\n showLine: true,\r\n iconConfig: {\r\n typeMap: {\r\n department: \"mdi:domain\",\r\n user: \"mdi:account\",\r\n manager: \"mdi:account-tie\",\r\n },\r\n },\r\n actions: [\r\n { key: \"add\", text: \"新增下级\", icon: \"mdi:plus\", type: \"primary\" },\r\n { key: \"edit\", text: \"编辑\", icon: \"mdi:pencil\", type: \"info\" },\r\n ],\r\n },\r\n custom: {},\r\n};\r\n","import { ref, computed, h } from \"vue\";\r\nimport { NTag, NButton, NPopconfirm, NSpace } from \"naive-ui\";\r\nimport C_Icon from \"../../C_Icon/index.vue\";\r\nimport { presetConfigs } from \"../data\";\r\nimport type {\r\n TreeOption,\r\n TreeNodeData,\r\n TreeProps,\r\n TreeExpose,\r\n DropInfo,\r\n} from \"../types\";\r\n\r\ntype EmitFn = {\r\n (\r\n event: \"node-select\",\r\n node: TreeNodeData | null,\r\n selectedKeys: (string | number)[],\r\n ): void;\r\n (event: \"node-action\", action: string, node: TreeNodeData): void;\r\n (event: \"node-drop\", info: DropInfo): void;\r\n (event: \"add\", parentNode?: TreeNodeData): void;\r\n (event: \"refresh\"): void;\r\n};\r\n\r\nexport function useTreeOperations(props: TreeProps, emit: EmitFn) {\r\n const internalSearchPattern = ref(\"\");\r\n const expandedKeys = ref<(string | number)[]>(\r\n props.defaultExpandedKeys ?? [],\r\n );\r\n const selectedKeys = ref<(string | number)[]>(\r\n props.defaultSelectedKeys ?? [],\r\n );\r\n const isAllExpanded = ref(props.defaultExpandAll ?? false);\r\n\r\n const keyField = computed(() => props.keyField ?? \"id\");\r\n const labelField = computed(() => props.labelField ?? \"name\");\r\n const childrenField = computed(() => props.childrenField ?? \"children\");\r\n const iconField = computed(() => props.iconField ?? \"icon\");\r\n\r\n const mergedConfig = computed(() => {\r\n const preset = presetConfigs[props.mode ?? \"custom\"] || {};\r\n return {\r\n ...preset,\r\n ...props,\r\n iconConfig: { ...preset.iconConfig, ...props.iconConfig },\r\n actions: props.actions?.length ? props.actions : preset.actions || [],\r\n };\r\n });\r\n\r\n const treeData = computed((): TreeOption[] => props.data as TreeOption[]);\r\n\r\n const currentSearchPattern = computed(\r\n () => props.searchPattern || internalSearchPattern.value,\r\n );\r\n\r\n const selectedNode = computed((): TreeNodeData | null => {\r\n if (selectedKeys.value.length === 0) return null;\r\n const findNode = (\r\n nodes: TreeNodeData[],\r\n id: string | number,\r\n ): TreeNodeData | null => {\r\n for (const node of nodes) {\r\n if (node[keyField.value] === id) return node;\r\n if (node[childrenField.value]) {\r\n const found = findNode(node[childrenField.value], id);\r\n if (found) return found;\r\n }\r\n }\r\n return null;\r\n };\r\n return findNode(props.data, selectedKeys.value[0]);\r\n });\r\n\r\n const getAllKeys = (nodes: TreeNodeData[]): (string | number)[] => {\r\n const keys: (string | number)[] = [];\r\n nodes.forEach((node) => {\r\n keys.push(node[keyField.value]);\r\n if (node[childrenField.value]) {\r\n keys.push(...getAllKeys(node[childrenField.value]));\r\n }\r\n });\r\n return keys;\r\n };\r\n\r\n const getNodeIcon = (node: TreeNodeData): string => {\r\n const config = mergedConfig.value.iconConfig!;\r\n if (node[iconField.value]) return node[iconField.value];\r\n if (node.type && config.typeMap?.[node.type])\r\n return config.typeMap[node.type];\r\n return config.default || \"mdi:circle-outline\";\r\n };\r\n\r\n const getNodeIconColor = (node: TreeNodeData): string => {\r\n const config = mergedConfig.value.iconConfig!;\r\n if (node.type && config.colorMap?.[node.type])\r\n return config.colorMap[node.type];\r\n return \"currentColor\";\r\n };\r\n\r\n const renderPrefix = ({ option }: { option: TreeOption }) => {\r\n const node = option as TreeNodeData;\r\n return h(C_Icon, {\r\n name: getNodeIcon(node),\r\n size: 18,\r\n color: getNodeIconColor(node),\r\n class: \"mr-3 flex-shrink-0\",\r\n });\r\n };\r\n\r\n const renderLabel = ({ option }: { option: TreeOption }) => {\r\n const node = option as TreeNodeData;\r\n const statusTags =\r\n props.statusConfigs\r\n ?.map((config) => {\r\n const value = node[config.field];\r\n const statusConfig = config.values[value];\r\n if (!statusConfig?.text) return null;\r\n return h(\r\n NTag,\r\n {\r\n type: statusConfig.type,\r\n size: \"small\",\r\n class: \"ml-2\",\r\n style: { fontSize: \"12px\" },\r\n },\r\n { default: () => statusConfig.text },\r\n );\r\n })\r\n .filter(Boolean) || [];\r\n\r\n return h(\r\n \"div\",\r\n {\r\n class: \"flex items-center flex-1 min-w-0 py-1\",\r\n style: { lineHeight: \"1.5\" },\r\n },\r\n [\r\n h(\r\n \"span\",\r\n { class: \"mr-3 font-medium text-sm\" },\r\n node[labelField.value],\r\n ),\r\n ...statusTags,\r\n ],\r\n );\r\n };\r\n\r\n const renderSuffix = ({ option }: { option: TreeOption }) => {\r\n const node = option as TreeNodeData;\r\n const actions = mergedConfig.value.actions || [];\r\n\r\n const actionButtons = actions\r\n .filter((action) => !action.show || action.show(node))\r\n .map((action) => {\r\n const buttonProps = {\r\n size: \"tiny\" as const,\r\n type: action.type || (\"default\" as const),\r\n secondary: true,\r\n style: { padding: \"4px 6px\", minWidth: \"24px\", height: \"24px\" },\r\n onClick: (e: Event) => {\r\n e.stopPropagation();\r\n handleNodeAction(action.key, node);\r\n },\r\n };\r\n const iconEl = h(C_Icon, {\r\n name: action.icon,\r\n size: 12,\r\n title: action.text,\r\n });\r\n\r\n if (action.confirm) {\r\n return h(\r\n NPopconfirm,\r\n { onPositiveClick: () => handleNodeAction(action.key, node) },\r\n {\r\n trigger: () =>\r\n h(\r\n NButton,\r\n {\r\n ...buttonProps,\r\n onClick: (e: Event) => e.stopPropagation(),\r\n },\r\n { icon: () => iconEl },\r\n ),\r\n default: () => action.confirm,\r\n },\r\n );\r\n }\r\n return h(NButton, buttonProps, { icon: () => iconEl });\r\n });\r\n\r\n return h(\r\n \"div\",\r\n {\r\n class: \"tree-actions\",\r\n style: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n marginLeft: \"8px\",\r\n opacity: \"0\",\r\n transition: \"opacity 0.2s ease\",\r\n },\r\n },\r\n [h(NSpace, { size: 4 }, { default: () => actionButtons })],\r\n );\r\n };\r\n\r\n const toggleExpandAll = (): void => {\r\n if (isAllExpanded.value) {\r\n expandedKeys.value = [];\r\n isAllExpanded.value = false;\r\n } else {\r\n expandedKeys.value = getAllKeys(props.data);\r\n isAllExpanded.value = true;\r\n }\r\n };\r\n\r\n const handleExpandedKeysChange = (keys: (string | number)[]): void => {\r\n expandedKeys.value = keys;\r\n isAllExpanded.value = keys.length === getAllKeys(props.data).length;\r\n };\r\n\r\n const handleSelectedKeysChange = (keys: (string | number)[]): void => {\r\n selectedKeys.value = keys;\r\n emit(\"node-select\", selectedNode.value, keys);\r\n };\r\n\r\n const handleDrop = (info: DropInfo): void => emit(\"node-drop\", info);\r\n\r\n const handleNodeAction = (action: string, node: TreeNodeData): void => {\r\n if (action === \"add\") {\r\n emit(\"add\", node);\r\n } else {\r\n emit(\"node-action\", action, node);\r\n }\r\n };\r\n\r\n const handleAdd = (): void => emit(\"add\");\r\n const handleRefresh = (): void => emit(\"refresh\");\r\n\r\n const expose: TreeExpose = {\r\n expandAll: () => {\r\n expandedKeys.value = getAllKeys(props.data);\r\n isAllExpanded.value = true;\r\n },\r\n collapseAll: () => {\r\n expandedKeys.value = [];\r\n isAllExpanded.value = false;\r\n },\r\n selectNode: (key: string | number) => {\r\n selectedKeys.value = [key];\r\n },\r\n getSelectedNode: () => selectedNode.value,\r\n expandedKeys,\r\n selectedKeys,\r\n };\r\n\r\n return {\r\n internalSearchPattern,\r\n expandedKeys,\r\n selectedKeys,\r\n isAllExpanded,\r\n treeData,\r\n currentSearchPattern,\r\n renderPrefix,\r\n renderLabel,\r\n renderSuffix,\r\n toggleExpandAll,\r\n handleExpandedKeysChange,\r\n handleSelectedKeysChange,\r\n handleDrop,\r\n handleAdd,\r\n handleRefresh,\r\n expose,\r\n };\r\n}\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-27\r\n * @Description: 树型组件 — 薄 UI 壳,逻辑由 useTreeOperations 驱动\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-tree\">\r\n <div v-if=\"showToolbar\" class=\"c-tree-toolbar\">\r\n <div class=\"toolbar-left\">\r\n <NInput\r\n v-if=\"searchable\"\r\n v-model:value=\"internalSearchPattern\"\r\n :placeholder=\"searchPlaceholder\"\r\n clearable\r\n class=\"search-input\"\r\n >\r\n <template #prefix>\r\n <C_Icon name=\"mdi:magnify\" :size=\"16\" />\r\n </template>\r\n </NInput>\r\n </div>\r\n <div class=\"toolbar-right\">\r\n <slot name=\"toolbar-actions\">\r\n <NButton v-if=\"addable\" type=\"primary\" @click=\"handleAdd()\">\r\n <template #icon>\r\n <C_Icon name=\"mdi:plus\" :size=\"16\" />\r\n </template>\r\n {{ addText }}\r\n </NButton>\r\n <NButton @click=\"toggleExpandAll\">\r\n <template #icon>\r\n <C_Icon name=\"mdi:file-tree\" :size=\"16\" />\r\n </template>\r\n {{ isAllExpanded ? \"收起全部\" : \"展开全部\" }}\r\n </NButton>\r\n <NButton v-if=\"refreshable\" @click=\"handleRefresh\">\r\n <template #icon>\r\n <C_Icon name=\"mdi:refresh\" :size=\"16\" />\r\n </template>\r\n 刷新\r\n </NButton>\r\n </slot>\r\n </div>\r\n </div>\r\n\r\n <div class=\"c-tree-container\">\r\n <NTree\r\n :data=\"treeData\"\r\n :pattern=\"currentSearchPattern\"\r\n :expanded-keys=\"expandedKeys\"\r\n :selected-keys=\"selectedKeys\"\r\n :draggable=\"draggable\"\r\n :show-line=\"showLine\"\r\n :render-prefix=\"renderPrefix\"\r\n :render-suffix=\"renderSuffix\"\r\n :render-label=\"renderLabel\"\r\n :key-field=\"keyField\"\r\n :label-field=\"labelField\"\r\n :children-field=\"childrenField\"\r\n @update:expanded-keys=\"handleExpandedKeysChange\"\r\n @update:selected-keys=\"handleSelectedKeysChange\"\r\n @drop=\"handleDrop\"\r\n class=\"tree-instance\"\r\n />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { NInput, NButton, NTree } from \"naive-ui\";\r\nimport C_Icon from \"../C_Icon/index.vue\";\r\nimport { useTreeOperations } from \"./composables/useTreeOperations\";\r\nimport type { TreeProps, TreeEmits, TreeExpose } from \"./types\";\r\n\r\ndefineOptions({ name: \"C_Tree\" });\r\n\r\nconst props = withDefaults(defineProps<TreeProps>(), {\r\n mode: \"custom\",\r\n keyField: \"id\",\r\n labelField: \"name\",\r\n childrenField: \"children\",\r\n searchPattern: \"\",\r\n searchable: true,\r\n searchPlaceholder: \"搜索...\",\r\n draggable: false,\r\n showLine: true,\r\n showToolbar: true,\r\n addable: true,\r\n addText: \"新增\",\r\n refreshable: true,\r\n iconField: \"icon\",\r\n iconConfig: () => ({\r\n default: \"mdi:circle-outline\",\r\n typeMap: {},\r\n colorMap: {},\r\n }),\r\n statusConfigs: () => [],\r\n actions: () => [],\r\n defaultExpandAll: false,\r\n defaultExpandedKeys: () => [],\r\n defaultSelectedKeys: () => [],\r\n});\r\n\r\nconst emit = defineEmits<TreeEmits>();\r\n\r\nconst {\r\n internalSearchPattern,\r\n expandedKeys,\r\n selectedKeys,\r\n isAllExpanded,\r\n treeData,\r\n currentSearchPattern,\r\n renderPrefix,\r\n renderLabel,\r\n renderSuffix,\r\n toggleExpandAll,\r\n handleExpandedKeysChange,\r\n handleSelectedKeysChange,\r\n handleDrop,\r\n handleAdd,\r\n handleRefresh,\r\n expose,\r\n} = useTreeOperations(props, emit);\r\n\r\ndefineExpose<TreeExpose>(expose);\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-27\r\n * @Description: 树型组件 — 薄 UI 壳,逻辑由 useTreeOperations 驱动\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-tree\">\r\n <div v-if=\"showToolbar\" class=\"c-tree-toolbar\">\r\n <div class=\"toolbar-left\">\r\n <NInput\r\n v-if=\"searchable\"\r\n v-model:value=\"internalSearchPattern\"\r\n :placeholder=\"searchPlaceholder\"\r\n clearable\r\n class=\"search-input\"\r\n >\r\n <template #prefix>\r\n <C_Icon name=\"mdi:magnify\" :size=\"16\" />\r\n </template>\r\n </NInput>\r\n </div>\r\n <div class=\"toolbar-right\">\r\n <slot name=\"toolbar-actions\">\r\n <NButton v-if=\"addable\" type=\"primary\" @click=\"handleAdd()\">\r\n <template #icon>\r\n <C_Icon name=\"mdi:plus\" :size=\"16\" />\r\n </template>\r\n {{ addText }}\r\n </NButton>\r\n <NButton @click=\"toggleExpandAll\">\r\n <template #icon>\r\n <C_Icon name=\"mdi:file-tree\" :size=\"16\" />\r\n </template>\r\n {{ isAllExpanded ? \"收起全部\" : \"展开全部\" }}\r\n </NButton>\r\n <NButton v-if=\"refreshable\" @click=\"handleRefresh\">\r\n <template #icon>\r\n <C_Icon name=\"mdi:refresh\" :size=\"16\" />\r\n </template>\r\n 刷新\r\n </NButton>\r\n </slot>\r\n </div>\r\n </div>\r\n\r\n <div class=\"c-tree-container\">\r\n <NTree\r\n :data=\"treeData\"\r\n :pattern=\"currentSearchPattern\"\r\n :expanded-keys=\"expandedKeys\"\r\n :selected-keys=\"selectedKeys\"\r\n :draggable=\"draggable\"\r\n :show-line=\"showLine\"\r\n :render-prefix=\"renderPrefix\"\r\n :render-suffix=\"renderSuffix\"\r\n :render-label=\"renderLabel\"\r\n :key-field=\"keyField\"\r\n :label-field=\"labelField\"\r\n :children-field=\"childrenField\"\r\n @update:expanded-keys=\"handleExpandedKeysChange\"\r\n @update:selected-keys=\"handleSelectedKeysChange\"\r\n @drop=\"handleDrop\"\r\n class=\"tree-instance\"\r\n />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { NInput, NButton, NTree } from \"naive-ui\";\r\nimport C_Icon from \"../C_Icon/index.vue\";\r\nimport { useTreeOperations } from \"./composables/useTreeOperations\";\r\nimport type { TreeProps, TreeEmits, TreeExpose } from \"./types\";\r\n\r\ndefineOptions({ name: \"C_Tree\" });\r\n\r\nconst props = withDefaults(defineProps<TreeProps>(), {\r\n mode: \"custom\",\r\n keyField: \"id\",\r\n labelField: \"name\",\r\n childrenField: \"children\",\r\n searchPattern: \"\",\r\n searchable: true,\r\n searchPlaceholder: \"搜索...\",\r\n draggable: false,\r\n showLine: true,\r\n showToolbar: true,\r\n addable: true,\r\n addText: \"新增\",\r\n refreshable: true,\r\n iconField: \"icon\",\r\n iconConfig: () => ({\r\n default: \"mdi:circle-outline\",\r\n typeMap: {},\r\n colorMap: {},\r\n }),\r\n statusConfigs: () => [],\r\n actions: () => [],\r\n defaultExpandAll: false,\r\n defaultExpandedKeys: () => [],\r\n defaultSelectedKeys: () => [],\r\n});\r\n\r\nconst emit = defineEmits<TreeEmits>();\r\n\r\nconst {\r\n internalSearchPattern,\r\n expandedKeys,\r\n selectedKeys,\r\n isAllExpanded,\r\n treeData,\r\n currentSearchPattern,\r\n renderPrefix,\r\n renderLabel,\r\n renderSuffix,\r\n toggleExpandAll,\r\n handleExpandedKeysChange,\r\n handleSelectedKeysChange,\r\n handleDrop,\r\n handleAdd,\r\n handleRefresh,\r\n expose,\r\n} = useTreeOperations(props, emit);\r\n\r\ndefineExpose<TreeExpose>(expose);\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-27\r\n * @Description: 树型组件 — 薄 UI 壳,逻辑由 useTreeOperations 驱动\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-tree\">\r\n <div v-if=\"showToolbar\" class=\"c-tree-toolbar\">\r\n <div class=\"toolbar-left\">\r\n <NInput\r\n v-if=\"searchable\"\r\n v-model:value=\"internalSearchPattern\"\r\n :placeholder=\"searchPlaceholder\"\r\n clearable\r\n class=\"search-input\"\r\n >\r\n <template #prefix>\r\n <C_Icon name=\"mdi:magnify\" :size=\"16\" />\r\n </template>\r\n </NInput>\r\n </div>\r\n <div class=\"toolbar-right\">\r\n <slot name=\"toolbar-actions\">\r\n <NButton v-if=\"addable\" type=\"primary\" @click=\"handleAdd()\">\r\n <template #icon>\r\n <C_Icon name=\"mdi:plus\" :size=\"16\" />\r\n </template>\r\n {{ addText }}\r\n </NButton>\r\n <NButton @click=\"toggleExpandAll\">\r\n <template #icon>\r\n <C_Icon name=\"mdi:file-tree\" :size=\"16\" />\r\n </template>\r\n {{ isAllExpanded ? \"收起全部\" : \"展开全部\" }}\r\n </NButton>\r\n <NButton v-if=\"refreshable\" @click=\"handleRefresh\">\r\n <template #icon>\r\n <C_Icon name=\"mdi:refresh\" :size=\"16\" />\r\n </template>\r\n 刷新\r\n </NButton>\r\n </slot>\r\n </div>\r\n </div>\r\n\r\n <div class=\"c-tree-container\">\r\n <NTree\r\n :data=\"treeData\"\r\n :pattern=\"currentSearchPattern\"\r\n :expanded-keys=\"expandedKeys\"\r\n :selected-keys=\"selectedKeys\"\r\n :draggable=\"draggable\"\r\n :show-line=\"showLine\"\r\n :render-prefix=\"renderPrefix\"\r\n :render-suffix=\"renderSuffix\"\r\n :render-label=\"renderLabel\"\r\n :key-field=\"keyField\"\r\n :label-field=\"labelField\"\r\n :children-field=\"childrenField\"\r\n @update:expanded-keys=\"handleExpandedKeysChange\"\r\n @update:selected-keys=\"handleSelectedKeysChange\"\r\n @drop=\"handleDrop\"\r\n class=\"tree-instance\"\r\n />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { NInput, NButton, NTree } from \"naive-ui\";\r\nimport C_Icon from \"../C_Icon/index.vue\";\r\nimport { useTreeOperations } from \"./composables/useTreeOperations\";\r\nimport type { TreeProps, TreeEmits, TreeExpose } from \"./types\";\r\n\r\ndefineOptions({ name: \"C_Tree\" });\r\n\r\nconst props = withDefaults(defineProps<TreeProps>(), {\r\n mode: \"custom\",\r\n keyField: \"id\",\r\n labelField: \"name\",\r\n childrenField: \"children\",\r\n searchPattern: \"\",\r\n searchable: true,\r\n searchPlaceholder: \"搜索...\",\r\n draggable: false,\r\n showLine: true,\r\n showToolbar: true,\r\n addable: true,\r\n addText: \"新增\",\r\n refreshable: true,\r\n iconField: \"icon\",\r\n iconConfig: () => ({\r\n default: \"mdi:circle-outline\",\r\n typeMap: {},\r\n colorMap: {},\r\n }),\r\n statusConfigs: () => [],\r\n actions: () => [],\r\n defaultExpandAll: false,\r\n defaultExpandedKeys: () => [],\r\n defaultSelectedKeys: () => [],\r\n});\r\n\r\nconst emit = defineEmits<TreeEmits>();\r\n\r\nconst {\r\n internalSearchPattern,\r\n expandedKeys,\r\n selectedKeys,\r\n isAllExpanded,\r\n treeData,\r\n currentSearchPattern,\r\n renderPrefix,\r\n renderLabel,\r\n renderSuffix,\r\n toggleExpandAll,\r\n handleExpandedKeysChange,\r\n handleSelectedKeysChange,\r\n handleDrop,\r\n handleAdd,\r\n handleRefresh,\r\n expose,\r\n} = useTreeOperations(props, emit);\r\n\r\ndefineExpose<TreeExpose>(expose);\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n"],"mappings":";;;;;;AAEA,MAAa,gBAAsD;CACjE,MAAM;EACJ,WAAW;EACX,UAAU;EACV,YAAY,EACV,SAAS;GACP,WAAW;GACX,MAAM;GACN,QAAQ;GACT,EACF;EACD,SAAS;GACP;IAAE,KAAK;IAAO,MAAM;IAAS,MAAM;IAAY,MAAM;IAAW;GAChE;IAAE,KAAK;IAAQ,MAAM;IAAM,MAAM;IAAc,MAAM;IAAQ;GAC7D;IACE,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,SAAS;IACV;GACF;EACF;CACD,MAAM;EACJ,WAAW;EACX,UAAU;EACV,YAAY,EACV,SAAS;GACP,QAAQ;GACR,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;GACR,EACF;EACD,SAAS;GACP;IAAE,KAAK;IAAQ,MAAM;IAAM,MAAM;IAAmB,MAAM;IAAW;GACrE;IAAE,KAAK;IAAU,MAAM;IAAO,MAAM;IAAkB,MAAM;IAAQ;GACpE;IACE,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,SAAS;IACV;GACF;EACF;CACD,KAAK;EACH,WAAW;EACX,UAAU;EACV,YAAY,EACV,SAAS;GACP,YAAY;GACZ,MAAM;GACN,SAAS;GACV,EACF;EACD,SAAS,CACP;GAAE,KAAK;GAAO,MAAM;GAAQ,MAAM;GAAY,MAAM;GAAW,EAC/D;GAAE,KAAK;GAAQ,MAAM;GAAM,MAAM;GAAc,MAAM;GAAQ,CAC9D;EACF;CACD,QAAQ,EAAE;CACX;;;;ACzCD,SAAgB,kBAAkB,OAAkB,MAAc;CAChE,MAAM,wBAAwB,IAAI,GAAG;CACrC,MAAM,eAAe,IACnB,MAAM,uBAAuB,EAAE,CAChC;CACD,MAAM,eAAe,IACnB,MAAM,uBAAuB,EAAE,CAChC;CACD,MAAM,gBAAgB,IAAI,MAAM,oBAAoB,MAAM;CAE1D,MAAM,WAAW,eAAe,MAAM,YAAY,KAAK;CACvD,MAAM,aAAa,eAAe,MAAM,cAAc,OAAO;CAC7D,MAAM,gBAAgB,eAAe,MAAM,iBAAiB,WAAW;CACvE,MAAM,YAAY,eAAe,MAAM,aAAa,OAAO;CAE3D,MAAM,eAAe,eAAe;EAClC,MAAM,SAAS,cAAc,MAAM,QAAQ,aAAa,EAAE;AAC1D,SAAO;GACL,GAAG;GACH,GAAG;GACH,YAAY;IAAE,GAAG,OAAO;IAAY,GAAG,MAAM;IAAY;GACzD,SAAS,MAAM,SAAS,SAAS,MAAM,UAAU,OAAO,WAAW,EAAE;GACtE;GACD;CAEF,MAAM,WAAW,eAA6B,MAAM,KAAqB;CAEzE,MAAM,uBAAuB,eACrB,MAAM,iBAAiB,sBAAsB,MACpD;CAED,MAAM,eAAe,eAAoC;AACvD,MAAI,aAAa,MAAM,WAAW,EAAG,QAAO;EAC5C,MAAM,YACJ,OACA,OACwB;AACxB,QAAK,MAAM,QAAQ,OAAO;AACxB,QAAI,KAAK,SAAS,WAAW,GAAI,QAAO;AACxC,QAAI,KAAK,cAAc,QAAQ;KAC7B,MAAM,QAAQ,SAAS,KAAK,cAAc,QAAQ,GAAG;AACrD,SAAI,MAAO,QAAO;;;AAGtB,UAAO;;AAET,SAAO,SAAS,MAAM,MAAM,aAAa,MAAM,GAAG;GAClD;CAEF,MAAM,cAAc,UAA+C;EACjE,MAAM,OAA4B,EAAE;AACpC,QAAM,SAAS,SAAS;AACtB,QAAK,KAAK,KAAK,SAAS,OAAO;AAC/B,OAAI,KAAK,cAAc,OACrB,MAAK,KAAK,GAAG,WAAW,KAAK,cAAc,OAAO,CAAC;IAErD;AACF,SAAO;;CAGT,MAAM,eAAe,SAA+B;EAClD,MAAM,SAAS,aAAa,MAAM;AAClC,MAAI,KAAK,UAAU,OAAQ,QAAO,KAAK,UAAU;AACjD,MAAI,KAAK,QAAQ,OAAO,UAAU,KAAK,MACrC,QAAO,OAAO,QAAQ,KAAK;AAC7B,SAAO,OAAO,WAAW;;CAG3B,MAAM,oBAAoB,SAA+B;EACvD,MAAM,SAAS,aAAa,MAAM;AAClC,MAAI,KAAK,QAAQ,OAAO,WAAW,KAAK,MACtC,QAAO,OAAO,SAAS,KAAK;AAC9B,SAAO;;CAGT,MAAM,gBAAgB,EAAE,aAAqC;EAC3D,MAAM,OAAO;AACb,SAAO,EAAEA,gBAAQ;GACf,MAAM,YAAY,KAAK;GACvB,MAAM;GACN,OAAO,iBAAiB,KAAK;GAC7B,OAAO;GACR,CAAC;;CAGJ,MAAM,eAAe,EAAE,aAAqC;EAC1D,MAAM,OAAO;EACb,MAAM,aACJ,MAAM,eACF,KAAK,WAAW;GAChB,MAAM,QAAQ,KAAK,OAAO;GAC1B,MAAM,eAAe,OAAO,OAAO;AACnC,OAAI,CAAC,cAAc,KAAM,QAAO;AAChC,UAAO,EACL,MACA;IACE,MAAM,aAAa;IACnB,MAAM;IACN,OAAO;IACP,OAAO,EAAE,UAAU,QAAQ;IAC5B,EACD,EAAE,eAAe,aAAa,MAAM,CACrC;IACD,CACD,OAAO,QAAQ,IAAI,EAAE;AAE1B,SAAO,EACL,OACA;GACE,OAAO;GACP,OAAO,EAAE,YAAY,OAAO;GAC7B,EACD,CACE,EACE,QACA,EAAE,OAAO,4BAA4B,EACrC,KAAK,WAAW,OACjB,EACD,GAAG,WACJ,CACF;;CAGH,MAAM,gBAAgB,EAAE,aAAqC;EAC3D,MAAM,OAAO;EAGb,MAAM,iBAFU,aAAa,MAAM,WAAW,EAAE,EAG7C,QAAQ,WAAW,CAAC,OAAO,QAAQ,OAAO,KAAK,KAAK,CAAC,CACrD,KAAK,WAAW;GACf,MAAM,cAAc;IAClB,MAAM;IACN,MAAM,OAAO,QAAS;IACtB,WAAW;IACX,OAAO;KAAE,SAAS;KAAW,UAAU;KAAQ,QAAQ;KAAQ;IAC/D,UAAU,MAAa;AACrB,OAAE,iBAAiB;AACnB,sBAAiB,OAAO,KAAK,KAAK;;IAErC;GACD,MAAM,SAAS,EAAEA,gBAAQ;IACvB,MAAM,OAAO;IACb,MAAM;IACN,OAAO,OAAO;IACf,CAAC;AAEF,OAAI,OAAO,QACT,QAAO,EACL,aACA,EAAE,uBAAuB,iBAAiB,OAAO,KAAK,KAAK,EAAE,EAC7D;IACE,eACE,EACE,SACA;KACE,GAAG;KACH,UAAU,MAAa,EAAE,iBAAiB;KAC3C,EACD,EAAE,YAAY,QAAQ,CACvB;IACH,eAAe,OAAO;IACvB,CACF;AAEH,UAAO,EAAE,SAAS,aAAa,EAAE,YAAY,QAAQ,CAAC;IACtD;AAEJ,SAAO,EACL,OACA;GACE,OAAO;GACP,OAAO;IACL,SAAS;IACT,YAAY;IACZ,YAAY;IACZ,SAAS;IACT,YAAY;IACb;GACF,EACD,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,EAAE,EAAE,eAAe,eAAe,CAAC,CAAC,CAC3D;;CAGH,MAAM,wBAA8B;AAClC,MAAI,cAAc,OAAO;AACvB,gBAAa,QAAQ,EAAE;AACvB,iBAAc,QAAQ;SACjB;AACL,gBAAa,QAAQ,WAAW,MAAM,KAAK;AAC3C,iBAAc,QAAQ;;;CAI1B,MAAM,4BAA4B,SAAoC;AACpE,eAAa,QAAQ;AACrB,gBAAc,QAAQ,KAAK,WAAW,WAAW,MAAM,KAAK,CAAC;;CAG/D,MAAM,4BAA4B,SAAoC;AACpE,eAAa,QAAQ;AACrB,OAAK,eAAe,aAAa,OAAO,KAAK;;CAG/C,MAAM,cAAc,SAAyB,KAAK,aAAa,KAAK;CAEpE,MAAM,oBAAoB,QAAgB,SAA6B;AACrE,MAAI,WAAW,MACb,MAAK,OAAO,KAAK;MAEjB,MAAK,eAAe,QAAQ,KAAK;;CAIrC,MAAM,kBAAwB,KAAK,MAAM;CACzC,MAAM,sBAA4B,KAAK,UAAU;AAmBjD,QAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,QAjCyB;GACzB,iBAAiB;AACf,iBAAa,QAAQ,WAAW,MAAM,KAAK;AAC3C,kBAAc,QAAQ;;GAExB,mBAAmB;AACjB,iBAAa,QAAQ,EAAE;AACvB,kBAAc,QAAQ;;GAExB,aAAa,QAAyB;AACpC,iBAAa,QAAQ,CAAC,IAAI;;GAE5B,uBAAuB,aAAa;GACpC;GACA;GACD;EAmBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EEvKH,MAAM,EACJ,uBACA,cACA,cACA,eACA,UACA,sBACA,cACA,aACA,cACA,iBACA,0BACA,0BACA,YACA,WACA,eACA,WACE,kBA9CU,SA2BD,OAmBqB;AAElC,WAAyB,OAAO;;uBAtH9B,mBA2DM,OA3DN,YA2DM,CA1DOC,KAAAA,4BAAX,mBAoCM,OApCN,YAoCM,CAnCJ,mBAYM,OAZN,YAYM,CAVIC,KAAAA,2BADR,YAUS,MAAA,OAAA,EAAA;;IARC,OAAO,MAAA,sBAAqB;2FAArB,sBAAqB,QAAA,SAAA;IACnC,aAAaC,KAAAA;IACd,WAAA;IACA,OAAM;;IAEK,QAAM,cACyB,CAAxC,YAAwC,gBAAA;KAAhC,MAAK;KAAe,MAAM;;;0EAIxC,mBAqBM,OArBN,YAqBM,CApBJ,WAmBO,KAAA,QAAA,mBAAA,EAAA,QAAA;IAlBUC,KAAAA,wBAAf,YAKU,MAAA,QAAA,EAAA;;KALc,MAAK;KAAW,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,MAAA,UAAS,EAAA;;KAC3C,MAAI,cACwB,CAArC,YAAqC,gBAAA;MAA7B,MAAK;MAAY,MAAM;;4BAEjC,iBADW,MACX,gBAAGC,KAAAA,QAAO,EAAA,EAAA;;;IAEZ,YAKU,MAAA,QAAA,EAAA,EALA,SAAO,MAAA,gBAAe,EAAA,EAAA;KACnB,MAAI,cAC6B,CAA1C,YAA0C,gBAAA;MAAlC,MAAK;MAAiB,MAAM;;4BAEtC,iBADW,MACX,gBAAG,MAAA,cAAa,GAAA,SAAA,OAAA,EAAA,EAAA;;;IAEHC,KAAAA,4BAAf,YAKU,MAAA,QAAA,EAAA;;KALmB,SAAO,MAAA,cAAA;;KACvB,MAAI,cAC2B,CAAxC,YAAwC,gBAAA;MAAhC,MAAK;MAAe,MAAM;;4BAGtC,2CAFa,QAEb,GAAA;;;;qDAKN,mBAmBM,OAnBN,YAmBM,CAlBJ,YAiBE,MAAA,MAAA,EAAA;IAhBC,MAAM,MAAA,SAAQ;IACd,SAAS,MAAA,qBAAoB;IAC7B,iBAAe,MAAA,aAAY;IAC3B,iBAAe,MAAA,aAAY;IAC3B,WAAWC,KAAAA;IACX,aAAWC,KAAAA;IACX,iBAAe,MAAA,aAAY;IAC3B,iBAAe,MAAA,aAAY;IAC3B,gBAAc,MAAA,YAAW;IACzB,aAAWC,KAAAA;IACX,eAAaC,KAAAA;IACb,kBAAgBC,KAAAA;IAChB,yBAAsB,MAAA,yBAAwB;IAC9C,yBAAsB,MAAA,yBAAwB;IAC9C,QAAM,MAAA,WAAU;IACjB,OAAM"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"C_Upload-i8LB_29U.css","names":[],"sources":["../src/components/C_Upload/components/UploadArea.vue?vue&type=style&index=0&scoped=f5040f9e&lang.scss","../src/components/C_Upload/components/FileList.vue?vue&type=style&index=0&scoped=09e1ee73&lang.scss","../src/components/C_Upload/components/ImagePreview.vue?vue&type=style&index=0&scoped=f6e701f9&lang.scss","../src/components/C_Upload/index.vue?vue&type=style&index=0&scoped=16d64550&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled */.upload-area[data-v-f5040f9e] {\n position: relative;\n box-sizing: border-box;\n padding: 32px 24px;\n border: 2px dashed var(--border-color);\n border-radius: 10px;\n cursor: pointer;\n background: var(--card-color);\n transition: all 0.25s ease;\n text-align: center;\n}\n.upload-area[data-v-f5040f9e]:hover:not(.upload-area--disabled) {\n border-color: var(--primary-color);\n background: color-mix(in srgb, var(--primary-color) 4%, var(--card-color));\n}\n.upload-area--drag-over[data-v-f5040f9e] {\n border-color: var(--primary-color);\n border-style: solid;\n background: color-mix(in srgb, var(--primary-color) 8%, var(--card-color));\n}\n.upload-area--drag-over .upload-area__icon[data-v-f5040f9e] {\n color: var(--primary-color);\n transform: scale(1.1);\n}\n.upload-area--disabled[data-v-f5040f9e] {\n cursor: not-allowed;\n opacity: 0.5;\n}\n.upload-area__input[data-v-f5040f9e] {\n display: none;\n}\n.upload-area__default[data-v-f5040f9e] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n align-items: center;\n}\n.upload-area__icon[data-v-f5040f9e] {\n font-size: 48px;\n color: var(--text-color-3);\n transition: all 0.25s ease;\n}\n.upload-area__text[data-v-f5040f9e] {\n font-size: 14px;\n color: var(--text-color-2);\n line-height: 1.6;\n}\n.upload-area__text kbd[data-v-f5040f9e] {\n padding: 1px 5px;\n font-size: 12px;\n border: 1px solid var(--border-color);\n border-radius: 3px;\n background: var(--body-color);\n}\n.upload-area__tip[data-v-f5040f9e] {\n font-size: 12px;\n color: var(--text-color-4);\n}","/* unplugin-vue-components disabled */.file-list[data-v-09e1ee73] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 12px;\n}\n.file-list__item[data-v-09e1ee73] {\n display: flex;\n gap: 12px;\n align-items: flex-start;\n padding: 10px 12px;\n border-radius: 8px;\n border: 1px solid var(--border-color);\n background: var(--card-color);\n transition: all 0.25s ease;\n}\n.file-list__item[data-v-09e1ee73]:hover {\n border-color: color-mix(in srgb, var(--primary-color) 40%, var(--border-color));\n box-shadow: 0 1px 6px rgba(0, 0, 0, 0.04);\n}\n.file-list__item--error[data-v-09e1ee73] {\n border-color: var(--error-color);\n background: color-mix(in srgb, var(--error-color) 4%, var(--card-color));\n}\n.file-list__item--success[data-v-09e1ee73], .file-list__item--instant[data-v-09e1ee73] {\n border-color: color-mix(in srgb, var(--success-color) 30%, var(--border-color));\n}\n.file-list__thumb[data-v-09e1ee73] {\n flex-shrink: 0;\n width: 40px;\n height: 40px;\n border-radius: 6px;\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--body-color);\n}\n.file-list__thumb-img[data-v-09e1ee73] {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n.file-list__thumb-icon[data-v-09e1ee73] {\n font-size: 22px;\n color: var(--text-color-3);\n}\n.file-list__info[data-v-09e1ee73] {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n.file-list__name[data-v-09e1ee73] {\n font-size: 13px;\n font-weight: 500;\n color: var(--text-color-1);\n}\n.file-list__meta[data-v-09e1ee73] {\n display: flex;\n gap: 8px;\n align-items: center;\n font-size: 12px;\n}\n.file-list__size[data-v-09e1ee73] {\n color: var(--text-color-3);\n}\n.file-list__instant[data-v-09e1ee73] {\n font-size: 14px;\n}\n.file-list__chunk-info[data-v-09e1ee73] {\n font-size: 11px;\n color: var(--text-color-4);\n}\n.file-list__error[data-v-09e1ee73] {\n font-size: 12px;\n color: var(--error-color);\n}\n.file-list__actions[data-v-09e1ee73] {\n flex-shrink: 0;\n display: flex;\n gap: 4px;\n align-items: center;\n}\n\n/* ─── 过渡动画 ─────────────────────────────── */\n.file-list-enter-active[data-v-09e1ee73],\n.file-list-leave-active[data-v-09e1ee73] {\n transition: all 0.3s ease;\n}\n.file-list-enter-from[data-v-09e1ee73] {\n opacity: 0;\n transform: translateX(-20px);\n}\n.file-list-leave-to[data-v-09e1ee73] {\n opacity: 0;\n transform: translateX(20px);\n}\n.file-list-move[data-v-09e1ee73] {\n transition: transform 0.3s ease;\n}","/* unplugin-vue-components disabled */.image-preview[data-v-f6e701f9] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));\n gap: 10px;\n margin-top: 12px;\n /* 上传中始终显示遮罩 */\n}\n.image-preview__item[data-v-f6e701f9] {\n position: relative;\n aspect-ratio: 1;\n border-radius: 8px;\n overflow: hidden;\n border: 1px solid var(--border-color);\n background: var(--body-color);\n}\n.image-preview__item--error[data-v-f6e701f9] {\n border-color: var(--error-color);\n}\n.image-preview__item--success[data-v-f6e701f9], .image-preview__item--instant[data-v-f6e701f9] {\n border-color: color-mix(in srgb, var(--success-color) 30%, var(--border-color));\n}\n.image-preview__item:hover .image-preview__overlay[data-v-f6e701f9] {\n opacity: 1;\n}\n.image-preview__img[data-v-f6e701f9] {\n display: block;\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n.image-preview__overlay[data-v-f6e701f9] {\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 8px;\n background: rgba(0, 0, 0, 0.45);\n opacity: 0;\n transition: opacity 0.2s ease;\n}\n.image-preview__item--uploading .image-preview__overlay[data-v-f6e701f9], .image-preview__item--hashing .image-preview__overlay[data-v-f6e701f9], .image-preview__item--error .image-preview__overlay[data-v-f6e701f9] {\n opacity: 1;\n}\n.image-preview__progress[data-v-f6e701f9] .n-progress {\n --n-fill-color: #fff;\n}\n.image-preview__status-icon[data-v-f6e701f9] {\n font-size: 28px;\n}\n.image-preview__status-icon--success[data-v-f6e701f9] {\n color: var(--success-color);\n}\n.image-preview__status-icon--error[data-v-f6e701f9] {\n color: var(--error-color);\n}\n.image-preview__actions[data-v-f6e701f9] {\n display: flex;\n gap: 6px;\n}\n.image-preview__name[data-v-f6e701f9] {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n padding: 2px 6px;\n font-size: 11px;\n color: #fff;\n background: linear-gradient(transparent, rgba(0, 0, 0, 0.6));\n text-align: center;\n}","/* unplugin-vue-components disabled */.c-upload[data-v-16d64550] {\n width: 100%;\n}\n.c-upload__total-progress[data-v-16d64550] {\n margin-top: 12px;\n padding: 8px 12px;\n border-radius: 8px;\n background: var(--body-color);\n border: 1px solid var(--border-color);\n}\n.c-upload__total-label[data-v-16d64550] {\n display: flex;\n justify-content: space-between;\n margin-bottom: 6px;\n font-size: 12px;\n color: var(--text-color-3);\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;ACzDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;ACrGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
|
package/dist/C_Upload2.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { t as C_Icon_default } from "./C_Icon2.js";
|
|
2
2
|
import { t as export_helper_default } from "./export-helper.js";
|
|
3
|
-
import { Fragment, TransitionGroup, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, onBeforeUnmount, onMounted, openBlock, reactive, readonly, ref, renderList, renderSlot, toDisplayString, unref, watch, withCtx } from "vue";
|
|
4
3
|
import { NButton, NEllipsis, NProgress, NTag } from "naive-ui";
|
|
4
|
+
import { Fragment, TransitionGroup, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, onBeforeUnmount, onMounted, openBlock, reactive, readonly, ref, renderList, renderSlot, toDisplayString, unref, watch, withCtx } from "vue";
|
|
5
5
|
|
|
6
6
|
//#region src/components/C_Upload/constants.ts
|
|
7
7
|
/**
|
|
@@ -994,7 +994,7 @@ var UploadArea_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ def
|
|
|
994
994
|
|
|
995
995
|
//#endregion
|
|
996
996
|
//#region src/components/C_Upload/components/UploadArea.vue
|
|
997
|
-
var UploadArea_default = /* @__PURE__ */ export_helper_default(UploadArea_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-
|
|
997
|
+
var UploadArea_default = /* @__PURE__ */ export_helper_default(UploadArea_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-f5040f9e"]]);
|
|
998
998
|
|
|
999
999
|
//#endregion
|
|
1000
1000
|
//#region src/components/C_Upload/components/FileList.vue?vue&type=script&setup=true&lang.ts
|
|
@@ -1110,7 +1110,7 @@ var FileList_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defin
|
|
|
1110
1110
|
|
|
1111
1111
|
//#endregion
|
|
1112
1112
|
//#region src/components/C_Upload/components/FileList.vue
|
|
1113
|
-
var FileList_default = /* @__PURE__ */ export_helper_default(FileList_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-
|
|
1113
|
+
var FileList_default = /* @__PURE__ */ export_helper_default(FileList_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-09e1ee73"]]);
|
|
1114
1114
|
|
|
1115
1115
|
//#endregion
|
|
1116
1116
|
//#region src/components/C_Upload/components/ImagePreview.vue?vue&type=script&setup=true&lang.ts
|
|
@@ -1196,7 +1196,7 @@ var ImagePreview_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ d
|
|
|
1196
1196
|
|
|
1197
1197
|
//#endregion
|
|
1198
1198
|
//#region src/components/C_Upload/components/ImagePreview.vue
|
|
1199
|
-
var ImagePreview_default = /* @__PURE__ */ export_helper_default(ImagePreview_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-
|
|
1199
|
+
var ImagePreview_default = /* @__PURE__ */ export_helper_default(ImagePreview_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-f6e701f9"]]);
|
|
1200
1200
|
|
|
1201
1201
|
//#endregion
|
|
1202
1202
|
//#region src/components/C_Upload/index.vue?vue&type=script&setup=true&lang.ts
|
|
@@ -1381,7 +1381,7 @@ var index_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineCo
|
|
|
1381
1381
|
|
|
1382
1382
|
//#endregion
|
|
1383
1383
|
//#region src/components/C_Upload/index.vue
|
|
1384
|
-
var C_Upload_default = /* @__PURE__ */ export_helper_default(index_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-
|
|
1384
|
+
var C_Upload_default = /* @__PURE__ */ export_helper_default(index_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-16d64550"]]);
|
|
1385
1385
|
|
|
1386
1386
|
//#endregion
|
|
1387
1387
|
export { useChunkUpload as a, getFileIcon as c, useUploadQueue as i, useDragDrop as n, useFileHash as o, useUploadCore as r, formatFileSize as s, C_Upload_default as t };
|