@u-elements/u-tabs 0.0.12 → 0.1.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/dist/u-tabs.cjs CHANGED
@@ -46,9 +46,11 @@ var mutationObserver = (element, options) => {
46
46
  }
47
47
  };
48
48
  var asButton = (event) => {
49
- const isClick = "key" in event && (event.key === " " || event.key === "Enter");
50
- if (isClick) event.preventDefault();
51
- if (isClick && event.target instanceof HTMLElement) event.target.click();
49
+ var _a2;
50
+ const isClick = event.key === " " || event.key === "Enter";
51
+ if (isClick) (_a2 = event.preventDefault) == null ? void 0 : _a2.call(event);
52
+ if (isClick && event.target instanceof HTMLElement)
53
+ event.target.dispatchEvent(new MouseEvent("click", event));
52
54
  return isClick;
53
55
  };
54
56
  var getRoot = (node) => {
@@ -62,9 +64,9 @@ var useId = (el) => {
62
64
  if (!el.id) el.id = `:${el.nodeName.toLowerCase()}${(++id).toString(32)}`;
63
65
  return el.id;
64
66
  };
65
- var createElement = (tagName, text, attrs) => {
67
+ var createElement = (tagName, content, attrs) => {
66
68
  const el = document.createElement(tagName);
67
- if (text) el.textContent = text;
69
+ if (content) el[tagName === "style" ? "textContent" : "innerHTML"] = content;
68
70
  return el;
69
71
  };
70
72
  var customElements = {
@@ -83,13 +85,15 @@ var UHTMLTabShadowRoot = declarativeShadowRoot(UHTMLTabStyle);
83
85
  var UHTMLTabPanelShadowRoot = declarativeShadowRoot(UHTMLTabPanelStyle);
84
86
  var ARIA_CONTROLS = "aria-controls";
85
87
  var ARIA_SELECTED = "aria-selected";
88
+ var ATTR_TABS = "data-utabs";
86
89
  var UHTMLTabsElement = class extends UHTMLElement {
87
90
  constructor() {
88
91
  super();
92
+ attr(this, ATTR_TABS, "");
89
93
  attachStyle(this, UHTMLTabsStyle);
90
94
  }
91
95
  get tabList() {
92
- return queryWithoutNested("u-tablist", this)[0] || null;
96
+ return queryWithoutNested("tablist", this)[0] || null;
93
97
  }
94
98
  get selectedIndex() {
95
99
  return getSelectedIndex(this.tabs);
@@ -98,10 +102,10 @@ var UHTMLTabsElement = class extends UHTMLElement {
98
102
  setSelected(this.tabs[index]);
99
103
  }
100
104
  get tabs() {
101
- return queryWithoutNested("u-tab", this);
105
+ return queryWithoutNested("tab", this);
102
106
  }
103
107
  get panels() {
104
- return queryWithoutNested("u-tabpanel", this);
108
+ return queryWithoutNested("tabpanel", this);
105
109
  }
106
110
  };
107
111
  var UHTMLTabListElement = class extends UHTMLElement {
@@ -113,13 +117,14 @@ var UHTMLTabListElement = class extends UHTMLElement {
113
117
  attr(this, "role", "tablist");
114
118
  on(this, "click,keydown", this);
115
119
  mutationObserver(this, { childList: true });
116
- if (this.tabs.length) this.handleEvent();
120
+ requestAnimationFrame(() => this.handleEvent());
117
121
  }
118
122
  disconnectedCallback() {
119
123
  off(this, "click,keydown", this);
120
124
  mutationObserver(this, false);
121
125
  }
122
126
  handleEvent(event) {
127
+ var _a2, _b;
123
128
  if (!event || event.type === "mutation") {
124
129
  const tab = this.tabs[Math.max(this.selectedIndex, 0)];
125
130
  return tab == null ? void 0 : tab.setAttribute(ARIA_SELECTED, "true");
@@ -140,20 +145,20 @@ var UHTMLTabListElement = class extends UHTMLElement {
140
145
  else if (key === "Tab") next = getSelectedIndex(tabs);
141
146
  else return;
142
147
  setTimeout(() => {
143
- tabs[prev].tabIndex = -1;
144
- tabs[next].tabIndex = 0;
148
+ attr(tabs[prev], "tabindex", "-1");
149
+ attr(tabs[next], "tabindex", "0");
145
150
  });
146
151
  if (key !== "Tab") {
147
152
  event.preventDefault();
148
- tabs[next].focus();
153
+ (_b = (_a2 = tabs[next]).focus) == null ? void 0 : _b.call(_a2);
149
154
  }
150
155
  }
151
156
  }
152
157
  get tabsElement() {
153
- return this.closest("u-tabs");
158
+ return getTabsElement(this);
154
159
  }
155
160
  get tabs() {
156
- return this.querySelectorAll("u-tab");
161
+ return getTabs(this);
157
162
  }
158
163
  get selectedIndex() {
159
164
  return getSelectedIndex(this.tabs);
@@ -162,7 +167,7 @@ var UHTMLTabListElement = class extends UHTMLElement {
162
167
  setSelected(this.tabs[index]);
163
168
  }
164
169
  };
165
- var SKIP_ATTR_CHANGE = false;
170
+ var SKIP_ATTR_CHANGE_TAB = false;
166
171
  var UHTMLTabElement = class extends UHTMLElement {
167
172
  // Using ES2015 syntax for backwards compatibility
168
173
  static get observedAttributes() {
@@ -174,31 +179,32 @@ var UHTMLTabElement = class extends UHTMLElement {
174
179
  }
175
180
  connectedCallback() {
176
181
  attr(this, "role", "tab");
177
- this.tabIndex = this.selected ? 0 : -1;
182
+ attr(this, "tabindex", this.selected ? "0" : "-1");
178
183
  }
179
184
  attributeChangedCallback() {
180
- if (!SKIP_ATTR_CHANGE && this.selected && this.tabList) {
181
- SKIP_ATTR_CHANGE = true;
182
- const tabs = [...this.tabList.querySelectorAll("u-tab")];
183
- const panels = queryWithoutNested("u-tabpanel", this.tabsElement || this);
184
- const nextPanel = getPanel(this, panels[tabs.indexOf(this)]);
185
+ if (!SKIP_ATTR_CHANGE_TAB && this.selected && this.tabList) {
186
+ SKIP_ATTR_CHANGE_TAB = true;
187
+ const tabs = this.tabList ? getTabs(this.tabList) : [];
188
+ const panels = queryWithoutNested("tabpanel", this.tabsElement || this);
189
+ const nextPanel = getPanel(this, panels[[...tabs].indexOf(this)]);
185
190
  if (nextPanel) attr(nextPanel, SAFE_LABELLEDBY, useId(this));
186
- tabs.forEach((tab, index) => {
187
- const panel = getPanel(tab, panels[index]);
188
- tab.tabIndex = tab === this ? 0 : -1;
191
+ let i = 0;
192
+ for (const tab of tabs) {
193
+ const panel = getPanel(tab, panels[i++]);
194
+ attr(tab, "tabindex", tab === this ? "0" : "-1");
189
195
  attr(tab, ARIA_SELECTED, `${tab === this}`);
190
- attr(tab, ARIA_CONTROLS, (panel == null ? void 0 : panel.id) || null);
196
+ if (panel == null ? void 0 : panel.id) attr(tab, ARIA_CONTROLS, panel.id);
191
197
  if (panel) panel.hidden = panel !== nextPanel;
192
- });
193
- SKIP_ATTR_CHANGE = false;
198
+ }
199
+ SKIP_ATTR_CHANGE_TAB = false;
194
200
  }
195
201
  }
196
202
  get tabsElement() {
197
- return this.closest("u-tabs");
203
+ return getTabsElement(this);
198
204
  }
199
205
  get tabList() {
200
206
  const tablist = this.parentElement;
201
- return (tablist == null ? void 0 : tablist.nodeName) === "U-TABLIST" ? tablist : null;
207
+ return (tablist == null ? void 0 : tablist.getAttribute("role")) === "tablist" ? tablist : null;
202
208
  }
203
209
  get selected() {
204
210
  return attr(this, ARIA_SELECTED) === "true";
@@ -208,47 +214,54 @@ var UHTMLTabElement = class extends UHTMLElement {
208
214
  }
209
215
  /** Retrieves the ordinal position of an tab in a tablist. */
210
216
  get index() {
211
- const tabList = this.tabList;
212
- return tabList ? [...tabList.querySelectorAll("u-tab")].indexOf(this) : 0;
217
+ const tablist = this.tabList;
218
+ return tablist ? [...getTabs(tablist)].indexOf(this) : 0;
213
219
  }
214
220
  get panel() {
215
221
  return getPanel(this);
216
222
  }
217
223
  };
224
+ var SKIP_ATTR_CHANGE_PANEL = false;
218
225
  var UHTMLTabPanelElement = class extends UHTMLElement {
219
226
  // Using ES2015 syntax for backwards compatibility
220
227
  static get observedAttributes() {
221
- return ["hidden"];
228
+ return ["id", "hidden"];
222
229
  }
223
230
  constructor() {
224
231
  super();
225
232
  attachStyle(this, UHTMLTabPanelStyle);
226
233
  }
227
234
  connectedCallback() {
235
+ var _a2, _b;
228
236
  attr(this, "role", "tabpanel");
229
- this.hidden = getSelectedIndex(this.tabs) === -1;
237
+ (_b = (_a2 = this.tabsElement) == null ? void 0 : _a2.tabList) == null ? void 0 : _b.handleEvent();
230
238
  this.attributeChangedCallback();
231
239
  }
232
240
  attributeChangedCallback() {
233
- const hidden = this.hidden;
234
- attr(this, "aria-hidden", `${hidden}`);
235
- attr(this, "tabindex", hidden || isFocusable(this.firstChild) ? null : "0");
241
+ if (SKIP_ATTR_CHANGE_PANEL) return;
242
+ SKIP_ATTR_CHANGE_PANEL = true;
243
+ const hasFocusable = isFocusable(this.firstChild);
244
+ this.hidden = getSelectedIndex(this.tabs) === -1;
245
+ attr(this, "aria-hidden", `${this.hidden}`);
246
+ attr(this, "tabindex", this.hidden || hasFocusable ? null : "0");
247
+ SKIP_ATTR_CHANGE_PANEL = false;
236
248
  }
237
249
  get tabsElement() {
238
- return this.closest("u-tabs");
250
+ return getTabsElement(this);
239
251
  }
240
252
  get tabs() {
241
- const css = `u-tab[${ARIA_CONTROLS}="${this.id}"]`;
242
- return getRoot(this).querySelectorAll(css);
253
+ return getRoot(this).querySelectorAll(
254
+ `[role="tab"][${ARIA_CONTROLS}="${this.id}"]`
255
+ );
243
256
  }
244
257
  };
245
- var queryWithoutNested = (tag, self) => self.querySelectorAll(`${tag}:not(:scope u-tabpanel ${tag})`);
246
- var getPanel = (tab, panel) => {
247
- const id2 = attr(tab, ARIA_CONTROLS) || useId(panel);
248
- const el = getRoot(tab).getElementById(id2);
249
- return (el == null ? void 0 : el.nodeName) === "U-TABPANEL" ? el : null;
250
- };
258
+ var queryWithoutNested = (role, self) => self.querySelectorAll(
259
+ `[role="${role}"]:not(:scope [role="tabpanel"] [role="${role}"])`
260
+ );
261
+ var getPanel = (tab, panel) => getRoot(tab).getElementById(attr(tab, ARIA_CONTROLS) || useId(panel));
251
262
  var getSelectedIndex = (tabs) => [...tabs].findIndex((tab) => attr(tab, ARIA_SELECTED) === "true");
263
+ var getTabsElement = (self) => self.closest(`[${ATTR_TABS}]`);
264
+ var getTabs = (self) => self.querySelectorAll(`:scope > [role="tab"]`);
252
265
  var setSelected = (tab) => tab && attr(tab, "aria-disabled") !== "true" && attr(tab, "aria-selected", "true");
253
266
  var isFocusable = (el) => el instanceof Element && !el.matches(':disabled,[tabindex^="-"]') && el.matches(
254
267
  `[contenteditable],[controls],[href],[tabindex],input:not([type="hidden"]),select,textarea,button,summary,iframe`
package/dist/u-tabs.d.cts CHANGED
@@ -40,7 +40,7 @@ declare class UHTMLTabListElement extends UHTMLElement {
40
40
  connectedCallback(): void;
41
41
  disconnectedCallback(): void;
42
42
  handleEvent(event?: Event): void;
43
- get tabsElement(): UHTMLTabsElement | null;
43
+ get tabsElement(): HTMLElement | null;
44
44
  get tabs(): NodeListOf<UHTMLTabElement>;
45
45
  get selectedIndex(): number;
46
46
  set selectedIndex(index: number);
@@ -56,12 +56,8 @@ declare class UHTMLTabElement extends UHTMLElement {
56
56
  set selected(value: boolean);
57
57
  /** Retrieves the ordinal position of an tab in a tablist. */
58
58
  get index(): number;
59
- get panel(): UHTMLTabPanelElement | null;
59
+ get panel(): HTMLElement | null;
60
60
  }
61
- /**
62
- * The `<u-tabpanel>` HTML element is a container for the resources of layered content associated with a `<u-tab>`.
63
- * [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/tabpanel_role)
64
- */
65
61
  declare class UHTMLTabPanelElement extends UHTMLElement {
66
62
  static get observedAttributes(): string[];
67
63
  constructor();
package/dist/u-tabs.d.ts CHANGED
@@ -40,7 +40,7 @@ declare class UHTMLTabListElement extends UHTMLElement {
40
40
  connectedCallback(): void;
41
41
  disconnectedCallback(): void;
42
42
  handleEvent(event?: Event): void;
43
- get tabsElement(): UHTMLTabsElement | null;
43
+ get tabsElement(): HTMLElement | null;
44
44
  get tabs(): NodeListOf<UHTMLTabElement>;
45
45
  get selectedIndex(): number;
46
46
  set selectedIndex(index: number);
@@ -56,12 +56,8 @@ declare class UHTMLTabElement extends UHTMLElement {
56
56
  set selected(value: boolean);
57
57
  /** Retrieves the ordinal position of an tab in a tablist. */
58
58
  get index(): number;
59
- get panel(): UHTMLTabPanelElement | null;
59
+ get panel(): HTMLElement | null;
60
60
  }
61
- /**
62
- * The `<u-tabpanel>` HTML element is a container for the resources of layered content associated with a `<u-tab>`.
63
- * [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/tabpanel_role)
64
- */
65
61
  declare class UHTMLTabPanelElement extends UHTMLElement {
66
62
  static get observedAttributes(): string[];
67
63
  constructor();
package/dist/u-tabs.js CHANGED
@@ -44,9 +44,11 @@ var mutationObserver = (element, options) => {
44
44
  }
45
45
  };
46
46
  var asButton = (event) => {
47
- const isClick = "key" in event && (event.key === " " || event.key === "Enter");
48
- if (isClick) event.preventDefault();
49
- if (isClick && event.target instanceof HTMLElement) event.target.click();
47
+ var _a2;
48
+ const isClick = event.key === " " || event.key === "Enter";
49
+ if (isClick) (_a2 = event.preventDefault) == null ? void 0 : _a2.call(event);
50
+ if (isClick && event.target instanceof HTMLElement)
51
+ event.target.dispatchEvent(new MouseEvent("click", event));
50
52
  return isClick;
51
53
  };
52
54
  var getRoot = (node) => {
@@ -60,9 +62,9 @@ var useId = (el) => {
60
62
  if (!el.id) el.id = `:${el.nodeName.toLowerCase()}${(++id).toString(32)}`;
61
63
  return el.id;
62
64
  };
63
- var createElement = (tagName, text, attrs) => {
65
+ var createElement = (tagName, content, attrs) => {
64
66
  const el = document.createElement(tagName);
65
- if (text) el.textContent = text;
67
+ if (content) el[tagName === "style" ? "textContent" : "innerHTML"] = content;
66
68
  return el;
67
69
  };
68
70
  var customElements = {
@@ -81,13 +83,15 @@ var UHTMLTabShadowRoot = declarativeShadowRoot(UHTMLTabStyle);
81
83
  var UHTMLTabPanelShadowRoot = declarativeShadowRoot(UHTMLTabPanelStyle);
82
84
  var ARIA_CONTROLS = "aria-controls";
83
85
  var ARIA_SELECTED = "aria-selected";
86
+ var ATTR_TABS = "data-utabs";
84
87
  var UHTMLTabsElement = class extends UHTMLElement {
85
88
  constructor() {
86
89
  super();
90
+ attr(this, ATTR_TABS, "");
87
91
  attachStyle(this, UHTMLTabsStyle);
88
92
  }
89
93
  get tabList() {
90
- return queryWithoutNested("u-tablist", this)[0] || null;
94
+ return queryWithoutNested("tablist", this)[0] || null;
91
95
  }
92
96
  get selectedIndex() {
93
97
  return getSelectedIndex(this.tabs);
@@ -96,10 +100,10 @@ var UHTMLTabsElement = class extends UHTMLElement {
96
100
  setSelected(this.tabs[index]);
97
101
  }
98
102
  get tabs() {
99
- return queryWithoutNested("u-tab", this);
103
+ return queryWithoutNested("tab", this);
100
104
  }
101
105
  get panels() {
102
- return queryWithoutNested("u-tabpanel", this);
106
+ return queryWithoutNested("tabpanel", this);
103
107
  }
104
108
  };
105
109
  var UHTMLTabListElement = class extends UHTMLElement {
@@ -111,13 +115,14 @@ var UHTMLTabListElement = class extends UHTMLElement {
111
115
  attr(this, "role", "tablist");
112
116
  on(this, "click,keydown", this);
113
117
  mutationObserver(this, { childList: true });
114
- if (this.tabs.length) this.handleEvent();
118
+ requestAnimationFrame(() => this.handleEvent());
115
119
  }
116
120
  disconnectedCallback() {
117
121
  off(this, "click,keydown", this);
118
122
  mutationObserver(this, false);
119
123
  }
120
124
  handleEvent(event) {
125
+ var _a2, _b;
121
126
  if (!event || event.type === "mutation") {
122
127
  const tab = this.tabs[Math.max(this.selectedIndex, 0)];
123
128
  return tab == null ? void 0 : tab.setAttribute(ARIA_SELECTED, "true");
@@ -138,20 +143,20 @@ var UHTMLTabListElement = class extends UHTMLElement {
138
143
  else if (key === "Tab") next = getSelectedIndex(tabs);
139
144
  else return;
140
145
  setTimeout(() => {
141
- tabs[prev].tabIndex = -1;
142
- tabs[next].tabIndex = 0;
146
+ attr(tabs[prev], "tabindex", "-1");
147
+ attr(tabs[next], "tabindex", "0");
143
148
  });
144
149
  if (key !== "Tab") {
145
150
  event.preventDefault();
146
- tabs[next].focus();
151
+ (_b = (_a2 = tabs[next]).focus) == null ? void 0 : _b.call(_a2);
147
152
  }
148
153
  }
149
154
  }
150
155
  get tabsElement() {
151
- return this.closest("u-tabs");
156
+ return getTabsElement(this);
152
157
  }
153
158
  get tabs() {
154
- return this.querySelectorAll("u-tab");
159
+ return getTabs(this);
155
160
  }
156
161
  get selectedIndex() {
157
162
  return getSelectedIndex(this.tabs);
@@ -160,7 +165,7 @@ var UHTMLTabListElement = class extends UHTMLElement {
160
165
  setSelected(this.tabs[index]);
161
166
  }
162
167
  };
163
- var SKIP_ATTR_CHANGE = false;
168
+ var SKIP_ATTR_CHANGE_TAB = false;
164
169
  var UHTMLTabElement = class extends UHTMLElement {
165
170
  // Using ES2015 syntax for backwards compatibility
166
171
  static get observedAttributes() {
@@ -172,31 +177,32 @@ var UHTMLTabElement = class extends UHTMLElement {
172
177
  }
173
178
  connectedCallback() {
174
179
  attr(this, "role", "tab");
175
- this.tabIndex = this.selected ? 0 : -1;
180
+ attr(this, "tabindex", this.selected ? "0" : "-1");
176
181
  }
177
182
  attributeChangedCallback() {
178
- if (!SKIP_ATTR_CHANGE && this.selected && this.tabList) {
179
- SKIP_ATTR_CHANGE = true;
180
- const tabs = [...this.tabList.querySelectorAll("u-tab")];
181
- const panels = queryWithoutNested("u-tabpanel", this.tabsElement || this);
182
- const nextPanel = getPanel(this, panels[tabs.indexOf(this)]);
183
+ if (!SKIP_ATTR_CHANGE_TAB && this.selected && this.tabList) {
184
+ SKIP_ATTR_CHANGE_TAB = true;
185
+ const tabs = this.tabList ? getTabs(this.tabList) : [];
186
+ const panels = queryWithoutNested("tabpanel", this.tabsElement || this);
187
+ const nextPanel = getPanel(this, panels[[...tabs].indexOf(this)]);
183
188
  if (nextPanel) attr(nextPanel, SAFE_LABELLEDBY, useId(this));
184
- tabs.forEach((tab, index) => {
185
- const panel = getPanel(tab, panels[index]);
186
- tab.tabIndex = tab === this ? 0 : -1;
189
+ let i = 0;
190
+ for (const tab of tabs) {
191
+ const panel = getPanel(tab, panels[i++]);
192
+ attr(tab, "tabindex", tab === this ? "0" : "-1");
187
193
  attr(tab, ARIA_SELECTED, `${tab === this}`);
188
- attr(tab, ARIA_CONTROLS, (panel == null ? void 0 : panel.id) || null);
194
+ if (panel == null ? void 0 : panel.id) attr(tab, ARIA_CONTROLS, panel.id);
189
195
  if (panel) panel.hidden = panel !== nextPanel;
190
- });
191
- SKIP_ATTR_CHANGE = false;
196
+ }
197
+ SKIP_ATTR_CHANGE_TAB = false;
192
198
  }
193
199
  }
194
200
  get tabsElement() {
195
- return this.closest("u-tabs");
201
+ return getTabsElement(this);
196
202
  }
197
203
  get tabList() {
198
204
  const tablist = this.parentElement;
199
- return (tablist == null ? void 0 : tablist.nodeName) === "U-TABLIST" ? tablist : null;
205
+ return (tablist == null ? void 0 : tablist.getAttribute("role")) === "tablist" ? tablist : null;
200
206
  }
201
207
  get selected() {
202
208
  return attr(this, ARIA_SELECTED) === "true";
@@ -206,47 +212,54 @@ var UHTMLTabElement = class extends UHTMLElement {
206
212
  }
207
213
  /** Retrieves the ordinal position of an tab in a tablist. */
208
214
  get index() {
209
- const tabList = this.tabList;
210
- return tabList ? [...tabList.querySelectorAll("u-tab")].indexOf(this) : 0;
215
+ const tablist = this.tabList;
216
+ return tablist ? [...getTabs(tablist)].indexOf(this) : 0;
211
217
  }
212
218
  get panel() {
213
219
  return getPanel(this);
214
220
  }
215
221
  };
222
+ var SKIP_ATTR_CHANGE_PANEL = false;
216
223
  var UHTMLTabPanelElement = class extends UHTMLElement {
217
224
  // Using ES2015 syntax for backwards compatibility
218
225
  static get observedAttributes() {
219
- return ["hidden"];
226
+ return ["id", "hidden"];
220
227
  }
221
228
  constructor() {
222
229
  super();
223
230
  attachStyle(this, UHTMLTabPanelStyle);
224
231
  }
225
232
  connectedCallback() {
233
+ var _a2, _b;
226
234
  attr(this, "role", "tabpanel");
227
- this.hidden = getSelectedIndex(this.tabs) === -1;
235
+ (_b = (_a2 = this.tabsElement) == null ? void 0 : _a2.tabList) == null ? void 0 : _b.handleEvent();
228
236
  this.attributeChangedCallback();
229
237
  }
230
238
  attributeChangedCallback() {
231
- const hidden = this.hidden;
232
- attr(this, "aria-hidden", `${hidden}`);
233
- attr(this, "tabindex", hidden || isFocusable(this.firstChild) ? null : "0");
239
+ if (SKIP_ATTR_CHANGE_PANEL) return;
240
+ SKIP_ATTR_CHANGE_PANEL = true;
241
+ const hasFocusable = isFocusable(this.firstChild);
242
+ this.hidden = getSelectedIndex(this.tabs) === -1;
243
+ attr(this, "aria-hidden", `${this.hidden}`);
244
+ attr(this, "tabindex", this.hidden || hasFocusable ? null : "0");
245
+ SKIP_ATTR_CHANGE_PANEL = false;
234
246
  }
235
247
  get tabsElement() {
236
- return this.closest("u-tabs");
248
+ return getTabsElement(this);
237
249
  }
238
250
  get tabs() {
239
- const css = `u-tab[${ARIA_CONTROLS}="${this.id}"]`;
240
- return getRoot(this).querySelectorAll(css);
251
+ return getRoot(this).querySelectorAll(
252
+ `[role="tab"][${ARIA_CONTROLS}="${this.id}"]`
253
+ );
241
254
  }
242
255
  };
243
- var queryWithoutNested = (tag, self) => self.querySelectorAll(`${tag}:not(:scope u-tabpanel ${tag})`);
244
- var getPanel = (tab, panel) => {
245
- const id2 = attr(tab, ARIA_CONTROLS) || useId(panel);
246
- const el = getRoot(tab).getElementById(id2);
247
- return (el == null ? void 0 : el.nodeName) === "U-TABPANEL" ? el : null;
248
- };
256
+ var queryWithoutNested = (role, self) => self.querySelectorAll(
257
+ `[role="${role}"]:not(:scope [role="tabpanel"] [role="${role}"])`
258
+ );
259
+ var getPanel = (tab, panel) => getRoot(tab).getElementById(attr(tab, ARIA_CONTROLS) || useId(panel));
249
260
  var getSelectedIndex = (tabs) => [...tabs].findIndex((tab) => attr(tab, ARIA_SELECTED) === "true");
261
+ var getTabsElement = (self) => self.closest(`[${ATTR_TABS}]`);
262
+ var getTabs = (self) => self.querySelectorAll(`:scope > [role="tab"]`);
250
263
  var setSelected = (tab) => tab && attr(tab, "aria-disabled") !== "true" && attr(tab, "aria-selected", "true");
251
264
  var isFocusable = (el) => el instanceof Element && !el.matches(':disabled,[tabindex^="-"]') && el.matches(
252
265
  `[contenteditable],[controls],[href],[tabindex],input:not([type="hidden"]),select,textarea,button,summary,iframe`
@@ -111,7 +111,7 @@
111
111
  "kind": "field",
112
112
  "name": "tabsElement",
113
113
  "type": {
114
- "text": "UHTMLTabsElement | null"
114
+ "text": "HTMLElement | null"
115
115
  },
116
116
  "readonly": true
117
117
  },
@@ -179,7 +179,7 @@
179
179
  "kind": "field",
180
180
  "name": "panel",
181
181
  "type": {
182
- "text": "UHTMLTabPanelElement | null"
182
+ "text": "HTMLElement | null"
183
183
  },
184
184
  "readonly": true
185
185
  }
@@ -198,7 +198,7 @@
198
198
  },
199
199
  {
200
200
  "kind": "class",
201
- "description": "The `<u-tabpanel>` HTML element is a container for the resources of layered content associated with a `<u-tab>`.\n[MDN Reference](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/tabpanel_role)",
201
+ "description": "",
202
202
  "name": "UHTMLTabPanelElement",
203
203
  "members": [
204
204
  {
@@ -219,6 +219,9 @@
219
219
  }
220
220
  ],
221
221
  "attributes": [
222
+ {
223
+ "name": "id"
224
+ },
222
225
  {
223
226
  "name": "hidden"
224
227
  }
@@ -22,8 +22,11 @@
22
22
  },
23
23
  {
24
24
  "name": "u-tabpanel",
25
- "description": "The `<u-tabpanel>` HTML element is a container for the resources of layered content associated with a `<u-tab>`.\n[MDN Reference](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/tabpanel_role)\n---\n",
26
- "attributes": [{ "name": "hidden", "values": [] }],
25
+ "description": "\n---\n",
26
+ "attributes": [
27
+ { "name": "id", "values": [] },
28
+ { "name": "hidden", "values": [] }
29
+ ],
27
30
  "references": []
28
31
  }
29
32
  ]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@u-elements/u-tabs",
3
- "version": "0.0.12",
3
+ "version": "0.1.1",
4
4
  "license": "MIT",
5
5
  "description": "HTML tags, just truly accessible",
6
6
  "homepage": "https://u-elements.github.io/u-elements/",