Skip to content

[ui] Annotation fixes, shortcut modal redesign and locale updates#2026

Merged
frankrousseau merged 12 commits into
cgwire:mainfrom
frankrousseau:main
May 29, 2026
Merged

[ui] Annotation fixes, shortcut modal redesign and locale updates#2026
frankrousseau merged 12 commits into
cgwire:mainfrom
frankrousseau:main

Conversation

@frankrousseau
Copy link
Copy Markdown
Contributor

Problems

  • Freehand annotation strokes lost their rounded line caps and rendered with flat ends.
  • Annotations were offset after leaving fullscreen until a manual resize.
  • Pencil width was applied unreliably and the base stroke sizes were off.
  • The preview and attachment modals duplicated the file-drop zone markup.
  • Live review rooms jumped back to the first element when a playlist's task type changed.
  • No way to bump every selected entity to its latest revision from the task-type modal.
  • The keyboard shortcut modal omitted most player/playlist shortcuts and its draw key was inconsistent across players.
  • The shortcut modal looked flat, and the Card widget lacked depth in the light theme.
  • Several locales were incomplete.

Solutions

  • Restore rounded line caps/joins on brush strokes.
  • Recompute the annotation canvas bounds when exiting fullscreen.
  • Fix pencil-width application and update the base stroke sizes, with tests.
  • Extract a shared FileUploadZone used by both upload modals.
  • Preserve the current entity across rebuilds and resolve room navigation by id.
  • Add an "update to latest version" action to the task-type modal.
  • List the missing player/playlist shortcuts and align the draw shortcut to "d".
  • Restyle the shortcut modal with cards, keycap-style keys and group icons; add a soft elevation shadow to the Card widget.
  • Complete the remaining locales.

frankrousseau and others added 12 commits May 28, 2026 23:57
The pencil base widths were doubled, but the unit assertions still expected
the old pixel values (the pre-commit hook runs eslint, not vitest, so the
failures went unnoticed).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
PSBrush overrides BaseBrush.initialize without calling super, so fabric's
round strokeLineCap/strokeLineJoin defaults were lost and pencil strokes
rendered with flat ends. Set them on the brush at each creation site and on
reloaded paths/PSStrokes (so older annotations stored as butt also render
rounded), in the main and comparison render paths.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Leaving fullscreen can move the media without changing its size (e.g. back
into the narrow task-info panel). The AnnotationCanvas ResizeObserver only
fires on size changes, so the overlay stayed at its fullscreen rect and
annotations drifted until a manual resize. Recompute the canvas bounds in the
post-transition fallback, which is what that manual resize did.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AddAttachmentModal and AddPreviewModal duplicated the dashed upload-zone
styling around the file-upload widget. Extract it into a FileUploadZone widget
that wraps FileUpload, forwards reset/onDrop/filesChange, and makes the whole
dashed area clickable. AddPreviewModal gains the same zone styling; the drag
-and-drop overlay handling in both modals is unchanged.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Changing the task type in a synced review room sent the other screens back
to the first element (and could bounce both screens in a loop). Three
causes, fixed together:

- The entities rebuild reset the player to the first entity. Preserve the
  current entity across the rebuild and re-select it when it survives.
- The receiving screen left and rejoined the live room on a same-id
  playlist refresh, desyncing it. Only churn the room when the playlist id
  actually changes.
- Room navigation synced by entity index, but the receiver re-fetches the
  playlist and can order shots differently than the sender (which mutates
  in place). Resolve the target entity by id, falling back to index.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The task-type modal only let you switch all entities to a chosen task
type's latest revision. Add a second action that bumps each entity to the
latest revision of the task type it is already showing, preserving a
playlist that mixes task types. Reorganise the modal into a generic
"Update selected versions" dialog with two side-by-side cards (change
task type / update to latest).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The shortcut modal omitted most player shortcuts. Add a Player group
(play/pause, frame and annotation navigation), the copy/paste and
pan-image annotation shortcuts, and the move-entity shortcuts, and move
the object viewer group last. Align the playlist draw shortcut to plain
"d" so it matches the preview player and the modal.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Lay out each shortcut group as a Card in a two-column grid (object viewer
spans full width), render keys as keycap-style kbd chips, and add a lucide
icon next to each group title. Rename the footer button to Close.

Card widget gains a soft elevation shadow in both themes; the shortcut
modal tints its cards one step darker so they read against the white modal
box (Settings/Profile keep the white default, as their cards sit on a grey
page).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Fill the 132 keys present in en.js but missing from fr.json (playlist
sharing, project templates, guest share view, comment-move, desktop
notifications, player shortcuts, …). fr.json now matches en.js 1:1.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
"configure the  from scratch" -> "configure the production from scratch".

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Fill the 166 keys present in en.js but missing from each non-French
locale (playlist sharing, project templates, guest share view,
comment-move, desktop notifications, player shortcuts, 2FA, …).
da/de/es/fa/ja/ko/nl/pt/ru/zh/zh_tw now match en.js 1:1.

Translated with an LLM (per-language, preserving {placeholders} and
plural-segment counts) as we move off POEditor.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Hungarian was the most incomplete locale (44%). Fill the 1025 missing
keys via LLM translation (6 parallel section-batches, preserving
{placeholders} and plural-segment counts, informal "te" register),
drop 10 stale keys no longer in en.js, and normalise indentation to
2 spaces to match the other locales. hu.json now matches en.js 1:1.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@frankrousseau frankrousseau merged commit 98a976a into cgwire:main May 29, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant