@redvars/peacock 3.3.3 → 3.5.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 (280) 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/assets/styles.css +1 -1
  6. package/dist/assets/styles.css.map +1 -1
  7. package/dist/banner.js +202 -0
  8. package/dist/banner.js.map +1 -0
  9. package/dist/bottom-sheet.js +238 -0
  10. package/dist/bottom-sheet.js.map +1 -0
  11. package/dist/{button-ClzS8JLq.js → button-DMN1dPAg.js} +358 -218
  12. package/dist/button-DMN1dPAg.js.map +1 -0
  13. package/dist/button-group-CX9CUUXk.js +435 -0
  14. package/dist/button-group-CX9CUUXk.js.map +1 -0
  15. package/dist/button-group.js +11 -6
  16. package/dist/button-group.js.map +1 -1
  17. package/dist/button.js +10 -5
  18. package/dist/button.js.map +1 -1
  19. package/dist/card-content.js +29 -0
  20. package/dist/card-content.js.map +1 -0
  21. package/dist/card.js +428 -44
  22. package/dist/card.js.map +1 -1
  23. package/dist/{chart-bar-DbnXQgvS.js → chart-bar-cn6rrna-.js} +2 -2
  24. package/dist/{chart-bar-DbnXQgvS.js.map → chart-bar-cn6rrna-.js.map} +1 -1
  25. package/dist/chart-bar.js +5 -4
  26. package/dist/chart-bar.js.map +1 -1
  27. package/dist/chart-doughnut.js +2 -1
  28. package/dist/chart-doughnut.js.map +1 -1
  29. package/dist/chart-pie.js +2 -1
  30. package/dist/chart-pie.js.map +1 -1
  31. package/dist/chart-stacked-bar.js +5 -4
  32. package/dist/chart-stacked-bar.js.map +1 -1
  33. package/dist/{class-map-59YGWLnx.js → class-map-YU7g0o3B.js} +4 -10
  34. package/dist/class-map-YU7g0o3B.js.map +1 -0
  35. package/dist/clock.js +2 -1
  36. package/dist/clock.js.map +1 -1
  37. package/dist/code-editor.js +8 -6
  38. package/dist/code-editor.js.map +1 -1
  39. package/dist/code-highlighter.js +6 -4
  40. package/dist/code-highlighter.js.map +1 -1
  41. package/dist/custom-elements-jsdocs.json +6270 -5026
  42. package/dist/custom-elements.json +5763 -2049
  43. package/dist/directive-ZPhl09Yt.js +9 -0
  44. package/dist/directive-ZPhl09Yt.js.map +1 -0
  45. package/dist/dispatch-event-utils-CuEqjlPT.js +127 -0
  46. package/dist/dispatch-event-utils-CuEqjlPT.js.map +1 -0
  47. package/dist/fab-C5Nzxk0E.js +497 -0
  48. package/dist/fab-C5Nzxk0E.js.map +1 -0
  49. package/dist/fab.js +11 -0
  50. package/dist/fab.js.map +1 -0
  51. package/dist/index.js +24 -12
  52. package/dist/index.js.map +1 -1
  53. package/dist/{observe-theme-change-pALI5fmV.js → is-dark-mode-DicqGkCJ.js} +8 -3
  54. package/dist/is-dark-mode-DicqGkCJ.js.map +1 -0
  55. package/dist/notification.js +417 -0
  56. package/dist/notification.js.map +1 -0
  57. package/dist/number-counter.js +4 -3
  58. package/dist/number-counter.js.map +1 -1
  59. package/dist/observe-slot-change-BGJfgg2E.js +31 -0
  60. package/dist/observe-slot-change-BGJfgg2E.js.map +1 -0
  61. package/dist/peacock-loader.js +59 -10
  62. package/dist/peacock-loader.js.map +1 -1
  63. package/dist/property-1psGvXOq.js +10 -0
  64. package/dist/property-1psGvXOq.js.map +1 -0
  65. package/dist/search.js +452 -0
  66. package/dist/search.js.map +1 -0
  67. package/dist/{radio-b70_Ie9n.js → select-4pl4XBj7.js} +2439 -521
  68. package/dist/select-4pl4XBj7.js.map +1 -0
  69. package/dist/side-sheet.js +186 -0
  70. package/dist/side-sheet.js.map +1 -0
  71. package/dist/spread-B5cgadZl.js +32 -0
  72. package/dist/spread-B5cgadZl.js.map +1 -0
  73. package/dist/src/__base_element/BaseHyperlink.d.ts +20 -0
  74. package/dist/src/__utils/cache-fetch.d.ts +1 -0
  75. package/dist/src/__utils/is-dark-mode.d.ts +1 -0
  76. package/dist/src/__utils/is-in-viewport.d.ts +1 -0
  77. package/dist/src/__utils/observe-slot-change.d.ts +1 -0
  78. package/dist/src/__utils/sanitize-svg.d.ts +1 -0
  79. package/dist/src/__utils/throttle.d.ts +4 -0
  80. package/dist/src/accordion/accordion-item.d.ts +33 -9
  81. package/dist/src/accordion/accordion.d.ts +21 -5
  82. package/dist/src/banner/banner.d.ts +47 -0
  83. package/dist/src/banner/index.d.ts +1 -0
  84. package/dist/src/bottom-sheet/bottom-sheet.d.ts +42 -0
  85. package/dist/src/bottom-sheet/index.d.ts +1 -0
  86. package/dist/src/button/BaseButton.d.ts +7 -13
  87. package/dist/src/button/button/button.d.ts +4 -0
  88. package/dist/src/button/button-group/button-group.d.ts +32 -3
  89. package/dist/src/button/icon-button/icon-button.d.ts +4 -0
  90. package/dist/src/card/card-content.d.ts +15 -0
  91. package/dist/src/card/card.d.ts +37 -3
  92. package/dist/src/card/index.d.ts +1 -0
  93. package/dist/src/container/container.d.ts +1 -1
  94. package/dist/src/empty-state/empty-state.d.ts +1 -1
  95. package/dist/src/fab/fab.d.ts +111 -0
  96. package/dist/src/fab/index.d.ts +1 -0
  97. package/dist/src/focus-ring/focus-ring.d.ts +4 -1
  98. package/dist/src/index.d.ts +11 -1
  99. package/dist/src/link/link.d.ts +3 -10
  100. package/dist/src/menu/menu/menu.d.ts +4 -2
  101. package/dist/src/menu/menu-item/menu-item.d.ts +0 -1
  102. package/dist/src/menu/sub-menu/sub-menu.d.ts +1 -0
  103. package/dist/src/notification/index.d.ts +1 -0
  104. package/dist/src/notification/notification.d.ts +69 -0
  105. package/dist/src/pagination/pagination.d.ts +8 -1
  106. package/dist/src/ripple/ripple.d.ts +19 -3
  107. package/dist/src/search/index.d.ts +1 -0
  108. package/dist/src/search/search.d.ts +76 -0
  109. package/dist/src/segmented-button/index.d.ts +2 -0
  110. package/dist/src/segmented-button/segmented-button-group.d.ts +46 -0
  111. package/dist/src/segmented-button/segmented-button.d.ts +65 -0
  112. package/dist/src/select/index.d.ts +3 -0
  113. package/dist/src/select/option.d.ts +55 -0
  114. package/dist/src/select/select.d.ts +114 -0
  115. package/dist/src/side-sheet/index.d.ts +1 -0
  116. package/dist/src/side-sheet/side-sheet.d.ts +41 -0
  117. package/dist/src/slider/slider.d.ts +4 -0
  118. package/dist/src/snackbar/snackbar.d.ts +14 -1
  119. package/dist/src/tabs/tab-group.d.ts +0 -1
  120. package/dist/src/tabs/tab.d.ts +8 -2
  121. package/dist/src/tabs/tabs.d.ts +13 -1
  122. package/dist/src/toolbar/index.d.ts +1 -0
  123. package/dist/src/toolbar/toolbar.d.ts +86 -0
  124. package/dist/state-DwbEjqVk.js +10 -0
  125. package/dist/state-DwbEjqVk.js.map +1 -0
  126. package/dist/{style-map-DcB52w-l.js → style-map-DVmWOuYy.js} +3 -3
  127. package/dist/{style-map-DcB52w-l.js.map → style-map-DVmWOuYy.js.map} +1 -1
  128. package/dist/test/search.test.d.ts +1 -0
  129. package/dist/test/toolbar.test.d.ts +1 -0
  130. package/dist/throttle-C7ZAPqtu.js +24 -0
  131. package/dist/throttle-C7ZAPqtu.js.map +1 -0
  132. package/dist/toolbar.js +306 -0
  133. package/dist/toolbar.js.map +1 -0
  134. package/dist/tsconfig.tsbuildinfo +1 -1
  135. package/dist/{unsafe-html-C2r3PyzF.js → unsafe-html-BsGUjx94.js} +3 -3
  136. package/dist/{unsafe-html-C2r3PyzF.js.map → unsafe-html-BsGUjx94.js.map} +1 -1
  137. package/package.json +1 -1
  138. package/readme.md +2 -2
  139. package/scss/styles.scss +4 -0
  140. package/src/__base_element/BaseHyperlink.ts +42 -0
  141. package/src/__base_element/README.md +19 -0
  142. package/src/__utils/cache-fetch.ts +65 -0
  143. package/src/{utils → __utils}/dispatch-event-utils.ts +1 -0
  144. package/src/__utils/is-dark-mode.ts +3 -0
  145. package/src/__utils/is-in-viewport.ts +6 -0
  146. package/src/__utils/observe-slot-change.ts +38 -0
  147. package/src/__utils/sanitize-svg.ts +27 -0
  148. package/src/__utils/throttle.ts +27 -0
  149. package/src/accordion/accordion-item.scss +136 -65
  150. package/src/accordion/accordion-item.ts +117 -44
  151. package/src/accordion/accordion.scss +24 -5
  152. package/src/accordion/accordion.ts +29 -23
  153. package/src/accordion/demo/index.html +74 -35
  154. package/src/banner/banner.scss +87 -0
  155. package/src/banner/banner.ts +107 -0
  156. package/src/banner/index.ts +1 -0
  157. package/src/bottom-sheet/bottom-sheet.scss +88 -0
  158. package/src/bottom-sheet/bottom-sheet.ts +135 -0
  159. package/src/bottom-sheet/index.ts +1 -0
  160. package/src/button/BaseButton.ts +26 -30
  161. package/src/button/button/button-colors.scss +90 -19
  162. package/src/button/button/button-sizes.scss +39 -19
  163. package/src/button/button/button.scss +117 -116
  164. package/src/button/button/button.ts +29 -6
  165. package/src/button/button-group/button-group.scss +25 -22
  166. package/src/button/button-group/button-group.ts +122 -5
  167. package/src/button/icon-button/icon-button-sizes.scss +35 -15
  168. package/src/button/icon-button/icon-button.ts +25 -12
  169. package/src/card/card-colors.scss +10 -0
  170. package/src/card/card-content.ts +26 -0
  171. package/src/card/card.scss +221 -41
  172. package/src/card/card.ts +251 -8
  173. package/src/card/index.ts +1 -0
  174. package/src/chart-bar/chart-bar.ts +1 -1
  175. package/src/chart-bar/chart-stacked-bar.ts +3 -1
  176. package/src/chart-doughnut/chart-doughnut.ts +1 -1
  177. package/src/chart-pie/chart-pie.ts +1 -1
  178. package/src/checkbox/checkbox.ts +1 -1
  179. package/src/clock/clock.ts +1 -1
  180. package/src/code-editor/code-editor.ts +5 -5
  181. package/src/code-highlighter/code-highlighter.ts +2 -2
  182. package/src/container/container.ts +1 -1
  183. package/src/date-picker/date-picker.ts +5 -2
  184. package/src/divider/divider.ts +3 -1
  185. package/src/empty-state/empty-state.scss +9 -3
  186. package/src/empty-state/empty-state.ts +2 -2
  187. package/src/fab/fab-colors.scss +49 -0
  188. package/src/fab/fab-sizes.scss +47 -0
  189. package/src/fab/fab.scss +137 -0
  190. package/src/fab/fab.ts +285 -0
  191. package/src/fab/index.ts +1 -0
  192. package/src/field/field.ts +3 -1
  193. package/src/focus-ring/focus-ring.ts +37 -19
  194. package/src/icon/datasource.ts +1 -1
  195. package/src/icon/icon.ts +3 -1
  196. package/src/image/image.ts +3 -2
  197. package/src/index.ts +12 -1
  198. package/src/input/input.ts +5 -2
  199. package/src/link/link.ts +2 -15
  200. package/src/menu/menu/menu.scss +31 -3
  201. package/src/menu/menu/menu.ts +30 -6
  202. package/src/menu/menu-item/menu-item.scss +1 -0
  203. package/src/menu/menu-item/menu-item.ts +1 -9
  204. package/src/menu/sub-menu/sub-menu.ts +1 -0
  205. package/src/notification/index.ts +1 -0
  206. package/src/notification/notification.scss +201 -0
  207. package/src/notification/notification.ts +206 -0
  208. package/src/number-counter/number-counter.ts +3 -1
  209. package/src/number-field/number-field.ts +4 -2
  210. package/src/pagination/pagination.scss +33 -24
  211. package/src/pagination/pagination.ts +113 -60
  212. package/src/peacock-loader.ts +48 -0
  213. package/src/radio/radio.ts +3 -1
  214. package/src/ripple/ripple.ts +19 -3
  215. package/src/search/index.ts +1 -0
  216. package/src/search/search-colors.scss +14 -0
  217. package/src/search/search.scss +204 -0
  218. package/src/search/search.ts +240 -0
  219. package/src/segmented-button/index.ts +2 -0
  220. package/src/segmented-button/segmented-button-group.scss +21 -0
  221. package/src/segmented-button/segmented-button-group.ts +110 -0
  222. package/src/segmented-button/segmented-button.scss +115 -0
  223. package/src/segmented-button/segmented-button.ts +175 -0
  224. package/src/select/index.ts +3 -0
  225. package/src/select/option.ts +109 -0
  226. package/src/select/select.scss +125 -0
  227. package/src/select/select.ts +520 -0
  228. package/src/side-sheet/index.ts +1 -0
  229. package/src/side-sheet/side-sheet.scss +79 -0
  230. package/src/side-sheet/side-sheet.ts +100 -0
  231. package/src/slider/slider.scss +19 -1
  232. package/src/slider/slider.ts +30 -19
  233. package/src/snackbar/snackbar.scss +62 -31
  234. package/src/snackbar/snackbar.ts +92 -12
  235. package/src/switch/switch.ts +3 -1
  236. package/src/table/table.ts +3 -1
  237. package/src/tabs/demo/index.html +90 -0
  238. package/src/tabs/tab-group.ts +0 -3
  239. package/src/tabs/tab.scss +237 -25
  240. package/src/tabs/tab.ts +91 -14
  241. package/src/tabs/tabs.scss +37 -3
  242. package/src/tabs/tabs.ts +118 -2
  243. package/src/textarea/textarea.ts +4 -2
  244. package/src/time-picker/time-picker.ts +4 -2
  245. package/src/toolbar/index.ts +1 -0
  246. package/src/toolbar/toolbar-colors.scss +16 -0
  247. package/src/toolbar/toolbar.scss +165 -0
  248. package/src/toolbar/toolbar.ts +137 -0
  249. package/dist/IndividualComponent-Dt5xirYG.js +0 -73
  250. package/dist/IndividualComponent-Dt5xirYG.js.map +0 -1
  251. package/dist/button-ClzS8JLq.js.map +0 -1
  252. package/dist/button-group-BMS5WvaF.js +0 -292
  253. package/dist/button-group-BMS5WvaF.js.map +0 -1
  254. package/dist/chart-donut.js +0 -309
  255. package/dist/chart-donut.js.map +0 -1
  256. package/dist/class-map-59YGWLnx.js.map +0 -1
  257. package/dist/directive-Cuw6h7YA.js +0 -9
  258. package/dist/directive-Cuw6h7YA.js.map +0 -1
  259. package/dist/dispatch-event-utils-B4odODQf.js +0 -277
  260. package/dist/dispatch-event-utils-B4odODQf.js.map +0 -1
  261. package/dist/observe-theme-change-pALI5fmV.js.map +0 -1
  262. package/dist/radio-b70_Ie9n.js.map +0 -1
  263. package/dist/src/chart-donut/chart-donut.d.ts +0 -53
  264. package/dist/src/chart-donut/index.d.ts +0 -1
  265. package/dist/src/styleMixins.css.d.ts +0 -9
  266. package/dist/src/utils.d.ts +0 -9
  267. package/src/chart-donut/chart-donut.scss +0 -37
  268. package/src/chart-donut/chart-donut.ts +0 -287
  269. package/src/chart-donut/demo/index.html +0 -51
  270. package/src/chart-donut/index.ts +0 -1
  271. package/src/styleMixins.css.ts +0 -55
  272. package/src/utils.ts +0 -193
  273. /package/dist/src/{spread.d.ts → __directive/spread.d.ts} +0 -0
  274. /package/dist/src/{utils → __utils}/copy-to-clipboard.d.ts +0 -0
  275. /package/dist/src/{utils → __utils}/dispatch-event-utils.d.ts +0 -0
  276. /package/dist/src/{utils → __utils}/observe-theme-change.d.ts +0 -0
  277. /package/dist/test/{card.test.d.ts → banner.test.d.ts} +0 -0
  278. /package/src/{spread.ts → __directive/spread.ts} +0 -0
  279. /package/src/{utils → __utils}/copy-to-clipboard.ts +0 -0
  280. /package/src/{utils → __utils}/observe-theme-change.ts +0 -0
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
@@ -1,10 +1,14 @@
1
1
  import { html, LitElement, nothing } from 'lit';
