@solid-design-system/components 3.17.12 → 3.19.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (173) hide show
  1. package/dist/components/es/audio.js +1 -0
  2. package/dist/components/es/solid-components2.js +8 -8
  3. package/dist/components/es/wave.js +1 -0
  4. package/dist/components/umd/solid-components.js +17 -16
  5. package/dist/custom-elements.json +1 -1
  6. package/dist/package/components/audio/audio.d.ts +55 -0
  7. package/dist/package/components/audio/audio.js +353 -0
  8. package/dist/package/components/audio/wave.d.ts +38 -0
  9. package/dist/package/components/audio/wave.js +85 -0
  10. package/dist/package/components/icon/library.system.d.ts +3 -0
  11. package/dist/package/components/icon/library.system.js +6 -1
  12. package/dist/package/components/tab-group/tab-group.d.ts +1 -5
  13. package/dist/package/solid-components.d.ts +1 -0
  14. package/dist/package/solid-components.js +86 -84
  15. package/dist/package/styles/tailwind.css.js +1 -1
  16. package/dist/package/translations/de.js +7 -1
  17. package/dist/package/translations/en.js +7 -1
  18. package/dist/package/utilities/localize.d.ts +6 -0
  19. package/dist/styles/solid-styles.css +1 -1
  20. package/dist/versioned-components/es/accordion-group.js +1 -1
  21. package/dist/versioned-components/es/accordion.js +1 -1
  22. package/dist/versioned-components/es/audio.js +1 -0
  23. package/dist/versioned-components/es/badge.js +1 -1
  24. package/dist/versioned-components/es/brandshape.js +1 -1
  25. package/dist/versioned-components/es/button.js +1 -1
  26. package/dist/versioned-components/es/carousel-item.js +1 -1
  27. package/dist/versioned-components/es/carousel.js +3 -3
  28. package/dist/versioned-components/es/checkbox-group.js +1 -1
  29. package/dist/versioned-components/es/checkbox.js +1 -1
  30. package/dist/versioned-components/es/dialog.js +1 -1
  31. package/dist/versioned-components/es/divider.js +1 -1
  32. package/dist/versioned-components/es/drawer.js +1 -1
  33. package/dist/versioned-components/es/dropdown.js +1 -1
  34. package/dist/versioned-components/es/expandable.js +1 -1
  35. package/dist/versioned-components/es/flipcard.js +1 -1
  36. package/dist/versioned-components/es/form.js +1 -1
  37. package/dist/versioned-components/es/header.js +1 -1
  38. package/dist/versioned-components/es/icon.js +1 -1
  39. package/dist/versioned-components/es/include.js +1 -1
  40. package/dist/versioned-components/es/input.js +1 -1
  41. package/dist/versioned-components/es/link.js +1 -1
  42. package/dist/versioned-components/es/map-marker.js +1 -1
  43. package/dist/versioned-components/es/navigation-item.js +1 -1
  44. package/dist/versioned-components/es/notification.js +1 -1
  45. package/dist/versioned-components/es/option.js +1 -1
  46. package/dist/versioned-components/es/quickfact.js +1 -1
  47. package/dist/versioned-components/es/radio-button.js +1 -1
  48. package/dist/versioned-components/es/radio-group.js +1 -1
  49. package/dist/versioned-components/es/radio.js +1 -1
  50. package/dist/versioned-components/es/scrollable.js +1 -1
  51. package/dist/versioned-components/es/select.js +3 -3
  52. package/dist/versioned-components/es/solid-components2.js +8 -8
  53. package/dist/versioned-components/es/spinner.js +1 -1
  54. package/dist/versioned-components/es/step-group.js +1 -1
  55. package/dist/versioned-components/es/step.js +1 -1
  56. package/dist/versioned-components/es/switch.js +1 -1
  57. package/dist/versioned-components/es/tab-group.js +1 -1
  58. package/dist/versioned-components/es/tab-panel.js +1 -1
  59. package/dist/versioned-components/es/tab.js +1 -1
  60. package/dist/versioned-components/es/tag.js +1 -1
  61. package/dist/versioned-components/es/teaser-media.js +1 -1
  62. package/dist/versioned-components/es/teaser.js +1 -1
  63. package/dist/versioned-components/es/textarea.js +1 -1
  64. package/dist/versioned-components/es/tooltip.js +2 -2
  65. package/dist/versioned-components/es/video.js +1 -1
  66. package/dist/versioned-components/es/wave.js +1 -0
  67. package/dist/versioned-package/_components/button-group/button-group.d.ts +1 -1
  68. package/dist/versioned-package/_components/button-group/button-group.js +11 -11
  69. package/dist/versioned-package/components/accordion/accordion.d.ts +1 -1
  70. package/dist/versioned-package/components/accordion/accordion.js +2 -2
  71. package/dist/versioned-package/components/accordion-group/accordion-group.d.ts +1 -1
  72. package/dist/versioned-package/components/accordion-group/accordion-group.js +3 -3
  73. package/dist/versioned-package/components/audio/audio.d.ts +55 -0
  74. package/dist/versioned-package/components/audio/audio.js +353 -0
  75. package/dist/versioned-package/components/audio/wave.d.ts +38 -0
  76. package/dist/versioned-package/components/audio/wave.js +85 -0
  77. package/dist/versioned-package/components/badge/badge.d.ts +1 -1
  78. package/dist/versioned-package/components/badge/badge.js +1 -1
  79. package/dist/versioned-package/components/brandshape/brandshape.d.ts +1 -1
  80. package/dist/versioned-package/components/brandshape/brandshape.js +1 -1
  81. package/dist/versioned-package/components/button/button.d.ts +1 -1
  82. package/dist/versioned-package/components/button/button.js +4 -4
  83. package/dist/versioned-package/components/carousel/carousel.d.ts +1 -1
  84. package/dist/versioned-package/components/carousel/carousel.js +6 -6
  85. package/dist/versioned-package/components/carousel-item/carousel-item.d.ts +1 -1
  86. package/dist/versioned-package/components/carousel-item/carousel-item.js +1 -1
  87. package/dist/versioned-package/components/checkbox/checkbox.d.ts +1 -1
  88. package/dist/versioned-package/components/checkbox/checkbox.js +3 -3
  89. package/dist/versioned-package/components/checkbox-group/checkbox-group.d.ts +1 -1
  90. package/dist/versioned-package/components/checkbox-group/checkbox-group.js +5 -5
  91. package/dist/versioned-package/components/dialog/dialog.d.ts +1 -1
  92. package/dist/versioned-package/components/dialog/dialog.js +2 -2
  93. package/dist/versioned-package/components/divider/divider.d.ts +1 -1
  94. package/dist/versioned-package/components/divider/divider.js +2 -2
  95. package/dist/versioned-package/components/drawer/drawer.d.ts +1 -1
  96. package/dist/versioned-package/components/drawer/drawer.js +2 -2
  97. package/dist/versioned-package/components/dropdown/dropdown.d.ts +1 -1
  98. package/dist/versioned-package/components/dropdown/dropdown.js +8 -8
  99. package/dist/versioned-package/components/expandable/expandable.d.ts +1 -1
  100. package/dist/versioned-package/components/expandable/expandable.js +2 -2
  101. package/dist/versioned-package/components/flipcard/flipcard.d.ts +1 -1
  102. package/dist/versioned-package/components/flipcard/flipcard.js +1 -1
  103. package/dist/versioned-package/components/header/header.d.ts +1 -1
  104. package/dist/versioned-package/components/header/header.js +4 -4
  105. package/dist/versioned-package/components/icon/icon.d.ts +1 -1
  106. package/dist/versioned-package/components/icon/icon.js +1 -1
  107. package/dist/versioned-package/components/icon/library.system.d.ts +3 -0
  108. package/dist/versioned-package/components/icon/library.system.js +6 -1
  109. package/dist/versioned-package/components/include/include.d.ts +1 -1
  110. package/dist/versioned-package/components/include/include.js +1 -1
  111. package/dist/versioned-package/components/input/input.d.ts +1 -1
  112. package/dist/versioned-package/components/input/input.js +2 -2
  113. package/dist/versioned-package/components/link/link.d.ts +1 -1
  114. package/dist/versioned-package/components/link/link.js +2 -2
  115. package/dist/versioned-package/components/map-marker/map-marker.d.ts +1 -1
  116. package/dist/versioned-package/components/map-marker/map-marker.js +1 -1
  117. package/dist/versioned-package/components/navigation-item/navigation-item.d.ts +1 -1
  118. package/dist/versioned-package/components/navigation-item/navigation-item.js +5 -5
  119. package/dist/versioned-package/components/notification/notification.d.ts +1 -1
  120. package/dist/versioned-package/components/notification/notification.js +5 -5
  121. package/dist/versioned-package/components/option/option.d.ts +1 -1
  122. package/dist/versioned-package/components/option/option.js +2 -2
  123. package/dist/versioned-package/components/popup/popup.d.ts +1 -1
  124. package/dist/versioned-package/components/popup/popup.js +1 -1
  125. package/dist/versioned-package/components/quickfact/quickfact.d.ts +1 -1
  126. package/dist/versioned-package/components/quickfact/quickfact.js +2 -2
  127. package/dist/versioned-package/components/radio/radio.d.ts +1 -1
  128. package/dist/versioned-package/components/radio/radio.js +2 -2
  129. package/dist/versioned-package/components/radio-button/radio-button.d.ts +1 -1
  130. package/dist/versioned-package/components/radio-button/radio-button.js +2 -2
  131. package/dist/versioned-package/components/radio-group/radio-group.d.ts +2 -2
  132. package/dist/versioned-package/components/radio-group/radio-group.js +13 -13
  133. package/dist/versioned-package/components/scrollable/scrollable.d.ts +1 -1
  134. package/dist/versioned-package/components/scrollable/scrollable.js +3 -3
  135. package/dist/versioned-package/components/select/select.d.ts +4 -4
  136. package/dist/versioned-package/components/select/select.js +25 -25
  137. package/dist/versioned-package/components/spinner/spinner.d.ts +1 -1
  138. package/dist/versioned-package/components/spinner/spinner.js +1 -1
  139. package/dist/versioned-package/components/step/step.d.ts +1 -1
  140. package/dist/versioned-package/components/step/step.js +2 -2
  141. package/dist/versioned-package/components/step-group/step-group.d.ts +1 -1
  142. package/dist/versioned-package/components/step-group/step-group.js +2 -2
  143. package/dist/versioned-package/components/switch/switch.d.ts +1 -1
  144. package/dist/versioned-package/components/switch/switch.js +1 -1
  145. package/dist/versioned-package/components/tab/tab.d.ts +1 -1
  146. package/dist/versioned-package/components/tab/tab.js +2 -2
  147. package/dist/versioned-package/components/tab-group/tab-group.d.ts +2 -6
  148. package/dist/versioned-package/components/tab-group/tab-group.js +13 -13
  149. package/dist/versioned-package/components/tab-panel/tab-panel.d.ts +1 -1
  150. package/dist/versioned-package/components/tab-panel/tab-panel.js +2 -2
  151. package/dist/versioned-package/components/tag/tag.d.ts +1 -1
  152. package/dist/versioned-package/components/tag/tag.js +2 -2
  153. package/dist/versioned-package/components/teaser/teaser.js +1 -1
  154. package/dist/versioned-package/components/teaser-media/teaser-media.js +1 -1
  155. package/dist/versioned-package/components/textarea/textarea.d.ts +1 -1
  156. package/dist/versioned-package/components/textarea/textarea.js +2 -2
  157. package/dist/versioned-package/components/tooltip/tooltip.d.ts +1 -1
  158. package/dist/versioned-package/components/tooltip/tooltip.js +5 -5
  159. package/dist/versioned-package/components/video/video.d.ts +1 -1
  160. package/dist/versioned-package/components/video/video.js +2 -2
  161. package/dist/versioned-package/internal/form.js +3 -3
  162. package/dist/versioned-package/solid-components.d.ts +1 -0
  163. package/dist/versioned-package/solid-components.js +86 -84
  164. package/dist/versioned-package/styles/headline/headline.css.js +1 -1
  165. package/dist/versioned-package/styles/tailwind.css.js +1 -1
  166. package/dist/versioned-package/translations/de.js +7 -1
  167. package/dist/versioned-package/translations/en.js +7 -1
  168. package/dist/versioned-package/utilities/autocomplete-config.js +4 -4
  169. package/dist/versioned-package/utilities/localize.d.ts +6 -0
  170. package/dist/versioned-styles/solid-styles.css +1 -1
  171. package/dist/vscode.html-custom-data.json +110 -46
  172. package/dist/web-types.json +683 -45
  173. package/package.json +3 -3
