power-focusable 4.1.3 → 4.1.5

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 CHANGED
@@ -105,11 +105,14 @@ getFocusables(container, { composed: true });
105
105
 
106
106
  // Uses custom filter function
107
107
  getFocusables(container, { filter: (element) => !element.matches('[data-skip-focus]') });
108
+
109
+ // Uses custom include function
110
+ getFocusables(container, { filter: (element) => element.matches('[data-roving-tabindex]') });
108
111
  ```
109
112
 
110
113
  ### `getNextFocusable`
111
114
 
112
- Returns the next focusable element within the container, starting from `document.activeElement`.
115
+ Returns the next focusable element within the container, starting from active element.
113
116
 
114
117
  ```ts
115
118
  getNextFocusable(container);
@@ -126,13 +129,16 @@ getNextFocusable(container, { composed: true });
126
129
  // Uses custom filter function
127
130
  getNextFocusable(container, { filter: (element) => !element.matches('[data-skip-focus]') });
128
131
 
132
+ // Uses custom include function
133
+ getNextFocusable(container, { filter: (element) => element.matches('[data-roving-tabindex]') });
134
+
129
135
  // Wraps around to the first element when reaching the end
130
136
  getNextFocusable(container, { wrap: true });
131
137
  ```
132
138
 
133
139
  ### `getPreviousFocusable`
134
140
 
135
- Returns the previous focusable element within the container, starting from `document.activeElement`.
141
+ Returns the previous focusable element within the container, starting from active element.
136
142
 
137
143
  ```ts
138
144
  getPreviousFocusable(container);
@@ -149,7 +155,10 @@ getPreviousFocusable(container, { composed: true });
149
155
  // Uses custom filter function
150
156
  getPreviousFocusable(container, { filter: (element) => !element.matches('[data-skip-focus]') });
151
157
 
152
- //Wraps around to the last element when reaching the end
158
+ // Uses custom include function
159
+ getPreviousFocusable(container, { filter: (element) => element.matches('[data-roving-tabindex]') });
160
+
161
+ // Wraps around to the last element when reaching the end
153
162
  getPreviousFocusable(container, { wrap: true });
154
163
 
155
164
  ```
@@ -169,6 +178,9 @@ hasFocusable(container, { composed: true });
169
178
 
170
179
  // Uses custom filter function
171
180
  hasFocusable(container, { filter: (element) => !element.matches('[data-skip-focus]') });
181
+
182
+ // Uses custom include function
183
+ hasFocusable(container, { filter: (element) => element.matches('[data-roving-tabindex]') });
172
184
  ```
173
185
 
174
186
  ### `inertOutside`
