Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
5b74a7c
frontend/aria: get started annotating elements
haraldschilly Oct 24, 2025
a68d6d3
Merge remote-tracking branch 'origin/master' into aria-20251024
haraldschilly Oct 28, 2025
2ece112
frontend/aria: Complete Phase 10 - Editor Frame Infrastructure
haraldschilly Oct 28, 2025
f7b51b0
docs/aria: Add best practices for direct ARIA on components
haraldschilly Oct 28, 2025
c15b155
Merge remote-tracking branch 'origin/master' into aria-20251024
haraldschilly Oct 30, 2025
0fc1c9e
frontend/project-page: Add tab semantics to activity bar and file tab…
haraldschilly Oct 30, 2025
7ea5f91
frontend/app: Add ARIA semantics to app shell and navigation (Phase 1…
haraldschilly Oct 30, 2025
daa7260
frontend/aria: ARIA for app itself, phase 12/P1
haraldschilly Oct 30, 2025
13bec8c
frontend/aria: make top projects tab a landmark and make tab+return work
haraldschilly Nov 6, 2025
26c30b7
frontend/aria: start making autoFocus configurable
haraldschilly Nov 6, 2025
0a92469
frontend/aria: steps towards focussing on content
haraldschilly Nov 7, 2025
f66337d
frontend/aria: hotkey nav
haraldschilly Nov 7, 2025
db006b2
Merge remote-tracking branch 'origin/master' into aria-20251024
haraldschilly Nov 10, 2025
7e62e50
frontend/aria/hotkey: improve dialog …
haraldschilly Nov 11, 2025
8a47776
frontend/aria: page in general, lighthouse accessibility testing, ...
haraldschilly Nov 13, 2025
24cb036
frontend/projects/aria: keyboard nav + aria tweaks
haraldschilly Nov 13, 2025
41a841e
frontend/aria/hotkey: compute tree only when dialog is visible
haraldschilly Nov 14, 2025
436f9bd
frontend/aria/hotkey: toggle side chat with 0
haraldschilly Nov 14, 2025
e90aaf8
frontend/aria/hotkey: recent files and bugfixes
haraldschilly Nov 14, 2025
9e0a0f3
Merge remote-tracking branch 'origin/master' into aria-20251024
haraldschilly Nov 17, 2025
ed156c4
dev/ARIA: Shorten WCAG AA section and improve Lighthouse documentation
haraldschilly Nov 17, 2025
4f04af8
frontend/aria: Fix top navigation layout and note about zooming, debu…
haraldschilly Nov 17, 2025
85e6e76
Merge upstream master: resolve chat conflicts with ARIA improvements
haraldschilly Nov 20, 2025
bfbfca0
Merge remote-tracking branch 'origin/master' into aria-20251024
haraldschilly Dec 11, 2025
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
Prev Previous commit
Next Next commit
frontend/aria: hotkey nav
  • Loading branch information
haraldschilly committed Nov 10, 2025
commit f66337d7a90e4fedb25cb8e96cb6253817e6f3d1
711 changes: 706 additions & 5 deletions src/dev/ARIA.md

Large diffs are not rendered by default.

74 changes: 74 additions & 0 deletions src/packages/frontend/account/account-preferences-appearance.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ import {
get_dark_mode_config,
} from "./dark-mode";
import { EditorSettingsColorScheme } from "./editor-settings/color-schemes";
import { HotkeyDelayTest } from "./hotkey-delay-test";
import { HotkeySelector } from "./hotkey-selector";
import { I18NSelector, I18N_MESSAGE, I18N_TITLE } from "./i18n-selector";
import { OtherSettings } from "./other-settings";
import { TerminalSettings } from "./terminal-settings";
Expand Down Expand Up @@ -241,6 +243,78 @@ export function AccountPreferencesAppearance() {
</HelpIcon>
</div>
</LabeledRow>
<LabeledRow
label={
<>
<Icon name="flash" /> Quick Navigation Hotkey
</>
}
>
<HotkeySelector
value={other_settings.get("quick_nav_hotkey") ?? "shift+shift"}
onChange={(value) => on_change("quick_nav_hotkey", value)}
style={{ width: 200 }}
/>
</LabeledRow>
{(other_settings.get("quick_nav_hotkey") ?? "shift+shift") ===
"shift+shift" && (
<LabeledRow
label={
<>
<Icon name="clock" /> Hotkey Delay (milliseconds)
</>
}
>
<div style={{ display: "flex", gap: 16, alignItems: "stretch" }}>
<div
style={{
flex: "1 1 auto",
display: "flex",
alignItems: "center",
}}
>
<Slider
min={100}
max={800}
step={100}
value={other_settings.get("quick_nav_hotkey_delay") ?? 300}
onChange={(value) =>
on_change("quick_nav_hotkey_delay", value)
}
style={{ flex: 1 }}
marks={Object.fromEntries(
Array.from({ length: 8 }, (_, i) => (i + 1) * 100).map(
(ms) => [ms, `${ms}ms`],
),
)}
/>
<span
style={{
minWidth: 60,
textAlign: "right",
fontWeight: 500,
color: COLORS.GRAY_M,
marginLeft: 12,
}}
>
{other_settings.get("quick_nav_hotkey_delay") ?? 300}ms
</span>
</div>
<div
style={{
flex: "0 1 auto",
display: "flex",
flexDirection: "column",
gap: 8,
}}
>
<HotkeyDelayTest
delayMs={other_settings.get("quick_nav_hotkey_delay") ?? 300}
/>
</div>
</div>
</LabeledRow>
)}
<Switch
checked={!!other_settings.get("auto_focus")}
onChange={(e) => on_change("auto_focus", e.target.checked)}
Expand Down
158 changes: 158 additions & 0 deletions src/packages/frontend/account/account-preferences-config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
/*
* This file is part of CoCalc: Copyright © 2025 Sagemath, Inc.
* License: MS-RSL – see LICENSE.md for details
*/

/**
* Shared configuration for account menu items and preferences sub-tabs
* Used by both account-page.tsx and hotkey quick navigation
*/

export interface AccountMenuItem {
id: string; // Menu item ID (e.g., "subscriptions", "preferences-appearance")
key: string; // Tree node key (e.g., "account-subscriptions")
label: string; // Display name
icon?: string; // Icon name (or undefined for special components like AIAvatar)
useAIAvatar?: boolean; // Special case for AI preferences
isPreferencesSubTab?: boolean; // True if this is a sub-tab under Preferences
}

/**
* Preferences sub-tabs (nested under "Preferences")
*/
export const PREFERENCES_SUB_TABS: AccountMenuItem[] = [
{
id: "preferences-appearance",
key: "account-preferences-appearance",
label: "Appearance",
icon: "eye",
isPreferencesSubTab: true,
},
{
id: "preferences-editor",
key: "account-preferences-editor",
label: "Editor",
icon: "edit",
isPreferencesSubTab: true,
},
{
id: "preferences-keyboard",
key: "account-preferences-keyboard",
label: "Keyboard",
icon: "keyboard",
isPreferencesSubTab: true,
},
{
id: "preferences-ai",
key: "account-preferences-ai",
label: "AI",
useAIAvatar: true,
isPreferencesSubTab: true,
},
{
id: "preferences-communication",
key: "account-preferences-communication",
label: "Communication",
icon: "comments",
isPreferencesSubTab: true,
},
{
id: "preferences-keys",
key: "account-preferences-keys",
label: "SSH and API Keys",
icon: "key",
isPreferencesSubTab: true,
},
{
id: "preferences-other",
key: "account-preferences-other",
label: "Other",
icon: "sliders",
isPreferencesSubTab: true,
},
];

/**
* Main account menu items (top-level, excluding preferences which are nested)
*/
export const ACCOUNT_MAIN_MENU_ITEMS: AccountMenuItem[] = [
{
id: "index",
key: "account-index",
label: "Settings",
icon: "settings",
},
{
id: "profile",
key: "account-profile",
label: "Profile",
icon: "user",
},
// Preferences is handled separately as it has sub-items
{
id: "subscriptions",
key: "account-subscriptions",
label: "Subscriptions",
icon: "calendar",
},
{
id: "licenses",
key: "account-licenses",
label: "Licenses",
icon: "key",
},
{
id: "payg",
key: "account-payg",
label: "Pay as you Go",
icon: "line-chart",
},
{
id: "upgrades",
key: "account-upgrades",
label: "Upgrades",
icon: "arrow-circle-up",
},
{
id: "purchases",
key: "account-purchases",
label: "Purchases",
icon: "money-check",
},
{
id: "payments",
key: "account-payments",
label: "Payments",
icon: "credit-card",
},
{
id: "payment-methods",
key: "account-payment-methods",
label: "Payment Methods",
icon: "credit-card",
},
{
id: "statements",
key: "account-statements",
label: "Statements",
icon: "calendar-week",
},
{
id: "cloud-filesystems",
key: "account-cloud-filesystems",
label: "Cloud Filesystems",
icon: "cloud",
},
{
id: "public-paths",
key: "account-public-paths",
label: "Public Paths",
icon: "share-square",
},
{
id: "support",
key: "account-support",
label: "Support",
icon: "question-circle",
},
];
Loading