@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.
Files changed (41) hide show
  1. package/dist/index.d.ts +6 -0
  2. package/dist/index.js +4 -0
  3. package/dist/stories/components/Form/Checkbox/Checkbox.stories.svelte +39 -0
  4. package/dist/stories/components/Form/Checkbox/Checkbox.stories.svelte.d.ts +21 -0
  5. package/dist/stories/components/Form/Checkbox/Checkbox.svelte +452 -0
  6. package/dist/stories/components/Form/Checkbox/Checkbox.svelte.d.ts +42 -0
  7. package/dist/stories/components/Form/Checkbox/Color/Color.stories.svelte +19 -0
  8. package/dist/stories/components/Form/Checkbox/Color/Color.stories.svelte.d.ts +26 -0
  9. package/dist/stories/components/Form/Checkbox/Customize/Customize.stories.svelte +27 -0
  10. package/dist/stories/components/Form/Checkbox/Customize/Customize.stories.svelte.d.ts +18 -0
  11. package/dist/stories/components/Form/Checkbox/Events/Events.stories.svelte +35 -0
  12. package/dist/stories/components/Form/Checkbox/Events/Events.stories.svelte.d.ts +18 -0
  13. package/dist/stories/components/Form/Checkbox/Roundness/Roundness.stories.svelte +22 -0
  14. package/dist/stories/components/Form/Checkbox/Roundness/Roundness.stories.svelte.d.ts +26 -0
  15. package/dist/stories/components/Form/Checkbox/Size/Size.stories.svelte +16 -0
  16. package/dist/stories/components/Form/Checkbox/Size/Size.stories.svelte.d.ts +26 -0
  17. package/dist/stories/components/Form/Checkbox/utils/scss/mixins.scss +80 -0
  18. package/dist/stories/components/Form/Radio/Color/Color.stories.svelte +19 -0
  19. package/dist/stories/components/Form/Radio/Color/Color.stories.svelte.d.ts +26 -0
  20. package/dist/stories/components/Form/Radio/Events/Events.stories.svelte +32 -0
  21. package/dist/stories/components/Form/Radio/Events/Events.stories.svelte.d.ts +18 -0
  22. package/dist/stories/components/Form/Radio/Radio.stories.svelte +39 -0
  23. package/dist/stories/components/Form/Radio/Radio.stories.svelte.d.ts +21 -0
  24. package/dist/stories/components/Form/Radio/Radio.svelte +413 -0
  25. package/dist/stories/components/Form/Radio/Radio.svelte.d.ts +36 -0
  26. package/dist/stories/components/Form/Radio/Roundness/Roundness.stories.svelte +22 -0
  27. package/dist/stories/components/Form/Radio/Roundness/Roundness.stories.svelte.d.ts +26 -0
  28. package/dist/stories/components/Form/Radio/Size/Size.stories.svelte +16 -0
  29. package/dist/stories/components/Form/Radio/Size/Size.stories.svelte.d.ts +26 -0
  30. package/dist/stories/components/Form/Radio/utils/scss/mixins.scss +85 -0
  31. package/dist/stories/components/Form/Toggle/Toggle.svelte +30 -40
  32. package/dist/stories/components/Form/Toggle/Toggle.svelte.d.ts +2 -0
  33. package/dist/stories/components/Form/Toggle/utils/scss/mixins.scss +1 -14
  34. package/package.json +2 -2
  35. package/src/lib/index.ts +8 -0
  36. package/src/lib/stories/components/Form/Checkbox/Checkbox.svelte +323 -0
  37. package/src/lib/stories/components/Form/Checkbox/utils/scss/mixins.scss +80 -0
  38. package/src/lib/stories/components/Form/Radio/Radio.svelte +278 -0
  39. package/src/lib/stories/components/Form/Radio/utils/scss/mixins.scss +85 -0
  40. package/src/lib/stories/components/Form/Toggle/Toggle.svelte +31 -3
  41. 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 type="checkbox" {name} {id} {title} {disabled} {onchange} bind:this={ref} bind:checked />
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);
@@ -18,6 +18,8 @@ export interface ToggleProps {
18
18
  disabled?: boolean;
19
19
  /** Name */
20
20
  name?: string;
21
+ /** value */
22
+ value?: string;
21
23
  /** Id */
22
24
  id?: string;
23
25
  /** Title (for tooltip) */
@@ -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.14.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.0",
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
+ }