@flightlesslabs/dodo-ui 0.14.0 → 0.16.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 (64) hide show
  1. package/dist/index.d.ts +13 -0
  2. package/dist/index.js +8 -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/dist/stories/components/Layout/Grid/Column/Column.stories.svelte +18 -0
  35. package/dist/stories/components/Layout/Grid/Column/Column.stories.svelte.d.ts +21 -0
  36. package/dist/stories/components/Layout/Grid/Column/Column.svelte +73 -0
  37. package/dist/stories/components/Layout/Grid/Column/Column.svelte.d.ts +24 -0
  38. package/dist/stories/components/Layout/Grid/Grid.stories.svelte +179 -0
  39. package/dist/stories/components/Layout/Grid/Grid.stories.svelte.d.ts +21 -0
  40. package/dist/stories/components/Layout/Grid/Grid.svelte +24 -0
  41. package/dist/stories/components/Layout/Grid/Grid.svelte.d.ts +16 -0
  42. package/dist/stories/components/Layout/Grid/Row/Row.stories.svelte +19 -0
  43. package/dist/stories/components/Layout/Grid/Row/Row.stories.svelte.d.ts +21 -0
  44. package/dist/stories/components/Layout/Grid/Row/Row.svelte +20 -0
  45. package/dist/stories/components/Layout/Grid/Row/Row.svelte.d.ts +12 -0
  46. package/dist/styles/global.css +0 -1
  47. package/dist/styles/scss/_breakpoints.scss +5 -0
  48. package/dist/styles/scss/index.scss +1 -0
  49. package/package.json +4 -3
  50. package/src/lib/index.ts +19 -0
  51. package/src/lib/stories/components/Form/Checkbox/Checkbox.svelte +323 -0
  52. package/src/lib/stories/components/Form/Checkbox/utils/scss/mixins.scss +80 -0
  53. package/src/lib/stories/components/Form/Radio/Radio.svelte +278 -0
  54. package/src/lib/stories/components/Form/Radio/utils/scss/mixins.scss +85 -0
  55. package/src/lib/stories/components/Form/Toggle/Toggle.svelte +31 -3
  56. package/src/lib/stories/components/Form/Toggle/utils/scss/mixins.scss +1 -14
  57. package/src/lib/stories/components/Layout/Grid/Column/Column.svelte +127 -0
  58. package/src/lib/stories/components/Layout/Grid/Grid.svelte +47 -0
  59. package/src/lib/stories/components/Layout/Grid/Row/Row.svelte +36 -0
  60. package/src/lib/styles/global.css +0 -1
  61. package/src/lib/styles/scss/_breakpoints.scss +5 -0
  62. package/src/lib/styles/scss/index.scss +1 -0
  63. package/dist/styles/_breakpoint.css +0 -10
  64. package/src/lib/styles/_breakpoint.css +0 -10
@@ -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
  }
