StealThis .dev
Patterns Medium

Page Routing Transitions

SPA-style page routing with directional slide transitions using the View Transitions API.

Open in Lab
view-transitions-apispa-routing
Targets: JS HTML

Code

*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }

:root { --bg: #070a12; --text: #f0f4fb; --muted: #8a95a8; --accent: #86e8ff; --border: #263249; --neon-purple: #ae52ff; }

body { background: var(--bg); color: var(--text); font-family: 'Inter', 'SF Pro Display', system-ui, sans-serif; min-height: 100vh; overflow-x: hidden; }

/* Nav */
.nav {
  position: fixed; top: 0; left: 0; right: 0; z-index: 50;
  display: flex; justify-content: center; gap: 0.25rem;
  padding: 1rem 2rem;
  background: rgba(7,10,18,0.85); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);
  border-bottom: 1px solid rgba(134,232,255,0.08);
}

.nav-link {
  padding: 0.5rem 1.2rem; border-radius: 8px;
  color: var(--muted); text-decoration: none;
  font: 600 0.82rem/1 'Inter', system-ui, sans-serif;
  transition: color 0.2s, background 0.2s;
}
.nav-link:hover { color: var(--accent); }
.nav-link.active { color: var(--accent); background: rgba(134,232,255,0.1); }

/* Pages */
.page { display: none; min-height: 100vh; padding: 7rem 2rem 4rem; }
.page.active { display: flex; align-items: center; justify-content: center; }

.page-content { max-width: 640px; width: 100%; }

.eyebrow { display: inline-block; font-size: 0.7rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.18em; color: var(--accent); margin-bottom: 1rem; }

h1 { font-size: clamp(2.2rem, 5vw, 3.5rem); font-weight: 700; letter-spacing: -0.03em; line-height: 1.1; margin-bottom: 1.2rem; }

.page-body { font-size: 1rem; line-height: 1.7; margin-bottom: 1rem; }
.page-body.muted { color: var(--muted); }
code { background: rgba(134,232,255,0.1); color: var(--accent); padding: 0.1rem 0.4rem; border-radius: 4px; font-size: 0.85rem; }

/* Features */
.feature-list { margin-top: 1.5rem; display: flex; flex-direction: column; gap: 0.6rem; }
.feature {
  display: flex; align-items: center; gap: 1rem;
  padding: 0.8rem 1rem; border-radius: 10px;
  background: rgba(134,232,255,0.04); border: 1px solid rgba(134,232,255,0.08);
  font-size: 0.9rem;
}
.f-icon { font-size: 0.7rem; font-weight: 700; color: var(--accent); opacity: 0.5; }

/* Work grid */
.work-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; margin-top: 1.5rem; }
.work-item {
  aspect-ratio: 1.4; border-radius: 14px;
  background: linear-gradient(135deg, hsl(var(--hue,200) 40% 12%), hsl(var(--hue,200) 50% 18%));
  border: 1px solid hsl(var(--hue,200) 30% 25%);
  display: flex; align-items: center; justify-content: center;
  font: 600 0.9rem/1 'Inter', system-ui, sans-serif;
  color: hsl(var(--hue,200) 60% 75%);
}

.btn-gallery {
  display: inline-block; margin-top: 1.5rem; padding: 0.7rem 2rem; border-radius: 999px;
  border: 1px solid rgba(134,232,255,0.3); color: var(--accent); text-decoration: none;
  font: 600 0.85rem/1 'Inter', system-ui, sans-serif; transition: all 0.25s;
}
.btn-gallery:hover { background: rgba(134,232,255,0.08); border-color: var(--accent); }

/* View Transition animations */
::view-transition-old(page-title),
::view-transition-new(page-title) {
  animation-duration: 0.35s;
  animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
}

::view-transition-old(root) { animation: slide-out-left 0.3s ease-in forwards; }
::view-transition-new(root) { animation: slide-in-right 0.3s ease-out forwards; }

/* Reverse direction */
.nav-back ::view-transition-old(root) { animation-name: slide-out-right; }
.nav-back ::view-transition-new(root) { animation-name: slide-in-left; }

@keyframes slide-out-left { to { transform: translateX(-30px); opacity: 0; } }
@keyframes slide-in-right { from { transform: translateX(30px); opacity: 0; } }
@keyframes slide-out-right { to { transform: translateX(30px); opacity: 0; } }
@keyframes slide-in-left { from { transform: translateX(-30px); opacity: 0; } }

@media (max-width: 640px) {
  .nav { gap: 0; }
  .nav-link { padding: 0.5rem 0.8rem; font-size: 0.75rem; }
  .work-grid { grid-template-columns: 1fr; }
}

Page Routing Transitions

SPA-style page routing with directional slide transitions using the View Transitions API.

Source

  • Repository: libs-genclaude
  • Original demo id: 12-page-routing

Notes

SPA-style page routing with directional slide transitions using the View Transitions API.