@robot-admin/naive-ui-components 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +257 -0
- package/dist/C_ActionBar-DWN-woTc.css.map +1 -0
- package/dist/C_ActionBar.cjs +5 -0
- package/dist/C_ActionBar.d.cts +2 -0
- package/dist/C_ActionBar.d.ts +2 -0
- package/dist/C_ActionBar.js +4 -0
- package/dist/C_ActionBar2.js +196 -0
- package/dist/C_ActionBar2.js.map +1 -0
- package/dist/C_AntV-AFKyK6hH.css.map +1 -0
- package/dist/C_AntV.cjs +8 -0
- package/dist/C_AntV.d.cts +2 -0
- package/dist/C_AntV.d.ts +2 -0
- package/dist/C_AntV.js +4 -0
- package/dist/C_AntV2.js +3150 -0
- package/dist/C_AntV2.js.map +1 -0
- package/dist/C_Barcode-P_EFj8dC.css.map +1 -0
- package/dist/C_Barcode.cjs +4 -0
- package/dist/C_Barcode.d.cts +2 -0
- package/dist/C_Barcode.d.ts +2 -0
- package/dist/C_Barcode.js +3 -0
- package/dist/C_Barcode2.js +68 -0
- package/dist/C_Barcode2.js.map +1 -0
- package/dist/C_Captcha-C-ef41xw.css.map +1 -0
- package/dist/C_Captcha.cjs +4 -0
- package/dist/C_Captcha.d.cts +2 -0
- package/dist/C_Captcha.d.ts +2 -0
- package/dist/C_Captcha.js +3 -0
- package/dist/C_Captcha2.js +155 -0
- package/dist/C_Captcha2.js.map +1 -0
- package/dist/C_Cascade-D9kNsjsV.css.map +1 -0
- package/dist/C_Cascade.cjs +4 -0
- package/dist/C_Cascade.d.cts +2 -0
- package/dist/C_Cascade.d.ts +2 -0
- package/dist/C_Cascade.js +3 -0
- package/dist/C_Cascade2.js +103 -0
- package/dist/C_Cascade2.js.map +1 -0
- package/dist/C_City-BCQ4ipiK.css.map +1 -0
- package/dist/C_City.cjs +4 -0
- package/dist/C_City.d.cts +2 -0
- package/dist/C_City.d.ts +2 -0
- package/dist/C_City.js +3 -0
- package/dist/C_City2.js +841 -0
- package/dist/C_City2.js.map +1 -0
- package/dist/C_Code-C9kvvEmO.css.map +1 -0
- package/dist/C_Code.cjs +5 -0
- package/dist/C_Code.d.cts +2 -0
- package/dist/C_Code.d.ts +2 -0
- package/dist/C_Code.js +4 -0
- package/dist/C_Code2.js +346 -0
- package/dist/C_Code2.js.map +1 -0
- package/dist/C_CollapsePanel-BUJHuYcU.css.map +1 -0
- package/dist/C_CollapsePanel.cjs +6 -0
- package/dist/C_CollapsePanel.d.cts +2 -0
- package/dist/C_CollapsePanel.d.ts +2 -0
- package/dist/C_CollapsePanel.js +4 -0
- package/dist/C_CollapsePanel2.js +319 -0
- package/dist/C_CollapsePanel2.js.map +1 -0
- package/dist/C_Cron-yx2Ob4Jl.css.map +1 -0
- package/dist/C_Cron.cjs +15 -0
- package/dist/C_Cron.d.cts +2 -0
- package/dist/C_Cron.d.ts +2 -0
- package/dist/C_Cron.js +4 -0
- package/dist/C_Cron2.js +1209 -0
- package/dist/C_Cron2.js.map +1 -0
- package/dist/C_Date.cjs +4 -0
- package/dist/C_Date.d.cts +2 -0
- package/dist/C_Date.d.ts +2 -0
- package/dist/C_Date.js +3 -0
- package/dist/C_Date2.js +219 -0
- package/dist/C_Date2.js.map +1 -0
- package/dist/C_Draggable-C483syRC.css.map +1 -0
- package/dist/C_Draggable.cjs +5 -0
- package/dist/C_Draggable.d.cts +2 -0
- package/dist/C_Draggable.d.ts +2 -0
- package/dist/C_Draggable.js +3 -0
- package/dist/C_Draggable2.js +295 -0
- package/dist/C_Draggable2.js.map +1 -0
- package/dist/C_Editor-Bp0SyIEw.css.map +1 -0
- package/dist/C_Editor.cjs +4 -0
- package/dist/C_Editor.d.cts +2 -0
- package/dist/C_Editor.d.ts +2 -0
- package/dist/C_Editor.js +3 -0
- package/dist/C_Editor2.js +160 -0
- package/dist/C_Editor2.js.map +1 -0
- package/dist/C_FilePreview-CPqvhoCy.css.map +1 -0
- package/dist/C_FilePreview.cjs +6 -0
- package/dist/C_FilePreview.d.cts +2 -0
- package/dist/C_FilePreview.d.ts +2 -0
- package/dist/C_FilePreview.js +3 -0
- package/dist/C_FilePreview2.js +1031 -0
- package/dist/C_FilePreview2.js.map +1 -0
- package/dist/C_Form-Jx7PY3sT.css.map +1 -0
- package/dist/C_Form.cjs +15 -0
- package/dist/C_Form.d.cts +2 -0
- package/dist/C_Form.d.ts +2 -0
- package/dist/C_Form.js +4 -0
- package/dist/C_Form2.js +2510 -0
- package/dist/C_Form2.js.map +1 -0
- package/dist/C_FormSearch-DvRgxlRn.css.map +1 -0
- package/dist/C_FormSearch.cjs +6 -0
- package/dist/C_FormSearch.d.cts +2 -0
- package/dist/C_FormSearch.d.ts +2 -0
- package/dist/C_FormSearch.js +3 -0
- package/dist/C_FormSearch2.js +356 -0
- package/dist/C_FormSearch2.js.map +1 -0
- package/dist/C_FormulaEditor-DtGkt4T_.css.map +1 -0
- package/dist/C_FormulaEditor.cjs +13 -0
- package/dist/C_FormulaEditor.d.cts +2 -0
- package/dist/C_FormulaEditor.d.ts +2 -0
- package/dist/C_FormulaEditor.js +4 -0
- package/dist/C_FormulaEditor2.js +1433 -0
- package/dist/C_FormulaEditor2.js.map +1 -0
- package/dist/C_FullCalendar-BF7H0YIx.css.map +1 -0
- package/dist/C_FullCalendar.cjs +9 -0
- package/dist/C_FullCalendar.d.cts +2 -0
- package/dist/C_FullCalendar.d.ts +2 -0
- package/dist/C_FullCalendar.js +3 -0
- package/dist/C_FullCalendar2.js +377 -0
- package/dist/C_FullCalendar2.js.map +1 -0
- package/dist/C_Guide.cjs +4 -0
- package/dist/C_Guide.d.cts +2 -0
- package/dist/C_Guide.d.ts +2 -0
- package/dist/C_Guide.js +3 -0
- package/dist/C_Guide2.js +58 -0
- package/dist/C_Guide2.js.map +1 -0
- package/dist/C_Icon.cjs +4 -0
- package/dist/C_Icon.d.cts +2 -0
- package/dist/C_Icon.d.ts +2 -0
- package/dist/C_Icon.js +3 -0
- package/dist/C_Icon2.js +286 -0
- package/dist/C_Icon2.js.map +1 -0
- package/dist/C_ImageCropper-BVJfUufl.css.map +1 -0
- package/dist/C_ImageCropper.cjs +6 -0
- package/dist/C_ImageCropper.d.cts +2 -0
- package/dist/C_ImageCropper.d.ts +2 -0
- package/dist/C_ImageCropper.js +4 -0
- package/dist/C_ImageCropper2.js +723 -0
- package/dist/C_ImageCropper2.js.map +1 -0
- package/dist/C_Language.cjs +4 -0
- package/dist/C_Language.d.cts +2 -0
- package/dist/C_Language.d.ts +2 -0
- package/dist/C_Language.js +3 -0
- package/dist/C_Language2.js +72 -0
- package/dist/C_Language2.js.map +1 -0
- package/dist/C_Map-DpzeuWdX.css.map +1 -0
- package/dist/C_Map.cjs +7 -0
- package/dist/C_Map.d.cts +2 -0
- package/dist/C_Map.d.ts +2 -0
- package/dist/C_Map.js +3 -0
- package/dist/C_Map2.js +199 -0
- package/dist/C_Map2.js.map +1 -0
- package/dist/C_Markdown-BEjxknqd.css.map +1 -0
- package/dist/C_Markdown.cjs +4 -0
- package/dist/C_Markdown.d.cts +2 -0
- package/dist/C_Markdown.d.ts +2 -0
- package/dist/C_Markdown.js +3 -0
- package/dist/C_Markdown2.js +186 -0
- package/dist/C_Markdown2.js.map +1 -0
- package/dist/C_NotificationCenter-0l3TY2Gn.css.map +1 -0
- package/dist/C_NotificationCenter.cjs +20 -0
- package/dist/C_NotificationCenter.d.cts +2 -0
- package/dist/C_NotificationCenter.d.ts +2 -0
- package/dist/C_NotificationCenter.js +4 -0
- package/dist/C_NotificationCenter2.js +1383 -0
- package/dist/C_NotificationCenter2.js.map +1 -0
- package/dist/C_Progress.cjs +4 -0
- package/dist/C_Progress.d.cts +2 -0
- package/dist/C_Progress.d.ts +2 -0
- package/dist/C_Progress.js +3 -0
- package/dist/C_Progress2.js +103 -0
- package/dist/C_Progress2.js.map +1 -0
- package/dist/C_QRCode-DbdiAIPg.css.map +1 -0
- package/dist/C_QRCode.cjs +5 -0
- package/dist/C_QRCode.d.cts +2 -0
- package/dist/C_QRCode.d.ts +2 -0
- package/dist/C_QRCode.js +3 -0
- package/dist/C_QRCode2.js +218 -0
- package/dist/C_QRCode2.js.map +1 -0
- package/dist/C_Signature-zhHCbra9.css.map +1 -0
- package/dist/C_Signature.cjs +8 -0
- package/dist/C_Signature.d.cts +2 -0
- package/dist/C_Signature.d.ts +2 -0
- package/dist/C_Signature.js +4 -0
- package/dist/C_Signature2.js +618 -0
- package/dist/C_Signature2.js.map +1 -0
- package/dist/C_SplitPane-C6sBsfKY.css.map +1 -0
- package/dist/C_SplitPane.cjs +6 -0
- package/dist/C_SplitPane.d.cts +2 -0
- package/dist/C_SplitPane.d.ts +2 -0
- package/dist/C_SplitPane.js +4 -0
- package/dist/C_SplitPane2.js +356 -0
- package/dist/C_SplitPane2.js.map +1 -0
- package/dist/C_Steps-CODHN5Hs.css.map +1 -0
- package/dist/C_Steps.cjs +4 -0
- package/dist/C_Steps.d.cts +2 -0
- package/dist/C_Steps.d.ts +2 -0
- package/dist/C_Steps.js +3 -0
- package/dist/C_Steps2.js +82 -0
- package/dist/C_Steps2.js.map +1 -0
- package/dist/C_Table-DSNsntmT.css.map +1 -0
- package/dist/C_Table.cjs +19 -0
- package/dist/C_Table.d.cts +2 -0
- package/dist/C_Table.d.ts +2 -0
- package/dist/C_Table.js +5 -0
- package/dist/C_Table2.js +3009 -0
- package/dist/C_Table2.js.map +1 -0
- package/dist/C_Theme.cjs +4 -0
- package/dist/C_Theme.d.cts +2 -0
- package/dist/C_Theme.d.ts +2 -0
- package/dist/C_Theme.js +3 -0
- package/dist/C_Theme2.js +60 -0
- package/dist/C_Theme2.js.map +1 -0
- package/dist/C_Time-BvZLYraL.css.map +1 -0
- package/dist/C_Time.cjs +5 -0
- package/dist/C_Time.d.cts +2 -0
- package/dist/C_Time.d.ts +2 -0
- package/dist/C_Time.js +3 -0
- package/dist/C_Time2.js +199 -0
- package/dist/C_Time2.js.map +1 -0
- package/dist/C_Tree-0GDv--jX.css.map +1 -0
- package/dist/C_Tree.cjs +7 -0
- package/dist/C_Tree.d.cts +2 -0
- package/dist/C_Tree.d.ts +2 -0
- package/dist/C_Tree.js +4 -0
- package/dist/C_Tree2.js +441 -0
- package/dist/C_Tree2.js.map +1 -0
- package/dist/C_Upload-BXd3YYLx.css.map +1 -0
- package/dist/C_Upload.cjs +12 -0
- package/dist/C_Upload.d.cts +2 -0
- package/dist/C_Upload.d.ts +2 -0
- package/dist/C_Upload.js +4 -0
- package/dist/C_Upload2.js +1388 -0
- package/dist/C_Upload2.js.map +1 -0
- package/dist/C_VideoPlayer-DYG3RL0Q.css.map +1 -0
- package/dist/C_VideoPlayer.cjs +23 -0
- package/dist/C_VideoPlayer.d.cts +2 -0
- package/dist/C_VideoPlayer.d.ts +2 -0
- package/dist/C_VideoPlayer.js +3 -0
- package/dist/C_VideoPlayer2.js +1932 -0
- package/dist/C_VideoPlayer2.js.map +1 -0
- package/dist/C_VtableGantt-fhItIiHE.css.map +1 -0
- package/dist/C_VtableGantt.cjs +6 -0
- package/dist/C_VtableGantt.d.cts +2 -0
- package/dist/C_VtableGantt.d.ts +2 -0
- package/dist/C_VtableGantt.js +4 -0
- package/dist/C_VtableGantt2.js +873 -0
- package/dist/C_VtableGantt2.js.map +1 -0
- package/dist/C_WaterFall-8sQDFXKg.css.map +1 -0
- package/dist/C_WaterFall.cjs +13 -0
- package/dist/C_WaterFall.d.cts +2 -0
- package/dist/C_WaterFall.d.ts +2 -0
- package/dist/C_WaterFall.js +3 -0
- package/dist/C_WaterFall2.js +365 -0
- package/dist/C_WaterFall2.js.map +1 -0
- package/dist/C_WorkFlow-J-dyIuh9.css.map +1 -0
- package/dist/C_WorkFlow.cjs +8 -0
- package/dist/C_WorkFlow.d.cts +2 -0
- package/dist/C_WorkFlow.d.ts +2 -0
- package/dist/C_WorkFlow.js +4 -0
- package/dist/C_WorkFlow2.js +1984 -0
- package/dist/C_WorkFlow2.js.map +1 -0
- package/dist/chunk.js +22 -0
- package/dist/city.js +4817 -0
- package/dist/city.js.map +1 -0
- package/dist/constants.d.ts +273 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants2.d.ts +178 -0
- package/dist/constants2.d.ts.map +1 -0
- package/dist/constants3.d.ts +475 -0
- package/dist/constants3.d.ts.map +1 -0
- package/dist/constants4.d.ts +430 -0
- package/dist/constants4.d.ts.map +1 -0
- package/dist/constants5.d.ts +4283 -0
- package/dist/constants5.d.ts.map +1 -0
- package/dist/data.d.ts +67 -0
- package/dist/data.d.ts.map +1 -0
- package/dist/export-helper.js +9 -0
- package/dist/index.cjs +409 -0
- package/dist/index.d.cts +96 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.ts +103 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +230 -0
- package/dist/index.js.map +1 -0
- package/dist/index.vue.d.ts +80 -0
- package/dist/index.vue.d.ts.map +1 -0
- package/dist/index10.vue.d.ts +72 -0
- package/dist/index10.vue.d.ts.map +1 -0
- package/dist/index11.vue.d.ts +26 -0
- package/dist/index11.vue.d.ts.map +1 -0
- package/dist/index12.vue.d.ts +81 -0
- package/dist/index12.vue.d.ts.map +1 -0
- package/dist/index13.vue.d.ts +55 -0
- package/dist/index13.vue.d.ts.map +1 -0
- package/dist/index14.vue.d.ts +33 -0
- package/dist/index14.vue.d.ts.map +1 -0
- package/dist/index15.vue.d.ts +18 -0
- package/dist/index15.vue.d.ts.map +1 -0
- package/dist/index16.vue.d.ts +662 -0
- package/dist/index16.vue.d.ts.map +1 -0
- package/dist/index2.vue.d.ts +38 -0
- package/dist/index2.vue.d.ts.map +1 -0
- package/dist/index3.vue.d.ts +45 -0
- package/dist/index3.vue.d.ts.map +1 -0
- package/dist/index4.vue.d.ts +31 -0
- package/dist/index4.vue.d.ts.map +1 -0
- package/dist/index5.vue.d.ts +35 -0
- package/dist/index5.vue.d.ts.map +1 -0
- package/dist/index6.vue.d.ts +48 -0
- package/dist/index6.vue.d.ts.map +1 -0
- package/dist/index7.vue.d.ts +56 -0
- package/dist/index7.vue.d.ts.map +1 -0
- package/dist/index8.vue.d.ts +41 -0
- package/dist/index8.vue.d.ts.map +1 -0
- package/dist/index9.vue.d.ts +30 -0
- package/dist/index9.vue.d.ts.map +1 -0
- package/dist/storage.js +31 -0
- package/dist/storage.js.map +1 -0
- package/dist/style.css +7725 -0
- package/dist/useCalendarEvents.d.ts +148 -0
- package/dist/useCalendarEvents.d.ts.map +1 -0
- package/dist/useCollapsePanel.d.ts +132 -0
- package/dist/useCollapsePanel.d.ts.map +1 -0
- package/dist/useCropperCore.d.ts +102 -0
- package/dist/useCropperCore.d.ts.map +1 -0
- package/dist/useDraggableLayout.d.ts +194 -0
- package/dist/useDraggableLayout.d.ts.map +1 -0
- package/dist/useDynamicFormState.d.ts +4248 -0
- package/dist/useDynamicFormState.d.ts.map +1 -0
- package/dist/useEdgeInteraction.d.ts +7614 -0
- package/dist/useEdgeInteraction.d.ts.map +1 -0
- package/dist/useFullscreen.d.ts +166 -0
- package/dist/useFullscreen.d.ts.map +1 -0
- package/dist/useInfiniteScroll.d.ts +169 -0
- package/dist/useInfiniteScroll.d.ts.map +1 -0
- package/dist/useModalEdit.d.ts +960 -0
- package/dist/useModalEdit.d.ts.map +1 -0
- package/dist/useQRCode.d.ts +87 -0
- package/dist/useQRCode.d.ts.map +1 -0
- package/dist/useSearchState.d.ts +180 -0
- package/dist/useSearchState.d.ts.map +1 -0
- package/dist/useSignatureHistory.d.ts +189 -0
- package/dist/useSignatureHistory.d.ts.map +1 -0
- package/dist/useSplitResize.d.ts +158 -0
- package/dist/useSplitResize.d.ts.map +1 -0
- package/dist/useTimeSelection.d.ts +105 -0
- package/dist/useTimeSelection.d.ts.map +1 -0
- package/dist/useTreeOperations.d.ts +183 -0
- package/dist/useTreeOperations.d.ts.map +1 -0
- package/dist/useWorkflowValidation.d.ts +1052 -0
- package/dist/useWorkflowValidation.d.ts.map +1 -0
- package/package.json +342 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"C_Barcode-P_EFj8dC.css","names":[],"sources":["../src/components/C_Barcode/index.vue?vue&type=style&index=0&scoped=b87e921b&lang.scss"],"sourcesContent":[".c-barcode[data-v-b87e921b] {\n display: inline-flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n max-width: 100%;\n}\n.c-barcode .barcode-wrapper[data-v-b87e921b] {\n display: inline-block;\n padding: 8px;\n background: #ffffff;\n border-radius: 4px;\n transition: all 0.3s ease;\n overflow: hidden;\n max-width: 100%;\n}\n.c-barcode .barcode-wrapper.with-border[data-v-b87e921b] {\n border: 1px dashed #e0e0e0;\n}\n.c-barcode .barcode-wrapper[data-v-b87e921b]:hover {\n border-color: var(--c-primary, #409eff);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n}\n.c-barcode .barcode-wrapper[data-v-b87e921b] svg {\n max-width: 100%;\n height: auto;\n display: block;\n overflow: visible;\n}\n.c-barcode .barcode-label[data-v-b87e921b] {\n font-size: 14px;\n color: #666;\n text-align: center;\n font-weight: 500;\n word-break: break-all;\n max-width: 100%;\n}"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { t as export_helper_default } from "./export-helper.js";
|
|
2
|
+
import { computed, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, mergeProps, normalizeClass, openBlock, toDisplayString, unref } from "vue";
|
|
3
|
+
import VueBarcode from "@chenfengyuan/vue-barcode";
|
|
4
|
+
|
|
5
|
+
//#region src/components/C_Barcode/index.vue?vue&type=script&setup=true&lang.ts
|
|
6
|
+
const _hoisted_1 = { class: "c-barcode" };
|
|
7
|
+
const _hoisted_2 = {
|
|
8
|
+
key: 0,
|
|
9
|
+
class: "barcode-label"
|
|
10
|
+
};
|
|
11
|
+
var index_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
|
|
12
|
+
name: "C_Barcode",
|
|
13
|
+
__name: "index",
|
|
14
|
+
props: {
|
|
15
|
+
value: {},
|
|
16
|
+
format: { default: "CODE128" },
|
|
17
|
+
width: { default: 2 },
|
|
18
|
+
height: { default: 80 },
|
|
19
|
+
showText: {
|
|
20
|
+
type: Boolean,
|
|
21
|
+
default: true
|
|
22
|
+
},
|
|
23
|
+
fontSize: { default: 20 },
|
|
24
|
+
textPosition: { default: "bottom" },
|
|
25
|
+
lineColor: { default: "#000000" },
|
|
26
|
+
background: { default: "#FFFFFF" },
|
|
27
|
+
showBorder: {
|
|
28
|
+
type: Boolean,
|
|
29
|
+
default: true
|
|
30
|
+
},
|
|
31
|
+
label: { default: "" },
|
|
32
|
+
showLabel: {
|
|
33
|
+
type: Boolean,
|
|
34
|
+
default: false
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
emits: ["error"],
|
|
38
|
+
setup(__props, { emit: __emit }) {
|
|
39
|
+
const props = __props;
|
|
40
|
+
const emit = __emit;
|
|
41
|
+
const barcodeProps = computed(() => ({
|
|
42
|
+
value: props.value,
|
|
43
|
+
format: props.format,
|
|
44
|
+
width: props.width,
|
|
45
|
+
height: props.height,
|
|
46
|
+
displayValue: props.showText,
|
|
47
|
+
fontSize: props.fontSize,
|
|
48
|
+
textPosition: props.textPosition,
|
|
49
|
+
lineColor: props.lineColor,
|
|
50
|
+
background: props.background
|
|
51
|
+
}));
|
|
52
|
+
const handleError = (error) => {
|
|
53
|
+
console.error("条形码生成失败:", error);
|
|
54
|
+
emit("error", error);
|
|
55
|
+
};
|
|
56
|
+
return (_ctx, _cache) => {
|
|
57
|
+
return openBlock(), createElementBlock("div", _hoisted_1, [createElementVNode("div", { class: normalizeClass(["barcode-wrapper", { "with-border": _ctx.showBorder }]) }, [createVNode(unref(VueBarcode), mergeProps(barcodeProps.value, { onError: handleError }), null, 16)], 2), _ctx.showLabel && _ctx.label ? (openBlock(), createElementBlock("div", _hoisted_2, toDisplayString(_ctx.label), 1)) : createCommentVNode("v-if", true)]);
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
//#endregion
|
|
63
|
+
//#region src/components/C_Barcode/index.vue
|
|
64
|
+
var C_Barcode_default = /* @__PURE__ */ export_helper_default(index_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-b87e921b"]]);
|
|
65
|
+
|
|
66
|
+
//#endregion
|
|
67
|
+
export { C_Barcode_default as t };
|
|
68
|
+
//# sourceMappingURL=C_Barcode2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"C_Barcode2.js","names":["showBorder","showLabel","label"],"sources":["../src/components/C_Barcode/index.vue","../src/components/C_Barcode/index.vue","../src/components/C_Barcode/index.vue"],"sourcesContent":["<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-12-02\r\n * @Description: 条形码组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-barcode\">\r\n <div class=\"barcode-wrapper\" :class=\"{ 'with-border': showBorder }\">\r\n <VueBarcode v-bind=\"barcodeProps\" @error=\"handleError\" />\r\n </div>\r\n <div v-if=\"showLabel && label\" class=\"barcode-label\">\r\n {{ label }}\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed } from \"vue\";\r\nimport VueBarcode from \"@chenfengyuan/vue-barcode\";\r\n\r\ndefineOptions({ name: \"C_Barcode\" });\r\n\r\ninterface Props {\r\n value: string;\r\n format?:\r\n | \"CODE128\"\r\n | \"CODE39\"\r\n | \"EAN13\"\r\n | \"EAN8\"\r\n | \"UPC\"\r\n | \"ITF14\"\r\n | \"MSI\"\r\n | \"pharmacode\";\r\n width?: number;\r\n height?: number;\r\n showText?: boolean;\r\n fontSize?: number;\r\n textPosition?: \"bottom\" | \"top\";\r\n lineColor?: string;\r\n background?: string;\r\n showBorder?: boolean;\r\n label?: string;\r\n showLabel?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n format: \"CODE128\",\r\n width: 2,\r\n height: 80,\r\n showText: true,\r\n fontSize: 20,\r\n textPosition: \"bottom\",\r\n lineColor: \"#000000\",\r\n background: \"#FFFFFF\",\r\n showBorder: true,\r\n label: \"\",\r\n showLabel: false,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n error: [error: Error];\r\n}>();\r\n\r\nconst barcodeProps = computed(() => ({\r\n value: props.value,\r\n format: props.format,\r\n width: props.width,\r\n height: props.height,\r\n displayValue: props.showText,\r\n fontSize: props.fontSize,\r\n textPosition: props.textPosition,\r\n lineColor: props.lineColor,\r\n background: props.background,\r\n}));\r\n\r\nconst handleError = (error: Error) => {\r\n console.error(\"条形码生成失败:\", error);\r\n emit(\"error\", error);\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-12-02\r\n * @Description: 条形码组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-barcode\">\r\n <div class=\"barcode-wrapper\" :class=\"{ 'with-border': showBorder }\">\r\n <VueBarcode v-bind=\"barcodeProps\" @error=\"handleError\" />\r\n </div>\r\n <div v-if=\"showLabel && label\" class=\"barcode-label\">\r\n {{ label }}\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed } from \"vue\";\r\nimport VueBarcode from \"@chenfengyuan/vue-barcode\";\r\n\r\ndefineOptions({ name: \"C_Barcode\" });\r\n\r\ninterface Props {\r\n value: string;\r\n format?:\r\n | \"CODE128\"\r\n | \"CODE39\"\r\n | \"EAN13\"\r\n | \"EAN8\"\r\n | \"UPC\"\r\n | \"ITF14\"\r\n | \"MSI\"\r\n | \"pharmacode\";\r\n width?: number;\r\n height?: number;\r\n showText?: boolean;\r\n fontSize?: number;\r\n textPosition?: \"bottom\" | \"top\";\r\n lineColor?: string;\r\n background?: string;\r\n showBorder?: boolean;\r\n label?: string;\r\n showLabel?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n format: \"CODE128\",\r\n width: 2,\r\n height: 80,\r\n showText: true,\r\n fontSize: 20,\r\n textPosition: \"bottom\",\r\n lineColor: \"#000000\",\r\n background: \"#FFFFFF\",\r\n showBorder: true,\r\n label: \"\",\r\n showLabel: false,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n error: [error: Error];\r\n}>();\r\n\r\nconst barcodeProps = computed(() => ({\r\n value: props.value,\r\n format: props.format,\r\n width: props.width,\r\n height: props.height,\r\n displayValue: props.showText,\r\n fontSize: props.fontSize,\r\n textPosition: props.textPosition,\r\n lineColor: props.lineColor,\r\n background: props.background,\r\n}));\r\n\r\nconst handleError = (error: Error) => {\r\n console.error(\"条形码生成失败:\", error);\r\n emit(\"error\", error);\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-12-02\r\n * @Description: 条形码组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-barcode\">\r\n <div class=\"barcode-wrapper\" :class=\"{ 'with-border': showBorder }\">\r\n <VueBarcode v-bind=\"barcodeProps\" @error=\"handleError\" />\r\n </div>\r\n <div v-if=\"showLabel && label\" class=\"barcode-label\">\r\n {{ label }}\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed } from \"vue\";\r\nimport VueBarcode from \"@chenfengyuan/vue-barcode\";\r\n\r\ndefineOptions({ name: \"C_Barcode\" });\r\n\r\ninterface Props {\r\n value: string;\r\n format?:\r\n | \"CODE128\"\r\n | \"CODE39\"\r\n | \"EAN13\"\r\n | \"EAN8\"\r\n | \"UPC\"\r\n | \"ITF14\"\r\n | \"MSI\"\r\n | \"pharmacode\";\r\n width?: number;\r\n height?: number;\r\n showText?: boolean;\r\n fontSize?: number;\r\n textPosition?: \"bottom\" | \"top\";\r\n lineColor?: string;\r\n background?: string;\r\n showBorder?: boolean;\r\n label?: string;\r\n showLabel?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n format: \"CODE128\",\r\n width: 2,\r\n height: 80,\r\n showText: true,\r\n fontSize: 20,\r\n textPosition: \"bottom\",\r\n lineColor: \"#000000\",\r\n background: \"#FFFFFF\",\r\n showBorder: true,\r\n label: \"\",\r\n showLabel: false,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n error: [error: Error];\r\n}>();\r\n\r\nconst barcodeProps = computed(() => ({\r\n value: props.value,\r\n format: props.format,\r\n width: props.width,\r\n height: props.height,\r\n displayValue: props.showText,\r\n fontSize: props.fontSize,\r\n textPosition: props.textPosition,\r\n lineColor: props.lineColor,\r\n background: props.background,\r\n}));\r\n\r\nconst handleError = (error: Error) => {\r\n console.error(\"条形码生成失败:\", error);\r\n emit(\"error\", error);\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EC+CA,MAAM,QAAQ;EAcd,MAAM,OAAO;EAIb,MAAM,eAAe,gBAAgB;GACnC,OAAO,MAAM;GACb,QAAQ,MAAM;GACd,OAAO,MAAM;GACb,QAAQ,MAAM;GACd,cAAc,MAAM;GACpB,UAAU,MAAM;GAChB,cAAc,MAAM;GACpB,WAAW,MAAM;GACjB,YAAY,MAAM;GACnB,EAAE;EAEH,MAAM,eAAe,UAAiB;AACpC,WAAQ,MAAM,YAAY,MAAM;AAChC,QAAK,SAAS,MAAM;;;uBAvEpB,mBAOM,OAPN,YAOM,CANJ,mBAEM,OAAA,EAFD,OAAK,eAAA,CAAC,mBAAiB,EAAA,eAA0BA,KAAAA,YAAU,CAAA,CAAA,KAC9D,YAAyD,MAAA,WAAA,EAAzD,WAAoB,aAAqC,OAAzB,EAAG,SAAO,aAAW,CAAA,EAAA,MAAA,GAAA,OAE5CC,KAAAA,aAAaC,KAAAA,sBAAxB,mBAEM,OAFN,YAEM,gBADDA,KAAAA,MAAK,EAAA,EAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"C_Captcha-C-ef41xw.css","names":[],"sources":["../src/components/C_Captcha/index.vue?vue&type=style&index=0&scoped=c6e8ac8a&lang.scss"],"sourcesContent":[".c-captcha-modern[data-v-c6e8ac8a] {\n width: 100%;\n font-family: inherit;\n}\n.captcha-trigger[data-v-c6e8ac8a] {\n width: 100%;\n max-width: 280px;\n margin: 0 auto;\n padding: 12px 16px;\n cursor: pointer;\n user-select: none;\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n.captcha-trigger[data-v-c6e8ac8a]:hover:not(.disabled) {\n transform: translateY(-1px);\n}\n.captcha-trigger.disabled[data-v-c6e8ac8a] {\n opacity: 0.5;\n cursor: not-allowed;\n}\n.captcha-content[data-v-c6e8ac8a] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n flex: 1;\n}\n.captcha-icon[data-v-c6e8ac8a] {\n font-size: 18px;\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n.captcha-text[data-v-c6e8ac8a] {\n color: rgba(255, 255, 255, 0.8);\n font-size: 14px;\n font-weight: 500;\n letter-spacing: 0.3px;\n text-align: center;\n white-space: nowrap;\n}\n.refresh-button[data-v-c6e8ac8a] {\n position: absolute;\n right: 12px;\n top: 50%;\n transform: translateY(-50%);\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.3s ease;\n color: rgba(255, 255, 255, 0.6);\n font-size: 14px;\n flex-shrink: 0;\n}\n.refresh-button[data-v-c6e8ac8a]:hover {\n color: rgba(255, 255, 255, 0.9);\n transform: translateY(-50%) rotate(180deg);\n}\n.success-icon[data-v-c6e8ac8a],\n.success-text[data-v-c6e8ac8a] {\n color: #43c23a;\n}\n.error-icon[data-v-c6e8ac8a],\n.error-text[data-v-c6e8ac8a] {\n color: #f56c6c;\n}\n@keyframes shake-c6e8ac8a {\n0%, 100% {\n transform: translateX(0);\n}\n25% {\n transform: translateX(-4px);\n}\n75% {\n transform: translateX(4px);\n}\n}\n@media (max-width: 768px) {\n.captcha-trigger[data-v-c6e8ac8a] {\n max-width: 240px;\n padding: 10px 14px;\n}\n.captcha-icon[data-v-c6e8ac8a] {\n font-size: 16px;\n width: 18px;\n height: 18px;\n}\n.captcha-text[data-v-c6e8ac8a] {\n font-size: 13px;\n}\n.refresh-button[data-v-c6e8ac8a] {\n width: 24px;\n height: 24px;\n font-size: 12px;\n right: 10px;\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"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { t as export_helper_default } from "./export-helper.js";
|
|
2
|
+
import { computed, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, normalizeClass, onBeforeUnmount, openBlock, ref, toDisplayString, unref, withModifiers } from "vue";
|
|
3
|
+
import PuzzleVcode from "vue3-puzzle-vcode";
|
|
4
|
+
|
|
5
|
+
//#region src/components/C_Captcha/index.vue?vue&type=script&setup=true&lang.ts
|
|
6
|
+
const _hoisted_1 = { class: "c-captcha-modern" };
|
|
7
|
+
const _hoisted_2 = { class: "captcha-content" };
|
|
8
|
+
const _hoisted_3 = { class: "captcha-icon" };
|
|
9
|
+
const _hoisted_4 = { key: 0 };
|
|
10
|
+
const _hoisted_5 = {
|
|
11
|
+
key: 1,
|
|
12
|
+
class: "success-icon"
|
|
13
|
+
};
|
|
14
|
+
const _hoisted_6 = {
|
|
15
|
+
key: 2,
|
|
16
|
+
class: "error-icon"
|
|
17
|
+
};
|
|
18
|
+
const _hoisted_7 = { class: "captcha-text" };
|
|
19
|
+
const _hoisted_8 = { key: 0 };
|
|
20
|
+
const _hoisted_9 = {
|
|
21
|
+
key: 1,
|
|
22
|
+
class: "success-text"
|
|
23
|
+
};
|
|
24
|
+
const _hoisted_10 = {
|
|
25
|
+
key: 2,
|
|
26
|
+
class: "error-text"
|
|
27
|
+
};
|
|
28
|
+
var index_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
|
|
29
|
+
name: "C_Captcha",
|
|
30
|
+
__name: "index",
|
|
31
|
+
props: {
|
|
32
|
+
triggerText: { default: "点击进行人机验证" },
|
|
33
|
+
images: { default: () => [] },
|
|
34
|
+
disabled: {
|
|
35
|
+
type: Boolean,
|
|
36
|
+
default: false
|
|
37
|
+
},
|
|
38
|
+
theme: { default: "dark" }
|
|
39
|
+
},
|
|
40
|
+
emits: [
|
|
41
|
+
"success",
|
|
42
|
+
"fail",
|
|
43
|
+
"change",
|
|
44
|
+
"reset"
|
|
45
|
+
],
|
|
46
|
+
setup(__props, { expose: __expose, emit: __emit }) {
|
|
47
|
+
const props = __props;
|
|
48
|
+
const emit = __emit;
|
|
49
|
+
const showModal = ref(false);
|
|
50
|
+
const isVerified = ref(false);
|
|
51
|
+
const hasError = ref(false);
|
|
52
|
+
const verificationToken = ref("");
|
|
53
|
+
let errorTimer = null;
|
|
54
|
+
const captchaImages = computed(() => props.images.length > 0 ? props.images : void 0);
|
|
55
|
+
const showCaptcha = () => {
|
|
56
|
+
if (props.disabled || isVerified.value) return;
|
|
57
|
+
hasError.value = false;
|
|
58
|
+
showModal.value = true;
|
|
59
|
+
};
|
|
60
|
+
const handleSuccess = () => {
|
|
61
|
+
isVerified.value = true;
|
|
62
|
+
hasError.value = false;
|
|
63
|
+
showModal.value = false;
|
|
64
|
+
const timestamp = Date.now();
|
|
65
|
+
const token = `puzzle_${timestamp}_${Math.random().toString(36).substring(2, 9)}`;
|
|
66
|
+
verificationToken.value = token;
|
|
67
|
+
emit("success", {
|
|
68
|
+
token,
|
|
69
|
+
timestamp
|
|
70
|
+
});
|
|
71
|
+
emit("change", true);
|
|
72
|
+
};
|
|
73
|
+
const handleFail = () => {
|
|
74
|
+
isVerified.value = false;
|
|
75
|
+
hasError.value = true;
|
|
76
|
+
showModal.value = false;
|
|
77
|
+
if (errorTimer) clearTimeout(errorTimer);
|
|
78
|
+
errorTimer = setTimeout(() => {
|
|
79
|
+
hasError.value = false;
|
|
80
|
+
errorTimer = null;
|
|
81
|
+
}, 3e3);
|
|
82
|
+
emit("fail", "拼图验证失败");
|
|
83
|
+
emit("change", false);
|
|
84
|
+
};
|
|
85
|
+
const handleClose = () => {
|
|
86
|
+
showModal.value = false;
|
|
87
|
+
};
|
|
88
|
+
const resetCaptcha = () => {
|
|
89
|
+
isVerified.value = false;
|
|
90
|
+
hasError.value = false;
|
|
91
|
+
showModal.value = false;
|
|
92
|
+
verificationToken.value = "";
|
|
93
|
+
if (errorTimer) {
|
|
94
|
+
clearTimeout(errorTimer);
|
|
95
|
+
errorTimer = null;
|
|
96
|
+
}
|
|
97
|
+
emit("reset");
|
|
98
|
+
emit("change", false);
|
|
99
|
+
};
|
|
100
|
+
__expose({
|
|
101
|
+
validate: () => isVerified.value,
|
|
102
|
+
getToken: () => verificationToken.value,
|
|
103
|
+
getVerificationData: () => {
|
|
104
|
+
if (!isVerified.value) return null;
|
|
105
|
+
return {
|
|
106
|
+
token: verificationToken.value,
|
|
107
|
+
timestamp: Date.now(),
|
|
108
|
+
type: "puzzle-captcha"
|
|
109
|
+
};
|
|
110
|
+
},
|
|
111
|
+
reset: resetCaptcha,
|
|
112
|
+
show: showCaptcha
|
|
113
|
+
});
|
|
114
|
+
onBeforeUnmount(() => {
|
|
115
|
+
if (errorTimer) clearTimeout(errorTimer);
|
|
116
|
+
});
|
|
117
|
+
return (_ctx, _cache) => {
|
|
118
|
+
return openBlock(), createElementBlock("div", _hoisted_1, [createElementVNode("div", {
|
|
119
|
+
class: normalizeClass(["captcha-trigger", {
|
|
120
|
+
verified: isVerified.value,
|
|
121
|
+
error: hasError.value,
|
|
122
|
+
disabled: _ctx.disabled
|
|
123
|
+
}]),
|
|
124
|
+
onClick: showCaptcha
|
|
125
|
+
}, [createElementVNode("div", _hoisted_2, [createElementVNode("div", _hoisted_3, [
|
|
126
|
+
!isVerified.value && !hasError.value ? (openBlock(), createElementBlock("span", _hoisted_4, "🧩")) : createCommentVNode("v-if", true),
|
|
127
|
+
isVerified.value ? (openBlock(), createElementBlock("span", _hoisted_5, "✓")) : createCommentVNode("v-if", true),
|
|
128
|
+
hasError.value ? (openBlock(), createElementBlock("span", _hoisted_6, "⚠️")) : createCommentVNode("v-if", true)
|
|
129
|
+
]), createElementVNode("div", _hoisted_7, [
|
|
130
|
+
!isVerified.value && !hasError.value ? (openBlock(), createElementBlock("span", _hoisted_8, toDisplayString(_ctx.triggerText), 1)) : createCommentVNode("v-if", true),
|
|
131
|
+
isVerified.value ? (openBlock(), createElementBlock("span", _hoisted_9, "验证成功")) : createCommentVNode("v-if", true),
|
|
132
|
+
hasError.value ? (openBlock(), createElementBlock("span", _hoisted_10, "验证失败,请重试")) : createCommentVNode("v-if", true)
|
|
133
|
+
])]), isVerified.value || hasError.value ? (openBlock(), createElementBlock("div", {
|
|
134
|
+
key: 0,
|
|
135
|
+
class: "refresh-button",
|
|
136
|
+
onClick: withModifiers(resetCaptcha, ["stop"]),
|
|
137
|
+
title: "重新验证"
|
|
138
|
+
}, " ⟲ ")) : createCommentVNode("v-if", true)], 2), createVNode(unref(PuzzleVcode), {
|
|
139
|
+
show: showModal.value,
|
|
140
|
+
imgs: captchaImages.value,
|
|
141
|
+
onSuccess: handleSuccess,
|
|
142
|
+
onClose: handleClose,
|
|
143
|
+
onFail: handleFail
|
|
144
|
+
}, null, 8, ["show", "imgs"])]);
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
//#endregion
|
|
150
|
+
//#region src/components/C_Captcha/index.vue
|
|
151
|
+
var C_Captcha_default = /* @__PURE__ */ export_helper_default(index_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-c6e8ac8a"]]);
|
|
152
|
+
|
|
153
|
+
//#endregion
|
|
154
|
+
export { C_Captcha_default as t };
|
|
155
|
+
//# sourceMappingURL=C_Captcha2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"C_Captcha2.js","names":["disabled","triggerText"],"sources":["../src/components/C_Captcha/index.vue","../src/components/C_Captcha/index.vue","../src/components/C_Captcha/index.vue"],"sourcesContent":["<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-07-23\r\n * @Description: 基于 vue3-puzzle-vcode 封装的验证器组件\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-captcha-modern\">\r\n <div\r\n class=\"captcha-trigger\"\r\n @click=\"showCaptcha\"\r\n :class=\"{\r\n verified: isVerified,\r\n error: hasError,\r\n disabled: disabled,\r\n }\"\r\n >\r\n <div class=\"captcha-content\">\r\n <div class=\"captcha-icon\">\r\n <span v-if=\"!isVerified && !hasError\">🧩</span>\r\n <span v-if=\"isVerified\" class=\"success-icon\">✓</span>\r\n <span v-if=\"hasError\" class=\"error-icon\">⚠️</span>\r\n </div>\r\n <div class=\"captcha-text\">\r\n <span v-if=\"!isVerified && !hasError\">{{ triggerText }}</span>\r\n <span v-if=\"isVerified\" class=\"success-text\">验证成功</span>\r\n <span v-if=\"hasError\" class=\"error-text\">验证失败,请重试</span>\r\n </div>\r\n </div>\r\n <div\r\n v-if=\"isVerified || hasError\"\r\n class=\"refresh-button\"\r\n @click.stop=\"resetCaptcha\"\r\n title=\"重新验证\"\r\n >\r\n ⟲\r\n </div>\r\n </div>\r\n <PuzzleVcode\r\n :show=\"showModal\"\r\n :imgs=\"captchaImages\"\r\n @success=\"handleSuccess\"\r\n @close=\"handleClose\"\r\n @fail=\"handleFail\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, computed, onBeforeUnmount } from \"vue\";\r\nimport PuzzleVcode from \"vue3-puzzle-vcode\";\r\n\r\ndefineOptions({ name: \"C_Captcha\" });\r\n\r\ninterface CaptchaProps {\r\n triggerText?: string;\r\n images?: string[];\r\n disabled?: boolean;\r\n theme?: \"light\" | \"dark\";\r\n}\r\n\r\ninterface CaptchaEmits {\r\n (e: \"success\", data: { token: string; timestamp: number }): void;\r\n (e: \"fail\", error: string): void;\r\n (e: \"change\", valid: boolean): void;\r\n (e: \"reset\"): void;\r\n}\r\n\r\nconst props = withDefaults(defineProps<CaptchaProps>(), {\r\n triggerText: \"点击进行人机验证\",\r\n images: () => [],\r\n disabled: false,\r\n theme: \"dark\",\r\n});\r\n\r\nconst emit = defineEmits<CaptchaEmits>();\r\n\r\nconst showModal = ref(false);\r\nconst isVerified = ref(false);\r\nconst hasError = ref(false);\r\nconst verificationToken = ref(\"\");\r\nlet errorTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\nconst captchaImages = computed(() =>\r\n props.images.length > 0 ? props.images : undefined,\r\n);\r\n\r\nconst showCaptcha = () => {\r\n if (props.disabled || isVerified.value) return;\r\n hasError.value = false;\r\n showModal.value = true;\r\n};\r\n\r\nconst handleSuccess = () => {\r\n isVerified.value = true;\r\n hasError.value = false;\r\n showModal.value = false;\r\n const timestamp = Date.now();\r\n const token = `puzzle_${timestamp}_${Math.random().toString(36).substring(2, 9)}`;\r\n verificationToken.value = token;\r\n emit(\"success\", { token, timestamp });\r\n emit(\"change\", true);\r\n};\r\n\r\nconst handleFail = () => {\r\n isVerified.value = false;\r\n hasError.value = true;\r\n showModal.value = false;\r\n if (errorTimer) clearTimeout(errorTimer);\r\n errorTimer = setTimeout(() => {\r\n hasError.value = false;\r\n errorTimer = null;\r\n }, 3000);\r\n emit(\"fail\", \"拼图验证失败\");\r\n emit(\"change\", false);\r\n};\r\n\r\nconst handleClose = () => {\r\n showModal.value = false;\r\n};\r\n\r\nconst resetCaptcha = () => {\r\n isVerified.value = false;\r\n hasError.value = false;\r\n showModal.value = false;\r\n verificationToken.value = \"\";\r\n if (errorTimer) {\r\n clearTimeout(errorTimer);\r\n errorTimer = null;\r\n }\r\n emit(\"reset\");\r\n emit(\"change\", false);\r\n};\r\n\r\ndefineExpose({\r\n validate: () => isVerified.value,\r\n getToken: () => verificationToken.value,\r\n getVerificationData: () => {\r\n if (!isVerified.value) return null;\r\n return {\r\n token: verificationToken.value,\r\n timestamp: Date.now(),\r\n type: \"puzzle-captcha\",\r\n };\r\n },\r\n reset: resetCaptcha,\r\n show: showCaptcha,\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n if (errorTimer) clearTimeout(errorTimer);\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-07-23\r\n * @Description: 基于 vue3-puzzle-vcode 封装的验证器组件\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-captcha-modern\">\r\n <div\r\n class=\"captcha-trigger\"\r\n @click=\"showCaptcha\"\r\n :class=\"{\r\n verified: isVerified,\r\n error: hasError,\r\n disabled: disabled,\r\n }\"\r\n >\r\n <div class=\"captcha-content\">\r\n <div class=\"captcha-icon\">\r\n <span v-if=\"!isVerified && !hasError\">🧩</span>\r\n <span v-if=\"isVerified\" class=\"success-icon\">✓</span>\r\n <span v-if=\"hasError\" class=\"error-icon\">⚠️</span>\r\n </div>\r\n <div class=\"captcha-text\">\r\n <span v-if=\"!isVerified && !hasError\">{{ triggerText }}</span>\r\n <span v-if=\"isVerified\" class=\"success-text\">验证成功</span>\r\n <span v-if=\"hasError\" class=\"error-text\">验证失败,请重试</span>\r\n </div>\r\n </div>\r\n <div\r\n v-if=\"isVerified || hasError\"\r\n class=\"refresh-button\"\r\n @click.stop=\"resetCaptcha\"\r\n title=\"重新验证\"\r\n >\r\n ⟲\r\n </div>\r\n </div>\r\n <PuzzleVcode\r\n :show=\"showModal\"\r\n :imgs=\"captchaImages\"\r\n @success=\"handleSuccess\"\r\n @close=\"handleClose\"\r\n @fail=\"handleFail\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, computed, onBeforeUnmount } from \"vue\";\r\nimport PuzzleVcode from \"vue3-puzzle-vcode\";\r\n\r\ndefineOptions({ name: \"C_Captcha\" });\r\n\r\ninterface CaptchaProps {\r\n triggerText?: string;\r\n images?: string[];\r\n disabled?: boolean;\r\n theme?: \"light\" | \"dark\";\r\n}\r\n\r\ninterface CaptchaEmits {\r\n (e: \"success\", data: { token: string; timestamp: number }): void;\r\n (e: \"fail\", error: string): void;\r\n (e: \"change\", valid: boolean): void;\r\n (e: \"reset\"): void;\r\n}\r\n\r\nconst props = withDefaults(defineProps<CaptchaProps>(), {\r\n triggerText: \"点击进行人机验证\",\r\n images: () => [],\r\n disabled: false,\r\n theme: \"dark\",\r\n});\r\n\r\nconst emit = defineEmits<CaptchaEmits>();\r\n\r\nconst showModal = ref(false);\r\nconst isVerified = ref(false);\r\nconst hasError = ref(false);\r\nconst verificationToken = ref(\"\");\r\nlet errorTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\nconst captchaImages = computed(() =>\r\n props.images.length > 0 ? props.images : undefined,\r\n);\r\n\r\nconst showCaptcha = () => {\r\n if (props.disabled || isVerified.value) return;\r\n hasError.value = false;\r\n showModal.value = true;\r\n};\r\n\r\nconst handleSuccess = () => {\r\n isVerified.value = true;\r\n hasError.value = false;\r\n showModal.value = false;\r\n const timestamp = Date.now();\r\n const token = `puzzle_${timestamp}_${Math.random().toString(36).substring(2, 9)}`;\r\n verificationToken.value = token;\r\n emit(\"success\", { token, timestamp });\r\n emit(\"change\", true);\r\n};\r\n\r\nconst handleFail = () => {\r\n isVerified.value = false;\r\n hasError.value = true;\r\n showModal.value = false;\r\n if (errorTimer) clearTimeout(errorTimer);\r\n errorTimer = setTimeout(() => {\r\n hasError.value = false;\r\n errorTimer = null;\r\n }, 3000);\r\n emit(\"fail\", \"拼图验证失败\");\r\n emit(\"change\", false);\r\n};\r\n\r\nconst handleClose = () => {\r\n showModal.value = false;\r\n};\r\n\r\nconst resetCaptcha = () => {\r\n isVerified.value = false;\r\n hasError.value = false;\r\n showModal.value = false;\r\n verificationToken.value = \"\";\r\n if (errorTimer) {\r\n clearTimeout(errorTimer);\r\n errorTimer = null;\r\n }\r\n emit(\"reset\");\r\n emit(\"change\", false);\r\n};\r\n\r\ndefineExpose({\r\n validate: () => isVerified.value,\r\n getToken: () => verificationToken.value,\r\n getVerificationData: () => {\r\n if (!isVerified.value) return null;\r\n return {\r\n token: verificationToken.value,\r\n timestamp: Date.now(),\r\n type: \"puzzle-captcha\",\r\n };\r\n },\r\n reset: resetCaptcha,\r\n show: showCaptcha,\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n if (errorTimer) clearTimeout(errorTimer);\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-07-23\r\n * @Description: 基于 vue3-puzzle-vcode 封装的验证器组件\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-captcha-modern\">\r\n <div\r\n class=\"captcha-trigger\"\r\n @click=\"showCaptcha\"\r\n :class=\"{\r\n verified: isVerified,\r\n error: hasError,\r\n disabled: disabled,\r\n }\"\r\n >\r\n <div class=\"captcha-content\">\r\n <div class=\"captcha-icon\">\r\n <span v-if=\"!isVerified && !hasError\">🧩</span>\r\n <span v-if=\"isVerified\" class=\"success-icon\">✓</span>\r\n <span v-if=\"hasError\" class=\"error-icon\">⚠️</span>\r\n </div>\r\n <div class=\"captcha-text\">\r\n <span v-if=\"!isVerified && !hasError\">{{ triggerText }}</span>\r\n <span v-if=\"isVerified\" class=\"success-text\">验证成功</span>\r\n <span v-if=\"hasError\" class=\"error-text\">验证失败,请重试</span>\r\n </div>\r\n </div>\r\n <div\r\n v-if=\"isVerified || hasError\"\r\n class=\"refresh-button\"\r\n @click.stop=\"resetCaptcha\"\r\n title=\"重新验证\"\r\n >\r\n ⟲\r\n </div>\r\n </div>\r\n <PuzzleVcode\r\n :show=\"showModal\"\r\n :imgs=\"captchaImages\"\r\n @success=\"handleSuccess\"\r\n @close=\"handleClose\"\r\n @fail=\"handleFail\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, computed, onBeforeUnmount } from \"vue\";\r\nimport PuzzleVcode from \"vue3-puzzle-vcode\";\r\n\r\ndefineOptions({ name: \"C_Captcha\" });\r\n\r\ninterface CaptchaProps {\r\n triggerText?: string;\r\n images?: string[];\r\n disabled?: boolean;\r\n theme?: \"light\" | \"dark\";\r\n}\r\n\r\ninterface CaptchaEmits {\r\n (e: \"success\", data: { token: string; timestamp: number }): void;\r\n (e: \"fail\", error: string): void;\r\n (e: \"change\", valid: boolean): void;\r\n (e: \"reset\"): void;\r\n}\r\n\r\nconst props = withDefaults(defineProps<CaptchaProps>(), {\r\n triggerText: \"点击进行人机验证\",\r\n images: () => [],\r\n disabled: false,\r\n theme: \"dark\",\r\n});\r\n\r\nconst emit = defineEmits<CaptchaEmits>();\r\n\r\nconst showModal = ref(false);\r\nconst isVerified = ref(false);\r\nconst hasError = ref(false);\r\nconst verificationToken = ref(\"\");\r\nlet errorTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\nconst captchaImages = computed(() =>\r\n props.images.length > 0 ? props.images : undefined,\r\n);\r\n\r\nconst showCaptcha = () => {\r\n if (props.disabled || isVerified.value) return;\r\n hasError.value = false;\r\n showModal.value = true;\r\n};\r\n\r\nconst handleSuccess = () => {\r\n isVerified.value = true;\r\n hasError.value = false;\r\n showModal.value = false;\r\n const timestamp = Date.now();\r\n const token = `puzzle_${timestamp}_${Math.random().toString(36).substring(2, 9)}`;\r\n verificationToken.value = token;\r\n emit(\"success\", { token, timestamp });\r\n emit(\"change\", true);\r\n};\r\n\r\nconst handleFail = () => {\r\n isVerified.value = false;\r\n hasError.value = true;\r\n showModal.value = false;\r\n if (errorTimer) clearTimeout(errorTimer);\r\n errorTimer = setTimeout(() => {\r\n hasError.value = false;\r\n errorTimer = null;\r\n }, 3000);\r\n emit(\"fail\", \"拼图验证失败\");\r\n emit(\"change\", false);\r\n};\r\n\r\nconst handleClose = () => {\r\n showModal.value = false;\r\n};\r\n\r\nconst resetCaptcha = () => {\r\n isVerified.value = false;\r\n hasError.value = false;\r\n showModal.value = false;\r\n verificationToken.value = \"\";\r\n if (errorTimer) {\r\n clearTimeout(errorTimer);\r\n errorTimer = null;\r\n }\r\n emit(\"reset\");\r\n emit(\"change\", false);\r\n};\r\n\r\ndefineExpose({\r\n validate: () => isVerified.value,\r\n getToken: () => verificationToken.value,\r\n getVerificationData: () => {\r\n if (!isVerified.value) return null;\r\n return {\r\n token: verificationToken.value,\r\n timestamp: Date.now(),\r\n type: \"puzzle-captcha\",\r\n };\r\n },\r\n reset: resetCaptcha,\r\n show: showCaptcha,\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n if (errorTimer) clearTimeout(errorTimer);\r\n});\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n@use \"./index.scss\";\r\n</style>\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECqEA,MAAM,QAAQ;EAOd,MAAM,OAAO;EAEb,MAAM,YAAY,IAAI,MAAM;EAC5B,MAAM,aAAa,IAAI,MAAM;EAC7B,MAAM,WAAW,IAAI,MAAM;EAC3B,MAAM,oBAAoB,IAAI,GAAG;EACjC,IAAI,aAAmD;EAEvD,MAAM,gBAAgB,eACpB,MAAM,OAAO,SAAS,IAAI,MAAM,SAAS,OAC1C;EAED,MAAM,oBAAoB;AACxB,OAAI,MAAM,YAAY,WAAW,MAAO;AACxC,YAAS,QAAQ;AACjB,aAAU,QAAQ;;EAGpB,MAAM,sBAAsB;AAC1B,cAAW,QAAQ;AACnB,YAAS,QAAQ;AACjB,aAAU,QAAQ;GAClB,MAAM,YAAY,KAAK,KAAK;GAC5B,MAAM,QAAQ,UAAU,UAAU,GAAG,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,UAAU,GAAG,EAAE;AAC/E,qBAAkB,QAAQ;AAC1B,QAAK,WAAW;IAAE;IAAO;IAAW,CAAC;AACrC,QAAK,UAAU,KAAK;;EAGtB,MAAM,mBAAmB;AACvB,cAAW,QAAQ;AACnB,YAAS,QAAQ;AACjB,aAAU,QAAQ;AAClB,OAAI,WAAY,cAAa,WAAW;AACxC,gBAAa,iBAAiB;AAC5B,aAAS,QAAQ;AACjB,iBAAa;MACZ,IAAK;AACR,QAAK,QAAQ,SAAS;AACtB,QAAK,UAAU,MAAM;;EAGvB,MAAM,oBAAoB;AACxB,aAAU,QAAQ;;EAGpB,MAAM,qBAAqB;AACzB,cAAW,QAAQ;AACnB,YAAS,QAAQ;AACjB,aAAU,QAAQ;AAClB,qBAAkB,QAAQ;AAC1B,OAAI,YAAY;AACd,iBAAa,WAAW;AACxB,iBAAa;;AAEf,QAAK,QAAQ;AACb,QAAK,UAAU,MAAM;;AAGvB,WAAa;GACX,gBAAgB,WAAW;GAC3B,gBAAgB,kBAAkB;GAClC,2BAA2B;AACzB,QAAI,CAAC,WAAW,MAAO,QAAO;AAC9B,WAAO;KACL,OAAO,kBAAkB;KACzB,WAAW,KAAK,KAAK;KACrB,MAAM;KACP;;GAEH,OAAO;GACP,MAAM;GACP,CAAC;AAEF,wBAAsB;AACpB,OAAI,WAAY,cAAa,WAAW;IACxC;;uBAhJA,mBAsCM,OAtCN,YAsCM,CArCJ,mBA6BM,OAAA;IA5BJ,OAAK,eAAA,CAAC,mBAAiB;eAEM,WAAA;YAA4B,SAAA;eAA6BA,KAAAA;;IADrF,SAAO;OAOR,mBAWM,OAXN,YAWM,CAVJ,mBAIM,OAJN,YAIM;KAHS,WAAA,SAAU,CAAK,SAAA,sBAA5B,mBAA+C,QAAA,YAAT,KAAE;IAC5B,WAAA,sBAAZ,mBAAqD,QAArD,YAA6C,IAAC;IAClC,SAAA,sBAAZ,mBAAkD,QAAlD,YAAyC,KAAE;OAE7C,mBAIM,OAJN,YAIM;KAHS,WAAA,SAAU,CAAK,SAAA,sBAA5B,mBAA8D,QAAA,YAAA,gBAArBC,KAAAA,YAAW,EAAA,EAAA;IACxC,WAAA,sBAAZ,mBAAwD,QAAxD,YAA6C,OAAI;IACrC,SAAA,sBAAZ,mBAAwD,QAAxD,aAAyC,WAAQ;SAI7C,WAAA,SAAc,SAAA,sBADtB,mBAOM,OAAA;;IALJ,OAAM;IACL,SAAK,cAAO,cAAY,CAAA,OAAA,CAAA;IACzB,OAAM;MACP,MAED,2CAEF,YAME,MAAA,YAAA,EAAA;IALC,MAAM,UAAA;IACN,MAAM,cAAA;IACN,WAAS;IACT,SAAO;IACP,QAAM"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"C_Cascade-D9kNsjsV.css","names":[],"sources":["../src/components/C_Cascade/index.vue?vue&type=style&index=0&scoped=7219e099&lang.scss"],"sourcesContent":[".n-cascade-selector[data-v-7219e099] {\n display: flex;\n gap: 12px;\n}\n.n-cascade-selector .n-select-item[data-v-7219e099] {\n min-width: 140px;\n flex: 1;\n}"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { t as export_helper_default } from "./export-helper.js";
|
|
2
|
+
import { Fragment, computed, createElementBlock, createVNode, defineComponent, openBlock, ref, renderList, unref, watch } from "vue";
|
|
3
|
+
import { NSelect } from "naive-ui";
|
|
4
|
+
|
|
5
|
+
//#region src/components/C_Cascade/index.vue?vue&type=script&setup=true&lang.ts
|
|
6
|
+
const _hoisted_1 = { class: "n-cascade-selector" };
|
|
7
|
+
var index_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
|
|
8
|
+
name: "C_Cascade",
|
|
9
|
+
__name: "index",
|
|
10
|
+
props: {
|
|
11
|
+
data: {},
|
|
12
|
+
placeholders: { default: () => [
|
|
13
|
+
"请选择",
|
|
14
|
+
"请选择",
|
|
15
|
+
"请选择"
|
|
16
|
+
] },
|
|
17
|
+
modelValue: {}
|
|
18
|
+
},
|
|
19
|
+
emits: ["update:modelValue", "change"],
|
|
20
|
+
setup(__props, { emit: __emit }) {
|
|
21
|
+
const props = __props;
|
|
22
|
+
const emit = __emit;
|
|
23
|
+
const levels = [
|
|
24
|
+
0,
|
|
25
|
+
1,
|
|
26
|
+
2
|
|
27
|
+
];
|
|
28
|
+
const selectedValues = ref([
|
|
29
|
+
null,
|
|
30
|
+
null,
|
|
31
|
+
null
|
|
32
|
+
]);
|
|
33
|
+
const getLevelData = (level) => {
|
|
34
|
+
if (level === 0) return props.data;
|
|
35
|
+
if (!selectedValues.value[level - 1]) return [];
|
|
36
|
+
return getLevelData(level - 1).find((x) => x.value === selectedValues.value[level - 1])?.children || [];
|
|
37
|
+
};
|
|
38
|
+
const levelOptions = computed(() => levels.map((level) => getLevelData(level).map((item) => ({
|
|
39
|
+
label: item.label,
|
|
40
|
+
value: item.value
|
|
41
|
+
}))));
|
|
42
|
+
const handleChange = (index) => {
|
|
43
|
+
selectedValues.value.splice(index + 1, levels.length - index - 1, ...Array(levels.length - index - 1).fill(null));
|
|
44
|
+
emitValue();
|
|
45
|
+
};
|
|
46
|
+
const getSelectedItem = (index) => {
|
|
47
|
+
const value = selectedValues.value[index];
|
|
48
|
+
if (!value) return null;
|
|
49
|
+
const item = getLevelData(index).find((i) => i.value === value);
|
|
50
|
+
return item ? {
|
|
51
|
+
label: item.label,
|
|
52
|
+
value: item.value
|
|
53
|
+
} : null;
|
|
54
|
+
};
|
|
55
|
+
const emitValue = () => {
|
|
56
|
+
const result = {
|
|
57
|
+
primary: getSelectedItem(0),
|
|
58
|
+
secondary: getSelectedItem(1),
|
|
59
|
+
tertiary: getSelectedItem(2)
|
|
60
|
+
};
|
|
61
|
+
emit("update:modelValue", result);
|
|
62
|
+
emit("change", result);
|
|
63
|
+
};
|
|
64
|
+
watch(() => props.modelValue, (val) => {
|
|
65
|
+
selectedValues.value = [
|
|
66
|
+
val?.primary?.value ?? null,
|
|
67
|
+
val?.secondary?.value ?? null,
|
|
68
|
+
val?.tertiary?.value ?? null
|
|
69
|
+
];
|
|
70
|
+
}, {
|
|
71
|
+
immediate: true,
|
|
72
|
+
deep: true
|
|
73
|
+
});
|
|
74
|
+
return (_ctx, _cache) => {
|
|
75
|
+
return openBlock(), createElementBlock("div", _hoisted_1, [(openBlock(), createElementBlock(Fragment, null, renderList(levels, (level, index) => {
|
|
76
|
+
return createVNode(unref(NSelect), {
|
|
77
|
+
key: index,
|
|
78
|
+
value: selectedValues.value[index],
|
|
79
|
+
"onUpdate:value": [($event) => selectedValues.value[index] = $event, ($event) => handleChange(index)],
|
|
80
|
+
options: levelOptions.value[index],
|
|
81
|
+
clearable: "",
|
|
82
|
+
placeholder: _ctx.placeholders[index],
|
|
83
|
+
disabled: index > 0 && !selectedValues.value[index - 1],
|
|
84
|
+
class: "n-select-item"
|
|
85
|
+
}, null, 8, [
|
|
86
|
+
"value",
|
|
87
|
+
"onUpdate:value",
|
|
88
|
+
"options",
|
|
89
|
+
"placeholder",
|
|
90
|
+
"disabled"
|
|
91
|
+
]);
|
|
92
|
+
}), 64))]);
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
//#endregion
|
|
98
|
+
//#region src/components/C_Cascade/index.vue
|
|
99
|
+
var C_Cascade_default = /* @__PURE__ */ export_helper_default(index_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-7219e099"]]);
|
|
100
|
+
|
|
101
|
+
//#endregion
|
|
102
|
+
export { C_Cascade_default as t };
|
|
103
|
+
//# sourceMappingURL=C_Cascade2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"C_Cascade2.js","names":["placeholders"],"sources":["../src/components/C_Cascade/index.vue","../src/components/C_Cascade/index.vue","../src/components/C_Cascade/index.vue"],"sourcesContent":["<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-05-28\r\n * @Description: 级联选择组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"n-cascade-selector\">\r\n <NSelect\r\n v-for=\"(level, index) in levels\"\r\n :key=\"index\"\r\n v-model:value=\"selectedValues[index]\"\r\n :options=\"levelOptions[index]\"\r\n clearable\r\n :placeholder=\"placeholders[index]\"\r\n :disabled=\"index > 0 && !selectedValues[index - 1]\"\r\n @update:value=\"handleChange(index)\"\r\n class=\"n-select-item\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { ref, computed, watch } from \"vue\";\r\nimport { NSelect } from \"naive-ui\";\r\n\r\ndefineOptions({ name: \"C_Cascade\" });\r\n\r\nexport interface CascadeItem {\r\n label: string;\r\n value: string | number;\r\n children?: CascadeItem[];\r\n}\r\n\r\ninterface CascadeValue {\r\n primary?: Pick<CascadeItem, \"label\" | \"value\"> | null;\r\n secondary?: Pick<CascadeItem, \"label\" | \"value\"> | null;\r\n tertiary?: Pick<CascadeItem, \"label\" | \"value\"> | null;\r\n}\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n data: CascadeItem[];\r\n placeholders?: string[];\r\n modelValue?: CascadeValue;\r\n }>(),\r\n {\r\n placeholders: () => [\"请选择\", \"请选择\", \"请选择\"],\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n \"update:modelValue\": [value: CascadeValue];\r\n change: [value: CascadeValue];\r\n}>();\r\n\r\nconst levels = [0, 1, 2];\r\nconst selectedValues = ref<(string | number | null)[]>([null, null, null]);\r\n\r\nconst getLevelData = (level: number): CascadeItem[] => {\r\n if (level === 0) return props.data;\r\n if (!selectedValues.value[level - 1]) return [];\r\n const parentData = getLevelData(level - 1);\r\n return (\r\n parentData.find((x) => x.value === selectedValues.value[level - 1])\r\n ?.children || []\r\n );\r\n};\r\n\r\nconst levelOptions = computed(() =>\r\n levels.map((level) =>\r\n getLevelData(level).map((item) => ({\r\n label: item.label,\r\n value: item.value,\r\n })),\r\n ),\r\n);\r\n\r\nconst handleChange = (index: number) => {\r\n selectedValues.value.splice(\r\n index + 1,\r\n levels.length - index - 1,\r\n ...Array(levels.length - index - 1).fill(null),\r\n );\r\n emitValue();\r\n};\r\n\r\nconst getSelectedItem = (index: number) => {\r\n const value = selectedValues.value[index];\r\n if (!value) return null;\r\n const data = getLevelData(index);\r\n const item = data.find((i) => i.value === value);\r\n return item ? { label: item.label, value: item.value } : null;\r\n};\r\n\r\nconst emitValue = () => {\r\n const result: CascadeValue = {\r\n primary: getSelectedItem(0),\r\n secondary: getSelectedItem(1),\r\n tertiary: getSelectedItem(2),\r\n };\r\n emit(\"update:modelValue\", result);\r\n emit(\"change\", result);\r\n};\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (val) => {\r\n selectedValues.value = [\r\n val?.primary?.value ?? null,\r\n val?.secondary?.value ?? null,\r\n val?.tertiary?.value ?? null,\r\n ];\r\n },\r\n { immediate: true, deep: true },\r\n);\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.n-cascade-selector {\r\n display: flex;\r\n gap: 12px;\r\n .n-select-item {\r\n min-width: 140px;\r\n flex: 1;\r\n }\r\n}\r\n</style>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-05-28\r\n * @Description: 级联选择组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"n-cascade-selector\">\r\n <NSelect\r\n v-for=\"(level, index) in levels\"\r\n :key=\"index\"\r\n v-model:value=\"selectedValues[index]\"\r\n :options=\"levelOptions[index]\"\r\n clearable\r\n :placeholder=\"placeholders[index]\"\r\n :disabled=\"index > 0 && !selectedValues[index - 1]\"\r\n @update:value=\"handleChange(index)\"\r\n class=\"n-select-item\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { ref, computed, watch } from \"vue\";\r\nimport { NSelect } from \"naive-ui\";\r\n\r\ndefineOptions({ name: \"C_Cascade\" });\r\n\r\nexport interface CascadeItem {\r\n label: string;\r\n value: string | number;\r\n children?: CascadeItem[];\r\n}\r\n\r\ninterface CascadeValue {\r\n primary?: Pick<CascadeItem, \"label\" | \"value\"> | null;\r\n secondary?: Pick<CascadeItem, \"label\" | \"value\"> | null;\r\n tertiary?: Pick<CascadeItem, \"label\" | \"value\"> | null;\r\n}\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n data: CascadeItem[];\r\n placeholders?: string[];\r\n modelValue?: CascadeValue;\r\n }>(),\r\n {\r\n placeholders: () => [\"请选择\", \"请选择\", \"请选择\"],\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n \"update:modelValue\": [value: CascadeValue];\r\n change: [value: CascadeValue];\r\n}>();\r\n\r\nconst levels = [0, 1, 2];\r\nconst selectedValues = ref<(string | number | null)[]>([null, null, null]);\r\n\r\nconst getLevelData = (level: number): CascadeItem[] => {\r\n if (level === 0) return props.data;\r\n if (!selectedValues.value[level - 1]) return [];\r\n const parentData = getLevelData(level - 1);\r\n return (\r\n parentData.find((x) => x.value === selectedValues.value[level - 1])\r\n ?.children || []\r\n );\r\n};\r\n\r\nconst levelOptions = computed(() =>\r\n levels.map((level) =>\r\n getLevelData(level).map((item) => ({\r\n label: item.label,\r\n value: item.value,\r\n })),\r\n ),\r\n);\r\n\r\nconst handleChange = (index: number) => {\r\n selectedValues.value.splice(\r\n index + 1,\r\n levels.length - index - 1,\r\n ...Array(levels.length - index - 1).fill(null),\r\n );\r\n emitValue();\r\n};\r\n\r\nconst getSelectedItem = (index: number) => {\r\n const value = selectedValues.value[index];\r\n if (!value) return null;\r\n const data = getLevelData(index);\r\n const item = data.find((i) => i.value === value);\r\n return item ? { label: item.label, value: item.value } : null;\r\n};\r\n\r\nconst emitValue = () => {\r\n const result: CascadeValue = {\r\n primary: getSelectedItem(0),\r\n secondary: getSelectedItem(1),\r\n tertiary: getSelectedItem(2),\r\n };\r\n emit(\"update:modelValue\", result);\r\n emit(\"change\", result);\r\n};\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (val) => {\r\n selectedValues.value = [\r\n val?.primary?.value ?? null,\r\n val?.secondary?.value ?? null,\r\n val?.tertiary?.value ?? null,\r\n ];\r\n },\r\n { immediate: true, deep: true },\r\n);\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.n-cascade-selector {\r\n display: flex;\r\n gap: 12px;\r\n .n-select-item {\r\n min-width: 140px;\r\n flex: 1;\r\n }\r\n}\r\n</style>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-05-28\r\n * @Description: 级联选择组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"n-cascade-selector\">\r\n <NSelect\r\n v-for=\"(level, index) in levels\"\r\n :key=\"index\"\r\n v-model:value=\"selectedValues[index]\"\r\n :options=\"levelOptions[index]\"\r\n clearable\r\n :placeholder=\"placeholders[index]\"\r\n :disabled=\"index > 0 && !selectedValues[index - 1]\"\r\n @update:value=\"handleChange(index)\"\r\n class=\"n-select-item\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { ref, computed, watch } from \"vue\";\r\nimport { NSelect } from \"naive-ui\";\r\n\r\ndefineOptions({ name: \"C_Cascade\" });\r\n\r\nexport interface CascadeItem {\r\n label: string;\r\n value: string | number;\r\n children?: CascadeItem[];\r\n}\r\n\r\ninterface CascadeValue {\r\n primary?: Pick<CascadeItem, \"label\" | \"value\"> | null;\r\n secondary?: Pick<CascadeItem, \"label\" | \"value\"> | null;\r\n tertiary?: Pick<CascadeItem, \"label\" | \"value\"> | null;\r\n}\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n data: CascadeItem[];\r\n placeholders?: string[];\r\n modelValue?: CascadeValue;\r\n }>(),\r\n {\r\n placeholders: () => [\"请选择\", \"请选择\", \"请选择\"],\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n \"update:modelValue\": [value: CascadeValue];\r\n change: [value: CascadeValue];\r\n}>();\r\n\r\nconst levels = [0, 1, 2];\r\nconst selectedValues = ref<(string | number | null)[]>([null, null, null]);\r\n\r\nconst getLevelData = (level: number): CascadeItem[] => {\r\n if (level === 0) return props.data;\r\n if (!selectedValues.value[level - 1]) return [];\r\n const parentData = getLevelData(level - 1);\r\n return (\r\n parentData.find((x) => x.value === selectedValues.value[level - 1])\r\n ?.children || []\r\n );\r\n};\r\n\r\nconst levelOptions = computed(() =>\r\n levels.map((level) =>\r\n getLevelData(level).map((item) => ({\r\n label: item.label,\r\n value: item.value,\r\n })),\r\n ),\r\n);\r\n\r\nconst handleChange = (index: number) => {\r\n selectedValues.value.splice(\r\n index + 1,\r\n levels.length - index - 1,\r\n ...Array(levels.length - index - 1).fill(null),\r\n );\r\n emitValue();\r\n};\r\n\r\nconst getSelectedItem = (index: number) => {\r\n const value = selectedValues.value[index];\r\n if (!value) return null;\r\n const data = getLevelData(index);\r\n const item = data.find((i) => i.value === value);\r\n return item ? { label: item.label, value: item.value } : null;\r\n};\r\n\r\nconst emitValue = () => {\r\n const result: CascadeValue = {\r\n primary: getSelectedItem(0),\r\n secondary: getSelectedItem(1),\r\n tertiary: getSelectedItem(2),\r\n };\r\n emit(\"update:modelValue\", result);\r\n emit(\"change\", result);\r\n};\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (val) => {\r\n selectedValues.value = [\r\n val?.primary?.value ?? null,\r\n val?.secondary?.value ?? null,\r\n val?.tertiary?.value ?? null,\r\n ];\r\n },\r\n { immediate: true, deep: true },\r\n);\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.n-cascade-selector {\r\n display: flex;\r\n gap: 12px;\r\n .n-select-item {\r\n min-width: 140px;\r\n flex: 1;\r\n }\r\n}\r\n</style>\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;ECyCA,MAAM,QAAQ;EAWd,MAAM,OAAO;EAKb,MAAM,SAAS;GAAC;GAAG;GAAG;GAAE;EACxB,MAAM,iBAAiB,IAAgC;GAAC;GAAM;GAAM;GAAK,CAAC;EAE1E,MAAM,gBAAgB,UAAiC;AACrD,OAAI,UAAU,EAAG,QAAO,MAAM;AAC9B,OAAI,CAAC,eAAe,MAAM,QAAQ,GAAI,QAAO,EAAE;AAE/C,UADmB,aAAa,QAAQ,EAAE,CAE7B,MAAM,MAAM,EAAE,UAAU,eAAe,MAAM,QAAQ,GAAG,EAC/D,YAAY,EAAE;;EAItB,MAAM,eAAe,eACnB,OAAO,KAAK,UACV,aAAa,MAAM,CAAC,KAAK,UAAU;GACjC,OAAO,KAAK;GACZ,OAAO,KAAK;GACb,EAAE,CACJ,CACF;EAED,MAAM,gBAAgB,UAAkB;AACtC,kBAAe,MAAM,OACnB,QAAQ,GACR,OAAO,SAAS,QAAQ,GACxB,GAAG,MAAM,OAAO,SAAS,QAAQ,EAAE,CAAC,KAAK,KAAK,CAC/C;AACD,cAAW;;EAGb,MAAM,mBAAmB,UAAkB;GACzC,MAAM,QAAQ,eAAe,MAAM;AACnC,OAAI,CAAC,MAAO,QAAO;GAEnB,MAAM,OADO,aAAa,MAAM,CACd,MAAM,MAAM,EAAE,UAAU,MAAM;AAChD,UAAO,OAAO;IAAE,OAAO,KAAK;IAAO,OAAO,KAAK;IAAO,GAAG;;EAG3D,MAAM,kBAAkB;GACtB,MAAM,SAAuB;IAC3B,SAAS,gBAAgB,EAAE;IAC3B,WAAW,gBAAgB,EAAE;IAC7B,UAAU,gBAAgB,EAAE;IAC7B;AACD,QAAK,qBAAqB,OAAO;AACjC,QAAK,UAAU,OAAO;;AAGxB,cACQ,MAAM,aACX,QAAQ;AACP,kBAAe,QAAQ;IACrB,KAAK,SAAS,SAAS;IACvB,KAAK,WAAW,SAAS;IACzB,KAAK,UAAU,SAAS;IACzB;KAEH;GAAE,WAAW;GAAM,MAAM;GAAM,CAChC;;uBA5GC,mBAYM,OAZN,YAYM,eAXJ,mBAUE,UAAA,MAAA,WATyB,SAAjB,OAAO,UAAK;WADtB,YAUE,MAAA,QAAA,EAAA;KARC,KAAK;KACE,OAAO,eAAA,MAAe;oCAAf,eAAA,MAAe,SAAK,SAAA,WAKpB,aAAa,MAAK,CAAA;KAJhC,SAAS,aAAA,MAAa;KACvB,WAAA;KACC,aAAaA,KAAAA,aAAa;KAC1B,UAAU,QAAK,KAAA,CAAS,eAAA,MAAe,QAAK;KAE7C,OAAM"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"C_City-BCQ4ipiK.css","names":[],"sources":["../src/components/C_City/index.vue?vue&type=style&index=0&scoped=9639851e&lang.scss"],"sourcesContent":[".city-selector-trigger[data-v-9639851e] {\n display: inline-flex;\n align-items: center;\n justify-content: space-between;\n min-width: 200px;\n height: 34px;\n padding: 0 12px;\n border: 1px solid #e0e0e6;\n border-radius: 3px;\n cursor: pointer;\n transition: all 0.3s;\n}\n.city-selector-trigger[data-v-9639851e]:hover {\n border-color: var(--c-primary, #1890ff);\n}\n.city-selector-trigger__text[data-v-9639851e] {\n flex: 1;\n font-size: 14px;\n}\n.city-selector-trigger__icon[data-v-9639851e] {\n margin-left: 8px;\n color: #999;\n font-size: 16px;\n transition: transform 0.3s;\n}\n.city-selector-trigger__icon.is-active[data-v-9639851e] {\n transform: rotate(180deg);\n}\n.city-selector-content[data-v-9639851e] {\n display: flex;\n flex-direction: column;\n height: 500px;\n padding: 0;\n}\n.city-selector-header[data-v-9639851e] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n border-bottom: 1px solid rgba(247, 247, 247, 0.514);\n flex-shrink: 0;\n}\n.city-selector-header .city-selector-search[data-v-9639851e] {\n flex: 1;\n}\n.city-selector-letters[data-v-9639851e] {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin: 0 12px 10px;\n padding: 8px;\n flex-shrink: 0;\n}\n.city-selector-letters .city-selector-letter[data-v-9639851e] {\n padding: 2px 6px;\n cursor: pointer;\n color: var(--c-primary, #1890ff);\n font-size: 13px;\n font-weight: 500;\n transition: all 0.3s;\n min-width: 24px;\n text-align: center;\n}\n.city-selector-letters .city-selector-letter[data-v-9639851e]:hover {\n background-color: var(--c-primary, #1890ff);\n color: #fff;\n border-radius: 2px;\n}\n.city-selector-body[data-v-9639851e] {\n flex: 1;\n margin: 12px;\n margin-top: 8px;\n overflow: hidden;\n}\n.city-list[data-v-9639851e],\n.province-list[data-v-9639851e] {\n padding: 0 8px;\n}\n.city-group[data-v-9639851e],\n.province-group[data-v-9639851e] {\n display: flex;\n margin-bottom: 12px;\n padding-bottom: 12px;\n border-bottom: 1px solid rgba(247, 247, 247, 0.514);\n}\n.city-group[data-v-9639851e]:last-child,\n.province-group[data-v-9639851e]:last-child {\n border-bottom: none;\n margin-bottom: 0;\n padding-bottom: 0;\n}\n.city-group__letter[data-v-9639851e], .city-group__name[data-v-9639851e],\n.province-group__letter[data-v-9639851e],\n.province-group__name[data-v-9639851e] {\n flex-shrink: 0;\n width: 70px;\n font-weight: 500;\n font-size: 14px;\n line-height: 28px;\n}\n.city-group__cities[data-v-9639851e],\n.province-group__cities[data-v-9639851e] {\n flex: 1;\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n align-items: flex-start;\n}\n.city-item[data-v-9639851e] {\n padding: 3px 10px;\n cursor: pointer;\n font-size: 13px;\n border-radius: 2px;\n transition: all 0.3s;\n line-height: 20px;\n}\n.city-item[data-v-9639851e]:hover {\n background-color: #f0f0f0;\n color: var(--c-primary, #1890ff);\n}\n.city-item.is-active[data-v-9639851e] {\n background-color: var(--c-primary, #1890ff);\n color: #fff;\n}\n[data-v-9639851e] .n-scrollbar .n-scrollbar-rail {\n right: 2px;\n}\n[data-v-9639851e] .n-scrollbar .n-scrollbar-content {\n padding-right: 12px;\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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
|
package/dist/C_City.cjs
ADDED
package/dist/C_City.d.ts
ADDED
package/dist/C_City.js
ADDED