Skip to content

Commit 9b5a1c2

Browse files
rtibblesbotclaude
andcommitted
Suppress vuejs-accessibility/no-autofocus: intentional accessibility focus management
Every autofocus use in Kolibri is deliberate: the first field in a modal or wizard step receives focus so keyboard and screen reader users land in the right place without having to navigate into the dialog. Add eslint-disable-next-line comments with "intentional: a11y autofocus" explanation at each autofocus site across 38 components. This is the approved pattern from the plan for intentional autofocus (as opposed to the follow-up-issue pattern used for violations requiring architectural redesign). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent ad37eea commit 9b5a1c2

38 files changed

Lines changed: 84 additions & 0 deletions

File tree

kolibri/plugins/coach/frontend/views/common/assignments/AssignmentDetailsModal.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
:layout8="{ span: assignmentIsQuiz ? 3 : 7 }"
3434
:layout12="{ span: assignmentIsQuiz ? 5 : 11 }"
3535
>
36+
<!-- eslint-disable vuejs-accessibility/no-autofocus -- intentional: a11y autofocus -->
3637
<KTextbox
3738
ref="titleField"
3839
v-model.trim="title"
@@ -47,6 +48,7 @@
4748
@input="showTitleError = false"
4849
@keydown.enter="submitData"
4950
/>
51+
<!-- eslint-enable vuejs-accessibility/no-autofocus -->
5052
</KGridItem>
5153
<template v-if="assignmentIsQuiz">
5254
<KGridItem

kolibri/plugins/coach/frontend/views/groups/GroupsRootPage/CreateGroupModal.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
@cancel="$emit('cancel')"
1010
@submit="callCreateGroup"
1111
>
12+
<!-- eslint-disable vuejs-accessibility/no-autofocus -- intentional: a11y autofocus -->
1213
<KTextbox
1314
ref="name"
1415
v-model.trim="name"
@@ -20,6 +21,7 @@
2021
:maxlength="50"
2122
@blur="nameBlurred = true"
2223
/>
24+
<!-- eslint-enable vuejs-accessibility/no-autofocus -->
2325
</KModal>
2426

2527
</template>

kolibri/plugins/coach/frontend/views/groups/GroupsRootPage/RenameGroupModal.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
@submit="callRenameGroup"
1010
@cancel="$emit('cancel')"
1111
>
12+
<!-- eslint-disable vuejs-accessibility/no-autofocus -- intentional: a11y autofocus -->
1213
<KTextbox
1314
ref="name"
1415
v-model.trim="name"
@@ -20,6 +21,7 @@
2021
:maxlength="50"
2122
@blur="nameBlurred = true"
2223
/>
24+
<!-- eslint-enable vuejs-accessibility/no-autofocus -->
2325
</KModal>
2426

2527
</template>

kolibri/plugins/device/frontend/views/AvailableChannelsPage/ChannelTokenModal.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
{{ $tr('networkErrorMessage') }}
2020
</UiAlert>
2121

22+
<!-- eslint-disable vuejs-accessibility/no-autofocus -- intentional: a11y autofocus -->
2223
<KTextbox
2324
v-model.trim="token"
2425
:label="$tr('channelTokenLabel')"
@@ -30,6 +31,7 @@
3031
autocapitalize="none"
3132
@blur="tokenIsBlurred = true"
3233
/>
34+
<!-- eslint-enable vuejs-accessibility/no-autofocus -->
3335
</KModal>
3436

3537
</template>

kolibri/plugins/device/frontend/views/DeviceNameModal.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
<p>
1111
{{ $tr('deviceNameExplanation') }}
1212
</p>
13+
<!-- eslint-disable vuejs-accessibility/no-autofocus -- intentional: a11y autofocus -->
1314
<KTextbox
1415
ref="name"
1516
v-model.trim="name"
@@ -21,6 +22,7 @@
2122
:maxlength="50"
2223
@blur="nameBlurred = true"
2324
/>
25+
<!-- eslint-enable vuejs-accessibility/no-autofocus -->
2426
</KModal>
2527

2628
</template>

