File tree 8 files changed +20
-17
lines changed
apps/website/src/routes/docs/headless/select/snippets
packages/kit-headless/src/components/select
8 files changed +20
-17
lines changed Original file line number Diff line number Diff line change
1
+ ---
2
+ ' @qwik-ui/headless ' : patch
3
+ ---
4
+
5
+ fix: select can now be reactively disabled
Original file line number Diff line number Diff line change 10
10
width : 100% ;
11
11
height : 100% ;
12
12
border : 2px dotted hsla (var (--primary ) / 1 );
13
- border-radius : calc (var (--border-radius ) / 2 );
14
13
min-height : 44px ;
15
14
max-width : var (--select-width );
16
15
padding-block : 0.5rem ;
39
38
background-color : hsl (var (--background ));
40
39
padding : 0.5rem ;
41
40
border : 2px dotted hsla (var (--foreground ) / 0.6 );
42
- border-radius : calc (var (--border-radius ) / 2 );
43
41
max-width : var (--select-width );
44
42
color : hsl (var (--foreground ));
45
43
}
93
91
[data-highlighted ] {
94
92
background-color : hsla (var (--primary ) / 0.08 );
95
93
outline : 2px dotted hsla (var (--primary ) / 1 );
96
- border-radius : calc (var (--border-radius ) / 2 );
97
94
}
98
95
99
96
[data-disabled ] {
Original file line number Diff line number Diff line change @@ -44,7 +44,7 @@ export const HHiddenNativeSelect = component$(
44
44
multiple = { context . multiple }
45
45
tabIndex = { - 1 }
46
46
autocomplete = { autoComplete }
47
- disabled = { context . disabled }
47
+ disabled = { context . isDisabledSig . value ? true : undefined }
48
48
required = { context . required }
49
49
name = { context . name }
50
50
// height is determined by its children
Original file line number Diff line number Diff line change @@ -22,6 +22,7 @@ export type SelectContext = {
22
22
highlightedIndexSig : Signal < number | null > ;
23
23
currDisplayValueSig : Signal < string | string [ ] | undefined > ;
24
24
isListboxOpenSig : Signal < boolean > ;
25
+ isDisabledSig : Signal < boolean > ;
25
26
localId : string ;
26
27
27
28
// user configurable
@@ -38,11 +39,6 @@ export type SelectContext = {
38
39
* Specifies that the user must select a value before submitting the form. See [MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/select#required).
39
40
*/
40
41
required ?: boolean ;
41
-
42
- /**
43
- * If `true`, prevents the user from interacting with the select.
44
- */
45
- disabled ?: boolean ;
46
42
} ;
47
43
48
44
export const groupContextId = createContextId < GroupContext > ( 'Select-Group' ) ;
Original file line number Diff line number Diff line change @@ -8,7 +8,11 @@ export const HSelectDescription = component$((props: SelectDescriptionProps) =>
8
8
const descriptionId = `${ context . localId } -description` ;
9
9
10
10
return (
11
- < div id = { descriptionId } data-disabled = { context . disabled ? '' : undefined } { ...props } >
11
+ < div
12
+ id = { descriptionId }
13
+ data-disabled = { context . isDisabledSig . value ? '' : undefined }
14
+ { ...props }
15
+ >
12
16
< Slot />
13
17
</ div >
14
18
) ;
Original file line number Diff line number Diff line change @@ -6,7 +6,7 @@ export const HSelectLabel = component$((props: PropsOf<'div'>) => {
6
6
const labelId = `${ context . localId } -label` ;
7
7
8
8
const handleClick$ = $ ( ( ) => {
9
- if ( context . disabled ) return ;
9
+ if ( context . isDisabledSig . value ) return ;
10
10
11
11
context . triggerRef . value ?. focus ( ) ;
12
12
} ) ;
@@ -17,7 +17,7 @@ export const HSelectLabel = component$((props: PropsOf<'div'>) => {
17
17
18
18
return (
19
19
< div
20
- data-disabled = { context . disabled ? '' : undefined }
20
+ data-disabled = { context . isDisabledSig . value ? '' : undefined }
21
21
ref = { context . labelRef }
22
22
id = { labelId }
23
23
onClick$ = { [ handleClick$ , props . onClick$ ] }
Original file line number Diff line number Diff line change @@ -162,6 +162,7 @@ export const HSelectImpl = component$<SelectProps<boolean> & InternalSelectProps
162
162
163
163
const initialLoadSig = useSignal < boolean > ( true ) ;
164
164
const highlightedItemRef = useSignal < HTMLLIElement > ( ) ;
165
+ const isDisabledSig = useSignal < boolean > ( disabled ?? false ) ;
165
166
166
167
const context : SelectContext = {
167
168
itemsMapSig,
@@ -181,7 +182,7 @@ export const HSelectImpl = component$<SelectProps<boolean> & InternalSelectProps
181
182
multiple,
182
183
name,
183
184
required,
184
- disabled ,
185
+ isDisabledSig ,
185
186
} ;
186
187
187
188
useContextProvider ( SelectContextId , context ) ;
@@ -281,7 +282,7 @@ export const HSelectImpl = component$<SelectProps<boolean> & InternalSelectProps
281
282
} ) ;
282
283
283
284
useTask$ ( ( { track } ) => {
284
- context . disabled = track ( ( ) => disabled ) ;
285
+ isDisabledSig . value = track ( ( ) => disabled ?? false ) ;
285
286
} ) ;
286
287
287
288
return (
@@ -290,7 +291,7 @@ export const HSelectImpl = component$<SelectProps<boolean> & InternalSelectProps
290
291
ref = { rootRef }
291
292
data-open = { context . isListboxOpenSig . value ? '' : undefined }
292
293
data-closed = { ! context . isListboxOpenSig . value ? '' : undefined }
293
- data-disabled = { context . disabled ? '' : undefined }
294
+ data-disabled = { isDisabledSig . value ? '' : undefined }
294
295
aria-controls = { listboxId }
295
296
aria-expanded = { context . isListboxOpenSig . value }
296
297
aria-haspopup = "listbox"
Original file line number Diff line number Diff line change @@ -118,11 +118,11 @@ export const HSelectTrigger = component$<SelectTriggerProps>((props) => {
118
118
onKeyDown$ = { [ handleKeyDownSync$ , handleKeyDown$ , props . onKeyDown$ ] }
119
119
data-open = { context . isListboxOpenSig . value ? '' : undefined }
120
120
data-closed = { ! context . isListboxOpenSig . value ? '' : undefined }
121
- data-disabled = { context . disabled ? '' : undefined }
121
+ data-disabled = { context . isDisabledSig . value ? '' : undefined }
122
122
aria-expanded = { context . isListboxOpenSig . value }
123
123
aria-labelledby = { labelId }
124
124
aria-describedby = { descriptionId }
125
- disabled = { context . disabled }
125
+ disabled = { context . isDisabledSig . value ? true : undefined }
126
126
preventdefault :blur
127
127
>
128
128
< Slot />
You can’t perform that action at this time.
0 commit comments