ui-svelte 0.2.11 → 0.2.13

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 (225) hide show
  1. package/README.md +2 -2
  2. package/dist/charts/ArcChart.svelte +9 -14
  3. package/dist/charts/ArcChart.svelte.d.ts +3 -3
  4. package/dist/charts/AreaChart.svelte +347 -118
  5. package/dist/charts/AreaChart.svelte.d.ts +33 -4
  6. package/dist/charts/BarChart.svelte +288 -66
  7. package/dist/charts/BarChart.svelte.d.ts +26 -1
  8. package/dist/charts/Candlestick.svelte +53 -50
  9. package/dist/charts/Candlestick.svelte.d.ts +8 -8
  10. package/dist/charts/LineChart.svelte +391 -91
  11. package/dist/charts/LineChart.svelte.d.ts +26 -3
  12. package/dist/charts/PieChart.svelte +333 -92
  13. package/dist/charts/PieChart.svelte.d.ts +33 -5
  14. package/dist/charts/css/arc-chart.css +3 -3
  15. package/dist/charts/css/area-chart.css +127 -29
  16. package/dist/charts/css/bar-chart.css +114 -8
  17. package/dist/charts/css/candlestick.css +2 -0
  18. package/dist/charts/css/line-chart.css +111 -13
  19. package/dist/charts/css/pie-chart.css +92 -20
  20. package/dist/control/Audio.svelte +86 -44
  21. package/dist/control/Audio.svelte.d.ts +4 -1
  22. package/dist/control/Button.svelte +18 -27
  23. package/dist/control/Button.svelte.d.ts +3 -2
  24. package/dist/control/Fab.svelte +103 -0
  25. package/dist/control/Fab.svelte.d.ts +25 -0
  26. package/dist/control/IconButton.svelte +17 -27
  27. package/dist/control/IconButton.svelte.d.ts +3 -3
  28. package/dist/control/Image.svelte +123 -0
  29. package/dist/control/Image.svelte.d.ts +13 -0
  30. package/dist/control/Record.svelte +141 -98
  31. package/dist/control/Record.svelte.d.ts +2 -1
  32. package/dist/control/ToggleGroup.svelte +22 -8
  33. package/dist/control/ToggleGroup.svelte.d.ts +2 -1
  34. package/dist/control/ToggleTheme.svelte +13 -11
  35. package/dist/control/ToggleTheme.svelte.d.ts +3 -2
  36. package/dist/control/Video.svelte +57 -29
  37. package/dist/control/Video.svelte.d.ts +1 -0
  38. package/dist/control/css/btn.css +200 -152
  39. package/dist/control/css/fab.css +84 -0
  40. package/dist/control/css/image.css +56 -0
  41. package/dist/control/css/media.css +95 -30
  42. package/dist/control/css/toggle-group.css +253 -84
  43. package/dist/control/css/video.css +1 -14
  44. package/dist/css/animations.css +5 -9
  45. package/dist/css/base.css +13 -347
  46. package/dist/css/decorations.css +561 -0
  47. package/dist/css/rich-text.css +485 -0
  48. package/dist/css/transitions.css +158 -0
  49. package/dist/css/typography.css +291 -0
  50. package/dist/css/utilities.css +0 -4
  51. package/dist/display/Accordion.svelte +28 -4
  52. package/dist/display/Accordion.svelte.d.ts +2 -1
  53. package/dist/display/Alert.svelte +32 -12
  54. package/dist/display/Alert.svelte.d.ts +2 -3
  55. package/dist/display/Avatar.svelte +23 -18
  56. package/dist/display/Avatar.svelte.d.ts +4 -1
  57. package/dist/display/AvatarGroup.svelte +20 -18
  58. package/dist/display/AvatarGroup.svelte.d.ts +6 -3
  59. package/dist/display/Badge.svelte +11 -4
  60. package/dist/display/Badge.svelte.d.ts +2 -1
  61. package/dist/display/Card.svelte +15 -14
  62. package/dist/display/Card.svelte.d.ts +2 -3
  63. package/dist/display/Carousel.svelte +130 -99
  64. package/dist/display/Carousel.svelte.d.ts +6 -4
  65. package/dist/display/ChatBox.svelte +245 -106
  66. package/dist/display/ChatBox.svelte.d.ts +32 -5
  67. package/dist/display/Chip.svelte +31 -17
  68. package/dist/display/Chip.svelte.d.ts +3 -2
  69. package/dist/display/Code.svelte +7 -4
  70. package/dist/display/Code.svelte.d.ts +1 -0
  71. package/dist/display/Collapsible.svelte +30 -4
  72. package/dist/display/Collapsible.svelte.d.ts +2 -1
  73. package/dist/display/Countdown.svelte +169 -0
  74. package/dist/display/Countdown.svelte.d.ts +21 -0
  75. package/dist/display/Empty.svelte +37 -3
  76. package/dist/display/Empty.svelte.d.ts +3 -0
  77. package/dist/display/Item.svelte +42 -11
  78. package/dist/display/Item.svelte.d.ts +4 -2
  79. package/dist/display/Map.svelte +488 -0
  80. package/dist/display/Map.svelte.d.ts +44 -0
  81. package/dist/display/Marquee.svelte +0 -2
  82. package/dist/display/Section.svelte +14 -12
  83. package/dist/display/Section.svelte.d.ts +2 -3
  84. package/dist/display/Skeleton.svelte +32 -0
  85. package/dist/display/Skeleton.svelte.d.ts +10 -0
  86. package/dist/display/Table.svelte +94 -132
  87. package/dist/display/Table.svelte.d.ts +10 -1
  88. package/dist/display/css/accordion.css +349 -52
  89. package/dist/display/css/alert.css +38 -18
  90. package/dist/display/css/avatar-group.css +38 -75
  91. package/dist/display/css/avatar.css +139 -121
  92. package/dist/display/css/badge.css +50 -27
  93. package/dist/display/css/card.css +123 -71
  94. package/dist/display/css/carousel.css +25 -5
  95. package/dist/display/css/chat-box.css +158 -26
  96. package/dist/display/css/chip.css +142 -68
  97. package/dist/display/css/code.css +2 -6
  98. package/dist/display/css/collapsible.css +349 -45
  99. package/dist/display/css/countdown.css +206 -0
  100. package/dist/display/css/divider.css +8 -6
  101. package/dist/display/css/empty.css +7 -0
  102. package/dist/display/css/item.css +330 -84
  103. package/dist/display/css/map.css +164 -0
  104. package/dist/display/css/marquee.css +0 -3
  105. package/dist/display/css/section.css +89 -65
  106. package/dist/display/css/skeleton.css +58 -0
  107. package/dist/display/css/table.css +309 -193
  108. package/dist/form/Checkbox.svelte +11 -5
  109. package/dist/form/Checkbox.svelte.d.ts +2 -1
  110. package/dist/form/ColorField.svelte +601 -0
  111. package/dist/form/ColorField.svelte.d.ts +29 -0
  112. package/dist/form/ComboBox.svelte +24 -9
  113. package/dist/form/ComboBox.svelte.d.ts +2 -2
  114. package/dist/form/CsvField.svelte +62 -136
  115. package/dist/form/CsvField.svelte.d.ts +2 -2
  116. package/dist/form/DateField.svelte +33 -15
  117. package/dist/form/DateField.svelte.d.ts +2 -1
  118. package/dist/form/DateRange.svelte +436 -0
  119. package/dist/form/DateRange.svelte.d.ts +24 -0
  120. package/dist/form/DragDrop.svelte +578 -0
  121. package/dist/form/DragDrop.svelte.d.ts +33 -0
  122. package/dist/form/Dropzone.svelte +28 -8
  123. package/dist/form/Dropzone.svelte.d.ts +2 -2
  124. package/dist/form/Editor.svelte +626 -0
  125. package/dist/form/Editor.svelte.d.ts +50 -0
  126. package/dist/form/ImageCropper.svelte +422 -61
  127. package/dist/form/ImageCropper.svelte.d.ts +15 -1
  128. package/dist/form/{PasswordStrength.svelte → PasswordField.svelte} +58 -24
  129. package/dist/form/{PasswordStrength.svelte.d.ts → PasswordField.svelte.d.ts} +6 -5
  130. package/dist/form/PhoneField.svelte +26 -14
  131. package/dist/form/PhoneField.svelte.d.ts +4 -3
  132. package/dist/form/PinField.svelte +39 -31
  133. package/dist/form/PinField.svelte.d.ts +3 -3
  134. package/dist/form/RadioGroup.svelte +9 -5
  135. package/dist/form/RadioGroup.svelte.d.ts +1 -1
  136. package/dist/form/Select.svelte +20 -19
  137. package/dist/form/Select.svelte.d.ts +2 -2
  138. package/dist/form/Slider.svelte +10 -4
  139. package/dist/form/Slider.svelte.d.ts +2 -1
  140. package/dist/form/TextField.svelte +29 -11
  141. package/dist/form/TextField.svelte.d.ts +5 -4
  142. package/dist/form/Textarea.svelte +15 -6
  143. package/dist/form/Textarea.svelte.d.ts +2 -2
  144. package/dist/form/Toggle.svelte +7 -3
  145. package/dist/form/Toggle.svelte.d.ts +1 -1
  146. package/dist/form/css/checkbox.css +18 -2
  147. package/dist/form/css/color-field.css +141 -0
  148. package/dist/form/css/control.css +193 -82
  149. package/dist/form/css/csv-field.css +221 -0
  150. package/dist/form/css/date-range.css +122 -0
  151. package/dist/form/css/date.css +24 -2
  152. package/dist/form/css/drag-drop.css +234 -0
  153. package/dist/form/css/dropzone.css +153 -34
  154. package/dist/form/css/editor.css +367 -0
  155. package/dist/form/css/field.css +4 -0
  156. package/dist/form/css/image-cropper.css +242 -20
  157. package/dist/form/css/radio-group.css +26 -1
  158. package/dist/form/css/select.css +2 -2
  159. package/dist/form/css/slider.css +37 -0
  160. package/dist/form/css/textarea.css +178 -75
  161. package/dist/form/css/toggle.css +15 -3
  162. package/dist/hooks/use-chat.svelte.js +1 -1
  163. package/dist/hooks/use-form.svelte.js +3 -3
  164. package/dist/hooks/use-search.svelte.js +0 -3
  165. package/dist/hooks/use-table.svelte.d.ts +1 -0
  166. package/dist/hooks/use-table.svelte.js +6 -0
  167. package/dist/icons/index.d.ts +34 -2
  168. package/dist/icons/index.js +36 -4
  169. package/dist/index.css +44 -49
  170. package/dist/index.d.ts +14 -4
  171. package/dist/index.js +13 -3
  172. package/dist/layout/AppBar.svelte +22 -14
  173. package/dist/layout/AppBar.svelte.d.ts +2 -1
  174. package/dist/layout/Footer.svelte +19 -11
  175. package/dist/layout/Footer.svelte.d.ts +2 -1
  176. package/dist/layout/Provider.svelte +32 -9
  177. package/dist/layout/Provider.svelte.d.ts +3 -1
  178. package/dist/layout/Sidebar.svelte +17 -8
  179. package/dist/layout/Sidebar.svelte.d.ts +2 -1
  180. package/dist/layout/css/app-bar.css +63 -66
  181. package/dist/layout/css/footer.css +62 -65
  182. package/dist/layout/css/sidebar.css +120 -59
  183. package/dist/navigation/BottomNav.svelte +51 -14
  184. package/dist/navigation/FooterGroup.svelte +1 -1
  185. package/dist/navigation/NavMenu.svelte +47 -23
  186. package/dist/navigation/NavMenu.svelte.d.ts +29 -0
  187. package/dist/navigation/Pagination.svelte +158 -0
  188. package/dist/navigation/Pagination.svelte.d.ts +18 -0
  189. package/dist/navigation/SideNav.svelte +30 -25
  190. package/dist/navigation/SideNav.svelte.d.ts +2 -3
  191. package/dist/navigation/Tabs.svelte +17 -7
  192. package/dist/navigation/Tabs.svelte.d.ts +2 -2
  193. package/dist/navigation/css/bottom-nav.css +319 -257
  194. package/dist/navigation/css/footer-group.css +1 -1
  195. package/dist/navigation/css/footer-nav.css +1 -1
  196. package/dist/navigation/css/nav-menu.css +331 -106
  197. package/dist/navigation/css/pagination.css +74 -0
  198. package/dist/navigation/css/side-nav.css +514 -75
  199. package/dist/navigation/css/tabs.css +246 -52
  200. package/dist/overlay/AlertDialog.svelte +58 -0
  201. package/dist/overlay/AlertDialog.svelte.d.ts +14 -25
  202. package/dist/overlay/Command.svelte +347 -0
  203. package/dist/overlay/Command.svelte.d.ts +33 -25
  204. package/dist/overlay/Drawer.svelte +49 -21
  205. package/dist/overlay/Drawer.svelte.d.ts +2 -2
  206. package/dist/overlay/Dropdown.svelte +3 -3
  207. package/dist/overlay/Modal.svelte +51 -16
  208. package/dist/overlay/Modal.svelte.d.ts +3 -3
  209. package/dist/overlay/Toast.svelte +41 -17
  210. package/dist/overlay/Toast.svelte.d.ts +1 -1
  211. package/dist/overlay/Tooltip.svelte +36 -27
  212. package/dist/overlay/Tooltip.svelte.d.ts +2 -2
  213. package/dist/overlay/css/command.css +68 -0
  214. package/dist/overlay/css/drawer.css +63 -24
  215. package/dist/overlay/css/dropdown.css +1 -1
  216. package/dist/overlay/css/hovercard.css +1 -1
  217. package/dist/overlay/css/modal.css +79 -27
  218. package/dist/overlay/css/toast.css +40 -24
  219. package/dist/overlay/css/tooltip.css +110 -67
  220. package/dist/stores/theme.svelte.js +44 -12
  221. package/dist/stores/toast.svelte.d.ts +4 -4
  222. package/dist/stores/toast.svelte.js +2 -2
  223. package/package.json +1 -1
  224. package/dist/utils/charts.d.ts +0 -27
  225. package/dist/utils/charts.js +0 -140
