- de.ts: traits-Array -> traitCategories (4 Kategorien: Sozialverhalten / Eignung & Umgang / Hobbys & Eigenarten / Wesen & Temperament); alle 15 bestehenden Keys erhalten (stored auf Live-Tieren); 10 neue Keys additiv; warn:true auf schwer-vergesellschaftbar + territorial. - format/traits.ts: TraitEntry/TraitCategory-Interface, TRAIT_CATEGORIES-Export, ALL_TRAITS via flatMap, neuer isWarnTrait()-Helper. - Charakterbogen.tsx: grouped-Rendering nach Kategorie (section + h4); warn-Chips mit trait-chip--warn-Klasse + trait-warn-badge. - charakterbogen.css: .trait-category__heading + .trait-chip--warn (amber) + .trait-warn-badge. - format/__tests__/traits.test.ts: 14 neue Vitest-Tests (Kategorien, Keys, warn, traitLabel/traitLabels). - Gate: vitest 122/122, tsc clean, build clean, eslint clean.
34 lines
1.0 KiB
TypeScript
34 lines
1.0 KiB
TypeScript
/** CHARAKTERBOGEN-2: map character trait KEYS (stored) <-> German LABELS (de.character.traitCategories). */
|
|
import { de } from '../strings/de'
|
|
|
|
export interface TraitEntry {
|
|
key: string
|
|
label: string
|
|
warn?: true
|
|
}
|
|
|
|
export interface TraitCategory {
|
|
category: string
|
|
traits: readonly TraitEntry[]
|
|
}
|
|
|
|
export const TRAIT_CATEGORIES: ReadonlyArray<TraitCategory> =
|
|
de.character.traitCategories as unknown as ReadonlyArray<TraitCategory>
|
|
|
|
export const ALL_TRAITS: readonly TraitEntry[] = TRAIT_CATEGORIES.flatMap((c) => c.traits)
|
|
|
|
const LABEL_BY_KEY = new Map<string, string>(ALL_TRAITS.map((t) => [t.key, t.label]))
|
|
|
|
export function traitLabel(key: string): string {
|
|
return LABEL_BY_KEY.get(key) ?? key
|
|
}
|
|
|
|
/** Selected keys -> German labels (for display + the AI sale-text prompt). */
|
|
export function traitLabels(keys: readonly string[] | null | undefined): string[] {
|
|
return (keys ?? []).map(traitLabel)
|
|
}
|
|
|
|
export function isWarnTrait(key: string): boolean {
|
|
return ALL_TRAITS.some((t) => t.key === key && t.warn === true)
|
|
}
|