@@ -0,0 +1,55 @@
1
+ import { Wave } from './wave';
2
+ import SolidElement from '../../internal/solid-element';
3
+ import type SdDrawer from '../drawer/drawer';
4
+ export default class SdAudio extends SolidElement {
5
+ private readonly localize;
6
+ private readonly hasSlotController;
7
+ reversedLayout: boolean;
8
+ hideTimestamps: boolean;
9
+ animated: boolean;
10
+ inverted: boolean;
11
+ speed: number;
12
+ currentTime: string;
13
+ duration: string;
14
+ isPlaying: boolean;
15
+ isMuted: boolean;
16
+ progress: number;
17
+ progressSlider: HTMLInputElement;
18
+ audioPlayerContainer: HTMLElement;
19
+ drawer: SdDrawer;
20
+ canvas: HTMLCanvasElement;
21
+ context: CanvasRenderingContext2D;
22
+ waveList: Wave[];
23
+ constructor();
24
+ firstUpdated(): void;
25
+ updated(changedProperties: Map<string | number | symbol, unknown>): void;
26
+ private get audioElement();
27
+ private setAudioProgress;
28
+ private updateCurrentTime;
29
+ private updateAudioDuration;
30
+ playAudio(): void;
31
+ pauseAudio(): void;
32
+ handleAudioEnd(): void;
33
+ private toggleMute;
34
+ private toggleMuteKeydown;
35
+ togglePlaybackSpeed(): void;
36
+ private togglePlaybackSpeedKeydown;
37
+ private formatTime;
38
+ private handleAudioProgress;
39
+ private handleAudioProgressKeydown;
40
+ private showTranscript;
41
+ private showTranscriptKeydown;
42
+ private rgbToHex;
43
+ private initAnimation;
44
+ private drawStillWaves;
45
+ private stopAnimation;
46
+ private clear;
47
+ draw(): Promise<void>;
48
+ render(): import("lit-html").TemplateResult<1>;
49
+ static styles: import("lit").CSSResultGroup[];
50
+ }
51
+ declare global {
52
+ interface HTMLElementTagNameMap {
53
+ 'sd-audio': SdAudio;
54
+ }
55
+ }
@@ -0,0 +1,353 @@
1
+ import { unsafeCSS, css, html } from "lit";
2
+ import { customElement } from "../../internal/register-custom-element.js";
3
+ import { HasSlotController } from "../../internal/slot.js";
4
+ import { LocalizeController } from "../../utilities/localize.js";
5
+ import { property, state, query } from "lit/decorators.js";
6
+ import { Wave } from "./wave.js";
7
+ import cx from "classix";
8
+ import InteractiveStyles from "../../styles/interactive/interactive.css.js";
9
+ import SolidElement from "../../internal/solid-element.js";
10
+ var __defProp = Object.defineProperty;
11
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
12
+ var __decorateClass = (decorators, target, key, kind) => {
13
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
14
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
15
+ if (decorator = decorators[i])
16
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
17
+ if (kind && result) __defProp(target, key, result);
18
+ return result;
19
+ };
20
+ let SdAudio = class extends SolidElement {
21
+ constructor() {
22
+ super();
23
+ this.localize = new LocalizeController(this);
24
+ this.hasSlotController = new HasSlotController(this, "transcript");
25
+ this.reversedLayout = false;
26
+ this.hideTimestamps = false;
27
+ this.animated = false;
28
+ this.inverted = false;
29
+ this.speed = 1;
30
+ this.currentTime = this.formatTime(0);
31
+ this.duration = "";
32
+ this.isPlaying = false;
33
+ this.isMuted = false;
34
+ this.progress = 0;
35
+ this.setAudioProgress = () => {
36
+ this.progressSlider.max = Math.floor(this.audioElement.duration).toString();
37
+ };
38
+ this.updateCurrentTime = this.updateCurrentTime.bind(this);
39
+ this.handleAudioEnd = this.handleAudioEnd.bind(this);
40
+ this.handleAudioProgress = this.handleAudioProgress.bind(this);
41
+ this.handleAudioProgressKeydown = this.handleAudioProgressKeydown.bind(this);
42
+ }
43
+ firstUpdated() {
44
+ if (!this.audioElement) return;
45
+ this.audioElement.addEventListener("timeupdate", this.updateCurrentTime);
46
+ this.audioElement.addEventListener("ended", this.handleAudioEnd);
47
+ this.audioElement.setAttribute("controlsList", "nodownload");
48
+ this.audioElement.playbackRate = this.speed;
49
+ if (this.animated) {
50
+ this.initAnimation();
51
+ }
52
+ }
53
+ updated(changedProperties) {
54
+ if (changedProperties.has("animated")) {
55
+ const oldValue = changedProperties.get("animated");
56
+ if (!oldValue && this.animated) {
57
+ this.initAnimation();
58
+ } else if (oldValue && !this.animated) {
59
+ this.clear();
60
+ }
61
+ }
62
+ }
63
+ get audioElement() {
64
+ const slot = this.shadowRoot.querySelector("slot");
65
+ if ((slot == null ? void 0 : slot.assignedElements().length) > 0) {
66
+ return slot.assignedElements()[0];
67
+ }
68
+ return null;
69
+ }
70
+ updateCurrentTime() {
71
+ if (!this.audioElement) return;
72
+ const currentTime = this.audioElement.currentTime;
73
+ this.currentTime = this.formatTime(currentTime);
74
+ this.progress = Math.floor(currentTime);
75
+ if (this.progressSlider) {
76
+ this.progressSlider.value = this.progress.toString();
77
+ }
78
+ }
79
+ updateAudioDuration() {
80
+ if (!this.audioElement) return;
81
+ if (isNaN(this.audioElement.duration)) {
82
+ setTimeout(() => {
83
+ this.updateAudioDuration();
84
+ }, 100);
85
+ return;
86
+ }
87
+ this.duration = this.formatTime(this.audioElement.duration);
88
+ this.setAudioProgress();
89
+ }
90
+ playAudio() {
91
+ if (!this.audioElement) return;
92
+ this.isPlaying = true;
93
+ this.audioElement.play();
94
+ this.emit("sd-playback-start");
95
+ if (this.animated) {
96
+ this.draw();
97
+ }
98
+ }
99
+ pauseAudio() {
100
+ if (!this.audioElement) return;
101
+ this.isPlaying = false;
102
+ this.audioElement.pause();
103
+ this.emit("sd-playback-pause");
104
+ if (this.animated) {
105
+ this.stopAnimation();
106
+ }
107
+ }
108
+ handleAudioEnd() {
109
+ this.emit("sd-playback-end");
110
+ this.isPlaying = false;
111
+ this.progress = 0;
112
+ this.progressSlider.value = "0";
113
+ this.currentTime = this.formatTime(0);
114
+ if (this.animated) {
115
+ this.stopAnimation();
116
+ }
117
+ }
118
+ toggleMute() {
119
+ if (!this.audioElement) return;
120
+ this.isMuted = !this.isMuted;
121
+ if (this.isMuted) {
122
+ this.emit("sd-playback-mute");
123
+ this.audioElement.muted = true;
124
+ } else {
125
+ this.emit("sd-playback-unmute");
126
+ this.audioElement.muted = false;
127
+ }
128
+ }
129
+ toggleMuteKeydown(event) {
130
+ if (event.key === "Enter") {
131
+ event.preventDefault();
132
+ this.toggleMute();
133
+ }
134
+ }
135
+ togglePlaybackSpeed() {
136
+ if (!this.audioElement) return;
137
+ this.emit("sd-playback-speed");
138
+ this.speed = this.speed === 1.5 ? 1 : this.speed + 0.25;
139
+ this.audioElement.playbackRate = this.speed;
140
+ }
141
+ togglePlaybackSpeedKeydown(event) {
142
+ if (event.key === "Enter") {
143
+ event.preventDefault();
144
+ this.togglePlaybackSpeed();
145
+ }
146
+ }
147
+ formatTime(time) {
148
+ const minutes = Math.floor(time / 60);
149
+ const seconds = Math.floor(time % 60);
150
+ return `${minutes}:${seconds < 10 ? "0" : ""}${seconds}`;
151
+ }
152
+ handleAudioProgress() {
153
+ if (!this.audioElement) return;
154
+ const newTime = Number(this.progressSlider.value);
155
+ this.audioElement.currentTime = newTime;
156
+ this.progress = newTime;
157
+ this.currentTime = this.formatTime(newTime);
158
+ }
159
+ handleAudioProgressKeydown(event) {
160
+ if (event.key === "ArrowRight") {
161
+ this.progressSlider.value = (Number(this.progressSlider.value) + 1).toString();
162
+ this.handleAudioProgress();
163
+ }
164
+ if (event.key === "ArrowLeft") {
165
+ this.progressSlider.value = (Number(this.progressSlider.value) - 1).toString();
166
+ this.handleAudioProgress();
167
+ }
168
+ }
169
+ showTranscript() {
170
+ this.emit("sd-transcript-click");
171
+ this.drawer.open = true;
172
+ }
173
+ showTranscriptKeydown(event) {
174
+ if (event.key === "Enter" || event.key === " ") {
175
+ this.showTranscript();
176
+ }
177
+ }
178
+ rgbToHex(rgbString) {
179
+ const result = rgbString.match(/\d+/g);
180
+ if (result && result.length === 3) {
181
+ const r = parseInt(result[0]);
182
+ const g = parseInt(result[1]);
183
+ const b = parseInt(result[2]);
184
+ const valueToHex = (value) => value.toString(16).padStart(2, "0");
185
+ const hex = `#${valueToHex(r)}${valueToHex(g)}${valueToHex(b)}`.toUpperCase();
186
+ return hex;
187
+ }
188
+ return null;
189
+ }
190
+ initAnimation() {
191
+ this.context = this.canvas.getContext("2d");
192
+ const button = this.audioPlayerContainer.querySelector(".playback-speed");
193
+ const computedStyles = window.getComputedStyle(button);
194
+ const color = computedStyles.color;
195
+ let computedColor;
196
+ if (this.inverted) {
197
+ computedColor = `#FFFFFF33`;
198
+ } else {
199
+ computedColor = this.rgbToHex(color) + "33";
200
+ }
201
+ this.waveList = [
202
+ new Wave({
203
+ canvas: this.canvas,
204
+ color: computedColor,
205
+ phase: 240,
206
+ shift: 1.5,
207
+ amplitude: 230,
208
+ frequency: 0.012,
209
+ damping: 1
210
+ }),
211
+ new Wave({
212
+ canvas: this.canvas,
213
+ color: computedColor,
214
+ phase: 180,
215
+ shift: 2.5,
216
+ amplitude: 250,
217
+ frequency: 5e-3,
218
+ damping: 1
219
+ }),
220
+ new Wave({
221
+ canvas: this.canvas,
222
+ color: computedColor,
223
+ phase: 180,
224
+ shift: -2.5,
225
+ amplitude: 250,
226
+ frequency: 5e-3,
227
+ damping: 1
228
+ }),
229
+ new Wave({
230
+ canvas: this.canvas,
231
+ color: computedColor,
232
+ phase: 180,
233
+ shift: -1,
234
+ amplitude: 200,
235
+ frequency: 0.018,
236
+ damping: 1
237
+ }),
238
+ new Wave({
239
+ canvas: this.canvas,
240
+ color: computedColor,
241
+ phase: 180,
242
+ shift: 1.5,
243
+ amplitude: 150,
244
+ frequency: 0.01,
245
+ damping: 1
246
+ })
247
+ ];
248
+ if (this.animated) {
249
+ this.drawStillWaves();
250
+ }
251
+ }
252
+ drawStillWaves() {
253
+ this.waveList.forEach((wave) => {
254
+ wave.redraw();
255
+ });
256
+ }
257
+ stopAnimation() {
258
+ this.isPlaying = false;
259
+ }
260
+ clear() {
261
+ if (!this.context || !this.canvas) return;
262
+ this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
263
+ }
264
+ async draw() {
265
+ if (!this.isPlaying || !this.animated) return;
266
+ this.clear();
267
+ this.waveList.forEach((wave) => {
268
+ wave.redraw();
269
+ });
270
+ await new Promise((resolve) => {
271
+ setTimeout(resolve, 1e3 / 30);
272
+ });
273
+ await this.draw();
274
+ }
275
+ render() {
276
+ const progressPercentage = this.audioElement ? this.progress / this.audioElement.duration * 100 : 0;
277
+ const renderAudioControls = html`<div class="${cx(
278
+ "controls grid grid-cols-3 justify-items-center items-center",
279
+ !this.animated && "relative",
280
+ this.animated && !this.reversedLayout && "absolute -top-4 left-0 w-full",
281
+ this.reversedLayout ? "mt-2" : "mb-2"
282
+ )}" part="audio-controls"><button class="${cx(
283
+ "playback-speed justify-self-start text-base font-bold hover:cursor-pointer sd-interactive",
284
+ this.inverted && "sd-interactive--inverted"
285
+ )}" aria-label="${this.localize.term("playbackSpeed")}" tabindex="0" @click="${this.togglePlaybackSpeed}" @keydown="${this.togglePlaybackSpeedKeydown}" part="playback-speed">${this.speed}x</button><sd-button ?inverted="${this.inverted ? true : false}" part="play-button" size="lg" @click="${!this.isPlaying ? this.playAudio : this.pauseAudio}" aria-label="${this.isPlaying ? this.localize.term("pauseAudio") : this.localize.term("playAudio")}">${this.isPlaying ? html`<sd-icon name="pause" library="system"></sd-icon>` : html`<sd-icon name="start" library="system"></sd-icon>`}</sd-button><div class="flex items-center justify-self-end">${this.hasSlotController.test("transcript") ? html`<button class="${cx(
286
+ "mr-6 w-6 h-6 hover:cursor-pointer sd-interactive",
287
+ this.inverted && "sd-interactive--inverted"
288
+ )}" @click="${this.showTranscript}" @keydown="${this.showTranscriptKeydown}" tab-index="0"><sd-icon class="w-6 h-6" name="transcript" library="system" label="${this.isMuted ? this.localize.term("unmute") : this.localize.term("mute")}"></sd-icon></button>` : null} <button class="${cx("w-6 h-6 hover:cursor-pointer sd-interactive", this.inverted && "sd-interactive--inverted")}" part="volume" aria-label="${this.localize.term("mute")}" tabindex="0" @click="${this.toggleMute}" @keydown="${this.toggleMuteKeydown}"><sd-icon class="w-6 h-6" name="${this.isMuted ? "mute" : "volume"}" library="system"></sd-icon></button></div></div>`;
289
+ const renderTimestamps = html`<div class="${cx(
290
+ "w-full flex justify-between",
291
+ this.reversedLayout ? "mb-2" : "mt-2",
292
+ this.animated && this.reversedLayout && "absolute bottom-0 left-0 mb-2",
293
+ this.animated && !this.reversedLayout && "mt-2"
294
+ )}" part="timestamps"><div class="${cx("current-time text-sm", this.inverted ? "text-primary-400" : "text-neutral-700")}">${this.currentTime}</div><div class="${cx("current-time text-sm", this.inverted ? "text-primary-400" : "text-neutral-700")}">${this.duration}</div></div>`;
295
+ return html`<div class="${cx("w-full flex relative", this.reversedLayout ? "flex-col-reverse" : "flex-col")}" aria-label="${this.localize.term("audioPlayer")}" part="audio-player"><slot @slotchange="${this.updateAudioDuration}"></slot>${!this.animated || this.animated && this.reversedLayout ? renderAudioControls : null}<div class="relative">${this.animated && !this.reversedLayout ? html`${renderAudioControls}` : null} ${this.animated ? html`<canvas class="w-full h-16"></canvas>` : null} ${!this.hideTimestamps && this.animated && this.reversedLayout ? renderTimestamps : null} <input class="${cx(
296
+ "progress-slider bg-primary appearance-none w-full cursor-pointer outline-none h-1 flex items-center sd-interactive",
297
+ this.inverted && "sd-interactive--inverted"
298
+ )}" type="range" max="100" step="0.001" value="${this.progress}" tabindex="0" @input="${this.handleAudioProgress}" @keydown="${this.handleAudioProgressKeydown}" part="progress-slider" style="background:linear-gradient(to right,${this.inverted ? "rgb(var(--sd-color-white, 255 255 255) / 1)" : "rgb(var(--sd-color-primary, 0 53 142) / 1)"} ${progressPercentage}%,${this.animated ? "transparent" : this.inverted ? "rgb(var(--sd-color-primary-400, 153 171 208) / 1)" : "rgb(var(--sd-color-grey-400, 195 195 195) / 1)"} ${progressPercentage}%)"></div>${this.hasSlotController.test("transcript") ? html`<sd-drawer><slot name="transcript"></slot></sd-drawer>` : null} ${!this.hideTimestamps && (!this.animated || !this.reversedLayout) ? renderTimestamps : null}</div>`;
299
+ }
300
+ };
301
+ SdAudio.styles = [
302
+ SolidElement.styles,
303
+ unsafeCSS(InteractiveStyles),
304
+ css`.progress-slider:focus-visible{outline:2px solid transparent;outline-offset:2px}.progress-slider::-webkit-slider-thumb{background-color:currentColor;height:var(--sd-spacing-4,1rem);width:var(--sd-spacing-4,1rem);-webkit-appearance:none;appearance:none;border-radius:var(--sd-border-radius-full,9999px);border-style:none;-webkit-transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.progress-slider:focus-visible::-webkit-slider-thumb{outline-style:solid;outline-offset:2px}.progress-slider::-moz-range-thumb{background-color:currentColor;height:var(--sd-spacing-4,1rem);width:var(--sd-spacing-4,1rem);-moz-appearance:none;appearance:none;border-radius:var(--sd-border-radius-full,9999px);border-style:none;-moz-transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.progress-slider:focus-visible::-moz-range-thumb{outline-style:solid;outline-offset:2px}sd-button::part(base){display:flex;height:var(--sd-spacing-16,4rem);width:var(--sd-spacing-16,4rem);align-items:center;justify-content:center;border-radius:var(--sd-border-radius-full,9999px)}sd-button::part(label){flex-grow:0}`
305
+ ];
306
+ __decorateClass([
307
+ property({ type: Boolean, reflect: true, attribute: "reversed-layout" })
308
+ ], SdAudio.prototype, "reversedLayout", 2);
309
+ __decorateClass([
310
+ property({ type: Boolean, reflect: true, attribute: "hide-timestamps" })
311
+ ], SdAudio.prototype, "hideTimestamps", 2);
312
+ __decorateClass([
313
+ property({ type: Boolean, reflect: true })
314
+ ], SdAudio.prototype, "animated", 2);
315
+ __decorateClass([
316
+ property({ type: Boolean, reflect: true })
317
+ ], SdAudio.prototype, "inverted", 2);
318
+ __decorateClass([
319
+ property({ type: Number })
320
+ ], SdAudio.prototype, "speed", 2);
321
+ __decorateClass([
322
+ state()
323
+ ], SdAudio.prototype, "currentTime", 2);
324
+ __decorateClass([
325
+ state()
326
+ ], SdAudio.prototype, "duration", 2);
327
+ __decorateClass([
328
+ state()
329
+ ], SdAudio.prototype, "isPlaying", 2);
330
+ __decorateClass([
331
+ state()
332
+ ], SdAudio.prototype, "isMuted", 2);
333
+ __decorateClass([
334
+ state()
335
+ ], SdAudio.prototype, "progress", 2);
336
+ __decorateClass([
337
+ query('[part="progress-slider"]')
338
+ ], SdAudio.prototype, "progressSlider", 2);
339
+ __decorateClass([
340
+ query('[part="audio-player"]')
341
+ ], SdAudio.prototype, "audioPlayerContainer", 2);
342
+ __decorateClass([
343
+ query("sd-drawer")
344
+ ], SdAudio.prototype, "drawer", 2);
345
+ __decorateClass([
346
+ query("canvas")
347
+ ], SdAudio.prototype, "canvas", 2);
348
+ SdAudio = __decorateClass([
349
+ customElement("sd-audio")
350
+ ], SdAudio);
351
+ export {
352
+ SdAudio as default
353
+ };
@@ -0,0 +1,38 @@
1
+ export declare class Wave {
2
+ constructor(config: {
3
+ phase: number;
4
+ canvas: HTMLCanvasElement;
5
+ amplitude: number;
6
+ frequency: number;
7
+ color: string;
8
+ shift: number;
9
+ damping: number;
10
+ });
11
+ canvas: HTMLCanvasElement;
12
+ context: CanvasRenderingContext2D | null;
13
+ color: string;
14
+ origin: {
15
+ x: number;
16
+ y: number;
17
+ };
18
+ damping: number;
19
+ lineWidth: number;
20
+ shift: number;
21
+ amplitude: number;
22
+ phase: number;
23
+ frequency: number;
24
+ fixedEnd: boolean;
25
+ fixedStart: boolean;
26
+ gradient: boolean;
27
+ outline: boolean;
28
+ paused: boolean;
29
+ playbackSpeed: number;
30
+ map: (num: number, inMin: number, inMax: number, outMin: number, outMax: number) => number;
31
+ damp: (end: number, x: number, size: number) => number;
32
+ drawPoint(x: number, y: number, color: string): void;
33
+ buildSine(wavelength: number, phase: number, color: string, amplitude: number, frequency: number): void;
34
+ redraw(): void;
35
+ setPlay(): void;
36
+ setPause(): void;
37
+ setPlaybackSpeed(playbackSpeed: number): void;
38
+ }
@@ -0,0 +1,85 @@
1
+ class Wave {
2
+ constructor(config) {
3
+ this.fixedEnd = true;
4
+ this.fixedStart = true;
5
+ this.gradient = false;
6
+ this.outline = false;
7
+ this.map = (num, inMin, inMax, outMin, outMax) => (num - inMin) * (outMax - outMin) / (inMax - inMin) + outMin;
8
+ this.damp = (end, x, size) => {
9
+ const effectiveValue = 1 - x / end;
10
+ return 2 * effectiveValue * (x / end) * size;
11
+ };
12
+ this.canvas = config.canvas;
13
+ this.frequency = config.frequency;
14
+ this.phase = config.phase;
15
+ this.amplitude = config.amplitude;
16
+ this.color = config.color;
17
+ this.shift = config.shift;
18
+ this.lineWidth = 2;
19
+ this.damping = config.damping;
20
+ this.context = this.canvas.getContext("2d");
21
+ this.paused = true;
22
+ this.playbackSpeed = 1;
23
+ this.origin = {
24
+ x: 0,
25
+ y: this.canvas.height
26
+ };
27
+ }
28
+ /**
29
+ * Draw a single point on the canvas
30
+ * Uses arc() method of the context with radius 2
31
+ * Depending on the values of outline, fill and graient flags , it will draw a point on the wave
32
+ * */
33
+ drawPoint(x, y, color) {
34
+ if (!this.context) {
35
+ return;
36
+ }
37
+ const r = this.lineWidth / 2;
38
+ this.context.beginPath();
39
+ if (this.outline) {
40
+ this.context.fillStyle = color;
41
+ this.context.lineWidth = 2;
42
+ this.context.arc(x, y, r, 0, 2 * Math.PI);
43
+ this.context.fill();
44
+ }
45
+ if (this.gradient) {
46
+ const linearGradient = this.context.createLinearGradient(0, 0, 0, this.canvas.height);
47
+ linearGradient.addColorStop(0.1, color);
48
+ linearGradient.addColorStop(1, "transparent");
49
+ this.context.fillStyle = linearGradient;
50
+ } else {
51
+ this.context.fillStyle = color;
52
+ }
53
+ this.context.fillRect(x - r, y - r, r, this.canvas.height - y + r);
54
+ }
55
+ buildSine(wavelength, phase, color, amplitude, frequency) {
56
+ for (let i = this.origin.x, n = this.origin.x + wavelength; i < n; i += 1) {
57
+ const y = amplitude * Math.sin(frequency * (i + phase));
58
+ if (this.fixedStart && this.fixedEnd) {
59
+ this.drawPoint(i, this.origin.y + this.damp(n, i, this.damping) * y, color);
60
+ } else if (this.fixedStart) {
61
+ this.drawPoint(i, this.origin.y + this.map(i, this.origin.x, n, 0, this.damping) * y, color);
62
+ } else if (this.fixedEnd) {
63
+ this.drawPoint(i, this.origin.y + (this.damping - this.map(i, this.origin.x, n, 0, this.damping)) * y, color);
64
+ } else {
65
+ this.drawPoint(i, this.origin.y + y, color);
66
+ }
67
+ }
68
+ }
69
+ redraw() {
70
+ this.phase += this.shift * (this.paused ? 1 : 2 * this.playbackSpeed);
71
+ this.buildSine(this.canvas.width, this.phase, this.color, this.amplitude, this.frequency);
72
+ }
73
+ setPlay() {
74
+ this.paused = false;
75
+ }
76
+ setPause() {
77
+ this.paused = true;
78
+ }
79
+ setPlaybackSpeed(playbackSpeed) {
80
+ this.playbackSpeed = playbackSpeed;
81
+ }
82
+ }
83
+ export {
84
+ Wave
85
+ };
@@ -18,6 +18,9 @@ export declare const icons: {
18
18
  warning: string;
19
19
  'exclamation-circle': string;
20
20
  'magnifying-glass': string;
21
+ transcript: string;
22
+ mute: string;
23
+ volume: string;
21
24
  };
