@makolabs/ripple 0.0.1-dev.1 → 0.0.1-dev.11

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 (116) hide show
  1. package/README.md +571 -98
  2. package/dist/button/Button.svelte +48 -0
  3. package/dist/button/Button.svelte.d.ts +4 -0
  4. package/dist/button/button.d.ts +113 -0
  5. package/dist/button/button.js +168 -0
  6. package/dist/charts/Chart.svelte +533 -0
  7. package/dist/charts/Chart.svelte.d.ts +4 -0
  8. package/dist/drawer/Drawer.svelte +224 -0
  9. package/dist/drawer/Drawer.svelte.d.ts +4 -0
  10. package/dist/drawer/drawer.d.ts +160 -0
  11. package/dist/drawer/drawer.js +80 -0
  12. package/dist/elements/alert/Alert.svelte +53 -0
  13. package/dist/elements/alert/Alert.svelte.d.ts +4 -0
  14. package/dist/elements/badge/Badge.svelte +43 -0
  15. package/dist/elements/badge/Badge.svelte.d.ts +4 -0
  16. package/dist/elements/badge/badge.d.ts +181 -0
  17. package/dist/elements/badge/badge.js +65 -0
  18. package/dist/elements/dropdown/Dropdown.svelte +267 -0
  19. package/dist/elements/dropdown/Dropdown.svelte.d.ts +4 -0
  20. package/dist/elements/dropdown/Select.svelte +314 -0
  21. package/dist/elements/dropdown/Select.svelte.d.ts +4 -0
  22. package/dist/elements/dropdown/dropdown.d.ts +251 -0
  23. package/dist/elements/dropdown/dropdown.js +95 -0
  24. package/dist/elements/dropdown/select.d.ts +200 -0
  25. package/dist/elements/dropdown/select.js +82 -0
  26. package/dist/elements/file-upload/FileUpload.svelte +213 -0
  27. package/dist/elements/file-upload/FileUpload.svelte.d.ts +4 -0
  28. package/dist/elements/progress/Progress.svelte +87 -0
  29. package/dist/elements/progress/Progress.svelte.d.ts +4 -0
  30. package/dist/elements/timeline/Timeline.svelte +92 -0
  31. package/dist/elements/timeline/Timeline.svelte.d.ts +7 -0
  32. package/dist/forms/Checkbox.svelte +54 -0
  33. package/dist/forms/Checkbox.svelte.d.ts +4 -0
  34. package/dist/forms/DateRange.svelte +493 -0
  35. package/dist/forms/DateRange.svelte.d.ts +4 -0
  36. package/dist/forms/Form.svelte +39 -0
  37. package/dist/forms/Form.svelte.d.ts +4 -0
  38. package/dist/forms/Input.svelte +86 -0
  39. package/dist/forms/Input.svelte.d.ts +4 -0
  40. package/dist/forms/NumberInput.svelte +159 -0
  41. package/dist/forms/NumberInput.svelte.d.ts +4 -0
  42. package/dist/forms/RadioInputs.svelte +64 -0
  43. package/dist/forms/RadioInputs.svelte.d.ts +4 -0
  44. package/dist/forms/RadioPill.svelte +66 -0
  45. package/dist/forms/RadioPill.svelte.d.ts +4 -0
  46. package/dist/forms/Slider.svelte +342 -0
  47. package/dist/forms/Slider.svelte.d.ts +4 -0
  48. package/dist/forms/Tags.svelte +181 -0
  49. package/dist/forms/Tags.svelte.d.ts +4 -0
  50. package/dist/forms/Toggle.svelte +132 -0
  51. package/dist/forms/Toggle.svelte.d.ts +4 -0
  52. package/dist/forms/slider.d.ts +143 -0
  53. package/dist/forms/slider.js +62 -0
  54. package/dist/header/Breadcrumbs.svelte +73 -0
  55. package/dist/header/Breadcrumbs.svelte.d.ts +4 -0
  56. package/dist/header/PageHeader.svelte +30 -0
  57. package/dist/header/PageHeader.svelte.d.ts +4 -0
  58. package/dist/header/breadcrumbs.d.ts +226 -0
  59. package/dist/header/breadcrumbs.js +87 -0
  60. package/dist/header/pageheaders.d.ts +10 -0
  61. package/dist/header/pageheaders.js +1 -0
  62. package/dist/helper/cls.d.ts +1 -0
  63. package/dist/helper/cls.js +4 -0
  64. package/dist/helper/date.d.ts +7 -0
  65. package/dist/helper/date.js +15 -0
  66. package/dist/helper/nav.svelte.d.ts +6 -0
  67. package/dist/helper/nav.svelte.js +23 -0
  68. package/dist/index.d.ts +734 -1
  69. package/dist/index.js +62 -1
  70. package/dist/layout/card/Card.svelte +41 -0
  71. package/dist/layout/card/Card.svelte.d.ts +4 -0
  72. package/dist/layout/card/StatsCard.svelte +265 -0
  73. package/dist/layout/card/StatsCard.svelte.d.ts +4 -0
  74. package/dist/layout/card/card.d.ts +128 -0
  75. package/dist/layout/card/card.js +51 -0
  76. package/dist/layout/card/stats-card.d.ts +206 -0
  77. package/dist/layout/card/stats-card.js +73 -0
  78. package/dist/layout/navbar/Navbar.svelte +206 -0
  79. package/dist/layout/navbar/Navbar.svelte.d.ts +4 -0
  80. package/dist/layout/navbar/navbar.d.ts +205 -0
  81. package/dist/layout/navbar/navbar.js +98 -0
  82. package/dist/layout/sidebar/NavGroup.svelte +97 -0
  83. package/dist/layout/sidebar/NavGroup.svelte.d.ts +4 -0
  84. package/dist/layout/sidebar/NavItem.svelte +29 -0
  85. package/dist/layout/sidebar/NavItem.svelte.d.ts +4 -0
  86. package/dist/layout/sidebar/Sidebar.svelte +139 -0
  87. package/dist/layout/sidebar/Sidebar.svelte.d.ts +4 -0
  88. package/dist/layout/table/Cells.svelte +111 -0
  89. package/dist/layout/table/Cells.svelte.d.ts +27 -0
  90. package/dist/layout/table/Table.svelte +413 -0
  91. package/dist/layout/table/Table.svelte.d.ts +4 -0
  92. package/dist/layout/table/table.d.ts +303 -0
  93. package/dist/layout/table/table.js +149 -0
  94. package/dist/layout/tabs/Tab.svelte +57 -0
  95. package/dist/layout/tabs/Tab.svelte.d.ts +4 -0
  96. package/dist/layout/tabs/TabContent.svelte +31 -0
  97. package/dist/layout/tabs/TabContent.svelte.d.ts +4 -0
  98. package/dist/layout/tabs/TabGroup.svelte +57 -0
  99. package/dist/layout/tabs/TabGroup.svelte.d.ts +4 -0
  100. package/dist/layout/tabs/tabs.d.ts +155 -0
  101. package/dist/layout/tabs/tabs.js +156 -0
  102. package/dist/modal/Modal.svelte +207 -0
  103. package/dist/modal/Modal.svelte.d.ts +4 -0
  104. package/dist/modal/modal.d.ts +211 -0
  105. package/dist/modal/modal.js +81 -0
  106. package/dist/sonner/sonner.svelte +13 -0
  107. package/dist/sonner/sonner.svelte.d.ts +4 -0
  108. package/dist/types/variants.d.ts +1 -0
  109. package/dist/types/variants.js +1 -0
  110. package/dist/variants.d.ts +20 -0
  111. package/dist/variants.js +19 -0
  112. package/package.json +104 -80
  113. package/dist/layout/Card.svelte +0 -179
  114. package/dist/layout/Card.svelte.d.ts +0 -208
  115. package/dist/layout/index.d.ts +0 -1
  116. package/dist/layout/index.js +0 -1
