Skip to content

Commit 5dd55b5

Browse files
committed
Merge branch 'jjagielka-select'
2 parents 2dda089 + 3035bd8 commit 5dd55b5

File tree

4 files changed

+35
-18
lines changed

4 files changed

+35
-18
lines changed

src/lib/forms/select/MultiSelect.svelte

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
<script lang="ts" generics="T">
22
import clsx from "clsx";
3-
import type { MultiSelectProps, SelectOptionType } from "$lib";
3+
import type { MultiSelectProps, SelectOptionType, SizeType } from "$lib";
44
import Badge from "$lib/badge/Badge.svelte";
55
import CloseButton from "$lib/utils/CloseButton.svelte";
66
import { multiSelect } from "./theme";
77
import { getTheme, warnThemeDeprecation } from "$lib/theme/themeUtils";
8-
import { onMount } from "svelte";
8+
import { getContext, onMount } from "svelte";
99
import { createDismissableContext } from "$lib/utils/dismissable";
1010
1111
// Consider reusing that component - https://svelecte.vercel.app/
@@ -37,6 +37,7 @@
3737
3838
let selectItems = $derived(items.filter((x) => value.includes(x.value)));
3939
let show: boolean = $state(false);
40+
let group: { size: SizeType } = getContext("group");
4041
4142
// Active item
4243
let activeIndex: number | null = $state(null);
@@ -193,7 +194,7 @@
193194
};
194195
});
195196
196-
const { base, dropdown, item: dropdownItem, close, select, placeholder: placeholderSpan, svg } = multiSelect({ disabled });
197+
const { base, dropdown, item: dropdownItem, close, select, placeholder: placeholderSpan, svg } = multiSelect({ disabled, grouped: !!group });
197198
</script>
198199

