@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
@@ -0,0 +1,136 @@
1
+ //#region components/shared/constants.ts
2
+ var e = {
3
+ gold: "var(--ns-gold)",
4
+ pink: "var(--ns-pink)",
5
+ purple: "var(--ns-purple)",
6
+ cyan: "var(--ns-cyan)",
7
+ green: "var(--ns-green)",
8
+ orange: "var(--ns-orange)",
9
+ later: "var(--ns-ink-faint)"
10
+ }, t = e, n = {
11
+ done: {
12
+ className: "ns-quest-card--done",
13
+ label: "HOLDS",
14
+ icon: "✓"
15
+ },
16
+ active: {
17
+ className: "ns-quest-card--active",
18
+ label: "BUILDING",
19
+ icon: "▶"
20
+ },
21
+ planned: {
22
+ className: "ns-quest-card--planned",
23
+ label: "PLANNED",
24
+ icon: "◌"
25
+ },
26
+ locked: {
27
+ className: "ns-quest-card--locked",
28
+ label: "LATER",
29
+ icon: "✦"
30
+ }
31
+ }, r = [
32
+ "sword",
33
+ "bow",
34
+ "staff",
35
+ "katar",
36
+ "book",
37
+ "hammer"
38
+ ], i = [
39
+ "neutral",
40
+ "fire",
41
+ "earth",
42
+ "wind",
43
+ "water",
44
+ "light",
45
+ "dark",
46
+ "void"
47
+ ], a = [
48
+ "human",
49
+ "beast",
50
+ "demon",
51
+ "angel",
52
+ "spirit"
53
+ ], o = [
54
+ "small",
55
+ "medium",
56
+ "large"
57
+ ], s = [
58
+ "attack-sword",
59
+ "attack-bow",
60
+ "attack-staff",
61
+ "attack-katar",
62
+ "attack-book",
63
+ "attack-hammer"
64
+ ], c = [
65
+ "passive",
66
+ "active",
67
+ "combo",
68
+ "stance",
69
+ "buff",
70
+ "debuff"
71
+ ], l = [
72
+ "potion",
73
+ "ether",
74
+ "scroll",
75
+ "gem",
76
+ "relic",
77
+ "key"
78
+ ], u = [
79
+ "helm",
80
+ "armor",
81
+ "cloak",
82
+ "shield",
83
+ "ring",
84
+ "greaves"
85
+ ], d = [
86
+ "hat",
87
+ "emblem",
88
+ "cape",
89
+ "badge",
90
+ "boots"
91
+ ], f = [
92
+ "menu",
93
+ "inventory",
94
+ "party",
95
+ "quest",
96
+ "map",
97
+ "shop",
98
+ "settings",
99
+ "save"
100
+ ], p = [
101
+ "emote-tysm",
102
+ "emote-sos",
103
+ "emote-lol",
104
+ "emote-win",
105
+ "emote-lgo",
106
+ "emote-ugh",
107
+ "emote-myb",
108
+ "emote-wut",
109
+ "emote-grr"
110
+ ], m = {
111
+ weapons: r,
112
+ elements: i,
113
+ races: a,
114
+ sizes: o,
115
+ attack: s,
116
+ skills: c,
117
+ items: l,
118
+ equip: u,
119
+ skins: d,
120
+ menu: f,
121
+ emotes: p
122
+ }, h = [
123
+ ...r,
124
+ ...i,
125
+ ...a,
126
+ ...o,
127
+ ...s,
128
+ ...c,
129
+ ...l,
130
+ ...u,
131
+ ...d,
132
+ ...f,
133
+ ...p
134
+ ];
135
+ //#endregion
136
+ export { m as a, h as c, c as d, r as f, n as h, u as i, a as l, e as m, i as n, l as o, t as p, p as r, f as s, s as t, o as u };
@@ -0,0 +1 @@
1
+ var e={gold:`var(--ns-gold)`,pink:`var(--ns-pink)`,purple:`var(--ns-purple)`,cyan:`var(--ns-cyan)`,green:`var(--ns-green)`,orange:`var(--ns-orange)`,later:`var(--ns-ink-faint)`},t=e,n={done:{className:`ns-quest-card--done`,label:`HOLDS`,icon:`✓`},active:{className:`ns-quest-card--active`,label:`BUILDING`,icon:`▶`},planned:{className:`ns-quest-card--planned`,label:`PLANNED`,icon:`◌`},locked:{className:`ns-quest-card--locked`,label:`LATER`,icon:`✦`}},r=[`sword`,`bow`,`staff`,`katar`,`book`,`hammer`],i=[`neutral`,`fire`,`earth`,`wind`,`water`,`light`,`dark`,`void`],a=[`human`,`beast`,`demon`,`angel`,`spirit`],o=[`small`,`medium`,`large`],s=[`attack-sword`,`attack-bow`,`attack-staff`,`attack-katar`,`attack-book`,`attack-hammer`],c=[`passive`,`active`,`combo`,`stance`,`buff`,`debuff`],l=[`potion`,`ether`,`scroll`,`gem`,`relic`,`key`],u=[`helm`,`armor`,`cloak`,`shield`,`ring`,`greaves`],d=[`hat`,`emblem`,`cape`,`badge`,`boots`],f=[`menu`,`inventory`,`party`,`quest`,`map`,`shop`,`settings`,`save`],p=[`emote-tysm`,`emote-sos`,`emote-lol`,`emote-win`,`emote-lgo`,`emote-ugh`,`emote-myb`,`emote-wut`,`emote-grr`],m={weapons:r,elements:i,races:a,sizes:o,attack:s,skills:c,items:l,equip:u,skins:d,menu:f,emotes:p},h=[...r,...i,...a,...o,...s,...c,...l,...u,...d,...f,...p];Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,"h",{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,"m",{enumerable:!0,get:function(){return e}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,"p",{enumerable:!0,get:function(){return t}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return o}});
package/dist/styles.css CHANGED
@@ -11,3 +11,4 @@
11
11
  @import './tokens/hud.css';
