Skip to content

Commit fb4d6ce

Browse files
ryanbarlow97claude
andauthored
Cut jargon from the map and timelapse wording (#131)
* Cut jargon from the map and timelapse wording Plain access and missing-day messages, drop repeated tier and realm labels, call paint mode War planning, and remove snapshot, geometry and build-counter details from the timelapse and ledger panels. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep the map caveats Astra flagged Restore the forecast-versus-actual note, the visible nation-names notice, the pan and zoom hint and the code checker's note; say 'map history' in load errors and tighten the ledger legend. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
1 parent 1b282b3 commit fb4d6ce

32 files changed

Lines changed: 149 additions & 241 deletions

‎frontend/app/components/MapViewer.tsx‎

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ import {
9090
} from "@/lib/map/api";
9191
import { editorUrl } from "@/lib/map/editorAccess";
9292
import { chronicleStudioHref } from "@/app/lib/map/chronicleDayRoute";
93+
import { formatChronicleDay } from "@/app/lib/map/chronicleDayLabel";
9394
import { useResponsiveFitMode } from "@/app/hooks/useResponsiveFitMode";
9495
import { isArchivedMap, showReviewHistory } from "@/app/lib/map/archiveMaps";
9596
import MapArchiveMenu from "./map/MapArchiveMenu";
@@ -793,7 +794,6 @@ const MapViewer = ({ mapId, day = null, dayBar, dayActions }: MapViewerProps) =>
793794
setHoveredFortZoc,
794795
setSelectedRegionId: setHoveredRegionId,
795796
getHoverRegion,
796-
mapDisplayName: displayName,
797797
mapObjects,
798798
markers: mapMarkers,
799799
labels: regionLabels,
@@ -1213,6 +1213,8 @@ const MapViewer = ({ mapId, day = null, dayBar, dayActions }: MapViewerProps) =>
12131213
);
12141214
}
12151215

