@neatui/vue 5.6.0 → 5.7.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.
@@ -0,0 +1,488 @@
1
+ <template>
2
+ <div class="ui-sideview-wrap flex-fixed" :data-side="isOpen ? 'open' : 'hide'">
3
+ <div :class="{ 'ui-sideview-opening': opening }" class="ui-sideview">
4
+ <div class="ui-sideview-mob-hide"></div>
5
+ <component :is="linkTag" v-bind="linkProps({ path: home })" :ui-hide="isOpen ? '' : '<pad'" class="ui-sideview-header" ui-flex="row lm">
6
+ <slot name="header" :open="isOpen">
7
+ <h5 class="ui-sideview-header-title nl-ss"><b>{{ title }}</b></h5>
8
+ </slot>
9
+ </component>
10
+ <div :ui-hide="isOpen ? '' : '<pad'" class="ui-sideview-middle" ui-scroll="x:hidden :y">
11
+ <ul class="ui-sideview-list">
12
+ <li v-for="item in list" :key="item.__key" :class="{ active: item.__active }" :data-open="item.__open ? 1 : 0">
13
+ <IFollowView btn-class="block" event="hover" pos="rb" tip-class="mt-ss">
14
+ <div class="bg-weak:hover" @click.stop="toggleGroup(item)">
15
+ <div v-if="item.children" ui-flex="row lm">
16
+ <div ui-flex="row cm">
17
+ <div ui-btn="@a s none :square">
18
+ <slot name="icon" :item="item"><i :class="`fs++ icon ${item.icon || ''}`"></i></slot>
19
+ </div>
20
+ <span class="ui-sideview-list-item-name">{{ item.name }}</span>
21
+ </div>
22
+ <i class="ui-sideview-list-item-sown icon icon-dropdown"></i>
23
+ </div>
24
+ <component :is="linkTag" v-else v-bind="linkProps(item)" ui-flex="row lm" @click="emit('select', item)">
25
+ <div ui-flex="row cm">
26
+ <div ui-btn="@a s none :square">
27
+ <slot name="icon" :item="item"><i :class="`fs++ icon ${item.icon || ''}`"></i></slot>
28
+ </div>
29
+ <span class="ui-sideview-list-item-name">{{ item.name }}</span>
30
+ </div>
31
+ </component>
32
+ </div>
33
+ <div v-if="item.children" class="ui-sideview-list-tow-height">
34
+ <ul class="ui-sideview-list-tow">
35
+ <li v-for="sub in item.children" :key="sub.__key" :class="{ 'co-main': sub.__active }">
36
+ <component :is="linkTag" v-bind="linkProps(sub)" @click="emit('select', sub)">{{ sub.name }}</component>
37
+ </li>
38
+ </ul>
39
+ </div>
40
+ <template v-if="item.children && !isOpen" #tips>
41
+ <ul class="ui-sideview-list-tow n-sl" ui-wrap="no">
42
+ <li v-for="sub in item.children" :key="sub.__key" :class="{ 'co-main': sub.__active }" class="ux-hover r-sm nx-sl ny-ss">
43
+ <component :is="linkTag" v-bind="linkProps(sub)" @click="emit('select', sub)">{{ sub.name }}</component>
44
+ </li>
45
+ </ul>
46
+ </template>
47
+ </IFollowView>
48
+ </li>
49
+ </ul>
50
+ </div>
51
+ </div>
52
+ </div>
53
+ </template>
54
+
55
+ <script setup lang="ts">
56
+ import { computed, onBeforeUnmount, reactive, ref, watch } from 'vue';
57
+ import { RouterLink, useRoute } from 'vue-router';
58
+ import IFollowView from './IFollowView.vue';
59
+ import type { SideMenuItem } from './SideMenu.vue';
60
+
61
+ // 经典侧栏:展开 18rem / 收起 5rem 图标栏(悬浮子菜单);手机收起时宽 0
62
+ const props = withDefaults(
63
+ defineProps<{
64
+ menus?: SideMenuItem[];
65
+ /** v-model:open,不传时组件自管,默认展开 */
66
+ open?: boolean | number;
67
+ /** 当前路径,不传取 vue-router 当前路由 */
68
+ active?: string;
69
+ /** 子路由(/a/b)也高亮 /a */
70
+ prefix?: boolean;
71
+ title?: string;
72
+ /** 标题链接地址 */
73
+ home?: string;
74
+ }>(),
75
+ { menus: () => [], open: undefined, active: undefined, prefix: true, title: '', home: '/' },
76
+ );
77
+ const emit = defineEmits<{
78
+ (e: 'update:open', v: boolean): void;
79
+ (e: 'select', item: SideMenuItem): void;
80
+ }>();
81
+
82
+ const inner = ref(true);
83
+ const isOpen = computed(() => (props.open === undefined ? inner.value : !!props.open));
84
+ const setOpen = (v: boolean) => {
85
+ inner.value = v;
86
+ emit('update:open', v);
87
+ };
88
+
89
+ // 展开侧栏时延迟展开子菜单,避免宽度动画过程中文字换行跳动
90
+ const opening = ref(false);
91
+ let timer: ReturnType<typeof setTimeout> | undefined;
92
+ watch(isOpen, (v) => {
93
+ if (timer) clearTimeout(timer);
94
+ opening.value = v;
95
+ if (v) timer = setTimeout(() => (opening.value = false), 400);
96
+ });
97
+ onBeforeUnmount(() => timer && clearTimeout(timer));
98
+
99
+ const route = useRoute();
100
+ const current = computed(() => props.active ?? route?.path ?? '');
101
+ const hit = (path?: string) => {
102
+ if (!path) return false;
103
+ const p = current.value;
104
+ return p === path || (props.prefix && p.startsWith(path + '/'));
105
+ };
106
+ const keyOf = (item: SideMenuItem, idx: number) => String(item.id ?? item.path ?? idx);
107
+
108
+ // 展开状态单独存放;未手动操作过时,默认展开当前路由所在分组
109
+ const openMap = reactive<Record<string, boolean>>({});
110
+ const list = computed(() =>
111
+ props.menus.map((item, idx) => {
112
+ const __key = keyOf(item, idx);
113
+ if (!item.children?.length) return { ...item, children: undefined, __key, __active: hit(item.path), __open: false };
114
+ let __active = false;
115
+ const children = item.children.map((sub, i) => {
116
+ const a = hit(sub.path);
117
+ if (a) __active = true;
118
+ return { ...sub, __key: keyOf(sub, i), __active: a };
119
+ });
120
+ return { ...item, children, __key, __active, __open: openMap[__key] ?? __active };
121
+ }),
122
+ );
123
+ const toggleGroup = (item: any) => {
124
+ if (!item.children) return;
125
+ const next = !item.__open;
126
+ list.value.forEach((m) => (openMap[m.__key] = false));
127
+ openMap[item.__key] = next;
128
+ };
129
+
130
+ const linkTag = computed(() => (route ? RouterLink : 'a'));
131
+ const linkProps = (item: { path?: string }) => (route ? { to: item.path || '' } : { href: item.path || '' });
132
+
133
+ defineExpose({ open: isOpen, setOpen });
134
+ </script>
135
+
136
+ <style lang="scss">
137
+ .ui-sideview-wrap {
138
+ height: 100%;
139
+ }
140
+ // 侧边栏
141
+ .ui-sideview {
142
+ position: relative;
143
+ left: 0;
144
+ top: 0;
145
+ // width: 5rem;
146
+ padding-top: 4rem;
147
+ // @include med('=mob') {
148
+ // width: 18rem;
149
+ // transform: translate3d(-100%, 0, 0);
150
+ // }
151
+ height: 100%;
152
+ z-index: 15;
153
+
154
+ background: var(--co-fore);
155
+ box-shadow: 0 0 0.5rem
156
+ color-mix(in srgb, var(--co-deep) calc(0.95 * 100%), transparent);
157
+
158
+ transition: width 0.3s;
159
+ }
160
+
161
+ // 移动端暗层
162
+ .ui-sideview-mob-hide {
163
+ position: absolute;
164
+ width: 0rem;
165
+ height: 100%;
166
+ opacity: 0;
167
+ pointer-events: none;
168
+ }
169
+ // 标题
170
+ .ui-sideview-header {
171
+ position: absolute;
172
+ width: 100%;
173
+ height: 4rem;
174
+ left: 0;
175
+ top: 0;
176
+ line-height: 2rem;
177
+ padding: 1rem 0.75rem;
178
+ white-space: nowrap;
179
+
180
+ box-shadow: 0 1px 0 var(--co-back);
181
+
182
+ transition: all 0.3s;
183
+ }
184
+
185
+ .ui-sideview-list {
186
+ & > * {
187
+ position: relative;
188
+ white-space: nowrap;
189
+ padding: 0.25rem;
190
+ user-select: none;
191
+ transition: all 0.3s;
192
+
193
+ a {
194
+ cursor: pointer;
195
+ }
196
+
197
+ & > * {
198
+ position: relative;
199
+ display: block;
200
+ cursor: pointer;
201
+
202
+ & > * {
203
+ position: relative;
204
+ display: block;
205
+ padding: 0.25em;
206
+ border-radius: 0.5rem;
207
+ }
208
+ }
209
+
210
+ &:hover {
211
+ .ui-sideview-list-tow {
212
+ opacity: 1;
213
+ transform: translate3d(0, 0, 0);
214
+ pointer-events: auto;
215
+
216
+ background: var(--co-fore);
217
+ }
218
+ }
219
+
220
+ &.active {
221
+ -webkit-font-smoothing: auto;
222
+
223
+ color: var(--co-main);
224
+
225
+ &::before {
226
+ position: absolute;
227
+ content: "";
228
+ width: 2px;
229
+ height: 2.5rem;
230
+ left: 0;
231
+ top: 0.25rem;
232
+
233
+ background: var(--co-main);
234
+ }
235
+ }
236
+ }
237
+ }
238
+ .ui-sideview-header-title,
239
+ .ui-sideview-list-item-name {
240
+ transition: opacity 0.25s;
241
+ opacity: 0;
242
+ vertical-align: middle;
243
+ pointer-events: none;
244
+ }
245
+
246
+ .ui-sideview-middle {
247
+ position: relative;
248
+ height: 100%;
249
+ & > * {
250
+ height: 100%;
251
+ }
252
+ }
253
+
254
+ // 隐藏时
255
+ [data-side~="hide"] {
256
+ .ui-sideview-header {
257
+ padding: 1rem 1.5rem;
258
+ }
259
+ .ui-sideview {
260
+ width: 5rem;
261
+ }
262
+ @media screen and (max-width: 799px) {
263
+ .ui-sideview {
264
+ width: 0;
265
+ }
266
+ }
267
+
268
+ .ui-sideview-header-title {
269
+ position: absolute;
270
+ left: 0.5rem;
271
+ opacity: 0;
272
+ visibility: hidden;
273
+ transition: none;
274
+ }
275
+
276
+ .ui-sideview-list {
277
+ & > * {
278
+ padding: 0.25rem 1.25rem;
279
+ }
280
+ }
281
+
282
+ .ui-sideview-list-tow-height {
283
+ display: none;
284
+ }
285
+
286
+ .ui-sideview-list-tow {
287
+ position: absolute;
288
+ width: 12rem;
289
+ top: -1rem;
290
+ left: 8rem;
291
+ padding: 1rem 1rem;
292
+ border-radius: 0.3rem;
293
+ line-height: 3rem;
294
+ opacity: 0;
295
+ transform: translate3d(1rem, 0, 0);
296
+ pointer-events: none;
297
+
298
+ color: var(--co-read);
299
+
300
+ transition: none;
301
+ &::before {
302
+ position: absolute;
303
+ content: "";
304
+ display: block;
305
+ width: 0;
306
+ height: 0;
307
+ box-sizing: content-box;
308
+ border: 6px solid transparent;
309
+ right: 99.9%;
310
+ top: 2.5rem;
311
+ margin-top: -6px;
312
+
313
+ border-right-color: var(--co-fore);
314
+ }
315
+ &::after {
316
+ position: absolute;
317
+ content: "";
318
+ display: block;
319
+ width: 1.5rem;
320
+ top: 0;
321
+ bottom: 0;
322
+ right: 100%;
323
+ }
324
+
325
+ & > * {
326
+ padding: 0 1rem;
327
+ border-radius: 0.3rem;
328
+ &:hover {
329
+ background: var(--co-weak);
330
+ }
331
+ }
332
+ }
333
+ .ui-sideview-list-item-sown {
334
+ pointer-events: none;
335
+ opacity: 0;
336
+ }
337
+ }
338
+
339
+ // 展开时
340
+ [data-side~="open"] {
341
+ & {
342
+ // padding-left: 15rem;
343
+
344
+ // @include med('=mob') {
345
+ // padding-left: 0;
346
+ // transform: translate3d(18rem, 0, 0);
347
+ // }
348
+
349
+ .ui-sideview {
350
+ width: 18rem;
351
+ .ui-sideview-header-title,
352
+ .ui-sideview-list-item-name {
353
+ opacity: 1;
354
+ pointer-events: auto;
355
+ vertical-align: middle;
356
+ transition: opacity 0.3s 0.2s;
357
+ }
358
+ }
359
+ }
360
+
361
+ .ui-sideview-list-tow-height {
362
+ display: grid;
363
+ grid-template-rows: 0fr;
364
+ opacity: 0;
365
+ transition:
366
+ grid-template-rows 0.2s 0s,
367
+ opacity 0.2s 0s;
368
+ }
369
+
370
+ .ui-sideview-list-tow {
371
+ position: relative;
372
+ width: 100%;
373
+ min-height: 0;
374
+ padding-left: 2.5rem;
375
+ line-height: 2.5rem;
376
+ overflow: hidden;
377
+
378
+ color: var(--co-read);
379
+
380
+ & > * {
381
+ position: relative;
382
+ height: 2.5rem;
383
+ padding: 0 0.5em;
384
+ border-radius: 0.5rem;
385
+
386
+ &:hover {
387
+ background: var(--co-weak);
388
+ }
389
+ a {
390
+ display: block;
391
+ }
392
+ &.active {
393
+ color: var(--co-main);
394
+ }
395
+
396
+ &::before {
397
+ position: absolute;
398
+ content: "";
399
+ display: block;
400
+ width: 1px;
401
+ height: 100%;
402
+ top: 0;
403
+ left: -0.5em;
404
+
405
+ background: var(--co-line);
406
+ }
407
+ &:last-child {
408
+ &::before {
409
+ height: 50%;
410
+ }
411
+ }
412
+
413
+ &::after {
414
+ position: absolute;
415
+ content: "";
416
+ display: block;
417
+ width: 0.6em;
418
+ height: 1px;
419
+ top: 50%;
420
+ left: -0.5em;
421
+
422
+ background-color: var(--co-line);
423
+ }
424
+ }
425
+
426
+ &::before {
427
+ position: absolute;
428
+ content: "";
429
+ display: none;
430
+ width: 0;
431
+ height: 0;
432
+ box-sizing: content-box;
433
+ border: 6px solid transparent;
434
+ right: 99.9%;
435
+ top: 2.5rem;
436
+ margin-top: -6px;
437
+
438
+ border-right-color: var(--co-fore);
439
+ }
440
+ &::after {
441
+ position: absolute;
442
+ content: "";
443
+ display: none;
444
+ width: 1rem;
445
+ top: 0;
446
+ bottom: 0;
447
+ right: 100%;
448
+ }
449
+ }
450
+
451
+ .ui-sideview-list-item-sown {
452
+ position: absolute;
453
+ display: block;
454
+ width: 2rem;
455
+ height: 2rem;
456
+ line-height: 2rem;
457
+ right: 0;
458
+ top: 50%;
459
+ text-align: center;
460
+ margin-top: -1rem;
461
+ transform-origin: 50% 50%;
462
+ transform: rotate(-90deg) scale3d(1, 1, 1);
463
+ opacity: 1;
464
+ transition:
465
+ transform 0.3s,
466
+ opacity 0.3s 0.2s;
467
+ pointer-events: auto;
468
+ }
469
+
470
+ .ui-sideview-list > *[data-open="1"] {
471
+ .ui-sideview-list-tow-height {
472
+ grid-template-rows: 1fr;
473
+ opacity: 1;
474
+ }
475
+
476
+ .ui-sideview-list-item-sown {
477
+ transform: rotate(-180deg) scale3d(1, 1, 1);
478
+ }
479
+ }
480
+
481
+ .ui-sideview.ui-sideview-opening .ui-sideview-list > *[data-open="1"] {
482
+ .ui-sideview-list-tow-height {
483
+ transition-delay: 0.2s;
484
+ }
485
+ }
486
+ }
487
+
488
+ </style>
@@ -4,4 +4,7 @@ import IFollowView from './IFollowView.vue';
4
4
  import IPickerView from './IPickerView.vue';
