@tailwind base; @tailwind components; @tailwind utilities; /* Base styles - Tailwind only */ @layer base { html { scroll-behavior: smooth; } body { @apply bg-white text-slate-800 font-serif antialiased selection:bg-slate-900 selection:text-white; line-height: 1.6; } /* Typography */ h1, h2, h3, h4, h5, h6 { @apply font-sans font-bold text-slate-900 tracking-tighter; } h1 { @apply text-4xl md:text-8xl leading-[1.1] md:leading-[0.95] mb-6 md:mb-12; } h2 { @apply text-2xl md:text-6xl leading-tight mb-4 md:mb-8 mt-12 md:mt-16; } h3 { @apply text-xl md:text-5xl leading-tight mb-3 md:mb-6 mt-8 md:mt-12; } h4 { @apply text-lg md:text-3xl leading-tight mb-3 md:mb-4 mt-6 md:mt-8; } p { @apply mb-6 text-base leading-relaxed text-slate-700; } .lead { @apply text-base md:text-2xl text-slate-600 mb-6 leading-relaxed; font-weight: 400; } a { @apply text-slate-900 hover:text-slate-700 transition-colors no-underline; } ul, ol { @apply ml-5 mb-4; } li { @apply mb-1; } code:not([class*="language-"]) { @apply bg-slate-50 px-1.5 py-0.5 rounded-md font-mono text-[0.9em] text-slate-800 border border-slate-100; } blockquote { @apply border-l-4 border-slate-900 pl-6 italic text-slate-700 my-8 text-lg md:text-2xl font-serif; } /* Focus states */ a:focus, button:focus, input:focus, textarea:focus { outline: none !important; box-shadow: none !important; } /* Remove default tap highlight on mobile */ * { -webkit-tap-highlight-color: transparent !important; } } /* Components - Tailwind utility classes */ @layer components { /* Legacy hooks required by tests */ .file-example { @apply w-full; } .container { @apply max-w-6xl mx-auto px-5 md:px-6 py-8 md:py-12; } .wide-container { @apply max-w-7xl mx-auto px-5 md:px-6 py-10 md:py-16; } .narrow-container { @apply max-w-4xl mx-auto px-5 md:px-6 py-6 md:py-10; } .highlighter-tag { @apply inline-block text-[10px] uppercase tracking-wider font-bold px-3 py-1 rounded-full cursor-pointer transition-all duration-300; position: relative; } .search-box { @apply w-full px-6 py-4 border border-slate-200 rounded-2xl focus:outline-none focus:border-slate-400 transition-all duration-300; background: rgba(255, 255, 255, 0.9); backdrop-filter: blur(10px); } .search-box::placeholder { @apply text-slate-400; } /* Blog post card */ .post-card { @apply mb-8 last:mb-0; } .post-meta { @apply text-xs text-slate-500 font-sans mb-2; } .post-excerpt { @apply text-slate-700 mb-2 leading-relaxed; } .post-tags { @apply flex flex-wrap gap-1; } /* Article page */ .article-header { @apply mb-12; } .article-title { @apply text-4xl md:text-5xl font-bold mb-3; } .article-meta { @apply text-sm text-slate-500 font-sans mb-5; } .article-content { @apply font-serif antialiased text-slate-700; } .article-content p { @apply text-lg md:text-xl leading-relaxed mb-6; } .article-content h1 { @apply text-3xl md:text-5xl font-bold text-slate-900 mb-8 mt-12 tracking-tight leading-[1.1] font-sans; } .article-content h2 { @apply text-2xl md:text-4xl font-bold text-slate-900 mb-6 mt-10 tracking-tight leading-tight font-sans; } .article-content h3 { @apply text-xl md:text-2xl font-bold text-slate-900 mb-4 mt-8 tracking-tight leading-snug font-sans; } .article-content ul, .article-content ol { @apply ml-6 mb-6 text-lg md:text-xl; } .article-content li { @apply mb-2; } .article-content blockquote { @apply border-l-4 border-slate-900 pl-6 italic text-slate-700 my-10 text-xl md:text-2xl; } /* Buttons */ .btn { @apply inline-flex items-center justify-center px-6 py-3 border border-slate-200 bg-white text-slate-600 font-sans font-bold text-sm uppercase tracking-widest rounded-full transition-all duration-500 hover:border-slate-400 hover:text-slate-900 hover:bg-slate-50 hover:-translate-y-0.5 hover:shadow-xl hover:shadow-slate-100 active:translate-y-0 active:shadow-sm; transition-timing-function: cubic-bezier(0.23, 1, 0.32, 1); } .btn-primary { @apply border-slate-900 text-slate-900 hover:bg-slate-900 hover:text-white; } .btn-secondary { @apply border-slate-200 text-slate-500 hover:border-slate-400 hover:text-slate-900; } /* Hide scrollbars but keep functionality */ .no-scrollbar::-webkit-scrollbar { display: none; } .no-scrollbar { -ms-overflow-style: none; /* IE and Edge */ scrollbar-width: none; /* Firefox */ } /* Empty state */ .empty-state { @apply text-center py-8 text-slate-500; } .empty-state svg { @apply mx-auto mb-2 text-slate-300; } /* Line clamp utility */ .line-clamp-3 { display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; } /* Reading progress indicator */ .reading-progress-bar { position: fixed; top: 0; left: 0; width: 100%; height: 1px; background: #0f172a; transform-origin: left; transform: scaleX(0); z-index: 100; transition: transform 0.1s ease-out; } /* Floating back to top button */ .floating-back-to-top { position: fixed; bottom: 2rem; right: 2rem; width: 3rem; height: 3rem; background: white; border: 1px solid #e2e8f0; border-radius: 9999px; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); cursor: pointer; display: flex; align-items: center; justify-content: center; color: #64748b; transition: all 0.5s cubic-bezier(0.23, 1, 0.32, 1); opacity: 0; transform: translateY(8px); z-index: 50; } .floating-back-to-top.visible { opacity: 1; transform: translateY(0); } .floating-back-to-top:hover { background: #f8fafc; color: #1e293b; border-color: #cbd5e1; transform: translateY(-4px); box-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1); } /* Reduced motion support */ @media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } * { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; } } /* Print styles */ @media print { .floating-back-to-top, .reading-progress-bar { display: none !important; } } } /* Additional global styles from BaseLayout */ /* Custom scrollbar */ ::-webkit-scrollbar { width: 8px; height: 8px; } ::-webkit-scrollbar-track { background: #f1f5f9; } ::-webkit-scrollbar-thumb { background: #cbd5e1; border-radius: 4px; transition: background 0.2s ease; } ::-webkit-scrollbar-thumb:hover { background: #94a3b8; } /* Selection color */ ::selection { background: #0f172a; color: #ffffff; } /* Tag Styles */ .highlighter-tag { animation: tagPopIn 0.3s cubic-bezier(0.34, 1.56, 0.64, 1) both; animation-delay: calc(var(--tag-index, 0) * 0.05s); } .highlighter-tag:hover { @apply -translate-y-0.5 scale-105 shadow-lg shadow-slate-200; } @keyframes tagPopIn { from { opacity: 0; transform: scale(0.8) translateY(10px); } to { opacity: 1; transform: scale(1) translateY(0); } } .highlighter-yellow { background: linear-gradient(135deg, rgba(255, 235, 59, 0.95) 0%, rgba(255, 213, 79, 0.95) 100%); color: #3f2f00; } .highlighter-pink { background: linear-gradient(135deg, rgba(255, 167, 209, 0.95) 0%, rgba(255, 122, 175, 0.95) 100%); color: #3f0018; } .highlighter-green { background: linear-gradient(135deg, rgba(129, 199, 132, 0.95) 0%, rgba(102, 187, 106, 0.95) 100%); color: #002f0a; } .highlighter-blue { background: linear-gradient(135deg, rgba(226, 232, 240, 0.95) 0%, rgba(203, 213, 225, 0.95) 100%); color: #0f172a; } .highlighter-tag:hover::before { content: ""; position: absolute; inset: -2px; background: inherit; filter: blur(8px); opacity: 0.4; z-index: -1; border-radius: inherit; } .highlighter-tag:active { transform: rotate(-1deg) translateY(0) scale(0.98); transition: transform 0.1s ease; } .highlighter-tag:focus { @apply -translate-y-0.5 scale-105; outline: none !important; } /* Marker Title Styles */ .marker-title::before { content: ""; position: absolute; left: -0.15em; right: -0.15em; bottom: 0.05em; height: 0.62em; border-radius: 0.18em; z-index: -1; background: linear-gradient(180deg, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0) 20%, rgba(253, 230, 138, 0.7) 20%, rgba(253, 230, 138, 0.7) 100%); transform-origin: left center; transform: rotate(calc((var(--marker-seed, 0) - 3) * 0.45deg)) skewX(calc((var(--marker-seed, 0) - 3) * -0.25deg)); filter: saturate(1.05); } .marker-title::after { content: ""; position: absolute; left: -0.18em; right: -0.05em; bottom: 0.05em; height: 0.62em; border-radius: 0.18em; z-index: -1; background: linear-gradient(90deg, rgba(253, 230, 138, 0) 0%, rgba(253, 230, 138, 0.6) 8%, rgba(253, 230, 138, 0.55) 60%, rgba(253, 230, 138, 0.35) 100%); opacity: 0.75; mix-blend-mode: multiply; transform: rotate(calc((var(--marker-seed, 0) - 3) * 0.45deg)) translateY(0.02em); mask-image: linear-gradient(180deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 1) 20%, rgba(0, 0, 0, 1) 100%); } @media (prefers-reduced-motion: no-preference) { .post-link:hover .marker-title::before, .post-link:hover .marker-title::after { filter: saturate(1.08) contrast(1.02); } } /* Mermaid Styles */ .mermaid-container svg { width: 100% !important; max-width: 100%; height: auto; display: block; background-color: transparent !important; } .mermaid-container rect, .mermaid-container circle, .mermaid-container ellipse, .mermaid-container polygon, .mermaid-container path, .mermaid-container .actor, .mermaid-container .node { fill: white !important; stroke: #cbd5e1 !important; stroke-width: 1.5px !important; } .mermaid-container .edgePath .path, .mermaid-container .messageLine0, .mermaid-container .messageLine1, .mermaid-container .flowchart-link { stroke: #cbd5e1 !important; stroke-width: 1.5px !important; } .mermaid-container text, .mermaid-container .label, .mermaid-container .labelText, .mermaid-container .edgeLabel, .mermaid-container .node text, .mermaid-container tspan { font-family: "Inter", sans-serif !important; fill: #334155 !important; color: #334155 !important; stroke: none !important; font-size: 16px !important; } .mermaid-container .marker, .mermaid-container marker path { fill: #cbd5e1 !important; stroke: #cbd5e1 !important; } /* Generic Embed Styles */ .generic-embed { --max-width: 100%; --border-radius: 24px; --bg-color: #ffffff; --border-color: #e2e8f0; --shadow: none; margin: 1.5rem 0; width: 100%; max-width: var(--max-width); } .embed-wrapper { border-radius: var(--border-radius); border: 1px solid var(--border-color); background: var(--bg-color); box-shadow: var(--shadow); overflow: hidden; transition: all 0.2s ease; position: relative; } .generic-embed[data-type="video"] .embed-wrapper { aspect-ratio: 16/9; height: 0; padding-bottom: 56.25%; /* 16:9 */ } .generic-embed[data-type="video"] .embed-wrapper iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .embed-wrapper:hover { box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); border-color: #cbd5e1; } .generic-embed[data-provider="youtube.com"] { --bg-color: #000000; } .generic-embed[data-provider="vimeo.com"] { --bg-color: #1a1a1a; } .generic-embed[data-provider="codepen.io"] { --bg-color: #1e1e1e; --border-color: #333; } .embed-fallback { padding: 1.5rem; background: #f8fafc; border: 1px dashed #cbd5e1; border-radius: var(--border-radius); text-align: center; } .fallback-content { display: flex; flex-direction: column; align-items: center; gap: 0.5rem; color: #64748b; font-size: 0.875rem; } .fallback-link { @apply text-slate-900 underline underline-offset-4; text-decoration: none; font-weight: 500; margin-top: 0.25rem; word-break: break-all; } .fallback-link:hover { text-decoration: underline; } @media (max-width: 768px) { .generic-embed { margin: 1rem 0; } .embed-fallback { padding: 1rem; } .embed-wrapper:hover { box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); } } /* File Example Styles */ [data-file-example] { box-shadow: 0 1px 0 rgba(15, 23, 42, 0.04); } .copy-btn, .download-btn { color: #475569; } .copy-btn[data-copied="true"] { color: #065f46; background: rgba(16, 185, 129, 0.1); border-color: rgba(16, 185, 129, 0.35); } /* Prism.js syntax highlighting - light, low-noise */ code[class*="language-"], pre[class*="language-"], pre:has(code[class*="language-"]) { color: #0f172a; background: transparent; text-shadow: none; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: 0.8125rem; line-height: 1.65; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; tab-size: 2; hyphens: none; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #64748b; font-style: italic; } .token.punctuation { color: #94a3b8; } .token.operator { color: #64748b; } .token.property, .token.tag, .token.constant, .token.symbol, .token.deleted { color: #c2410c; } .token.boolean, .token.number { color: #a16207; } .token.selector, .token.attr-name, .token.string, .token.char, .token.builtin, .token.inserted { color: #059669; } .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string { color: #475569; } .token.atrule, .token.attr-value, .token.keyword { color: #7c3aed; font-weight: 500; } .token.function, .token.class-name { color: #2563eb; } .token.regex, .token.important, .token.variable { color: #db2777; } /* ═══════════════════════════════════════════════ TECH AESTHETIC – Animation Keyframes ═══════════════════════════════════════════════ */ /* Gradient Mesh Blob Animations */ @keyframes gradient-blob-1 { 0%, 100% { transform: translate(0, 0) scale(1); } 25% { transform: translate(30px, -20px) scale(1.05); } 50% { transform: translate(-15px, 25px) scale(0.95); } 75% { transform: translate(20px, 15px) scale(1.02); } } @keyframes gradient-blob-2 { 0%, 100% { transform: translate(0, 0) scale(1); } 33% { transform: translate(-25px, 15px) scale(1.03); } 66% { transform: translate(20px, -20px) scale(0.97); } } @keyframes gradient-blob-3 { 0%, 100% { transform: translate(0, 0) scale(1); } 20% { transform: translate(15px, 10px) scale(1.06); } 40% { transform: translate(-10px, 20px) scale(0.98); } 60% { transform: translate(25px, -15px) scale(1.02); } 80% { transform: translate(-20px, -10px) scale(0.96); } } /* Binary Stream Scroll */ @keyframes binary-scroll { 0% { transform: translateY(-50%); } 100% { transform: translateY(0%); } } /* Circuit Pulse (used for node glow effects) */ @keyframes circuit-pulse { 0%, 100% { opacity: 0.2; box-shadow: 0 0 0 0 rgba(148, 163, 184, 0); } 50% { opacity: 0.5; box-shadow: 0 0 12px 2px rgba(148, 163, 184, 0.15); } } /* Data Packet Flow */ @keyframes data-packet-flow { 0% { transform: translateX(-100%); } 100% { transform: translateX(100vw); } } /* Tech Border Glow */ @keyframes border-trace { 0% { background-position: 0% 50%; } 100% { background-position: 200% 50%; } } /* Section Fade-In Glow */ @keyframes section-glow { 0% { opacity: 0; } 50% { opacity: 0.08; } 100% { opacity: 0; } } /* Tailwind-compatible animation classes */ .animate-gradient-blob-1 { animation: gradient-blob-1 20s ease-in-out infinite; } .animate-gradient-blob-2 { animation: gradient-blob-2 25s ease-in-out infinite; } .animate-gradient-blob-3 { animation: gradient-blob-3 30s ease-in-out infinite; } .animate-circuit-pulse { animation: circuit-pulse 3s ease-in-out infinite; } .animate-border-trace { animation: border-trace 4s linear infinite; } /* Glassmorphism Utilities */ .glass { backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); background: rgba(255, 255, 255, 0.7); border: 1px solid rgba(226, 232, 240, 0.5); } .glass-subtle { backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); background: rgba(255, 255, 255, 0.5); border: 1px solid rgba(241, 245, 249, 0.8); } .glass-dark { backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); background: rgba(15, 23, 42, 0.8); border: 1px solid rgba(255, 255, 255, 0.05); } /* Tech Border – animated gradient trace */ .tech-border { position: relative; } .tech-border::after { content: ""; position: absolute; inset: 0; border-radius: inherit; padding: 1px; background: linear-gradient(90deg, transparent 0%, rgba(148, 163, 184, 0.3) 25%, rgba(191, 206, 228, 0.2) 50%, rgba(148, 163, 184, 0.3) 75%, transparent 100%); background-size: 200% 100%; animation: border-trace 4s linear infinite; -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); -webkit-mask-composite: xor; mask-composite: exclude; pointer-events: none; } /* Noise texture overlay */ .noise-overlay::before { content: ""; position: absolute; inset: 0; opacity: 0.02; background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E"); pointer-events: none; z-index: 1; } /* ═══════════════════════════════════════════════ ABSTRACT CIRCUIT – Trace Pulse Animations ═══════════════════════════════════════════════ */ @keyframes tracePulse1 { 0% { stroke-dashoffset: 1280; } 100% { stroke-dashoffset: 0; } } @keyframes tracePulse2 { 0% { stroke-dashoffset: 650; } 100% { stroke-dashoffset: 0; } } @keyframes tracePulse3 { 0% { stroke-dashoffset: 1280; } 100% { stroke-dashoffset: 0; } } @keyframes tracePulse4 { 0% { stroke-dashoffset: 440; } 100% { stroke-dashoffset: 0; } } @keyframes junctionGlow { 0%, 100% { opacity: 0.1; } 50% { opacity: 0.4; } }