@ccn-ui-kit/select 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/dist/index.cjs +1 -0
  2. package/dist/index.js +342 -0
  3. package/dist/packages/components/__tests__/loading.spec.d.ts +1 -0
  4. package/dist/packages/components/badge/index.d.ts +10 -0
  5. package/dist/packages/components/badge/src/badge.d.ts +25 -0
  6. package/dist/packages/components/breadcrumb/index.d.ts +12 -0
  7. package/dist/packages/components/breadcrumb/src/breadcrumb-item.d.ts +13 -0
  8. package/dist/packages/components/breadcrumb/src/breadcrumb.d.ts +10 -0
  9. package/dist/packages/components/button/index.d.ts +10 -0
  10. package/dist/packages/components/button/src/button.d.ts +25 -0
  11. package/dist/packages/components/date-picker/index.d.ts +10 -0
  12. package/dist/packages/components/date-picker/src/date-picker.d.ts +20 -0
  13. package/dist/packages/components/descriptions/index.d.ts +12 -0
  14. package/dist/packages/components/descriptions/src/descriptions-item.d.ts +13 -0
  15. package/dist/packages/components/descriptions/src/descriptions.d.ts +17 -0
  16. package/dist/packages/components/divider/index.d.ts +10 -0
  17. package/dist/packages/components/divider/src/divider.d.ts +20 -0
  18. package/dist/packages/components/dropdown/index.d.ts +12 -0
  19. package/dist/packages/components/dropdown/src/dropdown-item.d.ts +20 -0
  20. package/dist/packages/components/dropdown/src/dropdown.d.ts +46 -0
  21. package/dist/packages/components/form/index.d.ts +12 -0
  22. package/dist/packages/components/form/src/form-item.d.ts +45 -0
  23. package/dist/packages/components/form/src/form.d.ts +96 -0
  24. package/dist/packages/components/icon/index.d.ts +11 -0
  25. package/dist/packages/components/icon/src/icon.d.ts +18 -0
  26. package/dist/packages/components/icon/src/icons.d.ts +50 -0
  27. package/dist/packages/components/input/index.d.ts +10 -0
  28. package/dist/packages/components/input/src/input.d.ts +25 -0
  29. package/dist/packages/components/link/index.d.ts +10 -0
  30. package/dist/packages/components/link/src/link.d.ts +25 -0
  31. package/dist/packages/components/loading/index.d.ts +10 -0
  32. package/dist/packages/components/loading/src/loading.d.ts +15 -0
  33. package/dist/packages/components/menu/index.d.ts +14 -0
  34. package/dist/packages/components/menu/src/menu-item.d.ts +12 -0
  35. package/dist/packages/components/menu/src/menu.d.ts +40 -0
  36. package/dist/packages/components/menu/src/sub-menu.d.ts +12 -0
  37. package/dist/packages/components/message/index.d.ts +12 -0
  38. package/dist/packages/components/message/src/manager.d.ts +14 -0
  39. package/dist/packages/components/message/src/message.d.ts +28 -0
  40. package/dist/packages/components/modal/index.d.ts +10 -0
  41. package/dist/packages/components/modal/src/modal.d.ts +46 -0
  42. package/dist/packages/components/notification/index.d.ts +12 -0
  43. package/dist/packages/components/notification/src/manager.d.ts +14 -0
  44. package/dist/packages/components/notification/src/notification.d.ts +44 -0
  45. package/dist/packages/components/pagination/index.d.ts +10 -0
  46. package/dist/packages/components/pagination/src/pagination.d.ts +30 -0
  47. package/dist/packages/components/popconfirm/index.d.ts +10 -0
  48. package/dist/packages/components/popconfirm/src/popconfirm.d.ts +56 -0
  49. package/dist/packages/components/rich-editor/index.d.ts +10 -0
  50. package/dist/packages/components/rich-editor/src/rich-editor.d.ts +36 -0
  51. package/dist/packages/components/select/index.d.ts +10 -0
  52. package/dist/packages/components/select/src/select.d.ts +45 -0
  53. package/dist/packages/components/select/src/select.vue.d.ts +56 -0
  54. package/dist/packages/components/space/index.d.ts +10 -0
  55. package/dist/packages/components/space/src/space.d.ts +33 -0
  56. package/dist/packages/components/steps/index.d.ts +12 -0
  57. package/dist/packages/components/steps/src/step.d.ts +28 -0
  58. package/dist/packages/components/steps/src/steps.d.ts +46 -0
  59. package/dist/packages/components/table/index.d.ts +10 -0
  60. package/dist/packages/components/table/src/table.d.ts +56 -0
  61. package/dist/packages/components/tabs/index.d.ts +12 -0
  62. package/dist/packages/components/tabs/src/tab-pane.d.ts +22 -0
  63. package/dist/packages/components/tabs/src/tabs.d.ts +43 -0
  64. package/dist/packages/components/tree/index.d.ts +10 -0
  65. package/dist/packages/components/tree/src/tree.d.ts +134 -0
  66. package/dist/packages/components/upload/index.d.ts +10 -0
  67. package/dist/packages/components/upload/src/upload.d.ts +103 -0
  68. package/dist/packages/directives/index.d.ts +2 -0
  69. package/dist/packages/directives/loading/index.d.ts +11 -0
  70. package/dist/packages/directives/permission/index.d.ts +3 -0
  71. package/dist/packages/ui-kit/index.d.ts +34 -0
  72. package/dist/packages/utils/dom.d.ts +5 -0
  73. package/dist/packages/utils/index.d.ts +3 -0
  74. package/dist/packages/utils/types.d.ts +7 -0
  75. package/dist/packages/utils/vue-helper.d.ts +9 -0
  76. package/dist/play/main.d.ts +1 -0
  77. package/dist/play/vite.config.d.ts +2 -0
  78. package/package.json +27 -0
  79. package/style/index.scss +200 -0
