@redvars/peacock 3.3.2 → 3.4.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.
Files changed (160) hide show
  1. package/dist/IndividualComponent-DUINtMGK.js +67 -0
  2. package/dist/IndividualComponent-DUINtMGK.js.map +1 -0
  3. package/dist/assets/images/empty-state/no-document.svg +11 -12
  4. package/dist/assets/images/empty-state/page.svg +15 -9
  5. package/dist/bottom-sheet.js +238 -0
  6. package/dist/bottom-sheet.js.map +1 -0
  7. package/dist/{button-ClzS8JLq.js → button-COYCtuA8.js} +306 -149
  8. package/dist/button-COYCtuA8.js.map +1 -0
  9. package/dist/button-group-DsXquZQn.js +440 -0
  10. package/dist/button-group-DsXquZQn.js.map +1 -0
  11. package/dist/button-group.js +6 -4
  12. package/dist/button-group.js.map +1 -1
  13. package/dist/button.js +5 -3
  14. package/dist/button.js.map +1 -1
  15. package/dist/card-content.js +29 -0
  16. package/dist/card-content.js.map +1 -0
  17. package/dist/card.js +418 -44
  18. package/dist/card.js.map +1 -1
  19. package/dist/{chart-bar-DbnXQgvS.js → chart-bar-cn6rrna-.js} +2 -2
  20. package/dist/{chart-bar-DbnXQgvS.js.map → chart-bar-cn6rrna-.js.map} +1 -1
  21. package/dist/chart-bar.js +4 -3
  22. package/dist/chart-bar.js.map +1 -1
  23. package/dist/chart-doughnut.js +2 -1
  24. package/dist/chart-doughnut.js.map +1 -1
  25. package/dist/chart-pie.js +2 -1
  26. package/dist/chart-pie.js.map +1 -1
  27. package/dist/chart-stacked-bar.js +4 -3
  28. package/dist/chart-stacked-bar.js.map +1 -1
  29. package/dist/{class-map-59YGWLnx.js → class-map-3TAnCMAX.js} +3 -9
  30. package/dist/class-map-3TAnCMAX.js.map +1 -0
  31. package/dist/clock.js +2 -1
  32. package/dist/clock.js.map +1 -1
  33. package/dist/code-editor.js +6 -4
  34. package/dist/code-editor.js.map +1 -1
  35. package/dist/code-highlighter.js +5 -3
  36. package/dist/code-highlighter.js.map +1 -1
  37. package/dist/custom-elements-jsdocs.json +2458 -2753
  38. package/dist/custom-elements.json +3185 -777
  39. package/dist/dispatch-event-utils-B4odODQf.js.map +1 -1
  40. package/dist/index.js +14 -10
  41. package/dist/index.js.map +1 -1
  42. package/dist/number-counter.js +3 -2
  43. package/dist/number-counter.js.map +1 -1
  44. package/dist/{observe-theme-change-pALI5fmV.js → observe-theme-change-DKAIv5BB.js} +3 -2
  45. package/dist/observe-theme-change-DKAIv5BB.js.map +1 -0
  46. package/dist/peacock-loader.js +37 -8
  47. package/dist/peacock-loader.js.map +1 -1
  48. package/dist/property-1psGvXOq.js +10 -0
  49. package/dist/property-1psGvXOq.js.map +1 -0
  50. package/dist/{snackbar-74YCdMPL.js → select-C3XAzenC.js} +2158 -191
  51. package/dist/select-C3XAzenC.js.map +1 -0
  52. package/dist/side-sheet.js +186 -0
  53. package/dist/side-sheet.js.map +1 -0
  54. package/dist/src/bottom-sheet/bottom-sheet.d.ts +42 -0
  55. package/dist/src/bottom-sheet/index.d.ts +1 -0
  56. package/dist/src/button/BaseButton.d.ts +4 -3
  57. package/dist/src/button/button/button.d.ts +4 -0
  58. package/dist/src/button/button-group/button-group.d.ts +32 -3
  59. package/dist/src/button/icon-button/icon-button.d.ts +4 -0
  60. package/dist/src/card/card-content.d.ts +15 -0
  61. package/dist/src/card/card.d.ts +37 -3
  62. package/dist/src/card/index.d.ts +1 -0
  63. package/dist/src/container/container.d.ts +1 -1
  64. package/dist/src/empty-state/empty-state.d.ts +1 -1
  65. package/dist/src/focus-ring/focus-ring.d.ts +4 -1
  66. package/dist/src/index.d.ts +7 -1
  67. package/dist/src/menu/menu/menu.d.ts +1 -0
  68. package/dist/src/menu/menu-item/menu-item.d.ts +0 -1
  69. package/dist/src/radio/index.d.ts +1 -0
  70. package/dist/src/radio/radio.d.ts +73 -0
  71. package/dist/src/ripple/ripple.d.ts +19 -3
  72. package/dist/src/segmented-button/index.d.ts +2 -0
  73. package/dist/src/segmented-button/segmented-button-group.d.ts +46 -0
  74. package/dist/src/segmented-button/segmented-button.d.ts +65 -0
  75. package/dist/src/select/index.d.ts +3 -0
  76. package/dist/src/select/option.d.ts +55 -0
  77. package/dist/src/select/select.d.ts +116 -0
  78. package/dist/src/side-sheet/index.d.ts +1 -0
  79. package/dist/src/side-sheet/side-sheet.d.ts +41 -0
  80. package/dist/src/tabs/tab-group.d.ts +0 -1
  81. package/dist/src/tabs/tab.d.ts +8 -2
  82. package/dist/src/tabs/tabs.d.ts +13 -1
  83. package/dist/state-DwbEjqVk.js +10 -0
  84. package/dist/state-DwbEjqVk.js.map +1 -0
  85. package/dist/{style-map-DcB52w-l.js → style-map-CRFEoCEg.js} +2 -2
  86. package/dist/{style-map-DcB52w-l.js.map → style-map-CRFEoCEg.js.map} +1 -1
  87. package/dist/tsconfig.tsbuildinfo +1 -1
  88. package/dist/{unsafe-html-C2r3PyzF.js → unsafe-html-D3GHRaGQ.js} +2 -2
  89. package/dist/{unsafe-html-C2r3PyzF.js.map → unsafe-html-D3GHRaGQ.js.map} +1 -1
  90. package/package.json +1 -1
  91. package/readme.md +2 -2
  92. package/src/bottom-sheet/bottom-sheet.scss +88 -0
  93. package/src/bottom-sheet/bottom-sheet.ts +135 -0
  94. package/src/bottom-sheet/index.ts +1 -0
  95. package/src/button/BaseButton.ts +16 -7
  96. package/src/button/button/button-colors.scss +76 -5
  97. package/src/button/button/button-sizes.scss +39 -19
  98. package/src/button/button/button.scss +117 -116
  99. package/src/button/button/button.ts +23 -1
  100. package/src/button/button-group/button-group.scss +25 -22
  101. package/src/button/button-group/button-group.ts +121 -4
  102. package/src/button/icon-button/icon-button-sizes.scss +35 -15
  103. package/src/button/icon-button/icon-button.ts +21 -1
  104. package/src/card/card-colors.scss +10 -0
  105. package/src/card/card-content.ts +26 -0
  106. package/src/card/card.scss +221 -41
  107. package/src/card/card.ts +240 -7
  108. package/src/card/index.ts +1 -0
  109. package/src/code-editor/code-editor.ts +1 -1
  110. package/src/container/container.ts +1 -1
  111. package/src/empty-state/empty-state.scss +8 -0
  112. package/src/empty-state/empty-state.ts +2 -2
  113. package/src/focus-ring/focus-ring.ts +37 -19
  114. package/src/index.ts +8 -1
  115. package/src/menu/menu/menu.scss +24 -3
  116. package/src/menu/menu/menu.ts +23 -2
  117. package/src/menu/menu-item/menu-item.scss +1 -0
  118. package/src/menu/menu-item/menu-item.ts +1 -9
  119. package/src/peacock-loader.ts +32 -0
  120. package/src/radio/index.ts +1 -0
  121. package/src/radio/radio.scss +181 -0
  122. package/src/radio/radio.ts +362 -0
  123. package/src/ripple/ripple.ts +19 -3
  124. package/src/segmented-button/index.ts +2 -0
  125. package/src/segmented-button/segmented-button-group.scss +21 -0
  126. package/src/segmented-button/segmented-button-group.ts +110 -0
  127. package/src/segmented-button/segmented-button.scss +115 -0
  128. package/src/segmented-button/segmented-button.ts +175 -0
  129. package/src/select/index.ts +3 -0
  130. package/src/select/option.ts +109 -0
  131. package/src/select/select.scss +120 -0
  132. package/src/select/select.ts +486 -0
  133. package/src/side-sheet/index.ts +1 -0
  134. package/src/side-sheet/side-sheet.scss +79 -0
  135. package/src/side-sheet/side-sheet.ts +100 -0
  136. package/src/slider/slider.scss +0 -1
  137. package/src/tabs/demo/index.html +90 -0
  138. package/src/tabs/tab-group.ts +0 -3
  139. package/src/tabs/tab.scss +237 -25
  140. package/src/tabs/tab.ts +86 -12
  141. package/src/tabs/tabs.scss +37 -3
  142. package/src/tabs/tabs.ts +118 -2
  143. package/src/utils/dispatch-event-utils.ts +1 -0
  144. package/dist/IndividualComponent-Dt5xirYG.js +0 -73
  145. package/dist/IndividualComponent-Dt5xirYG.js.map +0 -1
  146. package/dist/button-ClzS8JLq.js.map +0 -1
  147. package/dist/button-group-BMS5WvaF.js +0 -292
  148. package/dist/button-group-BMS5WvaF.js.map +0 -1
  149. package/dist/chart-donut.js +0 -309
  150. package/dist/chart-donut.js.map +0 -1
  151. package/dist/class-map-59YGWLnx.js.map +0 -1
  152. package/dist/observe-theme-change-pALI5fmV.js.map +0 -1
  153. package/dist/snackbar-74YCdMPL.js.map +0 -1
  154. package/dist/src/chart-donut/chart-donut.d.ts +0 -53
  155. package/dist/src/chart-donut/index.d.ts +0 -1
  156. package/dist/test/card.test.d.ts +0 -1
  157. package/src/chart-donut/chart-donut.scss +0 -37
  158. package/src/chart-donut/chart-donut.ts +0 -287
  159. package/src/chart-donut/demo/index.html +0 -51
  160. package/src/chart-donut/index.ts +0 -1
