mirror of
https://github.com/pbakaus/impeccable.git
synced 2026-09-12 06:06:37 +03:00
378 lines
8.1 KiB
CSS
378 lines
8.1 KiB
CSS
/*
|
|
* impeccable.style — Tailwind CSS v4 + Custom Components
|
|
*
|
|
* Architecture:
|
|
* - Tailwind v4 with custom theme tokens
|
|
* - Custom components for complex UI patterns
|
|
* - Minimal CSS for what Tailwind can't express
|
|
*/
|
|
|
|
@import "tailwindcss";
|
|
|
|
/* ============================================
|
|
TAILWIND THEME - Static Design Tokens
|
|
============================================ */
|
|
|
|
@theme {
|
|
/* Typography */
|
|
--font-display: 'Cormorant Garamond', Georgia, serif;
|
|
--font-body: 'Instrument Sans', system-ui, sans-serif;
|
|
--font-mono: 'Space Grotesk', monospace;
|
|
|
|
/* Spacing Scale */
|
|
--spacing-xs: 8px;
|
|
--spacing-sm: 16px;
|
|
--spacing-md: 24px;
|
|
--spacing-lg: 48px;
|
|
--spacing-xl: 80px;
|
|
--spacing-2xl: 128px;
|
|
--spacing-3xl: 192px;
|
|
|
|
/* Width */
|
|
--width-max: 1280px;
|
|
--width-content: 840px;
|
|
|
|
/* Animation */
|
|
--ease-out: cubic-bezier(0.16, 1, 0.3, 1);
|
|
--ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
|
|
--duration-fast: 0.2s;
|
|
--duration-base: 0.3s;
|
|
--duration-slow: 0.6s;
|
|
--duration-slower: 0.8s;
|
|
--duration-slowest: 1.2s;
|
|
}
|
|
|
|
/* ============================================
|
|
COLOR TOKENS - Light/Dark Mode via CSS
|
|
============================================ */
|
|
|
|
:root {
|
|
/* Colors - Light Mode */
|
|
--color-ink: oklch(10% 0 0);
|
|
--color-text: oklch(10% 0 0);
|
|
--color-paper: oklch(98% 0 0);
|
|
--color-charcoal: oklch(25% 0 0);
|
|
--color-ash: oklch(55% 0 0);
|
|
--color-mist: oklch(92% 0 0);
|
|
--color-bg: oklch(96% 0.005 350);
|
|
--color-accent: oklch(60% 0.25 350);
|
|
--color-accent-hover: oklch(52% 0.25 350);
|
|
--color-accent-dim: oklch(60% 0.25 350 / 0.15);
|
|
}
|
|
|
|
/* Dark Mode */
|
|
@media (prefers-color-scheme: dark) {
|
|
:root {
|
|
--color-ink: oklch(98% 0 0);
|
|
--color-text: oklch(98% 0 0);
|
|
--color-paper: oklch(10% 0 0);
|
|
--color-charcoal: oklch(92% 0 0);
|
|
--color-ash: oklch(65% 0 0);
|
|
--color-mist: oklch(20% 0 0);
|
|
--color-bg: oklch(12% 0.005 350);
|
|
--color-accent: oklch(68% 0.23 350);
|
|
--color-accent-hover: oklch(76% 0.23 350);
|
|
}
|
|
}
|
|
|
|
/* ============================================
|
|
BASE STYLES
|
|
============================================ */
|
|
|
|
html {
|
|
-webkit-font-smoothing: antialiased;
|
|
-moz-osx-font-smoothing: grayscale;
|
|
text-rendering: optimizeLegibility;
|
|
}
|
|
|
|
body {
|
|
font-family: var(--font-body);
|
|
color: var(--color-ink);
|
|
background: var(--color-paper);
|
|
}
|
|
|
|
h1, h2, h3, h4, h5, h6 {
|
|
font-family: var(--font-display);
|
|
font-weight: 600;
|
|
line-height: 1.1;
|
|
letter-spacing: -0.02em;
|
|
}
|
|
|
|
a {
|
|
color: var(--color-accent);
|
|
text-decoration: none;
|
|
transition: opacity var(--duration-fast) var(--ease-out);
|
|
}
|
|
|
|
a:hover {
|
|
opacity: 0.7;
|
|
}
|
|
|
|
/* ============================================
|
|
SECTION TITLE - With accent underline
|
|
============================================ */
|
|
|
|
.section-title {
|
|
font-size: clamp(2rem, 4vw, 3rem);
|
|
font-weight: 600;
|
|
position: relative;
|
|
display: block;
|
|
padding-bottom: var(--spacing-sm);
|
|
}
|
|
|
|
.section-title::after {
|
|
content: '';
|
|
position: absolute;
|
|
bottom: -0.25em;
|
|
left: 0;
|
|
width: 80px;
|
|
height: 2px;
|
|
background: var(--color-accent);
|
|
}
|
|
|
|
/* ============================================
|
|
BACKGROUND ATMOSPHERE
|
|
============================================ */
|
|
|
|
body::before {
|
|
content: '';
|
|
position: fixed;
|
|
inset: 0;
|
|
background:
|
|
radial-gradient(circle at 20% 30%, var(--color-accent-dim) 0%, transparent 50%),
|
|
radial-gradient(circle at 80% 70%, var(--color-accent-dim) 0%, transparent 50%);
|
|
opacity: 0;
|
|
z-index: -1;
|
|
animation: fadeInBg var(--duration-slowest) var(--ease-out) 0.3s forwards;
|
|
pointer-events: none;
|
|
}
|
|
|
|
/* ============================================
|
|
HERO DECORATIONS
|
|
============================================ */
|
|
|
|
.deco-line {
|
|
position: absolute;
|
|
width: 160px;
|
|
height: 2px;
|
|
background: var(--color-accent);
|
|
top: 50%;
|
|
left: 50%;
|
|
transform: translate(-50%, -50%) rotate(-25deg);
|
|
animation: expandLine 1s var(--ease-out) 0.6s both;
|
|
}
|
|
|
|
.deco-circle {
|
|
position: absolute;
|
|
width: 120px;
|
|
height: 120px;
|
|
border: 2px solid var(--color-accent);
|
|
border-radius: 50%;
|
|
top: 50%;
|
|
left: 50%;
|
|
transform: translate(-50%, -50%);
|
|
animation: drawCircle 1s var(--ease-out) 0.8s both;
|
|
opacity: 0.3;
|
|
}
|
|
|
|
/* ============================================
|
|
BUTTONS
|
|
============================================ */
|
|
|
|
.btn {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
padding: 0.875rem 2rem;
|
|
font-family: var(--font-body);
|
|
font-size: 0.9375rem;
|
|
font-weight: 600;
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.05em;
|
|
border: none;
|
|
cursor: pointer;
|
|
transition: all var(--duration-base) var(--ease-out);
|
|
position: relative;
|
|
overflow: hidden;
|
|
text-decoration: none;
|
|
}
|
|
|
|
.btn-primary {
|
|
background: var(--color-accent);
|
|
color: var(--color-paper);
|
|
width: 100%;
|
|
position: relative;
|
|
z-index: 1;
|
|
}
|
|
|
|
.btn-primary::before {
|
|
content: '';
|
|
position: absolute;
|
|
inset: 0;
|
|
background: var(--color-ink);
|
|
transform: translateY(100%);
|
|
transition: transform var(--duration-base) var(--ease-out);
|
|
z-index: -1;
|
|
}
|
|
|
|
.btn-primary:hover::before {
|
|
transform: translateY(0);
|
|
}
|
|
|
|
.btn-secondary {
|
|
background: transparent;
|
|
color: var(--color-ink);
|
|
border: 1px solid var(--color-ink);
|
|
}
|
|
|
|
.btn-secondary:hover {
|
|
background: var(--color-ink);
|
|
color: var(--color-paper);
|
|
}
|
|
|
|
/* ============================================
|
|
CARD COMPONENTS
|
|
============================================ */
|
|
|
|
.card-inner {
|
|
height: 100%;
|
|
padding: var(--spacing-lg);
|
|
background: var(--color-paper);
|
|
border: 1px solid var(--color-mist);
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: var(--spacing-md);
|
|
transition: all var(--duration-base) var(--ease-out);
|
|
position: relative;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.card-inner::before {
|
|
content: '';
|
|
position: absolute;
|
|
top: 0;
|
|
left: 0;
|
|
right: 0;
|
|
height: 2px;
|
|
background: var(--color-accent);
|
|
transform: translateX(-100%);
|
|
transition: transform 0.4s var(--ease-out);
|
|
}
|
|
|
|
.card-inner:hover {
|
|
border-color: var(--color-accent);
|
|
transform: translateY(-4px);
|
|
}
|
|
|
|
.card-inner:hover::before {
|
|
transform: translateX(0);
|
|
}
|
|
|
|
.badge {
|
|
font-size: 0.625rem;
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.1em;
|
|
padding: 0.25em 0.625em;
|
|
border: 1px solid var(--color-accent);
|
|
color: var(--color-accent);
|
|
border-radius: 2px;
|
|
font-weight: 600;
|
|
white-space: nowrap;
|
|
}
|
|
|
|
/* ============================================
|
|
SOLUTION CARDS
|
|
============================================ */
|
|
|
|
.solution-card {
|
|
padding: var(--spacing-lg);
|
|
background: var(--color-paper);
|
|
border-left: 3px solid var(--color-accent);
|
|
transition: all var(--duration-base) var(--ease-out);
|
|
}
|
|
|
|
.solution-card:hover {
|
|
background: color-mix(in oklch, var(--color-paper) 90%, var(--color-accent));
|
|
transform: translateX(4px);
|
|
}
|
|
|
|
.solution-card code {
|
|
font-family: var(--font-mono);
|
|
font-size: 0.875em;
|
|
background: color-mix(in oklch, var(--color-accent) 15%, transparent);
|
|
color: var(--color-accent);
|
|
padding: 0.125em 0.375em;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
/* ============================================
|
|
ANIMATIONS
|
|
============================================ */
|
|
|
|
@keyframes fadeInBg {
|
|
to { opacity: 1; }
|
|
}
|
|
|
|
@keyframes slideInLeft {
|
|
from {
|
|
opacity: 0;
|
|
transform: translateX(-40px);
|
|
}
|
|
}
|
|
|
|
@keyframes slideInRight {
|
|
from {
|
|
opacity: 0;
|
|
transform: translateX(40px);
|
|
}
|
|
}
|
|
|
|
@keyframes fadeInUp {
|
|
to {
|
|
opacity: 1;
|
|
transform: translateY(0);
|
|
}
|
|
}
|
|
|
|
@keyframes expandLine {
|
|
from { width: 0; }
|
|
}
|
|
|
|
@keyframes drawCircle {
|
|
from {
|
|
opacity: 0;
|
|
scale: 0;
|
|
}
|
|
to {
|
|
opacity: 1;
|
|
scale: 1;
|
|
}
|
|
}
|
|
|
|
[data-animate] {
|
|
opacity: 0;
|
|
transform: translateY(20px);
|
|
}
|
|
|
|
[data-animate].animated {
|
|
animation: fadeInUp var(--duration-slow) var(--ease-out) both;
|
|
}
|
|
|
|
/* Hero animations */
|
|
.hero-content {
|
|
animation: slideInLeft var(--duration-slower) var(--ease-out) 0.1s both;
|
|
}
|
|
|
|
.hero-decoration {
|
|
animation: slideInRight var(--duration-slower) var(--ease-out) 0.3s both;
|
|
}
|
|
|
|
/* ============================================
|
|
IMPORTS - Complex components that need custom CSS
|
|
============================================ */
|
|
|
|
@import "./problem-section.css";
|
|
@import "./skill-demos.css";
|
|
@import "./gallery.css";
|
|
@import "./workflow.css";
|