pf2e-spellbook 1.0.0 → 1.1.0

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/src/icon.svg CHANGED
@@ -1,8 +1,8 @@
1
1
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" role="img" aria-label="Spellbook">
2
- <rect width="512" height="512" rx="104" fill="#231710"/>
3
- <g fill="none" stroke="#e0b252" stroke-width="22" stroke-linejoin="round" stroke-linecap="round">
2
+ <rect width="512" height="512" rx="104" fill="#1d2027"/>
3
+ <g fill="none" stroke="#7b6cf0" stroke-width="22" stroke-linejoin="round" stroke-linecap="round">
4
4
  <path d="M256 152 C220 128 168 128 130 146 L130 372 C168 354 220 354 256 380 C292 354 344 354 382 372 L382 146 C344 128 292 128 256 152 Z"/>
5
5
  <line x1="256" y1="152" x2="256" y2="380"/>
6
6
  </g>
7
- <path d="M366 96 l12 30 30 12 -30 12 -12 30 -12 -30 -30 -12 30 -12 z" fill="#f4ead8"/>
7
+ <path d="M366 96 l12 30 30 12 -30 12 -12 30 -12 -30 -30 -12 30 -12 z" fill="#e8eaf0"/>
8
8
  </svg>
@@ -6,8 +6,8 @@
6
6
  "scope": ".",
7
7
  "display": "standalone",
8
8
  "orientation": "portrait",
9
- "background_color": "#1b130c",
10
- "theme_color": "#2b1d12",
9
+ "background_color": "#14161b",
10
+ "theme_color": "#14161b",
11
11
  "icons": [
12
12
  { "src": "icon.svg", "sizes": "any", "type": "image/svg+xml", "purpose": "any maskable" }
13
13
  ]
package/src/styles.css CHANGED
@@ -1,153 +1,216 @@
1
+ /* ============================================================
2
+ THEME TOKENS
3
+ Base tokens flip with [data-theme]; --accent (+ --accent-ink) are
4
+ set by JS per class or per custom palette. Accent shades derive via
5
+ color-mix(), so one hue recolours the whole UI.
6
+ ============================================================ */
1
7
  :root{
2
- --bg:#1b130c;
3
- --panel:#2b1d12;
4
- --panel2:#33271a;
5
- --ink:#f4ead8;
6
- --muted:#c9b79a;
7
- --gold:#e0b252;
8
- --gold-dim:#9c7a36;
9
- --heal:#6fc28a;
10
- --harm:#c9657a;
11
- --line:#4a3a26;
12
- --accent:#7fb0d6;
8
+ /* accent — JS overrides --accent and --accent-ink on <html> */
9
+ --accent:#6c7a89;
10
+ --accent-ink:#ffffff;
11
+ --accent-dim:color-mix(in srgb, var(--accent) 55%, var(--line));
12
+ --accent-soft:color-mix(in srgb, var(--accent) 15%, transparent);
13
+ --accent-text:var(--accent);
14
+
15
+ /* fixed rank spectrum (left border bars), shared by both modes */
16
+ --rank0:#b58fd6; --rank1:#7fb0d6; --rank2:#6f9c8f; --rank3:#d6a86f;
17
+ --rank4:#d68f8f; --rank5:#9cc46a; --rank6:#c9c05a; --rank7:#6fb6d6;
18
+ --rank8:#c98fd6; --rank9:#d6a0c0; --rank10:var(--accent);
19
+
13
20
  --radius:16px;
14
- --tap:#3c2c1b;
15
21
  }
