Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .codex/config.toml
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# sandbox_mode/approval_policy are intentionally left unset here: committing
# "danger-full-access" + "never" grants full filesystem/network access with no
# approval gate to anyone who clones this repo or runs Codex in CI. Set these
# in your local, untracked Codex config instead if you want that locally.
Comment thread
tonythethompson marked this conversation as resolved.
[mcp_servers.tessl]
type = "stdio"
command = "tessl"
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ _winget-test/
.claude/
.serena/
.oac.json
ACCESSIBILITY.md
QuickShell/QuickShell_Dev.cer
QuickShell/QuickShell_Dev.pfx
QuickShell/bin/
Expand Down Expand Up @@ -44,3 +43,4 @@ pr9-threads.json
/.bob/.bob-errors
pr9-comments-latest.json
tessl.json
/.bob
121 changes: 121 additions & 0 deletions ACCESSIBILITY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
# Accessibility testing for Quick Shell

Quick Shell is a **PowerToys Command Palette extension**. Most UI (search box, list chrome, keyboard routing) is rendered by Command Palette. This checklist covers what **you** ship: list item text, context actions, Adaptive Card forms, and the folder picker.

Only check **"This product has been tested to meet accessibility guidelines"** in Partner Center if you have verified the scenarios below. See [Accessibility in the Store](https://learn.microsoft.com/en-us/windows/apps/design/accessibility/accessibility-in-the-store) and [Product declarations](https://learn.microsoft.com/en-us/windows/apps/publish/publish-your-app/msix/product-declarations).

## Quick start

1. Install the build you plan to ship (MSIX recommended):

```powershell
powershell -ExecutionPolicy Bypass -File scripts/deploy.ps1
```

2. In PowerToys Command Palette, run **Reload Command Palette Extension**.

3. Open Windows accessibility tools:

```powershell
powershell -ExecutionPolicy Bypass -File scripts/open-a11y-settings.ps1
```

## Primary scenarios to test

Test each flow with **keyboard only**, then again with **Narrator** on.

| # | Scenario | Pass criteria |
|---|----------|---------------|
| 1 | Search and open a shortcut | Arrow keys select a row; Enter launches the terminal |
| 2 | Create a new shortcut | Enter on **Create new shortcut**; Tab through all fields; Save works |
| 3 | Edit / favorite / duplicate / delete | Context shortcuts below work on a selected row; **Ctrl+K** opens full More menu |
| 4 | Open as administrator | Available in More actions when not always-admin |
| 5 | Browse for folder | Browse button activatable; folder picker usable with keyboard |
| 6 | Reload shortcuts | **Refresh terminals** runs without error |

## Keyboard navigation (Command Palette)

| Key | Action |
|-----|--------|
| `Win+Alt+Space` | Open Command Palette (default; may differ in your PowerToys settings) |
| Arrow keys | Move selection in the results list |
| `Enter` | Run the selected command |
| `Ctrl+Enter` | Open as administrator (when available) |
| `Ctrl+E` | Edit shortcut (main list only) |
| `Ctrl+P` | Favorite or unfavorite shortcut |
| `Ctrl+Shift+D` | Duplicate shortcut |
| `Ctrl+Z` | Undo |
| `Ctrl+Y` | Redo |
| `Ctrl+Alt+Up` / `Ctrl+Alt+Down` | Move favorite shortcut up or down |
| `Ctrl+Delete` | Delete shortcut |
| `Ctrl+K` | **More** menu (all actions) |
| `Tab` (in More menu) | Move focus from search box into the action list (required for Narrator to read each item) |
| `Esc` | Go back / close |

**Note:** `Shift+F10` opens the context menu for the **focused** control. If focus is in the search box, you will see Paste/Undo — not shortcut actions. Use arrow keys to select a list item, then `Ctrl+K` for extension actions.

## Narrator

Turn on Narrator (`Win+Ctrl+Enter`) and verify:

- [ ] Shortcut **Title** is announced clearly (the shortcut name)
- [ ] **Subtitle** adds useful context without being unreadable noise
- [ ] Form fields announce their **labels** (Name, Search keyword, Folder path, Command, Terminal)
- [ ] **Browse folder** and **Save shortcut** are identifiable by name
- [ ] Save/delete/favorite actions give understandable feedback (toast or list update)

### More menu (`Ctrl+K`) and Narrator

When the More menu opens, focus starts in the **Search commands...** box at the bottom. In that state, Up/Down only changes the highlighted row; Narrator may not read each option.

**Press `Tab` once** to move focus into the action list. After that, Narrator announces each item as you move with Up/Down.

**Other options (no menu required)**

Direct shortcuts on a selected shortcut row still work without opening More:

- `Ctrl+E` edit, `Ctrl+P` favorite, `Ctrl+Shift+D` duplicate, `Ctrl+Delete` delete, `Ctrl+Enter` open as admin, `Ctrl+Z` / `Ctrl+Y` undo/redo

You can also highlight a row and press `Enter` from the filter box to run it, even if Narrator has not read the name yet.

## Visual accessibility

- [ ] Test at **125%** and **150%** display scale — form text and list rows are not clipped
- [ ] Test at least one **contrast theme** (Aquatic or Desert) — list and form remain readable
- [ ] Information is not conveyed by **color alone** (e.g. **Admin** and **Favorite** badges have tooltips, not only icon/color)
- [ ] Body text meets roughly **4.5:1** contrast where you control styling (Adaptive Card defaults are usually fine; avoid custom low-contrast HTML in cards)

## Automated tools (limited scope)

| Tool | What to run it on |
|------|-------------------|
| [Accessibility Insights for Windows](https://accessibilityinsights.io/docs/windows/overview/) | Folder browse dialog (WinForms) |
| [Inspect](https://learn.microsoft.com/en-us/windows/win32/winauto/inspect-objects) | Folder picker UIA tree |
| UIAVerify | Same — resolve Priority 1 issues if reported |

Command Palette list UI runs inside PowerToys; you cannot attach Insights to it from the Quick Shell process. Rely on keyboard + Narrator for CmdPal chrome.

## Extension content checklist

- [ ] Every shortcut has a descriptive **Name** (not only an abbreviation)
- [ ] Adaptive Card inputs have **labels** and **errorMessage** on required fields
- [ ] Folder picker can be completed without a mouse
- [ ] More actions reachable via **Ctrl+K** on a selected shortcut
- [ ] Primary scenarios tested with Narrator
- [ ] Primary scenarios tested at increased DPI and one high-contrast theme

## Store submission notes

In **Notes for certification**, include:

1. Requires **Microsoft PowerToys** with **Command Palette** enabled.
2. Install Quick Shell, run **Reload Command Palette Extension**, search **Quick Shell**.
3. Test create shortcut, open shortcut, and **Ctrl+K** More actions.

Declare accessibility only for **your extension content** (names, forms, picker). You are not certifying all of Command Palette — that shell is owned by PowerToys.

## References

- [Develop accessible Windows apps](https://learn.microsoft.com/en-us/windows/apps/develop/accessibility)
- [Accessibility testing](https://learn.microsoft.com/en-us/windows/apps/develop/accessibility/accessibility-testing)
- [Accessibility checklist (Microsoft)](https://learn.microsoft.com/en-us/windows/apps/design/accessibility/accessibility-checklist)
12 changes: 10 additions & 2 deletions QuickShell.Core.Tests/ShortcutDisplayTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -95,9 +95,17 @@ public void GetLaunchContextMenuTitle_UsesOpenFolderWhenCommandAndLabelBlank()
}

[Fact]
public void CopyPath_UsesCopyToGlyph_NotIncomingCall()
public void CopyPath_UsesCopyGlyph_NotCopyTo()
{
Assert.Equal("\uF413", ShortcutGlyphs.CopyPath);
Assert.Equal("\uE8C8", ShortcutGlyphs.CopyPath);
Assert.NotEqual("\uF413", ShortcutGlyphs.CopyPath);
Assert.NotEqual("\uE77E", ShortcutGlyphs.CopyPath);
}

[Fact]
public void Duplicate_UsesCopyToGlyph()
{
Assert.Equal("\uF413", ShortcutGlyphs.Duplicate);
Assert.NotEqual("\uE8C8", ShortcutGlyphs.Duplicate);
}
}
Loading
Loading