From cf68f1d7f5d009381e902a9376b5bc594e9f5056 Mon Sep 17 00:00:00 2001 From: highperfocused Date: Thu, 18 Jun 2026 10:12:14 +0200 Subject: [PATCH] Refresh dashboard styling with bold retro cards --- DESIGN.md | 325 ++++++++++++++ src/components/dashboard/DashboardStats.tsx | 34 +- src/components/dashboard/EventExplorer.tsx | 30 +- src/components/dashboard/EventKindsChart.tsx | 10 +- .../dashboard/RecentActivityChart.tsx | 10 +- .../dashboard/RecentActivityList.tsx | 12 +- src/components/navigation/AppSidebar.tsx | 19 +- src/index.css | 156 ++++--- src/pages/Dashboard.tsx | 24 +- src/pages/DashboardEvents.tsx | 19 +- src/pages/DashboardExport.tsx | 41 +- src/pages/Index.tsx | 414 ++++++++++-------- 12 files changed, 761 insertions(+), 333 deletions(-) create mode 100644 DESIGN.md diff --git a/DESIGN.md b/DESIGN.md new file mode 100644 index 0000000..7c11049 --- /dev/null +++ b/DESIGN.md @@ -0,0 +1,325 @@ +# LAYER.systems Design Direction + +## 1. Design Intent + +LAYER.systems should feel like Nostr relay infrastructure made visible: direct, fast, public, and protocol-native. The visual direction takes cues from bold editorial community sites such as `einundzwanzig.space`: strong navigation, large type, ticker energy, clear content bands, and a public-broadcast feeling. + +This is not a clone. LAYER.systems needs its own identity: orange, infrastructural, decentralized, and practical. The site should make the relay endpoint the center of the experience, not a footnote. + +## 2. Reference Translation + +Inspired by `einundzwanzig.space`: + +- Strong top navigation with grouped links. +- Large typographic hero with direct messaging. +- Horizontal ticker / marquee energy for relay URLs, protocol phrases, and network language. +- Clear content bands for relay status, usage, and connection steps. +- Editorial confidence instead of generic landing-page polish. +- Playful tone without losing operational credibility. + +Translate for LAYER.systems: + +- Use an orange-led palette instead of purple. +- Replace podcast/news hierarchy with relay endpoint and Nostr infrastructure hierarchy. +- Replace sponsor/content blocks with relay, protocol, client, and network modules. +- Use `wss://relay.layer.systems` as a visible recurring design motif. +- Make the copyable relay URL feel like the main product surface. + +## 3. Personality + +The interface should be: + +- Public, not gated. +- Bold, not glossy. +- Operational, not corporate. +- Protocol-aware, not protocol-obscure. +- Human in tone, calm in structure. + +Avoid: + +- Generic orange gradient SaaS aesthetics. +- Overly soft pastel community branding. +- Crypto-bro visual language. +- Dense technical jargon in primary UI copy. +- Stock-photo hero sections. + +## 4. Visual System + +### Color Palette + +Use orange as the identity anchor, but avoid a one-note all-orange interface. + +Suggested palette: + +- `Signal Orange`: `#F97316` for primary actions and identity marks. +- `Deep Ink`: `#18110D` for dark text, footer, and hard borders. +- `Relay Amber`: `#FACC15` for secondary highlights and ticker details. +- `Paper`: `#FFF7E8` for warm page background. +- `Chalk`: `#FFFFFF` for content surfaces. +- `Clay`: `#7C3F1D` for subdued labels and supporting text. +- `Protocol Green`: `#17A673` for live/verified states. +- `Network Blue`: `#2563EB` as a sparing cool accent. + +Usage rules: + +- Orange should lead, not flood. +- Use ink-heavy contrast and crisp borders for readability. +- Use amber, green, and blue sparingly to prevent the interface from becoming monochrome. +- Relay cards should remain legible before they are decorative. + +### Typography + +The type system should feel editorial and independent. + +Recommended direction: + +- Display: bold grotesk weight for hero and section titles. +- Body: readable sans with warmth and strong numerals. +- Mono: restrained monospace for relay URLs, event kinds, public keys, and tags. + +Implementation preference: + +- Use `@fontsource` packages when available. +- Use CSS variables for font families. +- Keep body text comfortable on content-heavy sections. +- Keep hero type large and compact, but never allow it to overflow mobile widths. + +## 5. Layout + +### Page Structure + +The first version should be a single-page relay experience: + +1. Sticky navigation +2. Relay ticker +3. Hero / identity +4. Copyable relay endpoint +5. Relay feature modules +6. Client connection steps +7. Footer with terms, privacy, and dashboard links + +### Navigation + +The nav should feel practical and slightly editorial: + +- Left: LAYER.systems wordmark. +- Center: Relay, Signal, Connect, Explore. +- Right: `LoginArea`. +- Mobile: compact header with persistent login/account access. + +Use strong text links and clear hover/focus treatment. Avoid oversized pill buttons for every nav item. + +### Ticker + +Add a horizontal ticker near the top of the page. + +Potential ticker phrases: + +- `LAYER.systems` +- `public Nostr relay` +- `wss://relay.layer.systems` +- `open protocols` +- `relay-first social` +- `NIP-aware infrastructure` +- `bring your own client` +- `events over platforms` + +Ticker behavior: + +- Continuous motion on desktop. +- Static fallback with `prefers-reduced-motion`. +- High contrast. +- No essential information should exist only in the ticker. + +### Hero + +The hero should be typographic and signal-heavy. + +Content: + +- Main title: `Relay signal for the open social web.` +- Supporting line: a concise statement about public Nostr relay infrastructure. +- Primary CTA: jump to the relay URL. +- Secondary CTA: jump to connection steps. + +Visual treatment: + +- Large editorial headline. +- Copyable endpoint module. +- Subtle grid or protocol texture is acceptable if it does not reduce readability. +- Use real relay/data motifs rather than abstract decorative blobs. + +## 6. Components + +### Relay Endpoint Card + +Required elements: + +- Relay URL. +- Copy button with copied state. +- Access mode. +- Network/protocol labels. +- Clear read/write language when applicable. + +Design: + +- Rectangular panel with `8px` or less radius. +- Crisp border and offset shadow. +- Relay URL must wrap safely on small screens. +- Copy action must remain reachable on mobile. + +### Feature Cards + +Required elements: + +- Icon. +- Short title. +- One practical sentence. + +Design: + +- Rectangular cards. +- Crisp border. +- Subtle hover shift. +- No nested cards. + +### Connection Steps + +Required elements: + +- Step number. +- Client action. +- Relay URL in the add-relay step. + +Design: + +- Structured rows or blocks. +- Step numbers should be visually strong. +- Code text should wrap cleanly. + +### Empty States + +If live relay status or event lists are added later, empty states should be minimalist and practical: + +- Explain what data will appear. +- Include a short hint about adding `wss://relay.layer.systems` from any Nostr client. +- Avoid speculative promises about uptime or persistence. + +## 7. Motion + +Motion should feel like signal movement, not decoration. + +Use: + +- Ticker movement. +- Subtle hover shifts on cards and CTAs. +- Focus-visible rings with a quick transition. + +Avoid: + +- Heavy parallax. +- Decorative floating orbs. +- Motion that distracts from reading the relay URL. + +Respect `prefers-reduced-motion`. + +## 8. Imagery and Texture + +This site does not need stock photography. + +Preferred visual motifs: + +- Relay/network linework. +- Terminal-inspired grid texture. +- Endpoint/code fragments. +- Protocol tags and event-kind labels. +- Simple infrastructure diagrams. + +Texture direction: + +- Light paper/noise texture is acceptable. +- Grid backgrounds are acceptable. +- Keep texture subtle enough that body text remains AA compliant. + +## 9. Accessibility + +Requirements: + +- WCAG 2.1 AA contrast for text and controls. +- Keyboard-accessible navigation and controls. +- Visible focus states. +- Semantic headings. +- Descriptive alt text for static images. +- Empty `alt` for purely decorative images. +- No unsafe HTML injection. + +## 10. Responsive Behavior + +Mobile: + +- Single-column flow. +- Sticky compact nav. +- Ticker can become static. +- Relay URL must wrap without layout overflow. +- Hero type must scale by breakpoint, not viewport-width formulas. + +Tablet: + +- Two-column section layouts where useful. +- Endpoint card remains prominent. + +Desktop: + +- Editorial grid with asymmetric section rhythm. +- Relay endpoint and hero copy share the first viewport. +- Keep primary content width controlled for readability. + +## 11. Copy Tone + +Tone should be direct and protocol-native. + +Good: + +- `Relay signal for the open social web.` +- `A public Nostr relay for portable social identity.` +- `Add the relay URL from any Nostr client.` +- `Events over platforms.` + +Avoid: + +- `Revolutionizing social engagement` +- `The ultimate decentralized ecosystem` +- `Next-generation community platform` +- `Seamless innovative experiences` + +## 12. Implementation Notes + +- Use existing shadcn/ui primitives. +- Keep cards at `8px` radius or less unless a local component requires otherwise. +- Use `cn()` for class composition when class branching is needed. +- Use lucide icons where icons are needed. +- Define color and font tokens in CSS variables. +- Keep sections as full-width bands with constrained inner content. +- Do not nest UI cards inside UI cards. +- Do not add unsafe HTML rendering for Nostr content. +- Sanitize all event-sourced URLs before rendering. + +## 13. Documentation Tie-In + +The `/docs` folder can document the design system once implementation expands. + +Recommended docs: + +- `/docs/design-system.md`: colors, typography, spacing, components. +- `/docs/content-guidelines.md`: tone, protocol language, relay usage guidance. +- `/docs/nostr-data.md`: relay-facing event kinds, tags, validation, and query patterns. + +## 14. Design Acceptance Criteria + +- The site clearly reads as LAYER.systems in the first viewport. +- The visual direction feels inspired by `einundzwanzig.space` but has its own orange Nostr relay identity. +- The relay endpoint is visually central, not secondary. +- The interface remains readable and usable at 360px width. +- Motion respects `prefers-reduced-motion`. +- UI contrast meets WCAG 2.1 AA. +- The design avoids generic orange SaaS styling. diff --git a/src/components/dashboard/DashboardStats.tsx b/src/components/dashboard/DashboardStats.tsx index eba09b5..d528036 100644 --- a/src/components/dashboard/DashboardStats.tsx +++ b/src/components/dashboard/DashboardStats.tsx @@ -14,7 +14,7 @@ export function DashboardStats({ pubkey }: DashboardStatsProps) { return (
{[...Array(4)].map((_, i) => ( - + @@ -41,39 +41,39 @@ export function DashboardStats({ pubkey }: DashboardStatsProps) { return (
- + - Loaded Events - + Loaded Events + -
{stats.totalEvents}
+
{stats.totalEvents}

All events loaded

- + - Event Types - + Event Types + -
{uniqueKinds}
+
{uniqueKinds}

Different kinds used

- + - Most Used - + Most Used + -
+
{Object.entries(stats.eventsByKind).length > 0 ? `Kind ${ Object.entries(stats.eventsByKind).sort( @@ -94,13 +94,13 @@ export function DashboardStats({ pubkey }: DashboardStatsProps) { - + - Last Activity - + Last Activity + -
+
{stats.lastActivity ? new Date(stats.lastActivity * 1000).toLocaleDateString( undefined, diff --git a/src/components/dashboard/EventExplorer.tsx b/src/components/dashboard/EventExplorer.tsx index 530eddb..798c7eb 100644 --- a/src/components/dashboard/EventExplorer.tsx +++ b/src/components/dashboard/EventExplorer.tsx @@ -122,7 +122,7 @@ export function EventExplorer({ pubkey }: EventExplorerProps) { if (isLoading) { return ( - + @@ -146,9 +146,9 @@ export function EventExplorer({ pubkey }: EventExplorerProps) { if (isError || !stats) { return ( - + - Your Events + Your Events Explore your published events and manage deletion requests. @@ -164,9 +164,9 @@ export function EventExplorer({ pubkey }: EventExplorerProps) { if (stats.events.length === 0) { return ( - + - Your Events + Your Events Explore your published events and manage deletion requests. @@ -185,10 +185,10 @@ export function EventExplorer({ pubkey }: EventExplorerProps) { return ( <> - +
- Your Events + Your Events Browse your published events and request deletion directly from your dashboard. @@ -197,7 +197,7 @@ export function EventExplorer({ pubkey }: EventExplorerProps) {
{ @@ -221,11 +221,11 @@ export function EventExplorer({ pubkey }: EventExplorerProps) { return (
- + {label} @@ -252,7 +252,7 @@ export function EventExplorer({ pubkey }: EventExplorerProps) {