@spectrum-web-components/tabs 0.11.1 → 0.11.3-overlay.8

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.
Files changed (65) hide show
  1. package/package.json +8 -7
  2. package/src/Tab.d.ts +0 -1
  3. package/src/Tab.dev.js +0 -15
  4. package/src/Tab.dev.js.map +2 -2
  5. package/src/Tab.js +2 -2
  6. package/src/Tab.js.map +2 -2
  7. package/src/Tabs.d.ts +4 -7
  8. package/src/Tabs.dev.js +35 -46
  9. package/src/Tabs.dev.js.map +2 -2
  10. package/src/Tabs.js +5 -6
  11. package/src/Tabs.js.map +3 -3
  12. package/src/TabsOverflow.d.ts +3 -1
  13. package/src/TabsOverflow.dev.js +17 -3
  14. package/src/TabsOverflow.dev.js.map +2 -2
  15. package/src/TabsOverflow.js +2 -2
  16. package/src/TabsOverflow.js.map +3 -3
  17. package/src/spectrum-config.js +219 -83
  18. package/src/spectrum-tab.css.dev.js +3 -33
  19. package/src/spectrum-tab.css.dev.js.map +2 -2
  20. package/src/spectrum-tab.css.js +3 -33
  21. package/src/spectrum-tab.css.js.map +2 -2
  22. package/src/spectrum-tabs-sizes.css.d.ts +2 -0
  23. package/src/spectrum-tabs-sizes.css.dev.js +327 -0
  24. package/src/spectrum-tabs-sizes.css.dev.js.map +7 -0
  25. package/src/spectrum-tabs-sizes.css.js +324 -0
  26. package/src/spectrum-tabs-sizes.css.js.map +7 -0
  27. package/src/spectrum-tabs.css.dev.js +7 -343
  28. package/src/spectrum-tabs.css.dev.js.map +2 -2
  29. package/src/spectrum-tabs.css.js +7 -343
  30. package/src/spectrum-tabs.css.js.map +2 -2
  31. package/src/tab.css.dev.js +3 -33
  32. package/src/tab.css.dev.js.map +2 -2
  33. package/src/tab.css.js +3 -33
  34. package/src/tab.css.js.map +2 -2
  35. package/src/tabs-overflow.css.dev.js +5 -3
  36. package/src/tabs-overflow.css.dev.js.map +2 -2
  37. package/src/tabs-overflow.css.js +5 -3
  38. package/src/tabs-overflow.css.js.map +2 -2
  39. package/src/tabs-sizes.css.d.ts +2 -0
  40. package/src/tabs-sizes.css.dev.js +327 -0
  41. package/src/tabs-sizes.css.dev.js.map +7 -0
  42. package/src/tabs-sizes.css.js +324 -0
  43. package/src/tabs-sizes.css.js.map +7 -0
  44. package/src/tabs.css.dev.js +11 -345
  45. package/src/tabs.css.dev.js.map +2 -2
  46. package/src/tabs.css.js +11 -345
  47. package/src/tabs.css.js.map +2 -2
  48. package/stories/index.js +8 -3
  49. package/stories/index.js.map +2 -2
  50. package/stories/tabs-overflow-panel-sizes.stories.js +35 -0
  51. package/stories/tabs-overflow-panel-sizes.stories.js.map +7 -0
  52. package/stories/tabs-overflow-sizes.stories.js +31 -0
  53. package/stories/tabs-overflow-sizes.stories.js.map +7 -0
  54. package/stories/tabs-overflow.stories.js +4 -10
  55. package/stories/tabs-overflow.stories.js.map +2 -2
  56. package/test/tabs-overflow-panel-sizes.test-vrt.js +5 -0
  57. package/test/tabs-overflow-panel-sizes.test-vrt.js.map +7 -0
  58. package/test/tabs-overflow-sizes.test-vrt.js +5 -0
  59. package/test/{tabs-overflow-panel.test-vrt.js.map → tabs-overflow-sizes.test-vrt.js.map} +2 -2
  60. package/test/tabs.test.js +4 -7
  61. package/test/tabs.test.js.map +2 -2
  62. package/custom-elements.json +0 -892
  63. package/stories/tabs-overflow-panel.stories.js +0 -19
  64. package/stories/tabs-overflow-panel.stories.js.map +0 -7
  65. package/test/tabs-overflow-panel.test-vrt.js +0 -5
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spectrum-web-components/tabs",
3
- "version": "0.11.1",
3
+ "version": "0.11.3-overlay.8+eef228d8d",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -48,6 +48,7 @@
48
48
  "./src/tab-panel.css.js": "./src/tab-panel.css.js",
49
49
  "./src/tab.css.js": "./src/tab.css.js",
50
50
  "./src/tabs-overflow.css.js": "./src/tabs-overflow.css.js",
51
+ "./src/tabs-sizes.css.js": "./src/tabs-sizes.css.js",
51
52
  "./src/tabs.css.js": "./src/tabs.css.js",
52
53
  "./sp-tabs.js": {
53
54
  "development": "./sp-tabs.dev.js",
@@ -85,11 +86,11 @@
85
86
  ],
86
87
  "dependencies": {
87
88
  "@lit-labs/observers": "^1.0.1",
88
- "@spectrum-web-components/base": "^0.7.4",
89
- "@spectrum-web-components/icon": "^0.12.8",
90
- "@spectrum-web-components/icons-ui": "^0.9.9",
91
- "@spectrum-web-components/reactive-controllers": "^0.3.5",
92
- "@spectrum-web-components/shared": "^0.15.5"
89
+ "@spectrum-web-components/base": "^0.7.5-overlay.236+eef228d8d",
90
+ "@spectrum-web-components/icon": "^0.12.10-overlay.8+eef228d8d",
91
+ "@spectrum-web-components/icons-ui": "^0.9.11-overlay.8+eef228d8d",
92
+ "@spectrum-web-components/reactive-controllers": "^0.3.6-overlay.266+eef228d8d",
93
+ "@spectrum-web-components/shared": "^0.15.6-overlay.236+eef228d8d"
93
94
  },
94
95
  "devDependencies": {
95
96
  "@spectrum-css/tabs": "^3.2.27"
@@ -100,5 +101,5 @@
100
101
  "./sp-*.js",
101
102
  "./**/*.dev.js"
102
103
  ],
103
- "gitHead": "5e11d828243bb3ff572c25b33a8d58844a89f524"
104
+ "gitHead": "eef228d8defcf04fe32713c7232fd0873828752b"
104
105
  }
