]> source.dussan.org Git - gitea.git/commitdiff
Add "dir=auto" for input/textarea elements by default (#26735)
authorwxiaoguang <wxiaoguang@gmail.com>
Thu, 7 Sep 2023 08:00:20 +0000 (16:00 +0800)
committerGitHub <noreply@github.com>
Thu, 7 Sep 2023 08:00:20 +0000 (08:00 +0000)
Co-authored-by: silverwind <me@silverwind.io>
Co-authored-by: Giteabot <teabot@gitea.io>
web_src/css/base.css
web_src/js/index.js
web_src/js/modules/dirauto.js [new file with mode: 0644]

index 9f42610641aede023b2cfb1c9293b4522fae2f60..8542248d90c173e7eae111f573f5e44a94fb2443 100644 (file)
@@ -478,6 +478,7 @@ a.label,
 /* fix Fomantic's line-height cutting off "g" on Windows Chrome with Segoe UI */
 .ui.input > input {
   line-height: var(--line-height-default);
+  text-align: start; /* Override fomantic's `text-align: left` to make RTL work via HTML `dir="auto"` */
 }
 
 .ui.input.focus > input,
index 8bd219bbe15768550099b4c7b57f1fa315372ebe..7ae4b0c0c7ac26c6c868d3f6cfe56a446908580a 100644 (file)
@@ -84,9 +84,11 @@ import {onDomReady} from './utils/dom.js';
 import {initRepoIssueList} from './features/repo-issue-list.js';
 import {initCommonIssueListQuickGoto} from './features/common-issue-list.js';
 import {initRepoDiffCommitBranchesAndTags} from './features/repo-diff-commit.js';
+import {initDirAuto} from './modules/dirauto.js';
 
 // Init Gitea's Fomantic settings
 initGiteaFomantic();
+initDirAuto();
 
 onDomReady(() => {
   initGlobalCommon();
diff --git a/web_src/js/modules/dirauto.js b/web_src/js/modules/dirauto.js
new file mode 100644 (file)
index 0000000..91f71a5
--- /dev/null
@@ -0,0 +1,39 @@
+// for performance considerations, it only uses performant syntax
+
+function attachDirAuto(el) {
+  if (el.type !== 'hidden' &&
+      el.type !== 'checkbox' &&
+      el.type !== 'radio' &&
+      el.type !== 'range' &&
+      el.type !== 'color') {
+    el.dir = 'auto';
+  }
+}
+
+export function initDirAuto() {
+  const observer = new MutationObserver((mutationList) => {
+    const len = mutationList.length;
+    for (let i = 0; i < len; i++) {
+      const mutation = mutationList[i];
+      const len = mutation.addedNodes.length;
+      for (let i = 0; i < len; i++) {
+        const addedNode = mutation.addedNodes[i];
+        if (addedNode.nodeType !== Node.ELEMENT_NODE && addedNode.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) continue;
+        attachDirAuto(addedNode);
+        const children = addedNode.querySelectorAll('input, textarea');
+        const len = children.length;
+        for (let childIdx = 0; childIdx < len; childIdx++) {
+          attachDirAuto(children[childIdx]);
+        }
+      }
+    }
+  });
+
+  const docNodes = document.querySelectorAll('input, textarea');
+  const len = docNodes.length;
+  for (let i = 0; i < len; i++) {
+    attachDirAuto(docNodes[i]);
+  }
+
+  observer.observe(document, {subtree: true, childList: true});
+}