diff --git a/frontend/src/index.css b/frontend/src/index.css index 1324cc5..b606071 100644 --- a/frontend/src/index.css +++ b/frontend/src/index.css @@ -1163,13 +1163,19 @@ button:disabled { opacity: 0.45; cursor: default; transform: none; box-shadow: n font-variant-numeric: tabular-nums; /* A chip must never be wider than the column it sits in: an NPC stat like "bandit leader aggression +10" overruns a phone, and the chip row is - inside the story text, which has nothing to scroll. The label may break - mid-word as a last resort; the value is glued to it by its own nowrap so - the sign and number never end up on separate lines. */ + inside the story text, which has nothing to scroll. Text may break + mid-word as a last resort, which is what keeps a chip's minimum width + small enough for the flex row to shrink it. */ max-width: 100%; overflow-wrap: anywhere; } -.chg-val { white-space: nowrap; } +.chg-val { overflow-wrap: anywhere; } +/* Only a signed number is held on one line, so the sign never ends up on a + line of its own. The other values a chip can carry are phrases — a refusal + reason, "no change — at its limit", or the whole new value of a free-text + stat — and holding those together set the chip's minimum width to the width + of the phrase, which is what pushed a chip out of the message on a phone. */ +.chg-num { white-space: nowrap; } .chg-up { color: var(--player, #4caf82); border-color: color-mix(in srgb, var(--player, #4caf82) 40%, var(--border)); } .chg-down { color: var(--danger, #e5484d); border-color: color-mix(in srgb, var(--danger, #e5484d) 40%, var(--border)); } .chg-flag { color: var(--accent-bright); } diff --git a/frontend/src/pages/Play.jsx b/frontend/src/pages/Play.jsx index 1854b40..93bd2f9 100644 --- a/frontend/src/pages/Play.jsx +++ b/frontend/src/pages/Play.jsx @@ -1252,9 +1252,10 @@ function StateChangeChips({ changes }) { // neither an update nor a refusal, and "+0" read as the former. const blocked = c.clamped && d === 0 const dir = blocked ? 'refused' : typeof d === 'number' ? (d > 0 ? 'up' : d < 0 ? 'down' : 'flat') : 'flat' + const signed = !blocked && typeof d === 'number' const txt = blocked ? 'no change — at its limit' - : typeof d === 'number' ? (d > 0 ? `+${d}` : `${d}`) : `→ ${c.value}` + : signed ? (d > 0 ? `+${d}` : `${d}`) : `→ ${c.value}` const title = blocked ? c.fix || 'The story asked to change this and it is already at the limit the scenario allows.' : c.clamped @@ -1262,7 +1263,7 @@ function StateChangeChips({ changes }) { : undefined return ( - {nice(c.label)} {txt} + {nice(c.label)} {txt} {c.clamped && !blocked ? (limited) : null} )