1216+
const dayLabel = day ? formatChronicleDay(day) : "this day";
1217+
12161218
/**
12171219
* Every mode is offered on a stored day, so an unclassified mode needs this
12181220
* answer when it has neither a static source nor a `CHRONICLE_MODE_SOURCE`.
@@ -1224,19 +1226,17 @@ const MapViewer = ({ mapId, day = null, dayBar, dayActions }: MapViewerProps) =>
12241226
return (
12251227
<div className="flex min-h-[calc(100dvh-var(--tfmc-header-h))] flex-col items-center justify-center gap-3 bg-[var(--tfmc-forest-deep)] px-6 text-center">
12261228
<p className="font-[family-name:var(--font-fraunces)] text-2xl text-[var(--tfmc-cream)]">
1227-
Not recorded for {day}
1229+
Not recorded for {dayLabel}
12281230
</p>
12291231
<p className="max-w-md text-sm leading-snug text-[var(--tfmc-stone)]">
1230-
Nothing in this day&rsquo;s capture answers for this map mode, and it
1231-
is not one of the modes that stays the same on every day, so showing
1232-
today&rsquo;s would be a lie about the past.
1232+
This view wasn&rsquo;t recorded on this day.
12331233
</p>
12341234
<button
12351235
type="button"
12361236
onClick={() => handleMapTypeChange("nation")}
12371237
className={actionLinkClass}
12381238
>
1239-
Back to the nation map
1239+
Back to Realms
12401240
</button>
12411241
</div>
12421242
);
@@ -1260,19 +1260,17 @@ const MapViewer = ({ mapId, day = null, dayBar, dayActions }: MapViewerProps) =>
12601260
return (
12611261
<div className="flex min-h-[calc(100dvh-var(--tfmc-header-h))] flex-col items-center justify-center gap-3 bg-[var(--tfmc-forest-deep)] px-6 text-center">
12621262
<p className="font-[family-name:var(--font-fraunces)] text-2xl text-[var(--tfmc-cream)]">
1263-
Missing from the {day} capture
1263+
Not available for {dayLabel}
12641264
</p>
12651265
<p className="max-w-md text-sm leading-snug text-[var(--tfmc-stone)]">
1266-
This day was recorded, but the file behind this map mode is not in
1267-
its snapshot. Nothing is shown rather than an empty world under a
1268-
real date. Another mode, or a nearby day, may still have it.
1266+
Try another view or a nearby day.
12691267
</p>
12701268
<button
12711269
type="button"
12721270
onClick={() => handleMapTypeChange("nation")}
12731271
className={actionLinkClass}
12741272
>
1275-
Back to the nation map
1273+
Back to Realms
12761274
</button>
12771275
</div>
12781276
);
@@ -1329,8 +1327,7 @@ const MapViewer = ({ mapId, day = null, dayBar, dayActions }: MapViewerProps) =>
13291327

13301328
const archiveFooter =
13311329
chronicle || archived ? null : (
1332-
<div className="flex items-center justify-between gap-2 text-sm text-[var(--tfmc-stone)]">
1333-
<span>Earlier chapters</span>
1330+
<div className="flex justify-end">
13341331
<MapArchiveMenu maps={maps} linkClass={actionLinkClass} />
13351332
</div>
13361333
);
@@ -1380,7 +1377,6 @@ const MapViewer = ({ mapId, day = null, dayBar, dayActions }: MapViewerProps) =>
13801377
mapType={mapType}
13811378
regionId={selectedId}
13821379
regionData={regionData}
1383-
mapDisplayName={displayName}
13841380
sessionToken={authToken}
13851381
settlements={settlements}
13861382
onSelectRegion={(id) => selectRegion(id)}
@@ -1404,7 +1400,7 @@ const MapViewer = ({ mapId, day = null, dayBar, dayActions }: MapViewerProps) =>
14041400
banner={dayBar}
14051401
plaque={
14061402
<MapPlaque
1407-
eyebrow={archived ? "Archived chapter" : "World map"}
1403+
eyebrow={archived ? "Archived chapter" : undefined}
14081404
mapDisplayName={displayName}
14091405
actions={plaqueActions}
14101406
search={

‎frontend/app/components/chronicle/ChronicleDayViewer.tsx‎

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -136,10 +136,11 @@ function ChronicleDayBar({
136136
<BackIcon size={18} />
137137
</Link>
138138
<div className="min-w-0 flex-1 text-center">
139-
<p className="truncate text-xs text-[var(--tfmc-mist)]">
140-
Stored day
141-
{walk.total > 0 && walk.position > 0 ? ` · ${walk.position} of ${walk.total}` : ""}
142-
</p>
139+
{walk.total > 0 && walk.position > 0 ? (
140+
<p className="truncate text-xs text-[var(--tfmc-mist)]">
141+
Day {walk.position} of {walk.total}
142+
</p>
143+
) : null}
143144
<p className="truncate font-[family-name:var(--font-fraunces)] text-xl leading-tight text-[var(--tfmc-cream)]">
144145
{formatChronicleDay(day)}
145146
</p>
@@ -177,14 +178,12 @@ function ChronicleDayBar({
177178
</div>
178179
{incomplete ? (
179180
<p className="mt-1.5 px-1 text-xs leading-snug text-[var(--tfmc-accent)]">
180-
Some sources were missing when this day was captured, so parts of this
181-
map may be blank.
181+
Parts of this day may be missing.
182182
</p>
183183
) : null}
184184
{staleGeometry ? (
185185
<p className="mt-1.5 px-1 text-xs leading-snug text-[var(--tfmc-accent)]">
186-
The province map has been redrawn since this day was captured, so
187-
borders may not line up.
186+
Borders may not line up on this day.
188187
</p>
189188
) : null}
190189
</div>
@@ -263,7 +262,7 @@ export default function ChronicleDayViewer({
263262
if (typeof index !== "object" || index === null) {
264263
setStatus({
265264
kind: "error",
266-
message: "The chronicle index came back in an unreadable shape.",
265+
message: "Couldn't load the map history.",
267266
});
268267
return;
269268
}
@@ -280,7 +279,7 @@ export default function ChronicleDayViewer({
280279
message:
281280
err instanceof Error
282281
? err.message
283-
: "Failed to load the chronicle index.",
282+
: "Couldn't load the map history.",
284283
});
285284
});
286285

@@ -299,7 +298,7 @@ export default function ChronicleDayViewer({
299298
return (
300299
<div className={shellClass}>
301300
<p className="text-lg font-medium text-[var(--tfmc-cream)]">
302-
Looking up {activeDay} in the chronicle…
301+
Loading…
303302
</p>
304303
</div>
305304
);
@@ -309,7 +308,7 @@ export default function ChronicleDayViewer({
309308
return (
310309
<div className={shellClass}>
311310
<p className="font-[family-name:var(--font-fraunces)] text-2xl text-[var(--tfmc-cream)]">
312-
Could not read the chronicle
311+
Couldn&rsquo;t load this day
313312
</p>
314313
<p className="max-w-md text-sm leading-snug text-[var(--tfmc-accent)]">
315314
{status.message}
@@ -323,15 +322,10 @@ export default function ChronicleDayViewer({
323322
return (
324323
<div className={shellClass}>
325324
<p className="text-xs font-medium uppercase tracking-widest text-[var(--tfmc-mist)]">
326-
{displayName} chronicle
325+
{displayName} timelapse
327326
</p>
328327
<p className="font-[family-name:var(--font-fraunces)] text-2xl text-[var(--tfmc-cream)]">
329-
No record of {activeDay}
330-
</p>
331-
<p className="max-w-md text-sm leading-snug text-[var(--tfmc-stone)]">
332-
This map has no stored snapshot for that day — it was either never
333-
captured or has since been removed. Showing nothing is deliberate: an
334-
empty map under a real date would look like a real historical state.
328+
No record of {formatChronicleDay(activeDay)}
335329
</p>
336330
<ChronicleDayFallbackLinks mapId={mapId} />
337331
</div>

‎frontend/app/components/chronicle/ChroniclePanels.test.tsx‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ describe("ChronicleTogglePanel", () => {
8989
<ChronicleTogglePanel
9090
toggles={{ ...CHRONICLE_TOGGLES_OFF, nationFill: true }}
9191
onToggle={onToggle}
92-
disabledReasons={{ nationNames: "No geometry." }}
92+
disabledReasons={{ nationNames: "Nation names aren't available for this map." }}
9393
notice={null}
9494
focusOptions={[]}
9595
focusNationId=""
@@ -105,7 +105,7 @@ describe("ChronicleTogglePanel", () => {
105105
expect(screen.getByRole("switch", { name: "Nation names" }).hasAttribute("disabled")).toBe(
106106
true
107107
);
108-
expect(screen.getByText(/Nation names: No geometry\./)).toBeDefined();
108+
expect(screen.getByText("Nation names aren't available for this map.")).toBeDefined();
109109
});
110110
});
111111

@@ -154,7 +154,7 @@ describe("ChronicleBuildPanel", () => {
154154
it("shows how far the build has got", () => {
155155
render(
156156
<ChronicleBuildPanel
157-
progress={{ completed: 5, total: 20, day: "2026-08-05", painted: 4, reused: 1, skipped: 0 }}
157+
progress={{ completed: 5, total: 20, day: "2026-08-05" }}
158158
error={null}
159159
/>
160160
);

‎frontend/app/components/chronicle/ChroniclePanels.tsx‎

Lines changed: 11 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import type { CSSProperties, ReactNode } from "react";
33

44
import {
55
CHRONICLE_RENDER_SIZES,
6-
formatChronicleBytes,
76
formatChronicleDuration,
87
type ChronicleBuildProgress,
98
type ChronicleEstimate,
@@ -328,11 +327,6 @@ export function ChronicleTogglePanel({
328327
}) {
329328
return (
330329
<div className="space-y-5">
331-
{/* Not on a phone, where the sheet's peek has room for the tiles only. */}
332-
<p className="text-sm leading-snug text-[var(--tfmc-stone)] max-md:hidden">
333-
The map starts bare. Pick what each day should show; the map previews the
334-
latest day as you go.
335-
</p>
336330
{notice ? <ChronicleNotice>{notice}</ChronicleNotice> : null}
337331