5
5
  import IScrollView from './IScrollView.vue';
6
6
  import IRouterView from './IRouterView.vue';
7
- export { Icon, IRouterView, IFollowView, IPickerView, IScrollView, Layer, LayerById };
7
+ import SideMenu from './SideMenu.vue';
8
+ import SideView from './SideView.vue';
9
+ export type { SideMenuItem } from './SideMenu.vue';
10
+ export { Icon, IRouterView, IFollowView, IPickerView, IScrollView, Layer, LayerById, SideMenu, SideView };
@@ -15,7 +15,7 @@
15
15
  <ul v-if="opt?.length" class="min-h-ms*s max-h-xl*s" :class="`nx-sm lh-ml ${optIndex === 0 ? '' : 'bl-xs b-back b-solid'}`" ui-scroll=":y s">
16
16
  <!-- 多选 -->
17
17
  <template v-if="multiple">
18
- <li v-for="(item, idx) of opt" :key="idx" class="ux-hover nx-sm r-ss" ui-wrap="no" @click="multiSelect(item, optIndex)">
18
+ <li v-for="(item, idx) of opt" :key="idx" class="ux-hover nx-sm mob:ny-ss r-ss" ui-wrap="no" @click="multiSelect(item, optIndex)">
19
19
  <div ui-flex="row xm">
