@cynnie/ui-shadcn 0.1.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 +49 -0
- package/dist/Checkbox-DswwIgpU.js +38 -0
- package/dist/Checkbox-DswwIgpU.js.map +1 -0
- package/dist/DialogTitle-CCJNart2.js +107 -0
- package/dist/DialogTitle-CCJNart2.js.map +1 -0
- package/dist/Input-BQYIq9cS.js +24 -0
- package/dist/Input-BQYIq9cS.js.map +1 -0
- package/dist/Loader-DZyMmrI8.js +19 -0
- package/dist/Loader-DZyMmrI8.js.map +1 -0
- package/dist/ProButton-BQWpTTCy.js +84 -0
- package/dist/ProButton-BQWpTTCy.js.map +1 -0
- package/dist/ProCheckboxGroup-DX6c9gx-.js +71 -0
- package/dist/ProCheckboxGroup-DX6c9gx-.js.map +1 -0
- package/dist/ProConfirmButton-zcvp7NcN.js +175 -0
- package/dist/ProConfirmButton-zcvp7NcN.js.map +1 -0
- package/dist/ProDescriptions-B1znLzkY.js +45 -0
- package/dist/ProDescriptions-B1znLzkY.js.map +1 -0
- package/dist/ProFormBuilder-CsNShZ0y.js +1138 -0
- package/dist/ProFormBuilder-CsNShZ0y.js.map +1 -0
- package/dist/ProInput-D20F1Xx-.js +91 -0
- package/dist/ProInput-D20F1Xx-.js.map +1 -0
- package/dist/ProModal-DsIFQ8y5.js +109 -0
- package/dist/ProModal-DsIFQ8y5.js.map +1 -0
- package/dist/ProRadioGroup-CTxqLQjw.js +138 -0
- package/dist/ProRadioGroup-CTxqLQjw.js.map +1 -0
- package/dist/ProSelect-DT0zjDjT.js +90 -0
- package/dist/ProSelect-DT0zjDjT.js.map +1 -0
- package/dist/ProTable-CP1Mc52q.js +349 -0
- package/dist/ProTable-CP1Mc52q.js.map +1 -0
- package/dist/SelectValue-CWl9zUW3.js +163 -0
- package/dist/SelectValue-CWl9zUW3.js.map +1 -0
- package/dist/button-BQVT6mY3.js +60 -0
- package/dist/button-BQVT6mY3.js.map +1 -0
- package/dist/components/ProButton/ProCountdownButton.vue.d.ts +28 -0
- package/dist/components/ProButton/index.js +2 -0
- package/dist/components/ProButton/index.vue.d.ts +31 -0
- package/dist/components/ProCheckboxGroup/index.js +2 -0
- package/dist/components/ProCheckboxGroup/index.vue.d.ts +18 -0
- package/dist/components/ProConfirmButton/index.js +2 -0
- package/dist/components/ProConfirmButton/index.vue.d.ts +43 -0
- package/dist/components/ProDescriptions/index.js +2 -0
- package/dist/components/ProDescriptions/index.vue.d.ts +40 -0
- package/dist/components/ProFormBuilder/index.js +2 -0
- package/dist/components/ProFormBuilder/index.vue.d.ts +43 -0
- package/dist/components/ProInput/index.js +2 -0
- package/dist/components/ProInput/index.vue.d.ts +27 -0
- package/dist/components/ProModal/index.js +2 -0
- package/dist/components/ProModal/index.vue.d.ts +45 -0
- package/dist/components/ProRadioGroup/index.js +2 -0
- package/dist/components/ProRadioGroup/index.vue.d.ts +20 -0
- package/dist/components/ProSelect/index.js +2 -0
- package/dist/components/ProSelect/index.vue.d.ts +28 -0
- package/dist/components/ProTable/ProTableForm.vue.d.ts +91 -0
- package/dist/components/ProTable/index.js +2 -0
- package/dist/components/ProTable/index.vue.d.ts +36 -0
- package/dist/components/index.d.ts +12 -0
- package/dist/components/ui/alert/Alert.vue.d.ts +22 -0
- package/dist/components/ui/alert/index.d.ts +6 -0
- package/dist/components/ui/button/Button.vue.d.ts +27 -0
- package/dist/components/ui/button/index.d.ts +7 -0
- package/dist/components/ui/checkbox/Checkbox.vue.d.ts +11 -0
- package/dist/components/ui/checkbox/index.d.ts +1 -0
- package/dist/components/ui/dialog/Dialog.vue.d.ts +22 -0
- package/dist/components/ui/dialog/DialogClose.vue.d.ts +18 -0
- package/dist/components/ui/dialog/DialogContent.vue.d.ts +36 -0
- package/dist/components/ui/dialog/DialogDescription.vue.d.ts +22 -0
- package/dist/components/ui/dialog/DialogFooter.vue.d.ts +21 -0
- package/dist/components/ui/dialog/DialogHeader.vue.d.ts +21 -0
- package/dist/components/ui/dialog/DialogTitle.vue.d.ts +22 -0
- package/dist/components/ui/dialog/DialogTrigger.vue.d.ts +18 -0
- package/dist/components/ui/dialog/index.d.ts +8 -0
- package/dist/components/ui/index.d.ts +12 -0
- package/dist/components/ui/input/Input.vue.d.ts +13 -0
- package/dist/components/ui/input/index.d.ts +1 -0
- package/dist/components/ui/label/Label.vue.d.ts +24 -0
- package/dist/components/ui/label/index.d.ts +1 -0
- package/dist/components/ui/loader/Loader.vue.d.ts +6 -0
- package/dist/components/ui/loader/index.d.ts +1 -0
- package/dist/components/ui/popover/Popover.vue.d.ts +22 -0
- package/dist/components/ui/popover/PopoverContent.vue.d.ts +38 -0
- package/dist/components/ui/popover/PopoverTrigger.vue.d.ts +18 -0
- package/dist/components/ui/popover/index.d.ts +3 -0
- package/dist/components/ui/radio-group/RadioGroup.vue.d.ts +22 -0
- package/dist/components/ui/radio-group/RadioGroupItem.vue.d.ts +7 -0
- package/dist/components/ui/radio-group/index.d.ts +2 -0
- package/dist/components/ui/select/Select.vue.d.ts +19 -0
- package/dist/components/ui/select/SelectContent.vue.d.ts +32 -0
- package/dist/components/ui/select/SelectItem.vue.d.ts +22 -0
- package/dist/components/ui/select/SelectTrigger.vue.d.ts +21 -0
- package/dist/components/ui/select/SelectValue.vue.d.ts +21 -0
- package/dist/components/ui/select/index.d.ts +5 -0
- package/dist/components/ui/table/Table.vue.d.ts +21 -0
- package/dist/components/ui/table/TableBody.vue.d.ts +21 -0
- package/dist/components/ui/table/TableCell.vue.d.ts +21 -0
- package/dist/components/ui/table/TableHead.vue.d.ts +21 -0
- package/dist/components/ui/table/TableHeader.vue.d.ts +21 -0
- package/dist/components/ui/table/TableRow.vue.d.ts +21 -0
- package/dist/components/ui/table/index.d.ts +6 -0
- package/dist/components/ui/textarea/Textarea.vue.d.ts +13 -0
- package/dist/components/ui/textarea/index.d.ts +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +65 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/openDialog-CVp3qAfm.js +95 -0
- package/dist/openDialog-CVp3qAfm.js.map +1 -0
- package/dist/utils/openDialog.d.ts +25 -0
- package/dist/utils/openDialog.js +2 -0
- package/dist/utils/uiMessage.d.ts +8 -0
- package/dist/utils-Dg1mr-yh.js +8 -0
- package/dist/utils-Dg1mr-yh.js.map +1 -0
- package/package.json +108 -0
- package/src/style.css +14 -0
- package/src/tailwind.preset.css +139 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { t as Button_default } from "./button-BQVT6mY3.js";
|
|
2
|
+
import { a as Dialog_default, i as DialogContent_default, n as DialogHeader_default, r as DialogFooter_default, t as DialogTitle_default } from "./DialogTitle-CCJNart2.js";
|
|
3
|
+
import { t as Loader_default } from "./Loader-DZyMmrI8.js";
|
|
4
|
+
import { computed, createBlock, createCommentVNode, createElementVNode, createTextVNode, createVNode, defineComponent, mergeModels, mergeProps, openBlock, ref, renderSlot, toDisplayString, unref, useModel, watch, withCtx } from "vue";
|
|
5
|
+
var _hoisted_1 = { class: "py-1" };
|
|
6
|
+
var ProModal_default = /* @__PURE__ */ defineComponent({
|
|
7
|
+
name: "ProModal",
|
|
8
|
+
inheritAttrs: false,
|
|
9
|
+
__name: "index",
|
|
10
|
+
props: /* @__PURE__ */ mergeModels({
|
|
11
|
+
beforeOk: {},
|
|
12
|
+
title: { default: "" },
|
|
13
|
+
width: {},
|
|
14
|
+
okText: { default: "确 定" },
|
|
15
|
+
cancelText: { default: "取 消" }
|
|
16
|
+
}, {
|
|
17
|
+
"open": {
|
|
18
|
+
type: Boolean,
|
|
19
|
+
default: false
|
|
20
|
+
},
|
|
21
|
+
"openModifiers": {}
|
|
22
|
+
}),
|
|
23
|
+
emits: /* @__PURE__ */ mergeModels(["ok", "cancel"], ["update:open"]),
|
|
24
|
+
setup(__props, { emit: __emit }) {
|
|
25
|
+
const props = __props;
|
|
26
|
+
const emit = __emit;
|
|
27
|
+
const open = useModel(__props, "open");
|
|
28
|
+
const isLoading = ref(false);
|
|
29
|
+
watch(open, (value) => {
|
|
30
|
+
if (value) isLoading.value = false;
|
|
31
|
+
});
|
|
32
|
+
const widthStyle = computed(() => {
|
|
33
|
+
if (!props.width) return void 0;
|
|
34
|
+
return {
|
|
35
|
+
width: typeof props.width === "number" ? `${props.width}px` : props.width,
|
|
36
|
+
maxWidth: "calc(100% - 2rem)"
|
|
37
|
+
};
|
|
38
|
+
});
|
|
39
|
+
async function handleOk() {
|
|
40
|
+
if (props.beforeOk) {
|
|
41
|
+
isLoading.value = true;
|
|
42
|
+
try {
|
|
43
|
+
if (await props.beforeOk() === false) return;
|
|
44
|
+
} catch {
|
|
45
|
+
return;
|
|
46
|
+
} finally {
|
|
47
|
+
isLoading.value = false;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
open.value = false;
|
|
51
|
+
emit("ok");
|
|
52
|
+
}
|
|
53
|
+
function handleCancel() {
|
|
54
|
+
open.value = false;
|
|
55
|
+
emit("cancel");
|
|
56
|
+
}
|
|
57
|
+
return (_ctx, _cache) => {
|
|
58
|
+
return openBlock(), createBlock(unref(Dialog_default), {
|
|
59
|
+
open: open.value,
|
|
60
|
+
"onUpdate:open": _cache[0] || (_cache[0] = ($event) => open.value = $event)
|
|
61
|
+
}, {
|
|
62
|
+
default: withCtx(() => [createVNode(unref(DialogContent_default), mergeProps({ style: widthStyle.value }, {
|
|
63
|
+
..._ctx.$attrs,
|
|
64
|
+
class: void 0,
|
|
65
|
+
style: void 0,
|
|
66
|
+
title: void 0
|
|
67
|
+
}), {
|
|
68
|
+
default: withCtx(() => [
|
|
69
|
+
createVNode(unref(DialogHeader_default), null, {
|
|
70
|
+
default: withCtx(() => [createVNode(unref(DialogTitle_default), null, {
|
|
71
|
+
default: withCtx(() => [createTextVNode(toDisplayString(_ctx.title), 1)]),
|
|
72
|
+
_: 1
|
|
73
|
+
})]),
|
|
74
|
+
_: 1
|
|
75
|
+
}),
|
|
76
|
+
createElementVNode("div", _hoisted_1, [renderSlot(_ctx.$slots, "default")]),
|
|
77
|
+
!_ctx.$slots.footer ? (openBlock(), createBlock(unref(DialogFooter_default), {
|
|
78
|
+
key: 0,
|
|
79
|
+
class: "gap-2"
|
|
80
|
+
}, {
|
|
81
|
+
default: withCtx(() => [createVNode(unref(Button_default), {
|
|
82
|
+
variant: "outline",
|
|
83
|
+
onClick: handleCancel
|
|
84
|
+
}, {
|
|
85
|
+
default: withCtx(() => [createTextVNode(toDisplayString(_ctx.cancelText), 1)]),
|
|
86
|
+
_: 1
|
|
87
|
+
}), createVNode(unref(Button_default), {
|
|
88
|
+
disabled: isLoading.value || void 0,
|
|
89
|
+
onClick: handleOk
|
|
90
|
+
}, {
|
|
91
|
+
default: withCtx(() => [isLoading.value ? (openBlock(), createBlock(unref(Loader_default), {
|
|
92
|
+
key: 0,
|
|
93
|
+
class: "text-current"
|
|
94
|
+
})) : createCommentVNode("", true), createTextVNode(" " + toDisplayString(_ctx.okText), 1)]),
|
|
95
|
+
_: 1
|
|
96
|
+
}, 8, ["disabled"])]),
|
|
97
|
+
_: 1
|
|
98
|
+
})) : renderSlot(_ctx.$slots, "footer", { key: 1 })
|
|
99
|
+
]),
|
|
100
|
+
_: 3
|
|
101
|
+
}, 16, ["style"])]),
|
|
102
|
+
_: 3
|
|
103
|
+
}, 8, ["open"]);
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
export { ProModal_default as t };
|
|
108
|
+
|
|
109
|
+
//# sourceMappingURL=ProModal-DsIFQ8y5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProModal-DsIFQ8y5.js","names":["$attrs","title","$slots","cancelText","okText"],"sources":["../src/components/ProModal/index.vue","../src/components/ProModal/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, watch } from \"vue\";\nimport { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from \"../ui/dialog\";\nimport { Button } from \"../ui/button\";\nimport { Loader } from \"../ui/loader\";\n\ndefineOptions({\n name: \"ProModal\",\n inheritAttrs: false,\n});\n\nconst props = withDefaults(\n defineProps<{\n /** 点确定时先执行:返回 false 或 reject 则不关闭(适合放校验/保存逻辑) */\n beforeOk?: () => Promise<any> | any;\n /** 标题 */\n title?: string;\n /** 弹窗宽度,对齐 antd 的 width(数字按 px,字符串原样) */\n width?: string | number;\n /** 确定按钮文案 */\n okText?: string;\n /** 取消按钮文案 */\n cancelText?: string;\n }>(),\n {\n title: \"\",\n okText: \"确 定\",\n cancelText: \"取 消\",\n },\n);\n\nconst emit = defineEmits([\"ok\", \"cancel\"]);\n\nconst open = defineModel<boolean>(\"open\", { default: false });\n\nconst isLoading = ref(false);\n\nwatch(open, (value) => {\n // 每次打开时复位 loading\n if (value) isLoading.value = false;\n});\n\nconst widthStyle = computed(() => {\n if (!props.width) return undefined;\n return { width: typeof props.width === \"number\" ? `${props.width}px` : props.width, maxWidth: \"calc(100% - 2rem)\" };\n});\n\n// DialogContent 默认有关闭按钮和 gap-4 布局;footer 通过插槽透传由本组件组装\nasync function handleOk() {\n if (props.beforeOk) {\n isLoading.value = true;\n try {\n const result = await props.beforeOk();\n // 显式返回 false 视为拦截\n if (result === false) return;\n } catch {\n // 抛错同样拦截,不关闭\n return;\n } finally {\n isLoading.value = false;\n }\n }\n open.value = false;\n emit(\"ok\");\n}\n\nfunction handleCancel() {\n open.value = false;\n emit(\"cancel\");\n}\n</script>\n\n<template>\n <Dialog v-model:open=\"open\">\n <DialogContent :style=\"widthStyle\" v-bind=\"{ ...$attrs, class: undefined, style: undefined, title: undefined }\">\n <DialogHeader>\n <DialogTitle>{{ title }}</DialogTitle>\n </DialogHeader>\n\n <div class=\"py-1\">\n <slot></slot>\n </div>\n\n <DialogFooter v-if=\"!$slots.footer\" class=\"gap-2\">\n <Button variant=\"outline\" @click=\"handleCancel\">{{ cancelText }}</Button>\n <Button :disabled=\"isLoading || undefined\" @click=\"handleOk\">\n <Loader v-if=\"isLoading\" class=\"text-current\" />\n {{ okText }}\n </Button>\n </DialogFooter>\n <slot v-else name=\"footer\"></slot>\n </DialogContent>\n </Dialog>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from \"vue\";\nimport { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from \"../ui/dialog\";\nimport { Button } from \"../ui/button\";\nimport { Loader } from \"../ui/loader\";\n\ndefineOptions({\n name: \"ProModal\",\n inheritAttrs: false,\n});\n\nconst props = withDefaults(\n defineProps<{\n /** 点确定时先执行:返回 false 或 reject 则不关闭(适合放校验/保存逻辑) */\n beforeOk?: () => Promise<any> | any;\n /** 标题 */\n title?: string;\n /** 弹窗宽度,对齐 antd 的 width(数字按 px,字符串原样) */\n width?: string | number;\n /** 确定按钮文案 */\n okText?: string;\n /** 取消按钮文案 */\n cancelText?: string;\n }>(),\n {\n title: \"\",\n okText: \"确 定\",\n cancelText: \"取 消\",\n },\n);\n\nconst emit = defineEmits([\"ok\", \"cancel\"]);\n\nconst open = defineModel<boolean>(\"open\", { default: false });\n\nconst isLoading = ref(false);\n\nwatch(open, (value) => {\n // 每次打开时复位 loading\n if (value) isLoading.value = false;\n});\n\nconst widthStyle = computed(() => {\n if (!props.width) return undefined;\n return { width: typeof props.width === \"number\" ? `${props.width}px` : props.width, maxWidth: \"calc(100% - 2rem)\" };\n});\n\n// DialogContent 默认有关闭按钮和 gap-4 布局;footer 通过插槽透传由本组件组装\nasync function handleOk() {\n if (props.beforeOk) {\n isLoading.value = true;\n try {\n const result = await props.beforeOk();\n // 显式返回 false 视为拦截\n if (result === false) return;\n } catch {\n // 抛错同样拦截,不关闭\n return;\n } finally {\n isLoading.value = false;\n }\n }\n open.value = false;\n emit(\"ok\");\n}\n\nfunction handleCancel() {\n open.value = false;\n emit(\"cancel\");\n}\n</script>\n\n<template>\n <Dialog v-model:open=\"open\">\n <DialogContent :style=\"widthStyle\" v-bind=\"{ ...$attrs, class: undefined, style: undefined, title: undefined }\">\n <DialogHeader>\n <DialogTitle>{{ title }}</DialogTitle>\n </DialogHeader>\n\n <div class=\"py-1\">\n <slot></slot>\n </div>\n\n <DialogFooter v-if=\"!$slots.footer\" class=\"gap-2\">\n <Button variant=\"outline\" @click=\"handleCancel\">{{ cancelText }}</Button>\n <Button :disabled=\"isLoading || undefined\" @click=\"handleOk\">\n <Loader v-if=\"isLoading\" class=\"text-current\" />\n {{ okText }}\n </Button>\n </DialogFooter>\n <slot v-else name=\"footer\"></slot>\n </DialogContent>\n </Dialog>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;ECWA,MAAM,QAAQ;EAoBd,MAAM,OAAO;EAEb,MAAM,OAAO,SAAoB,SAAC,OAA2B;EAE7D,MAAM,YAAY,IAAI,MAAM;AAE5B,QAAM,OAAO,UAAU;AAErB,OAAI,MAAO,WAAU,QAAQ;IAC7B;EAEF,MAAM,aAAa,eAAe;AAChC,OAAI,CAAC,MAAM,MAAO,QAAO,KAAA;AACzB,UAAO;IAAE,OAAO,OAAO,MAAM,UAAU,WAAW,GAAG,MAAM,MAAM,MAAM,MAAM;IAAO,UAAU;IAAqB;IACnH;EAGF,eAAe,WAAW;AACxB,OAAI,MAAM,UAAU;AAClB,cAAU,QAAQ;AAClB,QAAI;AAGF,SAFe,MAAM,MAAM,UAAU,KAEtB,MAAO;YAChB;AAEN;cACQ;AACR,eAAU,QAAQ;;;AAGtB,QAAK,QAAQ;AACb,QAAK,KAAK;;EAGZ,SAAS,eAAe;AACtB,QAAK,QAAQ;AACb,QAAK,SAAS;;;uBAKd,YAmBS,MAAA,eAAA,EAAA;IAnBO,MAAM,KAAA;gEAAI,QAAA;;2BAkBR,CAjBhB,YAiBgB,MAAA,sBAAA,EAjBhB,WAiBgB,EAjBA,OAAO,WAAA,OAAU,EAAA;KAAA,GAAeA,KAAAA;KAAM,OAAS,KAAA;KAAS,OAAS,KAAA;KAAS,OAAS,KAAA;KAAS,CAAA,EAAA;4BAG3F;MAFf,YAEe,MAAA,qBAAA,EAAA,MAAA;8BADyB,CAAtC,YAAsC,MAAA,oBAAA,EAAA,MAAA;+BAAd,CAAA,gBAAA,gBAARC,KAAAA,MAAK,EAAA,EAAA,CAAA,CAAA;;;;;MAGvB,mBAEM,OAFN,YAEM,CADJ,WAAa,KAAA,QAAA,UAAA,CAAA,CAAA;OAGMC,KAAAA,OAAO,UAAA,WAAA,EAA5B,YAMe,MAAA,qBAAA,EAAA;;OANqB,OAAM;;8BACiC,CAAzE,YAAyE,MAAA,eAAA,EAAA;QAAjE,SAAQ;QAAW,SAAO;;+BAA8B,CAAA,gBAAA,gBAAbC,KAAAA,WAAU,EAAA,EAAA,CAAA,CAAA;;WAC7D,YAGS,MAAA,eAAA,EAAA;QAHA,UAAU,UAAA,SAAa,KAAA;QAAY,SAAO;;+BACD,CAAlC,UAAA,SAAA,WAAA,EAAd,YAAgD,MAAA,eAAA,EAAA;;SAAvB,OAAM;4DAAiB,MAChD,gBAAGC,KAAAA,OAAM,EAAA,EAAA,CAAA,CAAA;;;;YAGb,WAAkC,KAAA,QAAA,UAAA,EAAA,KAAA,GAAA,CAAA"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { t as cn } from "./utils-Dg1mr-yh.js";
|
|
2
|
+
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createTextVNode, createVNode, defineComponent, mergeModels, mergeProps, normalizeClass, openBlock, renderList, renderSlot, toDisplayString, unref, useModel, withCtx } from "vue";
|
|
3
|
+
import { RadioGroupIndicator, RadioGroupItem, RadioGroupRoot, useForwardPropsEmits } from "reka-ui";
|
|
4
|
+
import { CircleIcon } from "lucide-vue-next";
|
|
5
|
+
import { useOptions } from "@cynnie/ui-core";
|
|
6
|
+
var RadioGroup_default = /* @__PURE__ */ defineComponent({
|
|
7
|
+
__name: "RadioGroup",
|
|
8
|
+
props: {
|
|
9
|
+
modelValue: {},
|
|
10
|
+
defaultValue: {},
|
|
11
|
+
disabled: { type: Boolean },
|
|
12
|
+
orientation: {},
|
|
13
|
+
dir: {},
|
|
14
|
+
loop: { type: Boolean },
|
|
15
|
+
asChild: { type: Boolean },
|
|
16
|
+
as: {},
|
|
17
|
+
name: {},
|
|
18
|
+
required: { type: Boolean }
|
|
19
|
+
},
|
|
20
|
+
emits: ["update:modelValue"],
|
|
21
|
+
setup(__props, { emit: __emit }) {
|
|
22
|
+
const delegatedProps = useForwardPropsEmits(__props, __emit);
|
|
23
|
+
return (_ctx, _cache) => {
|
|
24
|
+
return openBlock(), createBlock(unref(RadioGroupRoot), mergeProps({ "data-slot": "radio-group" }, unref(delegatedProps), { class: "grid gap-3" }), {
|
|
25
|
+
default: withCtx(() => [renderSlot(_ctx.$slots, "default")]),
|
|
26
|
+
_: 3
|
|
27
|
+
}, 16);
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
var RadioGroupItem_default = /* @__PURE__ */ defineComponent({
|
|
32
|
+
__name: "RadioGroupItem",
|
|
33
|
+
props: {
|
|
34
|
+
id: {},
|
|
35
|
+
value: {},
|
|
36
|
+
disabled: { type: Boolean },
|
|
37
|
+
asChild: { type: Boolean },
|
|
38
|
+
as: {},
|
|
39
|
+
name: {},
|
|
40
|
+
required: { type: Boolean },
|
|
41
|
+
class: {}
|
|
42
|
+
},
|
|
43
|
+
setup(__props) {
|
|
44
|
+
const props = __props;
|
|
45
|
+
return (_ctx, _cache) => {
|
|
46
|
+
return openBlock(), createBlock(unref(RadioGroupItem), mergeProps({ "data-slot": "radio-group-item" }, props, { class: unref(cn)("border-input text-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 aspect-square size-4 shrink-0 rounded-full border shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 cursor-pointer", props.class) }), {
|
|
47
|
+
default: withCtx(() => [createVNode(unref(RadioGroupIndicator), { class: "relative flex items-center justify-center" }, {
|
|
48
|
+
default: withCtx(() => [createVNode(unref(CircleIcon), { class: "fill-primary absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2" })]),
|
|
49
|
+
_: 1
|
|
50
|
+
})]),
|
|
51
|
+
_: 1
|
|
52
|
+
}, 16, ["class"]);
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
var _hoisted_1 = ["disabled", "onClick"];
|
|
57
|
+
var ProRadioGroup_default = /* @__PURE__ */ defineComponent({
|
|
58
|
+
name: "ProRadioGroup",
|
|
59
|
+
inheritAttrs: false,
|
|
60
|
+
__name: "index",
|
|
61
|
+
props: /* @__PURE__ */ mergeModels({
|
|
62
|
+
options: {},
|
|
63
|
+
labelField: {},
|
|
64
|
+
valueField: {},
|
|
65
|
+
deps: {},
|
|
66
|
+
optionType: {}
|
|
67
|
+
}, {
|
|
68
|
+
"modelValue": {},
|
|
69
|
+
"modelModifiers": {}
|
|
70
|
+
}),
|
|
71
|
+
emits: ["update:modelValue"],
|
|
72
|
+
setup(__props) {
|
|
73
|
+
const props = __props;
|
|
74
|
+
const model = useModel(__props, "modelValue");
|
|
75
|
+
const { options: innerOptions } = useOptions({
|
|
76
|
+
options: computed(() => props.options),
|
|
77
|
+
deps: computed(() => props.deps)
|
|
78
|
+
});
|
|
79
|
+
function toOption(item) {
|
|
80
|
+
if (item && typeof item === "object" && "label" in item) return item;
|
|
81
|
+
return {
|
|
82
|
+
label: props.labelField ? item[props.labelField] : item,
|
|
83
|
+
value: props.valueField ? item[props.valueField] : item
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
const normalizedOptions = computed(() => innerOptions.value.map(toOption));
|
|
87
|
+
function onValueChange(value) {
|
|
88
|
+
model.value = value;
|
|
89
|
+
}
|
|
90
|
+
return (_ctx, _cache) => {
|
|
91
|
+
return _ctx.optionType === "button" ? (openBlock(), createElementBlock("div", mergeProps({ key: 0 }, {
|
|
92
|
+
..._ctx.$attrs,
|
|
93
|
+
class: void 0,
|
|
94
|
+
style: void 0
|
|
95
|
+
}, {
|
|
96
|
+
class: unref(cn)("inline-flex rounded-md border p-0.5 bg-muted/40", _ctx.$attrs.class),
|
|
97
|
+
style: _ctx.$attrs.style
|
|
98
|
+
}), [(openBlock(true), createElementBlock(Fragment, null, renderList(normalizedOptions.value, (opt) => {
|
|
99
|
+
return openBlock(), createElementBlock("button", {
|
|
100
|
+
key: opt.value,
|
|
101
|
+
type: "button",
|
|
102
|
+
disabled: opt.disabled,
|
|
103
|
+
class: normalizeClass(["rounded-[4px] px-3 py-1 text-sm transition-colors cursor-pointer disabled:cursor-not-allowed disabled:opacity-50", model.value === opt.value ? "bg-background text-foreground shadow-xs font-medium" : "text-muted-foreground hover:text-foreground"]),
|
|
104
|
+
onClick: ($event) => onValueChange(opt.value)
|
|
105
|
+
}, toDisplayString(opt.label), 11, _hoisted_1);
|
|
106
|
+
}), 128))], 16)) : (openBlock(), createBlock(unref(RadioGroup_default), mergeProps({
|
|
107
|
+
key: 1,
|
|
108
|
+
"model-value": model.value
|
|
109
|
+
}, {
|
|
110
|
+
..._ctx.$attrs,
|
|
111
|
+
class: void 0,
|
|
112
|
+
style: void 0
|
|
113
|
+
}, {
|
|
114
|
+
class: unref(cn)("flex flex-wrap items-center gap-x-6 gap-y-2", _ctx.$attrs.class),
|
|
115
|
+
style: _ctx.$attrs.style,
|
|
116
|
+
"onUpdate:modelValue": onValueChange
|
|
117
|
+
}), {
|
|
118
|
+
default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(normalizedOptions.value, (opt) => {
|
|
119
|
+
return openBlock(), createElementBlock("label", {
|
|
120
|
+
key: opt.value,
|
|
121
|
+
class: "flex cursor-pointer items-center gap-2 text-sm font-normal has-[[data-state=checked]]:text-primary has-[[data-disabled]]:cursor-not-allowed has-[[data-disabled]]:opacity-50"
|
|
122
|
+
}, [createVNode(unref(RadioGroupItem_default), {
|
|
123
|
+
value: opt.value,
|
|
124
|
+
disabled: opt.disabled
|
|
125
|
+
}, null, 8, ["value", "disabled"]), createTextVNode(" " + toDisplayString(opt.label), 1)]);
|
|
126
|
+
}), 128))]),
|
|
127
|
+
_: 1
|
|
128
|
+
}, 16, [
|
|
129
|
+
"model-value",
|
|
130
|
+
"class",
|
|
131
|
+
"style"
|
|
132
|
+
]));
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
export { ProRadioGroup_default as t };
|
|
137
|
+
|
|
138
|
+
//# sourceMappingURL=ProRadioGroup-CTxqLQjw.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProRadioGroup-CTxqLQjw.js","names":["optionType","$attrs"],"sources":["../src/components/ui/radio-group/RadioGroup.vue","../src/components/ui/radio-group/RadioGroup.vue","../src/components/ui/radio-group/RadioGroupItem.vue","../src/components/ui/radio-group/RadioGroupItem.vue","../src/components/ProRadioGroup/index.vue","../src/components/ProRadioGroup/index.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { RadioGroupRootEmits, RadioGroupRootProps } from \"reka-ui\";\nimport { RadioGroupRoot, useForwardPropsEmits } from \"reka-ui\";\n\nconst props = defineProps<RadioGroupRootProps>();\nconst emits = defineEmits<RadioGroupRootEmits>();\n\nconst delegatedProps = useForwardPropsEmits(props, emits);\n</script>\n\n<template>\n <RadioGroupRoot data-slot=\"radio-group\" v-bind=\"delegatedProps\" class=\"grid gap-3\">\n <slot />\n </RadioGroupRoot>\n</template>\n","<script lang=\"ts\" setup>\nimport type { RadioGroupRootEmits, RadioGroupRootProps } from \"reka-ui\";\nimport { RadioGroupRoot, useForwardPropsEmits } from \"reka-ui\";\n\nconst props = defineProps<RadioGroupRootProps>();\nconst emits = defineEmits<RadioGroupRootEmits>();\n\nconst delegatedProps = useForwardPropsEmits(props, emits);\n</script>\n\n<template>\n <RadioGroupRoot data-slot=\"radio-group\" v-bind=\"delegatedProps\" class=\"grid gap-3\">\n <slot />\n </RadioGroupRoot>\n</template>\n","<script lang=\"ts\" setup>\nimport type { RadioGroupItemProps } from \"reka-ui\";\nimport type { HTMLAttributes } from \"vue\";\nimport { RadioGroupIndicator, RadioGroupItem } from \"reka-ui\";\nimport { CircleIcon } from \"lucide-vue-next\";\nimport { cn } from \"../../../lib/utils\";\n\nconst props = defineProps<RadioGroupItemProps & { class?: HTMLAttributes[\"class\"] }>();\n</script>\n\n<template>\n <RadioGroupItem\n data-slot=\"radio-group-item\"\n v-bind=\"props\"\n :class=\"\n cn(\n 'border-input text-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 aspect-square size-4 shrink-0 rounded-full border shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 cursor-pointer',\n props.class,\n )\n \"\n >\n <RadioGroupIndicator class=\"relative flex items-center justify-center\">\n <CircleIcon class=\"fill-primary absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2\" />\n </RadioGroupIndicator>\n </RadioGroupItem>\n</template>\n","<script lang=\"ts\" setup>\nimport type { RadioGroupItemProps } from \"reka-ui\";\nimport type { HTMLAttributes } from \"vue\";\nimport { RadioGroupIndicator, RadioGroupItem } from \"reka-ui\";\nimport { CircleIcon } from \"lucide-vue-next\";\nimport { cn } from \"../../../lib/utils\";\n\nconst props = defineProps<RadioGroupItemProps & { class?: HTMLAttributes[\"class\"] }>();\n</script>\n\n<template>\n <RadioGroupItem\n data-slot=\"radio-group-item\"\n v-bind=\"props\"\n :class=\"\n cn(\n 'border-input text-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 aspect-square size-4 shrink-0 rounded-full border shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 cursor-pointer',\n props.class,\n )\n \"\n >\n <RadioGroupIndicator class=\"relative flex items-center justify-center\">\n <CircleIcon class=\"fill-primary absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2\" />\n </RadioGroupIndicator>\n </RadioGroupItem>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { useOptions } from \"@cynnie/ui-core\";\nimport { RadioGroup, RadioGroupItem } from \"../ui/radio-group\";\nimport { cn } from \"../../lib/utils\";\n\ndefineOptions({\n name: \"ProRadioGroup\",\n inheritAttrs: false,\n});\n\nconst props = defineProps<{\n /** 选项数据源:静态数组 / 字符串数组 / 返回数组的函数(远程字典) */\n options?: any;\n /** options 里 label / value 的字段名 */\n labelField?: string;\n valueField?: string;\n /** 远程字典的依赖值,变化时自动重新拉取 */\n deps?: any;\n /** 按钮样式(对齐 antd 的 option-type=\"button\",shadcn 版渲染为胶囊分段控件) */\n optionType?: string;\n}>();\n\nconst model = defineModel<any>();\n\nconst { options: innerOptions } = useOptions({\n options: computed(() => props.options),\n deps: computed(() => props.deps),\n});\n\nfunction toOption(item: any) {\n if (item && typeof item === \"object\" && \"label\" in item) return item;\n return {\n label: props.labelField ? item[props.labelField] : item,\n value: props.valueField ? item[props.valueField] : item,\n };\n}\n\nconst normalizedOptions = computed(() => innerOptions.value.map(toOption));\n\nfunction onValueChange(value: any) {\n model.value = value;\n}\n</script>\n\n<template>\n <!-- button 样式:胶囊分段控件 -->\n <div\n v-if=\"optionType === 'button'\"\n v-bind=\"{ ...$attrs, class: undefined, style: undefined }\"\n :class=\"cn('inline-flex rounded-md border p-0.5 bg-muted/40', ($attrs.class as any))\"\n :style=\"($attrs.style as any)\"\n >\n <button\n v-for=\"opt in normalizedOptions\"\n :key=\"opt.value\"\n type=\"button\"\n :disabled=\"opt.disabled\"\n class=\"rounded-[4px] px-3 py-1 text-sm transition-colors cursor-pointer disabled:cursor-not-allowed disabled:opacity-50\"\n :class=\"model === opt.value ? 'bg-background text-foreground shadow-xs font-medium' : 'text-muted-foreground hover:text-foreground'\"\n @click=\"onValueChange(opt.value)\"\n >\n {{ opt.label }}\n </button>\n </div>\n\n <!-- 默认圆点样式 -->\n <RadioGroup\n v-else\n :model-value=\"model\"\n v-bind=\"{ ...$attrs, class: undefined, style: undefined }\"\n :class=\"cn('flex flex-wrap items-center gap-x-6 gap-y-2', ($attrs.class as any))\"\n :style=\"($attrs.style as any)\"\n @update:model-value=\"onValueChange\"\n >\n <label\n v-for=\"opt in normalizedOptions\"\n :key=\"opt.value\"\n class=\"flex cursor-pointer items-center gap-2 text-sm font-normal has-[[data-state=checked]]:text-primary has-[[data-disabled]]:cursor-not-allowed has-[[data-disabled]]:opacity-50\"\n >\n <RadioGroupItem :value=\"opt.value\" :disabled=\"opt.disabled\" />\n {{ opt.label }}\n </label>\n </RadioGroup>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { useOptions } from \"@cynnie/ui-core\";\nimport { RadioGroup, RadioGroupItem } from \"../ui/radio-group\";\nimport { cn } from \"../../lib/utils\";\n\ndefineOptions({\n name: \"ProRadioGroup\",\n inheritAttrs: false,\n});\n\nconst props = defineProps<{\n /** 选项数据源:静态数组 / 字符串数组 / 返回数组的函数(远程字典) */\n options?: any;\n /** options 里 label / value 的字段名 */\n labelField?: string;\n valueField?: string;\n /** 远程字典的依赖值,变化时自动重新拉取 */\n deps?: any;\n /** 按钮样式(对齐 antd 的 option-type=\"button\",shadcn 版渲染为胶囊分段控件) */\n optionType?: string;\n}>();\n\nconst model = defineModel<any>();\n\nconst { options: innerOptions } = useOptions({\n options: computed(() => props.options),\n deps: computed(() => props.deps),\n});\n\nfunction toOption(item: any) {\n if (item && typeof item === \"object\" && \"label\" in item) return item;\n return {\n label: props.labelField ? item[props.labelField] : item,\n value: props.valueField ? item[props.valueField] : item,\n };\n}\n\nconst normalizedOptions = computed(() => innerOptions.value.map(toOption));\n\nfunction onValueChange(value: any) {\n model.value = value;\n}\n</script>\n\n<template>\n <!-- button 样式:胶囊分段控件 -->\n <div\n v-if=\"optionType === 'button'\"\n v-bind=\"{ ...$attrs, class: undefined, style: undefined }\"\n :class=\"cn('inline-flex rounded-md border p-0.5 bg-muted/40', ($attrs.class as any))\"\n :style=\"($attrs.style as any)\"\n >\n <button\n v-for=\"opt in normalizedOptions\"\n :key=\"opt.value\"\n type=\"button\"\n :disabled=\"opt.disabled\"\n class=\"rounded-[4px] px-3 py-1 text-sm transition-colors cursor-pointer disabled:cursor-not-allowed disabled:opacity-50\"\n :class=\"model === opt.value ? 'bg-background text-foreground shadow-xs font-medium' : 'text-muted-foreground hover:text-foreground'\"\n @click=\"onValueChange(opt.value)\"\n >\n {{ opt.label }}\n </button>\n </div>\n\n <!-- 默认圆点样式 -->\n <RadioGroup\n v-else\n :model-value=\"model\"\n v-bind=\"{ ...$attrs, class: undefined, style: undefined }\"\n :class=\"cn('flex flex-wrap items-center gap-x-6 gap-y-2', ($attrs.class as any))\"\n :style=\"($attrs.style as any)\"\n @update:model-value=\"onValueChange\"\n >\n <label\n v-for=\"opt in normalizedOptions\"\n :key=\"opt.value\"\n class=\"flex cursor-pointer items-center gap-2 text-sm font-normal has-[[data-state=checked]]:text-primary has-[[data-disabled]]:cursor-not-allowed has-[[data-disabled]]:opacity-50\"\n >\n <RadioGroupItem :value=\"opt.value\" :disabled=\"opt.disabled\" />\n {{ opt.label }}\n </label>\n </RadioGroup>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;ECOA,MAAM,iBAAiB,qBAHT,SACA,OAE2C;;uBAIvD,YAEiB,MAAA,eAAA,EAFjB,WAEiB,EAFD,aAAU,eAAa,EAAS,MAAA,eAAc,EAAA,EAAE,OAAM,cAAY,CAAA,EAAA;2BACxE,CAAR,WAAQ,KAAA,QAAA,UAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;EELZ,MAAM,QAAQ;;uBAIZ,YAaiB,MAAA,eAAA,EAbjB,WAaiB,EAZf,aAAU,oBAAkB,EACpB,OAAK,EACZ,OAAc,MAAA,GAAE,CAAA,yYAA2Z,MAAM,MAAA,EAAA,CAAA,EAAA;2BAS5Z,CAFtB,YAEsB,MAAA,oBAAA,EAAA,EAFD,OAAM,6CAA2C,EAAA;4BACkC,CAAtG,YAAsG,MAAA,WAAA,EAAA,EAA1F,OAAM,mFAAiF,CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;EEXzG,MAAM,QAAQ;EAYd,MAAM,QAAQ,SAAgB,SAAA,aAAE;EAEhC,MAAM,EAAE,SAAS,iBAAiB,WAAW;GAC3C,SAAS,eAAe,MAAM,QAAQ;GACtC,MAAM,eAAe,MAAM,KAAK;GACjC,CAAC;EAEF,SAAS,SAAS,MAAW;AAC3B,OAAI,QAAQ,OAAO,SAAS,YAAY,WAAW,KAAM,QAAO;AAChE,UAAO;IACL,OAAO,MAAM,aAAa,KAAK,MAAM,cAAc;IACnD,OAAO,MAAM,aAAa,KAAK,MAAM,cAAc;IACpD;;EAGH,MAAM,oBAAoB,eAAe,aAAa,MAAM,IAAI,SAAS,CAAC;EAE1E,SAAS,cAAc,OAAY;AACjC,SAAM,QAAQ;;;UAONA,KAAAA,eAAU,YAAA,WAAA,EADlB,mBAiBM,OAjBN,WAiBM,EAAA,KAAA,GAAA,EAAA;IAAA,GAfSC,KAAAA;IAAM,OAAS,KAAA;IAAS,OAAS,KAAA;IAAS,EAAA;IACtD,OAAO,MAAA,GAAE,CAAA,mDAAqDA,KAAAA,OAAO,MAAK;IAC1E,OAAQA,KAAAA,OAAO;0BAEhB,mBAUS,UAAA,MAAA,WATO,kBAAA,QAAP,QAAG;wBADZ,mBAUS,UAAA;KARN,KAAK,IAAI;KACV,MAAK;KACJ,UAAU,IAAI;KACf,OAAK,eAAA,CAAC,oHACE,MAAA,UAAU,IAAI,QAAK,wDAAA,8CAAA,CAAA;KAC1B,UAAK,WAAE,cAAc,IAAI,MAAK;uBAE5B,IAAI,MAAK,EAAA,IAAA,WAAA;oCAKhB,YAgBa,MAAA,mBAAA,EAhBb,WAgBa;;IAdV,eAAa,MAAA;;OACDA,KAAAA;IAAM,OAAS,KAAA;IAAS,OAAS,KAAA;IAAS,EAAA;IACtD,OAAO,MAAA,GAAE,CAAA,+CAAiDA,KAAAA,OAAO,MAAK;IACtE,OAAQA,KAAAA,OAAO;IACf,uBAAoB;;2BAGa,EAAA,UAAA,KAAA,EADlC,mBAOQ,UAAA,MAAA,WANQ,kBAAA,QAAP,QAAG;yBADZ,mBAOQ,SAAA;MALL,KAAK,IAAI;MACV,OAAM;SAEN,YAA8D,MAAA,uBAAA,EAAA;MAA7C,OAAO,IAAI;MAAQ,UAAU,IAAI;yDAAY,MAC9D,gBAAG,IAAI,MAAK,EAAA,EAAA,CAAA,CAAA"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { a as Select_default, i as SelectContent_default, n as SelectTrigger_default, r as SelectItem_default, t as SelectValue_default } from "./SelectValue-CWl9zUW3.js";
|
|
2
|
+
import { Fragment, computed, createBlock, createElementBlock, createTextVNode, createVNode, defineComponent, mergeModels, mergeProps, normalizeClass, normalizeStyle, openBlock, renderList, toDisplayString, unref, useModel, withCtx } from "vue";
|
|
3
|
+
import { useOptions } from "@cynnie/ui-core";
|
|
4
|
+
var ProSelect_default = /* @__PURE__ */ defineComponent({
|
|
5
|
+
name: "ProSelect",
|
|
6
|
+
inheritAttrs: false,
|
|
7
|
+
__name: "index",
|
|
8
|
+
props: /* @__PURE__ */ mergeModels({
|
|
9
|
+
options: {},
|
|
10
|
+
labelField: {},
|
|
11
|
+
valueField: {},
|
|
12
|
+
deps: {},
|
|
13
|
+
placeholder: {},
|
|
14
|
+
mode: {},
|
|
15
|
+
multiple: { type: Boolean },
|
|
16
|
+
disabled: { type: Boolean }
|
|
17
|
+
}, {
|
|
18
|
+
"modelValue": {},
|
|
19
|
+
"modelModifiers": {}
|
|
20
|
+
}),
|
|
21
|
+
emits: /* @__PURE__ */ mergeModels(["change"], ["update:modelValue"]),
|
|
22
|
+
setup(__props, { emit: __emit }) {
|
|
23
|
+
const props = __props;
|
|
24
|
+
const emit = __emit;
|
|
25
|
+
const model = useModel(__props, "modelValue");
|
|
26
|
+
const { options: innerOptions, isLoading } = useOptions({
|
|
27
|
+
options: computed(() => props.options),
|
|
28
|
+
deps: computed(() => props.deps)
|
|
29
|
+
});
|
|
30
|
+
const multiple = computed(() => props.mode === "multiple" || props.multiple === true);
|
|
31
|
+
function toOption(item) {
|
|
32
|
+
if (item && typeof item === "object" && "label" in item) return item;
|
|
33
|
+
return {
|
|
34
|
+
label: props.labelField ? item[props.labelField] : item,
|
|
35
|
+
value: props.valueField ? item[props.valueField] : item
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const normalizedOptions = computed(() => innerOptions.value.map(toOption));
|
|
39
|
+
const displayText = computed(() => {
|
|
40
|
+
if (model.value == null || model.value === "" || Array.isArray(model.value) && !model.value.length) return "";
|
|
41
|
+
return (Array.isArray(model.value) ? model.value : [model.value]).map((v) => normalizedOptions.value.find((o) => o.value === v)?.label ?? v).join("、");
|
|
42
|
+
});
|
|
43
|
+
function onValueChange(value) {
|
|
44
|
+
emit("change", value, value);
|
|
45
|
+
}
|
|
46
|
+
return (_ctx, _cache) => {
|
|
47
|
+
return openBlock(), createBlock(unref(Select_default), mergeProps({
|
|
48
|
+
modelValue: model.value,
|
|
49
|
+
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => model.value = $event),
|
|
50
|
+
multiple: multiple.value
|
|
51
|
+
}, {
|
|
52
|
+
..._ctx.$attrs,
|
|
53
|
+
class: void 0,
|
|
54
|
+
style: void 0
|
|
55
|
+
}, { "onUpdate:modelValue": onValueChange }), {
|
|
56
|
+
default: withCtx(() => [createVNode(unref(SelectTrigger_default), {
|
|
57
|
+
disabled: _ctx.disabled || unref(isLoading) || void 0,
|
|
58
|
+
style: normalizeStyle(_ctx.$attrs.style || props.style),
|
|
59
|
+
class: normalizeClass((_ctx.$attrs.class || props.class) + " w-full min-w-40")
|
|
60
|
+
}, {
|
|
61
|
+
default: withCtx(() => [createVNode(unref(SelectValue_default), { placeholder: _ctx.placeholder }, {
|
|
62
|
+
default: withCtx(() => [createTextVNode(toDisplayString(displayText.value), 1)]),
|
|
63
|
+
_: 1
|
|
64
|
+
}, 8, ["placeholder"])]),
|
|
65
|
+
_: 1
|
|
66
|
+
}, 8, [
|
|
67
|
+
"disabled",
|
|
68
|
+
"style",
|
|
69
|
+
"class"
|
|
70
|
+
]), createVNode(unref(SelectContent_default), null, {
|
|
71
|
+
default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(normalizedOptions.value, (opt) => {
|
|
72
|
+
return openBlock(), createBlock(unref(SelectItem_default), {
|
|
73
|
+
key: opt.value,
|
|
74
|
+
value: opt.value,
|
|
75
|
+
disabled: opt.disabled
|
|
76
|
+
}, {
|
|
77
|
+
default: withCtx(() => [createTextVNode(toDisplayString(opt.label), 1)]),
|
|
78
|
+
_: 2
|
|
79
|
+
}, 1032, ["value", "disabled"]);
|
|
80
|
+
}), 128))]),
|
|
81
|
+
_: 1
|
|
82
|
+
})]),
|
|
83
|
+
_: 1
|
|
84
|
+
}, 16, ["modelValue", "multiple"]);
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
export { ProSelect_default as t };
|
|
89
|
+
|
|
90
|
+
//# sourceMappingURL=ProSelect-DT0zjDjT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProSelect-DT0zjDjT.js","names":["$attrs","disabled","placeholder"],"sources":["../src/components/ProSelect/index.vue","../src/components/ProSelect/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { useOptions } from \"@cynnie/ui-core\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../ui/select\";\n\ndefineOptions({\n name: \"ProSelect\",\n inheritAttrs: false,\n});\n\nconst props = defineProps<{\n /** 选项数据源:静态数组 / 字符串数组 / 返回数组的函数(远程字典) */\n options?: any;\n /** options 里 label / value 的字段名,元素不是 {label, value} 结构时用 */\n labelField?: string;\n valueField?: string;\n /** 远程字典的依赖值,变化时自动重新拉取 */\n deps?: any;\n /** 占位文本 */\n placeholder?: string;\n /** 多选(对齐 antd 的 mode=\"multiple\";也支持跨库统一的布尔 multiple) */\n mode?: string;\n /** 是否多选(布尔写法,与 ui-antd / ui-element 对齐) */\n multiple?: boolean;\n /** 禁用 */\n disabled?: boolean;\n}>();\n\nconst emit = defineEmits([\"change\"]);\n\nconst model = defineModel<any>();\n\nconst { options: innerOptions, isLoading } = useOptions({\n options: computed(() => props.options),\n deps: computed(() => props.deps),\n});\n\nconst multiple = computed(() => props.mode === \"multiple\" || props.multiple === true);\n\nfunction toOption(item: any) {\n if (item && typeof item === \"object\" && \"label\" in item) return item;\n return {\n label: props.labelField ? item[props.labelField] : item,\n value: props.valueField ? item[props.valueField] : item,\n };\n}\n\nconst normalizedOptions = computed(() => innerOptions.value.map(toOption));\n\nconst displayText = computed(() => {\n if (model.value == null || model.value === \"\" || (Array.isArray(model.value) && !model.value.length)) {\n return \"\";\n }\n const values = Array.isArray(model.value) ? model.value : [model.value];\n const labels = values.map((v) => normalizedOptions.value.find((o) => o.value === v)?.label ?? v);\n return labels.join(\"、\");\n});\n\nfunction onValueChange(value: any) {\n emit(\"change\", value, value);\n}\n</script>\n\n<template>\n <Select\n v-model=\"model\"\n :multiple=\"multiple\"\n v-bind=\"{ ...$attrs, class: undefined, style: undefined }\"\n @update:model-value=\"onValueChange\"\n >\n <SelectTrigger\n :disabled=\"disabled || isLoading || undefined\"\n :style=\"($attrs.style as any) || (props as any).style\"\n :class=\"(($attrs.class as any) || (props as any).class) + ' w-full min-w-40'\"\n >\n <SelectValue :placeholder=\"placeholder\">{{ displayText }}</SelectValue>\n </SelectTrigger>\n <SelectContent>\n <SelectItem v-for=\"opt in normalizedOptions\" :key=\"opt.value\" :value=\"opt.value\" :disabled=\"opt.disabled\">\n {{ opt.label }}\n </SelectItem>\n </SelectContent>\n </Select>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { useOptions } from \"@cynnie/ui-core\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../ui/select\";\n\ndefineOptions({\n name: \"ProSelect\",\n inheritAttrs: false,\n});\n\nconst props = defineProps<{\n /** 选项数据源:静态数组 / 字符串数组 / 返回数组的函数(远程字典) */\n options?: any;\n /** options 里 label / value 的字段名,元素不是 {label, value} 结构时用 */\n labelField?: string;\n valueField?: string;\n /** 远程字典的依赖值,变化时自动重新拉取 */\n deps?: any;\n /** 占位文本 */\n placeholder?: string;\n /** 多选(对齐 antd 的 mode=\"multiple\";也支持跨库统一的布尔 multiple) */\n mode?: string;\n /** 是否多选(布尔写法,与 ui-antd / ui-element 对齐) */\n multiple?: boolean;\n /** 禁用 */\n disabled?: boolean;\n}>();\n\nconst emit = defineEmits([\"change\"]);\n\nconst model = defineModel<any>();\n\nconst { options: innerOptions, isLoading } = useOptions({\n options: computed(() => props.options),\n deps: computed(() => props.deps),\n});\n\nconst multiple = computed(() => props.mode === \"multiple\" || props.multiple === true);\n\nfunction toOption(item: any) {\n if (item && typeof item === \"object\" && \"label\" in item) return item;\n return {\n label: props.labelField ? item[props.labelField] : item,\n value: props.valueField ? item[props.valueField] : item,\n };\n}\n\nconst normalizedOptions = computed(() => innerOptions.value.map(toOption));\n\nconst displayText = computed(() => {\n if (model.value == null || model.value === \"\" || (Array.isArray(model.value) && !model.value.length)) {\n return \"\";\n }\n const values = Array.isArray(model.value) ? model.value : [model.value];\n const labels = values.map((v) => normalizedOptions.value.find((o) => o.value === v)?.label ?? v);\n return labels.join(\"、\");\n});\n\nfunction onValueChange(value: any) {\n emit(\"change\", value, value);\n}\n</script>\n\n<template>\n <Select\n v-model=\"model\"\n :multiple=\"multiple\"\n v-bind=\"{ ...$attrs, class: undefined, style: undefined }\"\n @update:model-value=\"onValueChange\"\n >\n <SelectTrigger\n :disabled=\"disabled || isLoading || undefined\"\n :style=\"($attrs.style as any) || (props as any).style\"\n :class=\"(($attrs.class as any) || (props as any).class) + ' w-full min-w-40'\"\n >\n <SelectValue :placeholder=\"placeholder\">{{ displayText }}</SelectValue>\n </SelectTrigger>\n <SelectContent>\n <SelectItem v-for=\"opt in normalizedOptions\" :key=\"opt.value\" :value=\"opt.value\" :disabled=\"opt.disabled\">\n {{ opt.label }}\n </SelectItem>\n </SelectContent>\n </Select>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;ECUA,MAAM,QAAQ;EAkBd,MAAM,OAAO;EAEb,MAAM,QAAQ,SAAgB,SAAA,aAAE;EAEhC,MAAM,EAAE,SAAS,cAAc,cAAc,WAAW;GACtD,SAAS,eAAe,MAAM,QAAQ;GACtC,MAAM,eAAe,MAAM,KAAK;GACjC,CAAC;EAEF,MAAM,WAAW,eAAe,MAAM,SAAS,cAAc,MAAM,aAAa,KAAK;EAErF,SAAS,SAAS,MAAW;AAC3B,OAAI,QAAQ,OAAO,SAAS,YAAY,WAAW,KAAM,QAAO;AAChE,UAAO;IACL,OAAO,MAAM,aAAa,KAAK,MAAM,cAAc;IACnD,OAAO,MAAM,aAAa,KAAK,MAAM,cAAc;IACpD;;EAGH,MAAM,oBAAoB,eAAe,aAAa,MAAM,IAAI,SAAS,CAAC;EAE1E,MAAM,cAAc,eAAe;AACjC,OAAI,MAAM,SAAS,QAAQ,MAAM,UAAU,MAAO,MAAM,QAAQ,MAAM,MAAM,IAAI,CAAC,MAAM,MAAM,OAC3F,QAAO;AAIT,WAFe,MAAM,QAAQ,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,MAAM,EACjD,KAAK,MAAM,kBAAkB,MAAM,MAAM,MAAM,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,CAClF,KAAK,IAAI;IACvB;EAEF,SAAS,cAAc,OAAY;AACjC,QAAK,UAAU,OAAO,MAAM;;;uBAK5B,YAkBS,MAAA,eAAA,EAlBT,WAkBS;gBAjBE,MAAA;uEAAK,QAAA;IACb,UAAU,SAAA;;OACEA,KAAAA;IAAM,OAAS,KAAA;IAAS,OAAS,KAAA;IAAS,EAAA,EACtD,uBAAoB,eAAa,CAAA,EAAA;2BAQlB,CANhB,YAMgB,MAAA,sBAAA,EAAA;KALb,UAAUC,KAAAA,YAAY,MAAA,UAAS,IAAI,KAAA;KACnC,OAAK,eAAGD,KAAAA,OAAO,SAAkB,MAAc,MAAK;KACpD,OAAK,gBAAIA,KAAAA,OAAO,SAAkB,MAAc,SAAK,mBAAA;;4BAEiB,CAAvE,YAAuE,MAAA,oBAAA,EAAA,EAAzD,aAAaE,KAAAA,aAAW,EAAA;6BAAmB,CAAA,gBAAA,gBAAd,YAAA,MAAW,EAAA,EAAA,CAAA,CAAA;;;;;;;;QAExD,YAIgB,MAAA,sBAAA,EAAA,MAAA;4BAH8B,EAAA,UAAA,KAAA,EAA5C,mBAEa,UAAA,MAAA,WAFa,kBAAA,QAAP,QAAG;0BAAtB,YAEa,MAAA,mBAAA,EAAA;OAFiC,KAAK,IAAI;OAAQ,OAAO,IAAI;OAAQ,UAAU,IAAI;;8BAC/E,CAAA,gBAAA,gBAAZ,IAAI,MAAK,EAAA,EAAA,CAAA,CAAA"}
|