@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; font-family: 'Georgia', 'Times New Roman', serif; line-height: 1.75; } /* Typography */ h1, h2, h3, h4, h5, h6 { @apply font-sans font-bold text-slate-900; } h1 { @apply text-3xl md:text-4xl leading-tight mb-6; font-family: 'Inter', sans-serif; letter-spacing: -0.025em; } h2 { @apply text-2xl md:text-3xl leading-tight mb-4 mt-8; font-family: 'Inter', sans-serif; letter-spacing: -0.025em; } h3 { @apply text-xl md:text-2xl leading-tight mb-3 mt-6; font-family: 'Inter', sans-serif; letter-spacing: -0.025em; } h4 { @apply text-lg md:text-xl leading-tight mb-2 mt-4; font-family: 'Inter', sans-serif; letter-spacing: -0.025em; } p { @apply mb-4 text-base leading-relaxed text-slate-700; } .lead { @apply text-xl 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-100 px-1 py-0.5 rounded font-mono text-sm text-slate-700; } blockquote { @apply border-l-2 border-slate-300 pl-4 italic text-slate-600 my-4; } /* Focus states */ a:focus, button:focus, input:focus { outline: 2px solid #0f172a; outline-offset: 2px; } } /* Components - Tailwind utility classes */ @layer components { /* Legacy hooks required by tests */ .file-example { @apply w-full; } .container { @apply max-w-4xl mx-auto px-6 py-10; } .wide-container { @apply max-w-5xl mx-auto px-6 py-12; } .narrow-container { @apply max-w-3xl mx-auto px-6 py-8; } .highlighter-tag { @apply inline-block text-xs font-bold px-2 py-0.5 rounded cursor-pointer transition-all duration-200; position: relative; transform: rotate(-1deg); box-shadow: 2px 2px 0 rgba(0,0,0,0.1); } .search-box { @apply w-full px-4 py-3 border-2 border-slate-200 rounded-lg focus:outline-none focus:border-slate-900 transition-colors; 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-8; } .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 text-lg leading-relaxed; } .article-content p { @apply mb-5; } .article-content h2 { @apply text-2xl font-bold mt-8 mb-3; } .article-content h3 { @apply text-xl font-bold mt-6 mb-2; } .article-content ul, .article-content ol { @apply ml-6 mb-5; } .article-content li { @apply mb-1; } .article-content blockquote { @apply border-l-2 border-slate-400 pl-4 italic text-slate-600 my-5 text-lg; } /* Buttons */ .btn { @apply inline-block px-4 py-2 bg-slate-900 text-white font-sans font-medium hover:bg-slate-700 transition-colors rounded; } .btn-primary { @apply bg-slate-900 hover:bg-slate-800 text-white px-3 py-1.5 rounded transition-colors; } .btn-secondary { @apply bg-white text-slate-700 hover:bg-slate-100 border border-slate-300 px-3 py-1.5 rounded transition-colors; } /* Hide scrollbars */ .hide-scrollbar::-webkit-scrollbar { display: none; } .hide-scrollbar { -ms-overflow-style: none; scrollbar-width: none; } /* 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: 1.5rem; right: 1.5rem; width: 2.5rem; height: 2.5rem; background: white; border: 1px solid #e2e8f0; border-radius: 0.375rem; 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.15s ease; opacity: 0; transform: translateY(8px); } .floating-back-to-top.visible { opacity: 1; transform: translateY(0); } .floating-back-to-top:hover { background: #f8fafc; color: #1e293b; transform: translateY(-1px); box-shadow: 0 4px 6px rgba(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 { transform: rotate(-1deg) translateY(0); box-shadow: 2px 2px 0 rgba(0, 0, 0, 0.1); animation: tagPopIn 0.3s ease-out both; animation-delay: calc(var(--tag-index, 0) * 0.05s); } .highlighter-tag:hover { transform: rotate(-2deg) translateY(-2px) scale(1.05); box-shadow: 3px 3px 0 rgba(0, 0, 0, 0.15); } @keyframes tagPopIn { from { opacity: 0; transform: rotate(-1deg) scale(0.8) translateY(5px); } to { opacity: 1; transform: rotate(-1deg) 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 { outline: 2px solid #0f172a; outline-offset: 2px; transform: rotate(-1deg) translateY(-2px) scale(1.05); box-shadow: 0 0 0 4px rgba(15, 23, 42, 0.1), 3px 3px 0 rgba(0, 0, 0, 0.15); } /* 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.70) 20%, rgba(253, 230, 138, 0.70) 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.00) 0%, rgba(253, 230, 138, 0.60) 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: 8px; --bg-color: #ffffff; --border-color: #e2e8f0; --shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); 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.10); 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; }