338332
{TOGGLE_GROUPS.map((group) => (
@@ -372,9 +366,10 @@ export function ChronicleTogglePanel({
372366
</section>
373367
))}
374368

369+
{/* A tile's title tooltip is not reliable on touch or keyboard. */}
375370
{Object.entries(disabledReasons).map(([key, reason]) => (
376371
<ChronicleNotice key={key} tone="quiet">
377-
{TOGGLE_DETAILS.get(key as ChronicleToggleKey)?.label}: {reason}
372+
{reason}
378373
</ChronicleNotice>
379374
))}
380375

@@ -404,8 +399,7 @@ export function ChronicleTogglePanel({
404399
<section className={`${sectionRuleClass} pt-4`}>
405400
<SectionHeading title="Sequence" />
406401
<p className="mt-1.5 text-xs leading-snug text-[var(--tfmc-stone)]">
407-
One look plays as the layers are now. Add this look to stitch several
408-
into one timelapse, in the order you queue them.
402+
Queue several looks to play one after another.
409403
</p>
410404
<button
411405
type="button"
@@ -575,8 +569,7 @@ export function ChronicleRangePanel({
575569
{selection.incompleteDays.length && !selection.error ? (
576570
<p className="mt-2 text-xs text-[var(--tfmc-accent)]">
577571
{selection.incompleteDays.length} day
578-
{selection.incompleteDays.length === 1 ? " was" : "s were"} captured with
579-
missing sources.
572+
{selection.incompleteDays.length === 1 ? " is" : "s are"} incomplete.
580573
</p>
581574
) : null}
582575
</section>
@@ -603,7 +596,7 @@ export function ChronicleRangePanel({
603596
{selection.error ? (
604597
<p className="text-sm text-[var(--tfmc-accent)]">{selection.error}</p>
605598
) : (
606-
<dl className="grid grid-cols-3 gap-2 text-center">
599+
<dl className="grid grid-cols-2 gap-2 text-center">
607600
<div>
608601
<dt className="text-xs text-[var(--tfmc-mist)]">Frames</dt>
609602
<dd className="mt-0.5 text-lg font-semibold text-[var(--tfmc-cream)]">
@@ -616,12 +609,6 @@ export function ChronicleRangePanel({
616609
~{formatChronicleDuration(estimate.totalMs)}
617610
</dd>
618611
</div>
619-
<div>
620-
<dt className="text-xs text-[var(--tfmc-mist)]">Memory</dt>
621-
<dd className="mt-0.5 text-lg font-semibold text-[var(--tfmc-cream)]">
622-
~{formatChronicleBytes(estimate.memoryBytes)}
623-
</dd>
624-
</div>
625612
</dl>
626613
)}
627614
{looks > 1 && !selection.error ? (
@@ -633,8 +620,7 @@ export function ChronicleRangePanel({
633620

634621
{estimate.overCeiling ? (
635622
<ChronicleNotice>
636-
{formatChronicleBytes(estimate.memoryBytes)} of frames is more than this
637-
browser should hold at once.{" "}
623+
That&rsquo;s too many frames to build at once.{" "}
638624
{looks > 1
639625
? "Shorten the range, pick a smaller frame size, or drop a look from the sequence."
640626
: "Shorten the range or pick a smaller frame size."}
@@ -682,12 +668,10 @@ export function ChronicleBuildPanel({
682668
style={{ width: `${pct}%` }}
683669
/>
684670
</div>
685-
{progress ? (
671+
{progress?.day ? (
686672
<p className="text-xs text-[var(--tfmc-stone)]">
687673
{progress.look ? `${progress.look} · ` : ""}
688-
{progress.day ? `${formatChronicleDay(progress.day)} · ` : ""}
689-
{progress.painted} painted, {progress.reused} reused
690-
{progress.skipped ? `, ${progress.skipped} skipped` : ""}
674+
{formatChronicleDay(progress.day)}
691675
</p>
692676
) : null}
693677
{error ? <ChronicleNotice>{error}</ChronicleNotice> : null}
@@ -774,7 +758,7 @@ export function ChroniclePlayer({
774758
<p className="truncate text-xs text-[var(--tfmc-mist)]">
775759
{look ? `${look} · ` : null}
776760
Day {Math.min(activeIndex + 1, total)} of {total}
777-
{incomplete ? <span className="text-[var(--tfmc-accent)]"> · sources missing</span> : null}
761+
{incomplete ? <span className="text-[var(--tfmc-accent)]"> · incomplete</span> : null}
778762
</p>
779763
</div>
780764
);
@@ -961,7 +945,7 @@ function WatermarkCornerPicker({
961945
<div className="min-w-0 text-sm">
962946
<p className="text-[var(--tfmc-cream)]">Watermark</p>
963947
<p className="text-xs text-[var(--tfmc-stone)]">
964-
{label}. Where the logo and Discord link sit, when they are on.
948+
{label}
965949
</p>
966950
</div>
967951
</div>
@@ -1056,8 +1040,7 @@ export function ChroniclePlaybackPanel({
10561040

10571041
{skippedDays.length ? (
10581042
<ChronicleNotice tone="quiet">
1059-
{skippedDays.length} day{skippedDays.length === 1 ? " had" : "s had"} no stored
1060-
sources and {skippedDays.length === 1 ? "was" : "were"} left out.
1043+
{skippedDays.length} day{skippedDays.length === 1 ? "" : "s"} skipped (no data).
10611044
</ChronicleNotice>
10621045
) : null}
10631046

‎frontend/app/components/chronicle/ChronicleStaffConsole.test.tsx‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ afterEach(() => {
3434
describe("ChronicleStaffConsole", () => {
3535
it("mounts signed out and shows the login gate instead of the wipe form", async () => {
3636
render(<ChronicleStaffConsole mapId="main" />);
37-
await waitFor(() => expect(screen.getByText("Profile login required")).toBeDefined());
37+
await waitFor(() => expect(screen.getByText("Sign in to view this map")).toBeDefined());
3838
expect(screen.queryByText(/Wipe the main chronicle/)).toBeNull();
3939
});
4040

@@ -105,9 +105,9 @@ describe("ChronicleStaffConsole", () => {
105105
}));
106106
render(<ChronicleStaffConsole mapId="main" />);
107107
await waitFor(() => expect(screen.getByText("Backups")).toBeDefined());
108-
fireEvent.change(screen.getByLabelText("Dest id"), { target: { value: "chapter" } });
108+
fireEvent.change(screen.getByLabelText("Destination id"), { target: { value: "chapter" } });
109109
fireEvent.change(screen.getByLabelText("Display name"), { target: { value: "Chapter" } });
110-
fireEvent.change(screen.getByLabelText("Type the dest id to confirm"), { target: { value: "chapter" } });
110+
fireEvent.change(screen.getByLabelText("Type the destination id to confirm"), { target: { value: "chapter" } });
111111
fireEvent.change(screen.getByPlaceholderText("why this live map is being copied to a frozen id"), { target: { value: "Archive fixture" } });
112112
fireEvent.click(screen.getByRole("button", { name: "Archive as chapter" }));
113113
await waitFor(() => expect(screen.getByText("Copied main → chapter.")).toBeDefined());

0 commit comments

Comments
 (0)