@noobsociety/nsds 0.3.0 → 0.4.1

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.
Files changed (41) hide show
  1. package/CHANGELOG.md +46 -1
  2. package/CONTRIBUTING.md +43 -2
  3. package/README.md +87 -36
  4. package/SECURITY.md +38 -4
  5. package/dist/client/index.cjs +1 -0
  6. package/dist/client/index.d.cts +6 -0
  7. package/dist/client/index.d.ts +6 -0
  8. package/dist/client/index.js +5 -0
  9. package/dist/components/_card-base.css +99 -0
  10. package/dist/components/hud/HUDBar.d.ts +16 -3
  11. package/dist/components/hud/HUDChat.d.ts +26 -0
  12. package/dist/components/hud/HUDJoystick.d.ts +21 -0
  13. package/dist/components/hud/HUDMinimap.d.ts +14 -0
  14. package/dist/components/hud/HUDPanel.d.ts +25 -0
  15. package/dist/components/hud/HUDTabWindow.d.ts +37 -0
  16. package/dist/components/hud-editor.css +197 -0
  17. package/dist/components/icons/RPGIcon.d.ts +15 -11
  18. package/dist/components/icons/registry.d.ts +37 -0
  19. package/dist/components/primitives.css +50 -20
  20. package/dist/components/react/index.d.ts +12 -2
  21. package/dist/components/scene-builder.css +740 -0
  22. package/dist/components/scene-builder.js +3039 -0
  23. package/dist/components/shared/constants.d.ts +41 -0
  24. package/dist/components/shared/styles.d.ts +1 -42
  25. package/dist/index.cjs +1 -1
  26. package/dist/index.js +6173 -1821
  27. package/dist/registry-BizUEm6W.js +136 -0
  28. package/dist/registry-Cyq-qspU.cjs +1 -0
  29. package/dist/styles.css +1 -0
  30. package/dist/tailwind/preset.cjs +108 -0
  31. package/dist/tailwind/preset.d.cts +3 -3
  32. package/dist/tokens/base.css +17 -4
  33. package/dist/tokens/colors.css +57 -53
  34. package/dist/tokens/hud.css +119 -78
  35. package/dist/tokens/motion.css +57 -23
  36. package/dist/tokens/spacing.css +39 -39
  37. package/dist/tokens/typography.css +20 -20
  38. package/package.json +41 -12
  39. package/dist/tailwind/package.json +0 -1
  40. package/dist/tailwind/preset.d.ts +0 -4
  41. package/dist/tailwind/preset.js +0 -144
@@ -9,125 +9,166 @@
9
9
  vital bar colours that have no homepage analogue) the token is defined independently. */
10
10
 
