@peassoft/mnr-web-ui-kit 0.1.1 → 1.0.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.
- package/README.md +6 -0
- package/dist/button/styles.css +15 -5
- package/dist/button-radio-group/styles.css +22 -6
- package/dist/error-message/styles.css +5 -0
- package/dist/input-field/styles.css +39 -1
- package/dist/plain-select/styles.css +16 -2
- package/dist/select/index.d.ts +35 -0
- package/dist/select/index.js +67 -0
- package/dist/select/process-key-down.d.ts +2 -0
- package/dist/select/process-key-down.js +14 -0
- package/dist/select/styles.css +68 -0
- package/dist/text-button/styles.css +8 -2
- package/package.json +18 -41
package/README.md
CHANGED
|
@@ -1 +1,7 @@
|
|
|
1
1
|
# Memorize'n'Revise Web UI Kit
|
|
2
|
+
|
|
3
|
+
## Light/Dark Color Schemes
|
|
4
|
+
|
|
5
|
+
The Kit supports the `prefers-color-scheme` media query.
|
|
6
|
+
|
|
7
|
+
To check appearance of a component in any scheme, while running the Storybook, use Chrome DevTools to emulate a color scheme (`Rendering` tab).
|
package/dist/button/styles.css
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
.uikit_Button_btn {
|
|
2
|
+
--uikit-color-main: #3f72af;
|
|
3
|
+
--uikit-color-secondary: #dbe2ef;
|
|
4
|
+
|
|
2
5
|
display: block;
|
|
3
6
|
appearance: none;
|
|
4
7
|
border: 0;
|
|
5
|
-
color:
|
|
6
|
-
background-color:
|
|
8
|
+
color: var(--uikit-color-secondary);
|
|
9
|
+
background-color: var(--uikit-color-main);
|
|
10
|
+
border: 1px solid var(--uikit-color-main);
|
|
7
11
|
border-radius: 5px;
|
|
8
12
|
font-family: inherit;
|
|
9
13
|
font-size: 1em;
|
|
@@ -15,9 +19,15 @@
|
|
|
15
19
|
}
|
|
16
20
|
|
|
17
21
|
.uikit_Button_btn--secondary {
|
|
18
|
-
color:
|
|
19
|
-
background-color:
|
|
20
|
-
border: 1px solid
|
|
22
|
+
color: var(--uikit-color-main);
|
|
23
|
+
background-color: var(--uikit-color-secondary);
|
|
24
|
+
border: 1px solid var(--uikit-color-main);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
@media (prefers-color-scheme: dark) {
|
|
28
|
+
.uikit_Button_btn--secondary {
|
|
29
|
+
border-color: var(--uikit-color-secondary);
|
|
30
|
+
}
|
|
21
31
|
}
|
|
22
32
|
|
|
23
33
|
.uikit_Button_btn--stretched {
|
|
@@ -1,9 +1,18 @@
|
|
|
1
1
|
.uikit_ButtonRadioGroup_label {
|
|
2
2
|
margin: 0 0 0.5em;
|
|
3
|
-
color: #
|
|
3
|
+
color: #666;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
@media (prefers-color-scheme: dark) {
|
|
7
|
+
.uikit_ButtonRadioGroup_label {
|
|
8
|
+
color: #979797;
|
|
9
|
+
}
|
|
4
10
|
}
|
|
5
11
|
|
|
6
12
|
.uikit_ButtonRadioGroup_cont {
|
|
13
|
+
--uikit-color-main: #3f72af;
|
|
14
|
+
--uikit-color-secondary: #dbe2ef;
|
|
15
|
+
|
|
7
16
|
display: flex;
|
|
8
17
|
align-items: center;
|
|
9
18
|
}
|
|
@@ -11,10 +20,10 @@
|
|
|
11
20
|
.uikit_ButtonRadioGroup_btn {
|
|
12
21
|
display: block;
|
|
13
22
|
appearance: none;
|
|
14
|
-
border: 1px solid
|
|
23
|
+
border: 1px solid var(--uikit-color-main);
|
|
15
24
|
border-right: 0;
|
|
16
|
-
color:
|
|
17
|
-
background-color:
|
|
25
|
+
color: var(--uikit-color-main);
|
|
26
|
+
background-color: var(--uikit-color-secondary);
|
|
18
27
|
border-radius: 5px 0 0 5px;
|
|
19
28
|
font-family: inherit;
|
|
20
29
|
font-size: 1em;
|
|
@@ -26,12 +35,19 @@
|
|
|
26
35
|
}
|
|
27
36
|
|
|
28
37
|
.uikit_ButtonRadioGroup_btn--checked {
|
|
29
|
-
|
|
38
|
+
color: var(--uikit-color-secondary);
|
|
39
|
+
background-color: var(--uikit-color-main);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
@media (prefers-color-scheme: dark) {
|
|
43
|
+
.uikit_ButtonRadioGroup_btn--checked {
|
|
44
|
+
border-color: var(--uikit-color-main);
|
|
45
|
+
}
|
|
30
46
|
}
|
|
31
47
|
|
|
32
48
|
.uikit_ButtonRadioGroup_btn--last {
|
|
33
49
|
border-radius: 0 5px 5px 0;
|
|
34
|
-
border-right: 1px solid
|
|
50
|
+
border-right: 1px solid var(--uikit-color-main);
|
|
35
51
|
}
|
|
36
52
|
|
|
37
53
|
.uikit_ButtonRadioGroup_btn--mid {
|
|
@@ -11,10 +11,16 @@
|
|
|
11
11
|
.uikit_InputField_label {
|
|
12
12
|
display: block;
|
|
13
13
|
margin-bottom: 0.25em;
|
|
14
|
-
color: #
|
|
14
|
+
color: #757575;
|
|
15
15
|
width: 100%;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
+
@media (prefers-color-scheme: dark) {
|
|
19
|
+
.uikit_InputField_label {
|
|
20
|
+
color: #979797;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
18
24
|
.uikit_InputField_input {
|
|
19
25
|
display: block;
|
|
20
26
|
box-sizing: border-box;
|
|
@@ -28,11 +34,25 @@
|
|
|
28
34
|
font-family: inherit;
|
|
29
35
|
}
|
|
30
36
|
|
|
37
|
+
@media (prefers-color-scheme: dark) {
|
|
38
|
+
.uikit_InputField_input {
|
|
39
|
+
background-color: #f9f9f9;
|
|
40
|
+
border-color: #f9f9f9;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
31
44
|
.uikit_InputField_input:disabled {
|
|
32
45
|
color: #848484;
|
|
33
46
|
background-color: #efefef;
|
|
34
47
|
}
|
|
35
48
|
|
|
49
|
+
@media (prefers-color-scheme: dark) {
|
|
50
|
+
.uikit_InputField_input:disabled {
|
|
51
|
+
background-color: #dadada;
|
|
52
|
+
border-color: #dadada;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
36
56
|
.uikit_InputField_capslockMsg {
|
|
37
57
|
display: flex;
|
|
38
58
|
gap: .5em;
|
|
@@ -41,13 +61,31 @@
|
|
|
41
61
|
font-size: 0.85rem;
|
|
42
62
|
}
|
|
43
63
|
|
|
64
|
+
@media (prefers-color-scheme: dark) {
|
|
65
|
+
.uikit_InputField_capslockMsg {
|
|
66
|
+
color: #979797;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
44
70
|
.uikit_InputField_capslockIcon {
|
|
45
71
|
color: #a7241b;
|
|
46
72
|
fill: currentColor;
|
|
47
73
|
}
|
|
48
74
|
|
|
75
|
+
@media (prefers-color-scheme: dark) {
|
|
76
|
+
.uikit_InputField_capslockIcon {
|
|
77
|
+
color: #fb827a;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
49
81
|
.uikit_InputField_errorMsg {
|
|
50
82
|
color: #a7241b;
|
|
51
83
|
font-size: 0.85rem;
|
|
52
84
|
margin-top: 0.2em;
|
|
53
85
|
}
|
|
86
|
+
|
|
87
|
+
@media (prefers-color-scheme: dark) {
|
|
88
|
+
.uikit_InputField_errorMsg {
|
|
89
|
+
color: #fb827a;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
@@ -1,16 +1,30 @@
|
|
|
1
1
|
.uikit_PlainSelect_label {
|
|
2
2
|
margin: 0;
|
|
3
|
-
color: #
|
|
3
|
+
color: #757575;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
@media (prefers-color-scheme: dark) {
|
|
7
|
+
.uikit_PlainSelect_label {
|
|
8
|
+
color: #979797;
|
|
9
|
+
}
|
|
4
10
|
}
|
|
5
11
|
|
|
6
12
|
.uikit_PlainSelect_cont {
|
|
7
13
|
margin: 0.5em 0 0;
|
|
8
14
|
padding: 0.5em;
|
|
15
|
+
background-color: #fff;
|
|
9
16
|
border: 1px solid #bcbcbc;
|
|
10
17
|
list-style-type: none;
|
|
11
18
|
border-radius: 0.25em;
|
|
12
19
|
}
|
|
13
20
|
|
|
21
|
+
@media (prefers-color-scheme: dark) {
|
|
22
|
+
.uikit_PlainSelect_cont {
|
|
23
|
+
background-color: #f9f9f9;
|
|
24
|
+
border-color: #f9f9f9;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
14
28
|
.uikit_PlainSelect_itemCont {
|
|
15
29
|
display: flex;
|
|
16
30
|
align-items: flex-start;
|
|
@@ -36,6 +50,6 @@
|
|
|
36
50
|
|
|
37
51
|
.uikit_PlainSelect_description {
|
|
38
52
|
margin-top: 0.5em;
|
|
39
|
-
color: #
|
|
53
|
+
color: #757575;
|
|
40
54
|
font-size: 87.5%;
|
|
41
55
|
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type JSX } from 'react';
|
|
2
|
+
import './styles.css';
|
|
3
|
+
export type SelectItem = {
|
|
4
|
+
id: string;
|
|
5
|
+
value: string;
|
|
6
|
+
};
|
|
7
|
+
type Props = {
|
|
8
|
+
/** Label */
|
|
9
|
+
label: string;
|
|
10
|
+
/** Width in any CSS length value */
|
|
11
|
+
width?: string;
|
|
12
|
+
/** Error message */
|
|
13
|
+
errorMessage?: string;
|
|
14
|
+
/** Collection of items */
|
|
15
|
+
items: SelectItem[];
|
|
16
|
+
/** Controlled selected item ID */
|
|
17
|
+
selectedItemId: string | null;
|
|
18
|
+
/** Ref */
|
|
19
|
+
ref?: React.RefObject<HTMLSelectElement | null>;
|
|
20
|
+
/** onChange callback */
|
|
21
|
+
onChange: (id: string) => unknown;
|
|
22
|
+
/** Optional handler of Tab key press */
|
|
23
|
+
onTab?: () => unknown;
|
|
24
|
+
/** Optional handler of Shift + Tab key press */
|
|
25
|
+
onShiftTab?: () => unknown;
|
|
26
|
+
/** Optional handler of the input onBlur event */
|
|
27
|
+
onBlur?: () => unknown;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Select component.
|
|
31
|
+
*
|
|
32
|
+
* Can only be used in controlled mode.
|
|
33
|
+
*/
|
|
34
|
+
export declare function Select(props: Props): JSX.Element;
|
|
35
|
+
export {};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback } from 'react';
|
|
3
|
+
import './styles.css';
|
|
4
|
+
import processKeyDown from './process-key-down.js';
|
|
5
|
+
/**
|
|
6
|
+
* Select component.
|
|
7
|
+
*
|
|
8
|
+
* Can only be used in controlled mode.
|
|
9
|
+
*/
|
|
10
|
+
export function Select(props) {
|
|
11
|
+
const {
|
|
12
|
+
label,
|
|
13
|
+
width = '100%',
|
|
14
|
+
errorMessage,
|
|
15
|
+
items,
|
|
16
|
+
selectedItemId,
|
|
17
|
+
ref,
|
|
18
|
+
onChange,
|
|
19
|
+
onTab,
|
|
20
|
+
onShiftTab,
|
|
21
|
+
onBlur
|
|
22
|
+
} = props;
|
|
23
|
+
const handleChange = useCallback(e => {
|
|
24
|
+
onChange(e.target.value);
|
|
25
|
+
}, [onChange]);
|
|
26
|
+
const handleKeyDown = useCallback(e => processKeyDown(e, onTab, onShiftTab, onBlur), [onTab, onShiftTab, onBlur]);
|
|
27
|
+
return _jsxs("div", {
|
|
28
|
+
className: 'uikit_Select_cont',
|
|
29
|
+
style: {
|
|
30
|
+
width
|
|
31
|
+
},
|
|
32
|
+
children: [_jsxs("label", {
|
|
33
|
+
className: 'uikit_Select_innerCont',
|
|
34
|
+
children: [_jsx("span", {
|
|
35
|
+
className: 'uikit_Select_label',
|
|
36
|
+
children: label
|
|
37
|
+
}), _jsxs("div", {
|
|
38
|
+
className: 'uikit_Select_selectCont',
|
|
39
|
+
children: [_jsxs("select", {
|
|
40
|
+
ref: ref,
|
|
41
|
+
className: 'uikit_Select_input',
|
|
42
|
+
value: selectedItemId ?? undefined,
|
|
43
|
+
onChange: handleChange,
|
|
44
|
+
onKeyDown: handleKeyDown,
|
|
45
|
+
onBlur: onBlur || undefined,
|
|
46
|
+
children: [selectedItemId == null && _jsx("option", {}), items.map(item => _jsx("option", {
|
|
47
|
+
value: item.id,
|
|
48
|
+
children: item.value
|
|
49
|
+
}, item.id))]
|
|
50
|
+
}), _jsx("div", {
|
|
51
|
+
className: 'uikit_Select_arrowCont',
|
|
52
|
+
children: _jsx("svg", {
|
|
53
|
+
width: '24',
|
|
54
|
+
height: '24',
|
|
55
|
+
viewBox: '0 0 24 24',
|
|
56
|
+
children: _jsx("path", {
|
|
57
|
+
d: 'M7.406 8.578l4.594 4.594 4.594-4.594 1.406 1.406-6 6-6-6z'
|
|
58
|
+
})
|
|
59
|
+
})
|
|
60
|
+
})]
|
|
61
|
+
})]
|
|
62
|
+
}), !!errorMessage && _jsx("div", {
|
|
63
|
+
className: 'uikit_Select_errorMsg',
|
|
64
|
+
children: errorMessage
|
|
65
|
+
})]
|
|
66
|
+
});
|
|
67
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export const TAB_KEYCODE = 9;
|
|
2
|
+
export default function processKeyDown(e, onTab, onShiftTab, onBlur) {
|
|
3
|
+
if (e.which === TAB_KEYCODE && onTab && !e.shiftKey) {
|
|
4
|
+
e.preventDefault();
|
|
5
|
+
onTab();
|
|
6
|
+
if (onBlur) onBlur();
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
if (e.which === TAB_KEYCODE && onShiftTab && e.shiftKey) {
|
|
10
|
+
e.preventDefault();
|
|
11
|
+
onShiftTab();
|
|
12
|
+
if (onBlur) onBlur();
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
.uikit_Select_cont:not(:first-child) {
|
|
2
|
+
margin-top: 1.5em;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
.uikit_Select_innerCont {
|
|
6
|
+
display: block;
|
|
7
|
+
box-sizing: border-box;
|
|
8
|
+
width: 100%;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.uikit_Select_label {
|
|
12
|
+
display: block;
|
|
13
|
+
margin-bottom: 0.25em;
|
|
14
|
+
color: #757575;
|
|
15
|
+
width: 100%;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
@media (prefers-color-scheme: dark) {
|
|
19
|
+
.uikit_Select_label {
|
|
20
|
+
color: #979797;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.uikit_Select_selectCont {
|
|
25
|
+
position: relative;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.uikit_Select_input {
|
|
29
|
+
display: block;
|
|
30
|
+
box-sizing: border-box;
|
|
31
|
+
width: 100%;
|
|
32
|
+
border: 1px solid #bcbcbc;
|
|
33
|
+
border-radius: 5px;
|
|
34
|
+
font-size: 1.2em;
|
|
35
|
+
padding: 0.5em 2.5em 0.5em 1em;
|
|
36
|
+
color: #242629;
|
|
37
|
+
background-color: #fff;
|
|
38
|
+
font-family: inherit;
|
|
39
|
+
appearance: none;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
@media (prefers-color-scheme: dark) {
|
|
43
|
+
.uikit_Select_input {
|
|
44
|
+
background-color: #f9f9f9;
|
|
45
|
+
border-color: #f9f9f9;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.uikit_Select_arrowCont {
|
|
50
|
+
position: absolute;
|
|
51
|
+
top: 0;
|
|
52
|
+
right: 0.5em;
|
|
53
|
+
bottom: 0;
|
|
54
|
+
display: flex;
|
|
55
|
+
align-items: center;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.uikit_Select_errorMsg {
|
|
59
|
+
color: #a7241b;
|
|
60
|
+
font-size: 0.85rem;
|
|
61
|
+
margin-top: 0.2em;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
@media (prefers-color-scheme: dark) {
|
|
65
|
+
.uikit_Select_errorMsg {
|
|
66
|
+
color: #fb827a;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
display: inline;
|
|
3
3
|
appearance: none;
|
|
4
4
|
border: 0;
|
|
5
|
-
border-bottom: 1px solid
|
|
6
|
-
color: #
|
|
5
|
+
border-bottom: 1px solid currentColor;
|
|
6
|
+
color: #3f72af;
|
|
7
7
|
background-color: transparent;
|
|
8
8
|
font-family: inherit;
|
|
9
9
|
font-size: 1em;
|
|
@@ -12,3 +12,9 @@
|
|
|
12
12
|
cursor: pointer;
|
|
13
13
|
outline-offset: 3px;
|
|
14
14
|
}
|
|
15
|
+
|
|
16
|
+
@media (prefers-color-scheme: dark) {
|
|
17
|
+
.uikit_TextButton_btn {
|
|
18
|
+
color: #dbe2ef;
|
|
19
|
+
}
|
|
20
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@peassoft/mnr-web-ui-kit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "Peassoft web UI kit for MNR web applications",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
],
|
|
12
12
|
"scripts": {
|
|
13
13
|
"dev": "npm run storybook",
|
|
14
|
-
"test": "stylelint './src/**/*.css' && eslint ./ && npm run tsc &&
|
|
14
|
+
"test": "stylelint './src/**/*.css' && eslint ./ && npm run tsc && vitest run",
|
|
15
15
|
"tsc": "tsc --noEmit",
|
|
16
16
|
"build": "del-cli ./compiled && del-cli ./dist && tsc -p tsconfig-prod.json && babel ./compiled --out-dir ./dist && cpy './src/**/*.css' './dist' && cpy './compiled/**/*.d.ts' './dist'",
|
|
17
17
|
"storybook": "storybook dev -p 9001 --no-open",
|
|
@@ -20,56 +20,33 @@
|
|
|
20
20
|
"browserslist": [
|
|
21
21
|
"extends @memnrev/browserslist-config"
|
|
22
22
|
],
|
|
23
|
-
"jest": {
|
|
24
|
-
"verbose": false,
|
|
25
|
-
"coverageDirectory": "coverage",
|
|
26
|
-
"transform": {
|
|
27
|
-
"^.+\\.(ts|js)$": [
|
|
28
|
-
"<rootDir>/node_modules/ts-jest",
|
|
29
|
-
{
|
|
30
|
-
"useESM": true
|
|
31
|
-
}
|
|
32
|
-
]
|
|
33
|
-
},
|
|
34
|
-
"transformIgnorePatterns": [
|
|
35
|
-
"[/\\\\]node_modules[/\\\\].+\\.(js|jsx|mjs)$"
|
|
36
|
-
],
|
|
37
|
-
"extensionsToTreatAsEsm": [
|
|
38
|
-
".ts"
|
|
39
|
-
],
|
|
40
|
-
"moduleNameMapper": {
|
|
41
|
-
"^(\\.{1,2}/.*)\\.js$": "$1"
|
|
42
|
-
}
|
|
43
|
-
},
|
|
44
23
|
"devDependencies": {
|
|
45
24
|
"@babel/cli": "^7.22.15",
|
|
46
25
|
"@babel/core": "^7.22.17",
|
|
47
26
|
"@babel/preset-env": "^7.22.15",
|
|
48
|
-
"@memnrev/browserslist-config": "^0.
|
|
49
|
-
"@memnrev/eslint-v9-config": "^0.
|
|
50
|
-
"@storybook/addon-
|
|
51
|
-
"@storybook/addon-
|
|
52
|
-
"@storybook/addon-links": "^
|
|
53
|
-
"@storybook/addon-onboarding": "^
|
|
54
|
-
"@storybook/addon-
|
|
55
|
-
"@storybook/
|
|
56
|
-
"@
|
|
57
|
-
"@storybook/react-webpack5": "^8.0.5",
|
|
58
|
-
"@storybook/test": "^8.0.5",
|
|
59
|
-
"@types/jest": "^29.5.4",
|
|
27
|
+
"@memnrev/browserslist-config": "^0.2.0",
|
|
28
|
+
"@memnrev/eslint-v9-config": "^0.2.2",
|
|
29
|
+
"@storybook/addon-a11y": "^9.1.8",
|
|
30
|
+
"@storybook/addon-docs": "^9.1.8",
|
|
31
|
+
"@storybook/addon-links": "^9.1.8",
|
|
32
|
+
"@storybook/addon-onboarding": "^9.1.8",
|
|
33
|
+
"@storybook/addon-vitest": "^9.1.9",
|
|
34
|
+
"@storybook/react-vite": "^9.1.8",
|
|
35
|
+
"@types/node": "^22.18.8",
|
|
60
36
|
"@types/react": "^19.0.2",
|
|
37
|
+
"@vitest/browser": "3.2.4",
|
|
38
|
+
"@vitest/coverage-v8": "3.2.4",
|
|
61
39
|
"cpy-cli": "^5.0.0",
|
|
62
40
|
"del-cli": "^6.0.0",
|
|
63
41
|
"eslint": "^9.8.0",
|
|
64
|
-
"eslint-plugin-storybook": "^
|
|
65
|
-
"
|
|
42
|
+
"eslint-plugin-storybook": "^9.1.8",
|
|
43
|
+
"playwright": "^1.55.1",
|
|
66
44
|
"react": "^19.0.0",
|
|
67
45
|
"react-dom": "^19.0.0",
|
|
68
|
-
"storybook": "^
|
|
46
|
+
"storybook": "^9.1.8",
|
|
69
47
|
"stylelint": "^16.2.1",
|
|
70
|
-
"
|
|
71
|
-
"
|
|
72
|
-
"typescript": "^5.2.2"
|
|
48
|
+
"typescript": "^5.2.2",
|
|
49
|
+
"vitest": "^3.2.4"
|
|
73
50
|
},
|
|
74
51
|
"peerDependencies": {
|
|
75
52
|
"react": ">= 19 < 20",
|