Add rules edition setting for condition tooltips (5e/5.5e)
All checks were successful
CI / check (push) Successful in 1m8s
CI / build-image (push) Successful in 16s

Introduce a settings modal (opened from the kebab menu) with a rules
edition selector for condition tooltip descriptions and a theme picker
replacing the inline cycle button. About half the conditions have
meaningful mechanical differences between editions.

- Add description5e field to ConditionDefinition with 5e (2014) text
- Add RulesEditionProvider context with localStorage persistence
- Create SettingsModal with Conditions and Theme sections
- Wire condition tooltips to edition-aware descriptions
- Fix 6 inaccurate 5.5e condition descriptions
- Update spec 003 with stories CC-3, CC-8 and FR-095–FR-102

Closes #12

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Lukas
2026-03-24 17:08:41 +01:00
parent cfd4aef724
commit 4043612ccf
18 changed files with 663 additions and 82 deletions

View File

@@ -0,0 +1,44 @@
import { describe, expect, it } from "vitest";
import {
CONDITION_DEFINITIONS,
getConditionDescription,
} from "../conditions.js";
function findCondition(id: string) {
const def = CONDITION_DEFINITIONS.find((d) => d.id === id);
if (!def) throw new Error(`Condition ${id} not found`);
return def;
}
describe("getConditionDescription", () => {
it("returns 5.5e description by default", () => {
const exhaustion = findCondition("exhaustion");
expect(getConditionDescription(exhaustion, "5.5e")).toBe(
exhaustion.description,
);
});
it("returns 5e description when edition is 5e", () => {
const exhaustion = findCondition("exhaustion");
expect(getConditionDescription(exhaustion, "5e")).toBe(
exhaustion.description5e,
);
});
it("every condition has both descriptions", () => {
for (const def of CONDITION_DEFINITIONS) {
expect(def.description).toBeTruthy();
expect(def.description5e).toBeTruthy();
}
});
it("conditions with identical rules share the same text", () => {
const blinded = findCondition("blinded");
expect(blinded.description).toBe(blinded.description5e);
});
it("conditions with different rules have different text", () => {
const exhaustion = findCondition("exhaustion");
expect(exhaustion.description).not.toBe(exhaustion.description5e);
});
});