ui-svelte 0.2.10 → 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 (206) 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 +427 -2
  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 +54 -26
  51. package/dist/display/Avatar.svelte.d.ts +7 -1
  52. package/dist/display/AvatarGroup.svelte +26 -18
  53. package/dist/display/AvatarGroup.svelte.d.ts +9 -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 +31 -18
  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 -44
  83. package/dist/display/css/avatar.css +152 -123
  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/PasswordField.svelte +120 -75
  119. package/dist/form/PasswordField.svelte.d.ts +9 -10
  120. package/dist/form/PhoneField.svelte +34 -16
  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 +11 -1
  135. package/dist/form/Toggle.svelte.d.ts +2 -0
  136. package/dist/form/css/checkbox.css +18 -2
  137. package/dist/form/css/color-field.css +141 -0
  138. package/dist/form/css/control.css +193 -82
  139. package/dist/form/css/csv-field.css +226 -0
  140. package/dist/form/css/date-range.css +122 -0
  141. package/dist/form/css/date.css +24 -2
  142. package/dist/form/css/drag-drop.css +271 -0
  143. package/dist/form/css/dropzone.css +153 -34
  144. package/dist/form/css/editor.css +367 -0
  145. package/dist/form/css/field.css +4 -0
  146. package/dist/form/css/image-cropper.css +223 -22
  147. package/dist/form/css/password.css +1 -1
  148. package/dist/form/css/radio-group.css +1 -1
  149. package/dist/form/css/select.css +2 -2
  150. package/dist/form/css/slider.css +1 -0
  151. package/dist/form/css/textarea.css +178 -75
  152. package/dist/form/css/toggle.css +11 -2
  153. package/dist/hooks/use-table.svelte.d.ts +1 -0
  154. package/dist/hooks/use-table.svelte.js +6 -0
  155. package/dist/icons/index.d.ts +38 -2
  156. package/dist/icons/index.js +40 -4
  157. package/dist/index.css +16 -1
  158. package/dist/index.d.ts +11 -3
  159. package/dist/index.js +10 -2
  160. package/dist/layout/AppBar.svelte +22 -14
  161. package/dist/layout/AppBar.svelte.d.ts +2 -1
  162. package/dist/layout/Footer.svelte +19 -11
  163. package/dist/layout/Footer.svelte.d.ts +2 -1
  164. package/dist/layout/Provider.svelte +27 -4
  165. package/dist/layout/Provider.svelte.d.ts +3 -1
  166. package/dist/layout/css/app-bar.css +63 -66
  167. package/dist/layout/css/footer.css +62 -65
  168. package/dist/navigation/BottomNav.svelte +41 -13
  169. package/dist/navigation/FooterGroup.svelte +1 -1
  170. package/dist/navigation/NavMenu.svelte +47 -23
  171. package/dist/navigation/NavMenu.svelte.d.ts +29 -0
  172. package/dist/navigation/Pagination.svelte +158 -0
  173. package/dist/navigation/Pagination.svelte.d.ts +18 -0
  174. package/dist/navigation/SideNav.svelte +30 -25
  175. package/dist/navigation/SideNav.svelte.d.ts +2 -3
  176. package/dist/navigation/Tabs.svelte +17 -7
  177. package/dist/navigation/Tabs.svelte.d.ts +2 -2
  178. package/dist/navigation/css/bottom-nav.css +279 -257
  179. package/dist/navigation/css/footer-group.css +1 -1
  180. package/dist/navigation/css/footer-nav.css +1 -1
  181. package/dist/navigation/css/nav-menu.css +332 -106
  182. package/dist/navigation/css/pagination.css +74 -0
  183. package/dist/navigation/css/side-nav.css +515 -75
  184. package/dist/navigation/css/tabs.css +246 -52
  185. package/dist/overlay/Command.svelte +340 -0
  186. package/dist/overlay/Command.svelte.d.ts +24 -25
  187. package/dist/overlay/Drawer.svelte +49 -21
  188. package/dist/overlay/Drawer.svelte.d.ts +2 -2
  189. package/dist/overlay/Dropdown.svelte +4 -5
  190. package/dist/overlay/Modal.svelte +51 -16
  191. package/dist/overlay/Modal.svelte.d.ts +3 -3
  192. package/dist/overlay/Toast.svelte +41 -17
  193. package/dist/overlay/Toast.svelte.d.ts +1 -1
  194. package/dist/overlay/Tooltip.svelte +40 -26
  195. package/dist/overlay/Tooltip.svelte.d.ts +2 -2
  196. package/dist/overlay/css/command.css +80 -0
  197. package/dist/overlay/css/drawer.css +63 -24
  198. package/dist/overlay/css/dropdown.css +1 -1
  199. package/dist/overlay/css/hovercard.css +1 -1
  200. package/dist/overlay/css/modal.css +27 -27
  201. package/dist/overlay/css/toast.css +17 -29
  202. package/dist/overlay/css/tooltip.css +83 -66
  203. package/dist/stores/theme.svelte.js +26 -1
  204. package/dist/stores/toast.svelte.d.ts +4 -4
  205. package/dist/stores/toast.svelte.js +2 -2
  206. package/package.json +1 -1
