Mostly table column normalisation under docs/audit/ + planning, object- literal expansion in src/lib/ai/coach/snapshot.ts after the W4 F6 Apple Health metric block landed, and small wrap/unwrap line adjustments in the device + APNs routes / tests touched across W3/W4/W5 sessions. No behavioural change. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5.0 KiB
Phase A7 — Admin polish (v1.4.19)
Marathon: v1.4.19 Wave-A
Agent: A7 (parallel with A1-A6, A8)
Started: 2026-05-09T13:00+02:00
Finished: 2026-05-09T13:22+02:00
Branch: agent/a7-admin-polish (worktree at /Users/marc/Projects/HealthLog-a7)
Commits on origin/main:
088832a— fix(admin): remove spurious scrollbar from feedback tab stripdd8212e— fix(admin): api-tokens table truncate-with-tooltip (no scrollbar 4th attempt)7a70db6— fix(admin): hide collapse button when page has only one section6507646— style(admin): reduce excessive vertical whitespace on Zielwerte page90a109d— i18n(admin): translate Zielwerte status labels (Low/On Target/Stable/Moderate to DE)
What landed
1. Feedback tab strip mini-scrollbar — fixed
Marc's "mini Scroll-Button rechts" on the admin feedback inbox tabs
came from a CSS overflow-axis coupling: tabsListVariants set
overflow-x: auto without overflow-y, so the browser silently
flipped overflow-y to auto too. Combined with the fixed h-9
strip and badge children that ride 1-2 px taller than the strip on
some glyph stacks, a tiny vertical bar painted on the right edge of
short strips. Added overflow-y-hidden (with the matching
overflow-y-visible override for vertical-orientation tabs) and a
component test that locks both axes in.
2. /admin/api-tokens 4th-attempt scrollbar — fixed
Three previous fixes (column-hide v1.4.15, mobile card-list
v1.4.16, admin-shell mobile-strip no-scrollbar v1.4.18) cleared
the obvious culprits but Marc still saw a residual painted bar.
Production probe at Pixel-5 confirmed:
- The mobile token-name
<span>carriedtruncateANDbreak-allon the same element.truncatesetswhite-space: nowrapwhich beatsword-break: break-allper CSS spec —break-allwas dead code AND misleading. Removed. - The desktop table had no per-column upper bound; long token names
could spill past the row on 768-1024 px viewports. Locked the
layout with
table-fixed+<colgroup>widths. - Permission badges had no
max-wcap. Addedmax-w-full truncate+ nativetitleattribute. - Wrapped every potentially-long cell (token name, username,
permission badge) in a small
<TruncatedCell>helper that pairs visual truncation with a radix tooltip.
Added an e2e regression that walks every element inside the mobile
card-list and asserts scrollWidth <= clientWidth + 1 for each.
3. /admin/api-tokens "Einklappen" button — removed
Inherited from the v1.4 shared-admin page where 13 sections lived
together. On the v1.5 dedicated /admin/api-tokens route the
toggle hides the only card on the page. Marc called it "sinnlos".
Dropped the expanded state + button. The shared settings.collapse
/ settings.expand keys stay in messages because
<LoginOverviewSection> still uses them.
4. Zielwerte page whitespace — tightened
Outer wrapper changed from space-y-8 (32 px) to space-y-6
(24 px), matching the admin / settings rhythm.
5. Zielwerte status labels translated
Added two new i18n key blocks under targets.*:
targets.label.<TYPE>(11 entries, EN + DE) — used by<TargetCard>to localise card titles. Server keeps emitting English labels so logs / external consumers don't churn.targets.status.<key>(41 entries, EN + DE) — every classification category fromlib/analytics/classifications.ts,pulse-targets.ts, and the inline maps intargets/route.ts. A smallSTATUS_CATEGORY_KEYmap on the page normalises the human-readable English category to its key.
Glucose targets keep their pre-resolved label path. Unmapped categories fall through to the verbatim server string — the page never blows up.
Tests
src/components/ui/__tests__/tabs.test.tsx(new) — locksoverflow-y-hiddenon tabs-list.src/components/admin/__tests__/api-token-truncate.test.tsx(new) — 4 cases on the truncate / tooltip / max-w pattern.src/components/admin/__tests__/api-token-no-collapse.test.tsx(new) — 3 cases (EN, DE, aria-expanded).src/app/__tests__/targets-spacing.test.tsx(new) — locksspace-y-6on/targets.src/app/__tests__/targets-i18n.test.tsx(new) — 3 cases (EN, DE titles, DE status badges).e2e/admin-api-tokens-mobile.spec.ts— added the 4th-attempt regression.src/lib/__tests__/i18n-locale-integrity.test.ts— added 5 entries toPLACEHOLDER_ALLOWLISTfor legitimate EN==DE technical terms (BMI, Normal, Optimal, Fitness).
Verification
pnpm test: 1658 / 1658 greenpnpm typecheck: cleanpnpm lint: 0 errors / 12 pre-existing warnings (baseline)
Surfaces and constraints
Touched only the assigned A7 surfaces (feedback inbox via the
shared TabsList primitive, api-tokens section, targets page,
i18n messages). Did not touch src/components/settings/*,
src/lib/insights/*, src/lib/ai/*, src/components/charts/*,
or src/components/insights/*. No new dependencies. Pushed to
origin/main after rebase without --no-verify or --no-gpg-sign.