20
20
  <div :ui-form="`${theme} type:checkbox :block`">
21
21
  <input
@@ -38,7 +38,7 @@
38
38
  v-for="(item, idx) of opt"
39
39
  :key="idx"
40
40
  :class="item.value === state.transSelected?.value ? 'co-main' : ''"
41
- class="ux-hover nx-sm r-ss" ui-wrap="no"
41
+ class="ux-hover nx-sm mob:ny-ss r-ss" ui-wrap="no"
42
42
  @click="select(item, optIndex)"
43
43
  >
44
44
  <IFollowView :ui-tips="uiTips" v-if="item.optTips" event="hover">
@@ -22,13 +22,13 @@
22
22
  </div>
23
23
  <ul v-if="state.filter?.length" ui-scroll=":y s" class="nx-sm lh-ml" style="min-width: 100%; max-height: 15em">
24
24
  <template v-for="(item, idx) of state.filter" :key="idx">
25
- <li v-if="item.disabled" class="ux-hover nx-sm r-ss o-ms" ui-wrap="no">
25
+ <li v-if="item.disabled" class="ux-hover nx-sm mob:ny-ss r-ss o-ms" ui-wrap="no">
26
26
  <label style="pointer-events: none" :ui-form="`${theme} type:checkbox :block`">
27
27
  <input type="checkbox" :name="state.name" :checked="state.processedValue?.some((i: any) => `${i}` === `${item.value}`)" />
