Repository navigation
CanvasTTY 1.8.3: selected canvas PRs, integration fixes and CanvasLink 1.0 - #168
Merged
Merged
Conversation
…e startup bundle The canvas command palette and the canvas context menu are rendered only while they are open, but both were static imports of the canvas and so part of the startup bundle. They are now separate chunks, which frees about 18 KB of the startup bundle, and still open at once: the canvas preloads both chunks once it is idle after its first paint, and renders the loaded component directly. There is no lazy() and no Suspense boundary on this path (React holds a suspended boundary's reveal for up to 300 ms, which would delay the first right-click and the first Cmd/Ctrl+K). An open before the preload has finished loads the chunk at once and shows the menu as soon as it arrives. renderer-bundle-splitting checks that each is its own chunk, reachable only through a dynamic import(); canvas-preloaded-surfaces renders both with the real React through the real imports and checks that a preloaded menu and palette are in the very first render of an open.
Right-clicking empty canvas now shows a Tools row with one Auto-sort action. The criteria (by task, by status, by project, grid) are radio rows in that submenu, built with the existing canvas menu primitives. There is no separate panel, toolbar, presets or layouts list. - Scope: the current multi-selection when it holds two windows, otherwise terminal, plugin and Browser windows that are not completely inside a region. Companion mascots move only when selected. Sticky notes, materials and Files cards never move. - "By task" uses the orchestrator-to-subagent relation that already exists (parentSessionId): each subagent goes to the right of its parent. - The layout is deterministic: ties follow the current reading order, and sorting twice changes nothing. The block keeps the windows' top-left corner and keeps clear of HOME, regions, notes, materials, Files cards and windows it does not move (it shifts right or down, whichever is shorter, and never lands inside a region). With snapping on, every window lands on the 10px grid with the 20px snapping gap. - Moved windows get a presentation-only outline that clears on the next press or after a few seconds (they are not made the marquee selection), and a short glide that is skipped when reduced motion is requested. The Browser card does not glide, because its native view is placed from the measured card. - "Undo auto-sort" stays in the submenu while a sorted window is still where the sort put it. It restores only those windows. There is no global undo shortcut, so terminals and text inputs keep their keys. - The last criterion is kept in renderer memory for the running session, only after a sort happened. Nothing is persisted. A failed load or sort shows a localized toast. - The group-drag commit is extracted into commitLayerBounds and shared with auto-sort. - The Tools submenu body, scope and layout are not in the startup bundle: they load while the empty-canvas menu is open (or when Tools is pressed first), so the submenu still opens at once. Adds the official Lucide wrench and undo-2 icons, ru/en strings, and the UI contract text in en/ru/zh-CN. Tests drive the menu and the submenu.
…ed out - A context menu opened near a corner panel (minimap, shortcut hints, Home/zoom controls) moves up until it clears it; it was drawn over the bottom of the Home/zoom bar. When moving up cannot clear every panel (a tall menu near the right edge at UI scale 1.25, between the minimap and the shortcut hints), it moves sideways beside the panel it hits, at its own height; with no room on either side it keeps its place. Menus stay above the corner panels. - A submenu (Tools, Launch agent) opens where it covers no corner panel either: when its usual side and direction would run over the shortcut hints, minimap or Home/zoom controls (in whichever corners Settings put them), it opens in the other direction or on the other side; at UI scale 1.25 near the right edge, Tools opened over the hints panel and left its clipped text showing beside it. - The chevrons of Launch agent and Tools point to the side their submenu opens (the vendored chevron, rotated), not down. - "Needs at least 2 windows" is a plain hint, not the uppercase group label. It lines up with the radio labels and is as muted as the disabled rows it explains, so it does not read like an active item. - Zoomed out (summary), the outline of the windows a sort moved grows with the summary scale, so it stays visible at overview zoom for its 4 s. The placement code (and the existing chooseCanvasSubmenuSide) moves from canvasContextRouting to canvasMenuPlacement, which only the lazily loaded menu imports, so it stays out of the startup bundle.
…ffect ran When the idle preload settled after an open's render read the surface but before its effect ran, the effect saw a loaded surface and returned without re-rendering, so the first context menu or command palette could stay blank. The effect now re-renders whenever the render it follows had nothing to show.
…menu A menu first rendered while the Tools body was still loading started with no body; if the load finished before its effect ran (or before it became the empty-canvas menu), the effect and Tools both saw the module-level copy and skipped loading, so Tools expanded with no submenu. Both now copy it in.
Choosing a criterion the layout already follows produced a plan whose before and after were equal. Storing it as the undo step dropped the previous sort's positions and hid Undo auto-sort. Such a sort now commits and outlines nothing and keeps the earlier undo step.
A selection with fewer than two windows falls back to the default scope, which left out every mascot, including one the person had just selected. A lone selected mascot was then left behind, or auto-sort was disabled next to a single regular window. The fallback now skips only mascots that are not selected, as the UI contract describes.
…ator, and quick-toggle hotkey - Add 297 animated background scenes with full runtime Fine Dots (Braille subpixel matrix) rendering - Implement animated background creator modal with autonomous AI agent prompt generator - Add per-terminal background targeting, custom overrides reset, and background deletion with trash recovery - Add 'Mom entered' panic hotkey (default F8) to quickly toggle all terminal backgrounds - Translate entire backgrounds catalog into contextual Russian names - Fix Hermes hooks startup recovery crash and ensure cross-platform compatibility (macOS/Linux/Windows)
…ass secrets audit
…oader for bundle splitting test
…and fix Hermes journal cleanup - Remove custom video clips, media and third-party franchise scenes, keeping only the 240 official procedural scenes from ascii.rest (MIT license) - Reduce repository and installer size by over 140 MB - Tighten bundle splitting budget to 1.75 MB - Fix Hermes lifecycle recovery to remove journal only after successful cleanup, preserving retry path on errors
- Consume ascii.rest via official npm dependency (0.4.0, MIT) instead of vendoring 47k lines in core - Remove src/renderer/src/vendor entirely - Load official pieces on-demand from ascii.rest package - Update catalog and test assertions to track upstream library
Integrate opt-in owned-window streaming into Settings, add the Android client, contract tests, alpha APK CI and explicit platform/acceptance limits.
…age test and 1.7MB bundle budget
# Conflicts: # src/renderer/src/features/workspace/WorkspaceCanvas.tsx
howdeploy
marked this pull request as ready for review
October 26, 2026 19:14
BIackFIame
added a commit
to BIackFIame/CanvasTTY
that referenced
this pull request
Oct 26, 2026
Upstream main 3d50657 (howdeploy#168): howdeploy#163 auto-sort (already in edge, one copy), howdeploy#164 animated terminal backgrounds and F8 quick hide, howdeploy#165 browser zoom, howdeploy#166 CanvasLink for Android, maintainer follow-ups, version 1.8.3. Conflicts kept both sides: changelogs (1.8.3 above edge's 1.8.2 notes), renderer define for the build commit plus the es worker format, version 1.8.3 with the Edge desktop name, upstream's lockfile (no Edge-only deps), the Claude/Codex editor keys next to the F8 background toggle (F8 clashes with every other key, as upstream), plugin names next to the background types in App, and the Settings keyboard labels.
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.
Result
Integrate the selected canvas improvements and CanvasLink into CanvasTTY 1.8.3, with separately installable CanvasLink 1.0.0 Android APKs. Auto-sort, native-browser zoom, animated terminal backgrounds and Android window control can now ship from one source tree.
Contributor work preserved
10a13b11)bbc18acf)7c98a17e)19b46df9)The original contributor commits and authorship remain in the merge history. Maintainer integration and follow-up patches are separate commits; this PR does not claim the original implementations as maintainer-authored work.
Maintainer follow-ups
systemtheme for animated backgrounds.PRs #159 and #160 are deliberately excluded. #161 and #162 are also outside this integration.
Validation and release