@spectrum-web-components/tabs 0.10.6 → 0.10.7-react.48

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spectrum-web-components/tabs",
3
- "version": "0.10.6",
3
+ "version": "0.10.7-react.48+e4fada004",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -76,12 +76,12 @@
76
76
  ],
77
77
  "dependencies": {
78
78
  "@lit-labs/observers": "^1.0.1",
79
- "@spectrum-web-components/base": "^0.7.4",
80
- "@spectrum-web-components/reactive-controllers": "^0.3.5",
81
- "@spectrum-web-components/shared": "^0.15.5"
79
+ "@spectrum-web-components/base": "^0.7.5-react.48+e4fada004",
80
+ "@spectrum-web-components/reactive-controllers": "^0.3.6-react.78+e4fada004",
81
+ "@spectrum-web-components/shared": "^0.15.6-react.48+e4fada004"
82
82
  },
83
83
  "devDependencies": {
84
- "@spectrum-css/tabs": "^3.2.21"
84
+ "@spectrum-css/tabs": "^3.2.24"
85
85
  },
86
86
  "types": "./src/index.d.ts",
87
87
  "customElements": "custom-elements.json",
@@ -89,5 +89,5 @@
89
89
  "./sp-*.js",
90
90
  "./**/*.dev.js"
91
91
  ],
92
- "gitHead": "6b88f4e9d596e410c2f9ed2272bc7d8d961eed1e"
92
+ "gitHead": "e4fada0040dcaf1e1267f2159f366ec708cb2d09"
93
93
  }
package/src/Tabs.d.ts CHANGED
@@ -1,7 +1,14 @@
1
- import { CSSResultArray, PropertyValues, TemplateResult } from '@spectrum-web-components/base';
1
+ import { CSSResult, CSSResultArray, PropertyValues, TemplateResult } from '@spectrum-web-components/base';
2
2
  import { Tab } from './Tab.js';
3
3
  import { Focusable } from '@spectrum-web-components/shared';
4
4
  import { RovingTabindexController } from '@spectrum-web-components/reactive-controllers/src/RovingTabindex.js';
