@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 +58 -45
- package/dist/u-tabs.d.cts +2 -6
- package/dist/u-tabs.d.ts +2 -6
- package/dist/u-tabs.js +58 -45
- package/dist/u-tabs.manifest.json +6 -3
- package/dist/u-tabs.vscode.json +5 -2
- package/package.json +1 -1
package/dist/u-tabs.cjs
CHANGED
|
@@ -46,9 +46,11 @@ var mutationObserver = (element, options) => {
|
|
|
46
46
|
}
|
|
47
47
|
};
|
|
48
48
|
var asButton = (event) => {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
if (isClick
|
|
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,
|
|
67
|
+
var createElement = (tagName, content, attrs) => {
|
|
66
68
|
const el = document.createElement(tagName);
|
|
67
|
-
if (
|
|
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("
|
|
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("
|
|
105
|
+
return queryWithoutNested("tab", this);
|
|
102
106
|
}
|
|
103
107
|
get panels() {
|
|
104
|
-
return queryWithoutNested("
|
|
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
|
-
|
|
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]
|
|
144
|
-
tabs[next]
|
|
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
|
|
158
|
+
return getTabsElement(this);
|
|
154
159
|
}
|
|
155
160
|
get tabs() {
|
|
156
|
-
return this
|
|
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
|
|
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
|
|
182
|
+
attr(this, "tabindex", this.selected ? "0" : "-1");
|
|
178
183
|
}
|
|
179
184
|
attributeChangedCallback() {
|
|
180
|
-
if (!
|
|
181
|
-
|
|
182
|
-
const tabs =
|
|
183
|
-
const panels = queryWithoutNested("
|
|
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
|
-
|
|
187
|
-
|
|
188
|
-
|
|
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
|
-
|
|
196
|
+
if (panel == null ? void 0 : panel.id) attr(tab, ARIA_CONTROLS, panel.id);
|
|
191
197
|
if (panel) panel.hidden = panel !== nextPanel;
|
|
192
|
-
}
|
|
193
|
-
|
|
198
|
+
}
|
|
199
|
+
SKIP_ATTR_CHANGE_TAB = false;
|
|
194
200
|
}
|
|
195
201
|
}
|
|
196
202
|
get tabsElement() {
|
|
197
|
-
return this
|
|
203
|
+
return getTabsElement(this);
|
|
198
204
|
}
|
|
199
205
|
get tabList() {
|
|
200
206
|
const tablist = this.parentElement;
|
|
201
|
-
return (tablist == null ? void 0 : tablist.
|
|
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
|
|
212
|
-
return
|
|
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
|
-
|
|
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
|
-
|
|
234
|
-
|
|
235
|
-
|
|
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
|
|
250
|
+
return getTabsElement(this);
|
|
239
251
|
}
|
|
240
252
|
get tabs() {
|
|
241
|
-
|
|
242
|
-
|
|
253
|
+
return getRoot(this).querySelectorAll(
|
|
254
|
+
`[role="tab"][${ARIA_CONTROLS}="${this.id}"]`
|
|
255
|
+
);
|
|
243
256
|
}
|
|
244
257
|
};
|
|
245
|
-
var queryWithoutNested = (
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
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():
|
|
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():
|
|
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():
|
|
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():
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
if (isClick
|
|
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,
|
|
65
|
+
var createElement = (tagName, content, attrs) => {
|
|
64
66
|
const el = document.createElement(tagName);
|
|
65
|
-
if (
|
|
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("
|
|
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("
|
|
103
|
+
return queryWithoutNested("tab", this);
|
|
100
104
|
}
|
|
101
105
|
get panels() {
|
|
102
|
-
return queryWithoutNested("
|
|
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
|
-
|
|
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]
|
|
142
|
-
tabs[next]
|
|
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
|
|
156
|
+
return getTabsElement(this);
|
|
152
157
|
}
|
|
153
158
|
get tabs() {
|
|
154
|
-
return this
|
|
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
|
|
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
|
|
180
|
+
attr(this, "tabindex", this.selected ? "0" : "-1");
|
|
176
181
|
}
|
|
177
182
|
attributeChangedCallback() {
|
|
178
|
-
if (!
|
|
179
|
-
|
|
180
|
-
const tabs =
|
|
181
|
-
const panels = queryWithoutNested("
|
|
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
|
-
|
|
185
|
-
|
|
186
|
-
|
|
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
|
-
|
|
194
|
+
if (panel == null ? void 0 : panel.id) attr(tab, ARIA_CONTROLS, panel.id);
|
|
189
195
|
if (panel) panel.hidden = panel !== nextPanel;
|
|
190
|
-
}
|
|
191
|
-
|
|
196
|
+
}
|
|
197
|
+
SKIP_ATTR_CHANGE_TAB = false;
|
|
192
198
|
}
|
|
193
199
|
}
|
|
194
200
|
get tabsElement() {
|
|
195
|
-
return this
|
|
201
|
+
return getTabsElement(this);
|
|
196
202
|
}
|
|
197
203
|
get tabList() {
|
|
198
204
|
const tablist = this.parentElement;
|
|
199
|
-
return (tablist == null ? void 0 : tablist.
|
|
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
|
|
210
|
-
return
|
|
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
|
-
|
|
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
|
-
|
|
232
|
-
|
|
233
|
-
|
|
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
|
|
248
|
+
return getTabsElement(this);
|
|
237
249
|
}
|
|
238
250
|
get tabs() {
|
|
239
|
-
|
|
240
|
-
|
|
251
|
+
return getRoot(this).querySelectorAll(
|
|
252
|
+
`[role="tab"][${ARIA_CONTROLS}="${this.id}"]`
|
|
253
|
+
);
|
|
241
254
|
}
|
|
242
255
|
};
|
|
243
|
-
var queryWithoutNested = (
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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
|
}
|
package/dist/u-tabs.vscode.json
CHANGED
|
@@ -22,8 +22,11 @@
|
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
24
|
"name": "u-tabpanel",
|
|
25
|
-
"description": "
|
|
26
|
-
"attributes": [
|
|
25
|
+
"description": "\n---\n",
|
|
26
|
+
"attributes": [
|
|
27
|
+
{ "name": "id", "values": [] },
|
|
28
|
+
{ "name": "hidden", "values": [] }
|
|
29
|
+
],
|
|
27
30
|
"references": []
|
|
28
31
|
}
|
|
29
32
|
]
|