Repository navigation
UI Library Bugs
The bugs we fixed in the UI library (ui/): what you saw, why it happened, and the fix and why we chose it. The
library itself is described in UI-Library.md.
-
Select's arrow touched the right border. WebKit draws a native select's arrow against the border and ignores the padding. Select now hides the native arrow (
appearance: none) and draws a chevron inside the padding, using theselecttokens for its inset and room, so every platform gets the same numbers. The app's ownselect.inputcopy of this fix went away with the migration: every select in the app is the library's. -
Dragging rows in a Tree did nothing in the app. Tree and TreeRow used HTML5 drag and drop (
draggable,dragover,drop). In the browser showcase this worked, but Tauri's window answers every native drag itself, so it can report files dragged in from Finder, and HTML5 drop events never reach the page. The app's Files panel, editor tabs and Interactive Rebase all drag with pointer events for this reason. Tree now does too: a press past 4 px starts a drag, a ghost follows the pointer ("Move cart.ts", "Copy 3 items"), Option copies, a closed folder under the pointer opens after 600 ms, the list scrolls near its edges and Escape cancels. Where a drop may land is pure logic inui/web/src/lib/logic/treeDrag.tswith tests; the gesture istreeDragger.svelte.ts, whose window listeners live only while a press or a drag does. We chose pointer events over asking Tauri to stop reporting native drags because Finder drops into the Files panel and the terminal need them. -
A responsive bar could throw "ResizeObserver loop completed with undelivered notifications". A responsive Toolbar or Stack measures its width with a
ResizeObserverand hides parts when it gets narrow. Hiding a Badge or a group can change the bar's height, and the change landed while the browser was still delivering the same resize, so it could not deliver the new one in that frame and reported the error (the theme check caught it on the Stack story's repository rows).BarSizeinui/web/src/lib/logic/barSize.svelte.tsnow applies the measured width on the next animation frame. We chose one frame of delay over watching only the width, because the browser reports the loop for any skipped size change, whatever the callback does with it. -
Dragging the Log's split down made the commit list smaller. SplitPane gave its handle the side
bottomin a column, which tells ResizeHandle the panel sits below the handle, so dragging down shrank the size. In a column that size belongs to the pane above. ResizeHandle now knows a fourth side,top, which grows downwards, and SplitPane picks the side from where its sized pane is (sized="first"or"second"). We added a side instead of flipping the sign in SplitPane, so the arrow keys follow the same rule as the pointer;resize.test.tscovers it. -
A SplitHandle could not be grabbed over a diff. The editors covered the handle and took its pointer events. Its stacking token was written as
--split-handle-layer: 5px(and--split-grid-splitter-layer: 20px), and a z-index with a unit is ignored. The token build (componentValueinui/design-tokens/build/css.ts) now writes parts namedlayeror...Layeras plain numbers;tokens.test.tscovers it. We fixed the generator rather than the one value, so every later layer token is right too. -
PatchView could show a removed line as a file header.
patchLineKindread every line alone, so a removed line whose text starts with--(a SQL or Lua comment) became--- ...and looked like a patch's file header.patchLinesinui/web/src/lib/logic/patchLines.tsnow counts file headers only between a file'sdiff --gitline and its first hunk, the rule the app's own copy used; that copy is gone andpatchLines.test.tskeeps its case. We kept the line-by-line helper for patches without hunks and added the state on top, because the state is what git's format defines. -
Editor tabs lost their close button. Trimming EditorTab.svelte to 300 lines cut the body of the rule that shows the x on the active, hovered, pinned and single tab, so the selector list ran into the next rule. The rule is back; a check now compares every library component's CSS rules with the last commit when files are trimmed.
-
A picker's count wrapped under its name. A ghost Button put its words in a plain inline span, so an Icon (a block svg) after a count started a new line ("main 1" then the arrow). The label is now a row (
display: inline-flex), so Texts and Icons stay on one line and each Text truncates itself. -
Table cells in the rich Markdown editor grew tall. Its rules moved from the app's scoped style into the library's
markdown-rich.css, and lost the scoping class that made them beatmarkdown.css's.md-body :is(p, ...)margins. Every rule there now names.md-body.md-rich, one class more, which restores the old order without!important. -
Git Console rows could not be reached with the keyboard. A List tells its Rows that it owns the keys, so a Row there is not a button. That is right for a listbox or a tree, but a plain list (
role="list") has no keys of its own. The List context now says whether the list owns the keys, and in a plain list a Row withonclickstays a button.
These pages are generated from docs/wiki. To correct something, open a pull request against the source file; edits made here are overwritten.
Using Nibtree
- Getting Started
- Welcome Screen
- Workspaces
- Files Panel
- File Operations
- File Icons
- Rounded Panels
- Editor and Tabs
- Pin Reorder and Wrap Tabs
- Single Tab Title
- Split Editor
- New File and Unsaved Changes
- Unload Hidden Tabs
- Editing Code
- Code Appearance
- Markdown Editor
- Image and PDF Preview
- Search Everywhere
- Recent Files
- Navigation Bar
- Find and Replace
- Changes and Commits
- Sign In Prompts
- Commit Box Layout
- Repository Actions
- Commit Options
- Ignoring Files
- Diffs
- Inline Diffs
- Staging View
- Revert a Change
- Resolving Conflicts
- Merge Tool
- Blame
- History and Log
- Merge Commits
- Branches and Tags
- Branches Popup
- Remotes
- Stashes
- Shelf
- Git Menu
- Git Dialogs
- Interactive Rebase
- Worktrees
- AI Agents
- AI Tasks
- AI Usage
- Keep Computer Awake
- Submodules
- Git LFS
- GitHub
- Git Console
- Terminal
- Terminal Features
- Scripts
- Navigation
- Menus
- Settings
- Settings Search
- Color Themes
- Settings Terminal and Automation
- Settings Files
- Updates
- Status Bar and Help
- Notifications
- Memory Use
- Clear Cache
- MCP and CLI
- Git Mergetool
- Keyboard Shortcuts
- Keyboard Shortcuts Editor
- Troubleshooting
- Troubleshooting Git
Developers
- Developer Guide
- Architecture
- Project Layout
- Backend
- How Folder Watching Works
- Folder Watching Bugs We Fixed
- How Workspace Files Work
- How the Preview Scheme Works
- Backend Services
- How Terminal Features Work
- Terminal Bugs We Fixed
- Frontend
- How the Rich Markdown Editor Works
- Rich Markdown Bugs We Fixed
- Git Menu Links
- Menu Keys and Routing
- Frontend Modules
- Blame Bugs We Fixed
- Project Color And Title Bar
- One Diff View
- Diff Bugs We Fixed
- Merge Tool Layouts
- Merge Tool Bugs We Fixed
- Color Theme Bugs We Fixed
- How the Connected Diff Works
- Rounded Panels Bugs We Fixed
- Update Bugs We Fixed
- Status Bar Bugs We Fixed
- MCP and CLI Bugs We Fixed
- Repository Actions Bugs We Fixed
- How the Changes Tab Works
- CodeMirror Patterns
- How the Cursor Works
- How Editor Features Work
- How the Path Bar Works
- Commands and Events
- Settings Reference
- Commands Workspace and Changes
- Commands Branches and Remotes
- Commands History and Extras
- Commands App and Tools
- Testing
- Test Suites
- Debugging
- Debugging with MCP
- Measuring Setting Memory
- How Terminal Memory Is Measured
- How Markdown Diagrams Work
- Releases and CI
- Publishing the Wiki
- Versioning and Changelog
- Browser Version Packages
- Browser Release Checks
- Docker Image
- Platforms and Signing
- Windows Support
- Windows Bugs We Fixed
- Windows MCP and CLI
- Docs and Screenshots
- UI Library
- UI Library MCP
- UI Library Bugs
- UI Library Migration
- Contributing
How features work
- Welcome screen
- Workspaces and folders
- Files panel
- File operations
- File icons
- Editor and tabs
- Pin, reorder and wrap tabs
- Single tab title
- Split editor
- New File and unsaved changes
- Unload hidden tabs
- Editing code
- Code appearance
- Markdown editor
- Image and PDF preview
- Search Everywhere
- Recent Files
- Navigation Bar
- Find and replace
- Changes and commits
- Sign-in prompts
- Commit box layout
- Repository actions
- Commit options
- Ignoring files
- Diffs
- Inline diffs
- Staging view
- Revert a change
- Resolving conflicts
- Merge tool
- Blame
- History and log
- Merge commits
- Commit tabs
- Branches and tags
- Branches popup
- Remotes
- Stashes
- Shelf
- Git menu
- Git dialogs
- Interactive rebase
- Worktrees
- AI agents
- AI usage
- Keep computer awake
- AI tasks
- Submodules
- Git LFS
- GitHub account
- Git Console
- Back and Forward
- Integrated terminal
- Scripts tool window
- Menu bar
- Settings
- Search in Settings
- Color themes
- Rounded panels
- Updates and release channels
- Status bar and help links
- Notifications
- Memory readout and memory log
- Clear Cache
- MCP server and command line tool
- git mergetool mode