The `radicle` crate switched its OID `struct`. The new `struct` does not
convert to/from the OID `struct` in `radicle-surf`. Introduce an ad-hoc
conversion.
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
Builds macOS DMG, Linux amd64 deb and AppImage from a single macOS
Apple Silicon machine using Podman containers. See RELEASE.md and
scripts/release for details.
Replaces Woodpecker CI with GitHub Actions workflows for lint, unit
tests, e2e tests, and Arch package validation.
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.