Every "input" in the app is a label div: a `div` that takes focus, swallows key
events and prints the draft string. There is no caret, no selection, no pointer
positioning and no composition, so the moment anyone tries to edit rather than
append it reads as broken — which is exactly the complaint about the filter box.
`TextField` is a real GPUI widget instead. It is an `Entity` that owns its
buffer and focus, implements `EntityInputHandler` so the platform routes IME and
clipboard through it, and paints through a custom `Element` that shapes the line
once and reuses that shaping for hit-testing, the selection quads and the caret.
Owners learn about edits by subscribing to `TextFieldEvent::Changed`, which
carries the new content, rather than reading back through the entity.
It deliberately does not claim Enter, Escape, Tab or the arrows: those are
dialog and list gestures, so they stay unconsumed for the owner's own key
handler. That is what lets the saved-connections filter keep driving result
navigation while the field handles the text.
The editing rules live in `nyaterm_core::TextEdit` — caret motion across
multi-byte boundaries, what counts as a word (hosts and paths make `.`, `-`, `/`
and `@` stops), and which end of a selection shift moves — so they are testable
without a window.
Adopting it in the filter box retires the placeholder caret drawn by splicing a
`|` into the display string, and the seven arms this panel had bolted onto
`NyaTermApp`'s `EntityInputHandler`; the widget owns its own composition now.
Icons were previously hand-added, so their provenance and licensing lived in
folklore and a mis-painted asset was invisible at runtime: GPUI's `svg()`
reduces a file to an alpha mask, and `img()` keeps its pixels, but nothing
complains when the two are swapped.
Assets are now described by `scripts/icons.manifest` and vendored by
`scripts/sync-icons.sh` from pinned upstream releases, keeping the tree
reproducible and reviewable. `icons/**` stays monochrome and `color/**` full
colour; `scripts/check-icon-references.sh` fails the build when a referenced
asset is missing or painted through the wrong element, and runs in CI.
The lookup tables move out of `formatting/` into a dedicated `features/icons`
module so a ~1000-line brand table is not rebuilt inside a render closure, and
saved connections gain `icon_auto_detect`, which fills in a blank icon from the
detected remote system without ever overwriting a deliberate choice.
- Introduced performance heartbeat logging for terminal rendering, capturing metrics such as full shell paints and layout cache hits/misses.
- Added support for quiet tick intervals to optimize runtime performance during idle states.
- Improved session handling by deferring surface repaints and synchronizing terminal surface notifications more efficiently.
- Updated various functions to return session IDs for better state management and reduced unnecessary updates.
- Enhanced the terminal's scroll handling to ensure smoother user interactions and maintain visual consistency across sessions.
- Created a new `nyaterm-app` crate, including a `Cargo.toml` file and an `assets.rs` module for managing bundled SVG assets.
- Updated the workspace configuration to include new members and exclude specific vendor directories.
- Added various SVG icons for application functionality, enhancing the visual elements of the user interface.
- Added `alacritty_terminal` version 0.26.0 and `cursor-icon` version 1.2.0 to the project.
- Updated `signal-hook` to version 0.4.4 and `miow` to version 0.6.1.
- Refactored code for better readability by consolidating lines and improving formatting in various files, including `cloud_sync.rs`, `command_suggestion_suppression.rs`, and `terminal_input_tracker.rs`.
- Enhanced the `ConnectionStore` implementation for better error handling and clarity.
Port the Tauri ZMODEM detector/transfer core into nyaterm-session, intercept
protocol bytes in the GPUI event pump, and start remote rz uploads from
terminal file drops on SSH/Telnet/Serial sessions.