package/dist/index.cjs CHANGED
@@ -6,10 +6,10 @@ function createFocusTrap(container = document.body) {
6
6
  if (!(container instanceof Element)) {
7
7
  throw new Error("Invalid container element");
8
8
  }
9
- focus(container);
9
+ focusElement(container);
10
10
  if (getActiveElement() !== container) {
11
11
  const first = getFocusables(container, { composed: true })[0];
12
- first && focus(first);
12
+ first && focusElement(first);
13
13
  }
14
14
  function onKeyDown(event) {
15
15
  const { key, altKey, ctrlKey, metaKey, shiftKey } = event;
@@ -27,7 +27,7 @@ function createFocusTrap(container = document.body) {
27
27
  return;
28
28
  }
29
29
  event.preventDefault();
30
- focus(focusable);
30
+ focusElement(focusable);
31
31
  }
32
32
  let controller = new AbortController();
33
33
  document.addEventListener("keydown", onKeyDown, {
@@ -47,11 +47,11 @@ function getFocusables(container = document.body, options = {}) {
47
47
  const { composed = false } = options;
48
48
  let { filter, include } = options;
49
49
  if (filter && typeof filter !== "function") {
50
- console.warn("Invalid filter function. Fallback: undefined.");
50
+ console.warn("Invalid filter function");
51
51
  filter = void 0;
52
52
  }
53
53
  if (include && typeof include !== "function") {
54
- console.warn("Invalid include function. Fallback: undefined.");
54
+ console.warn("Invalid include function");
55
55
  include = void 0;
56
56
  }
57
57
  const elements = [];
@@ -177,7 +177,7 @@ function getRelativeFocusable(container, offset, options) {
177
177
  }
178
178
  }
179
179
  if (!containsComposed(container, anchor)) {
180
- console.warn("Mismatch elements");
180
+ console.warn("Anchor (active) element not within container");
181
181
  return null;
182
182
  }
183
183
  const focusables = getFocusables(container, { composed, filter, include });
@@ -345,7 +345,7 @@ function applyInert(element) {
345
345
  }
346
346
  const count = inertRefCounts.get(element) ?? 0;
347
347
  inertRefCounts.set(element, count + 1);
348
- count === 0 && element.toggleAttribute("inert", true);
348
+ count === 0 && element.setAttribute("inert", "");
349
349
  return true;
350
350
  }
351
351
  function restoreInert(element) {
@@ -355,12 +355,12 @@ function restoreInert(element) {
355
355
  }
356
356
  if (count === 1) {
357
357
  inertRefCounts.delete(element);
358
- element.toggleAttribute("inert", false);
358
+ element.removeAttribute("inert");
359
359
  return;
360
360
  }
361
361
  inertRefCounts.set(element, count - 1);
362
362
  }
363
- function focus(element) {
363
+ function focusElement(element) {
364
364
  "focus" in element && typeof element.focus === "function" && element.focus();
365
365
  }
366
366
  function getActiveElement() {
@@ -411,7 +411,7 @@ function isUngroupedRadio(element) {
411
411
  * High-precision focus management utility with full composed tree support.
412
412
  * Handles complex focus rules including tabindex ordering, radio groups, inert.
413
413
  *
414
- * @version 4.1.3
414
+ * @version 4.1.5
415
415
  * @author Yusuke Kamiyamane
416
416
  * @license MIT
417
417
  * @copyright Copyright (c) Yusuke Kamiyamane
package/dist/index.d.cts CHANGED
@@ -3,7 +3,7 @@
3
3
  * High-precision focus management utility with full composed tree support.
4
4
  * Handles complex focus rules including tabindex ordering, radio groups, inert.
5
5
  *
6
- * @version 4.1.3
6
+ * @version 4.1.5
7
7
  * @author Yusuke Kamiyamane
8
8
  * @license MIT
9
9
  * @copyright Copyright (c) Yusuke Kamiyamane
package/dist/index.d.ts CHANGED
@@ -3,7 +3,7 @@
3
3
  * High-precision focus management utility with full composed tree support.
4
4
  * Handles complex focus rules including tabindex ordering, radio groups, inert.
5
5
  *
6
- * @version 4.1.3
6
+ * @version 4.1.5
7
7
  * @author Yusuke Kamiyamane
8
8
  * @license MIT
9
9
  * @copyright Copyright (c) Yusuke Kamiyamane
package/dist/index.js CHANGED
@@ -4,10 +4,10 @@ function createFocusTrap(container = document.body) {
4
4
  if (!(container instanceof Element)) {
5
5
  throw new Error("Invalid container element");
6
6
  }
7
- focus(container);
7
+ focusElement(container);
8
8
  if (getActiveElement() !== container) {
9
9
  const first = getFocusables(container, { composed: true })[0];
10
- first && focus(first);
10
+ first && focusElement(first);
11
11
  }
12
12
  function onKeyDown(event) {
13
13
  const { key, altKey, ctrlKey, metaKey, shiftKey } = event;
@@ -25,7 +25,7 @@ function createFocusTrap(container = document.body) {
25
25
  return;
26
26
  }
27
27
  event.preventDefault();
28
- focus(focusable);
28
+ focusElement(focusable);
29
29
  }
30
30
  let controller = new AbortController();
31
31
  document.addEventListener("keydown", onKeyDown, {
@@ -45,11 +45,11 @@ function getFocusables(container = document.body, options = {}) {
45
45
  const { composed = false } = options;
46
46
  let { filter, include } = options;
47
47
  if (filter && typeof filter !== "function") {
48
- console.warn("Invalid filter function. Fallback: undefined.");
48
+ console.warn("Invalid filter function");
49
49
  filter = void 0;
50
50
  }
51
51
  if (include && typeof include !== "function") {
52
- console.warn("Invalid include function. Fallback: undefined.");
52
+ console.warn("Invalid include function");
53
53
  include = void 0;
54
54
  }
55
55
  const elements = [];
@@ -175,7 +175,7 @@ function getRelativeFocusable(container, offset, options) {
175
175
  }
176
176
  }
177
177
  if (!containsComposed(container, anchor)) {
178
- console.warn("Mismatch elements");
178
+ console.warn("Anchor (active) element not within container");
179
179
  return null;
180
180
  }
181
181
  const focusables = getFocusables(container, { composed, filter, include });
@@ -343,7 +343,7 @@ function applyInert(element) {
343
343
  }
344
344
  const count = inertRefCounts.get(element) ?? 0;
345
345
  inertRefCounts.set(element, count + 1);
346
- count === 0 && element.toggleAttribute("inert", true);
346
+ count === 0 && element.setAttribute("inert", "");
347
347
  return true;
348
348
  }
349
349
  function restoreInert(element) {
@@ -353,12 +353,12 @@ function restoreInert(element) {
353
353
  }
354
354
  if (count === 1) {
355
355
  inertRefCounts.delete(element);
356
- element.toggleAttribute("inert", false);
356
+ element.removeAttribute("inert");
357
357
  return;
358
358
  }
359
359
  inertRefCounts.set(element, count - 1);
360
360
  }
361
- function focus(element) {
361
+ function focusElement(element) {
362
362
  "focus" in element && typeof element.focus === "function" && element.focus();
363
363
  }
364
364
  function getActiveElement() {
@@ -409,7 +409,7 @@ function isUngroupedRadio(element) {
409
409
  * High-precision focus management utility with full composed tree support.
410
410
  * Handles complex focus rules including tabindex ordering, radio groups, inert.
411
411
  *
412
- * @version 4.1.3
412
+ * @version 4.1.5
413
413
  * @author Yusuke Kamiyamane
414
414
  * @license MIT
415
415
  * @copyright Copyright (c) Yusuke Kamiyamane
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "power-focusable",
3
- "version": "4.1.3",
3
+ "version": "4.1.5",
4
4
  "description": "High-precision focus management utility with full composed tree support",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",