@flightlesslabs/dodo-ui 0.1.2 → 0.1.4

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 (32) hide show
  1. package/dist/index.d.ts +3 -1
  2. package/dist/index.js +1 -0
  3. package/dist/stories/Getting Started.mdx +2 -2
  4. package/dist/stories/components/Form/Button/Button.stories.svelte +13 -4
  5. package/dist/stories/components/Form/Button/Button.stories.svelte.d.ts +2 -32
  6. package/dist/stories/components/Form/Button/Button.svelte +155 -56
  7. package/dist/stories/components/Form/Button/Button.svelte.d.ts +12 -6
  8. package/dist/stories/components/Form/Button/Color/Color.stories.svelte +1 -4
  9. package/dist/stories/components/Form/Button/IconButton/IconButton.stories.svelte +9 -5
  10. package/dist/stories/components/Form/Button/Roundness/Roundness.stories.svelte +2 -4
  11. package/dist/stories/components/Form/Button/Size/Size.stories.svelte +1 -4
  12. package/dist/stories/components/Form/Button/Variant/Variant.stories.svelte +1 -4
  13. package/dist/stories/components/Form/Button/utils/scss/mixins.scss +70 -0
  14. package/dist/storybook-types.d.ts +129 -0
  15. package/dist/storybook-types.js +1 -0
  16. package/dist/styles/_colors.css +88 -0
  17. package/dist/styles/_components.css +4 -4
  18. package/dist/types.d.ts +3 -1
  19. package/package.json +1 -1
  20. package/src/lib/index.ts +8 -1
  21. package/src/lib/stories/components/Form/Button/Button.stories.svelte +15 -5
  22. package/src/lib/stories/components/Form/Button/Button.svelte +64 -215
  23. package/src/lib/stories/components/Form/Button/Color/Color.stories.svelte +1 -4
  24. package/src/lib/stories/components/Form/Button/IconButton/IconButton.stories.svelte +9 -5
  25. package/src/lib/stories/components/Form/Button/Roundness/Roundness.stories.svelte +2 -4
  26. package/src/lib/stories/components/Form/Button/Size/Size.stories.svelte +1 -4
  27. package/src/lib/stories/components/Form/Button/Variant/Variant.stories.svelte +1 -4
  28. package/src/lib/stories/components/Form/Button/utils/scss/mixins.scss +70 -0
  29. package/src/lib/storybook-types.ts +182 -0
  30. package/src/lib/styles/_colors.css +88 -0
  31. package/src/lib/styles/_components.css +4 -4
  32. package/src/lib/types.ts +3 -1