@@ -20,7 +20,8 @@
20
20
  loadingText?: string;
21
21
  loadingMoreText?: string;
22
22
  onchange?: (value: string | number | null) => void;
23
- variant?: 'primary' | 'secondary' | 'muted' | 'outlined' | 'line';
23
+ color?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'danger' | 'warning';
24
+ variant?: 'solid' | 'soft' | 'outlined' | 'line';
24
25
  size?: 'sm' | 'md' | 'lg';
25
26
  name?: string;
26
27
  class?: string;
@@ -29,7 +30,6 @@
29
30
  helpText?: string;
30
31
  errorText?: string;
31
32
  isFloatLabel?: boolean;
32
- isSolid?: boolean;
33
33
  isClearable?: boolean;
34
34
  isDisabled?: boolean;
35
35
  arrowIcon?: IconData;
@@ -47,6 +47,7 @@
47
47
  loadingMoreText = 'Loading more...',
48
48
  onchange,
49
49
  variant = 'outlined',
50
+ color = 'muted',
50
51
  size = 'md',
51
52
  name,
52
53
  label,
@@ -54,16 +55,23 @@
54
55
  helpText,
55
56
  errorText,
56
57
  isFloatLabel,
57
- isSolid,
58
58
  isClearable = false,
59
59
  isDisabled = false,
