@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
@@ -1,10 +1,11 @@
1
1
  import { html, LitElement } from 'lit';
2
2
  import { property } from 'lit/decorators.js';
3
3
  import { classMap } from 'lit/directives/class-map.js';
4
- import IndividualComponent from 'src/IndividualComponent.js';
4
+ import IndividualComponent from '@/IndividualComponent.js';
5
5
  import styles from './button-group.scss';
6
6
  import { Button } from '../button/button.js';
7
7
  import { IconButton } from '../icon-button/icon-button.js';
8
+ import { BaseButton } from '../BaseButton.js';
8
9
 
9
10
  /**
10
11
  * @label Button Group
@@ -15,9 +16,9 @@ import { IconButton } from '../icon-button/icon-button.js';
15
16
 
16
17
  * @example
17
18
  * ```html
18
- * <wc-button-group>
19
- * <wc-icon-button name="home"></wc-icon-button>
20
- * <wc-icon-button name="alarm"></wc-icon-button>
19
+ * <wc-button-group variant="connected">
20
+ * <wc-icon-button name="home" toggle selected></wc-icon-button>
21
+ * <wc-icon-button name="alarm" toggle></wc-icon-button>
21
22
  * </wc-button-group>
22
23
  * ```
23
24
  *
@@ -40,14 +41,130 @@ export class ButtonGroup extends LitElement {
40
41
  */
41
42
  @property() size: 'xs' | 'sm' | 'md' | 'lg' | 'xl' = 'sm';
42
43
 