@@ -9,10 +9,7 @@
9
9
  const { Story } = defineMeta({
10
10
  component: Button,
11
11
  tags: ['autodocs'],
12
- // @ts-ignore
13
- argTypes: {
14
- ...storyButtonArgTypes,
15
- },
12
+ argTypes: storyButtonArgTypes,
16
13
  args: {
17
14
  onclick: fn(),
18
15
  },
@@ -20,7 +17,14 @@
20
17
  </script>
21
18
 
22
19
  <!-- Compact button with paddings stripped out and fixed size. We are using this icon library https://iconify.design/docs/icon-components/svelte/ -->
23
- <Story name="Icon Button" args={{ compact: true, roundness: 'full' }}>
20
+ <Story name="Icon Button" args={{ compact: true }}>
21
+ <Button compact>
22
+ <Icon icon="material-symbols:app-badging" width="18" height="18" />
23
+ </Button>
24
+ </Story>
25
+
26
+ <!-- Circualr Icon button. -->
27
+ <Story name="Icon Button Circular" args={{ compact: true, roundness: 'full' }}>
24
28
  <Button roundness="full" compact>
25
29
  <Icon icon="material-symbols:app-badging" width="18" height="18" />
26
30
  </Button>
@@ -8,10 +8,7 @@
8
8
  const { Story } = defineMeta({
9
9
  component: Button,
10
10
  tags: ['autodocs'],
11
- // @ts-ignore
12
- argTypes: {
13
- ...storyButtonArgTypes,
14
- },
11
+ argTypes: storyButtonArgTypes,
15
12
  args: {
16
13
  onclick: fn(),
17
14
  },
@@ -40,6 +37,7 @@
40
37
  <Button roundness={false}>Click me!</Button>
41
38
  </Story>
42
39
 
40
+ <!-- Button with 50% roundness usefull for icon (Compact) buttons -->
43
41
  <Story
44
42
  name="RoundnessFull"
45
43
  args={{ outline: false, disabled: false, compact: false, roundness: 'full' }}
@@ -8,10 +8,7 @@
8
8
  const { Story } = defineMeta({
9
9
  component: Button,
10
10
  tags: ['autodocs'],
11
- // @ts-ignore
12
- argTypes: {
13
- ...storyButtonArgTypes,
14
- },
11
+ argTypes: storyButtonArgTypes,
15
12
  args: {
16
13
  onclick: fn(),
17
14
  },
@@ -8,10 +8,7 @@
8
8
  const { Story } = defineMeta({
9
9
  component: Button,
10
10
  tags: ['autodocs'],
11
- // @ts-ignore
12
- argTypes: {
13
- ...storyButtonArgTypes,
14
- },
11
+ argTypes: storyButtonArgTypes,
15
12
  args: {
16
13
  onclick: fn(),
17
14
  },
@@ -0,0 +1,70 @@
1
+ /// Mixin: generate-dodo-ui-button-colors
2
+ /// Generates CSS custom properties for Dodo UI button 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-button-colors($color-name) {
6
+ --dodo-ui-button-outline-#{$color-name}: var(--dodo-color-#{$color-name}-400);
7
+
8
+ --dodo-ui-button-text-#{$color-name}-bg: var(--dodo-color-#{$color-name}-100);
9
+ --dodo-ui-button-text-#{$color-name}-hover-bg: var(--dodo-color-#{$color-name}-200);
10
+ --dodo-ui-button-text-#{$color-name}-active-bg: var(--dodo-color-#{$color-name}-300);
11
+
12
+ --dodo-ui-button-solid-#{$color-name}-bg: var(--dodo-color-#{$color-name}-500);
13
+ --dodo-ui-button-solid-#{$color-name}-hover-bg: var(--dodo-color-#{$color-name}-600);
14
+ --dodo-ui-button-solid-#{$color-name}-active-bg: var(--dodo-color-#{$color-name}-700);
15
+ }
16
+
17
+ /// Mixin: generate-dodo-ui-button-colors
18
+ /// Generates CSS custom properties for Dodo UI button styles (text & solid)
19
+ /// across different interaction states (default, hover, active).
20
+ /// @param {String} $color-name - The theme color name (e.g., "primary", "safe", etc.)
21
+ @mixin generate-dodo-ui-button-colors-dark($color-name) {
22
+ --dodo-ui-button-outline-#{$color-name}: var(--dodo-color-#{$color-name}-300);
23
+
24
+ --dodo-ui-button-text-#{$color-name}-bg: var(--dodo-color-#{$color-name}-50);
25
+ --dodo-ui-button-text-#{$color-name}-hover-bg: var(--dodo-color-#{$color-name}-100);
26
+ --dodo-ui-button-text-#{$color-name}-active-bg: var(--dodo-color-#{$color-name}-200);
27
+
28
+ --dodo-ui-button-solid-#{$color-name}-bg: var(--dodo-color-#{$color-name}-300);
29
+ --dodo-ui-button-solid-#{$color-name}-hover-bg: var(--dodo-color-#{$color-name}-200);
30
+ --dodo-ui-button-solid-#{$color-name}-active-bg: var(--dodo-color-#{$color-name}-100);
31
+ }
32
+
33
+ /// Mixin: generate-dodo-ui-button-color
34
+ /// Auto-generates .color--[theme] > .variant--text & .variant--solid styles
35
+ /// @param {String} $theme - e.g., default, safe, danger, etc.
36
+ @mixin generate-dodo-ui-button-color($theme) {
37
+ &--#{$theme} {
38
+ &.variant {
39
+ &--text {
40
+ color: var(--dodo-color-#{$theme}-800);
41
+ background-color: var(--dodo-ui-button-text-#{$theme}-bg);
42
+
43
+ &:hover {
44
+ background-color: var(--dodo-ui-button-text-#{$theme}-hover-bg);
45
+ }
46
+
47
+ &:active {
48
+ background-color: var(--dodo-ui-button-text-#{$theme}-active-bg);
49
+ }
50
+
51
+ &.outline {
52
+ border-color: var(--dodo-ui-button-outline-#{$theme});
53
+ }
54
+ }
55
+
56
+ &--solid {
57
+ color: var(--dodo-color-constant-white);
58
+ background-color: var(--dodo-ui-button-solid-#{$theme}-bg);
59
+
60
+ &:hover {
61
+ background-color: var(--dodo-ui-button-solid-#{$theme}-hover-bg);
62
+ }
63
+
64
+ &:active {
65
+ background-color: var(--dodo-ui-button-solid-#{$theme}-active-bg);
66
+ }
67
+ }
68
+ }
69
+ }
70
+ }
@@ -0,0 +1,182 @@
1
+ type ControlType =
2
+ | 'object'
3
+ | 'boolean'
4
+ | 'check'
5
+ | 'inline-check'
6
+ | 'radio'
7
+ | 'inline-radio'
8
+ | 'select'
9
+ | 'multi-select'
10
+ | 'number'
11
+ | 'range'
12
+ | 'file'
13
+ | 'color'
14
+ | 'date'
15
+ | 'text';
16
+
17
+ interface ControlBase {
18
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
19
+ [key: string]: any;
20
+ /** @see https://storybook.js.org/docs/api/arg-types#controltype */
21
+ type?: ControlType;
22
+ disable?: boolean;
23
+ }
24
+
25
+ type Control =
26
+ | ControlType
27
+ | false
28
+ | (ControlBase &
29
+ (
30
+ | ControlBase
31
+ | {
32
+ type: 'color';
33
+ /** @see https://storybook.js.org/docs/api/arg-types#controlpresetcolors */
34
+ presetColors?: string[];
35
+ }
36
+ | {
37
+ type: 'file';
38
+ /** @see https://storybook.js.org/docs/api/arg-types#controlaccept */
39
+ accept?: string;
40
+ }
41
+ | {
42
+ type: 'inline-check' | 'radio' | 'inline-radio' | 'select' | 'multi-select';
43
+ /** @see https://storybook.js.org/docs/api/arg-types#controllabels */
44
+ labels?: {
45
+ [options: string]: string;
46
+ };
47
+ }
48
+ | {
49
+ type: 'number' | 'range';
50
+ /** @see https://storybook.js.org/docs/api/arg-types#controlmax */
51
+ max?: number;
52
+ /** @see https://storybook.js.org/docs/api/arg-types#controlmin */
53
+ min?: number;
54
+ /** @see https://storybook.js.org/docs/api/arg-types#controlstep */
55
+ step?: number;
56
+ }
57
+ ));
58
+
59
+ type ConditionalTest =
60
+ | {
61
+ truthy?: boolean;
62
+ }
63
+ | {
64
+ exists: boolean;
65
+ }
66
+ | {
67
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
68
+ eq: any;
69
+ }
70
+ | {
71
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
72
+ neq: any;
73
+ };
74
+ type ConditionalValue =
75
+ | {
76
+ arg: string;
77
+ }
78
+ | {
79
+ global: string;
80
+ };
81
+ type Conditional = ConditionalValue & ConditionalTest;
82
+
83
+ interface Args {
84
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
85
+ [name: string]: any;
86
+ }
87
+
88
+ interface SBBaseType {
89
+ required?: boolean;
90
+ raw?: string;
91
+ }
92
+ type SBScalarType = SBBaseType & {
93
+ name: 'boolean' | 'string' | 'number' | 'function' | 'symbol';
94
+ };
95
+ type SBArrayType = SBBaseType & {
96
+ name: 'array';
97
+ value: SBType;
98
+ };
99
+ type SBObjectType = SBBaseType & {
100
+ name: 'object';
101
+ value: Record<string, SBType>;
102
+ };
103
+ type SBEnumType = SBBaseType & {
104
+ name: 'enum';
105
+ value: (string | number)[];
106
+ };
107
+ type SBIntersectionType = SBBaseType & {
108
+ name: 'intersection';
109
+ value: SBType[];
110
+ };
111
+ type SBUnionType = SBBaseType & {
112
+ name: 'union';
113
+ value: SBType[];
114
+ };
115
+ type SBOtherType = SBBaseType & {
116
+ name: 'other';
117
+ value: string;
118
+ };
119
+
120
+ type SBType =
121
+ | SBScalarType
122
+ | SBEnumType
123
+ | SBArrayType
124
+ | SBObjectType
125
+ | SBIntersectionType
126
+ | SBUnionType
127
+ | SBOtherType;
128
+
129
+ interface InputType {
130
+ /** @see https://storybook.js.org/docs/api/arg-types#control */
131
+ control?: Control;
132
+ /** @see https://storybook.js.org/docs/api/arg-types#description */
133
+ description?: string;
134
+ /** @see https://storybook.js.org/docs/api/arg-types#if */
135
+ if?: Conditional;
136
+ /** @see https://storybook.js.org/docs/api/arg-types#mapping */
137
+ mapping?: {
138
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
139
+ [key: string]: any;
140
+ };
141
+ /** @see https://storybook.js.org/docs/api/arg-types#name */
142
+ name?: string;
143
+ /** @see https://storybook.js.org/docs/api/arg-types#options */
144
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
145
+ options?: readonly any[];
146
+ /** @see https://storybook.js.org/docs/api/arg-types#table */
147
+ table?: {
148
+ [key: string]: unknown;
149
+ /** @see https://storybook.js.org/docs/api/arg-types#tablecategory */
150
+ category?: string;
151
+ /** @see https://storybook.js.org/docs/api/arg-types#tabledefaultvalue */
152
+ defaultValue?: {
153
+ summary?: string;
154
+ detail?: string;
155
+ };
156
+ /** @see https://storybook.js.org/docs/api/arg-types#tabledisable */
157
+ disable?: boolean;
158
+ /** @see https://storybook.js.org/docs/api/arg-types#tablesubcategory */
159
+ subcategory?: string;
160
+ /** @see https://storybook.js.org/docs/api/arg-types#tabletype */
161
+ type?: {
162
+ summary?: string;
163
+ detail?: string;
164
+ };
165
+ };
166
+ /** @see https://storybook.js.org/docs/api/arg-types#type */
167
+ type?: SBType | SBScalarType['name'];
168
+ /**
169
+ * @deprecated Use `table.defaultValue.summary` instead.
170
+ * @see https://storybook.js.org/docs/api/arg-types#defaultvalue
171
+ */
172
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
173
+ defaultValue?: any;
174
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
175
+ [key: string]: any;
176
+ }
177
+
178
+ export type ArgTypes<TArgs = Args> = {
179
+ [name in keyof TArgs]: InputType;
180
+ };
181
+
182
+ export type StoryBookArgTypes = Partial<ArgTypes<Args>>;
@@ -3,6 +3,10 @@
3
3
  --dodo-color-black: var(--dodo-color-base-black);
4
4
  --dodo-color-white: var(--dodo-color-base-white);
5
5
 
6
+ /* Base colors constants */
7
+ --dodo-color-constant-black: var(--dodo-color-base-black);
8
+ --dodo-color-constant-white: var(--dodo-color-base-white);
9
+
6
10
  /* Default color */
7
11
  --dodo-color-default-50: var(--dodo-color-base-slate-50);
8
12
  --dodo-color-default-100: var(--dodo-color-base-slate-100);
@@ -81,3 +85,87 @@
81
85
  --dodo-color-info-900: var(--dodo-color-base-cyan-900);
82
86
  --dodo-color-info-950: var(--dodo-color-base-cyan-950);
83
87
  }
88
+
89
+ .dodo-theme--dark {
90
+ /* Dark: Base colors */
91
+ --dodo-color-black: var(--dodo-color-base-white);
92
+ --dodo-color-white: var(--dodo-color-base-black);
93
+
94
+ /* Dark: Default color */
95
+ --dodo-color-default-50: var(--dodo-color-base-slate-950);
96
+ --dodo-color-default-100: var(--dodo-color-base-slate-900);
97
+ --dodo-color-default-200: var(--dodo-color-base-slate-800);
98
+ --dodo-color-default-300: var(--dodo-color-base-slate-700);
99
+ --dodo-color-default-400: var(--dodo-color-base-slate-600);
100
+ --dodo-color-default-500: var(--dodo-color-base-slate-500);
101
+ --dodo-color-default-600: var(--dodo-color-base-slate-400);
102
+ --dodo-color-default-700: var(--dodo-color-base-slate-300);
103
+ --dodo-color-default-800: var(--dodo-color-base-slate-200);
104
+ --dodo-color-default-900: var(--dodo-color-base-slate-100);
105
+ --dodo-color-default-950: var(--dodo-color-base-slate-50);
106
+
107
+ /* Dark: Primary color */
108
+ --dodo-color-primary-50: var(--dodo-color-base-violet-950);
109
+ --dodo-color-primary-100: var(--dodo-color-base-violet-900);
110
+ --dodo-color-primary-200: var(--dodo-color-base-violet-800);
111
+ --dodo-color-primary-300: var(--dodo-color-base-violet-700);
112
+ --dodo-color-primary-400: var(--dodo-color-base-violet-600);
113
+ --dodo-color-primary-500: var(--dodo-color-base-violet-500);
114
+ --dodo-color-primary-600: var(--dodo-color-base-violet-400);
115
+ --dodo-color-primary-700: var(--dodo-color-base-violet-300);
116
+ --dodo-color-primary-800: var(--dodo-color-base-violet-200);
117
+ --dodo-color-primary-900: var(--dodo-color-base-violet-100);
118
+ --dodo-color-primary-950: var(--dodo-color-base-violet-50);
119
+
120
+ /* Dark: Safe color */
121
+ --dodo-color-safe-50: var(--dodo-color-base-emerald-950);
122
+ --dodo-color-safe-100: var(--dodo-color-base-emerald-900);
123
+ --dodo-color-safe-200: var(--dodo-color-base-emerald-800);
124
+ --dodo-color-safe-300: var(--dodo-color-base-emerald-700);
125
+ --dodo-color-safe-400: var(--dodo-color-base-emerald-600);
126
+ --dodo-color-safe-500: var(--dodo-color-base-emerald-500);
127
+ --dodo-color-safe-600: var(--dodo-color-base-emerald-400);
128
+ --dodo-color-safe-700: var(--dodo-color-base-emerald-300);
129
+ --dodo-color-safe-800: var(--dodo-color-base-emerald-200);
130
+ --dodo-color-safe-900: var(--dodo-color-base-emerald-100);
131
+ --dodo-color-safe-950: var(--dodo-color-base-emerald-50);
132
+
133
+ /* Dark: Warning color */
134
+ --dodo-color-warning-50: var(--dodo-color-base-amber-950);
135
+ --dodo-color-warning-100: var(--dodo-color-base-amber-900);
136
+ --dodo-color-warning-200: var(--dodo-color-base-amber-800);
137
+ --dodo-color-warning-300: var(--dodo-color-base-amber-700);
138
+ --dodo-color-warning-400: var(--dodo-color-base-amber-600);
139
+ --dodo-color-warning-500: var(--dodo-color-base-amber-500);
140
+ --dodo-color-warning-600: var(--dodo-color-base-amber-400);
141
+ --dodo-color-warning-700: var(--dodo-color-base-amber-300);
142
+ --dodo-color-warning-800: var(--dodo-color-base-amber-200);
143
+ --dodo-color-warning-900: var(--dodo-color-base-amber-100);
144
+ --dodo-color-warning-950: var(--dodo-color-base-amber-50);
145
+
146
+ /* Dark: Danger color */
147
+ --dodo-color-danger-50: var(--dodo-color-base-red-950);
148
+ --dodo-color-danger-100: var(--dodo-color-base-red-900);
149
+ --dodo-color-danger-200: var(--dodo-color-base-red-800);
150
+ --dodo-color-danger-300: var(--dodo-color-base-red-700);
151
+ --dodo-color-danger-400: var(--dodo-color-base-red-600);
152
+ --dodo-color-danger-500: var(--dodo-color-base-red-500);
153
+ --dodo-color-danger-600: var(--dodo-color-base-red-400);
154
+ --dodo-color-danger-700: var(--dodo-color-base-red-300);
155
+ --dodo-color-danger-800: var(--dodo-color-base-red-200);
156
+ --dodo-color-danger-900: var(--dodo-color-base-red-100);
157
+ --dodo-color-danger-950: var(--dodo-color-base-red-50);
158
+
159
+ /* Dark: Info color */
160
+ --dodo-color-info-50: var(--dodo-color-base-cyan-950);
161
+ --dodo-color-info-100: var(--dodo-color-base-cyan-900);
162
+ --dodo-color-info-200: var(--dodo-color-base-cyan-800);
163
+ --dodo-color-info-300: var(--dodo-color-base-cyan-700);
164
+ --dodo-color-info-400: var(--dodo-color-base-cyan-600);
165
+ --dodo-color-info-500: var(--dodo-color-base-cyan-500);
166
+ --dodo-color-info-600: var(--dodo-color-base-cyan-400);
167
+ --dodo-color-info-700: var(--dodo-color-base-cyan-300);
168
+ --dodo-color-info-800: var(--dodo-color-base-cyan-200);
169
+ --dodo-color-info-900: var(--dodo-color-base-cyan-100);
170
+ --dodo-color-info-950: var(--dodo-color-base-cyan-50);
171
+ }
@@ -3,8 +3,8 @@
3
3
  --dodo-ui-element-height-small: 34px;
4
4
  --dodo-ui-element-height-large: 48px;
5
5
 
6
- --dodo-ui-element-roundness-unit: 7px;
7
- --dodo-ui-element-roundness-1: var(--dodo-ui-element-roundness-unit);
8
- --dodo-ui-element-roundness-2: calc(var(--dodo-ui-element-roundness-unit) * 2);
9
- --dodo-ui-element-roundness-3: calc(var(--dodo-ui-element-roundness-unit) * 4);
6
+ --dodo-ui-element-roundness-base: 7px;
7
+ --dodo-ui-element-roundness-1: var(--dodo-ui-element-roundness-base);
8
+ --dodo-ui-element-roundness-2: calc(var(--dodo-ui-element-roundness-base) * 2);
9
+ --dodo-ui-element-roundness-3: calc(var(--dodo-ui-element-roundness-base) * 4);
10
10
  }
package/src/lib/types.ts CHANGED
@@ -1,3 +1,5 @@
1
+ /** Component Size */
1
2
  export type ComponentSize = 'normal' | 'small' | 'large';
2
3
 
3
- export type ComponentRoundness = false | 1 | 2 | 3 | 'full';
4
+ export type ComponentRoundness = 1 | 2 | 3;
5
+ export type ComponentRoundnessFull = 'full';