StepSpecies hybrid mode now uses one grid combining sire-clade species
(under a "SIRE — <Clade>" eyebrow) and dam-clade species (under
"DAM — <Clade>"). Cards are click-to-select like the purebred path —
since clades are guaranteed disjoint by StepClade's parent-conflict
rule, the lineage is implicit from the species' clade and no per-card
toggles are needed.
Hover popover now picks up the codex theme: parchment Bg2 panel with a
gild border, rounded 14px corners, and soft drop shadow; H3 display
serif title, mono Eyebrow tag, CardBody description. Detriment popovers
swap to a 3px seal-red border via the panel_detriment stylebox override
(replaces the old red Modulate hack).
Theme propagation fix: CanvasLayer breaks Godot's Control theme
inheritance, so the popup was rendering on Godot defaults. _Ready
defers a lookup of the parent Control's theme and assigns it directly
to the popup so the codex parchment + Cormorant/CrimsonPro fonts
actually resolve.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Lights up the M5 codex design system across the wizard. Default
palette swaps from dark leather to aged-parchment cream with
sealing-wax red selection emphasis, matching the React prototype's
default theme variant. CodexTheme.Build() is applied at the wizard
root so every step + Aside + popover cascades through it.
Theme additions:
- Parchment palette in CodexPalette (Dark retained as alt)
- Type variations registered for Card, CodexPopover, Pill,
PillDetriment, AbilityToken, AbilitySlot, SkillRow — without
SetTypeVariation, panel-stylebox lookup falls through to Godot's
default dark slate, which is what was happening to every bare
PanelContainer before this pass.
- panel_hover stylebox on Card (gild border) wired via CodexCard's
MouseEntered/Exited helper; panel_selected bumped to 3px seal-red
border + soft shadow so selection reads at a glance.
Card selection refactor:
- Replaced the warm-cream Modulate hint on cards with stylebox swaps
via the new CodexCard.SetSelected helper. The Modulate approach
was a no-op on cream-on-cream parchment; the stylebox swap looks
the same on either palette.
- Step intros + Aside section headers now use the existing Eyebrow /
H2 / H3 / CardName / CardMeta / CardBody label variations.
- Confirm button on Step VIII uses the PrimaryButton variation.
Popover + chip behaviour:
- PopoverLayer is now MouseFilter=Ignore so clicks/scroll/hover all
pass through. Adjacent chips fire reliably even when the previous
popover overlaps them spatially.
- Dropped the 80ms grace timer; chip MouseExited closes immediately.
- TraitChip MouseFilter Stop → Pass so clicks bubble up to the
parent card's GuiInput (selecting the card).
Misc:
- Wizard._Ready inserts a backing Panel so the parchment Bg fills
the canvas — Wizard root is a plain Control, which paints nothing.
- CodexTheme font lookup tries Cormorant-Medium before -Regular and
globalizes res://Fonts/ for runtime FontFile load (the previous
fallback used ContentPaths which points at a sibling data tree).
- StepStats final-score Label rendered at font_size 22 to match the
AbilityToken die.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Programmatic Theme builder + reusable popover and stepper widgets,
ported from CharacterCreator.zip's :root design tokens. Kitchen-sink
scene exercises every primitive for visual eyeballing.
CodexPalette.cs:
Color tokens lifted verbatim from the React prototype's `:root`
block (--bg, --ink, --gild, --seal, etc.). Variable names mirror
the CSS so the audit trail stays readable. Spacing locked at the
prototype's normal density (--gap=24, --pad=28, --radius=2).
Scope cut: only the Dark theme ships. The React prototype designed
Parchment, Dark, and Blood as switchable variations — user direction
during M5 is that only Dark (leather + candlelight) is wanted for
this game. Parchment/Blood code dropped, plan doc updated to match
(§1 goal #5, §4.5 UI map, §5 M5 scope, §10 resolved decisions #4).
No runtime theme switcher.
CodexTheme.Build():
Programmatically constructs a Godot Theme from CodexPalette.Dark
plus CodexSpacing/CodexType tokens. Configures Panel, Card,
CodexPopover styleboxes; Label variations for H1..H4, CodexTitle,
Eyebrow, Meta, ValidationOk/Error, CardName/Body/Meta, StepperNum/
Name; Button + PrimaryButton + GhostButton variants; LineEdit,
CheckBox, scrollbar styling.
Fonts: looks for CormorantGaramond / CrimsonPro / JetBrainsMono
TTFs in res://Fonts/ (or Content/Fonts/) and graceful-falls-back to
Godot defaults if missing. M5 ships with no fonts in repo; user can
drop them in later for typography parity with the React prototype.
CodexPopover.cs:
Hoverable text trigger + floating PanelContainer, mirrors
src/trait-hint.jsx. Viewport-clamps horizontally and vertically;
flips above the trigger if there's no room below; 80 ms grace
period when moving cursor from trigger to popover. Detriment
variant uses the seal-coloured stylebox. Future TraitName /
SkillChip / BonusPill widgets layer className differences on top.
CodexStepper.cs:
Roman-numeral horizontal stepper with Pending / Active / Complete /
Locked states. Active step gets a 2-px gild underline, Complete
shows a ✓ in seal-red, Locked shows ✕ + 0.45 modulate. Emits
StepClicked(int) for non-locked rows. M5 is decorative — M6 wires
the signal to the character-creation state machine.
KitchenSink.cs + Main.cs --codex-test:
Verification scene rendering every primitive (header, stepper,
buttons, inputs, cards, trait popovers). Clicks log to console.
Fonts default to Godot's Noto Sans until res://Fonts/ is populated.
Closes M5 of theriapolis-rpg-implementation-plan-godot-port.md.
Next: M6 (title + character creation).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>