28
28
  <del class="ml-sm">{{ item.label || item }}</del>
29
29
  </label>
30
30
  </li>
31
- <li v-else class="ux-hover nx-sm r-ss" ui-wrap="no" @click.stop="select(item.value)">
31
+ <li v-else class="ux-hover nx-sm mob:ny-ss r-ss" ui-wrap="no" @click.stop="select(item.value)">
32
32
  <label style="pointer-events: none" :ui-form="`${theme} type:checkbox :block`">
33
33
  <input type="checkbox" :name="state.name" :checked="state.processedValue?.some((i: any) => `${i}` === `${item.value}`)" />
34
34
  <span class="ml-sm">{{ item.label || item }}</span>
@@ -40,7 +40,7 @@
40
40
  <ul class="nx-sm lh-sl" v-if="tools">
41
41
  <li class="my-ss"><div class="o-mm" ui-line="@a"></div></li>
42
42
  <li ui-flex="row xm">
43
- <div class="ux-hover nx-sm ny-ss r-ss co-main" ui-wrap="no" @click.stop="allselect()">
43
+ <div class="ux-hover nx-sm ny-ss mob:ny-sm r-ss co-main" ui-wrap="no" @click.stop="allselect()">
44
44
  <label style="pointer-events: none" :ui-form="`${theme} type:checkbox :block`">
