summaryrefslogtreecommitdiff
path: root/packages/frontend/src/scripts/focus.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/frontend/src/scripts/focus.ts')
-rw-r--r--packages/frontend/src/scripts/focus.ts80
1 files changed, 0 insertions, 80 deletions
diff --git a/packages/frontend/src/scripts/focus.ts b/packages/frontend/src/scripts/focus.ts
deleted file mode 100644
index 81278b17ea..0000000000
--- a/packages/frontend/src/scripts/focus.ts
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * SPDX-FileCopyrightText: syuilo and misskey-project
- * SPDX-License-Identifier: AGPL-3.0-only
- */
-
-import { getScrollPosition, getScrollContainer, getStickyBottom, getStickyTop } from '@@/js/scroll.js';
-import { getElementOrNull, getNodeOrNull } from '@/scripts/get-dom-node-or-null.js';
-
-type MaybeHTMLElement = EventTarget | Node | Element | HTMLElement;
-
-export const isFocusable = (input: MaybeHTMLElement | null | undefined): input is HTMLElement => {
- if (input == null || !(input instanceof HTMLElement)) return false;
-
- if (input.tabIndex < 0) return false;
- if ('disabled' in input && input.disabled === true) return false;
- if ('readonly' in input && input.readonly === true) return false;
-
- if (!input.ownerDocument.contains(input)) return false;
-
- const style = window.getComputedStyle(input);
- if (style.display === 'none') return false;
- if (style.visibility === 'hidden') return false;
- if (style.opacity === '0') return false;
- if (style.pointerEvents === 'none') return false;
-
- return true;
-};
-
-export const focusPrev = (input: MaybeHTMLElement | null | undefined, self = false, scroll = true) => {
- const element = self ? input : getElementOrNull(input)?.previousElementSibling;
- if (element == null) return;
- if (isFocusable(element)) {
- focusOrScroll(element, scroll);
- } else {
- focusPrev(element, false, scroll);
- }
-};
-
-export const focusNext = (input: MaybeHTMLElement | null | undefined, self = false, scroll = true) => {
- const element = self ? input : getElementOrNull(input)?.nextElementSibling;
- if (element == null) return;
- if (isFocusable(element)) {
- focusOrScroll(element, scroll);
- } else {
- focusNext(element, false, scroll);
- }
-};
-
-export const focusParent = (input: MaybeHTMLElement | null | undefined, self = false, scroll = true) => {
- const element = self ? input : getNodeOrNull(input)?.parentElement;
- if (element == null) return;
- if (isFocusable(element)) {
- focusOrScroll(element, scroll);
- } else {
- focusParent(element, false, scroll);
- }
-};
-
-const focusOrScroll = (element: HTMLElement, scroll: boolean) => {
- if (scroll) {
- const scrollContainer = getScrollContainer(element) ?? document.documentElement;
- const scrollContainerTop = getScrollPosition(scrollContainer);
- const stickyTop = getStickyTop(element, scrollContainer);
- const stickyBottom = getStickyBottom(element, scrollContainer);
- const top = element.getBoundingClientRect().top;
- const bottom = element.getBoundingClientRect().bottom;
-
- let scrollTo = scrollContainerTop;
- if (top < stickyTop) {
- scrollTo += top - stickyTop;
- } else if (bottom > window.innerHeight - stickyBottom) {
- scrollTo += bottom - window.innerHeight + stickyBottom;
- }
- scrollContainer.scrollTo({ top: scrollTo, behavior: 'instant' });
- }
-
- if (document.activeElement !== element) {
- element.focus({ preventScroll: true });
- }
-};