11
11
  :root {
12
-
13
12
  /* ── Fonts ─────────────────────────────────────────────────── */
14
- --hud-font: var(--ns-font-pixel); /* chrome labels, tab caps, key glyphs */
15
- --hud-font-ui: var(--ns-font-body); /* draggable windows, dialogue, inventory */
13
+ --hud-font: var(--ns-font-pixel); /* chrome labels, tab caps, key glyphs */
14
+ --hud-font-ui: var(--ns-font-body); /* draggable windows, dialogue, inventory */
15
+
16
+ /* ── HUD text scale (pixel-perfect at 24×24 grid) ───────────── */
17
+ --hud-text-xs: 4px;
18
+ --hud-text-sm: 5px;
19
+ --hud-text-md: 7px;
20
+ --hud-text-lg: 9px;
21
+ --hud-text-xl: 11px;
16
22
 
17
23
  /* ── Accent / currency ─────────────────────────────────────── */
18
24
  /* DS is source of truth: game migrates from #ffe066 → --ns-gold (#e6db74). */
19
- --hud-gold: var(--ns-gold);
20
- --hud-talents: var(--ns-gold); /* Talents wallet number */
25
+ --hud-gold: var(--ns-gold);
26
+ --hud-talents: var(--ns-gold); /* Talents wallet number */
21
27
 
22
28
  /* ── Text ───────────────────────────────────────────────────── */
23
- --hud-text: var(--ns-ink);
29
+ --hud-text: var(--ns-ink);
24
30
  --hud-text-dim: var(--ns-ink-dim);
25
- --hud-shadow: none; /* no text-shadow at HUD pixel sizes */
31
+ --hud-shadow: none; /* no text-shadow at HUD pixel sizes */
26
32
  --hud-bar-shadow: none;
27
33
 
28
34
  /* ── Surfaces ───────────────────────────────────────────────── */
29
35
  /* Game chrome glass: lighter than --ns-glass so the world reads through. */
30
- --hud-glass: rgba(12, 16, 22, 0.62);
36
+ --hud-glass: rgba(12, 16, 22, 0.62);
31
37
  --hud-glass-blur: 6px;
32
- --hud-bg: rgba(0, 0, 0, 0.35);
33
- --hud-bg-strong: rgba(0, 0, 0, 0.72);
34
- --hud-track: rgba(255, 255, 255, 0.10); /* bar + XP track background */
35
- --hud-line: rgba(255, 255, 255, 0.18);
36
- --hud-avatar-bg: rgba(72, 86, 116, 0.82);
38
+ --hud-bg: rgba(0, 0, 0, 0.35);
39
+ --hud-bg-strong: rgba(0, 0, 0, 0.72);
40
+ --hud-track: rgba(255, 255, 255, 0.1); /* bar + XP track background */
41
+ --hud-line: rgba(255, 255, 255, 0.18);
42
+ --hud-divider: var(--hud-line);
43
+ --hud-avatar-bg: rgba(72, 86, 116, 0.82);
37
44
 
38
45
  /* ── Input / selection ─────────────────────────────────────── */
39
- --hud-input-bg: rgba(10, 14, 20, 0.55);
40
- --hud-sel-bg: var(--ns-ink);
41
- --hud-sel-fg: var(--ns-bg-1);
46
+ --hud-input-bg: rgba(10, 14, 20, 0.55);
47
+ --hud-sel-bg: var(--ns-ink);
48
+ --hud-sel-fg: var(--ns-bg-1);
42
49
 
43
50
  /* ── Elements (identity.ts ELEMENT_DISPLAY) ───────────────────── */
44
51
  /* ── Elements (identity.ts ELEMENT_DISPLAY exact colors) ─────────── */
45
52
  --hud-el-neutral: #888780;
46
- --hud-el-earth: #639922;
47
- --hud-el-wind: #5dcaa5;
48
- --hud-el-water: #378add;
49
- --hud-el-fire: #ba7517;
50
- --hud-el-light: #fac775;
51
- --hud-el-dark: #888780;
52
- --hud-el-void: #7f77dd;
53
+ --hud-el-earth: #639922;
54
+ --hud-el-wind: #5dcaa5;
55
+ --hud-el-water: #378add;
56
+ --hud-el-fire: #ba7517;
57
+ --hud-el-light: #fac775;
58
+ --hud-el-dark: #888780;
59
+ --hud-el-void: #7f77dd;
53
60
 
54
61
  /* ── Vital bars ─────────────────────────────────────────────── */
55
62
  /* HP — green track, bright fill, low-HP red warning */
56
- --hud-hp: var(--hud-track); /* track background */
57
- --hud-hp-fill: #4caf73; /* normal fill */
58
- --hud-hp-low: #cc3333; /* fill under 30% → also pulses */
59
- --hud-hp-label: #88ee88; /* "HP" label text in classic bar */
63
+ --hud-hp: var(--hud-track); /* track background */
64
+ --hud-hp-fill: #4caf73; /* normal fill */
65
+ --hud-hp-low: #cc3333; /* fill under 30% → also pulses */
66
+ --hud-hp-label: #88ee88; /* "HP" label text in classic bar */
60
67
  /* MP — blue track, bright fill, low-MP muted */
61
- --hud-mp: var(--hud-track); /* track background (internal id: sp) */
62
- --hud-mp-fill: #5b9bd5; /* normal fill */
63
- --hud-mp-low: #4f7fc0; /* fill under 30% */
64
- --hud-mp-label: #8888ee; /* "MP"/"SP" label text */
68
+ --hud-mp: var(--hud-track); /* track background (internal id: sp) */
69
+ --hud-mp-fill: #5b9bd5; /* normal fill */
70
+ --hud-mp-low: #4f7fc0; /* fill under 30% */
71
+ --hud-mp-label: #8888ee; /* "MP"/"SP" label text */
72
+
73
+ /* Stamina — segmented endurance bar */
74
+ --hud-stamina-fill: #5dcaa5; /* teal fill */
75
+ --hud-stamina-label: #8fe6cc; /* stamina label text */
65
76
 
66
77
  /* ── XP tracks ──────────────────────────────────────────────── */
67
78
  /* Three independent mastery tracks: Base (BXP), Tech (TXP), Weapon (WXP). */
68
- --hud-xp-base: #4488cc; /* BXP fill — steel blue */
69
- --hud-xp-base-rgb: 68 136 204; /* @kind other */
70
- --hud-xp-base-label: #88aaee; /* BXP label */
71
- --hud-xp-job: #8855cc; /* TXP fill — purple */
72
- --hud-xp-job-rgb: 136 85 204; /* @kind other */
73
- --hud-xp-job-label: #aa88ee; /* TXP label */
74
- --hud-xp-weapon: #cc8844; /* WXP fill — amber */
75
- --hud-xp-weapon-rgb: 204 136 68; /* @kind other */
76
- --hud-xp-weapon-label: #eeaa66; /* WXP label */
79
+ --hud-xp-base: #4488cc; /* BXP fill — steel blue */
80
+ --hud-xp-base-rgb: 68 136 204; /* @kind other */
81
+ --hud-xp-base-label: #88aaee; /* BXP label */
82
+ --hud-xp-job: #8855cc; /* TXP fill — purple */
83
+ --hud-xp-job-rgb: 136 85 204; /* @kind other */
84
+ --hud-xp-job-label: #aa88ee; /* TXP label */
85
+ --hud-xp-weapon: #cc8844; /* WXP fill — amber */
86
+ --hud-xp-weapon-rgb: 204 136 68; /* @kind other */
87
+ --hud-xp-weapon-label: #eeaa66; /* WXP label */
77
88
 
78
89
  /* Progress bars in the player card detail (Marks / Craft). */
79
- --hud-marks-track: #3a2e6e;
80
- --hud-marks-fill: #7f77dd;
81
- --hud-craft-track: #4a2e0a;
82
- --hud-craft-fill: #ba7517;
90
+ --hud-marks-track: #3a2e6e;
91
+ --hud-marks-fill: #7f77dd;
92
+ --hud-craft-track: #4a2e0a;
93
+ --hud-craft-fill: #ba7517;
83
94
 
84
95
  /* ── Chat log channel tones ─────────────────────────────────── */
85
96
  /* Logs tab (battle narration) vs Chat tab (social stream). */
86
- --hud-tone-battle: #ff8888; /* combat hits, defeat lines */
87
- --hud-tone-world: #88ccff; /* map announcements, world events */
88
- --hud-tone-gain: #aaffaa; /* EXP / loot / discovery / rewards */
89
- --hud-tone-say: #cccccc; /* player speech, system messages */
97
+ --hud-tone-battle: #ff8888; /* combat hits, defeat lines */
98
+ --hud-tone-world: #88ccff; /* map announcements, world events */
99
+ --hud-tone-gain: #aaffaa; /* EXP / loot / discovery / rewards */
100
+ --hud-tone-say: #cccccc; /* player speech, system messages */
90
101
 
91
102
  /* ── Status / buffs ─────────────────────────────────────────── */
92
- --hud-danger: var(--ns-pink); /* death zone, error states */
93
- --hud-buff: var(--ns-green); /* positive effect glyphs */
94
- --hud-debuff: #ee6666; /* negative effect glyphs */
103
+ --hud-danger: var(--ns-pink); /* death zone, error states */
104
+ --hud-buff: var(--ns-green); /* positive effect glyphs */
105
+ --hud-debuff: #ee6666; /* negative effect glyphs */
95
106
 
96
107
  /* ── Minimap ────────────────────────────────────────────────── */
97
- --hud-minimap-bg: #091509; /* canvas fill */
98
- --hud-minimap-edge: #2a4a2a; /* outer diamond stroke */
99
- --hud-minimap-player: #ffffff; /* player dot */
100
- --hud-minimap-enemy: #ff5a5a; /* aggressive mob dot */
101
- --hud-minimap-npc: #f4c542; /* interactable / NPC dot */
102
- --hud-minimap-dest: var(--ns-cyan); /* walk-goal diamond */
108
+ --hud-minimap-bg: #091509; /* canvas fill */
109
+ --hud-minimap-edge: #2a4a2a; /* outer diamond stroke */
110
+ --hud-minimap-path: var(--hud-gold); /* paths / points of interest */
111
+ --hud-minimap-player: #ffffff; /* player dot */
112
+ --hud-minimap-enemy: #ff5a5a; /* aggressive mob dot */
113
+ --hud-minimap-npc: #f4c542; /* interactable / NPC dot */
114
+ --hud-minimap-dest: var(--ns-cyan); /* walk-goal diamond */
103
115
 
104
116
  /* ── Geometry ───────────────────────────────────────────────── */
105
- --hud-radius: 4px;
117
+ --hud-radius: 4px;
106
118
  --hud-radius-sm: 2px;
119
+ --hud-grid-overlay: rgba(255, 255, 255, 0.07); /* drag-mode grid line tint */
120
+
121
+ /* ── Scene Builder editor chrome ────────────────────────────── */
122
+ /* Canvas-editing affordances for the HUD composer (resize handles, delete
123
+ buttons, align bar, swatches, ghost, tooltips). Consumed by
124
+ components/scene-builder.css — the source of truth for the editor's look.
125
+ The black-ink shadows below live in tokens (not literals) so every editing
126
+ overlay shares one stroke/ring vocabulary. */
127
+ --hud-edit-handle: 5px; /* resize-handle box */
128
+ --hud-edit-handle-fill: rgb(var(--ns-gold-rgb) / 0.95);
129
+ --hud-edit-handle-ring: 0 0 0 1px rgba(0, 0, 0, 0.6);
130
+ --hud-edit-del: 10px; /* per-element + floating delete */
131
+ --hud-edit-btn: 22px; /* header chrome buttons */
132
+ --hud-edit-toggle-h: 18px; /* grid / hud / bg toggles */
133
+ --hud-edit-ring: rgba(0, 0, 0, 0.5); /* floater & tooltip 1px ring / drop shadow */
134
+ --hud-edit-hover: rgba(255, 255, 255, 0.06); /* subtle chrome hover fill */
135
+ --hud-edit-overlay: rgba(255, 255, 255, 0.1); /* align-button resting fill */
136
+ /* White HUD text over the world: 4-corner pixel stroke (+ soft glow on labels). */
137
+ --hud-edit-stroke:
138
+ -1px -1px 0 rgba(0, 0, 0, 0.92), 1px -1px 0 rgba(0, 0, 0, 0.92), -1px 1px 0 rgba(0, 0, 0, 0.92),
139
+ 1px 1px 0 rgba(0, 0, 0, 0.92), 0 0 4px rgba(0, 0, 0, 0.6);
140
+ --hud-edit-stroke-bar:
141
+ -1px -1px 0 rgba(0, 0, 0, 0.92), 1px -1px 0 rgba(0, 0, 0, 0.92), -1px 1px 0 rgba(0, 0, 0, 0.92),
142
+ 1px 1px 0 rgba(0, 0, 0, 0.92);
107
143
 
108
144
  /* ── Cross-layout geometry (640×360 design space) ───────────── */
109
145
  /* The HUD lives in a 3×3 grid over the 640×360 canvas.
110
146
  Each corner pocket sits inside its cell with 5% padding per axis. */
111
- --hud-cross-cell-w: calc(640px / 3); /* @kind other */ /* 213.33px */
112
- --hud-cross-cell-h: calc(360px / 3); /* @kind other */ /* 120px */
113
- --hud-cross-pad-x: calc(var(--hud-cross-cell-w) * 0.05); /* 10.67px */
147
+ --hud-cross-cell-w: calc(640px / 3); /* @kind other */ /* 213.33px */
148
+ --hud-cross-cell-h: calc(360px / 3); /* @kind other */ /* 120px */
149
+ --hud-cross-pad-x: calc(var(--hud-cross-cell-w) * 0.05); /* 10.67px */
114
150
  /* NOTE: CSS percentage padding always resolves to % of the element WIDTH,
115
151
  so pad-y equals pad-x, not 5% of the cell height. */
116
- --hud-cross-pad-y: calc(var(--hud-cross-cell-w) * 0.05); /* 10.67px — same as pad-x */
117
-
118
- /* ── Inner 8×8 grid cell size (padded pocket ÷ 8) ──────────── */
119
- /* The padded pocket is 90% of the cell (5% pad each side). */
120
- /* Padded inner area: width = cell-w - 2*pad = 192px, height = cell-h - 2*pad = 98.67px */
121
- --hud-grid-cell-w: calc((var(--hud-cross-cell-w) - 2 * var(--hud-cross-pad-x)) / 8); /* @kind spacing */ /* 24px */
122
- --hud-grid-cell-h: calc((var(--hud-cross-cell-h) - 2 * var(--hud-cross-pad-y)) / 8); /* @kind spacing */ /* 12.33px */
123
-
124
- /* ── Minimum interactive element: 2×2 inner grid cells ─────── */
125
- /* No HUD element (button, slot, pip row, icon) may be smaller than this.
126
- Smaller than 2×2 is invisible at a glance and un-tappable on mobile.
127
- At runtime the HUD scales by --hud-scale (~2–3×), so 48×27 design px
128
- maps to ~96×54 real px on a typical phone — the 44px mobile floor. */
129
- /* Interactive elements only buttons, slots, icons, cells.
130
- Passive elements (bars, dividers, borders) are exempt. */
131
- --hud-min-tap-w: calc(var(--hud-grid-cell-w) * 2); /* @kind spacing */ /* 48px */
132
- --hud-min-tap-h: calc(var(--hud-grid-cell-h) * 2); /* @kind spacing */ /* 27px */
152
+ --hud-cross-pad-y: calc(var(--hud-cross-cell-w) * 0.05); /* 10.67px — same as pad-x */
153
+
154
+ /* ── Game canvas & 24×24 drag grid ─────────────────────────── */
155
+ /* Source of truth for the 667×375 HUD canvas and its 24×24 placement grid.
156
+ All HUD element positioning uses grid-column / grid-row spans.
157
+ No element may span fewer than 1 cell on either axis. */
158
+ --hud-canvas-bg: #000; /* outer background behind the game canvas */
159
+ --hud-canvas-w: 667px; /* design canvas width */
160
+ --hud-canvas-h: 375px; /* design canvas height */
161
+ --hud-grid-cols: 24; /* @kind other */
162
+ --hud-grid-rows: 24; /* @kind other */
163
+ --hud-grid-gap: 2px; /* gap between cells */
164
+ /* Cell dimensions (canvas minus gaps, divided by count) */
165
+ --hud-cell-w: calc((667px - 23 * 2px) / 24); /* @kind spacing */ /* ≈27.8px */
166
+ --hud-cell-h: calc((375px - 23 * 2px) / 24); /* @kind spacing */ /* ≈15.6px */
167
+
168
+ /* ── Minimum interactive tap target: 2×2 cells ──────────────── */
169
+ /* No HUD button, slot, or icon may be smaller than this.
170
+ Passive elements (bars, dividers, borders) are exempt.
171
+ At runtime HUD scales ~2–3×, mapping these to ≥44px real px. */
172
+ --hud-min-tap-w: calc(var(--hud-cell-w) * 2); /* @kind spacing */ /* ≈55.6px */
173
+ --hud-min-tap-h: calc(var(--hud-cell-h) * 2); /* @kind spacing */ /* ≈31.2px */
133
174
  }
