11<script setup lang="ts">
22import { Motion } from ' motion-v'
33
4+ const prefersReducedMotion = ref (false )
5+
6+ onMounted (() => {
7+ prefersReducedMotion .value = window .matchMedia (' (prefers-reduced-motion: reduce)' ).matches
8+ })
9+
410const features = [
511 {
612 icon: ' i-lucide-layers' ,
@@ -13,24 +19,24 @@ const features = [
1319 description: ' Errors with why, fix, and link fields. Actionable context for debugging and resolution.' ,
1420 },
1521 {
16- icon: ' i-lucide-git-branch' ,
17- title: ' Request Scoping' ,
18- description: ' Accumulate context throughout the request lifecycle. Emit once at the end with complete data.' ,
19- },
20- {
21- icon: ' i-lucide-palette' ,
22- title: ' Pretty for Dev, JSON for Prod' ,
23- description: ' Human-readable logs in development, machine-parseable JSON in production.' ,
22+ icon: ' i-lucide-bot' ,
23+ title: ' Agent-Ready Logs' ,
24+ description: ' Structured output that AI agents can parse and understand. Perfect for agentic debugging and automated issue resolution.' ,
2425 },
2526 {
2627 icon: ' i-lucide-zap' ,
2728 title: ' Nuxt & Nitro Ready' ,
2829 description: ' First-class integration with Nuxt and Nitro. Auto-create loggers, auto-emit at request end.' ,
2930 },
3031 {
31- icon: ' i-lucide-bot' ,
32- title: ' Agent-Ready' ,
33- description: ' Structured output that AI agents can parse. Perfect for automated debugging in the agentic era.' ,
32+ icon: ' i-lucide-filter' ,
33+ title: ' Smart Sampling' ,
34+ description: ' Head and tail sampling strategies. Keep errors, slow requests, and critical paths while reducing volume.' ,
35+ },
36+ {
37+ icon: ' i-lucide-palette' ,
38+ title: ' Pretty for Dev, JSON for Prod' ,
39+ description: ' Human-readable logs in development, machine-parseable JSON in production.' ,
3440 },
3541]
3642 </script >
@@ -41,16 +47,16 @@ const features = [
4147
4248 <div class =" mx-auto max-w-5xl px-6" >
4349 <Motion
44- :initial =" { opacity: 0, y: 20 }"
50+ :initial =" prefersReducedMotion ? { opacity: 1, y: 0 } : { opacity: 0, y: 20 }"
4551 :in-view =" { opacity: 1, y: 0 }"
46- :transition =" { duration: 0.5 }"
52+ :transition =" { duration: prefersReducedMotion ? 0 : 0.5 }"
4753 :in-view-options =" { once: true }"
4854 class =" mb-20 text-center"
4955 >
50- <h2 class =" editorial-title mb-6 text-4xl font-bold text-highlighted md:text-5xl" >
56+ <h2 class =" editorial-title mb-6 text-4xl font-bold text-highlighted md:text-5xl text-balance " >
5157 Why evlog<span class =" evlog-dot" >.</span >
5258 </h2 >
53- <p class =" mx-auto max-w-xl text-lg text-muted" >
59+ <p class =" mx-auto max-w-xl text-lg text-muted text-pretty " >
5460 Traditional logging is broken. Your logs are scattered, each request generates 10+ log lines,
5561 and when something goes wrong, you're grep-ing through noise hoping to find signal.
5662 </p >
@@ -60,9 +66,9 @@ const features = [
6066 <Motion
6167 v-for =" (feature, index) in features"
6268 :key =" feature.title"
63- :initial =" { opacity: 0, y: 16 }"
69+ :initial =" prefersReducedMotion ? { opacity: 1, y: 0 } : { opacity: 0, y: 16 }"
6470 :in-view =" { opacity: 1, y: 0 }"
65- :transition =" { duration: 0 .4, delay: index * 0.08 }"
71+ :transition =" { duration: prefersReducedMotion ? 0 : 0 .4, delay: prefersReducedMotion ? 0 : index * 0.08 }"
6672 :in-view-options =" { once: true }"
6773 class =" group"
6874 >
0 commit comments