199200
<select {name} {form} {required} {autocomplete} {value} hidden multiple {onchange}>
@@ -212,7 +213,7 @@
212213
{#if children}
213214
{@render children({ item, clear: () => clearThisOption(item) })}
214215
{:else}
215-
<Badge color="gray" large={size === "lg"} dismissable params={{ duration: 100 }} onclose={() => clearThisOption(item)} class={[disabled && "pointer-events-none"]}>
216+
<Badge color="gray" large={size === "lg"} dismissable params={{ duration: 100 }} onclose={() => clearThisOption(item)} class={["py-0 px-2 mx-0.5", disabled && "pointer-events-none"]}>
216217
{item.name}
217218
</Badge>
218219
{/if}

src/lib/forms/select/Select.svelte

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
<script lang="ts" generics="T">
22
import { select as selectCls } from "./theme";
33
import clsx from "clsx";
4-
import type { SelectProps } from "$lib";
4+
import type { SelectProps, SizeType } from "$lib";
55
import CloseButton from "$lib/utils/CloseButton.svelte";
66
import { getTheme, warnThemeDeprecation } from "$lib/theme/themeUtils";
77
import { createDismissableContext } from "$lib/utils/dismissable";
8+
import { getContext } from "svelte";
89
910
let { children, items, value = $bindable(), elementRef = $bindable(), underline, size = "md", disabled, placeholder = "Choose option ...", clearable, clearableColor = "none", clearableOnClick, onClear, clearableSvgClass, clearableClass, selectClass, class: className, classes, ...restProps }: SelectProps<T> = $props();
1011
@@ -14,7 +15,8 @@
1415
1516
const theme = getTheme("select");
1617
17-
const { base, select, close } = $derived(selectCls({ underline, size, disabled }));
18+
let group: { size: SizeType } = getContext("group");
19+
const { base, select, close } = $derived(selectCls({ underline, size, disabled, grouped: !!group }));
1820
1921
const clearAll = () => {
2022
if (elementRef) {

src/lib/forms/select/theme.ts

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,18 @@ export type MultiSelectVariants = VariantProps<typeof multiSelect> & Classes<typ
77

88
export const select = tv({
99
slots: {
10-
base: "relative",
10+
base: "relative w-full",
1111
select: "block w-full rtl:text-right",
1212
close: "absolute right-8 top-1/2 -translate-y-1/2 text-gray-400 hover:text-black",
1313
svg: ""
1414
},
1515
variants: {
1616
underline: {
1717
true: {
18-
select: "text-gray-500 bg-transparent border-0 border-b-2 border-gray-200 appearance-none dark:text-gray-400 dark:border-gray-700 focus:outline-hidden focus:ring-0 focus:border-gray-200 peer px-0!"
18+
select: "text-gray-500 bg-transparent rounded-none! border-0 border-b-2 border-gray-200 appearance-none dark:text-gray-400 dark:border-gray-700 focus:outline-hidden focus:ring-0 focus:border-gray-200 peer px-0!"
1919
},
2020
false: {
21-
select: "text-gray-900 bg-gray-50 border border-gray-300 rounded-lg focus:outline-hidden focus:ring-primary-500 focus:border-primary-500 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-primary-500 dark:focus:border-primary-500"
21+
select: "text-gray-900 bg-gray-50 border border-gray-300 focus:outline-hidden focus:ring-primary-500 focus:border-primary-500 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-primary-500 dark:focus:border-primary-500"
2222
}
2323
},
2424
size: {
@@ -31,6 +31,13 @@ export const select = tv({
3131
select: "cursor-not-allowed opacity-50"
3232
},
3333
false: {}
34+
},
35+
grouped: {
36+
false: { base: "rounded-lg", select: "rounded-lg" },
37+
true: {
38+
base: "first:rounded-s-lg last:rounded-e-lg not-first:-ms-px group",
39+
select: "group-first:rounded-s-lg group-last:rounded-e-lg group-not-first:-ms-px h-full"
40+
}
3441
}
3542
},
3643
defaultVariants: {
@@ -41,8 +48,8 @@ export const select = tv({
4148

4249
export const multiSelect = tv({
4350
slots: {
44-
base: "relative border border-gray-300 flex items-center rounded-lg gap-2 dark:border-gray-600 ring-primary-500 dark:ring-primary-500 focus-visible:outline-hidden",
45-
select: "flex flex-wrap gap-2",
51+
base: "relative border border-gray-300 w-full flex items-center gap-2 dark:border-gray-600 ring-primary-500 dark:ring-primary-500 focus-visible:outline-hidden",
52+
select: "",
4653
dropdown: "absolute z-50 p-3 flex flex-col gap-1 max-h-64 bg-white border border-gray-300 dark:bg-gray-700 dark:border-gray-600 start-0 top-[calc(100%+1rem)] rounded-lg cursor-pointer overflow-y-scroll w-full",
4754
item: "py-2 px-3 rounded-lg text-gray-600 hover:text-gray-600 dark:text-gray-400 hover:bg-gray-100 dark:hover:text-gray-300 dark:hover:bg-gray-600",
4855
close: "p-0 focus:ring-gray-400 dark:text-white",
@@ -73,6 +80,13 @@ export const multiSelect = tv({
7380
true: {
7481
item: "bg-gray-100 text-black font-semibold hover:text-black dark:text-white dark:bg-gray-600 dark:hover:text-white"
7582
}
83+
},
84+
grouped: {
85+
false: { base: "rounded-lg", select: "rounded-lg" },
86+
true: {
87+
base: "first:rounded-s-lg last:rounded-e-lg not-first:-ms-px group",
88+
select: "group-first:rounded-s-lg group-last:rounded-e-lg group-not-first:-ms-px h-full"
89+
}
7690
}
7791
},
7892
// Add compoundVariants here

src/routes/docs-examples/forms/select/Dropdown.svelte

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script lang="ts">
2-
import { Select, Dropdown, DropdownItem } from "flowbite-svelte";
2+
import { Select, Button, ButtonGroup, Dropdown, DropdownItem } from "flowbite-svelte";
33
import { ChevronDownOutline } from "flowbite-svelte-icons";
44
import Usa from "$icons/Usa.svelte";
55
import Germany from "$icons/Germany.svelte";
@@ -21,13 +21,13 @@
2121
];
2222
</script>
2323

24-
<div class="flex">
25-
<button id="states-button" class="z-10 inline-flex shrink-0 items-center rounded-s-lg border border-gray-300 bg-gray-100 px-4 py-1.5 text-center text-sm font-medium text-gray-500 hover:bg-gray-200 focus:ring-4 focus:ring-gray-100 focus:outline-hidden dark:border-gray-600 dark:bg-gray-700 dark:text-white dark:hover:bg-gray-600 dark:focus:ring-gray-700" type="button">
24+
<ButtonGroup class="w-full">
25+
<Button class="bg-gray-100 text-gray-500 hover:bg-gray-200 hover:text-gray-500 focus:ring-gray-100 dark:bg-gray-700 dark:text-white dark:hover:bg-gray-600 dark:focus:ring-gray-700">
2626
<Usa />
2727
USA
2828
<ChevronDownOutline class="ms-2 h-6 w-6" />
29-
</button>
30-
<Dropdown simple triggeredBy="#states-button">
29+
</Button>
30+
<Dropdown simple>
3131
<DropdownItem class="flex items-center">
3232
<Usa />
3333
United States
@@ -45,5 +45,5 @@
4545
China
4646
</DropdownItem>
4747
</Dropdown>
48-
<Select items={states} placeholder="Choose the state" selectClass="rounded-s-none!" class="w-full" />
49-
</div>
48+
<Select items={states} placeholder="Choose the state" />
49+
</ButtonGroup>

0 commit comments

Comments
 (0)