ui-svelte 0.2.11 → 0.2.12

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 (204) hide show
  1. package/dist/charts/ArcChart.svelte +9 -13
  2. package/dist/charts/ArcChart.svelte.d.ts +3 -3
  3. package/dist/charts/AreaChart.svelte +347 -118
  4. package/dist/charts/AreaChart.svelte.d.ts +33 -4
  5. package/dist/charts/BarChart.svelte +288 -66
  6. package/dist/charts/BarChart.svelte.d.ts +26 -1
  7. package/dist/charts/Candlestick.svelte +53 -50
  8. package/dist/charts/Candlestick.svelte.d.ts +8 -8
  9. package/dist/charts/LineChart.svelte +391 -91
  10. package/dist/charts/LineChart.svelte.d.ts +26 -3
  11. package/dist/charts/PieChart.svelte +333 -92
  12. package/dist/charts/PieChart.svelte.d.ts +33 -5
  13. package/dist/charts/css/arc-chart.css +3 -3
  14. package/dist/charts/css/area-chart.css +127 -29
  15. package/dist/charts/css/bar-chart.css +114 -8
  16. package/dist/charts/css/candlestick.css +2 -0
  17. package/dist/charts/css/line-chart.css +111 -13
  18. package/dist/charts/css/pie-chart.css +92 -20
  19. package/dist/control/Audio.svelte +86 -44
  20. package/dist/control/Audio.svelte.d.ts +4 -1
  21. package/dist/control/Button.svelte +18 -27
  22. package/dist/control/Button.svelte.d.ts +3 -2
  23. package/dist/control/IconButton.svelte +17 -27
  24. package/dist/control/IconButton.svelte.d.ts +3 -3
  25. package/dist/control/Image.svelte +123 -0
  26. package/dist/control/Image.svelte.d.ts +13 -0
  27. package/dist/control/Record.svelte +144 -98
  28. package/dist/control/Record.svelte.d.ts +2 -1
  29. package/dist/control/ToggleGroup.svelte +22 -8
  30. package/dist/control/ToggleGroup.svelte.d.ts +2 -1
  31. package/dist/control/ToggleTheme.svelte +13 -11
  32. package/dist/control/ToggleTheme.svelte.d.ts +3 -2
  33. package/dist/control/Video.svelte +55 -29
  34. package/dist/control/Video.svelte.d.ts +1 -0
  35. package/dist/control/css/btn.css +200 -152
  36. package/dist/control/css/image.css +56 -0
  37. package/dist/control/css/media.css +95 -30
  38. package/dist/control/css/toggle-group.css +269 -84
  39. package/dist/control/css/video.css +1 -14
  40. package/dist/css/animations.css +5 -9
  41. package/dist/css/base.css +13 -347
  42. package/dist/css/decorations.css +402 -0
  43. package/dist/css/rich-text.css +485 -0
  44. package/dist/css/transitions.css +158 -0
  45. package/dist/css/typography.css +291 -0
  46. package/dist/display/Accordion.svelte +28 -4
  47. package/dist/display/Accordion.svelte.d.ts +2 -1
  48. package/dist/display/Alert.svelte +32 -12
  49. package/dist/display/Alert.svelte.d.ts +2 -3
  50. package/dist/display/Avatar.svelte +23 -18
  51. package/dist/display/Avatar.svelte.d.ts +4 -1
  52. package/dist/display/AvatarGroup.svelte +20 -18
  53. package/dist/display/AvatarGroup.svelte.d.ts +6 -3
  54. package/dist/display/Badge.svelte +11 -4
  55. package/dist/display/Badge.svelte.d.ts +2 -1
  56. package/dist/display/Card.svelte +15 -14
  57. package/dist/display/Card.svelte.d.ts +2 -3
  58. package/dist/display/Carousel.svelte +130 -99
  59. package/dist/display/Carousel.svelte.d.ts +6 -4
  60. package/dist/display/ChatBox.svelte +245 -106
  61. package/dist/display/ChatBox.svelte.d.ts +32 -5
  62. package/dist/display/Chip.svelte +31 -17
  63. package/dist/display/Chip.svelte.d.ts +3 -2
  64. package/dist/display/Code.svelte +6 -3
  65. package/dist/display/Code.svelte.d.ts +1 -0
  66. package/dist/display/Collapsible.svelte +30 -4
  67. package/dist/display/Collapsible.svelte.d.ts +2 -1
  68. package/dist/display/Empty.svelte +37 -3
  69. package/dist/display/Empty.svelte.d.ts +3 -0
  70. package/dist/display/Item.svelte +30 -11
  71. package/dist/display/Item.svelte.d.ts +2 -2
  72. package/dist/display/Map.svelte +488 -0
  73. package/dist/display/Map.svelte.d.ts +44 -0
  74. package/dist/display/Section.svelte +14 -12
  75. package/dist/display/Section.svelte.d.ts +2 -3
  76. package/dist/display/Skeleton.svelte +32 -0
  77. package/dist/display/Skeleton.svelte.d.ts +10 -0
  78. package/dist/display/Table.svelte +94 -132
  79. package/dist/display/Table.svelte.d.ts +10 -1
  80. package/dist/display/css/accordion.css +349 -52
  81. package/dist/display/css/alert.css +18 -25
  82. package/dist/display/css/avatar-group.css +38 -75
  83. package/dist/display/css/avatar.css +139 -121
  84. package/dist/display/css/badge.css +50 -27
  85. package/dist/display/css/card.css +51 -71
  86. package/dist/display/css/carousel.css +25 -5
  87. package/dist/display/css/chat-box.css +158 -26
  88. package/dist/display/css/chip.css +142 -68
  89. package/dist/display/css/code.css +2 -6
  90. package/dist/display/css/collapsible.css +349 -45
  91. package/dist/display/css/divider.css +8 -6
  92. package/dist/display/css/empty.css +7 -0
  93. package/dist/display/css/item.css +311 -89
  94. package/dist/display/css/map.css +164 -0
  95. package/dist/display/css/section.css +78 -33
  96. package/dist/display/css/skeleton.css +58 -0
  97. package/dist/display/css/table.css +320 -189
  98. package/dist/form/Checkbox.svelte +11 -5
  99. package/dist/form/Checkbox.svelte.d.ts +2 -1
  100. package/dist/form/ColorField.svelte +543 -0
  101. package/dist/form/ColorField.svelte.d.ts +29 -0
  102. package/dist/form/ComboBox.svelte +24 -9
  103. package/dist/form/ComboBox.svelte.d.ts +2 -2
  104. package/dist/form/CsvField.svelte +62 -136
  105. package/dist/form/CsvField.svelte.d.ts +2 -2
  106. package/dist/form/DateField.svelte +33 -15
  107. package/dist/form/DateField.svelte.d.ts +2 -1
  108. package/dist/form/DateRange.svelte +436 -0
  109. package/dist/form/DateRange.svelte.d.ts +24 -0
  110. package/dist/form/DragDrop.svelte +348 -0
  111. package/dist/form/DragDrop.svelte.d.ts +32 -0
  112. package/dist/form/Dropzone.svelte +28 -8
  113. package/dist/form/Dropzone.svelte.d.ts +2 -2
  114. package/dist/form/Editor.svelte +626 -0
  115. package/dist/form/Editor.svelte.d.ts +50 -0
  116. package/dist/form/ImageCropper.svelte +291 -61
  117. package/dist/form/ImageCropper.svelte.d.ts +15 -1
  118. package/dist/form/{PasswordStrength.svelte → PasswordField.svelte} +58 -24
  119. package/dist/form/{PasswordStrength.svelte.d.ts → PasswordField.svelte.d.ts} +6 -5
  120. package/dist/form/PhoneField.svelte +26 -14
  121. package/dist/form/PhoneField.svelte.d.ts +4 -3
  122. package/dist/form/PinField.svelte +39 -31
  123. package/dist/form/PinField.svelte.d.ts +3 -3
  124. package/dist/form/RadioGroup.svelte +4 -4
  125. package/dist/form/RadioGroup.svelte.d.ts +1 -1
  126. package/dist/form/Select.svelte +20 -19
  127. package/dist/form/Select.svelte.d.ts +2 -2
  128. package/dist/form/Slider.svelte +4 -2
  129. package/dist/form/Slider.svelte.d.ts +1 -0
  130. package/dist/form/TextField.svelte +16 -7
  131. package/dist/form/TextField.svelte.d.ts +2 -2
  132. package/dist/form/Textarea.svelte +15 -6
  133. package/dist/form/Textarea.svelte.d.ts +2 -2
  134. package/dist/form/Toggle.svelte +1 -1
  135. package/dist/form/css/checkbox.css +18 -2
  136. package/dist/form/css/color-field.css +141 -0
  137. package/dist/form/css/control.css +193 -82
  138. package/dist/form/css/csv-field.css +226 -0
  139. package/dist/form/css/date-range.css +122 -0
  140. package/dist/form/css/date.css +24 -2
  141. package/dist/form/css/drag-drop.css +271 -0
  142. package/dist/form/css/dropzone.css +153 -34
  143. package/dist/form/css/editor.css +367 -0
  144. package/dist/form/css/field.css +4 -0
  145. package/dist/form/css/image-cropper.css +223 -22
  146. package/dist/form/css/radio-group.css +1 -1
  147. package/dist/form/css/select.css +2 -2
  148. package/dist/form/css/slider.css +1 -0
  149. package/dist/form/css/textarea.css +178 -75
  150. package/dist/form/css/toggle.css +3 -3
  151. package/dist/hooks/use-table.svelte.d.ts +1 -0
  152. package/dist/hooks/use-table.svelte.js +6 -0
  153. package/dist/icons/index.d.ts +30 -2
  154. package/dist/icons/index.js +32 -4
  155. package/dist/index.css +16 -1
  156. package/dist/index.d.ts +12 -4
  157. package/dist/index.js +11 -3
  158. package/dist/layout/AppBar.svelte +22 -14
  159. package/dist/layout/AppBar.svelte.d.ts +2 -1
  160. package/dist/layout/Footer.svelte +19 -11
  161. package/dist/layout/Footer.svelte.d.ts +2 -1
  162. package/dist/layout/Provider.svelte +27 -4
  163. package/dist/layout/Provider.svelte.d.ts +3 -1
  164. package/dist/layout/css/app-bar.css +63 -66
  165. package/dist/layout/css/footer.css +62 -65
  166. package/dist/navigation/BottomNav.svelte +41 -13
  167. package/dist/navigation/FooterGroup.svelte +1 -1
  168. package/dist/navigation/NavMenu.svelte +47 -23
  169. package/dist/navigation/NavMenu.svelte.d.ts +29 -0
  170. package/dist/navigation/Pagination.svelte +158 -0
  171. package/dist/navigation/Pagination.svelte.d.ts +18 -0
  172. package/dist/navigation/SideNav.svelte +30 -25
  173. package/dist/navigation/SideNav.svelte.d.ts +2 -3
  174. package/dist/navigation/Tabs.svelte +17 -7
  175. package/dist/navigation/Tabs.svelte.d.ts +2 -2
  176. package/dist/navigation/css/bottom-nav.css +279 -257
  177. package/dist/navigation/css/footer-group.css +1 -1
  178. package/dist/navigation/css/footer-nav.css +1 -1
  179. package/dist/navigation/css/nav-menu.css +332 -106
  180. package/dist/navigation/css/pagination.css +74 -0
  181. package/dist/navigation/css/side-nav.css +515 -75
  182. package/dist/navigation/css/tabs.css +246 -52
  183. package/dist/overlay/Command.svelte +340 -0
  184. package/dist/overlay/Command.svelte.d.ts +24 -25
  185. package/dist/overlay/Drawer.svelte +49 -21
  186. package/dist/overlay/Drawer.svelte.d.ts +2 -2
  187. package/dist/overlay/Dropdown.svelte +3 -3
  188. package/dist/overlay/Modal.svelte +51 -16
  189. package/dist/overlay/Modal.svelte.d.ts +3 -3
  190. package/dist/overlay/Toast.svelte +41 -17
  191. package/dist/overlay/Toast.svelte.d.ts +1 -1
  192. package/dist/overlay/Tooltip.svelte +40 -26
  193. package/dist/overlay/Tooltip.svelte.d.ts +2 -2
  194. package/dist/overlay/css/command.css +80 -0
  195. package/dist/overlay/css/drawer.css +63 -24
  196. package/dist/overlay/css/dropdown.css +1 -1
  197. package/dist/overlay/css/hovercard.css +1 -1
  198. package/dist/overlay/css/modal.css +27 -27
  199. package/dist/overlay/css/toast.css +17 -29
  200. package/dist/overlay/css/tooltip.css +83 -66
  201. package/dist/stores/theme.svelte.js +26 -1
  202. package/dist/stores/toast.svelte.d.ts +4 -4
  203. package/dist/stores/toast.svelte.js +2 -2
  204. package/package.json +1 -1
