uisv 0.0.12 → 0.0.14

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 (65) hide show
  1. package/dist/components/accordion.svelte +108 -0
  2. package/dist/components/accordion.svelte.d.ts +58 -0
  3. package/dist/components/alert.svelte +271 -0
  4. package/dist/components/alert.svelte.d.ts +23 -0
  5. package/dist/components/badge.svelte +225 -0
  6. package/dist/components/badge.svelte.d.ts +19 -0
  7. package/dist/components/banner.svelte +254 -0
  8. package/dist/components/banner.svelte.d.ts +23 -0
  9. package/dist/components/button.svelte +409 -0
  10. package/dist/components/button.svelte.d.ts +49 -0
  11. package/dist/components/card.svelte +70 -0
  12. package/dist/components/card.svelte.d.ts +17 -0
  13. package/dist/components/checkbox-group.svelte +258 -0
  14. package/dist/components/checkbox-group.svelte.d.ts +26 -0
  15. package/dist/components/checkbox.svelte +175 -0
  16. package/dist/components/checkbox.svelte.d.ts +27 -0
  17. package/dist/components/chip.svelte +82 -0
  18. package/dist/components/chip.svelte.d.ts +17 -0
  19. package/dist/components/color-picker.svelte +48 -0
  20. package/dist/components/color-picker.svelte.d.ts +10 -0
  21. package/dist/components/h1.svelte +15 -0
  22. package/dist/components/h1.svelte.d.ts +3 -0
  23. package/dist/components/h2.svelte +19 -0
  24. package/dist/components/h2.svelte.d.ts +3 -0
  25. package/dist/components/h3.svelte +16 -0
  26. package/dist/components/h3.svelte.d.ts +3 -0
  27. package/dist/components/h4.svelte +19 -0
  28. package/dist/components/h4.svelte.d.ts +3 -0
  29. package/dist/components/h5.svelte +19 -0
  30. package/dist/components/h5.svelte.d.ts +3 -0
  31. package/dist/components/h6.svelte +19 -0
  32. package/dist/components/h6.svelte.d.ts +3 -0
  33. package/dist/components/index.d.ts +45 -0
  34. package/dist/components/index.js +45 -0
  35. package/dist/components/input-time.svelte +234 -0
  36. package/dist/components/input-time.svelte.d.ts +54 -0
  37. package/dist/components/input.svelte +285 -0
  38. package/dist/components/input.svelte.d.ts +55 -0
  39. package/dist/components/kbd.svelte +239 -0
  40. package/dist/components/kbd.svelte.d.ts +40 -0
  41. package/dist/components/p.svelte +9 -0
  42. package/dist/components/p.svelte.d.ts +3 -0
  43. package/dist/components/pin-input.svelte +162 -0
  44. package/dist/components/pin-input.svelte.d.ts +25 -0
  45. package/dist/components/placeholder.svelte +34 -0
  46. package/dist/components/placeholder.svelte.d.ts +3 -0
  47. package/dist/components/popover.svelte +151 -0
  48. package/dist/components/popover.svelte.d.ts +88 -0
  49. package/dist/components/progress.svelte +124 -0
  50. package/dist/components/progress.svelte.d.ts +21 -0
  51. package/dist/components/select.svelte +171 -0
  52. package/dist/components/select.svelte.d.ts +50 -0
  53. package/dist/components/slider.svelte +172 -0
  54. package/dist/components/slider.svelte.d.ts +44 -0
  55. package/dist/components/switch.svelte +180 -0
  56. package/dist/components/switch.svelte.d.ts +27 -0
  57. package/dist/components/tabs.svelte +245 -0
  58. package/dist/components/tabs.svelte.d.ts +34 -0
  59. package/dist/index.d.ts +4 -0
  60. package/dist/index.js +3 -0
  61. package/dist/utilities.svelte.d.ts +24 -0
  62. package/dist/utilities.svelte.js +47 -0
  63. package/dist/vite.d.ts +52 -0
  64. package/dist/vite.js +132 -0
  65. package/package.json +35 -38
