import {
getActiveTab,
cycleTreemapAxis,
cycleTreemapMetric,
setTreemapLevels,
} from "/static/selection.js";
export const DEFAULT_KEYMAP = [
{
keys: ["{", "}"],
when: "treemap",
allowShift: true,
description: "Size by: previous / next metric",
run: (e) => cycleTreemapMetric(e.key === "}" ? 1 : -1),
},
{
keys: ["[", "]"],
when: "treemap",
allowShift: true,
description: "Bucket by: previous / next axis",
run: (e) => cycleTreemapAxis(e.key === "]" ? 1 : -1),
},
{
keys: ["1", "2", "3", "4", "5", "6", "7", "8", "9"],
when: "treemap",
description: "Set treemap depth (Levels)",
run: (e) => setTreemapLevels(e.key),
},
];
function isTypingTarget(t) {
return (
t &&
(t.tagName === "INPUT" ||
t.tagName === "TEXTAREA" ||
t.tagName === "SELECT" ||
t.isContentEditable)
);
}
export function installShortcuts(keymap = DEFAULT_KEYMAP) {
const onKey = (e) => {
if (e.metaKey || e.ctrlKey || e.altKey) return;
if (isTypingTarget(e.target)) return;
const tab = getActiveTab();
for (const b of keymap) {
if (b.when && b.when !== tab) continue;
if (!b.keys.includes(e.key)) continue;
if (e.shiftKey && !b.allowShift) continue;
b.run(e);
e.preventDefault();
return;
}
};
document.addEventListener("keydown", onKey);
return () => document.removeEventListener("keydown", onKey);
}