diff --git a/src/app/[handle]/[collection]/[rkey]/page.tsx b/src/app/[handle]/[collection]/[rkey]/page.tsx index 7630d35..b31a19a 100644 --- a/src/app/[handle]/[collection]/[rkey]/page.tsx +++ b/src/app/[handle]/[collection]/[rkey]/page.tsx @@ -82,8 +82,8 @@ export default function RecordPage() { if (isLoading) { return ( -
-
+
+
{/* Show a post skeleton by default, as most records are posts */}
@@ -92,7 +92,8 @@ export default function RecordPage() { if (error || !parsed || parsed.type === 'unknown') { return ( -
+
+

Error

{error || 'Invalid or unsupported URI'}

@@ -100,9 +101,9 @@ export default function RecordPage() { } return ( -
- {/* Site Header */} -
+
+ {/* Site Header - Compact Mode */} +
{/* Record Preview */} {recordData && ( diff --git a/src/app/[handle]/page.tsx b/src/app/[handle]/page.tsx index 33e64d1..bba0963 100644 --- a/src/app/[handle]/page.tsx +++ b/src/app/[handle]/page.tsx @@ -62,8 +62,8 @@ export default function ProfilePage() { if (isLoading) { return ( -
-
+
+
); @@ -71,7 +71,8 @@ export default function ProfilePage() { if (error) { return ( -
+
+

Error

{error}

@@ -81,9 +82,9 @@ export default function ProfilePage() { const parsed = parseURI(handle); return ( -
- {/* Site Header */} -
+
+ {/* Site Header - Compact Mode */} +
{/* Profile Preview */} {profileData && ( diff --git a/src/app/globals.css b/src/app/globals.css index a389502..ef76eff 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -192,6 +192,56 @@ a:hover { transform: scale(1.1) rotate(-5deg); } +/* Compact Navigation Links - for dropdown menu */ +.compact-nav-link { + display: flex; + align-items: center; + gap: 0.625rem; + padding: 0.75rem 1rem; + color: var(--text-secondary); + font-size: 0.9rem; + font-weight: 400; + background: var(--bg-tertiary); + border: 1px solid var(--border-subtle); + transition: all 0.3s ease; + position: relative; + overflow: hidden; + text-decoration: none; +} + +.compact-nav-link::before { + content: ''; + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: 3px; + background: var(--text-accent); + transform: scaleY(0); + transition: transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); +} + +.compact-nav-link:hover { + color: var(--text-primary); + background: var(--bg-elevated); + border-color: var(--border-medium); + transform: translateX(4px); +} + +.compact-nav-link:hover::before { + transform: scaleY(1); +} + +.compact-nav-link svg { + color: var(--text-accent); + transition: all 0.3s ease; +} + +.compact-nav-link:hover svg { + color: var(--text-primary); + transform: scale(1.15) rotate(-5deg); +} + /* Buttons */ button { font-family: var(--font-serif); @@ -607,6 +657,16 @@ html { will-change: transform; } +/* Preview cards - subtle organic rotation on hover */ +.card:not(.feature-card-primary):not(.feature-card-secondary):not(.cta-card) { + will-change: transform; +} + +.card:not(.feature-card-primary):not(.feature-card-secondary):not(.cta-card):hover { + transform: rotate(0deg) scale(1.005) !important; + box-shadow: 0 4px 40px var(--glow-subtle); +} + /* Responsive */ @media (max-width: 768px) { html { @@ -640,7 +700,8 @@ html { .feature-card-primary, .feature-card-secondary, .example-link, - .cta-card { + .cta-card, + .card { transform: none !important; } diff --git a/src/components/Header.tsx b/src/components/Header.tsx index edb3057..815248c 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -1,11 +1,133 @@ +'use client'; + +import { useState } from 'react'; import Link from 'next/link'; -import { Home, Link2, Code } from 'lucide-react'; +import { Home, Link2, Code, Leaf } from 'lucide-react'; interface HeaderProps { simple?: boolean; // If true, shows a smaller version without the tagline + compact?: boolean; // If true, shows ultra-compact inline header with expandable menu } -export default function Header({ simple = false }: HeaderProps) { +export default function Header({ simple = false, compact = false }: HeaderProps) { + const [isExpanded, setIsExpanded] = useState(false); + + // Ultra-compact mode for link preview pages + if (compact) { + return ( +
+
+ {/* Logo/Wordmark */} + + + aturi.to + + + + {/* Expandable menu button */} + +
+ + {/* Expanding organic nav panel */} +
+ +
+
+ ); + } + if (simple) { return (
{/* Author Info */}
diff --git a/src/components/PostPreviewSkeleton.tsx b/src/components/PostPreviewSkeleton.tsx index a555d52..b05bb10 100644 --- a/src/components/PostPreviewSkeleton.tsx +++ b/src/components/PostPreviewSkeleton.tsx @@ -22,6 +22,7 @@ export default function PostPreviewSkeleton({ padding: '1.5rem', background: 'var(--bg-secondary)', border: '1px solid var(--border-medium)', + transform: 'rotate(0.4deg)', }} > {/* Author Info skeleton */} diff --git a/src/components/ProfilePreview.tsx b/src/components/ProfilePreview.tsx index 1c01e0e..34ef551 100644 --- a/src/components/ProfilePreview.tsx +++ b/src/components/ProfilePreview.tsx @@ -63,7 +63,10 @@ export default function ProfilePreview({ profile }: ProfilePreviewProps) { overflow: 'hidden', background: 'var(--bg-secondary)', border: '1px solid var(--border-medium)', + transform: 'rotate(-0.3deg)', + transition: 'all 0.4s ease', }} + className="card" > {/* Banner */} {banner ? ( diff --git a/src/components/ProfilePreviewSkeleton.tsx b/src/components/ProfilePreviewSkeleton.tsx index ad85275..5bafe1a 100644 --- a/src/components/ProfilePreviewSkeleton.tsx +++ b/src/components/ProfilePreviewSkeleton.tsx @@ -15,6 +15,7 @@ export default function ProfilePreviewSkeleton() { overflow: 'hidden', background: 'var(--bg-secondary)', border: '1px solid var(--border-medium)', + transform: 'rotate(-0.3deg)', }} > {/* Banner skeleton */} diff --git a/src/components/RecordPreview.tsx b/src/components/RecordPreview.tsx index f457042..2a572d1 100644 --- a/src/components/RecordPreview.tsx +++ b/src/components/RecordPreview.tsx @@ -64,7 +64,10 @@ export default function RecordPreview({ record, collection, handle, rkey }: Reco background: 'var(--bg-secondary)', border: '1px solid var(--border-medium)', overflow: 'hidden', + transform: 'rotate(0.2deg)', + transition: 'all 0.4s ease', }} + className="card" > {/* Header: URI Structure */}
setShowJsonModal(false)} >
e.stopPropagation()} > + {/* Ambient glow effect */} +
+ {/* Modal Header */}
-
-
+
+
Full Record Data
-
+
{displayType}
@@ -289,24 +329,41 @@ export default function RecordPreview({ record, collection, handle, rkey }: Reco style={{ flex: 1, overflow: 'auto', - padding: '1.5rem', + padding: '2rem', + position: 'relative', + zIndex: 1, }} >
                 {JSON.stringify(value, null, 2)}
               
+ + {/* Subtle bottom fade */} +
)} diff --git a/src/components/RecordPreviewSkeleton.tsx b/src/components/RecordPreviewSkeleton.tsx index 69b0b79..3efeb9d 100644 --- a/src/components/RecordPreviewSkeleton.tsx +++ b/src/components/RecordPreviewSkeleton.tsx @@ -14,6 +14,7 @@ export default function RecordPreviewSkeleton() { padding: '1.5rem', background: 'var(--bg-secondary)', border: '1px solid var(--border-medium)', + transform: 'rotate(0.2deg)', }} > {/* Record Type Header */}