@@ -0,0 +1,127 @@
1
+ <script lang="ts" module>
2
+ import { type Snippet } from 'svelte';
3
+
4
+ export type GridColumnSize = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12;
5
+
6
+ export const GridColumnSizeArray: GridColumnSize[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
7
+
8
+ export interface GridColumnProps {
9
+ /** GridColumn contents goes here */
10
+ children?: Snippet;
11
+ /** GridColumn ref */
12
+ ref?: HTMLDivElement;
13
+ /** Custom css class */
14
+ class?: string;
15
+ /** Breakpoint: sm */
16
+ sm?: GridColumnSize;
17
+ /** Breakpoint: md */
18
+ md?: GridColumnSize;
19
+ /** Breakpoint: lg */
20
+ lg?: GridColumnSize;
21
+ /** Breakpoint: xl */
22
+ xl?: GridColumnSize;
23
+ /** Breakpoint: 2 xl */
24
+ xl2?: GridColumnSize;
25
+ }
26
+ </script>
27
+
28
+ <script lang="ts">
29
+ let {
30
+ children,
31
+ class: className = '',
32
+ ref = $bindable<HTMLDivElement>(),
33
+ sm = 12,
34
+ md,
35
+ lg,
36
+ xl,
37
+ xl2,
38
+ }: GridColumnProps = $props();
39
+
40
+ const breakpoints = [
41
+ { name: 'sm', value: sm },
42
+ { name: 'md', value: md },
43
+ { name: 'lg', value: lg },
44
+ { name: 'xl', value: xl },
45
+ { name: 'xl2', value: xl2 },
46
+ ];
47
+
48
+ function getBreakpointClasses() {
49
+ let classNameBreakpoints = [];
50
+
51
+ for (let index = 0; index < breakpoints.length; index++) {
52
+ const element = breakpoints[index];
53
+
54
+ if (!element.value) {
55
+ continue;
56
+ }
57
+
58
+ classNameBreakpoints.push(`breakpoint--${element.name}`);
59
+ }
60
+
61
+ return classNameBreakpoints;
62
+ }
63
+
64
+ function getBreakpointCssVariables() {
65
+ let cssVariablesBreakpoints = [];
66
+
67
+ for (let index = 0; index < breakpoints.length; index++) {
68
+ const element = breakpoints[index];
69
+
70
+ if (!element.value) {
71
+ continue;
72
+ }
73
+
74
+ cssVariablesBreakpoints.push(`--GridColumnBreakpoint-${element.name}: ${element.value}`);
75
+ }
76
+
77
+ return cssVariablesBreakpoints.join(';');
78
+ }
79
+ </script>
80
+
81
+ <div
82
+ class={['dodo-ui-GridColumn', ...getBreakpointClasses(), className].join(' ')}
83
+ style={getBreakpointCssVariables()}
84
+ bind:this={ref}
85
+ >
86
+ {#if children}
87
+ {@render children()}
88
+ {/if}
89
+ </div>
90
+
91
+ <style lang="scss">
92
+ @use '../../../../../styles/scss' as *;
93
+
94
+ .dodo-ui-GridColumn {
95
+ min-width: 0;
96
+
97
+ &.breakpoint {
98
+ &--sm {
99
+ grid-column: span var(--GridColumnBreakpoint-sm);
100
+ }
101
+
102
+ &--md {
103
+ @media (min-width: $breakpoints-md) {
104
+ grid-column: span var(--GridColumnBreakpoint-md);
105
+ }
106
+ }
107
+
108
+ &--lg {
109
+ @media (min-width: $breakpoints-lg) {
110
+ grid-column: span var(--GridColumnBreakpoint-lg);
111
+ }
112
+ }
113
+
114
+ &--xl {
115
+ @media (min-width: $breakpoints-xl) {
116
+ grid-column: span var(--GridColumnBreakpoint-xl);
117
+ }
118
+ }
119
+
120
+ &--xl2 {
121
+ @media (min-width: $breakpoints-xl2) {
122
+ grid-column: span var(--GridColumnBreakpoint-xl2);
123
+ }
124
+ }
125
+ }
126
+ }
127
+ </style>
@@ -0,0 +1,47 @@
1
+ <script lang="ts" module>
2
+ import { type Snippet } from 'svelte';
3
+
4
+ export interface GridProps {
5
+ /** Grid contents goes here */
6
+ children?: Snippet;
7
+ /** Grid ref */
8
+ ref?: HTMLDivElement;
9
+ /** Custom css class */
10
+ class?: string;
11
+ /** Grid spacing, affects Coulumns */
12
+ spacing?: number;
13
+ /** Optional Row spacing, default is 0 */
14
+ rowSpacing?: number;
15
+ }
16
+ </script>
17
+
18
+ <script lang="ts">
19
+ let {
20
+ children,
21
+ class: className = '',
22
+ ref = $bindable<HTMLDivElement>(),
23
+ spacing = 1,
24
+ rowSpacing,
25
+ }: GridProps = $props();
26
+
27
+ const rowSpacingModified = rowSpacing || rowSpacing === 0 ? rowSpacing : spacing;
28
+ </script>
29
+
30
+ <div
31
+ class={['dodo-ui-Grid', className].join(' ')}
32
+ bind:this={ref}
33
+ style={`--GridSpacing: ${spacing}; --GridRowSpacing: ${rowSpacingModified};`}
34
+ >
35
+ {#if children}
36
+ {@render children()}
37
+ {/if}
38
+ </div>
39
+
40
+ <style lang="scss">
41
+ .dodo-ui-Grid {
42
+ display: grid;
43
+ grid-template-columns: repeat(12, 1fr);
44
+ gap: calc(var(--GridRowSpacing) * var(--dodo-ui-space));
45
+ grid-auto-flow: row;
46
+ }
47
+ </style>
@@ -0,0 +1,36 @@
1
+ <script lang="ts" module>
2
+ import { type Snippet } from 'svelte';
3
+
4
+ export interface GridRowProps {
5
+ /** GridRow contents goes here */
6
+ children?: Snippet;
7
+ /** GridRow ref */
8
+ ref?: HTMLDivElement;
9
+ /** Custom css class */
10
+ class?: string;
11
+ }
12
+ </script>
13
+
14
+ <script lang="ts">
15
+ let {
16
+ children,
17
+ class: className = '',
18
+ ref = $bindable<HTMLDivElement>(),
19
+ }: GridRowProps = $props();
20
+ </script>
21
+
22
+ <div class={['dodo-ui-GridRow', className].join(' ')} bind:this={ref}>
23
+ {#if children}
24
+ {@render children()}
25
+ {/if}
26
+ </div>
27
+
28
+ <style lang="scss">
29
+ .dodo-ui-GridRow {
30
+ grid-column: span 12;
31
+ display: grid;
32
+ grid-template-columns: repeat(12, 1fr);
33
+ gap: calc(var(--GridSpacing) * var(--dodo-ui-space));
34
+ grid-auto-flow: row;
35
+ }
36
+ </style>
@@ -3,6 +3,5 @@
3
3
  @import '_colors.css';
4
4
  @import '_space.css';
5
5
  @import '_z-index.css';
6
- @import '_breakpoint.css';
7
6
  @import '_shadow.css';
8
7
  @import '_components.css';
@@ -0,0 +1,5 @@
1
+ $breakpoints-sm: 40rem;
2
+ $breakpoints-md: 48rem;
3
+ $breakpoints-lg: 64rem;
4
+ $breakpoints-xl: 80rem;
5
+ $breakpoints-xl2: 96rem;