@makolabs/ripple 0.0.1-dev.7 → 0.0.1-dev.8

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 (114) hide show
  1. package/README.md +393 -53
  2. package/dist/button/Button.svelte +5 -3
  3. package/dist/button/Button.svelte.d.ts +1 -1
  4. package/dist/button/button.d.ts +40 -63
  5. package/dist/button/button.js +15 -14
  6. package/dist/charts/Chart.svelte +533 -0
  7. package/dist/charts/Chart.svelte.d.ts +4 -0
  8. package/dist/drawer/Drawer.svelte +13 -2
  9. package/dist/drawer/Drawer.svelte.d.ts +1 -1
  10. package/dist/drawer/drawer.d.ts +0 -17
  11. package/dist/elements/alert/Alert.svelte +53 -0
  12. package/dist/elements/alert/Alert.svelte.d.ts +4 -0
  13. package/dist/elements/badge/Badge.svelte +13 -5
  14. package/dist/elements/badge/Badge.svelte.d.ts +1 -1
  15. package/dist/elements/badge/badge.d.ts +0 -12
  16. package/dist/elements/dropdown/Dropdown.svelte +32 -37
  17. package/dist/elements/dropdown/Dropdown.svelte.d.ts +1 -1
  18. package/dist/elements/dropdown/Select.svelte +143 -59
  19. package/dist/elements/dropdown/Select.svelte.d.ts +1 -1
  20. package/dist/elements/dropdown/dropdown.d.ts +34 -57
  21. package/dist/elements/dropdown/dropdown.js +10 -4
  22. package/dist/elements/dropdown/select.d.ts +34 -54
  23. package/dist/elements/dropdown/select.js +22 -14
  24. package/dist/elements/file-upload/FileUpload.svelte +213 -0
  25. package/dist/elements/file-upload/FileUpload.svelte.d.ts +4 -0
  26. package/dist/elements/progress/Progress.svelte +87 -0
  27. package/dist/elements/progress/Progress.svelte.d.ts +4 -0
  28. package/dist/elements/timeline/Timeline.svelte +92 -0
  29. package/dist/elements/timeline/Timeline.svelte.d.ts +7 -0
  30. package/dist/forms/Checkbox.svelte +54 -0
  31. package/dist/forms/Checkbox.svelte.d.ts +4 -0
  32. package/dist/forms/DateRange.svelte +493 -0
  33. package/dist/forms/DateRange.svelte.d.ts +4 -0
  34. package/dist/forms/Form.svelte +39 -0
  35. package/dist/forms/Form.svelte.d.ts +4 -0
  36. package/dist/forms/Input.svelte +86 -0
  37. package/dist/forms/Input.svelte.d.ts +4 -0
  38. package/dist/forms/NumberInput.svelte +159 -0
  39. package/dist/forms/NumberInput.svelte.d.ts +4 -0
  40. package/dist/forms/RadioInputs.svelte +64 -0
  41. package/dist/forms/RadioInputs.svelte.d.ts +4 -0
  42. package/dist/forms/RadioPill.svelte +66 -0
  43. package/dist/forms/RadioPill.svelte.d.ts +4 -0
  44. package/dist/forms/Slider.svelte +342 -0
  45. package/dist/forms/Slider.svelte.d.ts +4 -0
  46. package/dist/forms/Tags.svelte +181 -0
  47. package/dist/forms/Tags.svelte.d.ts +4 -0
  48. package/dist/forms/Toggle.svelte +132 -0
  49. package/dist/forms/Toggle.svelte.d.ts +4 -0
  50. package/dist/forms/slider.d.ts +143 -0
  51. package/dist/forms/slider.js +62 -0
  52. package/dist/header/Breadcrumbs.svelte +2 -1
  53. package/dist/header/Breadcrumbs.svelte.d.ts +1 -1
  54. package/dist/header/PageHeader.svelte +2 -2
  55. package/dist/header/PageHeader.svelte.d.ts +1 -1
  56. package/dist/header/breadcrumbs.d.ts +20 -14
  57. package/dist/header/breadcrumbs.js +6 -0
  58. package/dist/header/pageheaders.d.ts +1 -1
  59. package/dist/helper/date.d.ts +7 -0
  60. package/dist/helper/date.js +15 -0
  61. package/dist/index.d.ts +742 -9
  62. package/dist/index.js +59 -16
  63. package/dist/layout/card/Card.svelte +5 -8
  64. package/dist/layout/card/Card.svelte.d.ts +1 -1
  65. package/dist/layout/card/StatsCard.svelte +116 -87
  66. package/dist/layout/card/card.d.ts +22 -33
  67. package/dist/layout/card/card.js +9 -8
  68. package/dist/layout/card/stats-card.d.ts +23 -25
  69. package/dist/layout/card/stats-card.js +13 -13
  70. package/dist/layout/navbar/navbar.d.ts +0 -23
  71. package/dist/layout/sidebar/NavGroup.svelte +20 -44
  72. package/dist/layout/sidebar/NavGroup.svelte.d.ts +1 -1
  73. package/dist/layout/sidebar/NavItem.svelte +1 -1
  74. package/dist/layout/sidebar/NavItem.svelte.d.ts +1 -1
  75. package/dist/layout/sidebar/Sidebar.svelte +19 -25
  76. package/dist/layout/sidebar/Sidebar.svelte.d.ts +1 -1
  77. package/dist/layout/table/table.d.ts +1 -1
  78. package/dist/layout/tabs/tabs.d.ts +1 -1
  79. package/dist/modal/Modal.svelte +2 -1
  80. package/dist/modal/Modal.svelte.d.ts +1 -1
  81. package/dist/modal/modal.d.ts +0 -23
  82. package/dist/sonner/sonner.svelte +13 -0
  83. package/dist/sonner/sonner.svelte.d.ts +4 -0
  84. package/dist/types/variants.d.ts +1 -21
  85. package/dist/types/variants.js +1 -19
  86. package/dist/variants.d.ts +20 -0
  87. package/dist/variants.js +19 -0
  88. package/package.json +6 -2
  89. package/dist/button/index.d.ts +0 -1
  90. package/dist/button/index.js +0 -1
  91. package/dist/drawer/index.d.ts +0 -2
  92. package/dist/drawer/index.js +0 -1
  93. package/dist/elements/badge/index.d.ts +0 -2
  94. package/dist/elements/badge/index.js +0 -2
  95. package/dist/elements/dropdown/index.d.ts +0 -3
  96. package/dist/elements/dropdown/index.js +0 -2
  97. package/dist/header/index.d.ts +0 -4
  98. package/dist/header/index.js +0 -2
  99. package/dist/layout/card/index.d.ts +0 -4
  100. package/dist/layout/card/index.js +0 -2
  101. package/dist/layout/index.d.ts +0 -5
  102. package/dist/layout/index.js +0 -5
  103. package/dist/layout/navbar/index.d.ts +0 -2
  104. package/dist/layout/navbar/index.js +0 -2
  105. package/dist/layout/sidebar/index.d.ts +0 -2
  106. package/dist/layout/sidebar/index.js +0 -1
  107. package/dist/layout/sidebar/sidebar.d.ts +0 -46
  108. package/dist/layout/sidebar/sidebar.js +0 -1
  109. package/dist/layout/table/index.d.ts +0 -3
  110. package/dist/layout/table/index.js +0 -2
  111. package/dist/layout/tabs/index.d.ts +0 -3
  112. package/dist/layout/tabs/index.js +0 -3
  113. package/dist/modal/index.d.ts +0 -1
  114. package/dist/modal/index.js +0 -1