2
2
  import { property, query, state } from 'lit/decorators.js';
3
3
  import { classMap } from 'lit/directives/class-map.js';
4
- import { dispatchActivationClick, isActivationClick } from 'src/utils/dispatch-event-utils.js';
5
- import { observerSlotChangesWithCallback, throttle } from 'src/utils.js';
6
- import { spread } from 'src/spread.js';
4
+
5
+ import { dispatchActivationClick, isActivationClick } from '@/__utils/dispatch-event-utils.js';
6
+ import { observerSlotChangesWithCallback } from '@/__utils/observe-slot-change.js';
7
+ import { throttle } from '@/__utils/throttle.js';
8
+ import { spread } from '@/__directive/spread.js';
9
+
7
10
  import styles from './tab.scss';
11
+ import type { Tabs } from './tabs.js';
8
12
 
9
13
  /**
10
14
  * @label Tab
@@ -34,8 +38,6 @@ export class Tab extends LitElement {
34
38
 
35
39
  @property({ type: String }) disabledReason = '';
36
40
 
37
- @property({ type: String }) label?: string;
38
-
39
41
  @property({ type: String }) value?: string;
40
42
 
41
43
  @property({ reflect: true })
@@ -157,6 +159,10 @@ export class Tab extends LitElement {
157
159
  return !!this.href;
158
160
  }
159
161
 
162
+ __getParentTabsVariant(): Tabs['variant'] {
163
+ return (this.closest('wc-tabs') as Tabs | null)?.variant ?? 'primary';
164
+ }
165
+
160
166
  // private handleKeyDown(evt: KeyboardEvent) {
161
167
  // if (this.disabled || this.showLoader) return;
162
168
  // if (evt.key === 'Enter' || evt.key === ' ') {
@@ -170,6 +176,7 @@ export class Tab extends LitElement {
170
176
  render() {
171
177
 
172
178
  const isLink = this.__isLink();
179
+ const variant = this.__getParentTabsVariant();
173
180
 
174
181
  const cssClasses = {
175
182
  tab: true,
@@ -177,7 +184,8 @@ export class Tab extends LitElement {
177
184
  disabled: this.disabled,
178
185
  pressed: this.isPressed,
179
186
  active: this.active,
180
- 'has-content': this.slotHasContent || !!this.label,
187
+ [`variant-${variant}`]: true,
188
+ 'has-content': this.slotHasContent,
181
189
  'has-icon': this.slotHasIcon,
182
190
  'has-badge': this.slotHasBadge,
183
191
  };
@@ -195,7 +203,7 @@ export class Tab extends LitElement {
195
203
  ?disabled=${this.disabled}
196
204
  ${spread(this.configAria)}
197
205
  >
198
- ${this.renderTabContent()}
206
+ ${this.renderTabContent(variant)}
199
207
  </button>`;
200
208
  }
201
209
 
@@ -213,31 +221,100 @@ export class Tab extends LitElement {
213
221
  aria-disabled=${`${this.disabled}`}
214
222
  ${spread(this.configAria)}
215
223
  >
216
- ${this.renderTabContent()}
224
+ ${this.renderTabContent(variant)}
217
225
  </a>`;
218
226
  }
219
227
 
220
- renderTabContent() {
228
+ renderTabContent(variant: Tabs['variant']) {
229
+ switch (variant) {
230
+ case 'secondary':
231
+ return this.renderSecondaryTabContent();
232
+ case 'contained':
233
+ return this.renderContainedTabContent();
234
+ case 'filled':
235
+ return this.renderFilledTabContent();
236
+ case 'primary':
237
+ default:
238
+ return this.renderPrimaryTabContent();
239
+ }
240
+ }
241
+
242
+ renderPrimaryTabContent() {
243
+ return html`
244
+ <wc-focus-ring class="focus-ring" .control=${this} .forElement=${this.tabElement}></wc-focus-ring>
245
+ <wc-elevation class="elevation"></wc-elevation>
246
+ <div class="background"></div>
247
+ <div class="outline"></div>
248
+ <wc-ripple class="ripple"></wc-ripple>
249
+
250
+ <div class="tab-content">
251
+
252
+ <div class="icon-section">
253
+ <slot name="badge"></slot>
254
+ <slot name="icon"></slot>
255
+ </div>
256
+ <div class="slot-container">
257
+ <slot></slot>
258
+ </div>
259
+
260
+ <div class="indicator"></div>
261
+
262
+ </div>
263
+
264
+ ${this.__renderDisabledReason()}
265
+ `;
266
+ }
267
+
268
+ renderSecondaryTabContent() {
221
269
  return html`
222
- <wc-focus-ring class="focus-ring" .control=${this} element="tabElement"></wc-focus-ring>
270
+ <wc-focus-ring class="focus-ring" .control=${this} .forElement=${this.tabElement}></wc-focus-ring>
223
271
  <wc-elevation class="elevation"></wc-elevation>
224
272
  <div class="background"></div>
225
273
  <div class="outline"></div>
226
274
  <wc-ripple class="ripple"></wc-ripple>
227
275
 
228
276
  <div class="tab-content">
277
+
229
278
  <slot name="icon"></slot>
230
279
 
231
280
  <div class="slot-container">
232
- <slot>${this.label || nothing}</slot>
281
+ <slot></slot>
233
282
  </div>
234
283
 
235
284
  <slot name="badge"></slot>
236
-
237
- <div class="indicator"></div>
238
285
  </div>
239
286
 
240
- <div class="secondary indicator"></div>
287
+ <div class="indicator"></div>
288
+
289
+ ${this.__renderDisabledReason()}
290
+ `;
291
+ }
292
+
293
+ renderContainedTabContent() {
294
+ return this.renderSegmentedTabContent();
295
+ }
296
+
297
+ renderFilledTabContent() {
298
+ return this.renderSegmentedTabContent();
299
+ }
300
+
301
+ renderSegmentedTabContent() {
302
+ return html`
303
+ <wc-focus-ring class="focus-ring" .control=${this} .forElement=${this.tabElement}></wc-focus-ring>
304
+ <wc-elevation class="elevation"></wc-elevation>
305
+ <div class="background"></div>
306
+ <div class="outline"></div>
307
+ <wc-ripple class="ripple"></wc-ripple>
308
+
309
+ <div class="tab-content">
310
+ <slot name="icon"></slot>
311
+
312
+ <div class="slot-container">
313
+ <slot></slot>
314
+ </div>
315
+
316
+ <slot name="badge"></slot>
317
+ </div>
241
318
 
242
319
  ${this.__renderDisabledReason()}
243
320
  `;
@@ -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
+