+
);
diff --git a/packages/kit-headless/src/components/select/select-inline.tsx b/packages/kit-headless/src/components/select/select-inline.tsx
index ad2ee773e..d261adcee 100644
--- a/packages/kit-headless/src/components/select/select-inline.tsx
+++ b/packages/kit-headless/src/components/select/select-inline.tsx
@@ -1,6 +1,7 @@
import { type JSXNode, Component } from '@builder.io/qwik';
import { SelectImpl, type SelectProps } from './select';
import { SelectOption } from './select-option';
+import { SelectLabel } from './select-label';
export type Opt = {
isDisabled: boolean;
@@ -18,6 +19,7 @@ export const Select: Component
= (props: SelectProps) => {
const opts: Opt[] = [];
let currentIndex = 0;
let valuePropIndex = null;
+ let label = false;
const childrenToProcess = (
Array.isArray(myChildren) ? [...myChildren] : [myChildren]
@@ -70,6 +72,11 @@ export const Select: Component = (props: SelectProps) => {
break;
}
+ case SelectLabel: {
+ label = true;
+ break;
+ }
+
default: {
if (child) {
const anyChildren = Array.isArray(child.children)
@@ -95,7 +102,7 @@ export const Select: Component = (props: SelectProps) => {
}
return (
-
+
{props.children}
);
diff --git a/packages/kit-headless/src/components/select/select-label.tsx b/packages/kit-headless/src/components/select/select-label.tsx
index f69bed225..01794e9fe 100644
--- a/packages/kit-headless/src/components/select/select-label.tsx
+++ b/packages/kit-headless/src/components/select/select-label.tsx
@@ -1,14 +1,13 @@
import { PropsOf, Slot, component$, useContext } from '@builder.io/qwik';
-import { groupContextId } from './select-context';
+import SelectContextId from './select-context';
-type SelectLabelProps = PropsOf<'li'>;
-
-export const SelectLabel = component$((props) => {
- const groupContext = useContext(groupContextId);
+export const SelectLabel = component$((props: PropsOf<'div'>) => {
+ const context = useContext(SelectContextId);
+ const labelId = `${context.localId}-label`;
return (
-
+
-
+
);
});
diff --git a/packages/kit-headless/src/components/select/select-option.tsx b/packages/kit-headless/src/components/select/select-option.tsx
index d956a8837..8d93bbae6 100644
--- a/packages/kit-headless/src/components/select/select-option.tsx
+++ b/packages/kit-headless/src/components/select/select-option.tsx
@@ -10,6 +10,7 @@ import {
} from '@builder.io/qwik';
import { isServer, isBrowser } from '@builder.io/qwik/build';
import SelectContextId from './select-context';
+import { useSelect } from './use-select';
export type SelectOptionProps = PropsOf<'li'> & {
/** Internal index we get from the inline component. Please see select-inline.tsx */
@@ -30,8 +31,11 @@ export const SelectOption = component$((props) => {
const localIndexSig = useSignal(null);
const optionId = `${context.localId}-${_index}`;
+ const { addUniqueIndex } = useSelect();
+
const isSelectedSig = useComputed$(() => {
- return !disabled && context.selectedIndexSig.value === _index;
+ const index = _index ?? null;
+ return !disabled && context.selectedIndexesSig.value.includes(index);
});
const isHighlightedSig = useComputed$(() => {
@@ -78,8 +82,12 @@ export const SelectOption = component$((props) => {
const handleClick$ = $(() => {
if (disabled) return;
- context.selectedIndexSig.value = localIndexSig.value;
- context.isListboxOpenSig.value = false;
+ if (context.multiple) {
+ addUniqueIndex(context.selectedIndexesSig, localIndexSig.value);
+ } else {
+ context.selectedIndexesSig.value = [localIndexSig.value];
+ context.isListboxOpenSig.value = false;
+ }
});
const handlePointerOver$ = $(() => {
diff --git a/packages/kit-headless/src/components/select/select-trigger.tsx b/packages/kit-headless/src/components/select/select-trigger.tsx
index 6ae765c38..59bb3170d 100644
--- a/packages/kit-headless/src/components/select/select-trigger.tsx
+++ b/packages/kit-headless/src/components/select/select-trigger.tsx
@@ -8,6 +8,7 @@ export const SelectTrigger = component$((props) => {
const { getNextEnabledOptionIndex, getPrevEnabledOptionIndex } = useSelect();
const openKeys = ['ArrowUp', 'ArrowDown'];
const closedKeys = [`Escape`];
+ const labelId = `${context.localId}-label`;
const { typeahead$ } = useTypeahead();
@@ -64,48 +65,57 @@ export const SelectTrigger = component$((props) => {
}
if (!context.isListboxOpenSig.value) {
+ if (context.multiple) return;
+
if (e.key === 'ArrowRight' && context.highlightedIndexSig.value === null) {
- context.selectedIndexSig.value = await getNextEnabledOptionIndex(
+ const firstIndex = await getNextEnabledOptionIndex(
-1,
context.optionsSig.value,
context.loop,
);
+ context.selectedIndexesSig.value = [firstIndex];
- context.highlightedIndexSig.value = context.selectedIndexSig.value;
+ context.highlightedIndexSig.value = context.selectedIndexesSig.value[0];
return;
}
if (e.key === 'ArrowRight' && context.highlightedIndexSig.value !== null) {
- context.selectedIndexSig.value = await getNextEnabledOptionIndex(
- context.selectedIndexSig.value!,
+ const nextIndex = await getNextEnabledOptionIndex(
+ context.selectedIndexesSig.value[0]!,
context.optionsSig.value,
context.loop,
);
- console.log('selectedIndex', context.selectedIndexSig.value);
+ context.selectedIndexesSig.value = [nextIndex];
+
+ console.log('selectedIndex', context.selectedIndexesSig.value);
- context.highlightedIndexSig.value = context.selectedIndexSig.value;
+ context.highlightedIndexSig.value = context.selectedIndexesSig.value[0];
}
if (e.key === 'ArrowLeft' && context.highlightedIndexSig.value === null) {
- context.selectedIndexSig.value = await getPrevEnabledOptionIndex(
+ const lastIndex = await getPrevEnabledOptionIndex(
context.optionsSig.value.length,
context.optionsSig.value,
context.loop,
);
- context.highlightedIndexSig.value = context.selectedIndexSig.value;
+ context.selectedIndexesSig.value = [lastIndex];
+
+ context.highlightedIndexSig.value = context.selectedIndexesSig.value[0];
return;
}
if (e.key === 'ArrowLeft' && context.highlightedIndexSig.value !== null) {
- context.selectedIndexSig.value = await getPrevEnabledOptionIndex(
+ const prevIndex = await getPrevEnabledOptionIndex(
context.highlightedIndexSig.value,
context.optionsSig.value,
context.loop,
);
- context.highlightedIndexSig.value = context.selectedIndexSig.value;
+ context.selectedIndexesSig.value = [prevIndex];
+
+ context.highlightedIndexSig.value = context.selectedIndexesSig.value[0];
}
}
@@ -126,7 +136,7 @@ export const SelectTrigger = component$((props) => {
// select options
if (e.key === 'Enter' || e.key === ' ') {
- context.selectedIndexSig.value = context.highlightedIndexSig.value;
+ context.selectedIndexesSig.value = [context.highlightedIndexSig.value];
}
if (e.key === 'ArrowDown') {
@@ -150,12 +160,14 @@ export const SelectTrigger = component$((props) => {
return (