Convert the vertical sidebar navigation (Source, Issues, Patches) into
a horizontal tab bar above the content area. The ContextRepo info moves
into a popover behind an info button in the tab bar.
Mobile footer navigation is preserved for small screens, with the tab
bar hidden on mobile.
When a saved node (e.g. localhost) is down, the app previously showed a
dead-end "Node not found" page with no way to navigate away.
Now the not-found page displays the seed selector inline with the error
title, showing which node failed and letting users switch to a different
one directly. The same treatment applies when navigating to a repo on an
unreachable node.
They were not run by the test suite at all, because they lacked the
.spec.ts suffix. This change makes sure they're run again and fixes a
all failing specs.
Allow radicle-explorer to connect to a locally running radicle-httpd via
https://app.radicle.xyz/nodes/localhost. This was previously disabled to
encourage use of Radicle Desktop, but is now useful for testing the new
always-on node in local development environments.
Remove support for /nodes/radicle.local, an undocumented and unused convention.
Fix remote node loading when Cloudflare URL-encodes port separator (: → %3A).
We don't really need the `clipboard` prop.
By switching between stats in patches and issue listings the clipboard
props aren't been recomputed.
Wrote a test that should make sure this doesn't break in the future.
The commit listing on each patch revision started to be flaky when using
browser navigation. It seems like the `Array.sort()` call started to
reverse the order of the commit listing back to HEAD on top which isn't
what we wanted.
`Array.toReversed()` returns a fresh copy of the reversed array which is
less error prone.
We where using `sinon` in the `playwright` tests to simulate a different
time, which since `playwright@1.45.0` can be done with the Clock API
calling `page.clock.setFixedTime`.
And to test the mutex executor we can use the vitest utils spy function
`vi.fn()` instead of `sinon.spy()`
By using `page.route` we weren't changing the response of
`https://example.com` since we where only changing it on the initial
page.
By using `context` we are able to change the response for any request to
that site on all playwright pages.
This new component doesn't rely on marked.js but escapes any special
characters and then replaces any backtick with a <code> HTML tag to
render any inline codeblocks in all titles.
radicle-httpd and rad-web have been removed from the files.radicle.xyz
tar files, so we should build them to always have the web client be
compatible with the httpd