Skip to content

Commit cd36991

Browse files
Merge pull request #632 from OneNoteDev/claude/issue-631-20260226-0922
fix: Add explicit tabIndex to mode buttons for proper focus order
2 parents b8014f3 + 26e2c24 commit cd36991

1 file changed

Lines changed: 27 additions & 18 deletions

File tree

src/scripts/clipperUI/components/modeButtonSelector.tsx

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class ModeButtonSelectorClass extends ComponentBase<{}, ClipperStateProp> {
1616
});
1717
};
1818

19-
private getPdfButtonProps(currentMode: ClipMode): PropsForModeElementNoAriaGrouping {
19+
private getPdfButtonProps(currentMode: ClipMode, tabIndex: number): PropsForModeElementNoAriaGrouping {
2020
if (this.props.clipperState.pageInfo.contentType !== OneNoteApi.ContentType.EnhancedUrl) {
2121
return undefined;
2222
}
@@ -27,11 +27,12 @@ class ModeButtonSelectorClass extends ComponentBase<{}, ClipperStateProp> {
2727
myMode: ClipMode.Pdf,
2828
selected: currentMode === ClipMode.Pdf,
2929
onModeSelected: this.onModeSelected.bind(this),
30-
tooltipText: Localization.getLocalizedString("WebClipper.ClipType.Pdf.Button.Tooltip")
30+
tooltipText: Localization.getLocalizedString("WebClipper.ClipType.Pdf.Button.Tooltip"),
31+
tabIndex: tabIndex
3132
};
3233
}
3334

34-
private getAugmentationButtonProps(currentMode: ClipMode): PropsForModeElementNoAriaGrouping {
35+
private getAugmentationButtonProps(currentMode: ClipMode, tabIndex: number): PropsForModeElementNoAriaGrouping {
3536
if (this.props.clipperState.pageInfo.contentType === OneNoteApi.ContentType.EnhancedUrl) {
3637
return undefined;
3738
}
@@ -46,11 +47,12 @@ class ModeButtonSelectorClass extends ComponentBase<{}, ClipperStateProp> {
4647
myMode: ClipMode.Augmentation,
4748
selected: buttonSelected,
4849
onModeSelected: this.onModeSelected.bind(this),
49-
tooltipText: augmentationTooltip
50+
tooltipText: augmentationTooltip,
51+
tabIndex: tabIndex
5052
};
5153
}
5254

53-
private getFullPageButtonProps(currentMode: ClipMode): PropsForModeElementNoAriaGrouping {
55+
private getFullPageButtonProps(currentMode: ClipMode, tabIndex: number): PropsForModeElementNoAriaGrouping {
5456
if (this.props.clipperState.pageInfo.contentType === OneNoteApi.ContentType.EnhancedUrl) {
5557
return undefined;
5658
}
@@ -61,11 +63,12 @@ class ModeButtonSelectorClass extends ComponentBase<{}, ClipperStateProp> {
6163
myMode: ClipMode.FullPage,
6264
selected: currentMode === ClipMode.FullPage,
6365
onModeSelected: this.onModeSelected.bind(this),
64-
tooltipText: Localization.getLocalizedString("WebClipper.ClipType.ScreenShot.Button.Tooltip")
66+
tooltipText: Localization.getLocalizedString("WebClipper.ClipType.ScreenShot.Button.Tooltip"),
67+
tabIndex: tabIndex
6568
};
6669
}
6770

68-
private getRegionButtonProps(currentMode: ClipMode): PropsForModeElementNoAriaGrouping {
71+
private getRegionButtonProps(currentMode: ClipMode, tabIndex: number): PropsForModeElementNoAriaGrouping {
6972
let enableRegionClipping = this.props.clipperState.injectOptions && this.props.clipperState.injectOptions.enableRegionClipping;
7073
let contextImageModeUsed = this.props.clipperState.invokeOptions && this.props.clipperState.invokeOptions.invokeMode === InvokeMode.ContextImage;
7174

@@ -79,15 +82,16 @@ class ModeButtonSelectorClass extends ComponentBase<{}, ClipperStateProp> {
7982
myMode: ClipMode.Region,
8083
selected: currentMode === ClipMode.Region,
8184
onModeSelected: this.onModeSelected.bind(this),
82-
tooltipText: Localization.getLocalizedString("WebClipper.ClipType.MultipleRegions.Button.Tooltip")
85+
tooltipText: Localization.getLocalizedString("WebClipper.ClipType.MultipleRegions.Button.Tooltip"),
86+
tabIndex: tabIndex
8387
};
8488
}
8589

8690
private getRegionButtonLabel(): string {
8791
return "WebClipper.ClipType.Region.Button";
8892
}
8993

90-
private getSelectionButtonProps(currentMode: ClipMode): PropsForModeElementNoAriaGrouping {
94+
private getSelectionButtonProps(currentMode: ClipMode, tabIndex: number): PropsForModeElementNoAriaGrouping {
9195
if (this.props.clipperState.invokeOptions.invokeMode !== InvokeMode.ContextTextSelection) {
9296
return undefined;
9397
}
@@ -98,11 +102,12 @@ class ModeButtonSelectorClass extends ComponentBase<{}, ClipperStateProp> {
98102
myMode: ClipMode.Selection,
99103
selected: currentMode === ClipMode.Selection,
100104
onModeSelected: this.onModeSelected.bind(this),
101-
tooltipText: Localization.getLocalizedString("WebClipper.ClipType.Selection.Button.Tooltip")
105+
tooltipText: Localization.getLocalizedString("WebClipper.ClipType.Selection.Button.Tooltip"),
106+
tabIndex: tabIndex
102107
};
103108
}
104109

105-
private getBookmarkButtonProps(currentMode: ClipMode): PropsForModeElementNoAriaGrouping {
110+
private getBookmarkButtonProps(currentMode: ClipMode, tabIndex: number): PropsForModeElementNoAriaGrouping {
106111
if (this.props.clipperState.pageInfo.rawUrl.indexOf("file:///") === 0) {
107112
return undefined;
108113
}
@@ -113,20 +118,24 @@ class ModeButtonSelectorClass extends ComponentBase<{}, ClipperStateProp> {
113118
myMode: ClipMode.Bookmark,
114119
selected: currentMode === ClipMode.Bookmark,
115120
onModeSelected: this.onModeSelected.bind(this),
116-
tooltipText: Localization.getLocalizedString("WebClipper.ClipType.Bookmark.Button.Tooltip")
121+
tooltipText: Localization.getLocalizedString("WebClipper.ClipType.Bookmark.Button.Tooltip"),
122+
tabIndex: tabIndex
117123
};
118124
}
119125

120126
private getListOfButtons(): HTMLElement[] {
121127
let currentMode = this.props.clipperState.currentMode.get();
122128

129+
// Base tabIndex for mode buttons - they should come before PDF options (60+) and location dropdown (70)
130+
let baseTabIndex = 40;
131+
123132
let buttonProps = [
124-
this.getFullPageButtonProps(currentMode),
125-
this.getRegionButtonProps(currentMode),
126-
this.getAugmentationButtonProps(currentMode),
127-
this.getSelectionButtonProps(currentMode),
128-
this.getBookmarkButtonProps(currentMode),
129-
this.getPdfButtonProps(currentMode),
133+
this.getFullPageButtonProps(currentMode, baseTabIndex),
134+
this.getRegionButtonProps(currentMode, baseTabIndex + 1),
135+
this.getAugmentationButtonProps(currentMode, baseTabIndex + 2),
136+
this.getSelectionButtonProps(currentMode, baseTabIndex + 3),
137+
this.getBookmarkButtonProps(currentMode, baseTabIndex + 4),
138+
this.getPdfButtonProps(currentMode, baseTabIndex + 5),
130139
];
131140

132141
let visibleButtons = [];

0 commit comments

Comments
 (0)