60
60
  arrowIcon = ArrowDown24RegularIcon
61
61
  }: Props = $props();
62
-
63
- const variantClasses = {
62
+ const colors = {
64
63
  primary: 'is-primary',
65
64
  secondary: 'is-secondary',
66
65
  muted: 'is-muted',
66
+ success: 'is-success',
67
+ info: 'is-info',
68
+ danger: 'is-danger',
69
+ warning: 'is-warning'
70
+ };
71
+
72
+ const variants = {
73
+ solid: 'is-solid',
74
+ soft: 'is-soft',
67
75
  outlined: 'is-outlined',
68
76
  line: 'is-line'
69
77
  };
@@ -92,6 +100,7 @@
92
100
  let controlElement = $state<HTMLElement>();
93
101
  let contentEl = $state<HTMLElement>();
94
102
  let optionsEl = $state<HTMLElement>();
103
+ let searchInputEl = $state<HTMLInputElement>();
95
104
  let focusedIndex = $state(-1);
96
105
  let searchTerm = $state('');
97
106
  let searchTimeout: ReturnType<typeof setTimeout> | null = $state(null);
@@ -239,6 +248,7 @@
239
248
  if (isDisabled) return;
240
249
 
241
250
  if (!isOpen) {
251
+ search.setSearch('');
242
252
  startEventListeners();
243
253
  await initializeFocusedIndex();
244
254
  await scrollToSelectedItem();
@@ -246,6 +256,10 @@
246
256
  await updatePosition();
247
257
  isOpen = true;
248
258
  hasSearched = false;
259
+ await tick();
260
+ setTimeout(() => {
261
+ searchInputEl?.focus();
262
+ }, 100);
249
263
  } else {
250
264
  stopEventListeners();
251
265
  focusedIndex = -1;
@@ -335,10 +349,10 @@
335
349
  bind:this={controlElement}
336
350
  class={cn(
337
351
  'control',
338
- variantClasses[variant],
352
+ colors[color],
353
+ variants[variant],
339
354
  sizeClasses[size],
340
355
  isFloatLabel && 'is-float',
341
- isSolid && 'is-solid',
342
356
  (isActive || isFocused || isOpen) && 'is-active',
343
357
  isDisabled && 'opacity-50 cursor-not-allowed'
344
358
  )}
@@ -398,9 +412,10 @@
398
412
  {/if}
399
413
 
400
414
  <div class:is-active={isOpen} class="combo-box-popover" bind:this={contentEl} {style}>
401
- <div class={cn('combo-box-search', variantClasses[variant])}>
415
+ <div class={cn('combo-box-search', colors[color], variants[variant])}>
402
416
  <Icon icon={Search24RegularIcon} class="combo-box-search-icon" />
403
417
  <input
418
+ bind:this={searchInputEl}
404
419
  type="text"
405
420
  class="combo-box-search-input"
406
421
  placeholder={searchPlaceholder}
@@ -429,7 +444,7 @@
429
444
  isActive={value === item.id}
430
445
  isFocused={focusedIndex === index}
431
446
  isDisabled={item.disabled}
432
- variant={itemVariants[variant]}
447
+ {color}
433
448
  size="sm"
434
449
  isCompact
435
450
  />
@@ -10,7 +10,8 @@ type Props = {
10
10
  loadingText?: string;
11
11
  loadingMoreText?: string;
12
12
  onchange?: (value: string | number | null) => void;
13
- variant?: 'primary' | 'secondary' | 'muted' | 'outlined' | 'line';
13
+ color?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'danger' | 'warning';
14
+ variant?: 'solid' | 'soft' | 'outlined' | 'line';
14
15
  size?: 'sm' | 'md' | 'lg';
15
16
  name?: string;
16
17
  class?: string;
@@ -19,7 +20,6 @@ type Props = {
19
20
  helpText?: string;
20
21
  errorText?: string;
21
22
  isFloatLabel?: boolean;
22
- isSolid?: boolean;
23
23
  isClearable?: boolean;
24
24
  isDisabled?: boolean;
25
25
  arrowIcon?: IconData;
@@ -1,7 +1,7 @@
1
1
  <script lang="ts">
2
+ import { ArrowUploadRegularIcon } from '../icons/index.js';
2
3
  import { Button, Modal, Select, TextField, Table, useTable, Chip } from '../index.js';
3
- import type { Snippet } from 'svelte';
4
-
4
+ import { cn } from '../utils/class-names.js';
5
5
  type Props = {
6
6
  requiredColumns?: string[];
7
7
  onMappingComplete?: (data: {
@@ -11,20 +11,11 @@
11
11
  originalData: any[];
12
12
  }) => void;
13
13
  acceptMultipleFiles?: boolean;
14
- variant?:
15
- | 'primary'
16
- | 'secondary'
17
- | 'muted'
18
- | 'success'
19
- | 'info'
20
- | 'danger'
21
- | 'warning'
22
- | 'outlined'
23
- | 'ghost';
14
+ color?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'danger' | 'warning';
15
+ variant?: 'solid' | 'soft' | 'outlined' | 'ghost';
24
16
  size?: 'xs' | 'sm' | 'md' | 'lg';
25
17
  class?: string;
26
18
  buttonText?: string;
27
- isSolid?: boolean;
28
19
  showPreview?: boolean;
29
20
  previewRows?: number;
30
21
  previewPageSize?: number;
@@ -34,16 +25,40 @@
34
25
  requiredColumns = [],
35
26
  onMappingComplete = () => {},
36
27
  acceptMultipleFiles = false,
37
- variant = 'primary',
28
+ color = 'muted',
29
+ variant = 'soft',
38
30
  size = 'md',
39
31
  class: className,
40
- buttonText = 'Seleccionar archivo CSV',
41
- isSolid = false,
32
+ buttonText = 'Select CSV file',
42
33
  showPreview = true,
43
34
  previewRows = 5,
44
35
  previewPageSize = 10
45
36
  }: Props = $props();
46
37
 
38
+ const colors = {
39
+ primary: 'is-primary',
40
+ secondary: 'is-secondary',
41
+ muted: 'is-muted',
42
+ success: 'is-success',
43
+ info: 'is-info',
44
+ danger: 'is-danger',
45
+ warning: 'is-warning'
46
+ };
47
+
48
+ const variants = {
49
+ solid: 'is-solid',
50
+ soft: 'is-soft',
51
+ outlined: 'is-outlined',
52
+ ghost: 'is-ghost'
53
+ };
54
+
55
+ const sizes = {
56
+ xs: 'is-xs',
57
+ sm: 'is-sm',
58
+ md: 'is-md',
59
+ lg: 'is-lg'
60
+ };
61
+
47
62
  let fileInput = $state<HTMLInputElement | null>(null);
48
63
  let selectedFile = $state<File | null>(null);
49
64
  let showModal = $state(false);
@@ -60,7 +75,7 @@
60
75
  if (!file) return;
61
76
 
62
77
  if (!file.name.endsWith('.csv')) {
63
- parseError = 'Por favor selecciona un archivo CSV válido';
78
+ parseError = 'Please select a valid CSV file';
64
79
  return;
65
80
  }
66
81
 
@@ -78,7 +93,7 @@
78
93
  const lines = text.split('\n').filter((line) => line.trim());
79
94
 
80
95
  if (lines.length === 0) {
81
- parseError = 'El archivo CSV está vacío';
96
+ parseError = 'The CSV file is empty';
82
97
  return;
83
98
  }
84
99
 
@@ -104,12 +119,12 @@
104
119
 
105
120
  showModal = true;
106
121
  } catch (error: any) {
107
- parseError = 'Error al parsear el archivo CSV: ' + error.message;
122
+ parseError = 'Error parsing CSV file: ' + error.message;
108
123
  }
109
124
  };
110
125
 
111
126
  reader.onerror = () => {
112
- parseError = 'Error al leer el archivo';
127
+ parseError = 'Error reading file';
113
128
  };
114
129
 
115
130
  reader.readAsText(file);
@@ -119,7 +134,7 @@
119
134
  const unmappedColumns = requiredColumns.filter((col) => !columnMapping[col]);
120
135
 
121
136
  if (unmappedColumns.length > 0) {
122
- parseError = `Por favor mapea las siguientes columnas: ${unmappedColumns.join(', ')}`;
137
+ parseError = `Please map the following columns: ${unmappedColumns.join(', ')}`;
123
138
  return;
124
139
  }
125
140
 
@@ -185,22 +200,26 @@
185
200
  })