45
45
  <input type="checkbox" :name="state.name" :checked="state.all" />
46
46
  <span class="ml-sm">全选({{ state.selectedCount }}/{{ state.availableCount }})</span>
@@ -17,7 +17,7 @@
17
17
  </div>
18
18
  </div>
19
19
  <ul v-if="props.options?.length" ui-form-dropdown="" ui-scroll=":y s" class="nx-sm lh-ml" style="min-width: 100%; max-height: 15em">
20
- <li class="ux-hover nx-sm r-ss" ui-wrap="no" v-for="(item, idx) of props.options" :key="idx" @click.stop="select(item.value)">
20
+ <li class="ux-hover nx-sm mob:ny-ss r-ss" ui-wrap="no" v-for="(item, idx) of props.options" :key="idx" @click.stop="select(item.value)">
21
21
  <label style="pointer-events: none" :ui-form="`${theme} type:checkbox :block`">
22
22
  <input type="checkbox" :name="formName" :checked="modelValue?.some((i: any) => `${i}` === `${item.value}`)" />
23
23
  <span class="ml-sm">{{ item.label || item }}</span>
@@ -28,7 +28,7 @@
28
28
  <ul class="nx-sm lh-ml" v-if="tools">
29
29
  <li class="my-ss"><div class="o-mm" ui-line="@a"></div></li>
