Skip to content

Commit db76ec3

Browse files
committed
optimize(packages): optimize components for menu categories
1 parent 6595e07 commit db76ec3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+791
-657
lines changed
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<script setup lang="ts">
2+
import { computed } from 'vue';
3+
import {
4+
ComboboxContent,
5+
ComboboxPortal,
6+
ComboboxViewport,
7+
useCombinedPropsEmits,
8+
useOmitForwardProps
9+
} from '@soybean-ui/primitives';
10+
import { cn, comboboxVariants } from '@soybean-ui/variants';
11+
import type { ComboboxContentEmits, ComboboxContentProps } from './types';
12+
13+
defineOptions({
14+
name: 'SComboboxContent'
15+
});
16+
17+
const props = withDefaults(defineProps<ComboboxContentProps>(), {
18+
position: 'popper',
19+
align: 'center',
20+
sideOffset: 4
21+
});
22+
23+
const emit = defineEmits<ComboboxContentEmits>();
24+
25+
const forwardedProps = useOmitForwardProps(props, ['class', 'size']);
26+
27+
const forwarded = useCombinedPropsEmits(forwardedProps, emit);
28+
29+
const mergedCls = computed(() => {
30+
const { content } = comboboxVariants({ size: props.size });
31+
32+
return cn(content(), props.class);
33+
});
34+
</script>
35+
36+
<template>
37+
<ComboboxPortal>
38+
<ComboboxContent v-bind="forwarded" :class="mergedCls">
39+
<ComboboxViewport>
40+
<slot />
41+
</ComboboxViewport>
42+
</ComboboxContent>
43+
</ComboboxPortal>
44+
</template>
Lines changed: 7 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,23 @@
11
<script setup lang="ts">
22
import { computed } from 'vue';
3-
import {
4-
ComboboxContent,
5-
ComboboxPortal,
6-
ComboboxViewport,
7-
useCombinedPropsEmits,
8-
useOmitForwardProps
9-
} from '@soybean-ui/primitives';
103
import { cn, comboboxVariants } from '@soybean-ui/variants';
11-
import type { ComboBoxListEmits, ComboboxListProps } from './types';
4+
import type { ComboboxListProps } from './types';
125
136
defineOptions({
147
name: 'SComboboxList'
158
});
169
17-
const props = withDefaults(defineProps<ComboboxListProps>(), {
18-
position: 'popper',
19-
align: 'center',
20-
sideOffset: 4
21-
});
22-
23-
const emit = defineEmits<ComboBoxListEmits>();
24-
25-
const forwardedProps = useOmitForwardProps(props, ['class', 'size']);
26-
27-
const forwarded = useCombinedPropsEmits(forwardedProps, emit);
10+
const { class: cls, size } = defineProps<ComboboxListProps>();
2811
2912
const mergedCls = computed(() => {
30-
const { list } = comboboxVariants({ size: props.size });
13+
const { list } = comboboxVariants({ size });
3114
32-
return cn(list(), props.class);
15+
return cn(list(), cls);
3316
});
3417
</script>
3518

3619
<template>
37-
<ComboboxPortal>
38-
<ComboboxContent v-bind="forwarded" :class="mergedCls">
39-
<ComboboxViewport>
40-
<slot />
41-
</ComboboxViewport>
42-
</ComboboxContent>
43-
</ComboboxPortal>
20+
<div :class="mergedCls">
21+
<slot />
22+
</div>
4423
</template>

packages/soy-ui/src/components/combobox/combobox-search-icon.vue

Lines changed: 0 additions & 24 deletions
This file was deleted.