@@ -1,25 +1,22 @@
1
1
  <script lang="ts">
2
- import Button from '../control/Button.svelte';
3
- import { Icon } from '../index.js';
2
+ import IconButton from '../control/IconButton.svelte';
3
+ import { EyeOffRegularIcon, EyeShowRegularIcon } from '../icons/index.js';
4
4
  import { cn } from '../utils/class-names.js';
5
- import type { HTMLInputAttributes } from 'svelte/elements';
6
5
 
7
6
  type Props = {
8
7
  value?: string;
9
8
  defaultValue?: string;
10
9
  placeholder?: string;
11
- type?: 'text' | 'password' | 'email' | 'number' | 'tel' | 'url';
12
- class?: string;
13
- inputClass?: string;
10
+ rootClass?: string;
11
+ controlClass?: string;
14
12
  onchange?: (value: string | number | undefined) => void;
15
13
  oninput?: (value: string | number | undefined) => void;
16
- variant?: 'solid' | 'outlined' | 'soft' | 'line';
17
- color?: 'primary' | 'secondary' | 'muted';
18
- inputSize?: 'small' | 'medium' | 'large';
14
+ color?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'danger' | 'warning';
15
+ variant?: 'solid' | 'soft' | 'outlined' | 'line';
16
+ size?: 'sm' | 'md' | 'lg';
19
17
  name?: string;
20
18
  label?: string;
21
- labelOutside?: boolean;
22
- labelActive?: boolean;
19
+ islabelActive?: boolean;
23
20
  helpText?: string;
24
21
  errorText?: string;
25
22
  labels?: {
@@ -27,24 +24,25 @@
27
24
  medium?: string;
28
25
  strong?: string;
29
26
  };
30
- } & HTMLInputAttributes;
27
+ isFloatLabel?: boolean;
28
+ hideStrength?: boolean;
29
+ };
31
30
 
32
31
  let {
33
32
  value = $bindable(),
34
33
  defaultValue,
35
34
  placeholder,
36
- type = 'text',
37
- class: className,
38
- inputClass,
35
+ rootClass,
36
+ controlClass,
39
37
  onchange,
40
38
  oninput,
41
- variant = 'soft',
42
- color = 'primary',
43
- inputSize = 'medium',
39
+ variant = 'outlined',
40
+ color = 'muted',
41
+ size = 'md',
44
42
  name,
45
43
  label,
46
- labelOutside,
47
- labelActive,
44
+ isFloatLabel,
45
+ islabelActive,
48
46
  helpText,
49
47
  errorText,
50
48
  labels = {
@@ -52,32 +50,52 @@
52
50
  medium: 'Medium',
53
51
  strong: 'Strong'
54
52
  },
55
- ...rest
53
+ hideStrength
56
54
  }: Props = $props();