22
+
23
+ /* ---- Dark (default) ---- */
24
+ :root, :root[data-theme="dark"]{
25
+ color-scheme:dark;
26
+ --bg:#14161b;
27
+ --surface:#1d2027;
28
+ --surface-2:#262a33;
29
+ --ink:#e8eaf0;
30
+ --muted:#9aa1b0;
31
+ --line:#2f3440;
32
+ --heal:#5bbf7e;
33
+ --harm:#d9637a;
34
+ --info:#6fa8dc;
35
+ --info-bg:color-mix(in srgb, var(--info) 22%, var(--surface));
36
+ --info-ink:#d6e8fb;
37
+ --accent-text:var(--accent);
38
+ --shadow:0 1px 2px rgba(0,0,0,.4), 0 4px 14px rgba(0,0,0,.25);
39
+ }
40
+
41
+ /* ---- Light ---- */
42
+ :root[data-theme="light"]{
43
+ color-scheme:light;
44
+ --bg:#f5f6f8;
45
+ --surface:#ffffff;
46
+ --surface-2:#eef0f4;
47
+ --ink:#1b1e24;
48
+ --muted:#5d6470;
49
+ --line:#dfe3ea;
50
+ --heal:#2f9e5b;
51
+ --harm:#c43a57;
52
+ --info:#2b6cb0;
53
+ --info-bg:color-mix(in srgb, var(--info) 12%, var(--surface));
54
+ --info-ink:#0b3a68;
55
+ --accent-text:color-mix(in srgb, var(--accent) 72%, #000);
56
+ --shadow:0 1px 2px rgba(20,30,50,.08), 0 4px 14px rgba(20,30,50,.06);
57
+ }
58
+
16
59
  *{box-sizing:border-box;-webkit-tap-highlight-color:transparent;}
17
60
  html,body{margin:0;padding:0;}
61
+ html{background:var(--bg);}
18
62
  body{
19
63
  background:var(--bg);
20
64
  color:var(--ink);
21
65
  font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
22
- font-size:19px;
66
+ font-size:18px;
23
67
  line-height:1.5;
24
68
  padding-bottom:84px; /* room for nav */
25
69
  -webkit-text-size-adjust:100%;
26
70
  }
27
- h1,h2,h3{margin:0 0 .4em;line-height:1.2;}
28
- h1{font-size:1.5rem;color:var(--gold);}
29
- h2{font-size:1.25rem;color:var(--gold);}
71
+ h1,h2,h3{margin:0 0 .4em;line-height:1.2;letter-spacing:-.01em;}
72
+ h1{font-size:1.5rem;color:var(--ink);font-weight:800;}
73
+ h2{font-size:1.2rem;color:var(--ink);font-weight:700;}
30
74
  p{margin:.4em 0;}
31
75
  .wrap{max-width:560px;margin:0 auto;padding:16px 14px;}
32
76
  .hide{display:none !important;}
33
77
 
78
+ /* smooth theme + interaction transitions */
79
+ button,.chip,.card,.cast-card,.classcard,.browse-row,input,select,textarea,
80
+ .stat,nav.bottom button,details.help{
81
+ transition:background-color .15s ease, border-color .15s ease, color .15s ease;
82
+ }
83
+
84
+ /* inline SVG icons inherit accent via currentColor */
85
+ .icn{display:inline-block;width:1em;height:1em;flex:0 0 auto;vertical-align:-.14em;}
86
+
34
87
  /* ---- Header ---- */
35
88
  header.top{
36
- background:linear-gradient(180deg,#3a2715,#241810);
37
- border-bottom:2px solid var(--gold-dim);
89
+ background:linear-gradient(180deg, color-mix(in srgb, var(--accent) 10%, var(--surface)), var(--surface));
90
+ border-bottom:1px solid var(--line);
38
91
  padding:14px 16px;
39
92
  position:sticky;top:0;z-index:20;
40
93
  }
41
- header.top h1{margin:0;font-size:1.35rem;}
42
- header.top .sub{color:var(--muted);font-size:.9rem;}
43
- .statbar{display:flex;gap:8px;margin-top:10px;flex-wrap:wrap;}
94
+ header.top h1{margin:0;font-size:1.3rem;display:flex;align-items:center;gap:10px;}
95
+ header.top h1 #charIcon{display:inline-flex;color:var(--accent-text);font-size:1.5rem;}
96
+ header.top .sub{color:var(--muted);font-size:.88rem;margin-top:2px;}
97
+ .statbar{display:flex;gap:8px;margin-top:12px;flex-wrap:wrap;}
44
98
  .stat{
45
- background:var(--panel2);border:1px solid var(--gold-dim);
46
- border-radius:12px;padding:6px 12px;flex:1;min-width:90px;text-align:center;
99
+ background:var(--surface-2);border:1px solid var(--line);
100
+ border-radius:12px;padding:8px 12px;flex:1;min-width:90px;text-align:center;
47
101
  }
48
- .stat .lbl{font-size:.72rem;color:var(--muted);text-transform:uppercase;letter-spacing:.5px;}
49
- .stat .val{font-size:1.4rem;font-weight:700;color:var(--gold);}
102
+ .stat .lbl{font-size:.7rem;color:var(--muted);text-transform:uppercase;letter-spacing:.6px;}
103
+ .stat .val{font-size:1.4rem;font-weight:800;color:var(--accent-text);}
50
104
 
51
105
  /* ---- Cards ---- */
52
106
  .card{
53
- background:var(--panel);
107
+ background:var(--surface);
54
108
  border:1px solid var(--line);
55
109
  border-radius:var(--radius);
56
110
  padding:16px;margin:14px 0;
57
- box-shadow:0 2px 0 rgba(0,0,0,.3);
58
- }
59
- .card.rank0{border-left:6px solid #b58fd6;}
60
- .card.rank1{border-left:6px solid #7fb0d6;}
61
- .card.rank2{border-left:6px solid #6f9c8f;}
62
- .card.rank3{border-left:6px solid #d6a86f;}
63
- .card.rank4{border-left:6px solid #d68f8f;}
64
- .card.rank5{border-left:6px solid #b0d67f;}
65
- .card.rank6{border-left:6px solid #d6cf6f;}
66
- .card.rank7{border-left:6px solid #6fb6d6;}
67
- .card.rank8{border-left:6px solid #c98fd6;}
68
- .card.rank9{border-left:6px solid #d6a0c0;}
69
- .card.rank10{border-left:6px solid var(--gold);}
70
- .card.heal{border-left:6px solid var(--heal);}
71
- .card.harm{border-left:6px solid var(--harm);}
111
+ box-shadow:var(--shadow);
112
+ }
113
+ .card.rank0{border-left:5px solid var(--rank0);}
114
+ .card.rank1{border-left:5px solid var(--rank1);}
115
+ .card.rank2{border-left:5px solid var(--rank2);}
116
+ .card.rank3{border-left:5px solid var(--rank3);}
117
+ .card.rank4{border-left:5px solid var(--rank4);}
118
+ .card.rank5{border-left:5px solid var(--rank5);}
119
+ .card.rank6{border-left:5px solid var(--rank6);}
120
+ .card.rank7{border-left:5px solid var(--rank7);}
121
+ .card.rank8{border-left:5px solid var(--rank8);}
122
+ .card.rank9{border-left:5px solid var(--rank9);}
123
+ .card.rank10{border-left:5px solid var(--rank10);}
124
+ .card.heal{border-left:5px solid var(--heal);}
125
+ .card.harm{border-left:5px solid var(--harm);}
72
126
 
73
127
  .spell-head{display:flex;justify-content:space-between;align-items:flex-start;gap:10px;}
74
- .spell-name{font-size:1.3rem;font-weight:700;color:var(--ink);margin:0;}
128
+ .spell-name{font-size:1.25rem;font-weight:700;color:var(--ink);margin:0;}
75
129
  .rankpill{
76
- background:var(--panel2);border:1px solid var(--gold-dim);color:var(--gold);
77
- border-radius:20px;padding:3px 12px;font-size:.85rem;font-weight:700;white-space:nowrap;
130
+ background:var(--surface-2);border:1px solid var(--accent-dim);color:var(--accent-text);
131
+ border-radius:20px;padding:3px 12px;font-size:.82rem;font-weight:700;white-space:nowrap;
78
132
  }
79
133
  .actions{
80
134
  display:inline-flex;align-items:center;gap:6px;
81
- background:#11305a;border:1px solid var(--accent);color:#cfe5f7;
135
+ background:var(--info-bg);border:1px solid var(--info);color:var(--info-ink);
82
136
  border-radius:8px;padding:2px 10px;font-size:.85rem;font-weight:700;margin:8px 8px 4px 0;
83
137
  }
84
138
  .save-tag{
85
- display:inline-block;background:#3a1d1d;border:1px solid #8a4b4b;color:#f0c0c0;
139
+ display:inline-block;
140
+ background:color-mix(in srgb, var(--harm) 15%, var(--surface));
141
+ border:1px solid color-mix(in srgb, var(--harm) 45%, var(--line));
142
+ color:var(--harm);
86
143
  border-radius:8px;padding:2px 10px;font-size:.85rem;font-weight:700;margin:8px 8px 4px 0;
87
144
  }
88
- .meta{font-size:.92rem;color:var(--muted);margin:6px 0;}
145
+ .meta{font-size:.9rem;color:var(--muted);margin:6px 0;}
89
146
  .meta b{color:var(--ink);font-weight:600;}
90
147
  .traits{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0;}
91
148
  .trait{
92
- background:#241810;border:1px solid var(--gold-dim);color:var(--gold);
93
- font-size:.74rem;text-transform:uppercase;letter-spacing:.4px;
149
+ background:var(--surface-2);border:1px solid var(--line);color:var(--muted);
150
+ font-size:.72rem;text-transform:uppercase;letter-spacing:.4px;
94
151
  padding:2px 8px;border-radius:6px;
95
152
  }
96
- .desc{font-size:1.02rem;line-height:1.55;margin-top:8px;}
153
+ .desc{font-size:1rem;line-height:1.55;margin-top:8px;}
97
154
  .heighten{
98
- margin-top:10px;padding:10px 12px;background:var(--panel2);
99
- border-radius:10px;font-size:.95rem;color:var(--muted);
155
+ margin-top:10px;padding:10px 12px;background:var(--surface-2);
156
+ border-radius:10px;font-size:.92rem;color:var(--muted);
100
157
  }
101
- .heighten b{color:var(--gold);}
158
+ .heighten b{color:var(--accent-text);}
102
159
 
103
160
  /* ---- Buttons / inputs ---- */
104
161
  button{font-family:inherit;font-size:1.05rem;cursor:pointer;}
105
162
  .btn{
106
- display:block;width:100%;padding:16px;border-radius:14px;border:none;
107
- background:var(--gold);color:#2a1c0c;font-weight:800;font-size:1.15rem;
108
- margin:14px 0;letter-spacing:.3px;
163
+ display:block;width:100%;padding:15px;border-radius:12px;border:none;
164
+ background:var(--accent);color:var(--accent-ink);font-weight:800;font-size:1.1rem;
165
+ margin:14px 0;letter-spacing:.2px;box-shadow:var(--shadow);
109
166
  }
110
- .btn.secondary{background:var(--panel2);color:var(--gold);border:1px solid var(--gold-dim);}
167
+ .btn.secondary{background:var(--surface-2);color:var(--accent-text);border:1px solid var(--accent-dim);box-shadow:none;}
111
168
  .btn:active{transform:translateY(1px);}
112
- .linklike{background:none;border:none;color:var(--accent);font-weight:700;text-decoration:underline;padding:0;font-size:inherit;}
169
+ .linklike{background:none;border:none;color:var(--info);font-weight:700;text-decoration:underline;padding:0;font-size:inherit;}
113
170
 
114
171
  label.field{display:block;margin:14px 0;}
115
- label.field .name{display:block;font-weight:700;margin-bottom:6px;font-size:1.02rem;}
172
+ label.field .name{display:block;font-weight:700;margin-bottom:6px;font-size:1rem;}
116
173
  label.field .hint{display:block;color:var(--muted);font-size:.82rem;font-weight:400;margin-bottom:6px;}
174
+ input,select,textarea{accent-color:var(--accent);}
117
175
  input,select{
118
- width:100%;padding:14px;font-size:1.1rem;border-radius:12px;
119
- background:var(--panel2);color:var(--ink);border:1px solid var(--gold-dim);
176
+ width:100%;padding:13px;font-size:1.05rem;border-radius:12px;
177
+ background:var(--surface-2);color:var(--ink);border:1px solid var(--line);
120
178
  appearance:none;-webkit-appearance:none;
121
179
  }
122
- select{background-image:linear-gradient(45deg,transparent 50%,var(--gold) 50%),linear-gradient(135deg,var(--gold) 50%,transparent 50%);
180
+ input:focus,select:focus,textarea:focus{outline:none;border-color:var(--accent);}
181
+ select{background-image:linear-gradient(45deg,transparent 50%,var(--muted) 50%),linear-gradient(135deg,var(--muted) 50%,transparent 50%);
123
182
  background-position:calc(100% - 20px) center,calc(100% - 14px) center;
124
183
  background-size:6px 6px,6px 6px;background-repeat:no-repeat;padding-right:40px;}
184
+ input[type="color"]{padding:4px;height:44px;cursor:pointer;}
125
185
  .row{display:flex;gap:10px;}
126
186
  .row > *{flex:1;}
127
187
 
128
188
  .seg{display:flex;gap:8px;margin:6px 0;}
129
189
  .seg button{
130
- flex:1;padding:14px;border-radius:12px;border:1px solid var(--gold-dim);
131
- background:var(--panel2);color:var(--ink);font-weight:700;
190
+ flex:1;padding:13px;border-radius:12px;border:1px solid var(--line);
191
+ background:var(--surface-2);color:var(--ink);font-weight:700;
192
+ display:inline-flex;align-items:center;justify-content:center;gap:8px;
132
193
  }
133
- .seg button.on.heal{background:var(--heal);color:#0c2415;border-color:var(--heal);}
134
- .seg button.on.harm{background:var(--harm);color:#2a0c12;border-color:var(--harm);}
194
+ .seg button.on{background:var(--accent);color:var(--accent-ink);border-color:var(--accent);}
195
+ .seg button.on.heal{background:var(--heal);color:#08140d;border-color:var(--heal);}
196
+ .seg button.on.harm{background:var(--harm);color:#1c0709;border-color:var(--harm);}
135
197
 
136
198
  /* ---- Slot picker rows ---- */
137
199
  .slotgroup{margin:18px 0;}
138
- .slotgroup h3{color:var(--gold);font-size:1.1rem;border-bottom:1px solid var(--line);padding-bottom:6px;}
200
+ .slotgroup h3{color:var(--accent-text);font-size:1.05rem;border-bottom:1px solid var(--line);padding-bottom:6px;display:flex;align-items:center;gap:8px;}
139
201
  .slotrow{display:flex;align-items:center;gap:10px;margin:10px 0;}
140
202
  .slotrow .num{
141
203
  width:34px;height:34px;flex:0 0 34px;border-radius:50%;
142
- background:var(--panel2);border:1px solid var(--gold-dim);color:var(--gold);
204
+ background:var(--surface-2);border:1px solid var(--accent-dim);color:var(--accent-text);
143
205
  display:flex;align-items:center;justify-content:center;font-weight:800;
144
206
  }
207
+ .slotrow .num .icn{width:1.1rem;height:1.1rem;}
145
208
  .slotrow select{flex:1;}
146
209
  .prep-slot{margin:10px 0;}
147
210
  .prep-slot .slotrow{margin:0;}
148
211
  .prep-preview{margin:6px 0 0 44px;}
149
212
  .prep-preview-inner{
150
- background:var(--panel2);border:1px solid var(--line);border-radius:10px;
213
+ background:var(--surface-2);border:1px solid var(--line);border-radius:10px;
151
214
  padding:10px 12px;
152
215
  }
153
216
  .prep-preview .meta{font-size:.85rem;margin:2px 0;}
@@ -156,123 +219,128 @@ select{background-image:linear-gradient(45deg,transparent 50%,var(--gold) 50%),l
156
219
 
157
220
  /* ---- Today cast cards ---- */
158
221
  .cast-card{
159
- background:var(--panel);border:1px solid var(--line);border-radius:14px;
160
- padding:14px;margin:12px 0;border-left:6px solid var(--line);
161
- }
162
- .cast-card.rank0{border-left-color:#b58fd6;}
163
- .cast-card.rank1{border-left-color:#7fb0d6;}
164
- .cast-card.rank2{border-left-color:#6f9c8f;}
165
- .cast-card.rank3{border-left-color:#d6a86f;}
166
- .cast-card.rank4{border-left-color:#d68f8f;}
167
- .cast-card.rank5{border-left-color:#b0d67f;}
168
- .cast-card.rank6{border-left-color:#d6cf6f;}
169
- .cast-card.rank7{border-left-color:#6fb6d6;}
170
- .cast-card.rank8{border-left-color:#c98fd6;}
171
- .cast-card.rank9{border-left-color:#d6a0c0;}
172
- .cast-card.rank10{border-left-color:var(--gold);}
222
+ background:var(--surface);border:1px solid var(--line);border-radius:14px;
223
+ padding:14px;margin:12px 0;border-left:5px solid var(--line);box-shadow:var(--shadow);
224
+ }
225
+ .cast-card.rank0{border-left-color:var(--rank0);}
226
+ .cast-card.rank1{border-left-color:var(--rank1);}
227
+ .cast-card.rank2{border-left-color:var(--rank2);}
228
+ .cast-card.rank3{border-left-color:var(--rank3);}
229
+ .cast-card.rank4{border-left-color:var(--rank4);}
230
+ .cast-card.rank5{border-left-color:var(--rank5);}
231
+ .cast-card.rank6{border-left-color:var(--rank6);}
232
+ .cast-card.rank7{border-left-color:var(--rank7);}
233
+ .cast-card.rank8{border-left-color:var(--rank8);}
234
+ .cast-card.rank9{border-left-color:var(--rank9);}
235
+ .cast-card.rank10{border-left-color:var(--rank10);}
173
236
  .cast-card.heal{border-left-color:var(--heal);}
174
237
  .cast-card.harm{border-left-color:var(--harm);}
175
- .cast-card.spent{opacity:.4;}
238
+ .cast-card.spent{opacity:.45;}
176
239
  .cast-top{display:flex;justify-content:space-between;align-items:center;gap:10px;}
177
- .cast-top .nm{font-size:1.2rem;font-weight:700;}
240
+ .cast-top .nm{font-size:1.15rem;font-weight:700;}
178
241
  .uses{display:flex;gap:6px;align-items:center;}
179
- .pip{width:26px;height:26px;border-radius:50%;border:2px solid var(--gold);display:inline-block;}
180
- .pip.full{background:var(--gold);}
242
+ .pip{width:24px;height:24px;border-radius:50%;border:2px solid var(--accent);display:inline-block;}
243
+ .pip.full{background:var(--accent);}
181
244
  .pip.spent{background:transparent;opacity:.35;}
182
245
  .castbtn{
183
- padding:10px 16px;border-radius:10px;border:none;background:var(--gold);
184
- color:#2a1c0c;font-weight:800;font-size:1rem;
246
+ padding:10px 16px;border-radius:10px;border:none;background:var(--accent);
247
+ color:var(--accent-ink);font-weight:800;font-size:1rem;
185
248
  }
186
- .castbtn.zero{background:var(--panel2);color:var(--muted);}
249
+ .castbtn.zero{background:var(--surface-2);color:var(--muted);}
187
250
  .unlim{font-size:.85rem;color:var(--heal);font-weight:700;}
188
251
  .detailsbtn{
189
- background:none;border:none;color:var(--accent);font-weight:700;
252
+ background:none;border:none;color:var(--info);font-weight:700;
190
253
  padding:8px 0 0;font-size:.95rem;text-decoration:underline;
191
254
  }
192
255
 
193
256
  .susbtn{
194
- padding:10px 14px;border-radius:10px;border:1px solid var(--accent);
195
- background:#11305a;color:#cfe5f7;font-weight:800;font-size:.95rem;
257
+ padding:10px 14px;border-radius:10px;border:1px solid var(--info);
258
+ background:var(--info-bg);color:var(--info-ink);font-weight:800;font-size:.95rem;
196
259
  }
197
- .susbtn.on{background:var(--accent);color:#0c1d2a;}
260
+ .susbtn.on{background:var(--info);color:var(--surface);}
198
261
  .susrow{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:6px 0;border-top:1px solid var(--line);}
199
262
  .susrow:first-of-type{border-top:none;}
200
263
  .susrow span{font-weight:700;}
201
264
 
202
265
  .dmgline{margin:4px 0 2px;}
203
266
  .dmgchip{
204
- display:inline-block;background:#2a1d14;border:1px solid var(--gold-dim);
205
- color:var(--gold);font-weight:800;font-size:.95rem;border-radius:8px;padding:2px 10px;
267
+ display:inline-block;background:var(--surface-2);border:1px solid var(--line);
268
+ color:var(--ink);font-weight:800;font-size:.92rem;border-radius:8px;padding:2px 10px;
206
269
  }
270
+ .dmgchip.dmg{background:color-mix(in srgb, var(--harm) 15%, var(--surface));border-color:color-mix(in srgb, var(--harm) 40%, var(--line));color:var(--harm);}
271
+ .dmgchip.heal{background:color-mix(in srgb, var(--heal) 15%, var(--surface));border-color:color-mix(in srgb, var(--heal) 40%, var(--line));color:var(--heal);}
207
272
 
208
273
  .empty{text-align:center;color:var(--muted);padding:40px 20px;}
209
274
 
210
275
  .filterbar{display:flex;gap:8px;margin:6px 0 14px;flex-wrap:wrap;}
211
276
  .chip{
212
- padding:8px 14px;border-radius:20px;border:1px solid var(--gold-dim);
213
- background:var(--panel2);color:var(--muted);font-weight:700;font-size:.9rem;
277
+ padding:8px 14px;border-radius:20px;border:1px solid var(--line);
278
+ background:var(--surface-2);color:var(--muted);font-weight:700;font-size:.88rem;
279
+ display:inline-flex;align-items:center;gap:6px;
214
280
  }
215
- .chip.on{background:var(--gold);color:#2a1c0c;border-color:var(--gold);}
281
+ .chip.on{background:var(--accent);color:var(--accent-ink);border-color:var(--accent);}
216
282
  #search{margin-bottom:8px;}
217
283
  #filterToggle{margin:0 0 8px;}
218
- #browseFilters{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:10px 12px;margin:0 0 12px;}
284
+ #browseFilters{background:var(--surface);border:1px solid var(--line);border-radius:12px;padding:10px 12px;margin:0 0 12px;}
219
285
  .fgroup{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin:4px 0;}
220
286
  .fgroup .flabel{font-size:.8rem;color:var(--muted);font-weight:700;min-width:58px;}
221
287
 
222
288
  .sectionhead{
223
- color:var(--gold);font-size:1.15rem;font-weight:800;margin:22px 0 4px;
289
+ color:var(--accent-text);font-size:1.1rem;font-weight:800;margin:22px 0 4px;
224
290
  display:flex;align-items:center;gap:10px;
225
291
  }
226
- .sectionhead .count{font-size:.85rem;color:var(--muted);font-weight:600;}
292
+ .sectionhead .count{font-size:.82rem;color:var(--muted);font-weight:600;}
227
293
  .divider{height:1px;background:var(--line);margin:4px 0 6px;}
228
294
 
229
295
  .banner{
230
- background:#2a2412;border:1px solid var(--gold-dim);border-radius:12px;
231
- padding:12px 14px;margin:12px 0;color:var(--muted);font-size:.9rem;
296
+ background:var(--accent-soft);border:1px solid var(--accent-dim);border-radius:12px;
297
+ padding:12px 14px;margin:12px 0;color:var(--ink);font-size:.9rem;
232
298
  }
233
- .banner b{color:var(--gold);}
299
+ .banner b{color:var(--accent-text);}
234
300
 
235
- details.help{background:var(--panel);border:1px solid var(--line);border-radius:14px;margin:12px 0;padding:0 16px;}
236
- details.help summary{padding:16px 0;font-weight:700;font-size:1.1rem;color:var(--gold);cursor:pointer;list-style:none;}
301
+ details.help{background:var(--surface);border:1px solid var(--line);border-radius:14px;margin:12px 0;padding:0 16px;}
302
+ details.help summary{padding:16px 0;font-weight:700;font-size:1.05rem;color:var(--accent-text);cursor:pointer;list-style:none;}
237
303
  details.help summary::-webkit-details-marker{display:none;}
238
304
  details.help summary::after{content:"+";float:right;color:var(--muted);}
239
305
  details.help[open] summary::after{content:"-";}
240
306
  details.help .body{padding:0 0 16px;font-size:1rem;line-height:1.6;color:var(--ink);}
241
- details.help .body b{color:var(--gold);}
307
+ details.help .body b{color:var(--accent-text);}
242
308
 
243
309
  /* ---- Class picker ---- */
244
310
  .classcard{
245
311
  display:flex;align-items:center;gap:14px;width:100%;text-align:left;
246
- background:var(--panel);border:1px solid var(--line);border-left:6px solid var(--gold);
247
- border-radius:var(--radius);padding:16px;margin:12px 0;color:var(--ink);
312
+ background:var(--surface);border:1px solid var(--line);border-left:4px solid var(--accent);
313
+ border-radius:var(--radius);padding:16px;margin:12px 0;color:var(--ink);box-shadow:var(--shadow);
248
314
  }
249
315
  .classcard:active{transform:translateY(1px);}
250
- .classcard .ic{font-size:2.2rem;line-height:1;}
316
+ .classcard .ic{font-size:2rem;line-height:1;display:inline-flex;color:var(--accent-text);}
251
317
  .classcard .txt{flex:1;}
252
- .classcard .nm{font-size:1.3rem;font-weight:800;color:var(--gold);}
253
- .classcard .tl{font-size:.9rem;color:var(--muted);margin-top:2px;}
254
- .classcard .arr{color:var(--gold-dim);font-size:1.4rem;font-weight:800;}
318
+ .classcard .nm{font-size:1.25rem;font-weight:800;color:var(--ink);}
319
+ .classcard .tl{font-size:.88rem;color:var(--muted);margin-top:2px;}
320
+ .classcard .arr{color:var(--muted);font-size:1.3rem;font-weight:800;}
255
321
  .previewtag{
256
322
  font-size:.62rem;text-transform:uppercase;letter-spacing:.5px;vertical-align:middle;
257
- background:#3a1d1d;border:1px solid #8a4b4b;color:#f0c0c0;border-radius:6px;padding:1px 6px;font-weight:700;
323
+ background:color-mix(in srgb, var(--harm) 15%, var(--surface));
324
+ border:1px solid color-mix(in srgb, var(--harm) 40%, var(--line));
325
+ color:var(--harm);border-radius:6px;padding:1px 6px;font-weight:700;
258
326
  }
259
327
 
260
328
  /* ---- Browse compact rows (tap to expand) ---- */
261
329
  .browse-row{
262
- background:var(--panel);border:1px solid var(--line);border-left:5px solid var(--line);
330
+ background:var(--surface);border:1px solid var(--line);border-left:4px solid var(--line);
263
331
  border-radius:12px;margin:8px 0;overflow:hidden;
264
332
  }
265
- .browse-row.rank0{border-left-color:#b58fd6;}
266
- .browse-row.rank1{border-left-color:#7fb0d6;}
267
- .browse-row.rank2{border-left-color:#6f9c8f;}
268
- .browse-row.rank3{border-left-color:#d6a86f;}
269
- .browse-row.rank4{border-left-color:#d68f8f;}
270
- .browse-row.rank5{border-left-color:#b0d67f;}
271
- .browse-row.rank6{border-left-color:#d6cf6f;}
272
- .browse-row.rank7{border-left-color:#6fb6d6;}
273
- .browse-row.rank8{border-left-color:#c98fd6;}
274
- .browse-row.rank9{border-left-color:#d6a0c0;}
275
- .browse-row.rank10{border-left-color:var(--gold);}
333
+ .browse-row.rank0{border-left-color:var(--rank0);}
334
+ .browse-row.rank1{border-left-color:var(--rank1);}
335
+ .browse-row.rank2{border-left-color:var(--rank2);}
336
+ .browse-row.rank3{border-left-color:var(--rank3);}
337
+ .browse-row.rank4{border-left-color:var(--rank4);}
338
+ .browse-row.rank5{border-left-color:var(--rank5);}
339
+ .browse-row.rank6{border-left-color:var(--rank6);}
340
+ .browse-row.rank7{border-left-color:var(--rank7);}
341
+ .browse-row.rank8{border-left-color:var(--rank8);}
342
+ .browse-row.rank9{border-left-color:var(--rank9);}
343
+ .browse-row.rank10{border-left-color:var(--rank10);}
276
344
  .browse-row-head{
277
345
  display:flex;flex-direction:column;align-items:flex-start;gap:2px;
278
346
  width:100%;text-align:left;background:none;border:none;color:var(--ink);
@@ -280,74 +348,82 @@ details.help .body b{color:var(--gold);}
280
348
  }
281
349
  .browse-row-head::after{content:"▾";position:absolute;right:14px;top:14px;color:var(--muted);}
282
350
  .browse-row-head.open::after{content:"▴";}
283
- .browse-row-head .brn{font-size:1.1rem;font-weight:700;}
351
+ .browse-row-head .brn{font-size:1.05rem;font-weight:700;}
284
352
  .browse-row-head .brmeta{font-size:.82rem;color:var(--muted);}
285
- .brfocus{font-size:.62rem;text-transform:uppercase;letter-spacing:.5px;color:#c0a0e0;border:1px solid #6f5b8a;border-radius:5px;padding:0 5px;vertical-align:middle;}
353
+ .brfocus{font-size:.62rem;text-transform:uppercase;letter-spacing:.5px;color:var(--accent-text);border:1px solid var(--accent-dim);border-radius:5px;padding:0 5px;vertical-align:middle;}
286
354
  .formerly{font-size:.72rem;font-style:italic;font-weight:600;color:var(--muted);white-space:nowrap;}
287
- .ritualtag{font-size:.7rem;text-transform:uppercase;letter-spacing:.5px;font-weight:800;background:#3a1d3a;border:1px solid #8a4b8a;color:#e7c6e7;border-radius:6px;padding:1px 7px;}
355
+ .ritualtag{font-size:.7rem;text-transform:uppercase;letter-spacing:.5px;font-weight:800;background:var(--accent-soft);border:1px solid var(--accent-dim);color:var(--accent-text);border-radius:6px;padding:1px 7px;}
288
356
  .browse-card{padding:0 12px 4px;}
289
357
  .browse-card .card{margin:0 0 10px;}
290
358
 
291
359
  /* ---- Header menu button + character menu ---- */
292
360
  .tophead{display:flex;align-items:center;justify-content:space-between;gap:10px;}
293
361
  .menubtn{
294
- flex:0 0 auto;background:var(--panel2);border:1px solid var(--gold-dim);
295
- border-radius:12px;width:44px;height:44px;font-size:1.3rem;line-height:1;color:var(--gold);
362
+ flex:0 0 auto;background:var(--surface-2);border:1px solid var(--line);
363
+ border-radius:12px;width:44px;height:44px;font-size:1.3rem;line-height:1;color:var(--accent-text);
364
+ display:inline-flex;align-items:center;justify-content:center;
296
365
  }
297
- .classcard.activechar{border-left-color:var(--gold);background:#332615;}
366
+ .classcard.activechar{border-left-color:var(--accent);background:var(--accent-soft);}
298
367
  textarea{
299
- width:100%;padding:14px;font-size:1rem;border-radius:12px;line-height:1.4;
300
- background:var(--panel2);color:var(--ink);border:1px solid var(--gold-dim);
368
+ width:100%;padding:13px;font-size:1rem;border-radius:12px;line-height:1.4;
369
+ background:var(--surface-2);color:var(--ink);border:1px solid var(--line);
301
370
  font-family:inherit;resize:vertical;margin:6px 0;
302
371
  }
303
372
 
373
+ /* ---- Appearance / custom palette ---- */
374
+ .swatchrow{display:flex;align-items:center;gap:10px;margin:8px 0;}
375
+ .swatchrow label{flex:1;font-weight:600;font-size:.95rem;}
376
+ .swatchrow input[type="color"]{flex:0 0 56px;width:56px;}
377
+
304
378
  /* ---- Repertoire builder (spontaneous) ---- */
305
379
  .rep-row .slotrow{gap:8px;}
306
380
  .sigstar{
307
381
  width:38px;height:38px;flex:0 0 38px;border-radius:10px;
308
- background:var(--panel2);border:1px solid var(--gold-dim);color:var(--muted);
382
+ background:var(--surface-2);border:1px solid var(--accent-dim);color:var(--muted);
309
383
  font-size:1.2rem;line-height:1;display:flex;align-items:center;justify-content:center;
310
384
  }
311
- .sigstar.on{background:var(--gold);color:#2a1c0c;border-color:var(--gold);}
385
+ .sigstar.on{background:var(--accent);color:var(--accent-ink);border-color:var(--accent);}
312
386
  .rmrow{
313
387
  width:38px;height:38px;flex:0 0 38px;border-radius:10px;
314
- background:var(--panel2);border:1px solid var(--line);color:var(--muted);font-weight:700;
388
+ background:var(--surface-2);border:1px solid var(--line);color:var(--muted);font-weight:700;
315
389
  }
316
- .focus-checklist{max-height:320px;overflow-y:auto;border:1px solid var(--line);border-radius:12px;margin-top:8px;background:var(--panel2);}
390
+ .focus-checklist{max-height:320px;overflow-y:auto;border:1px solid var(--line);border-radius:12px;margin-top:8px;background:var(--surface-2);}
317
391
  .fcheck{display:flex;align-items:center;gap:10px;padding:11px 12px;border-bottom:1px solid var(--line);cursor:pointer;}
318
392
  .fcheck:last-child{border-bottom:none;}
319
393
  .fcheck input{width:22px;height:22px;flex:0 0 22px;}
320
394
  .fcheck .fcname{flex:1;font-weight:600;}
321
- .fcheck .fcrank{font-size:.75rem;color:var(--muted);background:var(--panel);border:1px solid var(--line);border-radius:6px;padding:1px 7px;}
395
+ .fcheck .fcrank{font-size:.75rem;color:var(--muted);background:var(--surface);border:1px solid var(--line);border-radius:6px;padding:1px 7px;}
322
396
 
323
397
  .btn.addrow{
324
398
  display:inline-block;width:auto;padding:10px 16px;margin:4px 0 0 44px;
325
- font-size:.95rem;font-weight:700;border-radius:10px;
326
- background:var(--panel2);color:var(--gold);border:1px solid var(--gold-dim);
399
+ font-size:.95rem;font-weight:700;border-radius:10px;box-shadow:none;
400
+ background:var(--surface-2);color:var(--accent-text);border:1px solid var(--accent-dim);
327
401
  }
328
402
  .slottag{
329
- font-size:.85rem;background:var(--panel2);border:1px solid var(--gold-dim);
330
- border-radius:6px;padding:1px 6px;margin-right:4px;
403
+ display:inline-flex;align-items:center;gap:4px;
404
+ font-size:.85rem;background:var(--surface-2);border:1px solid var(--accent-dim);
405
+ color:var(--accent-text);border-radius:6px;padding:1px 6px;margin-right:4px;
331
406
  }
407
+ .slottag .icn{width:.95rem;height:.95rem;}
332
408
 
333
409
  /* ---- Bottom nav ---- */
334
410
  nav.bottom{
335
411
  position:fixed;bottom:0;left:0;right:0;z-index:30;
336
- background:#241810;border-top:2px solid var(--gold-dim);
412
+ background:var(--surface);border-top:1px solid var(--line);
337
413
  display:flex;justify-content:space-around;
338
414
  padding:6px 4px calc(6px + env(safe-area-inset-bottom));
339
415
  }
340
416
  nav.bottom button{
341
417
  flex:1;background:none;border:none;color:var(--muted);
342
- display:flex;flex-direction:column;align-items:center;gap:2px;
343
- padding:8px 2px;font-size:.72rem;font-weight:700;
418
+ display:flex;flex-direction:column;align-items:center;gap:3px;
419
+ padding:8px 2px;font-size:.7rem;font-weight:700;
344
420
  }
345
- nav.bottom button .ic{font-size:1.5rem;line-height:1;}
346
- nav.bottom button.on{color:var(--gold);}
421
+ nav.bottom button .ic{font-size:1.4rem;line-height:1;display:inline-flex;}
422
+ nav.bottom button.on{color:var(--accent-text);}
347
423
  .toast{
348
424
  position:fixed;bottom:96px;left:50%;transform:translateX(-50%);
349
- background:var(--gold);color:#2a1c0c;font-weight:800;padding:12px 20px;
425
+ background:var(--accent);color:var(--accent-ink);font-weight:800;padding:12px 20px;
350
426
  border-radius:30px;z-index:50;opacity:0;transition:opacity .25s;pointer-events:none;
351
- box-shadow:0 4px 16px rgba(0,0,0,.5);
427
+ box-shadow:0 4px 16px rgba(0,0,0,.35);
352
428
  }
353
429
  .toast.show{opacity:1;}