@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
@@ -0,0 +1,278 @@
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
+
6
+ import type { Snippet } from 'svelte';
7
+ import type { ChangeEventHandler } from 'svelte/elements';
8
+
9
+ export interface RadioProps {
10
+ /** Radio contents goes here */
11
+ children?: Snippet;
12
+ /** Radio ref */
13
+ ref?: HTMLInputElement;
14
+ /** How large should the radio be? */
15
+ size?: ComponentSize;
16
+ /** What color to use? */
17
+ color?: ComponentColor;
18
+ /** How round should the border radius be? */
19
+ roundness?: ComponentRoundness;
20
+ /** Radio disabled state */
21
+ disabled?: boolean;
22
+ /** Name */
23
+ name?: string;
24
+ /** value */
25
+ value?: string;
26
+ /** selected Value */
27
+ selectedValue?: string;
28
+ /** Id */
29
+ id?: string;
30
+ /** Title (for tooltip) */
31
+ title?: string;
32
+ /** Custom css class*/
33
+ class?: string;
34
+ /** onchange event handler */
35
+ onchange?: ChangeEventHandler<HTMLInputElement>;
36
+ }
37
+ </script>
38
+
39
+ <script lang="ts">
40
+ let {
41
+ children,
42
+ size = 'normal',
43
+ color = 'primary',
44
+ roundness = 'full',
45
+ name,
46
+ id,
47
+ title,
48
+ class: className = '',
49
+ disabled = false,
50
+ ref = $bindable<HTMLInputElement>(),
51
+ onchange,
52
+ value,
53
+ selectedValue,
54
+ }: RadioProps = $props();
55
+ </script>
56
+
57
+ <label
58
+ class:disabled
59
+ class={[
60
+ 'dodo-ui-Radio',
61
+ `size--${size}`,
62
+ `color--${color}`,
63
+ `roundness--${roundness}`,
64
+ className,
65
+ ].join(' ')}
66
+ for={id}
67
+ >
68
+ <input
69
+ type="radio"
70
+ {name}
71
+ {id}
72
+ {title}
73
+ {disabled}
74
+ {onchange}
75
+ bind:this={ref}
76
+ bind:group={selectedValue}
77
+ {value}
78
+ />
79
+ <div class="Radio">
80
+ <span class="RadioHandle"></span>
81
+ </div>
82
+
83
+ {#if children}
84
+ <div class="RadioMessage">
85
+ {@render children()}
86
+ </div>
87
+ {/if}
88
+ </label>
89
+
90
+ <style lang="scss">
91
+ @use 'utils/scss/mixins.scss' as *;
92
+
93
+ :global(:root) {
94
+ --dodo-ui-Radio-disabled-color: var(--dodo-color-neutral-400);
95
+ --dodo-ui-Radio-disabled-bg: var(--dodo-color-neutral-200);
96
+ --dodo-ui-Radio-border-disabled-color: var(--dodo-color-neutral-300);
97
+
98
+ --dodo-ui-Radio-border-color: var(--dodo-color-neutral-400);
99
+
100
+ @include generate-dodo-ui-radio-colors(neutral);
101
+ @include generate-dodo-ui-radio-colors(primary);
102
+ @include generate-dodo-ui-radio-colors(secondary);
103
+ @include generate-dodo-ui-radio-colors(safe);
104
+ @include generate-dodo-ui-radio-colors(warning);
105
+ @include generate-dodo-ui-radio-colors(danger);
106
+ }
107
+
108
+ :global(.dodo-theme--dark) {
109
+ --dodo-ui-Radio-disabled-bg: var(--dodo-color-neutral-100);
110
+ --dodo-ui-Radio-disabled-color: var(--dodo-color-neutral-500);
111
+ --dodo-ui-Radio-border-disabled-color: var(--dodo-color-neutral-400);
112
+
113
+ --dodo-ui-Radio-border-color: var(--dodo-color-neutral-500);
114
+
115
+ @include generate-dodo-ui-radio-colors-dark(neutral);
116
+ @include generate-dodo-ui-radio-colors-dark(primary);
117
+ @include generate-dodo-ui-radio-colors-dark(secondary);
118
+ @include generate-dodo-ui-radio-colors-dark(safe);
119
+ @include generate-dodo-ui-radio-colors-dark(warning);
120
+ @include generate-dodo-ui-radio-colors-dark(danger);
121
+ }
122
+
123
+ .dodo-ui-Radio {
124
+ cursor: pointer;
125
+ outline: none;
126
+ display: inline-flex;
127
+ padding: 0;
128
+ margin: 0;
129
+ position: relative;
130
+
131
+ input {
132
+ opacity: 0;
133
+ width: 0;
134
+ height: 0;
135
+ position: absolute;
136
+
137
+ &:focus-visible {
138
+ & + .Radio {
139
+ outline: 1px solid;
140
+ }
141
+ }
142
+
143
+ &:checked {
144
+ &:not([disabled]) {
145
+ & + .Radio {
146
+ .RadioHandle {
147
+ color: var(--dodo-color-constant-white);
148
+ }
149
+ }
150
+ }
151
+
152
+ &[disabled] {
153
+ & + .Radio {
154
+ .RadioHandle {
155
+ color: var(--dodo-ui-Radio-disabled-color);
156
+ }
157
+ }
158
+ }
159
+ }
160
+ }
161
+
162
+ .RadioHandle {
163
+ color: transparent;
164
+ display: inline-flex;
165
+ align-items: center;
166
+ justify-content: center;
167
+ border-radius: 50%;
168
+ height: 65%;
169
+ width: 65%;
170
+ }
171
+
172
+ .Radio {
173
+ transition: all 150ms;
174
+ text-decoration: none;
175
+ margin: 0;
176
+ display: inline-flex;
177
+ justify-content: center;
178
+ align-items: center;
179
+ font-family: inherit;
180
+ border-style: solid;
181
+ border-width: calc(var(--dodo-ui-element-border-width) * 2);
182
+ border-color: var(--dodo-ui-Radio-border-color);
183
+ outline: 0;
184
+ letter-spacing: 0.3px;
185
+ border-radius: inherit;
186
+ position: relative;
187
+ }
188
+
189
+ .RadioMessage {
190
+ display: flex;
191
+ align-items: center;
192
+ margin-left: var(--dodo-ui-space);
193
+ user-select: none;
194
+ }
195
+
196
+ &.size {
197
+ &--normal {
198
+ font-size: 1rem;
199
+
200
+ .Radio {
201
+ height: calc(var(--dodo-ui-element-height-normal) / 1.2);
202
+ width: calc(var(--dodo-ui-element-height-normal) / 1.2);
203
+ }
204
+ }
205
+
206
+ &--small {
207
+ font-size: 0.9rem;
208
+
209
+ .Radio {
210
+ height: calc(var(--dodo-ui-element-height-small) / 1.2);
211
+ width: calc(var(--dodo-ui-element-height-small) / 1.2);
212
+ }
213
+ }
214
+
215
+ &--large {
216
+ font-size: 1.1rem;
217
+
218
+ .Radio {
219
+ height: calc(var(--dodo-ui-element-height-large) / 1.2);
220
+ width: calc(var(--dodo-ui-element-height-large) / 1.2);
221
+ }
222
+ }
223
+ }
224
+
225
+ &.roundness {
226
+ &--1 {
227
+ border-radius: var(--dodo-ui-element-roundness-1);
228
+ }
229
+
230
+ &--2 {
231
+ border-radius: var(--dodo-ui-element-roundness-2);
232
+ }
233
+
234
+ &--3 {
235
+ border-radius: var(--dodo-ui-element-roundness-3);
236
+ }
237
+
238
+ &--full {
239
+ border-radius: 50%;
240
+ }
241
+ }
242
+
243
+ &.color {
244
+ @include generate-dodo-ui-radio-color(neutral);
245
+ @include generate-dodo-ui-radio-color(primary);
246
+ @include generate-dodo-ui-radio-color(secondary);
247
+ @include generate-dodo-ui-radio-color(safe);
248
+ @include generate-dodo-ui-radio-color(warning);
249
+ @include generate-dodo-ui-radio-color(danger);
250
+ }
251
+
252
+ &.disabled {
253
+ cursor: initial;
254
+ color: var(--dodo-ui-Radio-disabled-color);
255
+
256
+ .Radio {
257
+ background-color: var(--dodo-ui-Radio-disabled-bg);
258
+ border-color: var(--dodo-ui-Radio-border-disabled-color);
259
+ }
260
+
261
+ &:hover {
262
+ color: var(--dodo-ui-Radio-disabled-color);
263
+
264
+ .Radio {
265
+ background-color: var(--dodo-ui-Radio-disabled-bg);
266
+ }
267
+ }
268
+
269
+ &:active {
270
+ color: var(--dodo-ui-Radio-disabled-color);
271
+
272
+ .Radio {
273
+ background-color: var(--dodo-ui-Radio-disabled-bg);
274
+ }
275
+ }
276
+ }
277
+ }
278
+ </style>
@@ -0,0 +1,85 @@
1
+ /// Mixin: generate-dodo-ui-radio-colors
2
+ /// Generates CSS custom properties for Dodo UI radio 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-radio-colors($color-name) {
6
+ --dodo-ui-Radio-#{$color-name}-bg: var(--dodo-color-#{$color-name}-200);
7
+ --dodo-ui-Radio-#{$color-name}-hover-bg: var(--dodo-color-#{$color-name}-300);
8
+ --dodo-ui-Radio-#{$color-name}-active-bg: var(--dodo-color-#{$color-name}-400);
9
+
10
+ --dodo-ui-Radio-#{$color-name}-checked-bg: var(--dodo-color-#{$color-name}-500);
11
+ --dodo-ui-Radio-#{$color-name}-checked-hover-bg: var(--dodo-color-#{$color-name}-600);
12
+ --dodo-ui-Radio-#{$color-name}-checked-active-bg: var(--dodo-color-#{$color-name}-700);
13
+ }
14
+
15
+ /// Mixin: generate-dodo-ui-radio-colors
16
+ /// Generates CSS custom properties for Dodo UI radio 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-radio-colors-dark($color-name) {
20
+ --dodo-ui-Radio-#{$color-name}-bg: color-mix(
21
+ in oklab,
22
+ var(--dodo-color-#{$color-name}-50) 90%,
23
+ #fff
24
+ );
25
+ --dodo-ui-Radio-#{$color-name}-hover-bg: color-mix(
26
+ in oklab,
27
+ var(--dodo-color-#{$color-name}-100) 90%,
28
+ #fff
29
+ );
30
+ --dodo-ui-Radio-#{$color-name}-active-bg: color-mix(
31
+ in oklab,
32
+ var(--dodo-color-#{$color-name}-200) 90%,
33
+ #fff
34
+ );
35
+
36
+ --dodo-ui-Radio-#{$color-name}-checked-bg: var(--dodo-color-#{$color-name}-400);
37
+ --dodo-ui-Radio-#{$color-name}-checked-hover-bg: var(--dodo-color-#{$color-name}-300);
38
+ --dodo-ui-Radio-#{$color-name}-checked-active-bg: var(--dodo-color-#{$color-name}-200);
39
+ }
40
+
41
+ /// Mixin: generate-dodo-ui-radio-color
42
+ /// @param {String} $theme - e.g., default, safe, danger, etc.
43
+ @mixin generate-dodo-ui-radio-color($theme) {
44
+ &--#{$theme} {
45
+ .Radio {
46
+ background-color: var(--dodo-ui-Radio-#{$theme}-bg);
47
+ }
48
+
49
+ input:checked:not([disabled]) {
50
+ & + .Radio {
51
+ .RadioHandle {
52
+ background-color: var(--dodo-ui-Radio-#{$theme}-checked-bg);
53
+ }
54
+ }
55
+ }
56
+
57
+ &:hover {
58
+ .Radio {
59
+ background-color: var(--dodo-ui-Radio-#{$theme}-hover-bg);
60
+ }
61
+
62
+ input:checked:not([disabled]) {
63
+ & + .Radio {
64
+ .RadioHandle {
65
+ background-color: var(--dodo-ui-Radio-#{$theme}-checked-hover-bg);
66
+ }
67
+ }
68
+ }
69
+ }
70
+
71
+ &:active {
72
+ .Radio {
73
+ background-color: var(--dodo-ui-Radio-#{$theme}-active-bg);
74
+ }
75
+
76
+ input:checked:not([disabled]) {
77
+ & + .Radio {
78
+ .RadioHandle {
79
+ background-color: var(--dodo-ui-Radio-#{$theme}-checked-active-bg);
80
+ }
81
+ }
82
+ }
83
+ }
84
+ }
85
+ }
@@ -21,6 +21,8 @@
21
21
  disabled?: boolean;
22
22
  /** Name */
23
23
  name?: string;
24
+ /** value */
25
+ value?: string;
24
26
  /** Id */
25
27
  id?: string;
26
28
  /** Title (for tooltip) */
@@ -48,6 +50,7 @@
48
50
  checked = $bindable<boolean>(),
49
51
  ref = $bindable<HTMLInputElement>(),
50
52
  onchange,
53
+ value,
51
54
  }: ToggleProps = $props();
52
55
  </script>
53
56
 
@@ -62,7 +65,17 @@
62
65
  ].join(' ')}
63
66
  for={id}
64
67
  >
65
- <input type="checkbox" {name} {id} {title} {disabled} {onchange} bind:this={ref} bind:checked />
68
+ <input
69
+ type="checkbox"
70
+ {name}
71
+ {id}
72
+ {title}
73
+ {disabled}
74
+ {onchange}
75
+ bind:this={ref}
76
+ bind:checked
77
+ {value}
78
+ />
66
79
  <div class="Toggle">
67
80
  <span class="ToggleHandle"></span>
68
81
  </div>
@@ -80,6 +93,9 @@
80
93
  :global(:root) {
81
94
  --dodo-ui-Toggle-disabled-color: var(--dodo-color-neutral-400);
82
95
  --dodo-ui-Toggle-disabled-bg: var(--dodo-color-neutral-200);
96
+ --dodo-ui-Toggle-border-disabled-color: var(--dodo-color-neutral-300);
97
+
98
+ --dodo-ui-Toggle-border-color: var(--dodo-color-neutral-400);
83
99
 
84
100
  --dodo-ui-ToggleHandle-bg: var(--dodo-color-neutral-500);
85
101
  --dodo-ui-ToggleHandle-disabled-bg: var(--dodo-color-neutral-400);
@@ -95,6 +111,9 @@
95
111
  :global(.dodo-theme--dark) {
96
112
  --dodo-ui-Toggle-disabled-bg: var(--dodo-color-neutral-100);
97
113
  --dodo-ui-Toggle-disabled-color: var(--dodo-color-neutral-500);
114
+ --dodo-ui-Toggle-border-disabled-color: var(--dodo-color-neutral-400);
115
+
116
+ --dodo-ui-Toggle-border-color: var(--dodo-color-neutral-500);
98
117
 
99
118
  --dodo-ui-ToggleHandle-bg: var(--dodo-color-neutral-300);
100
119
  --dodo-ui-ToggleHandle-disabled-bg: var(--dodo-color-neutral-200);
@@ -113,11 +132,19 @@
113
132
  display: inline-flex;
114
133
  padding: 0;
115
134
  margin: 0;
135
+ position: relative;
116
136
 
117
137
  input {
118
138
  opacity: 0;
119
139
  width: 0;
120
140
  height: 0;
141
+ position: absolute;
142
+
143
+ &:focus-visible {
144
+ & + .Toggle {
145
+ outline: 1px solid;
146
+ }
147
+ }
121
148
 
122
149
  &:checked {
123
150
  & + .Toggle {
@@ -145,13 +172,13 @@
145
172
  align-items: center;
146
173
  font-family: inherit;
147
174
  border-style: solid;
148
- border-width: var(--dodo-ui-element-border-width);
149
- border-color: transparent;
150
175
  outline: 0;
151
176
  letter-spacing: 0.3px;
152
177
  padding: 0 var(--dodo-ui-space-small);
153
178
  border-radius: inherit;
154
179
  position: relative;
180
+ border-width: calc(var(--dodo-ui-element-border-width) * 2);
181
+ border-color: var(--dodo-ui-Toggle-border-color);
155
182
  }
156
183
 
157
184
  .ToggleMessage {
@@ -236,6 +263,7 @@
236
263
 
237
264
  .Toggle {
238
265
  background-color: var(--dodo-ui-Toggle-disabled-bg);
266
+ border-color: var(--dodo-ui-Toggle-border-disabled-color);
239
267
  }
240
268
 
241
269
  .ToggleHandle {
@@ -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
  }