30
30
  <li ui-flex="row xm">
31
- <div class="ux-hover nx-sm r-ss co-main" ui-wrap="no" @click.stop="allselect()">
31
+ <div class="ux-hover nx-sm mob:ny-ss r-ss co-main" ui-wrap="no" @click.stop="allselect()">
32
32
  <label style="pointer-events: none" :ui-form="`${theme} type:checkbox :block`">
33
33
  <input type="checkbox" :name="formName" :checked="state.all" />
34
34
  <!-- <span class="ml-sm">全选({{ props.options?.length || 0 }})</span> -->
@@ -15,7 +15,7 @@
15
15
  </div>
16
16
  </div>
17
17
  <ul v-if="props.options?.length" ui-scroll=":y s" class="nx-sm lh-ml" style="min-width: 100%; max-height: 16em">
18
- <li class="ux-hover nx-sm r-ss" ui-wrap="no" :class="item.value === state.selectd?.value ? 'co-main' : ''" v-for="(item, idx) of options" :key="idx" @click="select(item)">
18
+ <li class="ux-hover nx-sm mob:ny-ss r-ss" ui-wrap="no" :class="item.value === state.selectd?.value ? 'co-main' : ''" v-for="(item, idx) of options" :key="idx" @click="select(item)">
19
19
  {{ item.label || item }}