186
201
  : null
187
202
  );
203
+
204
+ const baseClasses = $derived(
205
+ cn('csv-field', colors[color], variants[variant], sizes[size], className)
206
+ );
188
207
  </script>
189
208
 
190
- <div class={className}>
209
+ <div class={baseClasses}>
191
210
  <input
192
211
  type="file"
193
212
  accept=".csv"
194
213
  bind:this={fileInput}
195
214
  onchange={handleFileSelect}
196
- style="display: none;"
215
+ class="csv-field-input"
197
216
  />
198
217
 
199
218
  <Button
219
+ {color}
200
220
  {variant}
201
221
  {size}
202
- {isSolid}
203
- startIcon="fluent:document-arrow-up-24-regular"
222
+ startIcon={ArrowUploadRegularIcon}
204
223
  onclick={() => fileInput?.click()}
205
224
  >
206
225
  {selectedFile ? selectedFile.name : buttonText}
@@ -217,27 +236,27 @@
217
236
  <div class="csv-preview-header">
218
237
  <div class="csv-preview-info">
219
238
  <h4 class="csv-preview-title">
220
- Datos Importados
221
- <span class="csv-preview-count">({mappedData.length} registros)</span>
239
+ Imported Data
240
+ <span class="csv-preview-count">({mappedData.length} records)</span>
222
241
  </h4>