12
12
  @import './tokens/base.css';
13
13
  @import './components/primitives.css';
14
+ @import './components/hud-editor.css';
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ // Package preset: consumers provide their own `content` globs.
3
+ const nsdsPreset = {
4
+ darkMode: ['class', '[data-theme="dark"]'],
5
+ theme: {
6
+ extend: {
7
+ colors: {
8
+ ns: {
9
+ bg: {
10
+ 0: 'var(--ns-bg-0)',
11
+ 1: 'var(--ns-bg-1)',
12
+ 2: 'var(--ns-bg-2)',
13
+ glass: 'var(--ns-glass)',
14
+ },
15
+ ink: {
16
+ DEFAULT: 'var(--ns-ink)',
17
+ dim: 'var(--ns-ink-dim)',
18
+ faint: 'var(--ns-ink-faint)',
19
+ },
20
+ gold: {
21
+ DEFAULT: 'var(--ns-gold)',
22
+ pale: 'var(--ns-gold-pale)',
23
+ deep: 'var(--ns-gold-deep)',
24
+ shadow: 'var(--ns-gold-shadow)',
25
+ fg: 'var(--ns-gold-btn-fg)',
26
+ },
27
+ green: 'var(--ns-green)',
28
+ cyan: 'var(--ns-cyan)',
29
+ orange: 'var(--ns-orange)',
30
+ pink: 'var(--ns-pink)',
31
+ purple: 'var(--ns-purple)',
32
+ accent: 'var(--ns-accent)',
33
+ line: 'var(--ns-line)',
34
+ },
35
+ },
36
+ fontFamily: {
37
+ body: 'var(--ns-font-body)',
38
+ pixel: 'var(--ns-font-pixel)',
39
+ },
40
+ fontSize: {
41
+ 'ns-xs': ['var(--ns-text-xs)', { lineHeight: 'var(--ns-leading-normal)' }],
42
+ 'ns-sm': ['var(--ns-text-sm)', { lineHeight: 'var(--ns-leading-normal)' }],
43
+ 'ns-base': ['var(--ns-text-base)', { lineHeight: 'var(--ns-leading-normal)' }],
44
+ 'ns-lg': ['var(--ns-text-lg)', { lineHeight: 'var(--ns-leading-snug)' }],
45
+ 'ns-xl': ['var(--ns-text-xl)', { lineHeight: 'var(--ns-leading-snug)' }],
46
+ 'ns-2xl': ['var(--ns-text-2xl)', { lineHeight: 'var(--ns-leading-tight)' }],
47
+ 'ns-3xl': ['var(--ns-text-3xl)', { lineHeight: 'var(--ns-leading-tight)' }],
48
+ 'ns-4xl': ['var(--ns-text-4xl)', { lineHeight: 'var(--ns-leading-tight)' }],
49
+ },
50
+ fontWeight: {
51
+ 'ns-normal': 'var(--ns-weight-normal)',
52
+ 'ns-medium': 'var(--ns-weight-medium)',
53
+ 'ns-semibold': 'var(--ns-weight-semibold)',
54
+ 'ns-bold': 'var(--ns-weight-bold)',
55
+ },
56
+ lineHeight: {
57
+ 'ns-tight': 'var(--ns-leading-tight)',
58
+ 'ns-snug': 'var(--ns-leading-snug)',
59
+ 'ns-normal': 'var(--ns-leading-normal)',
60
+ 'ns-relaxed': 'var(--ns-leading-relaxed)',
61
+ },
62
+ spacing: {
63
+ 'ns-1': 'var(--ns-space-1)',
64
+ 'ns-2': 'var(--ns-space-2)',
65
+ 'ns-3': 'var(--ns-space-3)',
66
+ 'ns-4': 'var(--ns-space-4)',
67
+ 'ns-5': 'var(--ns-space-5)',
68
+ 'ns-6': 'var(--ns-space-6)',
69
+ 'ns-8': 'var(--ns-space-8)',
70
+ 'ns-10': 'var(--ns-space-10)',
71
+ 'ns-12': 'var(--ns-space-12)',
72
+ 'ns-16': 'var(--ns-space-16)',
73
+ 'ns-20': 'var(--ns-space-20)',
74
+ },
75
+ maxWidth: {
76
+ 'ns-container': 'var(--ns-container)',
77
+ },
78
+ height: {
79
+ 'ns-header': 'var(--ns-header-h)',
80
+ },
81
+ borderRadius: {
82
+ 'ns-sm': 'var(--ns-radius-sm)',
83
+ 'ns-md': 'var(--ns-radius-md)',
84
+ 'ns-lg': 'var(--ns-radius-lg)',
85
+ 'ns-xl': 'var(--ns-radius-xl)',
86
+ 'ns-full': 'var(--ns-radius-full)',
87
+ },
88
+ boxShadow: {
89
+ 'ns-card-hover': 'var(--ns-shadow-card-hover)',
90
+ 'ns-btn': 'var(--ns-shadow-btn)',
91
+ },
92
+ transitionDuration: {
93
+ 'ns-fast': 'var(--ns-dur-fast)',
94
+ 'ns-base': 'var(--ns-dur-base)',
95
+ 'ns-slow': 'var(--ns-dur-slow)',
96
+ },
97
+ transitionTimingFunction: {
98
+ 'ns-out': 'var(--ns-ease-out)',
99
+ 'ns-spring': 'var(--ns-ease-spring)',
100
+ },
101
+ ringColor: {
102
+ 'ns-focus': 'var(--ns-focus-ring)',
103
+ },
104
+ },
105
+ },
106
+ plugins: [],
107
+ };
108
+ module.exports = nsdsPreset;
@@ -1,4 +1,4 @@
1
1
  import type { Config } from 'tailwindcss';
