@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
@@ -15,6 +15,17 @@
15
15
  touch-action: none; // Prevent scrolling while dragging
16
16
  }
17
17
 
18
+ .slider {
19
+ display: flex;
20
+ align-items: center;
21
+ gap: var(--spacing-100, 0.5rem);
22
+ width: 100%;
23
+ }
24
+
25
+ .slider.with-value .slider-container {
26
+ flex: 1;
27
+ }
28
+
18
29
  .slider-container {
19
30
  position: relative;
20
31
  display: flex;
@@ -29,6 +40,14 @@
29
40
  }
30
41
  }
31
42
 
43
+ .value-display {
44
+ min-width: 2.25rem;
45
+ text-align: end;
46
+ color: var(--color-on-surface-variant);
47
+ font-size: 0.875rem;
48
+ font-weight: 500;
49
+ }
50
+
32
51
  .track {
33
52
  position: absolute;
34
53
  width: 100%;
@@ -42,7 +61,6 @@
42
61
  position: absolute;
43
62
  height: 100%;
44
63
  background-color: var(--_active-track-color);
45
- transition: width 0.1s ease-out;
46
64
  will-change: width;
47
65
  }
48
66
  }
@@ -51,9 +51,15 @@ export class Slider extends LitElement {
51
51
  */
52
52
  @property({ type: Boolean }) labeled = true;
53
53
 
54
+ /**
55
+ * Whether to show the current value beside the slider.
56
+ */
57
+ @property({ type: Boolean, attribute: 'show-value' }) showValue = false;
58
+
54
59
  @state() private isDragging = false;
55
60
 
56
61
  @query('.slider-container') private container!: HTMLElement;
62
+
57
63
  @query('.thumb') private thumbElement!: HTMLElement;
58
64
 
59
65
  private handleInput(event: MouseEvent | TouchEvent) {
@@ -150,28 +156,33 @@ export class Slider extends LitElement {
150
156
  const percentage = ((this.value - this.min) / (this.max - this.min)) * 100;
151
157
 
152
158
  return html`
153
- <div
154
- class="slider-container ${this.disabled ? 'disabled' : ''}"
155
- @mousedown=${this.onMouseDown}
156
- @touchstart=${this.onMouseDown}
157
- >
158
- <div class="track">
159
- <div class="track-active" style=${styleMap({ width: `${percentage}%` })}></div>
160
- </div>
161
-
159
+ <div class="slider ${this.showValue ? 'with-value' : ''}">
162
160
  <div
163
- class="thumb"
164
- role="slider"
165
- tabindex="${this.disabled ? -1 : 0}"
166
- aria-valuemin=${this.min}
167
- aria-valuemax=${this.max}
168
- aria-valuenow=${this.value}
169
- aria-disabled=${this.disabled}
170
- style=${styleMap({ left: `calc(${percentage}% - var(--thumb-half))` })}
171
- @keydown=${this.handleKeyDown}
161
+ class="slider-container ${this.disabled ? 'disabled' : ''}"
162
+ @mousedown=${this.onMouseDown}
163
+ @touchstart=${this.onMouseDown}
172
164
  >
173
- ${this.labeled ? html`<div class="value-label">${this.value}</div>` : ''}
165
+ <div class="track">
166
+ <div class="track-active" style=${styleMap({ width: `${percentage}%` })}></div>
167
+ </div>
168
+
169
+ <div
170
+ class="thumb"
171
+ role="slider"
172
+ aria-label="Slider"
173
+ tabindex="${this.disabled ? -1 : 0}"
174
+ aria-valuemin=${this.min}
175
+ aria-valuemax=${this.max}
176
+ aria-valuenow=${this.value}
177
+ aria-disabled=${this.disabled}
178
+ style=${styleMap({ left: `calc(${percentage}% - var(--thumb-half))` })}
179
+ @keydown=${this.handleKeyDown}
180
+ >
181
+ ${this.labeled ? html`<div class="value-label">${this.value}</div>` : ''}
182
+ </div>
174
183
  </div>
184
+
185
+ ${this.showValue ? html`<output class="value-display" aria-live="polite">${this.value}</output>` : ''}
175
186
  </div>
176
187
  `;
177
188
  }
@@ -2,10 +2,38 @@
2
2
 
3
3
  @include mixin.base-styles;
4
4
 
5
+ @keyframes snackbar-enter {
6
+ from {
7
+ opacity: 0;
8
+ transform: translateY(0.5rem);
9
+ }
10
+
11
+ to {
12
+ opacity: 1;
13
+ transform: translateY(0);
14
+ }
15
+ }
16
+
17
+ @keyframes snackbar-exit {
18
+ from {
19
+ opacity: 1;
20
+ transform: translateY(0);
21
+ }
22
+
23
+ to {
24
+ opacity: 0;
25
+ transform: translateY(0.5rem);
26
+ }
27
+ }
28
+
5
29
  :host {
6
- display: inline-flex;
7
- max-width: 42rem;
8
- min-width: 21.5rem;
30
+ display: flex;
31
+ inset-block-end: calc(var(--snackbar-offset-bottom, 1rem) + env(safe-area-inset-bottom, 0px));
32
+ inset-inline: var(--snackbar-offset-inline, 1rem);
33
+ justify-content: center;
34
+ pointer-events: none;
35
+ position: fixed;
36
+ z-index: var(--snackbar-z-index, 1000);
9
37
 
10
38
  --snackbar-container-color: var(--color-inverse-surface);
11
39
  --snackbar-label-text-color: var(--color-inverse-on-surface);
@@ -20,54 +48,57 @@
20
48
  background-color: var(--snackbar-container-color);
21
49
  border-radius: var(--snackbar-border-radius);
22
50
  color: var(--snackbar-label-text-color);
23
- display: inline-flex;
51
+ display: none;
24
52
  gap: var(--spacing-100);
53
+ max-width: min(42rem, 100%);
54
+ min-width: min(21.5rem, 100%);
25
55
  min-height: 3rem;
26
- opacity: 0;
27
56
  padding: var(--spacing-100) var(--spacing-200);
28
57
  pointer-events: none;
29
- transform: translateY(0.5rem);
30
- transition: opacity var(--duration-short2) var(--easing-standard),
31
- transform var(--duration-short2) var(--easing-standard);
32
58
  }
33
59
 
34
60
  .snackbar.open {
35
- opacity: 1;
61
+ animation: snackbar-enter var(--duration-medium1, 300ms) var(--easing-standard, cubic-bezier(0.2, 0, 0, 1)) both;
62
+ display: inline-flex;
36
63
  pointer-events: auto;
37
- transform: translateY(0);
64
+ }
65
+
66
+ .snackbar.open.dismissing {
67
+ animation: snackbar-exit var(--duration-short2, 150ms) var(--easing-standard, cubic-bezier(0.2, 0, 0, 1)) forwards;
68
+ pointer-events: none;
38
69
  }
39
70
 
40
71
  .label {
41
72
  flex: 1 1 auto;
42
73
  color: inherit;
43
- }
44
-
45
- .action,
46
- .close {
47
- @include mixin.get-typography(label-large);
74
+ min-height: 32px;
48
75
  align-items: center;
49
- background: transparent;
50
- border: none;
51
- color: var(--snackbar-action-text-color);
52
- cursor: pointer;
53
- display: inline-flex;
54
- justify-content: center;
55
- margin: 0;
56
- min-height: 2rem;
57
- min-width: 2rem;
58
- padding: 0 var(--spacing-100);
76
+ display: flex;
59
77
  }
60
78
 
61
- .close {
62
- color: var(--snackbar-close-icon-color);
63
- padding: 0;
79
+ .action {
80
+ --text-button-label-text-color: var(--snackbar-action-text-color);
64
81
  }
65
82
 
66
- .close wc-icon {
67
- --icon-size: 1.125rem;
68
- color: inherit;
83
+ .close {
84
+ --text-button-label-text-color: var(--snackbar-close-icon-color);
69
85
  }
70
86
 
71
87
  .snackbar.multiline {
72
88
  align-items: flex-start;
89
+
90
+ .label {
91
+ height: 100%;
92
+ }
73
93
  }
94
+
95
+ :host([preview]) {
96
+ position: relative;
97
+ inset-inline: unset;
98
+ inset-block-end: unset;
99
+
100
+ .snackbar {
101
+ display: inline-flex;
102
+ pointer-events: auto;
103
+ }
104
+ }
@@ -1,5 +1,5 @@
1
1
  import { LitElement, html, nothing } from 'lit';
2
- import { property } from 'lit/decorators.js';
2
+ import { property, state } from 'lit/decorators.js';
3
3
  import { classMap } from 'lit/directives/class-map.js';
4
4
  import styles from './snackbar.scss';
5
5
 
@@ -16,16 +16,23 @@ type SnackbarCloseReason = 'timeout' | 'dismiss' | 'action' | 'programmatic';
16
16
  * @cssprop --snackbar-action-text-color - Action text color.
17
17
  * @cssprop --snackbar-close-icon-color - Close icon color.
18
18
  * @cssprop --snackbar-border-radius - Border radius of the snackbar surface.
19
+ * @cssprop --snackbar-offset-inline - Inline offset from viewport edges.
20
+ * @cssprop --snackbar-offset-bottom - Bottom offset from viewport edge.
21
+ * @cssprop --snackbar-z-index - Stacking order for the snackbar.
19
22
  *
20
23
  * @example
21
24
  * ```html
22
- * <wc-snackbar open message="Message archived" action-label="Undo"></wc-snackbar>
25
+ * <wc-snackbar preview message="Message archived" action-label="Undo"></wc-snackbar>
23
26
  * ```
24
27
  * @tags display, feedback
25
28
  */
26
29
  export class Snackbar extends LitElement {
27
30
  static styles = [styles];
28
31
 
32
+ private static readonly GLOBAL_OPEN_EVENT = 'wc-snackbar-will-open';
33
+
34
+ private static readonly EXIT_ANIMATION_MS = 180;
35
+
29
36
  @property({ type: Boolean, reflect: true }) open = false;
30
37
 
31
38
  @property({ type: String }) message = '';
@@ -39,10 +46,41 @@ export class Snackbar extends LitElement {
39
46
 
40
47
  @property({ type: Boolean, reflect: true }) multiline = false;
41
48
 
49
+ @property({ type: Boolean, reflect: true }) preview = false;
50
+
51
+ @state() private dismissing = false;
52
+
53
+
42
54
  private hideTimer: ReturnType<typeof setTimeout> | null = null;
43
55
 
56
+ private exitTimer: ReturnType<typeof setTimeout> | null = null;
57
+
58
+ private readonly handleGlobalSnackbarOpen = (
59
+ event: Event,
60
+ ) => {
61
+ const { source } = (event as CustomEvent<{ source?: Snackbar }>).detail;
62
+ if (source && source !== this) {
63
+ this.hide();
64
+ }
65
+ };
66
+
67
+ connectedCallback() {
68
+ super.connectedCallback();
69
+ document.addEventListener(
70
+ Snackbar.GLOBAL_OPEN_EVENT,
71
+ this.handleGlobalSnackbarOpen,
72
+ );
73
+ }
74
+
44
75
  show() {
45
- this.open = true;
76
+ this.dismissing = false;
77
+ this.clearExitTimer();
78
+ if (!this.open) {
79
+ this.open = true;
80
+ return;
81
+ }
82
+
83
+ this.scheduleAutoHide();
46
84
  }
47
85
 
48
86
  hide() {
@@ -50,11 +88,17 @@ export class Snackbar extends LitElement {
50
88
  }
51
89
 
52
90
  private close(reason: SnackbarCloseReason) {
53
- if (!this.open) {
91
+ if (!this.open || this.dismissing) {
54
92
  return;
55
93
  }
56
94
 
57
- this.open = false;
95
+ this.clearTimer();
96
+ this.dismissing = true;
97
+ this.clearExitTimer();
98
+ this.exitTimer = setTimeout(() => {
99
+ this.completeDismiss();
100
+ }, Snackbar.EXIT_ANIMATION_MS);
101
+
58
102
  this.dispatchEvent(
59
103
  new CustomEvent('snackbar-close', {
60
104
  detail: { reason },
@@ -64,6 +108,12 @@ export class Snackbar extends LitElement {
64
108
  );
65
109
  }
66
110
 
111
+ private completeDismiss() {
112
+ this.clearExitTimer();
113
+ this.dismissing = false;
114
+ this.open = false;
115
+ }
116
+
67
117
  private dispatchActionEvent() {
68
118
  this.dispatchEvent(
69
119
  new CustomEvent('snackbar-action', {
@@ -89,6 +139,19 @@ export class Snackbar extends LitElement {
89
139
  }
90
140
  }
91
141
 
142
+ private clearExitTimer() {
143
+ if (this.exitTimer !== null) {
144
+ clearTimeout(this.exitTimer);
145
+ this.exitTimer = null;
146
+ }
147
+ }
148
+
149
+ private handleAnimationEnd(event: AnimationEvent) {
150
+ if (event.animationName === 'snackbar-exit' && this.dismissing) {
151
+ this.completeDismiss();
152
+ }
153
+ }
154
+
92
155
  private scheduleAutoHide() {
93
156
  this.clearTimer();
94
157
  if (!this.open || this.duration <= 0) {
@@ -102,11 +165,24 @@ export class Snackbar extends LitElement {
102
165
 
103
166
  protected updated(changedProperties: Map<string, unknown>) {
104
167
  if (changedProperties.has('open')) {
168
+ if (this.open) {
169
+ document.dispatchEvent(
170
+ new CustomEvent(Snackbar.GLOBAL_OPEN_EVENT, {
171
+ detail: { source: this },
172
+ }),
173
+ );
174
+ }
175
+
105
176
  this.scheduleAutoHide();
106
177
  }
107
178
  }
108
179
 
109
180
  disconnectedCallback() {
181
+ document.removeEventListener(
182
+ Snackbar.GLOBAL_OPEN_EVENT,
183
+ this.handleGlobalSnackbarOpen,
184
+ );
185
+ this.clearExitTimer();
110
186
  this.clearTimer();
111
187
  super.disconnectedCallback();
112
188
  }
@@ -119,31 +195,35 @@ export class Snackbar extends LitElement {
119
195
  <div
120
196
  class=${classMap({
121
197
  snackbar: true,
122
- open: this.open,
198
+ open: !this.preview && this.open,
199
+ preview: this.preview,
200
+ dismissing: this.dismissing,
123
201
  multiline: this.multiline,
124
202
  })}
125
203
  role=${liveRole}
126
204
  aria-live="polite"
205
+ @animationend=${this.handleAnimationEnd}
127
206
  >
128
207
  <div class="label">
129
208
  <slot>${this.message}</slot>
130
209
  </div>
131
210
 
132
211
  ${this.actionLabel
133
- ? html`<button class="action" type="button" @click=${this.handleActionClick}>
212
+ ? html`<wc-button class="action" variant='text' size='small' @click=${this.handleActionClick}>
134
213
  ${this.actionLabel}
135
- </button>`
214
+ </wc-button>`
136
215
  : nothing}
137
216
 
138
217
  ${this.showCloseIcon
139
- ? html`<button
218
+ ? html`<wc-icon-button
140
219
  class="close"
141
- type="button"
220
+ variant='text'
221
+ size='small'
142
222
  aria-label="Dismiss notification"
143
223
  @click=${this.handleCloseClick}
224
+ name="close"
144
225
  >
145
- <wc-icon name="close"></wc-icon>
146
- </button>`
226
+ </wc-icon-button>`
147
227
  : nothing}
148
228
  </div>
149
229
  `;
@@ -1,7 +1,9 @@
1
1
  import { html, 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 { spread } from '../spread.js';
4
+
5
+ import { spread } from '@/__directive/spread.js';
6
+
5
7
  import styles from './switch.scss';
6
8
  import BaseInput from '../input/BaseInput.js';
7
9
 
@@ -2,7 +2,9 @@ import { html, LitElement, nothing } from 'lit';
2
2
  import { property, state } from 'lit/decorators.js';
3
3
  import { classMap } from 'lit/directives/class-map.js';
4
4
  import { unsafeHTML } from 'lit/directives/unsafe-html.js';
5
- import { throttle } from '../utils.js';
5
+
6
+ import { throttle } from '@/__utils/throttle.js';
7
+
6
8
  import styles from './table.scss';
7
9
 
8
10
  const DEFAULT_CELL_WIDTH = 16; // in rem
@@ -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);