@spectrum-web-components/tabs 0.10.7-react.50 → 0.11.0
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/custom-elements.json +187 -10
- package/package.json +17 -6
- package/sp-tabs-overflow.d.ts +6 -0
- package/sp-tabs-overflow.dev.js +4 -0
- package/sp-tabs-overflow.dev.js.map +7 -0
- package/sp-tabs-overflow.js +2 -0
- package/sp-tabs-overflow.js.map +7 -0
- package/src/Tabs.d.ts +4 -0
- package/src/Tabs.dev.js +35 -1
- package/src/Tabs.dev.js.map +2 -2
- package/src/Tabs.js +5 -3
- package/src/Tabs.js.map +3 -3
- package/src/TabsOverflow.d.ts +25 -0
- package/src/TabsOverflow.dev.js +133 -0
- package/src/TabsOverflow.dev.js.map +7 -0
- package/src/TabsOverflow.js +32 -0
- package/src/TabsOverflow.js.map +7 -0
- package/src/index.d.ts +1 -0
- package/src/index.dev.js +1 -0
- package/src/index.dev.js.map +2 -2
- package/src/index.js +1 -1
- package/src/index.js.map +2 -2
- package/src/tabs-overflow.css.d.ts +2 -0
- package/src/tabs-overflow.css.dev.js +9 -0
- package/src/tabs-overflow.css.dev.js.map +7 -0
- package/src/tabs-overflow.css.js +6 -0
- package/src/tabs-overflow.css.js.map +7 -0
- package/src/tabs.css.dev.js +1 -1
- package/src/tabs.css.dev.js.map +1 -1
- package/src/tabs.css.js +1 -1
- package/src/tabs.css.js.map +1 -1
- package/stories/index.js +47 -0
- package/stories/index.js.map +7 -0
- package/stories/tabs-overflow-panel.stories.js +19 -0
- package/stories/tabs-overflow-panel.stories.js.map +7 -0
- package/stories/tabs-overflow.stories.js +19 -0
- package/stories/tabs-overflow.stories.js.map +7 -0
- package/test/tabs-overflow-panel.test-vrt.js +5 -0
- package/test/tabs-overflow-panel.test-vrt.js.map +7 -0
- package/test/tabs-overflow.test-vrt.js +5 -0
- package/test/tabs-overflow.test-vrt.js.map +7 -0
- package/test/tabs-overflow.test.js +124 -0
- package/test/tabs-overflow.test.js.map +7 -0
package/custom-elements.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"modules": [
|
|
5
5
|
{
|
|
6
6
|
"kind": "javascript-module",
|
|
7
|
-
"path": "sp-tab-panel.
|
|
7
|
+
"path": "sp-tab-panel.js",
|
|
8
8
|
"declarations": [],
|
|
9
9
|
"exports": [
|
|
10
10
|
{
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
},
|
|
20
20
|
{
|
|
21
21
|
"kind": "javascript-module",
|
|
22
|
-
"path": "sp-tab.
|
|
22
|
+
"path": "sp-tab.js",
|
|
23
23
|
"declarations": [],
|
|
24
24
|
"exports": [
|
|
25
25
|
{
|
|
@@ -34,7 +34,22 @@
|
|
|
34
34
|
},
|
|
35
35
|
{
|
|
36
36
|
"kind": "javascript-module",
|
|
37
|
-
"path": "sp-tabs.
|
|
37
|
+
"path": "sp-tabs-overflow.js",
|
|
38
|
+
"declarations": [],
|
|
39
|
+
"exports": [
|
|
40
|
+
{
|
|
41
|
+
"kind": "custom-element-definition",
|
|
42
|
+
"name": "sp-tabs-overflow",
|
|
43
|
+
"declaration": {
|
|
44
|
+
"name": "TabsOverflow",
|
|
45
|
+
"module": "/src/TabsOverflow.js"
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
]
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"kind": "javascript-module",
|
|
52
|
+
"path": "sp-tabs.js",
|
|
38
53
|
"declarations": [],
|
|
39
54
|
"exports": [
|
|
40
55
|
{
|
|
@@ -49,7 +64,7 @@
|
|
|
49
64
|
},
|
|
50
65
|
{
|
|
51
66
|
"kind": "javascript-module",
|
|
52
|
-
"path": "src/Tab.
|
|
67
|
+
"path": "src/Tab.js",
|
|
53
68
|
"declarations": [
|
|
54
69
|
{
|
|
55
70
|
"kind": "class",
|
|
@@ -237,14 +252,14 @@
|
|
|
237
252
|
"name": "Tab",
|
|
238
253
|
"declaration": {
|
|
239
254
|
"name": "Tab",
|
|
240
|
-
"module": "src/Tab.
|
|
255
|
+
"module": "src/Tab.js"
|
|
241
256
|
}
|
|
242
257
|
}
|
|
243
258
|
]
|
|
244
259
|
},
|
|
245
260
|
{
|
|
246
261
|
"kind": "javascript-module",
|
|
247
|
-
"path": "src/TabPanel.
|
|
262
|
+
"path": "src/TabPanel.js",
|
|
248
263
|
"declarations": [
|
|
249
264
|
{
|
|
250
265
|
"kind": "class",
|
|
@@ -322,14 +337,14 @@
|
|
|
322
337
|
"name": "TabPanel",
|
|
323
338
|
"declaration": {
|
|
324
339
|
"name": "TabPanel",
|
|
325
|
-
"module": "src/TabPanel.
|
|
340
|
+
"module": "src/TabPanel.js"
|
|
326
341
|
}
|
|
327
342
|
}
|
|
328
343
|
]
|
|
329
344
|
},
|
|
330
345
|
{
|
|
331
346
|
"kind": "javascript-module",
|
|
332
|
-
"path": "src/Tabs.
|
|
347
|
+
"path": "src/Tabs.js",
|
|
333
348
|
"declarations": [
|
|
334
349
|
{
|
|
335
350
|
"kind": "variable",
|
|
@@ -415,6 +430,16 @@
|
|
|
415
430
|
"default": "''",
|
|
416
431
|
"attribute": "label"
|
|
417
432
|
},
|
|
433
|
+
{
|
|
434
|
+
"kind": "field",
|
|
435
|
+
"name": "enableTabsScroll",
|
|
436
|
+
"type": {
|
|
437
|
+
"text": "boolean"
|
|
438
|
+
},
|
|
439
|
+
"privacy": "public",
|
|
440
|
+
"default": "false",
|
|
441
|
+
"attribute": "enableTabsScroll"
|
|
442
|
+
},
|
|
418
443
|
{
|
|
419
444
|
"kind": "field",
|
|
420
445
|
"name": "quiet",
|
|
@@ -498,6 +523,39 @@
|
|
|
498
523
|
},
|
|
499
524
|
"privacy": "private"
|
|
500
525
|
},
|
|
526
|
+
{
|
|
527
|
+
"kind": "method",
|
|
528
|
+
"name": "scrollTabs",
|
|
529
|
+
"privacy": "public",
|
|
530
|
+
"return": {
|
|
531
|
+
"type": {
|
|
532
|
+
"text": "void"
|
|
533
|
+
}
|
|
534
|
+
},
|
|
535
|
+
"parameters": [
|
|
536
|
+
{
|
|
537
|
+
"name": "delta",
|
|
538
|
+
"type": {
|
|
539
|
+
"text": "number"
|
|
540
|
+
}
|
|
541
|
+
},
|
|
542
|
+
{
|
|
543
|
+
"name": "behavior",
|
|
544
|
+
"default": "'smooth'",
|
|
545
|
+
"type": {
|
|
546
|
+
"text": "ScrollBehavior"
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
]
|
|
550
|
+
},
|
|
551
|
+
{
|
|
552
|
+
"kind": "field",
|
|
553
|
+
"name": "scrollState",
|
|
554
|
+
"type": {
|
|
555
|
+
"text": "Record<string, boolean>"
|
|
556
|
+
},
|
|
557
|
+
"privacy": "public"
|
|
558
|
+
},
|
|
501
559
|
{
|
|
502
560
|
"kind": "method",
|
|
503
561
|
"name": "manageAutoFocus",
|
|
@@ -526,6 +584,11 @@
|
|
|
526
584
|
}
|
|
527
585
|
]
|
|
528
586
|
},
|
|
587
|
+
{
|
|
588
|
+
"kind": "field",
|
|
589
|
+
"name": "onTabsScroll",
|
|
590
|
+
"privacy": "private"
|
|
591
|
+
},
|
|
529
592
|
{
|
|
530
593
|
"kind": "field",
|
|
531
594
|
"name": "onClick",
|
|
@@ -661,6 +724,14 @@
|
|
|
661
724
|
"default": "''",
|
|
662
725
|
"fieldName": "label"
|
|
663
726
|
},
|
|
727
|
+
{
|
|
728
|
+
"name": "enableTabsScroll",
|
|
729
|
+
"type": {
|
|
730
|
+
"text": "boolean"
|
|
731
|
+
},
|
|
732
|
+
"default": "false",
|
|
733
|
+
"fieldName": "enableTabsScroll"
|
|
734
|
+
},
|
|
664
735
|
{
|
|
665
736
|
"name": "quiet",
|
|
666
737
|
"type": {
|
|
@@ -698,7 +769,7 @@
|
|
|
698
769
|
"name": "ScaledIndicator",
|
|
699
770
|
"declaration": {
|
|
700
771
|
"name": "ScaledIndicator",
|
|
701
|
-
"module": "src/Tabs.
|
|
772
|
+
"module": "src/Tabs.js"
|
|
702
773
|
}
|
|
703
774
|
},
|
|
704
775
|
{
|
|
@@ -706,7 +777,113 @@
|
|
|
706
777
|
"name": "Tabs",
|
|
707
778
|
"declaration": {
|
|
708
779
|
"name": "Tabs",
|
|
709
|
-
"module": "src/Tabs.
|
|
780
|
+
"module": "src/Tabs.js"
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
]
|
|
784
|
+
},
|
|
785
|
+
{
|
|
786
|
+
"kind": "javascript-module",
|
|
787
|
+
"path": "src/TabsOverflow.js",
|
|
788
|
+
"declarations": [
|
|
789
|
+
{
|
|
790
|
+
"kind": "class",
|
|
791
|
+
"description": "",
|
|
792
|
+
"name": "TabsOverflow",
|
|
793
|
+
"members": [
|
|
794
|
+
{
|
|
795
|
+
"kind": "field",
|
|
796
|
+
"name": "overflowState",
|
|
797
|
+
"type": {
|
|
798
|
+
"text": "TabsOverflowState"
|
|
799
|
+
},
|
|
800
|
+
"privacy": "private",
|
|
801
|
+
"default": "{\n canScrollLeft: false,\n canScrollRight: false,\n }"
|
|
802
|
+
},
|
|
803
|
+
{
|
|
804
|
+
"kind": "field",
|
|
805
|
+
"name": "scrollContent",
|
|
806
|
+
"type": {
|
|
807
|
+
"text": "Tabs[]"
|
|
808
|
+
},
|
|
809
|
+
"privacy": "private"
|
|
810
|
+
},
|
|
811
|
+
{
|
|
812
|
+
"kind": "field",
|
|
813
|
+
"name": "overflowContainer",
|
|
814
|
+
"type": {
|
|
815
|
+
"text": "HTMLDivElement"
|
|
816
|
+
},
|
|
817
|
+
"privacy": "private"
|
|
818
|
+
},
|
|
819
|
+
{
|
|
820
|
+
"kind": "field",
|
|
821
|
+
"name": "resizeController",
|
|
822
|
+
"type": {
|
|
823
|
+
"text": "ResizeController"
|
|
824
|
+
},
|
|
825
|
+
"default": "new ResizeController(this, {\n target: this,\n callback: (): void => {\n this._updateScrollState();\n },\n })"
|
|
826
|
+
},
|
|
827
|
+
{
|
|
828
|
+
"kind": "method",
|
|
829
|
+
"name": "_handleSlotChange",
|
|
830
|
+
"privacy": "private",
|
|
831
|
+
"return": {
|
|
832
|
+
"type": {
|
|
833
|
+
"text": "Promise<void>"
|
|
834
|
+
}
|
|
835
|
+
}
|
|
836
|
+
},
|
|
837
|
+
{
|
|
838
|
+
"kind": "method",
|
|
839
|
+
"name": "_updateScrollState",
|
|
840
|
+
"privacy": "private",
|
|
841
|
+
"return": {
|
|
842
|
+
"type": {
|
|
843
|
+
"text": "void"
|
|
844
|
+
}
|
|
845
|
+
}
|
|
846
|
+
},
|
|
847
|
+
{
|
|
848
|
+
"kind": "method",
|
|
849
|
+
"name": "_handleScrollClick",
|
|
850
|
+
"privacy": "private",
|
|
851
|
+
"return": {
|
|
852
|
+
"type": {
|
|
853
|
+
"text": "void"
|
|
854
|
+
}
|
|
855
|
+
},
|
|
856
|
+
"parameters": [
|
|
857
|
+
{
|
|
858
|
+
"name": "event",
|
|
859
|
+
"type": {
|
|
860
|
+
"text": "MouseEvent"
|
|
861
|
+
}
|
|
862
|
+
}
|
|
863
|
+
]
|
|
864
|
+
}
|
|
865
|
+
],
|
|
866
|
+
"mixins": [
|
|
867
|
+
{
|
|
868
|
+
"name": "SizedMixin",
|
|
869
|
+
"package": "@spectrum-web-components/base"
|
|
870
|
+
}
|
|
871
|
+
],
|
|
872
|
+
"superclass": {
|
|
873
|
+
"name": "SpectrumElement",
|
|
874
|
+
"package": "@spectrum-web-components/base"
|
|
875
|
+
},
|
|
876
|
+
"tagName": "sp-tabs-overflow",
|
|
877
|
+
"customElement": true
|
|
878
|
+
}
|
|
879
|
+
],
|
|
880
|
+
"exports": [
|
|
881
|
+
{
|
|
882
|
+
"kind": "js",
|
|
883
|
+
"name": "TabsOverflow",
|
|
884
|
+
"declaration": {
|
|
885
|
+
"name": "TabsOverflow",
|
|
886
|
+
"module": "src/TabsOverflow.js"
|
|
710
887
|
}
|
|
711
888
|
}
|
|
712
889
|
]
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spectrum-web-components/tabs",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -37,12 +37,17 @@
|
|
|
37
37
|
"development": "./src/Tabs.dev.js",
|
|
38
38
|
"default": "./src/Tabs.js"
|
|
39
39
|
},
|
|
40
|
+
"./src/TabsOverflow.js": {
|
|
41
|
+
"development": "./src/TabsOverflow.dev.js",
|
|
42
|
+
"default": "./src/TabsOverflow.js"
|
|
43
|
+
},
|
|
40
44
|
"./src/index.js": {
|
|
41
45
|
"development": "./src/index.dev.js",
|
|
42
46
|
"default": "./src/index.js"
|
|
43
47
|
},
|
|
44
48
|
"./src/tab-panel.css.js": "./src/tab-panel.css.js",
|
|
45
49
|
"./src/tab.css.js": "./src/tab.css.js",
|
|
50
|
+
"./src/tabs-overflow.css.js": "./src/tabs-overflow.css.js",
|
|
46
51
|
"./src/tabs.css.js": "./src/tabs.css.js",
|
|
47
52
|
"./sp-tabs.js": {
|
|
48
53
|
"development": "./sp-tabs.dev.js",
|
|
@@ -55,6 +60,10 @@
|
|
|
55
60
|
"./sp-tab-panel.js": {
|
|
56
61
|
"development": "./sp-tab-panel.dev.js",
|
|
57
62
|
"default": "./sp-tab-panel.js"
|
|
63
|
+
},
|
|
64
|
+
"./sp-tabs-overflow.js": {
|
|
65
|
+
"development": "./sp-tabs-overflow.dev.js",
|
|
66
|
+
"default": "./sp-tabs-overflow.js"
|
|
58
67
|
}
|
|
59
68
|
},
|
|
60
69
|
"scripts": {
|
|
@@ -76,12 +85,14 @@
|
|
|
76
85
|
],
|
|
77
86
|
"dependencies": {
|
|
78
87
|
"@lit-labs/observers": "^1.0.1",
|
|
79
|
-
"@spectrum-web-components/base": "^0.7.
|
|
80
|
-
"@spectrum-web-components/
|
|
81
|
-
"@spectrum-web-components/
|
|
88
|
+
"@spectrum-web-components/base": "^0.7.4",
|
|
89
|
+
"@spectrum-web-components/icon": "^0.12.5",
|
|
90
|
+
"@spectrum-web-components/icons-ui": "^0.9.5",
|
|
91
|
+
"@spectrum-web-components/reactive-controllers": "^0.3.5",
|
|
92
|
+
"@spectrum-web-components/shared": "^0.15.5"
|
|
82
93
|
},
|
|
83
94
|
"devDependencies": {
|
|
84
|
-
"@spectrum-css/tabs": "^3.2.
|
|
95
|
+
"@spectrum-css/tabs": "^3.2.27"
|
|
85
96
|
},
|
|
86
97
|
"types": "./src/index.d.ts",
|
|
87
98
|
"customElements": "custom-elements.json",
|
|
@@ -89,5 +100,5 @@
|
|
|
89
100
|
"./sp-*.js",
|
|
90
101
|
"./**/*.dev.js"
|
|
91
102
|
],
|
|
92
|
-
"gitHead": "
|
|
103
|
+
"gitHead": "19b71bd41bc476cdae09afe3f2e48ba8b9b5dcdd"
|
|
93
104
|
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["sp-tabs-overflow.ts"],
|
|
4
|
+
"sourcesContent": ["/*\nCopyright 2022 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*/\nimport { TabsOverflow } from './src/TabsOverflow.dev.js'\n\ncustomElements.define('sp-tabs-overflow', TabsOverflow);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'sp-tabs-overflow': TabsOverflow;\n }\n}\n"],
|
|
5
|
+
"mappings": ";AAWA,SAAS,oBAAoB;AAE7B,eAAe,OAAO,oBAAoB,YAAY;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["sp-tabs-overflow.ts"],
|
|
4
|
+
"sourcesContent": ["/*\nCopyright 2022 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*/\nimport { TabsOverflow } from './src/TabsOverflow.js';\n\ncustomElements.define('sp-tabs-overflow', TabsOverflow);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'sp-tabs-overflow': TabsOverflow;\n }\n}\n"],
|
|
5
|
+
"mappings": "aAWA,OAAS,gBAAAA,MAAoB,wBAE7B,eAAe,OAAO,mBAAoBA,CAAY",
|
|
6
|
+
"names": ["TabsOverflow"]
|
|
7
|
+
}
|
package/src/Tabs.d.ts
CHANGED
|
@@ -40,6 +40,7 @@ export declare class Tabs extends Tabs_base {
|
|
|
40
40
|
direction: 'vertical' | 'vertical-right' | 'horizontal';
|
|
41
41
|
emphasized: boolean;
|
|
42
42
|
label: string;
|
|
43
|
+
enableTabsScroll: boolean;
|
|
43
44
|
/**
|
|
44
45
|
* The tab list is displayed without a border.
|
|
45
46
|
*/
|
|
@@ -59,12 +60,15 @@ export declare class Tabs extends Tabs_base {
|
|
|
59
60
|
* @private
|
|
60
61
|
*/
|
|
61
62
|
get focusElement(): Tab | this;
|
|
63
|
+
scrollTabs(delta: number, behavior?: ScrollBehavior): void;
|
|
64
|
+
get scrollState(): Record<string, boolean>;
|
|
62
65
|
protected manageAutoFocus(): void;
|
|
63
66
|
protected managePanels({ target, }: Event & {
|
|
64
67
|
target: HTMLSlotElement;
|
|
65
68
|
}): void;
|
|
66
69
|
protected render(): TemplateResult;
|
|
67
70
|
protected willUpdate(changes: PropertyValues): void;
|
|
71
|
+
private onTabsScroll;
|
|
68
72
|
private onClick;
|
|
69
73
|
private onKeyDown;
|
|
70
74
|
private selectTarget;
|
package/src/Tabs.dev.js
CHANGED
|
@@ -19,7 +19,10 @@ import {
|
|
|
19
19
|
property,
|
|
20
20
|
query
|
|
21
21
|
} from "@spectrum-web-components/base/src/decorators.js";
|
|
22
|
-
import {
|
|
22
|
+
import {
|
|
23
|
+
classMap,
|
|
24
|
+
ifDefined
|
|
25
|
+
} from "@spectrum-web-components/base/src/directives.js";
|
|
23
26
|
import { IntersectionController } from "@lit-labs/observers/intersection_controller.js";
|
|
24
27
|
import { Focusable } from "@spectrum-web-components/shared";
|
|
25
28
|
import { RovingTabindexController } from "@spectrum-web-components/reactive-controllers/src/RovingTabindex.js";
|
|
@@ -55,6 +58,7 @@ export class Tabs extends SizedMixin(Focusable) {
|
|
|
55
58
|
this.direction = "horizontal";
|
|
56
59
|
this.emphasized = false;
|
|
57
60
|
this.label = "";
|
|
61
|
+
this.enableTabsScroll = false;
|
|
58
62
|
this.quiet = false;
|
|
59
63
|
this.selectionIndicatorStyle = ScaledIndicator.noSelectionStyle;
|
|
60
64
|
this.shouldAnimate = false;
|
|
@@ -81,6 +85,14 @@ export class Tabs extends SizedMixin(Focusable) {
|
|
|
81
85
|
isFocusableElement: (el) => !el.disabled,
|
|
82
86
|
listenerScope: () => this.tabList
|
|
83
87
|
});
|
|
88
|
+
this.onTabsScroll = () => {
|
|
89
|
+
this.dispatchEvent(
|
|
90
|
+
new Event("sp-tabs-scroll", {
|
|
91
|
+
bubbles: true,
|
|
92
|
+
composed: true
|
|
93
|
+
})
|
|
94
|
+
);
|
|
95
|
+
};
|
|
84
96
|
this.onClick = (event) => {
|
|
85
97
|
if (this.disabled) {
|
|
86
98
|
return;
|
|
@@ -184,6 +196,23 @@ export class Tabs extends SizedMixin(Focusable) {
|
|
|
184
196
|
get focusElement() {
|
|
185
197
|
return this.rovingTabindexController.focusInElement || this;
|
|
186
198
|
}
|
|
199
|
+
scrollTabs(delta, behavior = "smooth") {
|
|
200
|
+
var _a;
|
|
201
|
+
(_a = this.tabList) == null ? void 0 : _a.scrollBy({
|
|
202
|
+
left: delta,
|
|
203
|
+
top: 0,
|
|
204
|
+
behavior
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
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
|
+
};
|
|
215
|
+
}
|
|
187
216
|
manageAutoFocus() {
|
|
188
217
|
const tabs = [...this.children];
|
|
189
218
|
const tabUpdateCompletes = tabs.map((tab) => {
|
|
@@ -211,10 +240,12 @@ export class Tabs extends SizedMixin(Focusable) {
|
|
|
211
240
|
render() {
|
|
212
241
|
return html`
|
|
213
242
|
<div
|
|
243
|
+
class=${classMap({ scroll: this.enableTabsScroll })}
|
|
214
244
|
aria-label=${ifDefined(this.label ? this.label : void 0)}
|
|
215
245
|
@click=${this.onClick}
|
|
216
246
|
@keydown=${this.onKeyDown}
|
|
217
247
|
@sp-tab-contentchange=${this.updateSelectionIndicator}
|
|
248
|
+
@scroll=${this.onTabsScroll}
|
|
218
249
|
id="list"
|
|
219
250
|
role="tablist"
|
|
220
251
|
part="tablist"
|
|
@@ -344,6 +375,9 @@ __decorateClass([
|
|
|
344
375
|
__decorateClass([
|
|
345
376
|
property()
|
|
346
377
|
], Tabs.prototype, "label", 2);
|
|
378
|
+
__decorateClass([
|
|
379
|
+
property({ type: Boolean })
|
|
380
|
+
], Tabs.prototype, "enableTabsScroll", 2);
|
|
347
381
|
__decorateClass([
|
|
348
382
|
property({ type: Boolean, reflect: true })
|
|
349
383
|
], Tabs.prototype, "quiet", 2);
|
package/src/Tabs.dev.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["Tabs.ts"],
|
|
4
|
-
"sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport {\n 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": ";;;;;;;;;;;;AAYA;AAAA,EACI;AAAA,EAGA;AAAA,EAEA;AAAA,OAEG;AACP;AAAA,EACI;AAAA,EACA;AAAA,OACG;AACP,
|
|
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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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|