@@ -1,63 +1,97 @@
1
1
  /* NoobSociety — Motion tokens & keyframes */
2
2
  :root {
3
3
  /* ── Durations ────────────────────────────────────────────── */
4
- --ns-dur-fast: 150ms; /* @kind other */
5
- --ns-dur-base: 200ms; /* @kind other */
6
- --ns-dur-slow: 400ms; /* @kind other */
7
- --ns-dur-xslow: 600ms; /* @kind other */
4
+ --ns-dur-fast: 150ms; /* @kind other */
5
+ --ns-dur-base: 200ms; /* @kind other */
6
+ --ns-dur-slow: 400ms; /* @kind other */
7
+ --ns-dur-xslow: 600ms; /* @kind other */
8
8
 
9
9
  /* ── Easings ──────────────────────────────────────────────── */
10
- --ns-ease-out: ease-out; /* @kind other */
11
- --ns-ease-in-out: ease-in-out; /* @kind other */
12
- --ns-ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1); /* @kind other */
10
+ --ns-ease-out: ease-out; /* @kind other */
11
+ --ns-ease-in-out: ease-in-out; /* @kind other */
12
+ --ns-ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1); /* @kind other */
13
13
 
14
14
  /* ── Transitions (common shorthand) ──────────────────────── */
15
- --ns-transition-fast: var(--ns-dur-fast) var(--ns-ease-out); /* @kind other */
16
- --ns-transition-base: var(--ns-dur-base) var(--ns-ease-out); /* @kind other */
15
+ --ns-transition-fast: var(--ns-dur-fast) var(--ns-ease-out); /* @kind other */
16
+ --ns-transition-base: var(--ns-dur-base) var(--ns-ease-out); /* @kind other */
17
17
  }