22
25
  declare const systemLibrary: IconLibrary;
23
26
  export default systemLibrary;
@@ -78,7 +78,12 @@ const icons = {
78
78
  "exclamation-circle": `
79
79
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 17C13 17.552 12.552 18 12 18C11.448 18 11 17.552 11 17C11 16.448 11.448 16 12 16C12.552 16 13 16.448 13 17Z"/><path d="M12 6C11.448 6 11 6.448 11 7V13C11 13.552 11.448 14 12 14C12.552 14 13 13.552 13 13V7C13 6.448 12.552 6 12 6Z"/><path d="M12 2C6.477 2 2 6.477 2 12C2 17.523 6.477 22 12 22C17.523 22 22 17.523 22 12C22 6.477 17.523 2 12 2ZM12 20C7.582 20 4 16.418 4 12C4 7.582 7.582 4 12 4C16.418 4 20 7.582 20 12C20 16.418 16.418 20 12 20Z"/></svg>`,
80
80
  "magnifying-glass": `
81
- <svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M21.707 20.293l-6.967-6.96c-0.046-0.046-0.096-0.087-0.15-0.124l-0.004-0.002c0.882-1.162 1.413-2.632 1.413-4.227 0-3.881-3.146-7.027-7.027-7.027s-7.027 3.146-7.027 7.027c0 3.881 3.146 7.027 7.027 7.027 1.594 0 3.065-0.531 4.244-1.426l-0.017 0.013c0.039 0.057 0.081 0.107 0.127 0.153l6.967 6.967c0.181 0.181 0.431 0.292 0.707 0.292s0.526-0.112 0.707-0.292v0c0.183-0.181 0.296-0.432 0.296-0.71s-0.113-0.529-0.296-0.71l-0-0zM9 14c-2.761 0-5-2.239-5-5s2.239-5 5-5c2.761 0 5 2.239 5 5v0c0 2.761-2.239 5-5 5v0z"></path></svg>`
81
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M21.707 20.293l-6.967-6.96c-0.046-0.046-0.096-0.087-0.15-0.124l-0.004-0.002c0.882-1.162 1.413-2.632 1.413-4.227 0-3.881-3.146-7.027-7.027-7.027s-7.027 3.146-7.027 7.027c0 3.881 3.146 7.027 7.027 7.027 1.594 0 3.065-0.531 4.244-1.426l-0.017 0.013c0.039 0.057 0.081 0.107 0.127 0.153l6.967 6.967c0.181 0.181 0.431 0.292 0.707 0.292s0.526-0.112 0.707-0.292v0c0.183-0.181 0.296-0.432 0.296-0.71s-0.113-0.529-0.296-0.71l-0-0zM9 14c-2.761 0-5-2.239-5-5s2.239-5 5-5c2.761 0 5 2.239 5 5v0c0 2.761-2.239 5-5 5v0z"></path></svg>`,
82
+ transcript: `<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"> <path d="M19 22H5a1 1 0 0 1-1-1V3a1 1 0 0 1 1-1h9a1 1 0 0 1 .707.293l5 5c.186.187.293.444.293.707v13a1 1 0 0 1-1 1ZM6 20h12V8.413L13.587 4H6v16Z"/> <path d="M19 10h-6a1 1 0 0 1-1-1V3a1 1 0 1 1 2 0v5h5a1 1 0 1 1 0 2Zm-3 4H8a1 1 0 1 1 0-2h8a1 1 0 1 1 0 2Zm-2 4H8a1 1 0 1 1 0-2h6a1 1 0 1 1 0 2Z"/></svg>`,
83
+ mute: `<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
84
+ <path d="M10.717 4.077a.997.997 0 0 0-1.09.217L5.92 8.001H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.92l3.707 3.707a.997.997 0 0 0 .707.293h.007a.953.953 0 0 0 .382-.079l-.006.002c.365-.154.617-.509.617-.923v-14a1 1 0 0 0-.61-.921l-.007-.002v-.001ZM4 10h1.333v4H4v-4Zm5.333 6.587-2-2V9.414l2-2v9.173Zm12.374-8.96a1 1 0 0 0-1.414 0l-2.96 2.96-2.96-2.96a1 1 0 0 0-1.413 1.414l-.001-.001 2.96 2.96-2.96 2.96a1 1 0 0 0 1.414 1.414l2.96-2.96 2.96 2.96a1 1 0 0 0 1.414-1.414L18.747 12l2.96-2.96a1 1 0 0 0 0-1.414v.001Z"/></svg>`,
85
+ volume: `<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
86
+ <path d="M10.717 4.077a.997.997 0 0 0-1.09.217L5.92 8.001H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.92l3.707 3.707a.997.997 0 0 0 .707.293h.007a.953.953 0 0 0 .382-.079l-.006.002c.365-.154.617-.509.617-.923v-14a1 1 0 0 0-.61-.921l-.007-.002v-.001ZM4 10h1.333v4H4v-4Zm5.333 6.587-2-2V9.414l2-2v9.173Zm9.217-13.48a1 1 0 0 0-.44 1.339l-.003-.006c1.177 2.191 1.876 4.792 1.893 7.555V12a16.365 16.365 0 0 1-1.936 7.638l.043-.088a1.002 1.002 0 0 0 .438 1.331l.006.003c.13.071.285.114.449.117h.001a.999.999 0 0 0 .89-.544l.003-.006c1.312-2.45 2.09-5.357 2.107-8.445v-.005c-.017-3.093-.794-6-2.155-8.549l.048.099a1.001 1.001 0 0 0-1.349-.44l.006-.003-.001-.001Z"/><path d="M14.447 5.167a1 1 0 0 0-.278 1.39l-.002-.004C15.35 8.333 16 10.266 16 12s-.667 3.667-1.833 5.447a1 1 0 0 0 1.664 1.11l.002-.004C17.23 16.45 18 14.12 18 12s-.77-4.45-2.167-6.553a1 1 0 0 0-1.39-.278l.004-.002Z"/></svg>`
82
87
  };