223
242
  <div class="csv-mapping-summary">
224
243
  {#each Object.entries(columnMapping) as [required, csv], index}
225
244
  {#if index < 3}
226
- <Chip size="sm" variant="muted">
245
+ <Chip size="sm" {color} variant="soft">
227
246
  {required} → {csv}
228
247
  </Chip>
229
248
  {/if}
230
249
  {/each}
231
250
  {#if Object.entries(columnMapping).length > 3}
232
- <Chip size="sm" variant="muted">
233
- +{Object.entries(columnMapping).length - 3} más
251
+ <Chip size="sm" {color} variant="soft">
252
+ +{Object.entries(columnMapping).length - 3} more
234
253
  </Chip>
235
254
  {/if}
236
255
  </div>
237
256
  </div>
238
- <Button variant="ghost" size="sm" onclick={clearImport}>
257
+ <Button {color} variant="ghost" size="sm" onclick={clearImport}>
239
258
  <span class="csv-clear-icon">✕</span>
240
- Limpiar
259
+ Clear
241
260
  </Button>
242
261
  </div>
243
262
 
@@ -246,14 +265,14 @@
246
265
  {/if}
247
266
  </div>
248
267
 
249
- <Modal bind:open={showModal} onclose={closeModal} variant="surface" closeOnOverlay>
268
+ <Modal bind:open={showModal} onclose={closeModal} color="surface">
250
269
  {#snippet header()}
251
- <h2 class="csv-modal-title">Mapear Columnas del CSV</h2>
270
+ <h2 class="csv-modal-title">Map CSV Columns</h2>
252
271
  {/snippet}
253
272
 
254
273
  <div class="csv-modal-body">
255
274
  <p class="csv-instructions">
256
- Asocia cada columna requerida con la columna correspondiente del archivo CSV:
275
+ Map each required column to the corresponding column from the CSV file:
257
276
  </p>
258
277
 
259
278
  <div class="csv-mapping-list">
@@ -263,7 +282,7 @@
263
282
  label={requiredCol}
264
283
  options={selectOptions}
265
284
  bind:value={columnMapping[requiredCol]}
266
- placeholder="-- Seleccionar columna --"
285
+ placeholder="-- Select column --"
267
286
  variant="outlined"
268
287
  size="md"
269
288
  isFloatLabel
@@ -272,8 +291,9 @@
272
291
  {#if columnMapping[requiredCol]}
273
292
  <TextField
274
293
  value={getPreviewData(requiredCol)}
275
- label="Vista previa"
276
- variant="muted"
294
+ label="Preview"
295
+ variant="soft"
296
+ color="muted"
277
297
  size="sm"
278
298
  isFloatLabel
279
299
  islabelActive
@@ -286,104 +306,10 @@
286
306
 
287
307
  {#snippet footer()}
288
308
  <div class="csv-modal-footer">
289
- <Button variant="ghost" size="md" onclick={closeModal}>Cancelar</Button>
290
- <Button variant="primary" size="md" isSolid onclick={confirmMapping}>Confirmar mapeo</Button>
309
+ <Button color="muted" variant="ghost" size="md" onclick={closeModal}>Cancel</Button>
310
+ <Button color="primary" variant="solid" size="md" onclick={confirmMapping}
311
+ >Confirm mapping</Button
312
+ >
291
313
  </div>
292
314
  {/snippet}
293
315
  </Modal>
294
-
295
- <style>
296
- .csv-field-error {
297
- margin-top: 0.625rem;
298
- padding: 0.625rem;
299
- background: rgb(254 226 226);
300
- color: rgb(220 38 38);
301
- border-radius: 0.375rem;
302
- font-size: 0.875rem;
303
- }
304
-
305
- .csv-modal-title {
306
- margin: 0;
307
- font-size: 1.25rem;
308
- font-weight: 600;
309
- color: rgb(17 24 39);
310
- }
311
-
312
- .csv-modal-body {
313
- display: flex;
314
- flex-direction: column;
315
- gap: 1.25rem;
316
- }
317
-
318
- .csv-instructions {
319
- margin: 0;
320
- color: rgb(107 114 128);
321
- font-size: 0.875rem;
322
- }
323
-
324
- .csv-mapping-list {
325
- display: flex;
326
- flex-direction: column;
327
- gap: 1.5rem;
328
- }
329
-
330
- .csv-mapping-item {
331
- display: flex;
332
- flex-direction: column;
333
- gap: 0.75rem;
334
- }
335
-
336
- .csv-modal-footer {
337
- display: flex;
338
- justify-content: flex-end;
339
- gap: 0.75rem;
340
- }
341
-
342
- .csv-preview-container {
343
- margin-top: 1.5rem;
344
- padding: 1.25rem;
345
- background: rgb(249 250 251);
346
- border: 1px solid rgb(229 231 235);
347
- border-radius: 0.75rem;
348
- }
349
-
350
- .csv-preview-header {
351
- display: flex;
352
- justify-content: space-between;
353
- align-items: flex-start;
354
- margin-bottom: 1rem;
355
- gap: 1rem;
356
- }
357
-
358
- .csv-preview-info {
359
- flex: 1;
360
- min-width: 0;
361
- }
362
-
363
- .csv-preview-title {
364
- margin: 0 0 0.75rem 0;
365
- font-size: 1rem;
366
- font-weight: 600;
367
- color: rgb(17 24 39);
368
- display: flex;
369
- align-items: center;
370
- gap: 0.5rem;
371
- }
372
-
373
- .csv-preview-count {
374
- font-size: 0.875rem;
375
- font-weight: 400;
376
- color: rgb(107 114 128);
377
- }
378
-
379
- .csv-mapping-summary {
380
- display: flex;
381
- flex-wrap: wrap;
382
- gap: 0.5rem;
383
- }
384
-
385
- .csv-clear-icon {
386
- font-size: 1.125rem;
387
- line-height: 1;
388
- }
389
- </style>
@@ -7,11 +7,11 @@ type Props = {
7
7
  originalData: any[];
8
8
  }) => void;
9
9
  acceptMultipleFiles?: boolean;
10
- variant?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'danger' | 'warning' | 'outlined' | 'ghost';
10
+ color?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'danger' | 'warning';
11
+ variant?: 'solid' | 'soft' | 'outlined' | 'ghost';
11
12
  size?: 'xs' | 'sm' | 'md' | 'lg';
12
13
  class?: string;
13
14
  buttonText?: string;
14
- isSolid?: boolean;
15
15
  showPreview?: boolean;
16
16
  previewRows?: number;
17
17
  previewPageSize?: number;
@@ -1,6 +1,6 @@
1
1
  <script lang="ts">
2
2
  import { ArrowLeft24RegularIcon, ArrowRight24RegularIcon } from '../icons/index.js';
3
- import { Button, formatDate, getWeekdays, Icon } from '../index.js';
3
+ import { Button, formatDate, getWeekdays, IconButton } from '../index.js';
4
4
  import { cn } from '../utils/class-names.js';
5
5
  import { onMount } from 'svelte';
6
6
 
@@ -8,7 +8,8 @@
8
8
  value?: unknown;
9
9
  placeholder?: string;
10
10
  onchange?: (value: unknown) => void;
11
- variant?: 'primary' | 'secondary' | 'muted' | 'outlined' | 'line';
11
+ color?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'danger' | 'warning';
12
+ variant?: 'solid' | 'soft' | 'outlined' | 'line';
12
13
  size?: 'sm' | 'md' | 'lg';
13
14
  name?: string;
14
15
  class?: string;
@@ -25,6 +26,7 @@
25
26
  placeholder = 'Select an option',
26
27
  onchange,
27
28
  variant = 'outlined',
29
+ color = 'muted',
28
30
  size = 'md',
29
31
  name,
30
32
  label,
@@ -32,8 +34,7 @@
32
34
  helpText,
33
35
  errorText,
34
36
  class: className,
35
- isFloatLabel,
36
- isSolid
37
+ isFloatLabel
37
38
  }: Props = $props();
38
39
 
39
40
  let selectedDate = $state<Date>(new Date());
@@ -55,10 +56,19 @@
55
56
  isBottomHalf: false
56
57
  });
57
58
 
58
- const variantClasses = {
59
+ const colors = {
59
60
  primary: 'is-primary',
60
61
  secondary: 'is-secondary',
61
62
  muted: 'is-muted',
63
+ success: 'is-success',
64
+ info: 'is-info',
65
+ danger: 'is-danger',
66
+ warning: 'is-warning'
67
+ };
68
+
69
+ const variants = {
70
+ solid: 'is-solid',
71
+ soft: 'is-soft',
62
72
  outlined: 'is-outlined',
63
73
  line: 'is-line'
64
74
  };
@@ -139,7 +149,7 @@
139
149
  );
140
150
 
141
151
  const days = $derived(getDaysInMonth(currentMonth, currentYear));
142
- const weekdays = $derived(getWeekdays('short'));
152
+ const weekdays = $derived(getWeekdays('narrow'));
143
153
 
144
154
  const formattedSelectedDate = $derived(
145
155
  formatDate(selectedDate, {
@@ -216,10 +226,10 @@
216
226
  bind:this={controlElement}
217
227
  class={cn(
218
228
  'control',
219
- variantClasses[variant],
229
+ colors[color],
230
+ variants[variant],
220
231
  sizeClasses[size],
221
232
  isFloatLabel && 'is-float',
222
- isSolid && 'is-solid',
223
233
  (isActive || isFocused) && 'is-active'
224
234
  )}
225
235
  class:is-error={errorText}
@@ -256,15 +266,23 @@
256
266
 
257
267
  <div class:is-open={isOpen} class="date-popover" {style} bind:this={contentEl}>
258
268
  <div class="date-picker-header">
259
- <Button variant="ghost" onclick={() => changeMonth('prev')}>
260
- <Icon icon={ArrowLeft24RegularIcon} />
261
- </Button>
269
+ <IconButton
270
+ onclick={() => changeMonth('prev')}
271
+ icon={ArrowLeft24RegularIcon}
272
+ {color}
273
+ variant="ghost"
274
+ size="sm"
275
+ />
262
276
 
263
277
  <span>{monthName} {currentYear}</span>
264
278
 
265
- <Button variant="ghost" onclick={() => changeMonth('next')}>
266
- <Icon icon={ArrowRight24RegularIcon} />
267
- </Button>
279
+ <IconButton
280
+ onclick={() => changeMonth('next')}
281
+ icon={ArrowRight24RegularIcon}
282
+ {color}
283
+ variant="ghost"
284
+ size="sm"
285
+ />
268
286
  </div>
269
287
  <div class="date-picker-weekdays">
270
288
  {#each weekdays as weekday}
@@ -275,7 +293,7 @@
275
293
  {#each days as day}
276
294
  {#if day}
277
295
  <button
278
- class="date-picker-day-button"
296
+ class={cn('date-picker-day-button', colors[color])}
279
297
  class:today={isToday(day)}
280
298
  class:selected={isSelected(day)}
281
299
  onclick={() => selectDate(day)}
@@ -2,7 +2,8 @@ type Props = {
2
2
  value?: unknown;
3
3
  placeholder?: string;
4
4
  onchange?: (value: unknown) => void;
5
- variant?: 'primary' | 'secondary' | 'muted' | 'outlined' | 'line';
5
+ color?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'danger' | 'warning';
6
+ variant?: 'solid' | 'soft' | 'outlined' | 'line';
6
7
  size?: 'sm' | 'md' | 'lg';
7
8
  name?: string;
8
9
  class?: string;