@flightlesslabs/dodo-ui 0.14.0 → 0.15.0
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.
- package/dist/index.d.ts +6 -0
- package/dist/index.js +4 -0
- package/dist/stories/components/Form/Checkbox/Checkbox.stories.svelte +39 -0
- package/dist/stories/components/Form/Checkbox/Checkbox.stories.svelte.d.ts +21 -0
- package/dist/stories/components/Form/Checkbox/Checkbox.svelte +452 -0
- package/dist/stories/components/Form/Checkbox/Checkbox.svelte.d.ts +42 -0
- package/dist/stories/components/Form/Checkbox/Color/Color.stories.svelte +19 -0
- package/dist/stories/components/Form/Checkbox/Color/Color.stories.svelte.d.ts +26 -0
- package/dist/stories/components/Form/Checkbox/Customize/Customize.stories.svelte +27 -0
- package/dist/stories/components/Form/Checkbox/Customize/Customize.stories.svelte.d.ts +18 -0
- package/dist/stories/components/Form/Checkbox/Events/Events.stories.svelte +35 -0
- package/dist/stories/components/Form/Checkbox/Events/Events.stories.svelte.d.ts +18 -0
- package/dist/stories/components/Form/Checkbox/Roundness/Roundness.stories.svelte +22 -0
- package/dist/stories/components/Form/Checkbox/Roundness/Roundness.stories.svelte.d.ts +26 -0
- package/dist/stories/components/Form/Checkbox/Size/Size.stories.svelte +16 -0
- package/dist/stories/components/Form/Checkbox/Size/Size.stories.svelte.d.ts +26 -0
- package/dist/stories/components/Form/Checkbox/utils/scss/mixins.scss +80 -0
- package/dist/stories/components/Form/Radio/Color/Color.stories.svelte +19 -0
- package/dist/stories/components/Form/Radio/Color/Color.stories.svelte.d.ts +26 -0
- package/dist/stories/components/Form/Radio/Events/Events.stories.svelte +32 -0
- package/dist/stories/components/Form/Radio/Events/Events.stories.svelte.d.ts +18 -0
- package/dist/stories/components/Form/Radio/Radio.stories.svelte +39 -0
- package/dist/stories/components/Form/Radio/Radio.stories.svelte.d.ts +21 -0
- package/dist/stories/components/Form/Radio/Radio.svelte +413 -0
- package/dist/stories/components/Form/Radio/Radio.svelte.d.ts +36 -0
- package/dist/stories/components/Form/Radio/Roundness/Roundness.stories.svelte +22 -0
- package/dist/stories/components/Form/Radio/Roundness/Roundness.stories.svelte.d.ts +26 -0
- package/dist/stories/components/Form/Radio/Size/Size.stories.svelte +16 -0
- package/dist/stories/components/Form/Radio/Size/Size.stories.svelte.d.ts +26 -0
- package/dist/stories/components/Form/Radio/utils/scss/mixins.scss +85 -0
- package/dist/stories/components/Form/Toggle/Toggle.svelte +30 -40
- package/dist/stories/components/Form/Toggle/Toggle.svelte.d.ts +2 -0
- package/dist/stories/components/Form/Toggle/utils/scss/mixins.scss +1 -14
- package/package.json +2 -2
- package/src/lib/index.ts +8 -0
- package/src/lib/stories/components/Form/Checkbox/Checkbox.svelte +323 -0
- package/src/lib/stories/components/Form/Checkbox/utils/scss/mixins.scss +80 -0
- package/src/lib/stories/components/Form/Radio/Radio.svelte +278 -0
- package/src/lib/stories/components/Form/Radio/utils/scss/mixins.scss +85 -0
- package/src/lib/stories/components/Form/Toggle/Toggle.svelte +31 -3
- package/src/lib/stories/components/Form/Toggle/utils/scss/mixins.scss +1 -14
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
</script>
|
|
3
3
|
|
|
4
4
|
<script lang="ts">"use strict";
|
|
5
|
-
let { children, size = 'normal', color = 'primary', roundness = 3, name, id, title, class: className = '', disabled = false, checked = $bindable(), ref = $bindable(), onchange, } = $props();
|
|
5
|
+
let { children, size = 'normal', color = 'primary', roundness = 3, name, id, title, class: className = '', disabled = false, checked = $bindable(), ref = $bindable(), onchange, value, } = $props();
|
|
6
6
|
</script>
|
|
7
7
|
|
|
8
8
|
<label
|
|
@@ -16,7 +16,17 @@ let { children, size = 'normal', color = 'primary', roundness = 3, name, id, tit
|
|
|
16
16
|
].join(' ')}
|
|
17
17
|
for={id}
|
|
18
18
|
>
|
|
19
|
-
<input
|
|
19
|
+
<input
|
|
20
|
+
type="checkbox"
|
|
21
|
+
{name}
|
|
22
|
+
{id}
|
|
23
|
+
{title}
|
|
24
|
+
{disabled}
|
|
25
|
+
{onchange}
|
|
26
|
+
bind:this={ref}
|
|
27
|
+
bind:checked
|
|
28
|
+
{value}
|
|
29
|
+
/>
|
|
20
30
|
<div class="Toggle">
|
|
21
31
|
<span class="ToggleHandle"></span>
|
|
22
32
|
</div>
|
|
@@ -31,6 +41,8 @@ let { children, size = 'normal', color = 'primary', roundness = 3, name, id, tit
|
|
|
31
41
|
<style>:global(:root) {
|
|
32
42
|
--dodo-ui-Toggle-disabled-color: var(--dodo-color-neutral-400);
|
|
33
43
|
--dodo-ui-Toggle-disabled-bg: var(--dodo-color-neutral-200);
|
|
44
|
+
--dodo-ui-Toggle-border-disabled-color: var(--dodo-color-neutral-300);
|
|
45
|
+
--dodo-ui-Toggle-border-color: var(--dodo-color-neutral-400);
|
|
34
46
|
--dodo-ui-ToggleHandle-bg: var(--dodo-color-neutral-500);
|
|
35
47
|
--dodo-ui-ToggleHandle-disabled-bg: var(--dodo-color-neutral-400);
|
|
36
48
|
--dodo-ui-Toggle-neutral-bg: var(--dodo-color-neutral-200);
|
|
@@ -74,6 +86,8 @@ let { children, size = 'normal', color = 'primary', roundness = 3, name, id, tit
|
|
|
74
86
|
:global(.dodo-theme--dark) {
|
|
75
87
|
--dodo-ui-Toggle-disabled-bg: var(--dodo-color-neutral-100);
|
|
76
88
|
--dodo-ui-Toggle-disabled-color: var(--dodo-color-neutral-500);
|
|
89
|
+
--dodo-ui-Toggle-border-disabled-color: var(--dodo-color-neutral-400);
|
|
90
|
+
--dodo-ui-Toggle-border-color: var(--dodo-color-neutral-500);
|
|
77
91
|
--dodo-ui-ToggleHandle-bg: var(--dodo-color-neutral-300);
|
|
78
92
|
--dodo-ui-ToggleHandle-disabled-bg: var(--dodo-color-neutral-200);
|
|
79
93
|
--dodo-ui-Toggle-neutral-bg: var(--dodo-color-neutral-800);
|
|
@@ -120,11 +134,16 @@ let { children, size = 'normal', color = 'primary', roundness = 3, name, id, tit
|
|
|
120
134
|
display: inline-flex;
|
|
121
135
|
padding: 0;
|
|
122
136
|
margin: 0;
|
|
137
|
+
position: relative;
|
|
123
138
|
}
|
|
124
139
|
.dodo-ui-Toggle input {
|
|
125
140
|
opacity: 0;
|
|
126
141
|
width: 0;
|
|
127
142
|
height: 0;
|
|
143
|
+
position: absolute;
|
|
144
|
+
}
|
|
145
|
+
.dodo-ui-Toggle input:focus-visible + .Toggle {
|
|
146
|
+
outline: 1px solid;
|
|
128
147
|
}
|
|
129
148
|
.dodo-ui-Toggle input:checked + .Toggle .ToggleHandle {
|
|
130
149
|
transform: translateX(var(--ToggleHandle-offset));
|
|
@@ -141,13 +160,13 @@ let { children, size = 'normal', color = 'primary', roundness = 3, name, id, tit
|
|
|
141
160
|
align-items: center;
|
|
142
161
|
font-family: inherit;
|
|
143
162
|
border-style: solid;
|
|
144
|
-
border-width: var(--dodo-ui-element-border-width);
|
|
145
|
-
border-color: transparent;
|
|
146
163
|
outline: 0;
|
|
147
164
|
letter-spacing: 0.3px;
|
|
148
165
|
padding: 0 var(--dodo-ui-space-small);
|
|
149
166
|
border-radius: inherit;
|
|
150
167
|
position: relative;
|
|
168
|
+
border-width: calc(var(--dodo-ui-element-border-width) * 2);
|
|
169
|
+
border-color: var(--dodo-ui-Toggle-border-color);
|
|
151
170
|
}
|
|
152
171
|
.dodo-ui-Toggle .ToggleMessage {
|
|
153
172
|
display: flex;
|
|
@@ -206,6 +225,7 @@ let { children, size = 'normal', color = 'primary', roundness = 3, name, id, tit
|
|
|
206
225
|
}
|
|
207
226
|
.dodo-ui-Toggle.color--neutral input:checked:not([disabled]) + .Toggle {
|
|
208
227
|
background-color: var(--dodo-ui-Toggle-neutral-checked-bg);
|
|
228
|
+
border-color: transparent;
|
|
209
229
|
}
|
|
210
230
|
.dodo-ui-Toggle.color--neutral:hover .Toggle {
|
|
211
231
|
background-color: var(--dodo-ui-Toggle-neutral-hover-bg);
|
|
@@ -219,17 +239,12 @@ let { children, size = 'normal', color = 'primary', roundness = 3, name, id, tit
|
|
|
219
239
|
.dodo-ui-Toggle.color--neutral:active input:checked:not([disabled]) + .Toggle {
|
|
220
240
|
background-color: var(--dodo-ui-Toggle-neutral-checked-active-bg);
|
|
221
241
|
}
|
|
222
|
-
.dodo-ui-Toggle.color--neutral input:not([disabled]):focus-visible + .Toggle {
|
|
223
|
-
background-color: var(--dodo-ui-Toggle-neutral-active-bg);
|
|
224
|
-
}
|
|
225
|
-
.dodo-ui-Toggle.color--neutral input:not([disabled]):focus-visible:checked + .Toggle {
|
|
226
|
-
background-color: var(--dodo-ui-Toggle-neutral-checked-active-bg);
|
|
227
|
-
}
|
|
228
242
|
.dodo-ui-Toggle.color--primary .Toggle {
|
|
229
243
|
background-color: var(--dodo-ui-Toggle-primary-bg);
|
|
230
244
|
}
|
|
231
245
|
.dodo-ui-Toggle.color--primary input:checked:not([disabled]) + .Toggle {
|
|
232
246
|
background-color: var(--dodo-ui-Toggle-primary-checked-bg);
|
|
247
|
+
border-color: transparent;
|
|
233
248
|
}
|
|
234
249
|
.dodo-ui-Toggle.color--primary:hover .Toggle {
|
|
235
250
|
background-color: var(--dodo-ui-Toggle-primary-hover-bg);
|
|
@@ -243,17 +258,12 @@ let { children, size = 'normal', color = 'primary', roundness = 3, name, id, tit
|
|
|
243
258
|
.dodo-ui-Toggle.color--primary:active input:checked:not([disabled]) + .Toggle {
|
|
244
259
|
background-color: var(--dodo-ui-Toggle-primary-checked-active-bg);
|
|
245
260
|
}
|
|
246
|
-
.dodo-ui-Toggle.color--primary input:not([disabled]):focus-visible + .Toggle {
|
|
247
|
-
background-color: var(--dodo-ui-Toggle-primary-active-bg);
|
|
248
|
-
}
|
|
249
|
-
.dodo-ui-Toggle.color--primary input:not([disabled]):focus-visible:checked + .Toggle {
|
|
250
|
-
background-color: var(--dodo-ui-Toggle-primary-checked-active-bg);
|
|
251
|
-
}
|
|
252
261
|
.dodo-ui-Toggle.color--secondary .Toggle {
|
|
253
262
|
background-color: var(--dodo-ui-Toggle-secondary-bg);
|
|
254
263
|
}
|
|
255
264
|
.dodo-ui-Toggle.color--secondary input:checked:not([disabled]) + .Toggle {
|
|
256
265
|
background-color: var(--dodo-ui-Toggle-secondary-checked-bg);
|
|
266
|
+
border-color: transparent;
|
|
257
267
|
}
|
|
258
268
|
.dodo-ui-Toggle.color--secondary:hover .Toggle {
|
|
259
269
|
background-color: var(--dodo-ui-Toggle-secondary-hover-bg);
|
|
@@ -267,17 +277,12 @@ let { children, size = 'normal', color = 'primary', roundness = 3, name, id, tit
|
|
|
267
277
|
.dodo-ui-Toggle.color--secondary:active input:checked:not([disabled]) + .Toggle {
|
|
268
278
|
background-color: var(--dodo-ui-Toggle-secondary-checked-active-bg);
|
|
269
279
|
}
|
|
270
|
-
.dodo-ui-Toggle.color--secondary input:not([disabled]):focus-visible + .Toggle {
|
|
271
|
-
background-color: var(--dodo-ui-Toggle-secondary-active-bg);
|
|
272
|
-
}
|
|
273
|
-
.dodo-ui-Toggle.color--secondary input:not([disabled]):focus-visible:checked + .Toggle {
|
|
274
|
-
background-color: var(--dodo-ui-Toggle-secondary-checked-active-bg);
|
|
275
|
-
}
|
|
276
280
|
.dodo-ui-Toggle.color--safe .Toggle {
|
|
277
281
|
background-color: var(--dodo-ui-Toggle-safe-bg);
|
|
278
282
|
}
|
|
279
283
|
.dodo-ui-Toggle.color--safe input:checked:not([disabled]) + .Toggle {
|
|
280
284
|
background-color: var(--dodo-ui-Toggle-safe-checked-bg);
|
|
285
|
+
border-color: transparent;
|
|
281
286
|
}
|
|
282
287
|
.dodo-ui-Toggle.color--safe:hover .Toggle {
|
|
283
288
|
background-color: var(--dodo-ui-Toggle-safe-hover-bg);
|
|
@@ -291,17 +296,12 @@ let { children, size = 'normal', color = 'primary', roundness = 3, name, id, tit
|
|
|
291
296
|
.dodo-ui-Toggle.color--safe:active input:checked:not([disabled]) + .Toggle {
|
|
292
297
|
background-color: var(--dodo-ui-Toggle-safe-checked-active-bg);
|
|
293
298
|
}
|
|
294
|
-
.dodo-ui-Toggle.color--safe input:not([disabled]):focus-visible + .Toggle {
|
|
295
|
-
background-color: var(--dodo-ui-Toggle-safe-active-bg);
|
|
296
|
-
}
|
|
297
|
-
.dodo-ui-Toggle.color--safe input:not([disabled]):focus-visible:checked + .Toggle {
|
|
298
|
-
background-color: var(--dodo-ui-Toggle-safe-checked-active-bg);
|
|
299
|
-
}
|
|
300
299
|
.dodo-ui-Toggle.color--warning .Toggle {
|
|
301
300
|
background-color: var(--dodo-ui-Toggle-warning-bg);
|
|
302
301
|
}
|
|
303
302
|
.dodo-ui-Toggle.color--warning input:checked:not([disabled]) + .Toggle {
|
|
304
303
|
background-color: var(--dodo-ui-Toggle-warning-checked-bg);
|
|
304
|
+
border-color: transparent;
|
|
305
305
|
}
|
|
306
306
|
.dodo-ui-Toggle.color--warning:hover .Toggle {
|
|
307
307
|
background-color: var(--dodo-ui-Toggle-warning-hover-bg);
|
|
@@ -315,17 +315,12 @@ let { children, size = 'normal', color = 'primary', roundness = 3, name, id, tit
|
|
|
315
315
|
.dodo-ui-Toggle.color--warning:active input:checked:not([disabled]) + .Toggle {
|
|
316
316
|
background-color: var(--dodo-ui-Toggle-warning-checked-active-bg);
|
|
317
317
|
}
|
|
318
|
-
.dodo-ui-Toggle.color--warning input:not([disabled]):focus-visible + .Toggle {
|
|
319
|
-
background-color: var(--dodo-ui-Toggle-warning-active-bg);
|
|
320
|
-
}
|
|
321
|
-
.dodo-ui-Toggle.color--warning input:not([disabled]):focus-visible:checked + .Toggle {
|
|
322
|
-
background-color: var(--dodo-ui-Toggle-warning-checked-active-bg);
|
|
323
|
-
}
|
|
324
318
|
.dodo-ui-Toggle.color--danger .Toggle {
|
|
325
319
|
background-color: var(--dodo-ui-Toggle-danger-bg);
|
|
326
320
|
}
|
|
327
321
|
.dodo-ui-Toggle.color--danger input:checked:not([disabled]) + .Toggle {
|
|
328
322
|
background-color: var(--dodo-ui-Toggle-danger-checked-bg);
|
|
323
|
+
border-color: transparent;
|
|
329
324
|
}
|
|
330
325
|
.dodo-ui-Toggle.color--danger:hover .Toggle {
|
|
331
326
|
background-color: var(--dodo-ui-Toggle-danger-hover-bg);
|
|
@@ -339,18 +334,13 @@ let { children, size = 'normal', color = 'primary', roundness = 3, name, id, tit
|
|
|
339
334
|
.dodo-ui-Toggle.color--danger:active input:checked:not([disabled]) + .Toggle {
|
|
340
335
|
background-color: var(--dodo-ui-Toggle-danger-checked-active-bg);
|
|
341
336
|
}
|
|
342
|
-
.dodo-ui-Toggle.color--danger input:not([disabled]):focus-visible + .Toggle {
|
|
343
|
-
background-color: var(--dodo-ui-Toggle-danger-active-bg);
|
|
344
|
-
}
|
|
345
|
-
.dodo-ui-Toggle.color--danger input:not([disabled]):focus-visible:checked + .Toggle {
|
|
346
|
-
background-color: var(--dodo-ui-Toggle-danger-checked-active-bg);
|
|
347
|
-
}
|
|
348
337
|
.dodo-ui-Toggle.disabled {
|
|
349
338
|
cursor: initial;
|
|
350
339
|
color: var(--dodo-ui-Toggle-disabled-color);
|
|
351
340
|
}
|
|
352
341
|
.dodo-ui-Toggle.disabled .Toggle {
|
|
353
342
|
background-color: var(--dodo-ui-Toggle-disabled-bg);
|
|
343
|
+
border-color: var(--dodo-ui-Toggle-border-disabled-color);
|
|
354
344
|
}
|
|
355
345
|
.dodo-ui-Toggle.disabled .ToggleHandle {
|
|
356
346
|
background-color: var(--dodo-ui-ToggleHandle-disabled-bg);
|
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
input:checked:not([disabled]) {
|
|
38
38
|
& + .Toggle {
|
|
39
39
|
background-color: var(--dodo-ui-Toggle-#{$theme}-checked-bg);
|
|
40
|
+
border-color: transparent;
|
|
40
41
|
}
|
|
41
42
|
}
|
|
42
43
|
|
|
@@ -63,19 +64,5 @@
|
|
|
63
64
|
}
|
|
64
65
|
}
|
|
65
66
|
}
|
|
66
|
-
|
|
67
|
-
input:not([disabled]) {
|
|
68
|
-
&:focus-visible {
|
|
69
|
-
& + .Toggle {
|
|
70
|
-
background-color: var(--dodo-ui-Toggle-#{$theme}-active-bg);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
&:checked {
|
|
74
|
-
& + .Toggle {
|
|
75
|
-
background-color: var(--dodo-ui-Toggle-#{$theme}-checked-active-bg);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
67
|
}
|
|
81
68
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flightlesslabs/dodo-ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.15.0",
|
|
4
4
|
"scripts": {
|
|
5
5
|
"build": "vite build && pnpm run prepack",
|
|
6
6
|
"preview": "vite preview",
|
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
"publint": "^0.3.12",
|
|
75
75
|
"sass": "^1.89.2",
|
|
76
76
|
"storybook": "^9.0.18",
|
|
77
|
-
"svelte": "^5.37.
|
|
77
|
+
"svelte": "^5.37.1",
|
|
78
78
|
"svelte-check": "^4.3.0",
|
|
79
79
|
"svelte-preprocess": "^6.0.3",
|
|
80
80
|
"typescript": "^5.8.3",
|
package/src/lib/index.ts
CHANGED
|
@@ -130,6 +130,14 @@ export type { RangeSliderProps } from '$lib/stories/components/Form/RangeSlider/
|
|
|
130
130
|
export { default as Toggle } from '$lib/stories/components/Form/Toggle/Toggle.svelte';
|
|
131
131
|
export type { ToggleProps } from '$lib/stories/components/Form/Toggle/Toggle.svelte';
|
|
132
132
|
|
|
133
|
+
/** Form: Checkbox */
|
|
134
|
+
export { default as Checkbox } from '$lib/stories/components/Form/Checkbox/Checkbox.svelte';
|
|
135
|
+
export type { CheckboxProps } from '$lib/stories/components/Form/Checkbox/Checkbox.svelte';
|
|
136
|
+
|
|
137
|
+
/** Form: Radio */
|
|
138
|
+
export { default as Radio } from '$lib/stories/components/Form/Radio/Radio.svelte';
|
|
139
|
+
export type { RadioProps } from '$lib/stories/components/Form/Radio/Radio.svelte';
|
|
140
|
+
|
|
133
141
|
/** Layout: Paper */
|
|
134
142
|
export { default as Paper } from '$lib/stories/components/Layout/Paper/Paper.svelte';
|
|
135
143
|
export type { PaperColor, PaperProps } from '$lib/stories/components/Layout/Paper/Paper.svelte';
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
import type { ComponentColor } from '$lib/types/colors.js';
|
|
3
|
+
import type { ComponentRoundness } from '$lib/types/roundness.js';
|
|
4
|
+
import type { ComponentSize } from '$lib/types/size.js';
|
|
5
|
+
import Icon from '@iconify/svelte';
|
|
6
|
+
|
|
7
|
+
import type { Snippet } from 'svelte';
|
|
8
|
+
import type { ChangeEventHandler } from 'svelte/elements';
|
|
9
|
+
|
|
10
|
+
export interface CheckboxProps {
|
|
11
|
+
/** Checkbox contents goes here */
|
|
12
|
+
children?: Snippet;
|
|
13
|
+
/** Checkbox ref */
|
|
14
|
+
ref?: HTMLInputElement;
|
|
15
|
+
/** How large should the checkbox be? */
|
|
16
|
+
size?: ComponentSize;
|
|
17
|
+
/** What color to use? */
|
|
18
|
+
color?: ComponentColor;
|
|
19
|
+
/** How round should the border radius be? */
|
|
20
|
+
roundness?: ComponentRoundness;
|
|
21
|
+
/** Checkbox disabled state */
|
|
22
|
+
disabled?: boolean;
|
|
23
|
+
/** Name */
|
|
24
|
+
name?: string;
|
|
25
|
+
/** value */
|
|
26
|
+
value?: string;
|
|
27
|
+
/** Id */
|
|
28
|
+
id?: string;
|
|
29
|
+
/** Title (for tooltip) */
|
|
30
|
+
title?: string;
|
|
31
|
+
/** Custom css class*/
|
|
32
|
+
class?: string;
|
|
33
|
+
/** onchange event handler */
|
|
34
|
+
onchange?: ChangeEventHandler<HTMLInputElement>;
|
|
35
|
+
/** checked */
|
|
36
|
+
checked?: boolean;
|
|
37
|
+
/** indeterminate */
|
|
38
|
+
indeterminate?: boolean;
|
|
39
|
+
/** Check Icon */
|
|
40
|
+
customCheckIcon?: (checked: boolean) => Snippet;
|
|
41
|
+
/** indeterminate Icon */
|
|
42
|
+
customIndeterminateIcon?: (checked: boolean) => Snippet;
|
|
43
|
+
}
|
|
44
|
+
</script>
|
|
45
|
+
|
|
46
|
+
<script lang="ts">
|
|
47
|
+
let {
|
|
48
|
+
children,
|
|
49
|
+
size = 'normal',
|
|
50
|
+
color = 'primary',
|
|
51
|
+
roundness = 1,
|
|
52
|
+
name,
|
|
53
|
+
id,
|
|
54
|
+
title,
|
|
55
|
+
class: className = '',
|
|
56
|
+
disabled = false,
|
|
57
|
+
checked = $bindable<boolean>(),
|
|
58
|
+
indeterminate = false,
|
|
59
|
+
ref = $bindable<HTMLInputElement>(),
|
|
60
|
+
onchange,
|
|
61
|
+
customCheckIcon,
|
|
62
|
+
customIndeterminateIcon,
|
|
63
|
+
value,
|
|
64
|
+
}: CheckboxProps = $props();
|
|
65
|
+
|
|
66
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
67
|
+
let customCheckIconTyped = customCheckIcon as any;
|
|
68
|
+
|
|
69
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
70
|
+
let customIndeterminateIconTyped = customIndeterminateIcon as any;
|
|
71
|
+
</script>
|
|
72
|
+
|
|
73
|
+
{#snippet checkIconContent()}
|
|
74
|
+
{#if size === 'small'}
|
|
75
|
+
<Icon icon="material-symbols:check-rounded" width="24" height="24" />
|
|
76
|
+
{:else if size === 'large'}
|
|
77
|
+
<Icon icon="material-symbols:check-rounded" width="30" height="30" />
|
|
78
|
+
{:else}
|
|
79
|
+
<Icon icon="material-symbols:check-rounded" width="28" height="28" />
|
|
80
|
+
{/if}
|
|
81
|
+
{/snippet}
|
|
82
|
+
|
|
83
|
+
{#snippet indeterminateIconContent()}
|
|
84
|
+
{#if size === 'small'}
|
|
85
|
+
<Icon icon="material-symbols:check-indeterminate-small-rounded" width="28" height="28" />
|
|
86
|
+
{:else if size === 'large'}
|
|
87
|
+
<Icon icon="material-symbols:check-indeterminate-small-rounded" width="34" height="34" />
|
|
88
|
+
{:else}
|
|
89
|
+
<Icon icon="material-symbols:check-indeterminate-small-rounded" width="32" height="32" />
|
|
90
|
+
{/if}
|
|
91
|
+
{/snippet}
|
|
92
|
+
|
|
93
|
+
<label
|
|
94
|
+
class:disabled
|
|
95
|
+
class={[
|
|
96
|
+
'dodo-ui-Checkbox',
|
|
97
|
+
`size--${size}`,
|
|
98
|
+
`color--${color}`,
|
|
99
|
+
`roundness--${roundness}`,
|
|
100
|
+
className,
|
|
101
|
+
].join(' ')}
|
|
102
|
+
for={id}
|
|
103
|
+
>
|
|
104
|
+
<input
|
|
105
|
+
type="checkbox"
|
|
106
|
+
{name}
|
|
107
|
+
{id}
|
|
108
|
+
{title}
|
|
109
|
+
{disabled}
|
|
110
|
+
{onchange}
|
|
111
|
+
bind:this={ref}
|
|
112
|
+
bind:checked
|
|
113
|
+
{value}
|
|
114
|
+
/>
|
|
115
|
+
<div class="Checkbox">
|
|
116
|
+
<div class="CheckboxIcon">
|
|
117
|
+
{#if indeterminate && customIndeterminateIconTyped}
|
|
118
|
+
{@render customIndeterminateIconTyped(checked)}
|
|
119
|
+
{:else if indeterminate}
|
|
120
|
+
{@render indeterminateIconContent()}
|
|
121
|
+
{:else if customCheckIconTyped}
|
|
122
|
+
{@render customCheckIconTyped(checked)}
|
|
123
|
+
{:else}
|
|
124
|
+
{@render checkIconContent()}
|
|
125
|
+
{/if}
|
|
126
|
+
</div>
|
|
127
|
+
</div>
|
|
128
|
+
|
|
129
|
+
{#if children}
|
|
130
|
+
<div class="CheckboxMessage">
|
|
131
|
+
{@render children()}
|
|
132
|
+
</div>
|
|
133
|
+
{/if}
|
|
134
|
+
</label>
|
|
135
|
+
|
|
136
|
+
<style lang="scss">
|
|
137
|
+
@use 'utils/scss/mixins.scss' as *;
|
|
138
|
+
|
|
139
|
+
:global(:root) {
|
|
140
|
+
--dodo-ui-Checkbox-disabled-color: var(--dodo-color-neutral-400);
|
|
141
|
+
--dodo-ui-Checkbox-disabled-bg: var(--dodo-color-neutral-200);
|
|
142
|
+
--dodo-ui-Checkbox-border-disabled-color: var(--dodo-color-neutral-300);
|
|
143
|
+
|
|
144
|
+
--dodo-ui-Checkbox-border-color: var(--dodo-color-neutral-400);
|
|
145
|
+
|
|
146
|
+
@include generate-dodo-ui-checkbox-colors(neutral);
|
|
147
|
+
@include generate-dodo-ui-checkbox-colors(primary);
|
|
148
|
+
@include generate-dodo-ui-checkbox-colors(secondary);
|
|
149
|
+
@include generate-dodo-ui-checkbox-colors(safe);
|
|
150
|
+
@include generate-dodo-ui-checkbox-colors(warning);
|
|
151
|
+
@include generate-dodo-ui-checkbox-colors(danger);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
:global(.dodo-theme--dark) {
|
|
155
|
+
--dodo-ui-Checkbox-disabled-bg: var(--dodo-color-neutral-100);
|
|
156
|
+
--dodo-ui-Checkbox-disabled-color: var(--dodo-color-neutral-500);
|
|
157
|
+
--dodo-ui-Checkbox-border-disabled-color: var(--dodo-color-neutral-400);
|
|
158
|
+
|
|
159
|
+
--dodo-ui-Checkbox-border-color: var(--dodo-color-neutral-500);
|
|
160
|
+
|
|
161
|
+
@include generate-dodo-ui-checkbox-colors-dark(neutral);
|
|
162
|
+
@include generate-dodo-ui-checkbox-colors-dark(primary);
|
|
163
|
+
@include generate-dodo-ui-checkbox-colors-dark(secondary);
|
|
164
|
+
@include generate-dodo-ui-checkbox-colors-dark(safe);
|
|
165
|
+
@include generate-dodo-ui-checkbox-colors-dark(warning);
|
|
166
|
+
@include generate-dodo-ui-checkbox-colors-dark(danger);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
.dodo-ui-Checkbox {
|
|
170
|
+
cursor: pointer;
|
|
171
|
+
outline: none;
|
|
172
|
+
display: inline-flex;
|
|
173
|
+
padding: 0;
|
|
174
|
+
margin: 0;
|
|
175
|
+
position: relative;
|
|
176
|
+
|
|
177
|
+
input {
|
|
178
|
+
opacity: 0;
|
|
179
|
+
width: 0;
|
|
180
|
+
height: 0;
|
|
181
|
+
position: absolute;
|
|
182
|
+
|
|
183
|
+
&:focus-visible {
|
|
184
|
+
& + .Checkbox {
|
|
185
|
+
outline: 1px solid;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
&:checked {
|
|
190
|
+
&:not([disabled]) {
|
|
191
|
+
& + .Checkbox {
|
|
192
|
+
.CheckboxIcon {
|
|
193
|
+
color: var(--dodo-color-constant-white);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
&[disabled] {
|
|
199
|
+
& + .Checkbox {
|
|
200
|
+
.CheckboxIcon {
|
|
201
|
+
color: var(--dodo-ui-Checkbox-disabled-color);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
.CheckboxIcon {
|
|
209
|
+
color: transparent;
|
|
210
|
+
display: flex;
|
|
211
|
+
width: 100%;
|
|
212
|
+
height: 100%;
|
|
213
|
+
align-items: center;
|
|
214
|
+
justify-content: center;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
.Checkbox {
|
|
218
|
+
transition: all 150ms;
|
|
219
|
+
text-decoration: none;
|
|
220
|
+
margin: 0;
|
|
221
|
+
display: inline-flex;
|
|
222
|
+
justify-content: center;
|
|
223
|
+
align-items: center;
|
|
224
|
+
font-family: inherit;
|
|
225
|
+
border-style: solid;
|
|
226
|
+
border-width: calc(var(--dodo-ui-element-border-width) * 2);
|
|
227
|
+
border-color: var(--dodo-ui-Checkbox-border-color);
|
|
228
|
+
outline: 0;
|
|
229
|
+
letter-spacing: 0.3px;
|
|
230
|
+
border-radius: inherit;
|
|
231
|
+
position: relative;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
.CheckboxMessage {
|
|
235
|
+
display: flex;
|
|
236
|
+
align-items: center;
|
|
237
|
+
margin-left: var(--dodo-ui-space);
|
|
238
|
+
user-select: none;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
&.size {
|
|
242
|
+
&--normal {
|
|
243
|
+
font-size: 1rem;
|
|
244
|
+
|
|
245
|
+
.Checkbox {
|
|
246
|
+
height: calc(var(--dodo-ui-element-height-normal) / 1.2);
|
|
247
|
+
width: calc(var(--dodo-ui-element-height-normal) / 1.2);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
&--small {
|
|
252
|
+
font-size: 0.9rem;
|
|
253
|
+
|
|
254
|
+
.Checkbox {
|
|
255
|
+
height: calc(var(--dodo-ui-element-height-small) / 1.2);
|
|
256
|
+
width: calc(var(--dodo-ui-element-height-small) / 1.2);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
&--large {
|
|
261
|
+
font-size: 1.1rem;
|
|
262
|
+
|
|
263
|
+
.Checkbox {
|
|
264
|
+
height: calc(var(--dodo-ui-element-height-large) / 1.2);
|
|
265
|
+
width: calc(var(--dodo-ui-element-height-large) / 1.2);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
&.roundness {
|
|
271
|
+
&--1 {
|
|
272
|
+
border-radius: var(--dodo-ui-element-roundness-1);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
&--2 {
|
|
276
|
+
border-radius: var(--dodo-ui-element-roundness-2);
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
&--3 {
|
|
280
|
+
border-radius: var(--dodo-ui-element-roundness-3);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
&--full {
|
|
284
|
+
border-radius: 50%;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
&.color {
|
|
289
|
+
@include generate-dodo-ui-checkbox-color(neutral);
|
|
290
|
+
@include generate-dodo-ui-checkbox-color(primary);
|
|
291
|
+
@include generate-dodo-ui-checkbox-color(secondary);
|
|
292
|
+
@include generate-dodo-ui-checkbox-color(safe);
|
|
293
|
+
@include generate-dodo-ui-checkbox-color(warning);
|
|
294
|
+
@include generate-dodo-ui-checkbox-color(danger);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
&.disabled {
|
|
298
|
+
cursor: initial;
|
|
299
|
+
color: var(--dodo-ui-Checkbox-disabled-color);
|
|
300
|
+
|
|
301
|
+
.Checkbox {
|
|
302
|
+
background-color: var(--dodo-ui-Checkbox-disabled-bg);
|
|
303
|
+
border-color: var(--dodo-ui-Checkbox-border-disabled-color);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
&:hover {
|
|
307
|
+
color: var(--dodo-ui-Checkbox-disabled-color);
|
|
308
|
+
|
|
309
|
+
.Checkbox {
|
|
310
|
+
background-color: var(--dodo-ui-Checkbox-disabled-bg);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
&:active {
|
|
315
|
+
color: var(--dodo-ui-Checkbox-disabled-color);
|
|
316
|
+
|
|
317
|
+
.Checkbox {
|
|
318
|
+
background-color: var(--dodo-ui-Checkbox-disabled-bg);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
</style>
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/// Mixin: generate-dodo-ui-checkbox-colors
|
|
2
|
+
/// Generates CSS custom properties for Dodo UI checkbox styles (text & solid)
|
|
3
|
+
/// across different interaction states (default, hover, active).
|
|
4
|
+
/// @param {String} $color-name - The theme color name (e.g., "primary", "safe", etc.)
|
|
5
|
+
@mixin generate-dodo-ui-checkbox-colors($color-name) {
|
|
6
|
+
--dodo-ui-Checkbox-#{$color-name}-bg: var(--dodo-color-#{$color-name}-200);
|
|
7
|
+
--dodo-ui-Checkbox-#{$color-name}-hover-bg: var(--dodo-color-#{$color-name}-300);
|
|
8
|
+
--dodo-ui-Checkbox-#{$color-name}-active-bg: var(--dodo-color-#{$color-name}-400);
|
|
9
|
+
|
|
10
|
+
--dodo-ui-Checkbox-#{$color-name}-checked-bg: var(--dodo-color-#{$color-name}-500);
|
|
11
|
+
--dodo-ui-Checkbox-#{$color-name}-checked-hover-bg: var(--dodo-color-#{$color-name}-600);
|
|
12
|
+
--dodo-ui-Checkbox-#{$color-name}-checked-active-bg: var(--dodo-color-#{$color-name}-700);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/// Mixin: generate-dodo-ui-checkbox-colors
|
|
16
|
+
/// Generates CSS custom properties for Dodo UI checkbox styles (text & solid)
|
|
17
|
+
/// across different interaction states (default, hover, active).
|
|
18
|
+
/// @param {String} $color-name - The theme color name (e.g., "primary", "safe", etc.)
|
|
19
|
+
@mixin generate-dodo-ui-checkbox-colors-dark($color-name) {
|
|
20
|
+
--dodo-ui-Checkbox-#{$color-name}-bg: color-mix(
|
|
21
|
+
in oklab,
|
|
22
|
+
var(--dodo-color-#{$color-name}-50) 90%,
|
|
23
|
+
#fff
|
|
24
|
+
);
|
|
25
|
+
--dodo-ui-Checkbox-#{$color-name}-hover-bg: color-mix(
|
|
26
|
+
in oklab,
|
|
27
|
+
var(--dodo-color-#{$color-name}-100) 90%,
|
|
28
|
+
#fff
|
|
29
|
+
);
|
|
30
|
+
--dodo-ui-Checkbox-#{$color-name}-active-bg: color-mix(
|
|
31
|
+
in oklab,
|
|
32
|
+
var(--dodo-color-#{$color-name}-200) 90%,
|
|
33
|
+
#fff
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
--dodo-ui-Checkbox-#{$color-name}-checked-bg: var(--dodo-color-#{$color-name}-400);
|
|
37
|
+
--dodo-ui-Checkbox-#{$color-name}-checked-hover-bg: var(--dodo-color-#{$color-name}-300);
|
|
38
|
+
--dodo-ui-Checkbox-#{$color-name}-checked-active-bg: var(--dodo-color-#{$color-name}-200);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/// Mixin: generate-dodo-ui-checkbox-color
|
|
42
|
+
/// @param {String} $theme - e.g., default, safe, danger, etc.
|
|
43
|
+
@mixin generate-dodo-ui-checkbox-color($theme) {
|
|
44
|
+
&--#{$theme} {
|
|
45
|
+
.Checkbox {
|
|
46
|
+
background-color: var(--dodo-ui-Checkbox-#{$theme}-bg);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
input:checked:not([disabled]) {
|
|
50
|
+
& + .Checkbox {
|
|
51
|
+
background-color: var(--dodo-ui-Checkbox-#{$theme}-checked-bg);
|
|
52
|
+
border-color: transparent;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
&:hover {
|
|
57
|
+
.Checkbox {
|
|
58
|
+
background-color: var(--dodo-ui-Checkbox-#{$theme}-hover-bg);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
input:checked:not([disabled]) {
|
|
62
|
+
& + .Checkbox {
|
|
63
|
+
background-color: var(--dodo-ui-Checkbox-#{$theme}-checked-hover-bg);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
&:active {
|
|
69
|
+
.Checkbox {
|
|
70
|
+
background-color: var(--dodo-ui-Checkbox-#{$theme}-active-bg);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
input:checked:not([disabled]) {
|
|
74
|
+
& + .Checkbox {
|
|
75
|
+
background-color: var(--dodo-ui-Checkbox-#{$theme}-checked-active-bg);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|