package/src/Tab.d.ts CHANGED
@@ -25,7 +25,6 @@ export declare class Tab extends Tab_base {
25
25
  selected: boolean;
26
26
  vertical: boolean;
27
27
  value: string;
28
- protected handleContentChange(): void;
29
28
  protected render(): TemplateResult;
30
29
  protected firstUpdated(changes: PropertyValues): void;
31
30
  protected updated(changes: PropertyValues): void;
package/src/Tab.dev.js CHANGED
@@ -41,14 +41,6 @@ const _Tab = class extends FocusVisiblePolyfillMixin(
41
41
  get hasLabel() {
42
42
  return !!this.label || this.slotHasContent;
43
43
  }
44
- handleContentChange() {
45
- this.dispatchEvent(
46
- new Event("sp-tab-contentchange", {
47
- bubbles: true,
48
- composed: true
49
- })
50
- );
51
- }
52
44
  render() {
53
45
  return html`
54
46
  ${this.hasIcon ? html`
@@ -66,16 +58,9 @@ const _Tab = class extends FocusVisiblePolyfillMixin(
66
58
  if (!this.hasAttribute("id")) {
67
59
  this.id = `sp-tab-${_Tab.instanceCount++}`;
68
60
  }
69
- this.shadowRoot.addEventListener(
70
- "slotchange",
71
- this.handleContentChange
72
- );
73
61
  }
74
62
  updated(changes) {
75
63
  super.updated(changes);
76
- if (changes.has("label") && typeof changes.get("label") !== "undefined") {
77
- this.handleContentChange();
78
- }
79
64
  if (changes.has("selected")) {
80
65
  this.setAttribute(
81
66
  "aria-selected",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["Tab.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 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": ";;;;;;;;;;;;AAYA;AAAA,EAEI;AAAA,EAEA;AAAA,OAEG;AACP,SAAS,gBAAgB;AACzB;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,OACG;AAEP,OAAO,mBAAmB;AAQnB,MAAM,OAAN,cAAkB;AAAA,EACrB,gBAAgB,oBAAoB,iBAAiB,eAAe,GAAG,EAAE;AAC7E,EAAE;AAAA,EAFK;AAAA;AAqBH,SAAO,WAAW;AAGlB,SAAO,QAAQ;AAGf,SAAO,WAAW;AAGlB,SAAO,WAAW;AAGlB,SAAO,QAAQ;AAAA;AAAA,EA9Bf,WAA2B,SAAyB;AAChD,WAAO,CAAC,aAAa;AAAA,EACzB;AAAA,EAOA,IAAc,UAAmB;AAC7B,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAc,WAAoB;AAC9B,WAAO,CAAC,CAAC,KAAK,SAAS,KAAK;AAAA,EAChC;AAAA,EAiBU,sBAA4B;AAIlC,SAAK;AAAA,MACD,IAAI,MAAM,wBAAwB;AAAA,QAC9B,SAAS;AAAA,QACT,UAAU;AAAA,MACd,CAAC;AAAA,IACL;AAAA,EACJ;AAAA,EAEmB,SAAyB;AACxC,WAAO;AAAA,cACD,KAAK,UACD;AAAA;AAAA,sBAGA;AAAA,6CAC2B,CAAC,KAAK;AAAA,kBACjC,KAAK,iBAAiB,SAAS,KAAK;AAAA,wBAC9B,KAAK;AAAA;AAAA;AAAA,EAGzB;AAAA,EAEmB,aAAa,SAA+B;AAC3D,UAAM,aAAa,OAAO;AAC1B,SAAK,aAAa,QAAQ,KAAK;AAC/B,QAAI,CAAC,KAAK,aAAa,IAAI,GAAG;AAC1B,WAAK,KAAK,UAAU,KAAI;AAAA,IAC5B;AAGA,SAAK,WAAW;AAAA,MACZ;AAAA,MACA,KAAK;AAAA,IACT;AAAA,EACJ;AAAA,EAEmB,QAAQ,SAA+B;AACtD,UAAM,QAAQ,OAAO;AACrB,QACI,QAAQ,IAAI,OAAO,KACnB,OAAO,QAAQ,IAAI,OAAO,MAAM,aAClC;AACE,WAAK,oBAAoB;AAAA,IAC7B;AACA,QAAI,QAAQ,IAAI,UAAU,GAAG;AACzB,WAAK;AAAA,QACD;AAAA,QACA,KAAK,WAAW,SAAS;AAAA,MAC7B;AACA,WAAK,aAAa,YAAY,KAAK,WAAW,MAAM,IAAI;AAAA,IAC5D;AACA,QAAI,QAAQ,IAAI,UAAU,GAAG;AACzB,UAAI,KAAK,UAAU;AACf,aAAK,aAAa,iBAAiB,MAAM;AAAA,MAC7C,OAAO;AACH,aAAK,gBAAgB,eAAe;AAAA,MACxC;AAAA,IACJ;AAAA,EACJ;AACJ;AAlGO,WAAM,MAAN;AAAA;AAAA;AAAA;AAAM,IAUF,gBAAgB;AAWhB;AAAA,EADN,SAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GApBjC,IAqBF;AAGA;AAAA,EADN,SAAS,EAAE,SAAS,KAAK,CAAC;AAAA,GAvBlB,IAwBF;AAGA;AAAA,EADN,SAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GA1BjC,IA2BF;AAGA;AAAA,EADN,SAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GA7BjC,IA8BF;AAGA;AAAA,EADN,SAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GAhChC,IAiCF;",
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 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 }\n\n protected override updated(changes: PropertyValues): void {\n super.updated(changes);\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": ";;;;;;;;;;;;AAYA;AAAA,EAEI;AAAA,EAEA;AAAA,OAEG;AACP,SAAS,gBAAgB;AACzB;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,OACG;AAEP,OAAO,mBAAmB;AAQnB,MAAM,OAAN,cAAkB;AAAA,EACrB,gBAAgB,oBAAoB,iBAAiB,eAAe,GAAG,EAAE;AAC7E,EAAE;AAAA,EAFK;AAAA;AAqBH,SAAO,WAAW;AAGlB,SAAO,QAAQ;AAGf,SAAO,WAAW;AAGlB,SAAO,WAAW;AAGlB,SAAO,QAAQ;AAAA;AAAA,EA9Bf,WAA2B,SAAyB;AAChD,WAAO,CAAC,aAAa;AAAA,EACzB;AAAA,EAOA,IAAc,UAAmB;AAC7B,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAc,WAAoB;AAC9B,WAAO,CAAC,CAAC,KAAK,SAAS,KAAK;AAAA,EAChC;AAAA,EAiBmB,SAAyB;AACxC,WAAO;AAAA,cACD,KAAK,UACD;AAAA;AAAA,sBAGA;AAAA,6CAC2B,CAAC,KAAK;AAAA,kBACjC,KAAK,iBAAiB,SAAS,KAAK;AAAA,wBAC9B,KAAK;AAAA;AAAA;AAAA,EAGzB;AAAA,EAEmB,aAAa,SAA+B;AAC3D,UAAM,aAAa,OAAO;AAC1B,SAAK,aAAa,QAAQ,KAAK;AAC/B,QAAI,CAAC,KAAK,aAAa,IAAI,GAAG;AAC1B,WAAK,KAAK,UAAU,KAAI;AAAA,IAC5B;AAAA,EACJ;AAAA,EAEmB,QAAQ,SAA+B;AACtD,UAAM,QAAQ,OAAO;AACrB,QAAI,QAAQ,IAAI,UAAU,GAAG;AACzB,WAAK;AAAA,QACD;AAAA,QACA,KAAK,WAAW,SAAS;AAAA,MAC7B;AACA,WAAK,aAAa,YAAY,KAAK,WAAW,MAAM,IAAI;AAAA,IAC5D;AACA,QAAI,QAAQ,IAAI,UAAU,GAAG;AACzB,UAAI,KAAK,UAAU;AACf,aAAK,aAAa,iBAAiB,MAAM;AAAA,MAC7C,OAAO;AACH,aAAK,gBAAgB,eAAe;AAAA,MACxC;AAAA,IACJ;AAAA,EACJ;AACJ;AA1EO,WAAM,MAAN;AAAA;AAAA;AAAA;AAAM,IAUF,gBAAgB;AAWhB;AAAA,EADN,SAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GApBjC,IAqBF;AAGA;AAAA,EADN,SAAS,EAAE,SAAS,KAAK,CAAC;AAAA,GAvBlB,IAwBF;AAGA;AAAA,EADN,SAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GA1BjC,IA2BF;AAGA;AAAA,EADN,SAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GA7BjC,IA8BF;AAGA;AAAA,EADN,SAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GAhChC,IAiCF;",
6
6
  "names": []
7
7
  }
package/src/Tab.js CHANGED
@@ -1,4 +1,4 @@
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`
1
+ "use strict";var n=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var s=(p,l,e,i)=>{for(var t=i>1?void 0:i?c(l,e):l,a=p.length-1,d;a>=0;a--)(d=p[a])&&(t=(i?d(l,e,t):d(t))||t);return i&&t&&n(l,e,t),t};import{html as o,SpectrumElement as b}from"@spectrum-web-components/base";import{property as r}from"@spectrum-web-components/base/src/decorators.js";import{FocusVisiblePolyfillMixin as h,ObserveSlotPresence as f,ObserveSlotText as m}from"@spectrum-web-components/shared";import y from"./tab.css.js";const u=class extends h(m(f(b,'[slot="icon"]'),"")){constructor(){super(...arguments);this.disabled=!1;this.label="";this.selected=!1;this.vertical=!1;this.value=""}static get styles(){return[y]}get hasIcon(){return this.slotContentIsPresent}get hasLabel(){return!!this.label||this.slotHasContent}render(){return o`
2
2
  ${this.hasIcon?o`
3
3
  <slot name="icon"></slot>
4
4
  `:o``}
@@ -6,5 +6,5 @@
6
6
  ${this.slotHasContent?o``:this.label}
7
7
  <slot>${this.label}</slot>
8
8
  </label>
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);
9
+ `}firstUpdated(e){super.firstUpdated(e),this.setAttribute("role","tab"),this.hasAttribute("id")||(this.id=`sp-tab-${u.instanceCount++}`)}updated(e){super.updated(e),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=u;Tab.instanceCount=0,s([r({type:Boolean,reflect:!0})],Tab.prototype,"disabled",2),s([r({reflect:!0})],Tab.prototype,"label",2),s([r({type:Boolean,reflect:!0})],Tab.prototype,"selected",2),s([r({type:Boolean,reflect:!0})],Tab.prototype,"vertical",2),s([r({type:String,reflect:!0})],Tab.prototype,"value",2);
10
10
  //# sourceMappingURL=Tab.js.map
package/src/Tab.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["Tab.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 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": "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",
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 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 }\n\n protected override updated(changes: PropertyValues): void {\n super.updated(changes);\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": "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,CAiBmB,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,kBAEhC,CAEmB,QAAQC,EAA+B,CACtD,MAAM,QAAQA,CAAO,EACjBA,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,EA1EO,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
6
  "names": ["html", "SpectrumElement", "property", "FocusVisiblePolyfillMixin", "ObserveSlotPresence", "ObserveSlotText", "tabItemStyles", "_Tab", "changes", "__decorateClass"]
7
7
  }
package/src/Tabs.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { CSSResult, CSSResultArray, PropertyValues, TemplateResult } from '@spectrum-web-components/base';
2
+ import { ResizeController } from '@lit-labs/observers/resize_controller.js';
2
3
  import { Tab } from './Tab.js';
3
4
  import { Focusable } from '@spectrum-web-components/shared';
4
5
  import { RovingTabindexController } from '@spectrum-web-components/reactive-controllers/src/RovingTabindex.js';
@@ -47,14 +48,14 @@ export declare class Tabs extends Tabs_base {
47
48
  quiet: boolean;
48
49
  selectionIndicatorStyle: string;
49
50
  shouldAnimate: boolean;
51
+ private slotEl;
50
52
  private tabList;
51
- get selected(): string;
52
- set selected(value: string);
53
- private _selected;
53
+ selected: string;
54
54
  private set tabs(value);
55
55
  private get tabs();
56
56
  private _tabs;
57
57
  constructor();
58
+ protected resizeController: ResizeController<void>;
58
59
  rovingTabindexController: RovingTabindexController<Tab>;
59
60
  /**
60
61
  * @private
@@ -73,12 +74,8 @@ export declare class Tabs extends Tabs_base {
73
74
  private onKeyDown;
74
75
  private selectTarget;
75
76
  private onSlotChange;
76
- private shouldUpdateCheckedState;
77
77
  private updateCheckedState;
78
78
  private updateSelectionIndicator;
79
- private tabChangePromise;
80
- private tabChangeResolver;
81
- protected getUpdateComplete(): Promise<boolean>;
82
79
  connectedCallback(): void;
83
80
  disconnectedCallback(): void;
84
81
  }
package/src/Tabs.dev.js CHANGED
@@ -24,9 +24,11 @@ import {
24
24
  ifDefined
25
25
  } from "@spectrum-web-components/base/src/directives.js";
26
26
  import { IntersectionController } from "@lit-labs/observers/intersection_controller.js";
27
+ import { ResizeController } from "@lit-labs/observers/resize_controller.js";
27
28
  import { Focusable } from "@spectrum-web-components/shared";
28
29
  import { RovingTabindexController } from "@spectrum-web-components/reactive-controllers/src/RovingTabindex.js";
29
30
  import tabStyles from "./tabs.css.js";
31
+ import tabSizes from "./tabs-sizes.css.js";
30
32
  export const ScaledIndicator = {
31
33
  baseSize: 100,
32
34
  noSelectionStyle: "transform: translateX(0px) scaleX(0) scaleY(0)",
@@ -62,8 +64,13 @@ export class Tabs extends SizedMixin(Focusable) {
62
64
  this.quiet = false;
63
65
  this.selectionIndicatorStyle = ScaledIndicator.noSelectionStyle;
64
66
  this.shouldAnimate = false;
65
- this._selected = "";
67
+ this.selected = "";
66
68
  this._tabs = [];
69
+ this.resizeController = new ResizeController(this, {
70
+ callback: () => {
71
+ this.updateSelectionIndicator();
72
+ }
73
+ });
67
74
  this.rovingTabindexController = new RovingTabindexController(this, {
68
75
  focusInIndex: (elements) => {
69
76
  let focusInIndex = 0;
@@ -114,9 +121,6 @@ export class Tabs extends SizedMixin(Focusable) {
114
121
  }
115
122
  };
116
123
  this.updateCheckedState = () => {
117
- if (!this.tabs.length) {
118
- this.tabs = [...this.querySelectorAll('[role="tab"]')];
119
- }
120
124
  this.tabs.forEach((element) => {
121
125
  element.removeAttribute("selected");
122
126
  });
@@ -136,7 +140,6 @@ export class Tabs extends SizedMixin(Focusable) {
136
140
  }
137
141
  }
138
142
  this.updateSelectionIndicator();
139
- this.tabChangeResolver();
140
143
  };
141
144
  this.updateSelectionIndicator = async () => {
142
145
  const selectedElement = this.tabs.find((el) => el.selected);
@@ -151,10 +154,6 @@ export class Tabs extends SizedMixin(Focusable) {
151
154
  const { width, height } = selectedElement.getBoundingClientRect();
152
155
  this.selectionIndicatorStyle = this.direction === "horizontal" ? ScaledIndicator.transformX(selectedElement.offsetLeft, width) : ScaledIndicator.transformY(selectedElement.offsetTop, height);
153
156
  };
154
- this.tabChangePromise = Promise.resolve();
155
- this.tabChangeResolver = function() {
156
- return;
157
- };
158
157
  new IntersectionController(this, {
159
158
  config: {
160
159
  root: null,
@@ -167,23 +166,17 @@ export class Tabs extends SizedMixin(Focusable) {
167
166
  });
168
167
  }
169
168
  static get styles() {
170
- return [tabStyles, ScaledIndicator.baseStyles()];
171
- }
172
- get selected() {
173
- return this._selected;
174
- }
175
- set selected(value) {
176
- const oldValue = this.selected;
177
- if (value === oldValue) {
178
- return;
179
- }
180
- this._selected = value;
181
- this.shouldUpdateCheckedState();
182
- this.requestUpdate("selected", oldValue);
169
+ return [tabSizes, tabStyles, ScaledIndicator.baseStyles()];
183
170
  }
184
171
  set tabs(tabs) {
185
172
  if (tabs === this.tabs)
186
173
  return;
174
+ this._tabs.forEach((tab) => {
175
+ this.resizeController.unobserve(tab);
176
+ });
177
+ tabs.forEach((tab) => {
178
+ this.resizeController.observe(tab);
179
+ });
187
180
  this._tabs = tabs;
188
181
  this.rovingTabindexController.clearElementCache();
189
182
  }
@@ -205,13 +198,16 @@ export class Tabs extends SizedMixin(Focusable) {
205
198
  });
206
199
  }
207
200
  get scrollState() {
208
- var _a, _b, _c, _d;
209
- const canScrollLeft = ((_a = this.tabList) == null ? void 0 : _a.scrollLeft) > 0;
210
- const canScrollRight = Math.ceil((_b = this.tabList) == null ? void 0 : _b.scrollLeft) < ((_c = this.tabList) == null ? void 0 : _c.scrollWidth) - ((_d = this.tabList) == null ? void 0 : _d.clientWidth);
211
- return {
212
- canScrollLeft,
213
- canScrollRight
214
- };
201
+ if (this.tabList) {
202
+ const { scrollLeft, clientWidth, scrollWidth } = this.tabList;
203
+ const canScrollLeft = Math.abs(scrollLeft) > 0;
204
+ const canScrollRight = Math.ceil(Math.abs(scrollLeft)) < scrollWidth - clientWidth;
205
+ return {
206
+ canScrollLeft: this.dir === "ltr" ? canScrollLeft : canScrollRight,
207
+ canScrollRight: this.dir === "ltr" ? canScrollRight : canScrollLeft
208
+ };
209
+ }
210
+ return {};
215
211
  }
216
212
  manageAutoFocus() {
217
213
  const tabs = [...this.children];
@@ -244,7 +240,6 @@ export class Tabs extends SizedMixin(Focusable) {
244
240
  aria-label=${ifDefined(this.label ? this.label : void 0)}
245
241
  @click=${this.onClick}
246
242
  @keydown=${this.onKeyDown}
247
- @sp-tab-contentchange=${this.updateSelectionIndicator}
248
243
  @scroll=${this.onTabsScroll}
249
244
  id="list"
250
245
  role="tablist"
@@ -272,8 +267,11 @@ export class Tabs extends SizedMixin(Focusable) {
272
267
  this.selectTarget(selectedChild);
273
268
  }
274
269
  }
275
- super.updated(changes);
270
+ super.willUpdate(changes);
276
271
  if (changes.has("selected")) {
272
+ if (this.tabs.length) {
273
+ this.updateCheckedState();
274
+ }
277
275
  if (changes.get("selected")) {
278
276
  const previous = this.querySelector(
279
277
  `[role="tabpanel"][value="${changes.get("selected")}"]`
@@ -324,20 +322,8 @@ export class Tabs extends SizedMixin(Focusable) {
324
322
  }
325
323
  }
326
324
  onSlotChange() {
327
- this.tabs = [...this.querySelectorAll('[role="tab"]')];
328
- this.shouldUpdateCheckedState();
329
- }
330
- shouldUpdateCheckedState() {
331
- this.tabChangeResolver();
332
- this.tabChangePromise = new Promise(
333
- (res) => this.tabChangeResolver = res
334
- );
335
- setTimeout(this.updateCheckedState);
336
- }
337
- async getUpdateComplete() {
338
- const complete = await super.getUpdateComplete();
339
- await this.tabChangePromise;
340
- return complete;
325
+ this.tabs = this.slotEl.assignedElements().filter((el) => el.getAttribute("role") === "tab");
326
+ this.updateCheckedState();
341
327
  }
342
328
  connectedCallback() {
343
329
  super.connectedCallback();
@@ -387,10 +373,13 @@ __decorateClass([
387
373
  __decorateClass([
388
374
  property({ attribute: false })
389
375
  ], Tabs.prototype, "shouldAnimate", 2);
376
+ __decorateClass([
377
+ query("slot")
378
+ ], Tabs.prototype, "slotEl", 2);
390
379
  __decorateClass([
391
380
  query("#list")
392
381
  ], Tabs.prototype, "tabList", 2);
393
382
  __decorateClass([
394
383
  property({ reflect: true })
395
- ], Tabs.prototype, "selected", 1);
384
+ ], Tabs.prototype, "selected", 2);
396
385
  //# sourceMappingURL=Tabs.dev.js.map
@@ -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 css,\n CSSResult,\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 {\n classMap,\n ifDefined,\n} 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\n// Encapsulated for use both here and in TopNav\nexport const ScaledIndicator = {\n baseSize: 100 as const,\n noSelectionStyle: 'transform: translateX(0px) scaleX(0) scaleY(0)',\n\n transformX(left: number, width: number): string {\n const scale = width / this.baseSize;\n return `transform: translateX(${left}px) scaleX(${scale});`;\n },\n\n transformY(top: number, height: number): string {\n const scale = height / this.baseSize;\n return `transform: translateY(${top}px) scaleY(${scale});`;\n },\n\n baseStyles(): CSSResult {\n return css`\n :host([direction='vertical-right']) #selection-indicator,\n :host([direction='vertical']) #selection-indicator {\n height: ${this.baseSize}px;\n }\n :host([dir][direction='horizontal']) #selection-indicator {\n width: ${this.baseSize}px;\n }\n `;\n },\n};\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, ScaledIndicator.baseStyles()];\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 @property({ type: Boolean })\n public enableTabsScroll = false;\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 = ScaledIndicator.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 public scrollTabs(\n delta: number,\n behavior: ScrollBehavior = 'smooth'\n ): void {\n this.tabList?.scrollBy({\n left: delta,\n top: 0,\n behavior,\n });\n }\n\n public get scrollState(): Record<string, boolean> {\n const canScrollLeft = this.tabList?.scrollLeft > 0;\n const canScrollRight =\n Math.ceil(this.tabList?.scrollLeft) <\n this.tabList?.scrollWidth - this.tabList?.clientWidth;\n\n return {\n canScrollLeft,\n canScrollRight,\n };\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 class=${classMap({ scroll: this.enableTabsScroll })}\n aria-label=${ifDefined(this.label ? this.label : undefined)}\n @click=${this.onClick}\n @keydown=${this.onKeyDown}\n @sp-tab-contentchange=${this.updateSelectionIndicator}\n @scroll=${this.onTabsScroll}\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 onTabsScroll = (): void => {\n this.dispatchEvent(\n new Event('sp-tabs-scroll', {\n bubbles: true,\n composed: true,\n })\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 = ScaledIndicator.noSelectionStyle;\n return;\n }\n await Promise.all([\n selectedElement.updateComplete,\n document.fonts ? document.fonts.ready : Promise.resolve(),\n ]);\n const { width, height } = selectedElement.getBoundingClientRect();\n\n this.selectionIndicatorStyle =\n this.direction === 'horizontal'\n ? ScaledIndicator.transformX(selectedElement.offsetLeft, width)\n : ScaledIndicator.transformY(selectedElement.offsetTop, height);\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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",
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 css,\n CSSResult,\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 {\n classMap,\n ifDefined,\n} from '@spectrum-web-components/base/src/directives.js';\nimport { IntersectionController } from '@lit-labs/observers/intersection_controller.js';\nimport { ResizeController } from '@lit-labs/observers/resize_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 tabSizes from './tabs-sizes.css.js';\nimport { TabPanel } from './TabPanel.dev.js'\n\n// Encapsulated for use both here and in TopNav\nexport const ScaledIndicator = {\n baseSize: 100 as const,\n noSelectionStyle: 'transform: translateX(0px) scaleX(0) scaleY(0)',\n\n transformX(left: number, width: number): string {\n const scale = width / this.baseSize;\n return `transform: translateX(${left}px) scaleX(${scale});`;\n },\n\n transformY(top: number, height: number): string {\n const scale = height / this.baseSize;\n return `transform: translateY(${top}px) scaleY(${scale});`;\n },\n\n baseStyles(): CSSResult {\n return css`\n :host([direction='vertical-right']) #selection-indicator,\n :host([direction='vertical']) #selection-indicator {\n height: ${this.baseSize}px;\n }\n :host([dir][direction='horizontal']) #selection-indicator {\n width: ${this.baseSize}px;\n }\n `;\n },\n};\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 [tabSizes, tabStyles, ScaledIndicator.baseStyles()];\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 @property({ type: Boolean })\n public enableTabsScroll = false;\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 = ScaledIndicator.noSelectionStyle;\n\n @property({ attribute: false })\n public shouldAnimate = false;\n\n @query('slot')\n private slotEl!: HTMLSlotElement;\n\n @query('#list')\n private tabList!: HTMLDivElement;\n\n @property({ reflect: true })\n selected = '';\n\n private set tabs(tabs: Tab[]) {\n if (tabs === this.tabs) return;\n this._tabs.forEach((tab) => {\n this.resizeController.unobserve(tab);\n });\n tabs.forEach((tab) => {\n this.resizeController.observe(tab);\n });\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 protected resizeController = new ResizeController(this, {\n callback: () => {\n this.updateSelectionIndicator();\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 public scrollTabs(\n delta: number,\n behavior: ScrollBehavior = 'smooth'\n ): void {\n this.tabList?.scrollBy({\n left: delta,\n top: 0,\n behavior,\n });\n }\n\n public get scrollState(): Record<string, boolean> {\n if (this.tabList) {\n const { scrollLeft, clientWidth, scrollWidth } = this.tabList;\n const canScrollLeft = Math.abs(scrollLeft) > 0;\n const canScrollRight =\n Math.ceil(Math.abs(scrollLeft)) < scrollWidth - clientWidth;\n return {\n canScrollLeft:\n this.dir === 'ltr' ? canScrollLeft : canScrollRight,\n canScrollRight:\n this.dir === 'ltr' ? canScrollRight : canScrollLeft,\n };\n }\n return {};\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 class=${classMap({ scroll: this.enableTabsScroll })}\n aria-label=${ifDefined(this.label ? this.label : undefined)}\n @click=${this.onClick}\n @keydown=${this.onKeyDown}\n @scroll=${this.onTabsScroll}\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.willUpdate(changes);\n if (changes.has('selected')) {\n if (this.tabs.length) {\n this.updateCheckedState();\n }\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 onTabsScroll = (): void => {\n this.dispatchEvent(\n new Event('sp-tabs-scroll', {\n bubbles: true,\n composed: true,\n })\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.slotEl\n .assignedElements()\n .filter((el) => el.getAttribute('role') === 'tab') as Tab[];\n this.updateCheckedState();\n }\n\n private updateCheckedState = (): void => {\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 };\n\n private updateSelectionIndicator = async (): Promise<void> => {\n const selectedElement = this.tabs.find((el) => el.selected);\n if (!selectedElement) {\n this.selectionIndicatorStyle = ScaledIndicator.noSelectionStyle;\n return;\n }\n await Promise.all([\n selectedElement.updateComplete,\n document.fonts ? document.fonts.ready : Promise.resolve(),\n ]);\n const { width, height } = selectedElement.getBoundingClientRect();\n\n this.selectionIndicatorStyle =\n this.direction === 'horizontal'\n ? ScaledIndicator.transformX(selectedElement.offsetLeft, width)\n : ScaledIndicator.transformY(selectedElement.offsetTop, height);\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
  }
package/src/Tabs.js CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";var u=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var o=(c,r,e,t)=>{for(var i=t>1?void 0:t?h(r,e):r,s=c.length-1,a;s>=0;s--)(a=c[s])&&(i=(t?a(r,e,i):a(i))||i);return t&&i&&u(r,e,i),i};import{css as b,html as p,SizedMixin as f}from"@spectrum-web-components/base";import{property as l,query as m}from"@spectrum-web-components/base/src/decorators.js";import{classMap as v,ifDefined as d}from"@spectrum-web-components/base/src/directives.js";import{IntersectionController as S}from"@lit-labs/observers/intersection_controller.js";import{Focusable as g}from"@spectrum-web-components/shared";import{RovingTabindexController as y}from"@spectrum-web-components/reactive-controllers/src/RovingTabindex.js";import C from"./tabs.css.js";export const ScaledIndicator={baseSize:100,noSelectionStyle:"transform: translateX(0px) scaleX(0) scaleY(0)",transformX(c,r){const e=r/this.baseSize;return`transform: translateX(${c}px) scaleX(${e});`},transformY(c,r){const e=r/this.baseSize;return`transform: translateY(${c}px) scaleY(${e});`},baseStyles(){return b`
1
+ "use strict";var h=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var o=(n,a,e,t)=>{for(var i=t>1?void 0:t?b(a,e):a,s=n.length-1,l;s>=0;s--)(l=n[s])&&(i=(t?l(a,e,i):l(i))||i);return t&&i&&h(a,e,i),i};import{css as p,html as f,SizedMixin as m}from"@spectrum-web-components/base";import{property as r,query as d}from"@spectrum-web-components/base/src/decorators.js";import{classMap as v,ifDefined as u}from"@spectrum-web-components/base/src/directives.js";import{IntersectionController as S}from"@lit-labs/observers/intersection_controller.js";import{ResizeController as g}from"@lit-labs/observers/resize_controller.js";import{Focusable as y}from"@spectrum-web-components/shared";import{RovingTabindexController as E}from"@spectrum-web-components/reactive-controllers/src/RovingTabindex.js";import C from"./tabs.css.js";import T from"./tabs-sizes.css.js";export const ScaledIndicator={baseSize:100,noSelectionStyle:"transform: translateX(0px) scaleX(0) scaleY(0)",transformX(n,a){const e=a/this.baseSize;return`transform: translateX(${n}px) scaleX(${e});`},transformY(n,a){const e=a/this.baseSize;return`transform: translateY(${n}px) scaleY(${e});`},baseStyles(){return p`
2
2
  :host([direction='vertical-right']) #selection-indicator,
3
3
  :host([direction='vertical']) #selection-indicator {
4
4
  height: ${this.baseSize}px;
@@ -6,13 +6,12 @@
6
6
  :host([dir][direction='horizontal']) #selection-indicator {
7
7
  width: ${this.baseSize}px;
8
8
  }
9
- `}};export class Tabs extends f(g){constructor(){super();this.auto=!1;this.compact=!1;this.direction="horizontal";this.emphasized=!1;this.label="";this.enableTabsScroll=!1;this.quiet=!1;this.selectionIndicatorStyle=ScaledIndicator.noSelectionStyle;this.shouldAnimate=!1;this._selected="";this._tabs=[];this.rovingTabindexController=new y(this,{focusInIndex:e=>{let t=0;return e.find((s,a)=>{const n=this.selected?!s.disabled&&s.value===this.selected:!s.disabled;return t=a,n})?t:-1},direction:()=>this.direction==="horizontal"?"horizontal":"vertical",elementEnterAction:e=>{this.auto&&(this.shouldAnimate=!0,this.selectTarget(e))},elements:()=>this.tabs,isFocusableElement:e=>!e.disabled,listenerScope:()=>this.tabList});this.onTabsScroll=()=>{this.dispatchEvent(new Event("sp-tabs-scroll",{bubbles:!0,composed:!0}))};this.onClick=e=>{if(this.disabled)return;const t=e.composedPath().find(i=>i.parentElement===this);!t||t.disabled||(this.shouldAnimate=!0,this.selectTarget(t))};this.onKeyDown=e=>{if(e.code==="Enter"||e.code==="Space"){e.preventDefault();const t=e.target;t&&this.selectTarget(t)}};this.updateCheckedState=()=>{if(this.tabs.length||(this.tabs=[...this.querySelectorAll('[role="tab"]')]),this.tabs.forEach(e=>{e.removeAttribute("selected")}),this.selected){const e=this.tabs.find(t=>t.value===this.selected);e?e.selected=!0:this.selected=""}else{const e=this.tabs[0];e&&e.setAttribute("tabindex","0")}this.updateSelectionIndicator(),this.tabChangeResolver()};this.updateSelectionIndicator=async()=>{const e=this.tabs.find(s=>s.selected);if(!e){this.selectionIndicatorStyle=ScaledIndicator.noSelectionStyle;return}await Promise.all([e.updateComplete,document.fonts?document.fonts.ready:Promise.resolve()]);const{width:t,height:i}=e.getBoundingClientRect();this.selectionIndicatorStyle=this.direction==="horizontal"?ScaledIndicator.transformX(e.offsetLeft,t):ScaledIndicator.transformY(e.offsetTop,i)};this.tabChangePromise=Promise.resolve();this.tabChangeResolver=function(){};new S(this,{config:{root:null,rootMargin:"0px",threshold:[0,1]},callback:()=>{this.updateSelectionIndicator()}})}static get styles(){return[C,ScaledIndicator.baseStyles()]}get selected(){return this._selected}set selected(e){const t=this.selected;e!==t&&(this._selected=e,this.shouldUpdateCheckedState(),this.requestUpdate("selected",t))}set tabs(e){e!==this.tabs&&(this._tabs=e,this.rovingTabindexController.clearElementCache())}get tabs(){return this._tabs}get focusElement(){return this.rovingTabindexController.focusInElement||this}scrollTabs(e,t="smooth"){var i;(i=this.tabList)==null||i.scrollBy({left:e,top:0,behavior:t})}get scrollState(){var i,s,a,n;const e=((i=this.tabList)==null?void 0:i.scrollLeft)>0,t=Math.ceil((s=this.tabList)==null?void 0:s.scrollLeft)<((a=this.tabList)==null?void 0:a.scrollWidth)-((n=this.tabList)==null?void 0:n.clientWidth);return{canScrollLeft:e,canScrollRight:t}}manageAutoFocus(){const t=[...this.children].map(i=>typeof i.updateComplete!="undefined"?i.updateComplete:Promise.resolve(!0));Promise.all(t).then(()=>super.manageAutoFocus())}managePanels({target:e}){e.assignedElements().map(i=>{const{value:s,id:a}=i,n=this.querySelector(`[role="tab"][value="${s}"]`);n&&(n.setAttribute("aria-controls",a),i.setAttribute("aria-labelledby",n.id)),i.selected=s===this.selected})}render(){return p`
9
+ `}};export class Tabs extends m(y){constructor(){super();this.auto=!1;this.compact=!1;this.direction="horizontal";this.emphasized=!1;this.label="";this.enableTabsScroll=!1;this.quiet=!1;this.selectionIndicatorStyle=ScaledIndicator.noSelectionStyle;this.shouldAnimate=!1;this.selected="";this._tabs=[];this.resizeController=new g(this,{callback:()=>{this.updateSelectionIndicator()}});this.rovingTabindexController=new E(this,{focusInIndex:e=>{let t=0;return e.find((s,l)=>{const c=this.selected?!s.disabled&&s.value===this.selected:!s.disabled;return t=l,c})?t:-1},direction:()=>this.direction==="horizontal"?"horizontal":"vertical",elementEnterAction:e=>{this.auto&&(this.shouldAnimate=!0,this.selectTarget(e))},elements:()=>this.tabs,isFocusableElement:e=>!e.disabled,listenerScope:()=>this.tabList});this.onTabsScroll=()=>{this.dispatchEvent(new Event("sp-tabs-scroll",{bubbles:!0,composed:!0}))};this.onClick=e=>{if(this.disabled)return;const t=e.composedPath().find(i=>i.parentElement===this);!t||t.disabled||(this.shouldAnimate=!0,this.selectTarget(t))};this.onKeyDown=e=>{if(e.code==="Enter"||e.code==="Space"){e.preventDefault();const t=e.target;t&&this.selectTarget(t)}};this.updateCheckedState=()=>{if(this.tabs.forEach(e=>{e.removeAttribute("selected")}),this.selected){const e=this.tabs.find(t=>t.value===this.selected);e?e.selected=!0:this.selected=""}else{const e=this.tabs[0];e&&e.setAttribute("tabindex","0")}this.updateSelectionIndicator()};this.updateSelectionIndicator=async()=>{const e=this.tabs.find(s=>s.selected);if(!e){this.selectionIndicatorStyle=ScaledIndicator.noSelectionStyle;return}await Promise.all([e.updateComplete,document.fonts?document.fonts.ready:Promise.resolve()]);const{width:t,height:i}=e.getBoundingClientRect();this.selectionIndicatorStyle=this.direction==="horizontal"?ScaledIndicator.transformX(e.offsetLeft,t):ScaledIndicator.transformY(e.offsetTop,i)};new S(this,{config:{root:null,rootMargin:"0px",threshold:[0,1]},callback:()=>{this.updateSelectionIndicator()}})}static get styles(){return[T,C,ScaledIndicator.baseStyles()]}set tabs(e){e!==this.tabs&&(this._tabs.forEach(t=>{this.resizeController.unobserve(t)}),e.forEach(t=>{this.resizeController.observe(t)}),this._tabs=e,this.rovingTabindexController.clearElementCache())}get tabs(){return this._tabs}get focusElement(){return this.rovingTabindexController.focusInElement||this}scrollTabs(e,t="smooth"){var i;(i=this.tabList)==null||i.scrollBy({left:e,top:0,behavior:t})}get scrollState(){if(this.tabList){const{scrollLeft:e,clientWidth:t,scrollWidth:i}=this.tabList,s=Math.abs(e)>0,l=Math.ceil(Math.abs(e))<i-t;return{canScrollLeft:this.dir==="ltr"?s:l,canScrollRight:this.dir==="ltr"?l:s}}return{}}manageAutoFocus(){const t=[...this.children].map(i=>typeof i.updateComplete!="undefined"?i.updateComplete:Promise.resolve(!0));Promise.all(t).then(()=>super.manageAutoFocus())}managePanels({target:e}){e.assignedElements().map(i=>{const{value:s,id:l}=i,c=this.querySelector(`[role="tab"][value="${s}"]`);c&&(c.setAttribute("aria-controls",l),i.setAttribute("aria-labelledby",c.id)),i.selected=s===this.selected})}render(){return f`
10
10
  <div
11
11
  class=${v({scroll:this.enableTabsScroll})}
12
- aria-label=${d(this.label?this.label:void 0)}
12
+ aria-label=${u(this.label?this.label:void 0)}
13
13
  @click=${this.onClick}
14
14
  @keydown=${this.onKeyDown}
15
- @sp-tab-contentchange=${this.updateSelectionIndicator}
16
15
  @scroll=${this.onTabsScroll}
17
16
  id="list"
18
17
  role="tablist"
@@ -21,11 +20,11 @@
21
20
  <slot @slotchange=${this.onSlotChange}></slot>
22
21
  <div
23
22
  id="selection-indicator"
24
- class=${d(this.shouldAnimate?void 0:"first-position")}
23
+ class=${u(this.shouldAnimate?void 0:"first-position")}
25
24
  style=${this.selectionIndicatorStyle}
26
25
  role="presentation"
27
26
  ></div>
28
27
  </div>
29
28
  <slot name="tab-panel" @slotchange=${this.managePanels}></slot>
30
- `}willUpdate(e){if(!this.hasUpdated){const t=this.querySelector(":scope > [selected]");t&&this.selectTarget(t)}if(super.updated(e),e.has("selected")){if(e.get("selected")){const i=this.querySelector(`[role="tabpanel"][value="${e.get("selected")}"]`);i&&(i.selected=!1)}const t=this.querySelector(`[role="tabpanel"][value="${this.selected}"]`);t&&(t.selected=!0)}e.has("direction")&&(this.direction==="horizontal"?this.removeAttribute("aria-orientation"):this.setAttribute("aria-orientation","vertical")),e.has("dir")&&this.updateSelectionIndicator(),e.has("disabled")&&(this.disabled?this.setAttribute("aria-disabled","true"):this.removeAttribute("aria-disabled")),!this.shouldAnimate&&typeof e.get("shouldAnimate")!="undefined"&&(this.shouldAnimate=!0)}selectTarget(e){const t=e.getAttribute("value");if(t){const i=this.selected;this.selected=t,this.dispatchEvent(new Event("change",{cancelable:!0}))||(this.selected=i)}}onSlotChange(){this.tabs=[...this.querySelectorAll('[role="tab"]')],this.shouldUpdateCheckedState()}shouldUpdateCheckedState(){this.tabChangeResolver(),this.tabChangePromise=new Promise(e=>this.tabChangeResolver=e),setTimeout(this.updateCheckedState)}async getUpdateComplete(){const e=await super.getUpdateComplete();return await this.tabChangePromise,e}connectedCallback(){super.connectedCallback(),window.addEventListener("resize",this.updateSelectionIndicator),"fonts"in document&&document.fonts.addEventListener("loadingdone",this.updateSelectionIndicator)}disconnectedCallback(){window.removeEventListener("resize",this.updateSelectionIndicator),"fonts"in document&&document.fonts.removeEventListener("loadingdone",this.updateSelectionIndicator),super.disconnectedCallback()}}o([l({type:Boolean})],Tabs.prototype,"auto",2),o([l({type:Boolean,reflect:!0})],Tabs.prototype,"compact",2),o([l({reflect:!0})],Tabs.prototype,"direction",2),o([l({type:Boolean,reflect:!0})],Tabs.prototype,"emphasized",2),o([l()],Tabs.prototype,"label",2),o([l({type:Boolean})],Tabs.prototype,"enableTabsScroll",2),o([l({type:Boolean,reflect:!0})],Tabs.prototype,"quiet",2),o([l({attribute:!1})],Tabs.prototype,"selectionIndicatorStyle",2),o([l({attribute:!1})],Tabs.prototype,"shouldAnimate",2),o([m("#list")],Tabs.prototype,"tabList",2),o([l({reflect:!0})],Tabs.prototype,"selected",1);
29
+ `}willUpdate(e){if(!this.hasUpdated){const t=this.querySelector(":scope > [selected]");t&&this.selectTarget(t)}if(super.willUpdate(e),e.has("selected")){if(this.tabs.length&&this.updateCheckedState(),e.get("selected")){const i=this.querySelector(`[role="tabpanel"][value="${e.get("selected")}"]`);i&&(i.selected=!1)}const t=this.querySelector(`[role="tabpanel"][value="${this.selected}"]`);t&&(t.selected=!0)}e.has("direction")&&(this.direction==="horizontal"?this.removeAttribute("aria-orientation"):this.setAttribute("aria-orientation","vertical")),e.has("dir")&&this.updateSelectionIndicator(),e.has("disabled")&&(this.disabled?this.setAttribute("aria-disabled","true"):this.removeAttribute("aria-disabled")),!this.shouldAnimate&&typeof e.get("shouldAnimate")!="undefined"&&(this.shouldAnimate=!0)}selectTarget(e){const t=e.getAttribute("value");if(t){const i=this.selected;this.selected=t,this.dispatchEvent(new Event("change",{cancelable:!0}))||(this.selected=i)}}onSlotChange(){this.tabs=this.slotEl.assignedElements().filter(e=>e.getAttribute("role")==="tab"),this.updateCheckedState()}connectedCallback(){super.connectedCallback(),window.addEventListener("resize",this.updateSelectionIndicator),"fonts"in document&&document.fonts.addEventListener("loadingdone",this.updateSelectionIndicator)}disconnectedCallback(){window.removeEventListener("resize",this.updateSelectionIndicator),"fonts"in document&&document.fonts.removeEventListener("loadingdone",this.updateSelectionIndicator),super.disconnectedCallback()}}o([r({type:Boolean})],Tabs.prototype,"auto",2),o([r({type:Boolean,reflect:!0})],Tabs.prototype,"compact",2),o([r({reflect:!0})],Tabs.prototype,"direction",2),o([r({type:Boolean,reflect:!0})],Tabs.prototype,"emphasized",2),o([r()],Tabs.prototype,"label",2),o([r({type:Boolean})],Tabs.prototype,"enableTabsScroll",2),o([r({type:Boolean,reflect:!0})],Tabs.prototype,"quiet",2),o([r({attribute:!1})],Tabs.prototype,"selectionIndicatorStyle",2),o([r({attribute:!1})],Tabs.prototype,"shouldAnimate",2),o([d("slot")],Tabs.prototype,"slotEl",2),o([d("#list")],Tabs.prototype,"tabList",2),o([r({reflect:!0})],Tabs.prototype,"selected",2);
31
30
  //# sourceMappingURL=Tabs.js.map