18
18
 
19
19
  /* ── Keyframes ────────────────────────────────────────────────── */
20
20
 
21
21
  /* Character idle bob (with centered offset) */
22
22
  @keyframes ns-bob {
23
- 0%, 100% { transform: translateX(-50%) translateY(0); }
24
- 50% { transform: translateX(-50%) translateY(-6px); }
23
+ 0%,
24
+ 100% {
25
+ transform: translateX(-50%) translateY(0);
26
+ }
27
+ 50% {
28
+ transform: translateX(-50%) translateY(-6px);
29
+ }
25
30
  }
26
31
 
27
32
  /* Generic idle bob (no X offset) */
28
33
  @keyframes ns-bob-plain {
29
- 0%, 100% { transform: translateY(0); }
30
- 50% { transform: translateY(-5px); }
34
+ 0%,
35
+ 100% {
36
+ transform: translateY(0);
37
+ }
38
+ 50% {
39
+ transform: translateY(-5px);
40
+ }
31
41
  }
32
42
 
33
43
  /* Pixel text blink (e.g. "Press Start") */
34
44
  @keyframes ns-blink {
35
- 0%, 55% { opacity: 1; }
36
- 56%, 100% { opacity: 0; }
45
+ 0%,
46
+ 55% {
47
+ opacity: 1;
48
+ }
49
+ 56%,
50
+ 100% {
51
+ opacity: 0;
52
+ }
37
53
  }
