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.
@@ -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/dist/sw.js CHANGED
@@ -2,7 +2,7 @@
2
2
  Network-first for the app page (fresh when online, cached when offline),
3
3
  cache-first for static assets. Cache version is stamped at build time so a
4
4
  redeploy refreshes clients automatically. */
5
- const CACHE = "pf2e-spellbook-20260627130553";
5
+ const CACHE = "pf2e-spellbook-20260705220027";
6
6
  const SHELL = ["./", "./index.html", "./manifest.webmanifest", "./icon.svg"];
7
7
 
8
8
  self.addEventListener("install", (e) => {
package/package.json CHANGED
@@ -1,11 +1,22 @@
1
1
  {
2
2
  "name": "pf2e-spellbook",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "Interactive Pathfinder 2e spellbook (single self-contained HTML).",
5
- "keywords": ["pathfinder", "pf2e", "spellbook", "spells", "ttrpg"],
5
+ "keywords": [
6
+ "pathfinder",
7
+ "pf2e",
8
+ "spellbook",
9
+ "spells",
10
+ "ttrpg"
11
+ ],
6
12
  "homepage": "https://thewhytewolf.github.io/pf2espellcards/",
7
- "repository": { "type": "git", "url": "git+https://github.com/TheWhyteWolf/pf2espellcards.git" },
8
- "bugs": { "url": "https://github.com/TheWhyteWolf/pf2espellcards/issues" },
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "git+https://github.com/TheWhyteWolf/pf2espellcards.git"
16
+ },
17
+ "bugs": {
18
+ "url": "https://github.com/TheWhyteWolf/pf2espellcards/issues"
19
+ },
9
20
  "author": "Whyte",
10
21
  "license": "SEE LICENSE IN LICENSE",
11
22
  "type": "module",
package/src/classes.js CHANGED
@@ -52,6 +52,46 @@ function psychicSlots(level){
52
52
  return slots;
53
53
  }
54
54
 
55
+ /* ============================================================
56
+ INLINE SVG ICON REGISTRY
57
+ Thin line icons (24x24, stroke = currentColor) so they inherit the
58
+ active accent colour. Keyed by name; classes/features reference a key
59
+ instead of an emoji. iconSvg() wraps the path data in an <svg>.
60
+ ============================================================ */
61
+ const ICONS={
62
+ /* classes */
63
+ cleric:'<circle cx="12" cy="12" r="3.4"/><path d="M12 3v2.6M12 18.4V21M3 12h2.6M18.4 12H21M5.6 5.6l1.9 1.9M16.5 16.5l1.9 1.9M18.4 5.6l-1.9 1.9M7.5 16.5l-1.9 1.9"/>',
64
+ wizard:'<path d="M12 3.5 4.5 19.5h15z"/><circle cx="12" cy="13.5" r="1.9"/>',
65
+ druid:'<path d="M5 19.5C5 11 10.5 5 19 4.5 19 13 13.5 19 5 19.5z"/><path d="M11.5 12 5 19.5"/>',
66
+ witch:'<path d="M17.5 15.2A6 6 0 1 1 11.3 5a5 5 0 0 0 6.2 10.2z"/><path d="M18.3 3.6l.8 1.9 1.9.8-1.9.8-.8 1.9-.8-1.9-1.9-.8 1.9-.8z"/>',
67
+ sorcerer:'<path d="M12 3c2.8 3.6 4.6 5.6 4.6 8.4a4.6 4.6 0 0 1-9.2 0c0-1.2.6-2.2 1.6-3.1.3 1.1 1 1.6 1.6 1.6C9.4 8.4 10.3 5.7 12 3z"/>',
68
+ bard:'<path d="M9.5 17.5V6.2l9-2v9.6"/><circle cx="6.8" cy="17.5" r="2.4"/><circle cx="15.8" cy="15.8" r="2.4"/>',
69
+ oracle:'<path d="M2.5 12S6 6 12 6s9.5 6 9.5 6-3.5 6-9.5 6-9.5-6-9.5-6z"/><circle cx="12" cy="12" r="2.4"/>',
70
+ magus:'<path d="M17.5 3.5 20.5 6.5 12 15l-3 1 1-3z"/><path d="M8 14l-4 4"/><path d="M5.5 15.5l3 3"/>',
71
+ summoner:'<circle cx="9.2" cy="12" r="4.8"/><circle cx="14.8" cy="12" r="4.8"/>',
72
+ psychic:'<path d="M12 12a1.5 1.5 0 1 0 1.6-1.5A3.6 3.6 0 1 0 8.4 12 5.7 5.7 0 1 0 17.7 7.7"/>',
73
+ animist:'<path d="M12 3c2 2.5 3.1 4 3.1 6a3.1 3.1 0 0 1-6.2 0c0-1 .5-2 1.5-2.9.3.8.8 1.2 1.3 1.2C11 6 11 5 12 3z"/><path d="M12 12v6"/><path d="M9 21h6"/>',
74
+ /* navigation */
75
+ today:'<rect x="7" y="3.5" width="12.5" height="17" rx="2"/><path d="M4.5 7v11.5a2 2 0 0 0 2 2h9.5"/>',
76
+ prepare:'<path d="M3 18.5h18"/><path d="M6.5 18.5a5.5 5.5 0 0 1 11 0"/><path d="M12 3v3M4.2 8.7l1.7 1.7M19.8 8.7l-1.7 1.7"/>',
77
+ browse:'<path d="M4 5.2A2 2 0 0 1 6 3.2h5.2v15.6H6a2 2 0 0 0-2 2z"/><path d="M20 5.2a2 2 0 0 0-2-2h-5.2v15.6H18a2 2 0 0 1 2 2z"/>',
78
+ help:'<circle cx="12" cy="12" r="9"/><path d="M9.4 9.4a2.6 2.6 0 1 1 3.6 2.4c-.9.5-1.1 1-1.1 1.9"/><path d="M12 16.7v.01"/>',
79
+ /* features / utility */
80
+ school:'<path d="M2.5 8.5 12 4.5l9.5 4-9.5 4z"/><path d="M6.5 10.5v4c0 1.5 11 1.5 11 0v-4"/><path d="M21.5 8.5v5"/>',
81
+ bonded:'<path d="M9.3 12.4a3 3 0 0 1 0-4.2l1.9-1.9a3 3 0 0 1 4.2 4.2l-1 1"/><path d="M14.7 11.6a3 3 0 0 1 0 4.2l-1.9 1.9a3 3 0 0 1-4.2-4.2l1-1"/>',
82
+ heal:'<path d="M12 5.5v13M5.5 12h13"/>',
83
+ harm:'<path d="M12 3a7 7 0 0 0-7 7c0 2 1 3.6 2.2 4.6V17a1 1 0 0 0 1 1h7.6a1 1 0 0 0 1-1v-2.4C19 13.6 20 12 20 10a7 7 0 0 0-7-7z" transform="translate(-1 0)"/><circle cx="8.5" cy="10.5" r="1.1"/><circle cx="13.5" cy="10.5" r="1.1"/><path d="M9 18v2M11 18v2M13 18v2"/>',
84
+ menu:'<circle cx="12" cy="8" r="3.4"/><path d="M5.5 20a6.5 6.5 0 0 1 13 0"/>',
85
+ filter:'<path d="M4 7h16M4 12h16M4 17h16"/><circle cx="9" cy="7" r="2"/><circle cx="15" cy="12" r="2"/><circle cx="8" cy="17" r="2"/>',
86
+ plus:'<path d="M12 5.5v13M5.5 12h13"/>',
87
+ book:'<path d="M12 6.5C9.5 4.7 6 4.7 3.5 6v13c2.5-1.3 6-1.3 8.5.5 2.5-1.8 6-1.8 8.5-.5V6c-2.5-1.3-6-1.3-8.5.5z"/><path d="M12 6.5v13"/>',
88
+ };
89
+ function iconSvg(name, cls){
90
+ return '<svg class="icn '+(cls||"")+'" viewBox="0 0 24 24" fill="none" stroke="currentColor" '+
91
+ 'stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">'+
92
+ (ICONS[name]||"")+'</svg>';
93
+ }
94
+
55
95
  /* [minLevel, proficiency bonus] for spell DC / spell attack, highest first.
56
96
  Bonus = 2/4/6/8 for trained/expert/master/legendary.
57
97
  Wizard, Druid, Sorcerer, Bard, Oracle, Psychic and the Cloistered Cleric
@@ -99,13 +139,13 @@ const CORE_HELP=[
99
139
  ["Remaster vs. legacy (original) rules",
100
140
  "This app uses the current <b>Remaster</b> spell names and rules. If your group still plays the <b>original</b> (pre-Remaster) edition, most spells are identical — and renamed ones show a small <i>“formerly …”</i> note, so you can also <b>search by the old name</b> (e.g. searching <b>Magic Missile</b> finds <b>Force Barrage</b>). A few legacy spells that weren't changed are still listed under their original names too.<br><br>A few wording changes to keep in mind: spell <b>rank</b> = spell <b>level</b>; <b>vitality</b>/<b>void</b> damage = the old <b>positive</b>/<b>negative</b>; and <b>holy</b>/<b>unholy</b> replace the old <b>good</b>/<b>evil</b> alignment damage. The numbers and effects are the same."],
101
141
  ["Multiple characters, backup & sharing",
102
- "Tap the <b>👤</b> button (top right) to keep <b>several characters</b> and switch between them — each remembers its own prepared spells. From there you can also <b>Export</b> a character to a code to back it up or send to a friend, and <b>Import</b> a code someone shares with you. Everything is stored on your device."],
142
+ "Tap the <b>character</b> button (top right) to keep <b>several characters</b> and switch between them — each remembers its own prepared spells. From there you can also <b>Export</b> a character to a code to back it up or send to a friend, and <b>Import</b> a code someone shares with you. Everything is stored on your device."],
103
143
  ];
104
144
 
105
145
  const CLASSES={
106
146
  /* ---------------- CLERIC ---------------- */
107
147
  cleric:{
108
- id:"cleric", name:"Cleric", icon:"",
148
+ id:"cleric", name:"Cleric", icon:"cleric", color:"#d8a23a",
109
149
  tagline:"Divine prepared caster · the party's main healer",
110
150
  tradition:"divine", keyAbility:"Wisdom", keyAbilityShort:"Wis",
111
151
  casting:"prepared", slots:"full", prof:FULL_CASTER_PROF, cantrips:5,
@@ -128,63 +168,59 @@ const CLASSES={
128
168
 
129
169
  /* ---------------- WIZARD ---------------- */
130
170
  wizard:{
131
- id:"wizard", name:"Wizard", icon:"🪄",
171
+ id:"wizard", name:"Wizard", icon:"wizard", color:"#7b6cf0",
132
172
  tagline:"Arcane prepared caster · the widest spell list",
133
173
  tradition:"arcane", keyAbility:"Intelligence", keyAbilityShort:"Int",
134
174
  casting:"prepared", slots:"full", prof:FULL_CASTER_PROF, cantrips:5,
135
- preview:true,
136
175
  features:[
137
- {type:"extraSlots", key:"school", icon:"🎓", label:"Arcane school slot",
176
+ {type:"extraSlots", key:"school", icon:"school", label:"Arcane school slot",
138
177
  note:"One extra slot of each rank you can cast, which must hold a spell from your chosen school / curriculum."},
139
- {type:"dailyResource", key:"bonded", icon:"🔗", label:"Drain Bonded Item", uses:1,
178
+ {type:"dailyResource", key:"bonded", icon:"bonded", label:"Drain Bonded Item", uses:1,
140
179
  note:"Once per day, recast a spell you already cast today without spending its slot."},
141
180
  ],
142
181
  help:[
143
182
  ["What does a wizard do?",
144
183
  "You're an <b>Arcane</b> prepared caster with the broadest spell list in the game. You Prepare spells each morning from your spellbook, leaning on control and damage like <b>Fireball</b> plus utility."],
145
184
  ["Arcane school slot",
146
- "Your school (curriculum) gives you <b>one extra prepared slot of every rank</b> you can cast. Fill the 🎓 slots with spells from your school. The app adds these slots automatically."],
185
+ "Your school (curriculum) gives you <b>one extra prepared slot of every rank</b> you can cast. Fill the <b>school</b> slots with spells from your school. The app adds these slots automatically."],
147
186
  ["Drain Bonded Item",
148
- "Once per day you can <b>Drain your Bonded Item</b> to recast a spell you've already cast that day, without spending another slot. Tick the 🔗 tracker on Cast Today when you use it."],
187
+ "Once per day you can <b>Drain your Bonded Item</b> to recast a spell you've already cast that day, without spending another slot. Tick the <b>Drain Bonded Item</b> tracker on Cast Today when you use it."],
149
188
  ],
150
189
  },
151
190
 
152
191
  /* ---------------- DRUID ---------------- */
153
192
  druid:{
154
- id:"druid", name:"Druid", icon:"🌿",
193
+ id:"druid", name:"Druid", icon:"druid", color:"#4faf6d",
155
194
  tagline:"Primal prepared caster · nature's versatility",
156
195
  tradition:"primal", keyAbility:"Wisdom", keyAbilityShort:"Wis",
157
196
  casting:"prepared", slots:"full", prof:FULL_CASTER_PROF, cantrips:5,
158
- preview:true,
159
197
  features:[{type:"note", title:"Druidic order", text:"Pick your order's focus spells (Heal Animal, Tempest Surge, Wild/Untamed Form…) in the Focus section below. Companion/familiar bookkeeping stays on your sheet."}],
160
198
  help:[
161
199
  ["What does a druid do?",
162
- "You're a <b>Primal</b> prepared caster tied to nature, with strong healing, control, and battlefield spells. Many druids also use order focus spells to shapeshift (coming soon to the app)."],
200
+ "You're a <b>Primal</b> prepared caster tied to nature, with strong healing, control, and battlefield spells. Many druids also use order focus spells to shapeshift add the ones you know in the Focus section."],
163
201
  ],
164
202
  },
165
203
 
166
204
  /* ---------------- WITCH ---------------- */
167
205
  witch:{
168
- id:"witch", name:"Witch", icon:"🔮",
206
+ id:"witch", name:"Witch", icon:"witch", color:"#b061b8",
169
207
  tagline:"Prepared caster · your patron sets the tradition",
170
208
  traditionFrom:"patron", defaultTradition:"occult",
171
209
  keyAbility:"Intelligence", keyAbilityShort:"Int",
172
210
  casting:"prepared", slots:"full", prof:FULL_CASTER_PROF, cantrips:5,
173
- preview:true,
174
211
  features:[{type:"note", title:"Hexes & familiar", text:"Choose your patron's tradition above, then add your hex focus spells in the Focus section below. Familiar details stay on your sheet."}],
175
212
  help:[
176
213
  ["What does a witch do?",
177
- "You're a prepared caster whose <b>patron</b> grants your magic — set your patron's <b>tradition</b> (arcane, divine, occult, or primal) in the character section, and your spell list follows. Witches also cast <b>hexes</b> through a familiar (coming soon)."],
214
+ "You're a prepared caster whose <b>patron</b> grants your magic — set your patron's <b>tradition</b> (arcane, divine, occult, or primal) in the character section, and your spell list follows. Witches also cast <b>hexes</b> add your hex focus spells in the Focus section (your familiar stays on your sheet)."],
178
215
  ],
179
216
  },
180
217
 
181
218
  /* ---------------- SORCERER ---------------- */
182
219
  sorcerer:{
183
- id:"sorcerer", name:"Sorcerer", icon:"",
220
+ id:"sorcerer", name:"Sorcerer", icon:"sorcerer", color:"#e05a52",
184
221
  tagline:"Spontaneous caster · magic in the blood",
185
222
  traditionFrom:"bloodline", keyAbility:"Charisma", keyAbilityShort:"Cha",
186
223
  casting:"spontaneous", slots:"full", prof:FULL_CASTER_PROF, cantrips:5,
187
- preview:true,
188
224
  features:[
189
225
  {type:"signature"},
190
226
  {type:"note", title:"Bloodline magic", text:"Add your bloodline focus spells in the Focus section below. Blood-magic side effects are described on each spell but tracked by you."},
@@ -199,18 +235,17 @@ const CLASSES={
199
235
 
200
236
  /* ---------------- BARD ---------------- */
201
237
  bard:{
202
- id:"bard", name:"Bard", icon:"🎵",
238
+ id:"bard", name:"Bard", icon:"bard", color:"#34a8c4",
203
239
  tagline:"Occult spontaneous caster · master of support",
204
240
  tradition:"occult", keyAbility:"Charisma", keyAbilityShort:"Cha",
205
241
  casting:"spontaneous", slots:"full", prof:FULL_CASTER_PROF, cantrips:5,
206
- preview:true,
207
242
  features:[
208
243
  {type:"signature"},
209
244
  {type:"note", title:"Compositions & muse", text:"Add your composition focus spells (Courageous Anthem, Counter Performance…) in the Focus section below."},
210
245
  ],
211
246
  help:[
212
247
  ["What does a bard do?",
213
- "You're an <b>Occult</b> <b>spontaneous</b> caster and the game's best supporter. You build a repertoire and cast flexibly, and your composition cantrips/focus spells buff the party (coming soon)."],
248
+ "You're an <b>Occult</b> <b>spontaneous</b> caster and the game's best supporter. You build a repertoire and cast flexibly, and your composition cantrips/focus spells buff the party add them in the Focus section."],
214
249
  ["Signature spells",
215
250
  "Mark spells as <b>signature</b> (the ★) to heighten them with higher-rank slots. One per rank is the usual choice."],
216
251
  ],
@@ -218,30 +253,35 @@ const CLASSES={
218
253
 
219
254
  /* ---------------- ORACLE ---------------- */
220
255
  oracle:{
221
- id:"oracle", name:"Oracle", icon:"👁",
256
+ id:"oracle", name:"Oracle", icon:"oracle", color:"#c061d6",
222
257
  tagline:"Divine spontaneous caster · power at a price",
223
258
  tradition:"divine", keyAbility:"Charisma", keyAbilityShort:"Cha",
224
259
  casting:"spontaneous", slots:"full", prof:FULL_CASTER_PROF, cantrips:5,
225
- preview:true,
226
260
  features:[
227
261
  {type:"signature"},
228
- {type:"note", title:"Mystery & revelations", text:"Add your revelation focus spells in the Focus section below. Your escalating oracular curse is tracked on your sheet."},
262
+ {type:"stageTracker", key:"curse", icon:"oracle", label:"Oracular curse", max:4,
263
+ note:"Your curse deepens by a stage each time you use a cursebound action — stronger effects, worse drawbacks. Resting clears it."},
264
+ {type:"note", title:"Mystery & revelations", text:"Add your revelation focus spells in the Focus section below, and track your escalating oracular curse on Cast Today."},
229
265
  ],
230
266
  help:[
231
267
  ["What does an oracle do?",
232
- "You're a <b>Divine</b> <b>spontaneous</b> caster channeling a <b>mystery</b>. You build a repertoire and cast flexibly; your revelation spells deepen an escalating <b>curse</b> (coming soon)."],
268
+ "You're a <b>Divine</b> <b>spontaneous</b> caster channeling a <b>mystery</b>. You build a repertoire and cast flexibly. Add your revelation focus spells in the Focus section; your escalating <b>curse</b> is tracked on your sheet."],
233
269
  ["Signature spells",
234
270
  "Mark spells as <b>signature</b> (the ★) to heighten them with higher-rank slots — usually one per spell rank."],
235
271
  ],
236
272
  },
237
273
  /* ---------------- MAGUS ---------------- */
238
274
  magus:{
239
- id:"magus", name:"Magus", icon:"⚔️",
275
+ id:"magus", name:"Magus", icon:"magus", color:"#5d82e0",
240
276
  tagline:"Arcane half-caster · blade and spell as one",
241
277
  tradition:"arcane", keyAbility:"Intelligence", keyAbilityShort:"Int",
242
278
  casting:"prepared", slots:"partial", prof:PARTIAL_CASTER_PROF, cantrips:5,
243
- preview:true,
244
- features:[{type:"note", title:"Spellstrike & conflux spells", text:"Add your conflux focus spells (Force Fang, etc.) in the Focus section. Spellstrike itself is a martial action recharged by Arcane Cascade — track it on your sheet. You have only a few spell slots, always in your top two ranks."}],
279
+ features:[
280
+ {type:"studiousSlots", key:"studious", minLevel:7, rank:2, count:2, label:"Studious spells",
281
+ spells:["gecko-grip","sure-strike","water-breathing"],
282
+ note:"From level 7, two extra 2nd-rank slots for utility spells only: Gecko Grip, Sure Strike, or Water Breathing — plus one spell from your hybrid study, which you add on your sheet."},
283
+ {type:"note", title:"Spellstrike & conflux spells", text:"Add your conflux focus spells (Force Fang, etc.) in the Focus section. Spellstrike itself is a martial action recharged by Arcane Cascade — track it on your sheet. Your main spell slots are always your top two ranks."},
284
+ ],
245
285
  help:[
246
286
  ["What does a magus do?",
247
287
  "You're a martial <b>Arcane</b> caster who fuses weapon strikes with spells via <b>Spellstrike</b>. You only get a <b>handful of spell slots</b> (always your two highest ranks), so each prepared spell is precious — often a damaging spell to channel through Spellstrike."],
@@ -252,14 +292,13 @@ const CLASSES={
252
292
 
253
293
  /* ---------------- SUMMONER ---------------- */
254
294
  summoner:{
255
- id:"summoner", name:"Summoner", icon:"👹",
295
+ id:"summoner", name:"Summoner", icon:"summoner", color:"#2bb59a",
256
296
  tagline:"Half-caster · you and your eidolon, as one",
257
297
  traditionFrom:"patron", defaultTradition:"arcane",
258
298
  traditionChoiceLabel:"Eidolon's tradition",
259
299
  traditionChoiceHint:"your eidolon's essence sets your spell tradition",
260
300
  keyAbility:"Charisma", keyAbilityShort:"Cha",
261
301
  casting:"spontaneous", slots:"partial", prof:PARTIAL_CASTER_PROF, cantrips:5,
262
- preview:true,
263
302
  features:[
264
303
  {type:"signature"},
265
304
  {type:"note", title:"Eidolon & shared life", text:"Choose your eidolon's tradition above and add evolution focus spells in the Focus section. You get only a few slots (top two ranks). Your shared HP pool and the eidolon's actions stay on your sheet."},
@@ -274,14 +313,15 @@ const CLASSES={
274
313
 
275
314
  /* ---------------- PSYCHIC ---------------- */
276
315
  psychic:{
277
- id:"psychic", name:"Psychic", icon:"🧠",
316
+ id:"psychic", name:"Psychic", icon:"psychic", color:"#e05fa6",
278
317
  tagline:"Occult spontaneous caster · few spells, mighty cantrips",
279
318
  tradition:"occult", keyAbility:"Int or Cha", keyAbilityShort:"Key",
280
- casting:"spontaneous", slots:"psychic", prof:FULL_CASTER_PROF, cantrips:5,
281
- preview:true,
319
+ casting:"spontaneous", slots:"psychic", prof:FULL_CASTER_PROF, cantrips:3,
282
320
  features:[
283
321
  {type:"signature"},
284
- {type:"note", title:"Psi cantrips, Amps & Unleash Psyche", text:"Your psi cantrips appear in the Focus section — cast them at will, and spend a Focus Point to Amp them (use Refocus to recover). Your spell DC uses Intelligence or Charisma, whichever your conscious mind chose. Unleash Psyche is tracked on your sheet."},
322
+ {type:"dailyResource", key:"unleash", icon:"psychic", label:"Unleash Psyche", uses:1, verb:"Unleash", recharge:"refocus",
323
+ note:"Surge your psyche for 2 rounds — bigger cantrips and better spell attacks. Afterward your mind is strained; Refocus to Unleash again."},
324
+ {type:"note", title:"Psi cantrips & Amps", text:"Your psi cantrips appear in the Focus section — cast them at will, or spend a Focus Point to Amp them (tap Amp). Refocus to recover points. Your spell DC uses Intelligence or Charisma, whichever your conscious mind chose."},
285
325
  ],
286
326
  help:[
287
327
  ["What does a psychic do?",
@@ -293,15 +333,14 @@ const CLASSES={
293
333
 
294
334
  /* ---------------- ANIMIST ---------------- */
295
335
  animist:{
296
- id:"animist", name:"Animist", icon:"🕯️",
336
+ id:"animist", name:"Animist", icon:"animist", color:"#e08a3c",
297
337
  tagline:"Divine prepared caster · channels apparitions (spirits)",
298
338
  tradition:"divine", keyAbility:"Wisdom", keyAbilityShort:"Wis",
299
339
  casting:"prepared", slots:"full", prof:FULL_CASTER_PROF, cantrips:4,
300
- preview:true,
301
340
  features:[{type:"note", title:"Apparitions & vessel spells", text:"You prepare divine spells; your attuned apparitions grant a vessel focus spell (add the ones you know in the Focus section below) and a separate spontaneous repertoire of apparition spells that stays on your character sheet."}],
302
341
  help:[
303
342
  ["What does an animist do?",
304
- "You're a <b>Divine</b> prepared caster who channels <b>apparitions</b> — spirits that lend you power. You prepare divine spells like a cleric, and your attuned apparitions grant extra spells plus a <b>vessel</b> focus spell. The app tracks your divine slots, cantrips and DC; apparition attunement and the apparition repertoire stay on your sheet (coming soon)."],
343
+ "You're a <b>Divine</b> prepared caster who channels <b>apparitions</b> — spirits that lend you power. You prepare divine spells like a cleric, and your attuned apparitions grant extra spells plus a <b>vessel</b> focus spell. The app tracks your divine slots, cantrips and DC; apparition attunement and the apparition repertoire stay on your character sheet."],
305
344
  ["Cantrips & apparitions",
306
345
  "You know <b>4 cantrips</b> — two you choose plus two granted by your attuned apparitions. Your <b>vessel</b> focus spell (from your primary apparition) appears in the Focus section; cast it with Focus Points like other focus spells."],
307
346
  ],