@impulse-ui-native/theme 8.0.0 → 8.2.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 +47 -0
- package/dist/hooks/index.d.mts +6 -3
- package/dist/hooks/use-colors.hook.d.mts +6 -1
- package/dist/hooks/use-components-tokens.hook.d.mts +6 -1
- package/dist/hooks/use-theme.hook.d.mts +6 -1
- package/dist/hooks/use-themed-styles.d.mts +5 -1
- package/dist/index.d.mts +9 -3
- package/dist/providers/index.d.mts +6 -1
- package/dist/providers/theme.provider.d.mts +6 -1
- package/dist/theme/chart-color-tokens.d.mts +5 -0
- package/dist/theme/chart-color-tokens.js +21 -0
- package/dist/theme/chart-color-tokens.js.map +1 -0
- package/dist/theme/create-accordion-tokens.d.mts +6 -1
- package/dist/theme/create-avatar-tokens.d.mts +6 -1
- package/dist/theme/create-badge-tokens.d.mts +6 -1
- package/dist/theme/create-button-tokens.d.mts +6 -1
- package/dist/theme/create-card-tokens.d.mts +6 -1
- package/dist/theme/create-carousel-tokens.d.mts +6 -1
- package/dist/theme/create-charts-tokens.d.mts +42 -0
- package/dist/theme/create-charts-tokens.js +25 -0
- package/dist/theme/create-charts-tokens.js.map +1 -0
- package/dist/theme/create-checkbox-tokens.d.mts +6 -1
- package/dist/theme/create-control-tokens.d.mts +6 -1
- package/dist/theme/create-data-state-tokens.d.mts +6 -1
- package/dist/theme/create-datetime-picker.d.mts +6 -1
- package/dist/theme/create-divider-tokens.d.mts +6 -1
- package/dist/theme/create-flyout-tokens.d.mts +6 -1
- package/dist/theme/create-flyout-tokens.js +2 -0
- package/dist/theme/create-flyout-tokens.js.map +1 -1
- package/dist/theme/create-icon-button-tokens.d.mts +6 -1
- package/dist/theme/create-list-tokens.d.mts +6 -1
- package/dist/theme/create-modal-tokens.d.mts +6 -1
- package/dist/theme/create-modal-tokens.js +2 -0
- package/dist/theme/create-modal-tokens.js.map +1 -1
- package/dist/theme/create-pagination-tokens.d.mts +6 -1
- package/dist/theme/create-popover-tokens.d.mts +6 -1
- package/dist/theme/create-progress-tokens.d.mts +6 -1
- package/dist/theme/create-radio-tokens.d.mts +6 -1
- package/dist/theme/create-segmented-control-tokens.d.mts +6 -1
- package/dist/theme/create-select-tokens.d.mts +6 -1
- package/dist/theme/create-skeleton-tokens.d.mts +6 -1
- package/dist/theme/create-slider-tokens.d.mts +6 -1
- package/dist/theme/create-slider-tokens.js +3 -0
- package/dist/theme/create-slider-tokens.js.map +1 -1
- package/dist/theme/create-spinner-tokens.d.mts +6 -1
- package/dist/theme/create-stepper-tokens.d.mts +6 -1
- package/dist/theme/create-switch-tokens.d.mts +6 -1
- package/dist/theme/create-tabs-tokens.d.mts +42 -0
- package/dist/theme/create-tabs-tokens.js +57 -0
- package/dist/theme/create-tabs-tokens.js.map +1 -0
- package/dist/theme/create-tag-tokens.d.mts +6 -1
- package/dist/theme/create-textarea-tokens.d.mts +6 -1
- package/dist/theme/create-time-picker-tokens.d.mts +6 -1
- package/dist/theme/create-toast-tokens.d.mts +6 -1
- package/dist/theme/create-toast-tokens.js +4 -0
- package/dist/theme/create-toast-tokens.js.map +1 -1
- package/dist/theme/dark.theme.d.mts +6 -1
- package/dist/theme/dark.theme.js +4 -0
- package/dist/theme/dark.theme.js.map +1 -1
- package/dist/theme/index.d.mts +10 -3
- package/dist/theme/index.js +2 -0
- package/dist/theme/index.js.map +1 -1
- package/dist/theme/light.theme.d.mts +6 -1
- package/dist/theme/light.theme.js +4 -0
- package/dist/theme/light.theme.js.map +1 -1
- package/dist/theme/tokens.theme.d.mts +10 -4
- package/dist/theme/tokens.theme.js +7 -17
- package/dist/theme/tokens.theme.js.map +1 -1
- package/dist/{theme-provider.types-CPFMVXUS.d.mts → theme-provider.types-CLjz9-IY.d.mts} +12 -1
- package/dist/types/charts-tokens.types.d.mts +31 -0
- package/dist/types/charts-tokens.types.js +1 -0
- package/dist/types/charts-tokens.types.js.map +1 -0
- package/dist/types/flyout-tokens.types.d.mts +6 -0
- package/dist/types/index.d.mts +4 -2
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/modal-tokens.types.d.mts +2 -0
- package/dist/types/shadow.types.d.mts +2 -1
- package/dist/types/slider-tokens.types.d.mts +3 -0
- package/dist/types/tabs-tokens.types.d.mts +30 -0
- package/dist/types/tabs-tokens.types.js +1 -0
- package/dist/types/tabs-tokens.types.js.map +1 -0
- package/dist/types/theme-provider.types.d.mts +6 -1
- package/dist/types/toast-tokens.types.d.mts +7 -2
- package/dist/utils/index.d.mts +5 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/style.utils.d.mts +6 -3
- package/dist/utils/style.utils.js +2 -2
- package/dist/utils/style.utils.js.map +1 -1
- package/dist/utils/tabs-state.utils.d.mts +6 -0
- package/dist/utils/tabs-state.utils.js +12 -0
- package/dist/utils/tabs-state.utils.js.map +1 -0
- package/package.json +4 -4
|
@@ -1,12 +1,18 @@
|
|
|
1
|
-
export { e as ToastTokens, f as ToastTone } from '../theme-provider.types-
|
|
1
|
+
export { e as ToastTokens, f as ToastTone } from '../theme-provider.types-CLjz9-IY.mjs';
|
|
2
|
+
import './tokens.types.mjs';
|
|
2
3
|
import './badge-tokens.types.mjs';
|
|
3
4
|
import './components.types.mjs';
|
|
4
5
|
import './carousel-tokens.types.mjs';
|
|
6
|
+
import './charts-tokens.types.mjs';
|
|
7
|
+
import './chart.types.mjs';
|
|
5
8
|
import './checkbox-tokens.types.mjs';
|
|
6
9
|
import './list-tokens.types.mjs';
|
|
7
10
|
import './modal-tokens.types.mjs';
|
|
8
11
|
import './popover-tokens.types.mjs';
|
|
9
12
|
import './radio-tokens.types.mjs';
|
|
13
|
+
import './shadow.types.mjs';
|
|
14
|
+
import 'react-native';
|
|
15
|
+
import './tabs-tokens.types.mjs';
|
|
10
16
|
import './accordion-tokens.types.mjs';
|
|
11
17
|
import './avatar-tokens.types.mjs';
|
|
12
18
|
import './buttons-tokens.types.mjs';
|
|
@@ -30,4 +36,3 @@ import './switch-tokens.types.mjs';
|
|
|
30
36
|
import './tag-tokens.types.mjs';
|
|
31
37
|
import './textarea-tokens.types.mjs';
|
|
32
38
|
import './time-picker-token.types.mjs';
|
|
33
|
-
import './tokens.types.mjs';
|
package/dist/utils/index.d.mts
CHANGED
|
@@ -11,6 +11,7 @@ export { getSelectionStateTokens } from './selection-state.utils.mjs';
|
|
|
11
11
|
export { getSegmentedControlItemTokens } from './segmented-control-state.utils.mjs';
|
|
12
12
|
export { getSliderTrackTokens } from './slider-tokens.utils.mjs';
|
|
13
13
|
export { createStyleKey, extractStyleProps, getShadowStyle } from './style.utils.mjs';
|
|
14
|
+
export { getTabsItemTokens } from './tabs-state.utils.mjs';
|
|
14
15
|
import '../types/components.types.mjs';
|
|
15
16
|
import '../types/datetime-picker-tokens.types.mjs';
|
|
16
17
|
import '../types/divider-tokens.types.mjs';
|
|
@@ -28,14 +29,17 @@ import '../types/flex.types.mjs';
|
|
|
28
29
|
import '../types/spacing.types.mjs';
|
|
29
30
|
import '../types/typography.types.mjs';
|
|
30
31
|
import '../types/tokens.types.mjs';
|
|
31
|
-
import '../theme-provider.types-
|
|
32
|
+
import '../theme-provider.types-CLjz9-IY.mjs';
|
|
32
33
|
import '../types/badge-tokens.types.mjs';
|
|
33
34
|
import '../types/carousel-tokens.types.mjs';
|
|
35
|
+
import '../types/charts-tokens.types.mjs';
|
|
36
|
+
import '../types/chart.types.mjs';
|
|
34
37
|
import '../types/checkbox-tokens.types.mjs';
|
|
35
38
|
import '../types/list-tokens.types.mjs';
|
|
36
39
|
import '../types/modal-tokens.types.mjs';
|
|
37
40
|
import '../types/popover-tokens.types.mjs';
|
|
38
41
|
import '../types/radio-tokens.types.mjs';
|
|
42
|
+
import '../types/tabs-tokens.types.mjs';
|
|
39
43
|
import '../types/accordion-tokens.types.mjs';
|
|
40
44
|
import '../types/avatar-tokens.types.mjs';
|
|
41
45
|
import '../types/buttons-tokens.types.mjs';
|
package/dist/utils/index.js
CHANGED
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/index.ts"],"sourcesContent":["export * from \"./action-state.utils\";\nexport * from \"./availability-state.utils\";\nexport * from \"./control-state.utils\";\nexport * from \"./datetime-picker-state.utils\";\nexport * from \"./divider-tokens.utils\";\nexport * from \"./field-state.utils\";\nexport * from \"./flyout-tokens.utils\";\nexport * from \"./pagination-state.utils\";\nexport * from \"./selection-item-state.utils\";\nexport * from \"./selection-state.utils\";\nexport * from \"./segmented-control-state.utils\";\nexport * from \"./slider-tokens.utils\";\nexport * from \"./style.utils\";\n"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/index.ts"],"sourcesContent":["export * from \"./action-state.utils\";\nexport * from \"./availability-state.utils\";\nexport * from \"./control-state.utils\";\nexport * from \"./datetime-picker-state.utils\";\nexport * from \"./divider-tokens.utils\";\nexport * from \"./field-state.utils\";\nexport * from \"./flyout-tokens.utils\";\nexport * from \"./pagination-state.utils\";\nexport * from \"./selection-item-state.utils\";\nexport * from \"./selection-state.utils\";\nexport * from \"./segmented-control-state.utils\";\nexport * from \"./slider-tokens.utils\";\nexport * from \"./style.utils\";\nexport * from \"./tabs-state.utils\";\n"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ViewStyle } from 'react-native';
|
|
2
|
-
import { ShadowLevel, ShadowPosition } from '../types/shadow.types.mjs';
|
|
2
|
+
import { ShadowLevel, ShadowPosition, ShadowScaleTokens } from '../types/shadow.types.mjs';
|
|
3
3
|
import { StyleProps } from '../types/style.types.mjs';
|
|
4
|
-
import { T as ThemeColors } from '../theme-provider.types-
|
|
4
|
+
import { T as ThemeColors } from '../theme-provider.types-CLjz9-IY.mjs';
|
|
5
5
|
import '../types/border.types.mjs';
|
|
6
6
|
import '../types/color.types.mjs';
|
|
7
7
|
import '../types/dimension.types.mjs';
|
|
@@ -12,11 +12,14 @@ import '../types/tokens.types.mjs';
|
|
|
12
12
|
import '../types/badge-tokens.types.mjs';
|
|
13
13
|
import '../types/components.types.mjs';
|
|
14
14
|
import '../types/carousel-tokens.types.mjs';
|
|
15
|
+
import '../types/charts-tokens.types.mjs';
|
|
16
|
+
import '../types/chart.types.mjs';
|
|
15
17
|
import '../types/checkbox-tokens.types.mjs';
|
|
16
18
|
import '../types/list-tokens.types.mjs';
|
|
17
19
|
import '../types/modal-tokens.types.mjs';
|
|
18
20
|
import '../types/popover-tokens.types.mjs';
|
|
19
21
|
import '../types/radio-tokens.types.mjs';
|
|
22
|
+
import '../types/tabs-tokens.types.mjs';
|
|
20
23
|
import '../types/accordion-tokens.types.mjs';
|
|
21
24
|
import '../types/avatar-tokens.types.mjs';
|
|
22
25
|
import '../types/buttons-tokens.types.mjs';
|
|
@@ -43,6 +46,6 @@ import '../types/time-picker-token.types.mjs';
|
|
|
43
46
|
|
|
44
47
|
declare const extractStyleProps: <Props extends object>(props: Props) => StyleProps;
|
|
45
48
|
declare const createStyleKey: <Props extends object>(props: Props) => string;
|
|
46
|
-
declare const getShadowStyle: (level: ShadowLevel | undefined, position: ShadowPosition | undefined, colors: ThemeColors) => ViewStyle;
|
|
49
|
+
declare const getShadowStyle: (level: ShadowLevel | undefined, position: ShadowPosition | undefined, colors: ThemeColors, shadows?: ShadowScaleTokens) => ViewStyle;
|
|
47
50
|
|
|
48
51
|
export { createStyleKey, extractStyleProps, getShadowStyle };
|
|
@@ -19,8 +19,8 @@ const createStyleKey = (props) => {
|
|
|
19
19
|
}
|
|
20
20
|
return key;
|
|
21
21
|
};
|
|
22
|
-
const getShadowStyle = (level = "none", position = "bottom", colors) => {
|
|
23
|
-
const token =
|
|
22
|
+
const getShadowStyle = (level = "none", position = "bottom", colors, shadows = ShadowScale) => {
|
|
23
|
+
const token = shadows[level];
|
|
24
24
|
if (level === "none") {
|
|
25
25
|
return {};
|
|
26
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/style.utils.ts"],"sourcesContent":["import { Platform, ViewStyle } from \"react-native\";\n\nimport { ShadowScale, StylePropsSet } from \"../constants\";\nimport {\n ShadowLevel,\n ShadowPosition,\n StylePropKey,\n StyleProps,\n ThemeColors,\n} from \"../types\";\n\nconst isStylePropKey = (k: string): k is StylePropKey =>\n StylePropsSet.has(k as StylePropKey);\n\nexport const extractStyleProps = <Props extends object>(\n props: Props,\n): StyleProps => {\n const style: StyleProps = {};\n\n for (const k in props) {\n if (isStylePropKey(k) && props[k] !== undefined) {\n style[k] = props[k] as any;\n }\n }\n\n return style;\n};\n\nexport const createStyleKey = <Props extends object>(props: Props) => {\n let key = \"\";\n\n for (const k in props) {\n if (isStylePropKey(k)) {\n key += String(props[k as keyof Props]);\n }\n }\n\n return key;\n};\n\nexport const getShadowStyle = (\n level: ShadowLevel = \"none\",\n position: ShadowPosition = \"bottom\",\n colors: ThemeColors,\n): ViewStyle => {\n const token =
|
|
1
|
+
{"version":3,"sources":["../../src/utils/style.utils.ts"],"sourcesContent":["import { Platform, ViewStyle } from \"react-native\";\n\nimport { ShadowScale, StylePropsSet } from \"../constants\";\nimport {\n ShadowLevel,\n ShadowPosition,\n ShadowScaleTokens,\n StylePropKey,\n StyleProps,\n ThemeColors,\n} from \"../types\";\n\nconst isStylePropKey = (k: string): k is StylePropKey =>\n StylePropsSet.has(k as StylePropKey);\n\nexport const extractStyleProps = <Props extends object>(\n props: Props,\n): StyleProps => {\n const style: StyleProps = {};\n\n for (const k in props) {\n if (isStylePropKey(k) && props[k] !== undefined) {\n style[k] = props[k] as any;\n }\n }\n\n return style;\n};\n\nexport const createStyleKey = <Props extends object>(props: Props) => {\n let key = \"\";\n\n for (const k in props) {\n if (isStylePropKey(k)) {\n key += String(props[k as keyof Props]);\n }\n }\n\n return key;\n};\n\nexport const getShadowStyle = (\n level: ShadowLevel = \"none\",\n position: ShadowPosition = \"bottom\",\n colors: ThemeColors,\n shadows: ShadowScaleTokens = ShadowScale,\n): ViewStyle => {\n const token = shadows[level];\n\n if (level === \"none\") {\n return {};\n }\n\n if (Platform.OS === \"android\") {\n return {\n elevation: token.elevation,\n };\n }\n\n let offsetY = 0;\n\n if (position === \"bottom\") {\n offsetY = token.radius / 2;\n }\n\n if (position === \"top\") {\n offsetY = -token.radius / 2;\n }\n\n if (position === \"around\") {\n offsetY = 0;\n }\n\n return {\n shadowColor: colors.black,\n shadowOpacity: token.opacity,\n shadowRadius: token.radius,\n shadowOffset: {\n width: 0,\n height: offsetY,\n },\n };\n};\n"],"mappings":"AAAA,SAAS,gBAA2B;AAEpC,SAAS,aAAa,qBAAqB;AAU3C,MAAM,iBAAiB,CAAC,MACtB,cAAc,IAAI,CAAiB;AAE9B,MAAM,oBAAoB,CAC/B,UACe;AACf,QAAM,QAAoB,CAAC;AAE3B,aAAW,KAAK,OAAO;AACrB,QAAI,eAAe,CAAC,KAAK,MAAM,CAAC,MAAM,QAAW;AAC/C,YAAM,CAAC,IAAI,MAAM,CAAC;AAAA,IACpB;AAAA,EACF;AAEA,SAAO;AACT;AAEO,MAAM,iBAAiB,CAAuB,UAAiB;AACpE,MAAI,MAAM;AAEV,aAAW,KAAK,OAAO;AACrB,QAAI,eAAe,CAAC,GAAG;AACrB,aAAO,OAAO,MAAM,CAAgB,CAAC;AAAA,IACvC;AAAA,EACF;AAEA,SAAO;AACT;AAEO,MAAM,iBAAiB,CAC5B,QAAqB,QACrB,WAA2B,UAC3B,QACA,UAA6B,gBACf;AACd,QAAM,QAAQ,QAAQ,KAAK;AAE3B,MAAI,UAAU,QAAQ;AACpB,WAAO,CAAC;AAAA,EACV;AAEA,MAAI,SAAS,OAAO,WAAW;AAC7B,WAAO;AAAA,MACL,WAAW,MAAM;AAAA,IACnB;AAAA,EACF;AAEA,MAAI,UAAU;AAEd,MAAI,aAAa,UAAU;AACzB,cAAU,MAAM,SAAS;AAAA,EAC3B;AAEA,MAAI,aAAa,OAAO;AACtB,cAAU,CAAC,MAAM,SAAS;AAAA,EAC5B;AAEA,MAAI,aAAa,UAAU;AACzB,cAAU;AAAA,EACZ;AAEA,SAAO;AAAA,IACL,aAAa,OAAO;AAAA,IACpB,eAAe,MAAM;AAAA,IACrB,cAAc,MAAM;AAAA,IACpB,cAAc;AAAA,MACZ,OAAO;AAAA,MACP,QAAQ;AAAA,IACV;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { TabsTokens, TabsItemTokenState, ResolvedTabsItemTokens } from '../types/tabs-tokens.types.mjs';
|
|
2
|
+
import '../types/components.types.mjs';
|
|
3
|
+
|
|
4
|
+
declare function getTabsItemTokens(tokens: TabsTokens, state: TabsItemTokenState): ResolvedTabsItemTokens;
|
|
5
|
+
|
|
6
|
+
export { getTabsItemTokens };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { getSelectionStateTokens } from "./selection-state.utils";
|
|
2
|
+
function getTabsItemTokens(tokens, state) {
|
|
3
|
+
return {
|
|
4
|
+
...tokens.sizes[state.size],
|
|
5
|
+
...getSelectionStateTokens(tokens.states, state),
|
|
6
|
+
indicatorHeight: tokens.indicatorHeight
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export {
|
|
10
|
+
getTabsItemTokens
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=tabs-state.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/tabs-state.utils.ts"],"sourcesContent":["import type {\n ResolvedTabsItemTokens,\n TabsItemTokenState,\n TabsTokens,\n} from \"../types\";\nimport { getSelectionStateTokens } from \"./selection-state.utils\";\n\nexport function getTabsItemTokens(\n tokens: TabsTokens,\n state: TabsItemTokenState,\n): ResolvedTabsItemTokens {\n return {\n ...tokens.sizes[state.size],\n ...getSelectionStateTokens(tokens.states, state),\n indicatorHeight: tokens.indicatorHeight,\n };\n}\n"],"mappings":"AAKA,SAAS,+BAA+B;AAEjC,SAAS,kBACd,QACA,OACwB;AACxB,SAAO;AAAA,IACL,GAAG,OAAO,MAAM,MAAM,IAAI;AAAA,IAC1B,GAAG,wBAAwB,OAAO,QAAQ,KAAK;AAAA,IAC/C,iBAAiB,OAAO;AAAA,EAC1B;AACF;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@impulse-ui-native/theme",
|
|
3
|
-
"version": "8.
|
|
3
|
+
"version": "8.2.0",
|
|
4
4
|
"description": "Theme tokens, providers, and styling utilities for ImpulseUI Native.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"react-native",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
],
|
|
29
29
|
"sideEffects": false,
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@impulse-ui-native/core": "8.
|
|
31
|
+
"@impulse-ui-native/core": "8.2.0"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
34
|
"@types/react": "~19.2.14",
|
|
@@ -37,9 +37,9 @@
|
|
|
37
37
|
"react": "19.2.3",
|
|
38
38
|
"react-native": "0.86.2",
|
|
39
39
|
"typescript": "~6.0.3",
|
|
40
|
-
"@impulse-ui-native/
|
|
40
|
+
"@impulse-ui-native/eslint-config": "1.0.0",
|
|
41
41
|
"@impulse-ui-native/tsconfig": "1.0.0",
|
|
42
|
-
"@impulse-ui-native/
|
|
42
|
+
"@impulse-ui-native/prettier-config": "1.0.0"
|
|
43
43
|
},
|
|
44
44
|
"peerDependencies": {
|
|
45
45
|
"react": ">=18",
|