@noobsociety/nsds 0.1.1 → 0.1.2
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/CHANGELOG.md +35 -0
- package/CONTRIBUTING.md +34 -0
- package/LICENSE +21 -0
- package/README.md +50 -9
- package/SECURITY.md +11 -0
- package/mui-theme/ThemeProvider.js +14 -0
- package/mui-theme/index.d.ts +49 -0
- package/mui-theme/index.js +2 -0
- package/mui-theme/theme.js +594 -0
- package/package.json +25 -4
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to NSDS are documented here.
|
|
4
|
+
|
|
5
|
+
## 0.1.2 - 2026-06-18
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- MIT license and public package metadata.
|
|
10
|
+
- GitHub Actions CI for package validation, smoke imports, and publish dry runs.
|
|
11
|
+
- Repository contribution, security, issue, pull request, and dependency update templates.
|
|
12
|
+
- Package validation scripts for exports, required files, and publish hygiene.
|
|
13
|
+
- React smoke tests for the public component entry points.
|
|
14
|
+
- JavaScript runtime and TypeScript declarations for `@noobsociety/nsds/mui`.
|
|
15
|
+
- TypeScript smoke validation for consumer-facing package imports.
|
|
16
|
+
- Prioritized README roadmap and reference standards for documentation, changelog, versioning, release, and component documentation workflows.
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
|
|
20
|
+
- Updated README language for the public npm package and repository.
|
|
21
|
+
- Documented the TypeScript and testing roadmap.
|
|
22
|
+
- Pointed the public MUI export at package-ready JavaScript instead of raw TypeScript source.
|
|
23
|
+
|
|
24
|
+
## 0.1.1 - 2026-06-18
|
|
25
|
+
|
|
26
|
+
### Changed
|
|
27
|
+
|
|
28
|
+
- Published the package as `@noobsociety/nsds`.
|
|
29
|
+
- Updated repository metadata for the public NSDS package.
|
|
30
|
+
|
|
31
|
+
## 0.1.0 - 2026-06-18
|
|
32
|
+
|
|
33
|
+
### Added
|
|
34
|
+
|
|
35
|
+
- Initial NSDS package with tokens, CSS primitives, React components, MUI theme source, assets, guidelines, references, and UI kits.
|
package/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
NSDS is the NoobSociety Design System. Changes should keep the package small, reusable, and direct.
|
|
4
|
+
|
|
5
|
+
## Local Setup
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install
|
|
9
|
+
npm run check
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Change Guidelines
|
|
13
|
+
|
|
14
|
+
- Keep package exports stable unless the release is intentionally breaking.
|
|
15
|
+
- Prefer CSS tokens and shared primitives over one-off styles.
|
|
16
|
+
- Keep React components small and framework-light.
|
|
17
|
+
- Add or update smoke coverage when changing component behavior.
|
|
18
|
+
- Use patch versions for metadata, docs, small fixes, and compatibility work.
|
|
19
|
+
- Use minor versions for new components, tokens, or larger additive behavior.
|
|
20
|
+
|
|
21
|
+
## Release Checks
|
|
22
|
+
|
|
23
|
+
Before publishing:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npm run check
|
|
27
|
+
npm run release:dry-run
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Publish with an npm one-time password when required:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npm publish --otp=123456
|
|
34
|
+
```
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 NoobSociety
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,18 +1,22 @@
|
|
|
1
1
|
# NoobSociety Design System
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://github.com/noobsociety/nsds/actions/workflows/ci.yml)
|
|
4
|
+
[](https://www.npmjs.com/package/@noobsociety/nsds)
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
|
|
7
|
+
**NSDS** is the reusable NoobSociety Design System package: design tokens, CSS primitives, React components, MUI theme runtime, pixel assets, and reference UI kits for building NoobSociety interfaces.
|
|
4
8
|
|
|
5
9
|
The system is built around a simple rule: **Monokai colors are semantic foregrounds, dark surfaces are the world canvas.**
|
|
6
10
|
|
|
7
11
|
## Install
|
|
8
12
|
|
|
9
|
-
Install from npm
|
|
13
|
+
Install from npm:
|
|
10
14
|
|
|
11
15
|
```bash
|
|
12
16
|
npm install @noobsociety/nsds
|
|
13
17
|
```
|
|
14
18
|
|
|
15
|
-
Use a local workspace package
|
|
19
|
+
Use a local workspace package while developing against this repository:
|
|
16
20
|
|
|
17
21
|
```json
|
|
18
22
|
{
|
|
@@ -50,13 +54,19 @@ import '@noobsociety/nsds/tokens/colors.css';
|
|
|
50
54
|
import logoUrl from '@noobsociety/nsds/assets/logo.png';
|
|
51
55
|
```
|
|
52
56
|
|
|
53
|
-
|
|
57
|
+
Install MUI peer dependencies before using the MUI entry:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
npm install @mui/material @emotion/react @emotion/styled
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Use the MUI theme in app shells:
|
|
54
64
|
|
|
55
|
-
```
|
|
65
|
+
```jsx
|
|
56
66
|
import { NSThemeProvider, theme, NS } from '@noobsociety/nsds/mui';
|
|
57
67
|
```
|
|
58
68
|
|
|
59
|
-
The MUI entry
|
|
69
|
+
The MUI entry ships JavaScript runtime files and TypeScript declarations. The original TypeScript source stays in `mui-theme/` for reference and future migration work.
|
|
60
70
|
|
|
61
71
|
## Package Exports
|
|
62
72
|
|
|
@@ -64,7 +74,7 @@ The MUI entry currently exports source TypeScript. Add a build step before publi
|
|
|
64
74
|
|---|---|
|
|
65
75
|
| `@noobsociety/nsds` | Root React component entry |
|
|
66
76
|
| `@noobsociety/nsds/react` | React components |
|
|
67
|
-
| `@noobsociety/nsds/mui` | MUI theme
|
|
77
|
+
| `@noobsociety/nsds/mui` | MUI theme runtime and types |
|
|
68
78
|
| `@noobsociety/nsds/styles.css` | Full CSS entry |
|
|
69
79
|
| `@noobsociety/nsds/package.json` | Package metadata |
|
|
70
80
|
| `@noobsociety/nsds/components/primitives.css` | Component primitive classes only |
|
|
@@ -208,15 +218,46 @@ Status mapping:
|
|
|
208
218
|
| `components/buttons/` | Button component, types, prompt, specimen |
|
|
209
219
|
| `components/cards/` | FeatureCard and QuestCard components, types, prompts, specimens |
|
|
210
220
|
| `components/navigation/` | SectionArrow component, types, specimen |
|
|
211
|
-
| `mui-theme/` | MUI theme source and examples |
|
|
221
|
+
| `mui-theme/` | MUI theme runtime, TypeScript source, and examples |
|
|
212
222
|
| `assets/` | Logo, sprites, and world imagery |
|
|
213
223
|
| `guidelines/` | Visual specimen cards |
|
|
214
224
|
| `references/` | Polished `.dc.html` references |
|
|
215
225
|
| `ui-kits/` | Complete UI kits |
|
|
216
226
|
| `SKILL.md` | Agent skill definition |
|
|
217
227
|
|
|
228
|
+
## Development
|
|
229
|
+
|
|
230
|
+
Run the package checks before publishing:
|
|
231
|
+
|
|
232
|
+
```bash
|
|
233
|
+
npm install
|
|
234
|
+
npm run check
|
|
235
|
+
npm run release:dry-run
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
Use patch versions for public package metadata or documentation polish. Use minor versions for new components, tokens, or breaking-adjacent behavior.
|
|
239
|
+
|
|
240
|
+
## Roadmap
|
|
241
|
+
|
|
242
|
+
Priority order:
|
|
243
|
+
|
|
244
|
+
1. Move the current JavaScript runtime to first-class TypeScript source with generated JavaScript and declaration output.
|
|
245
|
+
2. Add component tests for class names, variants, invalid props, and accessibility attributes.
|
|
246
|
+
3. Add package linting for npm exports, types, and install behavior.
|
|
247
|
+
4. Add component documentation with live examples.
|
|
248
|
+
5. Add visual regression coverage for specimen cards and UI kits.
|
|
249
|
+
|
|
250
|
+
## Reference Standards
|
|
251
|
+
|
|
252
|
+
- README quality: [Make a README](https://www.makeareadme.com/)
|
|
253
|
+
- Changelog format: [Keep a Changelog](https://keepachangelog.com/)
|
|
254
|
+
- Versioning: [Semantic Versioning](https://semver.org/)
|
|
255
|
+
- Release workflow: [Changesets](https://github.com/changesets/changesets)
|
|
256
|
+
- Component documentation: [Storybook](https://storybook.js.org/)
|
|
257
|
+
- License guidance: [Choose a License](https://choosealicense.com/)
|
|
258
|
+
|
|
218
259
|
## Repository
|
|
219
260
|
|
|
220
261
|
Source repository: `https://github.com/noobsociety/nsds`
|
|
221
262
|
|
|
222
|
-
The current package is
|
|
263
|
+
The current package is public on npm as `@noobsociety/nsds`. NSDS is released under the MIT license.
|
package/SECURITY.md
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Security
|
|
2
|
+
|
|
3
|
+
NSDS is a design system package, but security issues can still happen through package metadata, published assets, examples, or dependency changes.
|
|
4
|
+
|
|
5
|
+
Please report security issues through GitHub Security Advisories for this repository when available. Avoid opening a public issue for a vulnerability until it has been reviewed.
|
|
6
|
+
|
|
7
|
+
Supported release line:
|
|
8
|
+
|
|
9
|
+
| Version | Supported |
|
|
10
|
+
|---|---|
|
|
11
|
+
| `0.x` | Yes |
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import CssBaseline from '@mui/material/CssBaseline';
|
|
3
|
+
import { ThemeProvider } from '@mui/material/styles';
|
|
4
|
+
|
|
5
|
+
import { theme } from './theme.js';
|
|
6
|
+
|
|
7
|
+
export function NSThemeProvider({ children }) {
|
|
8
|
+
return React.createElement(
|
|
9
|
+
ThemeProvider,
|
|
10
|
+
{ theme },
|
|
11
|
+
React.createElement(CssBaseline),
|
|
12
|
+
children,
|
|
13
|
+
);
|
|
14
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { ReactElement, ReactNode } from 'react';
|
|
2
|
+
import type { Theme } from '@mui/material/styles';
|
|
3
|
+
|
|
4
|
+
export declare const NS: {
|
|
5
|
+
readonly bg0: '#1a1a16';
|
|
6
|
+
readonly bg1: '#272822';
|
|
7
|
+
readonly bg2: '#32332b';
|
|
8
|
+
readonly glass: 'rgba(30, 31, 26, 0.88)';
|
|
9
|
+
readonly glass2: 'rgba(30, 31, 26, 0.60)';
|
|
10
|
+
readonly line: 'rgba(255, 255, 255, 0.12)';
|
|
11
|
+
readonly lineStr: 'rgba(255, 255, 255, 0.22)';
|
|
12
|
+
readonly ink: '#f8f8f2';
|
|
13
|
+
readonly inkDim: '#a8a28c';
|
|
14
|
+
readonly inkFaint: '#75715e';
|
|
15
|
+
readonly gold: '#e6db74';
|
|
16
|
+
readonly goldPale: '#f4f099';
|
|
17
|
+
readonly goldDeep: '#cabb50';
|
|
18
|
+
readonly goldShadow: '#b5a83f';
|
|
19
|
+
readonly goldBtnFg: '#1c1c17';
|
|
20
|
+
readonly green: '#a6e22e';
|
|
21
|
+
readonly greenDeep: '#7fb81e';
|
|
22
|
+
readonly orange: '#fd971f';
|
|
23
|
+
readonly orangeDeep: '#c96f00';
|
|
24
|
+
readonly cyan: '#66d9e8';
|
|
25
|
+
readonly cyanDeep: '#5bc8d7';
|
|
26
|
+
readonly pink: '#f92672';
|
|
27
|
+
readonly purple: '#ae81ff';
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export type NSTokens = typeof NS;
|
|
31
|
+
|
|
32
|
+
declare module '@mui/material/styles' {
|
|
33
|
+
interface Palette {
|
|
34
|
+
ns: NSTokens;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
interface PaletteOptions {
|
|
38
|
+
ns?: NSTokens;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export declare const theme: Theme;
|
|
43
|
+
export default theme;
|
|
44
|
+
|
|
45
|
+
export interface NSThemeProviderProps {
|
|
46
|
+
children?: ReactNode;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export declare function NSThemeProvider(props: NSThemeProviderProps): ReactElement;
|
|
@@ -0,0 +1,594 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NoobSociety — MUI Theme
|
|
3
|
+
*
|
|
4
|
+
* Faithfully maps the Monokai dark design system to Material UI v5+.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* import { theme } from './theme';
|
|
8
|
+
* <ThemeProvider theme={theme}><CssBaseline />{children}</ThemeProvider>
|
|
9
|
+
*
|
|
10
|
+
* Fonts must be loaded separately — add to your index.html or _document.tsx:
|
|
11
|
+
* <link href="https://fonts.googleapis.com/css2?family=Press+Start+2P&family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { createTheme, alpha } from '@mui/material/styles';
|
|
15
|
+
|
|
16
|
+
// ── Monokai foregrounds ────────────────────────────────────────────
|
|
17
|
+
// Each color has a single fixed semantic role. Never reassign.
|
|
18
|
+
export const NS = {
|
|
19
|
+
// Backgrounds (dark canvas — not Monokai colors)
|
|
20
|
+
bg0: '#1a1a16', // deepest — footer, drawer
|
|
21
|
+
bg1: '#272822', // page base
|
|
22
|
+
bg2: '#32332b', // raised surfaces, input fills
|
|
23
|
+
glass: 'rgba(30, 31, 26, 0.88)',
|
|
24
|
+
glass2: 'rgba(30, 31, 26, 0.60)',
|
|
25
|
+
line: 'rgba(255, 255, 255, 0.12)',
|
|
26
|
+
lineStr: 'rgba(255, 255, 255, 0.22)',
|
|
27
|
+
|
|
28
|
+
// Monokai foregrounds
|
|
29
|
+
ink: '#f8f8f2', // primary text
|
|
30
|
+
inkDim: '#a8a28c', // secondary text
|
|
31
|
+
inkFaint: '#75715e', // muted / comment grey
|
|
32
|
+
|
|
33
|
+
// Accent palette — semantic, never reassign
|
|
34
|
+
gold: '#e6db74', // primary accent: wordmark, CTAs, eyebrows
|
|
35
|
+
goldPale: '#f4f099', // hover state of gold
|
|
36
|
+
goldDeep: '#cabb50', // gold border
|
|
37
|
+
goldShadow: '#b5a83f', // gold button press shadow
|
|
38
|
+
goldBtnFg: '#1c1c17', // text on gold backgrounds
|
|
39
|
+
|
|
40
|
+
green: '#a6e22e', // HOLDS / success / live
|
|
41
|
+
greenDeep: '#7fb81e',
|
|
42
|
+
|
|
43
|
+
orange: '#fd971f', // BUILDING / in-progress
|
|
44
|
+
orangeDeep: '#c96f00',
|
|
45
|
+
|
|
46
|
+
cyan: '#66d9e8', // PLANNED / info
|
|
47
|
+
cyanDeep: '#5bc8d7',
|
|
48
|
+
|
|
49
|
+
pink: '#f92672', // highlight / panel accent / danger
|
|
50
|
+
purple: '#ae81ff', // decorative / personal / tertiary
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
// ── Font stacks ────────────────────────────────────────────────────
|
|
54
|
+
const FONT_BODY = "'Inter', system-ui, sans-serif";
|
|
55
|
+
const FONT_PIXEL = "'Press Start 2P', system-ui, sans-serif";
|
|
56
|
+
|
|
57
|
+
// ── Theme ──────────────────────────────────────────────────────────
|
|
58
|
+
export const theme = createTheme({
|
|
59
|
+
|
|
60
|
+
// ── Palette ──────────────────────────────────────────────────────
|
|
61
|
+
palette: {
|
|
62
|
+
mode: 'dark',
|
|
63
|
+
|
|
64
|
+
ns: NS,
|
|
65
|
+
|
|
66
|
+
background: {
|
|
67
|
+
default: NS.bg1,
|
|
68
|
+
paper: NS.bg2,
|
|
69
|
+
},
|
|
70
|
+
|
|
71
|
+
primary: {
|
|
72
|
+
main: NS.gold,
|
|
73
|
+
light: NS.goldPale,
|
|
74
|
+
dark: NS.goldDeep,
|
|
75
|
+
contrastText: NS.goldBtnFg,
|
|
76
|
+
},
|
|
77
|
+
secondary: {
|
|
78
|
+
main: NS.pink,
|
|
79
|
+
contrastText: NS.ink,
|
|
80
|
+
},
|
|
81
|
+
success: {
|
|
82
|
+
main: NS.green,
|
|
83
|
+
dark: NS.greenDeep,
|
|
84
|
+
contrastText: NS.goldBtnFg,
|
|
85
|
+
},
|
|
86
|
+
warning: {
|
|
87
|
+
main: NS.orange,
|
|
88
|
+
dark: NS.orangeDeep,
|
|
89
|
+
contrastText: NS.goldBtnFg,
|
|
90
|
+
},
|
|
91
|
+
info: {
|
|
92
|
+
main: NS.cyan,
|
|
93
|
+
dark: NS.cyanDeep,
|
|
94
|
+
contrastText: NS.goldBtnFg,
|
|
95
|
+
},
|
|
96
|
+
error: {
|
|
97
|
+
main: NS.pink,
|
|
98
|
+
contrastText: NS.ink,
|
|
99
|
+
},
|
|
100
|
+
|
|
101
|
+
text: {
|
|
102
|
+
primary: NS.ink,
|
|
103
|
+
secondary: NS.inkDim,
|
|
104
|
+
disabled: NS.inkFaint,
|
|
105
|
+
},
|
|
106
|
+
|
|
107
|
+
divider: NS.line,
|
|
108
|
+
|
|
109
|
+
action: {
|
|
110
|
+
active: NS.ink,
|
|
111
|
+
hover: alpha(NS.gold, 0.08),
|
|
112
|
+
selected: alpha(NS.gold, 0.12),
|
|
113
|
+
disabled: NS.inkFaint,
|
|
114
|
+
disabledBackground:'rgba(255, 255, 255, 0.05)',
|
|
115
|
+
focus: alpha(NS.gold, 0.16),
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
|
|
119
|
+
// ── Typography ────────────────────────────────────────────────────
|
|
120
|
+
typography: {
|
|
121
|
+
fontFamily: FONT_BODY,
|
|
122
|
+
|
|
123
|
+
// Press Start 2P — hero title
|
|
124
|
+
h1: {
|
|
125
|
+
fontFamily: FONT_PIXEL,
|
|
126
|
+
fontSize: 'clamp(2rem, 1rem + 3vw, 3.45rem)',
|
|
127
|
+
lineHeight: 1.08,
|
|
128
|
+
letterSpacing: 0,
|
|
129
|
+
},
|
|
130
|
+
// Inter — section titles
|
|
131
|
+
h2: {
|
|
132
|
+
fontFamily: FONT_BODY,
|
|
133
|
+
fontSize: 'clamp(1.8rem, 1rem + 2vw, 2.4rem)',
|
|
134
|
+
fontWeight: 700,
|
|
135
|
+
letterSpacing: 0,
|
|
136
|
+
lineHeight: 1.14,
|
|
137
|
+
},
|
|
138
|
+
// Press Start 2P — card titles
|
|
139
|
+
h3: {
|
|
140
|
+
fontFamily: FONT_PIXEL,
|
|
141
|
+
fontSize: '11px',
|
|
142
|
+
lineHeight: 1.45,
|
|
143
|
+
letterSpacing: 0,
|
|
144
|
+
},
|
|
145
|
+
// Press Start 2P — quest gate titles
|
|
146
|
+
h4: {
|
|
147
|
+
fontFamily: FONT_PIXEL,
|
|
148
|
+
fontSize: '9.5px',
|
|
149
|
+
lineHeight: 1.5,
|
|
150
|
+
},
|
|
151
|
+
// Press Start 2P — footer column heads
|
|
152
|
+
h5: {
|
|
153
|
+
fontFamily: FONT_PIXEL,
|
|
154
|
+
fontSize: '9.5px',
|
|
155
|
+
lineHeight: 1.5,
|
|
156
|
+
color: NS.gold,
|
|
157
|
+
},
|
|
158
|
+
// Press Start 2P — small labels
|
|
159
|
+
h6: {
|
|
160
|
+
fontFamily: FONT_PIXEL,
|
|
161
|
+
fontSize: '8px',
|
|
162
|
+
lineHeight: 1.5,
|
|
163
|
+
},
|
|
164
|
+
|
|
165
|
+
// Inter — hero tagline
|
|
166
|
+
subtitle1: {
|
|
167
|
+
fontFamily: FONT_BODY,
|
|
168
|
+
fontSize: '1.25rem',
|
|
169
|
+
fontWeight: 500,
|
|
170
|
+
lineHeight: 1.4,
|
|
171
|
+
},
|
|
172
|
+
// Inter — section subtitles
|
|
173
|
+
subtitle2: {
|
|
174
|
+
fontFamily: FONT_BODY,
|
|
175
|
+
fontSize: '1.05rem',
|
|
176
|
+
fontWeight: 400,
|
|
177
|
+
lineHeight: 1.5,
|
|
178
|
+
color: NS.inkDim,
|
|
179
|
+
},
|
|
180
|
+
// Inter — body
|
|
181
|
+
body1: {
|
|
182
|
+
fontFamily: FONT_BODY,
|
|
183
|
+
fontSize: '1rem',
|
|
184
|
+
lineHeight: 1.6,
|
|
185
|
+
},
|
|
186
|
+
// Inter — small body / card text
|
|
187
|
+
body2: {
|
|
188
|
+
fontFamily: FONT_BODY,
|
|
189
|
+
fontSize: '0.875rem',
|
|
190
|
+
lineHeight: 1.45,
|
|
191
|
+
color: NS.inkDim,
|
|
192
|
+
},
|
|
193
|
+
|
|
194
|
+
// Press Start 2P — pixel labels (e.g. status pills, file URL)
|
|
195
|
+
caption: {
|
|
196
|
+
fontFamily: FONT_PIXEL,
|
|
197
|
+
fontSize: '8px',
|
|
198
|
+
letterSpacing: '0.05em',
|
|
199
|
+
color: NS.inkFaint,
|
|
200
|
+
},
|
|
201
|
+
// Inter — eyebrow labels (✦ SOCIETY OF BEGINNERS)
|
|
202
|
+
overline: {
|
|
203
|
+
fontFamily: FONT_BODY,
|
|
204
|
+
fontSize: '13px',
|
|
205
|
+
fontWeight: 700,
|
|
206
|
+
letterSpacing: '0.18em',
|
|
207
|
+
textTransform: 'uppercase',
|
|
208
|
+
color: NS.gold,
|
|
209
|
+
lineHeight: 1,
|
|
210
|
+
},
|
|
211
|
+
// Press Start 2P — used by Button
|
|
212
|
+
button: {
|
|
213
|
+
fontFamily: FONT_PIXEL,
|
|
214
|
+
fontSize: '12px',
|
|
215
|
+
textTransform: 'none',
|
|
216
|
+
lineHeight: 1,
|
|
217
|
+
},
|
|
218
|
+
},
|
|
219
|
+
|
|
220
|
+
// ── Shape ─────────────────────────────────────────────────────────
|
|
221
|
+
shape: {
|
|
222
|
+
borderRadius: 8,
|
|
223
|
+
},
|
|
224
|
+
|
|
225
|
+
// ── Spacing — 4px base in rem ─────────────────────────────────────
|
|
226
|
+
// MUI default (8px) → override to match our 4px grid.
|
|
227
|
+
// theme.spacing(1) = 0.25rem (4px)
|
|
228
|
+
// theme.spacing(4) = 1rem (16px)
|
|
229
|
+
// theme.spacing(8) = 2rem (32px)
|
|
230
|
+
spacing: (factor) => `${0.25 * factor}rem`,
|
|
231
|
+
|
|
232
|
+
// ── Component overrides ───────────────────────────────────────────
|
|
233
|
+
components: {
|
|
234
|
+
|
|
235
|
+
// ── Global baseline ─────────────────────────────────────────────
|
|
236
|
+
MuiCssBaseline: {
|
|
237
|
+
styleOverrides: `
|
|
238
|
+
html { scroll-behavior: smooth; scroll-padding-top: 4rem; }
|
|
239
|
+
body { background-color: ${NS.bg1}; background-image:
|
|
240
|
+
radial-gradient(ellipse 80% 55% at 88% 2%, ${alpha(NS.pink, 0.11)}, transparent 58%),
|
|
241
|
+
radial-gradient(ellipse 55% 45% at 8% 12%, ${alpha(NS.purple, 0.07)}, transparent 52%),
|
|
242
|
+
linear-gradient(180deg, ${NS.bg1} 0%, #1e1f1a 100%);
|
|
243
|
+
background-attachment: fixed;
|
|
244
|
+
}
|
|
245
|
+
::selection { background: ${alpha(NS.pink, 0.28)}; color: ${NS.ink}; }
|
|
246
|
+
:where(a, button, input, select, textarea, [tabindex]):focus-visible {
|
|
247
|
+
outline: 2px solid ${NS.gold};
|
|
248
|
+
outline-offset: 3px;
|
|
249
|
+
box-shadow: 0 0 0 4px ${alpha(NS.gold, 0.35)};
|
|
250
|
+
}
|
|
251
|
+
@keyframes ns-live {
|
|
252
|
+
0% { box-shadow: 0 0 0 0 ${alpha(NS.green, 0.7)}; }
|
|
253
|
+
70% { box-shadow: 0 0 0 7px ${alpha(NS.green, 0)}; }
|
|
254
|
+
100% { box-shadow: 0 0 0 0 ${alpha(NS.green, 0)}; }
|
|
255
|
+
}
|
|
256
|
+
@media (prefers-reduced-motion: reduce) {
|
|
257
|
+
*, *::before, *::after {
|
|
258
|
+
animation: none !important;
|
|
259
|
+
scroll-behavior: auto !important;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
`,
|
|
263
|
+
},
|
|
264
|
+
|
|
265
|
+
// ── AppBar / Header ─────────────────────────────────────────────
|
|
266
|
+
MuiAppBar: {
|
|
267
|
+
defaultProps: {
|
|
268
|
+
elevation: 0,
|
|
269
|
+
position: 'sticky',
|
|
270
|
+
},
|
|
271
|
+
styleOverrides: {
|
|
272
|
+
root: {
|
|
273
|
+
height: '4rem',
|
|
274
|
+
background: NS.glass,
|
|
275
|
+
backdropFilter: 'blur(12px)',
|
|
276
|
+
WebkitBackdropFilter: 'blur(12px)',
|
|
277
|
+
borderBottom: `1px solid ${NS.line}`,
|
|
278
|
+
justifyContent: 'center',
|
|
279
|
+
},
|
|
280
|
+
},
|
|
281
|
+
},
|
|
282
|
+
MuiToolbar: {
|
|
283
|
+
defaultProps: { disableGutters: true },
|
|
284
|
+
styleOverrides: {
|
|
285
|
+
root: {
|
|
286
|
+
maxWidth: '1080px',
|
|
287
|
+
width: '100%',
|
|
288
|
+
margin: '0 auto',
|
|
289
|
+
padding: '0 clamp(1rem, 4vw, 2rem)',
|
|
290
|
+
minHeight: '4rem !important',
|
|
291
|
+
},
|
|
292
|
+
},
|
|
293
|
+
},
|
|
294
|
+
|
|
295
|
+
// ── Buttons ─────────────────────────────────────────────────────
|
|
296
|
+
MuiButton: {
|
|
297
|
+
defaultProps: {
|
|
298
|
+
disableElevation: true,
|
|
299
|
+
variant: 'contained',
|
|
300
|
+
},
|
|
301
|
+
styleOverrides: {
|
|
302
|
+
root: {
|
|
303
|
+
fontFamily: FONT_PIXEL,
|
|
304
|
+
fontSize: '12px',
|
|
305
|
+
lineHeight: 1,
|
|
306
|
+
textTransform: 'none',
|
|
307
|
+
borderRadius: '9px',
|
|
308
|
+
padding: '1rem 1.625rem',
|
|
309
|
+
transition: '150ms ease-out',
|
|
310
|
+
minWidth: 0,
|
|
311
|
+
},
|
|
312
|
+
// Play button — gold fill, 3D press shadow
|
|
313
|
+
contained: {
|
|
314
|
+
color: NS.goldBtnFg,
|
|
315
|
+
background: NS.gold,
|
|
316
|
+
border: `2px solid ${NS.goldDeep}`,
|
|
317
|
+
boxShadow: `0 3px 0 ${NS.goldShadow}`,
|
|
318
|
+
'&:hover': {
|
|
319
|
+
background: NS.goldPale,
|
|
320
|
+
boxShadow: `0 3px 0 ${NS.goldShadow}`,
|
|
321
|
+
},
|
|
322
|
+
'&:active': {
|
|
323
|
+
boxShadow: 'none',
|
|
324
|
+
transform: 'translateY(2px)',
|
|
325
|
+
},
|
|
326
|
+
'&.Mui-disabled': {
|
|
327
|
+
background: alpha(NS.gold, 0.3),
|
|
328
|
+
color: alpha(NS.goldBtnFg, 0.5),
|
|
329
|
+
},
|
|
330
|
+
},
|
|
331
|
+
// Ghost button — transparent, soft border
|
|
332
|
+
outlined: {
|
|
333
|
+
color: NS.gold,
|
|
334
|
+
background: 'transparent',
|
|
335
|
+
border: `1px solid ${alpha(NS.ink, 0.45)}`,
|
|
336
|
+
boxShadow: 'none',
|
|
337
|
+
'&:hover': {
|
|
338
|
+
color: NS.goldBtnFg,
|
|
339
|
+
background: NS.gold,
|
|
340
|
+
borderColor: NS.gold,
|
|
341
|
+
},
|
|
342
|
+
},
|
|
343
|
+
// Text button — no border
|
|
344
|
+
text: {
|
|
345
|
+
color: NS.gold,
|
|
346
|
+
'&:hover': {
|
|
347
|
+
background: alpha(NS.gold, 0.08),
|
|
348
|
+
},
|
|
349
|
+
},
|
|
350
|
+
// Small variant (header Play button)
|
|
351
|
+
sizeSmall: {
|
|
352
|
+
fontSize: '9px',
|
|
353
|
+
padding: '0.625rem 0.875rem',
|
|
354
|
+
borderRadius: '8px',
|
|
355
|
+
},
|
|
356
|
+
},
|
|
357
|
+
},
|
|
358
|
+
|
|
359
|
+
// ── Card / Paper ─────────────────────────────────────────────────
|
|
360
|
+
MuiCard: {
|
|
361
|
+
defaultProps: { elevation: 0 },
|
|
362
|
+
styleOverrides: {
|
|
363
|
+
root: {
|
|
364
|
+
background: NS.glass,
|
|
365
|
+
backdropFilter: 'blur(8px)',
|
|
366
|
+
WebkitBackdropFilter: 'blur(8px)',
|
|
367
|
+
border: `1px solid ${NS.lineStr}`,
|
|
368
|
+
borderRadius: '10px',
|
|
369
|
+
boxShadow: 'none',
|
|
370
|
+
transition: '180ms ease-out',
|
|
371
|
+
'&:hover': {
|
|
372
|
+
borderColor: alpha(NS.gold, 0.55),
|
|
373
|
+
transform: 'translateY(-4px)',
|
|
374
|
+
boxShadow: '0 16px 34px rgba(0,0,0,.38)',
|
|
375
|
+
},
|
|
376
|
+
},
|
|
377
|
+
},
|
|
378
|
+
},
|
|
379
|
+
MuiCardContent: {
|
|
380
|
+
styleOverrides: {
|
|
381
|
+
root: {
|
|
382
|
+
padding: 'clamp(1rem, 2vw, 1.25rem)',
|
|
383
|
+
paddingRight: '3.5rem', // room for absolute badge
|
|
384
|
+
'&:last-child': { paddingBottom: 'clamp(1rem, 2vw, 1.25rem)' },
|
|
385
|
+
},
|
|
386
|
+
},
|
|
387
|
+
},
|
|
388
|
+
MuiPaper: {
|
|
389
|
+
defaultProps: { elevation: 0 },
|
|
390
|
+
styleOverrides: {
|
|
391
|
+
root: {
|
|
392
|
+
backgroundImage: 'none',
|
|
393
|
+
},
|
|
394
|
+
elevation1: {
|
|
395
|
+
background: NS.glass,
|
|
396
|
+
backdropFilter: 'blur(8px)',
|
|
397
|
+
border: `1px solid ${NS.line}`,
|
|
398
|
+
},
|
|
399
|
+
elevation2: {
|
|
400
|
+
background: NS.bg2,
|
|
401
|
+
border: `1px solid ${NS.line}`,
|
|
402
|
+
},
|
|
403
|
+
},
|
|
404
|
+
},
|
|
405
|
+
|
|
406
|
+
// ── Chip — status pills ──────────────────────────────────────────
|
|
407
|
+
// Use color prop: 'default'=gold, 'success'=green, 'warning'=orange,
|
|
408
|
+
// 'info'=cyan, 'error'=pink, 'secondary'=purple
|
|
409
|
+
MuiChip: {
|
|
410
|
+
styleOverrides: {
|
|
411
|
+
root: {
|
|
412
|
+
fontFamily: FONT_PIXEL,
|
|
413
|
+
fontSize: '7px',
|
|
414
|
+
height: 'auto',
|
|
415
|
+
padding: '4px 2px',
|
|
416
|
+
borderRadius: '4px',
|
|
417
|
+
letterSpacing: '0.02em',
|
|
418
|
+
},
|
|
419
|
+
label: {
|
|
420
|
+
padding: '0 4px',
|
|
421
|
+
},
|
|
422
|
+
colorDefault: {
|
|
423
|
+
background: alpha(NS.gold, 0.08),
|
|
424
|
+
color: NS.gold,
|
|
425
|
+
border: `1px solid ${alpha(NS.gold, 0.26)}`,
|
|
426
|
+
},
|
|
427
|
+
colorSuccess: {
|
|
428
|
+
background: alpha(NS.green, 0.10),
|
|
429
|
+
color: NS.green,
|
|
430
|
+
border: `1px solid ${alpha(NS.green, 0.26)}`,
|
|
431
|
+
},
|
|
432
|
+
colorWarning: {
|
|
433
|
+
background: alpha(NS.orange, 0.12),
|
|
434
|
+
color: NS.orange,
|
|
435
|
+
border: `1px solid ${alpha(NS.orange, 0.26)}`,
|
|
436
|
+
},
|
|
437
|
+
colorInfo: {
|
|
438
|
+
background: alpha(NS.cyan, 0.12),
|
|
439
|
+
color: NS.cyan,
|
|
440
|
+
border: `1px solid ${alpha(NS.cyan, 0.26)}`,
|
|
441
|
+
},
|
|
442
|
+
colorError: {
|
|
443
|
+
background: alpha(NS.pink, 0.08),
|
|
444
|
+
color: NS.pink,
|
|
445
|
+
border: `1px solid ${alpha(NS.pink, 0.26)}`,
|
|
446
|
+
},
|
|
447
|
+
colorSecondary: {
|
|
448
|
+
background: alpha(NS.purple, 0.08),
|
|
449
|
+
color: NS.purple,
|
|
450
|
+
border: `1px solid ${alpha(NS.purple, 0.26)}`,
|
|
451
|
+
},
|
|
452
|
+
},
|
|
453
|
+
},
|
|
454
|
+
|
|
455
|
+
// ── Divider ──────────────────────────────────────────────────────
|
|
456
|
+
MuiDivider: {
|
|
457
|
+
styleOverrides: {
|
|
458
|
+
root: { borderColor: NS.line },
|
|
459
|
+
},
|
|
460
|
+
},
|
|
461
|
+
|
|
462
|
+
// ── Link ─────────────────────────────────────────────────────────
|
|
463
|
+
MuiLink: {
|
|
464
|
+
defaultProps: { underline: 'none' },
|
|
465
|
+
styleOverrides: {
|
|
466
|
+
root: {
|
|
467
|
+
color: NS.gold,
|
|
468
|
+
transition: '150ms ease-out',
|
|
469
|
+
'&:hover': { color: NS.goldPale },
|
|
470
|
+
},
|
|
471
|
+
},
|
|
472
|
+
},
|
|
473
|
+
|
|
474
|
+
// ── TextField / Input ─────────────────────────────────────────────
|
|
475
|
+
MuiOutlinedInput: {
|
|
476
|
+
styleOverrides: {
|
|
477
|
+
root: {
|
|
478
|
+
background: NS.bg2,
|
|
479
|
+
fontFamily: FONT_BODY,
|
|
480
|
+
'& .MuiOutlinedInput-notchedOutline': {
|
|
481
|
+
borderColor: NS.line,
|
|
482
|
+
},
|
|
483
|
+
'&:hover .MuiOutlinedInput-notchedOutline': {
|
|
484
|
+
borderColor: alpha(NS.gold, 0.5),
|
|
485
|
+
},
|
|
486
|
+
'&.Mui-focused .MuiOutlinedInput-notchedOutline': {
|
|
487
|
+
borderColor: NS.gold,
|
|
488
|
+
},
|
|
489
|
+
},
|
|
490
|
+
},
|
|
491
|
+
},
|
|
492
|
+
MuiInputLabel: {
|
|
493
|
+
styleOverrides: {
|
|
494
|
+
root: {
|
|
495
|
+
fontFamily: FONT_BODY,
|
|
496
|
+
color: NS.inkFaint,
|
|
497
|
+
'&.Mui-focused': { color: NS.gold },
|
|
498
|
+
},
|
|
499
|
+
},
|
|
500
|
+
},
|
|
501
|
+
|
|
502
|
+
// ── Tooltip ──────────────────────────────────────────────────────
|
|
503
|
+
MuiTooltip: {
|
|
504
|
+
styleOverrides: {
|
|
505
|
+
tooltip: {
|
|
506
|
+
background: NS.bg2,
|
|
507
|
+
color: NS.ink,
|
|
508
|
+
border: `1px solid ${NS.line}`,
|
|
509
|
+
fontFamily: FONT_BODY,
|
|
510
|
+
fontSize: '0.8125rem',
|
|
511
|
+
borderRadius: '6px',
|
|
512
|
+
padding: '6px 10px',
|
|
513
|
+
},
|
|
514
|
+
arrow: { color: NS.bg2 },
|
|
515
|
+
},
|
|
516
|
+
},
|
|
517
|
+
|
|
518
|
+
// ── LinearProgress — roadmap progress bar ────────────────────────
|
|
519
|
+
MuiLinearProgress: {
|
|
520
|
+
styleOverrides: {
|
|
521
|
+
root: {
|
|
522
|
+
height: '8px',
|
|
523
|
+
borderRadius: '999px',
|
|
524
|
+
background: 'rgba(255,255,255,.08)',
|
|
525
|
+
border: `1px solid rgba(255,255,255,.1)`,
|
|
526
|
+
overflow: 'hidden',
|
|
527
|
+
},
|
|
528
|
+
bar: {
|
|
529
|
+
background: NS.green, // default: "holds"
|
|
530
|
+
borderRadius: '999px',
|
|
531
|
+
},
|
|
532
|
+
},
|
|
533
|
+
},
|
|
534
|
+
|
|
535
|
+
// ── Tabs (section nav) ────────────────────────────────────────────
|
|
536
|
+
MuiTab: {
|
|
537
|
+
styleOverrides: {
|
|
538
|
+
root: {
|
|
539
|
+
fontFamily: FONT_BODY,
|
|
540
|
+
fontSize: '0.875rem',
|
|
541
|
+
fontWeight: 500,
|
|
542
|
+
color: NS.ink,
|
|
543
|
+
textTransform: 'none',
|
|
544
|
+
minHeight: '4rem',
|
|
545
|
+
padding: '0 0 0.25rem',
|
|
546
|
+
'&.Mui-selected': { color: NS.gold },
|
|
547
|
+
},
|
|
548
|
+
},
|
|
549
|
+
},
|
|
550
|
+
MuiTabs: {
|
|
551
|
+
styleOverrides: {
|
|
552
|
+
indicator: {
|
|
553
|
+
backgroundColor: NS.gold,
|
|
554
|
+
height: '2px',
|
|
555
|
+
},
|
|
556
|
+
},
|
|
557
|
+
},
|
|
558
|
+
|
|
559
|
+
// ── Dialog / Modal ────────────────────────────────────────────────
|
|
560
|
+
MuiDialog: {
|
|
561
|
+
styleOverrides: {
|
|
562
|
+
paper: {
|
|
563
|
+
background: NS.bg2,
|
|
564
|
+
border: `1px solid ${alpha(NS.pink, 0.28)}`,
|
|
565
|
+
borderRadius: '12px',
|
|
566
|
+
backdropFilter: 'blur(8px)',
|
|
567
|
+
boxShadow: '0 30px 60px rgba(0,0,0,.5)',
|
|
568
|
+
},
|
|
569
|
+
},
|
|
570
|
+
},
|
|
571
|
+
MuiBackdrop: {
|
|
572
|
+
styleOverrides: {
|
|
573
|
+
root: { background: alpha(NS.bg0, 0.72) },
|
|
574
|
+
},
|
|
575
|
+
},
|
|
576
|
+
|
|
577
|
+
// ── Snackbar / Alert ──────────────────────────────────────────────
|
|
578
|
+
MuiAlert: {
|
|
579
|
+
styleOverrides: {
|
|
580
|
+
root: {
|
|
581
|
+
fontFamily: FONT_BODY,
|
|
582
|
+
borderRadius: '8px',
|
|
583
|
+
border: `1px solid`,
|
|
584
|
+
},
|
|
585
|
+
standardSuccess: { background: alpha(NS.green, 0.10), borderColor: alpha(NS.green, 0.26), color: NS.green },
|
|
586
|
+
standardWarning: { background: alpha(NS.orange, 0.10), borderColor: alpha(NS.orange, 0.26), color: NS.orange },
|
|
587
|
+
standardInfo: { background: alpha(NS.cyan, 0.10), borderColor: alpha(NS.cyan, 0.26), color: NS.cyan },
|
|
588
|
+
standardError: { background: alpha(NS.pink, 0.10), borderColor: alpha(NS.pink, 0.26), color: NS.pink },
|
|
589
|
+
},
|
|
590
|
+
},
|
|
591
|
+
},
|
|
592
|
+
});
|
|
593
|
+
|
|
594
|
+
export default theme;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@noobsociety/nsds",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "NoobSociety Design System: tokens, CSS primitives, React components, MUI theme
|
|
3
|
+
"version": "0.1.2",
|
|
4
|
+
"description": "NoobSociety Design System: tokens, CSS primitives, React components, MUI theme runtime, assets, and references.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"design-system",
|
|
7
7
|
"css",
|
|
@@ -14,6 +14,15 @@
|
|
|
14
14
|
"noobsociety"
|
|
15
15
|
],
|
|
16
16
|
"author": "NoobSociety",
|
|
17
|
+
"license": "MIT",
|
|
18
|
+
"scripts": {
|
|
19
|
+
"check": "npm run check:package && npm run check:types && npm run test:smoke",
|
|
20
|
+
"check:package": "node scripts/check-package.mjs",
|
|
21
|
+
"check:types": "tsc --noEmit",
|
|
22
|
+
"test": "npm run check",
|
|
23
|
+
"test:smoke": "node scripts/smoke-imports.mjs",
|
|
24
|
+
"release:dry-run": "npm publish --dry-run"
|
|
25
|
+
},
|
|
17
26
|
"repository": {
|
|
18
27
|
"type": "git",
|
|
19
28
|
"url": "git+https://github.com/noobsociety/nsds.git"
|
|
@@ -35,6 +44,10 @@
|
|
|
35
44
|
},
|
|
36
45
|
"files": [
|
|
37
46
|
"README.md",
|
|
47
|
+
"CHANGELOG.md",
|
|
48
|
+
"CONTRIBUTING.md",
|
|
49
|
+
"LICENSE",
|
|
50
|
+
"SECURITY.md",
|
|
38
51
|
"SKILL.md",
|
|
39
52
|
"index.js",
|
|
40
53
|
"index.d.ts",
|
|
@@ -58,8 +71,8 @@
|
|
|
58
71
|
"import": "./components/react/index.js"
|
|
59
72
|
},
|
|
60
73
|
"./mui": {
|
|
61
|
-
"types": "./mui-theme/index.ts",
|
|
62
|
-
"import": "./mui-theme/index.
|
|
74
|
+
"types": "./mui-theme/index.d.ts",
|
|
75
|
+
"import": "./mui-theme/index.js"
|
|
63
76
|
},
|
|
64
77
|
"./styles.css": "./styles.css",
|
|
65
78
|
"./package.json": "./package.json",
|
|
@@ -87,5 +100,13 @@
|
|
|
87
100
|
"@mui/material": {
|
|
88
101
|
"optional": true
|
|
89
102
|
}
|
|
103
|
+
},
|
|
104
|
+
"devDependencies": {
|
|
105
|
+
"@emotion/react": "^11.14.0",
|
|
106
|
+
"@emotion/styled": "^11.14.1",
|
|
107
|
+
"@mui/material": "^9.1.1",
|
|
108
|
+
"@types/react": "^19.2.17",
|
|
109
|
+
"react": "^19.2.7",
|
|
110
|
+
"typescript": "^6.0.3"
|
|
90
111
|
}
|
|
91
112
|
}
|