@@ -1,10 +1,42 @@
1
1
  @layer components {
2
2
  .pie-chart-container {
3
- @apply relative w-full flex flex-col md:flex-row justify-center items-center gap-4;
3
+ @apply relative w-full flex justify-center items-center gap-4;
4
+ }
5
+
6
+ .pie-chart-container.flex-row {
7
+ @apply flex-col md:flex-row;
8
+ }
9
+
10
+ .pie-chart-container.flex-row-reverse {
11
+ @apply flex-col-reverse md:flex-row-reverse;
12
+ }
13
+
14
+ .pie-chart-container.flex-col {
15
+ @apply flex-col;
16
+ }
17
+
18
+ .pie-chart-container.flex-col-reverse {
19
+ @apply flex-col-reverse;
4
20
  }
5
21
 
6
22
  .pie-chart {
7
- @apply relative flex items-center justify-center w-auto h-56 text-on-muted;
23
+ @apply relative flex items-center justify-center w-auto text-on-muted;
24
+ }
25
+
26
+ .pie-chart.is-sm {
27
+ @apply h-[150px];
28
+ }
29
+
30
+ .pie-chart.is-md {
31
+ @apply h-56;
32
+ }
33
+
34
+ .pie-chart.is-lg {
35
+ @apply h-[300px];
36
+ }
37
+
38
+ .pie-chart.is-xl {
39
+ @apply h-[400px];
8
40
  }
9
41
 
10
42
  .pie-chart-svg {
@@ -13,15 +45,34 @@
13
45
 
14
46
  .pie-chart-slice {
15
47
  stroke-width: 2;
16
- @apply cursor-pointer transition-all duration-200 ease-in-out;
48
+ @apply cursor-pointer transition-all duration-300 ease-in-out;
17
49
  transform-origin: center;
18
50
  }
19
51
 
20
- .pie-chart-slice:hover {
52
+ .pie-chart-slice:hover,
53
+ .pie-chart-slice.is-hovered {
21
54
  opacity: 0.8;
22
55
  transform: scale(1.02);
23
56
  }
24
57
 
58
+ .pie-chart-slice.is-selected {
59
+ filter: brightness(1.1);
60
+ transform: scale(1.04);
61
+ }
62
+
63
+ .pie-chart-slice.is-disabled {
64
+ opacity: 0.4;
65
+ cursor: not-allowed;
66
+ }
67
+
68
+ .pie-chart-slice.has-glow {
69
+ filter: drop-shadow(0 0 8px currentColor);
70
+ }
71
+
72
+ .pie-chart-slice.has-glow.is-selected {
73
+ filter: drop-shadow(0 0 12px currentColor) brightness(1.1);
74
+ }
75
+
25
76
  .pie-chart-slice.is-primary {
26
77
  @apply fill-primary stroke-on-primary;
27
78
  }
@@ -53,15 +104,19 @@
53
104
  .pie-chart-slice-label {
54
105
  fill: white;
55
106
  pointer-events: none;
56
- @apply text-xs font-medium;
107
+ @apply font-medium;
57
108
  }
58
109
 
59
110
  .pie-chart-center-value {
60
- @apply fill-on-muted text-2xl font-bold;
111
+ @apply fill-on-muted font-bold;
61
112
  }
62
113
 
63
114
  .pie-chart-center-label {
64
- @apply fill-on-muted text-xs opacity-70;
115
+ @apply fill-on-muted opacity-70;
116
+ }
117
+
118
+ .pie-chart-center-custom {
119
+ @apply flex items-center justify-center w-full h-full text-center;
65
120
  }
66
121
 
67
122
  .pie-chart-tooltip {
@@ -80,61 +135,78 @@
80
135
  }
81
136
 
82
137
  .pie-chart-tooltip-title {
83
- @apply font-semibold mb-1;
138
+ font-weight: 600;
139
+ margin-bottom: 0.25rem;
84
140
  }
85
141
 
86
142
  .pie-chart-tooltip-row {
87
- @apply flex items-center gap-2;
143
+ display: flex;
144
+ align-items: center;
145
+ gap: 0.5rem;
88
146
  }
89
147
 
90
148
  .pie-chart-tooltip-color {
91
- @apply w-2 h-2 rounded-full;
149
+ width: 0.5rem;
150
+ height: 0.5rem;
151
+ border-radius: 50%;
92
152
  }
93
153
 
94
154
  .pie-chart-tooltip-color.is-primary {
95
- @apply bg-primary;
155
+ background: var(--color-primary, #3b82f6);
96
156
  }
97
157
 
98
158
  .pie-chart-tooltip-color.is-secondary {
99
- @apply bg-secondary;
159
+ background: var(--color-secondary, #6366f1);
100
160
  }
101
161
 
102
162
  .pie-chart-tooltip-color.is-success {
103
- @apply bg-success;
163
+ background: var(--color-success, #22c55e);
104
164
  }
105
165
 
106
166
  .pie-chart-tooltip-color.is-info {
107
- @apply bg-info;
167
+ background: var(--color-info, #06b6d4);
108
168
  }
109
169
 
110
170
  .pie-chart-tooltip-color.is-warning {
111
- @apply bg-warning;
171
+ background: var(--color-warning, #f59e0b);
112
172
  }
113
173
 
114
174
  .pie-chart-tooltip-color.is-danger {
115
- @apply bg-danger;
175
+ background: var(--color-danger, #ef4444);
116
176
  }
117
177
 
118
178
  .pie-chart-tooltip-color.is-muted {
119
- @apply bg-muted;
179
+ background: var(--color-muted, #9ca3af);
120
180
  }
121
181
 
122
182
  .pie-chart-tooltip-value {
123
- @apply font-semibold;
183
+ font-weight: 600;
124
184
  }
125
185
 
126
186
  .pie-chart-legend {
127
- @apply flex flex-wrap md:flex-col gap-2 items-center justify-center text-sm text-on-muted text-nowrap;
187
+ @apply flex gap-2 items-center justify-center text-sm text-on-muted text-nowrap;
188
+ }
189
+
190
+ .pie-chart-legend.flex-col {
191
+ @apply flex-wrap md:flex-col;
192
+ }
193
+
194
+ .pie-chart-legend.flex-row {
195
+ @apply flex-row flex-wrap;
128
196
  }
129
197
 
130
198
  .pie-chart-legend-item {
131
- @apply flex items-center gap-2 cursor-pointer transition-opacity duration-200;
199
+ @apply flex items-center gap-2 cursor-pointer transition-opacity duration-300;
132
200
  }
133
201
 
134
202
  .pie-chart-legend-item:hover {
135
203
  @apply opacity-80;
136
204
  }
137
205
 
206
+ .pie-chart-legend-item.is-selected {
207
+ @apply font-semibold;
208
+ }
209
+
138
210
  .pie-chart-legend-color {
139
211
  @apply w-3 h-3 rounded-sm;
140
212
  }
@@ -1,24 +1,26 @@
1
1
  <script lang="ts">
2
- import { Pause24RegularIcon, Play24RegularIcon } from '../icons/index.js';
3
- import { Button, Icon } from '../index.js';
2
+ import { PauseFilledIcon, PlayFilledIcon } from '../icons/index.js';
4
3
  import { cn } from '../utils/class-names.js';
4
+ import IconButton from './IconButton.svelte';
5
+ import Avatar from '../display/Avatar.svelte';
5
6
 
6
7
  type Props = {
7
8
  class?: string;
8
9
  src: string;
9
- variant?:
10
- | 'primary'
11
- | 'secondary'
12
- | 'muted'
13
- | 'outlined'
14
- | 'ghost'
15
- | 'success'
16
- | 'info'
17
- | 'danger'
18
- | 'warning';
10
+ color?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'danger' | 'warning';
11
+ variant?: 'solid' | 'soft';
12
+ avatarSrc?: string;
13
+ subtitle?: string;
19
14
  };
20
15
 
21
- let { class: className, src, variant = 'success' }: Props = $props();
16
+ let {
17
+ class: className,
18
+ src,
19
+ color = 'primary',
20
+ variant = 'soft',
21
+ avatarSrc,
22
+ subtitle
23
+ }: Props = $props();
22
24
 
23
25
  let audio: HTMLAudioElement;
24
26
  let currentTime = $state(0);
@@ -30,7 +32,22 @@
30
32
 
31
33
  const BAR_COUNT = 50;
32
34
 
33
- let baseClasses = $derived(cn('media', variant, className));
35
+ const colors = {
36
+ primary: 'is-primary',
37
+ secondary: 'is-secondary',
38
+ muted: 'is-muted',
39
+ info: 'is-info',
40
+ success: 'is-success',
41
+ warning: 'is-warning',
42
+ danger: 'is-danger'
43
+ };
44
+
45
+ const variants = {
46
+ solid: 'is-solid',
47
+ soft: 'is-soft'
48
+ };
49
+
50
+ let baseClasses = $derived(cn('media', variants[variant], colors[color], className));
34
51
 
35
52
  async function analyzeAudio() {
36
53
  try {
@@ -44,16 +61,24 @@
44
61
  const blockSize = Math.floor(rawData.length / samples);
45
62
  const filteredData: number[] = [];
46
63
 
64
+ const samplesPerBlock = Math.min(blockSize, 500);
65
+ const stride = Math.max(1, Math.floor(blockSize / samplesPerBlock));
66
+
47
67
  for (let i = 0; i < samples; i++) {
48
68
  let sum = 0;
49
- for (let j = 0; j < blockSize; j++) {
50
- sum += Math.abs(rawData[i * blockSize + j]);
69
+ let count = 0;
70
+ const blockStart = i * blockSize;
71
+ const blockEnd = Math.min(blockStart + blockSize, rawData.length);
72
+
73
+ for (let j = blockStart; j < blockEnd; j += stride) {
74
+ sum += Math.abs(rawData[j]);
75
+ count++;
51
76
  }
52
- filteredData.push(sum / blockSize);
77
+ filteredData.push(count > 0 ? sum / count : 0);
53
78
  }
54
79
 
55
80
  const max = Math.max(...filteredData);
56
- waveformData = filteredData.map((value) => (value / max) * 0.8 + 0.2);
81
+ waveformData = filteredData.map((value) => (max > 0 ? (value / max) * 0.8 + 0.2 : 0.5));
57
82
  isAnalyzing = false;
58
83
 
59
84
  await audioContext.close();
@@ -176,33 +201,50 @@
176
201
  <div class={baseClasses}>
177
202
  <audio bind:this={audio} {src}></audio>
178
203
 
179
- <Button onclick={togglePlay} size="md" {variant}>
180
- {#if isPlaying}
181
- <Icon icon={Pause24RegularIcon} />
182
- {:else}
183
- <Icon icon={Play24RegularIcon} />
184
- {/if}
185
- </Button>
186
-
187
- <div
188
- class="media-waveform clickable"
189
- onmousedown={handleMouseDown}
190
- role="slider"
191
- tabindex="0"
192
- aria-label="Posición del audio"
193
- aria-valuenow={Math.round((currentTime / duration) * 100) || 0}
194
- aria-valuemin="0"
195
- aria-valuemax="100"
196
- >
197
- <div class="media-bars">
198
- {#each waveformData as height, i}
199
- {@const progress = duration > 0 ? currentTime / duration : 0}
200
- {@const barPosition = (i + 0.5) / waveformData.length}
201
- {@const isPlayed = barPosition <= progress}
202
- <div class="media-bar" class:active={isPlayed} style="height: {height * 100}%"></div>
203
- {/each}
204
+ <IconButton
205
+ icon={isPlaying ? PauseFilledIcon : PlayFilledIcon}
206
+ size="md"
207
+ variant={variant === 'solid' ? 'soft' : 'solid'}
208
+ {color}
209
+ onclick={togglePlay}
210
+ />
211
+
212
+ <div class="media-content">
213
+ <div
214
+ class="media-waveform"
215
+ onmousedown={handleMouseDown}
216
+ role="slider"
217
+ tabindex="0"
218
+ aria-valuenow={Math.round((currentTime / duration) * 100) || 0}
219
+ aria-valuemin="0"
220
+ aria-valuemax="100"
221
+ >
222
+ <div class="media-bars" class:loading={isAnalyzing} class:loaded={!isAnalyzing}>
223
+ {#if isAnalyzing}
224
+ {#each Array(BAR_COUNT) as _, i}
225
+ {@const placeholderHeight = 0.3 + Math.sin(i * 0.3) * 0.2 + Math.random() * 0.1}
226
+ <div class="media-bar loading" style="height: {placeholderHeight * 100}%"></div>
227
+ {/each}
228
+ {:else}
229
+ {#each waveformData as height, i}
230
+ {@const progress = duration > 0 ? currentTime / duration : 0}
231
+ {@const barPosition = (i + 0.5) / waveformData.length}
232
+ {@const isPlayed = barPosition <= progress}
233
+ <div class="media-bar" class:active={isPlayed} style="height: {height * 100}%"></div>
234
+ {/each}
235
+ {/if}
236
+ </div>
237
+ </div>
238
+
239
+ <div class="media-footer">
240
+ <span class="media-time">{duration > 0 ? formatTime(duration - currentTime) : '0:00'}</span>
241
+ {#if subtitle}
242
+ <span class="media-subtitle">{subtitle}</span>
243
+ {/if}
204
244
  </div>
205
245
  </div>
206
246
 
207
- <span class="media-time">{duration > 0 ? formatTime(duration - currentTime) : '0:00'}</span>
247
+ {#if avatarSrc}
248
+ <Avatar src={avatarSrc} size="lg" />
249
+ {/if}
208
250
  </div>
@@ -1,7 +1,10 @@
1
1
  type Props = {
2
2
  class?: string;
3
3
  src: string;
4
- variant?: 'primary' | 'secondary' | 'muted' | 'outlined' | 'ghost' | 'success' | 'info' | 'danger' | 'warning';
4
+ color?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'danger' | 'warning';
5
+ variant?: 'solid' | 'soft';
6
+ avatarSrc?: string;
7
+ subtitle?: string;
5
8
  };
6
9
  declare const Audio: import("svelte").Component<Props, {}, "">;
7
10
  type Audio = ReturnType<typeof Audio>;
@@ -11,17 +11,9 @@
11
11
  href?: string;
12
12
  target?: '_self' | '_blank' | '_parent' | '_top';
13
13
  type?: 'button' | 'submit' | 'reset';
14
- variant?:
15
- | 'primary'
16
- | 'secondary'
17
- | 'muted'
18
- | 'success'
19
- | 'info'
20
- | 'danger'
21
- | 'warning'
22
- | 'outlined'
23
- | 'ghost';
24
- size?: 'xs' | 'sm' | 'md' | 'lg';
14
+ color?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'danger' | 'warning';
15
+ variant?: 'solid' | 'soft' | 'outlined' | 'ghost' | 'overlay';
16
+ size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
25
17
  class?: string;
26
18
  isLoading?: boolean;
27
19
  startIcon?: IconData;
@@ -37,30 +29,36 @@
37
29
  href,
38
30
  target,
39
31
  type = 'button',
40
- variant = 'primary',
32
+ color = 'primary',
33
+ variant = 'solid',
41
34
  size = 'md',
42
35
  class: className,
43
36
  startIcon,
44
37
  endIcon,
45
38
  isLoading,
46
39
  isWide,
47
- isDisabled,
48
- isSolid
40
+ isDisabled
49
41
  }: Props = $props();
50
42
 
51
- const variantClasses = {
43
+ const colors = {
52
44
  primary: 'is-primary',
53
45
  secondary: 'is-secondary',
54
46
  muted: 'is-muted',
55
47
  success: 'is-success',
56
48
  info: 'is-info',
57
49
  danger: 'is-danger',
58
- warning: 'is-warning',
50
+ warning: 'is-warning'
51
+ };
52
+
53
+ const variants = {
54
+ solid: 'is-solid',
55
+ soft: 'is-soft',
59
56
  outlined: 'is-outlined',
60
- ghost: 'is-ghost'
57
+ ghost: 'is-ghost',
58
+ overlay: 'is-overlay'
61
59
  };
62
60
 
63
- const sizeClasses = {
61
+ const sizes = {
64
62
  xs: 'is-xs',
65
63
  sm: 'is-sm',
66
64
  md: 'is-md',
@@ -69,14 +67,7 @@
69
67
  };
70
68
 
71
69
  let baseClasses = $derived(
72
- cn(
73
- 'btn',
74
- variantClasses[variant],
75
- sizeClasses[size],
76
- isSolid && 'is-solid',
77
- isWide && 'is-wide',
78
- className
79
- )
70
+ cn('btn', variants[variant], sizes[size], colors[color], isWide && 'is-wide', className)
80
71
  );
81
72
  </script>
82
73
 
@@ -84,7 +75,7 @@
84
75
  {#if startIcon}
85
76
  <Icon icon={startIcon} class={cn(isLoading && 'invisible')} />
86
77
  {/if}
87
- <span class:invisible={isLoading}>{@render children()}</span>
78
+ <span class:invisible={isLoading} class="btn-label">{@render children()}</span>
88
79
  {#if endIcon}
89
80
  <Icon icon={endIcon} class={cn(isLoading && 'invisible')} />
90
81
  {/if}
@@ -6,8 +6,9 @@ type Props = {
6
6
  href?: string;
7
7
  target?: '_self' | '_blank' | '_parent' | '_top';
8
8
  type?: 'button' | 'submit' | 'reset';
9
- variant?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'danger' | 'warning' | 'outlined' | 'ghost';
10
- size?: 'xs' | 'sm' | 'md' | 'lg';
9
+ color?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'danger' | 'warning';
10
+ variant?: 'solid' | 'soft' | 'outlined' | 'ghost' | 'overlay';
11
+ size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
11
12
  class?: string;
12
13
  isLoading?: boolean;
13
14
  startIcon?: IconData;
@@ -9,22 +9,13 @@
9
9
  href?: string;
10
10
  target?: '_self' | '_blank' | '_parent' | '_top';
11
11
  type?: 'button' | 'submit' | 'reset';
12
- variant?:
13
- | 'primary'
14
- | 'secondary'
15
- | 'muted'
16
- | 'success'
17
- | 'info'
18
- | 'danger'
19
- | 'warning'
20
- | 'outlined'
21
- | 'ghost';
22
- size?: 'xs' | 'sm' | 'md' | 'lg';
12
+ color?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'danger' | 'warning';
13
+ variant?: 'solid' | 'soft' | 'outlined' | 'ghost' | 'overlay';
14
+ size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
23
15
  class?: string;
24
16
  isLoading?: boolean;
25
17
  icon: IconData;
26
18
  isDisabled?: boolean;
27
- isSolid?: boolean;
28
19
  };
29
20
 
30
21
  const {
@@ -32,28 +23,34 @@
32
23
  href,
33
24
  target,
34
25
  type = 'button',
35
- variant = 'primary',
26
+ color = 'primary',
27
+ variant = 'solid',
36
28
  size = 'md',
37
29
  class: className,
38
30
  icon,
39
31
  isLoading,
40
- isDisabled,
41
- isSolid
32
+ isDisabled
42
33
  }: Props = $props();
43
34
 
44
- const variantClasses = {
35
+ const colors = {
45
36
  primary: 'is-primary',
46
37
  secondary: 'is-secondary',
47
38
  muted: 'is-muted',
48
39
  success: 'is-success',
49
40
  info: 'is-info',
50
41
  danger: 'is-danger',
51
- warning: 'is-warning',
42
+ warning: 'is-warning'
43
+ };
44
+
45
+ const variants = {
46
+ solid: 'is-solid',
47
+ soft: 'is-soft',
52
48
  outlined: 'is-outlined',
53
- ghost: 'is-ghost'
49
+ ghost: 'is-ghost',
50
+ overlay: 'is-overlay'
54
51
  };
55
52
 
56
- const sizeClasses = {
53
+ const sizes = {
57
54
  xs: 'is-xs',
58
55
  sm: 'is-sm',
59
56
  md: 'is-md',
@@ -62,14 +59,7 @@
62
59
  };
63
60
 
64
61
  let baseClasses = $derived(
65
- cn(
66
- 'btn',
67
- 'is-icon',
68
- variantClasses[variant],
69
- sizeClasses[size],
70
- isSolid && 'is-solid',
71
- className
72
- )
62
+ cn('btn', 'is-icon', colors[color], variants[variant], sizes[size], className)
73
63
  );
74
64
  </script>
75
65
 
@@ -4,13 +4,13 @@ type Props = {
4
4
  href?: string;
5
5
  target?: '_self' | '_blank' | '_parent' | '_top';
6
6
  type?: 'button' | 'submit' | 'reset';
7
- variant?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'danger' | 'warning' | 'outlined' | 'ghost';
8
- size?: 'xs' | 'sm' | 'md' | 'lg';
7
+ color?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'danger' | 'warning';
8
+ variant?: 'solid' | 'soft' | 'outlined' | 'ghost' | 'overlay';
9
+ size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
9
10
  class?: string;
10
11
  isLoading?: boolean;
11
12
  icon: IconData;
12
13
  isDisabled?: boolean;
13
- isSolid?: boolean;
14
14
  };
15
15
  declare const IconButton: import("svelte").Component<Props, {}, "">;
16
16
  type IconButton = ReturnType<typeof IconButton>;