@@ -0,0 +1,134 @@
1
+ import { ComputedRef, ExtractPropTypes, InjectionKey, PropType, Ref } from 'vue';
2
+
3
+ /** 树节点原始数据(字段名可用 props 配置) */
4
+ export interface TreeData {
5
+ [key: string]: unknown;
6
+ children?: TreeData[];
7
+ }
8
+ /** 节点字段映射配置 */
9
+ export interface TreePropsConfig {
10
+ /** 节点显示文案字段 */
11
+ label?: string;
12
+ /** 子节点数组字段 */
13
+ children?: string;
14
+ /** 禁用字段 */
15
+ disabled?: string;
16
+ /** 叶子标记字段(配合 lazy 使用) */
17
+ isLeaf?: string;
18
+ /** 节点唯一键字段 */
19
+ key?: string;
20
+ }
21
+ export declare const defaultTreePropsConfig: TreePropsConfig;
22
+ /** 节点唯一键(统一为 string | number) */
23
+ export type KeyType = string | number;
24
+ /** 组件内部使用的树节点模型(由 data 构建,含父/子引用与层级) */
25
+ export interface TreeNode {
26
+ key: KeyType;
27
+ data: TreeData;
28
+ parent: TreeNode | null;
29
+ children: TreeNode[];
30
+ level: number;
31
+ isLeaf: boolean;
32
+ isLazy: boolean;
33
+ path: string;
34
+ }
35
+ /** 懒加载参数:根节点 load 时 node 为 null */
36
+ export interface TreeNodeLoadArg {
37
+ key: KeyType;
38
+ level: number;
39
+ data: TreeData;
40
+ }
41
+ export type TreeNodeLoader = (node: TreeNodeLoadArg | null, resolve: (children: TreeData[]) => void) => void;
42
+ export declare const treeProps: {
43
+ /** 树数据 */
44
+ readonly data: {
45
+ readonly type: PropType<TreeData[]>;
46
+ readonly default: () => never[];
47
+ };
48
+ /** 字段映射:{ label, children, disabled, isLeaf, key },缺省用默认字段名 */
49
+ readonly props: {
50
+ readonly type: PropType<TreePropsConfig>;
51
+ readonly default: () => {};
52
+ };
53
+ /** 节点唯一键字段,缺省取 props.key */
54
+ readonly nodeKey: {
55
+ readonly type: StringConstructor;
56
+ readonly default: "";
57
+ };
58
+ /** 是否展示复选框 */
59
+ readonly showCheckbox: BooleanConstructor;
60
+ /** 勾选是否严格(父子不联动,仅影响复选框) */
61
+ readonly checkStrictly: BooleanConstructor;
62
+ /** 默认展开所有节点 */
63
+ readonly defaultExpandAll: BooleanConstructor;
64
+ /** 默认展开的节点 key 列表 */
65
+ readonly defaultExpandedKeys: {
66
+ readonly type: PropType<KeyType[]>;
67
+ readonly default: () => never[];
68
+ };
69
+ /** 初始勾选的节点 key 列表(可在外部用 ref.setCheckedKeys 再控制) */
70
+ readonly defaultCheckedKeys: {
71
+ readonly type: PropType<KeyType[]>;
72
+ readonly default: () => never[];
73
+ };
74
+ /** 点击节点是否展开/收起(默认 true) */
75
+ readonly expandOnClickNode: {
76
+ readonly type: BooleanConstructor;
77
+ readonly default: true;
78
+ };
79
+ /** 当前选中节点 key(v-model:current-node-key) */
80
+ readonly currentNodeKey: {
81
+ readonly type: [StringConstructor, NumberConstructor];
82
+ readonly default: null;
83
+ };
84
+ /** 懒加载(需配合 load 使用) */
85
+ readonly lazy: BooleanConstructor;
86
+ /** 懒加载函数:(node, resolve) => void */
87
+ readonly load: {
88
+ readonly type: PropType<TreeNodeLoader>;
89
+ readonly default: undefined;
90
+ };
91
+ /** 空数据提示文案 */
92
+ readonly emptyText: {
93
+ readonly type: StringConstructor;
94
+ readonly default: "暂无数据";
95
+ };
96
+ };
97
+ export declare const treeEmits: {
98
+ 'update:current-node-key': null;
99
+ 'update:checked-keys': null;
100
+ /** 点击节点:node / data / 原生事件 */
101
+ 'node-click': (node: TreeNode, data: TreeData, e: MouseEvent) => boolean;
102
+ /** 节点展开 */
103
+ 'node-expand': () => boolean;
104
+ /** 节点收起 */
105
+ 'node-collapse': () => boolean;
106
+ /** 复选框勾选状态改变 */
107
+ check: (node: TreeNode, data: TreeData) => boolean;
108
+ /** 节点勾选状态变化(含级联影响的节点) */
109
+ 'check-change': (node: TreeNode, data: TreeData, checked: boolean) => boolean;
110
+ /** 右键节点 */
111
+ 'node-contextmenu': (e: MouseEvent, data: TreeData, node: TreeNode) => boolean;
112
+ };
113
+ export type TreeProps = ExtractPropTypes<typeof treeProps>;
114
+ /** 提供给内部 UiTreeNode 的共享上下文 */
115
+ export interface TreeContext {
116
+ config: ComputedRef<Required<TreePropsConfig>>;
117
+ nodeKeyField: ComputedRef<string>;
118
+ expandedKeys: Ref<Set<KeyType>>;
119
+ checkedKeys: Ref<Set<KeyType>>;
120
+ halfCheckedKeys: Ref<Set<KeyType>>;
121
+ selectedKey: Ref<KeyType | null>;
122
+ loadingKeys: Ref<Set<KeyType>>;
123
+ showCheckbox: ComputedRef<boolean>;
124
+ checkStrictly: ComputedRef<boolean>;
125
+ expandOnClickNode: ComputedRef<boolean>;
126
+ lazy: ComputedRef<boolean>;
127
+ isDisabledNode: (node: TreeNode) => boolean;
128
+ toggleExpand: (node: TreeNode) => void;
129
+ handleNodeClick: (node: TreeNode, data: TreeData, e: MouseEvent) => void;
130
+ handleNodeContextMenu: (node: TreeNode, data: TreeData, e: MouseEvent) => void;
131
+ toggleCheck: (node: TreeNode, data: TreeData) => void;
132
+ loadNodeData: (node: TreeNode) => void;
133
+ }
134
+ export declare const treeContextKey: InjectionKey<TreeContext>;
@@ -0,0 +1,10 @@
1
+ import { App } from 'vue';
2
+ import { default as Upload } from './src/upload.vue';
3
+
4
+ export declare const UploadPlugin: {
5
+ name: string;
6
+ install(app: App): void;
7
+ };
8
+ export { Upload };
9
+ export default Upload;
10
+ export * from './src/upload';
@@ -0,0 +1,103 @@
1
+ import { ExtractPropTypes, PropType } from 'vue';
2
+
3
+ /** 文件上传状态 */
4
+ export type UploadStatus = 'ready' | 'uploading' | 'success' | 'fail';
5
+ /** 文件列表展示类型 */
6
+ export type UploadListType = 'text' | 'picture' | 'picture-card';
7
+ /** 列表中的单个文件 */
8
+ export interface UploadFile {
9
+ /** 组件内唯一标识(新增时自增生成) */
10
+ uid: number;
11
+ /** 文件名 */
12
+ name: string;
13
+ /** 文件大小(字节) */
14
+ size: number;
15
+ /** MIME 类型 */
16
+ type: string;
17
+ /** 当前上传状态 */
18
+ status: UploadStatus;
19
+ /** 上传进度 0-100 */
20
+ percentage: number;
21
+ /** 原始 File 对象 */
22
+ raw: File;
23
+ /** 本地预览地址(仅图片,blob: URL) */
24
+ url?: string;
25
+ /** 上传成功/失败后的响应 */
26
+ response?: unknown;
27
+ }
28
+ export declare const uploadProps: {
29
+ /** 上传请求的 URL;留空时不发起请求,文件直接标记为成功(便于无后端演示) */
30
+ readonly action: {
31
+ readonly type: StringConstructor;
32
+ readonly default: "";
33
+ };
34
+ /** FormData 中文件字段的 key */
35
+ readonly name: {
36
+ readonly type: StringConstructor;
37
+ readonly default: "file";
38
+ };
39
+ /** 是否允许多选 */
40
+ readonly multiple: BooleanConstructor;
41
+ /** 原生 input 的 accept,如 'image/*'、'.zip,.rar' */
42
+ readonly accept: {
43
+ readonly type: StringConstructor;
44
+ readonly default: "";
45
+ };
46
+ /** 禁用上传 */
47
+ readonly disabled: BooleanConstructor;
48
+ /** 最大文件数,0 表示不限制 */
49
+ readonly limit: {
50
+ readonly type: NumberConstructor;
51
+ readonly default: 0;
52
+ };
53
+ /** 自定义请求头 */
54
+ readonly headers: {
55
+ readonly type: PropType<Record<string, string>>;
56
+ readonly default: () => {};
57
+ };
58
+ /** 附加的 FormData 字段 */
59
+ readonly data: {
60
+ readonly type: PropType<Record<string, unknown>>;
61
+ readonly default: () => {};
62
+ };
63
+ /** 跨域时是否携带 cookie */
64
+ readonly withCredentials: BooleanConstructor;
65
+ /** 是否支持拖拽上传(将触发器区域变成拖拽区) */
66
+ readonly drag: BooleanConstructor;
67
+ /** 选择文件后是否立即上传;false 时仅加入列表,等待手动触发 */
68
+ readonly autoUpload: {
69
+ readonly type: BooleanConstructor;
70
+ readonly default: true;
71
+ };
72
+ /** 是否展示文件列表 */
73
+ readonly showFileList: {
74
+ readonly type: BooleanConstructor;
75
+ readonly default: true;
76
+ };
77
+ /** 列表展示类型 */
78
+ readonly listType: {
79
+ readonly type: PropType<UploadListType>;
80
+ readonly default: "text";
81
+ };
82
+ /** 受控文件列表(配合 v-model:file-list 使用) */
83
+ readonly fileList: {
84
+ readonly type: PropType<UploadFile[]>;
85
+ readonly default: () => never[];
86
+ };
87
+ };
88
+ export declare const uploadEmits: {
89
+ readonly 'update:file-list': (files: UploadFile[]) => boolean;
90
+ /** 文件列表变化(新增 / 移除) */
91
+ readonly change: (files: UploadFile[]) => boolean;
92
+ /** 上传成功 */
93
+ readonly success: (file: UploadFile, response?: unknown) => boolean;
94
+ /** 上传失败 */
95
+ readonly error: (file: UploadFile, error: unknown) => boolean;
96
+ /** 上传进度 */
97
+ readonly progress: (file: UploadFile, percent: number) => boolean;
98
+ /** 移除文件 */
99
+ readonly remove: (file: UploadFile) => boolean;
100
+ /** 超出 limit 限制 */
101
+ readonly exceed: (files: File[], limit: number) => boolean;
102
+ };
103
+ export type UploadProps = ExtractPropTypes<typeof uploadProps>;
@@ -0,0 +1,2 @@
1
+ export * from './loading';
2
+ export * from './permission';
@@ -0,0 +1,11 @@
1
+ import { Directive } from 'vue';
2
+
3
+ /**
4
+ * v-loading 指令
5
+ * 用法:
6
+ * v-loading="true" 布尔开关
7
+ * v-loading="'加载中...'" 字符串作为提示文案
8
+ * v-loading.fullscreen="true" 全屏遮罩
9
+ * 内部复用 Loading 组件渲染遮罩。
10
+ */
11
+ export declare const vLoading: Directive<HTMLElement>;
@@ -0,0 +1,3 @@
1
+ import { Directive } from 'vue';
2
+
3
+ export declare const vPermission: Directive;
@@ -0,0 +1,34 @@
1
+ import { App } from 'vue';
2
+
3
+ export declare function install(app: App): void;
4
+ declare const _default: {
5
+ install: typeof install;
6
+ };
7
+ export default _default;
8
+ export * from '../components/button';
9
+ export * from '../components/input';
10
+ export * from '../components/badge';
11
+ export * from '../components/breadcrumb';
12
+ export * from '../components/date-picker';
13
+ export * from '../components/descriptions';
14
+ export * from '../components/divider';
15
+ export * from '../components/dropdown';
16
+ export * from '../components/icon';
17
+ export * from '../components/link';
18
+ export * from '../components/loading';
19
+ export * from '../components/menu';
20
+ export * from '../components/message';
21
+ export * from '../components/modal';
22
+ export * from '../components/notification';
23
+ export * from '../components/pagination';
24
+ export * from '../components/popconfirm';
25
+ export * from '../components/form';
26
+ export * from '../components/table';
27
+ export * from '../components/tree';
28
+ export * from '../components/tabs';
29
+ export * from '../components/rich-editor';
30
+ export * from '../components/select';
31
+ export * from '../components/space';
32
+ export * from '../components/steps';
33
+ export * from '../components/upload';
34
+ export * from '../directives';
@@ -0,0 +1,5 @@
1
+ export declare function addClass(el: HTMLElement, cls: string): void;
2
+ export declare function removeClass(el: HTMLElement, cls: string): void;
3
+ export declare function hasClass(el: HTMLElement, cls: string): boolean;
4
+ export declare function getScrollTop(el?: Element | Window): number;
5
+ export declare function isServer(): boolean;
@@ -0,0 +1,3 @@
1
+ export * from './dom';
2
+ export * from './vue-helper';
3
+ export * from './types';
@@ -0,0 +1,7 @@
1
+ export type Size = 'large' | 'medium' | 'small';
2
+ export type Type = 'default' | 'primary' | 'success' | 'warning' | 'danger';
3
+ export interface Pagination {
4
+ page: number;
5
+ pageSize: number;
6
+ total: number;
7
+ }
@@ -0,0 +1,9 @@
1
+ import { App } from 'vue';
2
+
3
+ export type SFCWithInstall<T> = T & {
4
+ install: (app: App) => void;
5
+ };
6
+ /**
7
+ * 给组件挂载 install 方法,使其可通过 app.use() 注册
8
+ */
9
+ export declare function withInstall<T>(component: T, name: string): SFCWithInstall<T>;
@@ -0,0 +1 @@
1
+
@@ -0,0 +1,2 @@
1
+ declare const _default: import('vite').UserConfig;
2
+ export default _default;
package/package.json ADDED
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "@ccn-ui-kit/select",
3
+ "version": "0.1.2",
4
+ "type": "module",
5
+ "main": "dist/index.cjs",
6
+ "module": "dist/index.js",
7
+ "types": "dist/packages/components/select/index.d.ts",
8
+ "files": [
9
+ "dist",
10
+ "style"
11
+ ],
12
+ "sideEffects": [
13
+ "**/*.scss"
14
+ ],
15
+ "exports": {
16
+ ".": {
17
+ "types": "./dist/packages/components/select/index.d.ts",
18
+ "import": "./dist/index.js",
19
+ "require": "./dist/index.cjs"
20
+ },
21
+ "./style": "./style/index.scss",
22
+ "./package.json": "./package.json"
23
+ },
24
+ "peerDependencies": {
25
+ "vue": "^3.4.0"
26
+ }
27
+ }
@@ -0,0 +1,200 @@
1
+ .ui-select {
2
+ position: relative;
3
+ display: inline-block;
4
+ min-width: 200px;
5
+ font-size: var(--ui-font-size-base);
6
+ vertical-align: middle;
7
+
8
+ &__trigger {
9
+ position: relative;
10
+ display: flex;
11
+ align-items: center;
12
+ flex-wrap: wrap;
13
+ gap: 4px;
14
+ min-height: 34px;
15
+ padding: 4px 12px;
16
+ box-sizing: border-box;
17
+ background: #fff;
18
+ border: 1px solid #dcdfe6;
19
+ border-radius: var(--ui-border-radius-base);
20
+ cursor: pointer;
21
+ outline: none;
22
+ user-select: none;
23
+ transition: border-color 0.2s;
24
+
25
+ &:hover {
26
+ border-color: #c0c4cc;
27
+ }
28
+
29
+ &:focus-visible {
30
+ border-color: var(--ui-color-primary);
31
+ }
32
+ }
33
+
34
+ &.is-open &__trigger {
35
+ border-color: var(--ui-color-primary);
36
+ }
37
+
38
+ &__selected {
39
+ flex: 1;
40
+ min-width: 0;
41
+ overflow: hidden;
42
+ text-overflow: ellipsis;
43
+ white-space: nowrap;
44
+ color: #303133;
45
+
46
+ &.is-placeholder {
47
+ color: #c0c4cc;
48
+ }
49
+ }
50
+
51
+ &__filter {
52
+ flex: 1;
53
+ min-width: 0;
54
+ padding: 0;
55
+ border: none;
56
+ outline: none;
57
+ background: transparent;
58
+ font-size: inherit;
59
+ color: #303133;
60
+
61
+ &::placeholder {
62
+ color: #c0c4cc;
63
+ }
64
+ }
65
+
66
+ &__tag {
67
+ display: inline-flex;
68
+ align-items: center;
69
+ gap: 4px;
70
+ padding: 2px 8px;
71
+ margin: 2px 2px 2px 0;
72
+ font-size: 12px;
73
+ line-height: 18px;
74
+ color: var(--ui-color-primary);
75
+ background: #ecf5ff;
76
+ border-radius: 3px;
77
+
78
+ &-close {
79
+ font-style: normal;
80
+ cursor: pointer;
81
+ line-height: 1;
82
+
83
+ &:hover {
84
+ color: var(--ui-color-danger);
85
+ }
86
+ }
87
+ }
88
+
89
+ &__suffix {
90
+ display: inline-flex;
91
+ align-items: center;
92
+ gap: 4px;
93
+ margin-left: auto;
94
+ color: #909399;
95
+ }
96
+
97
+ &__arrow {
98
+ transition: transform 0.2s;
99
+ }
100
+
101
+ &.is-open &__arrow {
102
+ transform: rotate(180deg);
103
+ }
104
+
105
+ &__clear {
106
+ cursor: pointer;
107
+
108
+ &:hover {
109
+ color: var(--ui-color-danger);
110
+ }
111
+ }
112
+
113
+ &__panel {
114
+ position: absolute;
115
+ top: calc(100% + 4px);
116
+ left: 0;
117
+ right: 0;
118
+ z-index: 1000;
119
+ max-height: 240px;
120
+ overflow-y: auto;
121
+ background: #fff;
122
+ border: 1px solid #e4e7ed;
123
+ border-radius: var(--ui-border-radius-base);
124
+ box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);
125
+ }
126
+
127
+ // 向上弹出:触发器上方空间不足时由 JS 判定后切换(top: auto 覆盖默认向下定位)
128
+ &.is-up &__panel {
129
+ top: auto;
130
+ bottom: calc(100% + 4px);
131
+ }
132
+
133
+ &__list {
134
+ margin: 0;
135
+ padding: 5px 0;
136
+ list-style: none;
137
+ }
138
+
139
+ &__item {
140
+ display: flex;
141
+ align-items: center;
142
+ justify-content: space-between;
143
+ padding: 8px 12px;
144
+ color: #303133;
145
+ cursor: pointer;
146
+ user-select: none;
147
+
148
+ &:hover {
149
+ background-color: #f5f7fa;
150
+ }
151
+
152
+ &.is-highlighted {
153
+ background-color: #f5f7fa;
154
+ }
155
+
156
+ &.is-selected {
157
+ color: var(--ui-color-primary);
158
+ font-weight: 600;
159
+ }
160
+
161
+ &.is-disabled {
162
+ color: #c0c4cc;
163
+ cursor: not-allowed;
164
+
165
+ &:hover {
166
+ background-color: transparent;
167
+ }
168
+ }
169
+ }
170
+
171
+ &__item-check {
172
+ color: var(--ui-color-primary);
173
+ }
174
+
175
+ &__empty {
176
+ padding: 16px;
177
+ text-align: center;
178
+ color: #909399;
179
+ }
180
+
181
+ &.is-disabled {
182
+ cursor: not-allowed;
183
+ }
184
+ }
185
+
186
+ // 禁用态:整个触发器不可点(&__trigger 无法在嵌套中正确拼出,显式写全名)
187
+ .ui-select.is-disabled .ui-select__trigger {
188
+ cursor: not-allowed;
189
+ pointer-events: none;
190
+ }
191
+
192
+ // 展开动画:仅淡入淡出
193
+ .ui-select-fade-enter-active,
194
+ .ui-select-fade-leave-active {
195
+ transition: opacity 0.2s ease;
196
+ }
197
+ .ui-select-fade-enter-from,
198
+ .ui-select-fade-leave-to {
199
+ opacity: 0;
200
+ }