agroptima-design-system 0.6.0 → 0.7.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.
@@ -25,3 +25,6 @@ jobs:
25
25
 
26
26
  - name: Lint
27
27
  run: npm run lint
28
+
29
+ - name: Types
30
+ run: npm run types
@@ -0,0 +1,27 @@
1
+ name: Run tests
2
+
3
+ on:
4
+ pull_request:
5
+ types:
6
+ - opened
7
+ - reopened
8
+ - synchronize
9
+
10
+ jobs:
11
+ build:
12
+ runs-on: ubuntu-latest
13
+
14
+ steps:
15
+ - uses: actions/checkout@v4
16
+
17
+ - name: Setup Node
18
+ uses: actions/setup-node@v3
19
+ with:
20
+ node-version: 18.x
21
+ cache: 'npm'
22
+
23
+ - name: Install dependencies
24
+ run: npm install
25
+
26
+ - name: Test
27
+ run: npm run test
package/app/.gitkeep ADDED
File without changes
package/jest.config.ts ADDED
@@ -0,0 +1,17 @@
1
+ import type { Config } from 'jest'
2
+ import nextJest from 'next/jest.js'
3
+
4
+ const createJestConfig = nextJest({
5
+ dir: './',
6
+ })
7
+
8
+ const config: Config = {
9
+ testEnvironment: 'jsdom',
10
+ clearMocks: true,
11
+ moduleNameMapper: {
12
+ '^.+\\.(svg)$': '<rootDir>/tests/svg.mock.js',
13
+ },
14
+ setupFilesAfterEnv: ['<rootDir>/jest.setup.ts'],
15
+ }
16
+
17
+ export default createJestConfig(config)
package/jest.setup.ts ADDED
@@ -0,0 +1 @@
1
+ import '@testing-library/jest-dom'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agroptima-design-system",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "scripts": {
5
5
  "dev": "npm run storybook",
6
6
  "storybook": "storybook dev -p 6006 --ci",
@@ -8,7 +8,9 @@
8
8
  "build-storybook": "storybook build",
9
9
  "lint": "eslint",
10
10
  "lint:fix": "eslint src --fix",
11
- "chromatic": "npx chromatic --exit-zero-on-changes"
11
+ "types": "tsc --noEmit",
12
+ "chromatic": "npx chromatic --exit-zero-on-changes",
13
+ "test": "jest"
12
14
  },
13
15
  "dependencies": {
14
16
  "@storybook/addon-designs": "^7.0.5",
@@ -28,6 +30,10 @@
28
30
  "@storybook/react": "^7.5.0",
29
31
  "@storybook/testing-library": "^0.2.2",
30
32
  "@svgr/webpack": "^8.1.0",
33
+ "@testing-library/jest-dom": "^6.4.2",
34
+ "@testing-library/react": "^14.2.2",
35
+ "@types/jest": "^29.5.12",
36
+ "@types/jest-axe": "^3.5.9",
31
37
  "@types/node": "^20.9.4",
32
38
  "@types/react": "^18.2.38",
33
39
  "@types/react-dom": "^18.2.17",
@@ -36,7 +42,11 @@
36
42
  "eslint-config-prettier": "^9.0.0",
37
43
  "eslint-plugin-prettier": "^5.0.1",
38
44
  "eslint-plugin-storybook": "^0.6.15",
45
+ "jest": "^29.7.0",
46
+ "jest-axe": "^8.0.0",
47
+ "jest-environment-jsdom": "^29.7.0",
39
48
  "storybook": "^7.6.6",
49
+ "ts-node": "^10.9.2",
40
50
  "typescript": "^5"
41
51
  },
42
52
  "description": "Agroptima design system",
@@ -1,183 +1,284 @@
1
1
  @use '../settings/color_alias';
2
- @use '../settings/typography';
2
+ @use '../settings/typography/content' as typography;
3
3
  @use '../settings/config';
4
4
 