20
20
  </li>
21
21
  </ul>
@@ -15,7 +15,7 @@
15
15
  </div>
16
16
  </div>
17
17
  <ul v-if="props.options?.length" ui-form-dropdown="" ui-scroll=":y s" class="nx-sm lh-ml" style="min-width: 100%; max-height: 15em">
18
- <li class="ux-hover nx-sm r-ss" ui-wrap="no" v-for="(item, idx) of state.filter" :key="idx" @click.stop="select(item.value)">
18
+ <li class="ux-hover nx-sm mob:ny-ss r-ss" ui-wrap="no" v-for="(item, idx) of state.filter" :key="idx" @click.stop="select(item.value)">
19
19
  <label style="pointer-events: none" :ui-form="`${theme} type:checkbox :block`">
20
20
  <input type="checkbox" :name="formName" :checked="modelValue?.some((i: any) => `${i}` === `${item.value}`)" />
21
21
  <span class="ml-sm">{{ item.label || item }}</span>
@@ -26,7 +26,7 @@
26
26
  <ul class="nx-sm lh-ml" v-if="tools">
27
27
  <li class="my-ss"><div class="o-mm" ui-line="@a"></div></li>
28
28
  <li ui-flex="row xm">
29
- <div class="ux-hover nx-sm r-ss co-main" ui-wrap="no" @click.stop="allselect()">
29
+ <div class="ux-hover nx-sm mob:ny-ss r-ss co-main" ui-wrap="no" @click.stop="allselect()">
30
30
  <label style="pointer-events: none" :ui-form="`${theme} type:checkbox :block`">
31
31
  <input type="checkbox" :name="formName" :checked="state.all" />
32
32
  <span class="ml-sm">全选({{ state.filter?.length || 0 }})</span>
@@ -18,7 +18,7 @@
18
18
  </div>
19
19
  <ul v-if="props.options?.length" ui-scroll=":y s" class="nx-sm lh-sl" style="min-width: 100%; max-height: 16em">
20
20
  <li
21
- class="ux-hover nx-sm ny-ss r-ss" ui-wrap="no"
21
+ class="ux-hover nx-sm ny-ss mob:ny-sm r-ss" ui-wrap="no"
22
22
  :class="item.value === state.selectd?.value ? 'co-main' : ''"
23
23
  v-for="(item, idx) of state.filter"
24
24
  :key="idx"
@@ -21,10 +21,10 @@
21
21
  </div>
22
22
  <ul v-if="state.filter?.length" ui-scroll=":y s" class="nx-sm lh-sl" style="min-width: 100%; max-height: 16em">
23
23
  <template v-for="(item, idx) of state.filter" :key="idx">
24
- <li v-if="item.disabled" class="ux-hover nx-sm ny-ss r-ss o-ms" ui-wrap="no" :class="isItemSelected(item) ? 'co-main' : ''">
24
+ <li v-if="item.disabled" class="ux-hover nx-sm ny-ss mob:ny-sm r-ss o-ms" ui-wrap="no" :class="isItemSelected(item) ? 'co-main' : ''">
25
25
  <del>{{ item.label || item }}</del>
26
26
  </li>
27
- <li v-else class="ux-hover nx-sm ny-ss r-ss" ui-wrap="no" :class="isItemSelected(item) ? 'co-main' : ''" @click="select(item)">
27
+ <li v-else class="ux-hover nx-sm ny-ss mob:ny-sm r-ss" ui-wrap="no" :class="isItemSelected(item) ? 'co-main' : ''" @click="select(item)">
28
28
  <span>{{ item.label || item }}</span>
29
29
  </li>
30
30
  </template>