aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkj_sh6042026-05-31 15:33:03 -0400
committerkj_sh6042026-05-31 15:33:03 -0400
commit738de85c9b646ebd68b1677538581267cf1fb515 (patch)
treea40223af2b44b55b8ad285b7913f19706358c0a9
parent0695a460d680eb4a034efe83a0359ab34176b2ee (diff)
refactor: handle tab input
-rw-r--r--src/static/main.js37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/static/main.js b/src/static/main.js
index b35d7c0..43715d5 100644
--- a/src/static/main.js
+++ b/src/static/main.js
@@ -19,6 +19,7 @@ const MAX_STORAGE_BYTES = 25 * 1024 * 1024 * 1024;
const MAX_CONVERT_REQUEST_BYTES = 2048 * 1024 * 1024;
const LOCAL_IMAGE_TOKEN_PATTERN = /local-image:\/\/([a-zA-Z0-9-]+)/g;
const ALLOWED_IMAGE_EXT_PATTERN = /\.(png|jpe?g|gif|webp|svg)$/i;
+const TAB_SPACES = " ";
let snippetDetailsIsOpen = readPersistedBoolean(SNIPPET_DETAILS_OPEN_KEY, false);
function readPersistedState() {
@@ -748,8 +749,44 @@ async function handleConvertSubmit(event) {
}
}
+function handleMarkdownTabKeydown(event) {
+ if (!(markdownInput instanceof HTMLTextAreaElement)) {
+ return;
+ }
+
+ if (
+ event.key !== "Tab" ||
+ event.shiftKey ||
+ event.altKey ||
+ event.ctrlKey ||
+ event.metaKey ||
+ event.defaultPrevented
+ ) {
+ return;
+ }
+
+ event.preventDefault();
+
+ const selectionStart = markdownInput.selectionStart ?? 0;
+ const selectionEnd = markdownInput.selectionEnd ?? selectionStart;
+ markdownInput.value =
+ markdownInput.value.slice(0, selectionStart) +
+ TAB_SPACES +
+ markdownInput.value.slice(selectionEnd);
+
+ const caretPosition = selectionStart + TAB_SPACES.length;
+ markdownInput.selectionStart = caretPosition;
+ markdownInput.selectionEnd = caretPosition;
+
+ collectFormState();
+}
+
restoreFormState();
+if (markdownInput instanceof HTMLTextAreaElement) {
+ markdownInput.addEventListener("keydown", handleMarkdownTabKeydown);
+}
+
if (convertForm instanceof HTMLFormElement) {
convertForm.addEventListener("input", collectFormState);
convertForm.addEventListener("change", collectFormState);