@@ -0,0 +1,90 @@
1
+ <!doctype html>
2
+ <html lang='en-GB'>
3
+ <head>
4
+ <meta charset='utf-8'>
5
+ <meta name='viewport' content='width=device-width, initial-scale=1.0, viewport-fit=cover' />
6
+ <link rel='stylesheet' href='/dist/assets/styles.css' />
7
+ <style>
8
+ body {
9
+ background: #fafafa;
10
+ padding: 2rem;
11
+ display: grid;
12
+ gap: 1rem;
13
+ }
14
+ </style>
15
+ </head>
16
+ <body>
17
+
18
+ <wc-tabs variant="primary">
19
+ <wc-tab icon="home">Home</wc-tab>
20
+ <wc-tab active="true" badge="3">Updates</wc-tab>
21
+ <wc-tab>
22
+ Inbox
23
+ <wc-icon slot="icon" name="mail"></wc-icon>
24
+ <wc-badge slot="badge" value="99+"></wc-badge>
25
+ </wc-tab>
26
+ <wc-tab disabled="true" icon="block" badge="!">Disabled</wc-tab>
27
+ </wc-tabs>
28
+
29
+ <wc-tabs variant="secondary">
30
+ <wc-tab active="true">Overview</wc-tab>
31
+ <wc-tab>
32
+ Activity
33
+ <wc-icon slot="icon" name="timeline"></wc-icon>
34
+ </wc-tab>
35
+ <wc-tab>Settings</wc-tab>
36
+ </wc-tabs>
37
+
38
+ <wc-tabs variant="filled">
39
+ <wc-tab active="true">Daily</wc-tab>
40
+ <wc-tab>Weekly</wc-tab>
41
+ <wc-tab>
42
+ Monthly
43
+ <wc-badge slot="badge" value="3"></wc-badge>
44
+ </wc-tab>
45
+ <wc-tab disabled="true">Archived</wc-tab>
46
+ </wc-tabs>
47
+
48
+ <wc-tabs variant="contained">
49
+ <wc-tab active="true">Summary</wc-tab>
50
+ <wc-tab>
51
+ Reports
52
+ <wc-icon slot="icon" name="bar_chart"></wc-icon>
53
+ </wc-tab>
54
+ <wc-tab>Exports</wc-tab>
55
+ </wc-tabs>
56
+
57
+
58
+ <wc-tab-group>
59
+ <wc-tabs>
60
+ <wc-tab icon="home">Home</wc-tab>
61
+ <wc-tab active="true" badge="3">Updates</wc-tab>
62
+ <wc-tab>
63
+ Inbox
64
+ <wc-icon slot="icon" name="mail"></wc-icon>
65
+ <wc-badge slot="badge" value="99+"></wc-badge>
66
+ </wc-tab>
67
+ <wc-tab disabled="true" icon="block" badge="!">Disabled</wc-tab>
68
+ </wc-tabs>
69
+
70
+ <wc-tab-panel>
71
+ <pc-text type="heading"> Home content </pc-text>
72
+ </wc-tab-panel>
73
+
74
+ <wc-tab-panel>
75
+ <pc-text type="heading"> Updates content </pc-text>
76
+ </wc-tab-panel>
77
+
78
+ <wc-tab-panel>
79
+ <pc-text type="heading"> Inbox content </pc-text>
80
+ </wc-tab-panel>
81
+
82
+ <wc-tab-panel>
83
+ <pc-text type="heading"> Disabled content </pc-text>
84
+ </wc-tab-panel>
85
+ </wc-tab-group>
86
+
87
+
88
+ <script type='module' src='/dist/peacock-loader.js'></script>
89
+ </body>
90
+ </html>
@@ -35,9 +35,6 @@ export class TabGroup extends LitElement {
35
35
 
36
36
  static TabPanel = TabPanel;
37
37
 
38
- @property({ reflect: true })
39
- variant: 'line' | 'line-secondary' | 'contained' | 'pill' = 'line';
40
-
41
38
  connectedCallback() {
42
39
  super.connectedCallback();
43
40
  this.addEventListener('tab-click', this.onTabClick);
package/src/tabs/tab.scss CHANGED
@@ -23,7 +23,7 @@
23
23
  flex-direction: column;
24
24
  align-items: center;
25
25
  justify-content: center;
26
- height: var(--_tab-height);
26
+ height: 100%;
27
27
  padding: 0 var(--_container-padding);
28
28
  width: 100%;
29
29
  cursor: pointer;
@@ -34,51 +34,59 @@
34
34
  display: flex;
35
35
  align-items: center;
36
36
  justify-content: center;
37
- gap: 0;
38
37
  width: 100%;
39
38
  height: 100%;
40
39
  z-index: 0;
41
40
 
42
41
  color: var(--_label-text-color);
43
42
  opacity: var(--_label-text-opacity, 1);
43
+ transition:
44
+ color var(--duration-short4) var(--easing-standard),
45
+ opacity var(--duration-short4) var(--easing-standard);
44
46
  --icon-size: var(--tab-icon-size, var(--_tab-icon-size));
45
47
  --icon-color: var(--_label-text-color);
46
48
 
47
- .slot-container {
48
- display: none;
49
- }
50
-
51
49
  ::slotted([slot='icon']) {
52
- flex: none;
53
50
  color: var(--_label-text-color);
54
51
  --icon-size: var(--tab-icon-size, var(--_tab-icon-size));
55
52
  --icon-color: var(--_label-text-color);
56
53
  }
57
54
 
58
55
  ::slotted([slot='badge']) {
59
- flex: none;
60
- margin-inline-start: var(--_tab-badge-label-spacing, 0);
61
56
  --badge-color: var(--_tab-badge-color, var(--color-error));
62
57
  }
63
58
  }
64
59
 
65
- &.has-icon {
66
- .tab-content {
67
- gap: var(--_tab-icon-label-spacing);
68
- }
69
- }
70
-
71
60
  .indicator {
72
61
  position: absolute;
73
62
  pointer-events: none;
74
63
  z-index: 1;
75
- opacity: 0;
76
64
  background: var(--_active-indicator-color);
77
65
  border-radius: var(--_active-indicator-shape);
78
- transform-origin: left bottom;
66
+ transform: scaleX(0.6);
67
+ transform-origin: center bottom;
79
68
  height: var(--_active-indicator-height);
80
69
  inset: auto 0px 0px;
81
70
  opacity: 0;
71
+ transition:
72
+ transform var(--duration-medium2) var(--easing-standard),
73
+ opacity var(--duration-short4) var(--easing-standard);
74
+ will-change: transform, opacity;
75
+ }
76
+
77
+ .background {
78
+ position: absolute;
79
+ inset: 0;
80
+ pointer-events: none;
81
+ z-index: 0;
82
+ opacity: 0;
83
+ transform: scaleX(0.6);
84
+ transform-origin: center center;
85
+ transition:
86
+ transform var(--duration-medium2) var(--easing-standard),
87
+ opacity var(--duration-short4) var(--easing-standard),
88
+ background-color var(--duration-short4) var(--easing-standard);
89
+ will-change: transform, opacity;
82
90
  }
83
91
 
84
92
  &.has-content {
@@ -128,8 +136,7 @@
128
136
 
129
137
 
130
138
 
131
- :host-context([variant='line']) .tab {
132
- --_tab-height: 100%;
139
+ :host-context([variant='primary']) .tab {
133
140
  --_container-padding: 1rem;
134
141
  --_tab-icon-size: 1.5rem;
135
142
  --_tab-icon-label-spacing: 0.5rem;
@@ -144,16 +151,42 @@
144
151
  --_container-shape-end-end: var(--shape-corner-small);
145
152
  --_active-indicator-color: var(--color-primary);
146
153
  --_active-indicator-shape: 3px 3px 0 0;
147
- --_active-indicator-height: 3px;
154
+ --_active-indicator-height: 2px;
148
155
 
149
156
  .focus-ring {
150
157
  inset: 3px 3px 4px 3px;
151
158
  }
152
159
 
160
+
161
+ .tab-content {
162
+
163
+ flex-direction: column;
164
+
165
+ .icon-section {
166
+ position: relative;
167
+
168
+ ::slotted([slot='badge']) {
169
+ position: absolute;
170
+ top: 0;
171
+ left: calc(100% - 3px);
172
+ }
173
+
174
+ ::slotted([slot='badge'][value]) {
175
+ position: absolute;
176
+ top: 0;
177
+ left: calc(100% - 6px);
178
+ }
179
+ }
180
+ }
181
+
182
+
183
+
184
+
153
185
  &.active {
154
186
 
155
- .tab-content .indicator {
187
+ .indicator {
156
188
  opacity: 1;
189
+ transform: scaleX(1);
157
190
  }
158
191
 
159
192
  .focus-ring {
@@ -179,8 +212,7 @@
179
212
  }
180
213
  }
181
214
 
182
- :host-context([variant='line-secondary']) .tab {
183
- --_tab-height: 100%;
215
+ :host-context([variant='secondary']) .tab {
184
216
  --_container-padding: 1rem;
185
217
  --_tab-icon-size: 1.25rem;
186
218
  --_tab-icon-label-spacing: 0.5rem;
@@ -201,10 +233,22 @@
201
233
  inset: 3px 3px 4px 3px;
202
234
  }
203
235
 
236
+ .tab-content {
237
+ ::slotted([slot='icon']) {
238
+ margin-inline-end: var(--_tab-icon-label-spacing);
239
+ }
240
+
241
+ ::slotted([slot='badge']) {
242
+ margin-inline-start: var(--_tab-badge-label-spacing);
243
+ }
244
+ }
245
+
246
+
204
247
  &.active {
205
248
 
206
- .indicator.secondary {
249
+ .indicator {
207
250
  opacity: 1;
251
+ transform: scaleX(1);
208
252
  }
209
253
 
210
254
  .focus-ring {
@@ -228,4 +272,172 @@
228
272
  display: none;
229
273
  }
230
274
  }
231
- }
275
+ }
276
+
277
+ :host-context([variant='filled']) .tab {
278
+ --_container-padding: 1rem;
279
+ --_tab-icon-size: 1.25rem;
280
+ --_tab-icon-label-spacing: 0.5rem;
281
+ --_tab-badge-label-spacing: 0.25rem;
282
+ --_tab-badge-color: var(--color-error);
283
+
284
+ --_label-text-color: var(--color-on-surface-variant);
285
+ --_container-state-color: var(--color-on-surface);
286
+ --_container-shape-start-start: var(--shape-corner-medium);
287
+ --_container-shape-start-end: var(--shape-corner-medium);
288
+ --_container-shape-end-start: var(--shape-corner-medium);
289
+ --_container-shape-end-end: var(--shape-corner-medium);
290
+ --_container-corner-shape-variant: squircle;
291
+ --_active-surface-color: var(--color-surface);
292
+
293
+ .focus-ring {
294
+ inset: 2px;
295
+ }
296
+
297
+ .tab-content {
298
+ ::slotted([slot='icon']) {
299
+ margin-inline-end: var(--_tab-icon-label-spacing);
300
+ }
301
+
302
+ ::slotted([slot='badge']) {
303
+ margin-inline-start: var(--_tab-badge-label-spacing);
304
+ }
305
+ }
306
+
307
+ .indicator {
308
+ display: none;
309
+ }
310
+
311
+ .ripple {
312
+ border-start-start-radius: var(--_container-shape-start-start);
313
+ border-start-end-radius: var(--_container-shape-start-end);
314
+ border-end-start-radius: var(--_container-shape-end-start);
315
+ border-end-end-radius: var(--_container-shape-end-end);
316
+ }
317
+
318
+ .background {
319
+ corner-shape: var(--_container-corner-shape-variant);
320
+ border-start-start-radius: var(--_container-shape-start-start);
321
+ border-start-end-radius: var(--_container-shape-start-end);
322
+ border-end-start-radius: var(--_container-shape-end-start);
323
+ border-end-end-radius: var(--_container-shape-end-end);
324
+ background: var(--_active-surface-color);
325
+ }
326
+
327
+ &.active {
328
+ --_label-text-color: var(--color-on-surface);
329
+
330
+ .background {
331
+ opacity: 1;
332
+ transform: scaleX(1);
333
+ }
334
+
335
+ .ripple {
336
+ display: none;
337
+ }
338
+ }
339
+
340
+ &:hover:not(:where(.disabled)) {
341
+ --_container-state-opacity: 0.08;
342
+ }
343
+
344
+ &.pressed:not(:where(.disabled)) {
345
+ --_container-state-opacity: 0.12;
346
+ }
347
+
348
+ &.disabled {
349
+ --_label-text-color: var(--color-on-surface);
350
+ --_label-text-opacity: 0.38;
351
+
352
+ .ripple {
353
+ display: none;
354
+ }
355
+ }
356
+ }
357
+
358
+ :host-context([variant='contained']) .tab {
359
+ --_container-padding: 1rem;
360
+ --_tab-icon-size: 1.25rem;
361
+ --_tab-icon-label-spacing: 0.5rem;
362
+ --_tab-badge-label-spacing: 0.25rem;
363
+ --_tab-badge-color: var(--color-error);
364
+
365
+ --_label-text-color: var(--color-on-surface);
366
+ --_container-state-color: var(--color-primary);
367
+ --_container-shape-start-start: var(--shape-corner-small);
368
+ --_container-shape-start-end: var(--shape-corner-small);
369
+ --_container-shape-end-start: var(--shape-corner-small);
370
+ --_container-shape-end-end: var(--shape-corner-small);
371
+ --_container-corner-shape-variant: squircle;
372
+ --_active-surface-color: var(--color-secondary-container);
373
+
374
+ .focus-ring {
375
+ inset: 2px;
376
+ }
377
+
378
+ .tab-content {
379
+ ::slotted([slot='icon']) {
380
+ margin-inline-end: var(--_tab-icon-label-spacing);
381
+ }
382
+
383
+ ::slotted([slot='badge']) {
384
+ margin-inline-start: var(--_tab-badge-label-spacing);
385
+ }
386
+ }
387
+
388
+ .indicator {
389
+ display: none;
390
+ }
391
+
392
+ .ripple {
393
+ border-start-start-radius: var(--_container-shape-start-start);
394
+ border-start-end-radius: var(--_container-shape-start-end);
395
+ border-end-start-radius: var(--_container-shape-end-start);
396
+ border-end-end-radius: var(--_container-shape-end-end);
397
+ }
398
+
399
+ .background {
400
+ corner-shape: var(--_container-corner-shape-variant);
401
+ border-start-start-radius: var(--_container-shape-start-start);
402
+ border-start-end-radius: var(--_container-shape-start-end);
403
+ border-end-start-radius: var(--_container-shape-end-start);
404
+ border-end-end-radius: var(--_container-shape-end-end);
405
+ background: var(--_active-surface-color);
406
+ }
407
+
408
+ &.active {
409
+ --_label-text-color: var(--color-on-secondary-container);
410
+
411
+ .background {
412
+ opacity: 1;
413
+ transform: scaleX(1);
414
+ }
415
+ }
416
+
417
+ &:hover:not(:where(.disabled)) {
418
+ --_container-state-opacity: 0.08;
419
+ }
420
+
421
+ &.pressed:not(:where(.disabled)) {
422
+ --_container-state-opacity: 0.12;
423
+ }
424
+
425
+ &.disabled {
426
+ --_label-text-color: var(--color-on-surface);
427
+ --_label-text-opacity: 0.38;
428
+
429
+ .ripple {
430
+ display: none;
431
+ }
432
+ }
433
+ }
434
+
435
+ @media (prefers-reduced-motion: reduce) {
436
+ .tab {
437
+ .tab-content,
438
+ .indicator,
439
+ .background {
440
+ transition: none;
441
+ }
442
+ }
443
+ }
package/src/tabs/tab.ts CHANGED
@@ -5,6 +5,7 @@ import { dispatchActivationClick, isActivationClick } from 'src/utils/dispatch-e
5
5
  import { observerSlotChangesWithCallback, throttle } from 'src/utils.js';
6
6
  import { spread } from 'src/spread.js';
7
7
  import styles from './tab.scss';
8
+ import type { Tabs } from './tabs.js';
8
9
 
9
10
  /**
10
11
  * @label Tab
@@ -34,8 +35,6 @@ export class Tab extends LitElement {
34
35
 
35
36
  @property({ type: String }) disabledReason = '';
36
37
 
37
- @property({ type: String }) label?: string;
38
-
39
38
  @property({ type: String }) value?: string;
40
39
 
41
40
  @property({ reflect: true })
@@ -91,7 +90,7 @@ export class Tab extends LitElement {
91
90
  this.throttleDelay,
92
91
  );
93
92
  observerSlotChangesWithCallback(
94
- this.renderRoot.querySelector('slot'),
93
+ this.renderRoot.querySelector('slot:not([name])'),
95
94
  hasContent => {
96
95
  this.slotHasContent = hasContent;
97
96
  this.requestUpdate();
@@ -157,6 +156,10 @@ export class Tab extends LitElement {
157
156
  return !!this.href;
158
157
  }
159
158
 
159
+ __getParentTabsVariant(): Tabs['variant'] {
160
+ return (this.closest('wc-tabs') as Tabs | null)?.variant ?? 'primary';
161
+ }
162
+
160
163
  // private handleKeyDown(evt: KeyboardEvent) {
161
164
  // if (this.disabled || this.showLoader) return;
162
165
  // if (evt.key === 'Enter' || evt.key === ' ') {
@@ -170,6 +173,7 @@ export class Tab extends LitElement {
170
173
  render() {
171
174
 
172
175
  const isLink = this.__isLink();
176
+ const variant = this.__getParentTabsVariant();
173
177
 
174
178
  const cssClasses = {
175
179
  tab: true,
@@ -177,7 +181,8 @@ export class Tab extends LitElement {
177
181
  disabled: this.disabled,
178
182
  pressed: this.isPressed,
179
183
  active: this.active,
180
- 'has-content': this.slotHasContent || !!this.label,
184
+ [`variant-${variant}`]: true,
185
+ 'has-content': this.slotHasContent,
181
186
  'has-icon': this.slotHasIcon,
182
187
  'has-badge': this.slotHasBadge,
183
188
  };
@@ -195,7 +200,7 @@ export class Tab extends LitElement {
195
200
  ?disabled=${this.disabled}
196
201
  ${spread(this.configAria)}
197
202
  >
198
- ${this.renderTabContent()}
203
+ ${this.renderTabContent(variant)}
199
204
  </button>`;
200
205
  }
201
206
 
@@ -213,31 +218,100 @@ export class Tab extends LitElement {
213
218
  aria-disabled=${`${this.disabled}`}
214
219
  ${spread(this.configAria)}
215
220
  >
216
- ${this.renderTabContent()}
221
+ ${this.renderTabContent(variant)}
217
222
  </a>`;
218
223
  }
219
224
 
220
- renderTabContent() {
225
+ renderTabContent(variant: Tabs['variant']) {
226
+ switch (variant) {
227
+ case 'secondary':
228
+ return this.renderSecondaryTabContent();
229
+ case 'contained':
230
+ return this.renderContainedTabContent();
231
+ case 'filled':
232
+ return this.renderFilledTabContent();
233
+ case 'primary':
234
+ default:
235
+ return this.renderPrimaryTabContent();
236
+ }
237
+ }
238
+
239
+ renderPrimaryTabContent() {
240
+ return html`
241
+ <wc-focus-ring class="focus-ring" .control=${this} .forElement=${this.tabElement}></wc-focus-ring>
242
+ <wc-elevation class="elevation"></wc-elevation>
243
+ <div class="background"></div>
244
+ <div class="outline"></div>
245
+ <wc-ripple class="ripple"></wc-ripple>
246
+
247
+ <div class="tab-content">
248
+
249
+ <div class="icon-section">
250
+ <slot name="badge"></slot>
251
+ <slot name="icon"></slot>
252
+ </div>
253
+ <div class="slot-container">
254
+ <slot></slot>
255
+ </div>
256
+
257
+ <div class="indicator"></div>
258
+
259
+ </div>
260
+
261
+ ${this.__renderDisabledReason()}
262
+ `;
263
+ }
264
+
265
+ renderSecondaryTabContent() {
221
266
  return html`
222
- <wc-focus-ring class="focus-ring" .control=${this} element="tabElement"></wc-focus-ring>
267
+ <wc-focus-ring class="focus-ring" .control=${this} .forElement=${this.tabElement}></wc-focus-ring>
223
268
  <wc-elevation class="elevation"></wc-elevation>
224
269
  <div class="background"></div>
225
270
  <div class="outline"></div>
226
271
  <wc-ripple class="ripple"></wc-ripple>
227
272
 
228
273
  <div class="tab-content">
274
+
229
275
  <slot name="icon"></slot>
230
276
 
231
277
  <div class="slot-container">
232
- <slot>${this.label || nothing}</slot>
278
+ <slot></slot>
233
279
  </div>
234
280
 
235
281
  <slot name="badge"></slot>
236
-
237
- <div class="indicator"></div>
238
282
  </div>
239
283
 
240
- <div class="secondary indicator"></div>
284
+ <div class="indicator"></div>
285
+
286
+ ${this.__renderDisabledReason()}
287
+ `;
288
+ }
289
+
290
+ renderContainedTabContent() {
291
+ return this.renderSegmentedTabContent();
292
+ }
293
+
294
+ renderFilledTabContent() {
295
+ return this.renderSegmentedTabContent();
296
+ }
297
+
298
+ renderSegmentedTabContent() {
299
+ return html`
300
+ <wc-focus-ring class="focus-ring" .control=${this} .forElement=${this.tabElement}></wc-focus-ring>
301
+ <wc-elevation class="elevation"></wc-elevation>
302
+ <div class="background"></div>
303
+ <div class="outline"></div>
304
+ <wc-ripple class="ripple"></wc-ripple>
305
+
306
+ <div class="tab-content">
307
+ <slot name="icon"></slot>
308
+
309
+ <div class="slot-container">
310
+ <slot></slot>
311
+ </div>
312
+
313
+ <slot name="badge"></slot>
314
+ </div>
241
315
 
242
316
  ${this.__renderDisabledReason()}
243
317
  `;
@@ -7,13 +7,47 @@
7
7
  display: flex;
8
8
  position: relative;
9
9
  width: 100%;
10
+ height: var(--tabs-height);
10
11
  }
11
12
 
12
- :host-context([variant='line']), :host([variant='line']) {
13
- --tabs-height: 3rem;
13
+ :host([variant='primary']) {
14
+ --tabs-height: 4rem;
14
15
 
15
16
  .tabs {
16
- height: var(--tabs-height);
17
17
  border-bottom: 1px solid var(--color-surface-variant);
18
18
  }
19
19
  }
20
+
21
+ :host([variant='secondary']) {
22
+ --tabs-height: 3rem;
23
+
24
+ .tabs {
25
+ border-bottom: 1px solid var(--color-surface-variant);
26
+ }
27
+ }
28
+
29
+ :host([variant='filled']) {
30
+ --tabs-height: 3rem;
31
+
32
+ .tabs {
33
+ align-items: stretch;
34
+ gap: 0.25rem;
35
+ padding: 0.25rem;
36
+ border-radius: var(--shape-corner-small);
37
+ background: var(--color-surface-container-high);
38
+ }
39
+ }
40
+
41
+ :host([variant='contained']) {
42
+ --tabs-height: 3rem;
43
+
44
+ .tabs {
45
+ align-items: stretch;
46
+ gap: 0.25rem;
47
+ padding: 0.25rem;
48
+ border-radius: var(--shape-corner-extra-small);
49
+ border: 1px solid var(--color-outline-variant);
50
+ background: var(--color-surface);
51
+ }
52
+ }
53
+