5
+ export declare const ScaledIndicator: {
6
+ baseSize: 100;
7
+ noSelectionStyle: string;
8
+ transformX(left: number, width: number): string;
9
+ transformY(top: number, height: number): string;
10
+ baseStyles(): CSSResult;
11
+ };
5
12
  declare const Tabs_base: typeof Focusable & {
6
13
  new (...args: any[]): import("@spectrum-web-components/base").SizedElementInterface;
7
14
  prototype: import("@spectrum-web-components/base").SizedElementInterface;
package/src/Tabs.dev.js CHANGED
@@ -11,6 +11,7 @@ var __decorateClass = (decorators, target, key, kind) => {
11
11
  return result;
12
12
  };
13
13
  import {
14
+ css,
14
15
  html,
15
16
  SizedMixin
16
17
  } from "@spectrum-web-components/base";
@@ -23,7 +24,29 @@ import { IntersectionController } from "@lit-labs/observers/intersection_control
23
24
  import { Focusable } from "@spectrum-web-components/shared";
24
25
  import { RovingTabindexController } from "@spectrum-web-components/reactive-controllers/src/RovingTabindex.js";
25
26
  import tabStyles from "./tabs.css.js";
26
- const noSelectionStyle = "transform: translateX(0px) scaleX(0) scaleY(0)";
27
+ export const ScaledIndicator = {
28
+ baseSize: 100,
29
+ noSelectionStyle: "transform: translateX(0px) scaleX(0) scaleY(0)",
30
+ transformX(left, width) {
31
+ const scale = width / this.baseSize;
32
+ return `transform: translateX(${left}px) scaleX(${scale});`;
33
+ },
34
+ transformY(top, height) {
35
+ const scale = height / this.baseSize;
36
+ return `transform: translateY(${top}px) scaleY(${scale});`;
37
+ },
38
+ baseStyles() {
39
+ return css`
40
+ :host([direction='vertical-right']) #selection-indicator,
41
+ :host([direction='vertical']) #selection-indicator {
42
+ height: ${this.baseSize}px;
43
+ }
44
+ :host([dir][direction='horizontal']) #selection-indicator {
45
+ width: ${this.baseSize}px;
46
+ }
47
+ `;
48
+ }
49
+ };
27
50
  export class Tabs extends SizedMixin(Focusable) {
28
51
  constructor() {
29
52
  super();
@@ -33,7 +56,7 @@ export class Tabs extends SizedMixin(Focusable) {
33
56
  this.emphasized = false;
34
57
  this.label = "";
35
58
  this.quiet = false;
36
- this.selectionIndicatorStyle = noSelectionStyle;
59
+ this.selectionIndicatorStyle = ScaledIndicator.noSelectionStyle;
37
60
  this.shouldAnimate = false;
38
61
  this._selected = "";
39
62
  this._tabs = [];
@@ -106,23 +129,15 @@ export class Tabs extends SizedMixin(Focusable) {
106
129
  this.updateSelectionIndicator = async () => {
107
130
  const selectedElement = this.tabs.find((el) => el.selected);
108
131
  if (!selectedElement) {
109
- this.selectionIndicatorStyle = noSelectionStyle;
132
+ this.selectionIndicatorStyle = ScaledIndicator.noSelectionStyle;
110
133
  return;
111
134
  }
112
135
  await Promise.all([
113
136
  selectedElement.updateComplete,
114
137
  document.fonts ? document.fonts.ready : Promise.resolve()
115
138
  ]);
116
- const tabBoundingClientRect = selectedElement.getBoundingClientRect();
117
- if (this.direction === "horizontal") {
118
- const width = tabBoundingClientRect.width;
119
- const offset = selectedElement.offsetLeft;
120
- this.selectionIndicatorStyle = `transform: translateX(${offset}px) scaleX(${width});`;
121
- } else {
122
- const height = tabBoundingClientRect.height;
123
- const offset = selectedElement.offsetTop;
124
- this.selectionIndicatorStyle = `transform: translateY(${offset}px) scaleY(${height});`;
125
- }
139
+ const { width, height } = selectedElement.getBoundingClientRect();
140
+ this.selectionIndicatorStyle = this.direction === "horizontal" ? ScaledIndicator.transformX(selectedElement.offsetLeft, width) : ScaledIndicator.transformY(selectedElement.offsetTop, height);
126
141
  };
127
142
  this.tabChangePromise = Promise.resolve();
128
143
  this.tabChangeResolver = function() {
@@ -140,7 +155,7 @@ export class Tabs extends SizedMixin(Focusable) {
140
155
  });
141
156
  }
142
157
  static get styles() {
143
- return [tabStyles];
158
+ return [tabStyles, ScaledIndicator.baseStyles()];
144
159
  }
145
160
  get selected() {
146
161
  return this._selected;
@@ -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 { 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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",
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 { 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\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 /**\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 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 = 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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",
6
6
  "names": []
7
7
  }
package/src/Tabs.js CHANGED
@@ -1,6 +1,14 @@
1
- "use strict";var h=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var a=(d,l,e,t)=>{for(var i=t>1?void 0:t?p(l,e):l,s=d.length-1,r;s>=0;s--)(r=d[s])&&(i=(t?r(l,e,i):r(i))||i);return t&&i&&h(l,e,i),i};import{html as b,SizedMixin as f}from"@spectrum-web-components/base";import{property as o,query as m}from"@spectrum-web-components/base/src/decorators.js";import{ifDefined as c}from"@spectrum-web-components/base/src/directives.js";import{IntersectionController as v}from"@lit-labs/observers/intersection_controller.js";import{Focusable as g}from"@spectrum-web-components/shared";import{RovingTabindexController as C}from"@spectrum-web-components/reactive-controllers/src/RovingTabindex.js";import S from"./tabs.css.js";const u="transform: translateX(0px) scaleX(0) scaleY(0)";export class Tabs extends f(g){constructor(){super();this.auto=!1;this.compact=!1;this.direction="horizontal";this.emphasized=!1;this.label="";this.quiet=!1;this.selectionIndicatorStyle=u;this.shouldAnimate=!1;this._selected="";this._tabs=[];this.rovingTabindexController=new C(this,{focusInIndex:e=>{let t=0;return e.find((s,r)=>{const n=this.selected?!s.disabled&&s.value===this.selected:!s.disabled;return t=r,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.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(i=>i.selected);if(!e){this.selectionIndicatorStyle=u;return}await Promise.all([e.updateComplete,document.fonts?document.fonts.ready:Promise.resolve()]);const t=e.getBoundingClientRect();if(this.direction==="horizontal"){const i=t.width,s=e.offsetLeft;this.selectionIndicatorStyle=`transform: translateX(${s}px) scaleX(${i});`}else{const i=t.height,s=e.offsetTop;this.selectionIndicatorStyle=`transform: translateY(${s}px) scaleY(${i});`}};this.tabChangePromise=Promise.resolve();this.tabChangeResolver=function(){};new v(this,{config:{root:null,rootMargin:"0px",threshold:[0,1]},callback:()=>{this.updateSelectionIndicator()}})}static get styles(){return[S]}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}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:r}=i,n=this.querySelector(`[role="tab"][value="${s}"]`);n&&(n.setAttribute("aria-controls",r),i.setAttribute("aria-labelledby",n.id)),i.selected=s===this.selected})}render(){return b`
1
+ "use strict";var u=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var a=(n,o,e,t)=>{for(var i=t>1?void 0:t?h(o,e):o,s=n.length-1,l;s>=0;s--)(l=n[s])&&(i=(t?l(o,e,i):l(i))||i);return t&&i&&u(o,e,i),i};import{css as p,html as b,SizedMixin as f}from"@spectrum-web-components/base";import{property as r,query as m}from"@spectrum-web-components/base/src/decorators.js";import{ifDefined as d}from"@spectrum-web-components/base/src/directives.js";import{IntersectionController as v}from"@lit-labs/observers/intersection_controller.js";import{Focusable as S}from"@spectrum-web-components/shared";import{RovingTabindexController as g}from"@spectrum-web-components/reactive-controllers/src/RovingTabindex.js";import y from"./tabs.css.js";export const ScaledIndicator={baseSize:100,noSelectionStyle:"transform: translateX(0px) scaleX(0) scaleY(0)",transformX(n,o){const e=o/this.baseSize;return`transform: translateX(${n}px) scaleX(${e});`},transformY(n,o){const e=o/this.baseSize;return`transform: translateY(${n}px) scaleY(${e});`},baseStyles(){return p`
2
+ :host([direction='vertical-right']) #selection-indicator,
3
+ :host([direction='vertical']) #selection-indicator {
4
+ height: ${this.baseSize}px;
5
+ }
6
+ :host([dir][direction='horizontal']) #selection-indicator {
7
+ width: ${this.baseSize}px;
8
+ }
9
+ `}};export class Tabs extends f(S){constructor(){super();this.auto=!1;this.compact=!1;this.direction="horizontal";this.emphasized=!1;this.label="";this.quiet=!1;this.selectionIndicatorStyle=ScaledIndicator.noSelectionStyle;this.shouldAnimate=!1;this._selected="";this._tabs=[];this.rovingTabindexController=new g(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.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 v(this,{config:{root:null,rootMargin:"0px",threshold:[0,1]},callback:()=>{this.updateSelectionIndicator()}})}static get styles(){return[y,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}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 b`
2
10
  <div
3
- aria-label=${c(this.label?this.label:void 0)}
11
+ aria-label=${d(this.label?this.label:void 0)}
4
12
  @click=${this.onClick}
5
13
  @keydown=${this.onKeyDown}
6
14
  @sp-tab-contentchange=${this.updateSelectionIndicator}
@@ -11,11 +19,11 @@
11
19
  <slot @slotchange=${this.onSlotChange}></slot>
12
20
  <div
13
21
  id="selection-indicator"
14
- class=${c(this.shouldAnimate?void 0:"first-position")}
22
+ class=${d(this.shouldAnimate?void 0:"first-position")}
15
23
  style=${this.selectionIndicatorStyle}
16
24
  role="presentation"
17
25
  ></div>
18
26
  </div>
19
27
  <slot name="tab-panel" @slotchange=${this.managePanels}></slot>
20
- `}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()}}a([o({type:Boolean})],Tabs.prototype,"auto",2),a([o({type:Boolean,reflect:!0})],Tabs.prototype,"compact",2),a([o({reflect:!0})],Tabs.prototype,"direction",2),a([o({type:Boolean,reflect:!0})],Tabs.prototype,"emphasized",2),a([o()],Tabs.prototype,"label",2),a([o({type:Boolean,reflect:!0})],Tabs.prototype,"quiet",2),a([o({attribute:!1})],Tabs.prototype,"selectionIndicatorStyle",2),a([o({attribute:!1})],Tabs.prototype,"shouldAnimate",2),a([m("#list")],Tabs.prototype,"tabList",2),a([o({reflect:!0})],Tabs.prototype,"selected",1);
28
+ `}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()}}a([r({type:Boolean})],Tabs.prototype,"auto",2),a([r({type:Boolean,reflect:!0})],Tabs.prototype,"compact",2),a([r({reflect:!0})],Tabs.prototype,"direction",2),a([r({type:Boolean,reflect:!0})],Tabs.prototype,"emphasized",2),a([r()],Tabs.prototype,"label",2),a([r({type:Boolean,reflect:!0})],Tabs.prototype,"quiet",2),a([r({attribute:!1})],Tabs.prototype,"selectionIndicatorStyle",2),a([r({attribute:!1})],Tabs.prototype,"shouldAnimate",2),a([m("#list")],Tabs.prototype,"tabList",2),a([r({reflect:!0})],Tabs.prototype,"selected",1);
21
29
  //# sourceMappingURL=Tabs.js.map
package/src/Tabs.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 { IntersectionController } from '@lit-labs/observers/intersection_controller.js';\nimport { Tab } from './Tab.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.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
- "names": ["html", "SizedMixin", "property", "query", "ifDefined", "IntersectionController", "Focusable", "RovingTabindexController", "tabStyles", "noSelectionStyle", "elements", "focusInIndex", "el", "index", "focusInElement", "event", "target", "element", "currentChecked", "firstTab", "selectedElement", "tabBoundingClientRect", "width", "offset", "height", "value", "oldValue", "tabs", "tabUpdateCompletes", "tab", "panel", "id", "changes", "selectedChild", "previous", "next", "selected", "res", "complete", "__decorateClass"]
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 { ifDefined } from '@spectrum-web-components/base/src/directives.js';\nimport { IntersectionController } from '@lit-labs/observers/intersection_controller.js';\nimport { Tab } from './Tab.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.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 /**\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 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 = 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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",
6
+ "names": ["css", "html", "SizedMixin", "property", "query", "ifDefined", "IntersectionController", "Focusable", "RovingTabindexController", "tabStyles", "left", "width", "scale", "top", "height", "elements", "focusInIndex", "el", "index", "focusInElement", "event", "target", "element", "currentChecked", "firstTab", "selectedElement", "value", "oldValue", "tabs", "tabUpdateCompletes", "tab", "panel", "id", "changes", "selectedChild", "previous", "next", "selected", "res", "complete", "__decorateClass"]
7
7
  }
@@ -365,9 +365,9 @@ const styles = css`
365
365
  --spectrum-tabs-m-text-color-disabled,var(--spectrum-alias-text-color-disabled)
366
366
  )}:host([disabled]) ::slotted(sp-tab){color:var(
367
367
  --spectrum-tabs-m-text-color-disabled,var(--spectrum-alias-text-color-disabled)
368
- )}#list{justify-content:var(--swc-tabs-list-justify-content)}:host(:not([direction^=vertical])) #list{padding-bottom:var(--spectrum-tabs-quiet-textonly-divider-size)}:host([dir=ltr][direction=vertical]) #list,:host([dir=rtl][direction=vertical-right]) #list{--spectrum-tabs-list-background-direction:right;padding-left:var(--spectrum-tabs-quiet-textonly-divider-size)}:host([dir=ltr][direction=vertical-right]) #list,:host([dir=rtl][direction=vertical]) #list{--spectrum-tabs-list-background-direction:left;padding-right:var(--spectrum-tabs-quiet-textonly-divider-size)}:host([disabled]) #list{pointer-events:none}:host([direction=vertical-right]) #selection-indicator,:host([direction=vertical]) #selection-indicator{height:1px;top:0}:host([compact]){--spectrum-tabs-height:var(--spectrum-tabs-quiet-compact-height)}@media (forced-colors:none){:host([compact]:not([quiet])) #list{--spectrum-tabs-textonly-divider-background-color:unset!important}}:host([direction=horizontal]:not([quiet])) #list{border-bottom-color:var(
368
+ )}#list{justify-content:var(--swc-tabs-list-justify-content)}:host(:not([direction^=vertical])) #list{padding-bottom:var(--spectrum-tabs-quiet-textonly-divider-size)}:host([dir=ltr][direction=vertical]) #list,:host([dir=rtl][direction=vertical-right]) #list{--spectrum-tabs-list-background-direction:right;padding-left:var(--spectrum-tabs-quiet-textonly-divider-size)}:host([dir=ltr][direction=vertical-right]) #list,:host([dir=rtl][direction=vertical]) #list{--spectrum-tabs-list-background-direction:left;padding-right:var(--spectrum-tabs-quiet-textonly-divider-size)}:host([disabled]) #list{pointer-events:none}:host([direction=vertical-right]) #selection-indicator,:host([direction=vertical]) #selection-indicator{top:0}:host([compact]){--spectrum-tabs-height:var(--spectrum-tabs-quiet-compact-height)}@media (forced-colors:none){:host([compact]:not([quiet])) #list{--spectrum-tabs-textonly-divider-background-color:unset!important}}:host([direction=horizontal]:not([quiet])) #list{border-bottom-color:var(
369
369
  --spectrum-tabs-rule-color,var(--spectrum-global-color-gray-200)
370
- )}:host([dir][direction=horizontal]) #selection-indicator{width:1px}:host([dir=rtl][direction=vertical-right]) #selection-indicator{left:0;right:auto}#selection-indicator.first-position{transition:none}:host([dir=ltr][direction=vertical-right]) ::slotted(:not([slot])){margin-left:0;margin-right:calc(var(--spectrum-tabs-vertical-textonly-tabitem-gap)/2)}:host([dir=rtl][direction=vertical-right]) ::slotted(:not([slot])){margin-left:calc(var(--spectrum-tabs-vertical-textonly-tabitem-gap)/2);margin-right:0}
370
+ )}:host([dir=rtl][direction=vertical-right]) #selection-indicator{left:0;right:auto}#selection-indicator.first-position{transition:none}:host([dir=ltr][direction=vertical-right]) ::slotted(:not([slot])){margin-left:0;margin-right:calc(var(--spectrum-tabs-vertical-textonly-tabitem-gap)/2)}:host([dir=rtl][direction=vertical-right]) ::slotted(:not([slot])){margin-left:calc(var(--spectrum-tabs-vertical-textonly-tabitem-gap)/2);margin-right:0}
371
371
  `;
372
372
  export default styles;
373
373
  //# sourceMappingURL=tabs.css.dev.js.map