This commit is contained in:
2026-07-11 13:35:38 -07:00
parent 3b666611c6
commit a5284f679e
+37 -20
View File
@@ -116,18 +116,21 @@
].filter((layout) => layout.chars.length > 0);
}
function setGematriaInputValue(nextValue) {
function setGematriaInputValue(nextValue, options = {}) {
const { inputEl } = getElements();
if (!(inputEl instanceof HTMLTextAreaElement)) {
return;
}
const shouldFocus = options?.focus !== false;
inputEl.value = String(nextValue || "");
inputEl.dispatchEvent(new Event("input", { bubbles: true }));
inputEl.focus({ preventScroll: true });
if (shouldFocus) {
inputEl.focus({ preventScroll: true });
}
}
function insertGematriaText(insertValue) {
function insertGematriaText(insertValue, options = {}) {
const { inputEl } = getElements();
if (!(inputEl instanceof HTMLTextAreaElement)) {
return;
@@ -138,23 +141,29 @@
return;
}
const start = Number.isFinite(inputEl.selectionStart) ? inputEl.selectionStart : inputEl.value.length;
const end = Number.isFinite(inputEl.selectionEnd) ? inputEl.selectionEnd : start;
const isInputFocused = document.activeElement === inputEl;
const useSelection = options?.preserveSelection !== false && isInputFocused;
const start = useSelection && Number.isFinite(inputEl.selectionStart) ? inputEl.selectionStart : inputEl.value.length;
const end = useSelection && Number.isFinite(inputEl.selectionEnd) ? inputEl.selectionEnd : start;
const nextValue = `${inputEl.value.slice(0, start)}${text}${inputEl.value.slice(end)}`;
setGematriaInputValue(nextValue);
setGematriaInputValue(nextValue, { focus: options?.focus });
const nextCaret = start + text.length;
inputEl.setSelectionRange(nextCaret, nextCaret);
if (useSelection) {
inputEl.setSelectionRange(nextCaret, nextCaret);
}
}
function backspaceGematriaText() {
function backspaceGematriaText(options = {}) {
const { inputEl } = getElements();
if (!(inputEl instanceof HTMLTextAreaElement)) {
return;
}
const start = Number.isFinite(inputEl.selectionStart) ? inputEl.selectionStart : inputEl.value.length;
const end = Number.isFinite(inputEl.selectionEnd) ? inputEl.selectionEnd : start;
const isInputFocused = document.activeElement === inputEl;
const useSelection = options?.preserveSelection !== false && isInputFocused;
const start = useSelection && Number.isFinite(inputEl.selectionStart) ? inputEl.selectionStart : inputEl.value.length;
const end = useSelection && Number.isFinite(inputEl.selectionEnd) ? inputEl.selectionEnd : start;
if (start === 0 && end === 0) {
return;
}
@@ -166,8 +175,10 @@
}
const nextValue = `${inputEl.value.slice(0, nextStart)}${inputEl.value.slice(nextEnd)}`;
setGematriaInputValue(nextValue);
inputEl.setSelectionRange(nextStart, nextStart);
setGematriaInputValue(nextValue, { focus: options?.focus });
if (useSelection) {
inputEl.setSelectionRange(nextStart, nextStart);
}
}
function renderKeyboardLayout() {
@@ -209,34 +220,34 @@
keyboardGridEl.setAttribute("lang", state.keyboardScriptId);
}
function handleKeyboardAction(action) {
function handleKeyboardAction(action, options = {}) {
const normalizedAction = String(action || "").trim().toLowerCase();
if (!normalizedAction) {
return;
}
if (normalizedAction === "backspace") {
backspaceGematriaText();
backspaceGematriaText(options);
return;
}
if (normalizedAction === "space") {
insertGematriaText(" ");
insertGematriaText(" ", options);
return;
}
if (normalizedAction === "star") {
insertGematriaText("*");
insertGematriaText("*", options);
return;
}
if (normalizedAction === "question") {
insertGematriaText("?");
insertGematriaText("?", options);
return;
}
if (normalizedAction === "clear") {
setGematriaInputValue("");
setGematriaInputValue("", { focus: options?.focus });
}
}
@@ -1345,7 +1356,10 @@
return;
}
insertGematriaText(String(keyButton.dataset.keyboardInsert || ""));
insertGematriaText(String(keyButton.dataset.keyboardInsert || ""), {
focus: false,
preserveSelection: false
});
});
keyboardActionsEl?.addEventListener("click", (event) => {
@@ -1359,7 +1373,10 @@
return;
}
handleKeyboardAction(actionButton.dataset.keyboardAction);
handleKeyboardAction(actionButton.dataset.keyboardAction, {
focus: false,
preserveSelection: false
});
});
state.listenersBound = true;