44
+ /**
45
+ * Layout variant of the button group.
46
+ * `"standard"` shows buttons with a small gap between them.
47
+ * `"connected"` places buttons with a 2px gap; in horizontal orientation outer buttons have fully
48
+ * rounded outer corners and middle buttons keep standard rounded corners. In vertical orientation
49
+ * all buttons keep their default corner shape.
50
+ * Defaults to `"standard"`.
51
+ */
52
+ @property({ reflect: true }) variant: 'standard' | 'connected' = 'standard';
53
+
54
+ /**
55
+ * Orientation of the button group.
56
+ * `"horizontal"` lays buttons out in a row.
57
+ * `"vertical"` stacks buttons in a column.
58
+ * Defaults to `"horizontal"`.
59
+ */
60
+ @property({ reflect: true }) orientation: 'horizontal' | 'vertical' = 'horizontal';
61
+
62
+ /**
63
+ * Color applied to all buttons in the group.
64
+ * Possible values are `"primary"`, `"success"`, `"danger"`, `"warning"`, `"surface"`, `"on-surface"`.
65
+ */
66
+ @property({ reflect: true }) color?: 'primary' | 'success' | 'danger' | 'warning' | 'surface' | 'on-surface';
67
+
68
+ /**
69
+ * Visual style applied to all buttons in the group.
70
+ * Possible values are `"filled"`, `"tonal"`, `"outlined"`.
71
+ */
72
+ @property({ attribute: 'button-variant', reflect: true }) buttonVariant?: 'filled' | 'tonal' | 'outlined';
73
+
74
+ override updated() {
75
+ this._syncChildren();
76
+ }
77
+
78
+ private _getSlottedElements(): HTMLElement[] {
79
+ const slot = this.shadowRoot?.querySelector('slot');
80
+ return (slot?.assignedElements({ flatten: true }) ?? []) as HTMLElement[];
81
+ }
82
+
83
+ private _syncChildren() {
84
+ const children = this._getSlottedElements();
85
+ const isVertical = this.orientation === 'vertical';
86
+
87
+ children.forEach((child, index) => {
88
+ const isFirst = index === 0;
89
+ const isLast = index === children.length - 1;
90
+ const isOnly = children.length === 1;
91
+
92
+ if (this.color && 'color' in child) {
93
+ (child as BaseButton).color = this.color;
94
+ }
95
+
96
+ if (this.buttonVariant && 'variant' in child) {
97
+ (child as BaseButton).variant = this.buttonVariant;
98
+ }
99
+
100
+ if (this.variant === 'connected') {
101
+ child.style.setProperty('--button-container-shape-variant', 'round');
102
+
103
+ if (isOnly) {
104
+ child.style.setProperty('--button-container-shape', 'var(--shape-corner-full)');
105
+ child.style.removeProperty('--button-container-shape-start-start');
106
+ child.style.removeProperty('--button-container-shape-end-start');
107
+ child.style.removeProperty('--button-container-shape-start-end');
108
+ child.style.removeProperty('--button-container-shape-end-end');
109
+ } else if (isFirst) {
110
+ child.style.removeProperty('--button-container-shape');
111
+ if (isVertical) {
112
+ // Top button in vertical group: leave default corner shape
113
+ child.style.removeProperty('--button-container-shape-start-start');
114
+ child.style.removeProperty('--button-container-shape-start-end');
115
+ child.style.removeProperty('--button-container-shape-end-start');
116
+ child.style.removeProperty('--button-container-shape-end-end');
117
+ } else {
118
+ // Left button in horizontal group: round left corners, standard right corners
119
+ child.style.setProperty('--button-container-shape-start-start', 'calc(var(--button-height) / 2)');
120
+ child.style.setProperty('--button-container-shape-end-start', 'calc(var(--button-height) / 2)');
121
+ child.style.setProperty('--button-container-shape-start-end', 'var(--shape-corner-medium)');
122
+ child.style.setProperty('--button-container-shape-end-end', 'var(--shape-corner-medium)');
123
+ }
124
+ } else if (isLast) {
125
+ child.style.removeProperty('--button-container-shape');
126
+ if (isVertical) {
127
+ // Bottom button in vertical group: leave default corner shape
128
+ child.style.removeProperty('--button-container-shape-start-start');
129
+ child.style.removeProperty('--button-container-shape-start-end');
130
+ child.style.removeProperty('--button-container-shape-end-start');
131
+ child.style.removeProperty('--button-container-shape-end-end');
132
+ } else {
133
+ // Right button in horizontal group: standard left corners, round right corners
134
+ child.style.setProperty('--button-container-shape-start-start', 'var(--shape-corner-medium)');
135
+ child.style.setProperty('--button-container-shape-end-start', 'var(--shape-corner-medium)');
136
+ child.style.setProperty('--button-container-shape-start-end', 'calc(var(--button-height) / 2)');
137
+ child.style.setProperty('--button-container-shape-end-end', 'calc(var(--button-height) / 2)');
138
+ }
139
+ } else {
140
+ // Middle buttons: standard rounded corners on all sides
141
+ child.style.setProperty('--button-container-shape', 'var(--shape-corner-medium)');
142
+ child.style.removeProperty('--button-container-shape-start-start');
143
+ child.style.removeProperty('--button-container-shape-end-start');
144
+ child.style.removeProperty('--button-container-shape-start-end');
145
+ child.style.removeProperty('--button-container-shape-end-end');
146
+ }
147
+ } else {
148
+ child.style.removeProperty('--button-container-shape');
149
+ child.style.removeProperty('--button-container-shape-start-start');
150
+ child.style.removeProperty('--button-container-shape-end-start');
151
+ child.style.removeProperty('--button-container-shape-start-end');
152
+ child.style.removeProperty('--button-container-shape-end-end');
153
+ child.style.removeProperty('--button-container-shape-variant');
154
+ }
155
+ });
156
+ }
157
+
43
158
  render() {
44
159
  const cssClasses = {
45
160
  'button-group': true,
46
161
  [`size-${this.size}`]: true,
162
+ [`variant-${this.variant}`]: true,
163
+ [`orientation-${this.orientation}`]: true,
47
164
  };
48
165
  return html`
49
166
  <div class=${classMap(cssClasses)}>
50
- <slot></slot>
167
+ <slot @slotchange=${() => this._syncChildren()}></slot>
51
168
  </div>
52
169
  `;
53
170
  }
@@ -2,36 +2,56 @@
2
2
 
3
3
  .button {
4
4
  --_container-padding: 0.75rem;
5
- width: var(--_button-height);
5
+ width: var(--button-height);
6
6
  --_container-padding: 0;
7
7
  }
