@tailwind base; @tailwind components; @tailwind utilities; :root { --motion-duration-short: 180ms; --motion-duration-medium: 260ms; --motion-ease-snappy: cubic-bezier(0.32, 0.72, 0, 1); --card-translate-y: -6px; --line-height-body: clamp(1.5, 0.15vw + 1.45, 1.65); font-size: clamp(15px, 0.65vw + 11px, 19px); } @media (min-width: 2560px) { :root { font-size: 20px; } } body { @apply bg-white text-gray-900 transition-colors duration-200 ease-snappy dark:bg-gray-950 dark:text-gray-100; font-size: 1rem; line-height: var(--line-height-body); font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang TC', 'Noto Sans TC', 'Microsoft JhengHei', 'Noto Sans', sans-serif; } .toc-target-highlight { @apply bg-yellow-50/60 dark:bg-yellow-900/40 transition-colors duration-500; } /* Subtle hover for article elements */ .prose blockquote { @apply transition-transform transition-shadow duration-180 ease-snappy; } .prose blockquote:hover { @apply -translate-y-0.5 shadow-sm; } .prose pre { @apply transition-transform transition-shadow duration-180 ease-snappy; } .prose pre:hover { @apply -translate-y-0.5 shadow-md; } .prose { font-size: clamp(1rem, 0.2vw + 0.9rem, 1.2rem); line-height: var(--line-height-body); } .prose h1 { font-size: clamp(2.2rem, 1.4rem + 2.2vw, 3.4rem); line-height: 1.25; } .prose h2 { font-size: clamp(1.8rem, 1.1rem + 1.6vw, 2.8rem); line-height: 1.3; } .prose h3 { font-size: clamp(1.4rem, 0.9rem + 1vw, 2rem); line-height: 1.35; } .prose p, .prose li { font-size: clamp(1rem, 0.2vw + 0.9rem, 1.15rem); line-height: var(--line-height-body); } .prose small, .prose figcaption { font-size: clamp(0.85rem, 0.2vw + 0.8rem, 0.95rem); } .prose h1 > a, .prose h2 > a, .prose h3 > a, .prose h4 > a, .prose h5 > a, .prose h6 > a { text-decoration: none !important; color: inherit !important; } .hero-title { position: relative; display: inline-flex; overflow: hidden; } .hero-title__sweep { position: absolute; inset: 0; background: linear-gradient(120deg, transparent 10%, rgba(59, 130, 246, 0.35) 45%, transparent 90%); transform: translateX(-120%); animation: hero-sweep 4s var(--motion-ease-snappy) infinite; pointer-events: none; } @keyframes hero-sweep { 0% { transform: translateX(-120%); opacity: 0; } 30% { opacity: 0.4; } 60% { transform: translateX(120%); opacity: 0; } 100% { transform: translateX(120%); opacity: 0; } } .tag-chip { position: relative; overflow: hidden; transition: color var(--motion-duration-short) var(--motion-ease-snappy), background-color var(--motion-duration-short) var(--motion-ease-snappy); } .tag-chip::after { content: ''; position: absolute; left: 50%; bottom: 4px; width: 0; height: 2px; background: currentColor; opacity: 0.5; transition: width var(--motion-duration-short) var(--motion-ease-snappy), left var(--motion-duration-short) var(--motion-ease-snappy); } .tag-chip:hover::after, .tag-chip:focus-visible::after { width: 100%; left: 0; } @layer components { .type-display { font-size: clamp(2.2rem, 1.6rem + 2.4vw, 3.5rem); line-height: 1.2; } .type-title { font-size: clamp(1.6rem, 1.1rem + 1.4vw, 2.6rem); line-height: 1.3; } .type-subtitle { font-size: clamp(1.25rem, 0.9rem + 1vw, 1.9rem); line-height: 1.35; } .type-body { font-size: clamp(1rem, 0.2vw + 0.9rem, 1.15rem); line-height: var(--line-height-body); } .type-small { font-size: clamp(0.85rem, 0.2vw + 0.8rem, 0.95rem); line-height: 1.4; } .motion-card { transition: transform var(--motion-duration-medium) var(--motion-ease-snappy), box-shadow var(--motion-duration-medium) var(--motion-ease-snappy), background-color var(--motion-duration-medium) var(--motion-ease-snappy), border-color var(--motion-duration-medium) var(--motion-ease-snappy); } .motion-card:hover { transform: translateY(var(--card-translate-y)); } .motion-link { transition: color var(--motion-duration-short) var(--motion-ease-snappy), transform var(--motion-duration-short) var(--motion-ease-snappy); } }