Verfahrensablauf event-card overhaul: 'Wieder einblenden' horizontal-scroll + iconify hidden/optional state (the 'cut the tree' UX) #125
Reference in New Issue
Block a user
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
m's report (2026-05-26 09:58)
Scope — two layers
Concern A (fix now): 'Wieder einblenden' button breaks card width
artemis's #122 added the 'Wieder einblenden' chip to re-surface hidden cards. The chip text is long enough that on narrower columns it overflows the card, triggering horizontal page scroll. Fix by making the chip narrower (icon-only on small viewports, or compact text + tooltip).
Concern B (the bigger UX overhaul): icon-based state language for cards
m's framing: per-card choices are a 'cut on the tree of possibilities' — and we want to make rerouting later possible. The card surface should:
showNotestoggle — reuse + extend).Naming the model
m's 'cut the tree of possibilities' framing implies cards should communicate their decision state clearly:
Icon library should map 1:1 onto these states. Future rerouting UX = removing the cut + showing the previously-cut subtree again.
What to do
frist-date-editclick handler).Files most likely touched
frontend/src/client/views/verfahrensablauf-core.ts— card renderfrontend/src/client/views/event-card-choices.ts— caret/popover (atlas #96)frontend/src/client/views/verfahrensablauf-core.test.ts— render testsfrontend/src/styles/global.css— new card layout + iconsfrontend/src/client/i18n.ts+frontend/src/i18n-keys.ts— labels for icon tooltips + actionsHard rules
go build ./... && go test ./internal/... && cd frontend && bun run buildclean.mai/<worker>/event-card-overhaul.Out of scope
Reporting
mai report completedwith branch + SHAs + UX path: open Verfahrensablauf at 375px → confirm no horizontal scroll on any card state (active/cut/conditional/branched) → caret menu opens on hover → all actions accessible → 'Wieder einblenden' is an icon + label in the menu, not an inline chip.hermes shift-1 — t-paliad-293 implementation complete
Branch:
mai/hermes/coder-verfahrensablaufCommit:
7ca6b2dTests: 181/181 pass (29 in
verfahrensablauf-core.test.ts, +4 new contract pairs);go build ./... && go test ./internal/...clean;bun run buildclean.What changed
Concern A — horizontal scroll fixed at the source
The
Wieder einblendeninline chip from t-paliad-290 is gone. It used to live in the card title-row flex container, and its long German label ("Wieder einblenden") pushed the row past the column width on 375 / 414 / 768 viewports. Replaced two ways:clearon theskipkind).Both layers in defense — even if a future contributor adds another inline chip, the row will wrap rather than scroll the page.
Concern B — iconified state language
Cards now speak m's "cut the tree of possibilities" vocabulary via small icons in the title row:
optionaltext badge)timeline-state-icon--optionalstate.optional.tooltiptimeline-state-icon--hiddenstate.hidden.tooltipabhängig von <parent>chip in the date column — t-paliad-289; no duplicate marker)event-card-choices-chip)The legacy
.optional-badgetext chip and.event-card-choices-unhideinline chip are both gone. Icon set uses Unicode (consistent with existing pill glyphs like👀for approval,✨for agent — no SVG dependency added).Caret popover — hidden-card prominence
The caret button now carries
data-is-hidden="1"whenisHidden=true. The popover module reads it and surfaces a prominent "Wieder einblenden" entry at the top, ahead of the skip-toggle's reset link. The unhide path uses the samedata-choice-action="clear" data-choice-kind="skip"contract that the existing handler already dispatches — no new commit semantics needed.Defensive fallback: if a rule's
choices_offeredis edited away after a user already savedskip=true(soisHidden=truebutchoicesOfferedis empty), the renderer synthesizes{skip:[true,false]}so the user still gets the un-hide path via the popover. Tested.Card density tightened
.timeline-itemmin-height: 4rem → 2.75rem.timeline-contentpadding-bottom: 1rem → 0.6rem.timeline-item-headergainsflex-wrap: wrap+min-width: 0.timeline-namegainsmin-width: 0+overflow-wrap: anywhereHard rules respected
.frist-date-editclick-to-edit on date span untouched.abhängig von <parent>chip + dotted border) untouched.go build ./... && go test ./internal/... && cd frontend && bun run build && bun testall green.Files touched (6)
frontend/src/client/views/verfahrensablauf-core.ts— state-icon emission, caret data-is-hidden contract, dropped unhide chip, defensive fallback.frontend/src/client/views/event-card-choices.ts— dropped inline-chip handler, addedrenderUnhideBlock()+ isHidden-driven popover entry.frontend/src/client/views/verfahrensablauf-core.test.ts— old isHidden chip tests replaced with state-icon + caret contract tests; added defensive-fallback test; added optional-icon contract.frontend/src/styles/global.css— new.timeline-state-icon[--optional|--hidden], new.event-card-choices-unhide-btn+--unhideblock, tighter card density, wrap-safe title row.frontend/src/client/i18n.ts— DE+ENstate.optional.tooltip+state.hidden.tooltip.frontend/src/i18n-keys.ts— keys auto-extracted into the union.UX verification needed by reviewer (auth-gated page — couldn't drive headless)
Open
/tools/verfahrensablauf(e.g. paliad.de) and:optionalpriority — confirm a ⊙ marker is visible next to the title.skipaction on a card → enable the "Ausgeblendete anzeigen" toggle → confirm the faded card now shows a 👁⃠ marker in the title and no inline chip.Out of scope (deferred per issue)
Self-review notes
IsConditionaldoes NOT get an icon in the title row because the date column already shows theabhängig von <parent>chip — adding a marker on top would be redundant noise (one signal per state is the principle).data-choice-action="clear"rather than the synthesized skip=false set, becauseclearmatches the legacyunhideCard()semantics (removes the entry entirely; the re-projection then drops the card from the result list).data-is-hidden="0"is always emitted on the caret (not omitted) so the dataset access is type-safe and the test contract pins both directions.