@@ -0,0 +1,213 @@
1
+ <script lang="ts">
2
+ import { cn } from '../../helper/cls.js';
3
+ import type { FileUploadProps } from '../../index.js';
4
+
5
+ let {
6
+ allowedMimeTypes = [],
7
+ maxFiles = 10,
8
+ maxSize,
9
+ class: className = '',
10
+ dropzoneClass = '',
11
+ previewClass = '',
12
+ id = 'file-upload',
13
+ onfiles = undefined,
14
+ ondelete = undefined,
15
+ files = []
16
+ }: FileUploadProps = $props();
17
+
18
+ const disabled = $derived(maxFiles <= 0);
19
+
20
+ let isDragging = $state(false);
21
+ let inputRef: HTMLInputElement;
22
+
23
+ function handleFiles(newFiles: FileList | File[]) {
24
+ if (disabled) return;
25
+ if (onfiles) onfiles(newFiles);
26
+ }
27
+
28
+ function handleDeleteFile(fileId: string, index: number) {
29
+ if (ondelete) ondelete(fileId, index);
30
+ }
31
+
32
+ function handleDragEnter(e: DragEvent) {
33
+ e.preventDefault();
34
+ e.stopPropagation();
35
+ if (!disabled) isDragging = true;
36
+ }
37
+
38
+ function handleDragLeave(e: DragEvent) {
39
+ e.preventDefault();
40
+ e.stopPropagation();
41
+ isDragging = false;
42
+ }
43
+
44
+ function handleDrop(e: DragEvent) {
45
+ e.preventDefault();
46
+ e.stopPropagation();
47
+ isDragging = false;
48
+ if (!disabled && e.dataTransfer?.files) {
49
+ handleFiles(e.dataTransfer.files);
50
+ }
51
+ }
52
+
53
+ function handleInputChange(e: Event) {
54
+ const input = e.target as HTMLInputElement;
55
+ if (input.files) {
56
+ handleFiles(input.files);
57
+ input.value = '';
58
+ }
59
+ }
60
+
61
+ function handleDragOver(e: DragEvent) {
62
+ e.preventDefault();
63
+ e.stopPropagation();
64
+ if (!disabled) isDragging = true;
65
+ }
66
+
67
+ function formatFileSize(bytes: number): string {
68
+ if (bytes === 0) return '0 B';
69
+ const k = 1024;
70
+ const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
71
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
72
+ return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))}${sizes[i]}`;
73
+ }
74
+ </script>
75
+
76
+ <div class={cn('w-full', className)}>
77
+ <label
78
+ class={cn(
79
+ 'group relative block rounded-[32px] border-2 border-dashed p-12 text-center transition-colors',
80
+ isDragging ? 'border-primary-400 bg-primary-50' : 'border-default-200 bg-white',
81
+ disabled ? 'cursor-not-allowed opacity-50' : 'hover:bg-default-50 cursor-pointer',
82
+ dropzoneClass
83
+ )}
84
+ ondragenter={handleDragEnter}
85
+ ondragleave={handleDragLeave}
86
+ ondragover={handleDragOver}
87
+ ondrop={handleDrop}
88
+ for={id}
89
+ >
90
+ <input
91
+ type="file"
92
+ bind:this={inputRef}
93
+ accept={allowedMimeTypes.join(',')}
94
+ multiple={maxFiles !== 1}
95
+ {disabled}
96
+ class="hidden"
97
+ onchange={handleInputChange}
98
+ {id}
99
+ />
100
+
101
+ <div class="flex flex-col items-center gap-4">
102
+ <!-- Upload Icon -->
103
+ <div class="bg-primary-100 mb-2 flex size-24 items-center justify-center rounded-full">
104
+ <svg
105
+ xmlns="http://www.w3.org/2000/svg"
106
+ class="text-primary-500 size-12"
107
+ viewBox="0 0 24 24"
108
+ >
109
+ <path
110
+ fill="currentColor"
111
+ d="M11 14.2V6.8l-3.7 3.7L6 9l6-6l6 6l-1.3 1.4L13 6.8v7.4zm-5 4.3h12v2H6z"
112
+ />
113
+ </svg>
114
+ </div>
115
+
116
+ <!-- Upload Text -->
117
+ <div class="text-lg">
118
+ <span class="text-primary-500 font-medium">Click here</span>
119
+ <span class="text-default-600"> to upload your file or drag and drop.</span>
120
+ </div>
121
+
122
+ <!-- File Type Info -->
123
+ <div class="text-default-500 text-sm">
124
+ Supported Format: {allowedMimeTypes.length ? allowedMimeTypes.join(', ') : 'SVG, JPG, PNG'}
125
+ {#if maxSize}
126
+ ({formatFileSize(maxSize)} each)
127
+ {:else}
128
+ (10MB each)
129
+ {/if}
130
+ </div>
131
+ </div>
132
+ </label>
133
+
134
+ <!-- File List -->
135
+ {#if files.length > 0}
136
+ <ul class={cn('mt-6 space-y-3', previewClass)}>
137
+ {#each files as file, i (i)}
138
+ <li
139
+ class={cn('flex items-center justify-between rounded-xl p-4 ring-4', {
140
+ 'bg-danger-50 ring-danger-100': file.status === 'error',
141
+ 'bg-success-50 ring-success-100': file.status === 'success',
142
+ 'ring-primary-100/30 bg-white': file.status === 'uploading'
143
+ })}
144
+ >
145
+ <div class="flex flex-1 items-center gap-3">
146
+ <!-- File Icon -->
147
+ <div
148
+ class={cn('flex size-10 items-center justify-center rounded-full', {
149
+ 'bg-danger-100 text-danger-500': file.status === 'error',
150
+ 'bg-success-100 text-success-500': file.status === 'success',
151
+ 'bg-primary-100 text-primary-500': file.status === 'uploading'
152
+ })}
153
+ >
154
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-5" viewBox="0 0 24 24">
155
+ <path
156
+ fill="currentColor"
157
+ d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8l-6-6z"
158
+ />
159
+ </svg>
160
+ </div>
161
+
162
+ <div class="flex-1">
163
+ <!-- Filename and Size -->
164
+ <div class="mb-1 flex items-center justify-between">
165
+ <span class="text-default-700 font-medium">{file.OriginalFilename}</span>
166
+ <span class="text-default-500 text-sm">{formatFileSize(file.Size)}</span>
167
+ </div>
168
+
169
+ <!-- Status Information -->
170
+ {#if file.status === 'uploading'}
171
+ <div class="bg-default-100 h-1.5 w-full rounded-full">
172
+ <div
173
+ class="bg-primary-500 h-1.5 rounded-full transition-all duration-300"
174
+ style="width: {file.progress || 0}%"
175
+ ></div>
176
+ </div>
177
+ <span class="text-default-500 mt-1 text-sm">{file.progress || 0}%</span>
178
+ {:else if file.status === 'error'}
179
+ <div class="flex items-center justify-between">
180
+ <span class="text-danger-500 text-sm">Upload failed!</span>
181
+ <span class="text-danger-600 cursor-help text-sm font-medium"
182
+ >Please try again!</span
183
+ >
184
+ </div>
185
+ {:else if file.status === 'success'}
186
+ <p class="text-success-500 text-sm">Upload Successful!</p>
187
+ {/if}
188
+ </div>
189
+ </div>
190
+
191
+ <button
192
+ type="button"
193
+ aria-label="Delete file"
194
+ class={cn('ml-4 flex size-6 cursor-pointer items-center justify-center rounded-lg', {
195
+ 'bg-danger-100 text-danger-500': file.status === 'error',
196
+ 'bg-success-100 text-success-500': file.status === 'success',
197
+ 'bg-default-100 text-default-500': file.status === 'uploading'
198
+ })}
199
+ onclick={() => (file.FileID ? handleDeleteFile(file.FileID, i) : ondelete?.('', i))}
200
+ disabled={file.status === 'uploading'}
201
+ >
202
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-4" viewBox="0 0 24 24">
203
+ <path
204
+ fill="currentColor"
205
+ d="M19 6.41L17.59 5L12 10.59L6.41 5L5 6.41L10.59 12L5 17.59L6.41 19L12 13.41L17.59 19L19 17.59L13.41 12L19 6.41z"
206
+ />
207
+ </svg>
208
+ </button>
209
+ </li>
210
+ {/each}
211
+ </ul>
212
+ {/if}
213
+ </div>
@@ -0,0 +1,4 @@
1
+ import type { FileUploadProps } from '../../index.js';
2
+ declare const FileUpload: import("svelte").Component<FileUploadProps, {}, "">;
3
+ type FileUpload = ReturnType<typeof FileUpload>;
4
+ export default FileUpload;
@@ -0,0 +1,87 @@
1
+ <script lang="ts">
2
+ import { cn } from '../../helper/cls.js';
3
+ import { Color, Size } from '../../variants.js';
4
+ import type { ProgressProps } from '../../index.js';
5
+
6
+ let {
7
+ value,
8
+ max = 100,
9
+ size = Size.BASE,
10
+ color = Color.PRIMARY,
11
+ showLabel = true,
12
+ labelPosition = 'right',
13
+ class: className = '',
14
+ labelClass = '',
15
+ barClass = ''
16
+ }: ProgressProps = $props();
17
+
18
+ const percentage = $derived(Math.min(Math.round((value / max) * 100), 100));
19
+
20
+ const containerClass = $derived(
21
+ cn(
22
+ 'relative flex items-center',
23
+ {
24
+ 'flex-col gap-1': labelPosition === 'top' || labelPosition === 'bottom',
25
+ 'flex-row gap-3': labelPosition === 'right'
26
+ },
27
+ className
28
+ )
29
+ );
30
+
31
+ const progressClass = $derived(
32
+ cn('w-full rounded-full bg-gray-200', {
33
+ 'h-1.5': size === Size.XS,
34
+ 'h-2': size === Size.SM,
35
+ 'h-2.5': size === Size.BASE,
36
+ 'h-3': size === Size.LG,
37
+ 'h-4': size === Size.XL,
38
+ 'order-2': labelPosition === 'top',
39
+ 'order-1': labelPosition === 'bottom'
40
+ })
41
+ );
42
+
43
+ const fillClass = $derived(
44
+ cn(
45
+ 'h-full rounded-full transition-all',
46
+ {
47
+ 'bg-primary-600': color === Color.PRIMARY,
48
+ 'bg-secondary-600': color === Color.SECONDARY,
49
+ 'bg-success-600': color === Color.SUCCESS,
50
+ 'bg-danger-600': color === Color.DANGER,
51
+ 'bg-warning-600': color === Color.WARNING,
52
+ 'bg-info-600': color === Color.INFO,
53
+ 'bg-gray-600': color === Color.DEFAULT
54
+ },
55
+ barClass
56
+ )
57
+ );
58
+
59
+ const labelTextClass = $derived(
60
+ cn(
61
+ 'text-gray-500',
62
+ {
63
+ 'text-xs': size === Size.XS || size === Size.SM,
64
+ 'text-sm': size === Size.BASE,
65
+ 'text-base': size === Size.LG || size === Size.XL,
66
+ 'order-1': labelPosition === 'top',
67
+ 'order-2': labelPosition === 'bottom'
68
+ },
69
+ labelClass
70
+ )
71
+ );
72
+ </script>
73
+
74
+ <div class={containerClass}>
75
+ <div
76
+ class={progressClass}
77
+ role="progressbar"
78
+ aria-valuenow={percentage}
79
+ aria-valuemin="0"
80
+ aria-valuemax="100"
81
+ >
82
+ <div class={fillClass} style="width: {percentage}%"></div>
83
+ </div>
84
+ {#if showLabel}
85
+ <span class={labelTextClass}>{percentage}%</span>
86
+ {/if}
87
+ </div>
@@ -0,0 +1,4 @@
1
+ import type { ProgressProps } from '../../index.js';
2
+ declare const Progress: import("svelte").Component<ProgressProps, {}, "">;
3
+ type Progress = ReturnType<typeof Progress>;
4
+ export default Progress;
@@ -0,0 +1,92 @@
1
+ <script lang="ts">
2
+ import { cn } from '../../helper/cls.js';
3
+ import type { TimelineItem } from '../../index.js';
4
+ import { formatDateTime, getRelativeTime } from '../../helper/date.js';
5
+
6
+ let { items = [] as TimelineItem[], class: className = '' } = $props();
7
+ </script>
8
+
9
+ <div class={cn('flow-root', className)}>
10
+ <ul role="list" class="-mb-8">
11
+ {#each items as item, index}
12
+ <li>
13
+ <div class="relative pb-8">
14
+ {#if index !== items.length - 1}
15
+ <span class="bg-default-200 absolute top-4 left-4 -ml-px h-full w-1" aria-hidden="true"
16
+ ></span>
17
+ {/if}
18
+
19
+ {@render ItemWrap({ item })}
20
+ </div>
21
+ </li>
22
+ {/each}
23
+ </ul>
24
+ </div>
25
+
26
+ {#snippet ItemWrap({ item }: { item: TimelineItem })}
27
+ <div class="relative flex gap-x-3" class:items-center={!item.details}>
28
+ <div class="relative ml-0.5 flex-shrink-0">
29
+ {@render TimelineIcon(item)}
30
+ </div>
31
+ {#if item.details}
32
+ {@render CommentItem({ item })}
33
+ {:else}
34
+ {@render StandardItem({ item })}
35
+ {/if}
36
+ </div>
37
+ {/snippet}
38
+
39
+ {#snippet StandardItem({ item }: { item: TimelineItem })}
40
+ <div class="min-w-0 flex-1">
41
+ <div class="flex items-center justify-between">
42
+ <p class="text-default-500 text-sm">
43
+ {item.title}
44
+ {#if item.link}
45
+ <a href={item.link.url} class="text-default-900 font-medium">{item.link.text}</a>
46
+ {/if}
47
+ </p>
48
+ {@render TimeStamp(item.time)}
49
+ </div>
50
+ </div>
51
+ {/snippet}
52
+
53
+ {#snippet CommentItem({ item }: { item: TimelineItem })}
54
+ <div class="ring-default-200 w-full flex-grow rounded-md bg-white p-3 ring-1">
55
+ <div class="mb-1 flex justify-between gap-x-4">
56
+ <div class="text-default-900 text-sm font-medium">{item.title}</div>
57
+ {@render TimeStamp(item.time)}
58
+ </div>
59
+ <p class="text-default-500 text-sm">{item.details}</p>
60
+ </div>
61
+ {/snippet}
62
+
63
+ {#snippet TimeStamp(time: Date | string)}
64
+ <time
65
+ datetime={time instanceof Date ? time.toISOString() : time}
66
+ class="text-default-500 text-right text-sm whitespace-nowrap"
67
+ title={formatDateTime(time)}
68
+ >
69
+ {getRelativeTime(time)}
70
+ </time>
71
+ {/snippet}
72
+
73
+ {#snippet TimelineIcon(item: TimelineItem, classes = 'size-7 shrink-0')}
74
+ {#if item.Icon}
75
+ {@const Icon = item.Icon}
76
+ <Icon class={classes} />
77
+ {:else}
78
+ <svg
79
+ xmlns="http://www.w3.org/2000/svg"
80
+ width="16"
81
+ height="16"
82
+ viewBox="0 0 16 16"
83
+ class={classes}
84
+ >
85
+ <circle cx="8" cy="8" r="7" fill="white" />
86
+ <path
87
+ fill="currentColor"
88
+ d="M1 8a7 7 0 1 1 14 0A7 7 0 0 1 1 8m9.854-1.146a.5.5 0 0 0-.708-.708L7.25 9.043L5.854 7.646a.5.5 0 1 0-.708.708l1.75 1.75a.5.5 0 0 0 .708 0z"
89
+ />
90
+ </svg>
91
+ {/if}
92
+ {/snippet}
@@ -0,0 +1,7 @@
1
+ import type { TimelineItem } from '../../index.js';
2
+ declare const Timeline: import("svelte").Component<{
3
+ items?: TimelineItem[];
4
+ class?: string;
5
+ }, {}, "">;
6
+ type Timeline = ReturnType<typeof Timeline>;
7
+ export default Timeline;
@@ -0,0 +1,54 @@
1
+ <script lang="ts">
2
+ import { cn } from '../helper/cls.js';
3
+ import type { CheckboxProps } from '../index.js';
4
+
5
+ let {
6
+ name,
7
+ label,
8
+ value = $bindable(false),
9
+ disabled = false,
10
+ class: className = '',
11
+ errors = [],
12
+ required = false
13
+ }: CheckboxProps = $props();
14
+
15
+ const checkboxClass = $derived(
16
+ cn('w-4 h-4 rounded text-primary-600 border-gray-300 focus:ring-primary-500', {
17
+ 'opacity-50 cursor-not-allowed': disabled,
18
+ 'accent-danger-500': errors.length
19
+ })
20
+ );
21
+
22
+ const labelClass = $derived(
23
+ cn('text-sm font-medium', {
24
+ 'text-gray-700': !errors.length,
25
+ 'text-danger-600': errors.length
26
+ })
27
+ );
28
+ </script>
29
+
30
+ <div class="w-full">
31
+ <div class="inline-flex w-full items-center gap-2">
32
+ <input
33
+ type="checkbox"
34
+ {name}
35
+ id={name}
36
+ bind:checked={value}
37
+ class={checkboxClass}
38
+ {disabled}
39
+ {required}
40
+ aria-describedby={errors.length ? `${name}-errors` : undefined}
41
+ />
42
+ {#if label}
43
+ <label for={name} class={labelClass}>{label}</label>
44
+ {/if}
45
+ </div>
46
+
47
+ {#if errors.length}
48
+ {#each errors as error (error)}
49
+ <p id={`${name}-errors`} class="text-danger-600 mt-1 text-sm" role="alert">
50
+ {error}
51
+ </p>
52
+ {/each}
53
+ {/if}
54
+ </div>
@@ -0,0 +1,4 @@
1
+ import type { CheckboxProps } from '../index.js';
2
+ declare const Checkbox: import("svelte").Component<CheckboxProps, {}, "value">;
3
+ type Checkbox = ReturnType<typeof Checkbox>;
4
+ export default Checkbox;