feat(e10): a jump-to palette on Ctrl/Cmd+K
Reaching a channel three modules away cost a rail, a page and a scroll. Now it costs a keystroke and half a word: Mod+K searches modules, channels, playlists, the saved views applicable where you stand, and the app-wide actions. Scope agreed with the product owner: navigation + actions, but only the reversible local ones (the shortcuts sheet, the theme). "Sync from YouTube" is deliberately absent — it is a long-running job against a quota, it wants the progress and error surface the Channels page already gives it, and one mistyped Enter is a worse failure than the walk it would have saved. Matching is word-wise and accent-folded, because this is a bilingual app and nobody reaches for the accent keys in a hurry: "pod thevr" finds TheVR Podcast and "penzugy" finds pénzügy. The arrows walk one flat result list so crossing a group heading is invisible, and the field carries the combobox/listbox aria tree that virtual selection needs. ui/CommandPalette is domain-free (items are a prop, per the ui/ import rule); AppCommandPalette supplies them. The shell is Modal again, with a new `top` placement so a search-first dialog grows downwards instead of jumping as results change. Also fixes a bug the palette hit on its first run, and that PlayerModal had already hit once: closing a dialog reclaims its Back-to-close history entry with a programmatic history.back(), which undoes any pushState made before it lands — so a command that navigates only closed the palette. The rule is now closeThenNavigate() in history.ts with a test, and PlayerModal's inline copy is gone. The global `h` moves out of KeyboardHelp into useGlobalKeymap beside Mod+K, so one listener owns the whole `global` scope and dispatch's exhaustiveness keeps meaning what it says.
This commit is contained in:
@@ -19,5 +19,6 @@
|
||||
"stats": "Stats for nerds",
|
||||
"back": "Stop & back to feed",
|
||||
"browseBack": "Back one level",
|
||||
"closePlayer": "Close the player"
|
||||
"closePlayer": "Close the player",
|
||||
"palette": "Open the jump-to palette"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"title": "Jump to…",
|
||||
"placeholder": "Search modules, channels, playlists…",
|
||||
"empty": "Nothing matches.",
|
||||
"theme": "Theme: {{name}}",
|
||||
"videoCount": "{{count}} video",
|
||||
"videoCount_other": "{{count}} videos",
|
||||
"groups": {
|
||||
"modules": "Modules",
|
||||
"channels": "Channels",
|
||||
"playlists": "Playlists",
|
||||
"views": "Saved views",
|
||||
"actions": "Actions"
|
||||
}
|
||||
}
|
||||
@@ -19,5 +19,6 @@
|
||||
"stats": "Statisztika (nerdöknek)",
|
||||
"back": "Leállítás és vissza a feedre",
|
||||
"browseBack": "Vissza egy szintet",
|
||||
"closePlayer": "Lejátszó bezárása"
|
||||
"closePlayer": "Lejátszó bezárása",
|
||||
"palette": "Ugrás-paletta megnyitása"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"title": "Ugrás…",
|
||||
"placeholder": "Modul, csatorna, lista keresése…",
|
||||
"empty": "Nincs találat.",
|
||||
"theme": "Téma: {{name}}",
|
||||
"videoCount": "{{count}} videó",
|
||||
"videoCount_other": "{{count}} videó",
|
||||
"groups": {
|
||||
"modules": "Modulok",
|
||||
"channels": "Csatornák",
|
||||
"playlists": "Listák",
|
||||
"views": "Mentett nézetek",
|
||||
"actions": "Műveletek"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user