diff --git a/next.config.ts b/next.config.ts
index cd6c0be..3e1d9c9 100644
--- a/next.config.ts
+++ b/next.config.ts
@@ -13,10 +13,15 @@ const nextConfig: NextConfig = {
// route. Send it (and every nested path under it) to the matching
// /explore URL so deep links keep working when someone fat-fingers
// or copies from a referrer that included the "r".
+ //
+ // /universal-links is the old path for the universal links landing
+ // page; it now lives at the shorter /links. The old URL still works
+ // by redirecting so existing shares and bookmarks don't break.
async redirects() {
return [
{ source: '/explorer', destination: '/explore', permanent: true },
{ source: '/explorer/:path*', destination: '/explore/:path*', permanent: true },
+ { source: '/universal-links', destination: '/links', permanent: true },
];
},
};
diff --git a/src/app/universal-links/page.tsx b/src/app/links/page.tsx
similarity index 100%
rename from src/app/universal-links/page.tsx
rename to src/app/links/page.tsx
diff --git a/src/components/Header.tsx b/src/components/Header.tsx
index af4cfaf..3855a2a 100644
--- a/src/components/Header.tsx
+++ b/src/components/Header.tsx
@@ -266,7 +266,7 @@ export default function Header({ simple = false, compact = false }: HeaderProps)
extension
-
+
universal links
@@ -384,7 +384,7 @@ export default function Header({ simple = false, compact = false }: HeaderProps)
extension
·
-
+
universal links
@@ -491,7 +491,7 @@ export default function Header({ simple = false, compact = false }: HeaderProps)
extension
·
-
+
universal links
diff --git a/src/components/account/tabs/AboutTab.tsx b/src/components/account/tabs/AboutTab.tsx
index c08f45d..3bd447c 100644
--- a/src/components/account/tabs/AboutTab.tsx
+++ b/src/components/account/tabs/AboutTab.tsx
@@ -19,7 +19,7 @@ const LINKS: { label: string; href: string; icon?: React.ReactNode }[] = [
},
{
label: 'Universal links',
- href: '/universal-links',
+ href: '/links',
},
{
label: 'Terms & privacy',
diff --git a/src/components/landing/CrossLinkCards.tsx b/src/components/landing/CrossLinkCards.tsx
index de21ed1..07890ad 100644
--- a/src/components/landing/CrossLinkCards.tsx
+++ b/src/components/landing/CrossLinkCards.tsx
@@ -16,7 +16,7 @@ type Card = {
const CARDS: Card[] = [
{
key: 'universal-links',
- href: '/universal-links',
+ href: '/links',
icon: ,
title: 'Universal links',
body: 'Share aturi.to/handle/collection/rkey. Visitors choose which Atmosphere app opens it.',
diff --git a/src/components/landing/RecordTypesGrid.tsx b/src/components/landing/RecordTypesGrid.tsx
index 7025344..745a883 100644
--- a/src/components/landing/RecordTypesGrid.tsx
+++ b/src/components/landing/RecordTypesGrid.tsx
@@ -1,6 +1,3 @@
-'use client';
-
-import Link from 'next/link';
import {
BookOpen,
Camera,
@@ -18,7 +15,6 @@ type RecordType = {
label: string;
collection: string;
example: string;
- href: string;
};
const TYPES: RecordType[] = [
@@ -27,63 +23,54 @@ const TYPES: RecordType[] = [
label: 'Posts',
collection: 'app.bsky.feed.post',
example: 'aturi.to/profile/handle/post/',
- href: '/profile/aturi.to',
},
{
icon: ,
label: 'Profiles',
collection: 'app.bsky.actor.profile',
example: 'aturi.to/profile/handle',
- href: '/profile/aturi.to',
},
{
icon:
,
label: 'Lists',
collection: 'app.bsky.graph.list',
example: 'aturi.to/profile/handle/app.bsky.graph.list/',
- href: '/profile/aturi.to',
},
{
icon: ,
label: 'Feeds',
collection: 'app.bsky.feed.generator',
example: 'aturi.to/profile/handle/app.bsky.feed.generator/',
- href: '/profile/aturi.to',
},
{
icon: ,
label: 'Documents',
collection: 'pub.leaflet.document',
example: 'aturi.to/profile/handle/pub.leaflet.document/',
- href: '/profile/aturi.to',
},
{
icon: ,
label: 'Repositories',
collection: 'sh.tangled.repo',
example: 'aturi.to/profile/handle/sh.tangled.repo/',
- href: '/profile/aturi.to',
},
{
icon: ,
label: 'Photo galleries',
collection: 'social.grain.gallery',
example: 'aturi.to/profile/handle/social.grain.gallery/',
- href: '/profile/aturi.to',
},
{
icon: ,
label: 'Annotations',
collection: 'at.margin.annotation',
example: 'aturi.to/profile/handle/at.margin.annotation/',
- href: '/profile/aturi.to',
},
{
icon: ,
label: 'Any other lexicon',
collection: 'collection.nsid',
example: 'aturi.to/profile/handle//',
- href: '/explore',
},
];
@@ -92,6 +79,10 @@ const TYPES: RecordType[] = [
* Communicates breadth without forcing the visitor to skim a long
* categorized list — each tile names a record type, its lexicon NSID,
* and what a universal link to one looks like.
+ *
+ * These tiles are illustrative reference, not navigation — the example
+ * URLs use placeholder `handle`/`` segments that don't resolve to
+ * anything, so the cards are plain (non-interactive) elements.
*/
export default function RecordTypesGrid() {
return (
@@ -103,9 +94,8 @@ export default function RecordTypesGrid() {
}}
>
{TYPES.map((t) => (
- {
- e.currentTarget.style.borderColor = 'var(--text-accent)';
- e.currentTarget.style.background = 'var(--bg-tertiary)';
- }}
- onMouseLeave={(e) => {
- e.currentTarget.style.borderColor = 'var(--border-medium)';
- e.currentTarget.style.background = 'var(--bg-secondary)';
}}
>
{t.example}
-
+
))}
);