@@ -0,0 +1,207 @@
1
+ <script lang="ts">
2
+ import { onMount, onDestroy, tick } from 'svelte';
3
+ import { browser } from '$app/environment';
4
+ import { fade, scale } from 'svelte/transition';
5
+ import { quintOut } from 'svelte/easing';
6
+ import { cn } from '../helper/cls.js';
7
+ import { modal } from './modal.js';
8
+ import type { MakeModalProps } from '../index.js';
9
+
10
+ let {
11
+ open = $bindable(false),
12
+ onclose: onClose = () => {},
13
+ title,
14
+ description,
15
+ position = 'center',
16
+ size = 'lg',
17
+ children,
18
+ header,
19
+ custom,
20
+ class: className = '',
21
+ backdropclass: backdropClassName = '',
22
+ contentclass: contentClassName = '',
23
+ headerclass: headerClassName = '',
24
+ titleclass: titleClass = '',
25
+ bodyclass: bodyClassName = ''
26
+ }: MakeModalProps = $props();
27
+
28
+ let modalElement: HTMLDivElement | undefined = $state();
29
+
30
+ const {
31
+ base,
32
+ backdrop,
33
+ contentWrapper,
34
+ content,
35
+ header: headerVClass,
36
+ title: titleVClass,
37
+ closeButton,
38
+ body
39
+ } = $derived(
40
+ modal({
41
+ open,
42
+ position,
43
+ size
44
+ })
45
+ );
46
+
47
+ const closeButtonClasses = $derived(closeButton());
48
+ const contentItemClass = $derived(content());
49
+ const baseClass = $derived(cn(base(), className));
50
+ const backdropClass = $derived(cn(backdrop(), backdropClassName));
51
+ const contentWrapperClass = $derived(cn(contentWrapper(), contentClassName));
52
+ const headerClass = $derived(cn(headerVClass(), headerClassName));
53
+ const titleClasses = $derived(cn(titleVClass(), titleClass));
54
+ const bodyClasses = $derived(cn(body(), bodyClassName));
55
+
56
+ function handleBackdropClick(e: MouseEvent) {
57
+ if (e.target === e.currentTarget) {
58
+ onClose();
59
+ }
60
+ }
61
+
62
+ function handleEscapeKey(e: KeyboardEvent) {
63
+ if (e.key === 'Escape' && open) {
64
+ onClose();
65
+ }
66
+ }
67
+
68
+ function handleCloseClick() {
69
+ onClose();
70
+ }
71
+
72
+ // Focus trap functionality
73
+ let previouslyFocusedElement: HTMLElement | null = null;
74
+
75
+ function trapFocus(element: HTMLElement) {
76
+ const focusableElements = element.querySelectorAll(
77
+ 'a[href], button, input, textarea, select, details, [tabindex]:not([tabindex="-1"])'
78
+ );
79
+
80
+ if (focusableElements.length === 0) return;
81
+
82
+ const firstElement = focusableElements[0] as HTMLElement;
83
+ const lastElement = focusableElements[focusableElements.length - 1] as HTMLElement;
84
+
85
+ function handleTabKey(e: KeyboardEvent) {
86
+ if (e.key !== 'Tab') return;
87
+
88
+ if (e.shiftKey) {
89
+ if (document.activeElement === firstElement) {
90
+ lastElement.focus();
91
+ e.preventDefault();
92
+ }
93
+ } else {
94
+ if (document.activeElement === lastElement) {
95
+ firstElement.focus();
96
+ e.preventDefault();
97
+ }
98
+ }
99
+ }
100
+
101
+ element.addEventListener('keydown', handleTabKey);
102
+ firstElement.focus();
103
+
104
+ return () => {
105
+ element.removeEventListener('keydown', handleTabKey);
106
+ };
107
+ }
108
+
109
+ onMount(() => {
110
+ document.addEventListener('keydown', handleEscapeKey);
111
+ return () => {
112
+ document.removeEventListener('keydown', handleEscapeKey);
113
+ };
114
+ });
115
+
116
+ $effect(() => {
117
+ if (!browser) return;
118
+ if (open) {
119
+ previouslyFocusedElement = document.activeElement as HTMLElement;
120
+ document.body.style.overflow = 'hidden';
121
+
122
+ tick().then(() => {
123
+ if (modalElement) {
124
+ trapFocus(modalElement);
125
+ }
126
+ });
127
+ } else {
128
+ document.body.style.overflow = '';
129
+ if (previouslyFocusedElement) {
130
+ previouslyFocusedElement.focus();
131
+ }
132
+ }
133
+ });
134
+
135
+ onDestroy(() => {
136
+ if (browser && document.body.style.overflow === 'hidden') {
137
+ document.body.style.overflow = '';
138
+ }
139
+ });
140
+ </script>
141
+
142
+ {#if browser}
143
+ <div
144
+ class={baseClass}
145
+ bind:this={modalElement}
146
+ role="dialog"
147
+ aria-modal="true"
148
+ aria-labelledby={title ? 'modal-title' : undefined}
149
+ aria-describedby={description ? 'modal-description' : undefined}
150
+ >
151
+ <!-- Backdrop -->
152
+ <button
153
+ class={backdropClass}
154
+ onclick={handleBackdropClick}
155
+ transition:fade={{ duration: 200 }}
156
+ aria-label="Close modal"
157
+ ></button>
158
+
159
+ <!-- Modal content -->
160
+ <div
161
+ class={contentWrapperClass}
162
+ transition:scale={{ duration: 200, easing: quintOut, start: 0.95 }}
163
+ >
164
+ {#if custom}
165
+ {@render custom()}
166
+ {:else}
167
+ <div class={contentItemClass}>
168
+ {#if header || title}
169
+ <div class={headerClass}>
170
+ {#if header}
171
+ {@render header()}
172
+ {:else}
173
+ {#if title}
174
+ <h3 id="modal-title" class={titleClasses}>{title}</h3>
175
+ {/if}
176
+ <button
177
+ type="button"
178
+ class={closeButtonClasses}
179
+ onclick={handleCloseClick}
180
+ aria-label="Close modal"
181
+ >
182
+ <svg
183
+ xmlns="http://www.w3.org/2000/svg"
184
+ width="12"
185
+ height="12"
186
+ viewBox="0 0 12 12"
187
+ >
188
+ <path
189
+ fill="currentColor"
190
+ d="m1.897 2.054l.073-.084a.75.75 0 0 1 .976-.073l.084.073L6 4.939l2.97-2.97a.75.75 0 1 1 1.06 1.061L7.061 6l2.97 2.97a.75.75 0 0 1 .072.976l-.073.084a.75.75 0 0 1-.976.073l-.084-.073L6 7.061l-2.97 2.97A.75.75 0 1 1 1.97 8.97L4.939 6l-2.97-2.97a.75.75 0 0 1-.072-.976l.073-.084z"
191
+ />
192
+ </svg>
193
+ </button>
194
+ {/if}
195
+ </div>
196
+ {/if}
197
+
198
+ {#if children}
199
+ <div class={bodyClasses}>
200
+ {@render children()}
201
+ </div>
202
+ {/if}
203
+ </div>
204
+ {/if}
205
+ </div>
206
+ </div>
207
+ {/if}
@@ -0,0 +1,4 @@
1
+ import type { MakeModalProps } from '../index.js';
2
+ declare const Modal: import("svelte").Component<MakeModalProps, {}, "open">;
3
+ type Modal = ReturnType<typeof Modal>;
4
+ export default Modal;
@@ -0,0 +1,211 @@
1
+ export declare const modal: import("tailwind-variants").TVReturnType<{
2
+ open: {
3
+ true: {
4
+ base: string;
5
+ backdrop: string;
6
+ contentWrapper: string;
7
+ };
8
+ false: {
9
+ base: string;
10
+ backdrop: string;
11
+ contentWrapper: string;
12
+ };
13
+ };
14
+ position: {
15
+ center: {
16
+ contentWrapper: string;
17
+ };
18
+ top: {
19
+ contentWrapper: string;
20
+ };
21
+ bottom: {
22
+ contentWrapper: string;
23
+ };
24
+ left: {
25
+ contentWrapper: string;
26
+ };
27
+ right: {
28
+ contentWrapper: string;
29
+ };
30
+ };
31
+ size: {
32
+ xs: {
33
+ contentWrapper: string;
34
+ };
35
+ sm: {
36
+ contentWrapper: string;
37
+ };
38
+ base: {
39
+ contentWrapper: string;
40
+ };
41
+ lg: {
42
+ contentWrapper: string;
43
+ };
44
+ xl: {
45
+ contentWrapper: string;
46
+ };
47
+ '2xl': {
48
+ contentWrapper: string;
49
+ };
50
+ };
51
+ border: {
52
+ none: {
53
+ content: string;
54
+ };
55
+ default: {
56
+ content: string;
57
+ };
58
+ colored: {
59
+ content: string;
60
+ };
61
+ };
62
+ }, {
63
+ base: string;
64
+ backdrop: string;
65
+ contentWrapper: string;
66
+ content: string;
67
+ header: string;
68
+ body: string;
69
+ title: string;
70
+ closeButton: string;
71
+ }, undefined, {
72
+ open: {
73
+ true: {
74
+ base: string;
75
+ backdrop: string;
76
+ contentWrapper: string;
77
+ };
78
+ false: {
79
+ base: string;
80
+ backdrop: string;
81
+ contentWrapper: string;
82
+ };
83
+ };
84
+ position: {
85
+ center: {
86
+ contentWrapper: string;
87
+ };
88
+ top: {
89
+ contentWrapper: string;
90
+ };
91
+ bottom: {
92
+ contentWrapper: string;
93
+ };
94
+ left: {
95
+ contentWrapper: string;
96
+ };
97
+ right: {
98
+ contentWrapper: string;
99
+ };
100
+ };
101
+ size: {
102
+ xs: {
103
+ contentWrapper: string;
104
+ };
105
+ sm: {
106
+ contentWrapper: string;
107
+ };
108
+ base: {
109
+ contentWrapper: string;
110
+ };
111
+ lg: {
112
+ contentWrapper: string;
113
+ };
114
+ xl: {
115
+ contentWrapper: string;
116
+ };
117
+ '2xl': {
118
+ contentWrapper: string;
119
+ };
120
+ };
121
+ border: {
122
+ none: {
123
+ content: string;
124
+ };
125
+ default: {
126
+ content: string;
127
+ };
128
+ colored: {
129
+ content: string;
130
+ };
131
+ };
132
+ }, {
133
+ base: string;
134
+ backdrop: string;
135
+ contentWrapper: string;
136
+ content: string;
137
+ header: string;
138
+ body: string;
139
+ title: string;
140
+ closeButton: string;
141
+ }, import("tailwind-variants").TVReturnType<{
142
+ open: {
143
+ true: {
144
+ base: string;
145
+ backdrop: string;
146
+ contentWrapper: string;
147
+ };
148
+ false: {
149
+ base: string;
150
+ backdrop: string;
151
+ contentWrapper: string;
152
+ };
153
+ };
154
+ position: {
155
+ center: {
156
+ contentWrapper: string;
157
+ };
158
+ top: {
159
+ contentWrapper: string;
160
+ };
161
+ bottom: {
162
+ contentWrapper: string;
163
+ };
164
+ left: {
165
+ contentWrapper: string;
166
+ };
167
+ right: {
168
+ contentWrapper: string;
169
+ };
170
+ };
171
+ size: {
172
+ xs: {
173
+ contentWrapper: string;
174
+ };
175
+ sm: {
176
+ contentWrapper: string;
177
+ };
178
+ base: {
179
+ contentWrapper: string;
180
+ };
181
+ lg: {
182
+ contentWrapper: string;
183
+ };
184
+ xl: {
185
+ contentWrapper: string;
186
+ };
187
+ '2xl': {
188
+ contentWrapper: string;
189
+ };
190
+ };
191
+ border: {
192
+ none: {
193
+ content: string;
194
+ };
195
+ default: {
196
+ content: string;
197
+ };
198
+ colored: {
199
+ content: string;
200
+ };
201
+ };
202
+ }, {
203
+ base: string;
204
+ backdrop: string;
205
+ contentWrapper: string;
206
+ content: string;
207
+ header: string;
208
+ body: string;
209
+ title: string;
210
+ closeButton: string;
211
+ }, undefined, unknown, unknown, undefined>>;
@@ -0,0 +1,81 @@
1
+ import { tv } from 'tailwind-variants';
2
+ export const modal = tv({
3
+ slots: {
4
+ base: 'fixed inset-0 z-50 flex items-center justify-center overflow-y-auto',
5
+ backdrop: 'fixed inset-0 transition-opacity bg-black/50',
6
+ contentWrapper: 'absolute transform overflow-hidden transition-all px-2',
7
+ content: 'bg-white overflow-hidden rounded-lg',
8
+ header: 'px-4 py-3 flex items-center justify-between border-b border-gray-200',
9
+ body: 'px-3 py-2 max-h-[70dvh] overflow-y-auto',
10
+ title: 'text-default-900 leading-6 text-base font-semibold',
11
+ closeButton: 'text-gray-400 hover:text-gray-500 rounded-md cursor-pointer'
12
+ },
13
+ variants: {
14
+ open: {
15
+ true: {
16
+ base: 'visible',
17
+ backdrop: 'visible opacity-100',
18
+ contentWrapper: 'visible scale-100 opacity-100'
19
+ },
20
+ false: {
21
+ base: 'invisible',
22
+ backdrop: 'invisible opacity-0',
23
+ contentWrapper: 'invisible scale-95 opacity-0'
24
+ }
25
+ },
26
+ position: {
27
+ center: {
28
+ contentWrapper: 'mx-auto'
29
+ },
30
+ top: {
31
+ contentWrapper: 'mx-auto top-7'
32
+ },
33
+ bottom: {
34
+ contentWrapper: 'mx-auto bottom-7'
35
+ },
36
+ left: {
37
+ contentWrapper: 'left-7'
38
+ },
39
+ right: {
40
+ contentWrapper: 'right-7'
41
+ }
42
+ },
43
+ size: {
44
+ xs: {
45
+ contentWrapper: 'w-full max-w-xs'
46
+ },
47
+ sm: {
48
+ contentWrapper: 'w-full max-w-sm'
49
+ },
50
+ base: {
51
+ contentWrapper: 'w-full max-w-md'
52
+ },
53
+ lg: {
54
+ contentWrapper: 'w-full max-w-lg'
55
+ },
56
+ xl: {
57
+ contentWrapper: 'w-full max-w-xl'
58
+ },
59
+ '2xl': {
60
+ contentWrapper: 'w-full max-w-2xl'
61
+ }
62
+ },
63
+ border: {
64
+ none: {
65
+ content: 'border-0'
66
+ },
67
+ default: {
68
+ content: 'border border-gray-200'
69
+ },
70
+ colored: {
71
+ content: 'border'
72
+ }
73
+ }
74
+ },
75
+ defaultVariants: {
76
+ open: false,
77
+ position: 'center',
78
+ size: 'base',
79
+ color: 'default'
80
+ }
81
+ });
@@ -0,0 +1,13 @@
1
+ <script lang="ts">
2
+ import { Toaster as Sonner, type ToasterProps as SonnerProps } from 'svelte-sonner';
3
+
4
+ let restProps: SonnerProps = $props();
5
+ </script>
6
+
7
+ <Sonner
8
+ class="toaster group"
9
+ toastOptions={{
10
+
11
+ }}
12
+ {...restProps}
13
+ />
@@ -0,0 +1,4 @@
1
+ import { Toaster as Sonner, type ToasterProps as SonnerProps } from 'svelte-sonner';
2
+ declare const Sonner: import("svelte").Component<SonnerProps, {}, "">;
3
+ type Sonner = ReturnType<typeof Sonner>;
4
+ export default Sonner;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ "use strict";
@@ -0,0 +1,20 @@
1
+ import type { VariantColors, VariantSizes } from './index.js';
2
+ export declare const Color: {
3
+ DEFAULT: string;
4
+ PRIMARY: string;
5
+ SECONDARY: string;
6
+ INFO: string;
7
+ SUCCESS: string;
8
+ WARNING: string;
9
+ DANGER: string;
10
+ };
11
+ export declare const Size: {
12
+ XS: string;
13
+ SM: string;
14
+ BASE: string;
15
+ LG: string;
16
+ XL: string;
17
+ XXL: string;
18
+ };
19
+ export declare const colors: VariantColors[];
20
+ export declare const sizes: VariantSizes[];
@@ -0,0 +1,19 @@
1
+ export const Color = {
2
+ DEFAULT: 'default',
3
+ PRIMARY: 'primary',
4
+ SECONDARY: 'secondary',
5
+ INFO: 'info',
6
+ SUCCESS: 'success',
7
+ WARNING: 'warning',
8
+ DANGER: 'danger'
9
+ };
10
+ export const Size = {
11
+ XS: 'xs',
12
+ SM: 'sm',
13
+ BASE: 'base',
14
+ LG: 'lg',
15
+ XL: 'xl',
16
+ XXL: '2xl'
17
+ };
18
+ export const colors = Object.values(Color);
19
+ export const sizes = Object.values(Size);