inclusive-elements 0.6.0 → 0.6.1

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/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # Changelog
2
2
 
3
+ ### [0.6.1](https://github.com/tobyzerner/inclusive-elements/compare/v0.6.0...v0.6.1) (2026-03-23)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **demo:** hide reactions menu ([df0afa8](https://github.com/tobyzerner/inclusive-elements/commit/df0afa896688cf342f7c3d7808296f881aaaa1a7))
9
+ * **menu:** return focus to root trigger on Escape and Tab ([9c9b28a](https://github.com/tobyzerner/inclusive-elements/commit/9c9b28ae181f42efd76abc10809ac1f4a7a6c9e6))
10
+ * **tabs:** prevent attribute observer loop ([48e2043](https://github.com/tobyzerner/inclusive-elements/commit/48e2043350267b3fc7aa7b649b235d74d25cbc07))
11
+
3
12
  ## [0.6.0](https://github.com/tobyzerner/inclusive-elements/compare/v0.5.5...v0.6.0) (2026-03-23)
4
13
 
5
14
  ### Overview
@@ -355,4 +364,4 @@ The runtime surface is now centered on `ui-alerts`, `ui-menu`, `ui-tabs`, `ui-to
355
364
  [0.1.0-beta.5]: https://github.com/tobyzerner/inclusive-elements/compare/v0.1.0-beta.4...v0.1.0-beta.5
356
365
  [0.1.0-beta.4]: https://github.com/tobyzerner/inclusive-elements/compare/v0.1.0-beta.3...v0.1.0-beta.4
357
366
  [0.1.0-beta.3]: https://github.com/tobyzerner/inclusive-elements/compare/v0.1.0-beta.2...v0.1.0-beta.3
358
- [0.1.0-beta.2]: https://github.com/tobyzerner/inclusive-elements/compare/v0.1.0-beta.1...v0.1.0-beta.2
367
+ [0.1.0-beta.2]: https://github.com/tobyzerner/inclusive-elements/compare/v0.1.0-beta.1...v0.1.0-beta.2
package/dist/index.js CHANGED
@@ -405,11 +405,11 @@ var I = class e extends HTMLElement {
405
405
  onKeyDown = (e) => {
406
406
  if (!this.isActive()) return;
407
407
  if (e.key === "Tab") {
408
- this.closeMenuTree();
408
+ this.closeMenuTree(), this.focusRootMenuTrigger();
409
409
  return;
410
410
  }
411
411
  if (e.key === "Escape") {
412
- e.preventDefault(), this.closeMenuTree();
412
+ e.preventDefault(), this.closeMenuTree(), this.focusRootMenuTrigger();
413
413
  return;
414
414
  }
415
415
  let t = this.getEnabledItems(), n = this.getActiveItem(t), r = n ? t.indexOf(n) : -1;
@@ -531,6 +531,13 @@ var I = class e extends HTMLElement {
531
531
  closeMenuTree() {
532
532
  this.closeSelfAndDescendants(), this.getParentMenu()?.closeMenuTree();
533
533
  }
534
+ focusRootMenuTrigger() {
535
+ this.getRootMenuTrigger()?.focus({ preventScroll: !0 });
536
+ }
537
+ getRootMenuTrigger() {
538
+ let e = this.getParentMenu();
539
+ return e ? e.getRootMenuTrigger() : this.getTriggers()[0] || null;
540
+ }
534
541
  handleTypeahead(e, t, n) {
535
542
  if (e.key === " " || e.key.length > 1 || e.ctrlKey || e.metaKey || e.altKey || !t.length) return;
536
543
  e.preventDefault();
@@ -733,7 +740,7 @@ var I = class e extends HTMLElement {
733
740
  subtree: !0,
734
741
  childList: !0,
735
742
  attributes: !0,
736
- attributeFilter: ["role", "tabindex"]
743
+ attributeFilter: ["role", "aria-selected"]
737
744
  }, () => this.syncStructure()), this.structureSync.observe(), this.structureSync.queue();
738
745
  }
739
746
  disconnectedCallback() {
@@ -798,11 +805,12 @@ var I = class e extends HTMLElement {
798
805
  let a = this.getSelectedIndex(e);
799
806
  return e.forEach(({ tab: e, panel: n }, i) => {
800
807
  let a = i === t;
801
- e.setAttribute("aria-selected", String(a)), a ? (e.removeAttribute("tabindex"), n.hidden = !1, r && e.focus()) : (e.setAttribute("tabindex", "-1"), n.hidden = !0), this.syncPanelTabindex(n, a);
808
+ e.getAttribute("aria-selected") !== String(a) && e.setAttribute("aria-selected", String(a)), a ? (e.removeAttribute("tabindex"), n.hidden = !1, r && e.focus()) : (e.setAttribute("tabindex", "-1"), n.hidden = !0), this.syncPanelTabindex(n, a);
802
809
  }), i && a !== t && this.dispatchEvent(new Event("change")), a !== t;
803
810
  }
804
811
  syncPanelTabindex(e, t) {
805
- if (t && !this.hasAuthorManagedTabindex(e) && me(e).length === 0) {
812
+ let n = me(e).filter((t) => t !== e);
813
+ if (t && !this.hasAuthorManagedTabindex(e) && n.length === 0) {
806
814
  e.setAttribute("tabindex", "0"), this.managedPanelTabindex.add(e);
807
815
  return;
808
816
  }
@@ -32,6 +32,8 @@ export default class MenuElement extends HTMLElement {
32
32
  private closeSubmenus;
33
33
  private closeSelfAndDescendants;
34
34
  private closeMenuTree;
35
+ private focusRootMenuTrigger;
36
+ private getRootMenuTrigger;
35
37
  private handleTypeahead;
36
38
  private updateTypeaheadSearch;
37
39
  private findTypeaheadMatch;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "inclusive-elements",
3
- "version": "0.6.0",
3
+ "version": "0.6.1",
4
4
  "description": "Accessible, lightweight, unstyled implementations of UI patterns that still need runtime help.",
5
5
  "type": "module",
6
6
  "module": "dist/index.js",