diff --git a/.changeset/alpine-page-instance.md b/.changeset/alpine-page-instance.md new file mode 100644 index 00000000..0e15898e --- /dev/null +++ b/.changeset/alpine-page-instance.md @@ -0,0 +1,7 @@ +--- +'@tanstack/alpine-hotkeys': minor +--- + +The adapter no longer imports `alpinejs`. It uses the Alpine instance passed to `Alpine.plugin(hotkeysPlugin)`, or `window.Alpine` without the plugin. Install the plugin before `Alpine.start()`; using a scope with neither throws an error that says so. + +Before, a page that loaded Alpine from a script tag and the adapter from a CDN got a second copy of Alpine, so held keys and getter options stopped updating with no error. Importing the package in Node also threw `MutationObserver is not defined`, even for helpers such as `formatForDisplay`. diff --git a/.changeset/devtools-types.md b/.changeset/devtools-types.md new file mode 100644 index 00000000..05430650 --- /dev/null +++ b/.changeset/devtools-types.md @@ -0,0 +1,13 @@ +--- +'@tanstack/hotkeys-devtools': patch +'@tanstack/react-hotkeys-devtools': patch +'@tanstack/preact-hotkeys-devtools': patch +'@tanstack/solid-hotkeys-devtools': patch +'@tanstack/vue-hotkeys-devtools': patch +'@tanstack/svelte-hotkeys-devtools': patch +'@tanstack/angular-hotkeys-devtools': patch +--- + +Fix type errors in the devtools packages with `skipLibCheck: false`. Their declarations used types from `@tanstack/devtools-utils`, which import `@tanstack/devtools` without depending on it, so TypeScript reported `Cannot find module '@tanstack/devtools'`, and with `skipLibCheck: true` the panel props became `any`. The packages now declare their own panel and plugin types. `@tanstack/hotkeys-devtools` exports `HotkeysDevtoolsPanelProps`, `HotkeysDevtoolsTheme` and `HotkeysDevtoolsCoreClass`. + +The React devtools types no longer refer to `JSX` from `react`, which some `@types/react` 18 releases don't export. diff --git a/.changeset/ember-classic-builds.md b/.changeset/ember-classic-builds.md new file mode 100644 index 00000000..f100e869 --- /dev/null +++ b/.changeset/ember-classic-builds.md @@ -0,0 +1,7 @@ +--- +'@tanstack/ember-hotkeys': patch +--- + +Fix classic ember-cli apps that load the addon through ember-auto-import. The package now has the `ember-addon` keyword and no longer sets `"type": "module"`, which made webpack load the whole module object for default imports such as `@ember/component/helper`. `ember-modifier` is now a caret range, so an app that already has ember-modifier 4.3 installs one copy instead of two. + +The `ember-source` peer range is now `>=6.8.3 <6.9.0 || >=6.10.1`. Classic builds of 6.8.0 to 6.8.2, 6.9.0 and 6.10.0 don't include `@ember/reactive/collections`, which the adapter imports. diff --git a/.changeset/peer-ranges.md b/.changeset/peer-ranges.md new file mode 100644 index 00000000..921a864d --- /dev/null +++ b/.changeset/peer-ranges.md @@ -0,0 +1,17 @@ +--- +'@tanstack/preact-hotkeys': patch +'@tanstack/preact-hotkeys-devtools': patch +'@tanstack/solid-hotkeys-devtools': patch +'@tanstack/vue-hotkeys': patch +'@tanstack/svelte-hotkeys': patch +'@tanstack/svelte-hotkeys-devtools': patch +'@tanstack/alpine-hotkeys': patch +--- + +Fix framework peer ranges so they match the versions each package builds and runs on: + +- Preact `>=10.5.2`. Older releases can't resolve `preact/jsx-runtime`. +- Solid devtools `^1.9.15`. The panel crashes below 1.9.15, where two copies of Solid get installed. +- Vue `>=3.3.0`. The adapter uses `toValue`, added in Vue 3.3. +- Svelte `^5.40.0`. The adapter uses `createContext`, added in Svelte 5.40. +- Alpine `^3.13.0`, down from `^3.15.12`. npm no longer refuses to install the adapter next to Alpine 3.13 and 3.14. diff --git a/.changeset/react-use-client.md b/.changeset/react-use-client.md new file mode 100644 index 00000000..1754b425 --- /dev/null +++ b/.changeset/react-use-client.md @@ -0,0 +1,8 @@ +--- +'@tanstack/react-hotkeys': minor +'@tanstack/react-hotkeys-devtools': minor +--- + +The hooks and `HotkeysProvider` are now marked `'use client'`, so a React Server Component such as a Next.js `app/layout.tsx` can render `HotkeysProvider` without a wrapper. Before, the Next.js build failed with `createContext is not a function`. Server components can still import helpers such as `formatForDisplay` from the package. + +Both packages now require React 18 or newer. The old `>=16.8` range admitted React 16.8 to 16.13, which can't build the package because `@tanstack/react-store` imports `react/jsx-runtime`. diff --git a/.changeset/svelte-import-extensions.md b/.changeset/svelte-import-extensions.md new file mode 100644 index 00000000..1d634666 --- /dev/null +++ b/.changeset/svelte-import-extensions.md @@ -0,0 +1,6 @@ +--- +'@tanstack/svelte-hotkeys': patch +'@tanstack/svelte-hotkeys-devtools': patch +--- + +Relative imports in the published files now end in `.js`, so the types resolve with `moduleResolution: "nodenext"`. The devtools types also declare `Component` instead of `Component`, which current Svelte types reject with `skipLibCheck: false`. diff --git a/.changeset/vue-devtools-panel.md b/.changeset/vue-devtools-panel.md new file mode 100644 index 00000000..443bf7fd --- /dev/null +++ b/.changeset/vue-devtools-panel.md @@ -0,0 +1,7 @@ +--- +'@tanstack/vue-hotkeys-devtools': patch +--- + +Fix `HotkeysDevtoolsPanel`, which threw `Cannot read properties of undefined (reading 'color')` and rendered nothing, both on its own and inside `TanStackDevtools` from `@tanstack/vue-devtools`. The panel now defaults `theme` to `'dark'` and `devtoolsOpen` to `true`, reads the props the Vue devtools dock passes, and remounts when the theme changes. + +The package no longer depends on `@tanstack/devtools-utils`, and its `vue` peer is now `>=3.3.0`, matching `@tanstack/vue-hotkeys`. diff --git a/.intent/review-state.json b/.intent/review-state.json index bd0f7963..e899f5fe 100644 --- a/.intent/review-state.json +++ b/.intent/review-state.json @@ -3,24 +3,25 @@ "baseline": "ad56a4b0dbf3c34d8552eca2cc88c5c7000d520a", "items": { "skill:packages/alpine-hotkeys/skills/alpine-hotkeys/SKILL.md": { - "fingerprint": "f1ffa2a31e85d6e7cfbcf730e4b1f5e62d0bd4a59cf8153832cd3b9f299fd424", + "fingerprint": "f7e6791bcab14d204081461064163520817356a360f08e158b6d860dd513918d", "snapshot": { "docs/framework/alpine/guides/app-hotkeys.md": "536c327d4d9f80219a0dcdd04bb36b684c35567ad76f86327287ae6a21f03199", - "docs/framework/alpine/quick-start.md": "82877b602b370603286ca41f384f5e38da25f7df30bf707e04ea17018792875c", - "packages/alpine-hotkeys/skills/alpine-hotkeys/SKILL.md": "e6f704998fbe368fae46cbc832f4887edbeef452b4cdb017bd730e63fcd646c6", + "docs/framework/alpine/quick-start.md": "de471401f70d66c2a81182f917f6eef02d808bdda1a2bc6268a6aa1e5365000c", + "packages/alpine-hotkeys/skills/alpine-hotkeys/SKILL.md": "8c0a3ab25f684d8445925d43dbadabb4e491b12001d78811cbf0d3f41db044c8", "packages/alpine-hotkeys/skills/alpine-hotkeys/references/app-hotkeys.md": "fdc12aafd6098bde8b4e7f5d8a8afb12227ac99cd753e06fc27401d5d8c8fead", "packages/alpine-hotkeys/src/createAppHotkeys.ts": "f712ddb3354230197eb54d6f270d00a41c2b889e60690e70853569fe1a5207ea", "packages/alpine-hotkeys/src/createHotkey.ts": "3ee3029171f53f3693980bc975252b3decea27c1920ccc0ec1dd8fe2b3810c9b", "packages/alpine-hotkeys/src/createHotkeysScope.ts": "8fb6d17e8fe155327fdac17f9d057d6538c84474c1c464ee25409c23d52e7a85", - "packages/alpine-hotkeys/src/hotkeysPlugin.ts": "77a4e764c9917d00ae0f2b8c37fc08ac6733003a5043f7e3e1a046f6936a7188", - "packages/alpine-hotkeys/src/scope.ts": "d6ce3fe86c87cf6483119baaa48e0950f30480f02ff861656035eb559c596176" + "packages/alpine-hotkeys/src/hotkeysPlugin.ts": "35ffb8b772a178690d956f3b3a165b577c40d1723e186f5ffdef4a985f7be90b", + "packages/alpine-hotkeys/src/scope.ts": "33b2731c6f3754315a6b31fa8dff27805605835c3ae34aa62f92f6fd44d898a6" }, - "head": "913a63d40d46cd3bd189a485da167ce064edcba0", + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", "outcome": "updated", - "reason": "Hint rows now say an element-targeted hotkey needs focus inside its element; registration status described as enabled and in an active scope.", + "reason": "The setup now installs Alpine.plugin(hotkeysPlugin) before Alpine.start(). The adapter no longer imports alpinejs; it uses the plugin's Alpine instance, falls back to window.Alpine, and throws when neither exists. The skill's sample, setup line and API row say so.", "evidence": [ - "packages/hotkeys/src/hotkey-manager.ts", - "packages/alpine-hotkeys/skills/alpine-hotkeys/SKILL.md" + "packages/alpine-hotkeys/src/scope.ts", + "packages/alpine-hotkeys/src/hotkeysPlugin.ts", + "packages/alpine-hotkeys/tests/alpine-instance.test.ts" ] }, "skill:packages/angular-hotkeys/skills/angular-hotkeys/SKILL.md": { @@ -45,11 +46,11 @@ ] }, "skill:packages/ember-hotkeys/skills/ember-hotkeys/SKILL.md": { - "fingerprint": "a40354b6ea8830f3b051a8ad3f884f3e04cb1da71af2829c4c2fd53978046174", + "fingerprint": "37777ecd64b32ae83c76d5fb46f339cd6f361b94fb488b4c343316032278c066", "snapshot": { "docs/framework/ember/guides/app-hotkeys.md": "5162292b3d62257c757ea0146fb5b1cc8c85b130081472b3675be077e8c898de", "docs/framework/ember/quick-start.md": "cabdc0cbd2b9ac6d4d7f9f2c8b8d3fc6ef2ac8c23df4cd8ebc9745c99023f8c8", - "packages/ember-hotkeys/skills/ember-hotkeys/SKILL.md": "047dabb323921dbc83995f9f994a11158df84b5bd91701bed54a5810a71285ec", + "packages/ember-hotkeys/skills/ember-hotkeys/SKILL.md": "ba4e5144d1b1e5435ffda905009c40b343b8cd829a93ec9553afc576d2388acc", "packages/ember-hotkeys/skills/ember-hotkeys/references/app-hotkeys.md": "b6200c97df720970117aefe3d2003817fdf7aa4d869437341e75245dcd0c9602", "packages/ember-hotkeys/src/createHotkeysScope.ts": "3f01e7b8dabf61a801c8fd2e4e6658486ae4f9bdda588594236c38f7b70aed5f", "packages/ember-hotkeys/src/onHotkey.ts": "26007837b3c8476c3be6b492701756258a8d09fe6648550742fd1405be1448bd", @@ -58,12 +59,14 @@ "packages/ember-hotkeys/src/useHotkey.ts": "66b7b39970c5e61233f352baf14c41d9ac29cc3832e251470930e6507b454f63", "packages/ember-hotkeys/src/useHotkeys.ts": "963345b3720ddefec8677b9b9d9dfa2b6346e22b32f9f2034d406b43e5c5ccf8" }, - "head": "913a63d40d46cd3bd189a485da167ce064edcba0", + "head": "41f06c51a38fac64409a3d4932cc8958f558ae57", "outcome": "updated", - "reason": "Hint rows now say an element-targeted hotkey needs focus inside its element; registration status described as enabled and in an active scope.", + "reason": "The version line now matches the new ember-source peer (>=6.8.3 <6.9.0 || >=6.10.1). Classic builds of 6.8.0 to 6.8.2, 6.9.0 and 6.10.0 don't define @ember/reactive/collections, which src/utils.ts imports.", "evidence": [ - "packages/hotkeys/src/hotkey-manager.ts", - "packages/ember-hotkeys/skills/ember-hotkeys/SKILL.md" + "packages/ember-hotkeys/package.json", + "packages/ember-hotkeys/src/utils.ts", + "Classic ember-cli apps with ember-auto-import 2.13.1 and the packed addon: 6.8.3, 6.12.1 (use-ember-modules on and off) and 7.3.1 build and fire K in Chromium; 6.8.0 fails with \"Could not find module @ember/reactive/collections\"", + "pnpm test:lib for @tanstack/ember-hotkeys passes (Embroider/Vite suite)" ] }, "skill:packages/hotkeys/skills/app-hotkeys/SKILL.md": { @@ -183,16 +186,16 @@ ] }, "skill:packages/react-hotkeys/skills/react-hotkeys/SKILL.md": { - "fingerprint": "46a32a3fd81e8b1e162b3f07d12801a4977086afbe0f5bce69c9d4a46feba7f6", + "fingerprint": "f5a95f6bbeac7e398901b72d4fb3bca1889f65bbb9bd63741e78053e5ad24706", "snapshot": { "docs/framework/react/guides/hotkeys-provider-and-scopes.md": "1d39ab010d5bd99955b761dc7298987b332e15846546990dcf2a1ecfb5068469", "docs/framework/react/quick-start.md": "d587fccff19a0cf3c131f832a8eb423d5d4892e78e521aa856fd23485015afe7", - "packages/react-hotkeys/skills/react-hotkeys/SKILL.md": "29a7233f6ba5ffecc8a84529353981ce820adee92cfdb8a9441c4a5c50554f9d", + "packages/react-hotkeys/skills/react-hotkeys/SKILL.md": "cfdd50d7cfdca297ce856fbf4c3510ca7d25759eecf7da285b9a7c5f4e7ed0dd", "packages/react-hotkeys/skills/react-hotkeys/references/app-hotkeys.md": "e45854b2346700249569ce418b0bb5593cd00a018336a60c9ed5cedeb8d49b3e", - "packages/react-hotkeys/src/HotkeysProvider.tsx": "bdf71bdf0de147134501e44ac03c8525d803f250b31c3d742c674fe01a85f17f", - "packages/react-hotkeys/src/useAppHotkeys.ts": "023eff9348a9209a2e3e99a2b9847da3be72206f98150b478dae81a215059577", - "packages/react-hotkeys/src/useHotkey.ts": "b22e215bf0ba20220b3a76ed4ded3ad724fe7a9c6ce9705acd371adfc004836b", - "packages/react-hotkeys/src/useHotkeys.ts": "58275023fd539ac8a9fcb6ceb355aeb491e276191c31a12780065bd0b462ce95", + "packages/react-hotkeys/src/HotkeysProvider.tsx": "4e5604bfc2907232bdab60c6ed24a28f4b363dfac1c19883a0c65db6b5ac5bf1", + "packages/react-hotkeys/src/useAppHotkeys.ts": "eec5d9a2e281ab8892c56b9482cd930a06deb176581bba9cb409faa35b1bee91", + "packages/react-hotkeys/src/useHotkey.ts": "01c7e0b8de39f75028a6eec04abf5eb2cf6fb410177a24603e719eb90c030661", + "packages/react-hotkeys/src/useHotkeys.ts": "18fc224f0ec5efee2553fde4840dda78ec0ec7e5dcb2f812279bafcc2384184e", "packages/react-hotkeys/src/utils.ts": "e755c6f7e31291c06b0fc8e136a436bb9b52e03f6fcbfc5608d20e339997cc8e", "packages/react-hotkeys/tests/skills/editor-shortcuts/editor-shortcuts.test.tsx": "25c572e968a78fd8df61f0bc98ba8adb41ecf0874437725e5ba28dd171e44fe1", "packages/react-hotkeys/tests/skills/editor-shortcuts/fixture.tsx": "613a833bb6412b600925deb4009d16cfbfe7afa9a5dc0b82d1a39b8da8c0230b", @@ -212,12 +215,14 @@ "packages/react-hotkeys/tests/skills/shortcut-settings/solution.tsx": "23a9dd46565c8617361bad3bcf24903c6d2d0c1db8c5e16b66ee5a7bc02fc62b", "packages/react-hotkeys/tests/skills/shortcut-settings/task.md": "1104e51ba1cb603b145b5eece30197d2e2936e21b1592ea75004244d49fcadd1" }, - "head": "913a63d40d46cd3bd189a485da167ce064edcba0", + "head": "41f06c51a38fac64409a3d4932cc8958f558ae57", "outcome": "updated", - "reason": "Hint rows now say an element-targeted hotkey needs focus inside its element; registration status described as enabled and in an active scope.", + "reason": "HotkeysProvider and the hooks now ship with 'use client', so a server layout can render HotkeysProvider without a wrapper. Hooks still run only in client components, which the skill keeps.", "evidence": [ - "packages/hotkeys/src/hotkey-manager.ts", - "packages/react-hotkeys/skills/react-hotkeys/SKILL.md" + "packages/react-hotkeys/src/HotkeysProvider.tsx", + "scripts/verify-package.ts", + "Next.js 16.4.3 build with a server layout rendering HotkeysProvider and HotkeysDevtoolsPanel passes, and K fires in next start and next dev; published 0.17.0 fails with \"createContext is not a function\"", + "pnpm test:lib for @tanstack/react-hotkeys passes, including the skill task checks" ] }, "skill:packages/solid-hotkeys/skills/solid-hotkeys/SKILL.md": { @@ -241,26 +246,23 @@ ] }, "skill:packages/svelte-hotkeys/skills/svelte-hotkeys/SKILL.md": { - "fingerprint": "6fbe00da1a3df0353f8b7897a37ac0d9052abdf6cd0f139229e1c61f4be15c03", + "fingerprint": "b75b48ee186a877c213cfd9b005cb1f90395929ac412b41402ba25f39533eeb8", "snapshot": { "docs/framework/svelte/guides/hotkeys-provider-and-scopes.md": "49c87f7d1e0fdcef47d08af80339b26c7e560ea2265e0a5c83983d8b157432fd", "docs/framework/svelte/quick-start.md": "1ed87e6c76d9225f37db87f0d0e7dfd9f790adbf5b47cf87daa67143d155ce9b", "packages/svelte-hotkeys/skills/svelte-hotkeys/SKILL.md": "d99ef59e6a695be73d48b954a337d5c91f471268bad8da590a7b4d72f1a8a1c4", "packages/svelte-hotkeys/skills/svelte-hotkeys/references/app-hotkeys.md": "fa0dd67192d53cc1a6cacc87b68523a9a2c94ca0c27b90b10a46861643885a2e", - "packages/svelte-hotkeys/src/HotkeysCtx.ts": "1d6e065a5d7dbd14073e0617a990a923a4a811df43fa3261253fce45f55b066b", - "packages/svelte-hotkeys/src/HotkeysProvider.svelte": "d444924b495f5517f3235365d5988b2df86be9f4ef83e89d9ac5385857f76040", - "packages/svelte-hotkeys/src/createHotkey.svelte.ts": "014992b602a5551445edd04e4cfe408d0a4af97a49e39296c1de60c68b74d842", - "packages/svelte-hotkeys/src/createHotkeyRecorder.svelte.ts": "ea3295fb5fc85da7e5d266914e264a6916d8cb540697d3f9ca881c844da0bfa8", - "packages/svelte-hotkeys/src/createHotkeys.svelte.ts": "ea5bf5ef7c2e7f6696f3354abe5f011cace7f046cb6a5c768c50cc2b840cf921", - "packages/svelte-hotkeys/src/getAppHotkeys.svelte.ts": "a9662d748fcb8f8d7084411a99d581e29817faf42aa93b6142dfc2f5eea3fb9f" + "packages/svelte-hotkeys/src/HotkeysCtx.ts": "117d9625215435b7a3eb6c5a9f23792a02548059ba114b5737a6b9fb610b276c", + "packages/svelte-hotkeys/src/HotkeysProvider.svelte": "eb7fb67907a153aae3f0ce61e951e8ea5df46468ae06eb55ad696500839124a3", + "packages/svelte-hotkeys/src/createHotkey.svelte.ts": "27959499674a4dbfeb048073807baf540586d0f0a63a0dbdde0246c7aa939706", + "packages/svelte-hotkeys/src/createHotkeyRecorder.svelte.ts": "14960d025c687b2167653e047074f16f398c580a578b6266e31de4b3bfb341a1", + "packages/svelte-hotkeys/src/createHotkeys.svelte.ts": "cc69118ac4076f5c678987f0df18e8e0448bb7a2005effb802ae059d5b347455", + "packages/svelte-hotkeys/src/getAppHotkeys.svelte.ts": "a6a995eea5b1334baef1909da68dea08f8df4e29819bada3549c9a0be86e6dcb" }, - "head": "913a63d40d46cd3bd189a485da167ce064edcba0", - "outcome": "updated", - "reason": "Hint rows now say an element-targeted hotkey needs focus inside its element; registration status described as enabled and in an active scope.", - "evidence": [ - "packages/hotkeys/src/hotkey-manager.ts", - "packages/svelte-hotkeys/skills/svelte-hotkeys/SKILL.md" - ] + "head": "c4273292a3d1ad2d0cf65bd8f80362c26474bd89", + "outcome": "no-change", + "reason": "CI autofix wrapped one import line in createHotkey.svelte.ts. Formatting only; APIs and behavior are unchanged.", + "evidence": ["packages/svelte-hotkeys/src/createHotkey.svelte.ts"] }, "skill:packages/vue-hotkeys/skills/vue-hotkeys/SKILL.md": { "fingerprint": "ac96f13c6fde14fcb0ca586b0ec2c952be261636cfff5bfadcca5cfa74898ea8", @@ -285,13 +287,13 @@ ] }, "planning:_artifacts": { - "fingerprint": "cd9093c837657c250149da40c85fa4c98b1b30506fba733551940d3474091d8e", + "fingerprint": "33795dd84a330b45555ac4d8d826aa0d8d9c2564d3d3c1448b309d05b46f801f", "snapshot": { - "_artifacts/domain_map.yaml": "dd50dde7eec97230c015f793602239e721dacb370936eafd4554988b4a2c1c89", - "_artifacts/skill_spec.md": "57693ee30406d1a76d7ec201cc480e37611b23141ec70d7f178b0b07f56248fd", + "_artifacts/domain_map.yaml": "2563ba9b2d472df81206a62b1add175bd3341b9bb99bd51869c305746f2a4a46", + "_artifacts/skill_spec.md": "58e19f35836571a37984e4435168651a2936dffb48ffe01cc7fddcc0eafea916", "_artifacts/skill_tree.yaml": "c7e0b30458bd11e3a52e728163838166def6ee64419f1b632f1ea36a37e573af", "docs/framework/alpine/guides/app-hotkeys.md": "536c327d4d9f80219a0dcdd04bb36b684c35567ad76f86327287ae6a21f03199", - "docs/framework/alpine/quick-start.md": "82877b602b370603286ca41f384f5e38da25f7df30bf707e04ea17018792875c", + "docs/framework/alpine/quick-start.md": "de471401f70d66c2a81182f917f6eef02d808bdda1a2bc6268a6aa1e5365000c", "docs/framework/angular/guides/provide-hotkeys-and-scopes.md": "003fba191e3d13d4466754644c4d2174a550f48d437028bc163ba6acca6546ad", "docs/framework/angular/quick-start.md": "d1cc5f91cd50b579c8a4bd9811e76862308855ce602556e4fa36561bc7d62822", "docs/framework/ember/guides/app-hotkeys.md": "5162292b3d62257c757ea0146fb5b1cc8c85b130081472b3675be077e8c898de", @@ -316,13 +318,13 @@ "docs/framework/vue/guides/hotkeys-provider-and-scopes.md": "9e41458fe7488eedcbd4289019a66cde95b866ffb3081fdd0a808995580460ce", "docs/framework/vue/quick-start.md": "b4ca3394dc94e3b814054413afbf5e101fd5998a35daafad715e49de26a4932e", "docs/guides/sensible-defaults.md": "29b63a2aa05a4c7498bc2f235baa20bf4bcccbf9de78642ed5e27b431232ec1f", - "packages/alpine-hotkeys/skills/alpine-hotkeys/SKILL.md": "e6f704998fbe368fae46cbc832f4887edbeef452b4cdb017bd730e63fcd646c6", + "packages/alpine-hotkeys/skills/alpine-hotkeys/SKILL.md": "8c0a3ab25f684d8445925d43dbadabb4e491b12001d78811cbf0d3f41db044c8", "packages/alpine-hotkeys/skills/alpine-hotkeys/references/app-hotkeys.md": "fdc12aafd6098bde8b4e7f5d8a8afb12227ac99cd753e06fc27401d5d8c8fead", "packages/alpine-hotkeys/src/createAppHotkeys.ts": "f712ddb3354230197eb54d6f270d00a41c2b889e60690e70853569fe1a5207ea", "packages/alpine-hotkeys/src/createHotkey.ts": "3ee3029171f53f3693980bc975252b3decea27c1920ccc0ec1dd8fe2b3810c9b", "packages/alpine-hotkeys/src/createHotkeysScope.ts": "8fb6d17e8fe155327fdac17f9d057d6538c84474c1c464ee25409c23d52e7a85", - "packages/alpine-hotkeys/src/hotkeysPlugin.ts": "77a4e764c9917d00ae0f2b8c37fc08ac6733003a5043f7e3e1a046f6936a7188", - "packages/alpine-hotkeys/src/scope.ts": "d6ce3fe86c87cf6483119baaa48e0950f30480f02ff861656035eb559c596176", + "packages/alpine-hotkeys/src/hotkeysPlugin.ts": "35ffb8b772a178690d956f3b3a165b577c40d1723e186f5ffdef4a985f7be90b", + "packages/alpine-hotkeys/src/scope.ts": "33b2731c6f3754315a6b31fa8dff27805605835c3ae34aa62f92f6fd44d898a6", "packages/angular-hotkeys/skills/angular-hotkeys/SKILL.md": "2b0e9e34fb1338d2db1657beffd8664906ef200388854cfc2895cf9f428e00d9", "packages/angular-hotkeys/skills/angular-hotkeys/references/app-hotkeys.md": "5fe1b12a519e8ca5087d78d47050f7a2ec0c70bb9b7d6ebcbb050ee099e3effe", "packages/angular-hotkeys/src/hotkeys-provider.ts": "1e549ef79db70b5818326068c78ada5d410fdc680a4cb7ca12bdfd9d0de5d0dc", @@ -330,7 +332,7 @@ "packages/angular-hotkeys/src/injectHotkey.ts": "b3651b50beb5b94cdadaf3339be17984e79277222918550f53448fca511e0af6", "packages/angular-hotkeys/src/injectHotkeyRecorder.ts": "46db59ccc34f8158c98328ae152f47cdd182cdeef951bf9dc5c44fa12de1b305", "packages/angular-hotkeys/src/injectHotkeys.ts": "cecc7d127934caaab72a694fe527ef7a7b31e660f98cc077dabacd5506e11619", - "packages/ember-hotkeys/skills/ember-hotkeys/SKILL.md": "047dabb323921dbc83995f9f994a11158df84b5bd91701bed54a5810a71285ec", + "packages/ember-hotkeys/skills/ember-hotkeys/SKILL.md": "ba4e5144d1b1e5435ffda905009c40b343b8cd829a93ec9553afc576d2388acc", "packages/ember-hotkeys/skills/ember-hotkeys/references/app-hotkeys.md": "b6200c97df720970117aefe3d2003817fdf7aa4d869437341e75245dcd0c9602", "packages/ember-hotkeys/src/createHotkeysScope.ts": "3f01e7b8dabf61a801c8fd2e4e6658486ae4f9bdda588594236c38f7b70aed5f", "packages/ember-hotkeys/src/onHotkey.ts": "26007837b3c8476c3be6b492701756258a8d09fe6648550742fd1405be1448bd", @@ -367,12 +369,12 @@ "packages/preact-hotkeys/src/useHotkey.ts": "3a557416b1d8699c018aea0e1787c1b9cbfc161bdba0ecdcce3fb2a5de44f5b9", "packages/preact-hotkeys/src/useHotkeys.ts": "23ccd2ee8566bc62a8bca00c8a1c40fc4d37c8363b891667ae391f3e44bfa97b", "packages/preact-hotkeys/src/utils.ts": "930ee95e471c879bfcc32886c31128d702d92719b23c4bd8c06aa21e324502e9", - "packages/react-hotkeys/skills/react-hotkeys/SKILL.md": "29a7233f6ba5ffecc8a84529353981ce820adee92cfdb8a9441c4a5c50554f9d", + "packages/react-hotkeys/skills/react-hotkeys/SKILL.md": "cfdd50d7cfdca297ce856fbf4c3510ca7d25759eecf7da285b9a7c5f4e7ed0dd", "packages/react-hotkeys/skills/react-hotkeys/references/app-hotkeys.md": "e45854b2346700249569ce418b0bb5593cd00a018336a60c9ed5cedeb8d49b3e", - "packages/react-hotkeys/src/HotkeysProvider.tsx": "bdf71bdf0de147134501e44ac03c8525d803f250b31c3d742c674fe01a85f17f", - "packages/react-hotkeys/src/useAppHotkeys.ts": "023eff9348a9209a2e3e99a2b9847da3be72206f98150b478dae81a215059577", - "packages/react-hotkeys/src/useHotkey.ts": "b22e215bf0ba20220b3a76ed4ded3ad724fe7a9c6ce9705acd371adfc004836b", - "packages/react-hotkeys/src/useHotkeys.ts": "58275023fd539ac8a9fcb6ceb355aeb491e276191c31a12780065bd0b462ce95", + "packages/react-hotkeys/src/HotkeysProvider.tsx": "4e5604bfc2907232bdab60c6ed24a28f4b363dfac1c19883a0c65db6b5ac5bf1", + "packages/react-hotkeys/src/useAppHotkeys.ts": "eec5d9a2e281ab8892c56b9482cd930a06deb176581bba9cb409faa35b1bee91", + "packages/react-hotkeys/src/useHotkey.ts": "01c7e0b8de39f75028a6eec04abf5eb2cf6fb410177a24603e719eb90c030661", + "packages/react-hotkeys/src/useHotkeys.ts": "18fc224f0ec5efee2553fde4840dda78ec0ec7e5dcb2f812279bafcc2384184e", "packages/react-hotkeys/src/utils.ts": "e755c6f7e31291c06b0fc8e136a436bb9b52e03f6fcbfc5608d20e339997cc8e", "packages/react-hotkeys/tests/skills/editor-shortcuts/editor-shortcuts.test.tsx": "25c572e968a78fd8df61f0bc98ba8adb41ecf0874437725e5ba28dd171e44fe1", "packages/react-hotkeys/tests/skills/editor-shortcuts/fixture.tsx": "613a833bb6412b600925deb4009d16cfbfe7afa9a5dc0b82d1a39b8da8c0230b", @@ -399,12 +401,12 @@ "packages/solid-hotkeys/src/createHotkeys.ts": "a84dbede2c8bdda995d73a02353619a721282e1a92a44127108da54d1d0b821a", "packages/svelte-hotkeys/skills/svelte-hotkeys/SKILL.md": "d99ef59e6a695be73d48b954a337d5c91f471268bad8da590a7b4d72f1a8a1c4", "packages/svelte-hotkeys/skills/svelte-hotkeys/references/app-hotkeys.md": "fa0dd67192d53cc1a6cacc87b68523a9a2c94ca0c27b90b10a46861643885a2e", - "packages/svelte-hotkeys/src/HotkeysCtx.ts": "1d6e065a5d7dbd14073e0617a990a923a4a811df43fa3261253fce45f55b066b", - "packages/svelte-hotkeys/src/HotkeysProvider.svelte": "d444924b495f5517f3235365d5988b2df86be9f4ef83e89d9ac5385857f76040", - "packages/svelte-hotkeys/src/createHotkey.svelte.ts": "014992b602a5551445edd04e4cfe408d0a4af97a49e39296c1de60c68b74d842", - "packages/svelte-hotkeys/src/createHotkeyRecorder.svelte.ts": "ea3295fb5fc85da7e5d266914e264a6916d8cb540697d3f9ca881c844da0bfa8", - "packages/svelte-hotkeys/src/createHotkeys.svelte.ts": "ea5bf5ef7c2e7f6696f3354abe5f011cace7f046cb6a5c768c50cc2b840cf921", - "packages/svelte-hotkeys/src/getAppHotkeys.svelte.ts": "a9662d748fcb8f8d7084411a99d581e29817faf42aa93b6142dfc2f5eea3fb9f", + "packages/svelte-hotkeys/src/HotkeysCtx.ts": "117d9625215435b7a3eb6c5a9f23792a02548059ba114b5737a6b9fb610b276c", + "packages/svelte-hotkeys/src/HotkeysProvider.svelte": "eb7fb67907a153aae3f0ce61e951e8ea5df46468ae06eb55ad696500839124a3", + "packages/svelte-hotkeys/src/createHotkey.svelte.ts": "27959499674a4dbfeb048073807baf540586d0f0a63a0dbdde0246c7aa939706", + "packages/svelte-hotkeys/src/createHotkeyRecorder.svelte.ts": "14960d025c687b2167653e047074f16f398c580a578b6266e31de4b3bfb341a1", + "packages/svelte-hotkeys/src/createHotkeys.svelte.ts": "cc69118ac4076f5c678987f0df18e8e0448bb7a2005effb802ae059d5b347455", + "packages/svelte-hotkeys/src/getAppHotkeys.svelte.ts": "a6a995eea5b1334baef1909da68dea08f8df4e29819bada3549c9a0be86e6dcb", "packages/vue-hotkeys/skills/vue-hotkeys/SKILL.md": "565e5d5f33ed757855f0a3bcc78d65a191e52c1e3f33f9bf3dc534a4c0e70d3f", "packages/vue-hotkeys/skills/vue-hotkeys/references/app-hotkeys.md": "326ee1fe20c1d75a4ad720f69a3a4df9b9e3a057826115e955deb0ed25d88f9a", "packages/vue-hotkeys/src/HotkeysProvider.tsx": "ad40dec6e2889ca62f3fda57fcbf67e940f4dab5a26cdc69ff99777d2d2e56af", @@ -414,10 +416,10 @@ "packages/vue-hotkeys/src/useHotkeyRecorder.ts": "476a5a50a21aefe6243f9bc6e8c6a679978542d6ad8b52e6a2b0f806cd5ef89a", "packages/vue-hotkeys/src/useHotkeys.ts": "f971e9938eca3188b3af0fcc96d095330f9f6abfd70cb848d2de5c80f8d09639" }, - "head": "391443cd0c92b1040b7a9f3270c97c48850f4f36", + "head": "c4273292a3d1ad2d0cf65bd8f80362c26474bd89", "outcome": "no-change", - "reason": "Internal fix: the preventDefault 'always' check uses the event's composed path so live hotkeys inside shadow roots count. Skill guidance unchanged.", - "evidence": ["packages/hotkeys/src/hotkey-manager.ts"] + "reason": "CI autofix wrapped one import line in createHotkey.svelte.ts. Formatting only; APIs and behavior are unchanged.", + "evidence": ["packages/svelte-hotkeys/src/createHotkey.svelte.ts"] }, "source:.changeset/intent-skills.md": { "fingerprint": "a3f3a7466ee28fed505a518e9cd18cfda96a2282d207d73317b00d60b4430f62", @@ -430,15 +432,16 @@ "evidence": [".changeset/intent-skills.md"] }, "source:scripts/verify-package.ts": { - "fingerprint": "fc48112cc743933225c6aa48310529c4288a438cba01ad96378c6898d65dcce6", + "fingerprint": "f93157da0086ac1b234efa6b91482b6fed8538ad55f98ab186105837b9e274bc", "snapshot": { - "scripts/verify-package.ts": "6b2515de4558bc3fa642a6cff2c01b498633302fcd04213570afe38051f0ad00" + "scripts/verify-package.ts": "86c307730526309a448097c15fb9e041a8ac9f4bce1bd9328802f694996a0bb6" }, - "head": "ad56a4b0dbf3c34d8552eca2cc88c5c7000d520a", - "outcome": "out-of-scope", - "reason": "Packaging check now accepts a trailing \"skills\" files entry and requires a packed SKILL.md; it changes no library behavior the guidance covers.", + "head": "41f06c51a38fac64409a3d4932cc8958f558ae57", + "outcome": "no-change", + "reason": "Adds package checks for Ember v2 addon metadata and preserved 'use client' directives. Packaging checks aren't covered by skills.", "evidence": [ - "node scripts/verify-package.ts passed for all 11 skill packages and react-hotkeys-devtools (no skills)" + "scripts/verify-package.ts", + "pnpm exec nx run-many --targets=test:build passes for all 18 packages" ] }, "source:docs/framework/alpine/guides/hotkey-hints.md": { @@ -566,14 +569,18 @@ "evidence": ["docs/framework/react/guides/hotkey-hints.md"] }, "source:docs/framework/react/reference/functions/useHotkeyHint.md": { - "fingerprint": "57d985be45ff69e16a1858294792e6f07bd09967fd085f7199cf443e1201e379", + "fingerprint": "5be6c63c069a8b796bbb2bea2041789b17acbffdc0cc760d3026e23c29f963ee", "snapshot": { - "docs/framework/react/reference/functions/useHotkeyHint.md": "8ad8e2e7f56ff758565f73fb8733d5e4b657fec49d26259eed6032d01ba2e9e9" + "docs/framework/react/reference/functions/useHotkeyHint.md": "8902b9d92e3148b498643a47e892f1eb1443c9b8bfea0fb20c53e88b3864d455" }, - "head": "913a63d40d46cd3bd189a485da167ce064edcba0", - "outcome": "out-of-scope", - "reason": "Tests or regenerated reference docs.", - "evidence": ["docs/framework/react/reference/functions/useHotkeyHint.md"] + "head": "6a7576fb36738c24623d5cbfb260941447d42b76", + "outcome": "no-change", + "reason": "Generated TypeDoc reference. The 'use client' lines shift each 'Defined in' source line by two, and HotkeysProvider now shows its ReactElement return type. No skill guidance depends on either.", + "evidence": [ + "docs/framework/react/reference/functions/useHotkeyHint.md", + "packages/react-hotkeys/src/HotkeysProvider.tsx", + "commit 6a7576fb (ci: apply automated fixes)" + ] }, "source:docs/framework/solid/guides/hotkey-hints.md": { "fingerprint": "209e8b94998dc992ea28e9a209adfd7944d8e7448f1e7e75fe481a28566fe9cf", @@ -680,13 +687,13 @@ "evidence": ["examples/alpine/kitchen-sink/index.html"] }, "source:examples/alpine/kitchen-sink/src/main.ts": { - "fingerprint": "9ab005df03e0602b60f980c1d3a99537357653a725e570f0c7dac01ec62f5a2f", + "fingerprint": "3af00671f13f87de8b318aeef2645372c9d4197f69f884690918d4ef10721005", "snapshot": { - "examples/alpine/kitchen-sink/src/main.ts": "dbdb3a81c1a7189a1d888a5ee9cd237832d5bedf7f498448336f64141798b861" + "examples/alpine/kitchen-sink/src/main.ts": "f21fb5a0a2d39c3e33875b7053be6d2b880bbb2d15e1f1ccd894ce70532792fb" }, - "head": "2a31087b3ede3d5bb6b720009643ee65acb422e2", + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", "outcome": "out-of-scope", - "reason": "Tests, examples, or generated reference docs for the hint behavior change; no guidance depends on them.", + "reason": "Examples install hotkeysPlugin before Alpine.start(), as the adapter now requires. No guidance depends on the examples.", "evidence": ["examples/alpine/kitchen-sink/src/main.ts"] }, "source:examples/angular/kitchen-sink/src/app/app.component.ts": { @@ -960,14 +967,17 @@ "evidence": ["packages/preact-hotkeys/tests/useHotkeyHint.test.tsx"] }, "source:packages/react-hotkeys/src/useHotkeyHint.ts": { - "fingerprint": "6eb1d204a78d8e8917073a00213138ecb7e74e10d71941c16b6ed4759d4560a2", + "fingerprint": "9ab705624e848526f4e4a1bf2b66c4326eb3bbe252c8e598dc031a188bca2c0f", "snapshot": { - "packages/react-hotkeys/src/useHotkeyHint.ts": "243cb4eea10c9ddf153862d6f6c5e44ee70d5a04c73180b516e42bd5fecaed6a" + "packages/react-hotkeys/src/useHotkeyHint.ts": "39c39deb13b62e0b7bdf065d4c5b19419b7b682185de796479e5bfac9888a916" }, - "head": "913a63d40d46cd3bd189a485da167ce064edcba0", + "head": "41f06c51a38fac64409a3d4932cc8958f558ae57", "outcome": "no-change", - "reason": "Hint focus behavior and status wording are reflected in the skills updated in this review.", - "evidence": ["packages/react-hotkeys/src/useHotkeyHint.ts"] + "reason": "Adds a 'use client' directive only. Hook behavior and signatures are unchanged; the React Server Components guidance is reviewed under the react-hotkeys skill item.", + "evidence": [ + "packages/react-hotkeys/src/useHotkeyHint.ts", + "pnpm test:lib for @tanstack/react-hotkeys passes" + ] }, "source:packages/react-hotkeys/tests/appHotkeys.test.tsx": { "fingerprint": "fdf707b51c4da3a5d90684507bed80a2738469df3bbcd23d617f268bb3a81496", @@ -1010,13 +1020,13 @@ "evidence": ["packages/solid-hotkeys/tests/createHotkeyHint.test.tsx"] }, "source:packages/svelte-hotkeys/src/getHotkeyHint.svelte.ts": { - "fingerprint": "24c95f4f15482bdf093375a1faafcf97354226ac78a848123b30013a6d356a97", + "fingerprint": "111a3fa7ead644af9c2a1ae9427f55340199860e75f030a51c9dbeccb95a04a7", "snapshot": { - "packages/svelte-hotkeys/src/getHotkeyHint.svelte.ts": "22925511c7e5bcaaecfc755b186abeab9065751a397ff9b21480c9c1226245c3" + "packages/svelte-hotkeys/src/getHotkeyHint.svelte.ts": "9c9410188c920b701a71ce127933fd60539f5a3cac0af3a4614b25b245ba8751" }, - "head": "913a63d40d46cd3bd189a485da167ce064edcba0", + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", "outcome": "no-change", - "reason": "Hint focus behavior and status wording are reflected in the skills updated in this review.", + "reason": "Adds .js extensions to relative imports only. Behavior and signatures are unchanged.", "evidence": ["packages/svelte-hotkeys/src/getHotkeyHint.svelte.ts"] }, "source:packages/svelte-hotkeys/tests/getHotkeyHint.test.ts": { @@ -1746,15 +1756,17 @@ "evidence": ["docs/framework/react/guides/hotkey-manager.md"] }, "source:docs/framework/react/reference/functions/useHotkeyScopesState.md": { - "fingerprint": "6e04abc76cc18c26951ef1f0badb83dee20c906ca91b6a7bfa94c647ee6713b9", + "fingerprint": "f795347c3e2cad0712d265ce1daa905f87e385a9cc7d5ca973db04ac70a1bf06", "snapshot": { - "docs/framework/react/reference/functions/useHotkeyScopesState.md": "cc68085ff33099c0a92ab0e5726e0c7845521ee52a061dc6feaffa3122e0478d" + "docs/framework/react/reference/functions/useHotkeyScopesState.md": "8a1ac20b771c862772e71eff02bd21397dafc441a4730d4a1c92b7fc560dbb6c" }, - "head": "5b07f208a45afb5b396c628025c52294de62d313", - "outcome": "out-of-scope", - "reason": "Regenerated reference docs; only \"Defined in\" source line links changed.", + "head": "6a7576fb36738c24623d5cbfb260941447d42b76", + "outcome": "no-change", + "reason": "Generated TypeDoc reference. The 'use client' lines shift each 'Defined in' source line by two, and HotkeysProvider now shows its ReactElement return type. No skill guidance depends on either.", "evidence": [ - "docs/framework/react/reference/functions/useHotkeyScopesState.md" + "docs/framework/react/reference/functions/useHotkeyScopesState.md", + "packages/react-hotkeys/src/HotkeysProvider.tsx", + "commit 6a7576fb (ci: apply automated fixes)" ] }, "source:docs/framework/react/reference/index.md": { @@ -2088,14 +2100,17 @@ "evidence": ["packages/react-hotkeys/src/index.ts"] }, "source:packages/react-hotkeys/src/useHotkeyScopesState.ts": { - "fingerprint": "49e0f5c3460a70a588578ee40a30705dc549d074a255d4fa17adffc6fdd73dc7", + "fingerprint": "96a95553282dbc739bfd645dcb8c7e4b9b59b5da3cc34984c3f7f2d5dc6945d1", "snapshot": { - "packages/react-hotkeys/src/useHotkeyScopesState.ts": "f16479fab60036ac1cf1c41d4e0507e13435d410ffeec6b228b6a9d294e604ff" + "packages/react-hotkeys/src/useHotkeyScopesState.ts": "e23ce667a134f728ebbf65f8eadd418bf0863238cad17bdd5785c91d74988c28" }, - "head": "2a31087b3ede3d5bb6b720009643ee65acb422e2", + "head": "41f06c51a38fac64409a3d4932cc8958f558ae57", "outcome": "no-change", - "reason": "Source or guide change is reflected in the skills updated in this review (status, scope state API, preventDefault 'always', hints).", - "evidence": ["packages/react-hotkeys/src/useHotkeyScopesState.ts"] + "reason": "Adds a 'use client' directive only. Hook behavior and signatures are unchanged; the React Server Components guidance is reviewed under the react-hotkeys skill item.", + "evidence": [ + "packages/react-hotkeys/src/useHotkeyScopesState.ts", + "pnpm test:lib for @tanstack/react-hotkeys passes" + ] }, "source:packages/react-hotkeys/tests/useHotkeyRegistrations.test.tsx": { "fingerprint": "9565d0ab2fdb113a86c2c9ae709be9764bffed74ce79f7f7ec7220b1fa8b86aa", @@ -2140,23 +2155,23 @@ "evidence": ["packages/solid-hotkeys/tests/scopes.test.tsx"] }, "source:packages/svelte-hotkeys/src/getHotkeyScopesState.svelte.ts": { - "fingerprint": "7f1568fa37786c72f88d4f84b0a12e60fde9867453ed29a3fd2d0ed43cb9ac92", + "fingerprint": "c39420db15f120d59ee9d87ac7b4291b1f23232fa0cb6fbf90940a5a283384b4", "snapshot": { - "packages/svelte-hotkeys/src/getHotkeyScopesState.svelte.ts": "cbdf34d22e9efbc48f0ad7490fc9c9f38a8eae371bd2771b1fe9916649e38bfb" + "packages/svelte-hotkeys/src/getHotkeyScopesState.svelte.ts": "8d9b633b722f84363c1dfabf4b97ad861f7b507c98c8363a498e8dfc0c6d5c03" }, - "head": "2a31087b3ede3d5bb6b720009643ee65acb422e2", + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", "outcome": "no-change", - "reason": "Source or guide change is reflected in the skills updated in this review (status, scope state API, preventDefault 'always', hints).", + "reason": "Adds .js extensions to relative imports only. Behavior and signatures are unchanged.", "evidence": ["packages/svelte-hotkeys/src/getHotkeyScopesState.svelte.ts"] }, "source:packages/svelte-hotkeys/src/index.ts": { - "fingerprint": "5390a8919a56613eb885c946be67fd103673d160f895ae17fdae7998a87ccfce", + "fingerprint": "3eadb46211dc418a70cd91d303ef31eb3c9823dd3c8ee546bdea16d160efd6dc", "snapshot": { - "packages/svelte-hotkeys/src/index.ts": "d34632d11780969e48f79cb40fd98162f5d88495e836a8e5411c82885c6d71e1" + "packages/svelte-hotkeys/src/index.ts": "095c331919cbeb8a2bc87855f7334c6828087d441f2683b462e12899c6f678b4" }, - "head": "2a31087b3ede3d5bb6b720009643ee65acb422e2", + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", "outcome": "no-change", - "reason": "Source or guide change is reflected in the skills updated in this review (status, scope state API, preventDefault 'always', hints).", + "reason": "Adds .js extensions to relative imports only. Behavior and signatures are unchanged.", "evidence": ["packages/svelte-hotkeys/src/index.ts"] }, "source:packages/svelte-hotkeys/tests/scopes-controls.svelte.ts": { @@ -2480,6 +2495,1124 @@ "outcome": "out-of-scope", "reason": "Tests, sidebar config, or regenerated reference docs.", "evidence": ["docs/config.json"] + }, + "source:docs/devtools.md": { + "fingerprint": "0531feaff7a5b318e796b8b9a5ea2ebbbc167b535d7affd20222afcb1cc9f3ee", + "snapshot": { + "docs/devtools.md": "d8c866a6b4c09cdce0ad469f21085f4b4f7795825bc0e33dbcd1cc0d02ad30c3" + }, + "head": "41f06c51a38fac64409a3d4932cc8958f558ae57", + "outcome": "no-change", + "reason": "Adds the Solid devtools floor (1.9.15) and raises the Svelte devtools floor to 5.40. No skill states devtools install requirements.", + "evidence": [ + "docs/devtools.md", + "packages/solid-hotkeys-devtools/package.json", + "packages/svelte-hotkeys-devtools/package.json" + ] + }, + "source:docs/installation.md": { + "fingerprint": "c2cdb7d7baafc96be4a0b5ac7b66de30e46d42b47cd1ae17f0596f467cd084d5", + "snapshot": { + "docs/installation.md": "4d42c5fe9581aa4e456ed5d0aeff19835efa42b2368eb1d001f560566a955adc" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "no-change", + "reason": "The Alpine line now says to install hotkeysPlugin before Alpine.start(). The alpine-hotkeys skill item covers that setup.", + "evidence": [ + "docs/installation.md", + "packages/alpine-hotkeys/skills/alpine-hotkeys/SKILL.md" + ] + }, + "source:nx.json": { + "fingerprint": "3ac2ee2cc84504f01de5fdd37aed33504b556a9aebe9db53583686777d5d3c5d", + "snapshot": { + "nx.json": "25eda7832cceecfaa48bba3639c9f0e8a7fa7b82804a438ef5383549e5ac4011" + }, + "head": "41f06c51a38fac64409a3d4932cc8958f558ae57", + "outcome": "no-change", + "reason": "Excludes the renamed Ember ESLint config from the production build inputs. No guidance depends on Nx cache inputs.", + "evidence": ["nx.json"] + }, + "source:packages/ember-hotkeys/eslint.config.js": { + "fingerprint": "697130dbc35f4c786d3a78574bd1e08cabfc2e68cea742291b2a80b3631f3684", + "snapshot": { + "packages/ember-hotkeys/eslint.config.js": null + }, + "head": "41f06c51a38fac64409a3d4932cc8958f558ae57", + "outcome": "no-change", + "reason": "Renamed to eslint.config.mjs because the package no longer sets type: module. Lint rules are unchanged.", + "evidence": [ + "packages/ember-hotkeys/eslint.config.mjs", + "pnpm test:eslint for @tanstack/ember-hotkeys passes" + ] + }, + "source:packages/ember-hotkeys/eslint.config.mjs": { + "fingerprint": "0571d999fdb4d7b4862807bf6b80e374188050696fd1d1d70146769e4d193005", + "snapshot": { + "packages/ember-hotkeys/eslint.config.mjs": "fd75d4b4067a23903d10b6861fd3305f262230488c9b44fe928d2b14336d85f4" + }, + "head": "41f06c51a38fac64409a3d4932cc8958f558ae57", + "outcome": "no-change", + "reason": "Same config as the old eslint.config.js, renamed so Node loads it as ESM without type: module.", + "evidence": [ + "packages/ember-hotkeys/eslint.config.mjs", + "pnpm test:eslint for @tanstack/ember-hotkeys passes" + ] + }, + "source:packages/ember-hotkeys/tsdown.config.mts": { + "fingerprint": "42976eb0d54b8ab1c0622cc2636860381143cfc90424d2c075429c09265e556b", + "snapshot": { + "packages/ember-hotkeys/tsdown.config.mts": "e0425c3f43b9031424d17d9ff2a6fbc18cd7a4038f41420503eb33421441f080" + }, + "head": "41f06c51a38fac64409a3d4932cc8958f558ae57", + "outcome": "no-change", + "reason": "Pins .js and .d.ts output extensions and reports publint errors only. The built files and exports are the same as before, so no guidance changes.", + "evidence": [ + "packages/ember-hotkeys/tsdown.config.mts", + "pnpm test:build for @tanstack/ember-hotkeys passes" + ] + }, + "source:packages/ember-hotkeys/tsdown.config.ts": { + "fingerprint": "41882e9f0620274f3a3431fd1b99fc43be415660845d341880ca78e56d89d9c3", + "snapshot": { + "packages/ember-hotkeys/tsdown.config.ts": null + }, + "head": "41f06c51a38fac64409a3d4932cc8958f558ae57", + "outcome": "no-change", + "reason": "Renamed to tsdown.config.mts because the package no longer sets type: module.", + "evidence": ["packages/ember-hotkeys/tsdown.config.mts"] + }, + "source:packages/react-hotkeys-devtools/tsdown.config.ts": { + "fingerprint": "b5a3e4683bd5c43760e791535b1e78e69d81acbc6973fb845345a3b2150c2d5e", + "snapshot": { + "packages/react-hotkeys-devtools/tsdown.config.ts": "31c11692cd78903d3f9b6db7ed8e5fbdce690116f6f6e69e1efdab6f643499ee" + }, + "head": "41f06c51a38fac64409a3d4932cc8958f558ae57", + "outcome": "no-change", + "reason": "Turns off rolldown's module-level directive warning. Output is unchanged; verify-package checks the directives survive.", + "evidence": [ + "packages/react-hotkeys-devtools/tsdown.config.ts", + "pnpm test:build for @tanstack/react-hotkeys-devtools passes" + ] + }, + "source:packages/react-hotkeys/src/_appHotkeysStore.ts": { + "fingerprint": "bf7cb0cf9fe862d679b29cd7773a125cb72f72fd529f3a35f5088b9366520b84", + "snapshot": { + "packages/react-hotkeys/src/_appHotkeysStore.ts": "8559856f8904f3ec51376df60636653be14839f94a95c604b3b3a5d4f05df708" + }, + "head": "41f06c51a38fac64409a3d4932cc8958f558ae57", + "outcome": "no-change", + "reason": "Adds a 'use client' directive only. Hook behavior and signatures are unchanged; the React Server Components guidance is reviewed under the react-hotkeys skill item.", + "evidence": [ + "packages/react-hotkeys/src/_appHotkeysStore.ts", + "pnpm test:lib for @tanstack/react-hotkeys passes" + ] + }, + "source:packages/react-hotkeys/src/useHeldKeyCodes.ts": { + "fingerprint": "afb6972f4a525a47711c2315cae72a2b60d64ab58eb365afbab738c1ef50668d", + "snapshot": { + "packages/react-hotkeys/src/useHeldKeyCodes.ts": "4835312e094dc6adc4e54da169e08eba450a207edf3c4dcca0b0e1064137cddd" + }, + "head": "41f06c51a38fac64409a3d4932cc8958f558ae57", + "outcome": "no-change", + "reason": "Adds a 'use client' directive only. Hook behavior and signatures are unchanged; the React Server Components guidance is reviewed under the react-hotkeys skill item.", + "evidence": [ + "packages/react-hotkeys/src/useHeldKeyCodes.ts", + "pnpm test:lib for @tanstack/react-hotkeys passes" + ] + }, + "source:packages/react-hotkeys/src/useHeldKeys.ts": { + "fingerprint": "6a68e250329bf139f18a6d74cb50f73de9d43077f4fd7c775edfc39cf0df9620", + "snapshot": { + "packages/react-hotkeys/src/useHeldKeys.ts": "898b8675cfb0ea207ce9a00e6150ea964cf473da21465284a4af9405f0e24eed" + }, + "head": "41f06c51a38fac64409a3d4932cc8958f558ae57", + "outcome": "no-change", + "reason": "Adds a 'use client' directive only. Hook behavior and signatures are unchanged; the React Server Components guidance is reviewed under the react-hotkeys skill item.", + "evidence": [ + "packages/react-hotkeys/src/useHeldKeys.ts", + "pnpm test:lib for @tanstack/react-hotkeys passes" + ] + }, + "source:packages/react-hotkeys/src/useHotkeyRecorder.ts": { + "fingerprint": "0e3b0909feec1eeaf7f88ccf6a1a40aeffe38857916c50cdadee199d07b704e9", + "snapshot": { + "packages/react-hotkeys/src/useHotkeyRecorder.ts": "ae2a2022eb2fe71258d24b87c6e50bf9e185a9731f46de3d123777f12bcc2e84" + }, + "head": "41f06c51a38fac64409a3d4932cc8958f558ae57", + "outcome": "no-change", + "reason": "Adds a 'use client' directive only. Hook behavior and signatures are unchanged; the React Server Components guidance is reviewed under the react-hotkeys skill item.", + "evidence": [ + "packages/react-hotkeys/src/useHotkeyRecorder.ts", + "pnpm test:lib for @tanstack/react-hotkeys passes" + ] + }, + "source:packages/react-hotkeys/src/useHotkeyRegistrations.ts": { + "fingerprint": "b51b2325aaf3a0874335cb595e01ce42c0bdc8304170c5e58f0fcea3fb2a599f", + "snapshot": { + "packages/react-hotkeys/src/useHotkeyRegistrations.ts": "c9d391b896137215cdd38a912ec996bc44b93fb18c9aee7a71e1f12a55609d37" + }, + "head": "41f06c51a38fac64409a3d4932cc8958f558ae57", + "outcome": "no-change", + "reason": "Adds a 'use client' directive only. Hook behavior and signatures are unchanged; the React Server Components guidance is reviewed under the react-hotkeys skill item.", + "evidence": [ + "packages/react-hotkeys/src/useHotkeyRegistrations.ts", + "pnpm test:lib for @tanstack/react-hotkeys passes" + ] + }, + "source:packages/react-hotkeys/src/useKeyHold.ts": { + "fingerprint": "fcd57f054ff1cdc491f205ea13669fd4b5a9c63dc2e3e707a80e1939400baafd", + "snapshot": { + "packages/react-hotkeys/src/useKeyHold.ts": "83f6c85e9d4d1e3f6c44d7276fa2acb67ac2247d99d8655fcf2b57d29087de74" + }, + "head": "41f06c51a38fac64409a3d4932cc8958f558ae57", + "outcome": "no-change", + "reason": "Adds a 'use client' directive only. Hook behavior and signatures are unchanged; the React Server Components guidance is reviewed under the react-hotkeys skill item.", + "evidence": [ + "packages/react-hotkeys/src/useKeyHold.ts", + "pnpm test:lib for @tanstack/react-hotkeys passes" + ] + }, + "source:packages/react-hotkeys/tsdown.config.ts": { + "fingerprint": "71c341bcfa47f7ce6d75cb98410fd0d2668b296981cbd9cb8de8b2882d7bc712", + "snapshot": { + "packages/react-hotkeys/tsdown.config.ts": "466a0a62a77a99d06fc28294b18a7a96a57841880f479b34669440eb80055d24" + }, + "head": "41f06c51a38fac64409a3d4932cc8958f558ae57", + "outcome": "no-change", + "reason": "Turns off rolldown's module-level directive warning. Each built file keeps its 'use client', which verify-package checks.", + "evidence": [ + "packages/react-hotkeys/tsdown.config.ts", + "pnpm test:build for @tanstack/react-hotkeys passes" + ] + }, + "source:docs/framework/react/reference/functions/HotkeysProvider.md": { + "fingerprint": "f9779831e2d3ff91313cc82ed109a6de56433cbab505d85c5a3db7005ed0edd9", + "snapshot": { + "docs/framework/react/reference/functions/HotkeysProvider.md": "e56cad1df37f41ff16daaa38b58c44f950763c2b7ae07c5f0d8c061595ca203b" + }, + "head": "6a7576fb36738c24623d5cbfb260941447d42b76", + "outcome": "no-change", + "reason": "Generated TypeDoc reference. The 'use client' lines shift each 'Defined in' source line by two, and HotkeysProvider now shows its ReactElement return type. No skill guidance depends on either.", + "evidence": [ + "docs/framework/react/reference/functions/HotkeysProvider.md", + "packages/react-hotkeys/src/HotkeysProvider.tsx", + "commit 6a7576fb (ci: apply automated fixes)" + ] + }, + "source:docs/framework/react/reference/functions/useAppHotkeyList.md": { + "fingerprint": "9c07a5a3158e36212871f93fe143eedf4c1f98b99aa3d095c3cf48398d12d99d", + "snapshot": { + "docs/framework/react/reference/functions/useAppHotkeyList.md": "1118395306fb31f44c61eb1b9b4357cfe73252b06d7db059e8a7b372376b91f1" + }, + "head": "6a7576fb36738c24623d5cbfb260941447d42b76", + "outcome": "no-change", + "reason": "Generated TypeDoc reference. The 'use client' lines shift each 'Defined in' source line by two, and HotkeysProvider now shows its ReactElement return type. No skill guidance depends on either.", + "evidence": [ + "docs/framework/react/reference/functions/useAppHotkeyList.md", + "packages/react-hotkeys/src/HotkeysProvider.tsx", + "commit 6a7576fb (ci: apply automated fixes)" + ] + }, + "source:docs/framework/react/reference/functions/useAppHotkeys.md": { + "fingerprint": "9e543d4926bcbd988aef5f4b89351bade660bc7cfd71f0df013def3e1912deb4", + "snapshot": { + "docs/framework/react/reference/functions/useAppHotkeys.md": "f492b12728e0463d58f13ace3119fd4f27f036f7e0f0aa12ea087bfb5263cbbe" + }, + "head": "6a7576fb36738c24623d5cbfb260941447d42b76", + "outcome": "no-change", + "reason": "Generated TypeDoc reference. The 'use client' lines shift each 'Defined in' source line by two, and HotkeysProvider now shows its ReactElement return type. No skill guidance depends on either.", + "evidence": [ + "docs/framework/react/reference/functions/useAppHotkeys.md", + "packages/react-hotkeys/src/HotkeysProvider.tsx", + "commit 6a7576fb (ci: apply automated fixes)" + ] + }, + "source:docs/framework/react/reference/functions/useCustomHotkeys.md": { + "fingerprint": "20b7cd319d7f0be2a8656913eaed8e2b603dc9fd25f6dafa326a1446615725bd", + "snapshot": { + "docs/framework/react/reference/functions/useCustomHotkeys.md": "e9d0bc164b67f27531c33146826182183f39483e4e5feb9e3cb176cfdd33abdd" + }, + "head": "6a7576fb36738c24623d5cbfb260941447d42b76", + "outcome": "no-change", + "reason": "Generated TypeDoc reference. The 'use client' lines shift each 'Defined in' source line by two, and HotkeysProvider now shows its ReactElement return type. No skill guidance depends on either.", + "evidence": [ + "docs/framework/react/reference/functions/useCustomHotkeys.md", + "packages/react-hotkeys/src/HotkeysProvider.tsx", + "commit 6a7576fb (ci: apply automated fixes)" + ] + }, + "source:docs/framework/react/reference/functions/useDefaultHotkeysOptions.md": { + "fingerprint": "cf662117c0382dd6622ef91d29bb6f0e6941c17a6307818ca6ad2544e758fb0e", + "snapshot": { + "docs/framework/react/reference/functions/useDefaultHotkeysOptions.md": "471679488bc62613e860e92c3c18d137b76000bdd2d5fc6606f195a812faf6a8" + }, + "head": "6a7576fb36738c24623d5cbfb260941447d42b76", + "outcome": "no-change", + "reason": "Generated TypeDoc reference. The 'use client' lines shift each 'Defined in' source line by two, and HotkeysProvider now shows its ReactElement return type. No skill guidance depends on either.", + "evidence": [ + "docs/framework/react/reference/functions/useDefaultHotkeysOptions.md", + "packages/react-hotkeys/src/HotkeysProvider.tsx", + "commit 6a7576fb (ci: apply automated fixes)" + ] + }, + "source:docs/framework/react/reference/functions/useHeldKeyCodes.md": { + "fingerprint": "9e036080d9f412b523378028971bc5662c2008d6c2c212a07d74e6172a8fc720", + "snapshot": { + "docs/framework/react/reference/functions/useHeldKeyCodes.md": "8b82741674f6746db3110c854558324d8328b08fc8d0c1c140c9ac7a8fb2806b" + }, + "head": "6a7576fb36738c24623d5cbfb260941447d42b76", + "outcome": "no-change", + "reason": "Generated TypeDoc reference. The 'use client' lines shift each 'Defined in' source line by two, and HotkeysProvider now shows its ReactElement return type. No skill guidance depends on either.", + "evidence": [ + "docs/framework/react/reference/functions/useHeldKeyCodes.md", + "packages/react-hotkeys/src/HotkeysProvider.tsx", + "commit 6a7576fb (ci: apply automated fixes)" + ] + }, + "source:docs/framework/react/reference/functions/useHeldKeys.md": { + "fingerprint": "882f3beb513659020c7e339f75a0e49fe66e6fc89c560652cccc3d8af4214d3f", + "snapshot": { + "docs/framework/react/reference/functions/useHeldKeys.md": "154e049ee019e16e142f386882f1af3e3230c59f8753b7d0192a005c905dcd48" + }, + "head": "6a7576fb36738c24623d5cbfb260941447d42b76", + "outcome": "no-change", + "reason": "Generated TypeDoc reference. The 'use client' lines shift each 'Defined in' source line by two, and HotkeysProvider now shows its ReactElement return type. No skill guidance depends on either.", + "evidence": [ + "docs/framework/react/reference/functions/useHeldKeys.md", + "packages/react-hotkeys/src/HotkeysProvider.tsx", + "commit 6a7576fb (ci: apply automated fixes)" + ] + }, + "source:docs/framework/react/reference/functions/useHotkey.md": { + "fingerprint": "5816fe93338875027408f622ee004e6c26f100c3eadb07a5d8372490ccfa5607", + "snapshot": { + "docs/framework/react/reference/functions/useHotkey.md": "30e57309c8c568b6a138f3387211c5a20f853caf10522a76b2f3f30d556b6422" + }, + "head": "6a7576fb36738c24623d5cbfb260941447d42b76", + "outcome": "no-change", + "reason": "Generated TypeDoc reference. The 'use client' lines shift each 'Defined in' source line by two, and HotkeysProvider now shows its ReactElement return type. No skill guidance depends on either.", + "evidence": [ + "docs/framework/react/reference/functions/useHotkey.md", + "packages/react-hotkeys/src/HotkeysProvider.tsx", + "commit 6a7576fb (ci: apply automated fixes)" + ] + }, + "source:docs/framework/react/reference/functions/useHotkeyRecorder.md": { + "fingerprint": "0f84bff435e3305dc27fc963a78934e427628123dc27b61c43f965e4a237fe90", + "snapshot": { + "docs/framework/react/reference/functions/useHotkeyRecorder.md": "bd3c421c0f65755ba778f104a83c1d139575dd4f4e57217099c6323cd1cbed28" + }, + "head": "6a7576fb36738c24623d5cbfb260941447d42b76", + "outcome": "no-change", + "reason": "Generated TypeDoc reference. The 'use client' lines shift each 'Defined in' source line by two, and HotkeysProvider now shows its ReactElement return type. No skill guidance depends on either.", + "evidence": [ + "docs/framework/react/reference/functions/useHotkeyRecorder.md", + "packages/react-hotkeys/src/HotkeysProvider.tsx", + "commit 6a7576fb (ci: apply automated fixes)" + ] + }, + "source:docs/framework/react/reference/functions/useHotkeyRegistrations.md": { + "fingerprint": "93bd43b0bad9adf3adb5e9c12e10416c91dd87173b223671197afe6188fa6562", + "snapshot": { + "docs/framework/react/reference/functions/useHotkeyRegistrations.md": "957838e1da21d617ea8a529c19da6a8bcb18aef37ff170f8b7d75bbfc5f077b3" + }, + "head": "6a7576fb36738c24623d5cbfb260941447d42b76", + "outcome": "no-change", + "reason": "Generated TypeDoc reference. The 'use client' lines shift each 'Defined in' source line by two, and HotkeysProvider now shows its ReactElement return type. No skill guidance depends on either.", + "evidence": [ + "docs/framework/react/reference/functions/useHotkeyRegistrations.md", + "packages/react-hotkeys/src/HotkeysProvider.tsx", + "commit 6a7576fb (ci: apply automated fixes)" + ] + }, + "source:docs/framework/react/reference/functions/useHotkeys.md": { + "fingerprint": "9a3f60ebc7513c51abd258db4151484a85c176549a3327f50ce409600140eeb7", + "snapshot": { + "docs/framework/react/reference/functions/useHotkeys.md": "d7e5c0259d9e74a6dc790164a73e3bb73d1f2cd208cb1350f005dc84a6380403" + }, + "head": "6a7576fb36738c24623d5cbfb260941447d42b76", + "outcome": "no-change", + "reason": "Generated TypeDoc reference. The 'use client' lines shift each 'Defined in' source line by two, and HotkeysProvider now shows its ReactElement return type. No skill guidance depends on either.", + "evidence": [ + "docs/framework/react/reference/functions/useHotkeys.md", + "packages/react-hotkeys/src/HotkeysProvider.tsx", + "commit 6a7576fb (ci: apply automated fixes)" + ] + }, + "source:docs/framework/react/reference/functions/useHotkeysContext.md": { + "fingerprint": "4a200c839c1591d455a603a88d93a1efbf81416c431a0e3dcc3fada8b9b7fa1b", + "snapshot": { + "docs/framework/react/reference/functions/useHotkeysContext.md": "48f14c130836777288225c59e855383ff57f5183d5369ff6628c2db96fdb7231" + }, + "head": "6a7576fb36738c24623d5cbfb260941447d42b76", + "outcome": "no-change", + "reason": "Generated TypeDoc reference. The 'use client' lines shift each 'Defined in' source line by two, and HotkeysProvider now shows its ReactElement return type. No skill guidance depends on either.", + "evidence": [ + "docs/framework/react/reference/functions/useHotkeysContext.md", + "packages/react-hotkeys/src/HotkeysProvider.tsx", + "commit 6a7576fb (ci: apply automated fixes)" + ] + }, + "source:docs/framework/react/reference/functions/useKeyHold.md": { + "fingerprint": "39fecf77ed41c287816748aed3e8d2d89148b84db4d100afdb1c9c505cec7692", + "snapshot": { + "docs/framework/react/reference/functions/useKeyHold.md": "ed7b142b99e40888991365318ff8f7344be13cbc33871e5ec140d0c9b59f08fb" + }, + "head": "6a7576fb36738c24623d5cbfb260941447d42b76", + "outcome": "no-change", + "reason": "Generated TypeDoc reference. The 'use client' lines shift each 'Defined in' source line by two, and HotkeysProvider now shows its ReactElement return type. No skill guidance depends on either.", + "evidence": [ + "docs/framework/react/reference/functions/useKeyHold.md", + "packages/react-hotkeys/src/HotkeysProvider.tsx", + "commit 6a7576fb (ci: apply automated fixes)" + ] + }, + "source:docs/framework/react/reference/interfaces/HotkeysProviderOptions.md": { + "fingerprint": "47af71a7b465b68573fede0691da030a1c5525cb89ef4e7fc6563f1cdac13796", + "snapshot": { + "docs/framework/react/reference/interfaces/HotkeysProviderOptions.md": "7b80ab601c57ccca327d795c8ceb2ce15f4bd9532d68d82bc7183fbcc8884337" + }, + "head": "6a7576fb36738c24623d5cbfb260941447d42b76", + "outcome": "no-change", + "reason": "Generated TypeDoc reference. The 'use client' lines shift each 'Defined in' source line by two, and HotkeysProvider now shows its ReactElement return type. No skill guidance depends on either.", + "evidence": [ + "docs/framework/react/reference/interfaces/HotkeysProviderOptions.md", + "packages/react-hotkeys/src/HotkeysProvider.tsx", + "commit 6a7576fb (ci: apply automated fixes)" + ] + }, + "source:docs/framework/react/reference/interfaces/HotkeysProviderProps.md": { + "fingerprint": "361a4bded298f7e741ebbc0c6358b3f33c873f28b9f4723e99da3786408404fb", + "snapshot": { + "docs/framework/react/reference/interfaces/HotkeysProviderProps.md": "6c321229daeb70695c9e64f2f1bb78fd8b59b29f43f9524c9773fe503bdcd166" + }, + "head": "6a7576fb36738c24623d5cbfb260941447d42b76", + "outcome": "no-change", + "reason": "Generated TypeDoc reference. The 'use client' lines shift each 'Defined in' source line by two, and HotkeysProvider now shows its ReactElement return type. No skill guidance depends on either.", + "evidence": [ + "docs/framework/react/reference/interfaces/HotkeysProviderProps.md", + "packages/react-hotkeys/src/HotkeysProvider.tsx", + "commit 6a7576fb (ci: apply automated fixes)" + ] + }, + "source:docs/framework/react/reference/interfaces/ReactHotkeyRecorder.md": { + "fingerprint": "95282132fda0d62f19567df06a0f569d65877e0f26239b3adba7cf59c3c17c5b", + "snapshot": { + "docs/framework/react/reference/interfaces/ReactHotkeyRecorder.md": "ff4d91e44cf511e67faa4e5eb02ec4b6b8ceb8403b432905b0f2aad8c0ebe292" + }, + "head": "6a7576fb36738c24623d5cbfb260941447d42b76", + "outcome": "no-change", + "reason": "Generated TypeDoc reference. The 'use client' lines shift each 'Defined in' source line by two, and HotkeysProvider now shows its ReactElement return type. No skill guidance depends on either.", + "evidence": [ + "docs/framework/react/reference/interfaces/ReactHotkeyRecorder.md", + "packages/react-hotkeys/src/HotkeysProvider.tsx", + "commit 6a7576fb (ci: apply automated fixes)" + ] + }, + "source:docs/framework/react/reference/interfaces/UseCustomHotkeysResult.md": { + "fingerprint": "48c204c8765cfab628cc395b4665563b3ccb19d24f2da947f9742dd24e473722", + "snapshot": { + "docs/framework/react/reference/interfaces/UseCustomHotkeysResult.md": "3fc4726323bf562e052ea2c403a3b536f7e8227a917751f6518839b55de1c1cd" + }, + "head": "6a7576fb36738c24623d5cbfb260941447d42b76", + "outcome": "no-change", + "reason": "Generated TypeDoc reference. The 'use client' lines shift each 'Defined in' source line by two, and HotkeysProvider now shows its ReactElement return type. No skill guidance depends on either.", + "evidence": [ + "docs/framework/react/reference/interfaces/UseCustomHotkeysResult.md", + "packages/react-hotkeys/src/HotkeysProvider.tsx", + "commit 6a7576fb (ci: apply automated fixes)" + ] + }, + "source:docs/framework/react/reference/type-aliases/UseAppHotkeyOptions.md": { + "fingerprint": "d4ba6127ae988d382ed4c0989fbde1e81af74f4927d2fe894dfeb12a79a6011a", + "snapshot": { + "docs/framework/react/reference/type-aliases/UseAppHotkeyOptions.md": "5359dc6a6d13f7b26b7c76eb7d4ca1aebb9e68fd842f958139e146727be4d679" + }, + "head": "6a7576fb36738c24623d5cbfb260941447d42b76", + "outcome": "no-change", + "reason": "Generated TypeDoc reference. The 'use client' lines shift each 'Defined in' source line by two, and HotkeysProvider now shows its ReactElement return type. No skill guidance depends on either.", + "evidence": [ + "docs/framework/react/reference/type-aliases/UseAppHotkeyOptions.md", + "packages/react-hotkeys/src/HotkeysProvider.tsx", + "commit 6a7576fb (ci: apply automated fixes)" + ] + }, + "source:docs/framework/react/reference/type-aliases/UseHotkeyChordOptions.md": { + "fingerprint": "a2db52566c7019de55425d51df27e82e9e27b7add3d6702b66ab132752309389", + "snapshot": { + "docs/framework/react/reference/type-aliases/UseHotkeyChordOptions.md": "76724e75deafa82249acd4b279e2b00423eefc64c6faaeae13f249770d765d43" + }, + "head": "6a7576fb36738c24623d5cbfb260941447d42b76", + "outcome": "no-change", + "reason": "Generated TypeDoc reference. The 'use client' lines shift each 'Defined in' source line by two, and HotkeysProvider now shows its ReactElement return type. No skill guidance depends on either.", + "evidence": [ + "docs/framework/react/reference/type-aliases/UseHotkeyChordOptions.md", + "packages/react-hotkeys/src/HotkeysProvider.tsx", + "commit 6a7576fb (ci: apply automated fixes)" + ] + }, + "source:docs/framework/react/reference/type-aliases/UseHotkeyCommonOptions.md": { + "fingerprint": "3f15ed86220eae06c724b77c1b49385cffff8e29a7d89ba5977ff0590758f379", + "snapshot": { + "docs/framework/react/reference/type-aliases/UseHotkeyCommonOptions.md": "33904836e7c71539dc6acd0c9d9169a4df7235359bed17606564b236ca84f36a" + }, + "head": "6a7576fb36738c24623d5cbfb260941447d42b76", + "outcome": "no-change", + "reason": "Generated TypeDoc reference. The 'use client' lines shift each 'Defined in' source line by two, and HotkeysProvider now shows its ReactElement return type. No skill guidance depends on either.", + "evidence": [ + "docs/framework/react/reference/type-aliases/UseHotkeyCommonOptions.md", + "packages/react-hotkeys/src/HotkeysProvider.tsx", + "commit 6a7576fb (ci: apply automated fixes)" + ] + }, + "source:docs/framework/react/reference/type-aliases/UseHotkeyDefinition.md": { + "fingerprint": "42672f263b38761ee4351fa4086b44aa8c30ddf8a65459ad8a625b506700dfc9", + "snapshot": { + "docs/framework/react/reference/type-aliases/UseHotkeyDefinition.md": "773bd8a53773fe3cbe0f612f2c0e730b0e3010b3afdeec25fcc2e4fda237fb1b" + }, + "head": "6a7576fb36738c24623d5cbfb260941447d42b76", + "outcome": "no-change", + "reason": "Generated TypeDoc reference. The 'use client' lines shift each 'Defined in' source line by two, and HotkeysProvider now shows its ReactElement return type. No skill guidance depends on either.", + "evidence": [ + "docs/framework/react/reference/type-aliases/UseHotkeyDefinition.md", + "packages/react-hotkeys/src/HotkeysProvider.tsx", + "commit 6a7576fb (ci: apply automated fixes)" + ] + }, + "source:docs/framework/react/reference/type-aliases/UseHotkeyOptions.md": { + "fingerprint": "3c7a66f068007a4db133deb12866fcb4253384bed051e44fcc434543a9262bf3", + "snapshot": { + "docs/framework/react/reference/type-aliases/UseHotkeyOptions.md": "6a5ef6c3f78311eae46bf803843a60a6ab91bcbaf70d470f1cdd42cb8ad8cf2c" + }, + "head": "6a7576fb36738c24623d5cbfb260941447d42b76", + "outcome": "no-change", + "reason": "Generated TypeDoc reference. The 'use client' lines shift each 'Defined in' source line by two, and HotkeysProvider now shows its ReactElement return type. No skill guidance depends on either.", + "evidence": [ + "docs/framework/react/reference/type-aliases/UseHotkeyOptions.md", + "packages/react-hotkeys/src/HotkeysProvider.tsx", + "commit 6a7576fb (ci: apply automated fixes)" + ] + }, + "source:docs/framework/react/reference/type-aliases/UseHotkeyOptionsFor.md": { + "fingerprint": "cd11c61737c8dcd996884d43614cf9360a9f87154d3a2f0f344a383feb600eb5", + "snapshot": { + "docs/framework/react/reference/type-aliases/UseHotkeyOptionsFor.md": "ddd2c825ace36c0ea591cf3bb08a720f360ffe0d0e67144a2a96b1ae3fac11bf" + }, + "head": "6a7576fb36738c24623d5cbfb260941447d42b76", + "outcome": "no-change", + "reason": "Generated TypeDoc reference. The 'use client' lines shift each 'Defined in' source line by two, and HotkeysProvider now shows its ReactElement return type. No skill guidance depends on either.", + "evidence": [ + "docs/framework/react/reference/type-aliases/UseHotkeyOptionsFor.md", + "packages/react-hotkeys/src/HotkeysProvider.tsx", + "commit 6a7576fb (ci: apply automated fixes)" + ] + }, + "source:docs/framework/react/reference/type-aliases/UseHotkeySequenceOptions.md": { + "fingerprint": "c09db9fdace49c41d575cdab3e38fc956cdd85cf394bdc1a4c0b3d9d56a46923", + "snapshot": { + "docs/framework/react/reference/type-aliases/UseHotkeySequenceOptions.md": "b9af35aa97e6005aef0247201a96d7a4a2d847d3c530eadb68e43cb7bdb98339" + }, + "head": "6a7576fb36738c24623d5cbfb260941447d42b76", + "outcome": "no-change", + "reason": "Generated TypeDoc reference. The 'use client' lines shift each 'Defined in' source line by two, and HotkeysProvider now shows its ReactElement return type. No skill guidance depends on either.", + "evidence": [ + "docs/framework/react/reference/type-aliases/UseHotkeySequenceOptions.md", + "packages/react-hotkeys/src/HotkeysProvider.tsx", + "commit 6a7576fb (ci: apply automated fixes)" + ] + }, + "source:docs/framework/react/reference/type-aliases/UseHotkeyTarget.md": { + "fingerprint": "30beca7f8ff4ddb567680b2dd41f7f3fa245a9bff9e1dec7c26d57d695c69ed1", + "snapshot": { + "docs/framework/react/reference/type-aliases/UseHotkeyTarget.md": "c6815dc1c41ecda9a2b54dc01e700106680ec6be4d53aae0557f4cbc52e35daa" + }, + "head": "6a7576fb36738c24623d5cbfb260941447d42b76", + "outcome": "no-change", + "reason": "Generated TypeDoc reference. The 'use client' lines shift each 'Defined in' source line by two, and HotkeysProvider now shows its ReactElement return type. No skill guidance depends on either.", + "evidence": [ + "docs/framework/react/reference/type-aliases/UseHotkeyTarget.md", + "packages/react-hotkeys/src/HotkeysProvider.tsx", + "commit 6a7576fb (ci: apply automated fixes)" + ] + }, + "source:docs/framework/alpine/reference/functions/hotkeysPlugin.md": { + "fingerprint": "270b2e732001a6be7bd8655ada70612e3d609b878ab122803f2b3c4be08d408f", + "snapshot": { + "docs/framework/alpine/reference/functions/hotkeysPlugin.md": "c994b9bdad745c5dba2c64a79a78e82f681e05ef805c88652a9ca896ba240836" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Generated reference page; line numbers and the hotkeysPlugin doc comment changed.", + "evidence": ["docs/framework/alpine/reference/functions/hotkeysPlugin.md"] + }, + "source:examples/alpine/createHeldKeys/src/main.ts": { + "fingerprint": "a970a6bbb2942767514753a2f50fc3a59a72b13f770f2620cee0a650a77e4bdc", + "snapshot": { + "examples/alpine/createHeldKeys/src/main.ts": "75f29fc337259be17e2792324969fd6b20755f0b2b65f42a5b3bcad7fd37d0bb" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Examples install hotkeysPlugin before Alpine.start(), as the adapter now requires. No guidance depends on the examples.", + "evidence": ["examples/alpine/createHeldKeys/src/main.ts"] + }, + "source:examples/alpine/createHotkey-sequences/src/main.ts": { + "fingerprint": "291e42f3732289a5500e8aa933111c7695b9ae07f751cf70f2598a3ad7159ea0", + "snapshot": { + "examples/alpine/createHotkey-sequences/src/main.ts": "68c56a393525782c54daabc0b17cb175f3478d64badf579be146e2e62c6dc1a4" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Examples install hotkeysPlugin before Alpine.start(), as the adapter now requires. No guidance depends on the examples.", + "evidence": ["examples/alpine/createHotkey-sequences/src/main.ts"] + }, + "source:examples/alpine/createHotkey/src/main.ts": { + "fingerprint": "b8e8c6c0b482c3491e30cc3f3a03e6cbcf96f29a9916649cdce6b126c55970d0", + "snapshot": { + "examples/alpine/createHotkey/src/main.ts": "6d42eeda660ae2c2d5812473516265af64531132862433c54687aec3b274dc62" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Examples install hotkeysPlugin before Alpine.start(), as the adapter now requires. No guidance depends on the examples.", + "evidence": ["examples/alpine/createHotkey/src/main.ts"] + }, + "source:examples/alpine/createHotkeyRecorder-sequences/src/main.ts": { + "fingerprint": "632543d2fe1011ea1b9c099c4dac6c4ccfc4903c7a0103ca3f4bed8f45c840d3", + "snapshot": { + "examples/alpine/createHotkeyRecorder-sequences/src/main.ts": "ba58ecb7f44b6d645a486b4313ba6b7830e5519eab72b6f723172d38c8f5459b" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Examples install hotkeysPlugin before Alpine.start(), as the adapter now requires. No guidance depends on the examples.", + "evidence": ["examples/alpine/createHotkeyRecorder-sequences/src/main.ts"] + }, + "source:examples/alpine/createHotkeyRecorder/src/main.ts": { + "fingerprint": "9e85988e8403f5d60d285224118a73d37f89d4153121bede0835505154e99ef8", + "snapshot": { + "examples/alpine/createHotkeyRecorder/src/main.ts": "33e70363942721ed75c701d1fa6f446ec4aae52a576dff920cadc085803c747b" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Examples install hotkeysPlugin before Alpine.start(), as the adapter now requires. No guidance depends on the examples.", + "evidence": ["examples/alpine/createHotkeyRecorder/src/main.ts"] + }, + "source:examples/alpine/createHotkeys-sequences/src/main.ts": { + "fingerprint": "eff5c19a7cf5ad7c097b57bb8da18a4becab21728eda95d6f87bdb88013a50df", + "snapshot": { + "examples/alpine/createHotkeys-sequences/src/main.ts": "2a20cd9ef7e5be9fd96ec8bd9523ce704d635c1c17eb760dd94a3a1976bc53c2" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Examples install hotkeysPlugin before Alpine.start(), as the adapter now requires. No guidance depends on the examples.", + "evidence": ["examples/alpine/createHotkeys-sequences/src/main.ts"] + }, + "source:examples/alpine/createHotkeys/src/main.ts": { + "fingerprint": "d31d62c73963d104161807dbceeb8bd06b5e1e17ed917f379ed95fd23b56ce2a", + "snapshot": { + "examples/alpine/createHotkeys/src/main.ts": "bb9dfc93077ff80c87530c7d050981c4f522818dff49399fa2adcdaddeedec74" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Examples install hotkeysPlugin before Alpine.start(), as the adapter now requires. No guidance depends on the examples.", + "evidence": ["examples/alpine/createHotkeys/src/main.ts"] + }, + "source:examples/alpine/createKeyHold/src/main.ts": { + "fingerprint": "e350c79ef05391a1838c1540ab66c43c7e501921dce91c9422eb44b0c68b3807", + "snapshot": { + "examples/alpine/createKeyHold/src/main.ts": "273598da0c63af877680a9a483c43d429473b014f5597461651cc95d5d5798e4" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Examples install hotkeysPlugin before Alpine.start(), as the adapter now requires. No guidance depends on the examples.", + "evidence": ["examples/alpine/createKeyHold/src/main.ts"] + }, + "source:packages/alpine-hotkeys/tests/alpine-instance.test.ts": { + "fingerprint": "7e33fe648dccd7abe7293c0fa9e5ca5d7b25023dde9568d4af846ebdd3d50363", + "snapshot": { + "packages/alpine-hotkeys/tests/alpine-instance.test.ts": "bec62f08a3be3419b56a5b212ad22c6525ad04d64121348b14b97e4323b5c41b" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Tests for using the plugin's Alpine instance, the window.Alpine fallback and the missing-Alpine error; the setup file installs the plugin. Guidance is reviewed under the alpine-hotkeys skill item.", + "evidence": ["packages/alpine-hotkeys/tests/alpine-instance.test.ts"] + }, + "source:packages/alpine-hotkeys/tests/setup.ts": { + "fingerprint": "50701ec86eac9c926fd203818974cfe27f6e2cb5638c540915e735899f98ce3b", + "snapshot": { + "packages/alpine-hotkeys/tests/setup.ts": "8324659e7d2b066b2e08d017292297708110ffb241d2230965cde154f01c56f1" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Tests for using the plugin's Alpine instance, the window.Alpine fallback and the missing-Alpine error; the setup file installs the plugin. Guidance is reviewed under the alpine-hotkeys skill item.", + "evidence": ["packages/alpine-hotkeys/tests/setup.ts"] + }, + "source:packages/alpine-hotkeys/vitest.config.ts": { + "fingerprint": "eb075195e56bbad1862845401cf6887d4ffa513423c61104900f80cc73798070", + "snapshot": { + "packages/alpine-hotkeys/vitest.config.ts": "aebbdb2fe7e692881ed192fcbdd9fb3670ad7a6020a6251f566d2705473fba8b" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Tests for using the plugin's Alpine instance, the window.Alpine fallback and the missing-Alpine error; the setup file installs the plugin. Guidance is reviewed under the alpine-hotkeys skill item.", + "evidence": ["packages/alpine-hotkeys/vitest.config.ts"] + }, + "source:packages/angular-hotkeys-devtools/src/AngularHotkeysDevtools.ts": { + "fingerprint": "c6383c6e5ec3d6450abc0daaf315bcced2682010d6f0f1e323f3beeba9c9a530", + "snapshot": { + "packages/angular-hotkeys-devtools/src/AngularHotkeysDevtools.ts": "04d2c0b84a0358bcfc252847ceb013c76b4e97a58a53277e175f0f6767031592" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Devtools packages now declare their own panel and plugin types instead of re-exporting @tanstack/devtools-utils types, which import @tanstack/devtools without depending on it. The Vue panel defaults theme to dark and reads the props the Vue devtools dock passes. No skill covers devtools types or the Vue panel.", + "evidence": [ + "packages/angular-hotkeys-devtools/src/AngularHotkeysDevtools.ts" + ] + }, + "source:packages/angular-hotkeys-devtools/src/index.ts": { + "fingerprint": "8464af2da5bffcce3ead58a78828171eb4caa2af0fde8f5c0ccf7aa9e6a47733", + "snapshot": { + "packages/angular-hotkeys-devtools/src/index.ts": "9eaf4367744cf3e590f5ff26e78221ec63fc3e9ba2c0b2fd302ebb4290d1c05e" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Devtools packages now declare their own panel and plugin types instead of re-exporting @tanstack/devtools-utils types, which import @tanstack/devtools without depending on it. The Vue panel defaults theme to dark and reads the props the Vue devtools dock passes. No skill covers devtools types or the Vue panel.", + "evidence": ["packages/angular-hotkeys-devtools/src/index.ts"] + }, + "source:packages/angular-hotkeys-devtools/src/plugin.ts": { + "fingerprint": "0f351e2af072b8c44c1550df08beabc0a11a1333440aaf4963c054647c75fb12", + "snapshot": { + "packages/angular-hotkeys-devtools/src/plugin.ts": "10bc1286908e0df0f13f9dd36cbec718b70aed71ce1e5675da2664365c538525" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Devtools packages now declare their own panel and plugin types instead of re-exporting @tanstack/devtools-utils types, which import @tanstack/devtools without depending on it. The Vue panel defaults theme to dark and reads the props the Vue devtools dock passes. No skill covers devtools types or the Vue panel.", + "evidence": ["packages/angular-hotkeys-devtools/src/plugin.ts"] + }, + "source:packages/angular-hotkeys-devtools/src/production.ts": { + "fingerprint": "65b9e2742cc640e6b33724ac85cd3bc9b73d3fb30d62a3e155d5d01eb840086b", + "snapshot": { + "packages/angular-hotkeys-devtools/src/production.ts": "7da4255a4df3c0aef1da462c634bd74ca3b25590315204d9c2456ebf9678b9a3" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Devtools packages now declare their own panel and plugin types instead of re-exporting @tanstack/devtools-utils types, which import @tanstack/devtools without depending on it. The Vue panel defaults theme to dark and reads the props the Vue devtools dock passes. No skill covers devtools types or the Vue panel.", + "evidence": ["packages/angular-hotkeys-devtools/src/production.ts"] + }, + "source:packages/hotkeys-devtools/src/core.tsx": { + "fingerprint": "6b22a3a7f67e5ee17a05cde52ead2c582d5ed9996fa06839cfcb8085a3fb23f4", + "snapshot": { + "packages/hotkeys-devtools/src/core.tsx": "63cf6ef72a8d29a58292e6fa64d69130955ba746bbc309073e1ec16e7ac21ac5" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Devtools packages now declare their own panel and plugin types instead of re-exporting @tanstack/devtools-utils types, which import @tanstack/devtools without depending on it. The Vue panel defaults theme to dark and reads the props the Vue devtools dock passes. No skill covers devtools types or the Vue panel.", + "evidence": ["packages/hotkeys-devtools/src/core.tsx"] + }, + "source:packages/hotkeys-devtools/src/index.ts": { + "fingerprint": "87a756c155fda12cd148f5db7519db31d5d0cffc454550724cb600ad4acb2be1", + "snapshot": { + "packages/hotkeys-devtools/src/index.ts": "f69f186759ea06d1f6e1b2514f611b0d8bc36217322c48587018406eb4c2f2ec" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Devtools packages now declare their own panel and plugin types instead of re-exporting @tanstack/devtools-utils types, which import @tanstack/devtools without depending on it. The Vue panel defaults theme to dark and reads the props the Vue devtools dock passes. No skill covers devtools types or the Vue panel.", + "evidence": ["packages/hotkeys-devtools/src/index.ts"] + }, + "source:packages/hotkeys-devtools/src/production.ts": { + "fingerprint": "f11f433ef428c5eb1ed164919001c5e94f8f847b08dca9c2a9d098cce28e789f", + "snapshot": { + "packages/hotkeys-devtools/src/production.ts": "46d588e21e0ba1f9c3e13ac2d333f8e4a826f8b2a4f6fee627a0fc2478041784" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Devtools packages now declare their own panel and plugin types instead of re-exporting @tanstack/devtools-utils types, which import @tanstack/devtools without depending on it. The Vue panel defaults theme to dark and reads the props the Vue devtools dock passes. No skill covers devtools types or the Vue panel.", + "evidence": ["packages/hotkeys-devtools/src/production.ts"] + }, + "source:packages/hotkeys-devtools/src/types.ts": { + "fingerprint": "1bcf132f83d0cea68a2ece2cfb1e751c26ac5304d587528e4a5c6a8b9ae4c126", + "snapshot": { + "packages/hotkeys-devtools/src/types.ts": "c7331c3eff5e7a527518678a3aae29e9264bbdd4e17ea4e6a6fb35853edfc99d" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Devtools packages now declare their own panel and plugin types instead of re-exporting @tanstack/devtools-utils types, which import @tanstack/devtools without depending on it. The Vue panel defaults theme to dark and reads the props the Vue devtools dock passes. No skill covers devtools types or the Vue panel.", + "evidence": ["packages/hotkeys-devtools/src/types.ts"] + }, + "source:packages/preact-hotkeys-devtools/src/PreactHotkeysDevtools.tsx": { + "fingerprint": "a56954864fae440d16b2703fcc1f9d6b6b56a49bcecc4a47ac4d58a0dd16139c", + "snapshot": { + "packages/preact-hotkeys-devtools/src/PreactHotkeysDevtools.tsx": "a13962faa7f7f245e3ad6b84fde7f55b0bd1f5ab6d01491dc0dc5dc065371dd8" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Devtools packages now declare their own panel and plugin types instead of re-exporting @tanstack/devtools-utils types, which import @tanstack/devtools without depending on it. The Vue panel defaults theme to dark and reads the props the Vue devtools dock passes. No skill covers devtools types or the Vue panel.", + "evidence": [ + "packages/preact-hotkeys-devtools/src/PreactHotkeysDevtools.tsx" + ] + }, + "source:packages/preact-hotkeys-devtools/src/index.ts": { + "fingerprint": "7731f1314cb3365e58eb6bfa762750a825fa1d88ba7e8eec3a6eab2951358893", + "snapshot": { + "packages/preact-hotkeys-devtools/src/index.ts": "8403ed4b9b11093aab7468395ecad24912833a003e268f0c6c2dcd0133d54f06" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Devtools packages now declare their own panel and plugin types instead of re-exporting @tanstack/devtools-utils types, which import @tanstack/devtools without depending on it. The Vue panel defaults theme to dark and reads the props the Vue devtools dock passes. No skill covers devtools types or the Vue panel.", + "evidence": ["packages/preact-hotkeys-devtools/src/index.ts"] + }, + "source:packages/preact-hotkeys-devtools/src/plugin.tsx": { + "fingerprint": "12fcf1ecfe42c791007298a078c1ed1bb35cc578c03706275e5a5ae0a718dd15", + "snapshot": { + "packages/preact-hotkeys-devtools/src/plugin.tsx": "8906f2712262957f597d464036c492eae425e094dd30fccd49521be9fdf6b10a" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Devtools packages now declare their own panel and plugin types instead of re-exporting @tanstack/devtools-utils types, which import @tanstack/devtools without depending on it. The Vue panel defaults theme to dark and reads the props the Vue devtools dock passes. No skill covers devtools types or the Vue panel.", + "evidence": ["packages/preact-hotkeys-devtools/src/plugin.tsx"] + }, + "source:packages/react-hotkeys-devtools/src/ReactHotkeysDevtools.tsx": { + "fingerprint": "00dfa8e759888fe01d57bd0d98777050fc42099ad233b0e1f89174e482241d5c", + "snapshot": { + "packages/react-hotkeys-devtools/src/ReactHotkeysDevtools.tsx": "ded2c9d5d1794e80e7233543ea50f6e6a632f0eee50006e504c39d60dc0c55e4" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Devtools packages now declare their own panel and plugin types instead of re-exporting @tanstack/devtools-utils types, which import @tanstack/devtools without depending on it. The Vue panel defaults theme to dark and reads the props the Vue devtools dock passes. No skill covers devtools types or the Vue panel.", + "evidence": [ + "packages/react-hotkeys-devtools/src/ReactHotkeysDevtools.tsx" + ] + }, + "source:packages/react-hotkeys-devtools/src/index.ts": { + "fingerprint": "da9ecae473bc9723d097b6100b7d9897e3c2c3f4d3de6a7feab13cb4edea9824", + "snapshot": { + "packages/react-hotkeys-devtools/src/index.ts": "5c9571d38377d444a25c9093cf4d40c151ab583c4568d20d3bed71b5644d8a01" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Devtools packages now declare their own panel and plugin types instead of re-exporting @tanstack/devtools-utils types, which import @tanstack/devtools without depending on it. The Vue panel defaults theme to dark and reads the props the Vue devtools dock passes. No skill covers devtools types or the Vue panel.", + "evidence": ["packages/react-hotkeys-devtools/src/index.ts"] + }, + "source:packages/react-hotkeys-devtools/src/plugin.tsx": { + "fingerprint": "fcc70b32cd873f1e1c84cd96dc64b722f9ddb80833eb97dd4b995493432eb2a1", + "snapshot": { + "packages/react-hotkeys-devtools/src/plugin.tsx": "63bc3c7ec0189265315ae05a6d3e3c8fd7b5606a19ab5bb0739c3f91f18a9380" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Devtools packages now declare their own panel and plugin types instead of re-exporting @tanstack/devtools-utils types, which import @tanstack/devtools without depending on it. The Vue panel defaults theme to dark and reads the props the Vue devtools dock passes. No skill covers devtools types or the Vue panel.", + "evidence": ["packages/react-hotkeys-devtools/src/plugin.tsx"] + }, + "source:packages/react-hotkeys-devtools/src/production.ts": { + "fingerprint": "72433872f8045b2b58c9fb707055176561343a14d280d96ff34a5fe63577024d", + "snapshot": { + "packages/react-hotkeys-devtools/src/production.ts": "3c7a08eff652b195552b7042a2800713f96fdd3dc57664a817a92ab7d453d43c" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Devtools packages now declare their own panel and plugin types instead of re-exporting @tanstack/devtools-utils types, which import @tanstack/devtools without depending on it. The Vue panel defaults theme to dark and reads the props the Vue devtools dock passes. No skill covers devtools types or the Vue panel.", + "evidence": ["packages/react-hotkeys-devtools/src/production.ts"] + }, + "source:packages/solid-hotkeys-devtools/src/SolidHotkeysDevtools.tsx": { + "fingerprint": "cd8a54b910334f9c83ac0682eacf2d97e7ad47118e389081651cc77d698bf83f", + "snapshot": { + "packages/solid-hotkeys-devtools/src/SolidHotkeysDevtools.tsx": "f1af15c3ed641720e915e60c07bea9566785b4af2c8ce0316012969890e641a3" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Devtools packages now declare their own panel and plugin types instead of re-exporting @tanstack/devtools-utils types, which import @tanstack/devtools without depending on it. The Vue panel defaults theme to dark and reads the props the Vue devtools dock passes. No skill covers devtools types or the Vue panel.", + "evidence": [ + "packages/solid-hotkeys-devtools/src/SolidHotkeysDevtools.tsx" + ] + }, + "source:packages/solid-hotkeys-devtools/src/index.ts": { + "fingerprint": "6eddde2c0502f20d852d7826f3f7d7c67382d25a3b875cd9f7a6162649628202", + "snapshot": { + "packages/solid-hotkeys-devtools/src/index.ts": "2579e792ea4a047b670cf0594a0f7fee78f1136ee60d13975b28fbc9bc04b7e8" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Devtools packages now declare their own panel and plugin types instead of re-exporting @tanstack/devtools-utils types, which import @tanstack/devtools without depending on it. The Vue panel defaults theme to dark and reads the props the Vue devtools dock passes. No skill covers devtools types or the Vue panel.", + "evidence": ["packages/solid-hotkeys-devtools/src/index.ts"] + }, + "source:packages/solid-hotkeys-devtools/src/plugin.tsx": { + "fingerprint": "508c46d7ca6e6bb53b0779c55ed946cd0a82a6f89501245ffd92521cd2759648", + "snapshot": { + "packages/solid-hotkeys-devtools/src/plugin.tsx": "046fb0581cfcd62ae7bf2b273722aff6510ad99b2b83d4d88243286421643a91" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Devtools packages now declare their own panel and plugin types instead of re-exporting @tanstack/devtools-utils types, which import @tanstack/devtools without depending on it. The Vue panel defaults theme to dark and reads the props the Vue devtools dock passes. No skill covers devtools types or the Vue panel.", + "evidence": ["packages/solid-hotkeys-devtools/src/plugin.tsx"] + }, + "source:packages/solid-hotkeys-devtools/src/production.ts": { + "fingerprint": "9fee86a61b2dc189140d22c3f4dfb2f8adf5637200e0507c031c30f53a2578b8", + "snapshot": { + "packages/solid-hotkeys-devtools/src/production.ts": "3eddfc0da79cd0e3960089bf6d66d45715b6e86f2462309b12e6f62d91e9ab50" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Devtools packages now declare their own panel and plugin types instead of re-exporting @tanstack/devtools-utils types, which import @tanstack/devtools without depending on it. The Vue panel defaults theme to dark and reads the props the Vue devtools dock passes. No skill covers devtools types or the Vue panel.", + "evidence": ["packages/solid-hotkeys-devtools/src/production.ts"] + }, + "source:packages/svelte-hotkeys-devtools/src/SvelteHotkeysDevtools.ts": { + "fingerprint": "8a19b065ae654332da8d737443f6b3f4def46de1b49a2ec4b7e7ebba10ac22a5", + "snapshot": { + "packages/svelte-hotkeys-devtools/src/SvelteHotkeysDevtools.ts": "55fa300681bbb8faef59e7e14dbcdade65b06c327b3dd66740a45761723bc327" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Devtools packages now declare their own panel and plugin types instead of re-exporting @tanstack/devtools-utils types, which import @tanstack/devtools without depending on it. The Vue panel defaults theme to dark and reads the props the Vue devtools dock passes. No skill covers devtools types or the Vue panel.", + "evidence": [ + "packages/svelte-hotkeys-devtools/src/SvelteHotkeysDevtools.ts" + ] + }, + "source:packages/svelte-hotkeys-devtools/src/index.ts": { + "fingerprint": "46ae2d9d13595496b6d3ef42fc4b244d4387251b0038f9f1bc17d111d325f59e", + "snapshot": { + "packages/svelte-hotkeys-devtools/src/index.ts": "e9f7e5effe31bcb3577dfb0078d7cba3dd3464975f659587e4c396a30ec0902e" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Devtools packages now declare their own panel and plugin types instead of re-exporting @tanstack/devtools-utils types, which import @tanstack/devtools without depending on it. The Vue panel defaults theme to dark and reads the props the Vue devtools dock passes. No skill covers devtools types or the Vue panel.", + "evidence": ["packages/svelte-hotkeys-devtools/src/index.ts"] + }, + "source:packages/svelte-hotkeys-devtools/src/plugin.ts": { + "fingerprint": "533929ecd03054ed938271763d11c5267984a5b04b29356e5190cae186b75e5f", + "snapshot": { + "packages/svelte-hotkeys-devtools/src/plugin.ts": "7e9591fce562c8cb2aafca8c5e02719bb21bc5e74bbcacc90d072d1d6b286723" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Devtools packages now declare their own panel and plugin types instead of re-exporting @tanstack/devtools-utils types, which import @tanstack/devtools without depending on it. The Vue panel defaults theme to dark and reads the props the Vue devtools dock passes. No skill covers devtools types or the Vue panel.", + "evidence": ["packages/svelte-hotkeys-devtools/src/plugin.ts"] + }, + "source:packages/svelte-hotkeys-devtools/src/production.ts": { + "fingerprint": "41d447ed1ec63a144daaebca94216247473cfbf5d304d7358c2827383a981ad8", + "snapshot": { + "packages/svelte-hotkeys-devtools/src/production.ts": "6dc22652067face2df6514c8ed51f55fc016f2c36226611c4b2d03f5bb7fa641" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Devtools packages now declare their own panel and plugin types instead of re-exporting @tanstack/devtools-utils types, which import @tanstack/devtools without depending on it. The Vue panel defaults theme to dark and reads the props the Vue devtools dock passes. No skill covers devtools types or the Vue panel.", + "evidence": ["packages/svelte-hotkeys-devtools/src/production.ts"] + }, + "source:packages/svelte-hotkeys/src/getHeldKeyCodesMap.svelte.ts": { + "fingerprint": "2291f12354e04fdb4a604b990168032b9e4f85b201e44cf6f0b1946cd8c0f174", + "snapshot": { + "packages/svelte-hotkeys/src/getHeldKeyCodesMap.svelte.ts": "032fc8e325fc198e52fb11509968c56a1f3b2890198d8f28f6ddf97934b3fa96" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "no-change", + "reason": "Adds .js extensions to relative imports only. Behavior and signatures are unchanged.", + "evidence": ["packages/svelte-hotkeys/src/getHeldKeyCodesMap.svelte.ts"] + }, + "source:packages/svelte-hotkeys/src/getHeldKeys.svelte.ts": { + "fingerprint": "b2e26275e82f023b74fd9cd3113a63e7a0459e8334f92720f22e83b90e031e05", + "snapshot": { + "packages/svelte-hotkeys/src/getHeldKeys.svelte.ts": "24d251e52908c758c6bc81d948960d595e6a0309a520d561fa3205f9efeb3c67" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "no-change", + "reason": "Adds .js extensions to relative imports only. Behavior and signatures are unchanged.", + "evidence": ["packages/svelte-hotkeys/src/getHeldKeys.svelte.ts"] + }, + "source:packages/svelte-hotkeys/src/getHotkeyRegistrations.svelte.ts": { + "fingerprint": "1d914790aa1f859eb622ec45ed8683131abe30df476877613d5cd1123f95cab7", + "snapshot": { + "packages/svelte-hotkeys/src/getHotkeyRegistrations.svelte.ts": "40f69abd1a83ff6cde7b5da17d97cfe7a98898e5a214f0c9738b4358aa9a4760" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "no-change", + "reason": "Adds .js extensions to relative imports only. Behavior and signatures are unchanged.", + "evidence": [ + "packages/svelte-hotkeys/src/getHotkeyRegistrations.svelte.ts" + ] + }, + "source:packages/svelte-hotkeys/src/getIsKeyHeld.svelte.ts": { + "fingerprint": "6b3c933a7237a4ffcf8b00a4b2977e4c5e2154af3f33f60b4dedefadb6c9d8e5", + "snapshot": { + "packages/svelte-hotkeys/src/getIsKeyHeld.svelte.ts": "49f2376bc4b2193d54dc4f622ae9e0e7f0032775a89f39edd802f2f802e80bb5" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "no-change", + "reason": "Adds .js extensions to relative imports only. Behavior and signatures are unchanged.", + "evidence": ["packages/svelte-hotkeys/src/getIsKeyHeld.svelte.ts"] + }, + "source:packages/vue-hotkeys-devtools/src/VueHotkeysDevtools.ts": { + "fingerprint": "6f4696e5174f60aae37ca8e24b34aa4f1600003334163acebb94baf072808cad", + "snapshot": { + "packages/vue-hotkeys-devtools/src/VueHotkeysDevtools.ts": "d05211fae8b8ee153d8ecafa676234f443b39333a315c1b4818c54677a3433b4" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Devtools packages now declare their own panel and plugin types instead of re-exporting @tanstack/devtools-utils types, which import @tanstack/devtools without depending on it. The Vue panel defaults theme to dark and reads the props the Vue devtools dock passes. No skill covers devtools types or the Vue panel.", + "evidence": ["packages/vue-hotkeys-devtools/src/VueHotkeysDevtools.ts"] + }, + "source:packages/vue-hotkeys-devtools/src/VueHotkeysDevtools.tsx": { + "fingerprint": "04f0f781b152e9860f048bfb0e62ea53578cff4e87f56544886b489f9adc1f47", + "snapshot": { + "packages/vue-hotkeys-devtools/src/VueHotkeysDevtools.tsx": null + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Devtools packages now declare their own panel and plugin types instead of re-exporting @tanstack/devtools-utils types, which import @tanstack/devtools without depending on it. The Vue panel defaults theme to dark and reads the props the Vue devtools dock passes. No skill covers devtools types or the Vue panel.", + "evidence": ["packages/vue-hotkeys-devtools/src/VueHotkeysDevtools.tsx"] + }, + "source:packages/vue-hotkeys-devtools/src/index.ts": { + "fingerprint": "758e147cf9fd2ca1b77c2bd0661f6d5d3dbaf39eb49f9f98ad0f58e66783c983", + "snapshot": { + "packages/vue-hotkeys-devtools/src/index.ts": "32d9b4f08e8693945eac2ec0d1128c0a2cb1a3d5ef88a3e18c91ec4561cdf0aa" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Devtools packages now declare their own panel and plugin types instead of re-exporting @tanstack/devtools-utils types, which import @tanstack/devtools without depending on it. The Vue panel defaults theme to dark and reads the props the Vue devtools dock passes. No skill covers devtools types or the Vue panel.", + "evidence": ["packages/vue-hotkeys-devtools/src/index.ts"] + }, + "source:packages/vue-hotkeys-devtools/src/plugin.ts": { + "fingerprint": "726d5857fcb74266a44f7cf92a2f404a98b9670aed5aa7cd5c4bc7544e87024e", + "snapshot": { + "packages/vue-hotkeys-devtools/src/plugin.ts": "f84af53877335d790fc9f0ac3bc6a2d14c9ccc5cae1046afef8cfce0e8f68f08" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Devtools packages now declare their own panel and plugin types instead of re-exporting @tanstack/devtools-utils types, which import @tanstack/devtools without depending on it. The Vue panel defaults theme to dark and reads the props the Vue devtools dock passes. No skill covers devtools types or the Vue panel.", + "evidence": ["packages/vue-hotkeys-devtools/src/plugin.ts"] + }, + "source:packages/vue-hotkeys-devtools/src/production.ts": { + "fingerprint": "edc58d36c59a9931e3fd2d7070b2f42ff066e387818089281cb1d5192f295194", + "snapshot": { + "packages/vue-hotkeys-devtools/src/production.ts": "0554ec0475032f230e90f7ef13528c3fd8d8e5f4a17bcc9f30ebfa4456bcbe07" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Devtools packages now declare their own panel and plugin types instead of re-exporting @tanstack/devtools-utils types, which import @tanstack/devtools without depending on it. The Vue panel defaults theme to dark and reads the props the Vue devtools dock passes. No skill covers devtools types or the Vue panel.", + "evidence": ["packages/vue-hotkeys-devtools/src/production.ts"] + }, + "source:packages/vue-hotkeys-devtools/tests/panel.test.ts": { + "fingerprint": "e51ad0c77bb7950a5699b6751a35bcda844e7aa8c6d42a84995a9e69f14260fd", + "snapshot": { + "packages/vue-hotkeys-devtools/tests/panel.test.ts": "d5404e738b2dbb2f89b8b43e8c9b77826c0c9e302b0ab83258805d453dbdac53" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Devtools packages now declare their own panel and plugin types instead of re-exporting @tanstack/devtools-utils types, which import @tanstack/devtools without depending on it. The Vue panel defaults theme to dark and reads the props the Vue devtools dock passes. No skill covers devtools types or the Vue panel.", + "evidence": ["packages/vue-hotkeys-devtools/tests/panel.test.ts"] + }, + "source:packages/vue-hotkeys-devtools/tsconfig.json": { + "fingerprint": "a4069656b10f6bc4ce06558a5498ccf2c8945a4290edef4347dabcc81f3a3c91", + "snapshot": { + "packages/vue-hotkeys-devtools/tsconfig.json": "0648d489019bc097f35ebdc2e8d3359324107b15fbf60fb47337cfcc1e973dff" + }, + "head": "a61d917542e56c07f1a3d2aa3f6eb951e5150818", + "outcome": "out-of-scope", + "reason": "Devtools packages now declare their own panel and plugin types instead of re-exporting @tanstack/devtools-utils types, which import @tanstack/devtools without depending on it. The Vue panel defaults theme to dark and reads the props the Vue devtools dock passes. No skill covers devtools types or the Vue panel.", + "evidence": ["packages/vue-hotkeys-devtools/tsconfig.json"] + }, + "source:docs/framework/svelte/reference/functions/createHotkey.md": { + "fingerprint": "6781810a382add8dfcc47171fa5cd0c253aba3e10ab683a26ed8cd3e14105794", + "snapshot": { + "docs/framework/svelte/reference/functions/createHotkey.md": "7853ab61fcb03beb3f29f4da3306c2c5e5f9391d49d6391fdb6ba9499a9fad82" + }, + "head": "c4273292a3d1ad2d0cf65bd8f80362c26474bd89", + "outcome": "out-of-scope", + "reason": "Generated reference page; source line numbers moved after CI autofix reformatted an import in createHotkey.svelte.ts.", + "evidence": ["docs/framework/svelte/reference/functions/createHotkey.md"] + }, + "source:docs/framework/svelte/reference/functions/createHotkeyAttachment.md": { + "fingerprint": "55410f5675eb6d7c2d335f0a17cb0502d98f27a5f4e894ee4496c9a13a234ea7", + "snapshot": { + "docs/framework/svelte/reference/functions/createHotkeyAttachment.md": "c39dd6eb927cf15825803d623c1716938cdccdd781eb295b6148fd93a1326296" + }, + "head": "c4273292a3d1ad2d0cf65bd8f80362c26474bd89", + "outcome": "out-of-scope", + "reason": "Generated reference page; source line numbers moved after CI autofix reformatted an import in createHotkey.svelte.ts.", + "evidence": [ + "docs/framework/svelte/reference/functions/createHotkeyAttachment.md" + ] + }, + "source:docs/framework/svelte/reference/type-aliases/CreateAppHotkeyOptions.md": { + "fingerprint": "6797032e823816c650804c623942fade593358e41b2e29ed864872adf6eb00ab", + "snapshot": { + "docs/framework/svelte/reference/type-aliases/CreateAppHotkeyOptions.md": "b16789a873e5dc8bd95e9c6e255cf76093f880850bb8e7e6f09ae04a673272d1" + }, + "head": "c4273292a3d1ad2d0cf65bd8f80362c26474bd89", + "outcome": "out-of-scope", + "reason": "Generated reference page; source line numbers moved after CI autofix reformatted an import in createHotkey.svelte.ts.", + "evidence": [ + "docs/framework/svelte/reference/type-aliases/CreateAppHotkeyOptions.md" + ] + }, + "source:docs/framework/svelte/reference/type-aliases/CreateHotkeyChordOptions.md": { + "fingerprint": "393709940d746eab2acd9866328c91ec7f642e50cbc43a25104aac8e894d539a", + "snapshot": { + "docs/framework/svelte/reference/type-aliases/CreateHotkeyChordOptions.md": "f7799230ad91da42ed54b9886e35b7d105e9c28232e66d4de13570b313d7e32c" + }, + "head": "c4273292a3d1ad2d0cf65bd8f80362c26474bd89", + "outcome": "out-of-scope", + "reason": "Generated reference page; source line numbers moved after CI autofix reformatted an import in createHotkey.svelte.ts.", + "evidence": [ + "docs/framework/svelte/reference/type-aliases/CreateHotkeyChordOptions.md" + ] + }, + "source:docs/framework/svelte/reference/type-aliases/CreateHotkeyCommonOptions.md": { + "fingerprint": "24962b2d6c21276fd26358a2277acb1e9977852bc7dec78dc43ca4a3d30a74be", + "snapshot": { + "docs/framework/svelte/reference/type-aliases/CreateHotkeyCommonOptions.md": "34c7b3a4fa566f25e6ddc465b3c5ab01be650becea3e330042bd295977739a5f" + }, + "head": "c4273292a3d1ad2d0cf65bd8f80362c26474bd89", + "outcome": "out-of-scope", + "reason": "Generated reference page; source line numbers moved after CI autofix reformatted an import in createHotkey.svelte.ts.", + "evidence": [ + "docs/framework/svelte/reference/type-aliases/CreateHotkeyCommonOptions.md" + ] + }, + "source:docs/framework/svelte/reference/type-aliases/CreateHotkeyOptions.md": { + "fingerprint": "6e3d4b4426a1e0cc2f7c62e05ac0740448854a8c695de83b6469038a10a48672", + "snapshot": { + "docs/framework/svelte/reference/type-aliases/CreateHotkeyOptions.md": "0ebd6aead24331755248f39bca1eedd02698af8384e665d6cc6afad2a24495d6" + }, + "head": "c4273292a3d1ad2d0cf65bd8f80362c26474bd89", + "outcome": "out-of-scope", + "reason": "Generated reference page; source line numbers moved after CI autofix reformatted an import in createHotkey.svelte.ts.", + "evidence": [ + "docs/framework/svelte/reference/type-aliases/CreateHotkeyOptions.md" + ] + }, + "source:docs/framework/svelte/reference/type-aliases/CreateHotkeyOptionsFor.md": { + "fingerprint": "728a2a0385e288c18b3bd35cf4b4d01039cdbb765be81897b6a8fe3256ec6ee6", + "snapshot": { + "docs/framework/svelte/reference/type-aliases/CreateHotkeyOptionsFor.md": "cfb11d686971a31493f33a98b6c56414255b0b0742f0aaa95da6301dda4c554b" + }, + "head": "c4273292a3d1ad2d0cf65bd8f80362c26474bd89", + "outcome": "out-of-scope", + "reason": "Generated reference page; source line numbers moved after CI autofix reformatted an import in createHotkey.svelte.ts.", + "evidence": [ + "docs/framework/svelte/reference/type-aliases/CreateHotkeyOptionsFor.md" + ] + }, + "source:docs/framework/svelte/reference/type-aliases/CreateHotkeySequenceOptions.md": { + "fingerprint": "fa816fad75bd6d068288b77034fd3fe917faf8a8ed045af858042b428eb60716", + "snapshot": { + "docs/framework/svelte/reference/type-aliases/CreateHotkeySequenceOptions.md": "bac1d0c1809660c2dbe6d40958974f1987bbe706bfedee2f9957c2a5fe18e3ab" + }, + "head": "c4273292a3d1ad2d0cf65bd8f80362c26474bd89", + "outcome": "out-of-scope", + "reason": "Generated reference page; source line numbers moved after CI autofix reformatted an import in createHotkey.svelte.ts.", + "evidence": [ + "docs/framework/svelte/reference/type-aliases/CreateHotkeySequenceOptions.md" + ] + }, + "source:docs/framework/svelte/reference/type-aliases/CreateHotkeyTarget.md": { + "fingerprint": "7942f90fca5ac6183b9a87587bf923ee5f8ae91023dcdd1b5ff0868367e72e4b", + "snapshot": { + "docs/framework/svelte/reference/type-aliases/CreateHotkeyTarget.md": "e5015ad4e487d245fa092d0763886ff183baddbfbd9c6f831c4cf9cd4fb0451d" + }, + "head": "c4273292a3d1ad2d0cf65bd8f80362c26474bd89", + "outcome": "out-of-scope", + "reason": "Generated reference page; source line numbers moved after CI autofix reformatted an import in createHotkey.svelte.ts.", + "evidence": [ + "docs/framework/svelte/reference/type-aliases/CreateHotkeyTarget.md" + ] } } } diff --git a/_artifacts/domain_map.yaml b/_artifacts/domain_map.yaml index 486d0b05..4ad31988 100644 --- a/_artifacts/domain_map.yaml +++ b/_artifacts/domain_map.yaml @@ -757,8 +757,8 @@ gaps: status: open - skill: octane-hotkeys question: docs/installation.md says Octane 0.1.36 within 0.1, but the package peer range is octane >=0.12.0. Which is current? - context: The skill follows the peer range. - status: open + context: The peer range is current. docs/installation.md now says Octane 0.12 or newer, matching the skill. + status: resolved - skill: all framework skills except react-hotkeys question: Executable task checks exist for React only. context: Other adapters rely on structural validation and example-project type checks. diff --git a/_artifacts/skill_spec.md b/_artifacts/skill_spec.md index a22b5e85..2f186de4 100644 --- a/_artifacts/skill_spec.md +++ b/_artifacts/skill_spec.md @@ -102,13 +102,13 @@ The skills teach agents to use those APIs directly. The core skills hold the fra ## Remaining Gaps -| Skill | Question | Status | -| ------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | ------ | -| app-hotkeys | Should conflict checks treat `Mod+[KeyP]` as overlapping `Mod+P`? Today a recorded physical binding never conflicts with a logical declaration. | open | -| lit-hotkeys | Document that `@hotkey` needs `experimentalDecorators`, or support standard decorators | open | -| octane-hotkeys | `docs/installation.md` says Octane 0.1.36 within 0.1; the peer range is `>=0.12.0` | open | -| framework skills except react-hotkeys | No executable task checks yet | open | -| all | Fresh-consumer and discovery evaluations not run | open | +| Skill | Question | Status | +| ------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | -------- | +| app-hotkeys | Should conflict checks treat `Mod+[KeyP]` as overlapping `Mod+P`? Today a recorded physical binding never conflicts with a logical declaration. | open | +| lit-hotkeys | Document that `@hotkey` needs `experimentalDecorators`, or support standard decorators | open | +| octane-hotkeys | `docs/installation.md` says Octane 0.1.36 within 0.1; the peer range is `>=0.12.0` | resolved | +| framework skills except react-hotkeys | No executable task checks yet | open | +| all | Fresh-consumer and discovery evaluations not run | open | ## Recommended Skill File Structure diff --git a/docs/devtools.md b/docs/devtools.md index fde49fc3..88f31d50 100644 --- a/docs/devtools.md +++ b/docs/devtools.md @@ -40,6 +40,8 @@ npm install @tanstack/preact-devtools @tanstack/preact-hotkeys-devtools # Solid +Requires Solid 1.9.15 or newer within version 1. + ```sh npm install @tanstack/solid-devtools @tanstack/solid-hotkeys-devtools ``` @@ -60,7 +62,7 @@ npm install @tanstack/vue-hotkeys-devtools # Svelte -Requires Svelte 5.25 or newer within version 5. +Requires Svelte 5.40 or newer within version 5. ```sh npm install @tanstack/svelte-devtools @tanstack/svelte-hotkeys-devtools diff --git a/docs/framework/alpine/quick-start.md b/docs/framework/alpine/quick-start.md index 5e8152a0..bdd2e1a8 100644 --- a/docs/framework/alpine/quick-start.md +++ b/docs/framework/alpine/quick-start.md @@ -8,11 +8,13 @@ This guide adds keyboard shortcuts to Alpine components. If you haven't installe ## Register a hotkey -TanStack Hotkeys needs no app-wide setup. In each component, create an owner for its hotkeys with `createHotkeysScope`, register the hotkeys in `init()`, and destroy the owner in `destroy()`: +Install `hotkeysPlugin` before `Alpine.start()`. Then, in each component, create an owner for its hotkeys with `createHotkeysScope`, register the hotkeys in `init()`, and destroy the owner in `destroy()`: ```ts import Alpine from 'alpinejs' -import { createHotkeysScope } from '@tanstack/alpine-hotkeys' +import { createHotkeysScope, hotkeysPlugin } from '@tanstack/alpine-hotkeys' + +Alpine.plugin(hotkeysPlugin) Alpine.data('editor', () => ({ hotkeys: createHotkeysScope(), @@ -33,6 +35,8 @@ Alpine.start() ``` +The plugin gives the adapter your Alpine instance, so it never loads its own copy. If Alpine comes from a script tag, install the plugin in an `alpine:init` listener. Without the plugin, the adapter uses `window.Alpine`. + Destroying the owner unregisters every hotkey it created. The adapter runs in the browser, so with server rendering, load it only on the client. `Mod` is Command on macOS and Control on Windows and Linux, so `Mod+S` is the save shortcut each user already knows. The browser's Save dialog stays closed, and the shortcut still works while the user types in the textarea. [Sensible Defaults](../../guides/sensible-defaults) explains these defaults. @@ -41,15 +45,7 @@ That's all a hotkey needs. Shared defaults, scopes, and the other features later ### Use the `$hotkeys` magic -To register hotkeys from markup, install `hotkeysPlugin` before `Alpine.start()`: - -```ts -import Alpine from 'alpinejs' -import { hotkeysPlugin } from '@tanstack/alpine-hotkeys' - -Alpine.plugin(hotkeysPlugin) -Alpine.start() -``` +The plugin also adds the `$hotkeys` magic, which registers hotkeys from markup: ```html
diff --git a/docs/framework/alpine/reference/functions/hotkeysPlugin.md b/docs/framework/alpine/reference/functions/hotkeysPlugin.md index 9bf95d23..a759aa95 100644 --- a/docs/framework/alpine/reference/functions/hotkeysPlugin.md +++ b/docs/framework/alpine/reference/functions/hotkeysPlugin.md @@ -7,9 +7,11 @@ title: hotkeysPlugin function hotkeysPlugin(alpine): void; ``` -Defined in: [hotkeysPlugin.ts:6](https://github.com/TanStack/hotkeys/blob/main/packages/alpine-hotkeys/src/hotkeysPlugin.ts#L6) +Defined in: [hotkeysPlugin.ts:11](https://github.com/TanStack/hotkeys/blob/main/packages/alpine-hotkeys/src/hotkeysPlugin.ts#L11) -Installs $hotkeys, whose registrations and subscriptions belong to its element. +Installs $hotkeys, whose registrations and subscriptions belong to its +element. Every hotkeys scope, including ones from `createHotkeysScope`, uses +the Alpine instance passed here. ## Parameters diff --git a/docs/framework/react/reference/functions/HotkeysProvider.md b/docs/framework/react/reference/functions/HotkeysProvider.md index 651d41e2..7bc86b51 100644 --- a/docs/framework/react/reference/functions/HotkeysProvider.md +++ b/docs/framework/react/reference/functions/HotkeysProvider.md @@ -4,10 +4,10 @@ title: HotkeysProvider --- ```ts -function HotkeysProvider(__namedParameters): Element; +function HotkeysProvider(__namedParameters): ReactElement; ``` -Defined in: [HotkeysProvider.tsx:107](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/HotkeysProvider.tsx#L107) +Defined in: [HotkeysProvider.tsx:109](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/HotkeysProvider.tsx#L109) Provides default options, app hotkeys, and the user's custom hotkeys. @@ -29,7 +29,7 @@ while it is mounted and enabled; with `exclusive`, only its hotkeys fire. ## Returns -`Element` +`ReactElement` ## Examples diff --git a/docs/framework/react/reference/functions/useAppHotkeyList.md b/docs/framework/react/reference/functions/useAppHotkeyList.md index b0def1dd..efdd311a 100644 --- a/docs/framework/react/reference/functions/useAppHotkeyList.md +++ b/docs/framework/react/reference/functions/useAppHotkeyList.md @@ -7,7 +7,7 @@ title: useAppHotkeyList function useAppHotkeyList(): AppHotkeyListItem>[]; ``` -Defined in: [useAppHotkeys.ts:61](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useAppHotkeys.ts#L61) +Defined in: [useAppHotkeys.ts:63](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useAppHotkeys.ts#L63) Lists every app hotkey with its live status, in declaration order, for cheat sheets and settings screens. App hotkeys whose components have not diff --git a/docs/framework/react/reference/functions/useAppHotkeys.md b/docs/framework/react/reference/functions/useAppHotkeys.md index b4a99d6d..a5daa919 100644 --- a/docs/framework/react/reference/functions/useAppHotkeys.md +++ b/docs/framework/react/reference/functions/useAppHotkeys.md @@ -7,7 +7,7 @@ title: useAppHotkeys function useAppHotkeys(): RegisteredAppHotkeys; ``` -Defined in: [useAppHotkeys.ts:35](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useAppHotkeys.ts#L35) +Defined in: [useAppHotkeys.ts:37](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useAppHotkeys.ts#L37) Returns the effective app hotkeys from `HotkeysProvider`, typed by `Register`: each declaration with the user's custom hotkey applied. diff --git a/docs/framework/react/reference/functions/useCustomHotkeys.md b/docs/framework/react/reference/functions/useCustomHotkeys.md index 75d0f20c..769e9fb3 100644 --- a/docs/framework/react/reference/functions/useCustomHotkeys.md +++ b/docs/framework/react/reference/functions/useCustomHotkeys.md @@ -7,7 +7,7 @@ title: useCustomHotkeys function useCustomHotkeys(): UseCustomHotkeysResult; ``` -Defined in: [useAppHotkeys.ts:108](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useAppHotkeys.ts#L108) +Defined in: [useAppHotkeys.ts:110](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useAppHotkeys.ts#L110) Reads and changes the user's custom hotkeys. Changes apply to every registered app hotkey immediately and are passed to the provider's diff --git a/docs/framework/react/reference/functions/useDefaultHotkeysOptions.md b/docs/framework/react/reference/functions/useDefaultHotkeysOptions.md index 229ed2bc..b8fe3140 100644 --- a/docs/framework/react/reference/functions/useDefaultHotkeysOptions.md +++ b/docs/framework/react/reference/functions/useDefaultHotkeysOptions.md @@ -7,7 +7,7 @@ title: useDefaultHotkeysOptions function useDefaultHotkeysOptions(): HotkeysProviderOptions; ``` -Defined in: [HotkeysProvider.tsx:182](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/HotkeysProvider.tsx#L182) +Defined in: [HotkeysProvider.tsx:184](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/HotkeysProvider.tsx#L184) ## Returns diff --git a/docs/framework/react/reference/functions/useHeldKeyCodes.md b/docs/framework/react/reference/functions/useHeldKeyCodes.md index ea8806f9..089744e6 100644 --- a/docs/framework/react/reference/functions/useHeldKeyCodes.md +++ b/docs/framework/react/reference/functions/useHeldKeyCodes.md @@ -7,7 +7,7 @@ title: useHeldKeyCodes function useHeldKeyCodes(): Record; ``` -Defined in: [useHeldKeyCodes.ts:30](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHeldKeyCodes.ts#L30) +Defined in: [useHeldKeyCodes.ts:32](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHeldKeyCodes.ts#L32) React hook that returns a map of currently held key names to their physical `event.code` values. diff --git a/docs/framework/react/reference/functions/useHeldKeys.md b/docs/framework/react/reference/functions/useHeldKeys.md index dd6f6609..dbe23bf4 100644 --- a/docs/framework/react/reference/functions/useHeldKeys.md +++ b/docs/framework/react/reference/functions/useHeldKeys.md @@ -7,7 +7,7 @@ title: useHeldKeys function useHeldKeys(): string[]; ``` -Defined in: [useHeldKeys.ts:26](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHeldKeys.ts#L26) +Defined in: [useHeldKeys.ts:28](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHeldKeys.ts#L28) React hook that returns an array of currently held keyboard keys. diff --git a/docs/framework/react/reference/functions/useHotkey.md b/docs/framework/react/reference/functions/useHotkey.md index 44331e4f..5d91a58e 100644 --- a/docs/framework/react/reference/functions/useHotkey.md +++ b/docs/framework/react/reference/functions/useHotkey.md @@ -12,7 +12,7 @@ function useHotkey( options?): void; ``` -Defined in: [useHotkey.ts:86](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkey.ts#L86) +Defined in: [useHotkey.ts:88](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkey.ts#L88) React hook for registering a hotkey: a chord such as `'Mod+S'`, a sequence such as `['G', 'G']`, or an app hotkey from `defineAppHotkeys`. @@ -88,7 +88,7 @@ function useHotkey( options?): void; ``` -Defined in: [useHotkey.ts:91](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkey.ts#L91) +Defined in: [useHotkey.ts:93](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkey.ts#L93) React hook for registering a hotkey: a chord such as `'Mod+S'`, a sequence such as `['G', 'G']`, or an app hotkey from `defineAppHotkeys`. diff --git a/docs/framework/react/reference/functions/useHotkeyHint.md b/docs/framework/react/reference/functions/useHotkeyHint.md index a047ce0f..959c3966 100644 --- a/docs/framework/react/reference/functions/useHotkeyHint.md +++ b/docs/framework/react/reference/functions/useHotkeyHint.md @@ -7,7 +7,7 @@ title: useHotkeyHint function useHotkeyHint(hotkey, options?): boolean; ``` -Defined in: [useHotkeyHint.ts:25](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkeyHint.ts#L25) +Defined in: [useHotkeyHint.ts:27](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkeyHint.ts#L27) Returns a boolean indicating whether held modifiers reveal this shortcut. The hint shows only while the hotkey can fire: some registration of it is diff --git a/docs/framework/react/reference/functions/useHotkeyRecorder.md b/docs/framework/react/reference/functions/useHotkeyRecorder.md index 7462de8e..01855e98 100644 --- a/docs/framework/react/reference/functions/useHotkeyRecorder.md +++ b/docs/framework/react/reference/functions/useHotkeyRecorder.md @@ -9,7 +9,7 @@ title: useHotkeyRecorder function useHotkeyRecorder(options): ReactHotkeyRecorder; ``` -Defined in: [useHotkeyRecorder.ts:68](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkeyRecorder.ts#L68) +Defined in: [useHotkeyRecorder.ts:70](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkeyRecorder.ts#L70) React hook for recording keyboard shortcuts. @@ -64,7 +64,7 @@ const recorder = useHotkeyRecorder({ function useHotkeyRecorder(options): ReactHotkeyRecorder; ``` -Defined in: [useHotkeyRecorder.ts:71](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkeyRecorder.ts#L71) +Defined in: [useHotkeyRecorder.ts:73](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkeyRecorder.ts#L73) React hook for recording keyboard shortcuts. diff --git a/docs/framework/react/reference/functions/useHotkeyRegistrations.md b/docs/framework/react/reference/functions/useHotkeyRegistrations.md index 3624bdff..4c7195ea 100644 --- a/docs/framework/react/reference/functions/useHotkeyRegistrations.md +++ b/docs/framework/react/reference/functions/useHotkeyRegistrations.md @@ -7,7 +7,7 @@ title: useHotkeyRegistrations function useHotkeyRegistrations(): HotkeyRegistrationView[]; ``` -Defined in: [useHotkeyRegistrations.ts:31](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkeyRegistrations.ts#L31) +Defined in: [useHotkeyRegistrations.ts:33](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkeyRegistrations.ts#L33) React hook that reactively reads every hotkey registration, chords and sequences, from the singleton HotkeyManager. Narrow each view with `kind`. diff --git a/docs/framework/react/reference/functions/useHotkeyScopesState.md b/docs/framework/react/reference/functions/useHotkeyScopesState.md index 0f4395f6..591ffdba 100644 --- a/docs/framework/react/reference/functions/useHotkeyScopesState.md +++ b/docs/framework/react/reference/functions/useHotkeyScopesState.md @@ -7,7 +7,7 @@ title: useHotkeyScopesState function useHotkeyScopesState(): HotkeyScopesState; ``` -Defined in: [useHotkeyScopesState.ts:21](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkeyScopesState.ts#L21) +Defined in: [useHotkeyScopesState.ts:23](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkeyScopesState.ts#L23) React hook that returns the hotkey manager's scope state: the active scopes, the exclusive scope that owns the keyboard, and the scopes it diff --git a/docs/framework/react/reference/functions/useHotkeys.md b/docs/framework/react/reference/functions/useHotkeys.md index d9966dda..97e4adb0 100644 --- a/docs/framework/react/reference/functions/useHotkeys.md +++ b/docs/framework/react/reference/functions/useHotkeys.md @@ -7,7 +7,7 @@ title: useHotkeys function useHotkeys(hotkeys, commonOptions?): void; ``` -Defined in: [useHotkeys.ts:59](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkeys.ts#L59) +Defined in: [useHotkeys.ts:61](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkeys.ts#L61) React hook for registering several hotkeys at once: chords, sequences, and app hotkeys. Accepts a dynamic array, so it is safe to use with diff --git a/docs/framework/react/reference/functions/useHotkeysContext.md b/docs/framework/react/reference/functions/useHotkeysContext.md index b6b71cfa..35056054 100644 --- a/docs/framework/react/reference/functions/useHotkeysContext.md +++ b/docs/framework/react/reference/functions/useHotkeysContext.md @@ -7,7 +7,7 @@ title: useHotkeysContext function useHotkeysContext(): HotkeysContextValue | null; ``` -Defined in: [HotkeysProvider.tsx:177](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/HotkeysProvider.tsx#L177) +Defined in: [HotkeysProvider.tsx:179](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/HotkeysProvider.tsx#L179) ## Returns diff --git a/docs/framework/react/reference/functions/useKeyHold.md b/docs/framework/react/reference/functions/useKeyHold.md index bc823728..e0b42ab3 100644 --- a/docs/framework/react/reference/functions/useKeyHold.md +++ b/docs/framework/react/reference/functions/useKeyHold.md @@ -7,7 +7,7 @@ title: useKeyHold function useKeyHold(key): boolean; ``` -Defined in: [useKeyHold.ts:45](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useKeyHold.ts#L45) +Defined in: [useKeyHold.ts:47](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useKeyHold.ts#L47) React hook that returns whether a specific key is currently being held. diff --git a/docs/framework/react/reference/interfaces/HotkeysProviderOptions.md b/docs/framework/react/reference/interfaces/HotkeysProviderOptions.md index 16db2913..5a486b3f 100644 --- a/docs/framework/react/reference/interfaces/HotkeysProviderOptions.md +++ b/docs/framework/react/reference/interfaces/HotkeysProviderOptions.md @@ -3,7 +3,7 @@ id: HotkeysProviderOptions title: HotkeysProviderOptions --- -Defined in: [HotkeysProvider.tsx:24](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/HotkeysProvider.tsx#L24) +Defined in: [HotkeysProvider.tsx:26](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/HotkeysProvider.tsx#L26) ## Properties @@ -13,7 +13,7 @@ Defined in: [HotkeysProvider.tsx:24](https://github.com/TanStack/hotkeys/blob/ma optional hotkey?: UseHotkeyCommonOptions; ``` -Defined in: [HotkeysProvider.tsx:29](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/HotkeysProvider.tsx#L29) +Defined in: [HotkeysProvider.tsx:31](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/HotkeysProvider.tsx#L31) Defaults for every hotkey registered by `useHotkey` and `useHotkeys`. `requireReset` applies to chords and `timeout` applies to sequences. @@ -26,6 +26,6 @@ Defaults for every hotkey registered by `useHotkey` and `useHotkeys`. optional hotkeyRecorder?: Partial>; ``` -Defined in: [HotkeysProvider.tsx:31](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/HotkeysProvider.tsx#L31) +Defined in: [HotkeysProvider.tsx:33](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/HotkeysProvider.tsx#L33) Defaults for every `useHotkeyRecorder`. diff --git a/docs/framework/react/reference/interfaces/HotkeysProviderProps.md b/docs/framework/react/reference/interfaces/HotkeysProviderProps.md index 2e805e11..18306b0d 100644 --- a/docs/framework/react/reference/interfaces/HotkeysProviderProps.md +++ b/docs/framework/react/reference/interfaces/HotkeysProviderProps.md @@ -3,7 +3,7 @@ id: HotkeysProviderProps title: HotkeysProviderProps --- -Defined in: [HotkeysProvider.tsx:49](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/HotkeysProvider.tsx#L49) +Defined in: [HotkeysProvider.tsx:51](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/HotkeysProvider.tsx#L51) ## Extends @@ -23,7 +23,7 @@ Defined in: [HotkeysProvider.tsx:49](https://github.com/TanStack/hotkeys/blob/ma optional appHotkeys?: T; ``` -Defined in: [HotkeysProvider.tsx:57](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/HotkeysProvider.tsx#L57) +Defined in: [HotkeysProvider.tsx:59](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/HotkeysProvider.tsx#L59) Every app hotkey, from `defineAppHotkeys`. Listed by `useAppHotkeyList` whether or not their components have mounted. @@ -36,7 +36,7 @@ whether or not their components have mounted. children: ReactNode; ``` -Defined in: [HotkeysProvider.tsx:52](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/HotkeysProvider.tsx#L52) +Defined in: [HotkeysProvider.tsx:54](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/HotkeysProvider.tsx#L54) *** @@ -46,7 +46,7 @@ Defined in: [HotkeysProvider.tsx:52](https://github.com/TanStack/hotkeys/blob/ma optional customHotkeys?: CustomHotkeys | null; ``` -Defined in: [HotkeysProvider.tsx:62](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/HotkeysProvider.tsx#L62) +Defined in: [HotkeysProvider.tsx:64](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/HotkeysProvider.tsx#L64) Starting custom hotkeys, such as saved data. Read once; the provider owns the state afterwards. Invalid entries are ignored with a warning. @@ -59,7 +59,7 @@ the state afterwards. Invalid entries are ignored with a warning. optional defaultOptions?: HotkeysProviderOptions; ``` -Defined in: [HotkeysProvider.tsx:66](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/HotkeysProvider.tsx#L66) +Defined in: [HotkeysProvider.tsx:68](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/HotkeysProvider.tsx#L68) Merged with the parent provider's defaults. @@ -71,7 +71,7 @@ Merged with the parent provider's defaults. optional onCustomHotkeysChange?: (customHotkeys) => void; ``` -Defined in: [HotkeysProvider.tsx:64](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/HotkeysProvider.tsx#L64) +Defined in: [HotkeysProvider.tsx:66](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/HotkeysProvider.tsx#L66) Called with the custom hotkeys after every change, ready to save. diff --git a/docs/framework/react/reference/interfaces/ReactHotkeyRecorder.md b/docs/framework/react/reference/interfaces/ReactHotkeyRecorder.md index 8b932f7c..6c27f48b 100644 --- a/docs/framework/react/reference/interfaces/ReactHotkeyRecorder.md +++ b/docs/framework/react/reference/interfaces/ReactHotkeyRecorder.md @@ -3,7 +3,7 @@ id: ReactHotkeyRecorder title: ReactHotkeyRecorder --- -Defined in: [useHotkeyRecorder.ts:14](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkeyRecorder.ts#L14) +Defined in: [useHotkeyRecorder.ts:16](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkeyRecorder.ts#L16) ## Type Parameters @@ -19,7 +19,7 @@ Defined in: [useHotkeyRecorder.ts:14](https://github.com/TanStack/hotkeys/blob/m cancelRecording: () => void; ``` -Defined in: [useHotkeyRecorder.ts:26](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkeyRecorder.ts#L26) +Defined in: [useHotkeyRecorder.ts:28](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkeyRecorder.ts#L28) Cancel recording and call onCancel @@ -35,7 +35,7 @@ Cancel recording and call onCancel commitRecording: () => void; ``` -Defined in: [useHotkeyRecorder.ts:28](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkeyRecorder.ts#L28) +Defined in: [useHotkeyRecorder.ts:30](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkeyRecorder.ts#L30) Commit the recorded steps now (multi-step recordings) @@ -51,7 +51,7 @@ Commit the recorded steps now (multi-step recordings) isRecording: boolean; ``` -Defined in: [useHotkeyRecorder.ts:16](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkeyRecorder.ts#L16) +Defined in: [useHotkeyRecorder.ts:18](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkeyRecorder.ts#L18) Whether recording is currently active @@ -63,7 +63,7 @@ Whether recording is currently active recordedHotkey: THotkey | null; ``` -Defined in: [useHotkeyRecorder.ts:20](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkeyRecorder.ts#L20) +Defined in: [useHotkeyRecorder.ts:22](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkeyRecorder.ts#L22) The last committed hotkey @@ -75,7 +75,7 @@ The last committed hotkey startRecording: () => void; ``` -Defined in: [useHotkeyRecorder.ts:22](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkeyRecorder.ts#L22) +Defined in: [useHotkeyRecorder.ts:24](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkeyRecorder.ts#L24) Start recording a new hotkey @@ -91,7 +91,7 @@ Start recording a new hotkey steps: HotkeySequence; ``` -Defined in: [useHotkeyRecorder.ts:18](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkeyRecorder.ts#L18) +Defined in: [useHotkeyRecorder.ts:20](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkeyRecorder.ts#L20) Chords recorded so far in a multi-step recording (for live preview) @@ -103,7 +103,7 @@ Chords recorded so far in a multi-step recording (for live preview) stopRecording: () => void; ``` -Defined in: [useHotkeyRecorder.ts:24](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkeyRecorder.ts#L24) +Defined in: [useHotkeyRecorder.ts:26](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkeyRecorder.ts#L26) Stop recording without calling onCancel diff --git a/docs/framework/react/reference/interfaces/UseCustomHotkeysResult.md b/docs/framework/react/reference/interfaces/UseCustomHotkeysResult.md index 6a4bf34f..23849f44 100644 --- a/docs/framework/react/reference/interfaces/UseCustomHotkeysResult.md +++ b/docs/framework/react/reference/interfaces/UseCustomHotkeysResult.md @@ -3,7 +3,7 @@ id: UseCustomHotkeysResult title: UseCustomHotkeysResult --- -Defined in: [useAppHotkeys.ts:70](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useAppHotkeys.ts#L70) +Defined in: [useAppHotkeys.ts:72](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useAppHotkeys.ts#L72) Custom hotkey state and actions returned by `useCustomHotkeys`. @@ -15,7 +15,7 @@ Custom hotkey state and actions returned by `useCustomHotkeys`. customHotkeys: CustomHotkeys; ``` -Defined in: [useAppHotkeys.ts:72](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useAppHotkeys.ts#L72) +Defined in: [useAppHotkeys.ts:74](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useAppHotkeys.ts#L74) The user's hotkeys that differ from the defaults. @@ -27,7 +27,7 @@ The user's hotkeys that differ from the defaults. findConflicts: (id, hotkey) => AppHotkey[]; ``` -Defined in: [useAppHotkeys.ts:86](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useAppHotkeys.ts#L86) +Defined in: [useAppHotkeys.ts:88](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useAppHotkeys.ts#L88) Other app hotkeys that would collide if `id` used `hotkey`. @@ -53,7 +53,7 @@ Other app hotkeys that would collide if `id` used `hotkey`. resetCustomHotkey: (id) => void; ``` -Defined in: [useAppHotkeys.ts:82](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useAppHotkeys.ts#L82) +Defined in: [useAppHotkeys.ts:84](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useAppHotkeys.ts#L84) Restores the default hotkey for an app hotkey. @@ -75,7 +75,7 @@ Restores the default hotkey for an app hotkey. resetCustomHotkeys: () => void; ``` -Defined in: [useAppHotkeys.ts:84](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useAppHotkeys.ts#L84) +Defined in: [useAppHotkeys.ts:86](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useAppHotkeys.ts#L86) Restores every default hotkey. @@ -91,7 +91,7 @@ Restores every default hotkey. setCustomHotkey: (id, hotkey) => AppHotkey[]; ``` -Defined in: [useAppHotkeys.ts:77](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useAppHotkeys.ts#L77) +Defined in: [useAppHotkeys.ts:79](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useAppHotkeys.ts#L79) Sets the user's hotkey for an app hotkey. `null` unbinds it. Returns conflicting app hotkeys; when any exist, nothing changes. diff --git a/docs/framework/react/reference/type-aliases/UseAppHotkeyOptions.md b/docs/framework/react/reference/type-aliases/UseAppHotkeyOptions.md index 9f57d39e..dc521043 100644 --- a/docs/framework/react/reference/type-aliases/UseAppHotkeyOptions.md +++ b/docs/framework/react/reference/type-aliases/UseAppHotkeyOptions.md @@ -7,7 +7,7 @@ title: UseAppHotkeyOptions type UseAppHotkeyOptions = AdapterAppHotkeyOptions; ``` -Defined in: [useHotkey.ts:43](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkey.ts#L43) +Defined in: [useHotkey.ts:45](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkey.ts#L45) Options for an app hotkey at the call site. `meta` comes from the declaration. Kind-specific options follow the declared default: `requireReset` for a chord, diff --git a/docs/framework/react/reference/type-aliases/UseHotkeyChordOptions.md b/docs/framework/react/reference/type-aliases/UseHotkeyChordOptions.md index ebf87afb..ddcd3901 100644 --- a/docs/framework/react/reference/type-aliases/UseHotkeyChordOptions.md +++ b/docs/framework/react/reference/type-aliases/UseHotkeyChordOptions.md @@ -7,6 +7,6 @@ title: UseHotkeyChordOptions type UseHotkeyChordOptions = AdapterChordOptions; ``` -Defined in: [useHotkey.ts:25](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkey.ts#L25) +Defined in: [useHotkey.ts:27](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkey.ts#L27) Options for a chord such as `'Mod+S'`. diff --git a/docs/framework/react/reference/type-aliases/UseHotkeyCommonOptions.md b/docs/framework/react/reference/type-aliases/UseHotkeyCommonOptions.md index 7b5989d8..c0442233 100644 --- a/docs/framework/react/reference/type-aliases/UseHotkeyCommonOptions.md +++ b/docs/framework/react/reference/type-aliases/UseHotkeyCommonOptions.md @@ -7,6 +7,6 @@ title: UseHotkeyCommonOptions type UseHotkeyCommonOptions = AdapterCommonOptions; ``` -Defined in: [useHotkey.ts:31](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkey.ts#L31) +Defined in: [useHotkey.ts:33](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkey.ts#L33) Options applied to every hotkey, such as provider defaults. Each applies to the kinds that support it. diff --git a/docs/framework/react/reference/type-aliases/UseHotkeyDefinition.md b/docs/framework/react/reference/type-aliases/UseHotkeyDefinition.md index a88d1d31..1c742d7b 100644 --- a/docs/framework/react/reference/type-aliases/UseHotkeyDefinition.md +++ b/docs/framework/react/reference/type-aliases/UseHotkeyDefinition.md @@ -7,7 +7,7 @@ title: UseHotkeyDefinition type UseHotkeyDefinition = AdapterHotkeyDefinition; ``` -Defined in: [useHotkeys.ts:16](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkeys.ts#L16) +Defined in: [useHotkeys.ts:18](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkeys.ts#L18) One hotkey for `useHotkeys`. Chords accept `requireReset`; sequences accept `timeout`; hotkeys of unknown kind accept only shared options. diff --git a/docs/framework/react/reference/type-aliases/UseHotkeyOptions.md b/docs/framework/react/reference/type-aliases/UseHotkeyOptions.md index 9c814548..2450a8a9 100644 --- a/docs/framework/react/reference/type-aliases/UseHotkeyOptions.md +++ b/docs/framework/react/reference/type-aliases/UseHotkeyOptions.md @@ -7,6 +7,6 @@ title: UseHotkeyOptions type UseHotkeyOptions = AdapterHotkeyOptions; ``` -Defined in: [useHotkey.ts:22](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkey.ts#L22) +Defined in: [useHotkey.ts:24](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkey.ts#L24) Options shared by chords and sequences. diff --git a/docs/framework/react/reference/type-aliases/UseHotkeyOptionsFor.md b/docs/framework/react/reference/type-aliases/UseHotkeyOptionsFor.md index c6e772de..a839726d 100644 --- a/docs/framework/react/reference/type-aliases/UseHotkeyOptionsFor.md +++ b/docs/framework/react/reference/type-aliases/UseHotkeyOptionsFor.md @@ -7,7 +7,7 @@ title: UseHotkeyOptionsFor type UseHotkeyOptionsFor = AdapterOptionsFor; ``` -Defined in: [useHotkey.ts:34](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkey.ts#L34) +Defined in: [useHotkey.ts:36](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkey.ts#L36) The options type for a hotkey: chord options for chords, sequence options for sequences. diff --git a/docs/framework/react/reference/type-aliases/UseHotkeySequenceOptions.md b/docs/framework/react/reference/type-aliases/UseHotkeySequenceOptions.md index 5f911ac7..4573ce84 100644 --- a/docs/framework/react/reference/type-aliases/UseHotkeySequenceOptions.md +++ b/docs/framework/react/reference/type-aliases/UseHotkeySequenceOptions.md @@ -7,6 +7,6 @@ title: UseHotkeySequenceOptions type UseHotkeySequenceOptions = AdapterSequenceOptions; ``` -Defined in: [useHotkey.ts:28](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkey.ts#L28) +Defined in: [useHotkey.ts:30](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkey.ts#L30) Options for a sequence such as `['G', 'G']`. diff --git a/docs/framework/react/reference/type-aliases/UseHotkeyTarget.md b/docs/framework/react/reference/type-aliases/UseHotkeyTarget.md index 1b559143..3711af0c 100644 --- a/docs/framework/react/reference/type-aliases/UseHotkeyTarget.md +++ b/docs/framework/react/reference/type-aliases/UseHotkeyTarget.md @@ -12,6 +12,6 @@ type UseHotkeyTarget = | null; ``` -Defined in: [useHotkey.ts:18](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkey.ts#L18) +Defined in: [useHotkey.ts:20](https://github.com/TanStack/hotkeys/blob/main/packages/react-hotkeys/src/useHotkey.ts#L20) A React ref, element, document, or window to listen on. diff --git a/docs/framework/svelte/reference/functions/createHotkey.md b/docs/framework/svelte/reference/functions/createHotkey.md index 617d7f4c..fb95ba8b 100644 --- a/docs/framework/svelte/reference/functions/createHotkey.md +++ b/docs/framework/svelte/reference/functions/createHotkey.md @@ -12,7 +12,7 @@ function createHotkey( options?): void; ``` -Defined in: [packages/svelte-hotkeys/src/createHotkey.svelte.ts:63](https://github.com/TanStack/hotkeys/blob/main/packages/svelte-hotkeys/src/createHotkey.svelte.ts#L63) +Defined in: [packages/svelte-hotkeys/src/createHotkey.svelte.ts:66](https://github.com/TanStack/hotkeys/blob/main/packages/svelte-hotkeys/src/createHotkey.svelte.ts#L66) Svelte function for registering a hotkey on the document: a chord such as `'Mod+S'`, a sequence such as `['G', 'G']`, or an app hotkey from @@ -67,7 +67,7 @@ function createHotkey( options?): void; ``` -Defined in: [packages/svelte-hotkeys/src/createHotkey.svelte.ts:68](https://github.com/TanStack/hotkeys/blob/main/packages/svelte-hotkeys/src/createHotkey.svelte.ts#L68) +Defined in: [packages/svelte-hotkeys/src/createHotkey.svelte.ts:71](https://github.com/TanStack/hotkeys/blob/main/packages/svelte-hotkeys/src/createHotkey.svelte.ts#L71) Svelte function for registering a hotkey on the document: a chord such as `'Mod+S'`, a sequence such as `['G', 'G']`, or an app hotkey from diff --git a/docs/framework/svelte/reference/functions/createHotkeyAttachment.md b/docs/framework/svelte/reference/functions/createHotkeyAttachment.md index 68d24412..6045b671 100644 --- a/docs/framework/svelte/reference/functions/createHotkeyAttachment.md +++ b/docs/framework/svelte/reference/functions/createHotkeyAttachment.md @@ -12,7 +12,7 @@ function createHotkeyAttachment( options?): Attachment; ``` -Defined in: [packages/svelte-hotkeys/src/createHotkey.svelte.ts:94](https://github.com/TanStack/hotkeys/blob/main/packages/svelte-hotkeys/src/createHotkey.svelte.ts#L94) +Defined in: [packages/svelte-hotkeys/src/createHotkey.svelte.ts:97](https://github.com/TanStack/hotkeys/blob/main/packages/svelte-hotkeys/src/createHotkey.svelte.ts#L97) Create an attachment for an element-scoped hotkey: a chord, a sequence, or an app hotkey that listens on the attached element. @@ -60,7 +60,7 @@ function createHotkeyAttachment( options?): Attachment; ``` -Defined in: [packages/svelte-hotkeys/src/createHotkey.svelte.ts:99](https://github.com/TanStack/hotkeys/blob/main/packages/svelte-hotkeys/src/createHotkey.svelte.ts#L99) +Defined in: [packages/svelte-hotkeys/src/createHotkey.svelte.ts:102](https://github.com/TanStack/hotkeys/blob/main/packages/svelte-hotkeys/src/createHotkey.svelte.ts#L102) Create an attachment for an element-scoped hotkey: a chord, a sequence, or an app hotkey that listens on the attached element. diff --git a/docs/framework/svelte/reference/type-aliases/CreateAppHotkeyOptions.md b/docs/framework/svelte/reference/type-aliases/CreateAppHotkeyOptions.md index c5c3fc0a..7b879eaa 100644 --- a/docs/framework/svelte/reference/type-aliases/CreateAppHotkeyOptions.md +++ b/docs/framework/svelte/reference/type-aliases/CreateAppHotkeyOptions.md @@ -7,7 +7,7 @@ title: CreateAppHotkeyOptions type CreateAppHotkeyOptions = AdapterAppHotkeyOptions; ``` -Defined in: [packages/svelte-hotkeys/src/createHotkey.svelte.ts:40](https://github.com/TanStack/hotkeys/blob/main/packages/svelte-hotkeys/src/createHotkey.svelte.ts#L40) +Defined in: [packages/svelte-hotkeys/src/createHotkey.svelte.ts:43](https://github.com/TanStack/hotkeys/blob/main/packages/svelte-hotkeys/src/createHotkey.svelte.ts#L43) Call-site options for an app hotkey, typed by its declared default kind. diff --git a/docs/framework/svelte/reference/type-aliases/CreateHotkeyChordOptions.md b/docs/framework/svelte/reference/type-aliases/CreateHotkeyChordOptions.md index f3ae374a..9c667f97 100644 --- a/docs/framework/svelte/reference/type-aliases/CreateHotkeyChordOptions.md +++ b/docs/framework/svelte/reference/type-aliases/CreateHotkeyChordOptions.md @@ -7,6 +7,6 @@ title: CreateHotkeyChordOptions type CreateHotkeyChordOptions = AdapterChordOptions; ``` -Defined in: [packages/svelte-hotkeys/src/createHotkey.svelte.ts:26](https://github.com/TanStack/hotkeys/blob/main/packages/svelte-hotkeys/src/createHotkey.svelte.ts#L26) +Defined in: [packages/svelte-hotkeys/src/createHotkey.svelte.ts:29](https://github.com/TanStack/hotkeys/blob/main/packages/svelte-hotkeys/src/createHotkey.svelte.ts#L29) Options for a chord such as `'Mod+S'`. diff --git a/docs/framework/svelte/reference/type-aliases/CreateHotkeyCommonOptions.md b/docs/framework/svelte/reference/type-aliases/CreateHotkeyCommonOptions.md index 70a7f127..07dcb257 100644 --- a/docs/framework/svelte/reference/type-aliases/CreateHotkeyCommonOptions.md +++ b/docs/framework/svelte/reference/type-aliases/CreateHotkeyCommonOptions.md @@ -7,6 +7,6 @@ title: CreateHotkeyCommonOptions type CreateHotkeyCommonOptions = AdapterCommonOptions; ``` -Defined in: [packages/svelte-hotkeys/src/createHotkey.svelte.ts:33](https://github.com/TanStack/hotkeys/blob/main/packages/svelte-hotkeys/src/createHotkey.svelte.ts#L33) +Defined in: [packages/svelte-hotkeys/src/createHotkey.svelte.ts:36](https://github.com/TanStack/hotkeys/blob/main/packages/svelte-hotkeys/src/createHotkey.svelte.ts#L36) Options applied to every hotkey, such as provider defaults. Each applies to the kinds that support it. diff --git a/docs/framework/svelte/reference/type-aliases/CreateHotkeyOptions.md b/docs/framework/svelte/reference/type-aliases/CreateHotkeyOptions.md index d8f01596..1bb4e1ed 100644 --- a/docs/framework/svelte/reference/type-aliases/CreateHotkeyOptions.md +++ b/docs/framework/svelte/reference/type-aliases/CreateHotkeyOptions.md @@ -7,6 +7,6 @@ title: CreateHotkeyOptions type CreateHotkeyOptions = AdapterHotkeyOptions; ``` -Defined in: [packages/svelte-hotkeys/src/createHotkey.svelte.ts:23](https://github.com/TanStack/hotkeys/blob/main/packages/svelte-hotkeys/src/createHotkey.svelte.ts#L23) +Defined in: [packages/svelte-hotkeys/src/createHotkey.svelte.ts:26](https://github.com/TanStack/hotkeys/blob/main/packages/svelte-hotkeys/src/createHotkey.svelte.ts#L26) Options shared by chords and sequences. diff --git a/docs/framework/svelte/reference/type-aliases/CreateHotkeyOptionsFor.md b/docs/framework/svelte/reference/type-aliases/CreateHotkeyOptionsFor.md index 8fa27035..4c0bf64c 100644 --- a/docs/framework/svelte/reference/type-aliases/CreateHotkeyOptionsFor.md +++ b/docs/framework/svelte/reference/type-aliases/CreateHotkeyOptionsFor.md @@ -7,7 +7,7 @@ title: CreateHotkeyOptionsFor type CreateHotkeyOptionsFor = AdapterOptionsFor; ``` -Defined in: [packages/svelte-hotkeys/src/createHotkey.svelte.ts:36](https://github.com/TanStack/hotkeys/blob/main/packages/svelte-hotkeys/src/createHotkey.svelte.ts#L36) +Defined in: [packages/svelte-hotkeys/src/createHotkey.svelte.ts:39](https://github.com/TanStack/hotkeys/blob/main/packages/svelte-hotkeys/src/createHotkey.svelte.ts#L39) The options type for a hotkey: chord options for chords, sequence options for sequences. diff --git a/docs/framework/svelte/reference/type-aliases/CreateHotkeySequenceOptions.md b/docs/framework/svelte/reference/type-aliases/CreateHotkeySequenceOptions.md index c8f41e4d..e472ddc5 100644 --- a/docs/framework/svelte/reference/type-aliases/CreateHotkeySequenceOptions.md +++ b/docs/framework/svelte/reference/type-aliases/CreateHotkeySequenceOptions.md @@ -7,6 +7,6 @@ title: CreateHotkeySequenceOptions type CreateHotkeySequenceOptions = AdapterSequenceOptions; ``` -Defined in: [packages/svelte-hotkeys/src/createHotkey.svelte.ts:29](https://github.com/TanStack/hotkeys/blob/main/packages/svelte-hotkeys/src/createHotkey.svelte.ts#L29) +Defined in: [packages/svelte-hotkeys/src/createHotkey.svelte.ts:32](https://github.com/TanStack/hotkeys/blob/main/packages/svelte-hotkeys/src/createHotkey.svelte.ts#L32) Options for a sequence such as `['G', 'G']`. diff --git a/docs/framework/svelte/reference/type-aliases/CreateHotkeyTarget.md b/docs/framework/svelte/reference/type-aliases/CreateHotkeyTarget.md index 6e0bcf07..8cfc4462 100644 --- a/docs/framework/svelte/reference/type-aliases/CreateHotkeyTarget.md +++ b/docs/framework/svelte/reference/type-aliases/CreateHotkeyTarget.md @@ -7,6 +7,6 @@ title: CreateHotkeyTarget type CreateHotkeyTarget = Document | Window; ``` -Defined in: [packages/svelte-hotkeys/src/createHotkey.svelte.ts:20](https://github.com/TanStack/hotkeys/blob/main/packages/svelte-hotkeys/src/createHotkey.svelte.ts#L20) +Defined in: [packages/svelte-hotkeys/src/createHotkey.svelte.ts:23](https://github.com/TanStack/hotkeys/blob/main/packages/svelte-hotkeys/src/createHotkey.svelte.ts#L23) The document or window to listen on. Use an attachment for elements. diff --git a/docs/installation.md b/docs/installation.md index de8f7b7e..e950c291 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -30,53 +30,67 @@ Each framework package re-exports everything from the core `@tanstack/hotkeys` p # React +Use React 18 or newer. The hooks and `HotkeysProvider` are client components, so a server component such as a Next.js `app/layout.tsx` can render `HotkeysProvider` directly. + Start with the [Quick Start](./framework/react/quick-start) guide. If you want the integrated devtools panel, also install: # Preact +Use Preact 10.5.2 or newer. TypeScript with `"moduleResolution": "bundler"` needs Preact 10.7.2 or newer. + Start with the [Quick Start](./framework/preact/quick-start) guide and the Preact-specific [guides](./framework/preact/guides/hotkeys). If you want the integrated devtools panel, also install: # Solid +Use Solid 1.7 or newer within version 1. The devtools panel needs Solid 1.9.15 or newer. + Start with the [Quick Start](./framework/solid/quick-start) guide and the Solid-specific [guides](./framework/solid/guides/hotkeys). If you want the integrated devtools panel, also install: # Angular +Use Angular 19 or newer. + Start with the [Quick Start](./framework/angular/quick-start) guide and the Angular-specific [guides](./framework/angular/guides/hotkeys). The integrated devtools panel requires Angular 21 or newer. To use it, also install: # Vue +Use Vue 3.3 or newer. + Start with the [Quick Start](./framework/vue/quick-start) guide and the Vue-specific [guides](./framework/vue/guides/hotkeys). If you want the Vue devtools panel component, also install: # Svelte +Use Svelte 5.40 or newer within version 5. + Start with the [Quick Start](./framework/svelte/quick-start) guide and the Svelte-specific [guides](./framework/svelte/guides/hotkeys). If you want the integrated devtools panel, also install: # Lit +Use Lit 3 or newer. + Start with the [Quick Start](./framework/lit/quick-start) guide and the Lit-specific [guides](./framework/lit/guides/hotkeys). Lit currently ships the hotkeys adapter only, so no dedicated Lit devtools package is required. # Alpine -Use Alpine 3.15.12 or newer within version 3. Install the optional `hotkeysPlugin` before `Alpine.start()`, or create a scope explicitly. +Use Alpine 3.13 or newer within version 3. Install `hotkeysPlugin` with `Alpine.plugin(hotkeysPlugin)` before `Alpine.start()`, so the adapter uses your Alpine instance. Start with the [Quick Start](./framework/alpine/quick-start), then follow the [guides](./framework/alpine/guides/hotkeys). The package includes the hotkeys adapter; a dedicated Alpine devtools adapter is not provided. # Ember -Use Ember 6.8 or newer. Register hotkeys with imported template helpers in strict-mode `.gts` components. Pass the component as owner to state readers and recorders. +Use Ember 6.8.3 or newer, except 6.9.0 and 6.10.0. The adapter works in Vite (Embroider) apps and in classic ember-cli apps that use ember-auto-import. Register hotkeys with imported template helpers in strict-mode `.gts` components. Pass the component as owner to state readers and recorders. Start with the [Quick Start](./framework/ember/quick-start), then follow the [guides](./framework/ember/guides/hotkeys). The package includes the hotkeys adapter; a dedicated Ember devtools adapter is not provided. # Octane -Use Octane 0.1.36 or newer within version 0.1, with compiler-enabled `.tsrx` components. The Octane adapter requires Node.js 22.22.2 or newer when used in Node.js. +Use Octane 0.12 or newer, with compiler-enabled `.tsrx` components. The Octane adapter requires Node.js 22.22.2 or newer when used in Node.js. Start with the [Quick Start](./framework/octane/quick-start), then follow the [guides](./framework/octane/guides/hotkeys). The package includes the hotkeys adapter; a dedicated Octane devtools adapter is not provided. diff --git a/examples/alpine/createHeldKeys/src/main.ts b/examples/alpine/createHeldKeys/src/main.ts index 20a344fa..05e96e90 100644 --- a/examples/alpine/createHeldKeys/src/main.ts +++ b/examples/alpine/createHeldKeys/src/main.ts @@ -1,8 +1,15 @@ import Alpine from 'alpinejs' -import { createHotkeysScope, formatForDisplay } from '@tanstack/alpine-hotkeys' +import { + createHotkeysScope, + formatForDisplay, + hotkeysPlugin, +} from '@tanstack/alpine-hotkeys' import type { AlpineHotkeyState } from '@tanstack/alpine-hotkeys' import './index.css' +// Gives every hotkeys scope the app's Alpine instance. +Alpine.plugin(hotkeysPlugin) + class App { private hotkeysScope = createHotkeysScope() formatForDisplay = formatForDisplay diff --git a/examples/alpine/createHotkey-sequences/src/main.ts b/examples/alpine/createHotkey-sequences/src/main.ts index 2f928087..8c2c8d68 100644 --- a/examples/alpine/createHotkey-sequences/src/main.ts +++ b/examples/alpine/createHotkey-sequences/src/main.ts @@ -1,7 +1,10 @@ import Alpine from 'alpinejs' -import { createHotkeysScope } from '@tanstack/alpine-hotkeys' +import { createHotkeysScope, hotkeysPlugin } from '@tanstack/alpine-hotkeys' import './index.css' +// Gives every hotkeys scope the app's Alpine instance. +Alpine.plugin(hotkeysPlugin) + class App { private hotkeysScope = createHotkeysScope() diff --git a/examples/alpine/createHotkey/src/main.ts b/examples/alpine/createHotkey/src/main.ts index 966b70c3..49850a0e 100644 --- a/examples/alpine/createHotkey/src/main.ts +++ b/examples/alpine/createHotkey/src/main.ts @@ -1,8 +1,15 @@ import Alpine from 'alpinejs' -import { createHotkeysScope, formatForDisplay } from '@tanstack/alpine-hotkeys' +import { + createHotkeysScope, + formatForDisplay, + hotkeysPlugin, +} from '@tanstack/alpine-hotkeys' import './index.css' import type { Hotkey } from '@tanstack/alpine-hotkeys' +// Gives every hotkeys scope the app's Alpine instance. +Alpine.plugin(hotkeysPlugin) + class App { private hotkeysScope = createHotkeysScope() diff --git a/examples/alpine/createHotkeyRecorder-sequences/src/main.ts b/examples/alpine/createHotkeyRecorder-sequences/src/main.ts index c26ebd04..fd4bfd71 100644 --- a/examples/alpine/createHotkeyRecorder-sequences/src/main.ts +++ b/examples/alpine/createHotkeyRecorder-sequences/src/main.ts @@ -1,5 +1,9 @@ import Alpine from 'alpinejs' -import { createHotkeysScope, formatForDisplay } from '@tanstack/alpine-hotkeys' +import { + createHotkeysScope, + formatForDisplay, + hotkeysPlugin, +} from '@tanstack/alpine-hotkeys' import type { AlpineHotkeyRecorder, AlpineHotkeyState, @@ -9,6 +13,9 @@ import type { } from '@tanstack/alpine-hotkeys' import './index.css' +// Gives every hotkeys scope the app's Alpine instance. +Alpine.plugin(hotkeysPlugin) + interface Shortcut { id: string name: string diff --git a/examples/alpine/createHotkeyRecorder/src/main.ts b/examples/alpine/createHotkeyRecorder/src/main.ts index 4aa499d9..65757e98 100644 --- a/examples/alpine/createHotkeyRecorder/src/main.ts +++ b/examples/alpine/createHotkeyRecorder/src/main.ts @@ -1,5 +1,9 @@ import Alpine from 'alpinejs' -import { createHotkeysScope, formatForDisplay } from '@tanstack/alpine-hotkeys' +import { + createHotkeysScope, + formatForDisplay, + hotkeysPlugin, +} from '@tanstack/alpine-hotkeys' import type { AlpineHotkeyRecorder, AlpineHotkeyState, @@ -8,6 +12,9 @@ import type { } from '@tanstack/alpine-hotkeys' import './index.css' +// Gives every hotkeys scope the app's Alpine instance. +Alpine.plugin(hotkeysPlugin) + interface Shortcut { id: string name: string diff --git a/examples/alpine/createHotkeys-sequences/src/main.ts b/examples/alpine/createHotkeys-sequences/src/main.ts index 13802a4a..e0cd6968 100644 --- a/examples/alpine/createHotkeys-sequences/src/main.ts +++ b/examples/alpine/createHotkeys-sequences/src/main.ts @@ -1,8 +1,15 @@ import Alpine from 'alpinejs' -import { createHotkeysScope, formatForDisplay } from '@tanstack/alpine-hotkeys' +import { + createHotkeysScope, + formatForDisplay, + hotkeysPlugin, +} from '@tanstack/alpine-hotkeys' import type { HotkeyRegistrationsResult } from '@tanstack/alpine-hotkeys' import './index.css' +// Gives every hotkeys scope the app's Alpine instance. +Alpine.plugin(hotkeysPlugin) + class App { private hotkeysScope = createHotkeysScope() diff --git a/examples/alpine/createHotkeys/src/main.ts b/examples/alpine/createHotkeys/src/main.ts index 8fc6932c..a2dc0a6f 100644 --- a/examples/alpine/createHotkeys/src/main.ts +++ b/examples/alpine/createHotkeys/src/main.ts @@ -1,6 +1,7 @@ import { createHotkeysScope, formatForDisplay, + hotkeysPlugin, normalizeHotkey, validateHotkey, } from '@tanstack/alpine-hotkeys' @@ -12,6 +13,9 @@ import type { } from '@tanstack/alpine-hotkeys' import './index.css' +// Gives every hotkeys scope the app's Alpine instance. +Alpine.plugin(hotkeysPlugin) + interface DynamicShortcut { id: number hotkey: Hotkey diff --git a/examples/alpine/createKeyHold/src/main.ts b/examples/alpine/createKeyHold/src/main.ts index a808a125..2239e4d6 100644 --- a/examples/alpine/createKeyHold/src/main.ts +++ b/examples/alpine/createKeyHold/src/main.ts @@ -1,8 +1,11 @@ import Alpine from 'alpinejs' -import { createHotkeysScope } from '@tanstack/alpine-hotkeys' +import { createHotkeysScope, hotkeysPlugin } from '@tanstack/alpine-hotkeys' import type { AlpineHotkeyState } from '@tanstack/alpine-hotkeys' import './index.css' +// Gives every hotkeys scope the app's Alpine instance. +Alpine.plugin(hotkeysPlugin) + class App { private hotkeysScope = createHotkeysScope() diff --git a/examples/alpine/kitchen-sink/src/main.ts b/examples/alpine/kitchen-sink/src/main.ts index 372f07ed..9db1803b 100644 --- a/examples/alpine/kitchen-sink/src/main.ts +++ b/examples/alpine/kitchen-sink/src/main.ts @@ -2,6 +2,7 @@ import Alpine from 'alpinejs' import { createHotkeysScope, formatForDisplay, + hotkeysPlugin, isHotkeySequence, } from '@tanstack/alpine-hotkeys' import type { @@ -14,6 +15,9 @@ import type { } from '@tanstack/alpine-hotkeys' import './index.css' +// Gives every hotkeys scope the app's Alpine instance. +Alpine.plugin(hotkeysPlugin) + const pages = [ { to: '/', label: 'Tickets', shortcut: 'Alt+[Digit1]' }, { to: '/editor', label: 'Editor', shortcut: 'Alt+[Digit2]' }, diff --git a/examples/ember/useHeldKeys/package.json b/examples/ember/useHeldKeys/package.json index 769977ec..30477ac9 100644 --- a/examples/ember/useHeldKeys/package.json +++ b/examples/ember/useHeldKeys/package.json @@ -27,7 +27,7 @@ "@glimmer/component": "2.1.1", "@tanstack/ember-hotkeys": "workspace:*", "decorator-transforms": "2.4.0", - "ember-modifier": "4.2.2", + "ember-modifier": "^4.2.2", "ember-source": "7.3.0", "ember-strict-application-resolver": "0.1.1" }, diff --git a/examples/ember/useHotkey/package.json b/examples/ember/useHotkey/package.json index e2625d94..6401a3f6 100644 --- a/examples/ember/useHotkey/package.json +++ b/examples/ember/useHotkey/package.json @@ -27,7 +27,7 @@ "@glimmer/component": "2.1.1", "@tanstack/ember-hotkeys": "workspace:*", "decorator-transforms": "2.4.0", - "ember-modifier": "4.2.2", + "ember-modifier": "^4.2.2", "ember-source": "7.3.0", "ember-strict-application-resolver": "0.1.1" }, diff --git a/nx.json b/nx.json index e4d29e31..2f5dd874 100644 --- a/nx.json +++ b/nx.json @@ -21,7 +21,8 @@ "production": [ "default", "!{projectRoot}/tests/**/*", - "!{projectRoot}/eslint.config.js" + "!{projectRoot}/eslint.config.js", + "!{projectRoot}/eslint.config.mjs" ] }, "targetDefaults": { diff --git a/packages/alpine-hotkeys/package.json b/packages/alpine-hotkeys/package.json index a2438052..0e92fee6 100644 --- a/packages/alpine-hotkeys/package.json +++ b/packages/alpine-hotkeys/package.json @@ -54,6 +54,6 @@ "alpinejs": "^3.17.4" }, "peerDependencies": { - "alpinejs": "^3.15.12" + "alpinejs": "^3.13.0" } } diff --git a/packages/alpine-hotkeys/skills/alpine-hotkeys/SKILL.md b/packages/alpine-hotkeys/skills/alpine-hotkeys/SKILL.md index e33f6b6e..efe22f46 100644 --- a/packages/alpine-hotkeys/skills/alpine-hotkeys/SKILL.md +++ b/packages/alpine-hotkeys/skills/alpine-hotkeys/SKILL.md @@ -33,7 +33,9 @@ Before starting, load the `@tanstack/hotkeys#hotkeys-core` skill (`npx @tanstack ```ts no-check import Alpine from 'alpinejs' -import { createHotkeysScope } from '@tanstack/alpine-hotkeys' +import { createHotkeysScope, hotkeysPlugin } from '@tanstack/alpine-hotkeys' + +Alpine.plugin(hotkeysPlugin) // before Alpine.start() Alpine.data('panel', () => ({ dirty: false, @@ -56,13 +58,13 @@ Alpine.data('panel', () => ({ })) ``` -For markup-only components, install `Alpine.plugin(hotkeysPlugin)` before `Alpine.start()` and use the `$hotkeys` magic, which is destroyed with its element: `x-init="$hotkeys.createHotkey('Mod+S', () => save())"`. +Install `Alpine.plugin(hotkeysPlugin)` before `Alpine.start()`. It gives the adapter the app's Alpine instance; without it, the adapter falls back to `window.Alpine` and throws when neither exists. The plugin also adds the `$hotkeys` magic for markup-only components, which is destroyed with its element: `x-init="$hotkeys.createHotkey('Mod+S', () => save())"`. ## API | API | What it's for | | --------------------------------------------------- | --------------------------------------------------------------------------------------------------------- | -| `Alpine.plugin(hotkeysPlugin)` | Install the `$hotkeys` magic, an owner that's destroyed with its element. | +| `Alpine.plugin(hotkeysPlugin)` | Give the adapter the app's Alpine, and install the `$hotkeys` magic, an owner destroyed with its element. | | `createHotkeysScope(defaults?)` | Create an owner for one `Alpine.data` component, with optional default options. | | `provideAppHotkeys(appHotkeys, options?)` | Declare app hotkeys and load the user's custom hotkeys once at startup, since Alpine has no provider. | | `getHotkeyManager().activateScope(scope, options?)` | Turn on a scope, such as an exclusive one for a dialog; it returns the function that turns the scope off. | diff --git a/packages/alpine-hotkeys/src/hotkeysPlugin.ts b/packages/alpine-hotkeys/src/hotkeysPlugin.ts index 18b0e62b..3f705688 100644 --- a/packages/alpine-hotkeys/src/hotkeysPlugin.ts +++ b/packages/alpine-hotkeys/src/hotkeysPlugin.ts @@ -1,9 +1,15 @@ import { createHotkeysScope } from './createHotkeysScope' +import { setAlpine } from './scope' import type Alpine from 'alpinejs' import type { AlpineHotkeys } from './createHotkeysScope' -/** Installs $hotkeys, whose registrations and subscriptions belong to its element. */ +/** + * Installs $hotkeys, whose registrations and subscriptions belong to its + * element. Every hotkeys scope, including ones from `createHotkeysScope`, uses + * the Alpine instance passed here. + */ export function hotkeysPlugin(alpine: typeof Alpine): void { + setAlpine(alpine) const scopes = new WeakMap() alpine.magic('hotkeys', (element, { cleanup }) => { let scope = scopes.get(element) diff --git a/packages/alpine-hotkeys/src/scope.ts b/packages/alpine-hotkeys/src/scope.ts index 83b0c039..746b63b7 100644 --- a/packages/alpine-hotkeys/src/scope.ts +++ b/packages/alpine-hotkeys/src/scope.ts @@ -1,10 +1,33 @@ -import Alpine from 'alpinejs' import { getHotkeyManager } from '@tanstack/hotkeys' import { subscribePublishedAppHotkeys } from '@tanstack/hotkeys/adapter' +import type Alpine from 'alpinejs' import type { AppHotkeysStore } from '@tanstack/hotkeys' import type { ReadonlyStore } from '@tanstack/store' import type { DefaultHotkeysOptions, MaybeGetter } from './types' +type AlpineInstance = typeof Alpine + +let pluginAlpine: AlpineInstance | undefined + +/** Records the Alpine instance passed to `hotkeysPlugin`. */ +export function setAlpine(alpine: AlpineInstance): void { + pluginAlpine = alpine +} + +// Use the page's Alpine instead of importing one. An import would load a +// second copy when Alpine comes from a script tag, and Alpine's module build +// touches the DOM when imported, which breaks importing this package in Node. +function getAlpine(): AlpineInstance { + const alpine = + pluginAlpine ?? (globalThis as { Alpine?: AlpineInstance }).Alpine + if (!alpine) { + throw new Error( + '[TanStack Hotkeys] Alpine was not found. Call Alpine.plugin(hotkeysPlugin) before Alpine.start(), or set window.Alpine.', + ) + } + return alpine +} + export function read(value: MaybeGetter): T { return typeof value === 'function' ? (value as () => T)() : value } @@ -21,10 +44,11 @@ export function createScope( function effect(callback: () => void) { assertActive() - const runner = Alpine.effect(() => { + const alpine = getAlpine() + const runner = alpine.effect(() => { if (!destroyed) callback() }) - cleanups.add(() => Alpine.release(runner)) + cleanups.add(() => alpine.release(runner)) } function select( @@ -32,7 +56,7 @@ export function createScope( selector: (state: T) => TSelected, ) { assertActive() - const state = Alpine.reactive({ snapshot: store.state }) + const state = getAlpine().reactive({ snapshot: store.state }) const subscription = store.subscribe(() => { state.snapshot = store.state }) @@ -51,7 +75,7 @@ export function createScope( */ function appHotkeys(): AppHotkeysStore | null { if (!appHotkeysState) { - const state = Alpine.reactive({ version: 0 }) + const state = getAlpine().reactive({ version: 0 }) appHotkeysState = state cleanups.add(subscribePublishedAppHotkeys(() => state.version++)) } diff --git a/packages/alpine-hotkeys/tests/alpine-instance.test.ts b/packages/alpine-hotkeys/tests/alpine-instance.test.ts new file mode 100644 index 00000000..7b775240 --- /dev/null +++ b/packages/alpine-hotkeys/tests/alpine-instance.test.ts @@ -0,0 +1,74 @@ +import Alpine from 'alpinejs' +import { afterEach, expect, it, vi } from 'vitest' + +// Each test loads a fresh copy of the adapter, so no plugin is installed yet. +async function loadAdapter() { + vi.resetModules() + return import('../src') +} + +function press(key: string) { + document.dispatchEvent(new KeyboardEvent('keydown', { key, bubbles: true })) +} + +afterEach(() => { + delete (globalThis as { Alpine?: unknown }).Alpine +}) + +it('uses the Alpine instance passed to the plugin, not window.Alpine', async () => { + const { hotkeysPlugin, createHotkeysScope, HotkeyManager } = + await loadAdapter() + const other = { + reactive: vi.fn(), + effect: vi.fn(), + release: vi.fn(), + } + ;(globalThis as { Alpine?: unknown }).Alpine = other + const magic = vi.spyOn(Alpine, 'magic') + hotkeysPlugin(Alpine) + expect(magic).toHaveBeenCalledWith('hotkeys', expect.any(Function)) + + const hotkeys = createHotkeysScope() + const state = Alpine.reactive({ enabled: true }) + const callback = vi.fn() + hotkeys.createHotkey('K', callback, () => ({ enabled: state.enabled })) + const held = hotkeys.createHeldKeys() + press('K') + expect(callback).toHaveBeenCalledOnce() + expect(held.value).toEqual(['K']) + + state.enabled = false + await Alpine.nextTick() + press('K') + expect(callback).toHaveBeenCalledOnce() + expect(other.reactive).not.toHaveBeenCalled() + expect(other.effect).not.toHaveBeenCalled() + + hotkeys.destroy() + magic.mockRestore() + HotkeyManager.resetInstance() +}) + +it('falls back to window.Alpine, as with a script-tag Alpine', async () => { + const { createHotkeysScope, HotkeyManager } = await loadAdapter() + ;(globalThis as { Alpine?: unknown }).Alpine = Alpine + const hotkeys = createHotkeysScope() + const state = Alpine.reactive({ enabled: true }) + const callback = vi.fn() + hotkeys.createHotkey('J', callback, () => ({ enabled: state.enabled })) + state.enabled = false + await Alpine.nextTick() + press('J') + expect(callback).not.toHaveBeenCalled() + hotkeys.destroy() + HotkeyManager.resetInstance() +}) + +it('creates a scope before Alpine is available, and explains the fix on first use', async () => { + const { createHotkeysScope } = await loadAdapter() + const hotkeys = createHotkeysScope() + expect(() => hotkeys.createHotkey('K', () => {})).toThrow( + 'Call Alpine.plugin(hotkeysPlugin) before Alpine.start(), or set window.Alpine.', + ) + hotkeys.destroy() +}) diff --git a/packages/alpine-hotkeys/tests/setup.ts b/packages/alpine-hotkeys/tests/setup.ts new file mode 100644 index 00000000..005b5e23 --- /dev/null +++ b/packages/alpine-hotkeys/tests/setup.ts @@ -0,0 +1,6 @@ +import Alpine from 'alpinejs' +import { hotkeysPlugin } from '../src' + +// Apps install the plugin before Alpine.start(), which gives every hotkeys +// scope the page's Alpine instance. +Alpine.plugin(hotkeysPlugin) diff --git a/packages/alpine-hotkeys/vitest.config.ts b/packages/alpine-hotkeys/vitest.config.ts index b6e6057b..0a760f22 100644 --- a/packages/alpine-hotkeys/vitest.config.ts +++ b/packages/alpine-hotkeys/vitest.config.ts @@ -9,5 +9,6 @@ export default defineConfig({ watch: false, environment: 'happy-dom', globals: true, + setupFiles: ['./tests/setup.ts'], }, }) diff --git a/packages/angular-hotkeys-devtools/src/AngularHotkeysDevtools.ts b/packages/angular-hotkeys-devtools/src/AngularHotkeysDevtools.ts index db3de579..6526cafa 100644 --- a/packages/angular-hotkeys-devtools/src/AngularHotkeysDevtools.ts +++ b/packages/angular-hotkeys-devtools/src/AngularHotkeysDevtools.ts @@ -1,8 +1,8 @@ import { createAngularPanel } from '@tanstack/devtools-utils/angular' import { HotkeysDevtoolsCore } from '@tanstack/hotkeys-devtools/production' -import type { DevtoolsPanelProps } from '@tanstack/devtools-utils/angular' +import type { HotkeysDevtoolsPanelProps } from '@tanstack/hotkeys-devtools/production' -export interface HotkeysDevtoolsAngularInit extends Partial {} +export interface HotkeysDevtoolsAngularInit extends Partial {} const [createPanel, HotkeysDevtoolsPanelNoOp] = createAngularPanel(HotkeysDevtoolsCore) diff --git a/packages/angular-hotkeys-devtools/src/index.ts b/packages/angular-hotkeys-devtools/src/index.ts index 3db396b8..24c0e0fe 100644 --- a/packages/angular-hotkeys-devtools/src/index.ts +++ b/packages/angular-hotkeys-devtools/src/index.ts @@ -12,3 +12,4 @@ export const hotkeysDevtoolsPlugin = : plugin.hotkeysDevtoolsPlugin export type { HotkeysDevtoolsAngularInit } from './AngularHotkeysDevtools' +export type { HotkeysDevtoolsAngularPlugin } from './plugin' diff --git a/packages/angular-hotkeys-devtools/src/plugin.ts b/packages/angular-hotkeys-devtools/src/plugin.ts index 1ad573aa..c7feb1ac 100644 --- a/packages/angular-hotkeys-devtools/src/plugin.ts +++ b/packages/angular-hotkeys-devtools/src/plugin.ts @@ -1,9 +1,31 @@ -import { createAngularPlugin } from '@tanstack/devtools-utils/angular' import { HotkeysDevtoolsPanel } from './AngularHotkeysDevtools' +import type { HotkeysDevtoolsAngularInit } from './AngularHotkeysDevtools' -const [hotkeysDevtoolsPlugin, hotkeysDevtoolsNoOpPlugin] = createAngularPlugin({ - name: 'TanStack Hotkeys', - render: HotkeysDevtoolsPanel, -}) +type HotkeysDevtoolsAngularInputs = + HotkeysDevtoolsAngularInit | (() => HotkeysDevtoolsAngularInit) -export { hotkeysDevtoolsPlugin, hotkeysDevtoolsNoOpPlugin } +/** A plugin for `provideTanStackDevtools` from `@tanstack/angular-devtools`. */ +export interface HotkeysDevtoolsAngularPlugin { + name: string + render: typeof HotkeysDevtoolsPanel + inputs?: HotkeysDevtoolsAngularInputs +} + +/** The production plugin, which renders nothing. */ +export interface HotkeysDevtoolsAngularNoOpPlugin { + name: string + render: null +} + +const name = 'TanStack Hotkeys' + +// Same shape as `createAngularPlugin` from `@tanstack/devtools-utils/angular`. +export function hotkeysDevtoolsPlugin( + inputs?: HotkeysDevtoolsAngularInputs, +): HotkeysDevtoolsAngularPlugin { + return { name, render: HotkeysDevtoolsPanel, inputs } +} + +export function hotkeysDevtoolsNoOpPlugin(): HotkeysDevtoolsAngularNoOpPlugin { + return { name, render: null } +} diff --git a/packages/angular-hotkeys-devtools/src/production.ts b/packages/angular-hotkeys-devtools/src/production.ts index 45e32c1e..084c1ace 100644 --- a/packages/angular-hotkeys-devtools/src/production.ts +++ b/packages/angular-hotkeys-devtools/src/production.ts @@ -1,3 +1,4 @@ export { HotkeysDevtoolsPanel } from './AngularHotkeysDevtools' export { hotkeysDevtoolsPlugin } from './plugin' export type { HotkeysDevtoolsAngularInit } from './AngularHotkeysDevtools' +export type { HotkeysDevtoolsAngularPlugin } from './plugin' diff --git a/packages/ember-hotkeys/eslint.config.js b/packages/ember-hotkeys/eslint.config.mjs similarity index 100% rename from packages/ember-hotkeys/eslint.config.js rename to packages/ember-hotkeys/eslint.config.mjs diff --git a/packages/ember-hotkeys/package.json b/packages/ember-hotkeys/package.json index e6aece08..14945ee9 100644 --- a/packages/ember-hotkeys/package.json +++ b/packages/ember-hotkeys/package.json @@ -15,6 +15,7 @@ "url": "https://github.com/sponsors/tannerlinsley" }, "keywords": [ + "ember-addon", "ember", "tanstack", "hotkeys", @@ -29,9 +30,8 @@ "test:lib:dev": "pnpm test:lib --watch", "test:types": "ember-tsc --noEmit", "build": "tsdown", - "test:build": "publint --strict && node ../../scripts/verify-package.ts" + "test:build": "publint --level error && node ../../scripts/verify-package.ts" }, - "type": "module", "types": "./dist/index.d.ts", "exports": { ".": "./dist/index.js", @@ -53,7 +53,7 @@ "@embroider/addon-shim": "^1.10.3", "@tanstack/hotkeys": "workspace:*", "@tanstack/store": "^0.11.2", - "ember-modifier": "4.2.2" + "ember-modifier": "^4.2.2" }, "devDependencies": { "@babel/core": "7.29.7", @@ -80,7 +80,7 @@ "vite": "^8.3.2" }, "peerDependencies": { - "ember-source": ">=6.8.0" + "ember-source": ">=6.8.3 <6.9.0 || >=6.10.1" }, "ember-addon": { "version": 2, diff --git a/packages/ember-hotkeys/skills/ember-hotkeys/SKILL.md b/packages/ember-hotkeys/skills/ember-hotkeys/SKILL.md index a082b349..6eecfe3c 100644 --- a/packages/ember-hotkeys/skills/ember-hotkeys/SKILL.md +++ b/packages/ember-hotkeys/skills/ember-hotkeys/SKILL.md @@ -76,7 +76,7 @@ export default class Editor extends Component { The package also re-exports `@tanstack/hotkeys`, such as `formatForDisplay`, `matchesKeyboardEvent`, and `defineAppHotkeys`. -The helpers are template helpers, not JavaScript functions. State readers take the component as their owner, and their state is read through `.value`, or `.hotkeys` for registrations. Use Ember 6.8 or newer and strict-mode `.gts` components. +The helpers are template helpers, not JavaScript functions. State readers take the component as their owner, and their state is read through `.value`, or `.hotkeys` for registrations. Use Ember 6.8.3 or newer, except 6.9.0 and 6.10.0, and strict-mode `.gts` components. ## Pitfalls diff --git a/packages/ember-hotkeys/tsdown.config.mts b/packages/ember-hotkeys/tsdown.config.mts new file mode 100644 index 00000000..0659af44 --- /dev/null +++ b/packages/ember-hotkeys/tsdown.config.mts @@ -0,0 +1,25 @@ +import { defineConfig } from 'tsdown' + +export default defineConfig({ + entry: ['./src/index.ts'], + deps: { neverBundle: [/^@ember\//] }, + exports: false, + format: ['esm'], + target: 'es2022', + unbundle: true, + dts: true, + sourcemap: false, + clean: true, + minify: false, + // Like the official v2 addon blueprint, the package has no "type": "module". + // With it, webpack in classic (ember-auto-import) builds imports the whole + // module object for default imports such as `@ember/component/helper`. + // Pin `.js` output, which tsdown would otherwise write as `.mjs`. + fixedExtension: false, + outExtensions: () => ({ js: '.js', dts: '.d.ts' }), + // publint warns that ESM `.js` files in a typeless package look like + // CommonJS to Node. Only bundlers load this addon, so report errors only. + publint: { + level: 'error', + }, +}) diff --git a/packages/ember-hotkeys/tsdown.config.ts b/packages/ember-hotkeys/tsdown.config.ts deleted file mode 100644 index e501b853..00000000 --- a/packages/ember-hotkeys/tsdown.config.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { defineConfig } from 'tsdown' - -export default defineConfig({ - entry: ['./src/index.ts'], - deps: { neverBundle: [/^@ember\//] }, - exports: false, - format: ['esm'], - target: 'es2022', - unbundle: true, - dts: true, - sourcemap: false, - clean: true, - minify: false, - fixedExtension: false, - publint: { - strict: true, - }, -}) diff --git a/packages/hotkeys-devtools/src/core.tsx b/packages/hotkeys-devtools/src/core.tsx index 3dea2ca6..12792f26 100644 --- a/packages/hotkeys-devtools/src/core.tsx +++ b/packages/hotkeys-devtools/src/core.tsx @@ -1,5 +1,5 @@ import { constructCoreClass } from '@tanstack/devtools-utils/solid' -import type { ClassType } from '@tanstack/devtools-utils/solid' +import type { HotkeysDevtoolsCoreClass } from './types' const loadComponent = () => import('./components/index') @@ -7,5 +7,5 @@ export interface HotkeysDevtoolsInit {} const coreClasses = constructCoreClass(loadComponent) -export const HotkeysDevtoolsCore: ClassType = coreClasses[0] -export const HotkeysDevtoolsCoreNoOp: ClassType = coreClasses[1] +export const HotkeysDevtoolsCore: HotkeysDevtoolsCoreClass = coreClasses[0] +export const HotkeysDevtoolsCoreNoOp: HotkeysDevtoolsCoreClass = coreClasses[1] diff --git a/packages/hotkeys-devtools/src/index.ts b/packages/hotkeys-devtools/src/index.ts index d3cdd727..96b9f6a1 100644 --- a/packages/hotkeys-devtools/src/index.ts +++ b/packages/hotkeys-devtools/src/index.ts @@ -1,11 +1,16 @@ 'use client' import * as Devtools from './core' -import type { ClassType } from '@tanstack/devtools-utils/solid' +import type { HotkeysDevtoolsCoreClass } from './types' -export const HotkeysDevtoolsCore: ClassType = +export const HotkeysDevtoolsCore: HotkeysDevtoolsCoreClass = process.env.NODE_ENV !== 'development' ? Devtools.HotkeysDevtoolsCoreNoOp : Devtools.HotkeysDevtoolsCore export type { HotkeysDevtoolsInit } from './core' +export type { + HotkeysDevtoolsCoreClass, + HotkeysDevtoolsPanelProps, + HotkeysDevtoolsTheme, +} from './types' diff --git a/packages/hotkeys-devtools/src/production.ts b/packages/hotkeys-devtools/src/production.ts index e0f03b9e..f489d79a 100644 --- a/packages/hotkeys-devtools/src/production.ts +++ b/packages/hotkeys-devtools/src/production.ts @@ -3,3 +3,8 @@ export { HotkeysDevtoolsCore } from './core' export type { HotkeysDevtoolsInit } from './core' +export type { + HotkeysDevtoolsCoreClass, + HotkeysDevtoolsPanelProps, + HotkeysDevtoolsTheme, +} from './types' diff --git a/packages/hotkeys-devtools/src/types.ts b/packages/hotkeys-devtools/src/types.ts new file mode 100644 index 00000000..82afffbc --- /dev/null +++ b/packages/hotkeys-devtools/src/types.ts @@ -0,0 +1,21 @@ +/** The devtools color theme. */ +export type HotkeysDevtoolsTheme = 'light' | 'dark' + +/** + * Props a devtools host passes to the Hotkeys panel. + * + * These match `TanStackDevtoolsPluginProps` from `@tanstack/devtools`. They + * are declared here because the `@tanstack/devtools-utils` types import + * `@tanstack/devtools` without depending on it, so published types that use + * them fail to resolve. + */ +export interface HotkeysDevtoolsPanelProps { + theme: HotkeysDevtoolsTheme + devtoolsOpen: boolean +} + +/** The class each framework panel creates and mounts the devtools with. */ +export type HotkeysDevtoolsCoreClass = new () => { + mount: (el: HTMLElement, props: HotkeysDevtoolsPanelProps) => Promise + unmount: () => void +} diff --git a/packages/preact-hotkeys-devtools/package.json b/packages/preact-hotkeys-devtools/package.json index 07d54258..40e323f8 100644 --- a/packages/preact-hotkeys-devtools/package.json +++ b/packages/preact-hotkeys-devtools/package.json @@ -47,7 +47,7 @@ "dist" ], "peerDependencies": { - "preact": ">=10.0.0" + "preact": ">=10.5.2" }, "dependencies": { "@tanstack/devtools-utils": "^0.7.0", diff --git a/packages/preact-hotkeys-devtools/src/PreactHotkeysDevtools.tsx b/packages/preact-hotkeys-devtools/src/PreactHotkeysDevtools.tsx index 935babad..2ee36d31 100644 --- a/packages/preact-hotkeys-devtools/src/PreactHotkeysDevtools.tsx +++ b/packages/preact-hotkeys-devtools/src/PreactHotkeysDevtools.tsx @@ -1,10 +1,10 @@ import { h } from 'preact' import { createPreactPanel } from '@tanstack/devtools-utils/preact' import { HotkeysDevtoolsCore } from '@tanstack/hotkeys-devtools' -import type { DevtoolsPanelProps } from '@tanstack/devtools-utils/preact' +import type { HotkeysDevtoolsPanelProps } from '@tanstack/hotkeys-devtools' import type { JSX } from 'preact' -export interface HotkeysDevtoolsPreactInit extends Partial {} +export interface HotkeysDevtoolsPreactInit extends Partial {} type HotkeysDevtoolsPanelComponent = ( props?: HotkeysDevtoolsPreactInit, diff --git a/packages/preact-hotkeys-devtools/src/index.ts b/packages/preact-hotkeys-devtools/src/index.ts index 97a1f621..9d1af737 100644 --- a/packages/preact-hotkeys-devtools/src/index.ts +++ b/packages/preact-hotkeys-devtools/src/index.ts @@ -12,3 +12,4 @@ export const hotkeysDevtoolsPlugin: typeof plugin.hotkeysDevtoolsPlugin = : plugin.hotkeysDevtoolsPlugin export type { HotkeysDevtoolsPreactInit } from './PreactHotkeysDevtools' +export type { HotkeysDevtoolsPreactPlugin } from './plugin' diff --git a/packages/preact-hotkeys-devtools/src/plugin.tsx b/packages/preact-hotkeys-devtools/src/plugin.tsx index 51093cb6..84e77b04 100644 --- a/packages/preact-hotkeys-devtools/src/plugin.tsx +++ b/packages/preact-hotkeys-devtools/src/plugin.tsx @@ -1,7 +1,17 @@ import { createPreactPlugin } from '@tanstack/devtools-utils/preact' import { HotkeysDevtoolsPanel } from './PreactHotkeysDevtools' +import type { JSX } from 'preact' +import type { HotkeysDevtoolsPanelProps } from '@tanstack/hotkeys-devtools' -type HotkeysDevtoolsPluginFactory = ReturnType[0] +/** A plugin for `TanStackDevtools` from `@tanstack/preact-devtools`. */ +export interface HotkeysDevtoolsPreactPlugin { + name: string + id?: string + defaultOpen?: boolean + render: (el: HTMLElement, props: HotkeysDevtoolsPanelProps) => JSX.Element +} + +type HotkeysDevtoolsPluginFactory = () => HotkeysDevtoolsPreactPlugin const plugins = createPreactPlugin({ name: 'TanStack Hotkeys', diff --git a/packages/preact-hotkeys/package.json b/packages/preact-hotkeys/package.json index b2d15949..c2ab6588 100644 --- a/packages/preact-hotkeys/package.json +++ b/packages/preact-hotkeys/package.json @@ -55,6 +55,6 @@ "preact": "^11.0.1" }, "peerDependencies": { - "preact": ">=10.0.0" + "preact": ">=10.5.2" } } diff --git a/packages/react-hotkeys-devtools/package.json b/packages/react-hotkeys-devtools/package.json index 25a0e128..30ecbefd 100644 --- a/packages/react-hotkeys-devtools/package.json +++ b/packages/react-hotkeys-devtools/package.json @@ -48,10 +48,10 @@ "dist" ], "peerDependencies": { - "@types/react": ">=16.8", - "@types/react-dom": ">=16.8", - "react": ">=16.8", - "react-dom": ">=16.8" + "@types/react": ">=18.0.0", + "@types/react-dom": ">=18.0.0", + "react": ">=18.0.0", + "react-dom": ">=18.0.0" }, "dependencies": { "@tanstack/devtools-utils": "^0.7.0", diff --git a/packages/react-hotkeys-devtools/src/ReactHotkeysDevtools.tsx b/packages/react-hotkeys-devtools/src/ReactHotkeysDevtools.tsx index 0f87279f..a584e0be 100644 --- a/packages/react-hotkeys-devtools/src/ReactHotkeysDevtools.tsx +++ b/packages/react-hotkeys-devtools/src/ReactHotkeysDevtools.tsx @@ -1,14 +1,14 @@ import { createElement } from 'react' import { createReactPanel } from '@tanstack/devtools-utils/react' import { HotkeysDevtoolsCore } from '@tanstack/hotkeys-devtools' -import type { DevtoolsPanelProps } from '@tanstack/devtools-utils/react' -import type { JSX } from 'react' +import type { ReactElement } from 'react' +import type { HotkeysDevtoolsPanelProps } from '@tanstack/hotkeys-devtools' -export interface HotkeysDevtoolsReactInit extends Partial {} +export interface HotkeysDevtoolsReactInit extends Partial {} type HotkeysDevtoolsPanelComponent = ( props?: HotkeysDevtoolsReactInit, -) => JSX.Element +) => ReactElement const panels = createReactPanel(HotkeysDevtoolsCore) diff --git a/packages/react-hotkeys-devtools/src/index.ts b/packages/react-hotkeys-devtools/src/index.ts index b354f170..8535bbe4 100644 --- a/packages/react-hotkeys-devtools/src/index.ts +++ b/packages/react-hotkeys-devtools/src/index.ts @@ -14,3 +14,4 @@ export const hotkeysDevtoolsPlugin: typeof plugin.hotkeysDevtoolsPlugin = : plugin.hotkeysDevtoolsPlugin export type { HotkeysDevtoolsReactInit } from './ReactHotkeysDevtools' +export type { HotkeysDevtoolsReactPlugin } from './plugin' diff --git a/packages/react-hotkeys-devtools/src/plugin.tsx b/packages/react-hotkeys-devtools/src/plugin.tsx index 839da2cd..cd5b0c32 100644 --- a/packages/react-hotkeys-devtools/src/plugin.tsx +++ b/packages/react-hotkeys-devtools/src/plugin.tsx @@ -1,7 +1,17 @@ import { createReactPlugin } from '@tanstack/devtools-utils/react' import { HotkeysDevtoolsPanel } from './ReactHotkeysDevtools' +import type { ReactElement } from 'react' +import type { HotkeysDevtoolsPanelProps } from '@tanstack/hotkeys-devtools' -type HotkeysDevtoolsPluginFactory = ReturnType[0] +/** A plugin for `TanStackDevtools` from `@tanstack/react-devtools`. */ +export interface HotkeysDevtoolsReactPlugin { + name: string + id?: string + defaultOpen?: boolean + render: (el: HTMLElement, props: HotkeysDevtoolsPanelProps) => ReactElement +} + +type HotkeysDevtoolsPluginFactory = () => HotkeysDevtoolsReactPlugin const plugins = createReactPlugin({ name: 'TanStack Hotkeys', diff --git a/packages/react-hotkeys-devtools/src/production.ts b/packages/react-hotkeys-devtools/src/production.ts index dba395e0..34b0d0d1 100644 --- a/packages/react-hotkeys-devtools/src/production.ts +++ b/packages/react-hotkeys-devtools/src/production.ts @@ -5,3 +5,4 @@ export { HotkeysDevtoolsPanel } from './ReactHotkeysDevtools' export type { HotkeysDevtoolsReactInit } from './ReactHotkeysDevtools' export { hotkeysDevtoolsPlugin } from './plugin' +export type { HotkeysDevtoolsReactPlugin } from './plugin' diff --git a/packages/react-hotkeys-devtools/tsdown.config.ts b/packages/react-hotkeys-devtools/tsdown.config.ts index ed240856..929e43e3 100644 --- a/packages/react-hotkeys-devtools/tsdown.config.ts +++ b/packages/react-hotkeys-devtools/tsdown.config.ts @@ -7,6 +7,9 @@ export default defineConfig({ format: ['esm'], target: 'es2022', unbundle: true, + // Unbundled output keeps each file's 'use client' directive, which + // scripts/verify-package.ts checks, so skip rolldown's bundling warning. + checks: { moduleLevelDirective: false }, dts: true, sourcemap: false, clean: true, diff --git a/packages/react-hotkeys/package.json b/packages/react-hotkeys/package.json index 056cdf97..e73b6618 100644 --- a/packages/react-hotkeys/package.json +++ b/packages/react-hotkeys/package.json @@ -60,7 +60,7 @@ "react-dom": "^19.3.0" }, "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8" + "react": ">=18.0.0", + "react-dom": ">=18.0.0" } } diff --git a/packages/react-hotkeys/skills/react-hotkeys/SKILL.md b/packages/react-hotkeys/skills/react-hotkeys/SKILL.md index e9930b8b..d8553bae 100644 --- a/packages/react-hotkeys/skills/react-hotkeys/SKILL.md +++ b/packages/react-hotkeys/skills/react-hotkeys/SKILL.md @@ -68,7 +68,7 @@ export function SaveButton({ onSave }: { onSave: () => void }) { The package also re-exports `@tanstack/hotkeys`, such as `formatForDisplay`, `matchesKeyboardEvent`, and `defineAppHotkeys`. -No provider is required. In React Server Components frameworks, use the hooks and `HotkeysProvider` in client components. +No provider is required. In React Server Components frameworks, call the hooks from client components. The package marks `HotkeysProvider` as a client component, so a server layout can render it without a `'use client'` wrapper. ## A dialog that owns the keyboard diff --git a/packages/react-hotkeys/src/HotkeysProvider.tsx b/packages/react-hotkeys/src/HotkeysProvider.tsx index 2d2586f6..b54ae8c5 100644 --- a/packages/react-hotkeys/src/HotkeysProvider.tsx +++ b/packages/react-hotkeys/src/HotkeysProvider.tsx @@ -1,3 +1,5 @@ +'use client' + import React, { createContext, useContext, @@ -11,7 +13,7 @@ import { getHotkeysProviderScopeKey, mergeHotkeysProviderDefaults, } from '@tanstack/hotkeys/adapter' -import type { ReactNode } from 'react' +import type { ReactElement, ReactNode } from 'react' import type { AppHotkeys, CustomHotkeys, @@ -113,8 +115,8 @@ export function HotkeysProvider({ scope, exclusive = false, enabled = true, -}: HotkeysProviderProps) { - // eslint-disable-next-line @eslint-react/no-use-context -- React 19+ only; we support React >=16.8 +}: HotkeysProviderProps): ReactElement { + // eslint-disable-next-line @eslint-react/no-use-context -- React 19+ only; we support React >=18 const parent = useContext(HotkeysContext) ?? NO_PARENT const [store] = useState(() => appHotkeys @@ -167,7 +169,7 @@ export function HotkeysProvider({ ) return ( - // eslint-disable-next-line @eslint-react/no-context-provider -- React 19+ only; we support React >=16.8 + // eslint-disable-next-line @eslint-react/no-context-provider -- React 19+ only; we support React >=18 {children} @@ -175,12 +177,12 @@ export function HotkeysProvider({ } export function useHotkeysContext() { - // eslint-disable-next-line @eslint-react/no-use-context -- React 19+ only; we support React >=16.8 + // eslint-disable-next-line @eslint-react/no-use-context -- React 19+ only; we support React >=18 return useContext(HotkeysContext) } export function useDefaultHotkeysOptions() { - // eslint-disable-next-line @eslint-react/no-use-context -- React 19+ only; we support React >=16.8 + // eslint-disable-next-line @eslint-react/no-use-context -- React 19+ only; we support React >=18 const context = useContext(HotkeysContext) return context?.defaultOptions ?? DEFAULT_OPTIONS } diff --git a/packages/react-hotkeys/src/_appHotkeysStore.ts b/packages/react-hotkeys/src/_appHotkeysStore.ts index 1f0c18c5..49bdec66 100644 --- a/packages/react-hotkeys/src/_appHotkeysStore.ts +++ b/packages/react-hotkeys/src/_appHotkeysStore.ts @@ -1,3 +1,5 @@ +'use client' + import { Store, useSelector } from '@tanstack/react-store' import { useHotkeysContext } from './HotkeysProvider' import type { AppHotkeysState, AppHotkeysStore } from '@tanstack/hotkeys' diff --git a/packages/react-hotkeys/src/useAppHotkeys.ts b/packages/react-hotkeys/src/useAppHotkeys.ts index 1ebca3ca..f4a4e77e 100644 --- a/packages/react-hotkeys/src/useAppHotkeys.ts +++ b/packages/react-hotkeys/src/useAppHotkeys.ts @@ -1,3 +1,5 @@ +'use client' + import { useAppHotkeysStoreState } from './_appHotkeysStore' import { useHotkeyRegistrations } from './useHotkeyRegistrations' import type { diff --git a/packages/react-hotkeys/src/useHeldKeyCodes.ts b/packages/react-hotkeys/src/useHeldKeyCodes.ts index d8b81749..766e8904 100644 --- a/packages/react-hotkeys/src/useHeldKeyCodes.ts +++ b/packages/react-hotkeys/src/useHeldKeyCodes.ts @@ -1,3 +1,5 @@ +'use client' + import { useSelector } from '@tanstack/react-store' import { getKeyStateTracker } from '@tanstack/hotkeys' diff --git a/packages/react-hotkeys/src/useHeldKeys.ts b/packages/react-hotkeys/src/useHeldKeys.ts index beefd409..fe3a94f0 100644 --- a/packages/react-hotkeys/src/useHeldKeys.ts +++ b/packages/react-hotkeys/src/useHeldKeys.ts @@ -1,3 +1,5 @@ +'use client' + import { useSelector } from '@tanstack/react-store' import { getKeyStateTracker } from '@tanstack/hotkeys' diff --git a/packages/react-hotkeys/src/useHotkey.ts b/packages/react-hotkeys/src/useHotkey.ts index c81f0de2..230b3418 100644 --- a/packages/react-hotkeys/src/useHotkey.ts +++ b/packages/react-hotkeys/src/useHotkey.ts @@ -1,3 +1,5 @@ +'use client' + import { useHotkeys } from './useHotkeys' import type { AppHotkey, diff --git a/packages/react-hotkeys/src/useHotkeyHint.ts b/packages/react-hotkeys/src/useHotkeyHint.ts index fa9bee35..44d9fdf6 100644 --- a/packages/react-hotkeys/src/useHotkeyHint.ts +++ b/packages/react-hotkeys/src/useHotkeyHint.ts @@ -1,3 +1,5 @@ +'use client' + import { useSelector } from '@tanstack/react-store' import { getHotkeyManager, diff --git a/packages/react-hotkeys/src/useHotkeyRecorder.ts b/packages/react-hotkeys/src/useHotkeyRecorder.ts index 0ef6c144..6f3bfa83 100644 --- a/packages/react-hotkeys/src/useHotkeyRecorder.ts +++ b/packages/react-hotkeys/src/useHotkeyRecorder.ts @@ -1,3 +1,5 @@ +'use client' + import { useEffect, useRef } from 'react' import { useSelector } from '@tanstack/react-store' import { HotkeyRecorder } from '@tanstack/hotkeys' diff --git a/packages/react-hotkeys/src/useHotkeyRegistrations.ts b/packages/react-hotkeys/src/useHotkeyRegistrations.ts index 166314a2..e090285b 100644 --- a/packages/react-hotkeys/src/useHotkeyRegistrations.ts +++ b/packages/react-hotkeys/src/useHotkeyRegistrations.ts @@ -1,3 +1,5 @@ +'use client' + import { useSelector } from '@tanstack/react-store' import { getHotkeyManager, toHotkeyRegistrationView } from '@tanstack/hotkeys' import type { HotkeyRegistrationView } from '@tanstack/hotkeys' diff --git a/packages/react-hotkeys/src/useHotkeyScopesState.ts b/packages/react-hotkeys/src/useHotkeyScopesState.ts index d3195a25..46c05e79 100644 --- a/packages/react-hotkeys/src/useHotkeyScopesState.ts +++ b/packages/react-hotkeys/src/useHotkeyScopesState.ts @@ -1,3 +1,5 @@ +'use client' + import { useSelector } from '@tanstack/react-store' import { getHotkeyManager } from '@tanstack/hotkeys' import type { HotkeyScopesState } from '@tanstack/hotkeys' diff --git a/packages/react-hotkeys/src/useHotkeys.ts b/packages/react-hotkeys/src/useHotkeys.ts index 11eff009..528b379a 100644 --- a/packages/react-hotkeys/src/useHotkeys.ts +++ b/packages/react-hotkeys/src/useHotkeys.ts @@ -1,3 +1,5 @@ +'use client' + import { useEffect, useRef } from 'react' import { createHotkeyBindings, diff --git a/packages/react-hotkeys/src/useKeyHold.ts b/packages/react-hotkeys/src/useKeyHold.ts index d1e67d9d..fb41b945 100644 --- a/packages/react-hotkeys/src/useKeyHold.ts +++ b/packages/react-hotkeys/src/useKeyHold.ts @@ -1,3 +1,5 @@ +'use client' + import { useSelector } from '@tanstack/react-store' import { getKeyStateTracker } from '@tanstack/hotkeys' import type { IndividualKey } from '@tanstack/hotkeys' diff --git a/packages/react-hotkeys/tsdown.config.ts b/packages/react-hotkeys/tsdown.config.ts index 5ab5e0aa..c4c16d35 100644 --- a/packages/react-hotkeys/tsdown.config.ts +++ b/packages/react-hotkeys/tsdown.config.ts @@ -5,6 +5,9 @@ export default defineConfig({ format: ['esm'], target: 'es2022', unbundle: true, + // Unbundled output keeps each file's 'use client' directive, which + // scripts/verify-package.ts checks, so skip rolldown's bundling warning. + checks: { moduleLevelDirective: false }, dts: true, sourcemap: false, clean: true, diff --git a/packages/solid-hotkeys-devtools/package.json b/packages/solid-hotkeys-devtools/package.json index b9243310..4b063881 100644 --- a/packages/solid-hotkeys-devtools/package.json +++ b/packages/solid-hotkeys-devtools/package.json @@ -49,7 +49,7 @@ "dist" ], "peerDependencies": { - "solid-js": "^1.7.0" + "solid-js": "^1.9.15" }, "dependencies": { "@tanstack/devtools-utils": "^0.7.0", diff --git a/packages/solid-hotkeys-devtools/src/SolidHotkeysDevtools.tsx b/packages/solid-hotkeys-devtools/src/SolidHotkeysDevtools.tsx index 4c6972fb..4f49ee54 100644 --- a/packages/solid-hotkeys-devtools/src/SolidHotkeysDevtools.tsx +++ b/packages/solid-hotkeys-devtools/src/SolidHotkeysDevtools.tsx @@ -1,16 +1,18 @@ import { createComponent, mergeProps } from 'solid-js' import { createSolidPanel } from '@tanstack/devtools-utils/solid' import { HotkeysDevtoolsCore } from '@tanstack/hotkeys-devtools' -import type { DevtoolsPanelProps } from '@tanstack/devtools-utils/solid' +import type { ClassType } from '@tanstack/devtools-utils/solid' +import type { HotkeysDevtoolsPanelProps } from '@tanstack/hotkeys-devtools' import type { JSX } from 'solid-js' -export interface HotkeysDevtoolsSolidInit extends Partial {} +export interface HotkeysDevtoolsSolidInit extends Partial {} type HotkeysDevtoolsPanelComponent = ( props?: HotkeysDevtoolsSolidInit, ) => JSX.Element -const panels = createSolidPanel(HotkeysDevtoolsCore) +// `createSolidPanel` wants the exact class type from `constructCoreClass`. +const panels = createSolidPanel(HotkeysDevtoolsCore as unknown as ClassType) function withDefaults( Panel: (typeof panels)[number], diff --git a/packages/solid-hotkeys-devtools/src/index.ts b/packages/solid-hotkeys-devtools/src/index.ts index 2c1cfb28..9c1b6d9b 100644 --- a/packages/solid-hotkeys-devtools/src/index.ts +++ b/packages/solid-hotkeys-devtools/src/index.ts @@ -12,3 +12,4 @@ export const hotkeysDevtoolsPlugin: typeof plugin.hotkeysDevtoolsPlugin = : plugin.hotkeysDevtoolsPlugin export type { HotkeysDevtoolsSolidInit } from './SolidHotkeysDevtools' +export type { HotkeysDevtoolsSolidPlugin } from './plugin' diff --git a/packages/solid-hotkeys-devtools/src/plugin.tsx b/packages/solid-hotkeys-devtools/src/plugin.tsx index 62c37497..6d90e2db 100644 --- a/packages/solid-hotkeys-devtools/src/plugin.tsx +++ b/packages/solid-hotkeys-devtools/src/plugin.tsx @@ -1,7 +1,17 @@ import { createSolidPlugin } from '@tanstack/devtools-utils/solid' import { HotkeysDevtoolsPanel } from './SolidHotkeysDevtools' +import type { JSX } from 'solid-js' +import type { HotkeysDevtoolsPanelProps } from '@tanstack/hotkeys-devtools' -type HotkeysDevtoolsPluginFactory = ReturnType[0] +/** A plugin for `TanStackDevtools` from `@tanstack/solid-devtools`. */ +export interface HotkeysDevtoolsSolidPlugin { + name: string + id?: string + defaultOpen?: boolean + render: (el: HTMLElement, props: HotkeysDevtoolsPanelProps) => JSX.Element +} + +type HotkeysDevtoolsPluginFactory = () => HotkeysDevtoolsSolidPlugin const plugins = createSolidPlugin({ name: 'TanStack Hotkeys', diff --git a/packages/solid-hotkeys-devtools/src/production.ts b/packages/solid-hotkeys-devtools/src/production.ts index 761d7aeb..d680db04 100644 --- a/packages/solid-hotkeys-devtools/src/production.ts +++ b/packages/solid-hotkeys-devtools/src/production.ts @@ -3,3 +3,4 @@ export { HotkeysDevtoolsPanel } from './SolidHotkeysDevtools' export type { HotkeysDevtoolsSolidInit } from './SolidHotkeysDevtools' export { hotkeysDevtoolsPlugin } from './plugin' +export type { HotkeysDevtoolsSolidPlugin } from './plugin' diff --git a/packages/svelte-hotkeys-devtools/package.json b/packages/svelte-hotkeys-devtools/package.json index 38926476..6991f99f 100644 --- a/packages/svelte-hotkeys-devtools/package.json +++ b/packages/svelte-hotkeys-devtools/package.json @@ -56,7 +56,7 @@ "dist" ], "peerDependencies": { - "svelte": "^5.25.0" + "svelte": "^5.40.0" }, "dependencies": { "@tanstack/devtools-utils": "^0.7.0", diff --git a/packages/svelte-hotkeys-devtools/src/SvelteHotkeysDevtools.ts b/packages/svelte-hotkeys-devtools/src/SvelteHotkeysDevtools.ts index 9c001366..9b038137 100644 --- a/packages/svelte-hotkeys-devtools/src/SvelteHotkeysDevtools.ts +++ b/packages/svelte-hotkeys-devtools/src/SvelteHotkeysDevtools.ts @@ -1,9 +1,9 @@ import { createSveltePanel } from '@tanstack/devtools-utils/svelte' import { HotkeysDevtoolsCore } from '@tanstack/hotkeys-devtools/production' -import type { DevtoolsPanelProps } from '@tanstack/devtools-utils/svelte' +import type { HotkeysDevtoolsPanelProps } from '@tanstack/hotkeys-devtools/production' import type { Component } from 'svelte' -export interface HotkeysDevtoolsSvelteInit extends Partial {} +export interface HotkeysDevtoolsSvelteInit extends Partial {} const panels = createSveltePanel(HotkeysDevtoolsCore) @@ -21,5 +21,8 @@ function withDefaults( }) } -export const HotkeysDevtoolsPanel = withDefaults(panels[0]) -export const HotkeysDevtoolsPanelNoOp = withDefaults(panels[1]) +// Annotated so the emitted types keep Svelte's default `Component` bindings. +export const HotkeysDevtoolsPanel: Component = + withDefaults(panels[0]) +export const HotkeysDevtoolsPanelNoOp: Component = + withDefaults(panels[1]) diff --git a/packages/svelte-hotkeys-devtools/src/index.ts b/packages/svelte-hotkeys-devtools/src/index.ts index cb4c536b..908c9c2c 100644 --- a/packages/svelte-hotkeys-devtools/src/index.ts +++ b/packages/svelte-hotkeys-devtools/src/index.ts @@ -1,14 +1,15 @@ -import * as Devtools from './SvelteHotkeysDevtools' -import * as plugin from './plugin' +import * as Devtools from './SvelteHotkeysDevtools.js' +import * as plugin from './plugin.js' -export const HotkeysDevtoolsPanel = +export const HotkeysDevtoolsPanel: typeof Devtools.HotkeysDevtoolsPanel = process.env.NODE_ENV !== 'development' ? Devtools.HotkeysDevtoolsPanelNoOp : Devtools.HotkeysDevtoolsPanel -export const hotkeysDevtoolsPlugin = +export const hotkeysDevtoolsPlugin: typeof plugin.hotkeysDevtoolsPlugin = process.env.NODE_ENV !== 'development' ? plugin.hotkeysDevtoolsNoOpPlugin : plugin.hotkeysDevtoolsPlugin -export type { HotkeysDevtoolsSvelteInit } from './SvelteHotkeysDevtools' +export type { HotkeysDevtoolsSvelteInit } from './SvelteHotkeysDevtools.js' +export type { HotkeysDevtoolsSveltePlugin } from './plugin.js' diff --git a/packages/svelte-hotkeys-devtools/src/plugin.ts b/packages/svelte-hotkeys-devtools/src/plugin.ts index 88f1082a..91849a7b 100644 --- a/packages/svelte-hotkeys-devtools/src/plugin.ts +++ b/packages/svelte-hotkeys-devtools/src/plugin.ts @@ -1,9 +1,26 @@ import { createSveltePlugin } from '@tanstack/devtools-utils/svelte' -import { HotkeysDevtoolsPanel } from './SvelteHotkeysDevtools' +import { HotkeysDevtoolsPanel } from './SvelteHotkeysDevtools.js' +import type { Component } from 'svelte' +import type { HotkeysDevtoolsSvelteInit } from './SvelteHotkeysDevtools.js' -const [hotkeysDevtoolsPlugin, hotkeysDevtoolsNoOpPlugin] = createSveltePlugin({ +/** A plugin for `TanStackDevtools` from `@tanstack/svelte-devtools`. */ +export interface HotkeysDevtoolsSveltePlugin { + name: string + id?: string + defaultOpen?: boolean + component: Component + props: HotkeysDevtoolsSvelteInit | undefined +} + +type HotkeysDevtoolsPluginFactory = ( + props?: HotkeysDevtoolsSvelteInit, +) => HotkeysDevtoolsSveltePlugin + +const plugins = createSveltePlugin({ name: 'TanStack Hotkeys', Component: HotkeysDevtoolsPanel, }) -export { hotkeysDevtoolsPlugin, hotkeysDevtoolsNoOpPlugin } +export const hotkeysDevtoolsPlugin: HotkeysDevtoolsPluginFactory = plugins[0] +export const hotkeysDevtoolsNoOpPlugin: HotkeysDevtoolsPluginFactory = + plugins[1] diff --git a/packages/svelte-hotkeys-devtools/src/production.ts b/packages/svelte-hotkeys-devtools/src/production.ts index 1ad67dd6..59ca21f7 100644 --- a/packages/svelte-hotkeys-devtools/src/production.ts +++ b/packages/svelte-hotkeys-devtools/src/production.ts @@ -1,3 +1,4 @@ -export { HotkeysDevtoolsPanel } from './SvelteHotkeysDevtools' -export { hotkeysDevtoolsPlugin } from './plugin' -export type { HotkeysDevtoolsSvelteInit } from './SvelteHotkeysDevtools' +export { HotkeysDevtoolsPanel } from './SvelteHotkeysDevtools.js' +export { hotkeysDevtoolsPlugin } from './plugin.js' +export type { HotkeysDevtoolsSvelteInit } from './SvelteHotkeysDevtools.js' +export type { HotkeysDevtoolsSveltePlugin } from './plugin.js' diff --git a/packages/svelte-hotkeys/package.json b/packages/svelte-hotkeys/package.json index b1a3d734..93e21377 100644 --- a/packages/svelte-hotkeys/package.json +++ b/packages/svelte-hotkeys/package.json @@ -60,7 +60,7 @@ "svelte": "^5.57.1" }, "peerDependencies": { - "svelte": "^5.25.0" + "svelte": "^5.40.0" }, "engines": { "node": ">=20" diff --git a/packages/svelte-hotkeys/src/HotkeysCtx.ts b/packages/svelte-hotkeys/src/HotkeysCtx.ts index 6cc9a313..875a6aab 100644 --- a/packages/svelte-hotkeys/src/HotkeysCtx.ts +++ b/packages/svelte-hotkeys/src/HotkeysCtx.ts @@ -4,7 +4,7 @@ import { getHotkeysProviderScopeKey, mergeHotkeysProviderDefaults, } from '@tanstack/hotkeys/adapter' -import { activateScopeWhileMounted } from './internal.svelte' +import { activateScopeWhileMounted } from './internal.svelte.js' import type { AppHotkeys, CustomHotkeys, @@ -12,7 +12,7 @@ import type { HotkeySequenceRecorderOptions, } from '@tanstack/hotkeys' import type { HotkeysProviderScopeProps } from '@tanstack/hotkeys/adapter' -import type { CreateHotkeyCommonOptions } from './createHotkey.svelte' +import type { CreateHotkeyCommonOptions } from './createHotkey.svelte.js' import type { Snippet } from 'svelte' export interface HotkeysProviderOptions { diff --git a/packages/svelte-hotkeys/src/HotkeysProvider.svelte b/packages/svelte-hotkeys/src/HotkeysProvider.svelte index 3ef37fa0..e39aba14 100644 --- a/packages/svelte-hotkeys/src/HotkeysProvider.svelte +++ b/packages/svelte-hotkeys/src/HotkeysProvider.svelte @@ -1,7 +1,7 @@