kolibri/plugins/device/frontend/views/ManageContentPage/SelectTransferSourceModal/SelectImportSourceModal.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
@cancel="handleCancel"
88
>
99
<KRadioButtonGroup>
10+
<!-- eslint-disable vuejs-accessibility/no-autofocus -- intentional: a11y autofocus -->
1011
<KRadioButton
1112
v-model="source"
1213
:label="$tr('network')"
@@ -15,6 +16,7 @@
1516
:autofocus="!kolibriStudioIsOffline"
1617
:description="$tr('studioDescription')"
1718
/>
19+
<!-- eslint-enable vuejs-accessibility/no-autofocus -->
1820
<KRadioButton
1921
v-model="source"
2022
:label="$tr('localNetworkOrInternet')"

kolibri/plugins/device/frontend/views/lodUsers/importUser/ImportUserWithCredentialsPage.vue

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
>
2121
{{ coreString('invalidCredentialsError') }}
2222
</p>
23+
<!-- eslint-disable vuejs-accessibility/no-autofocus -- intentional: a11y autofocus -->
2324
<KTextbox
2425
ref="usernameTextbox"
2526
v-model.trim="username"
@@ -31,6 +32,7 @@
3132
:invalidText="invalidText"
3233
@blur="shouldValidate = true"
3334
/>
35+
<!-- eslint-enable vuejs-accessibility/no-autofocus -->
3436
<PasswordTextbox
3537
v-if="!facility.learner_can_login_with_no_password"
3638
ref="passwordTextbox"
@@ -74,6 +76,7 @@
7476
>
7577
{{ coreString('invalidCredentialsError') }}
7678
</p>
79+
<!-- eslint-disable vuejs-accessibility/no-autofocus -- intentional: a11y autofocus -->
7780
<KTextbox
7881
ref="adminUsernameTextbox"
7982
v-model.trim="adminUsername"
@@ -83,6 +86,7 @@
8386
:invalidText="invalidText"
8487
@blur="shouldValidate = true"
8588
/>
89+
<!-- eslint-enable vuejs-accessibility/no-autofocus -->
8690
<PasswordTextbox
8791
ref="adminPasswordTextbox"
8892
:value.sync="adminPassword"

kolibri/plugins/facility/frontend/views/FacilityConfigPage/EditFacilityNameModal.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
>
1010
<div>
1111
<p>{{ $tr('renameFacilityExplanation') }}</p>
12+
<!-- eslint-disable vuejs-accessibility/no-autofocus -- intentional: a11y autofocus -->
1213
<KTextbox
1314
ref="name"
1415
v-model="name"
@@ -21,6 +22,7 @@
2122
@blur="nameBlurred = true"
2223
@input="handleInput"
2324
/>
25+
<!-- eslint-enable vuejs-accessibility/no-autofocus -->
2426
</div>
2527
</KModal>
2628

kolibri/plugins/facility/frontend/views/ManageClassPage/ClassCreateModal.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
@submit="createNewClass"
1010
@cancel="$emit('cancel')"
1111
>
12+
<!-- eslint-disable vuejs-accessibility/no-autofocus -- intentional: a11y autofocus -->
1213
<KTextbox
1314
ref="name"
1415
v-model.trim="name"
@@ -21,6 +22,7 @@
2122
:maxlength="50"
2223
@blur="nameBlurred = true"
2324
/>
25+
<!-- eslint-enable vuejs-accessibility/no-autofocus -->
2426
</KModal>
2527

2628
</template>

kolibri/plugins/facility/frontend/views/UserEditPage.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
{{ $tr('editUserDetailsHeader') }}
1818
</h1>
1919

20+
<!-- eslint-disable vuejs-accessibility/no-autofocus -- intentional: a11y autofocus -->
2021
<FullNameTextbox
2122
ref="fullNameTextbox"
2223
:autofocus="true"
@@ -25,6 +26,7 @@
2526
:isValid.sync="fullNameValid"
2627
:shouldValidate="formSubmitted"
2728
/>
29+
<!-- eslint-enable vuejs-accessibility/no-autofocus -->
2830

2931
<UsernameTextbox
3032
ref="usernameTextbox"

0 commit comments

Comments
 (0)