Fixes issue where markdown table cell text was rendering character-by-character
vertically instead of horizontally. The root cause was the parent .markdown
container's word-break: break-word property affecting table cells.
Solution: Override word-break and overflow-wrap to 'normal' for table cells
(td and th) to prevent character-level breaking while maintaining proper
text wrapping behavior.
Fixes: 90c33657e807e809594049c18968254438f88f7b
enable() was called before invoke("version") resolved, so the first
checkNewVersion() could run while sanitizedCurrentVersion was still
undefined. Even though newVersion is a derived value, Svelte 5 may
not reliably recompute it when state changes asynchronously on a
module-level class instance.
Moving enable() inside the invoke callback ensures sanitizedCurrentVersion
is always set before any version comparison runs.
Move AppSidebar out of per-route view components into App.svelte so it
is never unmounted on navigation. This fixes the sidebar scroll position
resetting to the top whenever the user opens a repository or navigates
between Issues, Patches and the repo home view.
Also removes the redundant invoke<Config>("config") call from each repo
route loader — the value is now taken from sidebarData.config, which
loadSidebarData() already fetches.
Pick a free port at config load time using a TCP probe on port 0, inject
it into the Vite dev server via VITE_TEST_HTTP_API_PORT, and have
globalSetup start the test-http-api on the same port. The frontend
reads the env var at build time instead of the previously hardcoded 8081.
Redesign the entire app with a new UI kit. Typography, colors, icons,
avatars, and border radii have all been updated for a more polished,
consistent appearance that matches our other products like
radicle-explorer.
- Replace blockies-based avatars with a new DID-based avatar system
- Move Settings and Create Issue into fullscreen modals
- Change the default theme to follow the system theme
- Remove window decorations on macOS for a cleaner, more native feel
- Update the app icon
- Fix popovers and tooltips
Navigation:
- Rewrite app navigation and layouts
- Add a sidebar that gives you access to all your repos
- Change the startup screen to open directly to the notification inbox
- Add a getting started guide shown to new users on first launch
Settings:
- Add a setting to disable the notification badge
- Add a code font setting
Bug fixes:
- Fix reactions and edits incorrectly targeting the root comment
instead of the intended reply
- Restrict issue/patch state, labels and assignees to delegates only
Instead of making the whole card interactive, I decided to make the
heading interactive. This avoids nesting the copyable ID as an
interactive element. Nested interactive elements are generally hard to
deal with for implementers and users [1].
I also cleaned up the flex layout in the card heading.
[1]: https://accessibilityinsights.io/info-examples/web/nested-interactive/
For local storage updates to be persisted it had to be assigned for
example with `storage.value = storage.value`. It was easy to forget this
and it’s not immediately obvious why this is needed. (In fact, eslint
complains.)
We introduce an `update` method for the local storage and an
`updateStoredDraftReview` to encapsulate the necessary logic.
This makes the issue list behave the same way as patch list. We don't change
the filter, just reload the issue list so that the new issue state is properly
reflected in the list.
We decide during onboarding to display different things based on the
error code received from the backend.
Due to the new `InvokeError` type we lost this `error.code` string.
This patch moves the revision list from the tab bar drop-down to a sidebar
on wide screens and above the current revision on narrow screens. This
way all revisions are visible at all times.
We also move and nest the revision reviews into that list so that one
can see whether there's anything actionable at a glance.
Other tweaks:
- added comment counts to revisions and reviews
- displayed unresolved comment thread counts per review
- swapped icons for accepted/rejected and neutral reviews to avoid clashing
with resolved/unresolved comment icons
- made label and assignee sections more compact with hover-triggered "+" buttons
- added author and status sections to the sidebar
- enabled patch state changes from the title bar
- made "Review revision" the primary action and "Checkout patch" secondary
- added "Draft" label to draft patches
- capitalized all badges for consistent UI text