diff --git a/website/src/components/layout/nav.tsx b/website/src/components/layout/nav.tsx
index 80c81df..3d48502 100644
--- a/website/src/components/layout/nav.tsx
+++ b/website/src/components/layout/nav.tsx
@@ -54,7 +54,10 @@ export const Nav = () => (
rel="noopener noreferrer"
className="inline-flex h-[38px] items-center gap-1.5 rounded-md border border-hairline px-2.5 font-mono text-xs text-secondary hover:border-line hover:bg-[var(--bg-selection)] hover:text-primary sm:h-8"
>
- GitHub ↗
+ GitHub
+
+ ↗
+
diff --git a/website/src/components/ui/button.tsx b/website/src/components/ui/button.tsx
index 94166a9..bae2bd6 100644
--- a/website/src/components/ui/button.tsx
+++ b/website/src/components/ui/button.tsx
@@ -38,6 +38,11 @@ const isExternal = (href: string): boolean => /^https?:\/\//.test(href)
* rather than a ``. External links open in a new tab and carry
* `rel="noopener"`; internal ones route through React Router so navigation
* stays client-side.
+ *
+ * The leaving-the-site mark is drawn by the component, never typed into a
+ * label. Hand-written "GitHub ↗" put the same glyph in thirteen strings and
+ * made it copy — it belongs to the control, so the control renders it, once,
+ * and only when the link actually leaves.
*/
export const Button = ({ href, variant, size, children, className }: ButtonProps) => {
const classes = cn(buttonVariants({ variant, size }), className)
@@ -46,6 +51,9 @@ export const Button = ({ href, variant, size, children, className }: ButtonProps
return (
{children}
+
+ ↗
+
)
diff --git a/website/src/components/ui/feature-card.tsx b/website/src/components/ui/feature-card.tsx
index 815e8f9..da09d90 100644
--- a/website/src/components/ui/feature-card.tsx
+++ b/website/src/components/ui/feature-card.tsx
@@ -61,15 +61,18 @@ export const FeatureCard = ({
className,
)}
>
-
+ {/* The glyph sits in the line like a prompt marker, not in a chip. A
+ tinted rounded square around an icon is the stock feature-card
+ treatment; here the terminal already gives us a better idiom. */}
+
{glyph !== undefined && (
-
{glyph}
-
+
)}
{title}
diff --git a/website/src/components/ui/panel.tsx b/website/src/components/ui/panel.tsx
index 2460e59..da0dac4 100644
--- a/website/src/components/ui/panel.tsx
+++ b/website/src/components/ui/panel.tsx
@@ -37,12 +37,16 @@ interface CalloutProps {
className?: string
}
-/** An aside with a coloured left rule. `warn` carries the tape amber. */
+/**
+ * An aside. `warn` carries the tape amber.
+ *
+ * The tone lives in the label, not in a coloured left rule — one ribbon per
+ * card is decoration, and the label was already saying the same thing twice.
+ */
export const Callout = ({ title, tone = 'accent', children, className }: CalloutProps) => (
p]:leading-[25px] [&>p]:text-secondary',
className,
)}
diff --git a/website/src/pages/community.tsx b/website/src/pages/community.tsx
index 6edc532..50e4c99 100644
--- a/website/src/pages/community.tsx
+++ b/website/src/pages/community.tsx
@@ -159,9 +159,9 @@ export const Community = () => {
- Open an issue ↗
+ Open an issue
- GitHub ↗
+ GitHub
{
{alt.links.map((link) => (
- {link.label} ↗
+ {link.label}
))}
@@ -247,7 +247,7 @@ export const Community = () => {
- Read the license ↗
+ Read the license
diff --git a/website/src/pages/docs.tsx b/website/src/pages/docs.tsx
index a8bccaf..42dab38 100644
--- a/website/src/pages/docs.tsx
+++ b/website/src/pages/docs.tsx
@@ -187,7 +187,7 @@ export const Docs = () => {
portmap tests whether your router will let peers connect back,
worth running once.{' '}
- More on being reachable →
+ More on being reachable
@@ -214,10 +214,10 @@ export const Docs = () => {
- README ↗
+ README
- docs.rs ↗
- Changelog ↗
+ docs.rs
+ Changelog
diff --git a/website/src/pages/home.tsx b/website/src/pages/home.tsx
index 78b74ec..51be5ce 100644
--- a/website/src/pages/home.tsx
+++ b/website/src/pages/home.tsx
@@ -117,8 +117,7 @@ export const Home = () => {
Search the network, share your files, browse someone’s collection, join
- a room. It runs over ssh on the machine where your music already lives, and
- it’s blazingly fast Rust 🦀.
+ a room. It runs over ssh on the machine where your music already lives.
@@ -126,7 +125,7 @@ export const Home = () => {
Install
Read the docs
- GitHub ↗
+ GitHub
@@ -206,7 +205,7 @@ export const Home = () => {
Reach for soulseek-rs-lib to build a custom client or an agent
on the protocol directly.{' '}
- Use the library →
+ Use the library
@@ -217,7 +216,7 @@ export const Home = () => {
message, portmap. Point cron, a script, or an
agent at them and read the output back. No daemon, no API to stand up.{' '}
- See the commands →
+ See the commands
@@ -231,14 +230,21 @@ export const Home = () => {
shell, so the same client works for scripting, cron jobs, and agents driving it
programmatically.
-
- {FEATURES.map((feature) => (
+ {/*
+ Three up, not four, with search spanning two of them: it's the thing
+ the client is for, and eight cards at identical weight said the
+ opposite. Eight items plus that one double = nine cells, so the grid
+ still comes out square.
+ */}
+
+ {FEATURES.map((feature, i) => (
{feature.body}
diff --git a/website/src/pages/install.tsx b/website/src/pages/install.tsx
index ecf0c95..c5dc603 100644
--- a/website/src/pages/install.tsx
+++ b/website/src/pages/install.tsx
@@ -122,7 +122,7 @@ export const Install = () => {
opens.
- Prebuilt binaries ↗
+ Prebuilt binaries
No Rust toolchain? Grab a prebuilt archive for your platform from the{' '}