@webpros/mui-theme 0.1.4 → 0.1.5
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 +13 -36
- package/dist/package.json +114 -0
- package/dist/src/components/inputs/Button/Button.theme.d.ts +2 -2
- package/dist/src/constants.d.ts +34 -0
- package/dist/src/constants.js +33 -0
- package/dist/src/docs/versions.d.ts +2 -0
- package/dist/src/docs/versions.js +9 -0
- package/dist/src/hooks/useThemeMode.js +6 -12
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +1 -0
- package/package.json +17 -11
package/README.md
CHANGED
|
@@ -1,48 +1,33 @@
|
|
|
1
|
-
#
|
|
1
|
+
# About
|
|
2
2
|
|
|
3
3
|
MUI theme based on MUI V6 and Material Design V3.
|
|
4
4
|
|
|
5
|
-
- [
|
|
6
|
-
- [
|
|
5
|
+
- [Repository - webpros-dashboard/webpros-mui-theme](https://github.com/webpros-dashboard/webpros-mui-theme)
|
|
6
|
+
- [Designs - Figma](https://www.figma.com/design/RPLeGa2LdhKElQQ0xIXtSh/WebPros-dashboard?node-id=55879-3580&p=f&t=ZtD7nKr7T1SgHTdl-0)
|
|
7
7
|
|
|
8
8
|
# Installation
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
Ensure your `package.json` includes `peerDependecies` of the current package.
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
yarn add @webpros/webpros-material-library
|
|
14
|
-
```
|
|
12
|
+
Install the package in your project with:
|
|
15
13
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
```json
|
|
19
|
-
{
|
|
20
|
-
"dependencies": {
|
|
21
|
-
// Other deps
|
|
22
|
-
"@material/material-color-utilities": "^0.3.0",
|
|
23
|
-
"@mui/material": "^6.4.0",
|
|
24
|
-
"@mui/utils": "^6.4.0",
|
|
25
|
-
"@mui/x-data-grid": "^7.29.0",
|
|
26
|
-
"@mui/x-date-pickers": "^7.29.0",
|
|
27
|
-
"@phosphor-icons/react": "^2.1.0"
|
|
28
|
-
// Other deps
|
|
29
|
-
}
|
|
30
|
-
}
|
|
14
|
+
```bash
|
|
15
|
+
yarn add @webpros/mui-theme
|
|
31
16
|
```
|
|
32
17
|
|
|
33
18
|
# Usage
|
|
34
19
|
|
|
35
|
-
1. Add the type import at the top of your main application file or theme setup file. This import is required for MUI TypeScript augmentation to work correctly
|
|
20
|
+
1. **Add the type import at the top of your main application file or theme setup file. This import is required for MUI TypeScript augmentation to work correctly:**
|
|
36
21
|
|
|
37
22
|
```typescript
|
|
38
23
|
// global.d.ts
|
|
39
|
-
import type _ from '@webpros/
|
|
24
|
+
import type _ from '@webpros/@webpros/mui-theme';
|
|
40
25
|
```
|
|
41
26
|
|
|
42
|
-
2. Create new wrapper-component for the theme provider
|
|
27
|
+
2. **Create new wrapper-component for the theme provider**
|
|
43
28
|
|
|
44
29
|
```tsx
|
|
45
|
-
import { getMuiLocaleByCode, WebProsMuiThemeProvider } from '@webpros/
|
|
30
|
+
import { getMuiLocaleByCode, WebProsMuiThemeProvider } from '@webpros/mui-theme';
|
|
46
31
|
import { StyledEngineProvider } from '@mui/material/styles';
|
|
47
32
|
import { Localization } from '@mui/material/locale';
|
|
48
33
|
import { ReactNode, useMemo } from 'react';
|
|
@@ -78,7 +63,7 @@ export const WebprosThemeProvider = ({ children }: WebprosThemeProviderProps) =>
|
|
|
78
63
|
};
|
|
79
64
|
```
|
|
80
65
|
|
|
81
|
-
3. Wrap your application with `WebprosThemeProvider
|
|
66
|
+
3. **Wrap your application with `WebprosThemeProvider`**
|
|
82
67
|
|
|
83
68
|
```tsx
|
|
84
69
|
const App = () => (
|
|
@@ -91,13 +76,5 @@ const App = () => (
|
|
|
91
76
|
4. **Use imports from `@mui/material` for components**
|
|
92
77
|
|
|
93
78
|
```tsx
|
|
94
|
-
import { Box } from '@mui/material'; // NOT import { Box } from '@webpros/
|
|
79
|
+
import { Box } from '@mui/material'; // NOT import { Box } from '@webpros/mui-theme';
|
|
95
80
|
```
|
|
96
|
-
|
|
97
|
-
# Releases
|
|
98
|
-
|
|
99
|
-
The release cycle will be available soon
|
|
100
|
-
|
|
101
|
-
# Contributing
|
|
102
|
-
|
|
103
|
-
The contributing guide will be available soon
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@webpros/mui-theme",
|
|
3
|
+
"description": "MUI v6 theme for WebPros products",
|
|
4
|
+
"version": "0.1.5",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/webpros-dashboard/webpros-mui-theme.git"
|
|
9
|
+
},
|
|
10
|
+
"keywords": [
|
|
11
|
+
"react",
|
|
12
|
+
"mui",
|
|
13
|
+
"theme",
|
|
14
|
+
"theming",
|
|
15
|
+
"ui"
|
|
16
|
+
],
|
|
17
|
+
"main": "dist/index.js",
|
|
18
|
+
"types": "dist/index.d.ts",
|
|
19
|
+
"exports": {
|
|
20
|
+
".": {
|
|
21
|
+
"import": "./dist/src/index.js",
|
|
22
|
+
"types": "./dist/src/index.d.ts"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"type": "module",
|
|
26
|
+
"sideEffects": false,
|
|
27
|
+
"files": [
|
|
28
|
+
"dist"
|
|
29
|
+
],
|
|
30
|
+
"private": false,
|
|
31
|
+
"engines": {
|
|
32
|
+
"node": "^22.x",
|
|
33
|
+
"npm": "please-use-yarn",
|
|
34
|
+
"yarn": "^1.22.0"
|
|
35
|
+
},
|
|
36
|
+
"scripts": {
|
|
37
|
+
"build": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json",
|
|
38
|
+
"storybook:dev": "storybook dev -p 6006",
|
|
39
|
+
"storybook:build": "storybook build",
|
|
40
|
+
"test": "npm run prettier:test && npm run lint && npm run typecheck",
|
|
41
|
+
"lint": "npm run eslint",
|
|
42
|
+
"eslint": "eslint",
|
|
43
|
+
"prettier:test": "prettier --check \"**/*.{ts,tsx}\"",
|
|
44
|
+
"prettier:write": "prettier --write \"**/*.{ts,tsx}\"",
|
|
45
|
+
"typecheck": "tsc --noEmit"
|
|
46
|
+
},
|
|
47
|
+
"peerDependencies": {
|
|
48
|
+
"@emotion/react": "^11.14.0",
|
|
49
|
+
"@emotion/styled": "^11.14.1",
|
|
50
|
+
"@fontsource/roboto": "^5.2.6",
|
|
51
|
+
"@material/material-color-utilities": "^0.3.0",
|
|
52
|
+
"@mui/material": "^6.4.0",
|
|
53
|
+
"@mui/utils": "^6.4.0",
|
|
54
|
+
"@mui/x-data-grid": "^7.29.0",
|
|
55
|
+
"@mui/x-date-pickers": "^7.29.0",
|
|
56
|
+
"@phosphor-icons/react": "^2.1.0",
|
|
57
|
+
"usehooks-ts": "^3.1.1"
|
|
58
|
+
},
|
|
59
|
+
"publishConfig": {
|
|
60
|
+
"access": "public",
|
|
61
|
+
"registry": "https://registry.npmjs.org/"
|
|
62
|
+
},
|
|
63
|
+
"devDependencies": {
|
|
64
|
+
"@emotion/react": "^11.14.0",
|
|
65
|
+
"@emotion/styled": "^11.14.1",
|
|
66
|
+
"@eslint/js": "^9.38.0",
|
|
67
|
+
"@fontsource/roboto": "^5.2.6",
|
|
68
|
+
"@material/material-color-utilities": "^0.3.0",
|
|
69
|
+
"@mui/material": "^6.4.0",
|
|
70
|
+
"@mui/utils": "^6.4.0",
|
|
71
|
+
"@mui/x-data-grid": "^7.29.0",
|
|
72
|
+
"@mui/x-date-pickers": "^7.29.0",
|
|
73
|
+
"@phosphor-icons/react": "^2.1.0",
|
|
74
|
+
"@storybook/addon-a11y": "^9.1.16",
|
|
75
|
+
"@storybook/addon-docs": "^9.1.16",
|
|
76
|
+
"@storybook/addon-onboarding": "^9.1.16",
|
|
77
|
+
"@storybook/addon-themes": "^9.1.16",
|
|
78
|
+
"@storybook/builder-vite": "^9.1.16",
|
|
79
|
+
"@storybook/react-vite": "^9.1.16",
|
|
80
|
+
"@stylistic/eslint-plugin": "^5.5.0",
|
|
81
|
+
"@types/node": "^24.8.1",
|
|
82
|
+
"@types/react": "^19.2.2",
|
|
83
|
+
"@types/react-dom": "^19.2.2",
|
|
84
|
+
"@vitejs/plugin-react": "^5.0.4",
|
|
85
|
+
"eslint": "^9.38.0",
|
|
86
|
+
"eslint-config-prettier": "^10.1.8",
|
|
87
|
+
"eslint-plugin-prettier": "^5.5.4",
|
|
88
|
+
"eslint-plugin-react": "^7.37.5",
|
|
89
|
+
"eslint-plugin-react-hooks": "^7.0.0",
|
|
90
|
+
"eslint-plugin-storybook": "^9.1.16",
|
|
91
|
+
"globals": "^16.4.0",
|
|
92
|
+
"prettier": "^3.6.2",
|
|
93
|
+
"react": "^18.3.1",
|
|
94
|
+
"react-dom": "^18.3.1",
|
|
95
|
+
"storybook": "^9.1.16",
|
|
96
|
+
"tsc-alias": "^1.8.16",
|
|
97
|
+
"typescript": "~5.9.3",
|
|
98
|
+
"typescript-eslint": "^8.46.1",
|
|
99
|
+
"vite": "^7.1.10",
|
|
100
|
+
"vite-plugin-dts": "^4.5.4",
|
|
101
|
+
"usehooks-ts": "^3.1.1"
|
|
102
|
+
},
|
|
103
|
+
"browserslist": [
|
|
104
|
+
"last 2 versions",
|
|
105
|
+
">1%",
|
|
106
|
+
"not dead",
|
|
107
|
+
"not op_mini all"
|
|
108
|
+
],
|
|
109
|
+
"eslintConfig": {
|
|
110
|
+
"extends": [
|
|
111
|
+
"plugin:storybook/recommended"
|
|
112
|
+
]
|
|
113
|
+
}
|
|
114
|
+
}
|
|
@@ -16,8 +16,8 @@ declare module '@mui/material/Button' {
|
|
|
16
16
|
}
|
|
17
17
|
interface M3Button {
|
|
18
18
|
MuiButton: {
|
|
19
|
-
defaultProps?: ComponentsProps['
|
|
20
|
-
styleOverrides?: ComponentsOverrides<Theme>['
|
|
19
|
+
defaultProps?: ComponentsProps['MuiButtonBase'];
|
|
20
|
+
styleOverrides?: ComponentsOverrides<Theme>['MuiButtonBase'];
|
|
21
21
|
variants?: ComponentsVariants['MuiButton'];
|
|
22
22
|
};
|
|
23
23
|
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Theme } from '@mui/material';
|
|
2
|
+
export declare const underlineTypographySxProps: (theme: Theme, open?: boolean, color?: string | null) => {
|
|
3
|
+
textDecoration?: string | undefined;
|
|
4
|
+
textUnderlineOffset?: string | undefined;
|
|
5
|
+
textDecorationColor?: string | null | undefined;
|
|
6
|
+
textDecorationThickness?: number | undefined;
|
|
7
|
+
cursor: string;
|
|
8
|
+
'&:hover': {
|
|
9
|
+
textDecoration: string;
|
|
10
|
+
textUnderlineOffset: string;
|
|
11
|
+
textDecorationColor: string | null;
|
|
12
|
+
textDecorationThickness: number;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
export declare const underlineBorderSxProps: (theme: Theme, open?: boolean, color?: string | null) => {
|
|
16
|
+
'&::after'?: {
|
|
17
|
+
bottom: number;
|
|
18
|
+
position: string;
|
|
19
|
+
content: string;
|
|
20
|
+
borderBottom: number;
|
|
21
|
+
borderColor: string | null;
|
|
22
|
+
width: string;
|
|
23
|
+
} | undefined;
|
|
24
|
+
cursor: string;
|
|
25
|
+
position: string;
|
|
26
|
+
'&:hover::after': {
|
|
27
|
+
bottom: number;
|
|
28
|
+
position: string;
|
|
29
|
+
content: string;
|
|
30
|
+
borderBottom: number;
|
|
31
|
+
borderColor: string | null;
|
|
32
|
+
width: string;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// Copyright 2025 WebPros International GmbH. All rights reserved.
|
|
2
|
+
export const underlineTypographySxProps = (theme, open = false,
|
|
3
|
+
// If color is null - undeline's color will be the same as the text color
|
|
4
|
+
color = theme.palette.supportive.main) => (Object.assign({ cursor: 'pointer', '&:hover': {
|
|
5
|
+
textDecoration: 'underline',
|
|
6
|
+
textUnderlineOffset: theme.spacing(0.5),
|
|
7
|
+
textDecorationColor: color,
|
|
8
|
+
textDecorationThickness: 1,
|
|
9
|
+
} }, (open && {
|
|
10
|
+
textDecoration: 'underline',
|
|
11
|
+
textUnderlineOffset: theme.spacing(0.5),
|
|
12
|
+
textDecorationColor: color,
|
|
13
|
+
textDecorationThickness: 1,
|
|
14
|
+
})));
|
|
15
|
+
export const underlineBorderSxProps = (theme, open = false,
|
|
16
|
+
// If color is null - undeline's color will be the same as the text color
|
|
17
|
+
color = theme.palette.supportive.main) => (Object.assign({ cursor: 'pointer', position: 'relative', '&:hover::after': {
|
|
18
|
+
bottom: 0,
|
|
19
|
+
position: 'absolute',
|
|
20
|
+
content: "''",
|
|
21
|
+
borderBottom: 1,
|
|
22
|
+
borderColor: color,
|
|
23
|
+
width: '100%',
|
|
24
|
+
} }, (open && {
|
|
25
|
+
'&::after': {
|
|
26
|
+
bottom: 0,
|
|
27
|
+
position: 'absolute',
|
|
28
|
+
content: "''",
|
|
29
|
+
borderBottom: 1,
|
|
30
|
+
borderColor: color,
|
|
31
|
+
width: '100%',
|
|
32
|
+
},
|
|
33
|
+
})));
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// Copyright 2025 WebPros International GmbH. All rights reserved.
|
|
2
|
+
import { version, peerDependencies as pkgPeerDependencies } from '../../package.json';
|
|
3
|
+
export const packageVersion = version;
|
|
4
|
+
const formattedPeerDependencies = JSON.stringify(pkgPeerDependencies, null, 2);
|
|
5
|
+
const left = '```json';
|
|
6
|
+
const right = '```';
|
|
7
|
+
export const peerDependencies = `${left}
|
|
8
|
+
${formattedPeerDependencies}
|
|
9
|
+
${right}`;
|
|
@@ -1,20 +1,14 @@
|
|
|
1
1
|
// Copyright 2025 WebPros International GmbH. All rights reserved.
|
|
2
|
-
import { useState } from 'react';
|
|
3
2
|
import { useMediaQuery } from '@mui/material';
|
|
3
|
+
import { useLocalStorage } from 'usehooks-ts';
|
|
4
4
|
export const THEME_MODE_KEY = 'ThemeModeKey';
|
|
5
|
+
// TODO get rid of this hook, as the theme shouldn't have any knowledge of the mode
|
|
5
6
|
export const useThemeMode = () => {
|
|
6
7
|
const prefersDarkMode = useMediaQuery('(prefers-color-scheme: dark)');
|
|
7
|
-
const [
|
|
8
|
-
const saved = localStorage.getItem(THEME_MODE_KEY);
|
|
9
|
-
if (saved) {
|
|
10
|
-
return JSON.parse(saved);
|
|
11
|
-
}
|
|
12
|
-
return prefersDarkMode ? 'dark' : 'light';
|
|
13
|
-
});
|
|
8
|
+
const [value, setValue] = useLocalStorage(THEME_MODE_KEY, prefersDarkMode ? 'dark' : 'light');
|
|
14
9
|
const toggleTheme = () => {
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
localStorage.setItem(THEME_MODE_KEY, JSON.stringify(value));
|
|
10
|
+
const newValue = value === 'light' ? 'dark' : 'light';
|
|
11
|
+
setValue(newValue);
|
|
18
12
|
};
|
|
19
|
-
return [
|
|
13
|
+
return [value, toggleTheme, setValue];
|
|
20
14
|
};
|
package/dist/src/index.d.ts
CHANGED
package/dist/src/index.js
CHANGED
|
@@ -3,5 +3,6 @@ export { default as WebProsMuiThemeProvider } from './providers/WebProsMuiThemeP
|
|
|
3
3
|
export { useThemeModeContext } from './providers/ThemeModeProvider';
|
|
4
4
|
export * from './utils';
|
|
5
5
|
export * from './tokens';
|
|
6
|
+
export * from './constants';
|
|
6
7
|
// Only used for exporting types.
|
|
7
8
|
export * from './components';
|
package/package.json
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webpros/mui-theme",
|
|
3
3
|
"description": "MUI v6 theme for WebPros products",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.5",
|
|
5
5
|
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/webpros-dashboard/webpros-mui-theme.git"
|
|
9
|
+
},
|
|
6
10
|
"keywords": [
|
|
7
11
|
"react",
|
|
8
12
|
"mui",
|
|
@@ -41,30 +45,26 @@
|
|
|
41
45
|
"typecheck": "tsc --noEmit"
|
|
42
46
|
},
|
|
43
47
|
"peerDependencies": {
|
|
48
|
+
"@emotion/react": "^11.14.0",
|
|
49
|
+
"@emotion/styled": "^11.14.1",
|
|
50
|
+
"@fontsource/roboto": "^5.2.6",
|
|
44
51
|
"@material/material-color-utilities": "^0.3.0",
|
|
45
52
|
"@mui/material": "^6.4.0",
|
|
46
53
|
"@mui/utils": "^6.4.0",
|
|
47
54
|
"@mui/x-data-grid": "^7.29.0",
|
|
48
55
|
"@mui/x-date-pickers": "^7.29.0",
|
|
49
56
|
"@phosphor-icons/react": "^2.1.0",
|
|
50
|
-
"
|
|
51
|
-
"@emotion/react": "^11.14.0",
|
|
52
|
-
"@emotion/styled": "^11.14.1"
|
|
57
|
+
"usehooks-ts": "^3.1.1"
|
|
53
58
|
},
|
|
54
59
|
"publishConfig": {
|
|
55
60
|
"access": "public",
|
|
56
61
|
"registry": "https://registry.npmjs.org/"
|
|
57
62
|
},
|
|
58
63
|
"devDependencies": {
|
|
59
|
-
"@stylistic/eslint-plugin": "^5.5.0",
|
|
60
|
-
"eslint-config-prettier": "^10.1.8",
|
|
61
|
-
"eslint-plugin-prettier": "^5.5.4",
|
|
62
|
-
"eslint-plugin-react": "^7.37.5",
|
|
63
|
-
"eslint-plugin-react-hooks": "^7.0.0",
|
|
64
64
|
"@emotion/react": "^11.14.0",
|
|
65
65
|
"@emotion/styled": "^11.14.1",
|
|
66
|
-
"@fontsource/roboto": "^5.2.6",
|
|
67
66
|
"@eslint/js": "^9.38.0",
|
|
67
|
+
"@fontsource/roboto": "^5.2.6",
|
|
68
68
|
"@material/material-color-utilities": "^0.3.0",
|
|
69
69
|
"@mui/material": "^6.4.0",
|
|
70
70
|
"@mui/utils": "^6.4.0",
|
|
@@ -77,11 +77,16 @@
|
|
|
77
77
|
"@storybook/addon-themes": "^9.1.16",
|
|
78
78
|
"@storybook/builder-vite": "^9.1.16",
|
|
79
79
|
"@storybook/react-vite": "^9.1.16",
|
|
80
|
+
"@stylistic/eslint-plugin": "^5.5.0",
|
|
80
81
|
"@types/node": "^24.8.1",
|
|
81
82
|
"@types/react": "^19.2.2",
|
|
82
83
|
"@types/react-dom": "^19.2.2",
|
|
83
84
|
"@vitejs/plugin-react": "^5.0.4",
|
|
84
85
|
"eslint": "^9.38.0",
|
|
86
|
+
"eslint-config-prettier": "^10.1.8",
|
|
87
|
+
"eslint-plugin-prettier": "^5.5.4",
|
|
88
|
+
"eslint-plugin-react": "^7.37.5",
|
|
89
|
+
"eslint-plugin-react-hooks": "^7.0.0",
|
|
85
90
|
"eslint-plugin-storybook": "^9.1.16",
|
|
86
91
|
"globals": "^16.4.0",
|
|
87
92
|
"prettier": "^3.6.2",
|
|
@@ -92,7 +97,8 @@
|
|
|
92
97
|
"typescript": "~5.9.3",
|
|
93
98
|
"typescript-eslint": "^8.46.1",
|
|
94
99
|
"vite": "^7.1.10",
|
|
95
|
-
"vite-plugin-dts": "^4.5.4"
|
|
100
|
+
"vite-plugin-dts": "^4.5.4",
|
|
101
|
+
"usehooks-ts": "^3.1.1"
|
|
96
102
|
},
|
|
97
103
|
"browserslist": [
|
|
98
104
|
"last 2 versions",
|