8
- .button.size-xs,
9
- .button.size-extra-small {
10
- --_button-height: 2rem;
8
+
9
+ :host([size='xs']),
10
+ :host([size='extra-small']) {
11
+ --button-height: 2rem;
12
+ }
13
+
14
+ :host([size='xs']) .button,
15
+ :host([size='extra-small']) .button {
11
16
  --_button-icon-size: 1rem;
12
17
  }
13
18
 
14
19
 
15
- .button.size-sm,
16
- .button.size-small {
17
- --_button-height: 2.5rem;
20
+ :host([size='sm']),
21
+ :host([size='small']) {
22
+ --button-height: 2.5rem;
23
+ }
24
+
25
+ :host([size='sm']) .button,
26
+ :host([size='small']) .button {
18
27
  --_button-icon-size: 1.25rem;
19
28
  --_button-icon-label-spacing: 0.5rem;
20
29
  }
21
30
 
22
- .button.size-md,
23
- .button.size-medium {
24
- --_button-height: 3.5rem;
31
+ :host([size='md']),
32
+ :host([size='medium']) {
33
+ --button-height: 3.5rem;
34
+ }
35
+
36
+ :host([size='md']) .button,
37
+ :host([size='medium']) .button {
25
38
  --_button-icon-size: 1.5rem;
26
39
  }
27
40
 
28
- .button.size-lg,
29
- .button.size-large {
30
- --_button-height: 6rem;
41
+ :host([size='lg']),
42
+ :host([size='large']) {
43
+ --button-height: 6rem;
44
+ }
45
+
46
+ :host([size='lg']) .button,
47
+ :host([size='large']) .button {
31
48
  --_button-icon-size: 2rem;
32
49
  }
33
50
 
34
- .button.size-xl {
35
- --_button-height: 8.5rem;
51
+ :host([size='xl']) {
52
+ --button-height: 8.5rem;
53
+ }
54
+
55
+ :host([size='xl']) .button {
36
56
  --_button-icon-size: 2.5rem;
37
57
  }
@@ -4,10 +4,10 @@ import { classMap } from 'lit/directives/class-map.js';
4
4
  import styles from '../button/button.scss';
5
5
  import colorStyles from '../button/button-colors.scss';
6
6
  import sizeStyles from './icon-button-sizes.scss';
7
- import { spread } from '../../spread.js';
7
+ import { spread } from '@/__directive/spread.js';
8
+ import { throttle } from '@/__utils/throttle.js';
8
9
  import { BaseButton } from '../BaseButton.js';
9
10
  import { IconProvider } from '../../icon/icon.js';
10
- import { throttle } from '../../utils.js';
11
11
 
12
12
  /**
13
13
  * @label Icon Button
@@ -55,8 +55,6 @@ import { throttle } from '../../utils.js';
55
55
  export class IconButton extends BaseButton {
56
56
  static override styles = [styles, colorStyles, sizeStyles];
57
57
 
58
- #id = crypto.randomUUID();
59
-
60
58
  #tabindex?: number = 0;
61
59
 
62
60
  @property({ type: String, reflect: true }) name?: string;
@@ -65,6 +63,26 @@ export class IconButton extends BaseButton {
65
63
 
66
64
  @property({ type: String }) provider: IconProvider = 'material-symbols';
67
65
 
66
+ override focus() {
67
+ this.buttonElement?.focus();
68
+ }
69
+
70
+ override blur() {
71
+ this.buttonElement?.blur();
72
+ }
73
+
74
+ override connectedCallback() {
75
+ super.connectedCallback();
76
+ this.addEventListener('click', this.__dispatchClickWithThrottle);
77
+ window.addEventListener('mouseup', this.__handlePress);
78
+ }
79
+
80
+ override disconnectedCallback() {
81
+ window.removeEventListener('mouseup', this.__handlePress);
82
+ this.removeEventListener('click', this.__dispatchClickWithThrottle);
83
+ super.disconnectedCallback();
84
+ }
85
+
68
86
  override firstUpdated() {
69
87
  this.__dispatchClickWithThrottle = throttle(
70
88
  this.__dispatchClick,
@@ -97,10 +115,7 @@ export class IconButton extends BaseButton {
97
115
  @mousedown=${this.__handlePress}
98
116
  @keydown=${this.__handlePress}
99
117
  @keyup=${this.__handlePress}
100
- ?aria-describedby=${(this.disabled || this.softDisabled) &&
101
- this.disabledReason
102
- ? `disabled-reason-${this.#id}`
103
- : null}
118
+ aria-describedby=${this.__disabledReasonID}
104
119
  aria-disabled=${`${this.disabled || this.softDisabled}`}
105
120
  ?disabled=${this.disabled}
106
121
  ${spread(this.configAria)}
@@ -120,9 +135,7 @@ export class IconButton extends BaseButton {
120
135
  @keydown=${this.__handlePress}
121
136
  @keyup=${this.__handlePress}
122
137
  role="button"
123
- aria-describedby=${this.disabled && this.disabledReason
124
- ? `disabled-reason-${this.#id}`
125
- : null}
138
+ aria-describedby=${this.__disabledReasonID}
126
139
  aria-disabled=${`${this.disabled}`}
127
140
  ${spread(this.configAria)}
128
141
  >
@@ -133,7 +146,7 @@ export class IconButton extends BaseButton {
133
146
 
134
147
  renderButtonContent() {
135
148
  return html`
136
- <wc-focus-ring class="focus-ring" .control=${this} element="buttonElement"></wc-focus-ring>
149
+ <wc-focus-ring class="focus-ring" .control=${this} .forElement=${this.buttonElement}></wc-focus-ring>
137
150
  <wc-elevation class="elevation"></wc-elevation>
138
151
  <div class="neo-background"></div>
139
152
  <div class="background"></div>
@@ -0,0 +1,10 @@
1
+ :host {
2
+ --filled-card-container-color: var(--color-surface-container-highest);
3
+ --filled-card-label-text-color: var(--color-on-surface);
4
+
5
+ --elevated-card-container-color: var(--color-surface-container-low);
6
+ --elevated-card-label-text-color: var(--color-on-surface);
7
+
8
+ --outlined-card-outline-color: var(--color-outline-variant);
9
+ --outlined-card-label-text-color: var(--color-on-surface);
10
+ }
@@ -0,0 +1,26 @@
1
+ import { LitElement, html, css } from 'lit';
2
+ import IndividualComponent from '../IndividualComponent.js';
3
+
4
+ /**
5
+ * @label Card Content
6
+ * @tag wc-card-content
7
+ * @rawTag card-content
8
+ * @parentRawTag
9
+ *
10
+ * @cssprop --card-content-padding - Inner padding for the card container. Defaults to 1rem.
11
+ *
12
+ * ```
13
+ */
14
+ @IndividualComponent
15
+ export class CardContent extends LitElement {
16
+ static styles = css`
17
+ :host {
18
+ padding-inline: 1rem;
19
+ display: block;
20
+ }
21
+ `;
22
+
23
+ render() {
24
+ return html`<slot></slot>`;
25
+ }
26
+ }
@@ -1,61 +1,241 @@
1
+ @use '../../scss/mixin';
2
+
3
+ @include mixin.base-styles;
4
+
1
5
  :host {
2
6
  display: block;
3
- --card-background: var(--color-surface, #ffffff);
4
- --card-border-color: transparent;
5
- --card-shadow: none;
6
- --card-shape: var(--global-shape-corner-large, 1rem);
7
- --card-padding: 1rem;
8
7
  --card-gap: 0;
8
+ --card-padding: 0;
9
+ --card-container-shape: var(--shape-corner-large);
10
+ --card-container-shape-start-start: unset;
11
+ --card-container-shape-start-end: unset;
12
+ --card-container-shape-end-start: unset;
13
+ --card-container-shape-end-end: unset;
9
14
  }
10
15
 
16
+ /*
17
+ * Reset native button/link styles
18
+ */
11
19
  .card {
12
- display: flex;
13
- flex-direction: column;
14
- gap: var(--card-gap);
15
- background: var(--card-background);
16
- border-radius: var(--card-shape);
17
- border: 1px solid var(--card-border-color);
18
- box-shadow: var(--card-shadow);
19
- color: var(--color-on-surface, inherit);
20
- padding: var(--card-padding);
21
- transition: box-shadow 150ms ease, transform 150ms ease;
20
+ background: transparent;
21
+ border: none;
22
+ appearance: none;
23
+ margin: 0;
24
+ outline: none;
25
+ text-decoration: none;
26
+ text-align: unset;
22
27
  }
23
28
 
24
- :host([variant='elevated']) {
25
- --card-background: var(--color-surface-container-low, #fdfcfe);
26
- --card-shadow: var(--shadow-sm, 0px 1px 3px rgba(16, 24, 40, 0.1), 0px 1px 2px rgba(16, 24, 40, 0.06));
27
- }
29
+ .card {
30
+ position: relative;
31
+ display: flex;
32
+ height: 100%;
33
+ width: 100%;
28
34
 
29
- :host([variant='filled']) {
30
- --card-background: var(--color-surface-container-highest, #f5f5f5);
31
- --card-shadow: none;
32
- }
35
+ --_container-shape-start-start: var(--card-container-shape-start-start, var(--card-container-shape));
36
+ --_container-shape-start-end: var(--card-container-shape-start-end, var(--card-container-shape));
37
+ --_container-shape-end-start: var(--card-container-shape-end-start, var(--card-container-shape));
38
+ --_container-shape-end-end: var(--card-container-shape-end-end, var(--card-container-shape));
33
39
 
34
- :host([variant='outlined']) {
35
- --card-border-color: var(--color-outline, rgba(0, 0, 0, 0.12));
36
- --card-shadow: none;
37
- }
38
40
 
39
- :host([elevation='0']) {
40
- --card-shadow: none;
41
- }
41
+ .card-content {
42
+ z-index: 0;
43
+ width: 100%;
44
+ height: 100%;
45
+ overflow: hidden;
46
+ padding: var(--card-padding);
47
+
48
+ border: 1px solid transparent; /* Fixes overflow issues with border */
49
+ border-start-start-radius: var(--_container-shape-start-start);
50
+ border-start-end-radius: var(--_container-shape-start-end);
51
+ border-end-start-radius: var(--_container-shape-end-start);
52
+ border-end-end-radius: var(--_container-shape-end-end);
53
+
54
+ color: var(--_label-text-color);
55
+ opacity: var(--_label-text-opacity, 1);
56
+ --icon-color: var(--_label-text-color);
57
+
58
+ .slot-container {
59
+ display: flex;
60
+ flex-direction: column;
61
+ gap: var(--card-gap);
62
+ width: 100%;
63
+ height: 100%;
64
+ }
65
+ }
66
+
67
+ /*
68
+ Background layers
69
+ */
70
+ .focus-ring {
71
+ z-index: 2;
72
+ display: none;
73
+ --focus-ring-container-shape-start-start: var(--_container-shape-start-start);
74
+ --focus-ring-container-shape-start-end: var(--_container-shape-start-end);
75
+ --focus-ring-container-shape-end-start: var(--_container-shape-end-start);
76
+ --focus-ring-container-shape-end-end: var(--_container-shape-end-end);
77
+ --focus-ring-container-shape-variant: var(--_container-corner-shape-variant);
78
+ }
79
+
80
+ .ripple {
81
+ display: none;
82
+ border-start-start-radius: var(--_container-shape-start-start);
83
+ border-start-end-radius: var(--_container-shape-start-end);
84
+ border-end-start-radius: var(--_container-shape-end-start);
85
+ border-end-end-radius: var(--_container-shape-end-end);
86
+ corner-shape: var(--_container-corner-shape-variant);
87
+ --ripple-state-opacity: var(--_container-state-opacity, 0);
88
+ --ripple-pressed-color: var(--_container-state-color);
89
+ }
90
+
91
+ .background {
92
+ z-index: 0;
93
+ display: block;
94
+ position: absolute;
95
+ top: 0;
96
+ left: 0;
97
+ width: 100%;
98
+ height: 100%;
99
+ background-color: var(--_container-color);
100
+ opacity: var(--_container-opacity, 1);
101
+
102
+ border-start-start-radius: var(--_container-shape-start-start);
103
+ border-start-end-radius: var(--_container-shape-start-end);
104
+ border-end-start-radius: var(--_container-shape-end-start);
105
+ border-end-end-radius: var(--_container-shape-end-end);
106
+ corner-shape: var(--_container-corner-shape-variant);
107
+ pointer-events: none;
108
+ }
109
+
110
+ .elevation {
111
+ --elevation-level: var(--_container-elevation-level);
112
+ transition-duration: 280ms;
113
+ --elevation-container-shape-start-start: var(--_container-shape-start-start);
114
+ --elevation-container-shape-start-end: var(--_container-shape-start-end);
115
+ --elevation-container-shape-end-start: var(--_container-shape-end-start);
116
+ --elevation-container-shape-end-end: var(--_container-shape-end-end);
117
+ --elevation-container-shape-variant: var(--_container-corner-shape-variant);
118
+ }
119
+
120
+ .outline {
121
+ z-index: 0;
122
+ display: none;
123
+ position: absolute;
124
+ left: 0;
125
+ top: 0;
126
+ width: 100%;
127
+ height: 100%;
128
+ pointer-events: none;
129
+ border: var(--_outline-width) solid var(--_outline-color);
130
+ opacity: var(--_outline-opacity, 1);
131
+ border-start-start-radius: var(--_container-shape-start-start);
132
+ border-start-end-radius: var(--_container-shape-start-end);
133
+ border-end-start-radius: var(--_container-shape-end-start);
134
+ border-end-end-radius: var(--_container-shape-end-end);
135
+ corner-shape: var(--_container-corner-shape-variant);
136
+ }
42
137
 
43
- :host([elevation='1']) {
44
- --card-shadow: var(--shadow-sm, 0px 1px 3px rgba(16, 24, 40, 0.1), 0px 1px 2px rgba(16, 24, 40, 0.06));
45
- }
46
138
 
47
- :host([elevation='2']) {
48
- --card-shadow: var(--shadow-md, 0px 4px 8px -2px rgba(16, 24, 40, 0.1), 0px 2px 4px -2px rgba(16, 24, 40, 0.06));
49
139
  }
50
140
 
51
- :host([elevation='3']) {
52
- --card-shadow: var(--shadow-lg, 0px 12px 16px -4px rgba(16, 24, 40, 0.08), 0px 4px 6px -2px rgba(16, 24, 40, 0.03));
141
+ .card.actionable {
142
+
143
+ .focus-ring,
144
+ .ripple {
145
+ display: block;
146
+ }
147
+
148
+ .card-content {
149
+ pointer-events: none;
150
+ }
53
151
  }
54
152
 
55
- :host([elevation='4']) {
56
- --card-shadow: var(--shadow-xl, 0px 20px 24px -4px rgba(16, 24, 40, 0.08), 0px 8px 8px -4px rgba(16, 24, 40, 0.03));
153
+ .card.variant-elevated {
154
+ --_container-color: var(--elevated-card-container-color);
155
+ --_label-text-color: var(--elevated-card-label-text-color);
156
+ --_container-elevation-level: 1;
157
+
158
+ --_container-state-color: var(--_label-text-color);
159
+
160
+ &:hover:not(:where(.disabled, .soft-disabled, .show-skeleton)) {
161
+ --_container-elevation-level: 2;
162
+ --_container-state-opacity: 0.08;
163
+ }
164
+
165
+ &.pressed:not(:where(.disabled, .soft-disabled, .show-skeleton)) {
166
+ --_container-elevation-level: 1;
167
+ --_container-state-opacity: 0.12;
168
+ }
169
+
170
+ &.disabled {
171
+ --_container-color: var(--color-on-surface);
172
+ --_container-opacity: 0.1;
173
+ --_label-text-color: var(--color-on-surface);
174
+ --_label-text-opacity: 0.38;
175
+
176
+ .ripple {
177
+ display: none;
178
+ }
179
+ }
57
180
  }
58
181
 
59
- :host([elevation='5']) {
60
- --card-shadow: var(--shadow-xxl, 0px 24px 48px -12px rgba(16, 24, 40, 0.18));
182
+
183
+ .card.variant-filled {
184
+ --_container-color: var(--filled-card-container-color);
185
+ --_label-text-color: var(--filled-card-label-text-color);
186
+ --_container-state-color: var(--_label-text-color);
187
+
188
+
189
+ &:hover:not(:where(.disabled, .soft-disabled, .show-skeleton)) {
190
+ --_container-elevation-level: 1;
191
+ --_container-state-opacity: 0.08;
192
+ }
193
+
194
+ &.pressed:not(:where(.disabled, .soft-disabled, .show-skeleton)) {
195
+ --_container-elevation-level: 0;
196
+ --_container-state-opacity: 0.1;
197
+ }
198
+
199
+ &.disabled {
200
+ --_container-color: var(--color-on-surface);
201
+ --_container-opacity: 0.1;
202
+ --_label-text-color: var(--color-on-surface);
203
+ --_label-text-opacity: 0.38;
204
+
205
+ .ripple {
206
+ display: none;
207
+ }
208
+ }
61
209
  }
210
+
211
+
212
+ .card.variant-outlined {
213
+ --_outline-width: var(--outlined-card-outline-width, 0.0675rem);
214
+ --_outline-color: var(--outlined-card-outline-color);
215
+ --_label-text-color: var(--outlined-card-label-text-color);
216
+
217
+ --_container-state-color: var(--_label-text-color);
218
+
219
+ .outline {
220
+ display: block;
221
+ }
222
+
223
+ &:hover:not(:where(.disabled, .soft-disabled, .show-skeleton)) {
224
+ --_container-state-opacity: 0.08;
225
+ }
226
+
227
+ &.pressed:not(:where(.disabled, .soft-disabled, .show-skeleton)) {
228
+ --_container-state-opacity: 0.12;
229
+ }
230
+
231
+ &.disabled {
232
+ --_outline-color: var(--color-on-surface);
233
+ --_label-text-color: var(--color-on-surface);
234
+ --_label-text-opacity: 0.38;
235
+ --_outline-opacity: 0.12;
236
+
237
+ .ripple {
238
+ display: none;
239
+ }
240
+ }
241
+ }