#31 fix(web): ARIA semantics for MR panels, dialogs, palette, forms and status regions
A internal/adapters/web/accessibility_test.go +53 -0
M internal/adapters/web/fragments.templ +1 -0
M internal/adapters/web/fragments_templ.go +2 -2
M internal/adapters/web/issues_form.templ +47 -9
M internal/adapters/web/issues_form_templ.go +161 -84
M internal/adapters/web/issues_form_test.go +2 -2
M internal/adapters/web/jstest/a11y.test.mjs +79 -1
M internal/adapters/web/jstest/finder.test.mjs +9 -8
M internal/adapters/web/jstest/mr.test.mjs +33 -1
M internal/adapters/web/mr.templ +9 -9
M internal/adapters/web/mr_templ.go +7 -7
M internal/adapters/web/mr_test.go +8 -7
M internal/adapters/web/overlays.templ +5 -5
M internal/adapters/web/overlays_templ.go +35 -12
M internal/adapters/web/shell.templ +4 -4
M internal/adapters/web/shell_templ.go +1 -1
M internal/adapters/web/static/css/20-shell.css +2 -1
M internal/adapters/web/static/css/60-mr.css +5 -8
M internal/adapters/web/static/css/85-mobile.css +1 -1
M internal/adapters/web/static/js/ermite.js +15 -0
M internal/adapters/web/static/js/files.js +4 -3
M internal/adapters/web/static/js/mr.js +3 -3
M internal/adapters/web/tree.templ +1 -1
M internal/adapters/web/tree_templ.go +1 -1
M internal/app/testdata/web/blob-binary.html +19 -17
M internal/app/testdata/web/blob-code.html +19 -17
M internal/app/testdata/web/blob-empty.html +19 -17
M internal/app/testdata/web/blob-image.html +19 -17
M internal/app/testdata/web/blob-markdown.html +19 -17
M internal/app/testdata/web/blob-svg.html +19 -17
M internal/app/testdata/web/blob-text.html +19 -17
M internal/app/testdata/web/blob-too-large.html +19 -17
M internal/app/testdata/web/blob-trojan.html +19 -17
M internal/app/testdata/web/commit-big.html +19 -17
M internal/app/testdata/web/commit-binary.html +19 -17
M internal/app/testdata/web/commit-merge.html +19 -17
M internal/app/testdata/web/commit-modify-split.html +19 -17
M internal/app/testdata/web/commit-modify.html +19 -17
M internal/app/testdata/web/commit-rename.html +19 -17
M internal/app/testdata/web/commit-root.html +19 -17
M internal/app/testdata/web/commit-trojan.html +19 -17
M internal/app/testdata/web/commits-page2.html +18 -16
M internal/app/testdata/web/commits-path.html +18 -16
M internal/app/testdata/web/commits-root.html +19 -17
M internal/app/testdata/web/commits-small.html +21 -19
M internal/app/testdata/web/empty.html +9 -7
M internal/app/testdata/web/home.html +11 -9
M internal/app/testdata/web/not-found-page.html +8 -6
M internal/app/testdata/web/not-found.html +8 -6
M internal/app/testdata/web/refs.html +22 -20
M internal/app/testdata/web/summary.html +22 -20
| @@ -218,14 +218,16 @@ | |||
| 218 | 218 | <button type="button" class="foot-keys" data-js data-fire="help" aria-haspopup="dialog" aria-controls="panel-help" aria-keyshortcuts="?"> | |
| 219 | 219 | <kbd aria-hidden="true">?</kbd> keyboard shortcuts</button> | |
| 220 | 220 | </footer> | |
| 221 | - | <div class="hint" role="status" aria-live="polite"> | |
| 222 | - | <span class="hint-nav" :text="document.body.dataset.nav || ''"> | |
| 221 | + | <div class="hint"> | |
| 222 | + | <span aria-hidden="true" class="hint-nav" :text="document.body.dataset.nav || ''"> | |
| 223 | 223 | </span> | |
| 224 | + | <span role="status" aria-live="polite"> | |
| 224 | 225 | <span class="hint-sel" :text="document.body.dataset.sel ? document.body.dataset.sel + ' · y permalink' : ''"> | |
| 225 | 226 | </span> | |
| 226 | 227 | <span class="hint-flash" :text="document.body.dataset.flash || ''"> | |
| 227 | 228 | </span> | |
| 228 | - | <span class="hint-live" data-state="connecting" hx-sse:connect="/-/events?topic=repo%3Ademo&view=summary" hx-swap="none" :text="data.state === 'offline' ? 'live updates paused' : ''" hx-on="htmx:sse:after:connection -> ermiteLive.back(); | |
| 229 | + | </span> | |
| 230 | + | <span class="hint-live" role="status" data-state="connecting" hx-sse:connect="/-/events?topic=repo%3Ademo&view=summary" hx-swap="none" :text="data.state === 'offline' ? 'live updates paused' : ''" hx-on="htmx:sse:after:connection -> ermiteLive.back(); | |
| 229 | 231 | htmx:sse:close, htmx:sse:error -> ermiteLive.lost(); | |
| 230 | 232 | htmx:sse:error -> ermiteLive.error(event.detail.status); | |
| 231 | 233 | htmx:sse:before:connection -> ermiteLive.gate(event); | |
| @@ -237,7 +239,7 @@ | |||
| 237 | 239 | <dialog id="panel-help" class="panel modal" aria-label="Keyboard shortcuts" hx-on:keydown="event.key === 'Escape' && (event.preventDefault(), this.close())" hx-on:click="event.target === this && this.close()"> | |
| 238 | 240 | <div class="panel-head"> | |
| 239 | 241 | <h2>Keyboard shortcuts</h2> | |
| 240 | - | <button type="button" class="panel-x" aria-label="Close" hx-on:click="closest('dialog').close()"> | |
| 242 | + | <button type="button" class="panel-x" aria-label="Close (esc)" hx-on:click="closest('dialog').close()"> | |
| 241 | 243 | <kbd>esc</kbd> close</button> | |
| 242 | 244 | </div> | |
| 243 | 245 | <div class="keys-pref"> | |
| @@ -371,7 +373,7 @@ | |||
| 371 | 373 | <div class="panel-head"> | |
| 372 | 374 | <label for="refs-filter" class="sr">filter branches and tags</label> | |
| 373 | 375 | <input id="refs-filter" type="search" placeholder="Switch branch or tag…" autocomplete="off" data-pick="#panel-refs li" hx-on:input="ermite.filter(this)"> | |
| 374 | - | <button type="button" class="panel-x" aria-label="Close" hx-on:click="closest('dialog').close()"> | |
| 376 | + | <button type="button" class="panel-x" aria-label="Close (esc)" hx-on:click="closest('dialog').close()"> | |
| 375 | 377 | <kbd>esc</kbd> | |
| 376 | 378 | </button> | |
| 377 | 379 | </div> | |
| @@ -410,91 +412,91 @@ | |||
| 410 | 412 | <div class="panel-head"> | |
| 411 | 413 | <label for="cmd-q" class="sr">go to</label> | |
| 412 | 414 | <input id="cmd-q" type="search" placeholder="Go to a section, branch, tag, file or repository…" autocomplete="off" spellcheck="false" role="combobox" aria-autocomplete="list" aria-expanded="true" aria-controls="cmd-list" aria-activedescendant="cmd-o0" hx-on:input="ermite.cmdFilter(this); ermiteFinder.palette(this)" hx-on:keydown="ermite.cmdKey(event)"> | |
| 413 | - | <button type="button" class="panel-x" aria-label="Close" hx-on:click="closest('dialog').close()"> | |
| 415 | + | <button type="button" class="panel-x" aria-label="Close (esc)" hx-on:click="closest('dialog').close()"> | |
| 414 | 416 | <kbd>esc</kbd> | |
| 415 | 417 | </button> | |
| 416 | 418 | </div> | |
| 417 | 419 | <ul id="cmd-list" class="cmd-list" role="listbox" aria-label="Targets"> | |
| 418 | 420 | <li id="cmd-o0" role="option" aria-selected="true" data-k="go home" data-cursor> | |
| 419 | - | <a href="/" tabindex="-1"> | |
| 421 | + | <a role="presentation" data-href="/"> | |
| 420 | 422 | <span class="lbl">home</span> | |
| 421 | 423 | <span class="k">go</span> | |
| 422 | 424 | </a> | |
| 423 | 425 | </li> | |
| 424 | 426 | <li id="cmd-o1" role="option" aria-selected="false" data-k="section summary"> | |
| 425 | - | <a href="/demo" tabindex="-1"> | |
| 427 | + | <a role="presentation" data-href="/demo"> | |
| 426 | 428 | <span class="lbl">summary</span> | |
| 427 | 429 | <span class="k">section</span> | |
| 428 | 430 | </a> | |
| 429 | 431 | </li> | |
| 430 | 432 | <li id="cmd-o2" role="option" aria-selected="false" data-k="section files"> | |
| 431 | - | <a href="/demo/tree/main" tabindex="-1"> | |
| 433 | + | <a role="presentation" data-href="/demo/tree/main"> | |
| 432 | 434 | <span class="lbl">files</span> | |
| 433 | 435 | <span class="k">section</span> | |
| 434 | 436 | </a> | |
| 435 | 437 | </li> | |
| 436 | 438 | <li id="cmd-o3" role="option" aria-selected="false" data-k="section commits"> | |
| 437 | - | <a href="/demo/commits/main" tabindex="-1"> | |
| 439 | + | <a role="presentation" data-href="/demo/commits/main"> | |
| 438 | 440 | <span class="lbl">commits</span> | |
| 439 | 441 | <span class="k">section</span> | |
| 440 | 442 | </a> | |
| 441 | 443 | </li> | |
| 442 | 444 | <li id="cmd-o4" role="option" aria-selected="false" data-k="section branches & tags"> | |
| 443 | - | <a href="/demo/refs" tabindex="-1"> | |
| 445 | + | <a role="presentation" data-href="/demo/refs"> | |
| 444 | 446 | <span class="lbl">branches & tags</span> | |
| 445 | 447 | <span class="k">section</span> | |
| 446 | 448 | </a> | |
| 447 | 449 | </li> | |
| 448 | 450 | <li id="cmd-o5" role="option" aria-selected="false" data-k="section merge requests"> | |
| 449 | - | <a href="/demo/merge-requests" tabindex="-1"> | |
| 451 | + | <a role="presentation" data-href="/demo/merge-requests"> | |
| 450 | 452 | <span class="lbl">merge requests</span> | |
| 451 | 453 | <span class="k">section</span> | |
| 452 | 454 | </a> | |
| 453 | 455 | </li> | |
| 454 | 456 | <li id="cmd-o6" role="option" aria-selected="false" data-k="section releases"> | |
| 455 | - | <a href="/demo/releases" tabindex="-1"> | |
| 457 | + | <a role="presentation" data-href="/demo/releases"> | |
| 456 | 458 | <span class="lbl">releases</span> | |
| 457 | 459 | <span class="k">section</span> | |
| 458 | 460 | </a> | |
| 459 | 461 | </li> | |
| 460 | 462 | <li id="cmd-o7" role="option" aria-selected="false" data-k="section actions"> | |
| 461 | - | <a href="/demo/actions" tabindex="-1"> | |
| 463 | + | <a role="presentation" data-href="/demo/actions"> | |
| 462 | 464 | <span class="lbl">actions</span> | |
| 463 | 465 | <span class="k">section</span> | |
| 464 | 466 | </a> | |
| 465 | 467 | </li> | |
| 466 | 468 | <li id="cmd-o8" role="option" aria-selected="false" data-k="branch feature/x"> | |
| 467 | - | <a href="/demo/tree/feature/x" tabindex="-1"> | |
| 469 | + | <a role="presentation" data-href="/demo/tree/feature/x"> | |
| 468 | 470 | <span class="lbl">feature/x</span> | |
| 469 | 471 | <span class="k">branch</span> | |
| 470 | 472 | </a> | |
| 471 | 473 | </li> | |
| 472 | 474 | <li id="cmd-o9" role="option" aria-selected="false" data-k="branch main"> | |
| 473 | - | <a href="/demo/tree/main" tabindex="-1"> | |
| 475 | + | <a role="presentation" data-href="/demo/tree/main"> | |
| 474 | 476 | <span class="lbl">main</span> | |
| 475 | 477 | <span class="k">branch</span> | |
| 476 | 478 | </a> | |
| 477 | 479 | </li> | |
| 478 | 480 | <li id="cmd-o10" role="option" aria-selected="false" data-k="tag v0.1.0"> | |
| 479 | - | <a href="/demo/tree/v0.1.0" tabindex="-1"> | |
| 481 | + | <a role="presentation" data-href="/demo/tree/v0.1.0"> | |
| 480 | 482 | <span class="lbl">v0.1.0</span> | |
| 481 | 483 | <span class="k">tag</span> | |
| 482 | 484 | </a> | |
| 483 | 485 | </li> | |
| 484 | 486 | <li id="cmd-o11" role="option" aria-selected="false" data-k="tag v0.2.0"> | |
| 485 | - | <a href="/demo/tree/v0.2.0" tabindex="-1"> | |
| 487 | + | <a role="presentation" data-href="/demo/tree/v0.2.0"> | |
| 486 | 488 | <span class="lbl">v0.2.0</span> | |
| 487 | 489 | <span class="k">tag</span> | |
| 488 | 490 | </a> | |
| 489 | 491 | </li> | |
| 490 | 492 | <li id="cmd-o12" role="option" aria-selected="false" data-k="repo quiet"> | |
| 491 | - | <a href="/quiet" tabindex="-1"> | |
| 493 | + | <a role="presentation" data-href="/quiet"> | |
| 492 | 494 | <span class="lbl">quiet</span> | |
| 493 | 495 | <span class="k">repo</span> | |
| 494 | 496 | </a> | |
| 495 | 497 | </li> | |
| 496 | 498 | <li id="cmd-o13" role="option" aria-selected="false" data-k="action turn single-key shortcuts on off keyboard"> | |
| 497 | - | <a href="#" data-fire="keys" tabindex="-1"> | |
| 499 | + | <a role="presentation" data-fire="keys"> | |
| 498 | 500 | <span class="lbl">turn single-key shortcuts off</span> | |
| 499 | 501 | <span class="k">action</span> | |
| 500 | 502 | </a> | |
| @@ -218,14 +218,16 @@ | |||||
| 218 | <button type="button" class="foot-keys" data-js data-fire="help" aria-haspopup="dialog" aria-controls="panel-help" aria-keyshortcuts="?"> | 218 | <button type="button" class="foot-keys" data-js data-fire="help" aria-haspopup="dialog" aria-controls="panel-help" aria-keyshortcuts="?"> | ||
| 219 | <kbd aria-hidden="true">?</kbd> keyboard shortcuts</button> | 219 | <kbd aria-hidden="true">?</kbd> keyboard shortcuts</button> | ||
| 220 | </footer> | 220 | </footer> | ||
| 221 | - | <div class="hint" role="status" aria-live="polite"> | 221 | + | <div class="hint"> |
| 222 | - | <span class="hint-nav" :text="document.body.dataset.nav || ''"> | 222 | + | <span aria-hidden="true" class="hint-nav" :text="document.body.dataset.nav || ''"> |
| 223 | </span> | 223 | </span> | ||
| 224 | + | <span role="status" aria-live="polite"> | |||
| 224 | <span class="hint-sel" :text="document.body.dataset.sel ? document.body.dataset.sel + ' · y permalink' : ''"> | 225 | <span class="hint-sel" :text="document.body.dataset.sel ? document.body.dataset.sel + ' · y permalink' : ''"> | ||
| 225 | </span> | 226 | </span> | ||
| 226 | <span class="hint-flash" :text="document.body.dataset.flash || ''"> | 227 | <span class="hint-flash" :text="document.body.dataset.flash || ''"> | ||
| 227 | </span> | 228 | </span> | ||
| 228 | - | <span class="hint-live" data-state="connecting" hx-sse:connect="/-/events?topic=repo%3Ademo&view=summary" hx-swap="none" :text="data.state === 'offline' ? 'live updates paused' : ''" hx-on="htmx:sse:after:connection -> ermiteLive.back(); | 229 | + | </span> |
| 230 | + | <span class="hint-live" role="status" data-state="connecting" hx-sse:connect="/-/events?topic=repo%3Ademo&view=summary" hx-swap="none" :text="data.state === 'offline' ? 'live updates paused' : ''" hx-on="htmx:sse:after:connection -> ermiteLive.back(); | |||
| 229 | htmx:sse:close, htmx:sse:error -> ermiteLive.lost(); | 231 | htmx:sse:close, htmx:sse:error -> ermiteLive.lost(); | ||
| 230 | htmx:sse:error -> ermiteLive.error(event.detail.status); | 232 | htmx:sse:error -> ermiteLive.error(event.detail.status); | ||
| 231 | htmx:sse:before:connection -> ermiteLive.gate(event); | 233 | htmx:sse:before:connection -> ermiteLive.gate(event); | ||
| @@ -237,7 +239,7 @@ | |||||
| 237 | <dialog id="panel-help" class="panel modal" aria-label="Keyboard shortcuts" hx-on:keydown="event.key === 'Escape' && (event.preventDefault(), this.close())" hx-on:click="event.target === this && this.close()"> | 239 | <dialog id="panel-help" class="panel modal" aria-label="Keyboard shortcuts" hx-on:keydown="event.key === 'Escape' && (event.preventDefault(), this.close())" hx-on:click="event.target === this && this.close()"> | ||
| 238 | <div class="panel-head"> | 240 | <div class="panel-head"> | ||
| 239 | <h2>Keyboard shortcuts</h2> | 241 | <h2>Keyboard shortcuts</h2> | ||
| 240 | - | <button type="button" class="panel-x" aria-label="Close" hx-on:click="closest('dialog').close()"> | 242 | + | <button type="button" class="panel-x" aria-label="Close (esc)" hx-on:click="closest('dialog').close()"> |
| 241 | <kbd>esc</kbd> close</button> | 243 | <kbd>esc</kbd> close</button> | ||
| 242 | </div> | 244 | </div> | ||
| 243 | <div class="keys-pref"> | 245 | <div class="keys-pref"> | ||
| @@ -371,7 +373,7 @@ | |||||
| 371 | <div class="panel-head"> | 373 | <div class="panel-head"> | ||
| 372 | <label for="refs-filter" class="sr">filter branches and tags</label> | 374 | <label for="refs-filter" class="sr">filter branches and tags</label> | ||
| 373 | <input id="refs-filter" type="search" placeholder="Switch branch or tag…" autocomplete="off" data-pick="#panel-refs li" hx-on:input="ermite.filter(this)"> | 375 | <input id="refs-filter" type="search" placeholder="Switch branch or tag…" autocomplete="off" data-pick="#panel-refs li" hx-on:input="ermite.filter(this)"> | ||
| 374 | - | <button type="button" class="panel-x" aria-label="Close" hx-on:click="closest('dialog').close()"> | 376 | + | <button type="button" class="panel-x" aria-label="Close (esc)" hx-on:click="closest('dialog').close()"> |
| 375 | <kbd>esc</kbd> | 377 | <kbd>esc</kbd> | ||
| 376 | </button> | 378 | </button> | ||
| 377 | </div> | 379 | </div> | ||
| @@ -410,91 +412,91 @@ | |||||
| 410 | <div class="panel-head"> | 412 | <div class="panel-head"> | ||
| 411 | <label for="cmd-q" class="sr">go to</label> | 413 | <label for="cmd-q" class="sr">go to</label> | ||
| 412 | <input id="cmd-q" type="search" placeholder="Go to a section, branch, tag, file or repository…" autocomplete="off" spellcheck="false" role="combobox" aria-autocomplete="list" aria-expanded="true" aria-controls="cmd-list" aria-activedescendant="cmd-o0" hx-on:input="ermite.cmdFilter(this); ermiteFinder.palette(this)" hx-on:keydown="ermite.cmdKey(event)"> | 414 | <input id="cmd-q" type="search" placeholder="Go to a section, branch, tag, file or repository…" autocomplete="off" spellcheck="false" role="combobox" aria-autocomplete="list" aria-expanded="true" aria-controls="cmd-list" aria-activedescendant="cmd-o0" hx-on:input="ermite.cmdFilter(this); ermiteFinder.palette(this)" hx-on:keydown="ermite.cmdKey(event)"> | ||
| 413 | - | <button type="button" class="panel-x" aria-label="Close" hx-on:click="closest('dialog').close()"> | 415 | + | <button type="button" class="panel-x" aria-label="Close (esc)" hx-on:click="closest('dialog').close()"> |
| 414 | <kbd>esc</kbd> | 416 | <kbd>esc</kbd> | ||
| 415 | </button> | 417 | </button> | ||
| 416 | </div> | 418 | </div> | ||
| 417 | <ul id="cmd-list" class="cmd-list" role="listbox" aria-label="Targets"> | 419 | <ul id="cmd-list" class="cmd-list" role="listbox" aria-label="Targets"> | ||
| 418 | <li id="cmd-o0" role="option" aria-selected="true" data-k="go home" data-cursor> | 420 | <li id="cmd-o0" role="option" aria-selected="true" data-k="go home" data-cursor> | ||
| 419 | - | <a href="/" tabindex="-1"> | 421 | + | <a role="presentation" data-href="/"> |
| 420 | <span class="lbl">home</span> | 422 | <span class="lbl">home</span> | ||
| 421 | <span class="k">go</span> | 423 | <span class="k">go</span> | ||
| 422 | </a> | 424 | </a> | ||
| 423 | </li> | 425 | </li> | ||
| 424 | <li id="cmd-o1" role="option" aria-selected="false" data-k="section summary"> | 426 | <li id="cmd-o1" role="option" aria-selected="false" data-k="section summary"> | ||
| 425 | - | <a href="/demo" tabindex="-1"> | 427 | + | <a role="presentation" data-href="/demo"> |
| 426 | <span class="lbl">summary</span> | 428 | <span class="lbl">summary</span> | ||
| 427 | <span class="k">section</span> | 429 | <span class="k">section</span> | ||
| 428 | </a> | 430 | </a> | ||
| 429 | </li> | 431 | </li> | ||
| 430 | <li id="cmd-o2" role="option" aria-selected="false" data-k="section files"> | 432 | <li id="cmd-o2" role="option" aria-selected="false" data-k="section files"> | ||
| 431 | - | <a href="/demo/tree/main" tabindex="-1"> | 433 | + | <a role="presentation" data-href="/demo/tree/main"> |
| 432 | <span class="lbl">files</span> | 434 | <span class="lbl">files</span> | ||
| 433 | <span class="k">section</span> | 435 | <span class="k">section</span> | ||
| 434 | </a> | 436 | </a> | ||
| 435 | </li> | 437 | </li> | ||
| 436 | <li id="cmd-o3" role="option" aria-selected="false" data-k="section commits"> | 438 | <li id="cmd-o3" role="option" aria-selected="false" data-k="section commits"> | ||
| 437 | - | <a href="/demo/commits/main" tabindex="-1"> | 439 | + | <a role="presentation" data-href="/demo/commits/main"> |
| 438 | <span class="lbl">commits</span> | 440 | <span class="lbl">commits</span> | ||
| 439 | <span class="k">section</span> | 441 | <span class="k">section</span> | ||
| 440 | </a> | 442 | </a> | ||
| 441 | </li> | 443 | </li> | ||
| 442 | <li id="cmd-o4" role="option" aria-selected="false" data-k="section branches & tags"> | 444 | <li id="cmd-o4" role="option" aria-selected="false" data-k="section branches & tags"> | ||
| 443 | - | <a href="/demo/refs" tabindex="-1"> | 445 | + | <a role="presentation" data-href="/demo/refs"> |
| 444 | <span class="lbl">branches & tags</span> | 446 | <span class="lbl">branches & tags</span> | ||
| 445 | <span class="k">section</span> | 447 | <span class="k">section</span> | ||
| 446 | </a> | 448 | </a> | ||
| 447 | </li> | 449 | </li> | ||
| 448 | <li id="cmd-o5" role="option" aria-selected="false" data-k="section merge requests"> | 450 | <li id="cmd-o5" role="option" aria-selected="false" data-k="section merge requests"> | ||
| 449 | - | <a href="/demo/merge-requests" tabindex="-1"> | 451 | + | <a role="presentation" data-href="/demo/merge-requests"> |
| 450 | <span class="lbl">merge requests</span> | 452 | <span class="lbl">merge requests</span> | ||
| 451 | <span class="k">section</span> | 453 | <span class="k">section</span> | ||
| 452 | </a> | 454 | </a> | ||
| 453 | </li> | 455 | </li> | ||
| 454 | <li id="cmd-o6" role="option" aria-selected="false" data-k="section releases"> | 456 | <li id="cmd-o6" role="option" aria-selected="false" data-k="section releases"> | ||
| 455 | - | <a href="/demo/releases" tabindex="-1"> | 457 | + | <a role="presentation" data-href="/demo/releases"> |
| 456 | <span class="lbl">releases</span> | 458 | <span class="lbl">releases</span> | ||
| 457 | <span class="k">section</span> | 459 | <span class="k">section</span> | ||
| 458 | </a> | 460 | </a> | ||
| 459 | </li> | 461 | </li> | ||
| 460 | <li id="cmd-o7" role="option" aria-selected="false" data-k="section actions"> | 462 | <li id="cmd-o7" role="option" aria-selected="false" data-k="section actions"> | ||
| 461 | - | <a href="/demo/actions" tabindex="-1"> | 463 | + | <a role="presentation" data-href="/demo/actions"> |
| 462 | <span class="lbl">actions</span> | 464 | <span class="lbl">actions</span> | ||
| 463 | <span class="k">section</span> | 465 | <span class="k">section</span> | ||
| 464 | </a> | 466 | </a> | ||
| 465 | </li> | 467 | </li> | ||
| 466 | <li id="cmd-o8" role="option" aria-selected="false" data-k="branch feature/x"> | 468 | <li id="cmd-o8" role="option" aria-selected="false" data-k="branch feature/x"> | ||
| 467 | - | <a href="/demo/tree/feature/x" tabindex="-1"> | 469 | + | <a role="presentation" data-href="/demo/tree/feature/x"> |
| 468 | <span class="lbl">feature/x</span> | 470 | <span class="lbl">feature/x</span> | ||
| 469 | <span class="k">branch</span> | 471 | <span class="k">branch</span> | ||
| 470 | </a> | 472 | </a> | ||
| 471 | </li> | 473 | </li> | ||
| 472 | <li id="cmd-o9" role="option" aria-selected="false" data-k="branch main"> | 474 | <li id="cmd-o9" role="option" aria-selected="false" data-k="branch main"> | ||
| 473 | - | <a href="/demo/tree/main" tabindex="-1"> | 475 | + | <a role="presentation" data-href="/demo/tree/main"> |
| 474 | <span class="lbl">main</span> | 476 | <span class="lbl">main</span> | ||
| 475 | <span class="k">branch</span> | 477 | <span class="k">branch</span> | ||
| 476 | </a> | 478 | </a> | ||
| 477 | </li> | 479 | </li> | ||
| 478 | <li id="cmd-o10" role="option" aria-selected="false" data-k="tag v0.1.0"> | 480 | <li id="cmd-o10" role="option" aria-selected="false" data-k="tag v0.1.0"> | ||
| 479 | - | <a href="/demo/tree/v0.1.0" tabindex="-1"> | 481 | + | <a role="presentation" data-href="/demo/tree/v0.1.0"> |
| 480 | <span class="lbl">v0.1.0</span> | 482 | <span class="lbl">v0.1.0</span> | ||
| 481 | <span class="k">tag</span> | 483 | <span class="k">tag</span> | ||
| 482 | </a> | 484 | </a> | ||
| 483 | </li> | 485 | </li> | ||
| 484 | <li id="cmd-o11" role="option" aria-selected="false" data-k="tag v0.2.0"> | 486 | <li id="cmd-o11" role="option" aria-selected="false" data-k="tag v0.2.0"> | ||
| 485 | - | <a href="/demo/tree/v0.2.0" tabindex="-1"> | 487 | + | <a role="presentation" data-href="/demo/tree/v0.2.0"> |
| 486 | <span class="lbl">v0.2.0</span> | 488 | <span class="lbl">v0.2.0</span> | ||
| 487 | <span class="k">tag</span> | 489 | <span class="k">tag</span> | ||
| 488 | </a> | 490 | </a> | ||
| 489 | </li> | 491 | </li> | ||
| 490 | <li id="cmd-o12" role="option" aria-selected="false" data-k="repo quiet"> | 492 | <li id="cmd-o12" role="option" aria-selected="false" data-k="repo quiet"> | ||
| 491 | - | <a href="/quiet" tabindex="-1"> | 493 | + | <a role="presentation" data-href="/quiet"> |
| 492 | <span class="lbl">quiet</span> | 494 | <span class="lbl">quiet</span> | ||
| 493 | <span class="k">repo</span> | 495 | <span class="k">repo</span> | ||
| 494 | </a> | 496 | </a> | ||
| 495 | </li> | 497 | </li> | ||
| 496 | <li id="cmd-o13" role="option" aria-selected="false" data-k="action turn single-key shortcuts on off keyboard"> | 498 | <li id="cmd-o13" role="option" aria-selected="false" data-k="action turn single-key shortcuts on off keyboard"> | ||
| 497 | - | <a href="#" data-fire="keys" tabindex="-1"> | 499 | + | <a role="presentation" data-fire="keys"> |
| 498 | <span class="lbl">turn single-key shortcuts off</span> | 500 | <span class="lbl">turn single-key shortcuts off</span> | ||
| 499 | <span class="k">action</span> | 501 | <span class="k">action</span> | ||
| 500 | </a> | 502 | </a> | ||
M internal/app/testdata/web/tree-nested.html +21 -19
| @@ -117,9 +117,9 @@ | |||
| 117 | 117 | <kbd>j</kbd> | |
| 118 | 118 | <kbd>k</kbd> move · <kbd>l</kbd> open · <kbd>h</kbd> back</p> | |
| 119 | 119 | </div> | |
| 120 | - | <div id="finder" class="tree-card" hidden> | |
| 121 | - | <p id="finder-status" class="dim" aria-live="polite"> | |
| 120 | + | <p id="finder-status" class="dim" role="status"> | |
| 122 | 121 | </p> | |
| 122 | + | <div id="finder" class="tree-card" hidden> | |
| 123 | 123 | <ul id="finder-list" class="cmd-list" role="listbox" aria-label="Files"> | |
| 124 | 124 | </ul> | |
| 125 | 125 | </div> | |
| @@ -156,18 +156,20 @@ | |||
| 156 | 156 | <button type="button" class="foot-keys" data-js data-fire="help" aria-haspopup="dialog" aria-controls="panel-help" aria-keyshortcuts="?"> | |
| 157 | 157 | <kbd aria-hidden="true">?</kbd> keyboard shortcuts</button> | |
| 158 | 158 | </footer> | |
| 159 | - | <div class="hint" role="status" aria-live="polite"> | |
| 160 | - | <span class="hint-nav" :text="document.body.dataset.nav || ''"> | |
| 159 | + | <div class="hint"> | |
| 160 | + | <span aria-hidden="true" class="hint-nav" :text="document.body.dataset.nav || ''"> | |
| 161 | 161 | </span> | |
| 162 | + | <span role="status" aria-live="polite"> | |
| 162 | 163 | <span class="hint-sel" :text="document.body.dataset.sel ? document.body.dataset.sel + ' · y permalink' : ''"> | |
| 163 | 164 | </span> | |
| 164 | 165 | <span class="hint-flash" :text="document.body.dataset.flash || ''"> | |
| 165 | 166 | </span> | |
| 167 | + | </span> | |
| 166 | 168 | </div> | |
| 167 | 169 | <dialog id="panel-help" class="panel modal" aria-label="Keyboard shortcuts" hx-on:keydown="event.key === 'Escape' && (event.preventDefault(), this.close())" hx-on:click="event.target === this && this.close()"> | |
| 168 | 170 | <div class="panel-head"> | |
| 169 | 171 | <h2>Keyboard shortcuts</h2> | |
| 170 | - | <button type="button" class="panel-x" aria-label="Close" hx-on:click="closest('dialog').close()"> | |
| 172 | + | <button type="button" class="panel-x" aria-label="Close (esc)" hx-on:click="closest('dialog').close()"> | |
| 171 | 173 | <kbd>esc</kbd> close</button> | |
| 172 | 174 | </div> | |
| 173 | 175 | <div class="keys-pref"> | |
| @@ -301,7 +303,7 @@ | |||
| 301 | 303 | <div class="panel-head"> | |
| 302 | 304 | <label for="refs-filter" class="sr">filter branches and tags</label> | |
| 303 | 305 | <input id="refs-filter" type="search" placeholder="Switch branch or tag…" autocomplete="off" data-pick="#panel-refs li" hx-on:input="ermite.filter(this)"> | |
| 304 | - | <button type="button" class="panel-x" aria-label="Close" hx-on:click="closest('dialog').close()"> | |
| 306 | + | <button type="button" class="panel-x" aria-label="Close (esc)" hx-on:click="closest('dialog').close()"> | |
| 305 | 307 | <kbd>esc</kbd> | |
| 306 | 308 | </button> | |
| 307 | 309 | </div> | |
| @@ -336,79 +338,79 @@ | |||
| 336 | 338 | <div class="panel-head"> | |
| 337 | 339 | <label for="cmd-q" class="sr">go to</label> | |
| 338 | 340 | <input id="cmd-q" type="search" placeholder="Go to a section, branch, tag, file or repository…" autocomplete="off" spellcheck="false" role="combobox" aria-autocomplete="list" aria-expanded="true" aria-controls="cmd-list" aria-activedescendant="cmd-o0" hx-on:input="ermite.cmdFilter(this); ermiteFinder.palette(this)" hx-on:keydown="ermite.cmdKey(event)"> | |
| 339 | - | <button type="button" class="panel-x" aria-label="Close" hx-on:click="closest('dialog').close()"> | |
| 341 | + | <button type="button" class="panel-x" aria-label="Close (esc)" hx-on:click="closest('dialog').close()"> | |
| 340 | 342 | <kbd>esc</kbd> | |
| 341 | 343 | </button> | |
| 342 | 344 | </div> | |
| 343 | 345 | <ul id="cmd-list" class="cmd-list" role="listbox" aria-label="Targets"> | |
| 344 | 346 | <li id="cmd-o0" role="option" aria-selected="true" data-k="go home" data-cursor> | |
| 345 | - | <a href="/" tabindex="-1"> | |
| 347 | + | <a role="presentation" data-href="/"> | |
| 346 | 348 | <span class="lbl">home</span> | |
| 347 | 349 | <span class="k">go</span> | |
| 348 | 350 | </a> | |
| 349 | 351 | </li> | |
| 350 | 352 | <li id="cmd-o1" role="option" aria-selected="false" data-k="section summary"> | |
| 351 | - | <a href="/files" tabindex="-1"> | |
| 353 | + | <a role="presentation" data-href="/files"> | |
| 352 | 354 | <span class="lbl">summary</span> | |
| 353 | 355 | <span class="k">section</span> | |
| 354 | 356 | </a> | |
| 355 | 357 | </li> | |
| 356 | 358 | <li id="cmd-o2" role="option" aria-selected="false" data-k="section files"> | |
| 357 | - | <a href="/files/tree/main" tabindex="-1"> | |
| 359 | + | <a role="presentation" data-href="/files/tree/main"> | |
| 358 | 360 | <span class="lbl">files</span> | |
| 359 | 361 | <span class="k">section</span> | |
| 360 | 362 | </a> | |
| 361 | 363 | </li> | |
| 362 | 364 | <li id="cmd-o3" role="option" aria-selected="false" data-k="section commits"> | |
| 363 | - | <a href="/files/commits/main" tabindex="-1"> | |
| 365 | + | <a role="presentation" data-href="/files/commits/main"> | |
| 364 | 366 | <span class="lbl">commits</span> | |
| 365 | 367 | <span class="k">section</span> | |
| 366 | 368 | </a> | |
| 367 | 369 | </li> | |
| 368 | 370 | <li id="cmd-o4" role="option" aria-selected="false" data-k="section branches & tags"> | |
| 369 | - | <a href="/files/refs" tabindex="-1"> | |
| 371 | + | <a role="presentation" data-href="/files/refs"> | |
| 370 | 372 | <span class="lbl">branches & tags</span> | |
| 371 | 373 | <span class="k">section</span> | |
| 372 | 374 | </a> | |
| 373 | 375 | </li> | |
| 374 | 376 | <li id="cmd-o5" role="option" aria-selected="false" data-k="section merge requests"> | |
| 375 | - | <a href="/files/merge-requests" tabindex="-1"> | |
| 377 | + | <a role="presentation" data-href="/files/merge-requests"> | |
| 376 | 378 | <span class="lbl">merge requests</span> | |
| 377 | 379 | <span class="k">section</span> | |
| 378 | 380 | </a> | |
| 379 | 381 | </li> | |
| 380 | 382 | <li id="cmd-o6" role="option" aria-selected="false" data-k="section releases"> | |
| 381 | - | <a href="/files/releases" tabindex="-1"> | |
| 383 | + | <a role="presentation" data-href="/files/releases"> | |
| 382 | 384 | <span class="lbl">releases</span> | |
| 383 | 385 | <span class="k">section</span> | |
| 384 | 386 | </a> | |
| 385 | 387 | </li> | |
| 386 | 388 | <li id="cmd-o7" role="option" aria-selected="false" data-k="section actions"> | |
| 387 | - | <a href="/files/actions" tabindex="-1"> | |
| 389 | + | <a role="presentation" data-href="/files/actions"> | |
| 388 | 390 | <span class="lbl">actions</span> | |
| 389 | 391 | <span class="k">section</span> | |
| 390 | 392 | </a> | |
| 391 | 393 | </li> | |
| 392 | 394 | <li id="cmd-o8" role="option" aria-selected="false" data-k="branch feature/x"> | |
| 393 | - | <a href="/files/tree/feature/x" tabindex="-1"> | |
| 395 | + | <a role="presentation" data-href="/files/tree/feature/x"> | |
| 394 | 396 | <span class="lbl">feature/x</span> | |
| 395 | 397 | <span class="k">branch</span> | |
| 396 | 398 | </a> | |
| 397 | 399 | </li> | |
| 398 | 400 | <li id="cmd-o9" role="option" aria-selected="false" data-k="branch main"> | |
| 399 | - | <a href="/files/tree/main" tabindex="-1"> | |
| 401 | + | <a role="presentation" data-href="/files/tree/main"> | |
| 400 | 402 | <span class="lbl">main</span> | |
| 401 | 403 | <span class="k">branch</span> | |
| 402 | 404 | </a> | |
| 403 | 405 | </li> | |
| 404 | 406 | <li id="cmd-o10" role="option" aria-selected="false" data-k="tag v1.0"> | |
| 405 | - | <a href="/files/tree/v1.0" tabindex="-1"> | |
| 407 | + | <a role="presentation" data-href="/files/tree/v1.0"> | |
| 406 | 408 | <span class="lbl">v1.0</span> | |
| 407 | 409 | <span class="k">tag</span> | |
| 408 | 410 | </a> | |
| 409 | 411 | </li> | |
| 410 | 412 | <li id="cmd-o11" role="option" aria-selected="false" data-k="action turn single-key shortcuts on off keyboard"> | |
| 411 | - | <a href="#" data-fire="keys" tabindex="-1"> | |
| 413 | + | <a role="presentation" data-fire="keys"> | |
| 412 | 414 | <span class="lbl">turn single-key shortcuts off</span> | |
| 413 | 415 | <span class="k">action</span> | |
| 414 | 416 | </a> | |
| @@ -117,9 +117,9 @@ | |||||
| 117 | <kbd>j</kbd> | 117 | <kbd>j</kbd> | ||
| 118 | <kbd>k</kbd> move · <kbd>l</kbd> open · <kbd>h</kbd> back</p> | 118 | <kbd>k</kbd> move · <kbd>l</kbd> open · <kbd>h</kbd> back</p> | ||
| 119 | </div> | 119 | </div> | ||
| 120 | - | <div id="finder" class="tree-card" hidden> | 120 | + | <p id="finder-status" class="dim" role="status"> |
| 121 | - | <p id="finder-status" class="dim" aria-live="polite"> | |||
| 122 | </p> | 121 | </p> | ||
| 122 | + | <div id="finder" class="tree-card" hidden> | |||
| 123 | <ul id="finder-list" class="cmd-list" role="listbox" aria-label="Files"> | 123 | <ul id="finder-list" class="cmd-list" role="listbox" aria-label="Files"> | ||
| 124 | </ul> | 124 | </ul> | ||
| 125 | </div> | 125 | </div> | ||
| @@ -156,18 +156,20 @@ | |||||
| 156 | <button type="button" class="foot-keys" data-js data-fire="help" aria-haspopup="dialog" aria-controls="panel-help" aria-keyshortcuts="?"> | 156 | <button type="button" class="foot-keys" data-js data-fire="help" aria-haspopup="dialog" aria-controls="panel-help" aria-keyshortcuts="?"> | ||
| 157 | <kbd aria-hidden="true">?</kbd> keyboard shortcuts</button> | 157 | <kbd aria-hidden="true">?</kbd> keyboard shortcuts</button> | ||
| 158 | </footer> | 158 | </footer> | ||
| 159 | - | <div class="hint" role="status" aria-live="polite"> | 159 | + | <div class="hint"> |
| 160 | - | <span class="hint-nav" :text="document.body.dataset.nav || ''"> | 160 | + | <span aria-hidden="true" class="hint-nav" :text="document.body.dataset.nav || ''"> |
| 161 | </span> | 161 | </span> | ||
| 162 | + | <span role="status" aria-live="polite"> | |||
| 162 | <span class="hint-sel" :text="document.body.dataset.sel ? document.body.dataset.sel + ' · y permalink' : ''"> | 163 | <span class="hint-sel" :text="document.body.dataset.sel ? document.body.dataset.sel + ' · y permalink' : ''"> | ||
| 163 | </span> | 164 | </span> | ||
| 164 | <span class="hint-flash" :text="document.body.dataset.flash || ''"> | 165 | <span class="hint-flash" :text="document.body.dataset.flash || ''"> | ||
| 165 | </span> | 166 | </span> | ||
| 167 | + | </span> | |||
| 166 | </div> | 168 | </div> | ||
| 167 | <dialog id="panel-help" class="panel modal" aria-label="Keyboard shortcuts" hx-on:keydown="event.key === 'Escape' && (event.preventDefault(), this.close())" hx-on:click="event.target === this && this.close()"> | 169 | <dialog id="panel-help" class="panel modal" aria-label="Keyboard shortcuts" hx-on:keydown="event.key === 'Escape' && (event.preventDefault(), this.close())" hx-on:click="event.target === this && this.close()"> | ||
| 168 | <div class="panel-head"> | 170 | <div class="panel-head"> | ||
| 169 | <h2>Keyboard shortcuts</h2> | 171 | <h2>Keyboard shortcuts</h2> | ||
| 170 | - | <button type="button" class="panel-x" aria-label="Close" hx-on:click="closest('dialog').close()"> | 172 | + | <button type="button" class="panel-x" aria-label="Close (esc)" hx-on:click="closest('dialog').close()"> |
| 171 | <kbd>esc</kbd> close</button> | 173 | <kbd>esc</kbd> close</button> | ||
| 172 | </div> | 174 | </div> | ||
| 173 | <div class="keys-pref"> | 175 | <div class="keys-pref"> | ||
| @@ -301,7 +303,7 @@ | |||||
| 301 | <div class="panel-head"> | 303 | <div class="panel-head"> | ||
| 302 | <label for="refs-filter" class="sr">filter branches and tags</label> | 304 | <label for="refs-filter" class="sr">filter branches and tags</label> | ||
| 303 | <input id="refs-filter" type="search" placeholder="Switch branch or tag…" autocomplete="off" data-pick="#panel-refs li" hx-on:input="ermite.filter(this)"> | 305 | <input id="refs-filter" type="search" placeholder="Switch branch or tag…" autocomplete="off" data-pick="#panel-refs li" hx-on:input="ermite.filter(this)"> | ||
| 304 | - | <button type="button" class="panel-x" aria-label="Close" hx-on:click="closest('dialog').close()"> | 306 | + | <button type="button" class="panel-x" aria-label="Close (esc)" hx-on:click="closest('dialog').close()"> |
| 305 | <kbd>esc</kbd> | 307 | <kbd>esc</kbd> | ||
| 306 | </button> | 308 | </button> | ||
| 307 | </div> | 309 | </div> | ||
| @@ -336,79 +338,79 @@ | |||||
| 336 | <div class="panel-head"> | 338 | <div class="panel-head"> | ||
| 337 | <label for="cmd-q" class="sr">go to</label> | 339 | <label for="cmd-q" class="sr">go to</label> | ||
| 338 | <input id="cmd-q" type="search" placeholder="Go to a section, branch, tag, file or repository…" autocomplete="off" spellcheck="false" role="combobox" aria-autocomplete="list" aria-expanded="true" aria-controls="cmd-list" aria-activedescendant="cmd-o0" hx-on:input="ermite.cmdFilter(this); ermiteFinder.palette(this)" hx-on:keydown="ermite.cmdKey(event)"> | 340 | <input id="cmd-q" type="search" placeholder="Go to a section, branch, tag, file or repository…" autocomplete="off" spellcheck="false" role="combobox" aria-autocomplete="list" aria-expanded="true" aria-controls="cmd-list" aria-activedescendant="cmd-o0" hx-on:input="ermite.cmdFilter(this); ermiteFinder.palette(this)" hx-on:keydown="ermite.cmdKey(event)"> | ||
| 339 | - | <button type="button" class="panel-x" aria-label="Close" hx-on:click="closest('dialog').close()"> | 341 | + | <button type="button" class="panel-x" aria-label="Close (esc)" hx-on:click="closest('dialog').close()"> |
| 340 | <kbd>esc</kbd> | 342 | <kbd>esc</kbd> | ||
| 341 | </button> | 343 | </button> | ||
| 342 | </div> | 344 | </div> | ||
| 343 | <ul id="cmd-list" class="cmd-list" role="listbox" aria-label="Targets"> | 345 | <ul id="cmd-list" class="cmd-list" role="listbox" aria-label="Targets"> | ||
| 344 | <li id="cmd-o0" role="option" aria-selected="true" data-k="go home" data-cursor> | 346 | <li id="cmd-o0" role="option" aria-selected="true" data-k="go home" data-cursor> | ||
| 345 | - | <a href="/" tabindex="-1"> | 347 | + | <a role="presentation" data-href="/"> |
| 346 | <span class="lbl">home</span> | 348 | <span class="lbl">home</span> | ||
| 347 | <span class="k">go</span> | 349 | <span class="k">go</span> | ||
| 348 | </a> | 350 | </a> | ||
| 349 | </li> | 351 | </li> | ||
| 350 | <li id="cmd-o1" role="option" aria-selected="false" data-k="section summary"> | 352 | <li id="cmd-o1" role="option" aria-selected="false" data-k="section summary"> | ||
| 351 | - | <a href="/files" tabindex="-1"> | 353 | + | <a role="presentation" data-href="/files"> |
| 352 | <span class="lbl">summary</span> | 354 | <span class="lbl">summary</span> | ||
| 353 | <span class="k">section</span> | 355 | <span class="k">section</span> | ||
| 354 | </a> | 356 | </a> | ||
| 355 | </li> | 357 | </li> | ||
| 356 | <li id="cmd-o2" role="option" aria-selected="false" data-k="section files"> | 358 | <li id="cmd-o2" role="option" aria-selected="false" data-k="section files"> | ||
| 357 | - | <a href="/files/tree/main" tabindex="-1"> | 359 | + | <a role="presentation" data-href="/files/tree/main"> |
| 358 | <span class="lbl">files</span> | 360 | <span class="lbl">files</span> | ||
| 359 | <span class="k">section</span> | 361 | <span class="k">section</span> | ||
| 360 | </a> | 362 | </a> | ||
| 361 | </li> | 363 | </li> | ||
| 362 | <li id="cmd-o3" role="option" aria-selected="false" data-k="section commits"> | 364 | <li id="cmd-o3" role="option" aria-selected="false" data-k="section commits"> | ||
| 363 | - | <a href="/files/commits/main" tabindex="-1"> | 365 | + | <a role="presentation" data-href="/files/commits/main"> |
| 364 | <span class="lbl">commits</span> | 366 | <span class="lbl">commits</span> | ||
| 365 | <span class="k">section</span> | 367 | <span class="k">section</span> | ||
| 366 | </a> | 368 | </a> | ||
| 367 | </li> | 369 | </li> | ||
| 368 | <li id="cmd-o4" role="option" aria-selected="false" data-k="section branches & tags"> | 370 | <li id="cmd-o4" role="option" aria-selected="false" data-k="section branches & tags"> | ||
| 369 | - | <a href="/files/refs" tabindex="-1"> | 371 | + | <a role="presentation" data-href="/files/refs"> |
| 370 | <span class="lbl">branches & tags</span> | 372 | <span class="lbl">branches & tags</span> | ||
| 371 | <span class="k">section</span> | 373 | <span class="k">section</span> | ||
| 372 | </a> | 374 | </a> | ||
| 373 | </li> | 375 | </li> | ||
| 374 | <li id="cmd-o5" role="option" aria-selected="false" data-k="section merge requests"> | 376 | <li id="cmd-o5" role="option" aria-selected="false" data-k="section merge requests"> | ||
| 375 | - | <a href="/files/merge-requests" tabindex="-1"> | 377 | + | <a role="presentation" data-href="/files/merge-requests"> |
| 376 | <span class="lbl">merge requests</span> | 378 | <span class="lbl">merge requests</span> | ||
| 377 | <span class="k">section</span> | 379 | <span class="k">section</span> | ||
| 378 | </a> | 380 | </a> | ||
| 379 | </li> | 381 | </li> | ||
| 380 | <li id="cmd-o6" role="option" aria-selected="false" data-k="section releases"> | 382 | <li id="cmd-o6" role="option" aria-selected="false" data-k="section releases"> | ||
| 381 | - | <a href="/files/releases" tabindex="-1"> | 383 | + | <a role="presentation" data-href="/files/releases"> |
| 382 | <span class="lbl">releases</span> | 384 | <span class="lbl">releases</span> | ||
| 383 | <span class="k">section</span> | 385 | <span class="k">section</span> | ||
| 384 | </a> | 386 | </a> | ||
| 385 | </li> | 387 | </li> | ||
| 386 | <li id="cmd-o7" role="option" aria-selected="false" data-k="section actions"> | 388 | <li id="cmd-o7" role="option" aria-selected="false" data-k="section actions"> | ||
| 387 | - | <a href="/files/actions" tabindex="-1"> | 389 | + | <a role="presentation" data-href="/files/actions"> |
| 388 | <span class="lbl">actions</span> | 390 | <span class="lbl">actions</span> | ||
| 389 | <span class="k">section</span> | 391 | <span class="k">section</span> | ||
| 390 | </a> | 392 | </a> | ||
| 391 | </li> | 393 | </li> | ||
| 392 | <li id="cmd-o8" role="option" aria-selected="false" data-k="branch feature/x"> | 394 | <li id="cmd-o8" role="option" aria-selected="false" data-k="branch feature/x"> | ||
| 393 | - | <a href="/files/tree/feature/x" tabindex="-1"> | 395 | + | <a role="presentation" data-href="/files/tree/feature/x"> |
| 394 | <span class="lbl">feature/x</span> | 396 | <span class="lbl">feature/x</span> | ||
| 395 | <span class="k">branch</span> | 397 | <span class="k">branch</span> | ||
| 396 | </a> | 398 | </a> | ||
| 397 | </li> | 399 | </li> | ||
| 398 | <li id="cmd-o9" role="option" aria-selected="false" data-k="branch main"> | 400 | <li id="cmd-o9" role="option" aria-selected="false" data-k="branch main"> | ||
| 399 | - | <a href="/files/tree/main" tabindex="-1"> | 401 | + | <a role="presentation" data-href="/files/tree/main"> |
| 400 | <span class="lbl">main</span> | 402 | <span class="lbl">main</span> | ||
| 401 | <span class="k">branch</span> | 403 | <span class="k">branch</span> | ||
| 402 | </a> | 404 | </a> | ||
| 403 | </li> | 405 | </li> | ||
| 404 | <li id="cmd-o10" role="option" aria-selected="false" data-k="tag v1.0"> | 406 | <li id="cmd-o10" role="option" aria-selected="false" data-k="tag v1.0"> | ||
| 405 | - | <a href="/files/tree/v1.0" tabindex="-1"> | 407 | + | <a role="presentation" data-href="/files/tree/v1.0"> |
| 406 | <span class="lbl">v1.0</span> | 408 | <span class="lbl">v1.0</span> | ||
| 407 | <span class="k">tag</span> | 409 | <span class="k">tag</span> | ||
| 408 | </a> | 410 | </a> | ||
| 409 | </li> | 411 | </li> | ||
| 410 | <li id="cmd-o11" role="option" aria-selected="false" data-k="action turn single-key shortcuts on off keyboard"> | 412 | <li id="cmd-o11" role="option" aria-selected="false" data-k="action turn single-key shortcuts on off keyboard"> | ||
| 411 | - | <a href="#" data-fire="keys" tabindex="-1"> | 413 | + | <a role="presentation" data-fire="keys"> |
| 412 | <span class="lbl">turn single-key shortcuts off</span> | 414 | <span class="lbl">turn single-key shortcuts off</span> | ||
| 413 | <span class="k">action</span> | 415 | <span class="k">action</span> | ||
| 414 | </a> | 416 | </a> | ||
M internal/app/testdata/web/tree-root.html +21 -19
| @@ -111,9 +111,9 @@ | |||
| 111 | 111 | <kbd>j</kbd> | |
| 112 | 112 | <kbd>k</kbd> move · <kbd>l</kbd> open · <kbd>h</kbd> back</p> | |
| 113 | 113 | </div> | |
| 114 | - | <div id="finder" class="tree-card" hidden> | |
| 115 | - | <p id="finder-status" class="dim" aria-live="polite"> | |
| 114 | + | <p id="finder-status" class="dim" role="status"> | |
| 116 | 115 | </p> | |
| 116 | + | <div id="finder" class="tree-card" hidden> | |
| 117 | 117 | <ul id="finder-list" class="cmd-list" role="listbox" aria-label="Files"> | |
| 118 | 118 | </ul> | |
| 119 | 119 | </div> | |
| @@ -377,18 +377,20 @@ | |||
| 377 | 377 | <button type="button" class="foot-keys" data-js data-fire="help" aria-haspopup="dialog" aria-controls="panel-help" aria-keyshortcuts="?"> | |
| 378 | 378 | <kbd aria-hidden="true">?</kbd> keyboard shortcuts</button> | |
| 379 | 379 | </footer> | |
| 380 | - | <div class="hint" role="status" aria-live="polite"> | |
| 381 | - | <span class="hint-nav" :text="document.body.dataset.nav || ''"> | |
| 380 | + | <div class="hint"> | |
| 381 | + | <span aria-hidden="true" class="hint-nav" :text="document.body.dataset.nav || ''"> | |
| 382 | 382 | </span> | |
| 383 | + | <span role="status" aria-live="polite"> | |
| 383 | 384 | <span class="hint-sel" :text="document.body.dataset.sel ? document.body.dataset.sel + ' · y permalink' : ''"> | |
| 384 | 385 | </span> | |
| 385 | 386 | <span class="hint-flash" :text="document.body.dataset.flash || ''"> | |
| 386 | 387 | </span> | |
| 388 | + | </span> | |
| 387 | 389 | </div> | |
| 388 | 390 | <dialog id="panel-help" class="panel modal" aria-label="Keyboard shortcuts" hx-on:keydown="event.key === 'Escape' && (event.preventDefault(), this.close())" hx-on:click="event.target === this && this.close()"> | |
| 389 | 391 | <div class="panel-head"> | |
| 390 | 392 | <h2>Keyboard shortcuts</h2> | |
| 391 | - | <button type="button" class="panel-x" aria-label="Close" hx-on:click="closest('dialog').close()"> | |
| 393 | + | <button type="button" class="panel-x" aria-label="Close (esc)" hx-on:click="closest('dialog').close()"> | |
| 392 | 394 | <kbd>esc</kbd> close</button> | |
| 393 | 395 | </div> | |
| 394 | 396 | <div class="keys-pref"> | |
| @@ -522,7 +524,7 @@ | |||
| 522 | 524 | <div class="panel-head"> | |
| 523 | 525 | <label for="refs-filter" class="sr">filter branches and tags</label> | |
| 524 | 526 | <input id="refs-filter" type="search" placeholder="Switch branch or tag…" autocomplete="off" data-pick="#panel-refs li" hx-on:input="ermite.filter(this)"> | |
| 525 | - | <button type="button" class="panel-x" aria-label="Close" hx-on:click="closest('dialog').close()"> | |
| 527 | + | <button type="button" class="panel-x" aria-label="Close (esc)" hx-on:click="closest('dialog').close()"> | |
| 526 | 528 | <kbd>esc</kbd> | |
| 527 | 529 | </button> | |
| 528 | 530 | </div> | |
| @@ -557,79 +559,79 @@ | |||
| 557 | 559 | <div class="panel-head"> | |
| 558 | 560 | <label for="cmd-q" class="sr">go to</label> | |
| 559 | 561 | <input id="cmd-q" type="search" placeholder="Go to a section, branch, tag, file or repository…" autocomplete="off" spellcheck="false" role="combobox" aria-autocomplete="list" aria-expanded="true" aria-controls="cmd-list" aria-activedescendant="cmd-o0" hx-on:input="ermite.cmdFilter(this); ermiteFinder.palette(this)" hx-on:keydown="ermite.cmdKey(event)"> | |
| 560 | - | <button type="button" class="panel-x" aria-label="Close" hx-on:click="closest('dialog').close()"> | |
| 562 | + | <button type="button" class="panel-x" aria-label="Close (esc)" hx-on:click="closest('dialog').close()"> | |
| 561 | 563 | <kbd>esc</kbd> | |
| 562 | 564 | </button> | |
| 563 | 565 | </div> | |
| 564 | 566 | <ul id="cmd-list" class="cmd-list" role="listbox" aria-label="Targets"> | |
| 565 | 567 | <li id="cmd-o0" role="option" aria-selected="true" data-k="go home" data-cursor> | |
| 566 | - | <a href="/" tabindex="-1"> | |
| 568 | + | <a role="presentation" data-href="/"> | |
| 567 | 569 | <span class="lbl">home</span> | |
| 568 | 570 | <span class="k">go</span> | |
| 569 | 571 | </a> | |
| 570 | 572 | </li> | |
| 571 | 573 | <li id="cmd-o1" role="option" aria-selected="false" data-k="section summary"> | |
| 572 | - | <a href="/files" tabindex="-1"> | |
| 574 | + | <a role="presentation" data-href="/files"> | |
| 573 | 575 | <span class="lbl">summary</span> | |
| 574 | 576 | <span class="k">section</span> | |
| 575 | 577 | </a> | |
| 576 | 578 | </li> | |
| 577 | 579 | <li id="cmd-o2" role="option" aria-selected="false" data-k="section files"> | |
| 578 | - | <a href="/files/tree/main" tabindex="-1"> | |
| 580 | + | <a role="presentation" data-href="/files/tree/main"> | |
| 579 | 581 | <span class="lbl">files</span> | |
| 580 | 582 | <span class="k">section</span> | |
| 581 | 583 | </a> | |
| 582 | 584 | </li> | |
| 583 | 585 | <li id="cmd-o3" role="option" aria-selected="false" data-k="section commits"> | |
| 584 | - | <a href="/files/commits/main" tabindex="-1"> | |
| 586 | + | <a role="presentation" data-href="/files/commits/main"> | |
| 585 | 587 | <span class="lbl">commits</span> | |
| 586 | 588 | <span class="k">section</span> | |
| 587 | 589 | </a> | |
| 588 | 590 | </li> | |
| 589 | 591 | <li id="cmd-o4" role="option" aria-selected="false" data-k="section branches & tags"> | |
| 590 | - | <a href="/files/refs" tabindex="-1"> | |
| 592 | + | <a role="presentation" data-href="/files/refs"> | |
| 591 | 593 | <span class="lbl">branches & tags</span> | |
| 592 | 594 | <span class="k">section</span> | |
| 593 | 595 | </a> | |
| 594 | 596 | </li> | |
| 595 | 597 | <li id="cmd-o5" role="option" aria-selected="false" data-k="section merge requests"> | |
| 596 | - | <a href="/files/merge-requests" tabindex="-1"> | |
| 598 | + | <a role="presentation" data-href="/files/merge-requests"> | |
| 597 | 599 | <span class="lbl">merge requests</span> | |
| 598 | 600 | <span class="k">section</span> | |
| 599 | 601 | </a> | |
| 600 | 602 | </li> | |
| 601 | 603 | <li id="cmd-o6" role="option" aria-selected="false" data-k="section releases"> | |
| 602 | - | <a href="/files/releases" tabindex="-1"> | |
| 604 | + | <a role="presentation" data-href="/files/releases"> | |
| 603 | 605 | <span class="lbl">releases</span> | |
| 604 | 606 | <span class="k">section</span> | |
| 605 | 607 | </a> | |
| 606 | 608 | </li> | |
| 607 | 609 | <li id="cmd-o7" role="option" aria-selected="false" data-k="section actions"> | |
| 608 | - | <a href="/files/actions" tabindex="-1"> | |
| 610 | + | <a role="presentation" data-href="/files/actions"> | |
| 609 | 611 | <span class="lbl">actions</span> | |
| 610 | 612 | <span class="k">section</span> | |
| 611 | 613 | </a> | |
| 612 | 614 | </li> | |
| 613 | 615 | <li id="cmd-o8" role="option" aria-selected="false" data-k="branch feature/x"> | |
| 614 | - | <a href="/files/tree/feature/x" tabindex="-1"> | |
| 616 | + | <a role="presentation" data-href="/files/tree/feature/x"> | |
| 615 | 617 | <span class="lbl">feature/x</span> | |
| 616 | 618 | <span class="k">branch</span> | |
| 617 | 619 | </a> | |
| 618 | 620 | </li> | |
| 619 | 621 | <li id="cmd-o9" role="option" aria-selected="false" data-k="branch main"> | |
| 620 | - | <a href="/files/tree/main" tabindex="-1"> | |
| 622 | + | <a role="presentation" data-href="/files/tree/main"> | |
| 621 | 623 | <span class="lbl">main</span> | |
| 622 | 624 | <span class="k">branch</span> | |
| 623 | 625 | </a> | |
| 624 | 626 | </li> | |
| 625 | 627 | <li id="cmd-o10" role="option" aria-selected="false" data-k="tag v1.0"> | |
| 626 | - | <a href="/files/tree/v1.0" tabindex="-1"> | |
| 628 | + | <a role="presentation" data-href="/files/tree/v1.0"> | |
| 627 | 629 | <span class="lbl">v1.0</span> | |
| 628 | 630 | <span class="k">tag</span> | |
| 629 | 631 | </a> | |
| 630 | 632 | </li> | |
| 631 | 633 | <li id="cmd-o11" role="option" aria-selected="false" data-k="action turn single-key shortcuts on off keyboard"> | |
| 632 | - | <a href="#" data-fire="keys" tabindex="-1"> | |
| 634 | + | <a role="presentation" data-fire="keys"> | |
| 633 | 635 | <span class="lbl">turn single-key shortcuts off</span> | |
| 634 | 636 | <span class="k">action</span> | |
| 635 | 637 | </a> | |
| @@ -111,9 +111,9 @@ | |||||
| 111 | <kbd>j</kbd> | 111 | <kbd>j</kbd> | ||
| 112 | <kbd>k</kbd> move · <kbd>l</kbd> open · <kbd>h</kbd> back</p> | 112 | <kbd>k</kbd> move · <kbd>l</kbd> open · <kbd>h</kbd> back</p> | ||
| 113 | </div> | 113 | </div> | ||
| 114 | - | <div id="finder" class="tree-card" hidden> | 114 | + | <p id="finder-status" class="dim" role="status"> |
| 115 | - | <p id="finder-status" class="dim" aria-live="polite"> | |||
| 116 | </p> | 115 | </p> | ||
| 116 | + | <div id="finder" class="tree-card" hidden> | |||
| 117 | <ul id="finder-list" class="cmd-list" role="listbox" aria-label="Files"> | 117 | <ul id="finder-list" class="cmd-list" role="listbox" aria-label="Files"> | ||
| 118 | </ul> | 118 | </ul> | ||
| 119 | </div> | 119 | </div> | ||
| @@ -377,18 +377,20 @@ | |||||
| 377 | <button type="button" class="foot-keys" data-js data-fire="help" aria-haspopup="dialog" aria-controls="panel-help" aria-keyshortcuts="?"> | 377 | <button type="button" class="foot-keys" data-js data-fire="help" aria-haspopup="dialog" aria-controls="panel-help" aria-keyshortcuts="?"> | ||
| 378 | <kbd aria-hidden="true">?</kbd> keyboard shortcuts</button> | 378 | <kbd aria-hidden="true">?</kbd> keyboard shortcuts</button> | ||
| 379 | </footer> | 379 | </footer> | ||
| 380 | - | <div class="hint" role="status" aria-live="polite"> | 380 | + | <div class="hint"> |
| 381 | - | <span class="hint-nav" :text="document.body.dataset.nav || ''"> | 381 | + | <span aria-hidden="true" class="hint-nav" :text="document.body.dataset.nav || ''"> |
| 382 | </span> | 382 | </span> | ||
| 383 | + | <span role="status" aria-live="polite"> | |||
| 383 | <span class="hint-sel" :text="document.body.dataset.sel ? document.body.dataset.sel + ' · y permalink' : ''"> | 384 | <span class="hint-sel" :text="document.body.dataset.sel ? document.body.dataset.sel + ' · y permalink' : ''"> | ||
| 384 | </span> | 385 | </span> | ||
| 385 | <span class="hint-flash" :text="document.body.dataset.flash || ''"> | 386 | <span class="hint-flash" :text="document.body.dataset.flash || ''"> | ||
| 386 | </span> | 387 | </span> | ||
| 388 | + | </span> | |||
| 387 | </div> | 389 | </div> | ||
| 388 | <dialog id="panel-help" class="panel modal" aria-label="Keyboard shortcuts" hx-on:keydown="event.key === 'Escape' && (event.preventDefault(), this.close())" hx-on:click="event.target === this && this.close()"> | 390 | <dialog id="panel-help" class="panel modal" aria-label="Keyboard shortcuts" hx-on:keydown="event.key === 'Escape' && (event.preventDefault(), this.close())" hx-on:click="event.target === this && this.close()"> | ||
| 389 | <div class="panel-head"> | 391 | <div class="panel-head"> | ||
| 390 | <h2>Keyboard shortcuts</h2> | 392 | <h2>Keyboard shortcuts</h2> | ||
| 391 | - | <button type="button" class="panel-x" aria-label="Close" hx-on:click="closest('dialog').close()"> | 393 | + | <button type="button" class="panel-x" aria-label="Close (esc)" hx-on:click="closest('dialog').close()"> |
| 392 | <kbd>esc</kbd> close</button> | 394 | <kbd>esc</kbd> close</button> | ||
| 393 | </div> | 395 | </div> | ||
| 394 | <div class="keys-pref"> | 396 | <div class="keys-pref"> | ||
| @@ -522,7 +524,7 @@ | |||||
| 522 | <div class="panel-head"> | 524 | <div class="panel-head"> | ||
| 523 | <label for="refs-filter" class="sr">filter branches and tags</label> | 525 | <label for="refs-filter" class="sr">filter branches and tags</label> | ||
| 524 | <input id="refs-filter" type="search" placeholder="Switch branch or tag…" autocomplete="off" data-pick="#panel-refs li" hx-on:input="ermite.filter(this)"> | 526 | <input id="refs-filter" type="search" placeholder="Switch branch or tag…" autocomplete="off" data-pick="#panel-refs li" hx-on:input="ermite.filter(this)"> | ||
| 525 | - | <button type="button" class="panel-x" aria-label="Close" hx-on:click="closest('dialog').close()"> | 527 | + | <button type="button" class="panel-x" aria-label="Close (esc)" hx-on:click="closest('dialog').close()"> |
| 526 | <kbd>esc</kbd> | 528 | <kbd>esc</kbd> | ||
| 527 | </button> | 529 | </button> | ||
| 528 | </div> | 530 | </div> | ||
| @@ -557,79 +559,79 @@ | |||||
| 557 | <div class="panel-head"> | 559 | <div class="panel-head"> | ||
| 558 | <label for="cmd-q" class="sr">go to</label> | 560 | <label for="cmd-q" class="sr">go to</label> | ||
| 559 | <input id="cmd-q" type="search" placeholder="Go to a section, branch, tag, file or repository…" autocomplete="off" spellcheck="false" role="combobox" aria-autocomplete="list" aria-expanded="true" aria-controls="cmd-list" aria-activedescendant="cmd-o0" hx-on:input="ermite.cmdFilter(this); ermiteFinder.palette(this)" hx-on:keydown="ermite.cmdKey(event)"> | 561 | <input id="cmd-q" type="search" placeholder="Go to a section, branch, tag, file or repository…" autocomplete="off" spellcheck="false" role="combobox" aria-autocomplete="list" aria-expanded="true" aria-controls="cmd-list" aria-activedescendant="cmd-o0" hx-on:input="ermite.cmdFilter(this); ermiteFinder.palette(this)" hx-on:keydown="ermite.cmdKey(event)"> | ||
| 560 | - | <button type="button" class="panel-x" aria-label="Close" hx-on:click="closest('dialog').close()"> | 562 | + | <button type="button" class="panel-x" aria-label="Close (esc)" hx-on:click="closest('dialog').close()"> |
| 561 | <kbd>esc</kbd> | 563 | <kbd>esc</kbd> | ||
| 562 | </button> | 564 | </button> | ||
| 563 | </div> | 565 | </div> | ||
| 564 | <ul id="cmd-list" class="cmd-list" role="listbox" aria-label="Targets"> | 566 | <ul id="cmd-list" class="cmd-list" role="listbox" aria-label="Targets"> | ||
| 565 | <li id="cmd-o0" role="option" aria-selected="true" data-k="go home" data-cursor> | 567 | <li id="cmd-o0" role="option" aria-selected="true" data-k="go home" data-cursor> | ||
| 566 | - | <a href="/" tabindex="-1"> | 568 | + | <a role="presentation" data-href="/"> |
| 567 | <span class="lbl">home</span> | 569 | <span class="lbl">home</span> | ||
| 568 | <span class="k">go</span> | 570 | <span class="k">go</span> | ||
| 569 | </a> | 571 | </a> | ||
| 570 | </li> | 572 | </li> | ||
| 571 | <li id="cmd-o1" role="option" aria-selected="false" data-k="section summary"> | 573 | <li id="cmd-o1" role="option" aria-selected="false" data-k="section summary"> | ||
| 572 | - | <a href="/files" tabindex="-1"> | 574 | + | <a role="presentation" data-href="/files"> |
| 573 | <span class="lbl">summary</span> | 575 | <span class="lbl">summary</span> | ||
| 574 | <span class="k">section</span> | 576 | <span class="k">section</span> | ||
| 575 | </a> | 577 | </a> | ||
| 576 | </li> | 578 | </li> | ||
| 577 | <li id="cmd-o2" role="option" aria-selected="false" data-k="section files"> | 579 | <li id="cmd-o2" role="option" aria-selected="false" data-k="section files"> | ||
| 578 | - | <a href="/files/tree/main" tabindex="-1"> | 580 | + | <a role="presentation" data-href="/files/tree/main"> |
| 579 | <span class="lbl">files</span> | 581 | <span class="lbl">files</span> | ||
| 580 | <span class="k">section</span> | 582 | <span class="k">section</span> | ||
| 581 | </a> | 583 | </a> | ||
| 582 | </li> | 584 | </li> | ||
| 583 | <li id="cmd-o3" role="option" aria-selected="false" data-k="section commits"> | 585 | <li id="cmd-o3" role="option" aria-selected="false" data-k="section commits"> | ||
| 584 | - | <a href="/files/commits/main" tabindex="-1"> | 586 | + | <a role="presentation" data-href="/files/commits/main"> |
| 585 | <span class="lbl">commits</span> | 587 | <span class="lbl">commits</span> | ||
| 586 | <span class="k">section</span> | 588 | <span class="k">section</span> | ||
| 587 | </a> | 589 | </a> | ||
| 588 | </li> | 590 | </li> | ||
| 589 | <li id="cmd-o4" role="option" aria-selected="false" data-k="section branches & tags"> | 591 | <li id="cmd-o4" role="option" aria-selected="false" data-k="section branches & tags"> | ||
| 590 | - | <a href="/files/refs" tabindex="-1"> | 592 | + | <a role="presentation" data-href="/files/refs"> |
| 591 | <span class="lbl">branches & tags</span> | 593 | <span class="lbl">branches & tags</span> | ||
| 592 | <span class="k">section</span> | 594 | <span class="k">section</span> | ||
| 593 | </a> | 595 | </a> | ||
| 594 | </li> | 596 | </li> | ||
| 595 | <li id="cmd-o5" role="option" aria-selected="false" data-k="section merge requests"> | 597 | <li id="cmd-o5" role="option" aria-selected="false" data-k="section merge requests"> | ||
| 596 | - | <a href="/files/merge-requests" tabindex="-1"> | 598 | + | <a role="presentation" data-href="/files/merge-requests"> |
| 597 | <span class="lbl">merge requests</span> | 599 | <span class="lbl">merge requests</span> | ||
| 598 | <span class="k">section</span> | 600 | <span class="k">section</span> | ||
| 599 | </a> | 601 | </a> | ||
| 600 | </li> | 602 | </li> | ||
| 601 | <li id="cmd-o6" role="option" aria-selected="false" data-k="section releases"> | 603 | <li id="cmd-o6" role="option" aria-selected="false" data-k="section releases"> | ||
| 602 | - | <a href="/files/releases" tabindex="-1"> | 604 | + | <a role="presentation" data-href="/files/releases"> |
| 603 | <span class="lbl">releases</span> | 605 | <span class="lbl">releases</span> | ||
| 604 | <span class="k">section</span> | 606 | <span class="k">section</span> | ||
| 605 | </a> | 607 | </a> | ||
| 606 | </li> | 608 | </li> | ||
| 607 | <li id="cmd-o7" role="option" aria-selected="false" data-k="section actions"> | 609 | <li id="cmd-o7" role="option" aria-selected="false" data-k="section actions"> | ||
| 608 | - | <a href="/files/actions" tabindex="-1"> | 610 | + | <a role="presentation" data-href="/files/actions"> |
| 609 | <span class="lbl">actions</span> | 611 | <span class="lbl">actions</span> | ||
| 610 | <span class="k">section</span> | 612 | <span class="k">section</span> | ||
| 611 | </a> | 613 | </a> | ||
| 612 | </li> | 614 | </li> | ||
| 613 | <li id="cmd-o8" role="option" aria-selected="false" data-k="branch feature/x"> | 615 | <li id="cmd-o8" role="option" aria-selected="false" data-k="branch feature/x"> | ||
| 614 | - | <a href="/files/tree/feature/x" tabindex="-1"> | 616 | + | <a role="presentation" data-href="/files/tree/feature/x"> |
| 615 | <span class="lbl">feature/x</span> | 617 | <span class="lbl">feature/x</span> | ||
| 616 | <span class="k">branch</span> | 618 | <span class="k">branch</span> | ||
| 617 | </a> | 619 | </a> | ||
| 618 | </li> | 620 | </li> | ||
| 619 | <li id="cmd-o9" role="option" aria-selected="false" data-k="branch main"> | 621 | <li id="cmd-o9" role="option" aria-selected="false" data-k="branch main"> | ||
| 620 | - | <a href="/files/tree/main" tabindex="-1"> | 622 | + | <a role="presentation" data-href="/files/tree/main"> |
| 621 | <span class="lbl">main</span> | 623 | <span class="lbl">main</span> | ||
| 622 | <span class="k">branch</span> | 624 | <span class="k">branch</span> | ||
| 623 | </a> | 625 | </a> | ||
| 624 | </li> | 626 | </li> | ||
| 625 | <li id="cmd-o10" role="option" aria-selected="false" data-k="tag v1.0"> | 627 | <li id="cmd-o10" role="option" aria-selected="false" data-k="tag v1.0"> | ||
| 626 | - | <a href="/files/tree/v1.0" tabindex="-1"> | 628 | + | <a role="presentation" data-href="/files/tree/v1.0"> |
| 627 | <span class="lbl">v1.0</span> | 629 | <span class="lbl">v1.0</span> | ||
| 628 | <span class="k">tag</span> | 630 | <span class="k">tag</span> | ||
| 629 | </a> | 631 | </a> | ||
| 630 | </li> | 632 | </li> | ||
| 631 | <li id="cmd-o11" role="option" aria-selected="false" data-k="action turn single-key shortcuts on off keyboard"> | 633 | <li id="cmd-o11" role="option" aria-selected="false" data-k="action turn single-key shortcuts on off keyboard"> | ||
| 632 | - | <a href="#" data-fire="keys" tabindex="-1"> | 634 | + | <a role="presentation" data-fire="keys"> |
| 633 | <span class="lbl">turn single-key shortcuts off</span> | 635 | <span class="lbl">turn single-key shortcuts off</span> | ||
| 634 | <span class="k">action</span> | 636 | <span class="k">action</span> | ||
| 635 | </a> | 637 | </a> | ||
M internal/app/testdata/web/tree-slash-ref.html +21 -19
| @@ -114,9 +114,9 @@ | |||
| 114 | 114 | <kbd>j</kbd> | |
| 115 | 115 | <kbd>k</kbd> move · <kbd>l</kbd> open · <kbd>h</kbd> back</p> | |
| 116 | 116 | </div> | |
| 117 | - | <div id="finder" class="tree-card" hidden> | |
| 118 | - | <p id="finder-status" class="dim" aria-live="polite"> | |
| 117 | + | <p id="finder-status" class="dim" role="status"> | |
| 119 | 118 | </p> | |
| 119 | + | <div id="finder" class="tree-card" hidden> | |
| 120 | 120 | <ul id="finder-list" class="cmd-list" role="listbox" aria-label="Files"> | |
| 121 | 121 | </ul> | |
| 122 | 122 | </div> | |
| @@ -153,18 +153,20 @@ | |||
| 153 | 153 | <button type="button" class="foot-keys" data-js data-fire="help" aria-haspopup="dialog" aria-controls="panel-help" aria-keyshortcuts="?"> | |
| 154 | 154 | <kbd aria-hidden="true">?</kbd> keyboard shortcuts</button> | |
| 155 | 155 | </footer> | |
| 156 | - | <div class="hint" role="status" aria-live="polite"> | |
| 157 | - | <span class="hint-nav" :text="document.body.dataset.nav || ''"> | |
| 156 | + | <div class="hint"> | |
| 157 | + | <span aria-hidden="true" class="hint-nav" :text="document.body.dataset.nav || ''"> | |
| 158 | 158 | </span> | |
| 159 | + | <span role="status" aria-live="polite"> | |
| 159 | 160 | <span class="hint-sel" :text="document.body.dataset.sel ? document.body.dataset.sel + ' · y permalink' : ''"> | |
| 160 | 161 | </span> | |
| 161 | 162 | <span class="hint-flash" :text="document.body.dataset.flash || ''"> | |
| 162 | 163 | </span> | |
| 164 | + | </span> | |
| 163 | 165 | </div> | |
| 164 | 166 | <dialog id="panel-help" class="panel modal" aria-label="Keyboard shortcuts" hx-on:keydown="event.key === 'Escape' && (event.preventDefault(), this.close())" hx-on:click="event.target === this && this.close()"> | |
| 165 | 167 | <div class="panel-head"> | |
| 166 | 168 | <h2>Keyboard shortcuts</h2> | |
| 167 | - | <button type="button" class="panel-x" aria-label="Close" hx-on:click="closest('dialog').close()"> | |
| 169 | + | <button type="button" class="panel-x" aria-label="Close (esc)" hx-on:click="closest('dialog').close()"> | |
| 168 | 170 | <kbd>esc</kbd> close</button> | |
| 169 | 171 | </div> | |
| 170 | 172 | <div class="keys-pref"> | |
| @@ -298,7 +300,7 @@ | |||
| 298 | 300 | <div class="panel-head"> | |
| 299 | 301 | <label for="refs-filter" class="sr">filter branches and tags</label> | |
| 300 | 302 | <input id="refs-filter" type="search" placeholder="Switch branch or tag…" autocomplete="off" data-pick="#panel-refs li" hx-on:input="ermite.filter(this)"> | |
| 301 | - | <button type="button" class="panel-x" aria-label="Close" hx-on:click="closest('dialog').close()"> | |
| 303 | + | <button type="button" class="panel-x" aria-label="Close (esc)" hx-on:click="closest('dialog').close()"> | |
| 302 | 304 | <kbd>esc</kbd> | |
| 303 | 305 | </button> | |
| 304 | 306 | </div> | |
| @@ -333,79 +335,79 @@ | |||
| 333 | 335 | <div class="panel-head"> | |
| 334 | 336 | <label for="cmd-q" class="sr">go to</label> | |
| 335 | 337 | <input id="cmd-q" type="search" placeholder="Go to a section, branch, tag, file or repository…" autocomplete="off" spellcheck="false" role="combobox" aria-autocomplete="list" aria-expanded="true" aria-controls="cmd-list" aria-activedescendant="cmd-o0" hx-on:input="ermite.cmdFilter(this); ermiteFinder.palette(this)" hx-on:keydown="ermite.cmdKey(event)"> | |
| 336 | - | <button type="button" class="panel-x" aria-label="Close" hx-on:click="closest('dialog').close()"> | |
| 338 | + | <button type="button" class="panel-x" aria-label="Close (esc)" hx-on:click="closest('dialog').close()"> | |
| 337 | 339 | <kbd>esc</kbd> | |
| 338 | 340 | </button> | |
| 339 | 341 | </div> | |
| 340 | 342 | <ul id="cmd-list" class="cmd-list" role="listbox" aria-label="Targets"> | |
| 341 | 343 | <li id="cmd-o0" role="option" aria-selected="true" data-k="go home" data-cursor> | |
| 342 | - | <a href="/" tabindex="-1"> | |
| 344 | + | <a role="presentation" data-href="/"> | |
| 343 | 345 | <span class="lbl">home</span> | |
| 344 | 346 | <span class="k">go</span> | |
| 345 | 347 | </a> | |
| 346 | 348 | </li> | |
| 347 | 349 | <li id="cmd-o1" role="option" aria-selected="false" data-k="section summary"> | |
| 348 | - | <a href="/files" tabindex="-1"> | |
| 350 | + | <a role="presentation" data-href="/files"> | |
| 349 | 351 | <span class="lbl">summary</span> | |
| 350 | 352 | <span class="k">section</span> | |
| 351 | 353 | </a> | |
| 352 | 354 | </li> | |
| 353 | 355 | <li id="cmd-o2" role="option" aria-selected="false" data-k="section files"> | |
| 354 | - | <a href="/files/tree/main" tabindex="-1"> | |
| 356 | + | <a role="presentation" data-href="/files/tree/main"> | |
| 355 | 357 | <span class="lbl">files</span> | |
| 356 | 358 | <span class="k">section</span> | |
| 357 | 359 | </a> | |
| 358 | 360 | </li> | |
| 359 | 361 | <li id="cmd-o3" role="option" aria-selected="false" data-k="section commits"> | |
| 360 | - | <a href="/files/commits/main" tabindex="-1"> | |
| 362 | + | <a role="presentation" data-href="/files/commits/main"> | |
| 361 | 363 | <span class="lbl">commits</span> | |
| 362 | 364 | <span class="k">section</span> | |
| 363 | 365 | </a> | |
| 364 | 366 | </li> | |
| 365 | 367 | <li id="cmd-o4" role="option" aria-selected="false" data-k="section branches & tags"> | |
| 366 | - | <a href="/files/refs" tabindex="-1"> | |
| 368 | + | <a role="presentation" data-href="/files/refs"> | |
| 367 | 369 | <span class="lbl">branches & tags</span> | |
| 368 | 370 | <span class="k">section</span> | |
| 369 | 371 | </a> | |
| 370 | 372 | </li> | |
| 371 | 373 | <li id="cmd-o5" role="option" aria-selected="false" data-k="section merge requests"> | |
| 372 | - | <a href="/files/merge-requests" tabindex="-1"> | |
| 374 | + | <a role="presentation" data-href="/files/merge-requests"> | |
| 373 | 375 | <span class="lbl">merge requests</span> | |
| 374 | 376 | <span class="k">section</span> | |
| 375 | 377 | </a> | |
| 376 | 378 | </li> | |
| 377 | 379 | <li id="cmd-o6" role="option" aria-selected="false" data-k="section releases"> | |
| 378 | - | <a href="/files/releases" tabindex="-1"> | |
| 380 | + | <a role="presentation" data-href="/files/releases"> | |
| 379 | 381 | <span class="lbl">releases</span> | |
| 380 | 382 | <span class="k">section</span> | |
| 381 | 383 | </a> | |
| 382 | 384 | </li> | |
| 383 | 385 | <li id="cmd-o7" role="option" aria-selected="false" data-k="section actions"> | |
| 384 | - | <a href="/files/actions" tabindex="-1"> | |
| 386 | + | <a role="presentation" data-href="/files/actions"> | |
| 385 | 387 | <span class="lbl">actions</span> | |
| 386 | 388 | <span class="k">section</span> | |
| 387 | 389 | </a> | |
| 388 | 390 | </li> | |
| 389 | 391 | <li id="cmd-o8" role="option" aria-selected="false" data-k="branch feature/x"> | |
| 390 | - | <a href="/files/tree/feature/x" tabindex="-1"> | |
| 392 | + | <a role="presentation" data-href="/files/tree/feature/x"> | |
| 391 | 393 | <span class="lbl">feature/x</span> | |
| 392 | 394 | <span class="k">branch</span> | |
| 393 | 395 | </a> | |
| 394 | 396 | </li> | |
| 395 | 397 | <li id="cmd-o9" role="option" aria-selected="false" data-k="branch main"> | |
| 396 | - | <a href="/files/tree/main" tabindex="-1"> | |
| 398 | + | <a role="presentation" data-href="/files/tree/main"> | |
| 397 | 399 | <span class="lbl">main</span> | |
| 398 | 400 | <span class="k">branch</span> | |
| 399 | 401 | </a> | |
| 400 | 402 | </li> | |
| 401 | 403 | <li id="cmd-o10" role="option" aria-selected="false" data-k="tag v1.0"> | |
| 402 | - | <a href="/files/tree/v1.0" tabindex="-1"> | |
| 404 | + | <a role="presentation" data-href="/files/tree/v1.0"> | |
| 403 | 405 | <span class="lbl">v1.0</span> | |
| 404 | 406 | <span class="k">tag</span> | |
| 405 | 407 | </a> | |
| 406 | 408 | </li> | |
| 407 | 409 | <li id="cmd-o11" role="option" aria-selected="false" data-k="action turn single-key shortcuts on off keyboard"> | |
| 408 | - | <a href="#" data-fire="keys" tabindex="-1"> | |
| 410 | + | <a role="presentation" data-fire="keys"> | |
| 409 | 411 | <span class="lbl">turn single-key shortcuts off</span> | |
| 410 | 412 | <span class="k">action</span> | |
| 411 | 413 | </a> | |
| @@ -114,9 +114,9 @@ | |||||
| 114 | <kbd>j</kbd> | 114 | <kbd>j</kbd> | ||
| 115 | <kbd>k</kbd> move · <kbd>l</kbd> open · <kbd>h</kbd> back</p> | 115 | <kbd>k</kbd> move · <kbd>l</kbd> open · <kbd>h</kbd> back</p> | ||
| 116 | </div> | 116 | </div> | ||
| 117 | - | <div id="finder" class="tree-card" hidden> | 117 | + | <p id="finder-status" class="dim" role="status"> |
| 118 | - | <p id="finder-status" class="dim" aria-live="polite"> | |||
| 119 | </p> | 118 | </p> | ||
| 119 | + | <div id="finder" class="tree-card" hidden> | |||
| 120 | <ul id="finder-list" class="cmd-list" role="listbox" aria-label="Files"> | 120 | <ul id="finder-list" class="cmd-list" role="listbox" aria-label="Files"> | ||
| 121 | </ul> | 121 | </ul> | ||
| 122 | </div> | 122 | </div> | ||
| @@ -153,18 +153,20 @@ | |||||
| 153 | <button type="button" class="foot-keys" data-js data-fire="help" aria-haspopup="dialog" aria-controls="panel-help" aria-keyshortcuts="?"> | 153 | <button type="button" class="foot-keys" data-js data-fire="help" aria-haspopup="dialog" aria-controls="panel-help" aria-keyshortcuts="?"> | ||
| 154 | <kbd aria-hidden="true">?</kbd> keyboard shortcuts</button> | 154 | <kbd aria-hidden="true">?</kbd> keyboard shortcuts</button> | ||
| 155 | </footer> | 155 | </footer> | ||
| 156 | - | <div class="hint" role="status" aria-live="polite"> | 156 | + | <div class="hint"> |
| 157 | - | <span class="hint-nav" :text="document.body.dataset.nav || ''"> | 157 | + | <span aria-hidden="true" class="hint-nav" :text="document.body.dataset.nav || ''"> |
| 158 | </span> | 158 | </span> | ||
| 159 | + | <span role="status" aria-live="polite"> | |||
| 159 | <span class="hint-sel" :text="document.body.dataset.sel ? document.body.dataset.sel + ' · y permalink' : ''"> | 160 | <span class="hint-sel" :text="document.body.dataset.sel ? document.body.dataset.sel + ' · y permalink' : ''"> | ||
| 160 | </span> | 161 | </span> | ||
| 161 | <span class="hint-flash" :text="document.body.dataset.flash || ''"> | 162 | <span class="hint-flash" :text="document.body.dataset.flash || ''"> | ||
| 162 | </span> | 163 | </span> | ||
| 164 | + | </span> | |||
| 163 | </div> | 165 | </div> | ||
| 164 | <dialog id="panel-help" class="panel modal" aria-label="Keyboard shortcuts" hx-on:keydown="event.key === 'Escape' && (event.preventDefault(), this.close())" hx-on:click="event.target === this && this.close()"> | 166 | <dialog id="panel-help" class="panel modal" aria-label="Keyboard shortcuts" hx-on:keydown="event.key === 'Escape' && (event.preventDefault(), this.close())" hx-on:click="event.target === this && this.close()"> | ||
| 165 | <div class="panel-head"> | 167 | <div class="panel-head"> | ||
| 166 | <h2>Keyboard shortcuts</h2> | 168 | <h2>Keyboard shortcuts</h2> | ||
| 167 | - | <button type="button" class="panel-x" aria-label="Close" hx-on:click="closest('dialog').close()"> | 169 | + | <button type="button" class="panel-x" aria-label="Close (esc)" hx-on:click="closest('dialog').close()"> |
| 168 | <kbd>esc</kbd> close</button> | 170 | <kbd>esc</kbd> close</button> | ||
| 169 | </div> | 171 | </div> | ||
| 170 | <div class="keys-pref"> | 172 | <div class="keys-pref"> | ||
| @@ -298,7 +300,7 @@ | |||||
| 298 | <div class="panel-head"> | 300 | <div class="panel-head"> | ||
| 299 | <label for="refs-filter" class="sr">filter branches and tags</label> | 301 | <label for="refs-filter" class="sr">filter branches and tags</label> | ||
| 300 | <input id="refs-filter" type="search" placeholder="Switch branch or tag…" autocomplete="off" data-pick="#panel-refs li" hx-on:input="ermite.filter(this)"> | 302 | <input id="refs-filter" type="search" placeholder="Switch branch or tag…" autocomplete="off" data-pick="#panel-refs li" hx-on:input="ermite.filter(this)"> | ||
| 301 | - | <button type="button" class="panel-x" aria-label="Close" hx-on:click="closest('dialog').close()"> | 303 | + | <button type="button" class="panel-x" aria-label="Close (esc)" hx-on:click="closest('dialog').close()"> |
| 302 | <kbd>esc</kbd> | 304 | <kbd>esc</kbd> | ||
| 303 | </button> | 305 | </button> | ||
| 304 | </div> | 306 | </div> | ||
| @@ -333,79 +335,79 @@ | |||||
| 333 | <div class="panel-head"> | 335 | <div class="panel-head"> | ||
| 334 | <label for="cmd-q" class="sr">go to</label> | 336 | <label for="cmd-q" class="sr">go to</label> | ||
| 335 | <input id="cmd-q" type="search" placeholder="Go to a section, branch, tag, file or repository…" autocomplete="off" spellcheck="false" role="combobox" aria-autocomplete="list" aria-expanded="true" aria-controls="cmd-list" aria-activedescendant="cmd-o0" hx-on:input="ermite.cmdFilter(this); ermiteFinder.palette(this)" hx-on:keydown="ermite.cmdKey(event)"> | 337 | <input id="cmd-q" type="search" placeholder="Go to a section, branch, tag, file or repository…" autocomplete="off" spellcheck="false" role="combobox" aria-autocomplete="list" aria-expanded="true" aria-controls="cmd-list" aria-activedescendant="cmd-o0" hx-on:input="ermite.cmdFilter(this); ermiteFinder.palette(this)" hx-on:keydown="ermite.cmdKey(event)"> | ||
| 336 | - | <button type="button" class="panel-x" aria-label="Close" hx-on:click="closest('dialog').close()"> | 338 | + | <button type="button" class="panel-x" aria-label="Close (esc)" hx-on:click="closest('dialog').close()"> |
| 337 | <kbd>esc</kbd> | 339 | <kbd>esc</kbd> | ||
| 338 | </button> | 340 | </button> | ||
| 339 | </div> | 341 | </div> | ||
| 340 | <ul id="cmd-list" class="cmd-list" role="listbox" aria-label="Targets"> | 342 | <ul id="cmd-list" class="cmd-list" role="listbox" aria-label="Targets"> | ||
| 341 | <li id="cmd-o0" role="option" aria-selected="true" data-k="go home" data-cursor> | 343 | <li id="cmd-o0" role="option" aria-selected="true" data-k="go home" data-cursor> | ||
| 342 | - | <a href="/" tabindex="-1"> | 344 | + | <a role="presentation" data-href="/"> |
| 343 | <span class="lbl">home</span> | 345 | <span class="lbl">home</span> | ||
| 344 | <span class="k">go</span> | 346 | <span class="k">go</span> | ||
| 345 | </a> | 347 | </a> | ||
| 346 | </li> | 348 | </li> | ||
| 347 | <li id="cmd-o1" role="option" aria-selected="false" data-k="section summary"> | 349 | <li id="cmd-o1" role="option" aria-selected="false" data-k="section summary"> | ||
| 348 | - | <a href="/files" tabindex="-1"> | 350 | + | <a role="presentation" data-href="/files"> |
| 349 | <span class="lbl">summary</span> | 351 | <span class="lbl">summary</span> | ||
| 350 | <span class="k">section</span> | 352 | <span class="k">section</span> | ||
| 351 | </a> | 353 | </a> | ||
| 352 | </li> | 354 | </li> | ||
| 353 | <li id="cmd-o2" role="option" aria-selected="false" data-k="section files"> | 355 | <li id="cmd-o2" role="option" aria-selected="false" data-k="section files"> | ||
| 354 | - | <a href="/files/tree/main" tabindex="-1"> | 356 | + | <a role="presentation" data-href="/files/tree/main"> |
| 355 | <span class="lbl">files</span> | 357 | <span class="lbl">files</span> | ||
| 356 | <span class="k">section</span> | 358 | <span class="k">section</span> | ||
| 357 | </a> | 359 | </a> | ||
| 358 | </li> | 360 | </li> | ||
| 359 | <li id="cmd-o3" role="option" aria-selected="false" data-k="section commits"> | 361 | <li id="cmd-o3" role="option" aria-selected="false" data-k="section commits"> | ||
| 360 | - | <a href="/files/commits/main" tabindex="-1"> | 362 | + | <a role="presentation" data-href="/files/commits/main"> |
| 361 | <span class="lbl">commits</span> | 363 | <span class="lbl">commits</span> | ||
| 362 | <span class="k">section</span> | 364 | <span class="k">section</span> | ||
| 363 | </a> | 365 | </a> | ||
| 364 | </li> | 366 | </li> | ||
| 365 | <li id="cmd-o4" role="option" aria-selected="false" data-k="section branches & tags"> | 367 | <li id="cmd-o4" role="option" aria-selected="false" data-k="section branches & tags"> | ||
| 366 | - | <a href="/files/refs" tabindex="-1"> | 368 | + | <a role="presentation" data-href="/files/refs"> |
| 367 | <span class="lbl">branches & tags</span> | 369 | <span class="lbl">branches & tags</span> | ||
| 368 | <span class="k">section</span> | 370 | <span class="k">section</span> | ||
| 369 | </a> | 371 | </a> | ||
| 370 | </li> | 372 | </li> | ||
| 371 | <li id="cmd-o5" role="option" aria-selected="false" data-k="section merge requests"> | 373 | <li id="cmd-o5" role="option" aria-selected="false" data-k="section merge requests"> | ||
| 372 | - | <a href="/files/merge-requests" tabindex="-1"> | 374 | + | <a role="presentation" data-href="/files/merge-requests"> |
| 373 | <span class="lbl">merge requests</span> | 375 | <span class="lbl">merge requests</span> | ||
| 374 | <span class="k">section</span> | 376 | <span class="k">section</span> | ||
| 375 | </a> | 377 | </a> | ||
| 376 | </li> | 378 | </li> | ||
| 377 | <li id="cmd-o6" role="option" aria-selected="false" data-k="section releases"> | 379 | <li id="cmd-o6" role="option" aria-selected="false" data-k="section releases"> | ||
| 378 | - | <a href="/files/releases" tabindex="-1"> | 380 | + | <a role="presentation" data-href="/files/releases"> |
| 379 | <span class="lbl">releases</span> | 381 | <span class="lbl">releases</span> | ||
| 380 | <span class="k">section</span> | 382 | <span class="k">section</span> | ||
| 381 | </a> | 383 | </a> | ||
| 382 | </li> | 384 | </li> | ||
| 383 | <li id="cmd-o7" role="option" aria-selected="false" data-k="section actions"> | 385 | <li id="cmd-o7" role="option" aria-selected="false" data-k="section actions"> | ||
| 384 | - | <a href="/files/actions" tabindex="-1"> | 386 | + | <a role="presentation" data-href="/files/actions"> |
| 385 | <span class="lbl">actions</span> | 387 | <span class="lbl">actions</span> | ||
| 386 | <span class="k">section</span> | 388 | <span class="k">section</span> | ||
| 387 | </a> | 389 | </a> | ||
| 388 | </li> | 390 | </li> | ||
| 389 | <li id="cmd-o8" role="option" aria-selected="false" data-k="branch feature/x"> | 391 | <li id="cmd-o8" role="option" aria-selected="false" data-k="branch feature/x"> | ||
| 390 | - | <a href="/files/tree/feature/x" tabindex="-1"> | 392 | + | <a role="presentation" data-href="/files/tree/feature/x"> |
| 391 | <span class="lbl">feature/x</span> | 393 | <span class="lbl">feature/x</span> | ||
| 392 | <span class="k">branch</span> | 394 | <span class="k">branch</span> | ||
| 393 | </a> | 395 | </a> | ||
| 394 | </li> | 396 | </li> | ||
| 395 | <li id="cmd-o9" role="option" aria-selected="false" data-k="branch main"> | 397 | <li id="cmd-o9" role="option" aria-selected="false" data-k="branch main"> | ||
| 396 | - | <a href="/files/tree/main" tabindex="-1"> | 398 | + | <a role="presentation" data-href="/files/tree/main"> |
| 397 | <span class="lbl">main</span> | 399 | <span class="lbl">main</span> | ||
| 398 | <span class="k">branch</span> | 400 | <span class="k">branch</span> | ||
| 399 | </a> | 401 | </a> | ||
| 400 | </li> | 402 | </li> | ||
| 401 | <li id="cmd-o10" role="option" aria-selected="false" data-k="tag v1.0"> | 403 | <li id="cmd-o10" role="option" aria-selected="false" data-k="tag v1.0"> | ||
| 402 | - | <a href="/files/tree/v1.0" tabindex="-1"> | 404 | + | <a role="presentation" data-href="/files/tree/v1.0"> |
| 403 | <span class="lbl">v1.0</span> | 405 | <span class="lbl">v1.0</span> | ||
| 404 | <span class="k">tag</span> | 406 | <span class="k">tag</span> | ||
| 405 | </a> | 407 | </a> | ||
| 406 | </li> | 408 | </li> | ||
| 407 | <li id="cmd-o11" role="option" aria-selected="false" data-k="action turn single-key shortcuts on off keyboard"> | 409 | <li id="cmd-o11" role="option" aria-selected="false" data-k="action turn single-key shortcuts on off keyboard"> | ||
| 408 | - | <a href="#" data-fire="keys" tabindex="-1"> | 410 | + | <a role="presentation" data-fire="keys"> |
| 409 | <span class="lbl">turn single-key shortcuts off</span> | 411 | <span class="lbl">turn single-key shortcuts off</span> | ||
| 410 | <span class="k">action</span> | 412 | <span class="k">action</span> | ||
| 411 | </a> | 413 | </a> | ||
M internal/app/testdata/web/tree-subdir.html +21 -19
| @@ -114,9 +114,9 @@ | |||
| 114 | 114 | <kbd>j</kbd> | |
| 115 | 115 | <kbd>k</kbd> move · <kbd>l</kbd> open · <kbd>h</kbd> back</p> | |
| 116 | 116 | </div> | |
| 117 | - | <div id="finder" class="tree-card" hidden> | |
| 118 | - | <p id="finder-status" class="dim" aria-live="polite"> | |
| 117 | + | <p id="finder-status" class="dim" role="status"> | |
| 119 | 118 | </p> | |
| 119 | + | <div id="finder" class="tree-card" hidden> | |
| 120 | 120 | <ul id="finder-list" class="cmd-list" role="listbox" aria-label="Files"> | |
| 121 | 121 | </ul> | |
| 122 | 122 | </div> | |
| @@ -169,18 +169,20 @@ | |||
| 169 | 169 | <button type="button" class="foot-keys" data-js data-fire="help" aria-haspopup="dialog" aria-controls="panel-help" aria-keyshortcuts="?"> | |
| 170 | 170 | <kbd aria-hidden="true">?</kbd> keyboard shortcuts</button> | |
| 171 | 171 | </footer> | |
| 172 | - | <div class="hint" role="status" aria-live="polite"> | |
| 173 | - | <span class="hint-nav" :text="document.body.dataset.nav || ''"> | |
| 172 | + | <div class="hint"> | |
| 173 | + | <span aria-hidden="true" class="hint-nav" :text="document.body.dataset.nav || ''"> | |
| 174 | 174 | </span> | |
| 175 | + | <span role="status" aria-live="polite"> | |
| 175 | 176 | <span class="hint-sel" :text="document.body.dataset.sel ? document.body.dataset.sel + ' · y permalink' : ''"> | |
| 176 | 177 | </span> | |
| 177 | 178 | <span class="hint-flash" :text="document.body.dataset.flash || ''"> | |
| 178 | 179 | </span> | |
| 180 | + | </span> | |
| 179 | 181 | </div> | |
| 180 | 182 | <dialog id="panel-help" class="panel modal" aria-label="Keyboard shortcuts" hx-on:keydown="event.key === 'Escape' && (event.preventDefault(), this.close())" hx-on:click="event.target === this && this.close()"> | |
| 181 | 183 | <div class="panel-head"> | |
| 182 | 184 | <h2>Keyboard shortcuts</h2> | |
| 183 | - | <button type="button" class="panel-x" aria-label="Close" hx-on:click="closest('dialog').close()"> | |
| 185 | + | <button type="button" class="panel-x" aria-label="Close (esc)" hx-on:click="closest('dialog').close()"> | |
| 184 | 186 | <kbd>esc</kbd> close</button> | |
| 185 | 187 | </div> | |
| 186 | 188 | <div class="keys-pref"> | |
| @@ -314,7 +316,7 @@ | |||
| 314 | 316 | <div class="panel-head"> | |
| 315 | 317 | <label for="refs-filter" class="sr">filter branches and tags</label> | |
| 316 | 318 | <input id="refs-filter" type="search" placeholder="Switch branch or tag…" autocomplete="off" data-pick="#panel-refs li" hx-on:input="ermite.filter(this)"> | |
| 317 | - | <button type="button" class="panel-x" aria-label="Close" hx-on:click="closest('dialog').close()"> | |
| 319 | + | <button type="button" class="panel-x" aria-label="Close (esc)" hx-on:click="closest('dialog').close()"> | |
| 318 | 320 | <kbd>esc</kbd> | |
| 319 | 321 | </button> | |
| 320 | 322 | </div> | |
| @@ -349,79 +351,79 @@ | |||
| 349 | 351 | <div class="panel-head"> | |
| 350 | 352 | <label for="cmd-q" class="sr">go to</label> | |
| 351 | 353 | <input id="cmd-q" type="search" placeholder="Go to a section, branch, tag, file or repository…" autocomplete="off" spellcheck="false" role="combobox" aria-autocomplete="list" aria-expanded="true" aria-controls="cmd-list" aria-activedescendant="cmd-o0" hx-on:input="ermite.cmdFilter(this); ermiteFinder.palette(this)" hx-on:keydown="ermite.cmdKey(event)"> | |
| 352 | - | <button type="button" class="panel-x" aria-label="Close" hx-on:click="closest('dialog').close()"> | |
| 354 | + | <button type="button" class="panel-x" aria-label="Close (esc)" hx-on:click="closest('dialog').close()"> | |
| 353 | 355 | <kbd>esc</kbd> | |
| 354 | 356 | </button> | |
| 355 | 357 | </div> | |
| 356 | 358 | <ul id="cmd-list" class="cmd-list" role="listbox" aria-label="Targets"> | |
| 357 | 359 | <li id="cmd-o0" role="option" aria-selected="true" data-k="go home" data-cursor> | |
| 358 | - | <a href="/" tabindex="-1"> | |
| 360 | + | <a role="presentation" data-href="/"> | |
| 359 | 361 | <span class="lbl">home</span> | |
| 360 | 362 | <span class="k">go</span> | |
| 361 | 363 | </a> | |
| 362 | 364 | </li> | |
| 363 | 365 | <li id="cmd-o1" role="option" aria-selected="false" data-k="section summary"> | |
| 364 | - | <a href="/files" tabindex="-1"> | |
| 366 | + | <a role="presentation" data-href="/files"> | |
| 365 | 367 | <span class="lbl">summary</span> | |
| 366 | 368 | <span class="k">section</span> | |
| 367 | 369 | </a> | |
| 368 | 370 | </li> | |
| 369 | 371 | <li id="cmd-o2" role="option" aria-selected="false" data-k="section files"> | |
| 370 | - | <a href="/files/tree/main" tabindex="-1"> | |
| 372 | + | <a role="presentation" data-href="/files/tree/main"> | |
| 371 | 373 | <span class="lbl">files</span> | |
| 372 | 374 | <span class="k">section</span> | |
| 373 | 375 | </a> | |
| 374 | 376 | </li> | |
| 375 | 377 | <li id="cmd-o3" role="option" aria-selected="false" data-k="section commits"> | |
| 376 | - | <a href="/files/commits/main" tabindex="-1"> | |
| 378 | + | <a role="presentation" data-href="/files/commits/main"> | |
| 377 | 379 | <span class="lbl">commits</span> | |
| 378 | 380 | <span class="k">section</span> | |
| 379 | 381 | </a> | |
| 380 | 382 | </li> | |
| 381 | 383 | <li id="cmd-o4" role="option" aria-selected="false" data-k="section branches & tags"> | |
| 382 | - | <a href="/files/refs" tabindex="-1"> | |
| 384 | + | <a role="presentation" data-href="/files/refs"> | |
| 383 | 385 | <span class="lbl">branches & tags</span> | |
| 384 | 386 | <span class="k">section</span> | |
| 385 | 387 | </a> | |
| 386 | 388 | </li> | |
| 387 | 389 | <li id="cmd-o5" role="option" aria-selected="false" data-k="section merge requests"> | |
| 388 | - | <a href="/files/merge-requests" tabindex="-1"> | |
| 390 | + | <a role="presentation" data-href="/files/merge-requests"> | |
| 389 | 391 | <span class="lbl">merge requests</span> | |
| 390 | 392 | <span class="k">section</span> | |
| 391 | 393 | </a> | |
| 392 | 394 | </li> | |
| 393 | 395 | <li id="cmd-o6" role="option" aria-selected="false" data-k="section releases"> | |
| 394 | - | <a href="/files/releases" tabindex="-1"> | |
| 396 | + | <a role="presentation" data-href="/files/releases"> | |
| 395 | 397 | <span class="lbl">releases</span> | |
| 396 | 398 | <span class="k">section</span> | |
| 397 | 399 | </a> | |
| 398 | 400 | </li> | |
| 399 | 401 | <li id="cmd-o7" role="option" aria-selected="false" data-k="section actions"> | |
| 400 | - | <a href="/files/actions" tabindex="-1"> | |
| 402 | + | <a role="presentation" data-href="/files/actions"> | |
| 401 | 403 | <span class="lbl">actions</span> | |
| 402 | 404 | <span class="k">section</span> | |
| 403 | 405 | </a> | |
| 404 | 406 | </li> | |
| 405 | 407 | <li id="cmd-o8" role="option" aria-selected="false" data-k="branch feature/x"> | |
| 406 | - | <a href="/files/tree/feature/x" tabindex="-1"> | |
| 408 | + | <a role="presentation" data-href="/files/tree/feature/x"> | |
| 407 | 409 | <span class="lbl">feature/x</span> | |
| 408 | 410 | <span class="k">branch</span> | |
| 409 | 411 | </a> | |
| 410 | 412 | </li> | |
| 411 | 413 | <li id="cmd-o9" role="option" aria-selected="false" data-k="branch main"> | |
| 412 | - | <a href="/files/tree/main" tabindex="-1"> | |
| 414 | + | <a role="presentation" data-href="/files/tree/main"> | |
| 413 | 415 | <span class="lbl">main</span> | |
| 414 | 416 | <span class="k">branch</span> | |
| 415 | 417 | </a> | |
| 416 | 418 | </li> | |
| 417 | 419 | <li id="cmd-o10" role="option" aria-selected="false" data-k="tag v1.0"> | |
| 418 | - | <a href="/files/tree/v1.0" tabindex="-1"> | |
| 420 | + | <a role="presentation" data-href="/files/tree/v1.0"> | |
| 419 | 421 | <span class="lbl">v1.0</span> | |
| 420 | 422 | <span class="k">tag</span> | |
| 421 | 423 | </a> | |
| 422 | 424 | </li> | |
| 423 | 425 | <li id="cmd-o11" role="option" aria-selected="false" data-k="action turn single-key shortcuts on off keyboard"> | |
| 424 | - | <a href="#" data-fire="keys" tabindex="-1"> | |
| 426 | + | <a role="presentation" data-fire="keys"> | |
| 425 | 427 | <span class="lbl">turn single-key shortcuts off</span> | |
| 426 | 428 | <span class="k">action</span> | |
| 427 | 429 | </a> | |
| @@ -114,9 +114,9 @@ | |||||
| 114 | <kbd>j</kbd> | 114 | <kbd>j</kbd> | ||
| 115 | <kbd>k</kbd> move · <kbd>l</kbd> open · <kbd>h</kbd> back</p> | 115 | <kbd>k</kbd> move · <kbd>l</kbd> open · <kbd>h</kbd> back</p> | ||
| 116 | </div> | 116 | </div> | ||
| 117 | - | <div id="finder" class="tree-card" hidden> | 117 | + | <p id="finder-status" class="dim" role="status"> |
| 118 | - | <p id="finder-status" class="dim" aria-live="polite"> | |||
| 119 | </p> | 118 | </p> | ||
| 119 | + | <div id="finder" class="tree-card" hidden> | |||
| 120 | <ul id="finder-list" class="cmd-list" role="listbox" aria-label="Files"> | 120 | <ul id="finder-list" class="cmd-list" role="listbox" aria-label="Files"> | ||
| 121 | </ul> | 121 | </ul> | ||
| 122 | </div> | 122 | </div> | ||
| @@ -169,18 +169,20 @@ | |||||
| 169 | <button type="button" class="foot-keys" data-js data-fire="help" aria-haspopup="dialog" aria-controls="panel-help" aria-keyshortcuts="?"> | 169 | <button type="button" class="foot-keys" data-js data-fire="help" aria-haspopup="dialog" aria-controls="panel-help" aria-keyshortcuts="?"> | ||
| 170 | <kbd aria-hidden="true">?</kbd> keyboard shortcuts</button> | 170 | <kbd aria-hidden="true">?</kbd> keyboard shortcuts</button> | ||
| 171 | </footer> | 171 | </footer> | ||
| 172 | - | <div class="hint" role="status" aria-live="polite"> | 172 | + | <div class="hint"> |
| 173 | - | <span class="hint-nav" :text="document.body.dataset.nav || ''"> | 173 | + | <span aria-hidden="true" class="hint-nav" :text="document.body.dataset.nav || ''"> |
| 174 | </span> | 174 | </span> | ||
| 175 | + | <span role="status" aria-live="polite"> | |||
| 175 | <span class="hint-sel" :text="document.body.dataset.sel ? document.body.dataset.sel + ' · y permalink' : ''"> | 176 | <span class="hint-sel" :text="document.body.dataset.sel ? document.body.dataset.sel + ' · y permalink' : ''"> | ||
| 176 | </span> | 177 | </span> | ||
| 177 | <span class="hint-flash" :text="document.body.dataset.flash || ''"> | 178 | <span class="hint-flash" :text="document.body.dataset.flash || ''"> | ||
| 178 | </span> | 179 | </span> | ||
| 180 | + | </span> | |||
| 179 | </div> | 181 | </div> | ||
| 180 | <dialog id="panel-help" class="panel modal" aria-label="Keyboard shortcuts" hx-on:keydown="event.key === 'Escape' && (event.preventDefault(), this.close())" hx-on:click="event.target === this && this.close()"> | 182 | <dialog id="panel-help" class="panel modal" aria-label="Keyboard shortcuts" hx-on:keydown="event.key === 'Escape' && (event.preventDefault(), this.close())" hx-on:click="event.target === this && this.close()"> | ||
| 181 | <div class="panel-head"> | 183 | <div class="panel-head"> | ||
| 182 | <h2>Keyboard shortcuts</h2> | 184 | <h2>Keyboard shortcuts</h2> | ||
| 183 | - | <button type="button" class="panel-x" aria-label="Close" hx-on:click="closest('dialog').close()"> | 185 | + | <button type="button" class="panel-x" aria-label="Close (esc)" hx-on:click="closest('dialog').close()"> |
| 184 | <kbd>esc</kbd> close</button> | 186 | <kbd>esc</kbd> close</button> | ||
| 185 | </div> | 187 | </div> | ||
| 186 | <div class="keys-pref"> | 188 | <div class="keys-pref"> | ||
| @@ -314,7 +316,7 @@ | |||||
| 314 | <div class="panel-head"> | 316 | <div class="panel-head"> | ||
| 315 | <label for="refs-filter" class="sr">filter branches and tags</label> | 317 | <label for="refs-filter" class="sr">filter branches and tags</label> | ||
| 316 | <input id="refs-filter" type="search" placeholder="Switch branch or tag…" autocomplete="off" data-pick="#panel-refs li" hx-on:input="ermite.filter(this)"> | 318 | <input id="refs-filter" type="search" placeholder="Switch branch or tag…" autocomplete="off" data-pick="#panel-refs li" hx-on:input="ermite.filter(this)"> | ||
| 317 | - | <button type="button" class="panel-x" aria-label="Close" hx-on:click="closest('dialog').close()"> | 319 | + | <button type="button" class="panel-x" aria-label="Close (esc)" hx-on:click="closest('dialog').close()"> |
| 318 | <kbd>esc</kbd> | 320 | <kbd>esc</kbd> | ||
| 319 | </button> | 321 | </button> | ||
| 320 | </div> | 322 | </div> | ||
| @@ -349,79 +351,79 @@ | |||||
| 349 | <div class="panel-head"> | 351 | <div class="panel-head"> | ||
| 350 | <label for="cmd-q" class="sr">go to</label> | 352 | <label for="cmd-q" class="sr">go to</label> | ||
| 351 | <input id="cmd-q" type="search" placeholder="Go to a section, branch, tag, file or repository…" autocomplete="off" spellcheck="false" role="combobox" aria-autocomplete="list" aria-expanded="true" aria-controls="cmd-list" aria-activedescendant="cmd-o0" hx-on:input="ermite.cmdFilter(this); ermiteFinder.palette(this)" hx-on:keydown="ermite.cmdKey(event)"> | 353 | <input id="cmd-q" type="search" placeholder="Go to a section, branch, tag, file or repository…" autocomplete="off" spellcheck="false" role="combobox" aria-autocomplete="list" aria-expanded="true" aria-controls="cmd-list" aria-activedescendant="cmd-o0" hx-on:input="ermite.cmdFilter(this); ermiteFinder.palette(this)" hx-on:keydown="ermite.cmdKey(event)"> | ||
| 352 | - | <button type="button" class="panel-x" aria-label="Close" hx-on:click="closest('dialog').close()"> | 354 | + | <button type="button" class="panel-x" aria-label="Close (esc)" hx-on:click="closest('dialog').close()"> |
| 353 | <kbd>esc</kbd> | 355 | <kbd>esc</kbd> | ||
| 354 | </button> | 356 | </button> | ||
| 355 | </div> | 357 | </div> | ||
| 356 | <ul id="cmd-list" class="cmd-list" role="listbox" aria-label="Targets"> | 358 | <ul id="cmd-list" class="cmd-list" role="listbox" aria-label="Targets"> | ||
| 357 | <li id="cmd-o0" role="option" aria-selected="true" data-k="go home" data-cursor> | 359 | <li id="cmd-o0" role="option" aria-selected="true" data-k="go home" data-cursor> | ||
| 358 | - | <a href="/" tabindex="-1"> | 360 | + | <a role="presentation" data-href="/"> |
| 359 | <span class="lbl">home</span> | 361 | <span class="lbl">home</span> | ||
| 360 | <span class="k">go</span> | 362 | <span class="k">go</span> | ||
| 361 | </a> | 363 | </a> | ||
| 362 | </li> | 364 | </li> | ||
| 363 | <li id="cmd-o1" role="option" aria-selected="false" data-k="section summary"> | 365 | <li id="cmd-o1" role="option" aria-selected="false" data-k="section summary"> | ||
| 364 | - | <a href="/files" tabindex="-1"> | 366 | + | <a role="presentation" data-href="/files"> |
| 365 | <span class="lbl">summary</span> | 367 | <span class="lbl">summary</span> | ||
| 366 | <span class="k">section</span> | 368 | <span class="k">section</span> | ||
| 367 | </a> | 369 | </a> | ||
| 368 | </li> | 370 | </li> | ||
| 369 | <li id="cmd-o2" role="option" aria-selected="false" data-k="section files"> | 371 | <li id="cmd-o2" role="option" aria-selected="false" data-k="section files"> | ||
| 370 | - | <a href="/files/tree/main" tabindex="-1"> | 372 | + | <a role="presentation" data-href="/files/tree/main"> |
| 371 | <span class="lbl">files</span> | 373 | <span class="lbl">files</span> | ||
| 372 | <span class="k">section</span> | 374 | <span class="k">section</span> | ||
| 373 | </a> | 375 | </a> | ||
| 374 | </li> | 376 | </li> | ||
| 375 | <li id="cmd-o3" role="option" aria-selected="false" data-k="section commits"> | 377 | <li id="cmd-o3" role="option" aria-selected="false" data-k="section commits"> | ||
| 376 | - | <a href="/files/commits/main" tabindex="-1"> | 378 | + | <a role="presentation" data-href="/files/commits/main"> |
| 377 | <span class="lbl">commits</span> | 379 | <span class="lbl">commits</span> | ||
| 378 | <span class="k">section</span> | 380 | <span class="k">section</span> | ||
| 379 | </a> | 381 | </a> | ||
| 380 | </li> | 382 | </li> | ||
| 381 | <li id="cmd-o4" role="option" aria-selected="false" data-k="section branches & tags"> | 383 | <li id="cmd-o4" role="option" aria-selected="false" data-k="section branches & tags"> | ||
| 382 | - | <a href="/files/refs" tabindex="-1"> | 384 | + | <a role="presentation" data-href="/files/refs"> |
| 383 | <span class="lbl">branches & tags</span> | 385 | <span class="lbl">branches & tags</span> | ||
| 384 | <span class="k">section</span> | 386 | <span class="k">section</span> | ||
| 385 | </a> | 387 | </a> | ||
| 386 | </li> | 388 | </li> | ||
| 387 | <li id="cmd-o5" role="option" aria-selected="false" data-k="section merge requests"> | 389 | <li id="cmd-o5" role="option" aria-selected="false" data-k="section merge requests"> | ||
| 388 | - | <a href="/files/merge-requests" tabindex="-1"> | 390 | + | <a role="presentation" data-href="/files/merge-requests"> |
| 389 | <span class="lbl">merge requests</span> | 391 | <span class="lbl">merge requests</span> | ||
| 390 | <span class="k">section</span> | 392 | <span class="k">section</span> | ||
| 391 | </a> | 393 | </a> | ||
| 392 | </li> | 394 | </li> | ||
| 393 | <li id="cmd-o6" role="option" aria-selected="false" data-k="section releases"> | 395 | <li id="cmd-o6" role="option" aria-selected="false" data-k="section releases"> | ||
| 394 | - | <a href="/files/releases" tabindex="-1"> | 396 | + | <a role="presentation" data-href="/files/releases"> |
| 395 | <span class="lbl">releases</span> | 397 | <span class="lbl">releases</span> | ||
| 396 | <span class="k">section</span> | 398 | <span class="k">section</span> | ||
| 397 | </a> | 399 | </a> | ||
| 398 | </li> | 400 | </li> | ||
| 399 | <li id="cmd-o7" role="option" aria-selected="false" data-k="section actions"> | 401 | <li id="cmd-o7" role="option" aria-selected="false" data-k="section actions"> | ||
| 400 | - | <a href="/files/actions" tabindex="-1"> | 402 | + | <a role="presentation" data-href="/files/actions"> |
| 401 | <span class="lbl">actions</span> | 403 | <span class="lbl">actions</span> | ||
| 402 | <span class="k">section</span> | 404 | <span class="k">section</span> | ||
| 403 | </a> | 405 | </a> | ||
| 404 | </li> | 406 | </li> | ||
| 405 | <li id="cmd-o8" role="option" aria-selected="false" data-k="branch feature/x"> | 407 | <li id="cmd-o8" role="option" aria-selected="false" data-k="branch feature/x"> | ||
| 406 | - | <a href="/files/tree/feature/x" tabindex="-1"> | 408 | + | <a role="presentation" data-href="/files/tree/feature/x"> |
| 407 | <span class="lbl">feature/x</span> | 409 | <span class="lbl">feature/x</span> | ||
| 408 | <span class="k">branch</span> | 410 | <span class="k">branch</span> | ||
| 409 | </a> | 411 | </a> | ||
| 410 | </li> | 412 | </li> | ||
| 411 | <li id="cmd-o9" role="option" aria-selected="false" data-k="branch main"> | 413 | <li id="cmd-o9" role="option" aria-selected="false" data-k="branch main"> | ||
| 412 | - | <a href="/files/tree/main" tabindex="-1"> | 414 | + | <a role="presentation" data-href="/files/tree/main"> |
| 413 | <span class="lbl">main</span> | 415 | <span class="lbl">main</span> | ||
| 414 | <span class="k">branch</span> | 416 | <span class="k">branch</span> | ||
| 415 | </a> | 417 | </a> | ||
| 416 | </li> | 418 | </li> | ||
| 417 | <li id="cmd-o10" role="option" aria-selected="false" data-k="tag v1.0"> | 419 | <li id="cmd-o10" role="option" aria-selected="false" data-k="tag v1.0"> | ||
| 418 | - | <a href="/files/tree/v1.0" tabindex="-1"> | 420 | + | <a role="presentation" data-href="/files/tree/v1.0"> |
| 419 | <span class="lbl">v1.0</span> | 421 | <span class="lbl">v1.0</span> | ||
| 420 | <span class="k">tag</span> | 422 | <span class="k">tag</span> | ||
| 421 | </a> | 423 | </a> | ||
| 422 | </li> | 424 | </li> | ||
| 423 | <li id="cmd-o11" role="option" aria-selected="false" data-k="action turn single-key shortcuts on off keyboard"> | 425 | <li id="cmd-o11" role="option" aria-selected="false" data-k="action turn single-key shortcuts on off keyboard"> | ||
| 424 | - | <a href="#" data-fire="keys" tabindex="-1"> | 426 | + | <a role="presentation" data-fire="keys"> |
| 425 | <span class="lbl">turn single-key shortcuts off</span> | 427 | <span class="lbl">turn single-key shortcuts off</span> | ||
| 426 | <span class="k">action</span> | 428 | <span class="k">action</span> | ||
| 427 | </a> | 429 | </a> | ||
Comments0 open / 0
no comments yet.