@@ -20,11 +20,23 @@ export type TabProps = {
20
20
disabled ?: boolean ;
21
21
} & QwikIntrinsicElements [ 'button' ] ;
22
22
23
+ export const preventedKeys = [
24
+ KeyCode . Home ,
25
+ KeyCode . End ,
26
+ KeyCode . PageDown ,
27
+ KeyCode . PageUp ,
28
+ KeyCode . ArrowDown ,
29
+ KeyCode . ArrowUp ,
30
+ KeyCode . ArrowLeft ,
31
+ KeyCode . ArrowRight ,
32
+ ] ;
33
+
23
34
export const Tab = component$ ( ( props : TabProps ) => {
24
35
const contextService = useContext ( tabsContextId ) ;
25
36
const isSelectedSig = useSignal ( false ) ;
26
37
const serverAssignedIndexSig = useSignal < number | undefined > ( undefined ) ;
27
38
const matchedTabPanelIdSig = useSignal < string | undefined > ( undefined ) ;
39
+ const elementRefSig = useSignal < HTMLElement | undefined > ( ) ;
28
40
const uniqueTabId = useId ( ) ;
29
41
30
42
useTask$ ( async function indexInitTask ( { cleanup } ) {
@@ -42,6 +54,8 @@ export const Tab = component$((props: TabProps) => {
42
54
} ) ;
43
55
44
56
useTask$ ( async function isSelectedTask ( { track } ) {
57
+ track ( ( ) => serverAssignedIndexSig . value ) ;
58
+
45
59
const isTabSelected = await track ( ( ) =>
46
60
contextService . isTabSelected$ ( uniqueTabId )
47
61
) ;
@@ -68,6 +82,19 @@ export const Tab = component$((props: TabProps) => {
68
82
) ;
69
83
} ) ;
70
84
85
+ useVisibleTask$ ( function preventDefaultOnKeysVisibleTask ( { cleanup } ) {
86
+ function handler ( event : KeyboardEvent ) {
87
+ if ( preventedKeys . includes ( event . key as KeyCode ) ) {
88
+ event . preventDefault ( ) ;
89
+ }
90
+ contextService . onTabKeyDown$ ( event . key as KeyCode , uniqueTabId ) ;
91
+ }
92
+ elementRefSig . value ?. addEventListener ( 'keydown' , handler ) ;
93
+ cleanup ( ( ) => {
94
+ elementRefSig . value ?. removeEventListener ( 'keydown' , handler ) ;
95
+ } ) ;
96
+ } ) ;
97
+
71
98
const selectIfAutomatic$ = $ ( ( ) => {
72
99
contextService . selectIfAutomatic$ ( uniqueTabId ) ;
73
100
} ) ;
@@ -78,6 +105,7 @@ export const Tab = component$((props: TabProps) => {
78
105
data-tab-id = { uniqueTabId }
79
106
type = "button"
80
107
role = "tab"
108
+ ref = { elementRefSig }
81
109
disabled = { props . disabled }
82
110
aria-disabled = { props . disabled }
83
111
onFocus$ = { selectIfAutomatic$ }
@@ -94,13 +122,6 @@ export const Tab = component$((props: TabProps) => {
94
122
props . onClick$ ( event ) ;
95
123
}
96
124
} }
97
- preventdefault :keydown
98
- onKeyDown$ = { ( e ) => {
99
- contextService . onTabKeyDown$ (
100
- e . key as KeyCode ,
101
- ( e . target as any ) . getAttribute ( 'data-tab-id' )
102
- ) ;
103
- } }
104
125
>
105
126
< Slot />
106
127
</ button >
0 commit comments