5
- .button {
6
- &.primary,
7
- &.primary-outlined,
8
- &.primary-ghost {
9
- --color-bg: #{color_alias.$primary-color-600};
10
- --color-bg-hover: #{color_alias.$primary-color-1000};
11
- --color-bg-hover-outlined: #{color_alias.$primary-color-50};
12
- --color-fg: #{color_alias.$neutral-white};
13
- --color-fg-reversed: #{color_alias.$primary-color-600};
14
- }
15
- &.error,
16
- &.error-outlined,
17
- &.error-ghost {
18
- --color-bg: #{color_alias.$error-color-600};
19
- --color-bg-hover: #{color_alias.$error-color-900};
20
- --color-bg-hover-outlined: #{color_alias.$error-color-50};
21
- --color-fg: #{color_alias.$neutral-white};
22
- --color-fg-reversed: #{color_alias.$error-color-600};
23
- }
24
- &.success,
25
- &.success-outlined,
26
- &.success-ghost {
27
- --color-bg: #{color_alias.$success-color-1000};
28
- --color-bg-hover: #{color_alias.$success-color-700};
29
- --color-bg-hover-outlined: #{color_alias.$success-color-50};
30
- --color-fg: #{color_alias.$neutral-color-900};
31
- --color-fg-reversed: #{color_alias.$success-color-1000};
32
- }
33
- &.warning,
34
- &.warning-outlined,
35
- &.warning-ghost {
36
- --color-bg: #{color_alias.$warning-color-1000};
37
- --color-bg-hover: #{color_alias.$warning-color-700};
38
- --color-bg-hover-outlined: #{color_alias.$warning-color-50};
39
- --color-fg: #{color_alias.$neutral-color-900};
40
- --color-fg-reversed: #{color_alias.$warning-color-1000};
41
- }
42
- &.info,
43
- &.info-outlined,
44
- &.info-ghost {
45
- --color-bg: #{color_alias.$info-color-600};
46
- --color-bg-hover: #{color_alias.$info-color-900};
47
- --color-bg-hover-outlined: #{color_alias.$info-color-50};
48
- --color-fg: #{color_alias.$neutral-white};
49
- --color-fg-reversed: #{color_alias.$info-color-600};
50
- }
51
- &.neutral,
52
- &.neutral-outlined,
53
- &.neutral-ghost {
54
- --color-bg: #{color_alias.$neutral-color-100};
55
- --color-bg-hover: #{color_alias.$neutral-color-300};
56
- --color-bg-hover-outlined: #{color_alias.$neutral-color-50};
57
- --color-fg: #{color_alias.$neutral-color-1000};
58
- --color-fg-reversed: #{color_alias.$neutral-color-1000};
59
- --color-fg-disabled: #{color_alias.$neutral-color-50};
5
+ @mixin button-style($main-color, $secondary-color, $hover-color) {
6
+ background: $main-color;
7
+ color: $secondary-color;
8
+
9
+ > .icon {
10
+ > svg {
11
+ fill: $secondary-color;
12
+ path {
13
+ fill: $secondary-color;
14
+ }
15
+ }
60
16
  }
61
17
 
62
- text-decoration: none;
18
+ &:not(:disabled):hover,
19
+ &:not(:disabled):active {
20
+ background: $hover-color;
21
+ }
22
+ }
63
23
 
24
+ .button {
64
25
  display: inline-flex;
65
- height: fit-content;
66
- background: var(--color-bg);
67
- border: 1px solid transparent;
68
- padding: config.$space-2x config.$space-3x;
69
- // padding: var(--space-2-x, .5em) var(--space-3-x, .75em);
70
26
  justify-content: center;
71
27
  align-items: center;
72
- gap: config.$space-1x;
73
28
  flex-shrink: 0;
29
+ gap: config.$space-1x;
30
+ height: fit-content;
31
+ padding: config.$space-2x config.$space-3x;
74
32
  border-radius: config.$corner-radius-m;
75
- font: typography.$font-primary;
76
- color: var(--color-fg);
77
- > span {
33
+ text-decoration: none;
34
+ border: 1px solid transparent;
35
+
36
+ > .icon {
78
37
  width: config.$icon-size-3x;
79
38
  height: config.$icon-size-3x;
80
39
  > svg {
81
40
  width: 100%;
82
41
  height: 100%;
83
- fill: var(--color-fg);
84
- path {
85
- fill: var(--color-fg);
42
+ }
43
+ }
44
+
45
+ @include typography.body-medium;
46
+
47
+ &.primary {
48
+ @include button-style(
49
+ color_alias.$primary-color-600,
50
+ color_alias.$neutral-white,
51
+ color_alias.$primary-color-1000
52
+ );
53
+ }
54
+
55
+ &.primary-outlined {
56
+ @include button-style(
57
+ color_alias.$neutral-white,
58
+ color_alias.$primary-color-600,
59
+ color_alias.$primary-color-50
60
+ );
61
+ border: 1px solid color_alias.$primary-color-600;
62
+ }
63
+
64
+ &.primary-ghost {
65
+ @include button-style(
66
+ transparent,
67
+ color_alias.$primary-color-600,
68
+ transparent
69
+ );
70
+ &:not(:disabled):hover,
71
+ &:not(:disabled):active {
72
+ border: 1px solid color_alias.$primary-color-600;
73
+ }
74
+ }
75
+
76
+ &.error {
77
+ @include button-style(
78
+ color_alias.$error-color-600,
79
+ color_alias.$neutral-white,
80
+ color_alias.$error-color-900
81
+ );
82
+ }
83
+
84
+ &.error-outlined {
85
+ @include button-style(
86
+ color_alias.$neutral-white,
87
+ color_alias.$error-color-600,
88
+ color_alias.$error-color-50
89
+ );
90
+ border: 1px solid color_alias.$error-color-600;
91
+ }
92
+
93
+ &.error-ghost {
94
+ @include button-style(
95
+ transparent,
96
+ color_alias.$error-color-600,
97
+ transparent
98
+ );
99
+ &:not(:disabled):hover,
100
+ &:not(:disabled):active {
101
+ border: 1px solid color_alias.$error-color-600;
102
+ }
103
+ }
104
+
105
+ &.success {
106
+ @include button-style(
107
+ color_alias.$success-color-1000,
108
+ color_alias.$neutral-color-900,
109
+ color_alias.$success-color-700
110
+ );
111
+ &:not(:disabled):hover,
112
+ &:not(:disabled):active {
113
+ color: color_alias.$neutral-white;
114
+ > .icon {
115
+ > svg {
116
+ fill: color_alias.$neutral-white;
117
+ path {
118
+ fill: color_alias.$neutral-white;
119
+ }
120
+ }
86
121
  }
87
122
  }
88
123
  }
89
124
 
90
- &:not(:disabled):hover,
91
- &:not(:disabled):active {
92
- background: var(--color-bg-hover);
125
+ &.success-outlined {
126
+ @include button-style(
127
+ color_alias.$neutral-white,
128
+ color_alias.$neutral-color-900,
129
+ color_alias.$success-color-50
130
+ );
131
+ border: 1px solid color_alias.$success-color-1000;
132
+ }
133
+
134
+ &.success-ghost {
135
+ @include button-style(
136
+ transparent,
137
+ color_alias.$success-color-1000,
138
+ transparent
139
+ );
140
+ &:not(:disabled):hover,
141
+ &:not(:disabled):active {
142
+ border: 1px solid color_alias.$success-color-1000;
143
+ }
144
+ }
93
145
 
94
- &.success,
95
- &.warning {
146
+ &.warning {
147
+ @include button-style(
148
+ color_alias.$warning-color-1000,
149
+ color_alias.$neutral-color-900,
150
+ color_alias.$warning-color-700
151
+ );
152
+ &:not(:disabled):hover,
153
+ &:not(:disabled):active {
96
154
  color: color_alias.$neutral-white;
97
- svg,
98
- svg path {
99
- fill: color_alias.$neutral-white;
155
+ > .icon {
156
+ > svg {
157
+ fill: color_alias.$neutral-white;
158
+ path {
159
+ fill: color_alias.$neutral-white;
160
+ }
161
+ }
100
162
  }
101
163
  }
102
164
  }
103
165
 
104
- &:disabled {
105
- background: color_alias.$neutral-color-50;
106
- color: color_alias.$neutral-color-400;
107
- svg,
108
- svg path {
109
- fill: color_alias.$neutral-color-400;
166
+ &.warning-outlined {
167
+ @include button-style(
168
+ color_alias.$neutral-white,
169
+ color_alias.$neutral-color-900,
170
+ color_alias.$warning-color-50
171
+ );
172
+ border: 1px solid color_alias.$warning-color-1000;
173
+ }
174
+
175
+ &.warning-ghost {
176
+ @include button-style(
177
+ transparent,
178
+ color_alias.$warning-color-1000,
179
+ transparent
180
+ );
181
+ &:not(:disabled):hover,
182
+ &:not(:disabled):active {
183
+ border: 1px solid color_alias.$warning-color-1000;
110
184
  }
111
185
  }
112
186
 
113
- &.primary-outlined,
114
- &.error-outlined,
115
- &.info-outlined,
187
+ &.info {
188
+ @include button-style(
189
+ color_alias.$info-color-600,
190
+ color_alias.$neutral-white,
191
+ color_alias.$info-color-900
192
+ );
193
+ }
194
+
195
+ &.info-outlined {
196
+ @include button-style(
197
+ color_alias.$neutral-white,
198
+ color_alias.$info-color-600,
199
+ color_alias.$info-color-50
200
+ );
201
+ border: 1px solid color_alias.$info-color-600;
202
+ }
203
+
204
+ &.info-ghost {
205
+ @include button-style(
206
+ transparent,
207
+ color_alias.$info-color-600,
208
+ transparent
209
+ );
210
+ &:not(:disabled):hover,
211
+ &:not(:disabled):active {
212
+ border: 1px solid color_alias.$info-color-600;
213
+ }
214
+ }
215
+
216
+ &.neutral {
217
+ @include button-style(
218
+ color_alias.$neutral-color-100,
219
+ color_alias.$neutral-color-1000,
220
+ color_alias.$neutral-color-300
221
+ );
222
+ }
223
+
116
224
  &.neutral-outlined {
117
- background: color_alias.$neutral-white;
118
- color: var(--color-bg);
119
- border: 1px solid var(--color-bg);
120
- svg,
121
- svg path {
122
- fill: var(--color-bg);
225
+ @include button-style(
226
+ color_alias.$neutral-white,
227
+ color_alias.$neutral-color-1000,
228
+ color_alias.$neutral-color-50
229
+ );
230
+ border: 1px solid color_alias.$neutral-color-100;
231
+ }
232
+
233
+ &.neutral-ghost {
234
+ @include button-style(
235
+ transparent,
236
+ color_alias.$neutral-color-1000,
237
+ transparent
238
+ );
239
+ &:not(:disabled):hover,
240
+ &:not(:disabled):active {
241
+ border: 1px solid color_alias.$neutral-color-100;
123
242
  }
124
243
  }
125
244
 
126
- &.success-outlined,
127
- &.warning-outlined {
128
- background: color_alias.$neutral-white;
129
- color: var(--color-fg);
130
- border: 1px solid var(--color-bg);
131
- svg,
132
- svg path {
133
- fill: var(--color-fg);
245
+ &:disabled {
246
+ color: color_alias.$neutral-color-400;
247
+ > .icon {
248
+ > svg {
249
+ fill: color_alias.$neutral-color-400;
250
+ path {
251
+ fill: color_alias.$neutral-color-400;
252
+ }
253
+ }
134
254
  }
135
255
  }
136
256
 
257
+ &.primary,
258
+ &.error,
259
+ &.success,
260
+ &.warning,
261
+ &.info,
262
+ &.neutral,
137
263
  &.primary-outlined,
138
264
  &.error-outlined,
139
265
  &.success-outlined,
140
266
  &.warning-outlined,
141
267
  &.info-outlined,
142
268
  &.neutral-outlined {
143
- &:not(:disabled):hover,
144
- &:not(:disabled):active {
145
- background: var(--color-bg-hover-outlined);
146
- }
147
269
  &:disabled {
148
270
  background: color_alias.$neutral-color-50;
149
- border: none;
150
- color: color_alias.$neutral-color-400;
151
- svg,
152
- svg path {
153
- fill: color_alias.$neutral-color-400;
154
- }
155
271
  }
156
272
  }
157
273
 
158
- &.primary-ghost,
159
- &.error-ghost,
160
- &.success-ghost,
161
- &.warning-ghost,
162
- &.info-ghost,
163
- &.neutral-ghost {
164
- background: transparent;
165
- color: var(--color-fg-reversed);
166
- svg,
167
- svg path {
168
- fill: var(--color-fg-reversed);
169
- }
170
- &:not(:disabled):hover,
171
- &:not(:disabled):active {
172
- background: transparent;
173
- border: 1px solid var(--color-bg);
174
- }
274
+ &.primary-outlined,
275
+ &.error-outlined,
276
+ &.success-outlined,
277
+ &.warning-outlined,
278
+ &.info-outlined,
279
+ &.neutral-outlined {
175
280
  &:disabled {
176
- color: color_alias.$neutral-color-400;
177
- svg,
178
- svg path {
179
- fill: color_alias.$neutral-color-400;
180
- }
281
+ border: 1px solid transparent;
181
282
  }
182
283
  }
183
284
  }
@@ -1,5 +1,5 @@
1
1
  @use '../settings/color_alias';
2
- @use '../settings/typography';
2
+ @use '../settings/typography/cards_table' as typography;
3
3
  @use '../settings/config';
4
4
 
5
5
  .cards-table-list {
@@ -1,5 +1,5 @@
1
1
  @use '../settings/color_alias';
2
- @use '../settings/typography';
2
+ @use '../settings/typography/form' as typography;
3
3
  @use '../settings/config';
4
4
 
5
5
  .checkbox-group {
@@ -1,5 +1,5 @@
1
1
  @use '../settings/color_alias';
2
- @use '../settings/typography';
2
+ @use '../settings/typography/content' as typography;
3
3
  @use '../settings/config';
4
4
  @use '../settings/depth';
5
5
 
@@ -30,7 +30,8 @@
30
30
  }
31
31
 
32
32
  > p {
33
- @include typography.empty-state-text;
33
+ @include typography.body-regular-primary;
34
+ text-align: center;
34
35
  }
35
36
  }
36
37
  }
@@ -1,5 +1,4 @@
1
1
  @use '../settings/color_alias';
2
- @use '../settings/typography';
3
2
 
4
3
  .icon {
5
4
  display: inline-flex;
@@ -14,5 +14,9 @@ export const Icon: React.FC<IconProps> = ({ name, className, ...props }) => {
14
14
  className,
15
15
  name === 'Loading' ? 'rotate' : '',
16
16
  ].join(' ')
17
- return <span className={cssClasses}>{icons[name](props)}</span>
17
+ return (
18
+ <span role="img" title={name} className={cssClasses}>
19
+ {icons[name](props)}
20
+ </span>
21
+ )
18
22
  }
@@ -1,5 +1,4 @@
1
1
  @use '../settings/color_alias';
2
- @use '../settings/typography';
3
2
  @use '../settings/config';
4
3
 
5
4
  .icon-button {
@@ -1,5 +1,5 @@
1
1
  @use '../settings/color_alias';
2
- @use '../settings/typography';
2
+ @use '../settings/typography/form' as typography;
3
3
  @use '../settings/config';
4
4
 
5
5
  .input-group {
@@ -13,7 +13,7 @@
13
13
 
14
14
  &:has(.input.invalid) {
15
15
  & .input-help-text {
16
- color: color_alias.$error-color-1000;
16
+ @include typography.form-help-text-error;
17
17
  }
18
18
  }
19
19