Shortcuts
This runbook covers keyboard shortcut parity in Compass. The principle: anything a user can do with a mouse should also be doable with the keyboard.
Welcome, Block Party opt-in, billing-gate behavior, sidebar tip mute, and one-surface-at-a-time rules are in Onboarding.
The product rules behind those bindings — hold-Mod discovery, targeting any on-screen field, hints that never lie — are Shortcut Commandments.
Source of Truth
Two files matter, at different depths:
packages/core/src/shortcuts/shortcuts.registry.tsis the display registry: every shortcut's legend entry (label, keys, section, context), withapps/calendar-web/src/shortcuts/shortcuts.registry.tsfiltering it for the current view. When adding a shortcut, update the core registry and it appears in the legend overlay (opened with?), which is searchable and context-aware. The full, always-current shortcut list is that overlay — this doc deliberately does not duplicate it.packages/core/src/shortcuts/keymap.tsis the runtime binding source for the shortcuts the onboarding flow teaches; the real handlers, the showcase hint keycaps, and the registry's legend rows all derive from it, so remapping a taught shortcut is a one-file edit. Shortcuts outside the keymap bind at their handler sites (the Day/Week view keys live inuseCalendarViewShortcuts.ts).
Adoption is measured with shortcut_invoked. Taught outcomes still send outcome: "succeeded" and action_id. Every legend row also records shortcut_id (the registry id) and section with outcome: "handled" when its handler runs. Query production adoption with:
SELECT properties.shortcut_id, count(), uniq(person_id)
FROM events
WHERE event = 'shortcut_invoked'
AND timestamp >= now() - INTERVAL 30 DAY
AND properties.environment = 'production'
GROUP BY 1
ORDER BY 2 DESC
Scope
Use this guide to validate:
- navigating between views with the keyboard (D, W)
- navigating between days in Day view (J, K, T)
- navigating between weeks in Week view (J, K, T)
- scrolling the timed grid with PageUp / PageDown and Alt+ArrowUp / Alt+ArrowDown, including while an event is focused
- opening and using the command palette (Cmd+K), including undo/redo rows
- creating events with keyboard shortcuts (C, A in both Day and Week view)
- editing events with the same keys in Day and Week (Delete, Shift+arrows, draft arrows)
- focusing events with arrow keys (chronological in Day, spatial in Week), including the first arrow when nothing is focused (nearest to now)
- toggling event-jump chips (
F); the mouse is permanently inert (Compass is keyboard-only) - toggling the sidebar (])
- undoing / redoing with the keyboard (Cmd+Z / Cmd+Shift+Z)
- confirming Settings > Meeting hold-Mod reveals only sidebar digits and Save Enter
- confirming the first-run Meeting wizard Continue / Back keys (Enter, Esc, K, J)
- confirming that shortcuts do not fire while typing in inputs
- hiding and showing an event with
x, from the event menu, and confirming the strip stays focusable
Do not use this guide to validate:
- full event CRUD flows (see
events.md)
Setup
- Start the app with
bun run dev:web. - Log in with any account.
- Ensure no input or textarea is focused unless a scenario requires it.
Helpful notes:
- All shortcuts are context-aware. They do not fire when the user is typing in a text input, textarea, or form field — except Cmd+K / Ctrl+K, which opens the command palette from anywhere.
- Shortcuts shown as
Cmdapply on Mac. On Windows/Linux, useCtrlin place ofCmdunless noted otherwise. Modmeans Command on Mac and Control on Windows/Linux.Metain key combinations refers to the Command key on Mac and the Windows key on Windows.
Scenario 1: Navigate Between Views With The Keyboard
UX
Pressing D or W from anywhere in the app (while not focused in an input) navigates to Day view or Week view respectively.
Steps
- Navigate to
/week. - Press
D. - Press
W.
Expected Results
Dnavigates to/day.Wnavigates to/week.- Each transition happens without a full page reload.
Scenario 2: Navigate Between Days In Day View (J, K, T)
UX
In Day view, J goes back one day, K goes forward one day, and T returns to today (or scrolls to the current time if already on today).
Steps
- Navigate to
/day. - Press
Kthree times. - Press
Jtwice. - Note the current date shown, then press
T.
Expected Results
- Each
Kadvances the view by one day. - Each
Jmoves the view back one day. Treturns the view to today's date regardless of current position.- If already on today,
Tscrolls the grid to the current time.
Scenario 3: Navigate Between Weeks In Week View (J, K, T)
UX
In Week view, J goes to the previous week, K goes to the next week, and T returns to the current week.
Steps
- Navigate to
/week. - Press
Ktwice to advance two weeks. - Press
Jonce to go back one week. - Press
T.
Expected Results
- Each
Kadvances the view by one week. - Each
Jmoves the view back one week. Treturns the view to the current week.
Scenario 4: Open And Use The Command Palette (Cmd+K)
UX
Pressing Cmd+K opens the command palette from any view, including while a text input is focused. The palette lists common actions. Pressing Escape closes it.
Steps
- Navigate to
/week. - Press Cmd+K (or Ctrl+K on Windows).
- Observe the palette contents.
- Use the search/filter to type "event".
- Select "Create event" from the palette.
- Press Cmd+K again and then Escape.
Expected Results
- The command palette opens immediately.
- Items include: Go to Today, Go to Day or Go to Week (the view you are not on), Go to Life, Show shortcuts, Play Block Party (practice shortcuts), Show welcome guide, Create event, Create all-day event, Undo last change, Redo last change, Toggle sidebar, Focus month picker, Open Up Next event, Join Up Next meeting, Show second timezone, Settings, Log Out (when signed in), Book personal onboarding. Selecting a row that advertises a shortcut pulses the top-center hint "Next time, press …" unless tips are off. The search field placeholder is "Search commands, events, or type a date". Typing two or more characters that match an event title adds an Events section (title plus weekday, date, and time or All day). A query that parses as a date pins a "Go to …" row first; Enter navigates to that date and selects its column. Bare
Gopens the palette for this. - Undo / Redo rows show their keycaps and stay disabled when there is no history.
- Google Calendar connection status and actions appear in the sidebar, not the command palette.
- Typing filters the list.
- Selecting "Create event" opens the event creation form.
- Pressing Escape closes the palette without taking action.
- Cmd+K works even when a text input elsewhere has focus.
Scenario 5: Create An Event With A Keyboard Shortcut (C In Week View)
UX
Pressing C in Week view opens a new event creation form on the day the user is looking at: a selected day column (Shift + its day letter, see Scenario 12), else the day of the focused event, else today, else the first visible day. The draft starts at the current hour on that day. The timed form has no date field, so this is how a draft lands on the right day. Creating spends the column selection, so the highlight clears.
Steps
- Navigate to
/week. - Ensure no input is focused.
- Press
C. Discard the draft. - Press
Kto go to next week, then hold Shift and press the letter for an empty day (for exampleShift+Rfor Thursday), then pressC. - Discard, focus an event on another day with
Uand the arrows, then pressC.
Expected Results
- From idle on the current week, the form opens with the draft on today.
- After selecting a column, the form opens with the draft in that column, and the column highlight clears.
- With an event focused, the draft lands on that event's day.
Shift+Cand Shift+Arrow place-create follow the same day.
Scenario 6: Create An All-Day Event With A Keyboard Shortcut (Shift+C In Week View)
UX
Pressing Shift+C in Week view opens a new event form pre-configured as an all-day event.
Steps
- Navigate to
/week. - Ensure no input is focused.
- Press
Shift+C.
Expected Results
- The event creation form opens with the all-day toggle already enabled.
- No start/end time fields are shown.
Scenario 7: Create An Event With A Keyboard Shortcut (C In Day View)
UX
Pressing C in Day view opens a new timed event form, the same behavior as C in Week view.
Steps
- Navigate to
/day. - Ensure no input is focused.
- Press
C.
Expected Results
- The event creation form opens.
Scenario 8: Toggle The Sidebar (])
UX
Pressing ] toggles the sidebar open or closed from any view.
Steps
- Navigate to
/week. - Press
]to close the sidebar (if open). - Press
]again to reopen it. - Navigate to
/dayand repeat.
Expected Results
]toggles the sidebar in both Week view and Day view.- The calendar grid expands to fill the space when the sidebar is closed.
Scenario 9: Delete A Focused Event With The Keyboard (Delete)
UX
Pressing Delete while an event is focused in the Day or Week grid deletes it — equivalent to a mouse-driven delete action. Hover alone is not enough; the event must be focused.
Steps
- Navigate to
/week. - Focus an event in the grid (click it, press
U, or press any Arrow key when nothing is focused). - Press Delete.
- Navigate to
/dayand repeat with a focused event.
Expected Results
- The event is removed from the grid in both views.
- An undo toast appears.
- Pressing Delete with no focused event does nothing (even if the mouse is hovering an event).
Scenario 10: Edit A Focused Event Field With A Sequence (E then T)
UX
With a grid event focused and no form field being typed in, pressing E then T within a short window opens that event's form (if needed) and places the caret in the title. The same E-prefix pattern targets description (D), start (S), end (E), recurrence (R), guests (A), color (C), and RSVP / Going (G). Account (calendar picker) is Mod+5 only. RSVP is Mod+- while the form is open.
Steps
- Navigate to
/week. - Create a timed event and save it.
- Focus the event card (click it once is enough if the form closes first, or press
Uthen arrows). - Press
EthenTquickly. - Repeat on
/daywith a focused event.
Expected Results
- The event form opens with the title input focused and the caret ready to type.
- Bare
Ealone, orEfollowed by an unmapped key, does nothing visible and does not block the next unrelated shortcut. - While typing in any input, or while a modal holds the app lock, the sequences do nothing.
- With no event focused, the sequences do nothing.
Scenario 11: Undo With The Keyboard (Cmd+Z / Ctrl+Z)
UX
After deleting or moving an event, pressing Cmd+Z (Mac) or Ctrl+Z (Windows/Linux) undoes it. After a series-wide edit or delete (scope All Events or This and Following), Cmd+Z toasts Can't undo the last change and leaves the previous undoable action intact; a second press then undoes that earlier action. Empty history toasts Nothing to undo.
Steps
- Delete an event (see Scenario 9).
- Immediately press Cmd+Z (Mac) or Ctrl+Z (Windows/Linux).
- Edit a recurring event and apply it to All Events, then press Cmd+Z, then press Cmd+Z again.
Expected Results
- The deleted event is restored with its original properties.
- Pressing Cmd+Shift+Z (or Ctrl+Shift+Z) immediately after redoes the undone action.
- After the series-wide edit, the first Cmd+Z toasts
Can't undo the last changeand does not reverse an older, unrelated change. The second Cmd+Z undoes the earlier delete or edit.
Scenario 12: Jump Focus To An Event By Day Prefix
UX
Pressing F shows event-jump chips. Week view chips use day prefixes (SU/M/T/W/R/F/SA) plus a per-day index (W4, SU1). Day view uses numeric chips (1, 2, …). Pressing a day letter highlights that column and focuses its first event, if it has one; an empty column is still selected, so C, Shift+C, Shift+Arrow, and typed digits (1400) create on it. A following digit focuses that index. From idle, a column is entered with Shift and its day letter (Shift+W, Shift+S then U/A for the weekend), which always works: bare T stays “go to today”, bare M stays “open event menu”, and bare P focuses the latest notice. Day view keeps bare digits, since Shift+1 is !. Esc exits (a second F also toggles off). Holding Mod reveals the same day prefixes on week column headers, shown as ⇧W while jump mode is off. Bare Shift and Shift+Tab do not show jump chips.
Steps
- Navigate to
/weekwith timed events on at least two different days. - Press
Fonce; chips should appear. - Press the day letter on a chip (for example
Wfor Wednesday), then optionally a digit (2) or use arrow keys. - Press
Escto exit. - Without pressing
F, pressShift+W(orShift+SthenA) and confirm the matching event is focused; a following digit still refines toW2. - Press Shift alone or Shift+Tab and confirm jump mode does not activate.
Expected Results
- Chips appear on events currently visible in the grid when
Fis pressed and stay until Esc. Scrolled-off events keep their jump keys but hide their chips. - A day letter highlights that column and focuses the first event; digits refine to
Wn. On a column with no events the highlight still appears, nothing focuses, andCor a typedHHMMcreates there. - Shift + the day letter enters a column from idle, including while an event is focused;
Fflashes every chip (a second bareFexits; bareFis not Friday's column letter while jump is on). Weekend columns useShift+SthenA/U. - Bare
Tstill goes to today while jump is off. With an event focused, bareMstill opens the event menu. With a visible notice, barePstill focuses that notice. - Arrow keys keep jump mode on so letter-then-arrows works.
- Shift alone / Shift+Tab / Shift+J do not toggle jump mode.
- While a modal holds the app lock, or focus is in an editable field,
Fand leaderless jump tokens do not activate jump mode.
Scenario 12b: Jump Focus To A Day-View Calendar Column
UX
On Day view, holding Mod reveals numbered chips left to right: 1 on the view dropdown, then each writable calendar column (2, 3, …), then the sidebar (month picker, Up next, then each connected calendar account). Pressing that digit focuses the column header or account heading. Shift+Arrow then places a timed draft on that calendar; C / Shift+C honor the same focused column. Idle create (no column focused) still uses the default target calendar.
Steps
- Navigate to
/daywith at least two writable calendars visible as columns. - Hold Mod until chips appear. Note the number on a non-default calendar column.
- Press that digit, then Shift+ArrowDown.
- Press Enter to open the form and confirm the calendar picker shows that column's calendar.
- Discard, focus the same column again, and press
C.
Expected Results
- Hold-Mod chips on columns follow the view dropdown (
1, then2…). Sidebar chips continue after the last column: month picker, Up next, then one chip per connected account. Collapsed accounts still get a chip; jumping to one expands it. Week view uses the same sidebar map after1on the view dropdown (no column chips). With no connected accounts, the last sidebar slot is the calendar list as a whole. - Read-only columns (for example holidays) have no chip and are not focusable via Mod+digit.
- After focusing a column, Shift+Arrow places a form-closed timed draft in that column.
CandShift+Cseed the focused column's calendar. With no column focused, they still use the default create target.
Scenario 12c: Navigate The Month Picker By Week
UX
The sidebar month picker is a keyboard cursor, not a click target. I (or hold Mod and press the picker's digit) lands on the cursor week's first day. In Week view every arrow key moves the cursor one week row; Day view moves one day. Enter opens the cursor week (or day). Mod+Shift+, / Mod+Shift+. and the header chevrons change the month and keep a focusable day in the new month, so arrows keep working. Clicking a day does nothing; hovering the picker shows I focuses the picker, focusing it reveals the arrow keycaps, and using an arrow adds Enter opens it. Repeated clicks surface the keyboard hint.
Steps
- Navigate to
/weekwith the sidebar open and pressI. - Press ArrowDown twice, then ArrowRight once.
- Press
Mod+Shift+.. - Press Enter.
- Click any day in the picker three or four times.
Expected Results
- After
I, the first day of the highlighted week row has focus and the whole row shows the focus ring. - Each arrow moves the ring to the next week; the calendar grid does not move yet.
- After
Mod+Shift+., the next month is shown and focus is still on a day in that month. - Enter anchors the week view on the focused row and the muted week capsule matches the visible window. Today is an ink circle, not an accent fill.
- Clicks do not navigate, and a click shows the keyboard hint. Hovering the picker shows
I focuses the picker. Focusing it replaces that with up/down arrow keycaps andmove by week. After an arrow,Enter opens itappears withEnteras a keycap. The keyboard hint says to pressI, then use the arrow keys and Enter.
Scenario 13: The Mouse Teaches The Keyboard
UX
Compass is the keyboard calendar. Clicks are not blocked (text selection, form
fields, and native buttons work). The timed grid does not open or move events
on click alone, but pointer intent watches what the mouse tries and pulses the
existing top-center PointerHint pill with the keys that do the job.
Each intent teaches at most once per session, with at most three pointer pills
per session, never while tips are muted or dismissed, never on /life or
mobile, and never after the browser reaches Explorer (level 2). Invoking the
taught shortcut retires that intent for the profile.
Steps
- Navigate to
/weekwith welcome and showcase flags set and at least one timed event visible. - Click an event card once, read the pill, then press Enter to open it.
- Click an empty timed slot; read the digit keycaps, type that time, and
confirm a create form opens at that time (or press
Cafter the pill). - Drag an event card at least 8px and read the move shortcuts in the pill.
- Scroll the timed grid with the wheel three separate times (vertical gestures) and read the scroll / today pill.
- Swipe horizontally on the week scroller (trackpad) to change weeks and read the J or K pill.
- Click the header Next week arrow and read Next time, press K.
- Open an event form and click Save with the mouse; read the save shortcut pill.
- Right-click an event and pointer-click Hide; confirm the keyboard-only toast and that the event stays visible.
- Hover across several chrome controls for four seconds without clicking; read the hold-Mod page-jump pill and the brief chip demo.
- Set
compass.shortcuts.tips-muted, click an event card, and confirm no pill. - Clear mute, invoke Enter on a focused event once (profile records
edit-open), click another event card, and confirm no pill.
Palette teaching stays in Scenario 25.
Expected Results
- Step 2: pill names Enter to open and Shift (event jump) to jump; Enter opens the event without a second click.
- Step 3: pill shows the slot digits and
C; typing the digits opens create at that time. - Step 4: pill names Shift+ArrowDown and Shift+Alt+ArrowDown (15 min / hour).
- Step 5: pill names Alt+ArrowDown (or platform scroll-hour binding) and
T. - Step 6: pill says Next time, press K or J matching swipe direction.
- Step 7: Next time, press K after navigation runs.
- Step 8: save shortcut pill (Mod+Enter or platform binding).
- Step 9: toast Keyboard only, press x (or shown keycap); hide does not
run; keyboard
xor Enter on Hide still hides. - Step 10: hold-Mod copy plus visible page-jump chips for about two seconds.
- Steps 11–12: no pointer pill when muted or after
edit-openis recorded used. - Context-menu Edit, Duplicate, Delete, Hide, and colors all show the keyboard-only toast on pointer click.
- Automated coverage:
e2e/timed/mouse-teaches.spec.ts.
Scenario 14: Shortcuts Do Not Fire While Typing In Inputs
UX
All view-navigation and action shortcuts are suppressed when the user is focused inside a text input, textarea, or other form control. This prevents accidental navigation or destructive actions while the user is typing.
Steps
- Navigate to
/week. - Press
Cto open the event creation form, focusing the title input. - With the input focused, press
D,W,J,K. - Press
Delete. - Press Cmd+K.
Expected Results
D,W,J,K, andDeletedo not trigger any navigation or action while the form input is focused. The characters type normally into the input.- Cmd+K (or Ctrl+K) still opens the command palette even from inside the input.
- After pressing Escape to cancel the form, the same shortcuts resume normal behavior.
Scenario 15: Scroll The Timed Grid With PageUp / PageDown And Alt+Arrows
UX
PageUp and PageDown always scroll the timed grid by one viewport. Alt+ArrowUp and Alt+ArrowDown pan it by one hour. Both work even when focus is on an event card, the sidebar, or another control. Bare arrows still move event focus; J/K still change the visible day or week. The shortcuts do not fire while typing in an input.
Steps
- Navigate to
/week(or/day). - Click an event so it is focused.
- Press PageDown, then PageUp.
- Press Alt+ArrowDown, then Alt+ArrowUp (Option+Arrow on Mac).
- Open an event form, focus the title, and press PageDown, then Alt+ArrowDown.
Expected Results
- PageDown moves the timed grid later in the day by one viewport; PageUp moves it earlier by one viewport.
- Alt+ArrowDown moves the timed grid later by one hour; Alt+ArrowUp moves it earlier by one hour.
- The focused event does not change solely because of these scroll shortcuts.
- PageDown and Alt+ArrowDown do nothing while the title input is focused.
Scenario 16: Second Timezone With Z
UX
Bare Z opens the second-timezone picker in Day and Week view. Cmd+Z / Ctrl+Z remains undo. Escape on the picker closes it without dropping an existing secondary hour column. Escape on the grid while a second timezone is showing clears the extra column and shows a confirmation toast. The second timezone label shows an Esc tooltip on entry (and on hover or focus afterward). The sidebar hint also advertises Esc when it is open.
Steps
- Navigate to
/week. - Press
Z. - Confirm the picker describes comparing hours in a second timezone, then choose a timezone.
- Press Escape from the grid.
- Press
Zagain, choose a timezone, then press Escape while the picker is still open. - Press Cmd+Z / Ctrl+Z after an undoable action.
Expected Results
Zopens the Second timezone picker with a one-line description of the feature.- A second hour column appears after a zone is chosen and survives reload until removed. Both timezone abbreviations show in the gutter; there is no X control.
- The second timezone label tooltip and sidebar hint advertise Esc to hide.
- Escape from the grid while a second timezone is showing clears the extra column and shows "Second timezone hidden".
- Escape closes the picker and leaves the extra column in place.
- Cmd+Z undoes; it does not open the second-timezone picker.
Scenario 17: Copy And Paste An Event (Cmd+C / Cmd+V)
UX
With a grid event focused (form closed, not typing in an input), Cmd+C (Mac) or Ctrl+C (Windows/Linux) copies that event into an in-app clipboard. Cmd+V / Ctrl+V then creates a duplicate on the create target day (the selected column via Shift+day letter, else the focused event's day, else the copied event's own day), keeping the copied event's time of day and duration. An all-day copy keeps its length. After paste the new event is focused and the column selection is spent, like C. Cmd+D still duplicates the currently focused event at its original time. A later copy replaces the previous one. The clipboard lasts for the tab session with no expiry. While a text field is focused, Cmd+C / Cmd+V stay native text copy/paste.
Steps
- Navigate to
/week(or/day) with at least two saved events. - Focus an event (U, then arrows).
- Press Cmd+C (Mac) or Ctrl+C (Windows/Linux).
- Focus a different event and press Cmd+C again.
- Blur the event (click the grid background is inert; press Escape if needed so nothing is focused) and press Cmd+V.
- Open an event form, focus the title, select text, and press Cmd+C then Cmd+V.
Expected Results
- The first Cmd+C does not create an event.
- After the second copy, Cmd+V with nothing selected creates a duplicate of the second event at that event's original time. The two source events remain.
- Cmd+V after Shift+day-letter creates the copy on that selected day at the original time of day and spends the column selection.
- Cmd+D still duplicates the currently focused event immediately at its original date.
- Cmd+C / Cmd+V inside the title field copy and paste text and do not duplicate an event.
Scenario 18: Settings Meeting Hold-Mod Chips
UX
Settings > Meeting hold-Mod reveals only sidebar digits 1 / 2 / 3 and Enter on Save. Extra digit chords and the Accounts copy chord do nothing. Save is Mod+Enter. Meeting settings do not use a letter leader.
Steps
- Open Settings and go to Meeting with the page already configured and live.
- Hold Mod until the chips appear.
- Press
5. - Press
Uwhile Mod is still held.
Expected Results
- Chips
1,2(when billing is present),3, and the save bar'sEnterappear while Mod is held. The nav hint Hold Mod to see shortcuts. hides while chips are visible. No Meeting field, legend, summary, weekly hours plus or minus, or icon button shows a chip. - Extra digit chords change focus to nothing and toggle nothing.
- Holding Mod and pressing U does not write to the clipboard.
- Releasing Mod hides the nav chips and restores the nav hint.
Scenario 19: First-run Meeting Wizard Continue and Back
UX
The first-run Meeting wizard Continue and Back keys are Enter, Esc, K,
and J. Hints label them (Enter Continue, Esc Back, K Next,
J Back). Those keys do not fire while typing in an input, except
Enter from the address field.
Steps
- Open Settings and go to Meeting with no saved page.
- Confirm the address step shows Continue and hides Back.
- Press Enter.
- Confirm weekly hours shows Back.
- Press J, then K.
Expected Results
- Step 1 has Continue and no Back. The hint row includes Enter Continue.
- After Enter, Step 2 shows Back. The hint row includes Esc Back, K Next, and J Back.
- J returns to the address step. K returns to weekly hours.
- With focus in the address field, K does not continue. Enter does.
Scenario 20: Find An Event By Title (Mod+K)
UX
The command palette searches saved event titles once the query is two or more characters. Choosing an Events row navigates to that event's day and focuses the card so Enter opens it.
Steps
- Navigate to
/weekwith at least one saved timed event whose title is distinctive. - Press Cmd+K (or Ctrl+K).
- Type enough of the title to unique-match it.
- Confirm the Events section lists that title with its weekday, date, and time.
- Press Enter.
Expected Results
- An Events heading appears above matching rows (title plus weekday, date, and time or All day).
- The live region announces the result count (or "No results for …" when nothing matches).
- Enter closes the palette, opens the week or day that contains the event, and focuses that event card.
- Tab from the search field does not land in the Events rows. Arrow keys still move the active row.
Scenario 21: Go To A Typed Date (G)
UX
Bare G opens the command palette so the user can type a date. A query that parses as a date pins a "Go to …" row first. Enter navigates to that date, selects its column, and announces the jump.
Steps
- Navigate to
/week. - Press
G. - Type a date such as
oct 3or2026-12-15. - Press Enter.
Expected Results
Gopens the palette with the search field focused.- The first row reads "Go to …" with the resolved weekday, month, day, and year.
- Enter navigates so that date is visible and its column is selected.
- A polite status announcement reads "Showing week of …" (Day view: "Showing …").
ethenGstill jumps to RSVP when an event form is open. Typing in an input does not open the palette.
Scenario 22: Coarse-Nudge A Focused Event (Alt+Shift+Arrow)
UX
Alt means a bigger step, the same idea as Alt+Arrow scrolling the grid by an hour. With a focused event (form closed), Alt+Shift+ArrowUp / ArrowDown move it by one hour. Alt+Shift+ArrowLeft / ArrowRight move it by one week. A week step that leaves the visible window slides the view so the event stays on screen and focused.
Steps
- Navigate to
/weekwith a timed event on the current week. - Focus the event.
- Press Alt+Shift+ArrowDown, then Alt+Shift+ArrowUp.
- Press Alt+Shift+ArrowRight.
Expected Results
- Alt+Shift+ArrowDown moves the event one hour later; Alt+Shift+ArrowUp moves it one hour earlier.
- Alt+Shift+ArrowRight moves it seven days later. If that day was off-screen, the week window slides and the event stays visible and focused.
- All-day events ignore hour steps. Shift+Arrow without Alt still moves one day or 15 minutes.
- Nudging an instance of a recurring event raises one "Apply to series?" toast after you release Shift, not one per step, and it offers the position the burst ended on.
Scenario 23: Paste Onto The Selected Day
UX
Cmd+V / Ctrl+V pastes the copied event onto the create target day: the selected column (Shift+day letter), else the focused event's day, else the copied event's own day. The copy keeps its time of day. Pasting spends the column selection, like C.
Steps
- Navigate to
/weekwith a saved timed event. - Focus it and press Cmd+C / Ctrl+C.
- Press Shift plus a different day's letter so that column is selected.
- Press Cmd+V / Ctrl+V.
Expected Results
- A duplicate appears on the selected day at the original time of day.
- The new event is focused and the column highlight clears.
- Empty paste is a no-op. Copy and paste do not fire while typing in an input.
Scenario 24: Toggle Calendars With Digits
UX
Once a calendar-account list has focus, digits 1–9, then 0, -, and = toggle the first twelve rows. Chips and aria-keyshortcuts appear only while that list is focused.
Steps
- Navigate to
/weekor/daywith the sidebar open and at least two calendars in one account. - Tab (or hold Mod and press the account's chip) until a calendar row in that list is focused.
- Press
2. - Tab out of the list.
Expected Results
- While the list is focused, rows show digit chips and
aria-keyshortcutsmatching their index. - Pressing that digit toggles the matching calendar. A status line announces Hidden or Shown. No draft appears: typed-time creation stands down while the list owns digits.
- After focus leaves the list, chips and
aria-keyshortcutshide. Digits no longer toggle;1400on the grid creates a draft again.
Scenario 25: The Palette Teaches Its Shortcuts
UX
A command palette row that has a shortcut names that shortcut after you run it, using the same "Next time, press …" hint as a successful click. Rows without a shortcut stay silent.
Steps
- Navigate to
/week. - Press Cmd+K / Ctrl+K.
- Select "Create event" (shortcut
C). - Open the palette again and select "About Compass" (no shortcut).
Expected Results
- After Create event, a hint says "Next time, press C" (or the current binding).
- About Compass does not show a shortcut hint.
- The X on the hint still turns tips off for that browser. The command still runs.
Scenario 26: The Legend Shows Which Shortcuts You Have Used
UX
The ? legend is a progress surface. Rows you have invoked in this browser show a check mark labeled "used". The header counts how many of the visible rows you have used.
Steps
- Navigate to
/week. - Press
?and note "You've used 0 of … shortcuts here". - Press Escape, then
T(Go to today). - Press
?again and find the Go to today row.
Expected Results
- The header reads "You've used N of M shortcuts here" for the rows currently listed (search narrows both counts).
- After
T, that row shows a "used" check mark. Unused rows have no check. - Searching the overlay updates the count to the filtered set.
Scenario 27: Printable Shortcuts Page
UX
/shortcuts is a public, printable catalog of the same registry the ? overlay shows. It is not wrapped in the signed-in calendar shell.
Steps
- Open
/shortcutsin a logged-out window. - Confirm the page title and headings.
- Print preview (optional).
Expected Results
- The document title is "Compass keyboard shortcuts".
- An
h1matches that title. Each catalog group is anh2. - The in-app overlay's "Printable version" link opens this page.
Scenario 28: Shortcut Level Badge
UX
The sidebar footer, between the ? legend button and Refresh, shows a small Lv N badge: how many distinct registry shortcuts this browser has used, against a fixed level table. Hover or focus opens a tooltip with the level name, progress to the next level, and up to three shortcuts to try next in the current view (edit-section rows first when an event is focused). Click opens the ? legend, same as the ? button. It is additive: the sidebar tip line and the legend's own check marks are unchanged. Reaching a new level pulses the badge and shows a toast. "Hide shortcut level" / "Show shortcut level" in the command palette, and the tooltip's own "Hide level" button, toggle it off and on; hidden survives a reload.
Steps
- Navigate to
/weekon a fresh browser (or a private window). The badge reads "Lv 1". - Press a few registered shortcuts (
T,J,Cthen Escape). - Hover the badge.
- Open the command palette and run "Hide shortcut level".
- Reload the page.
- Open the command palette and run "Show shortcut level" to restore it.
- Reach a level threshold (used shortcuts >= 4) in one session.
Expected Results
- Step 1: the badge is visible and reads "Lv 1"; its accessible name is "Shortcut level 1, Newcomer. 0 of <total> shortcuts used. Open shortcuts."
- Step 3: the tooltip shows the level name, "N of M shortcuts used" (plus ", Z more to <next level>" until the top level), and a "Try next" list when unused, unlocked rows exist for the current context.
- Step 4: the badge disappears immediately; the palette item now reads "Show shortcut level".
- Step 5: the badge stays hidden after reload.
- Step 6: the badge reappears.
- Step 7: the badge pulses briefly and a status toast reads "Level N: <name>. X shortcuts learned." A returning browser with existing history is not congratulated on first load for a level it already had.
- Reduced motion (
prefers-reduced-motion: reduce): the pulse animation is suppressed; the toast still shows.
Focused Regression Checks
If time is limited, run these checks before shipping shortcut-related changes:
D,Wnavigate to the correct views from any starting view.JandKnavigate days in Day view and weeks in Week view.Treturns to today from any offset in both Day and Week view.- Cmd+K opens the command palette; Escape closes it without action; Undo/Redo rows are present.
Copens a timed event form andShift+Can all-day event form, in both Day and Week view. In Week view both land on the selected column, else the focused event's day, else today, else the first visible day.]toggles the sidebar in both Week and Day view.- Delete removes a focused event in Day and Week view and shows an undo toast.
- Cmd+Z / Ctrl+Z undoes the last event action; Cmd+Shift+Z / Ctrl+Shift+Z redoes it.
- No shortcuts fire inside a focused text input except Cmd+K.
- Shift+ArrowLeft/Right move a focused event by one day in both Day and Week view.
- Arrow keys reposition an open draft in both Day and Week view.
- With no event focused and no particular control focused (document body), any Arrow key focuses the timed event nearest now in the current Day/Week view (in-progress, else next upcoming, else most recently ended; today preferred in Week; all-day only if no timed events). Further arrows then follow the existing rules.
Ustill focuses the first DOM-order event. With a focused event and no draft open: in Week view ArrowUp/ArrowDown stay on the same day and ArrowLeft/Right jump to the time-nearest event on the previous/next non-empty day; in Day view all four arrows move chronological focus. - Cmd+D / Ctrl+D duplicates a focused event in Day and Week view.
- With a focused event,
EthenTopens the form with the title focused;EthenA/Cjump to guests / color; bareEalone does nothing. - Pressing
Fshows event jump chips; a day letter + digit focuses that event;Shift+ the day letter enters a column without a priorF, including an empty column, andCthen creates there; Shift+Tab does not show chips. - Grid pointer intent teaches once per intent in
PointerHint(scenario 13); palette teaching is scenario 25./lifeallows normal clicks without intent pills.Mopens the focused event's menu;Ffocuses the newest notice. - PageUp / PageDown scroll the timed grid by one viewport in Day and Week view even when an event is focused; they do not fire in a text input.
- Alt+ArrowUp / Alt+ArrowDown pan the timed grid by one hour in Day and Week view even when an event is focused; they do not fire in a text input.
Zopens the second-timezone picker in Day and Week view; Cmd+Z / Ctrl+Z still undoes and does not open the picker.- On Day view, hold Mod then a column digit (2+) focuses that writable calendar column; Shift+Arrow /
Cseed a draft there. - Cmd+C / Ctrl+C copies a focused event; Cmd+V / Ctrl+V pastes a duplicate on the create target day (selected column, else focused event's day, else the copied event's day) without requiring focus. A later copy replaces the clipboard. Empty paste is a no-op. Copy/paste do not fire while typing in an input (native text clipboard). Cmd+D is unchanged.
- In Settings > Meeting, hold Mod to reveal chips
1/2/3and Enter; extra digits focus nothing; U with Mod held does not copy. - On the first-run Meeting wizard, Enter continues, Esc and J go back after step 1, and K continues when focus is not in an editable target.
- Cmd+K / Ctrl+K finds saved events by title (two or more characters) under an Events heading; Enter focuses that event. The live region announces the result count. Tab does not trap in Events.
- Bare
Gopens the palette; a parsed date pins "Go to …"; Enter selects that day and announces "Showing week of …" (or "Showing …" on Day view). - Alt+Shift+Arrow moves a focused event by an hour (up/down) or a week (left/right) and carries across the visible window.
- Cmd+V / Ctrl+V after Shift+day-letter pastes onto that selected day and spends the column.
- A focused calendar list toggles rows with digits;
aria-keyshortcutsis present only while that list is focused. - Running a palette command that has a shortcut shows "Next time, press …".
- The
?legend check-marks used shortcuts and counts "You've used N of M shortcuts here". /shortcutsis a public printable catalog with anh1and per-sectionh2headings.- The sidebar footer's
Lv Nbadge shows a level, tooltip progress, and try-next rows; a level-up pulses and toasts once; the command palette hides and shows it. - With a booked meeting open in the event form (description contains both Compass cancel and reschedule anchors),
Mod+Shift+Xtwice cancels via the public booking API andMod+Shift+Eopens the guest reschedule page in a new tab; a plain event shows neither action.