@@ -50,6 +50,11 @@ class Toolbar extends Module<ToolbarProps> {
50
50
51
51
// Check if the parent element has the custom "roving-tabindex" class in order to enable or disable roving tabindex
52
52
this . hasRovingTabindex = this . container . closest ( '.roving-tabindex' ) !== null ;
53
+ if ( this . hasRovingTabindex ) {
54
+ this . container . addEventListener ( 'keydown' , ( e ) => {
55
+ this . handleKeyboardEvent ( e ) ;
56
+ } ) ;
57
+ }
53
58
54
59
this . controls = [ ] ;
55
60
this . handlers = { } ;
@@ -140,28 +145,45 @@ class Toolbar extends Module<ToolbarProps> {
140
145
this . update ( range ) ;
141
146
} ) ;
142
147
143
- if ( this . hasRovingTabindex && input . tagName === 'BUTTON' ) {
144
- input . addEventListener ( 'keydown' , ( e ) => {
145
- this . handleKeyboardEvent ( e ) ;
146
- } ) ;
147
- }
148
-
149
148
this . controls . push ( [ format , input ] ) ;
149
+ if ( this . hasRovingTabindex ) {
150
+ this . setTabIndexes ( ) ;
151
+ }
150
152
}
151
153
154
+ setTabIndexes ( ) {
155
+ this . controls . forEach ( ( control , index ) => {
156
+ const [ , input ] = control ;
157
+ if ( input . tagName === 'BUTTON' ) {
158
+ input . tabIndex = index === 0 ? 0 : - 1 ;
159
+ }
160
+ } ) ;
161
+ } ;
162
+
152
163
handleKeyboardEvent ( e : KeyboardEvent ) {
153
164
var target = e . currentTarget ;
154
165
if ( ! target ) return ;
155
166
156
167
if ( e . key === 'ArrowLeft' || e . key === 'ArrowRight' ) {
157
- this . updateTabIndexes ( target , e . key ) ;
158
- }
168
+ this . updateTabIndexes ( target , e . key ) ;
169
+ }
159
170
}
160
171
161
172
updateTabIndexes ( target : EventTarget , key : string ) {
162
- const currentIndex = this . controls . findIndex ( control => control [ 1 ] === target ) ;
173
+ const elements = Array . from ( this . container ?. querySelectorAll ( 'button, .ql-picker-label' ) || [ ] ) as HTMLElement [ ] ;
174
+
175
+ const currentIndex = elements . findIndex ( ( el ) => el . tabIndex === 0 ) ;
176
+ if ( currentIndex === - 1 ) return ;
177
+
163
178
const currentItem = this . controls [ currentIndex ] [ 1 ] ;
164
- currentItem . tabIndex = - 1 ;
179
+ if ( currentItem . tagName === 'SELECT' ) {
180
+ const qlPickerLabel = currentItem . previousElementSibling ?. querySelectorAll ( '.ql-picker-label' ) [ 0 ] ;
181
+ if ( qlPickerLabel && qlPickerLabel . tagName === 'SPAN' ) {
182
+ ( qlPickerLabel as HTMLElement ) . tabIndex = - 1 ;
183
+ }
184
+ } else {
185
+ currentItem . tabIndex = - 1 ;
186
+ }
165
187
166
188
let nextIndex : number | null = null ;
167
189
if ( key === 'ArrowLeft' ) {
0 commit comments