@spectrum-web-components/tabs 0.9.0-devmode.0 → 0.9.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/README.md +154 -36
- package/custom-elements.json +41 -13
- package/package.json +6 -5
- package/sp-tab-panel.dev.js +1 -0
- package/sp-tab-panel.dev.js.map +1 -1
- package/sp-tab-panel.js +1 -2
- package/sp-tab-panel.js.map +2 -2
- package/sp-tab.dev.js +1 -0
- package/sp-tab.dev.js.map +1 -1
- package/sp-tab.js +1 -2
- package/sp-tab.js.map +2 -2
- package/sp-tabs.dev.js +1 -0
- package/sp-tabs.dev.js.map +1 -1
- package/sp-tabs.js +1 -2
- package/sp-tabs.js.map +2 -2
- package/src/Tab.dev.js +18 -7
- package/src/Tab.dev.js.map +1 -1
- package/src/Tab.js +5 -96
- package/src/Tab.js.map +2 -2
- package/src/TabPanel.dev.js +1 -0
- package/src/TabPanel.dev.js.map +1 -1
- package/src/TabPanel.js +2 -56
- package/src/TabPanel.js.map +2 -2
- package/src/Tabs.d.ts +9 -2
- package/src/Tabs.dev.js +52 -12
- package/src/Tabs.dev.js.map +2 -2
- package/src/Tabs.js +4 -287
- package/src/Tabs.js.map +3 -3
- package/src/index.dev.js +1 -0
- package/src/index.dev.js.map +1 -1
- package/src/index.js +1 -3
- package/src/index.js.map +1 -1
- package/src/spectrum-tab.css.dev.js +1 -0
- package/src/spectrum-tab.css.dev.js.map +1 -1
- package/src/spectrum-tab.css.js +2 -4
- package/src/spectrum-tab.css.js.map +2 -2
- package/src/spectrum-tabs.css.dev.js +1 -0
- package/src/spectrum-tabs.css.dev.js.map +1 -1
- package/src/spectrum-tabs.css.js +2 -4
- package/src/spectrum-tabs.css.js.map +2 -2
- package/src/tab-panel.css.dev.js +1 -0
- package/src/tab-panel.css.dev.js.map +1 -1
- package/src/tab-panel.css.js +2 -4
- package/src/tab-panel.css.js.map +2 -2
- package/src/tab.css.dev.js +1 -0
- package/src/tab.css.dev.js.map +1 -1
- package/src/tab.css.js +2 -4
- package/src/tab.css.js.map +2 -2
- package/src/tabs.css.dev.js +2 -1
- package/src/tabs.css.dev.js.map +2 -2
- package/src/tabs.css.js +3 -5
- package/src/tabs.css.js.map +3 -3
- package/stories/tabs-horizontal-sizes.stories.js +1 -0
- package/stories/tabs-horizontal-sizes.stories.js.map +1 -1
- package/stories/tabs-vertical-right-sizes.stories.js +1 -0
- package/stories/tabs-vertical-right-sizes.stories.js.map +1 -1
- package/stories/tabs-vertical-sizes.stories.js +1 -0
- package/stories/tabs-vertical-sizes.stories.js.map +1 -1
- package/stories/tabs.stories.js +83 -0
- package/stories/tabs.stories.js.map +2 -2
- package/test/benchmark/basic-test.js +1 -0
- package/test/benchmark/basic-test.js.map +1 -1
- package/test/tab.test.js +18 -7
- package/test/tab.test.js.map +1 -1
- package/test/tabs-horizontal-sizes.test-vrt.js +1 -0
- package/test/tabs-horizontal-sizes.test-vrt.js.map +1 -1
- package/test/tabs-vertical-right-sizes.test-vrt.js +1 -0
- package/test/tabs-vertical-right-sizes.test-vrt.js.map +1 -1
- package/test/tabs-vertical-sizes.test-vrt.js +1 -0
- package/test/tabs-vertical-sizes.test-vrt.js.map +1 -1
- package/test/tabs.test-vrt.js +1 -0
- package/test/tabs.test-vrt.js.map +1 -1
- package/test/tabs.test.js +54 -22
- package/test/tabs.test.js.map +1 -1
package/src/Tab.js
CHANGED
|
@@ -1,101 +1,10 @@
|
|
|
1
|
-
var
|
|
2
|
-
|
|
3
|
-
var __decorateClass = (decorators, target, key, kind) => {
|
|
4
|
-
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
5
|
-
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
6
|
-
if (decorator = decorators[i])
|
|
7
|
-
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
8
|
-
if (kind && result)
|
|
9
|
-
__defProp(target, key, result);
|
|
10
|
-
return result;
|
|
11
|
-
};
|
|
12
|
-
import {
|
|
13
|
-
html,
|
|
14
|
-
SpectrumElement
|
|
15
|
-
} from "@spectrum-web-components/base";
|
|
16
|
-
import { property } from "@spectrum-web-components/base/src/decorators.js";
|
|
17
|
-
import {
|
|
18
|
-
FocusVisiblePolyfillMixin,
|
|
19
|
-
ObserveSlotPresence,
|
|
20
|
-
ObserveSlotText
|
|
21
|
-
} from "@spectrum-web-components/shared";
|
|
22
|
-
import tabItemStyles from "./tab.css.js";
|
|
23
|
-
const _Tab = class extends FocusVisiblePolyfillMixin(ObserveSlotText(ObserveSlotPresence(SpectrumElement, '[slot="icon"]'), "")) {
|
|
24
|
-
constructor() {
|
|
25
|
-
super(...arguments);
|
|
26
|
-
this.disabled = false;
|
|
27
|
-
this.label = "";
|
|
28
|
-
this.selected = false;
|
|
29
|
-
this.vertical = false;
|
|
30
|
-
this.value = "";
|
|
31
|
-
}
|
|
32
|
-
static get styles() {
|
|
33
|
-
return [tabItemStyles];
|
|
34
|
-
}
|
|
35
|
-
get hasIcon() {
|
|
36
|
-
return this.slotContentIsPresent;
|
|
37
|
-
}
|
|
38
|
-
get hasLabel() {
|
|
39
|
-
return !!this.label || this.slotHasContent;
|
|
40
|
-
}
|
|
41
|
-
handleContentChange() {
|
|
42
|
-
this.dispatchEvent(new Event("sp-tab-contentchange", {
|
|
43
|
-
bubbles: true,
|
|
44
|
-
composed: true
|
|
45
|
-
}));
|
|
46
|
-
}
|
|
47
|
-
render() {
|
|
48
|
-
return html`
|
|
49
|
-
${this.hasIcon ? html`
|
|
1
|
+
"use strict";var p=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var s=(u,l,e,r)=>{for(var t=r>1?void 0:r?h(l,e):l,a=u.length-1,d;a>=0;a--)(d=u[a])&&(t=(r?d(l,e,t):d(t))||t);return r&&t&&p(l,e,t),t};import{html as o,SpectrumElement as c}from"@spectrum-web-components/base";import{property as i}from"@spectrum-web-components/base/src/decorators.js";import{FocusVisiblePolyfillMixin as b,ObserveSlotPresence as f,ObserveSlotText as m}from"@spectrum-web-components/shared";import v from"./tab.css.js";const n=class extends b(m(f(c,'[slot="icon"]'),"")){constructor(){super(...arguments);this.disabled=!1;this.label="";this.selected=!1;this.vertical=!1;this.value=""}static get styles(){return[v]}get hasIcon(){return this.slotContentIsPresent}get hasLabel(){return!!this.label||this.slotHasContent}handleContentChange(){this.dispatchEvent(new Event("sp-tab-contentchange",{bubbles:!0,composed:!0}))}render(){return o`
|
|
2
|
+
${this.hasIcon?o`
|
|
50
3
|
<slot name="icon"></slot>
|
|
51
|
-
|
|
4
|
+
`:o``}
|
|
52
5
|
<label id="item-label" ?hidden=${!this.hasLabel}>
|
|
53
|
-
${this.slotHasContent
|
|
6
|
+
${this.slotHasContent?o``:this.label}
|
|
54
7
|
<slot>${this.label}</slot>
|
|
55
8
|
</label>
|
|
56
|
-
|
|
57
|
-
}
|
|
58
|
-
firstUpdated(changes) {
|
|
59
|
-
super.firstUpdated(changes);
|
|
60
|
-
this.setAttribute("role", "tab");
|
|
61
|
-
if (!this.hasAttribute("id")) {
|
|
62
|
-
this.id = `sp-tab-${_Tab.instanceCount++}`;
|
|
63
|
-
}
|
|
64
|
-
this.shadowRoot.addEventListener("slotchange", this.handleContentChange);
|
|
65
|
-
}
|
|
66
|
-
updated(changes) {
|
|
67
|
-
super.updated(changes);
|
|
68
|
-
if (changes.has("label") && typeof changes.get("label") !== "undefined") {
|
|
69
|
-
this.handleContentChange();
|
|
70
|
-
}
|
|
71
|
-
if (changes.has("selected")) {
|
|
72
|
-
this.setAttribute("aria-selected", this.selected ? "true" : "false");
|
|
73
|
-
this.setAttribute("tabindex", this.selected ? "0" : "-1");
|
|
74
|
-
}
|
|
75
|
-
if (changes.has("disabled")) {
|
|
76
|
-
if (this.disabled) {
|
|
77
|
-
this.setAttribute("aria-disabled", "true");
|
|
78
|
-
} else {
|
|
79
|
-
this.removeAttribute("aria-disabled");
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
};
|
|
84
|
-
export let Tab = _Tab;
|
|
85
|
-
Tab.instanceCount = 0;
|
|
86
|
-
__decorateClass([
|
|
87
|
-
property({ type: Boolean, reflect: true })
|
|
88
|
-
], Tab.prototype, "disabled", 2);
|
|
89
|
-
__decorateClass([
|
|
90
|
-
property({ reflect: true })
|
|
91
|
-
], Tab.prototype, "label", 2);
|
|
92
|
-
__decorateClass([
|
|
93
|
-
property({ type: Boolean, reflect: true })
|
|
94
|
-
], Tab.prototype, "selected", 2);
|
|
95
|
-
__decorateClass([
|
|
96
|
-
property({ type: Boolean, reflect: true })
|
|
97
|
-
], Tab.prototype, "vertical", 2);
|
|
98
|
-
__decorateClass([
|
|
99
|
-
property({ type: String, reflect: true })
|
|
100
|
-
], Tab.prototype, "value", 2);
|
|
9
|
+
`}firstUpdated(e){super.firstUpdated(e),this.setAttribute("role","tab"),this.hasAttribute("id")||(this.id=`sp-tab-${n.instanceCount++}`),this.shadowRoot.addEventListener("slotchange",this.handleContentChange)}updated(e){super.updated(e),e.has("label")&&typeof e.get("label")!="undefined"&&this.handleContentChange(),e.has("selected")&&(this.setAttribute("aria-selected",this.selected?"true":"false"),this.setAttribute("tabindex",this.selected?"0":"-1")),e.has("disabled")&&(this.disabled?this.setAttribute("aria-disabled","true"):this.removeAttribute("aria-disabled"))}};export let Tab=n;Tab.instanceCount=0,s([i({type:Boolean,reflect:!0})],Tab.prototype,"disabled",2),s([i({reflect:!0})],Tab.prototype,"label",2),s([i({type:Boolean,reflect:!0})],Tab.prototype,"selected",2),s([i({type:Boolean,reflect:!0})],Tab.prototype,"vertical",2),s([i({type:String,reflect:!0})],Tab.prototype,"value",2);
|
|
101
10
|
//# sourceMappingURL=Tab.js.map
|
package/src/Tab.js.map
CHANGED
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["Tab.ts"],
|
|
4
4
|
"sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport {\n CSSResultArray,\n html,\n PropertyValues,\n SpectrumElement,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport { property } from '@spectrum-web-components/base/src/decorators.js';\nimport {\n FocusVisiblePolyfillMixin,\n ObserveSlotPresence,\n ObserveSlotText,\n} from '@spectrum-web-components/shared';\n\nimport tabItemStyles from './tab.css.js';\n\n/**\n * @element sp-tab\n *\n * @slot - text label of the Tab\n * @slot icon - The icon that appears on the left of the label\n */\nexport class Tab extends FocusVisiblePolyfillMixin(\n ObserveSlotText(ObserveSlotPresence(SpectrumElement, '[slot=\"icon\"]'), '')\n) {\n public static override get styles(): CSSResultArray {\n return [tabItemStyles];\n }\n\n /**\n * @private\n */\n static instanceCount = 0;\n\n protected get hasIcon(): boolean {\n return this.slotContentIsPresent;\n }\n\n protected get hasLabel(): boolean {\n return !!this.label || this.slotHasContent;\n }\n\n @property({ type: Boolean, reflect: true })\n public disabled = false;\n\n @property({ reflect: true })\n public label = '';\n\n @property({ type: Boolean, reflect: true })\n public selected = false;\n\n @property({ type: Boolean, reflect: true })\n public vertical = false;\n\n @property({ type: String, reflect: true })\n public value = '';\n\n protected handleContentChange(): void {\n /**\n * When the content in a tab has changed, JS powered layout related to that content may also need to be changed.\n */\n this.dispatchEvent(\n new Event('sp-tab-contentchange', {\n bubbles: true,\n composed: true,\n })\n );\n }\n\n protected override render(): TemplateResult {\n return html`\n ${this.hasIcon\n ? html`\n <slot name=\"icon\"></slot>\n `\n : html``}\n <label id=\"item-label\" ?hidden=${!this.hasLabel}>\n ${this.slotHasContent ? html`` : this.label}\n <slot>${this.label}</slot>\n </label>\n `;\n }\n\n protected override firstUpdated(changes: PropertyValues): void {\n super.firstUpdated(changes);\n this.setAttribute('role', 'tab');\n if (!this.hasAttribute('id')) {\n this.id = `sp-tab-${Tab.instanceCount++}`;\n }\n // @TODO - refactor this as a ResizeObserver up to `sp-tabs` so that it can be more\n // resiliant to Tab content changes, as well as other content slotted into the \"tablist\".\n this.shadowRoot.addEventListener(\n 'slotchange',\n this.handleContentChange\n );\n }\n\n protected override updated(changes: PropertyValues): void {\n super.updated(changes);\n if (\n changes.has('label') &&\n typeof changes.get('label') !== 'undefined'\n ) {\n this.handleContentChange();\n }\n if (changes.has('selected')) {\n this.setAttribute(\n 'aria-selected',\n this.selected ? 'true' : 'false'\n );\n this.setAttribute('tabindex', this.selected ? '0' : '-1');\n }\n if (changes.has('disabled')) {\n if (this.disabled) {\n this.setAttribute('aria-disabled', 'true');\n } else {\n this.removeAttribute('aria-disabled');\n }\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": []
|
|
5
|
+
"mappings": "qNAYA,OAEI,QAAAA,EAEA,mBAAAC,MAEG,gCACP,OAAS,YAAAC,MAAgB,kDACzB,OACI,6BAAAC,EACA,uBAAAC,EACA,mBAAAC,MACG,kCAEP,OAAOC,MAAmB,eAQnB,MAAMC,EAAN,cAAkBJ,EACrBE,EAAgBD,EAAoBH,EAAiB,eAAe,EAAG,EAAE,CAC7E,CAAE,CAFK,kCAqBH,KAAO,SAAW,GAGlB,KAAO,MAAQ,GAGf,KAAO,SAAW,GAGlB,KAAO,SAAW,GAGlB,KAAO,MAAQ,GA9Bf,WAA2B,QAAyB,CAChD,MAAO,CAACK,CAAa,CACzB,CAOA,IAAc,SAAmB,CAC7B,OAAO,KAAK,oBAChB,CAEA,IAAc,UAAoB,CAC9B,MAAO,CAAC,CAAC,KAAK,OAAS,KAAK,cAChC,CAiBU,qBAA4B,CAIlC,KAAK,cACD,IAAI,MAAM,uBAAwB,CAC9B,QAAS,GACT,SAAU,EACd,CAAC,CACL,CACJ,CAEmB,QAAyB,CACxC,OAAON;AAAA,cACD,KAAK,QACDA;AAAA;AAAA,oBAGAA;AAAA,6CAC2B,CAAC,KAAK;AAAA,kBACjC,KAAK,eAAiBA,IAAS,KAAK;AAAA,wBAC9B,KAAK;AAAA;AAAA,SAGzB,CAEmB,aAAaQ,EAA+B,CAC3D,MAAM,aAAaA,CAAO,EAC1B,KAAK,aAAa,OAAQ,KAAK,EAC1B,KAAK,aAAa,IAAI,IACvB,KAAK,GAAK,UAAUD,EAAI,mBAI5B,KAAK,WAAW,iBACZ,aACA,KAAK,mBACT,CACJ,CAEmB,QAAQC,EAA+B,CACtD,MAAM,QAAQA,CAAO,EAEjBA,EAAQ,IAAI,OAAO,GACnB,OAAOA,EAAQ,IAAI,OAAO,GAAM,aAEhC,KAAK,oBAAoB,EAEzBA,EAAQ,IAAI,UAAU,IACtB,KAAK,aACD,gBACA,KAAK,SAAW,OAAS,OAC7B,EACA,KAAK,aAAa,WAAY,KAAK,SAAW,IAAM,IAAI,GAExDA,EAAQ,IAAI,UAAU,IAClB,KAAK,SACL,KAAK,aAAa,gBAAiB,MAAM,EAEzC,KAAK,gBAAgB,eAAe,EAGhD,CACJ,EAlGO,WAAM,IAAND,EAAM,IAUF,cAAgB,EAWhBE,EAAA,CADNP,EAAS,CAAE,KAAM,QAAS,QAAS,EAAK,CAAC,GApBjC,IAqBF,wBAGAO,EAAA,CADNP,EAAS,CAAE,QAAS,EAAK,CAAC,GAvBlB,IAwBF,qBAGAO,EAAA,CADNP,EAAS,CAAE,KAAM,QAAS,QAAS,EAAK,CAAC,GA1BjC,IA2BF,wBAGAO,EAAA,CADNP,EAAS,CAAE,KAAM,QAAS,QAAS,EAAK,CAAC,GA7BjC,IA8BF,wBAGAO,EAAA,CADNP,EAAS,CAAE,KAAM,OAAQ,QAAS,EAAK,CAAC,GAhChC,IAiCF",
|
|
6
|
+
"names": ["html", "SpectrumElement", "property", "FocusVisiblePolyfillMixin", "ObserveSlotPresence", "ObserveSlotText", "tabItemStyles", "_Tab", "changes", "__decorateClass"]
|
|
7
7
|
}
|
package/src/TabPanel.dev.js
CHANGED
package/src/TabPanel.dev.js.map
CHANGED
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["TabPanel.ts"],
|
|
4
4
|
"sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport {\n html,\n PropertyValues,\n SpectrumElement,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport { property } from '@spectrum-web-components/base/src/decorators.js';\n\nimport panelStyles from './tab-panel.css.js';\n\n/**\n * @element sp-tab-panel\n *\n * @slot - content of the Tab Panel\n */\nexport class TabPanel extends SpectrumElement {\n static override styles = [panelStyles];\n\n /**\n * @private\n */\n static instanceCount = 0;\n\n @property({ type: Boolean, reflect: true })\n public selected = false;\n\n @property({ type: String, reflect: true })\n public value = '';\n\n protected override render(): TemplateResult {\n return html`\n <slot></slot>\n `;\n }\n\n protected override firstUpdated(): void {\n this.slot = 'tab-panel';\n this.setAttribute('role', 'tabpanel');\n this.tabIndex = 0;\n if (!this.hasAttribute('id')) {\n this.id = `sp-tab-panel-${TabPanel.instanceCount++}`;\n }\n }\n\n protected override updated(changes: PropertyValues<this>): void {\n if (changes.has('selected')) {\n if (this.selected) {\n this.removeAttribute('aria-hidden');\n this.tabIndex = 0;\n } else {\n this.setAttribute('aria-hidden', 'true');\n this.tabIndex = -1;\n }\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": ";;;;;;;;;;;;AAYA;AAAA,EACI;AAAA,EAEA;AAAA,OAEG;AACP,SAAS,gBAAgB;AAEzB,OAAO,iBAAiB;AAOjB,MAAM,YAAN,cAAuB,gBAAgB;AAAA,EAAvC;AAAA;AASH,SAAO,WAAW;AAGlB,SAAO,QAAQ;AAAA;AAAA,EAEI,SAAyB;AACxC,WAAO;AAAA;AAAA;AAAA,EAGX;AAAA,EAEmB,eAAqB;AACpC,SAAK,OAAO;AACZ,SAAK,aAAa,QAAQ,UAAU;AACpC,SAAK,WAAW;AAChB,QAAI,CAAC,KAAK,aAAa,IAAI,GAAG;AAC1B,WAAK,KAAK,gBAAgB,UAAS;AAAA,IACvC;AAAA,EACJ;AAAA,EAEmB,QAAQ,SAAqC;AAC5D,QAAI,QAAQ,IAAI,UAAU,GAAG;AACzB,UAAI,KAAK,UAAU;AACf,aAAK,gBAAgB,aAAa;AAClC,aAAK,WAAW;AAAA,MACpB,OAAO;AACH,aAAK,aAAa,eAAe,MAAM;AACvC,aAAK,WAAW;AAAA,MACpB;AAAA,IACJ;AAAA,EACJ;AACJ;AAxCO,WAAM,WAAN;AAAM,SACO,SAAS,CAAC,WAAW;AAD5B,SAMF,gBAAgB;AAGhB;AAAA,EADN,SAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GARjC,SASF;AAGA;AAAA,EADN,SAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GAXhC,SAYF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/src/TabPanel.js
CHANGED
|
@@ -1,58 +1,4 @@
|
|
|
1
|
-
var
|
|
2
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
-
var __decorateClass = (decorators, target, key, kind) => {
|
|
4
|
-
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
5
|
-
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
6
|
-
if (decorator = decorators[i])
|
|
7
|
-
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
8
|
-
if (kind && result)
|
|
9
|
-
__defProp(target, key, result);
|
|
10
|
-
return result;
|
|
11
|
-
};
|
|
12
|
-
import {
|
|
13
|
-
html,
|
|
14
|
-
SpectrumElement
|
|
15
|
-
} from "@spectrum-web-components/base";
|
|
16
|
-
import { property } from "@spectrum-web-components/base/src/decorators.js";
|
|
17
|
-
import panelStyles from "./tab-panel.css.js";
|
|
18
|
-
const _TabPanel = class extends SpectrumElement {
|
|
19
|
-
constructor() {
|
|
20
|
-
super(...arguments);
|
|
21
|
-
this.selected = false;
|
|
22
|
-
this.value = "";
|
|
23
|
-
}
|
|
24
|
-
render() {
|
|
25
|
-
return html`
|
|
1
|
+
"use strict";var u=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var d=(p,e,r,i)=>{for(var t=i>1?void 0:i?c(e,r):e,s=p.length-1,o;s>=0;s--)(o=p[s])&&(t=(i?o(e,r,t):o(t))||t);return i&&t&&u(e,r,t),t};import{html as h,SpectrumElement as n}from"@spectrum-web-components/base";import{property as a}from"@spectrum-web-components/base/src/decorators.js";import m from"./tab-panel.css.js";const l=class extends n{constructor(){super(...arguments);this.selected=!1;this.value=""}render(){return h`
|
|
26
2
|
<slot></slot>
|
|
27
|
-
|
|
28
|
-
}
|
|
29
|
-
firstUpdated() {
|
|
30
|
-
this.slot = "tab-panel";
|
|
31
|
-
this.setAttribute("role", "tabpanel");
|
|
32
|
-
this.tabIndex = 0;
|
|
33
|
-
if (!this.hasAttribute("id")) {
|
|
34
|
-
this.id = `sp-tab-panel-${_TabPanel.instanceCount++}`;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
updated(changes) {
|
|
38
|
-
if (changes.has("selected")) {
|
|
39
|
-
if (this.selected) {
|
|
40
|
-
this.removeAttribute("aria-hidden");
|
|
41
|
-
this.tabIndex = 0;
|
|
42
|
-
} else {
|
|
43
|
-
this.setAttribute("aria-hidden", "true");
|
|
44
|
-
this.tabIndex = -1;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
};
|
|
49
|
-
export let TabPanel = _TabPanel;
|
|
50
|
-
TabPanel.styles = [panelStyles];
|
|
51
|
-
TabPanel.instanceCount = 0;
|
|
52
|
-
__decorateClass([
|
|
53
|
-
property({ type: Boolean, reflect: true })
|
|
54
|
-
], TabPanel.prototype, "selected", 2);
|
|
55
|
-
__decorateClass([
|
|
56
|
-
property({ type: String, reflect: true })
|
|
57
|
-
], TabPanel.prototype, "value", 2);
|
|
3
|
+
`}firstUpdated(){this.slot="tab-panel",this.setAttribute("role","tabpanel"),this.tabIndex=0,this.hasAttribute("id")||(this.id=`sp-tab-panel-${l.instanceCount++}`)}updated(r){r.has("selected")&&(this.selected?(this.removeAttribute("aria-hidden"),this.tabIndex=0):(this.setAttribute("aria-hidden","true"),this.tabIndex=-1))}};export let TabPanel=l;TabPanel.styles=[m],TabPanel.instanceCount=0,d([a({type:Boolean,reflect:!0})],TabPanel.prototype,"selected",2),d([a({type:String,reflect:!0})],TabPanel.prototype,"value",2);
|
|
58
4
|
//# sourceMappingURL=TabPanel.js.map
|
package/src/TabPanel.js.map
CHANGED
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["TabPanel.ts"],
|
|
4
4
|
"sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport {\n html,\n PropertyValues,\n SpectrumElement,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport { property } from '@spectrum-web-components/base/src/decorators.js';\n\nimport panelStyles from './tab-panel.css.js';\n\n/**\n * @element sp-tab-panel\n *\n * @slot - content of the Tab Panel\n */\nexport class TabPanel extends SpectrumElement {\n static override styles = [panelStyles];\n\n /**\n * @private\n */\n static instanceCount = 0;\n\n @property({ type: Boolean, reflect: true })\n public selected = false;\n\n @property({ type: String, reflect: true })\n public value = '';\n\n protected override render(): TemplateResult {\n return html`\n <slot></slot>\n `;\n }\n\n protected override firstUpdated(): void {\n this.slot = 'tab-panel';\n this.setAttribute('role', 'tabpanel');\n this.tabIndex = 0;\n if (!this.hasAttribute('id')) {\n this.id = `sp-tab-panel-${TabPanel.instanceCount++}`;\n }\n }\n\n protected override updated(changes: PropertyValues<this>): void {\n if (changes.has('selected')) {\n if (this.selected) {\n this.removeAttribute('aria-hidden');\n this.tabIndex = 0;\n } else {\n this.setAttribute('aria-hidden', 'true');\n this.tabIndex = -1;\n }\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": []
|
|
5
|
+
"mappings": "qNAYA,OACI,QAAAA,EAEA,mBAAAC,MAEG,gCACP,OAAS,YAAAC,MAAgB,kDAEzB,OAAOC,MAAiB,qBAOjB,MAAMC,EAAN,cAAuBH,CAAgB,CAAvC,kCASH,KAAO,SAAW,GAGlB,KAAO,MAAQ,GAEI,QAAyB,CACxC,OAAOD;AAAA;AAAA,SAGX,CAEmB,cAAqB,CACpC,KAAK,KAAO,YACZ,KAAK,aAAa,OAAQ,UAAU,EACpC,KAAK,SAAW,EACX,KAAK,aAAa,IAAI,IACvB,KAAK,GAAK,gBAAgBI,EAAS,kBAE3C,CAEmB,QAAQC,EAAqC,CACxDA,EAAQ,IAAI,UAAU,IAClB,KAAK,UACL,KAAK,gBAAgB,aAAa,EAClC,KAAK,SAAW,IAEhB,KAAK,aAAa,cAAe,MAAM,EACvC,KAAK,SAAW,IAG5B,CACJ,EAxCO,WAAM,SAAND,EAAM,SACO,OAAS,CAACD,CAAW,EAD5B,SAMF,cAAgB,EAGhBG,EAAA,CADNJ,EAAS,CAAE,KAAM,QAAS,QAAS,EAAK,CAAC,GARjC,SASF,wBAGAI,EAAA,CADNJ,EAAS,CAAE,KAAM,OAAQ,QAAS,EAAK,CAAC,GAXhC,SAYF",
|
|
6
|
+
"names": ["html", "SpectrumElement", "property", "panelStyles", "_TabPanel", "changes", "__decorateClass"]
|
|
7
7
|
}
|
package/src/Tabs.d.ts
CHANGED
|
@@ -11,8 +11,6 @@ declare const Tabs_base: typeof Focusable & {
|
|
|
11
11
|
*
|
|
12
12
|
* @slot - Tab elements to manage as a group
|
|
13
13
|
* @slot tab-panel - Tab Panel elements related to the listed Tab elements
|
|
14
|
-
* @attr {Boolean} quiet - The tabs border is a lot smaller
|
|
15
|
-
* @attr {Boolean} compact - The collection of tabs take up less space
|
|
16
14
|
* @csspart tablist - Container element for the slotted sp-tab elements
|
|
17
15
|
*
|
|
18
16
|
* @fires change - The selected Tab child has changed.
|
|
@@ -28,9 +26,17 @@ export declare class Tabs extends Tabs_base {
|
|
|
28
26
|
* https://w3c.github.io/aria-practices/#kbd_selection_follows_focus
|
|
29
27
|
*/
|
|
30
28
|
auto: boolean;
|
|
29
|
+
/**
|
|
30
|
+
* The tab items are displayed closer together.
|
|
31
|
+
*/
|
|
32
|
+
compact: boolean;
|
|
31
33
|
direction: 'vertical' | 'vertical-right' | 'horizontal';
|
|
32
34
|
emphasized: boolean;
|
|
33
35
|
label: string;
|
|
36
|
+
/**
|
|
37
|
+
* The tab list is displayed without a border.
|
|
38
|
+
*/
|
|
39
|
+
quiet: boolean;
|
|
34
40
|
selectionIndicatorStyle: string;
|
|
35
41
|
shouldAnimate: boolean;
|
|
36
42
|
private tabList;
|
|
@@ -40,6 +46,7 @@ export declare class Tabs extends Tabs_base {
|
|
|
40
46
|
private set tabs(value);
|
|
41
47
|
private get tabs();
|
|
42
48
|
private _tabs;
|
|
49
|
+
constructor();
|
|
43
50
|
rovingTabindexController: RovingTabindexController<Tab>;
|
|
44
51
|
/**
|
|
45
52
|
* @private
|
package/src/Tabs.dev.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
var __defProp = Object.defineProperty;
|
|
2
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
4
|
var __decorateClass = (decorators, target, key, kind) => {
|
|
@@ -18,17 +19,20 @@ import {
|
|
|
18
19
|
query
|
|
19
20
|
} from "@spectrum-web-components/base/src/decorators.js";
|
|
20
21
|
import { ifDefined } from "@spectrum-web-components/base/src/directives.js";
|
|
22
|
+
import { IntersectionController } from "@lit-labs/observers/intersection_controller.js";
|
|
21
23
|
import { Focusable } from "@spectrum-web-components/shared";
|
|
22
24
|
import { RovingTabindexController } from "@spectrum-web-components/reactive-controllers/src/RovingTabindex.js";
|
|
23
25
|
import tabStyles from "./tabs.css.js";
|
|
24
26
|
const noSelectionStyle = "transform: translateX(0px) scaleX(0) scaleY(0)";
|
|
25
27
|
export class Tabs extends SizedMixin(Focusable) {
|
|
26
28
|
constructor() {
|
|
27
|
-
super(
|
|
29
|
+
super();
|
|
28
30
|
this.auto = false;
|
|
31
|
+
this.compact = false;
|
|
29
32
|
this.direction = "horizontal";
|
|
30
33
|
this.emphasized = false;
|
|
31
34
|
this.label = "";
|
|
35
|
+
this.quiet = false;
|
|
32
36
|
this.selectionIndicatorStyle = noSelectionStyle;
|
|
33
37
|
this.shouldAnimate = false;
|
|
34
38
|
this._selected = "";
|
|
@@ -82,7 +86,9 @@ export class Tabs extends SizedMixin(Focusable) {
|
|
|
82
86
|
element.removeAttribute("selected");
|
|
83
87
|
});
|
|
84
88
|
if (this.selected) {
|
|
85
|
-
const currentChecked = this.tabs.find(
|
|
89
|
+
const currentChecked = this.tabs.find(
|
|
90
|
+
(el) => el.value === this.selected
|
|
91
|
+
);
|
|
86
92
|
if (currentChecked) {
|
|
87
93
|
currentChecked.selected = true;
|
|
88
94
|
} else {
|
|
@@ -122,6 +128,16 @@ export class Tabs extends SizedMixin(Focusable) {
|
|
|
122
128
|
this.tabChangeResolver = function() {
|
|
123
129
|
return;
|
|
124
130
|
};
|
|
131
|
+
new IntersectionController(this, {
|
|
132
|
+
config: {
|
|
133
|
+
root: null,
|
|
134
|
+
rootMargin: "0px",
|
|
135
|
+
threshold: [0, 1]
|
|
136
|
+
},
|
|
137
|
+
callback: () => {
|
|
138
|
+
this.updateSelectionIndicator();
|
|
139
|
+
}
|
|
140
|
+
});
|
|
125
141
|
}
|
|
126
142
|
static get styles() {
|
|
127
143
|
return [tabStyles];
|
|
@@ -188,7 +204,9 @@ export class Tabs extends SizedMixin(Focusable) {
|
|
|
188
204
|
<slot @slotchange=${this.onSlotChange}></slot>
|
|
189
205
|
<div
|
|
190
206
|
id="selection-indicator"
|
|
191
|
-
class=${ifDefined(
|
|
207
|
+
class=${ifDefined(
|
|
208
|
+
this.shouldAnimate ? void 0 : "first-position"
|
|
209
|
+
)}
|
|
192
210
|
style=${this.selectionIndicatorStyle}
|
|
193
211
|
role="presentation"
|
|
194
212
|
></div>
|
|
@@ -198,7 +216,9 @@ export class Tabs extends SizedMixin(Focusable) {
|
|
|
198
216
|
}
|
|
199
217
|
willUpdate(changes) {
|
|
200
218
|
if (!this.hasUpdated) {
|
|
201
|
-
const selectedChild = this.querySelector(
|
|
219
|
+
const selectedChild = this.querySelector(
|
|
220
|
+
":scope > [selected]"
|
|
221
|
+
);
|
|
202
222
|
if (selectedChild) {
|
|
203
223
|
this.selectTarget(selectedChild);
|
|
204
224
|
}
|
|
@@ -206,11 +226,15 @@ export class Tabs extends SizedMixin(Focusable) {
|
|
|
206
226
|
super.updated(changes);
|
|
207
227
|
if (changes.has("selected")) {
|
|
208
228
|
if (changes.get("selected")) {
|
|
209
|
-
const previous = this.querySelector(
|
|
229
|
+
const previous = this.querySelector(
|
|
230
|
+
`[role="tabpanel"][value="${changes.get("selected")}"]`
|
|
231
|
+
);
|
|
210
232
|
if (previous)
|
|
211
233
|
previous.selected = false;
|
|
212
234
|
}
|
|
213
|
-
const next = this.querySelector(
|
|
235
|
+
const next = this.querySelector(
|
|
236
|
+
`[role="tabpanel"][value="${this.selected}"]`
|
|
237
|
+
);
|
|
214
238
|
if (next)
|
|
215
239
|
next.selected = true;
|
|
216
240
|
}
|
|
@@ -240,9 +264,11 @@ export class Tabs extends SizedMixin(Focusable) {
|
|
|
240
264
|
if (value) {
|
|
241
265
|
const selected = this.selected;
|
|
242
266
|
this.selected = value;
|
|
243
|
-
const applyDefault = this.dispatchEvent(
|
|
244
|
-
|
|
245
|
-
|
|
267
|
+
const applyDefault = this.dispatchEvent(
|
|
268
|
+
new Event("change", {
|
|
269
|
+
cancelable: true
|
|
270
|
+
})
|
|
271
|
+
);
|
|
246
272
|
if (!applyDefault) {
|
|
247
273
|
this.selected = selected;
|
|
248
274
|
}
|
|
@@ -254,7 +280,9 @@ export class Tabs extends SizedMixin(Focusable) {
|
|
|
254
280
|
}
|
|
255
281
|
shouldUpdateCheckedState() {
|
|
256
282
|
this.tabChangeResolver();
|
|
257
|
-
this.tabChangePromise = new Promise(
|
|
283
|
+
this.tabChangePromise = new Promise(
|
|
284
|
+
(res) => this.tabChangeResolver = res
|
|
285
|
+
);
|
|
258
286
|
setTimeout(this.updateCheckedState);
|
|
259
287
|
}
|
|
260
288
|
async getUpdateComplete() {
|
|
@@ -266,13 +294,19 @@ export class Tabs extends SizedMixin(Focusable) {
|
|
|
266
294
|
super.connectedCallback();
|
|
267
295
|
window.addEventListener("resize", this.updateSelectionIndicator);
|
|
268
296
|
if ("fonts" in document) {
|
|
269
|
-
document.fonts.addEventListener(
|
|
297
|
+
document.fonts.addEventListener(
|
|
298
|
+
"loadingdone",
|
|
299
|
+
this.updateSelectionIndicator
|
|
300
|
+
);
|
|
270
301
|
}
|
|
271
302
|
}
|
|
272
303
|
disconnectedCallback() {
|
|
273
304
|
window.removeEventListener("resize", this.updateSelectionIndicator);
|
|
274
305
|
if ("fonts" in document) {
|
|
275
|
-
document.fonts.removeEventListener(
|
|
306
|
+
document.fonts.removeEventListener(
|
|
307
|
+
"loadingdone",
|
|
308
|
+
this.updateSelectionIndicator
|
|
309
|
+
);
|
|
276
310
|
}
|
|
277
311
|
super.disconnectedCallback();
|
|
278
312
|
}
|
|
@@ -280,6 +314,9 @@ export class Tabs extends SizedMixin(Focusable) {
|
|
|
280
314
|
__decorateClass([
|
|
281
315
|
property({ type: Boolean })
|
|
282
316
|
], Tabs.prototype, "auto", 2);
|
|
317
|
+
__decorateClass([
|
|
318
|
+
property({ type: Boolean, reflect: true })
|
|
319
|
+
], Tabs.prototype, "compact", 2);
|
|
283
320
|
__decorateClass([
|
|
284
321
|
property({ reflect: true })
|
|
285
322
|
], Tabs.prototype, "direction", 2);
|
|
@@ -289,6 +326,9 @@ __decorateClass([
|
|
|
289
326
|
__decorateClass([
|
|
290
327
|
property()
|
|
291
328
|
], Tabs.prototype, "label", 2);
|
|
329
|
+
__decorateClass([
|
|
330
|
+
property({ type: Boolean, reflect: true })
|
|
331
|
+
], Tabs.prototype, "quiet", 2);
|
|
292
332
|
__decorateClass([
|
|
293
333
|
property({ attribute: false })
|
|
294
334
|
], Tabs.prototype, "selectionIndicatorStyle", 2);
|
package/src/Tabs.dev.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["Tabs.ts"],
|
|
4
|
-
"sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport {\n CSSResultArray,\n html,\n PropertyValues,\n SizedMixin,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport {\n property,\n query,\n} from '@spectrum-web-components/base/src/decorators.js';\nimport { ifDefined } from '@spectrum-web-components/base/src/directives.js';\nimport { Tab } from './Tab.dev.js'\nimport { Focusable } from '@spectrum-web-components/shared';\nimport { RovingTabindexController } from '@spectrum-web-components/reactive-controllers/src/RovingTabindex.js';\n\nimport tabStyles from './tabs.css.js';\nimport { TabPanel } from './TabPanel.dev.js'\n\nconst noSelectionStyle = 'transform: translateX(0px) scaleX(0) scaleY(0)';\n\n/**\n * @element sp-tabs\n *\n * @slot - Tab elements to manage as a group\n * @slot tab-panel - Tab Panel elements related to the listed Tab elements\n * @attr {Boolean} quiet - The tabs border is a lot smaller\n * @attr {Boolean} compact - The collection of tabs take up less space\n * @csspart tablist - Container element for the slotted sp-tab elements\n *\n * @fires change - The selected Tab child has changed.\n */\nexport class Tabs extends SizedMixin(Focusable) {\n public static override get styles(): CSSResultArray {\n return [tabStyles];\n }\n\n /**\n * Whether to activate a tab on keyboard focus or not.\n *\n * By default a tab is activated via a \"click\" interaction. This is specifically intended for when\n * tab content cannot be displayed instantly, e.g. not all of the DOM content is available, etc.\n * To learn more about \"Deciding When to Make Selection Automatically Follow Focus\", visit:\n * https://w3c.github.io/aria-practices/#kbd_selection_follows_focus\n */\n @property({ type: Boolean })\n public auto = false;\n\n @property({ reflect: true })\n public direction: 'vertical' | 'vertical-right' | 'horizontal' =\n 'horizontal';\n\n @property({ type: Boolean, reflect: true })\n public emphasized = false;\n\n @property()\n public label = '';\n\n @property({ attribute: false })\n public selectionIndicatorStyle = noSelectionStyle;\n\n @property({ attribute: false })\n public shouldAnimate = false;\n\n @query('#list')\n private tabList!: HTMLDivElement;\n\n @property({ reflect: true })\n public get selected(): string {\n return this._selected;\n }\n\n public set selected(value: string) {\n const oldValue = this.selected;\n\n if (value === oldValue) {\n return;\n }\n\n this._selected = value;\n this.shouldUpdateCheckedState();\n this.requestUpdate('selected', oldValue);\n }\n\n private _selected = '';\n\n private set tabs(tabs: Tab[]) {\n if (tabs === this.tabs) return;\n this._tabs = tabs;\n this.rovingTabindexController.clearElementCache();\n }\n\n private get tabs(): Tab[] {\n return this._tabs;\n }\n\n private _tabs: Tab[] = [];\n\n rovingTabindexController = new RovingTabindexController<Tab>(this, {\n focusInIndex: (elements) => {\n let focusInIndex = 0;\n const firstFocusableElement = elements.find((el, index) => {\n const focusInElement = this.selected\n ? !el.disabled && el.value === this.selected\n : !el.disabled;\n focusInIndex = index;\n return focusInElement;\n });\n return firstFocusableElement ? focusInIndex : -1;\n },\n direction: () =>\n this.direction === 'horizontal' ? 'horizontal' : 'vertical',\n elementEnterAction: (el) => {\n if (!this.auto) return;\n\n this.shouldAnimate = true;\n this.selectTarget(el);\n },\n elements: () => this.tabs,\n isFocusableElement: (el) => !el.disabled,\n listenerScope: () => this.tabList,\n });\n\n /**\n * @private\n */\n public override get focusElement(): Tab | this {\n return this.rovingTabindexController.focusInElement || this;\n }\n\n protected override manageAutoFocus(): void {\n const tabs = [...this.children] as Tab[];\n const tabUpdateCompletes = tabs.map((tab) => {\n if (typeof tab.updateComplete !== 'undefined') {\n return tab.updateComplete;\n }\n return Promise.resolve(true);\n });\n Promise.all(tabUpdateCompletes).then(() => super.manageAutoFocus());\n }\n\n protected managePanels({\n target,\n }: Event & { target: HTMLSlotElement }): void {\n const panels = target.assignedElements() as TabPanel[];\n panels.map((panel) => {\n const { value, id } = panel;\n const tab = this.querySelector(`[role=\"tab\"][value=\"${value}\"]`);\n if (tab) {\n tab.setAttribute('aria-controls', id);\n panel.setAttribute('aria-labelledby', tab.id);\n }\n panel.selected = value === this.selected;\n });\n }\n\n protected override render(): TemplateResult {\n return html`\n <div\n aria-label=${ifDefined(this.label ? this.label : undefined)}\n @click=${this.onClick}\n @keydown=${this.onKeyDown}\n @sp-tab-contentchange=${this.updateSelectionIndicator}\n id=\"list\"\n role=\"tablist\"\n part=\"tablist\"\n >\n <slot @slotchange=${this.onSlotChange}></slot>\n <div\n id=\"selection-indicator\"\n class=${ifDefined(\n this.shouldAnimate ? undefined : 'first-position'\n )}\n style=${this.selectionIndicatorStyle}\n role=\"presentation\"\n ></div>\n </div>\n <slot name=\"tab-panel\" @slotchange=${this.managePanels}></slot>\n `;\n }\n\n protected override willUpdate(changes: PropertyValues): void {\n if (!this.hasUpdated) {\n const selectedChild = this.querySelector(\n ':scope > [selected]'\n ) as Tab;\n if (selectedChild) {\n this.selectTarget(selectedChild);\n }\n }\n\n super.updated(changes);\n if (changes.has('selected')) {\n if (changes.get('selected')) {\n const previous = this.querySelector(\n `[role=\"tabpanel\"][value=\"${changes.get('selected')}\"]`\n ) as TabPanel;\n if (previous) previous.selected = false;\n }\n const next = this.querySelector(\n `[role=\"tabpanel\"][value=\"${this.selected}\"]`\n ) as TabPanel;\n if (next) next.selected = true;\n }\n if (changes.has('direction')) {\n if (this.direction === 'horizontal') {\n this.removeAttribute('aria-orientation');\n } else {\n this.setAttribute('aria-orientation', 'vertical');\n }\n }\n if (changes.has('dir')) {\n this.updateSelectionIndicator();\n }\n if (changes.has('disabled')) {\n if (this.disabled) {\n this.setAttribute('aria-disabled', 'true');\n } else {\n this.removeAttribute('aria-disabled');\n }\n }\n if (\n !this.shouldAnimate &&\n typeof changes.get('shouldAnimate') !== 'undefined'\n ) {\n this.shouldAnimate = true;\n }\n }\n\n private onClick = (event: Event): void => {\n if (this.disabled) {\n return;\n }\n const target = event\n .composedPath()\n .find((el) => (el as Tab).parentElement === this) as Tab;\n if (!target || target.disabled) {\n return;\n }\n this.shouldAnimate = true;\n this.selectTarget(target);\n };\n\n private onKeyDown = (event: KeyboardEvent): void => {\n if (event.code === 'Enter' || event.code === 'Space') {\n event.preventDefault();\n const target = event.target as HTMLElement;\n if (target) {\n this.selectTarget(target);\n }\n }\n };\n\n private selectTarget(target: HTMLElement): void {\n const value = target.getAttribute('value');\n if (value) {\n const selected = this.selected;\n this.selected = value;\n const applyDefault = this.dispatchEvent(\n new Event('change', {\n cancelable: true,\n })\n );\n if (!applyDefault) {\n this.selected = selected;\n }\n }\n }\n\n private onSlotChange(): void {\n this.tabs = [...this.querySelectorAll('[role=\"tab\"]')] as Tab[];\n this.shouldUpdateCheckedState();\n }\n\n private shouldUpdateCheckedState(): void {\n this.tabChangeResolver();\n this.tabChangePromise = new Promise(\n (res) => (this.tabChangeResolver = res)\n );\n setTimeout(this.updateCheckedState);\n }\n\n private updateCheckedState = (): void => {\n if (!this.tabs.length) {\n this.tabs = [...this.querySelectorAll('[role=\"tab\"]')] as Tab[];\n }\n this.tabs.forEach((element) => {\n element.removeAttribute('selected');\n });\n\n if (this.selected) {\n const currentChecked = this.tabs.find(\n (el) => el.value === this.selected\n );\n\n if (currentChecked) {\n currentChecked.selected = true;\n } else {\n this.selected = '';\n }\n } else {\n const firstTab = this.tabs[0];\n if (firstTab) {\n firstTab.setAttribute('tabindex', '0');\n }\n }\n\n this.updateSelectionIndicator();\n this.tabChangeResolver();\n };\n\n private updateSelectionIndicator = async (): Promise<void> => {\n const selectedElement = this.tabs.find((el) => el.selected);\n if (!selectedElement) {\n this.selectionIndicatorStyle = noSelectionStyle;\n return;\n }\n await Promise.all([\n selectedElement.updateComplete,\n document.fonts ? document.fonts.ready : Promise.resolve(),\n ]);\n const tabBoundingClientRect = selectedElement.getBoundingClientRect();\n\n if (this.direction === 'horizontal') {\n const width = tabBoundingClientRect.width;\n const offset = selectedElement.offsetLeft;\n\n this.selectionIndicatorStyle = `transform: translateX(${offset}px) scaleX(${width});`;\n } else {\n const height = tabBoundingClientRect.height;\n const offset = selectedElement.offsetTop;\n\n this.selectionIndicatorStyle = `transform: translateY(${offset}px) scaleY(${height});`;\n }\n };\n\n private tabChangePromise = Promise.resolve();\n private tabChangeResolver: () => void = function () {\n return;\n };\n\n protected override async getUpdateComplete(): Promise<boolean> {\n const complete = (await super.getUpdateComplete()) as boolean;\n await this.tabChangePromise;\n return complete;\n }\n\n public override connectedCallback(): void {\n super.connectedCallback();\n window.addEventListener('resize', this.updateSelectionIndicator);\n if ('fonts' in document) {\n (\n document as unknown as {\n fonts: {\n addEventListener: (\n name: string,\n callback: () => void\n ) => void;\n };\n }\n ).fonts.addEventListener(\n 'loadingdone',\n this.updateSelectionIndicator\n );\n }\n }\n\n public override disconnectedCallback(): void {\n window.removeEventListener('resize', this.updateSelectionIndicator);\n if ('fonts' in document) {\n (\n document as unknown as {\n fonts: {\n removeEventListener: (\n name: string,\n callback: () => void\n ) => void;\n };\n }\n ).fonts.removeEventListener(\n 'loadingdone',\n this.updateSelectionIndicator\n );\n }\n super.disconnectedCallback();\n }\n}\n"],
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport {\n CSSResultArray,\n html,\n PropertyValues,\n SizedMixin,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport {\n property,\n query,\n} from '@spectrum-web-components/base/src/decorators.js';\nimport { ifDefined } from '@spectrum-web-components/base/src/directives.js';\nimport { IntersectionController } from '@lit-labs/observers/intersection_controller.js';\nimport { Tab } from './Tab.dev.js'\nimport { Focusable } from '@spectrum-web-components/shared';\nimport { RovingTabindexController } from '@spectrum-web-components/reactive-controllers/src/RovingTabindex.js';\n\nimport tabStyles from './tabs.css.js';\nimport { TabPanel } from './TabPanel.dev.js'\n\nconst noSelectionStyle = 'transform: translateX(0px) scaleX(0) scaleY(0)';\n\n/**\n * @element sp-tabs\n *\n * @slot - Tab elements to manage as a group\n * @slot tab-panel - Tab Panel elements related to the listed Tab elements\n * @csspart tablist - Container element for the slotted sp-tab elements\n *\n * @fires change - The selected Tab child has changed.\n */\nexport class Tabs extends SizedMixin(Focusable) {\n public static override get styles(): CSSResultArray {\n return [tabStyles];\n }\n\n /**\n * Whether to activate a tab on keyboard focus or not.\n *\n * By default a tab is activated via a \"click\" interaction. This is specifically intended for when\n * tab content cannot be displayed instantly, e.g. not all of the DOM content is available, etc.\n * To learn more about \"Deciding When to Make Selection Automatically Follow Focus\", visit:\n * https://w3c.github.io/aria-practices/#kbd_selection_follows_focus\n */\n @property({ type: Boolean })\n public auto = false;\n\n /**\n * The tab items are displayed closer together.\n */\n @property({ type: Boolean, reflect: true })\n public compact = false;\n\n @property({ reflect: true })\n public direction: 'vertical' | 'vertical-right' | 'horizontal' =\n 'horizontal';\n\n @property({ type: Boolean, reflect: true })\n public emphasized = false;\n\n @property()\n public label = '';\n\n /**\n * The tab list is displayed without a border.\n */\n @property({ type: Boolean, reflect: true })\n public quiet = false;\n\n @property({ attribute: false })\n public selectionIndicatorStyle = noSelectionStyle;\n\n @property({ attribute: false })\n public shouldAnimate = false;\n\n @query('#list')\n private tabList!: HTMLDivElement;\n\n @property({ reflect: true })\n public get selected(): string {\n return this._selected;\n }\n\n public set selected(value: string) {\n const oldValue = this.selected;\n\n if (value === oldValue) {\n return;\n }\n\n this._selected = value;\n this.shouldUpdateCheckedState();\n this.requestUpdate('selected', oldValue);\n }\n\n private _selected = '';\n\n private set tabs(tabs: Tab[]) {\n if (tabs === this.tabs) return;\n this._tabs = tabs;\n this.rovingTabindexController.clearElementCache();\n }\n\n private get tabs(): Tab[] {\n return this._tabs;\n }\n\n private _tabs: Tab[] = [];\n\n constructor() {\n super();\n new IntersectionController(this, {\n config: {\n root: null,\n rootMargin: \"0px\",\n threshold: [0, 1]\n },\n callback: () => {\n this.updateSelectionIndicator();\n }\n });\n }\n\n rovingTabindexController = new RovingTabindexController<Tab>(this, {\n focusInIndex: (elements) => {\n let focusInIndex = 0;\n const firstFocusableElement = elements.find((el, index) => {\n const focusInElement = this.selected\n ? !el.disabled && el.value === this.selected\n : !el.disabled;\n focusInIndex = index;\n return focusInElement;\n });\n return firstFocusableElement ? focusInIndex : -1;\n },\n direction: () =>\n this.direction === 'horizontal' ? 'horizontal' : 'vertical',\n elementEnterAction: (el) => {\n if (!this.auto) return;\n\n this.shouldAnimate = true;\n this.selectTarget(el);\n },\n elements: () => this.tabs,\n isFocusableElement: (el) => !el.disabled,\n listenerScope: () => this.tabList,\n });\n\n /**\n * @private\n */\n public override get focusElement(): Tab | this {\n return this.rovingTabindexController.focusInElement || this;\n }\n\n protected override manageAutoFocus(): void {\n const tabs = [...this.children] as Tab[];\n const tabUpdateCompletes = tabs.map((tab) => {\n if (typeof tab.updateComplete !== 'undefined') {\n return tab.updateComplete;\n }\n return Promise.resolve(true);\n });\n Promise.all(tabUpdateCompletes).then(() => super.manageAutoFocus());\n }\n\n protected managePanels({\n target,\n }: Event & { target: HTMLSlotElement }): void {\n const panels = target.assignedElements() as TabPanel[];\n panels.map((panel) => {\n const { value, id } = panel;\n const tab = this.querySelector(`[role=\"tab\"][value=\"${value}\"]`);\n if (tab) {\n tab.setAttribute('aria-controls', id);\n panel.setAttribute('aria-labelledby', tab.id);\n }\n panel.selected = value === this.selected;\n });\n }\n\n protected override render(): TemplateResult {\n return html`\n <div\n aria-label=${ifDefined(this.label ? this.label : undefined)}\n @click=${this.onClick}\n @keydown=${this.onKeyDown}\n @sp-tab-contentchange=${this.updateSelectionIndicator}\n id=\"list\"\n role=\"tablist\"\n part=\"tablist\"\n >\n <slot @slotchange=${this.onSlotChange}></slot>\n <div\n id=\"selection-indicator\"\n class=${ifDefined(\n this.shouldAnimate ? undefined : 'first-position'\n )}\n style=${this.selectionIndicatorStyle}\n role=\"presentation\"\n ></div>\n </div>\n <slot name=\"tab-panel\" @slotchange=${this.managePanels}></slot>\n `;\n }\n\n protected override willUpdate(changes: PropertyValues): void {\n if (!this.hasUpdated) {\n const selectedChild = this.querySelector(\n ':scope > [selected]'\n ) as Tab;\n if (selectedChild) {\n this.selectTarget(selectedChild);\n }\n }\n\n super.updated(changes);\n if (changes.has('selected')) {\n if (changes.get('selected')) {\n const previous = this.querySelector(\n `[role=\"tabpanel\"][value=\"${changes.get('selected')}\"]`\n ) as TabPanel;\n if (previous) previous.selected = false;\n }\n const next = this.querySelector(\n `[role=\"tabpanel\"][value=\"${this.selected}\"]`\n ) as TabPanel;\n if (next) next.selected = true;\n }\n if (changes.has('direction')) {\n if (this.direction === 'horizontal') {\n this.removeAttribute('aria-orientation');\n } else {\n this.setAttribute('aria-orientation', 'vertical');\n }\n }\n if (changes.has('dir')) {\n this.updateSelectionIndicator();\n }\n if (changes.has('disabled')) {\n if (this.disabled) {\n this.setAttribute('aria-disabled', 'true');\n } else {\n this.removeAttribute('aria-disabled');\n }\n }\n if (\n !this.shouldAnimate &&\n typeof changes.get('shouldAnimate') !== 'undefined'\n ) {\n this.shouldAnimate = true;\n }\n }\n\n private onClick = (event: Event): void => {\n if (this.disabled) {\n return;\n }\n const target = event\n .composedPath()\n .find((el) => (el as Tab).parentElement === this) as Tab;\n if (!target || target.disabled) {\n return;\n }\n this.shouldAnimate = true;\n this.selectTarget(target);\n };\n\n private onKeyDown = (event: KeyboardEvent): void => {\n if (event.code === 'Enter' || event.code === 'Space') {\n event.preventDefault();\n const target = event.target as HTMLElement;\n if (target) {\n this.selectTarget(target);\n }\n }\n };\n\n private selectTarget(target: HTMLElement): void {\n const value = target.getAttribute('value');\n if (value) {\n const selected = this.selected;\n this.selected = value;\n const applyDefault = this.dispatchEvent(\n new Event('change', {\n cancelable: true,\n })\n );\n if (!applyDefault) {\n this.selected = selected;\n }\n }\n }\n\n private onSlotChange(): void {\n this.tabs = [...this.querySelectorAll('[role=\"tab\"]')] as Tab[];\n this.shouldUpdateCheckedState();\n }\n\n private shouldUpdateCheckedState(): void {\n this.tabChangeResolver();\n this.tabChangePromise = new Promise(\n (res) => (this.tabChangeResolver = res)\n );\n setTimeout(this.updateCheckedState);\n }\n\n private updateCheckedState = (): void => {\n if (!this.tabs.length) {\n this.tabs = [...this.querySelectorAll('[role=\"tab\"]')] as Tab[];\n }\n this.tabs.forEach((element) => {\n element.removeAttribute('selected');\n });\n\n if (this.selected) {\n const currentChecked = this.tabs.find(\n (el) => el.value === this.selected\n );\n\n if (currentChecked) {\n currentChecked.selected = true;\n } else {\n this.selected = '';\n }\n } else {\n const firstTab = this.tabs[0];\n if (firstTab) {\n firstTab.setAttribute('tabindex', '0');\n }\n }\n\n this.updateSelectionIndicator();\n this.tabChangeResolver();\n };\n\n private updateSelectionIndicator = async (): Promise<void> => {\n const selectedElement = this.tabs.find((el) => el.selected);\n if (!selectedElement) {\n this.selectionIndicatorStyle = noSelectionStyle;\n return;\n }\n await Promise.all([\n selectedElement.updateComplete,\n document.fonts ? document.fonts.ready : Promise.resolve(),\n ]);\n const tabBoundingClientRect = selectedElement.getBoundingClientRect();\n\n if (this.direction === 'horizontal') {\n const width = tabBoundingClientRect.width;\n const offset = selectedElement.offsetLeft;\n\n this.selectionIndicatorStyle = `transform: translateX(${offset}px) scaleX(${width});`;\n } else {\n const height = tabBoundingClientRect.height;\n const offset = selectedElement.offsetTop;\n\n this.selectionIndicatorStyle = `transform: translateY(${offset}px) scaleY(${height});`;\n }\n };\n\n private tabChangePromise = Promise.resolve();\n private tabChangeResolver: () => void = function () {\n return;\n };\n\n protected override async getUpdateComplete(): Promise<boolean> {\n const complete = (await super.getUpdateComplete()) as boolean;\n await this.tabChangePromise;\n return complete;\n }\n\n public override connectedCallback(): void {\n super.connectedCallback();\n window.addEventListener('resize', this.updateSelectionIndicator);\n if ('fonts' in document) {\n (\n document as unknown as {\n fonts: {\n addEventListener: (\n name: string,\n callback: () => void\n ) => void;\n };\n }\n ).fonts.addEventListener(\n 'loadingdone',\n this.updateSelectionIndicator\n );\n }\n }\n\n public override disconnectedCallback(): void {\n window.removeEventListener('resize', this.updateSelectionIndicator);\n if ('fonts' in document) {\n (\n document as unknown as {\n fonts: {\n removeEventListener: (\n name: string,\n callback: () => void\n ) => void;\n };\n }\n ).fonts.removeEventListener(\n 'loadingdone',\n this.updateSelectionIndicator\n );\n }\n super.disconnectedCallback();\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|