Repository navigation
fix(ui): display-fidelity and layout-budget hardening (#67 #68 #73 #74) - #81
Merged
Merged
Conversation
This was referenced Sep 28, 2026
Closed
Closed
Closed
…ayout Display values (refs #67): - settings selects/multiselects append off-list stored scalars as readable options, so a drifted value never renders its raw JSON id or trips a save error for an invisible selection. - the goal footer hides completed goals, spells out the continuation flag, labels the round fraction, and matches the todo pane's tone. - validator admission failures show a translated sentence; the JSON-pointer path stays in the report. - shared core/format.ts (pluralize, compact durations) used by the jobs status, loader, and agent presentation; displayKey uppercases function-key chords. Overflow and width (refs #68, #74): - injectGhostHint measures display columns and clamps the row, so CJK/emoji hints cannot overflow render(width) or split a surrogate pair. - one overflow marker for header/bottom lanes and a single `…` convention across chrome. - todo rows truncate, the expanded list is capped, and the fold affordance survives lane clamping; ScrollablePanel shows its scroll position and degrades instead of vanishing below width 5. Editor-slot budget (refs #68): - the runtime exposes the applied header/bottom lane rows; screen.editorViewport subtracts them; ScrollablePanel derives its body budget from that one grant and the transcript renderer shares it. Copy nits (refs #73): - clear-key on a non-writable credential no longer claims the provider was removed; no Refresh on the immutable /version and /changelog; lowercase reminders badge; `…` in the stopping row and plan status; `[image]` is rendered once (attachment rows own it). Verified with pnpm run verify:full (typecheck, lint, diagrams, build, check:lib, shots, agent docs, examples, website build, coverage, happy smoke).
GeekCmore
force-pushed
the
fix/display-layout-fidelity
branch
from
September 28, 2026 09:13
d9dcafc to
76fa150
Compare
…me minimum Share one OVERFLOW_ELLIPSIS constant for signalling truncation, mark the ScrollablePanel degenerate-width clamp with it, and render body rows alone when the host grant cannot fit the frame so rows never spill past the grant. Export endsWithAffordance and pin the fold-affordance contract against the real todo node; assert the overflowKeepsTail classification and the lane tail-keeping wiring instead of only pane registration.
surfaceLaneRows now measures the width-derived header/bottom lanes on demand through measuredLaneRows instead of reading values the dock writes after its children render, so editorViewport is never a frame stale. Over-counting lanes can only shrink the editor slot, never overflow it.
…help Project select/multiselect values only for scalars the form can represent, so a hand-edited container no longer surfaces a raw JSON id, and use the shared capitalized Help title for the overlay while dropping the dead catalog key.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
fix(ui): display-fidelity and layout-budget hardening (#67 #68 #73 #74)
Summary
Unifies three boundaries behind the audit findings (UX-12/13/14/15/16/17/18/19/23/30) instead of patching each one:
/pluginsaysupdate {version}, and clear-key on a non-writable credential no longer claims the provider was removed.OVERFLOW_ELLIPSIS(…) constant marks every signalling truncation (top rule, panel title/footer,ScrollablePanelframe, degenerate-width clamp);ScrollablePanelreports(start-end/total)and degrades to body rows when the host grant cannot fit the frame; header/body lanes name the rows they drop; the bottom lane keeps a pane's fold affordance visible while clamping.screen.editorViewportsubtracts the header/bottom lane rows through a width-derived measurement (measuredLaneRows()), andScrollablePanelderives its body budget from that grant. The subagent panel and its inner transcript share one grant and never lag the dock by a frame; the 2-row status footer + open lanes case keeps the panel title.What this PR does NOT do
An earlier revision of this description listed work that is not in this diff. To keep review accurate, those items are removed and should be tracked separately:
core/format.ts.status-jobs.tssingular/plural, hours-aware durations, loaderelapsedMsformatting, anddisplayKeyfunction-key chords are unchanged.status-goal.ts) still rendersGoal {phase} · n/m · {activation}witharmed/disarmed./versionand/changelogstill carry a Refresh action.Remindersbadge capitalization is unchanged.overflow: 'truncate'and the expanded list still has no size cap.trimmed.length === 0withtrimmed === ''.Issue status
editorViewportvia lane rows) and a regression covers the 2-row-footer case. The ghost-hint half was already display-column safe at the merge base.ScrollablePanelexposes a scroll position and degrades at tiny widths/heights; lane rows name what they cut; the fold affordance survives clamping. Todo row truncation and the expanded-list cap are not in this PR./helptitle capitalized (overlay and panel), clear-key message,update {version}badge,interrupting…, and[image]rendered once. Pluralization, hours durations, loader ms, key-label chords, immutable-panel Refresh, friendly namespace labels, per-engine labels, and theRemindersbadge remain.Verification
pnpm run verify:full(exit 0):test:repo-workflow,typecheck,lint,diagrams:check,build,check:lib(53 lib claims),shots:check(36 shots current),check:agent-docs,check:examples,test:coverage(per-file 100% statements/branches/functions/lines; 3827 passed),smoke:happy(HAPPY_SMOKE_PASS).New regression coverage:
pane-todo.spec.tspinsendsWithAffordanceagainst the realtodoNode(folded/expanded true, short list false).plugin-surface-bridge-pane.spec.tsasserts theoverflowKeepsTailclassification per node shape instead of only pane registration.surface-manager.spec.tsasserts the lane keeps the tail when a pane marks the affordance.scrollable-panel.spec.tscovers the compact-height degrade, a zero grant, a non-finite grant, and the…degenerate-width marker.terminal.spec.tscoversmeasuredLaneRowsclamping.settings-model.spec.tsasserts the projectedvaluefor malformed select/multiselect/boolean fields.Manual acceptance (pending)
PROFILE=mayfly-display-layout script/install-dev.sh, thendsh --profile mayfly-display-layout.<文件路径>) stays inside the editor row; a long todo list folds with a visibleCtrl+Taffordance;/settingsshows a readable label for a stored preset that was deleted./help,/plugin, and the todo/queue panes unchanged.Notes
packages/uiwire-contract change;check:libconfirms.#60(locale registration) is handled separately by fix(locale): share one namespace registration across plugins #78; this PR does not touch it.