From fe572d92077b7db6f86d1b58cef48a2c4ac9553d Mon Sep 17 00:00:00 2001 From: npeter83 Date: Sat, 17 Oct 2026 14:27:45 +0200 Subject: [PATCH 1/8] docs: a copy-only change runs the Conformance check's step 4 alone, in both languages --- CLAUDE.md | 3 ++- docs/DESIGN.md | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CLAUDE.md b/CLAUDE.md index b9353518..c4355020 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -55,7 +55,8 @@ how it gets built. Concretely: - **Challenge unsound requests.** If a request is technically ill-advised and you can back it with real arguments, push back or propose an alternative — don't comply blindly. - **Verify UI in the browser before calling it done.** tsc/unit/DOM tests miss visual and interaction - bugs; do a real visual check of any UI change, and run DESIGN.md's four-step Conformance check. + bugs; do a real visual check of any UI change, and run DESIGN.md's Conformance check (a copy-only + change runs its step 4 alone: every state the new text renders in, in both languages). - **Be terse everywhere else.** Outside those decision points, lead with the answer or decision. During implementation and debugging especially: no restating the same point reworded, no filler. diff --git a/docs/DESIGN.md b/docs/DESIGN.md index 1d7f250a..e0754d9e 100644 --- a/docs/DESIGN.md +++ b/docs/DESIGN.md @@ -44,6 +44,10 @@ runs this check before it is called done (E28 S3g): A rule that holds is not the same as a screen that works: the person page passed every rule above with half its panel empty. +A **copy-only** change — translated text and nothing else: no markup, class, component or logic — runs step 4 +alone: a screenshot of every state the changed text renders in, in Hungarian and in English (Hungarian runs about +a fifth longer, so it is the one that wraps or clips). The key parity is the gate's. + ## The design lab `npm run dev`, then open **`http://localhost:5173/design-lab`**. The lab renders each open decision's variants @@ -783,3 +787,4 @@ of a full-width panel and nothing on the right. | 2026-10-12 | A running download's step (owner ★) | The tray row names the step beside its bar ("Downloading audio · 12%", "Merging" with a pulse); a paused-only tray shows a pause mark, never the done check | A bare bar and % | A download fetches video and audio as two streams: unnamed, the second fill reads as a restart; the tray is the only place a download is followed | | 2026-10-14 | API tokens (owner A/A/A) | Settings → API tokens: a row per token in three lines (name + prefix, its folders and rights, last use and expiry), revoked from its ⋯; a new token asks the kind first (Hub exchange or Custom: rights as chips per folder), expiry 1 year by default; the token shows once in the same dialog, with Copy and a curl line | A table; one form with a preset link; the token in a banner above the list | A table truncates the rights at this width; the common token never shows a matrix to get wrong; closing the dialog is plainly when the token is gone | | 2026-10-15 | Folder links (owner A/A/A) | An own folder's menu has Copy link and Share with link… as a file row does (the dialog is the link half of the file's); the link opens a list of the folder's files as it is now, Play opening the watch player above it with the playing row lit, a document only downloading; the rail marks a folder with a live link beside its count | Share with link… alone; cards; a download-only list; no mark | Mostly videos from a phone, read on a phone: a list gives a long name its line and the next one is a tap away; the folder link is the one place where moving a file in publishes it, so where it is must show | +| 2026-10-17 | Copy-only changes (owner ★) | Step 4 of the Conformance check alone (not 1–3 or 5): every state the changed text renders in, seen in both languages | The whole five-step check; no screenshot at all (DOM test + key parity) | Steps 1–3 and 5 judge controls, patterns and composition, which a text change does not touch; the one risk left is a longer Hungarian string wrapping or clipping, and only a screenshot shows that | From 0a1fef28ac1e1622cfa7425b69c731f7cde8488a Mon Sep 17 00:00:00 2001 From: npeter83 Date: Sat, 17 Oct 2026 14:47:57 +0200 Subject: [PATCH 2/8] docs(claude): the YouTube write-error helper, the overlay and z-scale rule, and px-frozen sizes join the canonical patterns --- CLAUDE.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index c4355020..68667f25 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -102,7 +102,8 @@ CQRS, a repository/DI framework, a router library, a generic CRUD-router factory | FE view push (history) | `rememberNavPosition()` right before `history.pushState` | a push that forgets: Back strands focus on `` | | FE static label / button-like link | `Badge` (flat, no edge) · `LinkButton` / `IconLink` | a glass pill that reads as a chip; an `` hand-painted like a button | | FE loading/empty/error | `QueryState` / `StateMessage` | ad-hoc conditionals | -| FE failed write | `meta.failTitle`, else `notifyActionError(err, title)` | a bare `catch {}` or `notify()` with no error attached | +| FE failed write | `meta.failTitle`, else `notifyActionError(err, title)`; a YouTube write action (subscribe, sync, …): `notifyYouTubeActionError` — a 403 offers Connect | a bare `catch {}` or `notify()` with no error attached | +| FE floating or full-screen layer | `ui/Overlay` (portals to ``) or the popover engine (`AnchoredPopover` portals itself); stacking by the z-index scale (`z-menu` … `z-popover`, docs/DESIGN.md "Layers") | one rendered in place inside a virtualized row or a masked/transformed scroller — clipped or painted over; a magic `z-[n]` | | FE player on a native media element | `lib/mediaSession` (`useMediaSession`) + `lib/mediaKeys` + `lib/resume` (`useResume`), the element held as STATE | a private `navigator.mediaSession` / `keydown` / position-saving effect per player | | FE diagnostics | `lib/log.ts` (`log.info("event.code", msg, attrs)`); a filter change → `lib/filterLog.ts`, a player → `lib/mediaLog.ts` | `console.*` (lint-enforced); a value only a higher level may carry, logged unguarded | | FE state that MIRRORS a prop/query | derive it, or hold a draft (`draft ?? server`) | a copy an effect re-syncs — that paints the stale value first | @@ -115,7 +116,8 @@ CQRS, a repository/DI framework, a router library, a generic CRUD-router factory Not repeated here, because a lint rule refuses the wrong one and its message names the right one: buttons (`ui/Button`, `IconButton`, `Pressable`, `Chip`, `DragHandle`), text fields and native controls (`ui/Input`, `Checkbox`, `Slider`, …), glass surfaces (`SURFACE.*`), a native `