Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion BACKLOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ If any seat would be confused, the component fails.
### Spec detail (`/problems/:roundId/:specId`)

- Spec header + plain-English summary — ● ● ● — sentence above diagram ties material+load+arm+MPa together; chips on H1 row carry tooltips. (step 344, `735dbec`)
- Spec spec-card (material / load / wall / overhang / score) — ◐ ◐ ○units (N vs kg) repeated; "SF 1.5×" cryptic.
- Spec spec-card (material / load / wall / overhang / score) — ● ● ●Load chip now reads `15 kg (149 N) load` with cross-unit inline (was `15 kg load`); chip tooltip explains "149 N is the force the FEA solver applies; 15 kg is the everyday equivalent" so a first-timer reading the chip AND the SpecDiagram's `↓ 149N` label sees the units agree instead of wondering "wait, is it 15 or 149?". `SF 1.5×` → `Safety factor 1.5×` per step 280 spell-out pattern (no abbreviations on first-contact UI); tooltip now resolves the multiplier to the concrete `27 MPa` allowable for this material. Plain-English paragraph also gains `(149 N)` after `15 kg` so the cross-unit reads identically in prose. (`HeroStats.tsx` L168-182, L203-209, step 381)
- `SpecDiagram` (front view + side view miniature) — ○ ○ ○ — too small; load arrow direction not labeled.
- 4 KPI tiles (best mass / vs reference / stress margin / passing entries) — ● ● ● — clean.
- "Maintainer reference still leads" banner — ● ● ● — banner now front-loads the category direction sentence ("Lower mass wins this category" / "Higher stiffness wins this category" / "Lower deflection wins this category") before the gap %, and uses metric-specific gap verbs ("is 5.2% heavier than the reference at 263.20 g" / "still falls X% short of the reference at Y N/(mm·g)" / "deflects X% more than the reference at Y mm"). Bar-to-beat is inline with the percentage so a first-timer reads direction → gap → concrete target in one pass. (`HeroStats.tsx` L281–319, step 352)
Expand Down
11 changes: 6 additions & 5 deletions src/components/HeroStats.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -166,14 +166,14 @@ export function HeroStats({ spec, sota, submissionCount, round }: Props) {
{MATERIAL_META[spec.material]?.label ?? spec.material.toUpperCase().replace(/_/g, " ")}
</InfoChip>
<InfoChip
title={`${spec.constraints.load_newtons.toFixed(0)} N (≈ ${loadKg} kg under Earth gravity) applied downward (-Z) at the arm tipthe load point. Your design must survive this without exceeding the allowable stress.`}
title={`${spec.constraints.load_newtons.toFixed(0)} N is the force the FEA solver applies; ${loadKg} kg is the everyday equivalent (1 kg ≈ 9.81 N under Earth gravity). The load points downward (-Z) at the arm tip. The diagram below shows the same number in newtons — the units match, only the framing differs.`}
>
{loadKg} kg load
{loadKg} kg <span className="text-forge-muted/70">({spec.constraints.load_newtons.toFixed(0)} N)</span> load
</InfoChip>
<InfoChip
title={`Safety factor ${spec.constraints.safety_factor}× — yield stress ÷ SF = max allowable stress. Higher = stricter design requirement.`}
title={`Safety factor ${spec.constraints.safety_factor}× — yield stress ÷ safety factor = max allowable stress (${allowable.toFixed(0)} MPa for this material). Higher safety factor = stricter design requirement.`}
>
SF {spec.constraints.safety_factor}×
Safety factor {spec.constraints.safety_factor}×
</InfoChip>
<InfoChip
title={`Max allowable stress = ${spec.material.includes("aluminum") || spec.material.includes("stainless") ? "yield strength" : "tensile strength"} ÷ safety factor ${spec.constraints.safety_factor}×. Your design's peak von Mises stress must stay below this. MPa = megapascals (unit of pressure/stress).`}
Expand Down Expand Up @@ -201,7 +201,8 @@ export function HeroStats({ spec, sota, submissionCount, round }: Props) {
<p className="text-forge-text/85 text-xs leading-relaxed max-w-2xl mb-4">
<span className="text-white font-semibold">In plain English:</span>{" "}
a <span className="text-white">{materialLabel}</span> bracket bolted to a wall must hold{" "}
<span className="text-white">{loadKg} kg</span> pulling{" "}
<span className="text-white">{loadKg} kg</span>{" "}
<span className="text-forge-muted">({spec.constraints.load_newtons.toFixed(0)} N)</span> pulling{" "}
<span className="text-white">straight down</span> at the tip of a{" "}
<span className="text-white">{armMm} mm</span> cantilever arm, without exceeding{" "}
<span className="text-white">{allowable.toFixed(0)} MPa</span> peak stress (safety factor{" "}
Expand Down