packages/soy-ui/src/components/combobox/combobox.vue

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22
import { computed, ref } from 'vue';
33
import { useCombinedPropsEmits, useOmitEmitAsProps, useOmitForwardProps } from '@soybean-ui/primitives';
44
import type { AcceptableValue, SelectEvent } from '@soybean-ui/primitives';
5-
import { ChevronsUpDown } from 'lucide-vue-next';
5+
import { ChevronsUpDown, Search } from 'lucide-vue-next';
66
import SButton from '../button/button.vue';
77
import SComboboxRoot from './combobox-root.vue';
88
import SComboboxAnchor from './combobox-anchor.vue';
99
import SComboboxEmpty from './combobox-empty.vue';
1010
import SComboboxInput from './combobox-input.vue';
1111
import SComboboxTrigger from './combobox-trigger.vue';
12-
import SComboboxSearchIcon from './combobox-search-icon.vue';
12+
import SComboboxContent from './combobox-content.vue';
1313
import SComboboxList from './combobox-list.vue';
1414
import SComboboxOption from './combobox-option.vue';
1515
import { getComboboxOptionByValue } from './shared';
@@ -89,13 +89,13 @@ const computedInputProps = computed(() => ({
8989
@update:model-value="emit('update:inputModelValue', $event)"
9090
>
9191
<template #trailing>
92-
<SComboboxTrigger :size="size" :mode="mode">
92+
<SComboboxTrigger :class="ui?.trigger" :size="size" :mode="mode">
9393
<ChevronsUpDown />
9494
</SComboboxTrigger>
9595
</template>
9696
</SComboboxInput>
9797
</SComboboxAnchor>
98-
<SComboboxList :class="ui?.list" :size="size">
98+
<SComboboxContent :class="ui?.content" :size="size">
9999
<SComboboxInput
100100
v-if="mode === 'modern'"
101101
v-bind="computedInputProps"
@@ -106,22 +106,24 @@ const computedInputProps = computed(() => ({
106106
:mode="mode"
107107
@update:model-value="emit('update:inputModelValue', $event)"
108108
>
109-
<template #trailing>
110-
<SComboboxSearchIcon :class="ui?.searchIcon" :size="size" />
109+
<template #leading>
110+
<Search />
111111
</template>
112112
</SComboboxInput>
113113
<SComboboxEmpty :class="ui?.empty" :size="size">{{ emptyLabel || defaultEmptyLabel }}</SComboboxEmpty>
114-
<SComboboxOption
115-
v-for="(item, itemIndex) in items"
116-
v-slot="slotProps"
117-
:key="itemIndex"
118-
:size="size"
119-
:item="item"
120-
:ui="ui"
121-
@select="handleSelect"
122-
>
123-
<slot name="item" v-bind="slotProps" />
124-
</SComboboxOption>
125-
</SComboboxList>
114+
<SComboboxList :class="ui?.list" :size="size">
115+
<SComboboxOption
116+
v-for="(item, itemIndex) in items"
117+
v-slot="slotProps"
118+
:key="itemIndex"
119+
:size="size"
120+
:item="item"
121+
:ui="ui"
122+
@select="handleSelect"
123+
>
124+
<slot name="item" v-bind="slotProps" />
125+
</SComboboxOption>
126+
</SComboboxList>
127+
</SComboboxContent>
126128
</SComboboxRoot>
127129
</template>

packages/soy-ui/src/components/combobox/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import SCombobox from './combobox.vue';
22
import SComboboxAnchor from './combobox-anchor.vue';
3+
import SComboboxContent from './combobox-content.vue';
34
import SComboboxEmpty from './combobox-empty.vue';
45
import SComboboxGroupLabel from './combobox-group-label.vue';
56
import SComboboxGroup from './combobox-group.vue';
@@ -8,14 +9,14 @@ import SComboboxItem from './combobox-item.vue';
89
import SComboboxList from './combobox-list.vue';
910
import SComboboxOption from './combobox-option.vue';
1011
import SComboboxRoot from './combobox-root.vue';
11-
import SComboboxSearchIcon from './combobox-search-icon.vue';
1212
import SComboboxSeparator from './combobox-separator.vue';
1313
import SComboboxSingleOption from './combobox-single-option.vue';
1414
import SComboboxTrigger from './combobox-trigger.vue';
1515

1616
export {
1717
SCombobox,
1818
SComboboxAnchor,
19+
SComboboxContent,
1920
SComboboxEmpty,
2021
SComboboxGroup,
2122
SComboboxGroupLabel,
@@ -24,7 +25,6 @@ export {
2425
SComboboxList,
2526
SComboboxOption,
2627
SComboboxRoot,
27-
SComboboxSearchIcon,
2828
SComboboxSeparator,
2929
SComboboxSingleOption,
3030
SComboboxTrigger

packages/soy-ui/src/components/combobox/types.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@ import type {
33
AcceptableValue,
44
ClassValue,
55
ClassValueProp,
6-
ComboboxContentEmits as ComboBoxListEmits,
7-
ComboboxContentProps,
6+
ComboboxContentEmits,
87
ComboboxInputEmits,
98
ComboboxItemEmits,
109
ComboboxLabelProps,
1110
ComboboxRootEmits,
1211
ComboboxTriggerPropsWithPrimitive,
1312
SelectEvent,
1413
ComboboxAnchorProps as _ComboboxAnchorProps,
14+
ComboboxContentProps as _ComboboxContentProps,
1515
ComboboxEmptyProps as _ComboboxEmptyProps,
1616
ComboboxGroupProps as _ComboboxGroupProps,
1717
ComboboxInputProps as _ComboboxInputProps,
@@ -58,7 +58,11 @@ export interface ComboboxItemProps<T extends AcceptableValue = AcceptableValue>
5858
size?: ThemeSize;
5959
}
6060

61-
export interface ComboboxListProps extends ComboboxContentProps {
61+
export interface ComboboxContentProps extends _ComboboxContentProps {
62+
size?: ThemeSize;
63+
}
64+
65+
export interface ComboboxListProps extends ClassValueProp {
6266
size?: ThemeSize;
6367
}
6468

@@ -130,4 +134,4 @@ export type ComboboxEmits<T extends AcceptableValue = AcceptableValue> = Combobo
130134
'update:inputModelValue': [string];
131135
};
132136

133-
export type { ComboboxRootEmits, ComboboxItemEmits, ComboBoxListEmits, ComboboxInputEmits };
137+
export type { ComboboxRootEmits, ComboboxItemEmits, ComboboxContentEmits, ComboboxInputEmits };

packages/soy-ui/src/components/command/command-root.vue

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,17 @@ defineOptions({
99
name: 'SCommandRoot'
1010
});
1111
12-
const { class: cls, ...delegatedProps } = defineProps<CommandRootProps<T>>();
12+
const { class: cls, size, ...delegatedProps } = defineProps<CommandRootProps<T>>();
1313
1414
const emit = defineEmits<CommandRootEmits<T>>();
1515
1616
const forwarded = useForwardPropsEmits(delegatedProps, emit);
1717
18-
const { root } = commandVariants();
18+
const mergedCls = computed(() => {
19+
const { root } = commandVariants({ size });
1920
20-
const mergedCls = computed(() => cn(root(), cls));
21+
return cn(root(), cls);
22+
});
2123
</script>
2224

2325
<template>

packages/soy-ui/src/components/command/command.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ const filteredItems = computed(() => {
7474
</script>
7575

7676
<template>
77-
<SCommandRoot v-bind="forwardedRoot" :class="props.class || ui?.root">
77+
<SCommandRoot v-bind="forwardedRoot" :class="props.class || ui?.root" :size="size">
7878
<SCommandInput
7979
v-bind="inputProps"
8080
v-model="searchTerm"

packages/soy-ui/src/components/command/types.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ import type { InputProps } from '../input';
2525
import type { KeyboardKeyProps, KeyboardKeyValue } from '../keyboard-key';
2626

2727
// CommandRoot
28-
export interface CommandRootProps<T extends AcceptableValue = AcceptableValue> extends ListboxRootProps<T> {}
28+
export interface CommandRootProps<T extends AcceptableValue = AcceptableValue> extends ListboxRootProps<T> {
29+
size?: ThemeSize;
30+
}
2931
export type CommandRootEmits<T extends AcceptableValue = AcceptableValue> = ListboxRootEmits<T>;
3032

3133
// CommandInput

packages/soy-ui/src/components/context-menu/context-menu-content.vue

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,17 @@ defineOptions({
88
name: 'SContextMenuContent'
99
});
1010
11-
const { class: cls, ...delegatedProps } = defineProps<ContextMenuContentProps>();
11+
const { class: cls, size, ...delegatedProps } = defineProps<ContextMenuContentProps>();
1212
1313
const emit = defineEmits<ContextMenuContentEmits>();
1414
1515
const forwarded = useForwardPropsEmits(delegatedProps, emit);
1616
17-
const { content } = menuVariants();
17+
const mergedCls = computed(() => {
18+
const { content } = menuVariants({ size });
1819
19-
const mergedCls = computed(() => cn(content(), cls));
20+
return cn(content(), cls);
21+
});
2022
</script>
2123

2224
<template>

0 commit comments

Comments
 (0)