@wordpress/dom 4.57.0 → 5.1.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/README.md +23 -23
- package/build/data-transfer.cjs +20 -38
- package/build/data-transfer.cjs.map +1 -7
- package/build/dom/caret-range-from-point.cjs +31 -38
- package/build/dom/caret-range-from-point.cjs.map +1 -7
- package/build/dom/clean-node-list.cjs +88 -133
- package/build/dom/clean-node-list.cjs.map +1 -7
- package/build/dom/compute-caret-rect.cjs +36 -36
- package/build/dom/compute-caret-rect.cjs.map +1 -7
- package/build/dom/document-has-selection.cjs +36 -31
- package/build/dom/document-has-selection.cjs.map +1 -7
- package/build/dom/document-has-text-selection.cjs +24 -30
- package/build/dom/document-has-text-selection.cjs.map +1 -7
- package/build/dom/document-has-uncollapsed-selection.cjs +35 -30
- package/build/dom/document-has-uncollapsed-selection.cjs.map +1 -7
- package/build/dom/get-computed-style.cjs +14 -30
- package/build/dom/get-computed-style.cjs.map +1 -7
- package/build/dom/get-offset-parent.cjs +41 -48
- package/build/dom/get-offset-parent.cjs.map +1 -7
- package/build/dom/get-range-height.cjs +18 -31
- package/build/dom/get-range-height.cjs.map +1 -7
- package/build/dom/get-rectangle-from-range.cjs +82 -133
- package/build/dom/get-rectangle-from-range.cjs.map +1 -7
- package/build/dom/get-scroll-container.cjs +47 -55
- package/build/dom/get-scroll-container.cjs.map +1 -7
- package/build/dom/hidden-caret-range-from-point.cjs +49 -43
- package/build/dom/hidden-caret-range-from-point.cjs.map +1 -7
- package/build/dom/index.cjs +233 -110
- package/build/dom/input-field-has-uncollapsed-selection.cjs +49 -47
- package/build/dom/input-field-has-uncollapsed-selection.cjs.map +1 -7
- package/build/dom/insert-after.cjs +17 -27
- package/build/dom/insert-after.cjs.map +1 -7
- package/build/dom/is-edge.cjs +83 -98
- package/build/dom/is-edge.cjs.map +1 -7
- package/build/dom/is-element.cjs +12 -25
- package/build/dom/is-element.cjs.map +1 -7
- package/build/dom/is-empty.cjs +23 -40
- package/build/dom/is-empty.cjs.map +1 -7
- package/build/dom/is-entirely-selected.cjs +71 -71
- package/build/dom/is-entirely-selected.cjs.map +1 -7
- package/build/dom/is-form-element.cjs +34 -34
- package/build/dom/is-form-element.cjs.map +1 -7
- package/build/dom/is-horizontal-edge.cjs +32 -29
- package/build/dom/is-horizontal-edge.cjs.map +1 -7
- package/build/dom/is-html-input-element.cjs +12 -25
- package/build/dom/is-html-input-element.cjs.map +1 -7
- package/build/dom/is-input-or-text-area.cjs +12 -25
- package/build/dom/is-input-or-text-area.cjs.map +1 -7
- package/build/dom/is-number-input.cjs +37 -34
- package/build/dom/is-number-input.cjs.map +1 -7
- package/build/dom/is-rtl.cjs +31 -29
- package/build/dom/is-rtl.cjs.map +1 -7
- package/build/dom/is-selection-forward.cjs +26 -39
- package/build/dom/is-selection-forward.cjs.map +1 -7
- package/build/dom/is-text-field.cjs +46 -44
- package/build/dom/is-text-field.cjs.map +1 -7
- package/build/dom/is-vertical-edge.cjs +32 -29
- package/build/dom/is-vertical-edge.cjs.map +1 -7
- package/build/dom/place-caret-at-edge.cjs +76 -79
- package/build/dom/place-caret-at-edge.cjs.map +1 -7
- package/build/dom/place-caret-at-horizontal-edge.cjs +30 -29
- package/build/dom/place-caret-at-horizontal-edge.cjs.map +1 -7
- package/build/dom/place-caret-at-vertical-edge.cjs +31 -29
- package/build/dom/place-caret-at-vertical-edge.cjs.map +1 -7
- package/build/dom/remove-invalid-html.cjs +36 -32
- package/build/dom/remove-invalid-html.cjs.map +1 -7
- package/build/dom/remove.cjs +15 -27
- package/build/dom/remove.cjs.map +1 -7
- package/build/dom/replace-tag.cjs +21 -32
- package/build/dom/replace-tag.cjs.map +1 -7
- package/build/dom/replace.cjs +35 -33
- package/build/dom/replace.cjs.map +1 -7
- package/build/dom/safe-html.cjs +46 -47
- package/build/dom/safe-html.cjs.map +1 -7
- package/build/dom/scroll-if-no-range.cjs +24 -37
- package/build/dom/scroll-if-no-range.cjs.map +1 -7
- package/build/dom/strip-html.cjs +34 -32
- package/build/dom/strip-html.cjs.map +1 -7
- package/build/dom/types.cjs +5 -0
- package/build/dom/unwrap.cjs +17 -31
- package/build/dom/unwrap.cjs.map +1 -7
- package/build/dom/wrap.cjs +17 -28
- package/build/dom/wrap.cjs.map +1 -7
- package/build/focusable.cjs +99 -77
- package/build/focusable.cjs.map +1 -7
- package/build/index.cjs +58 -39
- package/build/index.cjs.map +1 -7
- package/build/phrasing-content.cjs +163 -159
- package/build/phrasing-content.cjs.map +1 -7
- package/build/tabbable.cjs +123 -78
- package/build/tabbable.cjs.map +1 -7
- package/build/types.cjs +5 -0
- package/build/utils/assert-is-defined.cjs +8 -33
- package/build/utils/assert-is-defined.cjs.map +1 -7
- package/build-module/data-transfer.mjs +17 -15
- package/build-module/data-transfer.mjs.map +1 -7
- package/build-module/dom/caret-range-from-point.mjs +28 -19
- package/build-module/dom/caret-range-from-point.mjs.map +1 -7
- package/build-module/dom/clean-node-list.mjs +60 -105
- package/build-module/dom/clean-node-list.mjs.map +1 -7
- package/build-module/dom/compute-caret-rect.mjs +16 -12
- package/build-module/dom/compute-caret-rect.mjs.map +1 -7
- package/build-module/dom/document-has-selection.mjs +13 -6
- package/build-module/dom/document-has-selection.mjs.map +1 -7
- package/build-module/dom/document-has-text-selection.mjs +20 -10
- package/build-module/dom/document-has-text-selection.mjs.map +1 -7
- package/build-module/dom/document-has-uncollapsed-selection.mjs +14 -6
- package/build-module/dom/document-has-uncollapsed-selection.mjs.map +1 -7
- package/build-module/dom/get-computed-style.mjs +10 -10
- package/build-module/dom/get-computed-style.mjs.map +1 -7
- package/build-module/dom/get-offset-parent.mjs +21 -25
- package/build-module/dom/get-offset-parent.mjs.map +1 -7
- package/build-module/dom/get-range-height.mjs +15 -12
- package/build-module/dom/get-range-height.mjs.map +1 -7
- package/build-module/dom/get-rectangle-from-range.mjs +78 -113
- package/build-module/dom/get-rectangle-from-range.mjs.map +1 -7
- package/build-module/dom/get-scroll-container.mjs +28 -32
- package/build-module/dom/get-scroll-container.mjs.map +1 -7
- package/build-module/dom/hidden-caret-range-from-point.mjs +28 -19
- package/build-module/dom/hidden-caret-range-from-point.mjs.map +1 -7
- package/build-module/dom/index.mjs +28 -58
- package/build-module/dom/input-field-has-uncollapsed-selection.mjs +28 -23
- package/build-module/dom/input-field-has-uncollapsed-selection.mjs.map +1 -7
- package/build-module/dom/insert-after.mjs +13 -7
- package/build-module/dom/insert-after.mjs.map +1 -7
- package/build-module/dom/is-edge.mjs +53 -69
- package/build-module/dom/is-edge.mjs.map +1 -7
- package/build-module/dom/is-element.mjs +9 -6
- package/build-module/dom/is-element.mjs.map +1 -7
- package/build-module/dom/is-empty.mjs +20 -21
- package/build-module/dom/is-empty.mjs.map +1 -7
- package/build-module/dom/is-entirely-selected.mjs +51 -47
- package/build-module/dom/is-entirely-selected.mjs.map +1 -7
- package/build-module/dom/is-form-element.mjs +15 -11
- package/build-module/dom/is-form-element.mjs.map +1 -7
- package/build-module/dom/is-horizontal-edge.mjs +13 -6
- package/build-module/dom/is-horizontal-edge.mjs.map +1 -7
- package/build-module/dom/is-html-input-element.mjs +9 -6
- package/build-module/dom/is-html-input-element.mjs.map +1 -7
- package/build-module/dom/is-input-or-text-area.mjs +9 -6
- package/build-module/dom/is-input-or-text-area.mjs.map +1 -7
- package/build-module/dom/is-number-input.mjs +16 -10
- package/build-module/dom/is-number-input.mjs.map +1 -7
- package/build-module/dom/is-rtl.mjs +12 -6
- package/build-module/dom/is-rtl.mjs.map +1 -7
- package/build-module/dom/is-selection-forward.mjs +22 -19
- package/build-module/dom/is-selection-forward.mjs.map +1 -7
- package/build-module/dom/is-text-field.mjs +27 -21
- package/build-module/dom/is-text-field.mjs.map +1 -7
- package/build-module/dom/is-vertical-edge.mjs +13 -6
- package/build-module/dom/is-vertical-edge.mjs.map +1 -7
- package/build-module/dom/place-caret-at-edge.mjs +51 -52
- package/build-module/dom/place-caret-at-edge.mjs.map +1 -7
- package/build-module/dom/place-caret-at-horizontal-edge.mjs +11 -6
- package/build-module/dom/place-caret-at-horizontal-edge.mjs.map +1 -7
- package/build-module/dom/place-caret-at-vertical-edge.mjs +12 -6
- package/build-module/dom/place-caret-at-vertical-edge.mjs.map +1 -7
- package/build-module/dom/remove-invalid-html.mjs +17 -9
- package/build-module/dom/remove-invalid-html.mjs.map +1 -7
- package/build-module/dom/remove.mjs +11 -7
- package/build-module/dom/remove.mjs.map +1 -7
- package/build-module/dom/replace-tag.mjs +17 -12
- package/build-module/dom/replace-tag.mjs.map +1 -7
- package/build-module/dom/replace.mjs +13 -8
- package/build-module/dom/replace.mjs.map +1 -7
- package/build-module/dom/safe-html.mjs +27 -24
- package/build-module/dom/safe-html.mjs.map +1 -7
- package/build-module/dom/scroll-if-no-range.mjs +21 -14
- package/build-module/dom/scroll-if-no-range.mjs.map +1 -7
- package/build-module/dom/strip-html.mjs +15 -9
- package/build-module/dom/strip-html.mjs.map +1 -7
- package/build-module/dom/types.mjs +0 -0
- package/build-module/dom/unwrap.mjs +13 -11
- package/build-module/dom/unwrap.mjs.map +1 -7
- package/build-module/dom/wrap.mjs +13 -8
- package/build-module/dom/wrap.mjs.map +1 -7
- package/build-module/focusable.mjs +96 -54
- package/build-module/focusable.mjs.map +1 -7
- package/build-module/index.mjs +11 -5
- package/build-module/index.mjs.map +1 -7
- package/build-module/phrasing-content.mjs +158 -134
- package/build-module/phrasing-content.mjs.map +1 -7
- package/build-module/tabbable.mjs +117 -52
- package/build-module/tabbable.mjs.map +1 -7
- package/build-module/types.mjs +0 -0
- package/build-module/utils/assert-is-defined.mjs +4 -9
- package/build-module/utils/assert-is-defined.mjs.map +1 -7
- package/build-types/data-transfer.d.ts +2 -2
- package/build-types/data-transfer.d.ts.map +1 -1
- package/build-types/dom/caret-range-from-point.d.ts +4 -4
- package/build-types/dom/caret-range-from-point.d.ts.map +1 -1
- package/build-types/dom/clean-node-list.d.ts +6 -46
- package/build-types/dom/clean-node-list.d.ts.map +1 -1
- package/build-types/dom/compute-caret-rect.d.ts +2 -2
- package/build-types/dom/compute-caret-rect.d.ts.map +1 -1
- package/build-types/dom/document-has-selection.d.ts +2 -2
- package/build-types/dom/document-has-selection.d.ts.map +1 -1
- package/build-types/dom/document-has-text-selection.d.ts +2 -2
- package/build-types/dom/document-has-text-selection.d.ts.map +1 -1
- package/build-types/dom/document-has-uncollapsed-selection.d.ts +2 -2
- package/build-types/dom/document-has-uncollapsed-selection.d.ts.map +1 -1
- package/build-types/dom/get-computed-style.d.ts +3 -3
- package/build-types/dom/get-computed-style.d.ts.map +1 -1
- package/build-types/dom/get-offset-parent.d.ts +2 -2
- package/build-types/dom/get-offset-parent.d.ts.map +1 -1
- package/build-types/dom/get-range-height.d.ts +2 -2
- package/build-types/dom/get-range-height.d.ts.map +1 -1
- package/build-types/dom/get-rectangle-from-range.d.ts +2 -2
- package/build-types/dom/get-rectangle-from-range.d.ts.map +1 -1
- package/build-types/dom/get-scroll-container.d.ts +5 -5
- package/build-types/dom/get-scroll-container.d.ts.map +1 -1
- package/build-types/dom/hidden-caret-range-from-point.d.ts +5 -5
- package/build-types/dom/hidden-caret-range-from-point.d.ts.map +1 -1
- package/build-types/dom/index.d.ts.map +1 -1
- package/build-types/dom/input-field-has-uncollapsed-selection.d.ts +2 -2
- package/build-types/dom/input-field-has-uncollapsed-selection.d.ts.map +1 -1
- package/build-types/dom/insert-after.d.ts +2 -3
- package/build-types/dom/insert-after.d.ts.map +1 -1
- package/build-types/dom/is-edge.d.ts +4 -4
- package/build-types/dom/is-edge.d.ts.map +1 -1
- package/build-types/dom/is-element.d.ts.map +1 -1
- package/build-types/dom/is-empty.d.ts +3 -3
- package/build-types/dom/is-empty.d.ts.map +1 -1
- package/build-types/dom/is-entirely-selected.d.ts +2 -2
- package/build-types/dom/is-entirely-selected.d.ts.map +1 -1
- package/build-types/dom/is-form-element.d.ts +3 -3
- package/build-types/dom/is-form-element.d.ts.map +1 -1
- package/build-types/dom/is-horizontal-edge.d.ts.map +1 -1
- package/build-types/dom/is-html-input-element.d.ts +1 -1
- package/build-types/dom/is-html-input-element.d.ts.map +1 -1
- package/build-types/dom/is-input-or-text-area.d.ts.map +1 -1
- package/build-types/dom/is-number-input.d.ts +2 -2
- package/build-types/dom/is-number-input.d.ts.map +1 -1
- package/build-types/dom/is-rtl.d.ts +2 -2
- package/build-types/dom/is-rtl.d.ts.map +1 -1
- package/build-types/dom/is-selection-forward.d.ts +2 -2
- package/build-types/dom/is-selection-forward.d.ts.map +1 -1
- package/build-types/dom/is-text-field.d.ts +2 -2
- package/build-types/dom/is-text-field.d.ts.map +1 -1
- package/build-types/dom/is-vertical-edge.d.ts.map +1 -1
- package/build-types/dom/place-caret-at-edge.d.ts +3 -3
- package/build-types/dom/place-caret-at-edge.d.ts.map +1 -1
- package/build-types/dom/place-caret-at-horizontal-edge.d.ts.map +1 -1
- package/build-types/dom/place-caret-at-vertical-edge.d.ts.map +1 -1
- package/build-types/dom/remove-invalid-html.d.ts +5 -4
- package/build-types/dom/remove-invalid-html.d.ts.map +1 -1
- package/build-types/dom/remove.d.ts +1 -2
- package/build-types/dom/remove.d.ts.map +1 -1
- package/build-types/dom/replace-tag.d.ts +3 -3
- package/build-types/dom/replace-tag.d.ts.map +1 -1
- package/build-types/dom/replace.d.ts +2 -3
- package/build-types/dom/replace.d.ts.map +1 -1
- package/build-types/dom/safe-html.d.ts +2 -2
- package/build-types/dom/safe-html.d.ts.map +1 -1
- package/build-types/dom/scroll-if-no-range.d.ts +5 -5
- package/build-types/dom/scroll-if-no-range.d.ts.map +1 -1
- package/build-types/dom/strip-html.d.ts +2 -2
- package/build-types/dom/strip-html.d.ts.map +1 -1
- package/build-types/dom/types.d.ts +32 -0
- package/build-types/dom/types.d.ts.map +1 -0
- package/build-types/dom/unwrap.d.ts +1 -3
- package/build-types/dom/unwrap.d.ts.map +1 -1
- package/build-types/dom/wrap.d.ts +2 -2
- package/build-types/dom/wrap.d.ts.map +1 -1
- package/build-types/focusable.d.ts +11 -30
- package/build-types/focusable.d.ts.map +1 -1
- package/build-types/index.d.ts +17 -0
- package/build-types/index.d.ts.map +1 -1
- package/build-types/phrasing-content.d.ts +9 -24
- package/build-types/phrasing-content.d.ts.map +1 -1
- package/build-types/tabbable.d.ts +10 -15
- package/build-types/tabbable.d.ts.map +1 -1
- package/build-types/types.d.ts +29 -0
- package/build-types/types.d.ts.map +1 -0
- package/package.json +6 -7
- package/src/{data-transfer.js → data-transfer.ts} +3 -3
- package/src/dom/{caret-range-from-point.js → caret-range-from-point.ts} +9 -5
- package/src/dom/{clean-node-list.js → clean-node-list.ts} +16 -24
- package/src/dom/{compute-caret-rect.js → compute-caret-rect.ts} +3 -3
- package/src/dom/{document-has-selection.js → document-has-selection.ts} +3 -3
- package/src/dom/{document-has-text-selection.js → document-has-text-selection.ts} +3 -3
- package/src/dom/{document-has-uncollapsed-selection.js → document-has-uncollapsed-selection.ts} +5 -3
- package/src/dom/{get-computed-style.js → get-computed-style.ts} +5 -3
- package/src/dom/{get-offset-parent.js → get-offset-parent.ts} +9 -14
- package/src/dom/{get-range-height.js → get-range-height.ts} +3 -3
- package/src/dom/{get-rectangle-from-range.js → get-rectangle-from-range.ts} +6 -12
- package/src/dom/{get-scroll-container.js → get-scroll-container.ts} +9 -9
- package/src/dom/{hidden-caret-range-from-point.js → hidden-caret-range-from-point.ts} +11 -6
- package/src/dom/{input-field-has-uncollapsed-selection.js → input-field-has-uncollapsed-selection.ts} +7 -5
- package/src/dom/{insert-after.js → insert-after.ts} +6 -4
- package/src/dom/{is-edge.js → is-edge.ts} +44 -48
- package/src/dom/{is-element.js → is-element.ts} +3 -1
- package/src/dom/{is-empty.js → is-empty.ts} +5 -7
- package/src/dom/{is-entirely-selected.js → is-entirely-selected.ts} +14 -11
- package/src/dom/{is-form-element.js → is-form-element.ts} +5 -3
- package/src/dom/{is-horizontal-edge.js → is-horizontal-edge.ts} +4 -1
- package/src/dom/{is-html-input-element.js → is-html-input-element.ts} +3 -1
- package/src/dom/{is-input-or-text-area.js → is-input-or-text-area.ts} +3 -1
- package/src/dom/{is-number-input.js → is-number-input.ts} +3 -3
- package/src/dom/{is-rtl.js → is-rtl.ts} +3 -3
- package/src/dom/{is-selection-forward.js → is-selection-forward.ts} +3 -3
- package/src/dom/{is-text-field.js → is-text-field.ts} +4 -4
- package/src/dom/{is-vertical-edge.js → is-vertical-edge.ts} +4 -1
- package/src/dom/{place-caret-at-edge.js → place-caret-at-edge.ts} +17 -9
- package/src/dom/{place-caret-at-horizontal-edge.js → place-caret-at-horizontal-edge.ts} +4 -1
- package/src/dom/{place-caret-at-vertical-edge.js → place-caret-at-vertical-edge.ts} +5 -1
- package/src/dom/{remove-invalid-html.js → remove-invalid-html.ts} +9 -4
- package/src/dom/{remove.js → remove.ts} +2 -3
- package/src/dom/{replace-tag.js → replace-tag.ts} +4 -4
- package/src/dom/{replace.js → replace.ts} +6 -4
- package/src/dom/{safe-html.js → safe-html.ts} +3 -3
- package/src/dom/{scroll-if-no-range.js → scroll-if-no-range.ts} +9 -5
- package/src/dom/{strip-html.js → strip-html.ts} +3 -3
- package/src/dom/test/{get-rectangle-from-range.browser.test.js → get-rectangle-from-range.browser.test.ts} +25 -25
- package/src/dom/types.ts +28 -0
- package/src/dom/{unwrap.js → unwrap.ts} +2 -4
- package/src/dom/{wrap.js → wrap.ts} +3 -3
- package/src/{focusable.js → focusable.ts} +34 -32
- package/src/index.ts +33 -0
- package/src/{phrasing-content.js → phrasing-content.ts} +15 -30
- package/src/{tabbable.js → tabbable.ts} +48 -39
- package/src/test/{dom.jsdom.test.js → dom.jsdom.test.ts} +30 -6
- package/src/test/{focusable.browser.test.js → focusable.browser.test.ts} +14 -13
- package/src/test/{tabbable.browser.test.js → tabbable.browser.test.ts} +3 -2
- package/src/types.ts +32 -0
- package/CHANGELOG.md +0 -317
- package/build/dom/index.cjs.map +0 -7
- package/build-module/dom/index.mjs.map +0 -7
- package/src/index.js +0 -12
- /package/src/dom/{index.js → index.ts} +0 -0
- /package/src/dom/test/{safe-html.jsdom.test.js → safe-html.jsdom.test.ts} +0 -0
- /package/src/dom/test/{strip-html.jsdom.test.js → strip-html.jsdom.test.ts} +0 -0
- /package/src/test/{focusable-area.jsdom.test.js → focusable-area.jsdom.test.ts} +0 -0
- /package/src/test/{utils.js → utils.ts} +0 -0
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import getComputedStyle from './get-computed-style';
|
|
2
|
+
import isElement from './is-element';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* Returns the closest positioned element, or null under any of the conditions
|
|
@@ -7,18 +8,16 @@ import getComputedStyle from './get-computed-style';
|
|
|
7
8
|
*
|
|
8
9
|
* @see https://drafts.csswg.org/cssom-view/#dom-htmlelement-offsetparent
|
|
9
10
|
*
|
|
10
|
-
* @param
|
|
11
|
+
* @param node Node from which to find offset parent.
|
|
11
12
|
*
|
|
12
|
-
* @return
|
|
13
|
+
* @return Offset parent.
|
|
13
14
|
*/
|
|
14
|
-
export default function getOffsetParent( node ) {
|
|
15
|
+
export default function getOffsetParent( node: Node ): Node | null {
|
|
15
16
|
// Cannot retrieve computed style or offset parent only anything other than
|
|
16
17
|
// an element node, so find the closest element node.
|
|
17
|
-
let closestElement;
|
|
18
|
-
while (
|
|
19
|
-
|
|
20
|
-
break;
|
|
21
|
-
}
|
|
18
|
+
let closestElement = node.parentNode;
|
|
19
|
+
while ( closestElement && ! isElement( closestElement ) ) {
|
|
20
|
+
closestElement = closestElement.parentNode;
|
|
22
21
|
}
|
|
23
22
|
|
|
24
23
|
if ( ! closestElement ) {
|
|
@@ -27,14 +26,10 @@ export default function getOffsetParent( node ) {
|
|
|
27
26
|
|
|
28
27
|
// If the closest element is already positioned, return it, as offsetParent
|
|
29
28
|
// does not otherwise consider the node itself.
|
|
30
|
-
if (
|
|
31
|
-
getComputedStyle( /** @type {Element} */ ( closestElement ) )
|
|
32
|
-
.position !== 'static'
|
|
33
|
-
) {
|
|
29
|
+
if ( getComputedStyle( closestElement ).position !== 'static' ) {
|
|
34
30
|
return closestElement;
|
|
35
31
|
}
|
|
36
32
|
|
|
37
33
|
// offsetParent is undocumented/draft.
|
|
38
|
-
return
|
|
39
|
-
.offsetParent;
|
|
34
|
+
return ( closestElement as HTMLElement ).offsetParent;
|
|
40
35
|
}
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
* Gets the height of the range without ignoring zero width rectangles, which
|
|
3
3
|
* some browsers ignore when creating a union.
|
|
4
4
|
*
|
|
5
|
-
* @param
|
|
6
|
-
* @return
|
|
5
|
+
* @param range The range to check.
|
|
6
|
+
* @return Height of the range or undefined if the range has no client rectangles.
|
|
7
7
|
*/
|
|
8
|
-
export default function getRangeHeight( range ) {
|
|
8
|
+
export default function getRangeHeight( range: Range ): number | undefined {
|
|
9
9
|
const rects = Array.from( range.getClientRects() );
|
|
10
10
|
|
|
11
11
|
if ( ! rects.length ) {
|
|
@@ -5,11 +5,11 @@ import { assertIsDefined } from '../utils/assert-is-defined';
|
|
|
5
5
|
* can be found. Use instead of `Range.getBoundingClientRect()`, which is often
|
|
6
6
|
* broken, especially for collapsed ranges.
|
|
7
7
|
*
|
|
8
|
-
* @param
|
|
8
|
+
* @param range The range.
|
|
9
9
|
*
|
|
10
|
-
* @return
|
|
10
|
+
* @return The rectangle.
|
|
11
11
|
*/
|
|
12
|
-
export default function getRectangleFromRange( range ) {
|
|
12
|
+
export default function getRectangleFromRange( range: Range ): DOMRect | null {
|
|
13
13
|
// For uncollapsed ranges, get the rectangle that bounds the contents of the
|
|
14
14
|
// range; this a rectangle enclosing the union of the bounding rectangles
|
|
15
15
|
// for all the elements in the range.
|
|
@@ -97,10 +97,7 @@ export default function getRectangleFromRange( range ) {
|
|
|
97
97
|
let beforeRange;
|
|
98
98
|
if ( before && before.nodeType === before.TEXT_NODE ) {
|
|
99
99
|
beforeRange = ownerDocument.createRange();
|
|
100
|
-
beforeRange.setStart(
|
|
101
|
-
before,
|
|
102
|
-
/** @type {Text} */ ( before ).length
|
|
103
|
-
);
|
|
100
|
+
beforeRange.setStart( before, ( before as Text ).length );
|
|
104
101
|
beforeRange.collapse( true );
|
|
105
102
|
}
|
|
106
103
|
let afterRange;
|
|
@@ -149,13 +146,10 @@ export default function getRectangleFromRange( range ) {
|
|
|
149
146
|
rects.length === 1 &&
|
|
150
147
|
startContainer.nodeType === startContainer.TEXT_NODE &&
|
|
151
148
|
range.startOffset > 0 &&
|
|
152
|
-
range.startOffset <
|
|
149
|
+
range.startOffset < ( startContainer as Text ).length
|
|
153
150
|
) {
|
|
154
151
|
assertIsDefined( ownerDocument, 'ownerDocument' );
|
|
155
|
-
const measure = (
|
|
156
|
-
/** @type {number} */ start,
|
|
157
|
-
/** @type {number} */ end
|
|
158
|
-
) => {
|
|
152
|
+
const measure = ( start: number, end: number ) => {
|
|
159
153
|
const charRange = ownerDocument.createRange();
|
|
160
154
|
charRange.setStart( startContainer, start );
|
|
161
155
|
charRange.setEnd( startContainer, end );
|
|
@@ -4,12 +4,15 @@ import getComputedStyle from './get-computed-style';
|
|
|
4
4
|
* Given a DOM node, finds the closest scrollable container node or the node
|
|
5
5
|
* itself, if scrollable.
|
|
6
6
|
*
|
|
7
|
-
* @param
|
|
8
|
-
* @param
|
|
9
|
-
*
|
|
10
|
-
* @return
|
|
7
|
+
* @param node Node from which to start.
|
|
8
|
+
* @param direction Direction of scrollable container to search for ('vertical', 'horizontal', 'all').
|
|
9
|
+
* Defaults to 'vertical'.
|
|
10
|
+
* @return Scrollable container node, if found.
|
|
11
11
|
*/
|
|
12
|
-
export default function getScrollContainer(
|
|
12
|
+
export default function getScrollContainer(
|
|
13
|
+
node: Element | null,
|
|
14
|
+
direction: 'vertical' | 'horizontal' | 'all' = 'vertical'
|
|
15
|
+
): Element | undefined {
|
|
13
16
|
if ( ! node ) {
|
|
14
17
|
return undefined;
|
|
15
18
|
}
|
|
@@ -43,8 +46,5 @@ export default function getScrollContainer( node, direction = 'vertical' ) {
|
|
|
43
46
|
}
|
|
44
47
|
|
|
45
48
|
// Continue traversing.
|
|
46
|
-
return getScrollContainer(
|
|
47
|
-
/** @type {Element} */ ( node.parentNode ),
|
|
48
|
-
direction
|
|
49
|
-
);
|
|
49
|
+
return getScrollContainer( node.parentNode as Element, direction );
|
|
50
50
|
}
|
|
@@ -6,14 +6,19 @@ import getComputedStyle from './get-computed-style';
|
|
|
6
6
|
* Gives the container a temporary high z-index (above any UI).
|
|
7
7
|
* This is preferred over getting the UI nodes and set styles there.
|
|
8
8
|
*
|
|
9
|
-
* @param
|
|
10
|
-
* @param
|
|
11
|
-
* @param
|
|
12
|
-
* @param
|
|
9
|
+
* @param doc The document of the range.
|
|
10
|
+
* @param x Horizontal position within the current viewport.
|
|
11
|
+
* @param y Vertical position within the current viewport.
|
|
12
|
+
* @param container Container in which the range is expected to be found.
|
|
13
13
|
*
|
|
14
|
-
* @return
|
|
14
|
+
* @return The best range for the given point.
|
|
15
15
|
*/
|
|
16
|
-
export default function hiddenCaretRangeFromPoint(
|
|
16
|
+
export default function hiddenCaretRangeFromPoint(
|
|
17
|
+
doc: Document,
|
|
18
|
+
x: number,
|
|
19
|
+
y: number,
|
|
20
|
+
container: HTMLElement
|
|
21
|
+
): Range | null {
|
|
17
22
|
const originalZIndex = container.style.zIndex;
|
|
18
23
|
const originalPosition = container.style.position;
|
|
19
24
|
const originalBorderRadius = container.style.borderRadius;
|
|
@@ -14,11 +14,13 @@ import isHTMLInputElement from './is-html-input-element';
|
|
|
14
14
|
*
|
|
15
15
|
* See: https://html.spec.whatwg.org/multipage/input.html#do-not-apply
|
|
16
16
|
*
|
|
17
|
-
* @param
|
|
17
|
+
* @param element The HTML element.
|
|
18
18
|
*
|
|
19
|
-
* @return
|
|
19
|
+
* @return Whether the input/textarea element has some "selection".
|
|
20
20
|
*/
|
|
21
|
-
export default function inputFieldHasUncollapsedSelection(
|
|
21
|
+
export default function inputFieldHasUncollapsedSelection(
|
|
22
|
+
element: Element
|
|
23
|
+
): boolean {
|
|
22
24
|
if ( ! isHTMLInputElement( element ) && ! isTextField( element ) ) {
|
|
23
25
|
return false;
|
|
24
26
|
}
|
|
@@ -27,8 +29,8 @@ export default function inputFieldHasUncollapsedSelection( element ) {
|
|
|
27
29
|
// `selectionEnd` on non-text <input> elements, so a try/catch construct is
|
|
28
30
|
// necessary.
|
|
29
31
|
try {
|
|
30
|
-
const { selectionStart, selectionEnd } =
|
|
31
|
-
|
|
32
|
+
const { selectionStart, selectionEnd } = element as
|
|
33
|
+
HTMLInputElement | HTMLTextAreaElement;
|
|
32
34
|
return (
|
|
33
35
|
// `null` means the input type doesn't implement selection, thus we
|
|
34
36
|
// cannot determine whether the selection is collapsed, so we
|
|
@@ -4,11 +4,13 @@ import { assertIsDefined } from '../utils/assert-is-defined';
|
|
|
4
4
|
* Given two DOM nodes, inserts the former in the DOM as the next sibling of
|
|
5
5
|
* the latter.
|
|
6
6
|
*
|
|
7
|
-
* @param
|
|
8
|
-
* @param
|
|
9
|
-
* @return {void}
|
|
7
|
+
* @param newNode Node to be inserted.
|
|
8
|
+
* @param referenceNode Node after which to perform the insertion.
|
|
10
9
|
*/
|
|
11
|
-
export default function insertAfter(
|
|
10
|
+
export default function insertAfter(
|
|
11
|
+
newNode: Node,
|
|
12
|
+
referenceNode: Node
|
|
13
|
+
): void {
|
|
12
14
|
assertIsDefined( referenceNode.parentNode, 'referenceNode.parentNode' );
|
|
13
15
|
referenceNode.parentNode.insertBefore( newNode, referenceNode.nextSibling );
|
|
14
16
|
}
|
|
@@ -5,20 +5,23 @@ import isSelectionForward from './is-selection-forward';
|
|
|
5
5
|
import hiddenCaretRangeFromPoint from './hidden-caret-range-from-point';
|
|
6
6
|
import { assertIsDefined } from '../utils/assert-is-defined';
|
|
7
7
|
import isInputOrTextArea from './is-input-or-text-area';
|
|
8
|
-
import { scrollIfNoRange } from './scroll-if-no-range';
|
|
9
8
|
|
|
10
9
|
/**
|
|
11
10
|
* Check whether the selection is at the edge of the container. Checks for
|
|
12
11
|
* horizontal position by default. Set `onlyVertical` to true to check only
|
|
13
12
|
* vertically.
|
|
14
13
|
*
|
|
15
|
-
* @param
|
|
16
|
-
* @param
|
|
17
|
-
* @param
|
|
14
|
+
* @param container Focusable element.
|
|
15
|
+
* @param isReverse Set to true to check left, false to check right.
|
|
16
|
+
* @param onlyVertical Set to true to check only vertical position.
|
|
18
17
|
*
|
|
19
|
-
* @return
|
|
18
|
+
* @return True if at the edge, false if not.
|
|
20
19
|
*/
|
|
21
|
-
export default function isEdge(
|
|
20
|
+
export default function isEdge(
|
|
21
|
+
container: HTMLElement,
|
|
22
|
+
isReverse: boolean,
|
|
23
|
+
onlyVertical: boolean = false
|
|
24
|
+
): boolean {
|
|
22
25
|
if (
|
|
23
26
|
isInputOrTextArea( container ) &&
|
|
24
27
|
typeof container.selectionStart === 'number'
|
|
@@ -78,53 +81,48 @@ export default function isEdge( container, isReverse, onlyVertical = false ) {
|
|
|
78
81
|
return false;
|
|
79
82
|
}
|
|
80
83
|
|
|
84
|
+
// A line above the selection (or below, when going down) means it is not
|
|
85
|
+
// at the vertical edge. Unlike hit-testing a point, a range measures
|
|
86
|
+
// lines outside the viewport too.
|
|
87
|
+
const contentRange = ownerDocument.createRange();
|
|
88
|
+
contentRange.selectNodeContents( container );
|
|
89
|
+
const hasLineBeyond = Array.from( contentRange.getClientRects() ).some(
|
|
90
|
+
( rect ) =>
|
|
91
|
+
rect.height > 0 &&
|
|
92
|
+
( isReverse
|
|
93
|
+
? rect.bottom <= rangeRect.top + 1
|
|
94
|
+
: rect.top >= rangeRect.bottom - 1 )
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
if ( hasLineBeyond ) {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if ( onlyVertical ) {
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
|
|
81
105
|
// In the case of RTL scripts, the horizontal edge is at the opposite side.
|
|
82
106
|
const isReverseDir = isRTL( container ) ? ! isReverse : isReverse;
|
|
83
107
|
const containerRect = container.getBoundingClientRect();
|
|
84
108
|
|
|
85
|
-
//
|
|
86
|
-
// edge of
|
|
87
|
-
//
|
|
88
|
-
//
|
|
89
|
-
//
|
|
90
|
-
//
|
|
91
|
-
// DOM positioning.
|
|
92
|
-
// It also proves better than using the computed style for the vertical
|
|
93
|
-
// edge, because we cannot know the padding and line height reliably in
|
|
94
|
-
// pixels. `getComputedStyle` may return a value with different units.
|
|
109
|
+
// The selection is on the edge line. To check if it is at the horizontal
|
|
110
|
+
// edge of that line, we hit-test a point at the container's edge on that
|
|
111
|
+
// line and check if the caret there has the same position. This proves
|
|
112
|
+
// better than a DOM-based calculation, since it ignores empty text nodes
|
|
113
|
+
// and a trailing line break element. The line is within the viewport when
|
|
114
|
+
// the selection is; otherwise the browser handles the key.
|
|
95
115
|
const x = isReverseDir ? containerRect.left + 1 : containerRect.right - 1;
|
|
96
|
-
const y = isReverse ?
|
|
97
|
-
|
|
98
|
-
// The test point can only be hit-tested when it is within the viewport
|
|
99
|
-
// (`caretRangeFromPoint` returns nothing for a point outside it, upon
|
|
100
|
-
// which `scrollIfNoRange` scrolls the container's edge into view to
|
|
101
|
-
// measure, e.g. on every arrow press within a container taller than the
|
|
102
|
-
// viewport). When the edge is outside the viewport and the selection is
|
|
103
|
-
// within it, they are at least a viewport boundary apart along that
|
|
104
|
-
// axis, so the selection cannot be at the edge. Check each axis
|
|
105
|
-
// separately: the vertical check must not be short-circuited by a
|
|
106
|
-
// horizontally overflowing container, and vice versa.
|
|
107
|
-
const isFarFromVerticalEdge =
|
|
108
|
-
( y < 0 || y > defaultView.innerHeight ) &&
|
|
109
|
-
rangeRect.top >= 0 &&
|
|
110
|
-
rangeRect.bottom <= defaultView.innerHeight;
|
|
111
|
-
const isFarFromHorizontalEdge =
|
|
112
|
-
( x < 0 || x > defaultView.innerWidth ) &&
|
|
113
|
-
rangeRect.left >= 0 &&
|
|
114
|
-
rangeRect.right <= defaultView.innerWidth;
|
|
115
|
-
|
|
116
|
-
if (
|
|
117
|
-
isFarFromVerticalEdge ||
|
|
118
|
-
( ! onlyVertical && isFarFromHorizontalEdge )
|
|
119
|
-
) {
|
|
120
|
-
return false;
|
|
121
|
-
}
|
|
116
|
+
const y = isReverse ? rangeRect.top + 1 : rangeRect.bottom - 1;
|
|
122
117
|
|
|
123
|
-
const testRange =
|
|
124
|
-
|
|
118
|
+
const testRange = hiddenCaretRangeFromPoint(
|
|
119
|
+
ownerDocument,
|
|
120
|
+
x,
|
|
121
|
+
y,
|
|
122
|
+
container
|
|
125
123
|
);
|
|
126
124
|
|
|
127
|
-
if ( ! testRange ) {
|
|
125
|
+
if ( ! testRange || ! container.contains( testRange.startContainer ) ) {
|
|
128
126
|
return false;
|
|
129
127
|
}
|
|
130
128
|
|
|
@@ -144,7 +142,5 @@ export default function isEdge( container, isReverse, onlyVertical = false ) {
|
|
|
144
142
|
const hasVerticalDiff = Math.abs( verticalDiff ) <= 1;
|
|
145
143
|
const hasHorizontalDiff = Math.abs( horizontalDiff ) <= 1;
|
|
146
144
|
|
|
147
|
-
return
|
|
148
|
-
? hasVerticalDiff
|
|
149
|
-
: hasVerticalDiff && hasHorizontalDiff;
|
|
145
|
+
return hasVerticalDiff && hasHorizontalDiff;
|
|
150
146
|
}
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
* @param {Node | null | undefined} node
|
|
3
3
|
* @return {node is Element} True if node is an Element node
|
|
4
4
|
*/
|
|
5
|
-
export default function isElement(
|
|
5
|
+
export default function isElement(
|
|
6
|
+
node: Node | null | undefined
|
|
7
|
+
): node is Element {
|
|
6
8
|
return !! node && node.nodeType === node.ELEMENT_NODE;
|
|
7
9
|
}
|
|
@@ -2,26 +2,24 @@
|
|
|
2
2
|
* Recursively checks if an element is empty. An element is not empty if it
|
|
3
3
|
* contains text or contains elements with attributes such as images.
|
|
4
4
|
*
|
|
5
|
-
* @param
|
|
5
|
+
* @param element The element to check.
|
|
6
6
|
*
|
|
7
|
-
* @return
|
|
7
|
+
* @return Whether or not the element is empty.
|
|
8
8
|
*/
|
|
9
|
-
export default function isEmpty( element ) {
|
|
9
|
+
export default function isEmpty( element: Node ): boolean {
|
|
10
10
|
switch ( element.nodeType ) {
|
|
11
11
|
case element.TEXT_NODE:
|
|
12
12
|
// We cannot use \s since it includes special spaces which we want
|
|
13
13
|
// to preserve.
|
|
14
14
|
return /^[ \f\n\r\t\v\u00a0]*$/.test( element.nodeValue || '' );
|
|
15
15
|
case element.ELEMENT_NODE:
|
|
16
|
-
if ( element.hasAttributes() ) {
|
|
16
|
+
if ( ( element as Element ).hasAttributes() ) {
|
|
17
17
|
return false;
|
|
18
18
|
} else if ( ! element.hasChildNodes() ) {
|
|
19
19
|
return true;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
return
|
|
23
|
-
Array.from( element.childNodes )
|
|
24
|
-
).every( isEmpty );
|
|
22
|
+
return Array.from( element.childNodes ).every( isEmpty );
|
|
25
23
|
default:
|
|
26
24
|
return true;
|
|
27
25
|
}
|
|
@@ -11,11 +11,11 @@ const ZWNBSP = '\ufeff';
|
|
|
11
11
|
* Check whether the contents of the element have been entirely selected.
|
|
12
12
|
* Returns true if there is no possibility of selection.
|
|
13
13
|
*
|
|
14
|
-
* @param
|
|
14
|
+
* @param element The element to check.
|
|
15
15
|
*
|
|
16
|
-
* @return
|
|
16
|
+
* @return True if entirely selected, false if not.
|
|
17
17
|
*/
|
|
18
|
-
export default function isEntirelySelected( element ) {
|
|
18
|
+
export default function isEntirelySelected( element: HTMLElement ): boolean {
|
|
19
19
|
if ( isInputOrTextArea( element ) ) {
|
|
20
20
|
return (
|
|
21
21
|
element.selectionStart === 0 &&
|
|
@@ -61,7 +61,7 @@ export default function isEntirelySelected( element ) {
|
|
|
61
61
|
assertIsDefined( lastChild, 'lastChild' );
|
|
62
62
|
const endContainerContentLength =
|
|
63
63
|
endContainer.nodeType === endContainer.TEXT_NODE
|
|
64
|
-
?
|
|
64
|
+
? ( endContainer as Text ).data.length
|
|
65
65
|
: endContainer.childNodes.length;
|
|
66
66
|
|
|
67
67
|
return (
|
|
@@ -76,15 +76,18 @@ export default function isEntirelySelected( element ) {
|
|
|
76
76
|
* Check whether the contents of the element have been entirely selected.
|
|
77
77
|
* Returns true if there is no possibility of selection.
|
|
78
78
|
*
|
|
79
|
-
* @param
|
|
80
|
-
* @param
|
|
81
|
-
* @param
|
|
79
|
+
* @param query The element to check.
|
|
80
|
+
* @param container The container that we suspect "query" may be a first or last child of.
|
|
81
|
+
* @param propName "firstChild" or "lastChild"
|
|
82
82
|
*
|
|
83
|
-
* @return
|
|
83
|
+
* @return True if query is a deep first/last child of container, false otherwise.
|
|
84
84
|
*/
|
|
85
|
-
function isDeepChild(
|
|
86
|
-
|
|
87
|
-
|
|
85
|
+
function isDeepChild(
|
|
86
|
+
query: HTMLElement | Node,
|
|
87
|
+
container: HTMLElement,
|
|
88
|
+
propName: 'firstChild' | 'lastChild'
|
|
89
|
+
): boolean {
|
|
90
|
+
let candidate: HTMLElement | ChildNode | null = container;
|
|
88
91
|
do {
|
|
89
92
|
if ( query === candidate ) {
|
|
90
93
|
return true;
|
|
@@ -4,11 +4,13 @@ import isInputOrTextArea from './is-input-or-text-area';
|
|
|
4
4
|
*
|
|
5
5
|
* Detects if element is a form element.
|
|
6
6
|
*
|
|
7
|
-
* @param
|
|
7
|
+
* @param element The element to check.
|
|
8
8
|
*
|
|
9
|
-
* @return
|
|
9
|
+
* @return True if form element and false otherwise.
|
|
10
10
|
*/
|
|
11
|
-
export default function isFormElement(
|
|
11
|
+
export default function isFormElement(
|
|
12
|
+
element: Element | null | undefined
|
|
13
|
+
): boolean {
|
|
12
14
|
if ( ! element ) {
|
|
13
15
|
return false;
|
|
14
16
|
}
|
|
@@ -8,6 +8,9 @@ import isEdge from './is-edge';
|
|
|
8
8
|
*
|
|
9
9
|
* @return {boolean} True if at the horizontal edge, false if not.
|
|
10
10
|
*/
|
|
11
|
-
export default function isHorizontalEdge(
|
|
11
|
+
export default function isHorizontalEdge(
|
|
12
|
+
container: HTMLElement,
|
|
13
|
+
isReverse: boolean
|
|
14
|
+
): boolean {
|
|
12
15
|
return isEdge( container, isReverse );
|
|
13
16
|
}
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
* @param {Node} node
|
|
3
3
|
* @return {node is HTMLInputElement} Whether the node is an HTMLInputElement.
|
|
4
4
|
*/
|
|
5
|
-
export default function isHTMLInputElement(
|
|
5
|
+
export default function isHTMLInputElement(
|
|
6
|
+
node: Node | null | undefined
|
|
7
|
+
): node is HTMLInputElement {
|
|
6
8
|
return node?.nodeName === 'INPUT';
|
|
7
9
|
}
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
* @param {Element} element
|
|
3
3
|
* @return {element is HTMLInputElement | HTMLTextAreaElement} Whether the element is an input or textarea
|
|
4
4
|
*/
|
|
5
|
-
export default function isInputOrTextArea(
|
|
5
|
+
export default function isInputOrTextArea(
|
|
6
|
+
element: Element
|
|
7
|
+
): element is HTMLInputElement | HTMLTextAreaElement {
|
|
6
8
|
return element.tagName === 'INPUT' || element.tagName === 'TEXTAREA';
|
|
7
9
|
}
|
|
@@ -4,11 +4,11 @@ import isHTMLInputElement from './is-html-input-element';
|
|
|
4
4
|
/**
|
|
5
5
|
* Check whether the given element is an input field of type number.
|
|
6
6
|
*
|
|
7
|
-
* @param
|
|
7
|
+
* @param node The HTML node.
|
|
8
8
|
*
|
|
9
|
-
* @return
|
|
9
|
+
* @return True if the node is number input.
|
|
10
10
|
*/
|
|
11
|
-
export default function isNumberInput( node ) {
|
|
11
|
+
export default function isNumberInput( node: Node ): node is HTMLInputElement {
|
|
12
12
|
deprecated( 'wp.dom.isNumberInput', {
|
|
13
13
|
since: '6.1',
|
|
14
14
|
version: '6.5',
|
|
@@ -3,10 +3,10 @@ import getComputedStyle from './get-computed-style';
|
|
|
3
3
|
/**
|
|
4
4
|
* Whether the element's text direction is right-to-left.
|
|
5
5
|
*
|
|
6
|
-
* @param
|
|
6
|
+
* @param element The element to check.
|
|
7
7
|
*
|
|
8
|
-
* @return
|
|
8
|
+
* @return True if rtl, false if ltr.
|
|
9
9
|
*/
|
|
10
|
-
export default function isRTL( element ) {
|
|
10
|
+
export default function isRTL( element: Element ): boolean {
|
|
11
11
|
return getComputedStyle( element ).direction === 'rtl';
|
|
12
12
|
}
|
|
@@ -6,11 +6,11 @@ import { assertIsDefined } from '../utils/assert-is-defined';
|
|
|
6
6
|
*
|
|
7
7
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/Node/compareDocumentPosition
|
|
8
8
|
*
|
|
9
|
-
* @param
|
|
9
|
+
* @param selection Selection object to check.
|
|
10
10
|
*
|
|
11
|
-
* @return
|
|
11
|
+
* @return Whether the selection is forward.
|
|
12
12
|
*/
|
|
13
|
-
export default function isSelectionForward( selection ) {
|
|
13
|
+
export default function isSelectionForward( selection: Selection ): boolean {
|
|
14
14
|
const { anchorNode, focusNode, anchorOffset, focusOffset } = selection;
|
|
15
15
|
|
|
16
16
|
assertIsDefined( anchorNode, 'anchorNode' );
|
|
@@ -6,10 +6,10 @@ import isHTMLInputElement from './is-html-input-element';
|
|
|
6
6
|
*
|
|
7
7
|
* See: https://html.spec.whatwg.org/#textFieldSelection
|
|
8
8
|
*
|
|
9
|
-
* @param
|
|
10
|
-
* @return
|
|
9
|
+
* @param node The HTML element.
|
|
10
|
+
* @return True if the element is an text field, false if not.
|
|
11
11
|
*/
|
|
12
|
-
export default function isTextField( node ) {
|
|
12
|
+
export default function isTextField( node: Node ): node is HTMLElement {
|
|
13
13
|
const nonTextInputs = [
|
|
14
14
|
'button',
|
|
15
15
|
'checkbox',
|
|
@@ -29,6 +29,6 @@ export default function isTextField( node ) {
|
|
|
29
29
|
node.type &&
|
|
30
30
|
! nonTextInputs.includes( node.type ) ) ||
|
|
31
31
|
node.nodeName === 'TEXTAREA' ||
|
|
32
|
-
|
|
32
|
+
( node as HTMLElement ).contentEditable === 'true'
|
|
33
33
|
);
|
|
34
34
|
}
|
|
@@ -8,6 +8,9 @@ import isEdge from './is-edge';
|
|
|
8
8
|
*
|
|
9
9
|
* @return {boolean} True if at the vertical edge, false if not.
|
|
10
10
|
*/
|
|
11
|
-
export default function isVerticalEdge(
|
|
11
|
+
export default function isVerticalEdge(
|
|
12
|
+
container: HTMLElement,
|
|
13
|
+
isReverse: boolean
|
|
14
|
+
): boolean {
|
|
12
15
|
return isEdge( container, isReverse, true );
|
|
13
16
|
}
|
|
@@ -7,13 +7,17 @@ import { scrollIfNoRange } from './scroll-if-no-range';
|
|
|
7
7
|
/**
|
|
8
8
|
* Gets the range to place.
|
|
9
9
|
*
|
|
10
|
-
* @param
|
|
11
|
-
* @param
|
|
12
|
-
* @param
|
|
10
|
+
* @param container Focusable element.
|
|
11
|
+
* @param isReverse True for end, false for start.
|
|
12
|
+
* @param x X coordinate to vertically position.
|
|
13
13
|
*
|
|
14
|
-
* @return
|
|
14
|
+
* @return The range to place.
|
|
15
15
|
*/
|
|
16
|
-
function getRange(
|
|
16
|
+
function getRange(
|
|
17
|
+
container: HTMLElement,
|
|
18
|
+
isReverse: boolean,
|
|
19
|
+
x: number | undefined
|
|
20
|
+
): Range | null {
|
|
17
21
|
const { ownerDocument } = container;
|
|
18
22
|
// In the case of RTL scripts, the horizontal edge is at the opposite side.
|
|
19
23
|
const isReverseDir = isRTL( container ) ? ! isReverse : isReverse;
|
|
@@ -36,11 +40,15 @@ function getRange( container, isReverse, x ) {
|
|
|
36
40
|
/**
|
|
37
41
|
* Places the caret at start or end of a given element.
|
|
38
42
|
*
|
|
39
|
-
* @param
|
|
40
|
-
* @param
|
|
41
|
-
* @param
|
|
43
|
+
* @param container Focusable element.
|
|
44
|
+
* @param isReverse True for end, false for start.
|
|
45
|
+
* @param x X coordinate to vertically position.
|
|
42
46
|
*/
|
|
43
|
-
export default function placeCaretAtEdge(
|
|
47
|
+
export default function placeCaretAtEdge(
|
|
48
|
+
container: HTMLElement,
|
|
49
|
+
isReverse: boolean,
|
|
50
|
+
x: number | undefined
|
|
51
|
+
) {
|
|
44
52
|
if ( ! container ) {
|
|
45
53
|
return;
|
|
46
54
|
}
|
|
@@ -6,6 +6,9 @@ import placeCaretAtEdge from './place-caret-at-edge';
|
|
|
6
6
|
* @param {HTMLElement} container Focusable element.
|
|
7
7
|
* @param {boolean} isReverse True for end, false for start.
|
|
8
8
|
*/
|
|
9
|
-
export default function placeCaretAtHorizontalEdge(
|
|
9
|
+
export default function placeCaretAtHorizontalEdge(
|
|
10
|
+
container: HTMLElement,
|
|
11
|
+
isReverse: boolean
|
|
12
|
+
) {
|
|
10
13
|
return placeCaretAtEdge( container, isReverse, undefined );
|
|
11
14
|
}
|
|
@@ -7,6 +7,10 @@ import placeCaretAtEdge from './place-caret-at-edge';
|
|
|
7
7
|
* @param {boolean} isReverse True for bottom, false for top.
|
|
8
8
|
* @param {DOMRect} [rect] The rectangle to position the caret with.
|
|
9
9
|
*/
|
|
10
|
-
export default function placeCaretAtVerticalEdge(
|
|
10
|
+
export default function placeCaretAtVerticalEdge(
|
|
11
|
+
container: HTMLElement,
|
|
12
|
+
isReverse: boolean,
|
|
13
|
+
rect?: DOMRect
|
|
14
|
+
) {
|
|
11
15
|
return placeCaretAtEdge( container, isReverse, rect?.left );
|
|
12
16
|
}
|