@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 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.
@@ -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
- **NSDS** is the reusable NoobSociety Design System package: design tokens, CSS primitives, React components, MUI theme source, pixel assets, and reference UI kits for building NoobSociety interfaces.
3
+ [![CI](https://github.com/noobsociety/nsds/actions/workflows/ci.yml/badge.svg)](https://github.com/noobsociety/nsds/actions/workflows/ci.yml)
4
+ [![npm](https://img.shields.io/npm/v/@noobsociety/nsds.svg)](https://www.npmjs.com/package/@noobsociety/nsds)
5
+ [![License: MIT](https://img.shields.io/badge/license-MIT-2ea44f.svg)](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 after publish:
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 before publish:
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
- Use the MUI theme in TypeScript-aware app bundlers:
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
- ```ts
65
+ ```jsx
56
66
  import { NSThemeProvider, theme, NS } from '@noobsociety/nsds/mui';
57
67
  ```
58
68
 
59
- The MUI entry currently exports source TypeScript. Add a build step before publishing to consumers that require plain JavaScript MUI runtime files.
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 source |
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 ready for local reuse and npm publication as `@noobsociety/nsds@0.1.1`. License is intentionally unset until a license is chosen.
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,2 @@
1
+ export { default, NS, theme } from './theme.js';
2
+ export { NSThemeProvider } from './ThemeProvider.js';
@@ -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.1",
4
- "description": "NoobSociety Design System: tokens, CSS primitives, React components, MUI theme source, assets, and references.",
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.ts"
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
  }