57
55
 
56
+ const colors = {
57
+ primary: 'is-primary',
58
+ secondary: 'is-secondary',
59
+ muted: 'is-muted',
60
+ success: 'is-success',
61
+ info: 'is-info',
62
+ danger: 'is-danger',
63
+ warning: 'is-warning'
64
+ };
65
+
58
66
  const variants = {
59
- solid: 'field-solid',
60
- outlined: 'field-outlined',
61
- soft: 'field-soft',
62
- line: 'field-line'
67
+ solid: 'is-solid',
68
+ soft: 'is-soft',
69
+ outlined: 'is-outlined',
70
+ line: 'is-line'
63
71
  };
64
- const colors = {
65
- primary: 'field-primary',
66
- secondary: 'field-secondary',
67
- muted: 'field-muted'
72
+
73
+ const btnVariants = {
74
+ solid: 'solid',
75
+ soft: 'ghost',
76
+ outlined: 'ghost',
77
+ line: 'ghost'
68
78
  };
69
79
 
70
- const sizes = {
71
- small: 'field-small',
72
- medium: 'field-medium',
73
- large: 'field-large'
80
+ const sizeClasses = {
81
+ sm: 'is-sm',
82
+ md: 'is-md',
83
+ lg: 'is-lg'
84
+ };
85
+
86
+ const btnSizes = {
87
+ sm: 'xs',
88
+ md: 'sm',
89
+ lg: 'md'
74
90
  };
75
91
 
76
92
  const uid = $props.id();
77
93
 
94
+ let isActive = $state(false);
95
+
78
96
  let show = $state(false);
79
97
  let isFocused = $state(false);
80
- let strength = $derived(calculateStrength(value));
98
+ let strength = $derived(calculateStrength(value as string));
81
99
 
82
100
  function isBarActive(barIndex: number, score: number): boolean {
83
101
  const threshold = (barIndex + 1) * 1.5;
@@ -89,7 +107,8 @@
89
107
  label: string;
90
108
  color: string;
91
109
  } {
92
- if (!password) return { score: 0, label: '', color: 'bg-gray-300' };
110
+ if (hideStrength) return { score: 0, label: '', color: 'bg-muted' };
111
+ if (!password) return { score: 0, label: '', color: 'bg-muted' };
93
112
 
94
113
  let score = 0;
95
114
 
@@ -99,72 +118,98 @@
99
118
  if (/[A-Z]/.test(password)) score += 1;
100
119
  if (/\d/.test(password)) score += 1;
101
120
  if (/[!@#$%^&*(),.?":{}|<>]/.test(password)) score += 1;
102
- if (score <= 2) return { score, label: labels.weak || 'Weak', color: 'bg-red-500' };
121
+ if (score <= 2) return { score, label: labels.weak || 'Weak', color: 'bg-danger' };
103
122
  if (score <= 4)
104
123
  return {
105
124
  score,
106
125
  label: labels.medium || 'Medium',
107
- color: 'bg-yellow-500'
126
+ color: 'bg-warning'
108
127
  };
109
128
  return {
110
129
  score,
111
130
  label: labels.strong || 'Strong',
112
- color: 'bg-green-500'
131
+ color: 'bg-success'
113
132
  };
114
133
  }
115
134
  </script>
116
135
 
117
- <div class={cn('field', className)}>
118
- {#if labelOutside && label}
119
- <label for={`${uid}-{name}`} class="label">{label}</label>
136
+ <div class={cn('field', rootClass)}>
137
+ {#if !isFloatLabel && label}
138
+ <span class="field-label">{label}</span>
120
139
  {/if}
121
- <div
122
- class={cn('field-control', variants[variant], colors[color], sizes[inputSize])}
140
+ <label
141
+ class={cn(
142
+ 'control',
143
+ colors[color],
144
+ variants[variant],
145
+ sizeClasses[size],
146
+ isFloatLabel && 'is-float',
147
+ (isActive || isFocused) && 'is-active',
148
+ controlClass
149
+ )}
150
+ for={`${uid}-{name}`}
123
151
  class:is-error={errorText}
152
+ onmouseenter={() => (isActive = true)}
153
+ onmouseleave={() => (isActive = false)}
124
154
  >
125
- {#if !labelOutside && label}
126
- <label class:is-active={isFocused || value} for={`${uid}-{name}`} class="label-inside"
127
- >{label}</label
155
+ {#if isFloatLabel && label}
156
+ <span
157
+ class={cn(
158
+ 'control-label',
159
+ (isActive || isFocused || islabelActive || value !== '') && 'is-active'
160
+ )}
128
161
  >
162
+ {label}
163
+ </span>
129
164
  {/if}
130
165
  <input
131
166
  type={show ? 'text' : 'password'}
132
167
  bind:value
133
168
  id={`${uid}-{name}`}
134
- class={cn('field-input', inputClass)}
135
- placeholder={isFocused ? placeholder : ''}
169
+ class={cn(
170
+ 'control-input',
171
+ isFloatLabel && !isActive && !isFocused && value == '' && 'invisible',
172
+ controlClass
173
+ )}
174
+ {placeholder}
136
175
  {name}
137
- {defaultValue}
138
176
  onchange={(e) => onchange?.((e.target as HTMLInputElement).value)}
139
177
  oninput={(e) => oninput?.((e.target as HTMLInputElement).value)}
140
- onfocusin={() => {
141
- if (!labelActive) isFocused = true;
142
- }}
143
- onfocusout={() => {
144
- if (!labelActive) isFocused = false;
145
- }}
146
- {...rest}
178
+ onfocusin={() => (isFocused = true)}
179
+ onfocusout={() => (isFocused = false)}
147
180
  />
148
- <Button class={cn('field-eye')} onclick={() => (show = !show)}>eye icon</Button>
149
- </div>
150
- <div class={cn('field-strength', className)}>
151
- <div class="field-strength-bars">
152
- {#each Array(4) as _, i}
153
- <div
154
- class="field-strength-bar-item"
155
- class:active={isBarActive(i, strength.score)}
156
- class:weak={strength.score <= 2 && isBarActive(i, strength.score)}
157
- class:medium={strength.score > 2 && strength.score <= 4 && isBarActive(i, strength.score)}
158
- class:strong={strength.score > 4 && isBarActive(i, strength.score)}
159
- ></div>
160
- {/each}
181
+ <IconButton
182
+ size={btnSizes[size] as any}
183
+ icon={show ? EyeShowRegularIcon : EyeOffRegularIcon}
184
+ {color}
185
+ variant={btnVariants[variant] as any}
186
+ onclick={() => (show = !show)}
187
+ />
188
+ </label>
189
+ {#if !hideStrength}
190
+ <div class={cn('field-strength')}>
191
+ <div class="field-strength-bars">
192
+ {#each Array(4) as _, i}
193
+ <div
194
+ class="field-strength-bar-item"
195
+ class:active={isBarActive(i, strength.score)}
196
+ class:weak={strength.score <= 2 && isBarActive(i, strength.score)}
197
+ class:medium={strength.score > 2 &&
198
+ strength.score <= 4 &&
199
+ isBarActive(i, strength.score)}
200
+ class:strong={strength.score > 4 && isBarActive(i, strength.score)}
201
+ ></div>
202
+ {/each}
203
+ </div>
204
+ {#if strength.label}
205
+ <span class="field-strength-label">{strength.label}</span>
206
+ {/if}
161
207
  </div>
162
- </div>
163
- {#if errorText || helpText || strength.label}
164
- <div
165
- class={cn('field-help', strength.label && 'field-strength-label', errorText && 'is-error')}
166
- >
167
- {strength.label ? strength.label : errorText ? errorText : helpText}
208
+ {/if}
209
+
210
+ {#if errorText || helpText}
211
+ <div class={cn('field-help', errorText && 'is-danger')}>
212
+ {errorText || helpText}
168
213
  </div>
169
214
  {/if}
170
215
  </div>
@@ -1,20 +1,17 @@
1
- import type { HTMLInputAttributes } from 'svelte/elements';
2
1
  type Props = {
3
2
  value?: string;
4
3
  defaultValue?: string;
5
4
  placeholder?: string;
6
- type?: 'text' | 'password' | 'email' | 'number' | 'tel' | 'url';
7
- class?: string;
8
- inputClass?: string;
5
+ rootClass?: string;
6
+ controlClass?: string;
9
7
  onchange?: (value: string | number | undefined) => void;
10
8
  oninput?: (value: string | number | undefined) => void;
11
- variant?: 'solid' | 'outlined' | 'soft' | 'line';
12
- color?: 'primary' | 'secondary' | 'muted';
13
- inputSize?: 'small' | 'medium' | 'large';
9
+ color?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'danger' | 'warning';
10
+ variant?: 'solid' | 'soft' | 'outlined' | 'line';
11
+ size?: 'sm' | 'md' | 'lg';
14
12
  name?: string;
15
13
  label?: string;
16
- labelOutside?: boolean;
17
- labelActive?: boolean;
14
+ islabelActive?: boolean;
18
15
  helpText?: string;
19
16
  errorText?: string;
20
17
  labels?: {
@@ -22,7 +19,9 @@ type Props = {
22
19
  medium?: string;
23
20
  strong?: string;
24
21
  };
25
- } & HTMLInputAttributes;
22
+ isFloatLabel?: boolean;
23
+ hideStrength?: boolean;
24
+ };
26
25
  declare const PasswordField: import("svelte").Component<Props, {}, "value">;
27
26
  type PasswordField = ReturnType<typeof PasswordField>;
28
27
  export default PasswordField;
@@ -12,17 +12,18 @@
12
12
  dialCode?: string;
13
13
  placeholder?: string;
14
14
  onchange?: (value: string) => void;
15
- variant?: 'primary' | 'secondary' | 'muted' | 'outlined' | 'line';
15
+ color?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'danger' | 'warning';
16
+ variant?: 'solid' | 'soft' | 'outlined' | 'line';
16
17
  size?: 'sm' | 'md' | 'lg';
17
18
  name?: string;
18
19
  dialCodeName?: string;
19
- class?: string;
20
+ rootClass?: string;
21
+ controlClass?: string;
20
22
  label?: string;
21
23
  isLabelActive?: boolean;
22
24
  helpText?: string;
23
25
  errorText?: string;
24
26
  isFloatLabel?: boolean;
25
- isSolid?: boolean;
26
27
  priorityCountries?: string[];
27
28
  searchPlaceholder?: string;
28
29
  emptyText?: string;
@@ -30,13 +31,15 @@
30
31
  };
31
32
 
32
33
  let {
33
- class: className,
34
+ rootClass,
35
+ controlClass,
34
36
  value = $bindable(''),
35
37
  countryCode = $bindable(''),
36
38
  dialCode = $bindable(''),
37
39
  placeholder = 'Enter phone number',
38
40
  onchange,
39
41
  variant = 'outlined',
42
+ color = 'muted',
40
43
  size = 'md',
41
44
  name,
42
45
  dialCodeName = 'dialCode',
@@ -45,17 +48,25 @@
45
48
  helpText,
46
49
  errorText,
47
50
  isFloatLabel,
48
- isSolid,
49
51
  priorityCountries = [],
50
52
  searchPlaceholder = 'Search country...',
51
53
  emptyText = 'No countries found',
52
54
  loadingText = 'Loading...'
53
55
  }: Props = $props();
54
56
 
55
- const variantClasses = {
57
+ const colors = {
56
58
  primary: 'is-primary',
57
59
  secondary: 'is-secondary',
58
60
  muted: 'is-muted',
61
+ success: 'is-success',
62
+ info: 'is-info',
63
+ danger: 'is-danger',
64
+ warning: 'is-warning'
65
+ };
66
+
67
+ const variants = {
68
+ solid: 'is-solid',
69
+ soft: 'is-soft',
59
70
  outlined: 'is-outlined',
60
71
  line: 'is-line'
61
72
  };
@@ -66,11 +77,11 @@
66
77
  lg: 'is-lg'
67
78
  };
68
79
 
69
- const avatarSizes = {
80
+ const avatarSizes: any = {
70
81
  sm: 'xs',
71
82
  md: 'sm',
72
83
  lg: 'md'
73
- } as const;
84
+ };
74
85
 
75
86
  let displayedCountries = $state<Country[]>([]);
76
87
  let allSortedCountries = $state<Country[]>([]);
@@ -84,6 +95,7 @@
84
95
  let contentEl = $state<HTMLElement>();
85
96
  let optionsEl = $state<HTMLElement>();
86
97
  let phoneInputEl = $state<HTMLInputElement>();
98
+ let searchInputEl = $state<HTMLInputElement>();
87
99
  let focusedIndex = $state(-1);
88
100
  let searchTerm = $state('');
89
101
  let searchTimeout: ReturnType<typeof setTimeout> | null = $state(null);
@@ -284,6 +296,10 @@
284
296
  await tick();
285
297
  await updatePosition();
286
298
  isOpen = true;
299
+ await tick();
300
+ setTimeout(() => {
301
+ searchInputEl?.focus();
302
+ }, 100);
287
303
  } else {
288
304
  stopEventListeners();
289
305
  focusedIndex = -1;
@@ -354,7 +370,7 @@
354
370
  });
355
371
  </script>
356
372
 
357
- <div class={cn('field', className)}>
373
+ <div class={cn('field', rootClass)}>
358
374
  <input type="hidden" name={dialCodeName} bind:value={dialCode} />
359
375
 
360
376
  {#if !isFloatLabel && label}
@@ -366,11 +382,12 @@
366
382
  bind:this={controlElement}
367
383
  class={cn(
368
384
  'control',
369
- variantClasses[variant],
385
+ colors[color],
386
+ variants[variant],
370
387
  sizeClasses[size],
371
388
  isFloatLabel && 'is-float',
372
- isSolid && 'is-solid',
373
- (isActive || isFocused || isOpen) && 'is-active'
389
+ (isActive || isFocused || isOpen) && 'is-active',
390
+ controlClass
374
391
  )}
375
392
  class:is-error={errorText}
376
393
  onmouseenter={() => (isActive = true)}
@@ -401,7 +418,7 @@
401
418
  />
402
419
  <span class="phone-dial-code">+{dialCode}</span>
403
420
  {:else}
404
- <Avatar name="Select country" {size} variant="transparent" />
421
+ <Icon icon={countryFlagsIcons[`country-flags:xx`] as IconData} class="h-5 w-5" />
405
422
  <span class="phone-dial-code">+--</span>
406
423
  {/if}
407
424
  <Icon icon={ChevronDown24RegularIcon} class={cn('control-arrow', isOpen && 'is-active')} />
@@ -409,7 +426,7 @@
409
426
 
410
427
  <input
411
428
  bind:this={phoneInputEl}
412
- type="tel"
429
+ type="number"
413
430
  {name}
414
431
  bind:value
415
432
  class={cn(
@@ -428,9 +445,10 @@
428
445
  {/if}
429
446
 
430
447
  <div class:is-active={isOpen} class="combo-box-popover" bind:this={contentEl} {style}>
431
- <div class={cn('combo-box-search', variantClasses[variant])}>
448
+ <div class={cn('combo-box-search', variants[variant])}>
432
449
  <Icon icon={Search24RegularIcon} class="combo-box-search-icon" />
433
450
  <input
451
+ bind:this={searchInputEl}
434
452
  type="text"
435
453
  class="combo-box-search-input"
436
454
  placeholder={searchPlaceholder}
@@ -453,7 +471,7 @@
453
471
  onclick={() => handleSelect(item)}
454
472
  isActive={countryCode === item.id}
455
473
  isFocused={focusedIndex === index}
456
- variant="primary"
474
+ {color}
457
475
  size="sm"
458
476
  isCompact
459
477
  />
@@ -4,17 +4,18 @@ type Props = {
4
4
  dialCode?: string;
5
5
  placeholder?: string;
6
6
  onchange?: (value: string) => void;
7
- variant?: 'primary' | 'secondary' | 'muted' | 'outlined' | 'line';
7
+ color?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'danger' | 'warning';
8
+ variant?: 'solid' | 'soft' | 'outlined' | 'line';
8
9
  size?: 'sm' | 'md' | 'lg';
9
10
  name?: string;
10
11
  dialCodeName?: string;
11
- class?: string;
12
+ rootClass?: string;
13
+ controlClass?: string;
12
14
  label?: string;
13
15
  isLabelActive?: boolean;
14
16
  helpText?: string;
15
17
  errorText?: string;
16
18
  isFloatLabel?: boolean;
17
- isSolid?: boolean;
18
19
  priorityCountries?: string[];
19
20
  searchPlaceholder?: string;
20
21
  emptyText?: string;
@@ -5,9 +5,9 @@
5
5
  length?: number;
6
6
  values?: string[];
7
7
  class?: string;
8
- variant?: 'solid' | 'outlined' | 'soft' | 'line';
9
- color?: 'primary' | 'secondary' | 'muted';
10
- inputSize?: 'small' | 'medium' | 'large';
8
+ color?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'danger' | 'warning';
9
+ variant?: 'solid' | 'soft' | 'outlined' | 'line';
10
+ size?: 'sm' | 'md' | 'lg';
11
11
  type?: 'text' | 'password' | 'number';
12
12
  name?: string;
13
13
  label?: string;
@@ -18,35 +18,41 @@
18
18
 
19
19
  let {
20
20
  class: className,
21
- variant = 'soft',
22
- color = 'primary',
23
- inputSize = 'medium',
21
+ variant = 'outlined',
22
+ color = 'muted',
23
+ size = 'md',
24
24
  label,
25
25
  name,
26
26
  type = 'text',
27
27
  helpText,
28
28
  errorText,
29
29
  length = 6,
30
+ // svelte-ignore state_referenced_locally
30
31
  values = Array.from({ length }).map(() => ''),
31
32
  oncomplete
32
33
  }: Props = $props();
33
34
 
34
- const variants = {
35
- solid: 'field-solid',
36
- outlined: 'field-outlined',
37
- soft: 'field-soft',
38
- line: 'field-line'
39
- };
40
35
  const colors = {
41
- primary: 'field-primary',
42
- secondary: 'field-secondary',
43
- muted: 'field-muted'
36
+ primary: 'is-primary',
37
+ secondary: 'is-secondary',
38
+ muted: 'is-muted',
39
+ success: 'is-success',
40
+ info: 'is-info',
41
+ danger: 'is-danger',
42
+ warning: 'is-warning'
43
+ };
44
+
45
+ const variants = {
46
+ solid: 'is-solid',
47
+ soft: 'is-soft',
48
+ outlined: 'is-outlined',
49
+ line: 'is-line'
44
50
  };
45
51
 
46
- const sizes = {
47
- small: 'field-small',
48
- medium: 'field-medium',
49
- large: 'field-large'
52
+ const sizeClasses = {
53
+ sm: 'is-sm',
54
+ md: 'is-md',
55
+ lg: 'is-lg'
50
56
  };
51
57
 
52
58
  const uid = $props.id();
@@ -63,7 +69,7 @@
63
69
  values = [...values];
64
70
 
65
71
  if (index < length - 1 && target.value) {
66
- const nextInput = document.getElementById(`input-${index + 1}`) as HTMLInputElement;
72
+ const nextInput = document.getElementById(`${uid}-${name}-${index + 1}`) as HTMLInputElement;
67
73
  if (nextInput) {
68
74
  nextInput.focus();
69
75
  }
@@ -72,7 +78,7 @@
72
78
 
73
79
  const handleKeydown = (event: KeyboardEvent, index: number) => {
74
80
  if (event.key === 'Backspace' && index > 0 && !values[index]) {
75
- const prevInput = document.getElementById(`input-${index - 1}`) as HTMLInputElement;
81
+ const prevInput = document.getElementById(`${uid}-${name}-${index - 1}`) as HTMLInputElement;
76
82
  if (prevInput) {
77
83
  prevInput.focus();
78
84
  }
@@ -87,7 +93,7 @@
87
93
  let lastUpdatedIndex = 0;
88
94
  pasteValues.forEach((char, i) => {
89
95
  values[i] = char;
90
- const input = document.getElementById(`input-${i}`) as HTMLInputElement;
96
+ const input = document.getElementById(`${uid}-${name}-${i}`) as HTMLInputElement;
91
97
  if (input) {
92
98
  input.value = char;
93
99
  }
@@ -95,7 +101,9 @@
95
101
  });
96
102
  values = [...values];
97
103
 
98
- const lastInput = document.getElementById(`input-${lastUpdatedIndex}`) as HTMLInputElement;
104
+ const lastInput = document.getElementById(
105
+ `${uid}-${name}-${lastUpdatedIndex}`
106
+ ) as HTMLInputElement;
99
107
  if (lastInput) {
100
108
  lastInput.focus();
101
109
  }
@@ -112,25 +120,25 @@
112
120
  <div class={cn('field', className)}>
113
121
  <input type="hidden" {name} value={values.join('')} />
114
122
  {#if label}
115
- <label for={`${uid}-{name}`} class="label">{label}</label>
123
+ <span class="field-label">{label}</span>
116
124
  {/if}
117
- <div class="pin-wrapper">
125
+ <div class="field-pin-wrapper">
118
126
  {#each Array.from({ length }) as _, i}
119
- <div
120
- class={cn('field-control', variants[variant], colors[color], sizes[inputSize])}
121
- class:is-error={errorText}
127
+ <label
128
+ class={cn('control', colors[color], variants[variant], sizeClasses[size])}
129
+ for={`${uid}-${name}-${i}`}
122
130
  >
123
131
  <input
124
132
  {type}
125
- id={`input-${i}`}
126
- class="field-pin"
133
+ id={`${uid}-${name}-${i}`}
134
+ class="control-pin"
127
135
  maxlength="1"
128
136
  oninput={(e) => handleInput(e, i)}
129
137
  onkeydown={(e) => handleKeydown(e, i)}
130
138
  onpaste={handlePaste}
131
139
  bind:value={values[i]}
132
140
  />
133
- </div>
141
+ </label>
134
142
  {/each}
135
143
  </div>
136
144
  {#if errorText || helpText}
@@ -2,9 +2,9 @@ type Props = {
2
2
  length?: number;
3
3
  values?: string[];
4
4
  class?: string;
5
- variant?: 'solid' | 'outlined' | 'soft' | 'line';
6
- color?: 'primary' | 'secondary' | 'muted';
7
- inputSize?: 'small' | 'medium' | 'large';
5
+ color?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'danger' | 'warning';
6
+ variant?: 'solid' | 'soft' | 'outlined' | 'line';
7
+ size?: 'sm' | 'md' | 'lg';
8
8
  type?: 'text' | 'password' | 'number';
9
9
  name?: string;
10
10
  label?: string;