{"_id":"@accelint/hotkey-manager","_rev":"11-8862aaf267856239100e0217686439d6","name":"@accelint/hotkey-manager","dist-tags":{"latest":"1.0.2"},"versions":{"0.1.0":{"name":"@accelint/hotkey-manager","version":"0.1.0","author":{"name":"https://hypergiant.com"},"license":"Apache-2.0","_id":"@accelint/hotkey-manager@0.1.0","maintainers":[{"name":"ray.knight-hypergiant","email":"ray.knight@hypergiant.com"},{"name":"hg-devsecops","email":"hg-devsecops@hypergiant.com"},{"name":"brandonjpierce","email":"brandonpierce91@gmail.com"},{"name":"bryan_hg","email":"bryan.kizer@hypergiant.com"},{"name":"isaac.kehle-hypergiant","email":"isaac.kehle@hypergiant.com"}],"homepage":"https://github.com/gohypergiant/standard-toolkit#readme","bugs":{"url":"https://github.com/gohypergiant/standard-toolkit/issues"},"dist":{"shasum":"f8ee3b81900d3f24316697fcd5ef2d640a803eee","tarball":"https://registry.npmjs.org/@accelint/hotkey-manager/-/hotkey-manager-0.1.0.tgz","fileCount":104,"integrity":"sha512-i7nRsf92hNL+oSzV86bQjWakhQHsujTJeDLpx4Dqr/rsuE6k88bYJbOiN8kyDocGdMzn313xxYZgq9m9ok4y8Q==","signatures":[{"sig":"MEUCIQDjMQWHnjnFnGg6ZxPGSeWZ2GSlQONnvXNR3O0pQ2evTAIgNA69oIScQQsYe+ej3Lf6HDuL97pCE3kfdzbLDDvtE+4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":116183},"type":"module","_from":"file:accelint-hotkey-manager-0.1.0.tgz","types":"./dist/index.d.ts","$schema":"https://json.schemastore.org/package","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"default":"./dist/index.js"},"./package.json":"./package.json"},"private":false,"scripts":{"dev":"pnpm tsc --watch","lint":"pnpm biome lint","test":"pnpm vitest --dir=src","bench":"pnpm vitest bench --run --dir src","build":"pnpm tsup","test:watch":"pnpm vitest --dir=src --watch"},"_npmUser":{"name":"brandonjpierce","email":"brandonpierce91@gmail.com"},"_resolved":"/tmp/25fefc9bec02b5360eb702303c8595d2/accelint-hotkey-manager-0.1.0.tgz","_integrity":"sha512-i7nRsf92hNL+oSzV86bQjWakhQHsujTJeDLpx4Dqr/rsuE6k88bYJbOiN8kyDocGdMzn313xxYZgq9m9ok4y8Q==","repository":{"url":"git+https://github.com/gohypergiant/standard-toolkit.git","type":"git"},"_npmVersion":"10.9.3","description":"A React-focused global hotkey system that prevents conflicts and manages keyboard shortcuts efficiently.","directories":{},"sideEffects":false,"_nodeVersion":"22.20.0","dependencies":{"immer":"^10.1.1","radashi":"^12.6.2","zustand":"^5.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.0","react":"^19.0.0","vitest":"^2.1.9","happy-dom":"^19.0.2","type-fest":"^4.41.0","typescript":"^5.8.3","@types/react":"^19.1.9","@accelint/core":"0.5.0","@testing-library/dom":"^10.4.1","@accelint/biome-config":"1.0.2","@testing-library/react":"^16.3.0","@accelint/vitest-config":"0.1.5","@testing-library/jest-dom":"^6.6.4","esbuild-fix-imports-plugin":"^1.0.23","@accelint/typescript-config":"0.1.4","vitest-broadcast-channel-mock":"^0.1.0"},"optionalDependencies":{"react":"^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hotkey-manager_0.1.0_1761862906983_0.21970640073244163","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@accelint/hotkey-manager","version":"0.1.1","author":{"name":"https://hypergiant.com"},"license":"Apache-2.0","_id":"@accelint/hotkey-manager@0.1.1","maintainers":[{"name":"ray.knight-hypergiant","email":"ray.knight@hypergiant.com"},{"name":"hg-devsecops","email":"hg-devsecops@hypergiant.com"},{"name":"brandonjpierce","email":"brandonpierce91@gmail.com"},{"name":"bryan_hg","email":"bryan.kizer@hypergiant.com"},{"name":"isaac.kehle-hypergiant","email":"isaac.kehle@hypergiant.com"}],"homepage":"https://github.com/gohypergiant/standard-toolkit#readme","bugs":{"url":"https://github.com/gohypergiant/standard-toolkit/issues"},"dist":{"shasum":"622f957a28fcac66305023ae857459cf263fb866","tarball":"https://registry.npmjs.org/@accelint/hotkey-manager/-/hotkey-manager-0.1.1.tgz","fileCount":86,"integrity":"sha512-01/ygLVclk2G7KJwPRiHaXaaDMrzkfFUrHdZyWuioDZ4rlfb/xBwTn0Efajap137n9lXgOnIrmNpgxTfFYWylA==","signatures":[{"sig":"MEQCICHKlisscBdlCtBFYgF26HRLpWAR41Pt1FiZD0A3eNdHAiAb/ytT2e4AV1JUSNXUmrL53fcwjWBHUR91OErYeNhg3w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":136594},"main":"./dist/index.js","type":"module","_from":"file:accelint-hotkey-manager-0.1.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","$schema":"https://json.schemastore.org/package","engines":{"node":">=22","pnpm":">=10"},"exports":{".":"./dist/index.js","./constants":"./dist/constants.js","./lib/is-mac":"./dist/lib/is-mac/index.js","./lib/held-id":"./dist/lib/held-id/index.js","./package.json":"./package.json","./enums/keycode":"./dist/enums/keycode.js","./lib/is-client":"./dist/lib/is-client/index.js","./lib/key-to-id":"./dist/lib/key-to-id/index.js","./types/held-id":"./dist/types/held-id/index.js","./lib/event-to-id":"./dist/lib/event-to-id/index.js","./types/hotkey-id":"./dist/types/hotkey-id/index.js","./types/key-option":"./dist/types/key-option/index.js","./lib/key-to-string":"./dist/lib/key-to-string/index.js","./types/hotkey-hook":"./dist/types/hotkey-hook/index.js","./lib/is-input-field":"./dist/lib/is-input-field/index.js","./stores/event-store":"./dist/stores/event-store/index.js","./types/hotkey-extra":"./dist/types/hotkey-extra/index.js","./actions/global-bind":"./dist/actions/global-bind/index.js","./lib/duplicate-check":"./dist/lib/duplicate-check/index.js","./stores/hotkey-store":"./dist/stores/hotkey-store/index.js","./types/hotkey-action":"./dist/types/hotkey-action/index.js","./types/hotkey-config":"./dist/types/hotkey-config/index.js","./types/hotkey-events":"./dist/types/hotkey-events/index.js","./types/hotkey-options":"./dist/types/hotkey-options/index.js","./actions/global-unbind":"./dist/actions/global-unbind/index.js","./types/key-combination":"./dist/types/key-combination/index.js","./types/non-empty-array":"./dist/types/non-empty-array/index.js","./types/cleanup-function":"./dist/types/cleanup-function/index.js","./actions/register-hotkey":"./dist/actions/register-hotkey/index.js","./actions/handle-on-key-up":"./dist/actions/handle-on-key-up/index.js","./types/key-combination-id":"./dist/types/key-combination-id/index.js","./actions/unregister-hotkey":"./dist/actions/unregister-hotkey/index.js","./actions/handle-on-key-down":"./dist/actions/handle-on-key-down/index.js"},"private":false,"scripts":{"dev":"pnpm tsc --watch","lint":"pnpm biome lint","test":"pnpm vitest --dir=src","bench":"pnpm vitest bench --run --dir src","build":"pnpm tsdown","test:watch":"pnpm vitest --dir=src --watch"},"_npmUser":{"name":"brandonjpierce","email":"brandonpierce91@gmail.com"},"_resolved":"/tmp/c2ec0ebada6561bdb62fd746bafed98c/accelint-hotkey-manager-0.1.1.tgz","_integrity":"sha512-01/ygLVclk2G7KJwPRiHaXaaDMrzkfFUrHdZyWuioDZ4rlfb/xBwTn0Efajap137n9lXgOnIrmNpgxTfFYWylA==","repository":{"url":"git+https://github.com/gohypergiant/standard-toolkit.git","type":"git"},"_npmVersion":"10.9.4","description":"A React-focused global hotkey system that prevents conflicts and manages keyboard shortcuts efficiently.","directories":{},"sideEffects":false,"_nodeVersion":"22.21.1","dependencies":{"immer":"^10.1.1","radashi":"^12.6.2","zustand":"^5.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.0.0","tsdown":"^0.17.2","vitest":"^4.0.8","happy-dom":"^19.0.2","type-fest":"^4.41.0","typescript":"^5.8.3","@types/react":"^19.1.9","@accelint/core":"0.5.1","@testing-library/dom":"^10.4.1","@accelint/biome-config":"1.0.2","@testing-library/react":"^16.3.0","@accelint/vitest-config":"0.1.5","@testing-library/jest-dom":"^6.6.4","@accelint/typescript-config":"0.1.4"},"optionalDependencies":{"react":"^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hotkey-manager_0.1.1_1765564491472_0.8767445736724153","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@accelint/hotkey-manager","version":"0.1.2","author":{"name":"https://hypergiant.com"},"license":"Apache-2.0","_id":"@accelint/hotkey-manager@0.1.2","maintainers":[{"name":"ray.knight-hypergiant","email":"ray.knight@hypergiant.com"},{"name":"hg-devsecops","email":"hg-devsecops@hypergiant.com"},{"name":"brandonjpierce","email":"brandonpierce91@gmail.com"},{"name":"bryan_hg","email":"bryan.kizer@hypergiant.com"},{"name":"isaac.kehle-hypergiant","email":"isaac.kehle@hypergiant.com"}],"homepage":"https://github.com/gohypergiant/standard-toolkit#readme","bugs":{"url":"https://github.com/gohypergiant/standard-toolkit/issues"},"dist":{"shasum":"f78bea2fa2359fe2f508e5931fc65e2b7b7e6f2c","tarball":"https://registry.npmjs.org/@accelint/hotkey-manager/-/hotkey-manager-0.1.2.tgz","fileCount":86,"integrity":"sha512-kzJuzCZ5F3UV0T/UqlZ7x6JY0AjaE909K1ZOZ9tVS+qTq3jX6pDEkR3aFVZULeBqLBuZGEGy/bCRyGvSh3VUzA==","signatures":[{"sig":"MEUCIDUCX6AoP1kZ3++HCcIQZroEG/nbXuz/fcmlY2eMQBJDAiEArv87nagjccRbLJNhjzlE6/3eb/OvIAqKq0wBItMttXg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":137002},"main":"./dist/index.js","type":"module","_from":"file:accelint-hotkey-manager-0.1.2.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","$schema":"https://json.schemastore.org/package","engines":{"node":">=22","pnpm":">=10"},"exports":{".":"./dist/index.js","./constants":"./dist/constants.js","./lib/is-mac":"./dist/lib/is-mac/index.js","./lib/held-id":"./dist/lib/held-id/index.js","./package.json":"./package.json","./enums/keycode":"./dist/enums/keycode.js","./lib/is-client":"./dist/lib/is-client/index.js","./lib/key-to-id":"./dist/lib/key-to-id/index.js","./types/held-id":"./dist/types/held-id/index.js","./lib/event-to-id":"./dist/lib/event-to-id/index.js","./types/hotkey-id":"./dist/types/hotkey-id/index.js","./types/key-option":"./dist/types/key-option/index.js","./lib/key-to-string":"./dist/lib/key-to-string/index.js","./types/hotkey-hook":"./dist/types/hotkey-hook/index.js","./lib/is-input-field":"./dist/lib/is-input-field/index.js","./stores/event-store":"./dist/stores/event-store/index.js","./types/hotkey-extra":"./dist/types/hotkey-extra/index.js","./actions/global-bind":"./dist/actions/global-bind/index.js","./lib/duplicate-check":"./dist/lib/duplicate-check/index.js","./stores/hotkey-store":"./dist/stores/hotkey-store/index.js","./types/hotkey-action":"./dist/types/hotkey-action/index.js","./types/hotkey-config":"./dist/types/hotkey-config/index.js","./types/hotkey-events":"./dist/types/hotkey-events/index.js","./types/hotkey-options":"./dist/types/hotkey-options/index.js","./actions/global-unbind":"./dist/actions/global-unbind/index.js","./types/key-combination":"./dist/types/key-combination/index.js","./types/non-empty-array":"./dist/types/non-empty-array/index.js","./types/cleanup-function":"./dist/types/cleanup-function/index.js","./actions/register-hotkey":"./dist/actions/register-hotkey/index.js","./actions/handle-on-key-up":"./dist/actions/handle-on-key-up/index.js","./types/key-combination-id":"./dist/types/key-combination-id/index.js","./actions/unregister-hotkey":"./dist/actions/unregister-hotkey/index.js","./actions/handle-on-key-down":"./dist/actions/handle-on-key-down/index.js"},"private":false,"scripts":{"dev":"pnpm tsc --watch","lint":"pnpm biome lint . --verbose","test":"pnpm vitest --dir=src","bench":"pnpm vitest bench --run --dir src","build":"pnpm tsdown","format":"pnpm biome format . --write --verbose","license":"pnpm zx ../../scripts/license.mjs","test:watch":"pnpm vitest --dir=src --watch","format:check":"pnpm biome format . --verbose"},"_npmUser":{"name":"brandonjpierce","email":"brandonpierce91@gmail.com"},"_resolved":"/tmp/a6f4ae62b3f9cea1a5ce9e4cd2add522/accelint-hotkey-manager-0.1.2.tgz","_integrity":"sha512-kzJuzCZ5F3UV0T/UqlZ7x6JY0AjaE909K1ZOZ9tVS+qTq3jX6pDEkR3aFVZULeBqLBuZGEGy/bCRyGvSh3VUzA==","repository":{"url":"git+https://github.com/gohypergiant/standard-toolkit.git","type":"git"},"_npmVersion":"11.6.2","description":"A React-focused global hotkey system that prevents conflicts and manages keyboard shortcuts efficiently.","directories":{},"sideEffects":false,"_nodeVersion":"24.12.0","dependencies":{"immer":"^10.1.1","radashi":"^12.6.2","zustand":"^5.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19","tsdown":"^0.18.0","vitest":"^4.0.15","happy-dom":"^20.0.11","type-fest":"^5.3.1","typescript":"^5.9.3","@types/react":"^19","@accelint/core":"0.5.2","@testing-library/dom":"^10.4.1","@accelint/biome-config":"1.0.2","@testing-library/react":"^16.3.0","@accelint/vitest-config":"0.1.6","@testing-library/jest-dom":"^6.9.1","@accelint/typescript-config":"0.1.4"},"peerDependencies":{"@accelint/core":"0.5.2"},"optionalDependencies":{"react":"^19"},"_npmOperationalInternal":{"tmp":"tmp/hotkey-manager_0.1.2_1766092875867_0.8768064915575624","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@accelint/hotkey-manager","version":"0.1.3","author":{"name":"https://hypergiant.com"},"license":"Apache-2.0","_id":"@accelint/hotkey-manager@0.1.3","maintainers":[{"name":"ray.knight-hypergiant","email":"ray.knight@hypergiant.com"},{"name":"hg-devsecops","email":"hg-devsecops@hypergiant.com"},{"name":"brandonjpierce","email":"brandonpierce91@gmail.com"},{"name":"bryan_hg","email":"bryan.kizer@hypergiant.com"},{"name":"isaac.kehle-hypergiant","email":"isaac.kehle@hypergiant.com"}],"homepage":"https://github.com/gohypergiant/standard-toolkit#readme","bugs":{"url":"https://github.com/gohypergiant/standard-toolkit/issues"},"dist":{"shasum":"bf966823b4fd1cf1e161ea23eabce020409a8dd6","tarball":"https://registry.npmjs.org/@accelint/hotkey-manager/-/hotkey-manager-0.1.3.tgz","fileCount":86,"integrity":"sha512-nwaS42Drlu6c3AYH24ieBywKVF3kRuf/GY84MRzBysOeac/XxwMxe7dpLoKb5BHoUSk2/b3NWRRBUcRlSCgNNA==","signatures":[{"sig":"MEQCIF17YxkZwO9/jCz+guHv8ezqurbkOCznDsouN1SccneJAiBrmApG3lhyf7wWeKnb4hR3mZHyylM6qxO3pk983XRQ7A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":137382},"main":"./dist/index.js","type":"module","_from":"file:accelint-hotkey-manager-0.1.3.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","$schema":"https://json.schemastore.org/package","engines":{"node":">=22","pnpm":">=10"},"exports":{".":"./dist/index.js","./constants":"./dist/constants.js","./lib/is-mac":"./dist/lib/is-mac/index.js","./lib/held-id":"./dist/lib/held-id/index.js","./package.json":"./package.json","./enums/keycode":"./dist/enums/keycode.js","./lib/is-client":"./dist/lib/is-client/index.js","./lib/key-to-id":"./dist/lib/key-to-id/index.js","./types/held-id":"./dist/types/held-id/index.js","./lib/event-to-id":"./dist/lib/event-to-id/index.js","./types/hotkey-id":"./dist/types/hotkey-id/index.js","./types/key-option":"./dist/types/key-option/index.js","./lib/key-to-string":"./dist/lib/key-to-string/index.js","./types/hotkey-hook":"./dist/types/hotkey-hook/index.js","./lib/is-input-field":"./dist/lib/is-input-field/index.js","./stores/event-store":"./dist/stores/event-store/index.js","./types/hotkey-extra":"./dist/types/hotkey-extra/index.js","./actions/global-bind":"./dist/actions/global-bind/index.js","./lib/duplicate-check":"./dist/lib/duplicate-check/index.js","./stores/hotkey-store":"./dist/stores/hotkey-store/index.js","./types/hotkey-action":"./dist/types/hotkey-action/index.js","./types/hotkey-config":"./dist/types/hotkey-config/index.js","./types/hotkey-events":"./dist/types/hotkey-events/index.js","./types/hotkey-options":"./dist/types/hotkey-options/index.js","./actions/global-unbind":"./dist/actions/global-unbind/index.js","./types/key-combination":"./dist/types/key-combination/index.js","./types/non-empty-array":"./dist/types/non-empty-array/index.js","./types/cleanup-function":"./dist/types/cleanup-function/index.js","./actions/register-hotkey":"./dist/actions/register-hotkey/index.js","./actions/handle-on-key-up":"./dist/actions/handle-on-key-up/index.js","./types/key-combination-id":"./dist/types/key-combination-id/index.js","./actions/unregister-hotkey":"./dist/actions/unregister-hotkey/index.js","./actions/handle-on-key-down":"./dist/actions/handle-on-key-down/index.js"},"private":false,"scripts":{"dev":"pnpm tsc --watch","lint":"pnpm biome lint . --verbose","test":"pnpm vitest --dir=src","bench":"pnpm vitest bench --run --dir src","build":"pnpm tsdown","format":"pnpm biome format . --write --verbose","license":"pnpm zx ../../scripts/license.mjs","test:watch":"pnpm vitest --dir=src --watch","format:check":"pnpm biome format . --verbose","lint:package":"pnpm publint"},"_npmUser":{"name":"brandonjpierce","email":"brandonpierce91@gmail.com"},"_resolved":"/tmp/174add024f1ba1574be3c4dbbc0c635e/accelint-hotkey-manager-0.1.3.tgz","_integrity":"sha512-nwaS42Drlu6c3AYH24ieBywKVF3kRuf/GY84MRzBysOeac/XxwMxe7dpLoKb5BHoUSk2/b3NWRRBUcRlSCgNNA==","repository":{"url":"git+https://github.com/gohypergiant/standard-toolkit.git","type":"git"},"_npmVersion":"11.6.2","description":"A React-focused global hotkey system that prevents conflicts and manages keyboard shortcuts efficiently.","directories":{},"sideEffects":false,"_nodeVersion":"24.12.0","dependencies":{"immer":"^10.1.1","radashi":"^12.6.2","zustand":"^5.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19","tsdown":"^0.18.0","vitest":"^4.0.15","happy-dom":"^20.0.11","type-fest":"^5.3.1","typescript":"^5.9.3","@types/react":"^19","@accelint/core":"0.5.2","@testing-library/dom":"^10.4.1","@accelint/biome-config":"1.0.2","@testing-library/react":"^16.3.0","@accelint/vitest-config":"0.1.6","@testing-library/jest-dom":"^6.9.1","@accelint/typescript-config":"0.1.4"},"peerDependencies":{"@accelint/core":"0.5.2"},"optionalDependencies":{"react":"^19"},"_npmOperationalInternal":{"tmp":"tmp/hotkey-manager_0.1.3_1766427449296_0.14535503005857864","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@accelint/hotkey-manager","version":"1.0.0","author":{"name":"https://hypergiant.com"},"license":"Apache-2.0","_id":"@accelint/hotkey-manager@1.0.0","maintainers":[{"name":"ray.knight-hypergiant","email":"ray.knight@hypergiant.com"},{"name":"hg-devsecops","email":"hg-devsecops@hypergiant.com"},{"name":"brandonjpierce","email":"brandonpierce91@gmail.com"},{"name":"bryan_hg","email":"bryan.kizer@hypergiant.com"},{"name":"jacob.foster.hg","email":"jacob.foster@hypergiant.com"},{"name":"isaac.kehle-hypergiant","email":"isaac.kehle@hypergiant.com"}],"homepage":"https://github.com/gohypergiant/standard-toolkit#readme","bugs":{"url":"https://github.com/gohypergiant/standard-toolkit/issues"},"dist":{"shasum":"7ea9b8aa0fbdb5a843e47043cbb435e7a4bc9702","tarball":"https://registry.npmjs.org/@accelint/hotkey-manager/-/hotkey-manager-1.0.0.tgz","fileCount":91,"integrity":"sha512-oyOMKfdKJPsOZOMn6MyXfguDsXT9EzQbYAnm5h9xh/dYR+5OU3In0w9S8bFtvCsElk/Vd/69po2jS+boECMoxg==","signatures":[{"sig":"MEYCIQDMi5q3hX3tYZGt6y3ef5J2+S8nMK1ZORr4TpUg1gCYEAIhAI7nL1btGl+xlh70/iLoUBs9F8b1PI2kvR1YkSTvIkR6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":144840},"main":"./dist/index.js","type":"module","_from":"file:accelint-hotkey-manager-1.0.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","$schema":"https://json.schemastore.org/package","engines":{"node":">=22","pnpm":">=10"},"exports":{".":"./dist/index.js","./react":"./dist/react/index.js","./constants":"./dist/constants.js","./lib/is-mac":"./dist/lib/is-mac/index.js","./lib/held-id":"./dist/lib/held-id/index.js","./package.json":"./package.json","./enums/keycode":"./dist/enums/keycode.js","./lib/is-client":"./dist/lib/is-client/index.js","./lib/key-to-id":"./dist/lib/key-to-id/index.js","./types/held-id":"./dist/types/held-id/index.js","./lib/event-to-id":"./dist/lib/event-to-id/index.js","./types/hotkey-id":"./dist/types/hotkey-id/index.js","./react/use-hotkey":"./dist/react/use-hotkey.js","./types/key-option":"./dist/types/key-option/index.js","./lib/key-to-string":"./dist/lib/key-to-string/index.js","./lib/is-input-field":"./dist/lib/is-input-field/index.js","./stores/event-store":"./dist/stores/event-store/index.js","./types/hotkey-extra":"./dist/types/hotkey-extra/index.js","./actions/global-bind":"./dist/actions/global-bind/index.js","./lib/duplicate-check":"./dist/lib/duplicate-check/index.js","./stores/hotkey-store":"./dist/stores/hotkey-store/index.js","./types/hotkey-action":"./dist/types/hotkey-action/index.js","./types/hotkey-config":"./dist/types/hotkey-config/index.js","./types/hotkey-events":"./dist/types/hotkey-events/index.js","./types/hotkey-manager":"./dist/types/hotkey-manager/index.js","./types/hotkey-options":"./dist/types/hotkey-options/index.js","./actions/global-unbind":"./dist/actions/global-unbind/index.js","./types/key-combination":"./dist/types/key-combination/index.js","./types/non-empty-array":"./dist/types/non-empty-array/index.js","./types/cleanup-function":"./dist/types/cleanup-function/index.js","./actions/register-hotkey":"./dist/actions/register-hotkey/index.js","./actions/handle-on-key-up":"./dist/actions/handle-on-key-up/index.js","./types/key-combination-id":"./dist/types/key-combination-id/index.js","./actions/unregister-hotkey":"./dist/actions/unregister-hotkey/index.js","./actions/handle-on-key-down":"./dist/actions/handle-on-key-down/index.js"},"private":false,"scripts":{"dev":"pnpm tsc --watch","lint":"pnpm biome lint . --verbose","test":"pnpm vitest --dir=src","bench":"pnpm vitest bench --run --dir src","build":"pnpm tsdown","format":"pnpm biome format . --write --verbose","license":"pnpm zx ../../scripts/license.mjs","test:watch":"pnpm vitest --dir=src --watch","format:check":"pnpm biome format . --verbose","lint:package":"pnpm publint"},"_npmUser":{"name":"brandonjpierce","email":"brandonpierce91@gmail.com"},"_resolved":"/tmp/d54632f7989534b2b24f800195fa6c62/accelint-hotkey-manager-1.0.0.tgz","_integrity":"sha512-oyOMKfdKJPsOZOMn6MyXfguDsXT9EzQbYAnm5h9xh/dYR+5OU3In0w9S8bFtvCsElk/Vd/69po2jS+boECMoxg==","repository":{"url":"git+https://github.com/gohypergiant/standard-toolkit.git","type":"git"},"_npmVersion":"11.6.2","description":"A React-focused global hotkey system that prevents conflicts and manages keyboard shortcuts efficiently.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"immer":"^10.1.1","radashi":"^12.6.2","zustand":"^5.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19","tsdown":"^0.18.0","vitest":"^4.0.15","happy-dom":"^20.0.11","type-fest":"^5.3.1","typescript":"^5.9.3","@types/react":"^19","@accelint/core":"0.5.2","@testing-library/dom":"^10.4.1","@accelint/biome-config":"1.1.0","@testing-library/react":"^16.3.0","@accelint/vitest-config":"0.1.6","@testing-library/jest-dom":"^6.9.1","@accelint/typescript-config":"0.1.4"},"peerDependencies":{"@accelint/core":"0.5.2"},"optionalDependencies":{"react":"^19"},"_npmOperationalInternal":{"tmp":"tmp/hotkey-manager_1.0.0_1769476314089_0.7242820681291293","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@accelint/hotkey-manager","version":"1.0.1","author":{"name":"https://hypergiant.com"},"license":"Apache-2.0","_id":"@accelint/hotkey-manager@1.0.1","maintainers":[{"name":"ray.knight-hypergiant","email":"ray.knight@hypergiant.com"},{"name":"hg-devsecops","email":"hg-devsecops@hypergiant.com"},{"name":"brandonjpierce","email":"brandonpierce91@gmail.com"},{"name":"bryan_hg","email":"bryan.kizer@hypergiant.com"},{"name":"jacob.foster.hg","email":"jacob.foster@hypergiant.com"},{"name":"isaac.kehle-hypergiant","email":"isaac.kehle@hypergiant.com"}],"homepage":"https://github.com/gohypergiant/standard-toolkit#readme","bugs":{"url":"https://github.com/gohypergiant/standard-toolkit/issues"},"dist":{"shasum":"c008ec7daae4ffaa2a0697f07c535392599973fd","tarball":"https://registry.npmjs.org/@accelint/hotkey-manager/-/hotkey-manager-1.0.1.tgz","fileCount":91,"integrity":"sha512-Qw03HDVcAD2fw/bs/1viD2Tlwp2tZSDTPoYq9OQEzdqRiptxk1x9J0wVkf31peHDuoiVJQ5P0j58+gKsSyvQYg==","signatures":[{"sig":"MEUCIF9iPRVusF51L5DXM2/i8vcD93Pq95rgKnqda6LrgXDuAiEAm/xS1gN1mIymNTyXjLGNBwfYmW4/nv7CAIfOmgzF+Qc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":146731},"main":"./dist/index.js","type":"module","_from":"file:accelint-hotkey-manager-1.0.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","$schema":"https://json.schemastore.org/package","engines":{"node":">=22","pnpm":">=10"},"exports":{".":"./dist/index.js","./react":"./dist/react/index.js","./constants":"./dist/constants.js","./lib/is-mac":"./dist/lib/is-mac/index.js","./lib/held-id":"./dist/lib/held-id/index.js","./package.json":"./package.json","./enums/keycode":"./dist/enums/keycode.js","./lib/is-client":"./dist/lib/is-client/index.js","./lib/key-to-id":"./dist/lib/key-to-id/index.js","./types/held-id":"./dist/types/held-id/index.js","./lib/event-to-id":"./dist/lib/event-to-id/index.js","./types/hotkey-id":"./dist/types/hotkey-id/index.js","./react/use-hotkey":"./dist/react/use-hotkey.js","./types/key-option":"./dist/types/key-option/index.js","./lib/key-to-string":"./dist/lib/key-to-string/index.js","./lib/is-input-field":"./dist/lib/is-input-field/index.js","./stores/event-store":"./dist/stores/event-store/index.js","./types/hotkey-extra":"./dist/types/hotkey-extra/index.js","./actions/global-bind":"./dist/actions/global-bind/index.js","./lib/duplicate-check":"./dist/lib/duplicate-check/index.js","./stores/hotkey-store":"./dist/stores/hotkey-store/index.js","./types/hotkey-action":"./dist/types/hotkey-action/index.js","./types/hotkey-config":"./dist/types/hotkey-config/index.js","./types/hotkey-events":"./dist/types/hotkey-events/index.js","./types/hotkey-manager":"./dist/types/hotkey-manager/index.js","./types/hotkey-options":"./dist/types/hotkey-options/index.js","./actions/global-unbind":"./dist/actions/global-unbind/index.js","./types/key-combination":"./dist/types/key-combination/index.js","./types/non-empty-array":"./dist/types/non-empty-array/index.js","./types/cleanup-function":"./dist/types/cleanup-function/index.js","./actions/register-hotkey":"./dist/actions/register-hotkey/index.js","./actions/handle-on-key-up":"./dist/actions/handle-on-key-up/index.js","./types/key-combination-id":"./dist/types/key-combination-id/index.js","./actions/unregister-hotkey":"./dist/actions/unregister-hotkey/index.js","./actions/handle-on-key-down":"./dist/actions/handle-on-key-down/index.js"},"private":false,"scripts":{"dev":"pnpm tsc --watch","lint":"pnpm biome lint . --verbose","test":"pnpm vitest --dir=src","bench":"pnpm vitest bench --run --dir src","build":"pnpm tsdown","format":"pnpm biome format . --write --verbose","license":"pnpm zx ../../scripts/license.mjs","test:watch":"pnpm vitest --dir=src --watch","format:check":"pnpm biome format . --verbose","lint:package":"pnpm publint"},"_npmUser":{"name":"brandonjpierce","email":"brandonpierce91@gmail.com"},"_resolved":"/tmp/5efd010d1d324ff0d2c1c970bb028314/accelint-hotkey-manager-1.0.1.tgz","_integrity":"sha512-Qw03HDVcAD2fw/bs/1viD2Tlwp2tZSDTPoYq9OQEzdqRiptxk1x9J0wVkf31peHDuoiVJQ5P0j58+gKsSyvQYg==","repository":{"url":"git+https://github.com/gohypergiant/standard-toolkit.git","type":"git"},"_npmVersion":"11.6.2","description":"A React-focused global hotkey system that prevents conflicts and manages keyboard shortcuts efficiently.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"immer":"^10.1.1","radashi":"^12.6.2","zustand":"^5.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19","tsdown":"^0.18.0","vitest":"^4.0.15","happy-dom":"^20.0.11","type-fest":"^5.3.1","typescript":"^5.9.3","@types/react":"^19","@accelint/core":"0.5.2","@testing-library/dom":"^10.4.1","@accelint/biome-config":"1.1.0","@testing-library/react":"^16.3.0","@accelint/vitest-config":"0.1.6","@testing-library/jest-dom":"^6.9.1","@accelint/typescript-config":"0.1.4"},"peerDependencies":{"@accelint/core":"0.5.2"},"optionalDependencies":{"react":"^19"},"_npmOperationalInternal":{"tmp":"tmp/hotkey-manager_1.0.1_1769573757416_0.6616528627941913","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@accelint/hotkey-manager","version":"1.0.2","author":{"name":"https://hypergiant.com"},"license":"Apache-2.0","_id":"@accelint/hotkey-manager@1.0.2","maintainers":[{"name":"ray.knight-hypergiant","email":"ray.knight@hypergiant.com"},{"name":"hg-devsecops","email":"hg-devsecops@hypergiant.com"},{"name":"brandonjpierce","email":"brandonpierce91@gmail.com"},{"name":"bryan_hg","email":"bryan.kizer@hypergiant.com"},{"name":"colin.leahy","email":"colin.leahy@hypergiant.com"},{"name":"jacob.foster.hg","email":"jacob.foster@hypergiant.com"},{"name":"isaac.kehle-hypergiant","email":"isaac.kehle@hypergiant.com"}],"homepage":"https://github.com/gohypergiant/standard-toolkit#readme","bugs":{"url":"https://github.com/gohypergiant/standard-toolkit/issues"},"dist":{"shasum":"e6d42ebd176ed007b9338d935d4575aa07120f56","tarball":"https://registry.npmjs.org/@accelint/hotkey-manager/-/hotkey-manager-1.0.2.tgz","fileCount":91,"integrity":"sha512-vUeGwDr7/D6/JPM1kC59vdzQfiVuO75fIwi+xEZEEiPSC/bHAU3zPsyrrIbMN6IAa0O1M3ErHFcCaoxbnX6dCA==","signatures":[{"sig":"MEQCIEzXSX1G4jk2zkOnJd1n7s0icA1Cw9BdFUd6F/9NxruZAiBgKKqeV+hkWVvpyjneSyhIAiYGIGNVj/QNpeo8c0Awxg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":165725},"main":"./dist/index.js","type":"module","_from":"file:accelint-hotkey-manager-1.0.2.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","$schema":"https://json.schemastore.org/package","engines":{"node":">=22","pnpm":">=10"},"exports":{".":"./dist/index.js","./react":"./dist/react/index.js","./constants":"./dist/constants.js","./lib/is-mac":"./dist/lib/is-mac/index.js","./lib/held-id":"./dist/lib/held-id/index.js","./package.json":"./package.json","./enums/keycode":"./dist/enums/keycode.js","./lib/is-client":"./dist/lib/is-client/index.js","./lib/key-to-id":"./dist/lib/key-to-id/index.js","./types/held-id":"./dist/types/held-id/index.js","./lib/event-to-id":"./dist/lib/event-to-id/index.js","./types/hotkey-id":"./dist/types/hotkey-id/index.js","./react/use-hotkey":"./dist/react/use-hotkey.js","./types/key-option":"./dist/types/key-option/index.js","./lib/key-to-string":"./dist/lib/key-to-string/index.js","./lib/is-input-field":"./dist/lib/is-input-field/index.js","./stores/event-store":"./dist/stores/event-store/index.js","./types/hotkey-extra":"./dist/types/hotkey-extra/index.js","./actions/global-bind":"./dist/actions/global-bind/index.js","./lib/duplicate-check":"./dist/lib/duplicate-check/index.js","./stores/hotkey-store":"./dist/stores/hotkey-store/index.js","./types/hotkey-action":"./dist/types/hotkey-action/index.js","./types/hotkey-config":"./dist/types/hotkey-config/index.js","./types/hotkey-events":"./dist/types/hotkey-events/index.js","./types/hotkey-manager":"./dist/types/hotkey-manager/index.js","./types/hotkey-options":"./dist/types/hotkey-options/index.js","./actions/global-unbind":"./dist/actions/global-unbind/index.js","./types/key-combination":"./dist/types/key-combination/index.js","./types/non-empty-array":"./dist/types/non-empty-array/index.js","./types/cleanup-function":"./dist/types/cleanup-function/index.js","./actions/register-hotkey":"./dist/actions/register-hotkey/index.js","./actions/handle-on-key-up":"./dist/actions/handle-on-key-up/index.js","./types/key-combination-id":"./dist/types/key-combination-id/index.js","./actions/unregister-hotkey":"./dist/actions/unregister-hotkey/index.js","./actions/handle-on-key-down":"./dist/actions/handle-on-key-down/index.js"},"private":false,"scripts":{"dev":"pnpm tsc --watch","lint":"pnpm biome lint . --verbose","test":"pnpm vitest --dir=src","bench":"pnpm vitest bench --run --dir src","build":"pnpm tsdown","format":"pnpm biome format . --write --verbose","license":"pnpm zx ../../scripts/license.mjs","test:watch":"pnpm vitest --dir=src --watch","format:check":"pnpm biome format . --verbose","lint:package":"pnpm publint"},"_npmUser":{"name":"hg-devsecops","email":"hg-devsecops@hypergiant.com"},"_resolved":"/tmp/ff79839210ccc84d569b5c91b9768037/accelint-hotkey-manager-1.0.2.tgz","_integrity":"sha512-vUeGwDr7/D6/JPM1kC59vdzQfiVuO75fIwi+xEZEEiPSC/bHAU3zPsyrrIbMN6IAa0O1M3ErHFcCaoxbnX6dCA==","repository":{"url":"git+https://github.com/gohypergiant/standard-toolkit.git","type":"git"},"_npmVersion":"11.9.0","description":"A React-focused global hotkey system that prevents conflicts and manages keyboard shortcuts efficiently.","directories":{},"sideEffects":false,"_nodeVersion":"24.14.0","dependencies":{"immer":"^10.1.1","radashi":"^12.6.2","zustand":"^5.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19","tsdown":"^0.18.0","vitest":"^4.0.15","happy-dom":"^20.0.11","type-fest":"^5.3.1","typescript":"^5.9.3","@types/react":"^19","@accelint/core":"0.6.0","@testing-library/dom":"^10.4.1","@accelint/biome-config":"1.1.0","@testing-library/react":"^16.3.0","@accelint/vitest-config":"0.1.6","@testing-library/jest-dom":"^6.9.1","@accelint/typescript-config":"0.1.4"},"peerDependencies":{"@accelint/core":"0.6.0"},"optionalDependencies":{"react":"^19"},"_npmOperationalInternal":{"tmp":"tmp/hotkey-manager_1.0.2_1772675404940_0.2772839614286493","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2025-10-30T22:21:46.862Z","modified":"2026-04-02T19:29:20.836Z","0.1.0":"2025-10-30T22:21:47.172Z","0.1.1":"2025-12-12T18:34:51.616Z","0.1.2":"2025-12-18T21:21:16.016Z","0.1.3":"2025-12-22T18:17:29.439Z","1.0.0":"2026-01-27T01:11:54.238Z","1.0.1":"2026-01-28T04:15:57.558Z","1.0.2":"2026-03-05T01:50:05.098Z"},"bugs":{"url":"https://github.com/gohypergiant/standard-toolkit/issues"},"author":{"name":"https://hypergiant.com"},"license":"Apache-2.0","homepage":"https://github.com/gohypergiant/standard-toolkit#readme","repository":{"url":"git+https://github.com/gohypergiant/standard-toolkit.git","type":"git"},"description":"A React-focused global hotkey system that prevents conflicts and manages keyboard shortcuts efficiently.","maintainers":[{"email":"hg-devsecops@hypergiant.com","name":"hg-devsecops"},{"email":"brandonpierce91@gmail.com","name":"brandonjpierce"},{"email":"bryan.kizer@hypergiant.com","name":"bryan_hg"},{"email":"colin.leahy@hypergiant.com","name":"colin.leahy"},{"email":"jacob.foster@hypergiant.com","name":"jacob.foster.hg"}],"readme":"# `@accelint/hotkey-manager`\n\nA React-focused global hotkey system that prevents conflicts and manages keyboard shortcuts efficiently.\n\n## Features\n\n- **Singleton Management:** Each hotkey is bound only once, regardless of how many components use it\n- **Automatic Cleanup:** Hotkeys are automatically removed when components unmount\n- **Conflict Prevention:** Ensures each keyboard shortcut triggers only one action\n- **Cross-Platform Support:** Adapts to both Windows and macOS keyboard conventions\n- **Input Field Safety:** Disables hotkeys when typing in forms and text fields\n- **SSR Compatible:** Works with Server-Side Rendering and React Server Components\n- **OS Hotkey Detection:** Identifies conflicts with system shortcuts *(Coming Soon)*\n\n## Quick Start\n\nThe hotkey manager works with React's component lifecycle. Hotkeys are bound when components mount and only unbound when all components using that hotkey unmount. This reference-counting approach means a hotkey remains active as long as at least one component needs it:\n\n```typescript\n// 1. Enable the hotkey bindings\n// src/apps/layout.tsx\nimport { globalBind } from '@accelint/hotkey-manager';\n\nglobalBind();\n```\n\n```typescript\n// 2. Register your hotkey and define what it does\n// src/hotkeys/toggle-grid.ts\nimport { registerHotkey, Keycode } from '@accelint/hotkey-manager';\nimport { gridStore } from '../stores/grid';\n\nexport const toggleGridManager = registerHotkey({\n  id: 'toggle-grid',\n  key: {\n    code: Keycode.KeyG\n  },\n  // Using onKeyUp is recommended for most simple actions\n  onKeyUp: () => gridStore().toggleVisibility(),\n});\n```\n\n```tsx\n// 3. Then use the hotkey in your component\n// src/layers/grid-layer.tsx\nimport { useHotkey } from '@accelint/hotkey-manager';\nimport { toggleGridManager } from '../hotkeys/toggle-grid';\n\nexport function GridLayer() {\n  // This activates the hotkey when the component mounts\n  // and deactivates it when unmounted\n  useHotkey(toggleGridManager);\n\n  // Rest of component code...\n}\n```\n\n## How to Use\n\n### Key Concept: Shared Hotkey Instances\n\nAn important feature of this library is that it maintains a single instance of each hotkey, even when multiple components use it. For example:\n\n- If `ComponentA` and `ComponentB` both use the same hotkey manager (like `toggleGridManager`)\n- The hotkey is bound when the first component mounts\n- It remains active even if one component unmounts\n- It's only fully unbound when all components using it unmount\n\nThis reference-counting system ensures efficient hotkey management and prevents duplicate listeners.\n\n### Step 1: Register Your Hotkey\n\nUse `registerHotkey` to create a reusable hotkey manager:\n\n```typescript\nimport { registerHotkey, Keycode } from '@accelint/hotkey-manager';\n\nexport const toggleTagsManager = registerHotkey({\n  id: 'toggle-tags',  // An identifier for this hotkey\n  key: {\n    code: Keycode.KeyT,  // The 'T' key\n    alt: true           // Must press Alt+T\n  },\n  onKeyUp: () => someAction()  // Function to run when key is released\n});\n```\n\n### Step 2: Use the Hotkey in Components\n\nUse `useHotkey` with your manager to automatically handle binding and unbinding:\n\n```tsx\nimport { useHotkey } from '@accelint/hotkey-manager';\nimport { toggleTagsManager } from '../hotkeys/toggle-tags';\n\nfunction TextLabelLayer() {\n  // This activates the Alt+T hotkey\n  useHotkey(toggleTagsManager);\n\n  return (\n    // DeckGL Layer...\n  );\n}\n```\n\n### Manual Control\n\nFor more control, `useHotkey` returns the manager with methods for manual binding:\n\n```tsx\nimport { useHotkey } from '@accelint/hotkey-manager';\nimport { toggleTagsManager } from '../hotkeys/toggle-tags';\n\nfunction ConditionalHotkeyComponent() {\n  const manager = useHotkey(toggleTagsManager);\n  const [isEnabled, setIsEnabled] = useState(false);\n\n  useEffect(() => {\n    if (isEnabled) {\n      manager.forceBind();\n    } else {\n      manager.forceUnbind();\n    }\n  }, [isEnabled, manager]);\n\n  return (\n    <div>\n      <button onClick={() => setIsEnabled(!isEnabled)}>\n        {isEnabled ? 'Disable' : 'Enable'} Hotkey\n      </button>\n    </div>\n  );\n}\n```\n\n## Key Combinations\n\n### Basic Keys\n\nThe `key` property defines what keyboard input triggers your hotkey. The `code` field is required and uses standard keyboard event codes (available in the `Keycode` enum).\n\n```typescript\n// Define a simple 'T' key hotkey\nkey: {\n  code: Keycode.KeyT\n}\n```\n\nUsing `code` instead of character values ensures consistency across keyboard layouts and languages.\n\n### Modifier Keys\n\nAdd modifiers to create key combinations:\n\n```typescript\n// Define Shift+T\nkey: {\n  code: Keycode.KeyT,\n  shift: true\n}\n\n// Define Alt+T\nkey: {\n  code: Keycode.KeyT,\n  alt: true\n}\n\n// Define Shift+Alt+T\nkey: {\n  code: Keycode.KeyT,\n  alt: true,\n  shift: true\n}\n```\n\nAvailable modifiers:\n- `shift`: The Shift key\n- `alt`: The Alt key (Option on macOS)\n- `ctrl`: The Control key\n- `meta`: The Windows key or Command (⌘) key on macOS\n\n### Multiple Key Bindings\n\nBind the same action to multiple keys by using an array:\n\n```typescript\nkey: [\n  { code: Keycode.KeyS, ctrl: true },  // Ctrl+S\n  { code: Keycode.F12 }                // F12\n]\n```\n\nYour action receives information about which key triggered it:\n\n```typescript\nonKeyDown: (event, key) => {\n  if (key.code === Keycode.KeyS) {\n    // Ctrl+S was pressed\n  } else if (key.code === Keycode.F12) {\n    // F12 was pressed\n  }\n}\n```\n\n### OS and Browser Conflicts\n\nBe cautious when using `ctrl` and `meta` key combinations, as many of these are reserved by operating systems and browsers. The hotkey manager will still attempt to handle these combinations, but the OS or browser may intercept them before your application receives the event. When possible, prefer combinations with `alt` or custom keys that don't conflict with system shortcuts.\n\n### Platform Adaptation\n\n#### Automatic macOS Conversion\n\nBy default, the library automatically converts Windows-style shortcuts to macOS conventions:\n- `ctrl+s` becomes `cmd+s` on macOS\n- `meta+s` becomes `ctrl+s` on macOS\n\nTo disable this behavior for a specific hotkey:\n\n```typescript\nkey: {\n  code: Keycode.KeyS,\n  ctrl: true,\n  autoMacStyle: false  // Keep as Ctrl+S on all platforms\n}\n```\n\n#### Custom Platform Shortcuts\n\nFor more control over platform differences:\n\n```typescript\nimport { registerHotkey, Keycode, isMac } from '@accelint/hotkey-manager';\n\nexport const platformSaveManager = registerHotkey({\n  id: 'platform-save',\n  key: isMac\n    ? { code: Keycode.KeyS, meta: true, autoMacStyle: false }  // Cmd+S on macOS\n    : { code: Keycode.KeyS, ctrl: true, autoMacStyle: false }, // Ctrl+S on other platforms\n  onKeyUp: () => someAction()\n});\n```\n\n## Actions\n\nYou can define up to three types of actions for each hotkey:\n\n1. `onKeyDown`: Triggered immediately when the key is pressed\n2. `onKeyHeld`: Triggered when the key is held down for a certain time\n3. `onKeyUp`: Triggered when the key is released\n\n> **Important Behavior:** By default, if both `onKeyHeld` and `onKeyUp` are defined for a hotkey and the held action is triggered, the `onKeyUp` action will not fire when the key is released. You can override this with the `alwaysTriggerKeyUp: true` option.\n\n> **Best Practice:** Use `onKeyUp` rather than `onKeyDown` for simple actions. This maintains UX consistency with `onKeyHeld` behavior, as most actions should happen either on long press or release, not on initial press.\n\n### Example with All Actions\n\n```typescript\nexport const zoomManager = registerHotkey({\n  id: 'zoom',\n  key: { code: Keycode.KeyZ },\n  // Triggered on initial press\n  onKeyDown: () => startZoom(),\n\n  // Triggered after holding for 1 second (default)\n  onKeyHeld: () => activateContinuousZoom(),\n\n  // Triggered on release (unless onKeyHeld fired)\n  onKeyUp: () => finishZoom(),\n\n  // Configure hold detection time (in milliseconds)\n  heldThresholdMs: 500,\n  // Also trigger onKeyUp even if onKeyHeld was triggered\n  alwaysTriggerKeyUp: true\n})\n```\n\n## Using in Libraries\n\nWhen including this package in a library:\n\n1. List `@accelint/hotkey-manager` as a peer dependency\n2. Allow users to customize your hotkey bindings\n3. Avoid hardcoding hotkeys that might conflict with common OS shortcuts\n\nThis ensures only one hotkey manager instance exists in the application, preventing conflicts between different libraries.\n","readmeFilename":"README.md"}