@taiga-ui/cdk 4.56.0 → 4.58.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/constants/version.d.ts +1 -1
- package/constants/version.js +1 -1
- package/esm2022/constants/version.mjs +2 -2
- package/esm2022/date-time/day.mjs +14 -2
- package/esm2022/observables/close-watcher.mjs +9 -5
- package/esm2022/utils/dom/get-element-obscurers.mjs +14 -22
- package/esm2022/utils/focus/blur-native-focused.mjs +9 -4
- package/esm2022/utils/focus/is-native-keyboard-focusable.mjs +7 -2
- package/esm2022/utils/focus/is-native-mouse-focusable.mjs +7 -2
- package/fesm2022/taiga-ui-cdk-constants.mjs +1 -1
- package/fesm2022/taiga-ui-cdk-constants.mjs.map +1 -1
- package/fesm2022/taiga-ui-cdk-date-time.mjs +13 -1
- package/fesm2022/taiga-ui-cdk-date-time.mjs.map +1 -1
- package/fesm2022/taiga-ui-cdk-observables.mjs +8 -4
- package/fesm2022/taiga-ui-cdk-observables.mjs.map +1 -1
- package/fesm2022/taiga-ui-cdk-utils-dom.mjs +14 -21
- package/fesm2022/taiga-ui-cdk-utils-dom.mjs.map +1 -1
- package/fesm2022/taiga-ui-cdk-utils-focus.mjs +6 -6
- package/fesm2022/taiga-ui-cdk-utils-focus.mjs.map +1 -1
- package/package.json +1 -1
- package/utils/dom/get-element-obscurers.d.ts +1 -1
- package/utils/focus/blur-native-focused.d.ts +6 -1
- package/utils/focus/is-native-keyboard-focusable.d.ts +6 -1
- package/utils/focus/is-native-mouse-focusable.d.ts +6 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"taiga-ui-cdk-utils-dom.mjs","sources":["../../../projects/cdk/utils/dom/contains-or-after.ts","../../../projects/cdk/utils/dom/element-checks.ts","../../../projects/cdk/utils/dom/event-checks.ts","../../../projects/cdk/utils/dom/get-actual-target.ts","../../../projects/cdk/utils/dom/get-clipboard-data-text.ts","../../../projects/cdk/utils/dom/get-document-or-shadow-root.ts","../../../projects/cdk/utils/dom/get-element-obscurers.ts","../../../projects/cdk/utils/dom/get-element-offset.ts","../../../projects/cdk/utils/dom/get-element-point.ts","../../../projects/cdk/utils/dom/get-selected-text.ts","../../../projects/cdk/utils/dom/inject-element.ts","../../../projects/cdk/utils/dom/is-current-target.ts","../../../projects/cdk/utils/dom/is-element-editable.ts","../../../projects/cdk/utils/dom/is-inside-iframe.ts","../../../projects/cdk/utils/dom/is-node-in.ts","../../../projects/cdk/utils/dom/point-to-client-rect.ts","../../../projects/cdk/utils/dom/retarget-boundary-crossing.ts","../../../projects/cdk/utils/dom/value.ts","../../../projects/cdk/utils/dom/value-binding.ts","../../../projects/cdk/utils/dom/taiga-ui-cdk-utils-dom.ts"],"sourcesContent":["export function tuiContainsOrAfter(current: Node, node: Node): boolean {\n try {\n return (\n current.contains(node) ||\n !!(node.compareDocumentPosition(current) & Node.DOCUMENT_POSITION_PRECEDING)\n );\n } catch {\n return false;\n }\n}\n","export function tuiIsInput(element: Element): element is HTMLInputElement {\n return element.matches('input');\n}\n\nexport function tuiIsTextarea(element: Element): element is HTMLTextAreaElement {\n return element.matches('textarea');\n}\n\nexport function tuiIsTextfield(\n element: Element,\n): element is HTMLInputElement | HTMLTextAreaElement {\n return tuiIsInput(element) || tuiIsTextarea(element);\n}\n\nexport function tuiIsElement(\n node?: Element | EventTarget | Node | null,\n): node is Element {\n return !!node && 'nodeType' in node && node.nodeType === Node.ELEMENT_NODE;\n}\n\nexport function tuiIsHTMLElement(node: unknown): node is HTMLElement {\n const defaultView = (node as Element | undefined)?.ownerDocument.defaultView;\n\n return !!node && !!defaultView && node instanceof defaultView.HTMLElement;\n}\n\nexport function tuiIsTextNode(node: Node): node is Text {\n return node.nodeType === Node.TEXT_NODE;\n}\n","export function tuiIsInputEvent(event: Event): event is InputEvent {\n return 'data' in event && 'inputType' in event;\n}\n","/**\n * Gets actual target from open Shadow DOM if event happened within it\n */\nexport function tuiGetActualTarget(event: Event): Node {\n return event.composedPath()[0] as Node;\n}\n","const DEFAULT_FORMAT = 'text/plain';\n\n/**\n * Gets text from data of clipboardEvent, it also works in IE and Edge browsers\n */\nexport function tuiGetClipboardDataText(\n event: ClipboardEvent,\n format: string = DEFAULT_FORMAT,\n): string {\n return 'clipboardData' in event && event.clipboardData !== null\n ? event.clipboardData.getData(format) ||\n event.clipboardData.getData(DEFAULT_FORMAT)\n : (event as any).target.ownerDocument.defaultView.clipboardData.getData('text');\n}\n","export function tuiGetDocumentOrShadowRoot(node: Node): DocumentOrShadowRoot {\n return 'getRootNode' in node && node.isConnected\n ? (node.getRootNode() as Document)\n : (node.ownerDocument as DocumentOrShadowRoot);\n}\n","import {tuiClamp} from '@taiga-ui/cdk/utils/math';\nimport {tuiIsPresent} from '@taiga-ui/cdk/utils/miscellaneous';\n\nimport {tuiGetDocumentOrShadowRoot} from './get-document-or-shadow-root';\n\n/**\n * Returns array of Elements covering edges of given element or null if at least one edge middle point is visible\n *\n * CAUTION: Empty array means element if offscreen i.e. covered by no elements, rather than not covered\n * ```ts\n * function tuiGetElementObscures(element: Element): readonly [Element, Element, Element, Element] | [] | null\n * ```\n */\nexport function tuiGetElementObscures(\n element: Element,\n): readonly [Element, Element, Element, Element] | [] | null {\n const {ownerDocument} = element;\n\n if (!ownerDocument?.defaultView || !element.getBoundingClientRect) {\n return null;\n }\n\n const {innerWidth, innerHeight} = ownerDocument.defaultView;\n const doc = tuiGetDocumentOrShadowRoot(element);\n const rect = element.getBoundingClientRect();\n\n if (rect.width === 0 && rect.height === 0) {\n return null;\n }\n\n const left = tuiClamp(Math.round(rect.left) + 2, 0, innerWidth);\n const top = tuiClamp(Math.round(rect.top) + 2, 0, innerHeight);\n const right = tuiClamp(Math.round(rect.right) - 2, 0, innerWidth);\n const bottom = tuiClamp(Math.round(rect.bottom) - 2, 0, innerHeight);\n const horizontalMiddle = tuiClamp(\n Math.round(rect.left + rect.width / 2),\n 0,\n innerWidth,\n );\n const verticalMiddle = tuiClamp(\n Math.round(rect.top + rect.height / 2),\n 0,\n innerHeight,\n );\n const elements = [\n doc.elementFromPoint(horizontalMiddle, top),\n doc.elementFromPoint(horizontalMiddle, bottom),\n doc.elementFromPoint(left, verticalMiddle),\n doc.elementFromPoint(right, verticalMiddle),\n ];\n const nonNull = elements.filter(tuiIsPresent);\n\n if (!nonNull.length) {\n return [];\n }\n\n const filtered = nonNull.filter(\n (el) => !element.contains(el) && !el.contains(element),\n );\n\n return filtered.length === 4\n ? (filtered as [Element, Element, Element, Element])\n : null;\n}\n","/// <reference types=\"@taiga-ui/tsconfig/ng-dev-mode\" />\n\nimport {tuiIsHTMLElement} from './element-checks';\n\n/**\n * Calculates offset for an element relative to it's parent several levels above\n *\n * @param host parent element\n * @param element\n * @return object with offsetTop and offsetLeft number properties\n */\nexport function tuiGetElementOffset(\n host: Element,\n element: HTMLElement,\n): {offsetLeft: number; offsetTop: number} {\n ngDevMode && console.assert(host.contains(element), 'Host must contain element');\n\n let {offsetTop, offsetLeft, offsetParent} = element;\n\n while (tuiIsHTMLElement(offsetParent) && offsetParent !== host) {\n offsetTop += offsetParent.offsetTop;\n offsetLeft += offsetParent.offsetLeft;\n offsetParent = offsetParent.offsetParent;\n }\n\n return {offsetTop, offsetLeft};\n}\n","import {tuiClamp} from '@taiga-ui/cdk/utils/math';\nimport {type TuiPoint} from '@taiga-ui/core/types';\n\nexport function tuiGetElementPoint(x: number, y: number, element: HTMLElement): TuiPoint {\n const {left, top, width, height} = element.getBoundingClientRect();\n\n return [tuiClamp(x - left, 0, width) / width, tuiClamp(y - top, 0, height) / height];\n}\n","import {tuiIsTextfield} from './element-checks';\n\n/**\n * @description:\n * cross browser way to get selected text\n *\n * History:\n * BUG - window.getSelection() fails when text selected in a form field\n * https://bugzilla.mozilla.org/show_bug.cgi?id=85686\n */\nexport function tuiGetSelectedText({getSelection, document}: Window): string | null {\n return document.activeElement && tuiIsTextfield(document.activeElement)\n ? document.activeElement.value.slice(\n document.activeElement.selectionStart || 0,\n document.activeElement.selectionEnd || 0,\n )\n : getSelection()?.toString() || null;\n}\n","import {ElementRef, inject} from '@angular/core';\n\nexport function tuiInjectElement<T = HTMLElement>(): T {\n return inject(ElementRef).nativeElement;\n}\n","export function tuiIsCurrentTarget({target, currentTarget}: Event): boolean {\n return target === currentTarget;\n}\n","import {tuiIsTextfield} from './element-checks';\n\nexport function tuiIsElementEditable(element: HTMLElement): boolean {\n return (\n (tuiIsTextfield(element) && !element.readOnly && element.inputMode !== 'none') ||\n Boolean(element.isContentEditable as unknown as string)\n );\n}\n","/**\n * Checks if an app is running inside <iframe /> tag\n */\nexport function tuiIsInsideIframe(win: Window): boolean {\n return win.parent !== win;\n}\n","import {tuiIsElement, tuiIsTextNode} from './element-checks';\n\n/**\n * Checks if node is inside a specific selector\n *\n * @param node\n * @param selector\n * @return true if node is inside a particular selector\n */\nexport function tuiIsNodeIn(node: Node, selector: string): boolean {\n return tuiIsTextNode(node)\n ? !!node.parentElement?.closest(selector)\n : tuiIsElement(node) && !!node.closest(selector);\n}\n","export function tuiPointToClientRect(x = 0, y = 0): DOMRect {\n const rect = {\n x,\n y,\n left: x,\n right: x,\n top: y,\n bottom: y,\n width: 0,\n height: 0,\n } as const;\n\n return {\n ...rect,\n toJSON: () => rect,\n };\n}\n","export function tuiRetargetedBoundaryCrossing(event: Event): boolean {\n // firefox\n if ('explicitOriginalTarget' in event) {\n return event?.explicitOriginalTarget !== event.target;\n }\n\n // chrome\n if ('pointerId' in event) {\n return event.pointerId === -1;\n }\n\n // safari\n if ('detail' in event && 'webkitForce' in event) {\n return event?.detail === 0;\n }\n\n return false;\n}\n","import {coerceElement} from '@angular/cdk/coercion';\nimport {isPlatformBrowser} from '@angular/common';\nimport {\n DestroyRef,\n effect,\n type ElementRef,\n inject,\n INJECTOR,\n isSignal,\n PLATFORM_ID,\n type Signal,\n signal,\n untracked,\n type WritableSignal,\n} from '@angular/core';\nimport {WA_WINDOW} from '@ng-web-apis/common';\nimport {TUI_ALLOW_SIGNAL_WRITES} from '@taiga-ui/cdk/constants';\n\ntype WithValue = HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n\nexport function tuiValue(\n input:\n | ElementRef<WithValue>\n | Signal<ElementRef<WithValue> | undefined>\n | Signal<WithValue | undefined>\n | WithValue,\n injector = inject(INJECTOR),\n): WritableSignal<string> {\n const win = injector.get<any>(WA_WINDOW);\n\n if (!win.tuiInputPatched && isPlatformBrowser(injector.get(PLATFORM_ID))) {\n win.tuiInputPatched = true;\n\n patch(win.HTMLInputElement.prototype);\n patch(win.HTMLTextAreaElement.prototype);\n patch(win.HTMLSelectElement.prototype);\n }\n\n let element = isSignal(input) ? undefined : coerceElement(input);\n let cleanup = (): void => {};\n\n const options = {injector, ...TUI_ALLOW_SIGNAL_WRITES};\n const value = signal(element?.value || '');\n const process = (el: WithValue): (() => void) => {\n const update = (): void => untracked(() => value.set(el.value));\n\n el.addEventListener('input', update, {capture: true});\n el.addEventListener('tui-input', update, {capture: true});\n\n return (): void => {\n el.removeEventListener('input', update, {capture: true});\n el.removeEventListener('tui-input', update, {capture: true});\n };\n };\n\n injector.get(DestroyRef).onDestroy(() => cleanup());\n\n if (isSignal(input)) {\n effect(() => {\n element = coerceElement(input());\n cleanup();\n\n if (element && !element.matches('select[multiple]')) {\n value.set(element.value);\n cleanup = process(element);\n }\n }, options);\n } else if (element && !element.matches('select[multiple]')) {\n cleanup = process(element);\n }\n\n effect(() => {\n const v = value();\n\n /**\n * select[multiple] elements have value of first selected option,\n * but there could be more, setting value resets other selected options\n */\n if (element?.matches('select[multiple]')) {\n return;\n }\n\n if (element?.matches(':focus') && 'selectionStart' in element) {\n const {selectionStart, selectionEnd} = element;\n\n /**\n * After programmatic updates of input's value, caret is automatically placed at the end –\n * revert to the previous position\n */\n element.value = v;\n element.setSelectionRange(selectionStart, selectionEnd);\n } else if (element) {\n element.value = v;\n }\n }, options);\n\n return value;\n}\n\nfunction patch(prototype: WithValue): void {\n const {set} = Object.getOwnPropertyDescriptor(prototype, 'value')!;\n\n Object.defineProperty(prototype, 'value', {\n set(this: WithValue, detail: string) {\n const value = this.value;\n const event = new CustomEvent('tui-input', {detail, bubbles: true});\n\n set!.call(this, detail);\n\n if (value !== detail) {\n this.dispatchEvent(event);\n }\n },\n });\n}\n","import {effect, type Signal, signal, type WritableSignal} from '@angular/core';\n\nimport {tuiInjectElement} from './inject-element';\n\nexport function tuiValueBinding(value?: WritableSignal<string>): WritableSignal<string>;\nexport function tuiValueBinding(value?: Signal<string>): Signal<string>;\n\n/**\n * Host binding `host: {'[value]': 'yourSignal()'}` is not an option for our textfields –\n * they use {@link TuiTextfieldDirective} as a host directive.\n * `TuiTextfieldDirective` has host binding which depends on native input's value.\n * Host bindings of the host directives are re-calculated BEFORE component's ones –\n * native input's value should be updated SYNCHRONOUSLY before next change detection iteration.\n * @deprecated\n */\nexport function tuiValueBinding(\n value: Signal<string> = signal(tuiInjectElement<HTMLInputElement>().value || ''),\n): Signal<string> {\n const el = tuiInjectElement<HTMLInputElement>();\n\n effect(() => {\n if (el.value === value()) {\n return;\n }\n\n const {selectionStart, selectionEnd} = el;\n\n el.value = value();\n\n if (el.matches(':focus')) {\n /**\n * After programmatic updates of input's value, caret is automatically placed at the end –\n * revert to the previous position\n */\n el.setSelectionRange(selectionStart, selectionEnd);\n }\n });\n\n return value;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"taiga-ui-cdk-utils-dom.mjs","sources":["../../../projects/cdk/utils/dom/contains-or-after.ts","../../../projects/cdk/utils/dom/element-checks.ts","../../../projects/cdk/utils/dom/event-checks.ts","../../../projects/cdk/utils/dom/get-actual-target.ts","../../../projects/cdk/utils/dom/get-clipboard-data-text.ts","../../../projects/cdk/utils/dom/get-document-or-shadow-root.ts","../../../projects/cdk/utils/dom/get-element-obscurers.ts","../../../projects/cdk/utils/dom/get-element-offset.ts","../../../projects/cdk/utils/dom/get-element-point.ts","../../../projects/cdk/utils/dom/get-selected-text.ts","../../../projects/cdk/utils/dom/inject-element.ts","../../../projects/cdk/utils/dom/is-current-target.ts","../../../projects/cdk/utils/dom/is-element-editable.ts","../../../projects/cdk/utils/dom/is-inside-iframe.ts","../../../projects/cdk/utils/dom/is-node-in.ts","../../../projects/cdk/utils/dom/point-to-client-rect.ts","../../../projects/cdk/utils/dom/retarget-boundary-crossing.ts","../../../projects/cdk/utils/dom/value.ts","../../../projects/cdk/utils/dom/value-binding.ts","../../../projects/cdk/utils/dom/taiga-ui-cdk-utils-dom.ts"],"sourcesContent":["export function tuiContainsOrAfter(current: Node, node: Node): boolean {\n try {\n return (\n current.contains(node) ||\n !!(node.compareDocumentPosition(current) & Node.DOCUMENT_POSITION_PRECEDING)\n );\n } catch {\n return false;\n }\n}\n","export function tuiIsInput(element: Element): element is HTMLInputElement {\n return element.matches('input');\n}\n\nexport function tuiIsTextarea(element: Element): element is HTMLTextAreaElement {\n return element.matches('textarea');\n}\n\nexport function tuiIsTextfield(\n element: Element,\n): element is HTMLInputElement | HTMLTextAreaElement {\n return tuiIsInput(element) || tuiIsTextarea(element);\n}\n\nexport function tuiIsElement(\n node?: Element | EventTarget | Node | null,\n): node is Element {\n return !!node && 'nodeType' in node && node.nodeType === Node.ELEMENT_NODE;\n}\n\nexport function tuiIsHTMLElement(node: unknown): node is HTMLElement {\n const defaultView = (node as Element | undefined)?.ownerDocument.defaultView;\n\n return !!node && !!defaultView && node instanceof defaultView.HTMLElement;\n}\n\nexport function tuiIsTextNode(node: Node): node is Text {\n return node.nodeType === Node.TEXT_NODE;\n}\n","export function tuiIsInputEvent(event: Event): event is InputEvent {\n return 'data' in event && 'inputType' in event;\n}\n","/**\n * Gets actual target from open Shadow DOM if event happened within it\n */\nexport function tuiGetActualTarget(event: Event): Node {\n return event.composedPath()[0] as Node;\n}\n","const DEFAULT_FORMAT = 'text/plain';\n\n/**\n * Gets text from data of clipboardEvent, it also works in IE and Edge browsers\n */\nexport function tuiGetClipboardDataText(\n event: ClipboardEvent,\n format: string = DEFAULT_FORMAT,\n): string {\n return 'clipboardData' in event && event.clipboardData !== null\n ? event.clipboardData.getData(format) ||\n event.clipboardData.getData(DEFAULT_FORMAT)\n : (event as any).target.ownerDocument.defaultView.clipboardData.getData('text');\n}\n","export function tuiGetDocumentOrShadowRoot(node: Node): DocumentOrShadowRoot {\n return 'getRootNode' in node && node.isConnected\n ? (node.getRootNode() as Document)\n : (node.ownerDocument as DocumentOrShadowRoot);\n}\n","import {tuiIsPresent} from '@taiga-ui/cdk/utils/miscellaneous';\n\nimport {tuiGetDocumentOrShadowRoot} from './get-document-or-shadow-root';\n\n/**\n * Returns array of Elements covering edges of given element or null if at least one edge middle point is visible\n *\n * CAUTION: Empty array means element if offscreen i.e. covered by no elements, rather than not covered\n * ```ts\n * function tuiGetElementObscures(element: Element): readonly [Element, Element, Element, Element] | [] | null\n * ```\n */\nexport function tuiGetElementObscures(element: Element): readonly Element[] | null {\n if (!element.getBoundingClientRect) {\n return null;\n }\n\n const {left, right, top, bottom, width, height} = element.getBoundingClientRect();\n\n if (width === 0 && height === 0) {\n return null;\n }\n\n const doc = tuiGetDocumentOrShadowRoot(element);\n const horizontalMiddle = Math.round(left + width / 2);\n const verticalMiddle = Math.round(top + height / 2);\n const elements = [\n doc.elementFromPoint(horizontalMiddle, Math.round(top) + 2),\n doc.elementFromPoint(horizontalMiddle, Math.round(bottom) - 2),\n doc.elementFromPoint(Math.round(left) + 2, verticalMiddle),\n doc.elementFromPoint(Math.round(right) - 2, verticalMiddle),\n ].filter(tuiIsPresent);\n\n if (!elements.length) {\n return [];\n }\n\n const filtered = elements.filter(\n (el) => !element.contains(el) && !el.contains(element),\n );\n\n return filtered.length === 4\n ? (filtered as [Element, Element, Element, Element])\n : null;\n}\n","/// <reference types=\"@taiga-ui/tsconfig/ng-dev-mode\" />\n\nimport {tuiIsHTMLElement} from './element-checks';\n\n/**\n * Calculates offset for an element relative to it's parent several levels above\n *\n * @param host parent element\n * @param element\n * @return object with offsetTop and offsetLeft number properties\n */\nexport function tuiGetElementOffset(\n host: Element,\n element: HTMLElement,\n): {offsetLeft: number; offsetTop: number} {\n ngDevMode && console.assert(host.contains(element), 'Host must contain element');\n\n let {offsetTop, offsetLeft, offsetParent} = element;\n\n while (tuiIsHTMLElement(offsetParent) && offsetParent !== host) {\n offsetTop += offsetParent.offsetTop;\n offsetLeft += offsetParent.offsetLeft;\n offsetParent = offsetParent.offsetParent;\n }\n\n return {offsetTop, offsetLeft};\n}\n","import {tuiClamp} from '@taiga-ui/cdk/utils/math';\nimport {type TuiPoint} from '@taiga-ui/core/types';\n\nexport function tuiGetElementPoint(x: number, y: number, element: HTMLElement): TuiPoint {\n const {left, top, width, height} = element.getBoundingClientRect();\n\n return [tuiClamp(x - left, 0, width) / width, tuiClamp(y - top, 0, height) / height];\n}\n","import {tuiIsTextfield} from './element-checks';\n\n/**\n * @description:\n * cross browser way to get selected text\n *\n * History:\n * BUG - window.getSelection() fails when text selected in a form field\n * https://bugzilla.mozilla.org/show_bug.cgi?id=85686\n */\nexport function tuiGetSelectedText({getSelection, document}: Window): string | null {\n return document.activeElement && tuiIsTextfield(document.activeElement)\n ? document.activeElement.value.slice(\n document.activeElement.selectionStart || 0,\n document.activeElement.selectionEnd || 0,\n )\n : getSelection()?.toString() || null;\n}\n","import {ElementRef, inject} from '@angular/core';\n\nexport function tuiInjectElement<T = HTMLElement>(): T {\n return inject(ElementRef).nativeElement;\n}\n","export function tuiIsCurrentTarget({target, currentTarget}: Event): boolean {\n return target === currentTarget;\n}\n","import {tuiIsTextfield} from './element-checks';\n\nexport function tuiIsElementEditable(element: HTMLElement): boolean {\n return (\n (tuiIsTextfield(element) && !element.readOnly && element.inputMode !== 'none') ||\n Boolean(element.isContentEditable as unknown as string)\n );\n}\n","/**\n * Checks if an app is running inside <iframe /> tag\n */\nexport function tuiIsInsideIframe(win: Window): boolean {\n return win.parent !== win;\n}\n","import {tuiIsElement, tuiIsTextNode} from './element-checks';\n\n/**\n * Checks if node is inside a specific selector\n *\n * @param node\n * @param selector\n * @return true if node is inside a particular selector\n */\nexport function tuiIsNodeIn(node: Node, selector: string): boolean {\n return tuiIsTextNode(node)\n ? !!node.parentElement?.closest(selector)\n : tuiIsElement(node) && !!node.closest(selector);\n}\n","export function tuiPointToClientRect(x = 0, y = 0): DOMRect {\n const rect = {\n x,\n y,\n left: x,\n right: x,\n top: y,\n bottom: y,\n width: 0,\n height: 0,\n } as const;\n\n return {\n ...rect,\n toJSON: () => rect,\n };\n}\n","export function tuiRetargetedBoundaryCrossing(event: Event): boolean {\n // firefox\n if ('explicitOriginalTarget' in event) {\n return event?.explicitOriginalTarget !== event.target;\n }\n\n // chrome\n if ('pointerId' in event) {\n return event.pointerId === -1;\n }\n\n // safari\n if ('detail' in event && 'webkitForce' in event) {\n return event?.detail === 0;\n }\n\n return false;\n}\n","import {coerceElement} from '@angular/cdk/coercion';\nimport {isPlatformBrowser} from '@angular/common';\nimport {\n DestroyRef,\n effect,\n type ElementRef,\n inject,\n INJECTOR,\n isSignal,\n PLATFORM_ID,\n type Signal,\n signal,\n untracked,\n type WritableSignal,\n} from '@angular/core';\nimport {WA_WINDOW} from '@ng-web-apis/common';\nimport {TUI_ALLOW_SIGNAL_WRITES} from '@taiga-ui/cdk/constants';\n\ntype WithValue = HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n\nexport function tuiValue(\n input:\n | ElementRef<WithValue>\n | Signal<ElementRef<WithValue> | undefined>\n | Signal<WithValue | undefined>\n | WithValue,\n injector = inject(INJECTOR),\n): WritableSignal<string> {\n const win = injector.get<any>(WA_WINDOW);\n\n if (!win.tuiInputPatched && isPlatformBrowser(injector.get(PLATFORM_ID))) {\n win.tuiInputPatched = true;\n\n patch(win.HTMLInputElement.prototype);\n patch(win.HTMLTextAreaElement.prototype);\n patch(win.HTMLSelectElement.prototype);\n }\n\n let element = isSignal(input) ? undefined : coerceElement(input);\n let cleanup = (): void => {};\n\n const options = {injector, ...TUI_ALLOW_SIGNAL_WRITES};\n const value = signal(element?.value || '');\n const process = (el: WithValue): (() => void) => {\n const update = (): void => untracked(() => value.set(el.value));\n\n el.addEventListener('input', update, {capture: true});\n el.addEventListener('tui-input', update, {capture: true});\n\n return (): void => {\n el.removeEventListener('input', update, {capture: true});\n el.removeEventListener('tui-input', update, {capture: true});\n };\n };\n\n injector.get(DestroyRef).onDestroy(() => cleanup());\n\n if (isSignal(input)) {\n effect(() => {\n element = coerceElement(input());\n cleanup();\n\n if (element && !element.matches('select[multiple]')) {\n value.set(element.value);\n cleanup = process(element);\n }\n }, options);\n } else if (element && !element.matches('select[multiple]')) {\n cleanup = process(element);\n }\n\n effect(() => {\n const v = value();\n\n /**\n * select[multiple] elements have value of first selected option,\n * but there could be more, setting value resets other selected options\n */\n if (element?.matches('select[multiple]')) {\n return;\n }\n\n if (element?.matches(':focus') && 'selectionStart' in element) {\n const {selectionStart, selectionEnd} = element;\n\n /**\n * After programmatic updates of input's value, caret is automatically placed at the end –\n * revert to the previous position\n */\n element.value = v;\n element.setSelectionRange(selectionStart, selectionEnd);\n } else if (element) {\n element.value = v;\n }\n }, options);\n\n return value;\n}\n\nfunction patch(prototype: WithValue): void {\n const {set} = Object.getOwnPropertyDescriptor(prototype, 'value')!;\n\n Object.defineProperty(prototype, 'value', {\n set(this: WithValue, detail: string) {\n const value = this.value;\n const event = new CustomEvent('tui-input', {detail, bubbles: true});\n\n set!.call(this, detail);\n\n if (value !== detail) {\n this.dispatchEvent(event);\n }\n },\n });\n}\n","import {effect, type Signal, signal, type WritableSignal} from '@angular/core';\n\nimport {tuiInjectElement} from './inject-element';\n\nexport function tuiValueBinding(value?: WritableSignal<string>): WritableSignal<string>;\nexport function tuiValueBinding(value?: Signal<string>): Signal<string>;\n\n/**\n * Host binding `host: {'[value]': 'yourSignal()'}` is not an option for our textfields –\n * they use {@link TuiTextfieldDirective} as a host directive.\n * `TuiTextfieldDirective` has host binding which depends on native input's value.\n * Host bindings of the host directives are re-calculated BEFORE component's ones –\n * native input's value should be updated SYNCHRONOUSLY before next change detection iteration.\n * @deprecated\n */\nexport function tuiValueBinding(\n value: Signal<string> = signal(tuiInjectElement<HTMLInputElement>().value || ''),\n): Signal<string> {\n const el = tuiInjectElement<HTMLInputElement>();\n\n effect(() => {\n if (el.value === value()) {\n return;\n }\n\n const {selectionStart, selectionEnd} = el;\n\n el.value = value();\n\n if (el.matches(':focus')) {\n /**\n * After programmatic updates of input's value, caret is automatically placed at the end –\n * revert to the previous position\n */\n el.setSelectionRange(selectionStart, selectionEnd);\n }\n });\n\n return value;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -23,7 +23,7 @@ function tuiGetFocused({ activeElement }) {
|
|
|
23
23
|
/**
|
|
24
24
|
* Finds and blurs current active element, including shadow DOM
|
|
25
25
|
*/
|
|
26
|
-
function
|
|
26
|
+
function tuiBlurFocused(doc) {
|
|
27
27
|
const activeElement = tuiGetFocused(doc);
|
|
28
28
|
if (tuiIsHTMLElement(activeElement)) {
|
|
29
29
|
activeElement.blur();
|
|
@@ -40,7 +40,7 @@ function tuiFocusedIn(node) {
|
|
|
40
40
|
* be focused, for example element can have display: none applied to it or any other
|
|
41
41
|
* circumstances could prevent actual focus.
|
|
42
42
|
*/
|
|
43
|
-
function
|
|
43
|
+
function tuiIsKeyboardFocusable(element) {
|
|
44
44
|
if (element.hasAttribute('disabled') || element.getAttribute('tabIndex') === '-1') {
|
|
45
45
|
return false;
|
|
46
46
|
}
|
|
@@ -66,10 +66,10 @@ function tuiIsNativeKeyboardFocusable(element) {
|
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
68
|
|
|
69
|
-
function
|
|
69
|
+
function tuiIsMouseFocusable(element) {
|
|
70
70
|
return (!element.hasAttribute('disabled') &&
|
|
71
71
|
(element.getAttribute('tabIndex') === '-1' ||
|
|
72
|
-
|
|
72
|
+
tuiIsKeyboardFocusable(element)));
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
/**
|
|
@@ -80,7 +80,7 @@ function tuiGetClosestFocusable({ initial, root, previous = false, keyboard = tr
|
|
|
80
80
|
if (!root.ownerDocument) {
|
|
81
81
|
return null;
|
|
82
82
|
}
|
|
83
|
-
const check = keyboard ?
|
|
83
|
+
const check = keyboard ? tuiIsKeyboardFocusable : tuiIsMouseFocusable;
|
|
84
84
|
const treeWalker = root.ownerDocument.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, svgNodeFilter);
|
|
85
85
|
treeWalker.currentNode = initial;
|
|
86
86
|
do {
|
|
@@ -141,5 +141,5 @@ function tuiMoveFocus(currentIndex, elements, step) {
|
|
|
141
141
|
* Generated bundle index. Do not edit.
|
|
142
142
|
*/
|
|
143
143
|
|
|
144
|
-
export { tuiBlurNativeFocused, tuiFocusedIn, tuiGetClosestFocusable, tuiGetFocused, tuiGetFocused as tuiGetNativeFocused, tuiIsFocused, tuiIsFocusedIn, tuiIsFocused as tuiIsNativeFocused, tuiIsFocusedIn as tuiIsNativeFocusedIn, tuiIsNativeKeyboardFocusable, tuiIsNativeMouseFocusable, tuiMoveFocus };
|
|
144
|
+
export { tuiBlurFocused, tuiBlurFocused as tuiBlurNativeFocused, tuiFocusedIn, tuiGetClosestFocusable, tuiGetFocused, tuiGetFocused as tuiGetNativeFocused, tuiIsFocused, tuiIsFocusedIn, tuiIsKeyboardFocusable, tuiIsMouseFocusable, tuiIsFocused as tuiIsNativeFocused, tuiIsFocusedIn as tuiIsNativeFocusedIn, tuiIsKeyboardFocusable as tuiIsNativeKeyboardFocusable, tuiIsMouseFocusable as tuiIsNativeMouseFocusable, tuiMoveFocus };
|
|
145
145
|
//# sourceMappingURL=taiga-ui-cdk-utils-focus.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"taiga-ui-cdk-utils-focus.mjs","sources":["../../../projects/cdk/utils/focus/get-native-focused.ts","../../../projects/cdk/utils/focus/blur-native-focused.ts","../../../projects/cdk/utils/focus/focused-in.ts","../../../projects/cdk/utils/focus/is-native-keyboard-focusable.ts","../../../projects/cdk/utils/focus/is-native-mouse-focusable.ts","../../../projects/cdk/utils/focus/get-closest-focusable.ts","../../../projects/cdk/utils/focus/is-native-focused.ts","../../../projects/cdk/utils/focus/is-native-focused-in.ts","../../../projects/cdk/utils/focus/move-focus.ts","../../../projects/cdk/utils/focus/taiga-ui-cdk-utils-focus.ts"],"sourcesContent":["/**\n * Returns current active element, including shadow dom\n *\n * @return element or null\n */\nexport function tuiGetFocused({activeElement}: Document): Element | null {\n if (!activeElement?.shadowRoot) {\n return activeElement;\n }\n\n let element = activeElement.shadowRoot.activeElement;\n\n while (element?.shadowRoot) {\n element = element.shadowRoot.activeElement;\n }\n\n return element;\n}\n\nexport {\n /**\n * @deprecated use {@link tuiGetFocused}\n */\n tuiGetFocused as tuiGetNativeFocused,\n};\n","import {tuiIsHTMLElement} from '@taiga-ui/cdk/utils/dom';\n\nimport {tuiGetNativeFocused} from './get-native-focused';\n\n/**\n * Finds and blurs current active element, including shadow DOM\n */\nexport function tuiBlurNativeFocused(doc: Document): void {\n const activeElement = tuiGetNativeFocused(doc);\n\n if (tuiIsHTMLElement(activeElement)) {\n activeElement.blur();\n }\n}\n","import {type Signal} from '@angular/core';\nimport {toSignal} from '@angular/core/rxjs-interop';\nimport {TUI_FALSE_HANDLER, TUI_TRUE_HANDLER} from '@taiga-ui/cdk/constants';\nimport {tuiUntrackedScheduler} from '@taiga-ui/cdk/observables';\nimport {fromEvent, map, merge, observeOn} from 'rxjs';\n\nexport function tuiFocusedIn(node: Node): Signal<boolean> {\n return toSignal(\n merge(\n fromEvent(node, 'focus', {capture: true}).pipe(map(TUI_TRUE_HANDLER)),\n fromEvent(node, 'blur', {capture: true}).pipe(map(TUI_FALSE_HANDLER)),\n ).pipe(observeOn(tuiUntrackedScheduler)),\n {initialValue: false},\n );\n}\n","import {tuiIsHTMLElement} from '@taiga-ui/cdk/utils/dom';\n\n/**\n * Checks for signs that element can be focused with keyboard. tabIndex above 0 is ignored to\n * only target natural focus order. Not checking the possibility of an element to\n * be focused, for example element can have display: none applied to it or any other\n * circumstances could prevent actual focus.\n */\nexport function tuiIsNativeKeyboardFocusable(element: Element): boolean {\n if (element.hasAttribute('disabled') || element.getAttribute('tabIndex') === '-1') {\n return false;\n }\n\n if (\n (tuiIsHTMLElement(element) && element.isContentEditable) ||\n element.getAttribute('tabIndex') === '0'\n ) {\n return true;\n }\n\n switch (element.tagName) {\n case 'A':\n case 'LINK':\n return element.hasAttribute('href');\n case 'AUDIO':\n case 'VIDEO':\n return element.hasAttribute('controls');\n case 'BUTTON':\n case 'SELECT':\n case 'TEXTAREA':\n return true;\n case 'INPUT':\n return element.getAttribute('type') !== 'hidden';\n default:\n return false;\n }\n}\n","import {tuiIsNativeKeyboardFocusable} from './is-native-keyboard-focusable';\n\nexport function tuiIsNativeMouseFocusable(element: Element): boolean {\n return (\n !element.hasAttribute('disabled') &&\n (element.getAttribute('tabIndex') === '-1' ||\n tuiIsNativeKeyboardFocusable(element))\n );\n}\n","import {svgNodeFilter} from '@taiga-ui/cdk/constants';\nimport {tuiIsHTMLElement} from '@taiga-ui/cdk/utils/dom';\n\nimport {tuiIsNativeKeyboardFocusable} from './is-native-keyboard-focusable';\nimport {tuiIsNativeMouseFocusable} from './is-native-mouse-focusable';\n\nexport interface TuiGetClosestFocusableOptions {\n /**\n * @description:\n * current HTML element\n */\n initial: Element;\n\n /**\n * @description:\n * determine if only keyboard focus is of interest\n */\n keyboard?: boolean;\n\n /**\n * @description:\n * should it look backwards instead (find item that will be focused with Shift + Tab)\n */\n previous?: boolean;\n\n /**\n * @description:\n * top Node limiting the search area\n */\n root: Node;\n}\n\n/**\n * @description:\n * Finds the closest element that can be focused with a keyboard or mouse in theory\n */\nexport function tuiGetClosestFocusable({\n initial,\n root,\n previous = false,\n keyboard = true,\n}: TuiGetClosestFocusableOptions): HTMLElement | null {\n if (!root.ownerDocument) {\n return null;\n }\n\n const check = keyboard ? tuiIsNativeKeyboardFocusable : tuiIsNativeMouseFocusable;\n const treeWalker = root.ownerDocument.createTreeWalker(\n root,\n NodeFilter.SHOW_ELEMENT,\n svgNodeFilter,\n );\n\n treeWalker.currentNode = initial;\n\n do {\n if (tuiIsHTMLElement(treeWalker.currentNode)) {\n initial = treeWalker.currentNode;\n }\n\n if (tuiIsHTMLElement(initial) && check(initial)) {\n return initial;\n }\n } while (previous ? treeWalker.previousNode() : treeWalker.nextNode());\n\n return null;\n}\n","import {tuiGetNativeFocused} from './get-native-focused';\n\n/**\n * Checks if element is focused.\n *\n * Could return true even after blur since element remains focused if you switch away from a browser tab.\n *\n * @param node or null (as a common return value of DOM nodes walking)\n * @return true if focused\n */\nexport function tuiIsFocused(node?: Node | null): boolean {\n return (\n !!node?.ownerDocument &&\n tuiGetNativeFocused(node.ownerDocument) === node &&\n node.ownerDocument.hasFocus()\n );\n}\n\nexport {\n /**\n * @deprecated use {@link tuiIsFocused}\n */\n tuiIsFocused as tuiIsNativeFocused,\n};\n","import {tuiGetNativeFocused} from './get-native-focused';\n\n/**\n * Checks if focused element is within given element.\n *\n * @param node\n * @return true if focused node is contained within element\n */\nexport function tuiIsFocusedIn(node?: Node | null): boolean {\n const focused = node?.ownerDocument && tuiGetNativeFocused(node.ownerDocument);\n\n return !!focused && node.contains(focused) && node.ownerDocument?.hasFocus();\n}\n\nexport {\n /**\n * @deprecated use {@link tuiIsFocusedIn}\n */\n tuiIsFocusedIn as tuiIsNativeFocusedIn,\n};\n","import {tuiIsNativeFocused} from './is-native-focused';\n\n/**\n * Utility method for moving focus in a list of elements\n *\n * @param currentIndex currently focused index\n * @param elements array of focusable elements\n * @param step a step to move focus by, typically -1 or 1\n */\nexport function tuiMoveFocus(\n currentIndex: number,\n elements: readonly HTMLElement[],\n step: number,\n): void {\n currentIndex += step;\n\n while (currentIndex >= 0 && currentIndex < elements.length) {\n elements[currentIndex]?.focus();\n\n if (tuiIsNativeFocused(elements[currentIndex])) {\n return;\n }\n\n currentIndex += step;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["tuiGetNativeFocused","tuiIsNativeFocused"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"taiga-ui-cdk-utils-focus.mjs","sources":["../../../projects/cdk/utils/focus/get-native-focused.ts","../../../projects/cdk/utils/focus/blur-native-focused.ts","../../../projects/cdk/utils/focus/focused-in.ts","../../../projects/cdk/utils/focus/is-native-keyboard-focusable.ts","../../../projects/cdk/utils/focus/is-native-mouse-focusable.ts","../../../projects/cdk/utils/focus/get-closest-focusable.ts","../../../projects/cdk/utils/focus/is-native-focused.ts","../../../projects/cdk/utils/focus/is-native-focused-in.ts","../../../projects/cdk/utils/focus/move-focus.ts","../../../projects/cdk/utils/focus/taiga-ui-cdk-utils-focus.ts"],"sourcesContent":["/**\n * Returns current active element, including shadow dom\n *\n * @return element or null\n */\nexport function tuiGetFocused({activeElement}: Document): Element | null {\n if (!activeElement?.shadowRoot) {\n return activeElement;\n }\n\n let element = activeElement.shadowRoot.activeElement;\n\n while (element?.shadowRoot) {\n element = element.shadowRoot.activeElement;\n }\n\n return element;\n}\n\nexport {\n /**\n * @deprecated use {@link tuiGetFocused}\n */\n tuiGetFocused as tuiGetNativeFocused,\n};\n","import {tuiIsHTMLElement} from '@taiga-ui/cdk/utils/dom';\n\nimport {tuiGetFocused} from './get-native-focused';\n\n/**\n * Finds and blurs current active element, including shadow DOM\n */\nexport function tuiBlurFocused(doc: Document): void {\n const activeElement = tuiGetFocused(doc);\n\n if (tuiIsHTMLElement(activeElement)) {\n activeElement.blur();\n }\n}\n\nexport {\n /**\n * @deprecated use {@link tuiBlurFocused}\n */\n tuiBlurFocused as tuiBlurNativeFocused,\n};\n","import {type Signal} from '@angular/core';\nimport {toSignal} from '@angular/core/rxjs-interop';\nimport {TUI_FALSE_HANDLER, TUI_TRUE_HANDLER} from '@taiga-ui/cdk/constants';\nimport {tuiUntrackedScheduler} from '@taiga-ui/cdk/observables';\nimport {fromEvent, map, merge, observeOn} from 'rxjs';\n\nexport function tuiFocusedIn(node: Node): Signal<boolean> {\n return toSignal(\n merge(\n fromEvent(node, 'focus', {capture: true}).pipe(map(TUI_TRUE_HANDLER)),\n fromEvent(node, 'blur', {capture: true}).pipe(map(TUI_FALSE_HANDLER)),\n ).pipe(observeOn(tuiUntrackedScheduler)),\n {initialValue: false},\n );\n}\n","import {tuiIsHTMLElement} from '@taiga-ui/cdk/utils/dom';\n\n/**\n * Checks for signs that element can be focused with keyboard. tabIndex above 0 is ignored to\n * only target natural focus order. Not checking the possibility of an element to\n * be focused, for example element can have display: none applied to it or any other\n * circumstances could prevent actual focus.\n */\nexport function tuiIsKeyboardFocusable(element: Element): boolean {\n if (element.hasAttribute('disabled') || element.getAttribute('tabIndex') === '-1') {\n return false;\n }\n\n if (\n (tuiIsHTMLElement(element) && element.isContentEditable) ||\n element.getAttribute('tabIndex') === '0'\n ) {\n return true;\n }\n\n switch (element.tagName) {\n case 'A':\n case 'LINK':\n return element.hasAttribute('href');\n case 'AUDIO':\n case 'VIDEO':\n return element.hasAttribute('controls');\n case 'BUTTON':\n case 'SELECT':\n case 'TEXTAREA':\n return true;\n case 'INPUT':\n return element.getAttribute('type') !== 'hidden';\n default:\n return false;\n }\n}\n\nexport {\n /**\n * @deprecated use {@link tuiIsNativeKeyboardFocusable}\n */\n tuiIsKeyboardFocusable as tuiIsNativeKeyboardFocusable,\n};\n","import {tuiIsNativeKeyboardFocusable} from './is-native-keyboard-focusable';\n\nexport function tuiIsMouseFocusable(element: Element): boolean {\n return (\n !element.hasAttribute('disabled') &&\n (element.getAttribute('tabIndex') === '-1' ||\n tuiIsNativeKeyboardFocusable(element))\n );\n}\n\nexport {\n /**\n * @deprecated use {@link tuiIsNativeMouseFocusable}\n */\n tuiIsMouseFocusable as tuiIsNativeMouseFocusable,\n};\n","import {svgNodeFilter} from '@taiga-ui/cdk/constants';\nimport {tuiIsHTMLElement} from '@taiga-ui/cdk/utils/dom';\n\nimport {tuiIsNativeKeyboardFocusable} from './is-native-keyboard-focusable';\nimport {tuiIsNativeMouseFocusable} from './is-native-mouse-focusable';\n\nexport interface TuiGetClosestFocusableOptions {\n /**\n * @description:\n * current HTML element\n */\n initial: Element;\n\n /**\n * @description:\n * determine if only keyboard focus is of interest\n */\n keyboard?: boolean;\n\n /**\n * @description:\n * should it look backwards instead (find item that will be focused with Shift + Tab)\n */\n previous?: boolean;\n\n /**\n * @description:\n * top Node limiting the search area\n */\n root: Node;\n}\n\n/**\n * @description:\n * Finds the closest element that can be focused with a keyboard or mouse in theory\n */\nexport function tuiGetClosestFocusable({\n initial,\n root,\n previous = false,\n keyboard = true,\n}: TuiGetClosestFocusableOptions): HTMLElement | null {\n if (!root.ownerDocument) {\n return null;\n }\n\n const check = keyboard ? tuiIsNativeKeyboardFocusable : tuiIsNativeMouseFocusable;\n const treeWalker = root.ownerDocument.createTreeWalker(\n root,\n NodeFilter.SHOW_ELEMENT,\n svgNodeFilter,\n );\n\n treeWalker.currentNode = initial;\n\n do {\n if (tuiIsHTMLElement(treeWalker.currentNode)) {\n initial = treeWalker.currentNode;\n }\n\n if (tuiIsHTMLElement(initial) && check(initial)) {\n return initial;\n }\n } while (previous ? treeWalker.previousNode() : treeWalker.nextNode());\n\n return null;\n}\n","import {tuiGetNativeFocused} from './get-native-focused';\n\n/**\n * Checks if element is focused.\n *\n * Could return true even after blur since element remains focused if you switch away from a browser tab.\n *\n * @param node or null (as a common return value of DOM nodes walking)\n * @return true if focused\n */\nexport function tuiIsFocused(node?: Node | null): boolean {\n return (\n !!node?.ownerDocument &&\n tuiGetNativeFocused(node.ownerDocument) === node &&\n node.ownerDocument.hasFocus()\n );\n}\n\nexport {\n /**\n * @deprecated use {@link tuiIsFocused}\n */\n tuiIsFocused as tuiIsNativeFocused,\n};\n","import {tuiGetNativeFocused} from './get-native-focused';\n\n/**\n * Checks if focused element is within given element.\n *\n * @param node\n * @return true if focused node is contained within element\n */\nexport function tuiIsFocusedIn(node?: Node | null): boolean {\n const focused = node?.ownerDocument && tuiGetNativeFocused(node.ownerDocument);\n\n return !!focused && node.contains(focused) && node.ownerDocument?.hasFocus();\n}\n\nexport {\n /**\n * @deprecated use {@link tuiIsFocusedIn}\n */\n tuiIsFocusedIn as tuiIsNativeFocusedIn,\n};\n","import {tuiIsNativeFocused} from './is-native-focused';\n\n/**\n * Utility method for moving focus in a list of elements\n *\n * @param currentIndex currently focused index\n * @param elements array of focusable elements\n * @param step a step to move focus by, typically -1 or 1\n */\nexport function tuiMoveFocus(\n currentIndex: number,\n elements: readonly HTMLElement[],\n step: number,\n): void {\n currentIndex += step;\n\n while (currentIndex >= 0 && currentIndex < elements.length) {\n elements[currentIndex]?.focus();\n\n if (tuiIsNativeFocused(elements[currentIndex])) {\n return;\n }\n\n currentIndex += step;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["tuiIsNativeKeyboardFocusable","tuiIsNativeMouseFocusable","tuiGetNativeFocused","tuiIsNativeFocused"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -6,4 +6,4 @@
|
|
|
6
6
|
* function tuiGetElementObscures(element: Element): readonly [Element, Element, Element, Element] | [] | null
|
|
7
7
|
* ```
|
|
8
8
|
*/
|
|
9
|
-
export declare function tuiGetElementObscures(element: Element): readonly
|
|
9
|
+
export declare function tuiGetElementObscures(element: Element): readonly Element[] | null;
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Finds and blurs current active element, including shadow DOM
|
|
3
3
|
*/
|
|
4
|
-
export declare function
|
|
4
|
+
export declare function tuiBlurFocused(doc: Document): void;
|
|
5
|
+
export {
|
|
6
|
+
/**
|
|
7
|
+
* @deprecated use {@link tuiBlurFocused}
|
|
8
|
+
*/
|
|
9
|
+
tuiBlurFocused as tuiBlurNativeFocused, };
|
|
@@ -4,4 +4,9 @@
|
|
|
4
4
|
* be focused, for example element can have display: none applied to it or any other
|
|
5
5
|
* circumstances could prevent actual focus.
|
|
6
6
|
*/
|
|
7
|
-
export declare function
|
|
7
|
+
export declare function tuiIsKeyboardFocusable(element: Element): boolean;
|
|
8
|
+
export {
|
|
9
|
+
/**
|
|
10
|
+
* @deprecated use {@link tuiIsNativeKeyboardFocusable}
|
|
11
|
+
*/
|
|
12
|
+
tuiIsKeyboardFocusable as tuiIsNativeKeyboardFocusable, };
|
|
@@ -1 +1,6 @@
|
|
|
1
|
-
export declare function
|
|
1
|
+
export declare function tuiIsMouseFocusable(element: Element): boolean;
|
|
2
|
+
export {
|
|
3
|
+
/**
|
|
4
|
+
* @deprecated use {@link tuiIsNativeMouseFocusable}
|
|
5
|
+
*/
|
|
6
|
+
tuiIsMouseFocusable as tuiIsNativeMouseFocusable, };
|