Files
aetherbound-guild/docs/runtime/M52_RECRUIT_CARD_COMPONENT_CONTRACT.md
T

57 lines
2.0 KiB
Markdown

# M52 RecruitCard Component Contract
This is the first independently reviewable UI module in the M52 Market
reconstruction. It is intentionally not mounted by Market yet.
## Ownership tree
```text
ABGM52RecruitCard (Button)
├── VisualLayer
│ ├── CardShell
│ ├── ProfessionRibbon
│ ├── PortraitModule
│ │ ├── PortraitFrameOuter
│ │ ├── PortraitViewport (clip_contents=true)
│ │ │ ├── PortraitFrameInner
│ │ │ ├── PortraitImage (keep-aspect-covered)
│ │ │ └── PortraitShadow
│ │ ├── IdentityModule
│ │ ├── TraitModule
│ │ └── CostModule
├── StateLayer
│ └── SelectedBorder
└── HitArea
```
## Content rules
- The portrait keeps its aspect ratio and is center-cropped inside a fixed
viewport. It cannot paint over the frame or adjacent copy.
- The name is a single line with ellipsis inside `NamePlate`.
- The trait is a short, wrapped line inside `TraitModule`.
- Availability and cost are one line inside `CostModule`; the cost must remain
complete in the card's minimum play size.
- Dynamic text is engine-owned. Generated art supplies material and ornament,
never names, prices, or fake glyphs.
## State rules
`normal`, `hover`, `pressed`, `selected`, `disabled`, and `focus` are state
layers over the same geometry. State changes must not move the portrait,
identity, trait, or cost modules.
## Responsive rules
The card root receives a normalized slot from its parent. Children use local
normalized slots and local clipping. Background and paper may stretch; the
portrait and icons keep aspect; text is never geometrically stretched.
## Acceptance
- Component tree and slot boundaries pass
`m52_recruit_card_component_test.gd`.
- HTML showroom: `docs/prototype/m52_components/recruit_card/index.html`.
- Owner review is still required before this component is integrated into the
Market page.