38
54
 
39
55
  /* Star field twinkle */
40
56
  @keyframes ns-twinkle {
41
- 0%, 100% { opacity: 0.7; }
42
- 50% { opacity: 0.35; }
57
+ 0%,
58
+ 100% {
59
+ opacity: 0.7;
60
+ }
61
+ 50% {
62
+ opacity: 0.35;
63
+ }
43
64
  }
44
65
 
45
66
  /* Section arrow nudge */
46
67
  @keyframes ns-arrow {
47
- 0%, 100% { transform: translateX(-50%) translateY(0); }
48
- 50% { transform: translateX(-50%) translateY(5px); }
68
+ 0%,
69
+ 100% {
70
+ transform: translateX(-50%) translateY(0);
71
+ }
72
+ 50% {
73
+ transform: translateX(-50%) translateY(5px);
74
+ }
49
75
  }
50
76
 
51
77
  /* Live pulse dot */
52
78
  @keyframes ns-live {
53
- 0% { box-shadow: 0 0 0 0 rgba(166, 226, 46, 0.7); }
54
- 70% { box-shadow: 0 0 0 7px rgba(166, 226, 46, 0); }
55
- 100% { box-shadow: 0 0 0 0 rgba(166, 226, 46, 0); }
79
+ 0% {
80
+ box-shadow: 0 0 0 0 rgba(166, 226, 46, 0.7);
81
+ }
82
+ 70% {
83
+ box-shadow: 0 0 0 7px rgba(166, 226, 46, 0);
84
+ }
85
+ 100% {
86
+ box-shadow: 0 0 0 0 rgba(166, 226, 46, 0);
87
+ }
56
88
  }
