Design System Showcase
Interactive demonstration of the JFSN Archive design system. Hover over components to see interactions in action. Read DESIGN-SYSTEM.md for full documentation.
Design Principles
Every design decision at JFSN flows from these five core principles. They guide component design, interaction timing, and visual hierarchy.
Artwork First
The image is the primary object. UI recedes. No gradients, filters, or overlays on artwork. Full color always. UI exists to serve the work, never to be decorative.
Clarity Through Restraint
No drop shadows on images. No rounded corners. No animations on artwork hover. Borders and outlines are sharp, flat, intentional. Every pixel has a purpose.
Intentional Motion
Animations signal affordance, connect state changes, give feedback. No animation is random. 200ms for feedback, 500ms for entrance. All animations respect prefers-reduced-motion.
Accessible by Default
WCAG AA contrast ratios. Keyboard navigation on all pages. Focus indicators always visible. Touch targets ≥44×44px. No color-only information. Screen-reader friendly.
Museum Grade
Precision in detail. Consistent easing curves. Warm archival colors. Typography that breathes. Layout that adapts. A feeling of care in every interaction.
Personal Record, Not Campaign
No calls to action. No engagement patterns. No promotional language. Just the work and the metadata. Spare, honest, built for people who care about the archive itself.
Color System
Stitch Light (Primary UI)
Key Principle
International-orange (#FF6600) only for hover states, fills, and sections on dark backgrounds. Never persistent text on light.
Typography
Scale
Real Usage Examples
Why I Made Things
Something that still had a life left in it. I would see discarded materials—objects that had already served their purpose—and imagine what they could become. Not repair or restoration, but transformation. A broken cassette case becomes a sculptural element. A strip of fabric becomes the surface for a new composition.
Heading: Display 40px · Body: 16px / 1.6 line-height
Untitled (Cassette Torso)
2020 · COLLAGEPairs: heading + label, minimal spacing
"Saw it out front waiting for the garbage men to take them all away."
Jeff, on early materials · from oral history
Components
Quote Card (Sidebar)
"Saw it out front waiting for the garbage men to take them all away."
Warm-brown archival border, soft shadow, used for callouts and featured content.
Archive Card (Grid Thumbnail)
Full color at rest, saturation overlay fades on hover, title turns orange.
Buttons
CTA: orange background, white text. Secondary: transparent, gray border. Both transition smoothly on hover, focus outline always visible.
Links
Bracket link with orange-ink text, bottom border. Underline animates on hover via transform: scaleX.
Forms
Custom checkboxes with focus outline, no native browser styling.
Data Tables (for researchers)
| Work ID | Title | Year | Medium |
|---|---|---|---|
| art1010 | Untitled (Cassette Torso) | 2020 | Collage |
| art0953 | Guernica (Full Scale) | 1990s | Collage |
| art0380 | Devo at WHK Auditorium | 1977 | Photography |
Header: `#ebe8e2` background, warm-brown border. Rows: alternating white/light, 1px border-bottom. Monospace archive IDs, light text.
Breadcrumbs (URL-Inferred)
Clickable breadcrumbs that reflect current filters. Separator in warm-brown archival color.
Filter Chips
Active filters displayed as removable chips.
Component States Gallery
Every interactive component has multiple states. Hover/focus on elements below to see all states in action.
Buttons
Primary (CTA)
Opacity: 0.85
Orange outline
Opacity: 0.5
Secondary
Border + text orange
Links
Form Inputs
Cards / Tiles
Default Card
Soft shadow + border
Hover Card
Lifted + enhanced shadow
Focus Card
Focus outline + thicker border
Interactions & Animations
Entrance Animations (Staggered)
Hover over or reload the page to see entrance animations. Fade + slide-up with 50ms stagger between items.
Reduced motion: If you have "Prefer reduced motion" enabled in system settings, animations will be disabled automatically.
Hover States
Try hovering over elements above:
- Buttons: Opacity transition, no scale
- Links: Underline animates in via transform
- Cards: Optional shadow intensification (not currently visible, can be added)
Focus States
Try tabbing to any button or link:
- Outline: 2px solid #FF6600, offset 2px
- Never hidden: Always visible, never removed
- High contrast: Orange on bone-white background
Accessibility Checklist
Contrast ✓
- Text: 8.59:1 (exceeds 4.5:1)
- Orange-ink: 5.07:1 (WCAG AA)
- International-orange: link-only or dark bg
Keyboard Nav ✓
- Tab order logical
- Focus always visible
- Arrow keys on decades
Screen Readers ✓
- Descriptive alt text
aria-current="page"- No color-only info
Motion ✓
- Respects reduced-motion
- No auto-play
- User-controlled
Touch Targets ✓
- Minimum 44×44px
- Mobile-optimized
- Adequate spacing
Responsive ✓
- Mobile-first design
- Fluid typography
- Tested iPhone 15 Pro
Spacing & Grid System
All spacing follows an 8px baseline grid. This creates visual rhythm and makes layout predictable across all screen sizes.
Spacing Scale
$spacing-xs: 4px
Icon spacing, tight details
$spacing-sm: 8px
Form fields, button padding
$spacing-md: 12px
Element spacing, gaps
$spacing-lg: 16px
Card padding, sections
$spacing-xl: 24px
Layout blocks, major gaps
$spacing-2xl: 32px
Section separation
Layout Rules
- Container max-width: 1200px (padding: 20px on mobile, 40px desktop)
- Grid gap: 24px on desktop, 16px on tablet, 12px on mobile
- Card padding: 16–24px (never less, never more)
- Button padding: 12px vertical, 20px horizontal (minimum 44×44px target)
- Form field height: 40px minimum (includes padding)
Real-World Patterns
How components work together in actual page layouts. These patterns solve recurring design problems.
Filter + Grid Pattern
Filters
Grid layout: 3 cols on desktop, sticky filters on left, cards stack on mobile
Breadcrumb + Title + Actions Pattern
Archive › Collage › 1990s
Untitled (Mixed Media)
Hierarchy: breadcrumb (11px label) → heading (40px) → action button (right-aligned)
Data Table Pattern
| Work ID | Title | Year | Medium |
|---|---|---|---|
| art0001 | Untitled Study | 1974 | Collage |
| art0002 | Reliquary | 1990 | Mixed Media |
| art0003 | Threshold | 2005 | Sculpture |
Zebra striping (alternating rows), monospace IDs, 12px responsive
Color Contrast & Accessibility Data
Complete WCAG 2.1 contrast matrix. All colors used on-site verified for AA compliance (minimum 4.5:1 for text, 3:1 for UI components).
| Foreground | Background | Ratio | AA | AAA | Usage |
|---|---|---|---|---|---|
| deep-ink #0B0B0B | bone-white #fcf9f3 | 20:1 | ✓ | ✓ | Primary text, headings |
| archive-gray #575757 | bone-white #fcf9f3 | 8.59:1 | ✓ | ✓ | Secondary text, labels |
| orange-ink #B84700 | bone-white #fcf9f3 | 5.07:1 | ✓ | — | Persistent orange text |
| int-orange #FF6600 | bone-white #fcf9f3 | 2.79:1 | ✗ | ✗ | Hover only, NOT text |
| int-orange #FF6600 | deep-ink #0B0B0B | 6.7:1 | ✓ | ✓ | On dark sections |
Rule: All persistent text meets WCAG AA (4.5:1). International-orange (#FF6600) only used for hover states or text on dark backgrounds. No exceptions.
Responsive Breakpoints & Mobile-First Strategy
JFSN follows a mobile-first strategy. Design for 320px (iPhone SE), then enhance for tablet and desktop. All breakpoints tested on actual devices.
Mobile
320px–767px
- Single column layout
- Touch targets 44×44px min
- Drawer navigation
- Grid 1–2 columns
- Padding: 16px
Tablet
768px–1023px
- Two column layout
- Sidebar on medium screens
- Grid 2–3 columns
- Touch-friendly spacing
- Padding: 24px
Desktop
1024px+
- Full-width with max 1200px
- Horizontal nav visible
- Grid 3–4 columns
- Hover states active
- Padding: 40px
Tested Devices
- Mobile: iPhone 15 Pro (primary test device), iPhone SE (320px minimum)
- Tablet: iPad (7th gen), iPad Air
- Desktop: 1280px (typical), 1920px (larger screens), 2560px (ultra-wide)
- Touch: All interactive elements tested with finger on actual devices
- Browsers: Safari (iOS), Chrome, Firefox, Edge (latest 2 versions)
Session 57: Best-in-Class UX Complete ✅
27 improvements shipped: Phase A–D animations (17) + UX fixes (3) + style enhancements (7). All live at jfsn.com.
Phase A–D: Micro-Interactions & Animations (17 items)
Phase B (5): Page transitions fade-through, grid stagger, related works stagger, form input bounce, breadcrumb color shift
Phase C (5): Link underline draw, sort arrow rotate, search flash, modal entrance, mobile swipe gesture+haptics
Phase D (3): Custom scrollbar, focus ring pulse, toast slide-in/out
UX Fixes (3 items)
✅ Filter loading state (upgraded to Phase A animations)
✅ Mobile breadcrumb truncation (fixed logic, works on <768px)
Style Enhancements (7 items)
✅ Related works sidebar: Card design, left border accent, hover transitions
✅ Print styles: Enhanced page setup, heading hierarchy, URL display, table optimization
✅ Scroll-reveal animations: IntersectionObserver fade-in with stagger
✅ Button press feedback: Scale animation (1→0.95→1), success states
✅ Custom scrollbar: Warm-brown + orange hover (desktop)
✅ Skeleton placeholders: Shimmer animation, grid variants, size options
Interactive Features Showcase
Best-in-class interactions now live on every page. Try them out below, or press ? anywhere on the site to access keyboard shortcuts.
Keyboard Shortcuts Modal
Press ? anywhere on the site to open a full-screen modal with keyboard navigation help. Includes backdrop blur, fade-in animation, and ESC to close.
Includes: P/N (prev/next work) · ←→ (decade nav) · ? (help) · ESC (close)
Saved Filter Presets
On the archive page, save your filter combinations (medium, decade, series) as named presets. Presets persist across sessions using browser localStorage.
Workflow:
1. Select filters (Collage + 1970s decade)
2. Click "+ Save Filter"
3. Name your preset ("Retro Collages")
4. Click saved preset to restore filters instantly
5. Click × to delete a preset
Toast Notifications
Feedback messages appear at the bottom-right with slide-in animation. Available types: success (green), error (red), info (blue).
Mobile Swipe Gestures
On decade pages (1970s–2020s), swipe left or right to navigate between decades. Includes haptic feedback on mobile devices.
Haptic Pattern: 10ms tap · 5ms pause · 10ms tap (tactile confirmation)
Works on: iPhone, Android, any device with vibration API
Page Transition Animation
When navigating from archive to individual artwork, a fade-through-color overlay connects the two states visually (200ms duration).
Visual Effect: Semi-transparent overlay fades in then out
Timing: 200ms total (smooth, not distracting)
Respects: prefers-reduced-motion (disabled if user preference set)
Micro-Interaction Timing Reference
| Interaction | Duration | Easing | Purpose |
|---|---|---|---|
| Hover state (button/link) | 200ms | ease | Feedback |
| Page transition overlay | 200ms | ease | Navigation |
| Entrance (fade-in) | 500ms | ease | Load reveal |
| Stagger (per item) | 50ms | — | Sequential effect |
| Toast slide-in | 300ms | ease-out | Notification |
| Focus ring pulse | 600ms | ease-in-out | Keyboard nav |
| Button press (scale) | 150ms | cubic-bezier(0.4,0,0.2,1) | Click feedback |
Principle: Interactions ≤ 300ms feel instantaneous. Entrances 400–600ms feel elegant. All durations respect prefers-reduced-motion setting.
Easing Curves (Universal)
All site-wide animations use one of two easing curves for consistency and premium feel:
Hover / Feedback
ease (0.25, 0.46, 0.45, 0.94)
Quick + responsive
Entrance / Premium
cubic-bezier(0.4, 0, 0.2, 1)
Smooth + elegant
Animation Showcase: Live Demos
Watch these animations loop continuously to see the exact timing, easing, and feel. All respect prefers-reduced-motion settings.
Entrance Animations
Micro-Interactions
Loading States
Toast Notifications
Page Transitions
Note: All animations respect prefers-reduced-motion: reduce. If you have this setting enabled in your system, animations will be disabled. No animation should last longer than 600ms. All use cubic-bezier or ease for natural feeling.
Dark Mode Exploration
Optional dark mode for researchers working late nights. Design: light dark (charcoal, not pure black). Maintains full contrast and readability. Not production-ready — shown for reference only.
Dark Mode Color Palette
Background
#2a2a2a
Main canvas (dark charcoal)
Surface
#3a3a3a
Cards, containers
Text Primary
#f0f0f0
High contrast text
Text Secondary
#aaaaaa
Secondary labels
Accent (unchanged)
#FF6600
All hover, active states
Border
#555
Dividers, outlines
Component Examples in Dark Mode
Untitled Composition
1990s (est.) · Mixed Media · 48 × 36 in
Mixed assemblage of found materials including paper, fabric, and cardboard. The composition emphasizes layering and texture, with careful attention to balance and spatial relationships.
Status: Dark mode is a future enhancement. The light system is the current standard. If dark mode ships, it would: (1) apply automatically at 8 PM based on system preferences, (2) preserve all accessibility contrast ratios, (3) never dim artwork images with filters.
Design Vocabulary
Shared language for design, development, and product decisions. Using consistent terms prevents miscommunication and speeds implementation.
Saturation Overlay
The grey layer on top of artwork that fades out on hover. Uses `mix-blend-mode: saturation` to desaturate the top 40% of images. Full color revealed on interaction.
Card Frame
Orange border overlay on featured cards. A `div` with `position: absolute; inset: 0` inside the card image. Animates to orange on hover.
Stagger
Sequential entrance animation. Each item animates with a 50ms delay after the previous one. Creates wave-like effect across grids.
Focus Ring
Keyboard focus indicator. 2px solid #FF6600 outline, 2px offset. Always visible, never removed. Pulses gently on focus.
Toast
Notification message. Slides up from bottom (300ms), auto-dismisses after 3s. Types: success (green), error (red), info (blue).
Breadcrumb
URL hierarchy display. Format: "Archive › Collage › 1990s". Shows current location. Mobile truncates to last item only.
Voice & Tone: How to Write for JFSN
JFSN is a personal archive, not a marketing platform. Writing should be spare, honest, and focused on the work itself.
Core Principles
Spare
Not: "Discover the fascinating journey of artistic expression."
Do: "Collage, 1990, 36 × 48 in"
Honest
Never fabricate provenance, exhibitions, or credentials. If unknown, say so. "1970s (est.)" not "1974".
No Calls to Action
Never "Explore now" or "Sign up for updates." People are here for the archive, not to engage.
Technical
Monospace for metadata (art IDs, dates). Use exact dimensions when known. Precision over approximation.
Jeff's Voice
When using first-person, match interview recordings. Avoid over-interpretation. Let the work speak.
No Emoji
Clean, professional tone. No decorative characters. Let the typography breathe.
Writing Examples
Page Heading
The Archive
1,084 works by Jeffrey F. S. Neumann, spanning 1974 to the present. Collage, sculpture, photography.
Work Description (Meta)
ART1234 · 1990S (EST.) · COLLAGE · 36 × 48 IN
Body Paragraph (Essay/Bio)
"Something that still had a life left in it."
Jeff, on the materials he chose to work with. From the oral history archive.
Major Page Sections
Large-scale patterns that define homepage and archive page layouts.
Chromatic River (Color Timeline)
Canvas-based visualization of all 1,084 works by dominant color in chronological order (1974–present).
- Canvas element (HiDPI aware)
- Hover shows cursor line (1px white, 50% opacity)
- Tooltip on hover: preview image (72px), work title, year
- Click opens work detail page
- Mobile: shorter height, full width
- Desktop: full height, 1200px max
- Data source: chromatic.json (color + year per work)
The Wall (Miniature Grid)
Dense grid of all 1,084 tiny tiles. Shows complete archive at a glance.
- Grid: 12 columns on desktop, 6 on tablet, 4 on mobile
- Tile: aspect-ratio 1:1, gap: 2px
- Image: full-color AVIF, cover fit
- Hover: outline color #FF6600, z-index lifts above neighbors
- Click: opens work detail
- No sibling dim (all images stay full color)
Featured Grid (Bento/Editorial Layout)
Editorial grid featuring 3 curated works: 1 large hero (7 cols × 6 rows) + 2 medium (5 cols × 3 rows each).
- Desktop: 12-column grid, 80px rows, 32px gaps
- Image lazy-load: `loading="lazy"` + fade-in on `.is-loaded`
- Hover: shadow lifts, title turns #FF6600
- Card Frame: orange border overlay on hover
- Tablet/Mobile: stacks to single column
Lost Works Banner
The Void in the Record
An estimated 500–1,000 works lost to water damage.
A significant part of Jeff's early work was lost. What survived is here in full; what's gone is remembered on the Lost Works page.
Surviving fragment image (shown faded)
Stats Display (2×2 Grid)
Interactive UI Patterns
Complex interactions and stateful UI patterns used across the site.
Search / Command Palette (⌘K)
Backdrop blur modal
- Trigger: ⌘K (Mac) or Ctrl+K (Windows) or click search icon
- Modal: Fixed position, backdrop blur (#fcf9f3 @ 80% opacity)
- Input: 16px, placeholder text, auto-focus
- Results: Dropdown below, 1084px max height, scroll
- Result item: 40px height, hover bg #ebe8e2, click opens work
- Close: ESC key or click backdrop
- Animation: Fade-in (200ms ease)
Mobile Folio (Snap-Scroll Carousel)
Vertical snap-scroll carousel on mobile (320–767px). Shows featured works one at a time.
- Sections: 1. Hero · 2. art0380 · 3. art0002 · 4. art0026 (4 total)
- Container: `scroll-snap-type: y mandatory`, height: calc(100dvh - 4rem)
- Section: `scroll-snap-align: start`, 100% viewport height
- Folio Rail: Vertical dot indicators on right edge (44×44px buttons)
- Dot: 5px filled circle, 1.5px border
- Active dot: #FF6600, highlight when section in view
- Animation: Smooth scroll behavior, dots update on scroll via IntersectionObserver
- Desktop: Hidden (layout switches to grid)
View Transition (Cross-Page Image Morph)
CSS View Transition API: Artwork thumbnail morphs into detail page image.
- Browser support: Chrome 111+, Edge 111+ (graceful fallback: standard navigation)
- Rule: `@view-transition { navigation: auto; }` in CSS
- Named element: Click handler sets `img.style.viewTransitionName = 'artwork-hero'`
- Animation: Browser morphs thumbnail position/size to detail page position
- Duration: ~300–400ms (automatic, browser-optimized)
- Respects: `prefers-reduced-motion: reduce` (skips transition)
Component Reference & Details
Smaller interactive components and UI elements with detailed specs.
Icon System (Feather Icons)
Home
Start Here
About
Search
- Source: Feather Icons (feathericons.com)
- Size: 18px × 18px (base), 20px × 20px (buttons)
- Stroke width: 1.8px
- Color: Inherit from parent (current text color)
- Hover: Color transitions to #FF6600 with 200ms ease
- Used in: Mobile drawer (8 icons), buttons, headers
- Format: Inline SVG (no external files)
Tooltips
- JFSN wordmark hover: "Jeffrey Francis Stanley Neumann" appears below
- Chromatic River hover: Preview image (72×72px) + title + year
- Position: Below trigger, centered, 10px offset
- Background: #0B0B0B (deep-ink)
- Text: 10px, white (#F3F0EA), no-wrap
- Animation: Fade-in (200ms ease) on hover, fade-out on mouse-leave
- z-index: Above all content
Audio Player
- Element: HTML5 `<audio controls>`
- Styling: Uses browser defaults (no custom CSS currently)
- Width: 100% (responsive)
- Height: 32px
- Preload: `preload="none"` (lazy load)
- Format: MP3 (supported across all browsers)
- Used in: "In His Own Words" quote card on about.html
Ghost Tiles
- Size: 20×20px squares
- Border: 1px solid #c4c7c7
- Background: Transparent
- Hover: Border color changes to #FF6600 (200ms ease)
- Used in: Lost Works banner section
- Purpose: Represents lost/missing works (empty frames)
Counter Animation
- Attribute: `data-counter="1084"`
- Animation: Counts from 0 → 1,084 on page load
- Duration: ~1.5 seconds
- Timing: JavaScript counts up with easing
- Used in: Stats display (Mobile "About This Archive" section)
- Triggers: When stats section becomes visible (IntersectionObserver)
Filter Chips (All States)
- Default: background #ebe8e2, border #8e7164, text #0B0B0B
- Hover: border + text color → #FF6600 (200ms ease)
- Focus: 2px #FF6600 outline, offset 1px
- Removing: opacity 0.5, border fade to #c4c7c7
- Remove animation: Slide-out (slide-left animation) + fade
- Used in: Archive page filter UI
- Haptic: Vibration feedback on remove (10ms tap)
Advanced Patterns & Technical Details
Implementation details, data attributes, CSS custom properties, and mobile transitions.
Data Attributes Reference
| Attribute | Value(s) | Used For |
|---|---|---|
data-counter |
1084 (number) | Count-up animation on stats |
data-filter-type |
"medium", "decade", "series" | Filter chip categorization (archive) |
data-filter-val |
Filter value (e.g., "collage", "1970s") | Filter data binding |
data-page-label |
"1970s", "1980s", etc. | Vertical "you are here" label on decade pages |
data-kb="reveal" |
"reveal" (animation type) | Hero slide reveal animation type |
CSS Custom Properties (Variables)
| Property | Example Value | Used For |
|---|---|---|
--delay |
0ms, 50ms, 100ms, 150ms | Stagger animation delays (grid, related works) |
--reveal-delay |
0ms, 100ms, 200ms | Scroll-reveal entrance delays |
--mat |
#ebe8e2 (dominant color) | Featured card background (average work color) |
--mat-hover |
#d0c9c0 (darker variant) | Featured card hover background |
Mobile Layout Transitions
| Component | Mobile (<768px) | Desktop (≥768px) |
|---|---|---|
| Featured Grid | Single col, snap-scroll folio | 12-col bento layout |
| Navigation | Hamburger menu, drawer | Top horizontal nav bar |
| Archive Grid | 1 column | 3–4 columns |
| Stats Display | 2×2 grid (compact) | 2×2 grid (wider) |
| Chromatic River | Height: 56px | Height: 120px |
Error & Loading States
Loading State
Filter loading: 3 animated dots pulsing (600ms stagger)
Image loading: placeholder bg #f0f0f0, fade-in on .is-loaded
Error State
Network error: red toast notification "Something went wrong."
Empty State
No results: "Try adjusting your filters" (center-aligned, 14px body text)
Link Style Variants
Used in body copy, essays, prose
Lighter styling for secondary links
CTA style, uppercase, prominent
Button Variants (Extended)
Future Enhancements
The design system is now museum-grade and production-ready. Below are truly optional enhancements for future iterations—not blocking any current work.
Optional Enhancements (Low Priority)
Dark Mode
Light dark mode palette documented. Would auto-apply 8 PM–8 AM. ~200 CSS variables needed. Preserve all contrast & never dim artwork.
Haptic Patterns Library
Extend beyond swipe (10-5-10ms). Add click (quick tap), hold (long duration), error (rapid bursts) patterns for richer feedback.
Advanced Gestures
Pinch-to-zoom on images, long-press for context menus, double-tap for fullscreen. Research user demand first.
Audio Cues
Optional subtle sounds for keyboard users: focus chime, notification ping, error buzz. Must respect preferences.
Print Optimization
Enhanced print styles for artwork pages. Show full metadata, hide navigation, optimize for A4/Letter paper.
Search Analytics
Track what users search for to improve discoverability. Privacy-first approach (no tracking IDs).
What's Complete
✅ Tier 1 Complete: Design Principles · Component States Gallery · Typography Specimens · Animation Showcase Looping
✅ Tier 2 Complete: Spacing & Grid System · Real-World Patterns · Color Contrast Data · Responsive Breakpoints
✅ Tier 3 Complete: Dark Mode Exploration · Design Vocabulary · Voice & Tone Guide
✅ Session 57 Complete: 30 UX/UI improvements shipped, style guide applied to all 40 pages
JFSN Archive Design System · Last updated 2026-06-17 (Session 57 complete)
Full Documentation