@import "./prism.css"; /* CSS Custom Properties for design system */ :root { /* Aceternity custom properties */ --font-sans: ui-sans-serif, system-ui, sans-serif; --radius: 0.625rem; /* Primary brand colors */ --color-primary: #020022; /* Neutral colors for Aceternity components */ --color-neutral-50: rgb(250 250 250); --color-neutral-100: rgb(245 245 245); --color-neutral-200: rgb(229 229 229); --color-neutral-300: rgb(212 212 212); --color-neutral-400: rgb(163 163 163); --color-neutral-500: rgb(115 115 115); --color-neutral-600: rgb(82 82 82); --color-neutral-700: rgb(64 64 64); --color-neutral-800: rgb(38 38 38); --color-neutral-900: rgb(23 23 23); /* Muted colors using CSS variables */ --color-muted: var(--color-neutral-600); --color-muted-dark: var(--color-neutral-300); /* shadcn/ui design system colors */ --color-background: hsl(0 0% 100%); --color-foreground: hsl(240 10% 3.9%); --color-card: hsl(0 0% 100%); --color-card-foreground: hsl(240 10% 3.9%); --color-popover: hsl(0 0% 100%); --color-popover-foreground: hsl(240 10% 3.9%); --color-primary-foreground: hsl(0 0% 98%); --color-secondary: hsl(240 4.8% 95.9%); --color-secondary-foreground: hsl(240 5.9% 10%); --color-accent: hsl(240 4.8% 95.9%); --color-accent-foreground: hsl(240 5.9% 10%); --color-destructive: hsl(0 84.2% 60.2%); --color-destructive-foreground: hsl(0 0% 98%); --color-border: hsl(240 5.9% 90%); --color-input: hsl(240 5.9% 90%); --color-ring: hsl(240 5.9% 10%); /* Custom animations for Aceternity */ --animation-duration: 40s; --marquee-duration: 20s; /* Next.js gradient variables */ --foreground-rgb: 0, 0, 0; --background-start-rgb: 214, 219, 220; --background-end-rgb: 255, 255, 255; } /* Base styles for elements - Light mode by default */ * { border-color: hsl(240 5.9% 90%); } body { background-color: hsl(0 0% 100%); color: hsl(240 10% 3.9%); } .dark { /* Dark mode CSS variables */ --color-background: hsl(240 10% 3.9%); --color-foreground: hsl(0 0% 98%); --color-card: hsl(240 10% 3.9%); --color-card-foreground: hsl(0 0% 98%); --color-popover: hsl(240 10% 3.9%); --color-popover-foreground: hsl(0 0% 98%); --color-secondary: hsl(240 3.7% 15.9%); --color-secondary-foreground: hsl(0 0% 98%); --color-accent: hsl(240 3.7% 15.9%); --color-accent-foreground: hsl(0 0% 98%); --color-destructive: hsl(0 62.8% 30.6%); --color-destructive-foreground: hsl(0 0% 98%); --color-border: hsl(240 3.7% 15.9%); --color-input: hsl(240 3.7% 15.9%); --color-ring: hsl(240 4.9% 83.9%); /* Next.js gradient variables for dark mode */ --foreground-rgb: 255, 255, 255; --background-start-rgb: 0, 0, 0; --background-end-rgb: 0, 0, 0; /* NO neutral color inversion! Use dark:bg-neutral-* classes instead */ } /* Dark mode element styles - only applied when .dark class is present */ .dark * { border-color: hsl(240 3.7% 15.9%); } .dark body { background-color: hsl(240 10% 3.9%); color: hsl(0 0% 98%); } /* Custom utility classes compatible with Tailwind CDN */ .container { margin-inline: auto; padding-inline: 2rem; } .bg-gradient-radial { background-image: radial-gradient(var(--tw-gradient-stops)); } .bg-gradient-conic { background-image: conic-gradient( from 180deg at 50% 50%, var(--tw-gradient-stops) ); } .shadow-derek { box-shadow: 0px 0px 0px 1px rgb(0 0 0 / 0.06), 0px 1px 1px -0.5px rgb(0 0 0 / 0.06), 0px 3px 3px -1.5px rgb(0 0 0 / 0.06), 0px 6px 6px -3px rgb(0 0 0 / 0.06), 0px 12px 12px -6px rgb(0 0 0 / 0.06), 0px 24px 24px -12px rgb(0 0 0 / 0.06); } .shadow-aceternity { box-shadow: 0px 2px 3px -1px rgba(0, 0, 0, 0.1), 0px 1px 0px 0px rgba(25, 28, 33, 0.02), 0px 0px 0px 1px rgba(25, 28, 33, 0.08); } .animate-scroll { animation: scroll var(--animation-duration, 40s) var(--animation-direction, forwards) linear infinite; } .animate-marquee { animation: marquee var(--marquee-duration) linear infinite; } .animate-fade-in { animation: fade-in 0.5s linear forwards; } @keyframes scroll { to { transform: translate(calc(-50% - 0.5rem)); } } @keyframes marquee { 100% { transform: translateY(-50%); } } @keyframes fade-in { from { opacity: 0; } to { opacity: 1; } } html { scroll-padding-top: 80px; scroll-behavior: smooth; } .text-balance { text-wrap: balance; } /* Prose styles for blog content (replaces @tailwindcss/typography) */ .prose { color: hsl(240 10% 3.9%); max-width: 65ch; font-size: 1.125rem; line-height: 1.75; } .prose :where(p):not(:where([class~="not-prose"] *)) { margin-top: 1.25em; margin-bottom: 1.25em; } .prose :where(h1):not(:where([class~="not-prose"] *)) { color: hsl(240 10% 3.9%); font-weight: 800; font-size: 2.25em; margin-top: 0; margin-bottom: 0.8888889em; line-height: 1.1111111; } .prose :where(h2):not(:where([class~="not-prose"] *)) { color: hsl(240 10% 3.9%); font-weight: 700; font-size: 1.5em; margin-top: 2em; margin-bottom: 1em; line-height: 1.3333333; } .prose :where(h3):not(:where([class~="not-prose"] *)) { color: hsl(240 10% 3.9%); font-weight: 600; font-size: 1.25em; margin-top: 1.6em; margin-bottom: 0.6em; line-height: 1.6; } .prose :where(h4):not(:where([class~="not-prose"] *)) { color: hsl(240 10% 3.9%); font-weight: 600; margin-top: 1.5em; margin-bottom: 0.5em; line-height: 1.5; } .prose :where(a):not(:where([class~="not-prose"] *)) { color: hsl(221 83% 53%); text-decoration: underline; font-weight: 500; } .prose :where(a):hover:not(:where([class~="not-prose"] *)) { color: hsl(221 83% 45%); } .prose :where(strong):not(:where([class~="not-prose"] *)) { color: hsl(240 10% 3.9%); font-weight: 600; } .prose :where(ul):not(:where([class~="not-prose"] *)) { list-style-type: disc; margin-top: 1.25em; margin-bottom: 1.25em; padding-left: 1.625em; } .prose :where(ol):not(:where([class~="not-prose"] *)) { list-style-type: decimal; margin-top: 1.25em; margin-bottom: 1.25em; padding-left: 1.625em; } .prose :where(li):not(:where([class~="not-prose"] *)) { margin-top: 0.5em; margin-bottom: 0.5em; } .prose :where(ul > li):not(:where([class~="not-prose"] *)) { padding-left: 0.375em; } .prose :where(ol > li):not(:where([class~="not-prose"] *)) { padding-left: 0.375em; } .prose :where(blockquote):not(:where([class~="not-prose"] *)) { font-weight: 500; font-style: italic; color: hsl(240 6% 10%); border-left-width: 0.25rem; border-left-color: hsl(240 5.9% 90%); quotes: "\201C""\201D""\2018""\2019"; margin-top: 1.6em; margin-bottom: 1.6em; padding-left: 1em; } .prose :where(img):not(:where([class~="not-prose"] *)) { margin-top: 2em; margin-bottom: 2em; max-width: 100%; height: auto; border-radius: 0.5rem; } .prose :where(figure):not(:where([class~="not-prose"] *)) { margin-top: 2em; margin-bottom: 2em; } .prose :where(table):not(:where([class~="not-prose"] *)) { width: 100%; table-layout: auto; text-align: left; margin-top: 2em; margin-bottom: 2em; font-size: 0.875em; line-height: 1.7142857; border-collapse: collapse; border-spacing: 0; } .prose :where(thead):not(:where([class~="not-prose"] *)) { border-bottom-width: 1px; border-bottom-color: hsl(240 5.9% 90%); } .prose :where(thead th):not(:where([class~="not-prose"] *)) { color: hsl(240 10% 3.9%); font-weight: 600; vertical-align: bottom; padding-right: 0.5714286em; padding-bottom: 0.5714286em; padding-left: 0.5714286em; } .prose :where(tbody tr):not(:where([class~="not-prose"] *)) { border-bottom-width: 1px; border-bottom-color: hsl(240 5.9% 90%); } .prose :where(tbody tr:last-child):not(:where([class~="not-prose"] *)) { border-bottom-width: 0; } .prose :where(tbody td):not(:where([class~="not-prose"] *)) { vertical-align: baseline; padding: 0.5714286em; } .prose :where(code):not(:where([class~="not-prose"] *)) { color: hsl(240 10% 3.9%); font-weight: 600; font-size: 0.875em; background-color: hsl(240 4.8% 95.9%); padding: 0.2em 0.4em; border-radius: 0.25rem; } .prose :where(pre):not(:where([class~="not-prose"] *)) { color: hsl(0 0% 98%); background-color: hsl(240 10% 3.9%); overflow-x: auto; font-weight: 400; font-size: 0.875em; line-height: 1.7142857; margin-top: 1.7142857em; margin-bottom: 1.7142857em; border-radius: 0.375rem; padding: 0.8571429em 1.1428571em; } .prose :where(pre code):not(:where([class~="not-prose"] *)) { background-color: transparent; border-width: 0; border-radius: 0; padding: 0; font-weight: inherit; color: inherit; font-size: inherit; font-family: inherit; line-height: inherit; } /* Dark mode prose styles */ .dark .prose { color: hsl(0 0% 98%); } .dark .prose :where(h1):not(:where([class~="not-prose"] *)), .dark .prose :where(h2):not(:where([class~="not-prose"] *)), .dark .prose :where(h3):not(:where([class~="not-prose"] *)), .dark .prose :where(h4):not(:where([class~="not-prose"] *)), .dark .prose :where(strong):not(:where([class~="not-prose"] *)) { color: hsl(0 0% 98%); } .dark .prose :where(a):not(:where([class~="not-prose"] *)) { color: hsl(217 91% 60%); } .dark .prose :where(a):hover:not(:where([class~="not-prose"] *)) { color: hsl(217 91% 70%); } .dark .prose :where(blockquote):not(:where([class~="not-prose"] *)) { color: hsl(0 0% 85%); border-left-color: hsl(240 3.7% 15.9%); } .dark .prose :where(thead):not(:where([class~="not-prose"] *)), .dark .prose :where(tbody tr):not(:where([class~="not-prose"] *)) { border-bottom-color: hsl(240 3.7% 15.9%); } .dark .prose :where(thead th):not(:where([class~="not-prose"] *)) { color: hsl(0 0% 98%); } .dark .prose :where(code):not(:where([class~="not-prose"] *)) { color: hsl(0 0% 98%); background-color: hsl(240 3.7% 15.9%); } .dark .prose :where(pre):not(:where([class~="not-prose"] *)) { background-color: hsl(240 3.7% 15.9%); color: hsl(0 0% 98%); } /* Prose size variants */ .prose-lg { font-size: 1.25rem; line-height: 1.8; } .prose-xl { font-size: 1.375rem; line-height: 1.8; }