57
89
 
58
90
  /* Reduced motion: disable all ns animations */
59
91
  @media (prefers-reduced-motion: reduce) {
60
- *, *::before, *::after {
92
+ *,
93
+ *::before,
94
+ *::after {
61
95
  animation: none !important;
62
96
  scroll-behavior: auto !important;
63
97
  }
@@ -4,60 +4,60 @@
4
4
 
5
5
  :root {
6
6
  /* ── Base scale (4px grid, expressed in rem) ──────────────────── */
7
- --ns-space-1: 0.25rem; /* 4px */
8
- --ns-space-2: 0.5rem; /* 8px */
9
- --ns-space-3: 0.75rem; /* 12px */
10
- --ns-space-4: 1rem; /* 16px */
11
- --ns-space-5: 1.25rem; /* 20px */
12
- --ns-space-6: 1.5rem; /* 24px */
13
- --ns-space-7: 1.75rem; /* 28px */
14
- --ns-space-8: 2rem; /* 32px */
15
- --ns-space-10: 2.5rem; /* 40px */
16
- --ns-space-12: 3rem; /* 48px */
17
- --ns-space-14: 3.5rem; /* 56px */
18
- --ns-space-16: 4rem; /* 64px */
19
- --ns-space-20: 5rem; /* 80px */
20
- --ns-space-24: 5.75rem; /* 92px */
7
+ --ns-space-1: 0.25rem; /* 4px */
8
+ --ns-space-2: 0.5rem; /* 8px */
9
+ --ns-space-3: 0.75rem; /* 12px */
10
+ --ns-space-4: 1rem; /* 16px */
11
+ --ns-space-5: 1.25rem; /* 20px */
12
+ --ns-space-6: 1.5rem; /* 24px */
13
+ --ns-space-7: 1.75rem; /* 28px */
14
+ --ns-space-8: 2rem; /* 32px */
15
+ --ns-space-10: 2.5rem; /* 40px */
16
+ --ns-space-12: 3rem; /* 48px */
17
+ --ns-space-14: 3.5rem; /* 56px */
18
+ --ns-space-16: 4rem; /* 64px */
19
+ --ns-space-20: 5rem; /* 80px */
20
+ --ns-space-24: 5.75rem; /* 92px */
21
21
 
22
22
  /* ── Fluid layout tokens (viewport-responsive) ────────────────── */
23
- --ns-fluid-container: clamp(1rem, 4vw, 2rem); /* @kind spacing */
24
- --ns-fluid-section-top: clamp(2.5rem, 8svh, 4rem); /* @kind spacing */
25
- --ns-fluid-section-bottom: clamp(4rem, 10svh, 5.5rem); /* @kind spacing */
26
- --ns-fluid-gap-cards: clamp(0.75rem, 2vw, 1.5rem); /* @kind spacing */
27
- --ns-fluid-card-pad: clamp(1rem, 2vw, 1.25rem); /* @kind spacing */
28
- --ns-fluid-hero-gap: clamp(1.5rem, 4vw, 3rem); /* @kind spacing */
29
- --ns-fluid-footer-gap: clamp(2rem, 5vw, 3rem); /* @kind spacing */
23
+ --ns-fluid-container: clamp(1rem, 4vw, 2rem); /* @kind spacing */
24
+ --ns-fluid-section-top: clamp(2.5rem, 8svh, 4rem); /* @kind spacing */
25
+ --ns-fluid-section-bottom: clamp(4rem, 10svh, 5.5rem); /* @kind spacing */
26
+ --ns-fluid-gap-cards: clamp(0.75rem, 2vw, 1.5rem); /* @kind spacing */
27
+ --ns-fluid-card-pad: clamp(1rem, 2vw, 1.25rem); /* @kind spacing */
28
+ --ns-fluid-hero-gap: clamp(1.5rem, 4vw, 3rem); /* @kind spacing */
29
+ --ns-fluid-footer-gap: clamp(2rem, 5vw, 3rem); /* @kind spacing */
30
30
 
31
31
  /* ── Fixed layout ─────────────────────────────────────────────── */
32
- --ns-container: 1080px;
33
- --ns-header-h: 4rem; /* 64px — sticky header */
34
- --ns-section-min: calc(100svh - var(--ns-header-h));
32
+ --ns-container: 1080px;
33
+ --ns-header-h: 4rem; /* 64px — sticky header */
34
+ --ns-section-min: calc(100svh - var(--ns-header-h));
35
35
 
36
36
  /* ── Radii ────────────────────────────────────────────────────── */
37
- --ns-radius-sm: 0.25rem; /* 4px */
38
- --ns-radius-md: 0.5rem; /* 8px */
39
- --ns-radius-lg: 0.625rem; /* 10px */
40
- --ns-radius-xl: 0.75rem; /* 12px */
41
- --ns-radius-full: 9999px;
37
+ --ns-radius-sm: 0.25rem; /* 4px */
38
+ --ns-radius-md: 0.5rem; /* 8px */
39
+ --ns-radius-lg: 0.625rem; /* 10px */
40
+ --ns-radius-xl: 0.75rem; /* 12px */
41
+ --ns-radius-full: 9999px;
42
42
 
43
43
  /* ── Shadows ──────────────────────────────────────────────────── */
44
- --ns-shadow-card-rest: none;
44
+ --ns-shadow-card-rest: none;
45
45
  --ns-shadow-card-hover: 0 1rem 2.125rem rgba(0, 0, 0, 0.38);
46
- --ns-shadow-modal: 0 1.5rem 3.5rem rgba(0, 0, 0, 0.5);
47
- --ns-shadow-btn: 0 0.1875rem 0 var(--ns-gold-shadow);
48
- --ns-shadow-arrow: 0 0 0 0.25rem rgba(230, 219, 116, 0.12), 0 0.75rem 1.75rem rgba(0, 0, 0, 0.36);
46
+ --ns-shadow-modal: 0 1.5rem 3.5rem rgba(0, 0, 0, 0.5);
47
+ --ns-shadow-btn: 0 0.1875rem 0 var(--ns-gold-shadow);
48
+ --ns-shadow-arrow: 0 0 0 0.25rem rgba(230, 219, 116, 0.12), 0 0.75rem 1.75rem rgba(0, 0, 0, 0.36);
49
49
 
50
50
  /* ── Borders ──────────────────────────────────────────────────── */
51
- --ns-border-card: 1px solid var(--ns-line);
51
+ --ns-border-card: 1px solid var(--ns-line);
52
52
  --ns-border-card-strong: 1px solid var(--ns-line-strong);
53
- --ns-border-gold: 2px solid var(--ns-gold-deep);
53
+ --ns-border-gold: 2px solid var(--ns-gold-deep);
54
54
 
55
55
  /* ── Blur ─────────────────────────────────────────────────────── */
56
- --ns-blur-glass: blur(8px); /* @kind other */
57
- --ns-blur-header: blur(12px); /* @kind other */
56
+ --ns-blur-glass: blur(8px); /* @kind other */
57
+ --ns-blur-header: blur(12px); /* @kind other */
58
58
 
59
59
  /* ── Component sizing ──────────────────────────────────────────── */
60
- --ns-icon-slot: 2.625rem; /* 42px */
60
+ --ns-icon-slot: 2.625rem; /* 42px */
61
61
  --ns-icon-slot-sm: 1.625rem; /* 26px */
62
- --ns-arrow-size: 2.125rem; /* 34px */
62
+ --ns-arrow-size: 2.125rem; /* 34px */
63
63
  }
@@ -1,42 +1,42 @@
1
1
  /* NoobSociety — Typography tokens */
2
2
  :root {
3
3
  /* ── Font families ────────────────────────────────────────── */
4
- --ns-font-body: 'Inter', system-ui, sans-serif;
4
+ --ns-font-body: 'Inter', system-ui, sans-serif;
5
5
  --ns-font-pixel: 'Press Start 2P', system-ui, sans-serif;
6
6
 
7
7
  /* ── Type scale ───────────────────────────────────────────── */
8
- --ns-text-xs: 0.75rem; /* 12px */
9
- --ns-text-sm: 0.875rem; /* 14px */
10
- --ns-text-base: 1rem; /* 16px */
11
- --ns-text-lg: 1.125rem; /* 18px */
12
- --ns-text-xl: 1.25rem; /* 20px */
13
- --ns-text-2xl: 1.5rem; /* 24px */
14
- --ns-text-3xl: 1.875rem; /* 30px */
15
- --ns-text-4xl: 2.25rem; /* 36px */
8
+ --ns-text-xs: 0.75rem; /* 12px */
9
+ --ns-text-sm: 0.875rem; /* 14px */
10
+ --ns-text-base: 1rem; /* 16px */
11
+ --ns-text-lg: 1.125rem; /* 18px */
12
+ --ns-text-xl: 1.25rem; /* 20px */
13
+ --ns-text-2xl: 1.5rem; /* 24px */
14
+ --ns-text-3xl: 1.875rem; /* 30px */
15
+ --ns-text-4xl: 2.25rem; /* 36px */
16
16
 
17
17
  /* ── Pixel font scale ─────────────────────────────────────── */
18
18
  --ns-pixel-2xs: 7px;
19
- --ns-pixel-xs: 8px;
20
- --ns-pixel-sm: 9px;
19
+ --ns-pixel-xs: 8px;
20
+ --ns-pixel-sm: 9px;
21
21
  --ns-pixel-base: 11px;
22
- --ns-pixel-md: 12px;
23
- --ns-pixel-lg: 13px;
24
- --ns-pixel-xl: 1.6rem; /* hero accent title */
22
+ --ns-pixel-md: 12px;
23
+ --ns-pixel-lg: 13px;
24
+ --ns-pixel-xl: 1.6rem; /* hero accent title */
25
25
  --ns-pixel-2xl: clamp(2rem, 1rem + 3vw, 3.5rem); /* @kind other */
26
26
  --ns-title-section: clamp(1.8rem, 1rem + 2vw, 2.4rem); /* @kind other */
27
27
 
28
28
  /* ── Line heights ─────────────────────────────────────────── */
29
- --ns-leading-tight: 1.08;
30
- --ns-leading-snug: 1.35;
29
+ --ns-leading-tight: 1.08;
30
+ --ns-leading-snug: 1.35;
31
31
  --ns-leading-normal: 1.45;
32
32
  --ns-leading-relaxed: 1.6;
33
- --ns-leading-pixel: 1.5; /* for Press Start 2P */
33
+ --ns-leading-pixel: 1.5; /* for Press Start 2P */
34
34
 
35
35
  /* ── Font weights ─────────────────────────────────────────── */
36
- --ns-weight-normal: 400;
37
- --ns-weight-medium: 500;
36
+ --ns-weight-normal: 400;
37
+ --ns-weight-medium: 500;
38
38
  --ns-weight-semibold: 600;
39
- --ns-weight-bold: 700;
39
+ --ns-weight-bold: 700;
40
40
 
41
41
  /* ── Section eyebrow ─────────────────────────────────────────*/
42
42
  /* font: 700 13px/1 var(--ns-font-body); letter-spacing: .18em; text-transform: uppercase; color: var(--ns-gold) */