@noobsociety/nsds 0.3.1 → 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.
- package/CHANGELOG.md +34 -1
- package/CONTRIBUTING.md +43 -2
- package/README.md +87 -36
- package/SECURITY.md +38 -4
- package/dist/client/index.cjs +1 -0
- package/dist/client/index.d.cts +6 -0
- package/dist/client/index.d.ts +6 -0
- package/dist/client/index.js +5 -0
- package/dist/components/_card-base.css +99 -0
- package/dist/components/hud/HUDBar.d.ts +16 -3
- package/dist/components/hud/HUDChat.d.ts +26 -0
- package/dist/components/hud/HUDJoystick.d.ts +21 -0
- package/dist/components/hud/HUDMinimap.d.ts +14 -0
- package/dist/components/hud/HUDPanel.d.ts +25 -0
- package/dist/components/hud/HUDTabWindow.d.ts +37 -0
- package/dist/components/hud-editor.css +197 -0
- package/dist/components/icons/RPGIcon.d.ts +15 -11
- package/dist/components/icons/registry.d.ts +37 -0
- package/dist/components/primitives.css +50 -20
- package/dist/components/react/index.d.ts +12 -2
- package/dist/components/scene-builder.css +740 -0
- package/dist/components/scene-builder.js +3039 -0
- package/dist/components/shared/constants.d.ts +41 -0
- package/dist/components/shared/styles.d.ts +1 -42
- package/dist/index.cjs +1 -1
- package/dist/index.js +6173 -1821
- package/dist/registry-BizUEm6W.js +136 -0
- package/dist/registry-Cyq-qspU.cjs +1 -0
- package/dist/styles.css +1 -0
- package/dist/tokens/base.css +17 -4
- package/dist/tokens/colors.css +57 -53
- package/dist/tokens/hud.css +119 -78
- package/dist/tokens/motion.css +57 -23
- package/dist/tokens/spacing.css +39 -39
- package/dist/tokens/typography.css +20 -20
- package/package.json +37 -8
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type ReactElement, type ReactNode } from 'react';
|
|
2
|
+
import type { NSStyle } from '../shared/styles.js';
|
|
3
|
+
export interface HUDTab {
|
|
4
|
+
/** Unique identifier */
|
|
5
|
+
id: string;
|
|
6
|
+
/** Tab button label */
|
|
7
|
+
label: string;
|
|
8
|
+
/** Content rendered in the panel when this tab is active */
|
|
9
|
+
content?: ReactNode;
|
|
10
|
+
}
|
|
11
|
+
export interface HUDTabWindowProps {
|
|
12
|
+
/** Tab definitions */
|
|
13
|
+
tabs?: HUDTab[];
|
|
14
|
+
/** ID of the initially-active tab. Defaults to the first tab. */
|
|
15
|
+
defaultTab?: string;
|
|
16
|
+
/** Tab bar height in px. 1 grid cell ≈ 14 px. */
|
|
17
|
+
tabHeight?: number;
|
|
18
|
+
/**
|
|
19
|
+
* Minimum tab button width in px.
|
|
20
|
+
* Defaults to 48 px — two grid cells, the narrowest comfortably-readable
|
|
21
|
+
* tab label at HUD scale.
|
|
22
|
+
*/
|
|
23
|
+
tabMinWidth?: number;
|
|
24
|
+
/** Label font size in px */
|
|
25
|
+
tabFontSize?: number;
|
|
26
|
+
/** Horizontal alignment of tab buttons within the tab bar */
|
|
27
|
+
tabAlign?: 'left' | 'center' | 'right';
|
|
28
|
+
style?: NSStyle;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* HUDTabWindow — a resizable tabbed panel container.
|
|
32
|
+
*
|
|
33
|
+
* Each tab is at minimum 48 px (two grid cells) wide and 1 grid cell tall.
|
|
34
|
+
* The window fills its parent; size it with the surrounding grid.
|
|
35
|
+
* Pass `content` on each tab to render any HUD element inside.
|
|
36
|
+
*/
|
|
37
|
+
export declare function HUDTabWindow({ tabs, defaultTab, tabHeight, tabMinWidth, tabFontSize, tabAlign, style, }: HUDTabWindowProps): ReactElement;
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/* NoobSociety — In-game HUD editor chrome.
|
|
2
|
+
Toolbar, category tabs and the draggable element palette used by the
|
|
3
|
+
HUD Builder. Token-driven (no literals); import through styles.css.
|
|
4
|
+
Pairs with the 24×24 placement grid defined in tokens/hud.css. */
|
|
5
|
+
|
|
6
|
+
/* ── Rail container ─────────────────────────────────────────────── */
|
|
7
|
+
.ns-hud-panel {
|
|
8
|
+
display: flex;
|
|
9
|
+
flex-direction: column;
|
|
10
|
+
height: 100%;
|
|
11
|
+
min-height: 0;
|
|
12
|
+
background: var(--ns-bg-1);
|
|
13
|
+
border-left: 1px solid var(--ns-line);
|
|
14
|
+
color: var(--ns-ink);
|
|
15
|
+
font-family: var(--hud-font-ui);
|
|
16
|
+
overflow: hidden;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.ns-hud-panel__head {
|
|
20
|
+
display: flex;
|
|
21
|
+
align-items: center;
|
|
22
|
+
gap: var(--ns-space-2);
|
|
23
|
+
padding: var(--ns-space-3);
|
|
24
|
+
background: var(--ns-bg-0);
|
|
25
|
+
border-bottom: 1px solid var(--ns-line-soft);
|
|
26
|
+
flex-shrink: 0;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/* ── Pixel eyebrow / section label ──────────────────────────────── */
|
|
30
|
+
.ns-hud-eyebrow {
|
|
31
|
+
margin: 0;
|
|
32
|
+
color: var(--ns-gold);
|
|
33
|
+
font-family: var(--hud-font);
|
|
34
|
+
font-size: var(--hud-text-md);
|
|
35
|
+
line-height: 1;
|
|
36
|
+
letter-spacing: 0.16em;
|
|
37
|
+
text-transform: uppercase;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.ns-hud-eyebrow--muted {
|
|
41
|
+
color: var(--ns-ink-faint);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/* ── Toolbar ────────────────────────────────────────────────────── */
|
|
45
|
+
.ns-hud-toolbar {
|
|
46
|
+
display: flex;
|
|
47
|
+
gap: var(--ns-space-2);
|
|
48
|
+
padding: var(--ns-space-3);
|
|
49
|
+
flex-shrink: 0;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.ns-hud-tool {
|
|
53
|
+
flex: 1;
|
|
54
|
+
min-height: var(--hud-min-tap-h);
|
|
55
|
+
display: inline-flex;
|
|
56
|
+
align-items: center;
|
|
57
|
+
justify-content: center;
|
|
58
|
+
padding: var(--ns-space-2);
|
|
59
|
+
color: var(--ns-ink-dim);
|
|
60
|
+
background: var(--ns-bg-2);
|
|
61
|
+
border: 1px solid var(--ns-line);
|
|
62
|
+
border-radius: var(--hud-radius-sm);
|
|
63
|
+
font-family: var(--hud-font);
|
|
64
|
+
font-size: var(--hud-text-lg);
|
|
65
|
+
letter-spacing: 0.08em;
|
|
66
|
+
line-height: 1;
|
|
67
|
+
cursor: pointer;
|
|
68
|
+
transition:
|
|
69
|
+
color var(--ns-transition-fast),
|
|
70
|
+
background-color var(--ns-transition-fast),
|
|
71
|
+
border-color var(--ns-transition-fast);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.ns-hud-tool:hover {
|
|
75
|
+
color: var(--ns-ink);
|
|
76
|
+
border-color: var(--ns-line-strong);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.ns-hud-tool.is-on {
|
|
80
|
+
color: var(--ns-gold-btn-fg);
|
|
81
|
+
background: var(--ns-gold);
|
|
82
|
+
border-color: var(--ns-gold-deep);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.ns-hud-tool:active {
|
|
86
|
+
transform: translateY(1px);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/* ── Divider ────────────────────────────────────────────────────── */
|
|
90
|
+
.ns-hud-divider {
|
|
91
|
+
height: 1px;
|
|
92
|
+
margin-inline: var(--ns-space-3);
|
|
93
|
+
background: var(--ns-line-soft);
|
|
94
|
+
flex-shrink: 0;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/* ── Palette section ────────────────────────────────────────────── */
|
|
98
|
+
.ns-hud-section {
|
|
99
|
+
display: flex;
|
|
100
|
+
flex-direction: column;
|
|
101
|
+
gap: var(--ns-space-2);
|
|
102
|
+
padding: var(--ns-space-3);
|
|
103
|
+
flex: 1;
|
|
104
|
+
min-height: 0;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.ns-hud-tabs {
|
|
108
|
+
display: flex;
|
|
109
|
+
flex-wrap: wrap;
|
|
110
|
+
gap: var(--ns-space-1);
|
|
111
|
+
flex-shrink: 0;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.ns-hud-tab {
|
|
115
|
+
padding: var(--ns-space-1) 0.375rem;
|
|
116
|
+
color: var(--ns-ink-faint);
|
|
117
|
+
background: transparent;
|
|
118
|
+
border: 1px solid transparent;
|
|
119
|
+
border-radius: var(--hud-radius-sm);
|
|
120
|
+
font-family: var(--hud-font);
|
|
121
|
+
font-size: var(--hud-text-md);
|
|
122
|
+
letter-spacing: 0.04em;
|
|
123
|
+
line-height: 1;
|
|
124
|
+
cursor: pointer;
|
|
125
|
+
transition:
|
|
126
|
+
color var(--ns-transition-fast),
|
|
127
|
+
background-color var(--ns-transition-fast),
|
|
128
|
+
border-color var(--ns-transition-fast);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
.ns-hud-tab:hover {
|
|
132
|
+
color: var(--ns-ink-dim);
|
|
133
|
+
background: var(--ns-line-soft);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.ns-hud-tab.is-active {
|
|
137
|
+
color: var(--ns-gold);
|
|
138
|
+
background: color-mix(in srgb, var(--ns-gold) 10%, transparent);
|
|
139
|
+
border-color: color-mix(in srgb, var(--ns-gold) 30%, transparent);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/* ── Element grid ───────────────────────────────────────────────── */
|
|
143
|
+
.ns-hud-palette {
|
|
144
|
+
display: flex;
|
|
145
|
+
flex-wrap: wrap;
|
|
146
|
+
align-content: flex-start;
|
|
147
|
+
gap: var(--ns-space-2);
|
|
148
|
+
padding-top: var(--ns-space-1);
|
|
149
|
+
flex: 1;
|
|
150
|
+
min-height: 0;
|
|
151
|
+
overflow-y: auto;
|
|
152
|
+
scrollbar-width: thin;
|
|
153
|
+
scrollbar-color: var(--ns-line-strong) transparent;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.ns-hud-slot {
|
|
157
|
+
display: inline-flex;
|
|
158
|
+
align-items: center;
|
|
159
|
+
justify-content: center;
|
|
160
|
+
width: var(--ns-icon-slot-sm);
|
|
161
|
+
height: var(--ns-icon-slot-sm);
|
|
162
|
+
color: var(--ns-gold);
|
|
163
|
+
background: var(--ns-bg-2);
|
|
164
|
+
border: 1px solid transparent;
|
|
165
|
+
border-radius: var(--hud-radius-sm);
|
|
166
|
+
cursor: grab;
|
|
167
|
+
flex: 0 0 auto;
|
|
168
|
+
transition:
|
|
169
|
+
border-color var(--ns-transition-fast),
|
|
170
|
+
background-color var(--ns-transition-fast);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.ns-hud-slot:hover {
|
|
174
|
+
border-color: color-mix(in srgb, var(--ns-gold) 55%, transparent);
|
|
175
|
+
background: var(--ns-bg-0);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
.ns-hud-slot:active {
|
|
179
|
+
cursor: grabbing;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
.ns-hud-slot svg {
|
|
183
|
+
width: 16px;
|
|
184
|
+
height: 16px;
|
|
185
|
+
image-rendering: pixelated;
|
|
186
|
+
display: block;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
.ns-hud-hint {
|
|
190
|
+
flex-basis: 100%;
|
|
191
|
+
margin-top: var(--ns-space-1);
|
|
192
|
+
color: var(--ns-ink-faint);
|
|
193
|
+
font-family: var(--hud-font);
|
|
194
|
+
font-size: var(--hud-text-xs);
|
|
195
|
+
letter-spacing: 0.04em;
|
|
196
|
+
line-height: var(--ns-leading-pixel);
|
|
197
|
+
}
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
import type { CSSProperties, ReactElement } from 'react';
|
|
2
|
-
|
|
3
|
-
export type
|
|
4
|
-
export type RPGIconRace = 'human' | 'beast' | 'demon' | 'angel' | 'spirit';
|
|
5
|
-
export type RPGIconSize = 'small' | 'medium' | 'large';
|
|
6
|
-
export type RPGIconName = RPGIconWeapon | RPGIconElement | RPGIconRace | RPGIconSize;
|
|
2
|
+
import type { RPGIconName } from './registry.js';
|
|
3
|
+
export type { RPGIconAttack, RPGIconElement, RPGIconEmote, RPGIconEquip, RPGIconItem, RPGIconMenu, RPGIconName, RPGIconRace, RPGIconSize, RPGIconSkin, RPGIconWeapon, } from './registry.js';
|
|
7
4
|
export interface RPGIconProps {
|
|
8
|
-
/** Icon name across
|
|
5
|
+
/** Icon name across all eleven groups (weapons, elements, races, sizes, attack, skills, items, equip, skins, menu, emotes). */
|
|
9
6
|
name?: RPGIconName;
|
|
10
7
|
/** Rendered size in px. */
|
|
11
8
|
size?: number;
|
|
@@ -13,17 +10,24 @@ export interface RPGIconProps {
|
|
|
13
10
|
}
|
|
14
11
|
export declare const icons: RPGIconName[];
|
|
15
12
|
/**
|
|
16
|
-
* RPGIcon —
|
|
13
|
+
* RPGIcon — 68 original pixel-art icons across 11 groups.
|
|
17
14
|
*
|
|
18
|
-
* Weapons (6): sword ·
|
|
19
|
-
* Elements (8): neutral · earth · wind · water ·
|
|
15
|
+
* Weapons (6): sword · bow · staff · katar · book · hammer
|
|
16
|
+
* Elements (8): neutral · fire · earth · wind · water · light · dark · void
|
|
20
17
|
* Races (5): human · beast · demon · angel · spirit
|
|
21
18
|
* Sizes (3): small · medium · large
|
|
19
|
+
* Attack (6): attack-sword · attack-bow · attack-staff · attack-katar · attack-book · attack-hammer
|
|
20
|
+
* Skills (6): passive · active · combo · stance · buff · debuff
|
|
21
|
+
* Items (6): potion · ether · scroll · gem · relic · key
|
|
22
|
+
* Equip (6): helm · armor · cloak · shield · ring · greaves
|
|
23
|
+
* Skins (5): hat · emblem · cape · badge · boots
|
|
24
|
+
* Menu (8): menu · inventory · party · quest · map · shop · settings · save
|
|
25
|
+
* Emotes (9): emote-tysm · emote-sos · emote-lol · emote-win · emote-lgo · emote-ugh · emote-myb · emote-wut · emote-grr
|
|
22
26
|
*/
|
|
23
|
-
export declare const RPGIcon: (({ name, size, style
|
|
27
|
+
export declare const RPGIcon: (({ name, size, style }: RPGIconProps) => ReactElement) & {
|
|
24
28
|
icons: RPGIconName[];
|
|
25
29
|
};
|
|
26
30
|
/** @deprecated Use RPGIcon — kept for backward compatibility */
|
|
27
|
-
export declare const HUDIcon: (({ name, size, style
|
|
31
|
+
export declare const HUDIcon: (({ name, size, style }: RPGIconProps) => ReactElement) & {
|
|
28
32
|
icons: RPGIconName[];
|
|
29
33
|
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export type RPGIconWeapon = 'sword' | 'bow' | 'staff' | 'katar' | 'book' | 'hammer';
|
|
2
|
+
export type RPGIconElement = 'neutral' | 'fire' | 'earth' | 'wind' | 'water' | 'light' | 'dark' | 'void';
|
|
3
|
+
export type RPGIconRace = 'human' | 'beast' | 'demon' | 'angel' | 'spirit';
|
|
4
|
+
export type RPGIconSize = 'small' | 'medium' | 'large';
|
|
5
|
+
export type RPGIconAttack = 'attack-sword' | 'attack-bow' | 'attack-staff' | 'attack-katar' | 'attack-book' | 'attack-hammer';
|
|
6
|
+
export type RPGIconSkill = 'passive' | 'active' | 'combo' | 'stance' | 'buff' | 'debuff';
|
|
7
|
+
export type RPGIconItem = 'potion' | 'ether' | 'scroll' | 'gem' | 'relic' | 'key';
|
|
8
|
+
export type RPGIconEquip = 'helm' | 'armor' | 'cloak' | 'shield' | 'ring' | 'greaves';
|
|
9
|
+
export type RPGIconSkin = 'hat' | 'emblem' | 'cape' | 'badge' | 'boots';
|
|
10
|
+
export type RPGIconMenu = 'menu' | 'inventory' | 'party' | 'quest' | 'map' | 'shop' | 'settings' | 'save';
|
|
11
|
+
export type RPGIconEmote = 'emote-tysm' | 'emote-sos' | 'emote-lol' | 'emote-win' | 'emote-lgo' | 'emote-ugh' | 'emote-myb' | 'emote-wut' | 'emote-grr';
|
|
12
|
+
export type RPGIconName = RPGIconWeapon | RPGIconElement | RPGIconRace | RPGIconSize | RPGIconAttack | RPGIconSkill | RPGIconItem | RPGIconEquip | RPGIconSkin | RPGIconMenu | RPGIconEmote;
|
|
13
|
+
export declare const rpgIconWeapons: readonly ["sword", "bow", "staff", "katar", "book", "hammer"];
|
|
14
|
+
export declare const rpgIconElements: readonly ["neutral", "fire", "earth", "wind", "water", "light", "dark", "void"];
|
|
15
|
+
export declare const rpgIconRaces: readonly ["human", "beast", "demon", "angel", "spirit"];
|
|
16
|
+
export declare const rpgIconSizes: readonly ["small", "medium", "large"];
|
|
17
|
+
export declare const rpgIconAttack: readonly ["attack-sword", "attack-bow", "attack-staff", "attack-katar", "attack-book", "attack-hammer"];
|
|
18
|
+
export declare const rpgIconSkills: readonly ["passive", "active", "combo", "stance", "buff", "debuff"];
|
|
19
|
+
export declare const rpgIconItems: readonly ["potion", "ether", "scroll", "gem", "relic", "key"];
|
|
20
|
+
export declare const rpgIconEquip: readonly ["helm", "armor", "cloak", "shield", "ring", "greaves"];
|
|
21
|
+
export declare const rpgIconSkins: readonly ["hat", "emblem", "cape", "badge", "boots"];
|
|
22
|
+
export declare const rpgIconMenu: readonly ["menu", "inventory", "party", "quest", "map", "shop", "settings", "save"];
|
|
23
|
+
export declare const rpgIconEmotes: readonly ["emote-tysm", "emote-sos", "emote-lol", "emote-win", "emote-lgo", "emote-ugh", "emote-myb", "emote-wut", "emote-grr"];
|
|
24
|
+
export declare const rpgIconGroups: {
|
|
25
|
+
readonly weapons: readonly ["sword", "bow", "staff", "katar", "book", "hammer"];
|
|
26
|
+
readonly elements: readonly ["neutral", "fire", "earth", "wind", "water", "light", "dark", "void"];
|
|
27
|
+
readonly races: readonly ["human", "beast", "demon", "angel", "spirit"];
|
|
28
|
+
readonly sizes: readonly ["small", "medium", "large"];
|
|
29
|
+
readonly attack: readonly ["attack-sword", "attack-bow", "attack-staff", "attack-katar", "attack-book", "attack-hammer"];
|
|
30
|
+
readonly skills: readonly ["passive", "active", "combo", "stance", "buff", "debuff"];
|
|
31
|
+
readonly items: readonly ["potion", "ether", "scroll", "gem", "relic", "key"];
|
|
32
|
+
readonly equip: readonly ["helm", "armor", "cloak", "shield", "ring", "greaves"];
|
|
33
|
+
readonly skins: readonly ["hat", "emblem", "cape", "badge", "boots"];
|
|
34
|
+
readonly menu: readonly ["menu", "inventory", "party", "quest", "map", "shop", "settings", "save"];
|
|
35
|
+
readonly emotes: readonly ["emote-tysm", "emote-sos", "emote-lol", "emote-win", "emote-lgo", "emote-ugh", "emote-myb", "emote-wut", "emote-grr"];
|
|
36
|
+
};
|
|
37
|
+
export declare const rpgIconNames: RPGIconName[];
|
|
@@ -130,7 +130,7 @@
|
|
|
130
130
|
}
|
|
131
131
|
|
|
132
132
|
.ns-button:disabled,
|
|
133
|
-
.ns-button[aria-disabled=
|
|
133
|
+
.ns-button[aria-disabled='true'] {
|
|
134
134
|
cursor: not-allowed;
|
|
135
135
|
opacity: 0.5;
|
|
136
136
|
pointer-events: none;
|
|
@@ -221,12 +221,11 @@
|
|
|
221
221
|
}
|
|
222
222
|
|
|
223
223
|
.ns-quest-card {
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
gap: var(--ns-space-3);
|
|
224
|
+
display: flex;
|
|
225
|
+
flex-direction: column;
|
|
226
|
+
box-sizing: border-box;
|
|
227
|
+
height: 100%;
|
|
228
|
+
gap: 0;
|
|
230
229
|
padding: 0.875rem;
|
|
231
230
|
border: var(--ns-border-card);
|
|
232
231
|
border-left: 4px solid rgba(255, 255, 255, 0.18);
|
|
@@ -238,32 +237,51 @@
|
|
|
238
237
|
}
|
|
239
238
|
|
|
240
239
|
.ns-quest-card--done {
|
|
241
|
-
--ns-quest-color: var(--ns-status-holds);
|
|
242
|
-
--ns-quest-pill-bg: rgba(166, 226, 46, 0.1);
|
|
243
240
|
border-left-color: var(--ns-status-holds);
|
|
244
241
|
}
|
|
245
242
|
|
|
246
243
|
.ns-quest-card--active {
|
|
247
|
-
--ns-quest-color: var(--ns-status-building);
|
|
248
|
-
--ns-quest-pill-bg: rgba(253, 151, 31, 0.12);
|
|
249
244
|
background: rgba(253, 151, 31, 0.06);
|
|
250
245
|
border-left-color: var(--ns-status-building);
|
|
251
246
|
}
|
|
252
247
|
|
|
253
248
|
.ns-quest-card--planned {
|
|
254
|
-
--ns-quest-color: var(--ns-status-planned);
|
|
255
|
-
--ns-quest-pill-bg: rgba(102, 217, 232, 0.12);
|
|
256
249
|
border-left-color: var(--ns-status-planned);
|
|
257
250
|
}
|
|
258
251
|
|
|
252
|
+
/* Per-status token overrides — [data-*] scope is allowed by the DS compiler */
|
|
253
|
+
[data-quest-status='done'] {
|
|
254
|
+
--ns-quest-color: var(--ns-status-holds);
|
|
255
|
+
--ns-quest-pill-bg: var(--ns-quest-pill-done);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
[data-quest-status='active'] {
|
|
259
|
+
--ns-quest-color: var(--ns-status-building);
|
|
260
|
+
--ns-quest-pill-bg: var(--ns-quest-pill-active);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
[data-quest-status='planned'] {
|
|
264
|
+
--ns-quest-color: var(--ns-status-planned);
|
|
265
|
+
--ns-quest-pill-bg: var(--ns-quest-pill-planned);
|
|
266
|
+
}
|
|
267
|
+
|
|
259
268
|
.ns-quest-card--locked {
|
|
260
269
|
opacity: 0.5;
|
|
261
270
|
}
|
|
262
271
|
|
|
272
|
+
.ns-quest-card__header {
|
|
273
|
+
display: flex;
|
|
274
|
+
align-items: flex-start;
|
|
275
|
+
gap: var(--ns-space-3);
|
|
276
|
+
margin-bottom: var(--ns-space-3);
|
|
277
|
+
}
|
|
278
|
+
|
|
263
279
|
.ns-quest-card__icon {
|
|
264
280
|
display: flex;
|
|
265
281
|
align-items: center;
|
|
266
282
|
justify-content: center;
|
|
283
|
+
flex-shrink: 0;
|
|
284
|
+
margin-top: 2px;
|
|
267
285
|
width: var(--ns-icon-slot-sm);
|
|
268
286
|
height: var(--ns-icon-slot-sm);
|
|
269
287
|
color: var(--ns-quest-color);
|
|
@@ -276,18 +294,29 @@
|
|
|
276
294
|
|
|
277
295
|
.ns-quest-card__body {
|
|
278
296
|
display: flex;
|
|
279
|
-
min-width: 0;
|
|
280
|
-
flex: 1;
|
|
281
297
|
flex-direction: column;
|
|
298
|
+
align-items: flex-start;
|
|
299
|
+
min-width: 0;
|
|
300
|
+
gap: var(--ns-space-2);
|
|
282
301
|
}
|
|
283
302
|
|
|
284
|
-
.ns-quest-
|
|
285
|
-
margin: 0 0 0.
|
|
303
|
+
.ns-quest-card__gate {
|
|
304
|
+
margin: 0 0 0.2rem;
|
|
286
305
|
color: var(--ns-ink);
|
|
287
306
|
font-family: var(--ns-font-pixel);
|
|
288
307
|
font-size: 9.5px;
|
|
289
308
|
line-height: var(--ns-leading-pixel);
|
|
290
|
-
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
.ns-quest-card__name {
|
|
312
|
+
margin: 0 0 0.375rem;
|
|
313
|
+
color: var(--ns-ink-dim);
|
|
314
|
+
font-family: var(--ns-font-pixel);
|
|
315
|
+
font-size: 9.5px;
|
|
316
|
+
line-height: var(--ns-leading-pixel);
|
|
317
|
+
display: flex;
|
|
318
|
+
align-items: center;
|
|
319
|
+
gap: 3px;
|
|
291
320
|
}
|
|
292
321
|
|
|
293
322
|
.ns-quest-card__desc {
|
|
@@ -298,7 +327,8 @@
|
|
|
298
327
|
}
|
|
299
328
|
|
|
300
329
|
.ns-status-pill {
|
|
301
|
-
margin-top:
|
|
330
|
+
margin-top: var(--ns-space-3);
|
|
331
|
+
align-self: flex-start;
|
|
302
332
|
color: var(--ns-quest-color);
|
|
303
333
|
background: var(--ns-quest-pill-bg);
|
|
304
334
|
font-size: var(--ns-pixel-2xs);
|
|
@@ -363,7 +393,7 @@
|
|
|
363
393
|
}
|
|
364
394
|
|
|
365
395
|
.ns-nav-links a:hover,
|
|
366
|
-
.ns-nav-links a[aria-current=
|
|
396
|
+
.ns-nav-links a[aria-current='page'],
|
|
367
397
|
.ns-nav-links a.is-active {
|
|
368
398
|
color: var(--ns-gold);
|
|
369
399
|
border-bottom-color: var(--ns-gold);
|
|
@@ -5,13 +5,23 @@ export type { FeatureCardProps } from '../cards/FeatureCard.js';
|
|
|
5
5
|
export { QuestCard } from '../cards/QuestCard.js';
|
|
6
6
|
export type { QuestCardProps, QuestCardStatus } from '../cards/QuestCard.js';
|
|
7
7
|
export { HUDBar } from '../hud/HUDBar.js';
|
|
8
|
-
export type { HUDBarProps } from '../hud/HUDBar.js';
|
|
8
|
+
export type { HUDBarProps, HUDBarVariant } from '../hud/HUDBar.js';
|
|
9
|
+
export { HUDChat } from '../hud/HUDChat.js';
|
|
10
|
+
export type { HUDChatMessage, HUDChatProps } from '../hud/HUDChat.js';
|
|
9
11
|
export { HUDDivider } from '../hud/HUDDivider.js';
|
|
10
12
|
export type { HUDDividerProps } from '../hud/HUDDivider.js';
|
|
13
|
+
export { HUDJoystick } from '../hud/HUDJoystick.js';
|
|
14
|
+
export type { HUDJoystickProps } from '../hud/HUDJoystick.js';
|
|
11
15
|
export { HUDLabel } from '../hud/HUDLabel.js';
|
|
12
16
|
export type { HUDLabelProps } from '../hud/HUDLabel.js';
|
|
17
|
+
export { HUDMinimap } from '../hud/HUDMinimap.js';
|
|
18
|
+
export type { HUDMinimapProps } from '../hud/HUDMinimap.js';
|
|
19
|
+
export { HUDPanel } from '../hud/HUDPanel.js';
|
|
20
|
+
export type { HUDPanelProps } from '../hud/HUDPanel.js';
|
|
21
|
+
export { HUDTabWindow } from '../hud/HUDTabWindow.js';
|
|
22
|
+
export type { HUDTab, HUDTabWindowProps } from '../hud/HUDTabWindow.js';
|
|
13
23
|
export { RPGIcon, HUDIcon, icons } from '../icons/RPGIcon.js';
|
|
14
|
-
export type { RPGIconElement, RPGIconName, RPGIconProps, RPGIconRace, RPGIconSize, RPGIconWeapon, } from '../icons/RPGIcon.js';
|
|
24
|
+
export type { RPGIconAttack, RPGIconElement, RPGIconEmote, RPGIconEquip, RPGIconItem, RPGIconMenu, RPGIconName, RPGIconProps, RPGIconRace, RPGIconSize, RPGIconSkin, RPGIconWeapon, } from '../icons/RPGIcon.js';
|
|
15
25
|
export { SectionArrow } from '../navigation/SectionArrow.js';
|
|
16
26
|
export type { SectionArrowProps } from '../navigation/SectionArrow.js';
|
|
17
27
|
export type { NSStyle } from '../shared/styles.js';
|