hotkey-router 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../data/site-hotkeys.runtime.json", "../sites.js"],
4
+ "sourcesContent": ["{\"$comment\":\"Generated from data/site-hotkeys.json (the full, sourced table). Runtime projection used by sites.js; do not edit by hand.\",\"version\":{\"researched\":\"2026-10-03\",\"schema\":\"1.0\",\"method\":\"Vendor help pages and keymap source, read by research agents (often through a summarizing fetch). verified=true means read on the vendor page or source in that session; false means a secondary source or inference. Sites the agents could not read have researched=false and no rows.\"},\"sites\":[{\"id\":\"google-docs\",\"name\":\"Google Docs\",\"hosts\":[\"docs.google.com\"],\"pathPrefixes\":[\"/document/\"],\"shortcuts\":[[\"ctrl+shift+v\",\"meta+shift+v\",\"ctrl+shift+v\",\"Paste without formatting\",1],[\"ctrl+shift+z\",\"meta+shift+z\",\"ctrl+shift+z\",\"Redo\",1],[\"ctrl+shift+g\",\"meta+shift+g\",\"ctrl+shift+g\",\"Find previous\",1],[\"ctrl+shift+f\",\"ctrl+shift+f\",\"ctrl+shift+f\",\"Hide menus (compact mode)\",1],[\"ctrl+shift+period\",\"meta+shift+period\",\"ctrl+shift+period\",\"Increase font size\",1],[\"ctrl+shift+comma\",\"meta+shift+comma\",\"ctrl+shift+comma\",\"Decrease font size\",1],[\"ctrl+shift+k\",\"alt+shift+k\",null,\"Small caps\",1],[\"ctrl+shift+l\",\"meta+shift+l\",\"ctrl+shift+l\",\"Left align\",1],[\"ctrl+shift+e\",\"meta+shift+e\",\"ctrl+shift+e\",\"Center align\",1],[\"ctrl+shift+r\",\"meta+shift+r\",\"ctrl+shift+r\",\"Right align\",1],[\"ctrl+shift+j\",\"meta+shift+j\",\"ctrl+shift+j\",\"Justify\",1],[\"ctrl+shift+7\",\"meta+shift+7\",\"ctrl+shift+7\",\"Numbered list\",1],[\"ctrl+shift+8\",\"meta+shift+8\",\"ctrl+shift+8\",\"Bulleted list\",1],[\"ctrl+shift+9\",\"meta+shift+9\",null,\"Checklist\",1],[\"ctrl+shift+arrowup\",\"ctrl+shift+arrowup\",null,\"Move paragraph up\",1],[\"ctrl+shift+arrowdown\",\"ctrl+shift+arrowdown\",null,\"Move paragraph down\",1],[\"ctrl+shift+x\",null,\"ctrl+shift+x\",\"Context (right-click) menu\",1],[\"ctrl+shift+backslash\",\"meta+shift+backslash\",null,\"Context (right-click) menu (alternate)\",1],[\"ctrl+shift+y\",\"meta+shift+y\",\"ctrl+shift+y\",\"Open dictionary\",1],[\"ctrl+shift+c\",\"meta+shift+c\",\"ctrl+shift+c\",\"Word count\",1],[\"ctrl+shift+s\",\"meta+shift+s\",\"ctrl+shift+s\",\"Start voice typing\",1],[null,\"meta+shift+h\",null,\"Find and replace (Mac form)\",1],[\"ctrl+shift+arrowleft\",null,\"ctrl+shift+arrowleft\",\"Extend selection one word left\",1],[\"ctrl+shift+arrowright\",null,\"ctrl+shift+arrowright\",\"Extend selection one word right\",1],[\"ctrl+shift+home\",\"meta+shift+arrowup\",null,\"Extend selection to document start\",1],[\"ctrl+shift+end\",\"meta+shift+arrowdown\",null,\"Extend selection to document end\",1],[\"ctrl+shift+pagedown\",null,null,\"Move to next tab\",1],[\"ctrl+shift+pageup\",null,null,\"Move to previous tab\",1],[null,\"meta+shift+k\",null,\"Toggle input controls\",1],[\"ctrl+alt+1\",\"meta+alt+1\",\"ctrl+alt+1\",\"Apply heading style 1\",1],[\"ctrl+alt+2\",\"meta+alt+2\",\"ctrl+alt+2\",\"Apply heading style 2\",1],[\"ctrl+alt+3\",\"meta+alt+3\",\"ctrl+alt+3\",\"Apply heading style 3\",1],[\"ctrl+alt+4\",\"meta+alt+4\",\"ctrl+alt+4\",\"Apply heading style 4\",1],[\"ctrl+alt+5\",\"meta+alt+5\",\"ctrl+alt+5\",\"Apply heading style 5\",1],[\"ctrl+alt+6\",\"meta+alt+6\",\"ctrl+alt+6\",\"Apply heading style 6\",1],[\"ctrl+alt+0\",\"meta+alt+0\",\"ctrl+alt+0\",\"Apply normal text style\",1],[\"ctrl+alt+y\",\"meta+alt+y\",\"ctrl+alt+y\",\"Alt text\",1],[\"ctrl+alt+k\",\"ctrl+meta+k\",\"ctrl+alt+k\",\"Resize larger (drawing)\",1],[\"ctrl+alt+b\",\"ctrl+meta+b\",\"ctrl+alt+b\",\"Resize larger horizontally (drawing)\",1],[\"ctrl+alt+i\",\"ctrl+meta+i\",\"ctrl+alt+i\",\"Resize larger vertically (drawing)\",1],[\"ctrl+alt+j\",\"ctrl+meta+j\",\"ctrl+alt+j\",\"Resize smaller (drawing)\",1],[\"ctrl+alt+w\",\"ctrl+meta+w\",\"ctrl+alt+w\",\"Resize smaller horizontally (drawing)\",1],[\"ctrl+alt+q\",\"ctrl+meta+q\",\"ctrl+alt+q\",\"Resize smaller vertically (drawing)\",1],[\"ctrl+alt+m\",\"meta+alt+m\",\"ctrl+alt+m\",\"Insert comment\",1],[\"ctrl+alt+f\",\"meta+alt+f\",\"ctrl+alt+f\",\"Insert footnote\",1],[\"ctrl+alt+c\",\"meta+alt+c\",\"ctrl+alt+c\",\"Copy text formatting\",1],[\"ctrl+alt+v\",\"meta+alt+v\",\"ctrl+alt+v\",\"Paste text formatting\",1],[\"ctrl+alt+x\",\"meta+alt+x\",null,\"Open spelling and grammar\",1],[\"ctrl+alt+z\",\"meta+alt+z\",\"ctrl+alt+z\",\"Enable screen reader support\",1],[\"ctrl+alt+h\",\"meta+alt+h\",\"ctrl+alt+h\",\"Enable braille support\",1],[\"ctrl+alt+enter\",\"meta+alt+enter\",\"ctrl+alt+enter\",\"Toggle checkbox\",1],[\"ctrl+alt+period\",\"meta+alt+period\",\"alt+shift+period\",\"Go to side panel\",1],[\"ctrl+alt+comma\",\"meta+alt+comma\",\"alt+shift+comma\",\"Go to side panel (alternate)\",1],[\"ctrl+alt+k\",null,\"ctrl+alt+k\",\"Move to next edit\",1],[\"ctrl+alt+j\",null,\"ctrl+alt+j\",\"Move to previous edit\",1],[\"alt+shift+5\",\"meta+shift+x\",\"alt+shift+5\",\"Strikethrough\",1],[\"alt+shift+arrowleft\",\"alt+shift+arrowleft\",\"alt+shift+arrowleft\",\"Rotate counterclockwise 1 degree (drawing)\",1],[\"alt+shift+arrowright\",\"alt+shift+arrowright\",\"alt+shift+arrowright\",\"Rotate clockwise 1 degree (drawing)\",1],[\"alt+shift+backquote\",null,\"alt+shift+backquote\",\"Enable screen reader support (alternate)\",1],[null,\"alt+shift+arrowup\",null,\"Extend selection one paragraph up\",1],[null,\"alt+shift+arrowdown\",null,\"Extend selection one paragraph down\",1],[\"alt+shift+f\",\"ctrl+alt+f\",null,\"File menu\",1],[\"alt+shift+e\",\"ctrl+alt+e\",null,\"Edit menu\",1],[\"alt+shift+v\",\"ctrl+alt+v\",null,\"View menu\",1],[\"alt+shift+i\",\"ctrl+alt+i\",null,\"Insert menu\",1],[\"alt+shift+o\",\"ctrl+alt+o\",null,\"Format menu\",1],[\"alt+shift+t\",\"ctrl+alt+t\",null,\"Tools menu\",1],[\"alt+shift+h\",\"ctrl+alt+h\",null,\"Help menu\",1],[\"alt+shift+a\",\"ctrl+alt+a\",null,\"Accessibility menu\",1],[\"ctrl+alt+shift+a\",\"meta+alt+shift+a\",\"ctrl+alt+shift+a\",\"Open discussion thread / comment history\",1],[\"ctrl+alt+shift+k\",\"meta+alt+shift+k\",\"ctrl+alt+shift+k\",\"Input Tools menu\",1],[\"ctrl+alt+shift+r\",\"meta+alt+shift+r\",\"ctrl+alt+shift+r\",\"Show live edits\",1],[\"ctrl+alt+shift+m\",\"meta+alt+shift+m\",\"ctrl+alt+shift+m\",\"Move focus out of editing area\",1],[\"ctrl+alt+shift+z\",\"meta+alt+shift+z\",\"ctrl+alt+shift+z\",\"Switch to editing\",1],[\"ctrl+alt+shift+x\",\"meta+alt+shift+x\",\"ctrl+alt+shift+x\",\"Switch to suggesting\",1],[\"ctrl+alt+shift+c\",\"meta+alt+shift+c\",\"ctrl+alt+shift+c\",\"Switch to viewing\",1],[\"ctrl+alt+shift+h\",\"meta+alt+shift+h\",\"ctrl+alt+shift+h\",\"Open revision history\",1],[\"ctrl+alt+shift+i\",\"meta+alt+shift+i\",\"ctrl+alt+shift+i\",\"Open Explore tool\",1],[\"ctrl+alt+shift+arrowleft\",\"ctrl+meta+shift+arrowleft\",\"ctrl+alt+shift+arrowleft\",\"Select multiple text sections (left)\",1],[\"ctrl+alt+shift+arrowright\",\"ctrl+meta+shift+arrowright\",\"ctrl+alt+shift+arrowright\",\"Select multiple text sections (right)\",1]]},{\"id\":\"google-slides\",\"name\":\"Google Slides\",\"hosts\":[\"docs.google.com\"],\"pathPrefixes\":[\"/presentation/\"],\"shortcuts\":[[\"ctrl+shift+z\",\"meta+shift+z\",\"ctrl+shift+z\",\"Redo\",1],[\"ctrl+shift+g\",\"meta+shift+g\",\"ctrl+shift+g\",\"Find previous\",1],[\"ctrl+shift+f\",\"ctrl+shift+f\",\"ctrl+shift+f\",\"Hide or show menus\",1],[\"ctrl+shift+c\",\"meta+shift+c\",\"ctrl+shift+c\",\"Turn on captions\",1],[\"ctrl+shift+backslash\",\"meta+shift+backslash\",null,\"Context menu\",1],[\"ctrl+shift+x\",null,\"ctrl+shift+x\",\"Context menu (alternate)\",1],[\"ctrl+shift+arrowup\",\"meta+shift+arrowup\",\"ctrl+shift+arrowup\",\"Move slide to beginning / Bring to front\",1],[\"ctrl+shift+arrowdown\",\"meta+shift+arrowdown\",\"ctrl+shift+arrowdown\",\"Move slide to end / Send to back\",1],[\"ctrl+shift+period\",\"meta+shift+period\",\"ctrl+shift+period\",\"Increase font size / playback rate\",1],[\"ctrl+shift+comma\",\"meta+shift+comma\",\"ctrl+shift+comma\",\"Decrease font size / playback rate\",1],[\"ctrl+shift+l\",\"meta+shift+l\",null,\"Left align\",1],[\"ctrl+shift+r\",\"meta+shift+r\",\"ctrl+shift+r\",\"Right align\",1],[\"ctrl+shift+e\",\"meta+shift+e\",\"ctrl+shift+e\",\"Center align\",1],[\"ctrl+shift+j\",\"meta+shift+j\",\"ctrl+shift+j\",\"Justify\",1],[\"ctrl+shift+8\",\"meta+shift+8\",\"ctrl+shift+8\",\"Bulleted list\",1],[\"ctrl+shift+7\",\"meta+shift+7\",\"ctrl+shift+7\",\"Numbered list\",1],[\"ctrl+shift+k\",\"meta+shift+k\",\"ctrl+shift+k\",\"Toggle input controls\",1],[null,\"meta+shift+h\",null,\"Find and replace (Mac form)\",1],[null,\"meta+shift+f\",null,\"Toggle full screen (present, Mac form)\",1],[\"ctrl+alt+c\",\"meta+alt+c\",\"ctrl+alt+c\",\"Copy formatting\",1],[\"ctrl+alt+v\",\"meta+alt+v\",\"ctrl+alt+v\",\"Paste formatting\",1],[\"ctrl+alt+y\",\"meta+alt+y\",\"ctrl+alt+y\",\"Alt text\",1],[\"ctrl+alt+m\",\"meta+alt+m\",\"ctrl+alt+m\",\"Insert comment\",1],[\"ctrl+alt+g\",\"meta+alt+g\",\"ctrl+alt+g\",\"Group\",1],[\"ctrl+alt+b\",\"ctrl+meta+b\",\"ctrl+alt+b\",\"Resize larger horizontally\",1],[\"ctrl+alt+i\",\"ctrl+meta+i\",\"ctrl+alt+i\",\"Resize larger vertically\",1],[\"ctrl+alt+j\",\"ctrl+meta+j\",\"ctrl+alt+j\",\"Resize smaller\",1],[\"ctrl+alt+k\",\"ctrl+meta+k\",\"ctrl+alt+k\",\"Resize larger\",1],[\"ctrl+alt+w\",\"ctrl+meta+w\",\"ctrl+alt+w\",\"Resize smaller horizontally\",1],[\"ctrl+alt+9\",null,\"ctrl+alt+9\",\"Resize smaller vertically\",1],[\"ctrl+alt+x\",\"ctrl+meta+x\",\"ctrl+alt+x\",\"Verbalize selection\",1],[\"ctrl+alt+r\",\"ctrl+meta+r\",\"ctrl+alt+r\",\"Verbalize from cursor\",1],[\"ctrl+alt+z\",\"meta+alt+z\",\"ctrl+alt+z\",\"Enable screen reader\",1],[\"ctrl+alt+h\",\"meta+alt+h\",\"ctrl+alt+h\",\"Enable braille\",1],[\"ctrl+alt+period\",\"meta+alt+period\",\"alt+shift+period\",\"Go to side panel\",1],[\"ctrl+alt+comma\",\"meta+alt+comma\",\"alt+shift+comma\",\"Go to side panel (alternate)\",1],[\"alt+shift+5\",\"meta+shift+x\",\"alt+shift+5\",\"Strikethrough\",1],[\"alt+shift+arrowdown\",\"alt+shift+arrowdown\",null,\"Move paragraph down\",1],[\"alt+shift+arrowup\",\"alt+shift+arrowup\",null,\"Move paragraph up\",1],[\"alt+shift+arrowleft\",\"alt+shift+arrowleft\",\"alt+shift+arrowleft\",\"Rotate counterclockwise 1 degree\",1],[\"alt+shift+arrowright\",\"alt+shift+arrowright\",\"alt+shift+arrowright\",\"Rotate clockwise 1 degree\",1],[\"alt+shift+backquote\",null,\"alt+shift+backquote\",\"Enable screen reader (alternate)\",1],[\"alt+shift+f\",null,null,\"File menu\",1],[\"alt+shift+e\",null,null,\"Edit menu\",1],[\"alt+shift+v\",null,null,\"View menu\",1],[\"alt+shift+i\",null,null,\"Insert menu\",1],[\"alt+shift+o\",null,null,\"Format menu\",1],[\"alt+shift+t\",null,null,\"Tools menu\",1],[\"alt+shift+h\",null,null,\"Help menu\",1],[\"alt+shift+a\",null,null,\"Accessibility menu\",1],[\"ctrl+alt+shift+f\",\"meta+alt+shift+f\",\"ctrl+alt+shift+f\",\"Move to filmstrip\",1],[\"ctrl+alt+shift+c\",\"meta+alt+shift+c\",\"ctrl+alt+shift+c\",\"Move to canvas\",1],[\"ctrl+alt+shift+s\",\"meta+alt+shift+s\",\"ctrl+alt+shift+s\",\"Open speaker notes\",1],[\"ctrl+alt+shift+p\",\"meta+alt+shift+p\",\"ctrl+alt+shift+p\",\"HTML view\",1],[\"ctrl+alt+shift+b\",\"meta+alt+shift+b\",\"ctrl+alt+shift+b\",\"Open animations\",1],[\"ctrl+alt+shift+i\",\"meta+alt+shift+i\",\"ctrl+alt+shift+i\",\"Open Explore\",1],[\"ctrl+alt+shift+a\",\"meta+alt+shift+a\",\"ctrl+alt+shift+a\",\"Open comment thread\",1],[\"ctrl+alt+shift+j\",\"meta+alt+shift+j\",\"ctrl+alt+shift+j\",\"Hide comment\",1],[\"ctrl+alt+shift+g\",\"meta+alt+shift+g\",\"ctrl+alt+shift+g\",\"Ungroup\",1],[\"ctrl+alt+shift+k\",\"meta+alt+shift+k\",\"ctrl+alt+shift+k\",\"Input tools menu\",1],[\"ctrl+alt+shift+h\",\"meta+alt+shift+h\",null,\"Revision history\",1]]},{\"id\":\"gmail\",\"name\":\"Gmail\",\"hosts\":[\"mail.google.com\"],\"pathPrefixes\":[],\"shortcuts\":[[\"ctrl+shift+c\",\"meta+shift+c\",\"ctrl+shift+c\",\"Add cc recipients\",1],[\"ctrl+shift+b\",\"meta+shift+b\",\"ctrl+shift+b\",\"Add bcc recipients\",1],[\"ctrl+shift+f\",\"meta+shift+f\",\"ctrl+shift+f\",\"Access custom From\",1],[\"ctrl+shift+5\",\"meta+shift+5\",\"ctrl+shift+5\",\"Previous font\",1],[\"ctrl+shift+6\",\"meta+shift+6\",\"ctrl+shift+6\",\"Next font\",1],[\"ctrl+shift+minus\",\"meta+shift+minus\",\"ctrl+shift+minus\",\"Decrease text size\",1],[\"ctrl+shift+equal\",\"meta+shift+equal\",\"ctrl+shift+equal\",\"Increase text size\",1],[\"ctrl+shift+7\",\"meta+shift+7\",\"ctrl+shift+7\",\"Numbered list\",1],[\"ctrl+shift+8\",\"meta+shift+8\",\"ctrl+shift+8\",\"Bulleted list\",1],[\"ctrl+shift+9\",\"meta+shift+9\",\"ctrl+shift+9\",\"Quote\",1],[\"ctrl+shift+l\",\"meta+shift+l\",\"ctrl+shift+l\",\"Align left\",1],[\"ctrl+shift+e\",\"meta+shift+e\",\"ctrl+shift+e\",\"Align center\",1],[\"ctrl+shift+r\",\"meta+shift+r\",\"ctrl+shift+r\",\"Align right\",1],[\"ctrl+alt+comma\",\"meta+alt+comma\",\"ctrl+alt+comma\",\"Switch between Calendar/Keep/Tasks sidebar and inbox\",1],[\"ctrl+alt+period\",\"meta+alt+period\",\"ctrl+alt+period\",\"Switch between Calendar/Keep/Tasks sidebar and inbox (alternate)\",1]]},{\"id\":\"google-keep\",\"name\":\"Google Keep\",\"hosts\":[\"keep.google.com\"],\"pathPrefixes\":[],\"shortcuts\":[[\"ctrl+shift+8\",\"meta+shift+8\",\"ctrl+shift+8\",\"Toggle checkboxes\",1]]},{\"id\":\"word-web\",\"name\":\"Word for the web\",\"hosts\":[\"word.cloud.microsoft\",\"*.officeapps.live.com\",\"onedrive.live.com\",\"sharepoint.com\"],\"pathPrefixes\":[],\"shortcuts\":[[\"ctrl+shift+f6\",null,null,\"Move between ribbon and document content (Ctrl+F6 also)\",1],[\"ctrl+shift+arrowright\",null,null,\"Select right one word\",1],[\"ctrl+shift+arrowleft\",null,null,\"Select left one word\",1],[\"ctrl+shift+arrowup\",null,null,\"Select up one paragraph\",1],[\"ctrl+shift+arrowdown\",null,null,\"Select down one paragraph\",1],[\"ctrl+shift+home\",null,null,\"Select to beginning of document\",1],[\"ctrl+shift+end\",null,null,\"Select to end of document\",1],[\"ctrl+alt+g\",null,null,\"Select image\",0],[\"alt+shift+arrowleft\",null,null,\"Outdent / select left by word\",0],[\"alt+shift+arrowright\",null,null,\"Indent\",0],[\"ctrl+alt+shift+tab\",null,null,\"Task Switcher\",0]]},{\"id\":\"outlook-web\",\"name\":\"Outlook on the web\",\"hosts\":[\"outlook.office.com\",\"outlook.live.com\",\"outlook.cloud.microsoft\",\"outlook.office365.com\"],\"pathPrefixes\":[],\"shortcuts\":[[\"ctrl+shift+r\",null,null,\"Reply all\",1],[\"ctrl+shift+f\",null,null,\"Forward message\",1],[\"ctrl+shift+2\",null,null,\"Go to calendar\",1],[\"ctrl+shift+1\",null,null,\"Go to mail / Inbox\",0],[\"ctrl+alt+arrowleft\",null,null,\"Calendar: previous day/period\",1],[\"ctrl+alt+arrowright\",null,null,\"Calendar: next day/period\",1],[\"ctrl+alt+1\",null,null,\"Calendar: Day view\",1],[\"ctrl+alt+2\",null,null,\"Calendar: Week / work week view\",1],[\"ctrl+alt+4\",null,null,\"Calendar: Month view\",1],[\"alt+shift+y\",null,null,\"Calendar: go to today\",1],[\"alt+shift+1\",null,null,\"Calendar: Day view (shift+alt set)\",1],[\"alt+shift+2\",null,null,\"Calendar: Work week view\",1],[\"alt+shift+3\",null,null,\"Calendar: Full week view\",1],[\"alt+shift+4\",null,null,\"Calendar: Month view\",1]]},{\"id\":\"teams-web\",\"name\":\"Microsoft Teams (web)\",\"hosts\":[\"teams.microsoft.com\",\"teams.live.com\",\"teams.cloud.microsoft\"],\"pathPrefixes\":[],\"shortcuts\":[[\"ctrl+shift+f\",\"meta+shift+f\",null,\"Open filter\",0],[\"ctrl+shift+n\",\"meta+shift+n\",null,\"Start chat in new window (desktop; browser reserves new incognito window)\",0],[\"ctrl+shift+x\",\"meta+shift+x\",null,\"Expand compose box\",0],[\"ctrl+shift+c\",\"meta+shift+c\",null,\"Insert inline code\",0],[\"ctrl+shift+b\",\"meta+shift+b\",null,\"Insert code block\",0],[\"ctrl+shift+i\",\"meta+shift+i\",null,\"Mark message important\",0],[\"ctrl+shift+a\",\"meta+shift+a\",null,\"Accept video call\",0],[\"ctrl+shift+s\",null,null,\"Accept audio call\",0],[\"ctrl+shift+d\",\"meta+shift+d\",null,\"Decline call\",0],[\"ctrl+shift+m\",\"meta+shift+m\",null,\"Toggle mute\",0],[\"ctrl+shift+u\",null,null,\"Toggle speaker\",0],[\"ctrl+shift+o\",\"meta+shift+o\",null,\"Toggle video\",0],[\"ctrl+shift+e\",\"meta+shift+e\",null,\"Toggle share tray\",0],[\"ctrl+shift+h\",\"meta+shift+h\",null,\"End call\",0],[\"ctrl+shift+k\",\"meta+shift+k\",null,\"Raise/lower hand\",0],[\"ctrl+shift+l\",\"meta+shift+l\",null,\"Announce raised hands\",0],[\"ctrl+shift+y\",\"meta+shift+y\",null,\"Admit from lobby\",0],[\"ctrl+shift+j\",null,null,\"Join from meeting toast\",0],[\"ctrl+shift+r\",null,null,\"Open meeting chat from notification\",0],[\"ctrl+shift+q\",null,null,\"Create meeting request\",0],[\"ctrl+shift+1\",null,null,\"Download diagnostic logs (also: opens 1st app on web per page note)\",0],[\"ctrl+alt+enter\",null,null,\"Move focus to pane divider\",0],[\"ctrl+alt+r\",\"meta+alt+r\",null,\"React to last message\",0],[\"ctrl+alt+u\",\"meta+alt+u\",null,\"See all unread chats\",0],[\"ctrl+alt+c\",\"meta+alt+c\",null,\"See all chats\",0],[\"ctrl+alt+a\",\"meta+alt+a\",null,\"See all channel conversations\",0],[\"ctrl+alt+b\",\"meta+alt+b\",null,\"See all meeting chats\",0],[\"ctrl+alt+z\",\"meta+alt+z\",null,\"Clear all filters\",0],[\"ctrl+alt+p\",\"meta+alt+p\",null,\"Paragraph style\",0],[\"ctrl+alt+4\",null,null,\"Insert block quote\",0],[\"ctrl+alt+x\",null,null,\"Strikethrough\",0],[\"ctrl+alt+l\",\"meta+alt+l\",null,\"Add Loop paragraph\",0],[\"ctrl+alt+5\",\"meta+alt+4\",null,\"Insert code\",0],[\"ctrl+alt+1\",\"meta+alt+1\",null,\"Heading 1\",0],[\"ctrl+alt+2\",\"meta+alt+2\",null,\"Heading 2\",0],[\"ctrl+alt+3\",\"meta+alt+3\",null,\"Heading 3\",0],[\"ctrl+alt+f\",null,null,\"Forward an event\",0],[\"ctrl+alt+k\",null,null,\"Mark all as read (Activity)\",0],[\"ctrl+alt+m\",null,null,\"Filter activity to mentions\",0],[\"ctrl+alt+arrowleft\",null,null,\"Calendar previous day/week\",0],[\"ctrl+alt+arrowright\",null,null,\"Calendar next day/week\",0],[\"alt+shift+r\",\"meta+shift+r\",null,\"Reply to last message\",0],[\"alt+shift+o\",\"meta+alt+o\",null,\"Attach file\",0],[\"alt+shift+e\",null,null,\"Open video recorder\",0],[\"alt+shift+a\",null,null,\"Start audio call\",0],[\"alt+shift+v\",null,null,\"Start video call\",0],[\"alt+shift+equal\",\"meta+alt+equal\",null,\"Zoom in shared content\",0],[\"alt+shift+minus\",\"meta+alt+minus\",null,\"Zoom out shared content\",0],[\"alt+shift+0\",\"meta+alt+0\",null,\"Reset zoom\",0],[\"alt+shift+arrowup\",\"meta+alt+arrowup\",null,\"Pan up\",0],[\"alt+shift+arrowdown\",\"meta+alt+arrowdown\",null,\"Pan down\",0],[\"alt+shift+arrowleft\",\"meta+alt+arrowleft\",null,\"Pan left\",0],[\"alt+shift+arrowright\",\"meta+alt+arrowright\",null,\"Pan right\",0],[\"alt+shift+j\",null,null,\"Join from meeting details\",0],[\"alt+shift+s\",null,null,\"Go to suggested time\",0],[\"alt+shift+1\",null,null,\"Day view\",0],[\"alt+shift+2\",null,null,\"Work week view\",0],[\"alt+shift+3\",null,null,\"Week view\",0],[\"alt+shift+4\",null,null,\"Month view\",0],[\"alt+shift+5\",null,null,\"Agenda in month view\",0],[\"alt+shift+y\",null,null,\"Go to today\",0],[\"ctrl+alt+shift+r\",\"meta+alt+shift+r\",null,\"Report a problem\",0],[\"ctrl+alt+shift+1\",null,null,\"Download diagnostic logs\",0]]},{\"id\":\"onenote-web\",\"name\":\"OneNote for the web\",\"hosts\":[\"onenote.cloud.microsoft\",\"www.onenote.com\",\"*.officeapps.live.com\",\"onedrive.live.com\"],\"pathPrefixes\":[],\"shortcuts\":[[\"ctrl+shift+f\",null,null,\"Create a new outline\",1],[\"alt+shift+arrowright\",null,null,\"Increase paragraph indent\",1],[\"alt+shift+arrowleft\",null,null,\"Decrease paragraph indent\",1]]},{\"id\":\"notion\",\"name\":\"Notion\",\"hosts\":[\"www.notion.so\",\"www.notion.com\"],\"pathPrefixes\":[],\"shortcuts\":[[\"ctrl+shift+n\",\"meta+shift+n\",\"ctrl+shift+n\",\"Open a new Notion window\",1],[\"ctrl+shift+l\",\"meta+shift+l\",\"ctrl+shift+l\",\"Toggle dark/light mode\",1],[\"ctrl+shift+m\",\"meta+shift+m\",\"ctrl+shift+m\",\"Create a comment\",1],[\"ctrl+shift+s\",\"meta+shift+s\",\"ctrl+shift+s\",\"Strikethrough\",1],[\"ctrl+shift+u\",\"meta+shift+u\",\"ctrl+shift+u\",\"Go up one level in page hierarchy\",1],[\"ctrl+shift+h\",\"meta+shift+h\",\"ctrl+shift+h\",\"Apply last used text or highlight color\",1],[null,\"ctrl+shift+k\",null,\"Previous database page in peek view\",1],[null,\"ctrl+shift+j\",null,\"Next database page in peek view\",1],[\"ctrl+shift+arrowup\",\"meta+shift+arrowup\",\"ctrl+shift+arrowup\",\"Move selected block(s) up\",1],[\"ctrl+shift+arrowdown\",\"meta+shift+arrowdown\",\"ctrl+shift+arrowdown\",\"Move selected block(s) down\",1],[\"ctrl+shift+arrowleft\",\"meta+shift+arrowleft\",\"ctrl+shift+arrowleft\",\"Move/outdent selected block(s)\",0],[\"ctrl+shift+arrowright\",\"meta+shift+arrowright\",\"ctrl+shift+arrowright\",\"Move/indent selected block(s)\",0],[\"ctrl+shift+t\",\"meta+alt+t\",\"ctrl+shift+t\",\"Expand or close all toggles in a toggle list\",1],[\"ctrl+shift+0\",\"meta+alt+0\",\"ctrl+shift+0\",\"Turn block into text/heading/to-do/list/code/page (digit)\",1],[\"ctrl+shift+1\",\"meta+alt+1\",\"ctrl+shift+1\",\"Turn block into text/heading/to-do/list/code/page (digit)\",1],[\"ctrl+shift+2\",\"meta+alt+2\",\"ctrl+shift+2\",\"Turn block into text/heading/to-do/list/code/page (digit)\",1],[\"ctrl+shift+3\",\"meta+alt+3\",\"ctrl+shift+3\",\"Turn block into text/heading/to-do/list/code/page (digit)\",1],[\"ctrl+shift+4\",\"meta+alt+4\",\"ctrl+shift+4\",\"Turn block into text/heading/to-do/list/code/page (digit)\",1],[\"ctrl+shift+5\",\"meta+alt+5\",\"ctrl+shift+5\",\"Turn block into text/heading/to-do/list/code/page (digit)\",1],[\"ctrl+shift+6\",\"meta+alt+6\",\"ctrl+shift+6\",\"Turn block into text/heading/to-do/list/code/page (digit)\",1],[\"ctrl+shift+7\",\"meta+alt+7\",\"ctrl+shift+7\",\"Turn block into text/heading/to-do/list/code/page (digit)\",1],[\"ctrl+shift+8\",\"meta+alt+8\",\"ctrl+shift+8\",\"Turn block into text/heading/to-do/list/code/page (digit)\",1],[\"ctrl+shift+9\",\"meta+alt+9\",\"ctrl+shift+9\",\"Turn block into text/heading/to-do/list/code/page (digit)\",1]]},{\"id\":\"slack\",\"name\":\"Slack\",\"hosts\":[\"app.slack.com\"],\"pathPrefixes\":[\"/client/\"],\"shortcuts\":[[\"ctrl+shift+k\",\"meta+shift+k\",\"ctrl+shift+k\",\"Compose new message / Browse DMs\",1],[\"ctrl+shift+2\",null,\"ctrl+shift+2\",\"Browse DMs (Windows row)\",1],[\"ctrl+shift+y\",\"meta+shift+y\",\"ctrl+shift+y\",\"Set status\",1],[\"ctrl+shift+n\",\"meta+shift+n\",\"ctrl+shift+n\",\"Create new canvas\",1],[\"ctrl+shift+j\",\"meta+shift+j\",\"ctrl+shift+j\",\"View downloaded files\",1],[\"ctrl+shift+enter\",\"meta+shift+enter\",\"ctrl+shift+enter\",\"Create snippet\",1],[\"ctrl+shift+backquote\",\"meta+shift+backquote\",\"ctrl+shift+backquote\",\"Add emoji reaction\",1],[\"ctrl+shift+backslash\",\"meta+shift+backslash\",\"ctrl+shift+backslash\",\"Add emoji reaction (layout variant)\",1],[\"ctrl+shift+h\",\"meta+shift+h\",\"ctrl+shift+h\",\"Start/join/leave huddle (canvas: find and replace)\",1],[\"ctrl+shift+space\",\"meta+shift+space\",\"ctrl+shift+space\",\"Toggle huddle mute\",1],[\"ctrl+shift+w\",\"meta+shift+w\",\"ctrl+shift+w\",\"Reopen last closed window\",1],[\"ctrl+shift+e\",\"meta+shift+e\",\"ctrl+shift+e\",\"Open People view\",1],[\"ctrl+shift+m\",\"meta+shift+m\",\"ctrl+shift+m\",\"Open Activity view\",1],[\"ctrl+shift+t\",\"meta+shift+t\",\"ctrl+shift+t\",\"Open Threads view\",1],[\"ctrl+shift+l\",\"meta+shift+l\",\"ctrl+shift+l\",\"Browse channels\",1],[\"ctrl+shift+i\",\"meta+shift+i\",\"ctrl+shift+i\",\"Open conversation details\",1],[\"ctrl+shift+a\",\"meta+shift+a\",\"ctrl+shift+a\",\"Open All unreads view\",1],[\"ctrl+shift+s\",\"meta+shift+s\",\"ctrl+shift+s\",\"Expand/collapse workspace switcher\",1],[\"ctrl+shift+x\",\"meta+shift+x\",\"ctrl+shift+x\",\"Strikethrough text\",1],[\"ctrl+shift+u\",\"meta+shift+u\",\"ctrl+shift+u\",\"Hyperlink text\",1],[\"ctrl+shift+9\",\"meta+shift+9\",\"ctrl+shift+9\",\"Quote text\",1],[\"ctrl+shift+8\",\"meta+shift+8\",\"ctrl+shift+8\",\"Bulleted list\",1],[\"ctrl+shift+7\",\"meta+shift+7\",\"ctrl+shift+7\",\"Numbered list\",1],[\"ctrl+shift+c\",\"meta+shift+c\",\"ctrl+shift+c\",\"Code text\",1],[\"ctrl+shift+f\",\"meta+shift+f\",\"ctrl+shift+f\",\"Apply markdown formatting\",1],[\"ctrl+shift+0\",\"meta+shift+0\",\"ctrl+shift+0\",\"Format as checklist (canvas)\",1],[\"ctrl+shift+g\",\"meta+shift+g\",\"ctrl+shift+g\",\"Find previous (canvas)\",1],[\"ctrl+shift+z\",\"meta+shift+z\",\"ctrl+shift+z\",\"Redo (canvas)\",1],[null,\"meta+shift+slash\",null,\"Open context menu (canvas), Mac\",1],[\"ctrl+shift+1\",null,\"ctrl+shift+1\",\"Switch to tab by number (Shift Ctrl [number], digits 1-9)\",1],[\"alt+shift+arrowup\",\"alt+shift+arrowup\",\"alt+shift+arrowup\",\"Jump to previous unread channel/DM\",1],[\"alt+shift+arrowdown\",\"alt+shift+arrowdown\",\"alt+shift+arrowdown\",\"Jump to next unread channel/DM\",1],[\"ctrl+alt+shift+c\",\"meta+alt+shift+c\",\"ctrl+alt+shift+c\",\"Codeblock text\",1],[\"ctrl+alt+0\",\"meta+alt+0\",\"ctrl+alt+0\",\"Paragraph (canvas)\",1],[\"ctrl+alt+1\",\"meta+alt+1\",\"ctrl+alt+1\",\"Big heading (canvas)\",1],[\"ctrl+alt+2\",\"meta+alt+2\",\"ctrl+alt+2\",\"Medium heading (canvas)\",1],[\"ctrl+alt+3\",\"meta+alt+3\",\"ctrl+alt+3\",\"Small heading (canvas)\",1],[\"ctrl+alt+t\",\"meta+alt+t\",\"ctrl+alt+t\",\"View comment thread (canvas)\",1],[\"ctrl+alt+r\",\"meta+alt+r\",\"ctrl+alt+r\",\"Show reader/edit view (canvas)\",1],[\"ctrl+alt+arrowup\",\"meta+alt+arrowup\",\"ctrl+alt+arrowup\",\"Move list item up (canvas)\",1],[\"ctrl+alt+arrowdown\",\"meta+alt+arrowdown\",\"ctrl+alt+arrowdown\",\"Move list item down (canvas)\",1],[\"ctrl+alt+q\",\"ctrl+alt+q\",\"ctrl+alt+q\",\"Copy anchor link (canvas)\",1]]},{\"id\":\"discord\",\"name\":\"Discord\",\"hosts\":[\"discord.com\"],\"pathPrefixes\":[\"/channels/\"],\"shortcuts\":[[\"ctrl+shift+m\",\"meta+shift+m\",\"ctrl+shift+m\",\"Toggle mute\",1],[\"ctrl+shift+d\",\"meta+shift+d\",\"ctrl+shift+d\",\"Toggle deafen\",1],[\"ctrl+shift+u\",\"meta+shift+u\",\"ctrl+shift+u\",\"Attach a file to your message\",1],[\"ctrl+shift+b\",\"meta+shift+b\",\"ctrl+shift+b\",\"Open soundboard during voice call\",1],[\"ctrl+alt+shift+v\",\"meta+alt+shift+v\",\"ctrl+alt+shift+v\",\"Return to your active voice call\",1]]},{\"id\":\"confluence\",\"name\":\"Confluence Cloud\",\"hosts\":[\"*.atlassian.net\"],\"pathPrefixes\":[\"/wiki/\"],\"shortcuts\":[[\"ctrl+shift+7\",\"meta+shift+7\",\"ctrl+shift+7\",\"Numbered list\",1],[\"ctrl+shift+8\",\"meta+shift+8\",\"ctrl+shift+8\",\"Bullet list\",1],[\"ctrl+shift+9\",\"meta+shift+9\",\"ctrl+shift+9\",\"Quote\",1],[\"ctrl+shift+m\",\"meta+shift+m\",\"ctrl+shift+m\",\"Code\",1],[\"ctrl+shift+s\",\"alt+shift+s\",\"ctrl+shift+s\",\"Strikethrough\",1],[\"ctrl+shift+comma\",\"alt+shift+comma\",\"ctrl+shift+comma\",\"Subscript\",1],[\"ctrl+shift+period\",\"alt+shift+period\",\"ctrl+shift+period\",\"Superscript\",1],[\"ctrl+shift+enter\",\"meta+shift+enter\",\"ctrl+shift+enter\",\"Publish with note\",1],[\"ctrl+shift+i\",\"ctrl+shift+i\",\"ctrl+shift+i\",\"Open details panel\",1],[\"ctrl+shift+u\",\"meta+shift+u\",\"ctrl+shift+u\",\"Next unread comment\",1],[\"ctrl+shift+d\",\"meta+shift+d\",\"ctrl+shift+d\",\"Insert markup\",1],[\"ctrl+shift+a\",\"meta+shift+a\",\"ctrl+shift+a\",\"Macro\",1],[null,\"meta+shift+i\",null,\"Insert table (Mac only per page)\",0],[\"ctrl+alt+shift+b\",\"meta+alt+shift+b\",\"ctrl+alt+shift+b\",\"Blog post\",1],[\"ctrl+alt+o\",\"meta+alt+o\",\"ctrl+alt+o\",\"Open notifications\",1],[\"ctrl+alt+h\",\"meta+alt+h\",\"ctrl+alt+h\",\"Go Home\",1],[\"ctrl+alt+g\",\"meta+alt+g\",\"ctrl+alt+g\",\"Open recent\",1],[\"ctrl+alt+8\",\"meta+alt+8\",\"ctrl+alt+8\",\"Open starred\",1],[\"ctrl+alt+v\",\"meta+alt+v\",\"ctrl+alt+v\",\"Go to space overview\",1],[\"ctrl+alt+0\",\"meta+alt+0\",\"ctrl+alt+0\",\"Paragraph\",1],[\"ctrl+alt+1\",\"meta+alt+1\",\"ctrl+alt+1\",\"Heading 1\",1],[\"ctrl+alt+2\",\"meta+alt+2\",\"ctrl+alt+2\",\"Heading 2\",1],[\"ctrl+alt+3\",\"meta+alt+3\",\"ctrl+alt+3\",\"Heading 3\",1],[\"ctrl+alt+4\",\"meta+alt+4\",\"ctrl+alt+4\",\"Heading 4\",1],[\"ctrl+alt+5\",\"meta+alt+5\",\"ctrl+alt+5\",\"Heading 5\",1],[\"ctrl+alt+6\",\"meta+alt+6\",\"ctrl+alt+6\",\"Heading 6\",1],[\"ctrl+alt+y\",\"meta+alt+y\",\"ctrl+alt+y\",\"Highlight yellow\",1],[\"ctrl+alt+c\",\"meta+alt+c\",\"ctrl+alt+c\",\"Comment\",1],[\"ctrl+alt+w\",\"meta+alt+w\",\"ctrl+alt+w\",\"Watch\",1],[\"ctrl+alt+s\",\"meta+alt+s\",\"ctrl+alt+s\",\"Share\",1],[\"ctrl+alt+e\",\"meta+alt+e\",\"ctrl+alt+e\",\"Align center\",1],[\"ctrl+alt+t\",\"meta+alt+t\",\"ctrl+alt+t\",\"Align right\",1],[\"ctrl+alt+a\",\"ctrl+alt+a\",\"ctrl+alt+a\",\"Edit labels\",1],[\"ctrl+alt+f\",\"ctrl+alt+f\",\"ctrl+alt+f\",\"Favorite content\",1],[null,\"ctrl+alt+c\",null,\"Create page (Mac)\",1],[null,\"ctrl+alt+t\",null,\"Attachments (Mac)\",1],[\"ctrl+alt+p\",null,\"ctrl+alt+p\",\"Presenter mode\",1],[\"ctrl+alt+arrowup\",null,\"ctrl+alt+arrowup\",\"Table row/column operations (Ctrl+Alt+Arrow keys)\",1],[\"ctrl+alt+equal\",null,\"ctrl+alt+equal\",\"Table insert row/column\",1],[\"ctrl+alt+minus\",null,\"ctrl+alt+minus\",\"Table delete row/column\",1],[\"alt+shift+z\",\"ctrl+alt+z\",\"alt+shift+z\",\"Quick search\",1],[\"ctrl+alt+shift+r\",\"meta+alt+shift+r\",\"ctrl+alt+shift+r\",\"Table resize (whiteboard/table)\",1],[\"ctrl+alt+shift+arrowup\",\"meta+alt+shift+arrowup\",\"ctrl+alt+shift+arrowup\",\"Table column selection (Up/Down arrows)\",1],[\"ctrl+alt+shift+arrowdown\",\"meta+alt+shift+arrowdown\",\"ctrl+alt+shift+arrowdown\",\"Table column selection\",1],[\"ctrl+alt+shift+arrowleft\",\"meta+alt+shift+arrowleft\",\"ctrl+alt+shift+arrowleft\",\"Table row selection (Left/Right arrows)\",1],[\"ctrl+alt+shift+arrowright\",\"meta+alt+shift+arrowright\",\"ctrl+alt+shift+arrowright\",\"Table row selection\",1],[\"ctrl+shift+1\",\"meta+shift+1\",\"ctrl+shift+1\",\"Whiteboard: zoom to fit\",1],[\"ctrl+shift+2\",null,\"ctrl+shift+2\",\"Whiteboard: zoom to selection\",1]]},{\"id\":\"jira\",\"name\":\"Jira Cloud\",\"hosts\":[\"*.atlassian.net\"],\"pathPrefixes\":[\"/jira/\",\"/browse/\"],\"shortcuts\":[]},{\"id\":\"linear\",\"name\":\"Linear\",\"hosts\":[\"linear.app\"],\"pathPrefixes\":[],\"shortcuts\":[[\"ctrl+shift+o\",\"meta+shift+o\",\"ctrl+shift+o\",\"Create sub-issue\",0],[\"ctrl+shift+arrowup\",\"meta+shift+arrowup\",\"ctrl+shift+arrowup\",\"Open parent issue\",0],[\"ctrl+shift+s\",\"meta+shift+s\",\"ctrl+shift+s\",\"Manage subscribers\",0],[\"ctrl+shift+m\",\"meta+shift+m\",\"ctrl+shift+m\",\"Move to another team\",0],[\"ctrl+shift+period\",\"meta+shift+period\",\"ctrl+shift+period\",\"Copy Git branch name\",0],[\"ctrl+shift+comma\",\"meta+shift+comma\",\"ctrl+shift+comma\",\"Copy issue URL\",0],[\"ctrl+shift+d\",\"meta+shift+d\",\"ctrl+shift+d\",\"Remove due date\",0],[\"alt+shift+f\",\"alt+shift+f\",\"alt+shift+f\",\"Clear all filters\",0],[\"ctrl+shift+1\",\"meta+shift+1\",\"ctrl+shift+1\",\"Go to team 1\",0],[\"ctrl+shift+2\",\"meta+shift+2\",\"ctrl+shift+2\",\"Go to team 2\",0],[\"ctrl+shift+3\",\"meta+shift+3\",\"ctrl+shift+3\",\"Go to team 3\",0],[\"ctrl+shift+4\",\"meta+shift+4\",\"ctrl+shift+4\",\"Go to team 4\",0],[\"ctrl+shift+5\",\"meta+shift+5\",\"ctrl+shift+5\",\"Go to team 5\",0],[\"ctrl+shift+6\",\"meta+shift+6\",\"ctrl+shift+6\",\"Go to team 6\",0],[\"ctrl+shift+7\",\"meta+shift+7\",\"ctrl+shift+7\",\"Go to team 7\",0],[\"ctrl+shift+8\",\"meta+shift+8\",\"ctrl+shift+8\",\"Go to team 8\",0],[\"ctrl+shift+9\",\"meta+shift+9\",\"ctrl+shift+9\",\"Go to team 9\",0],[\"ctrl+alt+1\",\"meta+alt+1\",\"ctrl+alt+1\",\"Set status by position 1\",0],[\"ctrl+alt+2\",\"meta+alt+2\",\"ctrl+alt+2\",\"Set status by position 2\",0],[\"ctrl+alt+3\",\"meta+alt+3\",\"ctrl+alt+3\",\"Set status by position 3\",0],[\"ctrl+alt+4\",\"meta+alt+4\",\"ctrl+alt+4\",\"Set status by position 4\",0],[\"ctrl+alt+5\",\"meta+alt+5\",\"ctrl+alt+5\",\"Set status by position 5\",0],[\"ctrl+alt+6\",\"meta+alt+6\",\"ctrl+alt+6\",\"Set status by position 6\",0],[\"ctrl+alt+7\",\"meta+alt+7\",\"ctrl+alt+7\",\"Set status by position 7\",0],[\"ctrl+alt+8\",\"meta+alt+8\",\"ctrl+alt+8\",\"Set status by position 8\",0],[\"ctrl+alt+9\",\"meta+alt+9\",\"ctrl+alt+9\",\"Set status by position 9\",0]]},{\"id\":\"github\",\"name\":\"GitHub\",\"hosts\":[\"github.com\"],\"pathPrefixes\":[],\"shortcuts\":[[\"ctrl+shift+7\",\"meta+shift+7\",null,\"Ordered list markdown (comment box, file editor)\",1],[\"ctrl+shift+8\",\"meta+shift+8\",null,\"Unordered list markdown (comment box, file editor)\",1],[\"ctrl+shift+period\",\"meta+shift+period\",null,\"Quote markdown (comment box, file editor)\",1],[\"ctrl+shift+g\",\"meta+shift+g\",null,\"Find previous (code editor)\",1],[\"ctrl+shift+r\",\"meta+alt+shift+f\",null,\"Replace all (code editor)\",1],[\"ctrl+shift+p\",\"meta+shift+p\",null,\"Toggle Write/Preview tabs (comments, issues, PRs, editor)\",1],[\"ctrl+shift+v\",\"meta+shift+v\",null,\"Paste HTML link as plain text\",1],[\"ctrl+alt+shift+v\",\"meta+alt+shift+v\",null,\"Paste HTML link as plain text (alternate chord)\",1],[\"ctrl+shift+enter\",\"meta+shift+enter\",null,\"Submit a review comment (Files changed tab)\",1],[\"ctrl+shift+backslash\",\"meta+shift+backslash\",null,\"Open row actions menu (Projects)\",1],[\"alt+shift+c\",\"alt+shift+c\",null,\"Open line menu for selected code (code view/editor)\",1],[\"alt+shift+c\",\"alt+shift+c\",null,\"Create a new sub-issue (issues)\",1],[\"alt+shift+a\",\"alt+shift+a\",null,\"Add an existing issue as sub-issue\",1],[\"alt+shift+p\",\"alt+shift+p\",null,\"Edit parent issue\",1]]},{\"id\":\"gutenberg\",\"name\":\"WordPress block editor (Gutenberg)\",\"hosts\":[\"*\"],\"pathPrefixes\":[\"/wp-admin/post.php\",\"/wp-admin/post-new.php\"],\"shortcuts\":[[\"ctrl+alt+shift+m\",\"meta+alt+shift+m\",null,\"Switch visual editor / code editor\",1],[\"ctrl+alt+shift+f\",\"meta+alt+shift+f\",null,\"Toggle fullscreen mode\",1],[\"alt+shift+o\",\"ctrl+alt+o\",null,\"Open block list view\",1],[\"ctrl+shift+comma\",\"meta+shift+comma\",null,\"Show/hide settings sidebar\",1],[\"alt+shift+n\",\"ctrl+alt+n\",null,\"Navigate to next part of editor\",1],[\"ctrl+shift+backquote\",\"ctrl+shift+backquote\",null,\"Navigate to previous part of editor\",1],[\"alt+shift+p\",\"ctrl+alt+p\",null,\"Navigate to previous part of editor (alternate)\",1],[\"ctrl+shift+z\",\"meta+shift+z\",null,\"Redo\",1],[\"ctrl+shift+0\",\"meta+shift+0\",null,\"Zoom out toggle\",1],[\"ctrl+shift+d\",\"meta+shift+d\",null,\"Duplicate selected block(s)\",1],[\"alt+shift+z\",\"ctrl+alt+z\",null,\"Remove selected block(s)\",1],[\"ctrl+alt+t\",\"meta+alt+t\",null,\"Insert block before selection\",1],[\"ctrl+alt+y\",\"meta+alt+y\",null,\"Insert block after selection\",1],[\"ctrl+alt+shift+t\",\"meta+alt+shift+t\",null,\"Move selected block(s) up\",1],[\"ctrl+alt+shift+y\",\"meta+alt+shift+y\",null,\"Move selected block(s) down\",1],[\"ctrl+alt+v\",\"meta+alt+v\",null,\"Paste styles from copied block\",1],[\"ctrl+shift+k\",\"meta+shift+k\",null,\"Remove link\",1],[\"ctrl+alt+x\",\"meta+alt+x\",null,\"Inline code\",1],[\"alt+shift+1\",\"meta+alt+1\",null,\"Convert paragraph/heading to heading level 1\",1],[\"alt+shift+2\",\"meta+alt+2\",null,\"Convert paragraph/heading to heading level 2\",1],[\"alt+shift+3\",\"meta+alt+3\",null,\"Convert paragraph/heading to heading level 3\",1],[\"alt+shift+4\",\"meta+alt+4\",null,\"Convert paragraph/heading to heading level 4\",1],[\"alt+shift+5\",\"meta+alt+5\",null,\"Convert paragraph/heading to heading level 5\",1],[\"alt+shift+6\",\"meta+alt+6\",null,\"Convert paragraph/heading to heading level 6\",1],[\"alt+shift+0\",\"meta+alt+0\",null,\"Convert heading to paragraph\",1],[\"alt+shift+h\",\"ctrl+alt+h\",null,\"Show list of all editor shortcuts\",1]]},{\"id\":\"medium\",\"name\":\"Medium\",\"hosts\":[\"medium.com\"],\"pathPrefixes\":[],\"shortcuts\":[]},{\"id\":\"reddit\",\"name\":\"Reddit\",\"hosts\":[\"www.reddit.com\"],\"pathPrefixes\":[],\"shortcuts\":[]},{\"id\":\"linkedin\",\"name\":\"LinkedIn\",\"hosts\":[\"www.linkedin.com\"],\"pathPrefixes\":[],\"shortcuts\":[]},{\"id\":\"x\",\"name\":\"X / Twitter\",\"hosts\":[\"x.com\",\"twitter.com\"],\"pathPrefixes\":[],\"shortcuts\":[]},{\"id\":\"substack\",\"name\":\"Substack\",\"hosts\":[\"substack.com\"],\"pathPrefixes\":[],\"shortcuts\":[]}]}\n", "// sites.js\n// Website shortcut awareness for hotkey-router.\n//\n// Apps that bind hotkeys on other people's pages (browser extensions,\n// embedded widgets) collide with the page's own shortcuts: Google Docs uses\n// Ctrl+Shift+. for font size, GitHub for \"quote\". Those keys DO reach the\n// page (unlike the browser/OS keys in data/browser-hotkeys.json), so the\n// app has a choice. This module looks the page up in data/site-hotkeys.json\n// and builds a `when()` gate that yields to the site unless the user is\n// focused on the app:\n//\n// import hotkeys from 'hotkey-router'\n// import { siteAware } from 'hotkey-router/sites'\n//\n// hotkeys.bind('mod+shift+code:Period', next, null, {\n// capture: true, // see the key before the page's editor\n// preventDefault: true,\n// stopPropagation: true, // when we do take it, the page doesn't\n// when: siteAware('mod+shift+code:Period', { engaged: () => popupIsOpen() }),\n// })\n//\n// On a site that uses the chord, the gate returns engaged(); elsewhere it\n// returns true. When it returns false, hotkey-router leaves the event alone\n// and the site's shortcut runs.\n//\n// Data: data/site-hotkeys.runtime.json (compact projection of the sourced\n// table in data/site-hotkeys.json), human reference docs/site-hotkeys.md.\n// Self-contained (no import of the core router), so importing it never\n// creates a second router instance.\n\nimport SITE_DATA from './data/site-hotkeys.runtime.json' with { type: 'json' }\n\n// Runtime row layout: [windows, mac, chromeos, action, verified (1 or 0)]\nconst COL = { windows: 0, mac: 1, chromeos: 2, action: 3, verified: 4 }\n\nconst SUPPORTED_SCHEMA = '1.0'\nconst SCHEMA_OK = SITE_DATA?.version?.schema === SUPPORTED_SCHEMA\n\n/** @typedef {'mac' | 'windows' | 'linux' | 'chromeos'} SitePlatform */\n\n/**\n * @param {Navigator | null} [nav]\n * @returns {SitePlatform | null}\n */\nexport function detectSitePlatform(nav = (typeof navigator !== 'undefined' ? navigator : null)) {\n if (!nav) return null\n const ua = nav.userAgent || ''\n if (/\\bCrOS\\b/.test(ua)) return 'chromeos'\n const platform = nav.userAgentData?.platform || nav.platform || ''\n if (/Mac|iPhone|iPad|iPod/i.test(platform)) return 'mac'\n if (/Win/i.test(platform)) return 'windows'\n if (/Linux|X11|Chrome OS/i.test(platform)) return /Chrome OS/i.test(platform) ? 'chromeos' : 'linux'\n return null\n}\n\n// --- combo -> canonical lookup key -------------------------------------------\n\nconst PUNCT_KEYS = {\n '.': 'period', ',': 'comma', ';': 'semicolon', \"'\": 'quote', '/': 'slash',\n '\\\\': 'backslash', '[': 'bracketleft', ']': 'bracketright', '-': 'minus',\n '=': 'equal', '`': 'backquote', ' ': 'space',\n}\nconst NAMED_KEYS = new Set([\n 'period', 'comma', 'semicolon', 'quote', 'slash', 'backslash', 'bracketleft',\n 'bracketright', 'minus', 'equal', 'backquote', 'enter', 'space', 'tab',\n 'backspace', 'delete', 'escape', 'arrowup', 'arrowdown', 'arrowleft',\n 'arrowright', 'home', 'end', 'pageup', 'pagedown',\n])\nconst KEY_ALIASES = { esc: 'escape', del: 'delete', spacebar: 'space', return: 'enter', up: 'arrowup', down: 'arrowdown', left: 'arrowleft', right: 'arrowright' }\n\nfunction codeToBase(code) {\n const letter = /^Key([A-Z])$/.exec(code)\n if (letter) return letter[1].toLowerCase()\n const digit = /^(?:Digit|Numpad)(\\d)$/.exec(code)\n if (digit) return digit[1]\n return code.toLowerCase()\n}\n\nfunction keyToBase(key) {\n if (key == null) return null\n if (PUNCT_KEYS[key]) return PUNCT_KEYS[key]\n const k = String(key).toLowerCase()\n if (KEY_ALIASES[k]) return KEY_ALIASES[k]\n if (/^[a-z0-9]$/.test(k) || /^f\\d{1,2}$/.test(k) || NAMED_KEYS.has(k)) return k\n return k\n}\n\n/**\n * Parse a hotkey string (`mod+shift+code:Period`, `ctrl+alt+,`) into modifier\n * flags and a canonical base key name (`period`), resolving `mod` for the\n * platform. Shared with validate.js.\n *\n * @param {string} str\n * @param {SitePlatform} platform\n * @returns {{ ctrl: boolean, meta: boolean, alt: boolean, shift: boolean, base: string | null }}\n */\nexport function parseComboString(str, platform) {\n const flags = { ctrl: false, meta: false, alt: false, shift: false }\n let base = null\n const tokens = String(str).trim().toLowerCase().replace(/\\s+up$/, '').split('+')\n // A trailing empty token means the key itself was '+'.\n for (let i = 0; i < tokens.length; i++) {\n const t = tokens[i]\n if (t === '' && i === tokens.length - 1) { base = 'equal'; continue }\n if (t === 'mod') flags[platform === 'mac' ? 'meta' : 'ctrl'] = true\n else if (t === 'ctrl' || t === 'control') flags.ctrl = true\n else if (t === 'cmd' || t === 'command' || t === 'meta' || t === 'win') flags.meta = true\n else if (t === 'alt' || t === 'option' || t === 'opt') flags.alt = true\n else if (t === 'shift') flags.shift = true\n else if (t.startsWith('code:')) base = codeToBase(String(str).match(/code:([A-Za-z0-9_]+)/)[1])\n else base = keyToBase(t)\n }\n return { ...flags, base }\n}\n\n/**\n * The canonical lookup key for a combo on a platform (`ctrl+shift+period`).\n * Accepts a hotkey string or a parsed combo from hotkey-router (`onBind`).\n *\n * @param {string | { ctrl?: boolean, meta?: boolean, alt?: boolean, shift?: boolean, key?: string, code?: string }} combo\n * @param {SitePlatform} [platform]\n * @returns {string | null}\n */\nexport function siteLookupKey(combo, platform = detectSitePlatform() || 'windows') {\n const c = typeof combo === 'string'\n ? parseComboString(combo, platform)\n : { ...combo, base: combo?.code ? codeToBase(combo.code) : keyToBase(combo?.key) }\n if (!c?.base) return null\n const parts = []\n if (c.ctrl) parts.push('ctrl')\n if (c.meta) parts.push('meta')\n if (c.alt) parts.push('alt')\n if (c.shift) parts.push('shift')\n parts.push(c.base)\n return parts.join('+')\n}\n\n// --- site matching ------------------------------------------------------------\n\nfunction hostMatches(pattern, host) {\n if (pattern === '*') return true\n if (pattern.startsWith('*.')) {\n const suffix = pattern.slice(1) // \".atlassian.net\"\n return host.endsWith(suffix) && host.length > suffix.length\n }\n return host === pattern\n}\n\nfunction toUrl(url) {\n if (url instanceof URL) return url\n try {\n return new URL(String(url))\n } catch {\n return null\n }\n}\n\n/**\n * The researched sites whose hosts (and path prefixes, when listed) match a\n * URL. Defaults to the current page.\n *\n * @param {string | URL} [url]\n * @returns {Array<object>}\n */\nexport function matchSites(url = (typeof location !== 'undefined' ? location.href : '')) {\n if (!SCHEMA_OK) return []\n const u = toUrl(url)\n if (!u) return []\n const host = u.hostname.toLowerCase()\n return SITE_DATA.sites.filter((site) =>\n site.hosts.some((h) => hostMatches(h.toLowerCase(), host)) &&\n (!site.pathPrefixes?.length || site.pathPrefixes.some((p) => u.pathname.startsWith(p)))\n )\n}\n\n/**\n * @typedef {{\n * siteId: string,\n * siteName: string,\n * action: string,\n * verified: boolean,\n * lookupKey: string\n * }} SiteConflict\n *\n * Sources for each row are in data/site-hotkeys.json (look it up by siteId).\n */\n\n/**\n * The shortcuts on the page (or a given URL) that use the same chord.\n *\n * @param {string | object} combo hotkey string or parsed combo\n * @param {{ url?: string | URL, platform?: SitePlatform, verifiedOnly?: boolean }} [opts]\n * @returns {SiteConflict[]}\n */\nexport function lookupSiteConflicts(combo, { url, platform, verifiedOnly = false } = {}) {\n const plat = platform || detectSitePlatform() || 'windows'\n const lookupKey = siteLookupKey(combo, plat)\n if (!lookupKey) return []\n const field = plat === 'mac' ? 'mac' : plat === 'chromeos' ? 'chromeos' : 'windows'\n const conflicts = []\n for (const site of matchSites(url)) {\n for (const row of site.shortcuts) {\n const verified = row[COL.verified] === 1\n if (verifiedOnly && !verified) continue\n const key = row[COL[field]] ?? (field === 'chromeos' ? row[COL.windows] : null)\n if (key === lookupKey) {\n conflicts.push({ siteId: site.id, siteName: site.name, action: row[COL.action], verified, lookupKey })\n }\n }\n }\n return conflicts\n}\n\n/**\n * A `when()` gate for a binding: true on sites that don't use the chord;\n * on sites that do, true only while `engaged(e)` says the user is focused\n * on the app. Conflicts are looked up once per page URL.\n *\n * @param {string | object} combo the binding's hotkey string (or parsed combo)\n * @param {{\n * engaged: (e?: KeyboardEvent) => boolean,\n * url?: () => string,\n * platform?: SitePlatform,\n * verifiedOnly?: boolean,\n * onYield?: (conflicts: SiteConflict[], e?: KeyboardEvent) => void\n * }} opts\n * @returns {(e?: KeyboardEvent) => boolean}\n */\nexport function siteAware(combo, { engaged, url, platform, verifiedOnly = false, onYield } = {}) {\n if (typeof engaged !== 'function') throw new Error('siteAware() needs an engaged() callback')\n const currentUrl = url || (() => (typeof location !== 'undefined' ? location.href : ''))\n let cachedUrl = null\n let cached = []\n return (e) => {\n const href = currentUrl()\n if (href !== cachedUrl) {\n cachedUrl = href\n cached = lookupSiteConflicts(combo, { url: href, platform, verifiedOnly })\n }\n if (!cached.length) return true\n if (engaged(e)) return true\n onYield?.(cached, e)\n return false\n }\n}\n\n/**\n * All researched sites, compact form: `{ id, name, hosts, pathPrefixes,\n * shortcuts: [windows, mac, chromeos, action, verified][] }`.\n */\nexport function listSites() {\n return SCHEMA_OK ? SITE_DATA.sites : []\n}\n\nexport const SITE_DATA_RESEARCHED = SITE_DATA?.version?.researched\nexport const SITE_SCHEMA_VERSION = SITE_DATA?.version?.schema\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,2 @@
1
+ export default hotkeys;
2
+ import hotkeys from './hotkey-router.js';
@@ -0,0 +1,196 @@
1
+ declare namespace _default {
2
+ export { init };
3
+ export { destroy };
4
+ export { setTarget };
5
+ export { bind };
6
+ export { unbind };
7
+ export { registerPlugin };
8
+ export { unregisterPlugin };
9
+ export { onBind };
10
+ export { pause };
11
+ export { resume };
12
+ export { ignoreInput };
13
+ export { trigger };
14
+ export { parseHotkey };
15
+ export { comboFromEvent };
16
+ }
17
+ export default _default;
18
+ /**
19
+ * Handler invoked when a bound hotkey fires. Receives the underlying
20
+ * `KeyboardEvent` (real one from the DOM, or a synthetic one produced by
21
+ * {@link trigger}).
22
+ */
23
+ export type HotkeyHandler = (e: KeyboardEvent) => void;
24
+ /**
25
+ * Optional per-binding behavior modifiers. See the inline comment on
26
+ * `normalizeOptions` for the canonical list.
27
+ */
28
+ export type BindOptions = {
29
+ preventDefault?: boolean;
30
+ stopPropagation?: boolean;
31
+ stopImmediatePropagation?: boolean;
32
+ repeat?: boolean;
33
+ once?: boolean;
34
+ when?: (e: KeyboardEvent) => boolean;
35
+ allowIn?: (e: KeyboardEvent) => boolean;
36
+ priority?: number;
37
+ capture?: boolean;
38
+ altGraph?: boolean;
39
+ composing?: boolean;
40
+ };
41
+ /**
42
+ * Return value of {@link bind}: callable to unbind, plus `id` (the unique
43
+ * binding id used internally) and `hotkey` (the original input string).
44
+ */
45
+ export type BindOff = (() => boolean) & {
46
+ id: number;
47
+ hotkey: string;
48
+ };
49
+ /**
50
+ * Payload passed to subscribers registered via {@link onBind} after each
51
+ * successful bind.
52
+ */
53
+ export type BindEvent = {
54
+ combo: ReturnType<typeof parseHotkey>["combo"];
55
+ raw: string;
56
+ options: BindOptions;
57
+ plugin: string | null;
58
+ id: number;
59
+ };
60
+ /**
61
+ * Plugin shape accepted by {@link registerPlugin}: a map from hotkey
62
+ * strings to either a handler or a `[handler, options]` tuple.
63
+ */
64
+ export type HotkeyMap = Record<string, HotkeyHandler | [HotkeyHandler, BindOptions]>;
65
+ /**
66
+ * Initialize the router by attaching `keydown`/`keyup` listeners to a target.
67
+ * Re-initializes cleanly if already running (calls {@link destroy} first).
68
+ * Auto-runs on `window` at module-load time in browser environments.
69
+ *
70
+ * `capture: true` handles every binding in the capture phase. With the
71
+ * default (`false`), bindings run in the bubble phase except those bound
72
+ * with `{ capture: true }`, which a second, capture-phase listener handles:
73
+ * they see the key before the page's own listeners and can stop it.
74
+ *
75
+ * @param {{ target?: EventTarget, capture?: boolean }} [opts]
76
+ * @returns {void}
77
+ */
78
+ declare function init({ target, capture }?: {
79
+ target?: EventTarget;
80
+ capture?: boolean;
81
+ }): void;
82
+ /**
83
+ * Tear down listeners and clear all bindings + plugins. Bind-hook
84
+ * subscribers ({@link onBind}) deliberately survive — consumer
85
+ * extensions should install once and live across `init`/`destroy` cycles.
86
+ *
87
+ * @returns {void}
88
+ */
89
+ declare function destroy(): void;
90
+ /**
91
+ * Replace the default target (used by {@link init} when no `target` is
92
+ * provided). Useful for iframes and tests. Does NOT auto-rebind existing
93
+ * listeners — call {@link destroy} + {@link init} to re-attach.
94
+ *
95
+ * @param {EventTarget | null} target
96
+ * @returns {void}
97
+ */
98
+ declare function setTarget(target: EventTarget | null): void;
99
+ /**
100
+ * Bind a hotkey combo string to a handler.
101
+ *
102
+ * @param {string} hotkeyStr e.g. `'ctrl+shift+k'`, `'meta+slash'`, `'alt+code:KeyX'`
103
+ * @param {HotkeyHandler} handler
104
+ * @param {string | null} [plugin] optional plugin/namespace tag for bulk cleanup
105
+ * @param {BindOptions} [options]
106
+ * @returns {BindOff} unbind function with `id` + `hotkey` props
107
+ */
108
+ declare function bind(hotkeyStr: string, handler: HotkeyHandler, plugin?: string | null, options?: BindOptions): BindOff;
109
+ /**
110
+ * Remove bindings for a combo string. Omit `handler` to remove all bindings
111
+ * for the combo/type; pass a specific handler to remove just that one.
112
+ *
113
+ * @param {string} hotkeyStr
114
+ * @param {HotkeyHandler} [handler]
115
+ * @returns {void}
116
+ */
117
+ declare function unbind(hotkeyStr: string, handler?: HotkeyHandler): void;
118
+ /**
119
+ * Register a named plugin that bulk-binds a {@link HotkeyMap}. All bindings
120
+ * are tagged with the plugin name so {@link unregisterPlugin} can clean them
121
+ * up together without touching other plugins' bindings.
122
+ *
123
+ * @param {string} name plugin name (must be unique)
124
+ * @param {HotkeyMap} hotkeyMap
125
+ * @returns {() => void} unregister fn for this plugin
126
+ */
127
+ declare function registerPlugin(name: string, hotkeyMap: HotkeyMap): () => void;
128
+ /**
129
+ * Remove all bindings owned by the named plugin. Silent no-op if no such
130
+ * plugin is registered.
131
+ *
132
+ * @param {string} name
133
+ * @returns {void}
134
+ */
135
+ declare function unregisterPlugin(name: string): void;
136
+ /**
137
+ * Subscribe to {@link bind} events. The hook is called after each successful
138
+ * bind with a {@link BindEvent} payload.
139
+ *
140
+ * @param {(info: BindEvent) => void} hook
141
+ * @returns {() => void} unsubscribe
142
+ */
143
+ declare function onBind(hook: (info: BindEvent) => void): () => void;
144
+ /** Pause dispatch — bindings stay registered but no handlers fire. @returns {void} */
145
+ declare function pause(): void;
146
+ /** Resume dispatch after a {@link pause}. @returns {void} */
147
+ declare function resume(): void;
148
+ /**
149
+ * Toggle whether handlers fire when the event target is an editable element
150
+ * (input/textarea/contenteditable). Default `true`. Override per-binding via
151
+ * `options.allowIn`.
152
+ *
153
+ * @param {boolean} [value]
154
+ * @returns {void}
155
+ */
156
+ declare function ignoreInput(value?: boolean): void;
157
+ /**
158
+ * Programmatically fire any bindings for `hotkeyStr`. Used by tests and
159
+ * automation; not a typical app-runtime path. Returns `true` if a binding
160
+ * was found and invoked, `false` otherwise.
161
+ *
162
+ * @param {string} hotkeyStr
163
+ * @param {{ type?: 'keydown' | 'keyup' }} [opts]
164
+ * @returns {boolean}
165
+ */
166
+ declare function trigger(hotkeyStr: string, { type: forcedType }?: {
167
+ type?: "keydown" | "keyup";
168
+ }): boolean;
169
+ export function parseHotkey(hotkeyStr: any): {
170
+ combo: {
171
+ ctrl: boolean;
172
+ shift: boolean;
173
+ alt: boolean;
174
+ meta: boolean;
175
+ key: any;
176
+ code: any;
177
+ bareModifier: any;
178
+ };
179
+ type: string;
180
+ raw: any;
181
+ };
182
+ /**
183
+ * The hotkey string for a keyboard event, for a "press your keys" recorder.
184
+ * Physical by default (`ctrl+shift+code:Period`), so the binding survives
185
+ * keyboard layouts. With `useMod`, the platform's primary modifier (Cmd on
186
+ * macOS, Ctrl elsewhere) is written as `mod`. Returns null for a bare
187
+ * modifier press (the user hasn't pressed the base key yet).
188
+ *
189
+ * @param {KeyboardEvent} e
190
+ * @param {{ physical?: boolean, useMod?: boolean }} [opts]
191
+ * @returns {string | null}
192
+ */
193
+ export function comboFromEvent(e: KeyboardEvent, { physical, useMod }?: {
194
+ physical?: boolean;
195
+ useMod?: boolean;
196
+ }): string | null;
@@ -0,0 +1,80 @@
1
+ export function detectPlatform(nav?: Navigator): "mac" | "windows" | "linux";
2
+ export function detectBrowser(nav?: Navigator): "edge" | "firefox" | "chrome" | "safari";
3
+ export function lookupKeyFromCombo(combo: any): string;
4
+ /**
5
+ * @typedef {'mac' | 'windows' | 'linux'} Platform
6
+ * @typedef {'chrome' | 'firefox' | 'safari' | 'edge'} Browser
7
+ * @typedef {'hard' | 'hard-fullscreen' | 'soft' | 'soft-warn'} Severity
8
+ *
9
+ * @typedef {{
10
+ * source: 'browser' | 'system',
11
+ * platform: Platform,
12
+ * browser: Browser | undefined,
13
+ * lookupKey: string,
14
+ * action: string,
15
+ * severity: Severity
16
+ * }} Reservation
17
+ */
18
+ /**
19
+ * Look up whether a parsed hotkey combo is reserved by the host platform
20
+ * or browser. Returns `null` when not reserved or when the data table
21
+ * hasn't loaded.
22
+ *
23
+ * @param {object | null} combo parsed combo from `hotkey-router`'s `parseHotkey`
24
+ * @param {{ platform?: Platform, browser?: Browser }} [opts]
25
+ * @returns {Reservation | null}
26
+ */
27
+ export function lookupReservation(combo: object | null, { platform, browser }?: {
28
+ platform?: Platform;
29
+ browser?: Browser;
30
+ }): Reservation | null;
31
+ /** @param {Severity | string} severity @returns {boolean} */
32
+ export function severityIsHard(severity: Severity | string): boolean;
33
+ /** @param {Severity | string} severity @returns {boolean} */
34
+ export function severityIsSoft(severity: Severity | string): boolean;
35
+ /**
36
+ * Render a console-friendly warning string for a reservation.
37
+ *
38
+ * @param {Reservation} reservation
39
+ * @param {string} rawHotkey
40
+ * @returns {string}
41
+ */
42
+ export function formatReservationWarning(reservation: Reservation, rawHotkey: string): string;
43
+ /**
44
+ * Emit a reservation warning via the given console (or the global `console`
45
+ * by default). Hard reservations log via `warn`; soft ones via `info`.
46
+ *
47
+ * @param {Reservation} reservation
48
+ * @param {string} rawHotkey
49
+ * @param {Console} [console_]
50
+ * @returns {void}
51
+ */
52
+ export function emitReservationWarning(reservation: Reservation, rawHotkey: string, console_?: Console): void;
53
+ /**
54
+ * @param {object} hotkeys a hotkey-router default-export instance
55
+ * @param {{
56
+ * platform?: Platform,
57
+ * browser?: Browser,
58
+ * console?: Console
59
+ * }} [opts]
60
+ * @returns {() => void} uninstall function
61
+ */
62
+ export function installReservationWarnings(hotkeys: object, opts?: {
63
+ platform?: Platform;
64
+ browser?: Browser;
65
+ console?: Console;
66
+ }): () => void;
67
+ export const SCHEMA_VERSION: any;
68
+ export const DATA_GENERATED: any;
69
+ export { HOTKEY_DATA };
70
+ export type Platform = "mac" | "windows" | "linux";
71
+ export type Browser = "chrome" | "firefox" | "safari" | "edge";
72
+ export type Severity = "hard" | "hard-fullscreen" | "soft" | "soft-warn";
73
+ export type Reservation = {
74
+ source: "browser" | "system";
75
+ platform: Platform;
76
+ browser: Browser | undefined;
77
+ lookupKey: string;
78
+ action: string;
79
+ severity: Severity;
80
+ };
@@ -0,0 +1,109 @@
1
+ /** @typedef {'mac' | 'windows' | 'linux' | 'chromeos'} SitePlatform */
2
+ /**
3
+ * @param {Navigator | null} [nav]
4
+ * @returns {SitePlatform | null}
5
+ */
6
+ export function detectSitePlatform(nav?: Navigator | null): SitePlatform | null;
7
+ /**
8
+ * Parse a hotkey string (`mod+shift+code:Period`, `ctrl+alt+,`) into modifier
9
+ * flags and a canonical base key name (`period`), resolving `mod` for the
10
+ * platform. Shared with validate.js.
11
+ *
12
+ * @param {string} str
13
+ * @param {SitePlatform} platform
14
+ * @returns {{ ctrl: boolean, meta: boolean, alt: boolean, shift: boolean, base: string | null }}
15
+ */
16
+ export function parseComboString(str: string, platform: SitePlatform): {
17
+ ctrl: boolean;
18
+ meta: boolean;
19
+ alt: boolean;
20
+ shift: boolean;
21
+ base: string | null;
22
+ };
23
+ /**
24
+ * The canonical lookup key for a combo on a platform (`ctrl+shift+period`).
25
+ * Accepts a hotkey string or a parsed combo from hotkey-router (`onBind`).
26
+ *
27
+ * @param {string | { ctrl?: boolean, meta?: boolean, alt?: boolean, shift?: boolean, key?: string, code?: string }} combo
28
+ * @param {SitePlatform} [platform]
29
+ * @returns {string | null}
30
+ */
31
+ export function siteLookupKey(combo: string | {
32
+ ctrl?: boolean;
33
+ meta?: boolean;
34
+ alt?: boolean;
35
+ shift?: boolean;
36
+ key?: string;
37
+ code?: string;
38
+ }, platform?: SitePlatform): string | null;
39
+ /**
40
+ * The researched sites whose hosts (and path prefixes, when listed) match a
41
+ * URL. Defaults to the current page.
42
+ *
43
+ * @param {string | URL} [url]
44
+ * @returns {Array<object>}
45
+ */
46
+ export function matchSites(url?: string | URL): Array<object>;
47
+ /**
48
+ * @typedef {{
49
+ * siteId: string,
50
+ * siteName: string,
51
+ * action: string,
52
+ * verified: boolean,
53
+ * lookupKey: string
54
+ * }} SiteConflict
55
+ *
56
+ * Sources for each row are in data/site-hotkeys.json (look it up by siteId).
57
+ */
58
+ /**
59
+ * The shortcuts on the page (or a given URL) that use the same chord.
60
+ *
61
+ * @param {string | object} combo hotkey string or parsed combo
62
+ * @param {{ url?: string | URL, platform?: SitePlatform, verifiedOnly?: boolean }} [opts]
63
+ * @returns {SiteConflict[]}
64
+ */
65
+ export function lookupSiteConflicts(combo: string | object, { url, platform, verifiedOnly }?: {
66
+ url?: string | URL;
67
+ platform?: SitePlatform;
68
+ verifiedOnly?: boolean;
69
+ }): SiteConflict[];
70
+ /**
71
+ * A `when()` gate for a binding: true on sites that don't use the chord;
72
+ * on sites that do, true only while `engaged(e)` says the user is focused
73
+ * on the app. Conflicts are looked up once per page URL.
74
+ *
75
+ * @param {string | object} combo the binding's hotkey string (or parsed combo)
76
+ * @param {{
77
+ * engaged: (e?: KeyboardEvent) => boolean,
78
+ * url?: () => string,
79
+ * platform?: SitePlatform,
80
+ * verifiedOnly?: boolean,
81
+ * onYield?: (conflicts: SiteConflict[], e?: KeyboardEvent) => void
82
+ * }} opts
83
+ * @returns {(e?: KeyboardEvent) => boolean}
84
+ */
85
+ export function siteAware(combo: string | object, { engaged, url, platform, verifiedOnly, onYield }?: {
86
+ engaged: (e?: KeyboardEvent) => boolean;
87
+ url?: () => string;
88
+ platform?: SitePlatform;
89
+ verifiedOnly?: boolean;
90
+ onYield?: (conflicts: SiteConflict[], e?: KeyboardEvent) => void;
91
+ }): (e?: KeyboardEvent) => boolean;
92
+ /**
93
+ * All researched sites, compact form: `{ id, name, hosts, pathPrefixes,
94
+ * shortcuts: [windows, mac, chromeos, action, verified][] }`.
95
+ */
96
+ export function listSites(): any;
97
+ export const SITE_DATA_RESEARCHED: any;
98
+ export const SITE_SCHEMA_VERSION: any;
99
+ export type SitePlatform = "mac" | "windows" | "linux" | "chromeos";
100
+ /**
101
+ * Sources for each row are in data/site-hotkeys.json (look it up by siteId).
102
+ */
103
+ export type SiteConflict = {
104
+ siteId: string;
105
+ siteName: string;
106
+ action: string;
107
+ verified: boolean;
108
+ lookupKey: string;
109
+ };
@@ -0,0 +1,42 @@
1
+ /**
2
+ * @typedef {{
3
+ * code: 'invalid' | 'no-key' | 'no-modifier' | 'alt-only' | 'needs-primary' |
4
+ * 'too-few-modifiers' | 'taken' | 'reserved' | 'reserved-soft' |
5
+ * 'altgr' | 'site-conflict',
6
+ * severity: 'error' | 'warning',
7
+ * message: string,
8
+ * platforms?: string[],
9
+ * details?: object
10
+ * }} ComboReason
11
+ */
12
+ /**
13
+ * @param {string} combo hotkey string, e.g. `mod+shift+code:Period`
14
+ * @param {{
15
+ * platforms?: Array<'mac' | 'windows' | 'linux'>,
16
+ * browsers?: Array<'chrome' | 'firefox' | 'edge' | 'safari'>,
17
+ * requirePrimary?: boolean, // must include Ctrl (Cmd on macOS)
18
+ * minModifiers?: number, // default 1
19
+ * taken?: string[], // combos the app already uses
20
+ * sites?: boolean, // warn about sites that use the keys (default true)
21
+ * }} [opts]
22
+ * @returns {{ ok: boolean, reasons: ComboReason[], lookupKeys: Record<string, string> }}
23
+ */
24
+ export function validateCombo(combo: string, { platforms, browsers, requirePrimary, minModifiers, taken, sites, }?: {
25
+ platforms?: Array<"mac" | "windows" | "linux">;
26
+ browsers?: Array<"chrome" | "firefox" | "edge" | "safari">;
27
+ requirePrimary?: boolean;
28
+ minModifiers?: number;
29
+ taken?: string[];
30
+ sites?: boolean;
31
+ }): {
32
+ ok: boolean;
33
+ reasons: ComboReason[];
34
+ lookupKeys: Record<string, string>;
35
+ };
36
+ export type ComboReason = {
37
+ code: "invalid" | "no-key" | "no-modifier" | "alt-only" | "needs-primary" | "too-few-modifiers" | "taken" | "reserved" | "reserved-soft" | "altgr" | "site-conflict";
38
+ severity: "error" | "warning";
39
+ message: string;
40
+ platforms?: string[];
41
+ details?: object;
42
+ };