286 lines
5.6 KiB
CSS
286 lines
5.6 KiB
CSS
@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-blue-600 hover:text-blue-800 transition-colors;
|
|
}
|
|
|
|
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 #3b82f6;
|
|
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-2xl 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-blue-400 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-blue-600 hover:bg-blue-700 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: 2px;
|
|
background: #3b82f6;
|
|
transform-origin: left;
|
|
transform: scaleX(0);
|
|
z-index: 50;
|
|
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;
|
|
}
|
|
}
|
|
} |