@@ -0,0 +1,171 @@
1
+ <script module lang="ts">
2
+ import type { PropColor } from '../index.js';
3
+ import { Select } from 'bits-ui';
4
+ import type { Component, Snippet } from 'svelte';
5
+ import { tv } from 'tailwind-variants';
6
+
7
+ export type SelectItem<T> =
8
+ | T
9
+ | {
10
+ icon?: string | Component;
11
+ label: string | Component;
12
+ value: T;
13
+ };
14
+
15
+ export type SelectProps<T> = {
16
+ items: (SelectItem<T> | SelectItem<T>[])[];
17
+ defaultvalue?: T;
18
+ item?: Snippet<[{ item: SelectItem<T> }]>;
19
+ color?: PropColor;
20
+ size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
21
+ variant?: 'outline' | 'soft' | 'subtle' | 'ghost' | 'none';
22
+ highlight?: boolean;
23
+ placeholder?: string;
24
+ } & (
25
+ | {
26
+ value?: T;
27
+ type?: 'single';
28
+ }
29
+ | {
30
+ value?: T[];
31
+ type?: 'multiple';
32
+ }
33
+ );
34
+ </script>
35
+
36
+ <script lang="ts" generics="T extends unknown">
37
+ let {
38
+ value = $bindable(),
39
+ items,
40
+ type = 'single',
41
+ defaultvalue,
42
+ item,
43
+ color = 'primary',
44
+ size = 'md',
45
+ variant = 'outline',
46
+ highlight,
47
+ placeholder,
48
+ }: SelectProps<T> = $props();
49
+
50
+ const classes = $derived(
51
+ tv({
52
+ slots: {
53
+ trigger: 'transition-all rounded w-48 flex items-center justify-between',
54
+ },
55
+ variants: {
56
+ color: {
57
+ primary: {
58
+ trigger: 'outline-primary focus:(border-primary)',
59
+ },
60
+ surface: {
61
+ trigger: 'outline-surface focus:(border-surface)',
62
+ },
63
+ info: {
64
+ trigger: 'outline-info focus:(border-info)',
65
+ },
66
+ success: {
67
+ trigger: 'outline-success focus:(border-success)',
68
+ },
69
+ warning: {
70
+ trigger: 'outline-warning focus:(border-warning)',
71
+ },
72
+ error: {
73
+ trigger: 'outline-error focus:(border-error)',
74
+ },
75
+ },
76
+ size: {
77
+ xs: {
78
+ trigger: 'h-6 px-1 text-xs gap-1',
79
+ },
80
+ sm: {
81
+ trigger: 'h-7 px-2 text-xs gap-1',
82
+ },
83
+ md: {
84
+ trigger: 'h-8 px-2 text-sm gap-2 ',
85
+ },
86
+ lg: {
87
+ trigger: 'h-9 px-3 text-sm gap-3',
88
+ },
89
+ xl: {
90
+ trigger: 'h-10 px-3 gap-4',
91
+ },
92
+ },
93
+ variant: {
94
+ outline: {
95
+ trigger: 'border border-surface-accented focus:(outline)',
96
+ },
97
+ soft: {
98
+ trigger: 'bg-surface-elevated',
99
+ },
100
+ subtle: {
101
+ trigger: 'bg-surface-elevated border border-surface-accented focus:(outline)',
102
+ },
103
+ ghost: {
104
+ trigger: 'hover:bg-surface-elevated',
105
+ },
106
+ none: {},
107
+ },
108
+ placeholder: {
109
+ true: { trigger: 'text-muted' },
110
+ false: {},
111
+ },
112
+ highlight: {
113
+ true: {
114
+ trigger: 'border',
115
+ },
116
+ false: {},
117
+ },
118
+ },
119
+ compoundVariants: [
120
+ { color: 'primary', highlight: true, class: { trigger: 'border-primary-500' } },
121
+ { color: 'surface', highlight: true, class: { trigger: 'border-surface-500' } },
122
+ { color: 'info', highlight: true, class: { trigger: 'border-info-500' } },
123
+ { color: 'success', highlight: true, class: { trigger: 'border-success-500' } },
124
+ { color: 'warning', highlight: true, class: { trigger: 'border-warning-500' } },
125
+ { color: 'error', highlight: true, class: { trigger: 'border-error-500' } },
126
+ ],
127
+ })({ size, color, variant, placeholder: !!placeholder, highlight }),
128
+ );
129
+ </script>
130
+
131
+ {/* @ts-expect-error idek */ null}
132
+ <Select.Root
133
+ {type}
134
+ bind:value={
135
+ () => {
136
+ if (type === 'single') return value as string | string[];
137
+ return value as string | string[];
138
+ },
139
+ (v) => (value = v as T | T[] | undefined)
140
+ }
141
+ >
142
+ <Select.Trigger class={classes.trigger()}>
143
+ {value || placeholder}
144
+ <div class="i-lucide-chevron-down size-4"></div>
145
+ </Select.Trigger>
146
+ <Select.Portal>
147
+ <Select.Content class="bg-red">
148
+ <Select.ScrollUpButton />
149
+ <Select.Viewport>
150
+ {#each items as item, idx (idx)}
151
+ {#if Array.isArray(item)}
152
+ <Select.Group>
153
+ <Select.GroupHeading />
154
+
155
+ {#each item as group_item, gidx (gidx)}
156
+ <Select.Item value=""></Select.Item>
157
+ {/each}
158
+ </Select.Group>
159
+ {:else}
160
+ {@const is_object = typeof item === 'object' && item !== null && 'value' in item}
161
+ <Select.Item value={(is_object ? item.value : item) as string}>
162
+ {item}
163
+ </Select.Item>
164
+ {/if}
165
+ {/each}
166
+
167
+ <Select.ScrollDownButton />
168
+ </Select.Viewport>
169
+ </Select.Content>
170
+ </Select.Portal>
171
+ </Select.Root>
@@ -0,0 +1,50 @@
1
+ import type { PropColor } from '../index.js';
2
+ import { Select } from 'bits-ui';
3
+ import type { Component, Snippet } from 'svelte';
4
+ export type SelectItem<T> = T | {
5
+ icon?: string | Component;
6
+ label: string | Component;
7
+ value: T;
8
+ };
9
+ export type SelectProps<T> = {
10
+ items: (SelectItem<T> | SelectItem<T>[])[];
11
+ defaultvalue?: T;
12
+ item?: Snippet<[{
13
+ item: SelectItem<T>;
14
+ }]>;
15
+ color?: PropColor;
16
+ size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
17
+ variant?: 'outline' | 'soft' | 'subtle' | 'ghost' | 'none';
18
+ highlight?: boolean;
19
+ placeholder?: string;
20
+ } & ({
21
+ value?: T;
22
+ type?: 'single';
23
+ } | {
24
+ value?: T[];
25
+ type?: 'multiple';
26
+ });
27
+ declare function $$render<T extends unknown>(): {
28
+ props: SelectProps<T>;
29
+ exports: {};
30
+ bindings: "value";
31
+ slots: {};
32
+ events: {};
33
+ };
34
+ declare class __sveltets_Render<T extends unknown> {
35
+ props(): ReturnType<typeof $$render<T>>['props'];
36
+ events(): ReturnType<typeof $$render<T>>['events'];
37
+ slots(): ReturnType<typeof $$render<T>>['slots'];
38
+ bindings(): "value";
39
+ exports(): {};
40
+ }
41
+ interface $$IsomorphicComponent {
42
+ new <T extends unknown>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
43
+ $$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
44
+ } & ReturnType<__sveltets_Render<T>['exports']>;
45
+ <T extends unknown>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
46
+ z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
47
+ }
48
+ declare const Select: $$IsomorphicComponent;
49
+ type Select<T extends unknown> = InstanceType<typeof Select<T>>;
50
+ export default Select;
@@ -0,0 +1,172 @@
1
+ <script module lang="ts">
2
+ import { Slider } from 'bits-ui';
3
+ import type { PropColor } from '../index.js';
4
+ import type { ClassNameValue } from 'tailwind-merge';
5
+ import { tv } from 'tailwind-variants';
6
+
7
+ export type SliderProps<T> = {
8
+ value?: T;
9
+ default?: number | number[];
10
+ color?: PropColor;
11
+ size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
12
+ disabled?: boolean;
13
+ thumblabel?: boolean;
14
+ orientation?: 'vertical' | 'horizontal';
15
+ step?: number;
16
+ min?: number;
17
+ max?: number;
18
+ ui?: {
19
+ root?: ClassNameValue;
20
+ range?: ClassNameValue;
21
+ thumb?: ClassNameValue;
22
+ };
23
+ };
24
+ </script>
25
+
26
+ <script lang="ts" generics="T extends number | number[]">
27
+ let {
28
+ value = $bindable(),
29
+ default: def_value = 0,
30
+ color = 'primary',
31
+ size = 'md',
32
+ disabled,
33
+ thumblabel,
34
+ orientation = 'horizontal',
35
+ step,
36
+ min,
37
+ max,
38
+ ui = {}
39
+ }: SliderProps<T> = $props();
40
+
41
+ const default_value = $derived.by(() => {
42
+ if (typeof def_value === 'number') return [def_value];
43
+
44
+ return def_value;
45
+ });
46
+ let slider_value = $derived({
47
+ get() {
48
+ if (typeof value === 'number') return [value];
49
+
50
+ return (value as number[]) ?? default_value;
51
+ },
52
+ set(v: number[]) {
53
+ value = (v?.length !== 1 ? v : v[0]) as T;
54
+ }
55
+ });
56
+ const thumbs = $derived(slider_value.get()?.length ?? 1);
57
+ const classes = $derived.by(() =>
58
+ tv({
59
+ slots: {
60
+ root: [
61
+ 'relative w-full flex rounded-full bg-neutral-300',
62
+ orientation === 'horizontal' ? 'items-center' : 'justify-center mx-1'
63
+ ],
64
+ range: [
65
+ 'rounded-full bg-neutral-200 p-0.5 relative transition',
66
+ orientation === 'horizontal' ? 'h-full' : 'w-full'
67
+ ],
68
+ thumb: 'bg-white rounded-full border-2 outline-none transition',
69
+ tick: ''
70
+ },
71
+ variants: {
72
+ color: {
73
+ primary: {
74
+ root: '',
75
+ range: 'bg-primary-500',
76
+ thumb: 'border-primary-500'
77
+ },
78
+ surface: {
79
+ range: ['bg-neutral-900'],
80
+ thumb: 'border-neutral-900'
81
+ },
82
+ info: {
83
+ range: ['bg-info-500'],
84
+ thumb: 'border-info-500'
85
+ },
86
+ success: {
87
+ range: ['bg-success-500'],
88
+ thumb: 'border-success-500'
89
+ },
90
+ warning: {
91
+ range: ['bg-warning-500'],
92
+ thumb: 'border-warning-500'
93
+ },
94
+ error: {
95
+ range: ['bg-error-500'],
96
+ thumb: 'border-error-500'
97
+ }
98
+ },
99
+ size: {
100
+ xs: {
101
+ root: [orientation === 'horizontal' ? 'h-1.5' : ''],
102
+ thumb: 'size-4',
103
+ tick: 'size-2.5'
104
+ },
105
+ sm: {
106
+ root: [orientation === 'horizontal' ? 'h-1.75' : ''],
107
+ thumb: 'size-4.5',
108
+ tick: 'size-3'
109
+ },
110
+ md: {
111
+ root: [orientation === 'horizontal' ? 'h-2' : 'w-2 h-48'],
112
+ thumb: 'size-5',
113
+ tick: 'size-3.5'
114
+ },
115
+ lg: {
116
+ root: [orientation === 'horizontal' ? 'h-2.5' : ''],
117
+ thumb: 'size-5.5',
118
+ tick: 'size-4'
119
+ },
120
+ xl: {
121
+ root: [orientation === 'horizontal' ? 'h-3' : 'w-3'],
122
+ thumb: 'size-6',
123
+ tick: 'size-4.5'
124
+ }
125
+ },
126
+ orientation: {
127
+ horizontal: {
128
+ root: '',
129
+ thumb: '',
130
+ tick: ''
131
+ },
132
+ vertical: {
133
+ root: '',
134
+ thumb: '',
135
+ tick: ''
136
+ }
137
+ }
138
+ },
139
+ compoundVariants: []
140
+ })({ color, size, orientation })
141
+ );
142
+ </script>
143
+
144
+ <Slider.Root
145
+ type="multiple"
146
+ bind:value={slider_value.get, slider_value.set}
147
+ {min}
148
+ {max}
149
+ {step}
150
+ {orientation}
151
+ {disabled}
152
+ class={classes.root({ class: [disabled ? 'opacity-75 cursor-not-allowed' : '', ui.root] })}
153
+ >
154
+ <Slider.Range class={classes.range({ class: [ui.range] })} />
155
+
156
+ {#each { length: thumbs }, index (index)}
157
+ <Slider.Thumb {index} class={classes.thumb({ class: ['group', ui.thumb] })}>
158
+ {#if thumblabel}
159
+ <Slider.ThumbLabel
160
+ {index}
161
+ position="bottom"
162
+ class={[
163
+ 'opacity-0 transition pointer-events-none text-sm shadow-md px-2 h-6 flex items-center rounded-md mt-1 border border-surface-200',
164
+ 'data-[active=""]:(opacity-100) group-hover:(opacity-100)'
165
+ ]}
166
+ >
167
+ {slider_value.get()[index]}
168
+ </Slider.ThumbLabel>
169
+ {/if}
170
+ </Slider.Thumb>
171
+ {/each}
172
+ </Slider.Root>
@@ -0,0 +1,44 @@
1
+ import { Slider } from 'bits-ui';
2
+ import type { PropColor } from '../index.js';
3
+ import type { ClassNameValue } from 'tailwind-merge';
4
+ export type SliderProps<T> = {
5
+ value?: T;
6
+ default?: number | number[];
7
+ color?: PropColor;
8
+ size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
9
+ disabled?: boolean;
10
+ thumblabel?: boolean;
11
+ orientation?: 'vertical' | 'horizontal';
12
+ step?: number;
13
+ min?: number;
14
+ max?: number;
15
+ ui?: {
16
+ root?: ClassNameValue;
17
+ range?: ClassNameValue;
18
+ thumb?: ClassNameValue;
19
+ };
20
+ };
21
+ declare function $$render<T extends number | number[]>(): {
22
+ props: SliderProps<T>;
23
+ exports: {};
24
+ bindings: "value";
25
+ slots: {};
26
+ events: {};
27
+ };
28
+ declare class __sveltets_Render<T extends number | number[]> {
29
+ props(): ReturnType<typeof $$render<T>>['props'];
30
+ events(): ReturnType<typeof $$render<T>>['events'];
31
+ slots(): ReturnType<typeof $$render<T>>['slots'];
32
+ bindings(): "value";
33
+ exports(): {};
34
+ }
35
+ interface $$IsomorphicComponent {
36
+ new <T extends number | number[]>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
37
+ $$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
38
+ } & ReturnType<__sveltets_Render<T>['exports']>;
39
+ <T extends number | number[]>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
40
+ z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
41
+ }
42
+ declare const Slider: $$IsomorphicComponent;
43
+ type Slider<T extends number | number[]> = InstanceType<typeof Slider<T>>;
44
+ export default Slider;
@@ -0,0 +1,180 @@
1
+ <script module lang="ts">
2
+ import { type PropColor, isComponent, isSnippet } from '../index.js';
3
+ import type { Snippet } from 'svelte';
4
+ import type { ClassNameValue } from 'tailwind-merge';
5
+ import { tv } from 'tailwind-variants';
6
+ import type { Component } from 'vitest-browser-svelte';
7
+
8
+ export type SwitchProps = {
9
+ value?: boolean;
10
+ color?: PropColor;
11
+ size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
12
+ disabled?: boolean;
13
+ loading?: boolean;
14
+ loadingicon?: string | Snippet | Component;
15
+ uncheckedicon?: string | Snippet | Component;
16
+ checkedicon?: string | Snippet | Component;
17
+ label?: string | Snippet;
18
+ description?: string | Snippet;
19
+ required?: boolean;
20
+ ui?: {
21
+ root?: ClassNameValue;
22
+ container?: ClassNameValue;
23
+ thumb?: ClassNameValue;
24
+ label?: ClassNameValue;
25
+ description?: ClassNameValue;
26
+ };
27
+ };
28
+ </script>
29
+
30
+ <script lang="ts">
31
+ let {
32
+ value = $bindable(false),
33
+ color = 'primary',
34
+ size = 'md',
35
+ disabled,
36
+ loading,
37
+ loadingicon = 'i-lucide-loader-circle',
38
+ uncheckedicon,
39
+ checkedicon,
40
+ label,
41
+ description,
42
+ required,
43
+ ui = {},
44
+ }: SwitchProps = $props();
45
+
46
+ const classes = $derived.by(() =>
47
+ tv({
48
+ slots: {
49
+ root: 'flex-inline gap-2',
50
+ container: 'rounded-full bg-neutral-200 p-0.5 relative transition',
51
+ thumb: [
52
+ 'bg-white block rounded-full absolute top-0.5 transition grid place-items-center',
53
+ value ? 'translate-x-full' : 'text-neutral-500',
54
+ ],
55
+ icon: 'pi',
56
+ label: 'text-sm',
57
+ description: 'text-sm text-neutral-500',
58
+ },
59
+ variants: {
60
+ color: {
61
+ primary: {
62
+ container: ['', value && 'bg-primary-500 text-primary-500'],
63
+ },
64
+ surface: {
65
+ container: ['', value && 'bg-neutral-900 text-neutral-900'],
66
+ },
67
+ info: {
68
+ container: ['', value && 'bg-info-500 text-info-500'],
69
+ },
70
+ success: {
71
+ container: ['', value && 'bg-success-500 text-success-500'],
72
+ },
73
+ warning: {
74
+ container: ['', value && 'bg-warning-500 text-warning-500'],
75
+ },
76
+ error: {
77
+ container: ['', value && 'bg-error-500 text-error-500'],
78
+ },
79
+ },
80
+ size: {
81
+ xs: {
82
+ container: 'w-7 min-w-7 h-4',
83
+ thumb: 'size-3',
84
+ icon: 'size-2.5',
85
+ },
86
+ sm: {
87
+ container: 'w-8 min-w-8 h-4.5',
88
+ thumb: 'size-3.5',
89
+ icon: 'size-3',
90
+ },
91
+ md: {
92
+ container: 'w-9 min-w-9 h-5',
93
+ thumb: 'size-4',
94
+ icon: 'size-3.5',
95
+ },
96
+ lg: {
97
+ container: 'w-10 min-w-10 h-5.5',
98
+ thumb: 'size-4.5',
99
+ icon: 'size-4',
100
+ },
101
+ xl: {
102
+ container: 'w-11 min-w-11 h-6',
103
+ thumb: 'size-5',
104
+ icon: 'size-4.5',
105
+ },
106
+ },
107
+ },
108
+ compoundVariants: [],
109
+ })({ color, size }),
110
+ );
111
+ </script>
112
+
113
+ <div
114
+ data-state={value ? 'checked' : 'unchecked'}
115
+ class={classes.root({
116
+ class: [(loading || disabled) && 'opacity-50', ui.thumb],
117
+ })}
118
+ >
119
+ <button
120
+ aria-label="switch"
121
+ data-state={value ? 'checked' : 'unchecked'}
122
+ class={classes.container({ class: [loading && 'cursor-not-allowed', ui.thumb] })}
123
+ onclick={() => {
124
+ console.log('click');
125
+ if (loading) return;
126
+ value = !value;
127
+ }}
128
+ >
129
+ <span data-state={value ? 'checked' : 'unchecked'} class={classes.thumb({ class: ui.thumb })}>
130
+ {@render Icon(uncheckedicon, [(loading || value) && 'opacity-0'])}
131
+ {@render Icon(checkedicon, [(loading || !value) && 'opacity-0'])}
132
+ {@render Icon(loadingicon || 'i-lucide-loader-circle', [
133
+ 'animate-spin',
134
+ !loading && 'opacity-0',
135
+ ])}
136
+ </span>
137
+ </button>
138
+
139
+ {#if label}
140
+ <span>
141
+ <div
142
+ class={classes.label({
143
+ class: [required ? 'after:content-["*"] after:text-error-500' : '', ui.thumb],
144
+ })}
145
+ >
146
+ {#if typeof label === 'string'}
147
+ {label}
148
+ {:else}
149
+ {@render label()}
150
+ {/if}
151
+ </div>
152
+
153
+ {#if description}
154
+ <div class={classes.description({ class: ui.thumb })}>
155
+ {#if typeof description === 'string'}
156
+ {description}
157
+ {:else}
158
+ {@render description()}
159
+ {/if}
160
+ </div>
161
+ {/if}
162
+ </span>
163
+ {/if}
164
+ </div>
165
+
166
+ {#snippet Icon(ico?: SwitchProps['checkedicon'], icon_class?: ClassNameValue)}
167
+ <div class={['absolute', icon_class]}>
168
+ {#if typeof ico === 'string'}
169
+ <div
170
+ data-state={value ? 'checked' : 'unchecked'}
171
+ class={classes.icon({ class: [ico] })}
172
+ ></div>
173
+ {:else if isSnippet(ico)}
174
+ {@render ico()}
175
+ {:else if isComponent(ico)}
176
+ {@const Iconn = ico}
177
+ <Iconn />
178
+ {/if}
179
+ </div>
180
+ {/snippet}
@@ -0,0 +1,27 @@
1
+ import { type PropColor } from '../index.js';
2
+ import type { Snippet } from 'svelte';
3
+ import type { ClassNameValue } from 'tailwind-merge';
4
+ import type { Component } from 'vitest-browser-svelte';
5
+ export type SwitchProps = {
6
+ value?: boolean;
7
+ color?: PropColor;
8
+ size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
9
+ disabled?: boolean;
10
+ loading?: boolean;
11
+ loadingicon?: string | Snippet | Component;
12
+ uncheckedicon?: string | Snippet | Component;
13
+ checkedicon?: string | Snippet | Component;
14
+ label?: string | Snippet;
15
+ description?: string | Snippet;
16
+ required?: boolean;
17
+ ui?: {
18
+ root?: ClassNameValue;
19
+ container?: ClassNameValue;
20
+ thumb?: ClassNameValue;
21
+ label?: ClassNameValue;
22
+ description?: ClassNameValue;
23
+ };
24
+ };
25
+ declare const Switch: import("svelte").Component<SwitchProps, {}, "value">;
26
+ type Switch = ReturnType<typeof Switch>;
27
+ export default Switch;