- Add crew_req, hardpoints, cargo fields (DB migration + server + types) - Add 10 ship templates from Appendix A (Caravel, Galleon, Sloop, etc.) - Enhanced CreateShipModal with template picker that auto-fills all stats - Dashboard defaults to compact read-only view; Edit button toggles to editable steppers/dropdowns - New CrewSection showing crew required, hardpoints, and cargo - Two-column form layout in create modal for better use of space - Fix .gitignore data/ pattern to only match root-level data directory Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
74 lines
2.4 KiB
TypeScript
74 lines
2.4 KiB
TypeScript
import NumericStepper from '../ui/NumericStepper';
|
|
import type { Ship } from '../../types/ship';
|
|
|
|
interface Props {
|
|
ship: Ship;
|
|
onUpdate: (patch: Partial<Ship>) => void;
|
|
editing: boolean;
|
|
}
|
|
|
|
export default function VitalsSection({ ship, onUpdate, editing }: Props) {
|
|
return (
|
|
<section className="dashboard-section">
|
|
<h3 className="section-title">Vitals</h3>
|
|
{editing ? (
|
|
<div className="stat-grid">
|
|
<NumericStepper
|
|
label="Hull"
|
|
value={ship.hull_current}
|
|
max={ship.hull_max}
|
|
onChange={(v) => onUpdate({ hull_current: v })}
|
|
/>
|
|
<NumericStepper
|
|
label="Hull Max"
|
|
value={ship.hull_max}
|
|
min={ship.hull_current}
|
|
onChange={(v) => onUpdate({ hull_max: v })}
|
|
/>
|
|
<NumericStepper
|
|
label="Armor"
|
|
value={ship.armor_current}
|
|
max={ship.armor_max}
|
|
onChange={(v) => onUpdate({ armor_current: v })}
|
|
/>
|
|
<NumericStepper
|
|
label="Armor Max"
|
|
value={ship.armor_max}
|
|
min={ship.armor_current}
|
|
onChange={(v) => onUpdate({ armor_max: v })}
|
|
/>
|
|
<NumericStepper
|
|
label="AC"
|
|
value={ship.ac}
|
|
onChange={(v) => onUpdate({ ac: v })}
|
|
/>
|
|
<NumericStepper
|
|
label="Con Save"
|
|
value={ship.con_save ?? 0}
|
|
onChange={(v) => onUpdate({ con_save: v })}
|
|
/>
|
|
</div>
|
|
) : (
|
|
<div className="stat-grid-readonly">
|
|
<div className="stat-ro">
|
|
<span className="stat-ro-label">Hull</span>
|
|
<span className="stat-ro-value">{ship.hull_current}/{ship.hull_max}</span>
|
|
</div>
|
|
<div className="stat-ro">
|
|
<span className="stat-ro-label">AC</span>
|
|
<span className="stat-ro-value">{ship.ac}</span>
|
|
</div>
|
|
<div className="stat-ro">
|
|
<span className="stat-ro-label">Armor</span>
|
|
<span className="stat-ro-value">{ship.armor_current}/{ship.armor_max}</span>
|
|
</div>
|
|
<div className="stat-ro">
|
|
<span className="stat-ro-label">Con</span>
|
|
<span className="stat-ro-value">{ship.con_save != null ? `+${ship.con_save}` : '—'}</span>
|
|
</div>
|
|
</div>
|
|
)}
|
|
</section>
|
|
);
|
|
}
|