Tree row icons + single-line layout + drop/paste artifact upload#27
Merged
Extentsoftware merged 4 commits intomainfrom May 10, 2026
Merged
Tree row icons + single-line layout + drop/paste artifact upload#27Extentsoftware merged 4 commits intomainfrom
Extentsoftware merged 4 commits intomainfrom
Conversation
added 4 commits
May 10, 2026 19:35
Three small UX wins on the Operating Picture and Feature Workspace. Tree rows - Replace the FEAT / CAP text labels with single-glyph type icons (◆/●/○/▸) that carry a hover tooltip with the full type name. Initiatives and features get the accent colour; capabilities stay muted so the eye finds the parent first. - Widen the row grid from three to four columns so the phase pill sits inline instead of wrapping below — rows are now one line tall. - Bold feature and initiative titles so the parent is unmistakable next to the capabilities below it. Artifact attach - Add a drop / paste / pick zone above the existing attach form. Drop a file or click "choose a file" routes through the standard Blazor InputFile path; paste an image fires the new /js/attach-paste.js helper which forwards the clipboard image to a [JSInvokable] OnImagePastedAsync method as base64. - Uploaded bytes go through IArtifactBlobStore.PutAsync (ADR-0018) and the resulting loom-artifact:// URI auto-fills the canonical pointer fields. The PO can edit title / kind before clicking Attach. - 25 MB cap, surfaced inline; failures don't break the form.
The first cut of the dropzone hid the Blazor InputFile inside a label and intercepted drop with @ondrop:preventDefault, which blocked the browser from routing the dropped file to the input. Click-to-pick worked, drag-drop didn't. - The InputFile is now an absolutely-positioned overlay (transparent, full-size) so the browser routes both clicks and drops to it natively. The visible content sits beneath with pointer-events:none on text and pointer-events:auto on buttons so the "clear" action still works. - Paste listener now binds on window in capture phase. Document-level paste can be missed when no editable element has focus; window + capture is what other Blazor paste-upload patterns use. - Added console.debug breadcrumbs in attach-paste.js so missing triggers are diagnosable from devtools without server logs.
Pasting a small (~25 KB) image into the artifact attach panel killed the Blazor circuit: the default SignalR MaximumReceiveMessageSize is 32 KB, and a 25 KB image expands past that after base64 + JSON envelope. - Program.cs raises MaximumReceiveMessageSize to 64 MB so a paste up to the existing 25 MB upload cap fits comfortably with overhead. - attach-paste.js no longer dedupes by elementId — when the circuit reconnects after a disconnect, the JS listener still holds a dead DotNetObjectReference. We now tear down any prior listener for the same element and install a fresh one so paste events reach the live circuit.
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.
Summary
Three small UX wins addressing direct feedback after running the new multi-feature kickoff.
Tree rows
Artifact attach
InputFile); paste an image fires/js/attach-paste.jswhich forwards the clipboard image as base64 through[JSInvokable] OnImagePastedAsync.IArtifactBlobStore.PutAsync(ADR-0018) — the returnedloom-artifact://URI auto-fills the canonical pointer; the PO can adjust title / kind before clicking Attach.Test plan
dotnet build Loom.sln -p:TreatWarningsAsErrors=trueclean.pasted-…filename.🤖 Generated with Claude Code