83
88
  const systemLibrary = {
84
89
  name: "system",
@@ -1,6 +1,5 @@
1
1
  import { LocalizeController } from '../../utilities/localize';
2
2
  import SolidElement from '../../internal/solid-element';
3
- import type SdTab from '../tab/tab';
4
3
  export default class SdTabGroup extends SolidElement {
5
4
  localize: LocalizeController;
6
5
  private activeTab?;
@@ -23,10 +22,7 @@ export default class SdTabGroup extends SolidElement {
23
22
  private handleKeyDown;
24
23
  private handleScrollToStart;
25
24
  private handleScrollToEnd;
26
- setActiveTab(tab: SdTab, options?: {
27
- emitEvents?: boolean;
28
- scrollBehavior?: 'auto' | 'smooth';
29
- }): void;
25
+ private setActiveTab;
30
26
  private setAriaLabels;
31
27
  private syncTabsAndPanels;
32
28
  private updateScrollControls;
@@ -1,5 +1,6 @@
1
1
  export { default as SdAccordion } from './components/accordion/accordion';
2
2
  export { default as SdAccordionGroup } from './components/accordion-group/accordion-group';
3
+ export { default as SdAudio } from './components/audio/audio';
3
4
  export { default as SdBadge } from './components/badge/badge';
4
5
  export { default as SdBrandshape } from './components/brandshape/brandshape';
5
6
  export { default as SdButton } from './components/button/button';