2
-
3
- declare const preset: Config;
4
- export = preset;
2
+ type TailwindPreset = Omit<Config, 'content'>;
3
+ declare const nsdsPreset: TailwindPreset;
4
+ export = nsdsPreset;
@@ -1,5 +1,9 @@
1
1
  /* NoobSociety — Base resets and body defaults */
2
- *, *::before, *::after { box-sizing: border-box; }
2
+ *,
3
+ *::before,
4
+ *::after {
5
+ box-sizing: border-box;
6
+ }
3
7
 
4
8
  html {
5
9
  scroll-behavior: smooth;
@@ -23,9 +27,18 @@ body {
23
27
  text-rendering: optimizeLegibility;
24
28
  }
25
29
 
26
- img { display: block; max-width: 100%; }
27
- a { color: var(--ns-gold); text-decoration: none; transition: color var(--ns-transition-fast); }
28
- a:hover { color: var(--ns-gold-pale); }
30
+ img {
31
+ display: block;
32
+ max-width: 100%;
33
+ }
34
+ a {
35
+ color: var(--ns-gold);
36
+ text-decoration: none;
37
+ transition: color var(--ns-transition-fast);
38
+ }
39
+ a:hover {
40
+ color: var(--ns-gold-pale);
41
+ }
29
42
 
30
43
  button,
31
44
  input,
@@ -1,79 +1,83 @@
1
1
  /* NoobSociety — Color tokens (Monokai dark) */
2
2
  :root {
3
3
  /* ── Surfaces ─────────────────────────────────────────────── */
4
- --ns-bg-0: #1a1a16; /* deepest — footer, sidebar */
5
- --ns-bg-1: #272822; /* page base */
6
- --ns-bg-2: #32332b; /* raised surfaces, icon slots */
7
- --ns-glass: rgba(30, 31, 26, 0.88); /* card, header backdrop */
8
- --ns-glass-2: rgba(30, 31, 26, 0.60); /* lighter glass */
4
+ --ns-bg-0: #1a1a16; /* deepest — footer, sidebar */
5
+ --ns-bg-1: #272822; /* page base */
6
+ --ns-bg-2: #32332b; /* raised surfaces, icon slots */
7
+ --ns-glass: rgba(30, 31, 26, 0.88); /* card, header backdrop */
8
+ --ns-glass-2: rgba(30, 31, 26, 0.6); /* lighter glass */
9
9
  --ns-glass-soft: rgba(30, 31, 26, 0.75); /* subtle card surface */
10
10
 
11
- --ns-bg-0-rgb: 26 26 22; /* @kind other */
12
- --ns-bg-1-rgb: 39 40 34; /* @kind other */
13
- --ns-bg-2-rgb: 50 51 43; /* @kind other */
14
- --ns-glass-rgb: 30 31 26; /* @kind other */
11
+ --ns-bg-0-rgb: 26 26 22; /* @kind other */
12
+ --ns-bg-1-rgb: 39 40 34; /* @kind other */
13
+ --ns-bg-2-rgb: 50 51 43; /* @kind other */
14
+ --ns-glass-rgb: 30 31 26; /* @kind other */
15
15
 
16
16
  /* ── Borders ──────────────────────────────────────────────── */
17
- --ns-line: rgba(255, 255, 255, 0.12);
17
+ --ns-line: rgba(255, 255, 255, 0.12);
18
18
  --ns-line-strong: rgba(255, 255, 255, 0.22);
19
- --ns-line-soft: rgba(255, 255, 255, 0.08);
19
+ --ns-line-soft: rgba(255, 255, 255, 0.08);
20
20
 
21
21
  /* ── Ink (text) ───────────────────────────────────────────── */
22
- --ns-ink: #f8f8f2; /* primary text — Monokai foreground */
23
- --ns-ink-dim: #a8a28c; /* secondary text */
24
- --ns-ink-faint: #75715e; /* placeholder, captions — Monokai comment */
25
- --ns-ink-rgb: 248 248 242; /* @kind other */
26
- --ns-ink-dim-rgb: 168 162 140; /* @kind other */
27
- --ns-ink-faint-rgb: 117 113 94; /* @kind other */
22
+ --ns-ink: #f8f8f2; /* primary text — Monokai foreground */
23
+ --ns-ink-dim: #a8a28c; /* secondary text */
24
+ --ns-ink-faint: #75715e; /* placeholder, captions — Monokai comment */
25
+ --ns-ink-rgb: 248 248 242; /* @kind other */
26
+ --ns-ink-dim-rgb: 168 162 140; /* @kind other */
27
+ --ns-ink-faint-rgb: 117 113 94; /* @kind other */
28
28
 
29
29
  /* ── Brand yellow (gold) — primary accent ─────────────────── */
30
- --ns-gold: #e6db74;
31
- --ns-gold-pale: #f4f099;
32
- --ns-gold-deep: #cabb50;
30
+ --ns-gold: #e6db74;
31
+ --ns-gold-pale: #f4f099;
32
+ --ns-gold-deep: #cabb50;
33
33
  --ns-gold-shadow: #b5a83f;
34
34
  --ns-gold-btn-fg: #1c1c17; /* text on gold buttons */
35
- --ns-gold-rgb: 230 219 116; /* @kind other */
36
- --ns-gold-pale-rgb: 244 240 153; /* @kind other */
37
- --ns-gold-deep-rgb: 202 187 80; /* @kind other */
38
- --ns-gold-shadow-rgb: 181 168 63; /* @kind other */
35
+ --ns-gold-rgb: 230 219 116; /* @kind other */
36
+ --ns-gold-pale-rgb: 244 240 153; /* @kind other */
37
+ --ns-gold-deep-rgb: 202 187 80; /* @kind other */
38
+ --ns-gold-shadow-rgb: 181 168 63; /* @kind other */
39
39
 
40
40
  /* ── Monokai semantic accents ─────────────────────────────── */
41
- --ns-green: #a6e22e; /* "Holds" / success */
42
- --ns-green-deep: #7fb81e;
43
- --ns-cyan: #66d9e8; /* "Planned" / info */
44
- --ns-cyan-deep: #5bc8d7;
45
- --ns-orange: #fd971f; /* "Building" / in-progress */
41
+ --ns-green: #a6e22e; /* "Holds" / success */
42
+ --ns-green-deep: #7fb81e;
43
+ --ns-cyan: #66d9e8; /* "Planned" / info */
44
+ --ns-cyan-deep: #5bc8d7;
45
+ --ns-orange: #fd971f; /* "Building" / in-progress */
46
46
  --ns-orange-deep: #c96f00;
47
- --ns-pink: #f92672; /* danger / highlight */
48
- --ns-purple: #ae81ff; /* decorative */
49
- --ns-green-rgb: 166 226 46; /* @kind other */
50
- --ns-green-deep-rgb: 127 184 30; /* @kind other */
51
- --ns-cyan-rgb: 102 217 232; /* @kind other */
52
- --ns-cyan-deep-rgb: 91 200 215; /* @kind other */
53
- --ns-orange-rgb: 253 151 31; /* @kind other */
54
- --ns-orange-deep-rgb: 201 111 0; /* @kind other */
55
- --ns-pink-rgb: 249 38 114; /* @kind other */
56
- --ns-purple-rgb: 174 129 255; /* @kind other */
47
+ --ns-pink: #f92672; /* danger / highlight */
48
+ --ns-purple: #ae81ff; /* decorative */
49
+ --ns-green-rgb: 166 226 46; /* @kind other */
50
+ --ns-green-deep-rgb: 127 184 30; /* @kind other */
51
+ --ns-cyan-rgb: 102 217 232; /* @kind other */
52
+ --ns-cyan-deep-rgb: 91 200 215; /* @kind other */
53
+ --ns-orange-rgb: 253 151 31; /* @kind other */
54
+ --ns-orange-deep-rgb: 201 111 0; /* @kind other */
55
+ --ns-pink-rgb: 249 38 114; /* @kind other */
56
+ --ns-purple-rgb: 174 129 255; /* @kind other */
57
57
 
58
58
  /* ── Semantic aliases ─────────────────────────────────────── */
59
- --ns-surface-page: var(--ns-bg-1);
60
- --ns-surface-card: var(--ns-glass);
59
+ --ns-surface-page: var(--ns-bg-1);
60
+ --ns-surface-card: var(--ns-glass);
61
61
  --ns-surface-raised: var(--ns-bg-2);
62
- --ns-text-primary: var(--ns-ink);
62
+ --ns-text-primary: var(--ns-ink);
63
63
  --ns-text-secondary: var(--ns-ink-dim);
64
- --ns-text-muted: var(--ns-ink-faint);
65
- --ns-accent: var(--ns-gold);
66
- --ns-accent-hover: var(--ns-gold-pale);
67
- --ns-status-holds: var(--ns-green);
64
+ --ns-text-muted: var(--ns-ink-faint);
65
+ --ns-accent: var(--ns-gold);
66
+ --ns-accent-hover: var(--ns-gold-pale);
67
+ --ns-status-holds: var(--ns-green);
68
68
  --ns-status-building: var(--ns-orange);
69
- --ns-status-planned: var(--ns-cyan);
70
- --ns-status-later: var(--ns-ink-faint);
69
+ --ns-status-planned: var(--ns-cyan);
70
+ --ns-status-later: var(--ns-ink-faint);
71
71
 
72
72
  /* ── Quest card status pill backgrounds ──────────────────────── */
73
- --ns-quest-pill-done: rgba(166, 226, 46, 0.10);
74
- --ns-quest-pill-active: rgba(253, 151, 31, 0.12);
73
+ --ns-quest-pill-done: rgba(166, 226, 46, 0.1);
74
+ --ns-quest-pill-active: rgba(253, 151, 31, 0.12);
75
75
  --ns-quest-pill-planned: rgba(102, 217, 232, 0.12);
76
- --ns-quest-pill-locked: rgba(255, 255, 255, 0.05);
77
- --ns-focus-ring: rgba(230, 219, 116, 0.35);
78
- --ns-selection-bg: rgba(249, 38, 114, 0.28);
76
+ --ns-quest-pill-locked: rgba(255, 255, 255, 0.05);
77
+ --ns-focus-ring: rgba(230, 219, 116, 0.35);
78
+ --ns-selection-bg: rgba(249, 38, 114, 0.28);
79
+
80
+ /* ── Quest card component variables (overridden per-status in primitives) ── */
81
+ --ns-quest-color: var(--ns-status-later); /* default: locked/later */
82
+ --ns-quest-pill-bg: var(--ns-quest-pill-locked); /* default: locked */
79
83
  }