diff --git a/biome.json b/biome.json
new file mode 100644
index 000000000..c488ed2d3
--- /dev/null
+++ b/biome.json
@@ -0,0 +1,8 @@
+{
+ "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
+ "css": {
+ "parser": {
+ "tailwindDirectives": true
+ }
+ }
+}
diff --git a/bun.lock b/bun.lock
new file mode 100644
index 000000000..210065ea3
--- /dev/null
+++ b/bun.lock
@@ -0,0 +1,44 @@
+{
+ "lockfileVersion": 1,
+ "configVersion": 1,
+ "workspaces": {
+ "": {
+ "name": "vibe-design-plugins",
+ "dependencies": {
+ "tailwindcss": "^4.1.18",
+ },
+ "devDependencies": {
+ "bun-plugin-tailwind": "^0.1.2",
+ },
+ },
+ },
+ "packages": {
+ "@oven/bun-darwin-aarch64": ["@oven/bun-darwin-aarch64@1.3.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-2Ie4jDGvNGuPSD+pyyBKL8dJmX+bZfDNYEalwgROImVtwB1XYAatJK20dMaRlPA7jOhjvS9Io+4IZAJu7Js0AA=="],
+
+ "@oven/bun-darwin-x64": ["@oven/bun-darwin-x64@1.3.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-4/BJojT8hk5g6Gecjn5yI7y96/+9Mtzsvdp9+2dcy9sTMdlV7jBvDzswqyJPZyQqw0F3HV3Vu9XuMubZwKd9lA=="],
+
+ "@oven/bun-darwin-x64-baseline": ["@oven/bun-darwin-x64-baseline@1.3.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-ZYxzIOCDqylTMsnWYERjKMMuK2b4an4qbloBmUZTwLHmVzos00yrhtpitZhJBgH6yB/l4Q5eoJ2W98UKtFFeiQ=="],
+
+ "@oven/bun-linux-aarch64": ["@oven/bun-linux-aarch64@1.3.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-8DUIlanftMdFxLGq2FxwKwfrp8O4ZofF/8Oc6lxCyEFmg2hixbHhL04+fPfJIi5D4hZloynxZdwTeDbGv/Kc4A=="],
+
+ "@oven/bun-linux-aarch64-musl": ["@oven/bun-linux-aarch64-musl@1.3.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-6UtmM4wXgRKz+gnLZEfddfsuBSVQpJr09K12e5pbdnLzeWgXYlBT5FG8S7SVn1t6cbgBMnigEsFjWwfTuMNoCw=="],
+
+ "@oven/bun-linux-x64": ["@oven/bun-linux-x64@1.3.4", "", { "os": "linux", "cpu": "x64" }, "sha512-03iSDMqdrmIFAsvsRptq+A7EGNjkg20dNzPnqxAlXHk5rc1PeIRWIP0eIn0i3nI6mmdj33mimf9AGr0+d0lKMg=="],
+
+ "@oven/bun-linux-x64-baseline": ["@oven/bun-linux-x64-baseline@1.3.4", "", { "os": "linux", "cpu": "x64" }, "sha512-ZMGPbFPqmG/VYJv61D+Y1V7T23jPK57vYl7yYLakmkTRjG6vcJ0Akhb2qR1iW94rHvfEBjeuVDAZBp8Qp9oyWA=="],
+
+ "@oven/bun-linux-x64-musl": ["@oven/bun-linux-x64-musl@1.3.4", "", { "os": "linux", "cpu": "x64" }, "sha512-xUXPuJHndGhk4K3Cx1FgTyTgDZOn+ki3eWvdXYqKdfi0EaNA9KpUq+/vUtpJbZRjzpHs9L+OJcdDILq5H0LX4g=="],
+
+ "@oven/bun-linux-x64-musl-baseline": ["@oven/bun-linux-x64-musl-baseline@1.3.4", "", { "os": "linux", "cpu": "x64" }, "sha512-qsGSSlNsxiX8lAayK2uYCfMLtqu776F0nn7qoyzg9Ti7mElM3woNh7RtGClTwQ6qsp5/UvgqT9g4pLaDHmqJFg=="],
+
+ "@oven/bun-windows-x64": ["@oven/bun-windows-x64@1.3.4", "", { "os": "win32", "cpu": "x64" }, "sha512-nswsuN6+HZPim6x4tFpDFpMa/qpTKfywbGvCkzxwrbJO9MtpuW/54NA1nFbHhpV14OLU0xuxyBj2PK4FHq4MlA=="],
+
+ "@oven/bun-windows-x64-baseline": ["@oven/bun-windows-x64-baseline@1.3.4", "", { "os": "win32", "cpu": "x64" }, "sha512-ZQiSDFfSUdOrPTiL2GvkxlC/kMED4fsJwdZnwJK6S9ylXnk9xY/9ZXfe1615SFLQl2LsVRzJAtjQLeM0BifIKQ=="],
+
+ "bun": ["bun@1.3.4", "", { "optionalDependencies": { "@oven/bun-darwin-aarch64": "1.3.4", "@oven/bun-darwin-x64": "1.3.4", "@oven/bun-darwin-x64-baseline": "1.3.4", "@oven/bun-linux-aarch64": "1.3.4", "@oven/bun-linux-aarch64-musl": "1.3.4", "@oven/bun-linux-x64": "1.3.4", "@oven/bun-linux-x64-baseline": "1.3.4", "@oven/bun-linux-x64-musl": "1.3.4", "@oven/bun-linux-x64-musl-baseline": "1.3.4", "@oven/bun-windows-x64": "1.3.4", "@oven/bun-windows-x64-baseline": "1.3.4" }, "os": [ "linux", "win32", "darwin", ], "cpu": [ "x64", "arm64", ], "bin": { "bun": "bin/bun.exe", "bunx": "bin/bunx.exe" } }, "sha512-xV6KgD5ImquuKsoghzbWmYzeCXmmSgN6yJGz444hri2W+NGKNRFUNrEhy9+/rRXbvNA2qF0K0jAwqFNy1/GhBg=="],
+
+ "bun-plugin-tailwind": ["bun-plugin-tailwind@0.1.2", "", { "peerDependencies": { "bun": ">=1.0.0" } }, "sha512-41jNC1tZRSK3s1o7pTNrLuQG8kL/0vR/JgiTmZAJ1eHwe0w5j6HFPKeqEk0WAD13jfrUC7+ULuewFBBCoADPpg=="],
+
+ "tailwindcss": ["tailwindcss@4.1.18", "", {}, "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw=="],
+ }
+}
diff --git a/bunfig.toml b/bunfig.toml
new file mode 100644
index 000000000..88894bd16
--- /dev/null
+++ b/bunfig.toml
@@ -0,0 +1,3 @@
+# Configure Tailwind CSS plugin for Bun's static server and bundler
+[serve.static]
+plugins = ["bun-plugin-tailwind"]
diff --git a/package.json b/package.json
index 9551c0dea..59e3f976c 100644
--- a/package.json
+++ b/package.json
@@ -21,6 +21,11 @@
"ux"
],
"author": "Paul Bakaus",
- "license": "SEE LICENSE FILE"
+ "license": "SEE LICENSE FILE",
+ "devDependencies": {
+ "bun-plugin-tailwind": "^0.1.2"
+ },
+ "dependencies": {
+ "tailwindcss": "^4.1.18"
+ }
}
-
diff --git a/public/css/animations.css b/public/css/animations.css
deleted file mode 100644
index cba78e423..000000000
--- a/public/css/animations.css
+++ /dev/null
@@ -1,81 +0,0 @@
-/* Animations & Keyframes */
-
-/* Background Atmosphere */
-body::before {
- content: '';
- position: fixed;
- inset: 0;
- background:
- radial-gradient(circle at 20% 30%, var(--c-accent-dim) 0%, transparent 50%),
- radial-gradient(circle at 80% 70%, var(--c-accent-dim) 0%, transparent 50%);
- opacity: 0;
- z-index: -1;
- animation: fadeInBg var(--duration-slowest) var(--ease-out) 0.3s forwards;
- pointer-events: none;
-}
-
-/* Keyframe Definitions */
-@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;
- }
-}
-
-@keyframes pulse {
- 0%,
- 100% {
- opacity: 1;
- }
- 50% {
- opacity: 0.5;
- }
-}
-
-/* Animation Utilities */
-[data-animate] {
- opacity: 0;
- transform: translateY(20px);
-
- &.animated {
- animation: fadeInUp var(--duration-slow) var(--ease-out) both;
- }
-}
-
diff --git a/public/css/buttons.css b/public/css/buttons.css
deleted file mode 100644
index 5817ba2fd..000000000
--- a/public/css/buttons.css
+++ /dev/null
@@ -1,69 +0,0 @@
-/* Button Components */
-
-.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;
-}
-
-/* Primary Button */
-.btn-primary {
- background: var(--c-accent);
- color: var(--c-paper);
- width: 100%;
- position: relative;
- z-index: 1;
-
- &::before {
- content: '';
- position: absolute;
- inset: 0;
- background: var(--c-ink);
- transform: translateY(100%);
- transition: transform var(--duration-base) var(--ease-out);
- z-index: -1;
- }
-
- &:hover::before {
- transform: translateY(0);
- }
-}
-
-/* Secondary Button */
-.btn-secondary {
- background: transparent;
- color: var(--c-ink);
- border: 1px solid var(--c-ink);
-
- &:hover {
- background: var(--c-ink);
- color: var(--c-paper);
- }
-}
-
-/* Small Button Variant */
-.btn-small {
- padding: 0.5rem 1rem;
- font-size: 0.8125rem;
- border: 1px solid var(--c-mist);
- background: transparent;
- color: var(--c-ink);
-
- &:hover {
- border-color: var(--c-accent);
- color: var(--c-accent);
- }
-}
-
diff --git a/public/css/cards.css b/public/css/cards.css
deleted file mode 100644
index 34235f745..000000000
--- a/public/css/cards.css
+++ /dev/null
@@ -1,112 +0,0 @@
-/* Card Components */
-
-/* Download Bundles Section */
-.download-grid {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
- gap: var(--s-md);
-
- @media (max-width: 640px) {
- grid-template-columns: 1fr;
- }
-}
-
-.download-card {
- opacity: 0;
- transform: translateY(20px);
-
- &.animated {
- animation: fadeInUp var(--duration-slow) var(--ease-out) both;
- }
-}
-
-.card-inner {
- height: 100%;
- padding: var(--s-lg);
- background: var(--c-paper);
- border: 1px solid var(--c-mist);
- display: flex;
- flex-direction: column;
- gap: var(--s-md);
- transition: all var(--duration-base) var(--ease-out);
- position: relative;
- overflow: hidden;
-
- &::before {
- content: '';
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- height: 2px;
- background: var(--c-accent);
- transform: translateX(-100%);
- transition: transform 0.4s var(--ease-out);
- }
-
- &:hover {
- border-color: var(--c-accent);
- transform: translateY(-4px);
-
- &::before {
- transform: translateX(0);
- }
- }
-}
-
-.card-header {
- display: flex;
- justify-content: space-between;
- align-items: flex-start;
- gap: var(--s-md);
-
- h3 {
- font-size: 1.375rem;
- font-weight: 500;
- margin: 0;
- }
-}
-
-.badge {
- font-size: 0.625rem;
- text-transform: uppercase;
- letter-spacing: 0.1em;
- padding: 0.25em 0.625em;
- border: 1px solid var(--c-accent);
- color: var(--c-accent);
- border-radius: 2px;
- font-weight: 600;
- white-space: nowrap;
-}
-
-.card-inner p {
- color: var(--c-ash);
- font-size: 0.9375rem;
- line-height: 1.6;
- flex-grow: 1;
- margin: 0;
-}
-
-/* Contribute Section */
-.contribute {
- padding: var(--s-2xl) 0;
- text-align: center;
-}
-
-.contribute-content {
- max-width: 480px;
- margin: 0 auto;
-}
-
-.contribute h2 {
- font-size: 2rem;
- font-weight: 600;
- margin-bottom: var(--s-sm);
-}
-
-.contribute p {
- font-size: 1.125rem;
- color: var(--c-ash);
- margin-bottom: var(--s-lg);
- line-height: 1.6;
-}
diff --git a/public/css/footer.css b/public/css/footer.css
deleted file mode 100644
index 939e279ab..000000000
--- a/public/css/footer.css
+++ /dev/null
@@ -1,65 +0,0 @@
-/* Footer & Contribute Section */
-
-.contribute {
- padding: var(--s-2xl) 0;
- border-top: 1px solid var(--c-mist);
- text-align: center;
-}
-
-.contribute-content {
- max-width: var(--content-width);
- margin: 0 auto;
- display: flex;
- flex-direction: column;
- align-items: center;
- gap: var(--s-md);
-
- h2 {
- font-size: clamp(2rem, 4vw, 3rem);
- font-weight: 600;
- }
-
- p {
- font-size: 1.125rem;
- color: var(--c-ash);
- max-width: 42ch;
- }
-}
-
-footer {
- border-top: 1px solid var(--c-mist);
- padding: var(--s-2xl) var(--s-lg);
- background: var(--c-paper);
-}
-
-.footer-content {
- max-width: var(--max-width);
- margin: 0 auto;
- display: flex;
- justify-content: space-between;
- align-items: center;
- font-size: 0.875rem;
- color: var(--c-ash);
-
- a {
- color: var(--c-ink);
- text-decoration: underline;
- text-underline-offset: 0.2em;
- }
-
- @media (max-width: 768px) {
- flex-direction: column;
- gap: var(--s-sm);
- text-align: center;
- }
-}
-
-/* Print Styles */
-@media print {
- body::before,
- .hero-decoration,
- .btn {
- display: none;
- }
-}
-
diff --git a/public/css/gallery.css b/public/css/gallery.css
index 6f3b52eb7..c20cd97ea 100644
--- a/public/css/gallery.css
+++ b/public/css/gallery.css
@@ -10,11 +10,11 @@
}
.skill-nav-item {
- padding: var(--s-sm) var(--s-md);
+ padding: var(--spacing-sm) var(--spacing-md);
background: transparent;
border: none;
border-left: 2px solid transparent;
- color: var(--c-ash);
+ color: var(--color-ash);
font-family: var(--font-body);
font-size: 0.9375rem;
font-weight: 400;
@@ -26,14 +26,14 @@
}
.skill-nav-item:hover {
- color: var(--c-text);
- background: color-mix(in oklch, var(--c-paper) 85%, var(--c-accent));
+ color: var(--color-text);
+ background: color-mix(in oklch, var(--color-paper) 85%, var(--color-accent));
}
.skill-nav-item.active {
- color: var(--c-accent);
- border-left-color: var(--c-accent);
- background: color-mix(in oklch, var(--c-accent) 5%, var(--c-paper));
+ color: var(--color-accent);
+ border-left-color: var(--color-accent);
+ background: color-mix(in oklch, var(--color-accent) 5%, var(--color-paper));
font-weight: 500;
}
@@ -41,17 +41,17 @@
.skills-nav {
flex-direction: row;
flex-wrap: wrap;
- gap: var(--s-xs);
+ gap: var(--spacing-xs);
}
.skill-nav-item {
border-left: none;
border-bottom: 2px solid transparent;
- padding: var(--s-xs) var(--s-md);
+ padding: var(--spacing-xs) var(--spacing-md);
}
.skill-nav-item.active {
- border-bottom-color: var(--c-accent);
+ border-bottom-color: var(--color-accent);
}
}
@@ -59,7 +59,7 @@
.skills-showcase {
display: grid;
grid-template-columns: 1.2fr 1fr;
- gap: var(--s-lg);
+ gap: var(--spacing-lg);
align-items: start;
@media (max-width: 1100px) {
@@ -86,7 +86,7 @@
}
.skill-header {
- margin-bottom: var(--s-md);
+ margin-bottom: var(--spacing-md);
}
.skill-header h3 {
@@ -94,17 +94,17 @@
font-size: 1.75rem;
font-weight: 300;
font-style: italic;
- margin: 0 0 var(--s-xs) 0;
- color: var(--c-text);
+ margin: 0 0 var(--spacing-xs) 0;
+ color: var(--color-text);
letter-spacing: -0.02em;
line-height: 1.1;
}
.skill-header .meta {
display: flex;
- gap: var(--s-sm);
+ gap: var(--spacing-sm);
align-items: center;
- color: var(--c-ash);
+ color: var(--color-ash);
font-size: 0.8125rem;
font-weight: 400;
letter-spacing: 0.03em;
@@ -112,7 +112,7 @@
}
.skill-header .meta a {
- color: var(--c-accent);
+ color: var(--color-accent);
text-decoration: none;
transition: opacity 0.2s ease;
}
@@ -124,22 +124,22 @@
.skill-description {
font-size: 0.9375rem;
line-height: 1.6;
- margin-bottom: var(--s-md);
- color: var(--c-charcoal);
+ margin-bottom: var(--spacing-md);
+ color: var(--color-charcoal);
max-width: 50ch;
}
/* Skill Sections (Focus Areas, Relationships) */
.skill-section {
- margin-bottom: var(--s-lg);
+ margin-bottom: var(--spacing-lg);
}
.skill-section h4 {
font-family: var(--font-body);
font-size: 0.75rem;
font-weight: 600;
- margin: 0 0 var(--s-sm) 0;
- color: var(--c-ash);
+ margin: 0 0 var(--spacing-sm) 0;
+ color: var(--color-ash);
text-transform: uppercase;
letter-spacing: 0.1em;
}
@@ -148,26 +148,26 @@
.focus-areas-compact {
display: flex;
flex-wrap: wrap;
- gap: var(--s-xs);
+ gap: var(--spacing-xs);
}
.focus-area-tag {
display: inline-flex;
align-items: center;
- gap: var(--s-xs);
- padding: var(--s-xs) var(--s-sm);
- background: var(--c-paper);
+ gap: var(--spacing-xs);
+ padding: var(--spacing-xs) var(--spacing-sm);
+ background: var(--color-paper);
border-radius: 3px;
font-size: 0.8125rem;
}
.focus-area-tag strong {
- color: var(--c-text);
+ color: var(--color-text);
font-weight: 500;
}
.focus-area-tag span {
- color: var(--c-ash);
+ color: var(--color-ash);
font-size: 0.75rem;
}
@@ -175,15 +175,15 @@
.relationship-tags {
display: flex;
flex-wrap: wrap;
- gap: var(--s-xs);
+ gap: var(--spacing-xs);
}
.relationship-tag {
display: inline-block;
- padding: var(--s-xs) var(--s-sm);
- background: var(--c-paper);
- color: var(--c-text);
- border: 1px solid color-mix(in oklch, var(--c-accent) 30%, transparent);
+ padding: var(--spacing-xs) var(--spacing-sm);
+ background: var(--color-paper);
+ color: var(--color-text);
+ border: 1px solid color-mix(in oklch, var(--color-accent) 30%, transparent);
font-size: 0.8125rem;
font-weight: 400;
border-radius: 2px;
@@ -192,36 +192,36 @@
}
.relationship-tag:hover {
- border-color: var(--c-accent);
- color: var(--c-accent);
- background: color-mix(in oklch, var(--c-accent) 5%, var(--c-paper));
+ border-color: var(--color-accent);
+ color: var(--color-accent);
+ background: color-mix(in oklch, var(--color-accent) 5%, var(--color-paper));
}
/* Skill Downloads (Icons) */
.skill-downloads {
display: flex;
align-items: center;
- gap: var(--s-sm);
- padding-top: var(--s-md);
- margin-top: var(--s-md);
- border-top: 1px solid var(--c-mist);
+ gap: var(--spacing-sm);
+ padding-top: var(--spacing-md);
+ margin-top: var(--spacing-md);
+ border-top: 1px solid var(--color-mist);
}
.downloads-label {
font-size: 0.75rem;
- color: var(--c-ash);
- margin-right: var(--s-xs);
+ color: var(--color-ash);
+ margin-right: var(--spacing-xs);
}
.download-icon {
display: flex;
align-items: center;
- gap: var(--s-xs);
+ gap: var(--spacing-xs);
padding: 6px 10px;
border-radius: 4px;
background: transparent;
- border: 1px solid var(--c-mist);
- color: var(--c-ash);
+ border: 1px solid var(--color-mist);
+ color: var(--color-ash);
text-decoration: none;
font-size: 0.75rem;
transition: all 0.15s ease;
@@ -234,16 +234,16 @@
}
.download-icon:hover {
- color: var(--c-accent);
- border-color: var(--c-accent);
- background: color-mix(in oklch, var(--c-accent) 5%, transparent);
+ color: var(--color-accent);
+ border-color: var(--color-accent);
+ background: color-mix(in oklch, var(--color-accent) 5%, transparent);
}
/* Command Detail Panel - mirrors skills showcase */
.command-detail-panel {
display: grid;
grid-template-columns: 1.2fr 1fr;
- gap: var(--s-lg);
+ gap: var(--spacing-lg);
align-items: start;
@media (max-width: 1100px) {
@@ -263,15 +263,15 @@
font-family: 'Space Grotesk', monospace;
font-size: 2rem;
font-weight: 500;
- margin: 0 0 var(--s-xs) 0;
- color: var(--c-text);
+ margin: 0 0 var(--spacing-xs) 0;
+ color: var(--color-text);
}
.command-header .meta {
display: flex;
- gap: var(--s-sm);
+ gap: var(--spacing-sm);
align-items: center;
- color: var(--c-ash);
+ color: var(--color-ash);
font-size: 0.8125rem;
text-transform: uppercase;
letter-spacing: 0.03em;
@@ -280,24 +280,24 @@
.command-description {
font-size: 1rem;
line-height: 1.7;
- color: var(--c-charcoal);
- margin-bottom: var(--s-lg);
+ color: var(--color-charcoal);
+ margin-bottom: var(--spacing-lg);
}
/* Process Steps - Compact */
.process-steps-compact {
display: flex;
flex-wrap: wrap;
- gap: var(--s-sm);
+ gap: var(--spacing-sm);
counter-reset: step;
}
.process-step-compact {
display: flex;
align-items: center;
- gap: var(--s-xs);
- padding: var(--s-xs) var(--s-sm);
- background: var(--c-paper);
+ gap: var(--spacing-xs);
+ padding: var(--spacing-xs) var(--spacing-sm);
+ background: var(--color-paper);
border-radius: 3px;
font-size: 0.8125rem;
}
@@ -310,8 +310,8 @@
justify-content: center;
width: 20px;
height: 20px;
- background: var(--c-accent);
- color: var(--c-paper);
+ background: var(--color-accent);
+ color: var(--color-paper);
border-radius: 50%;
font-size: 0.6875rem;
font-weight: 600;
@@ -331,10 +331,10 @@
text-transform: uppercase;
letter-spacing: 0.05em;
padding: 2px 5px;
- background: var(--c-mist);
- color: var(--c-ash);
+ background: var(--color-mist);
+ color: var(--color-ash);
border-radius: 2px;
- margin-left: var(--s-xs);
+ margin-left: var(--spacing-xs);
vertical-align: middle;
}
@@ -344,13 +344,13 @@
align-items: center;
justify-content: center;
text-align: center;
- padding: var(--s-2xl);
+ padding: var(--spacing-2xl);
min-height: 300px;
}
.coming-soon-icon {
- color: var(--c-mist);
- margin-bottom: var(--s-lg);
+ color: var(--color-mist);
+ margin-bottom: var(--spacing-lg);
}
.coming-soon-showcase h3 {
@@ -358,20 +358,20 @@
font-size: 1.75rem;
font-weight: 300;
font-style: italic;
- margin: 0 0 var(--s-sm) 0;
- color: var(--c-text);
+ margin: 0 0 var(--spacing-sm) 0;
+ color: var(--color-text);
}
.coming-soon-text {
font-size: 1rem;
- color: var(--c-accent);
+ color: var(--color-accent);
font-weight: 500;
- margin-bottom: var(--s-md);
+ margin-bottom: var(--spacing-md);
}
.coming-soon-showcase .skill-description {
max-width: 50ch;
- color: var(--c-ash);
+ color: var(--color-ash);
font-size: 0.9375rem;
line-height: 1.6;
}
diff --git a/public/css/hero.css b/public/css/hero.css
deleted file mode 100644
index d6aaa5bb9..000000000
--- a/public/css/hero.css
+++ /dev/null
@@ -1,119 +0,0 @@
-/* Hero Section */
-
-.hero {
- min-height: 85vh;
- display: flex;
- align-items: center;
- position: relative;
- padding: var(--s-2xl) var(--s-lg);
- overflow: hidden;
-}
-
-.hero-grid {
- max-width: var(--max-width);
- margin: 0 auto;
- display: grid;
- grid-template-columns: 1fr auto;
- gap: var(--s-2xl);
- align-items: center;
- width: 100%;
- position: relative;
-}
-
-.hero-content {
- animation: slideInLeft var(--duration-slower) var(--ease-out) 0.1s both;
-}
-
-/* Title Styling */
-.title {
- font-size: clamp(3rem, 8vw, 7rem);
- font-weight: 300;
- line-height: 0.9;
- margin-bottom: var(--s-lg);
- display: flex;
- flex-direction: column;
- gap: -0.1em;
-}
-
-.title-main {
- font-weight: 400;
- letter-spacing: -0.03em;
-}
-
-.title-sub {
- font-weight: 300;
- font-style: italic;
- color: var(--c-accent);
- letter-spacing: -0.02em;
-}
-
-/* Tagline & Providers */
-.tagline {
- font-size: clamp(1.125rem, 2vw, 1.5rem);
- line-height: 1.4;
- color: var(--c-charcoal);
- margin-bottom: var(--s-md);
- max-width: 32ch;
-}
-
-.providers {
- font-size: 0.875rem;
- color: var(--c-ash);
- text-transform: uppercase;
- letter-spacing: 0.08em;
- font-weight: 500;
-}
-
-/* Decorative Elements */
-.hero-decoration {
- width: 240px;
- height: 240px;
- position: relative;
- animation: slideInRight var(--duration-slower) var(--ease-out) 0.3s both;
-}
-
-.deco-line {
- position: absolute;
- width: 160px;
- height: 2px;
- background: var(--c-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(--c-accent);
- border-radius: 50%;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- animation: drawCircle 1s var(--ease-out) 0.8s both;
- opacity: 0.3;
-}
-
-/* Hero Responsive */
-@media (max-width: 768px) {
- .hero {
- min-height: 70vh;
- padding: var(--s-xl) var(--s-md);
- }
-
- .hero-grid {
- grid-template-columns: 1fr;
- gap: var(--s-xl);
- }
-
- .hero-decoration {
- display: none;
- }
-
- .title {
- font-size: clamp(2.5rem, 12vw, 4rem);
- }
-}
-
diff --git a/public/css/intro.css b/public/css/intro.css
deleted file mode 100644
index 1ea6e82de..000000000
--- a/public/css/intro.css
+++ /dev/null
@@ -1,64 +0,0 @@
-/* Intro Section */
-
-.intro {
- padding: var(--s-2xl) 0;
-}
-
-.intro-grid {
- display: grid;
- grid-template-columns: 2fr 1fr;
- gap: var(--s-2xl);
- align-items: start;
-
- @media (max-width: 768px) {
- grid-template-columns: 1fr;
- gap: var(--s-xl);
- }
-}
-
-.intro-content h2 {
- font-size: clamp(1.75rem, 3vw, 2.5rem);
- font-weight: 400;
- line-height: 1.3;
- color: var(--c-charcoal);
-}
-
-/* Meta Statistics */
-.intro-meta {
- display: flex;
- flex-direction: column;
- gap: var(--s-lg);
- padding-top: var(--s-md);
-
- @media (max-width: 768px) {
- flex-direction: row;
- justify-content: space-between;
- }
-}
-
-.meta-item {
- display: flex;
- flex-direction: column;
- gap: var(--s-xs);
-}
-
-.meta-number {
- font-family: var(--font-display);
- font-size: 3rem;
- font-weight: 600;
- line-height: 1;
- color: var(--c-accent);
-
- @media (max-width: 480px) {
- font-size: 2.5rem;
- }
-}
-
-.meta-label {
- font-size: 0.875rem;
- text-transform: uppercase;
- letter-spacing: 0.08em;
- color: var(--c-ash);
- font-weight: 500;
-}
-
diff --git a/public/css/layout.css b/public/css/layout.css
deleted file mode 100644
index 1da3ee5ba..000000000
--- a/public/css/layout.css
+++ /dev/null
@@ -1,160 +0,0 @@
-/* Layout Components */
-
-.container {
- max-width: var(--max-width);
- margin: 0 auto;
- padding: 0 var(--s-lg);
-
- @media (max-width: 640px) {
- padding: 0 var(--s-md);
- }
-}
-
-/* Section Styling */
-section {
- border-top: 1px solid var(--c-mist);
-}
-
-.section-title {
- font-size: clamp(2rem, 4vw, 3rem);
- font-weight: 600;
- margin-bottom: 0;
- padding-bottom: var(--s-sm);
- position: relative;
- display: block;
-
- &::after {
- content: '';
- position: absolute;
- bottom: -0.25em;
- left: 0;
- width: 80px;
- height: 2px;
- background: var(--c-accent);
- }
-
- @media (max-width: 968px) {
- margin-bottom: var(--s-lg);
- }
-}
-
-.section-subtitle {
- font-size: 1.125rem;
- color: var(--c-ash);
- margin-top: var(--s-md);
- max-width: 50ch;
-}
-
-/* Section Headers */
-.section-header-sticky {
- margin-bottom: var(--s-lg);
-
- .section-title {
- margin-bottom: var(--s-sm);
- }
-
- .section-subtitle {
- margin-top: var(--s-sm);
- }
-}
-
-/* Skills Section Layout */
-.skills-section {
- padding: var(--s-xl) 0;
-}
-
-.skills-layout {
- display: grid;
- grid-template-columns: 180px 1fr;
- gap: var(--s-lg);
- align-items: start;
-
- @media (max-width: 968px) {
- grid-template-columns: 1fr;
- gap: var(--s-md);
- }
-}
-
-.skills-nav {
- display: flex;
- flex-direction: column;
- gap: 2px;
-
- @media (max-width: 968px) {
- flex-direction: row;
- flex-wrap: wrap;
- gap: var(--s-xs);
- }
-}
-
-.skills-showcase {
- /* Contain the showcase to prevent excessive scrolling */
-}
-
-/* Commands Section Layout - mirrors skills layout */
-.commands-section {
- padding: var(--s-xl) 0;
-}
-
-.commands-layout {
- display: grid;
- grid-template-columns: 180px 1fr;
- gap: var(--s-lg);
- align-items: start;
-
- @media (max-width: 968px) {
- grid-template-columns: 1fr;
- gap: var(--s-md);
- }
-}
-
-.commands-nav {
- display: flex;
- flex-direction: column;
- gap: var(--s-sm);
-
- @media (max-width: 968px) {
- flex-direction: row;
- flex-wrap: wrap;
- gap: var(--s-xs);
- }
-}
-
-.commands-showcase {
- /* Contains demo + info */
-}
-
-/* Downloads Section */
-.downloads-section {
- padding: var(--s-2xl) 0;
-}
-
-.downloads-header {
- margin-bottom: var(--s-xl);
- max-width: 600px;
-}
-
-.downloads-header .section-title {
- margin-bottom: var(--s-md);
-}
-
-.downloads-lead {
- font-size: 1.125rem;
- line-height: 1.6;
- color: var(--c-ash);
-}
-
-/* Grid Utilities */
-.item-grid {
- display: grid;
- grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
- gap: var(--s-md);
-}
-
-/* Loading State */
-.loading {
- padding: var(--s-xl);
- text-align: center;
- color: var(--c-ash);
- font-style: italic;
-}
diff --git a/public/css/main.css b/public/css/main.css
index ad9c890c7..8f57a0d33 100644
--- a/public/css/main.css
+++ b/public/css/main.css
@@ -1,29 +1,377 @@
/*
- * impeccable.style — Modular CSS Architecture
+ * impeccable.style — Tailwind CSS v4 + Custom Components
*
- * Uses Bun's CSS bundler for:
- * - CSS nesting (no preprocessor needed)
- * - OKLCH colors with automatic fallbacks
- * - Automatic bundling via @import
- *
- * Structure:
- * - tokens.css: Design system (colors, spacing, typography)
- * - reset.css: Modern baseline
- * - animations.css: Keyframes & utilities
- * - layout.css: Grid & section primitives
- * - hero/intro/buttons/cards/footer.css: Component styles
+ * Architecture:
+ * - Tailwind v4 with custom theme tokens
+ * - Custom components for complex UI patterns
+ * - Minimal CSS for what Tailwind can't express
*/
-@import "./tokens.css";
-@import "./reset.css";
-@import "./animations.css";
-@import "./layout.css";
-@import "./hero.css";
-@import "./buttons.css";
-@import "./cards.css";
-@import "./gallery.css";
+@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 "./solution-section.css";
@import "./skill-demos.css";
+@import "./gallery.css";
@import "./workflow.css";
-@import "./footer.css";
diff --git a/public/css/problem-section.css b/public/css/problem-section.css
index 9149e44a5..e33dd5724 100644
--- a/public/css/problem-section.css
+++ b/public/css/problem-section.css
@@ -4,19 +4,19 @@
*/
.problem-section {
- padding: var(--s-2xl) 0;
- border-top: 1px solid var(--c-mist);
+ padding: var(--spacing-2xl) 0;
+ border-top: 1px solid var(--color-mist);
}
.problem-grid {
display: grid;
grid-template-columns: 1fr 1fr;
- gap: var(--s-2xl);
+ gap: var(--spacing-2xl);
align-items: center;
@media (max-width: 968px) {
grid-template-columns: 1fr;
- gap: var(--s-xl);
+ gap: var(--spacing-xl);
}
}
@@ -25,13 +25,13 @@
}
.problem-content .section-title {
- margin-bottom: var(--s-md);
+ margin-bottom: var(--spacing-md);
}
.problem-lead {
font-size: 1.25rem;
line-height: 1.6;
- color: var(--c-charcoal);
+ color: var(--color-charcoal);
}
/* AI Slop Demo - Deliberately generic design */
@@ -124,10 +124,10 @@
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.08em;
- color: var(--c-accent);
- background: var(--c-paper);
+ color: var(--color-accent);
+ background: var(--color-paper);
padding: 4px 8px;
- border: 1px solid var(--c-accent);
+ border: 1px solid var(--color-accent);
border-radius: 2px;
white-space: nowrap;
opacity: 0;
diff --git a/public/css/reset.css b/public/css/reset.css
deleted file mode 100644
index 0eea8f9c1..000000000
--- a/public/css/reset.css
+++ /dev/null
@@ -1,71 +0,0 @@
-/* Modern CSS Reset */
-
-*,
-*::before,
-*::after {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
-}
-
-html {
- font-size: 16px;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
- text-rendering: optimizeLegibility;
-}
-
-body {
- font-family: var(--font-body);
- font-weight: 400;
- font-size: 1rem;
- line-height: 1.6;
- color: var(--c-ink);
- background: var(--c-paper);
- overflow-x: hidden;
- min-height: 100vh;
-}
-
-/* Typography Defaults */
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
- font-family: var(--font-display);
- font-weight: 600;
- line-height: 1.1;
- letter-spacing: -0.02em;
-}
-
-p {
- max-width: 65ch;
-}
-
-a {
- color: var(--c-accent);
- text-decoration: none;
- transition: opacity var(--duration-fast) var(--ease-out);
-
- &:hover {
- opacity: 0.7;
- }
-}
-
-/* Better image defaults */
-img,
-picture,
-video,
-canvas,
-svg {
- display: block;
- max-width: 100%;
-}
-
-/* Remove default button styles */
-button {
- font: inherit;
- cursor: pointer;
-}
-
diff --git a/public/css/skill-demos.css b/public/css/skill-demos.css
index 4eb08022b..21a335678 100644
--- a/public/css/skill-demos.css
+++ b/public/css/skill-demos.css
@@ -14,30 +14,30 @@
.demo-tabs {
display: flex;
gap: 2px;
- margin-bottom: var(--s-sm);
+ margin-bottom: var(--spacing-sm);
justify-content: center;
}
.demo-tab {
- padding: var(--s-xs) var(--s-md);
+ padding: var(--spacing-xs) var(--spacing-md);
background: transparent;
border: none;
border-bottom: 2px solid transparent;
font-family: var(--font-body);
font-size: 0.8125rem;
font-weight: 400;
- color: var(--c-ash);
+ color: var(--color-ash);
cursor: pointer;
transition: all 0.15s ease;
}
.demo-tab:hover {
- color: var(--c-text);
+ color: var(--color-text);
}
.demo-tab.active {
- color: var(--c-accent);
- border-bottom-color: var(--c-accent);
+ color: var(--color-accent);
+ border-bottom-color: var(--color-accent);
font-weight: 500;
}
@@ -58,8 +58,8 @@
============================================ */
.demo-container {
- background: var(--c-paper);
- border: 1px solid var(--c-mist);
+ background: var(--color-paper);
+ border: 1px solid var(--color-mist);
border-radius: 6px;
overflow: hidden;
}
@@ -68,16 +68,16 @@
display: flex;
align-items: center;
justify-content: flex-end;
- padding: var(--s-xs) var(--s-md);
- background: var(--c-bg);
- border-bottom: 1px solid var(--c-mist);
+ padding: var(--spacing-xs) var(--spacing-md);
+ background: var(--color-bg);
+ border-bottom: 1px solid var(--color-mist);
min-height: 40px;
}
.demo-toggle {
display: flex;
align-items: center;
- gap: var(--s-sm);
+ gap: var(--spacing-sm);
}
.demo-toggle-label {
@@ -85,19 +85,19 @@
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.05em;
- color: var(--c-ash);
+ color: var(--color-ash);
transition: color 0.15s ease;
}
.demo-toggle-label.active {
- color: var(--c-accent);
+ color: var(--color-accent);
}
.demo-toggle-switch {
position: relative;
width: 36px;
height: 20px;
- background: var(--c-mist);
+ background: var(--color-mist);
border-radius: 10px;
cursor: pointer;
transition: background 0.15s ease;
@@ -110,14 +110,14 @@
left: 2px;
width: 16px;
height: 16px;
- background: var(--c-paper);
+ background: var(--color-paper);
border-radius: 50%;
box-shadow: 0 1px 3px rgba(0,0,0,0.2);
transition: transform 0.15s ease;
}
.demo-toggle-switch.active {
- background: var(--c-accent);
+ background: var(--color-accent);
}
.demo-toggle-switch.active::after {
@@ -125,20 +125,20 @@
}
.demo-viewport {
- padding: var(--s-lg);
+ padding: var(--spacing-lg);
display: flex;
align-items: center;
justify-content: center;
min-height: 200px;
- background: var(--c-bg);
+ background: var(--color-bg);
}
.demo-caption {
- padding: var(--s-xs) var(--s-md);
+ padding: var(--spacing-xs) var(--spacing-md);
font-size: 0.75rem;
- color: var(--c-ash);
- border-top: 1px solid var(--c-mist);
- background: var(--c-bg);
+ color: var(--color-ash);
+ border-top: 1px solid var(--color-mist);
+ background: var(--color-bg);
text-align: center;
}
@@ -149,39 +149,39 @@
.uxw-demo {
width: 100%;
max-width: 320px;
- padding: var(--s-lg);
- background: var(--c-paper);
- border: 1px solid var(--c-mist);
+ padding: var(--spacing-lg);
+ background: var(--color-paper);
+ border: 1px solid var(--color-mist);
border-radius: 6px;
text-align: center;
}
/* Error Messages */
-.uxw-error-icon { font-size: 2rem; margin-bottom: var(--s-sm); }
-.uxw-error-title { font-weight: 600; color: #c00; margin-bottom: var(--s-xs); }
-.uxw-error-text { font-size: 0.875rem; color: var(--c-ash); }
-.uxw-error-action { margin-top: var(--s-sm); font-size: 0.875rem; color: var(--c-accent); cursor: pointer; text-decoration: underline; }
+.uxw-error-icon { font-size: 2rem; margin-bottom: var(--spacing-sm); }
+.uxw-error-title { font-weight: 600; color: #c00; margin-bottom: var(--spacing-xs); }
+.uxw-error-text { font-size: 0.875rem; color: var(--color-ash); }
+.uxw-error-action { margin-top: var(--spacing-sm); font-size: 0.875rem; color: var(--color-accent); cursor: pointer; text-decoration: underline; }
-.uxw-error-after .uxw-error-icon { color: var(--c-accent); }
-.uxw-error-after .uxw-error-title { color: var(--c-text); }
-.uxw-error-after .uxw-error-text { color: var(--c-charcoal); }
+.uxw-error-after .uxw-error-icon { color: var(--color-accent); }
+.uxw-error-after .uxw-error-title { color: var(--color-text); }
+.uxw-error-after .uxw-error-text { color: var(--color-charcoal); }
/* Button Labels */
-.uxw-button-context { font-size: 0.875rem; color: var(--c-charcoal); margin-bottom: var(--s-md); font-weight: 500; }
-.uxw-button-row { display: flex; gap: var(--s-sm); justify-content: center; }
-.uxw-btn { padding: var(--s-xs) var(--s-md); border-radius: 4px; font-size: 0.875rem; font-weight: 500; cursor: pointer; border: none; }
-.uxw-btn-primary { background: var(--c-text); color: var(--c-paper); }
-.uxw-btn-secondary { background: transparent; color: var(--c-ash); border: 1px solid var(--c-mist); }
+.uxw-button-context { font-size: 0.875rem; color: var(--color-charcoal); margin-bottom: var(--spacing-md); font-weight: 500; }
+.uxw-button-row { display: flex; gap: var(--spacing-sm); justify-content: center; }
+.uxw-btn { padding: var(--spacing-xs) var(--spacing-md); border-radius: 4px; font-size: 0.875rem; font-weight: 500; cursor: pointer; border: none; }
+.uxw-btn-primary { background: var(--color-text); color: var(--color-paper); }
+.uxw-btn-secondary { background: transparent; color: var(--color-ash); border: 1px solid var(--color-mist); }
.uxw-btn-danger { background: #c00; color: white; }
/* Empty States */
-.uxw-empty-icon { font-size: 2.5rem; margin-bottom: var(--s-sm); opacity: 0.4; }
-.uxw-empty-title { font-weight: 500; color: var(--c-ash); }
-.uxw-empty-text { font-size: 0.875rem; color: var(--c-charcoal); margin-top: var(--s-xs); }
-.uxw-empty-action { margin-top: var(--s-md); }
+.uxw-empty-icon { font-size: 2.5rem; margin-bottom: var(--spacing-sm); opacity: 0.4; }
+.uxw-empty-title { font-weight: 500; color: var(--color-ash); }
+.uxw-empty-text { font-size: 0.875rem; color: var(--color-charcoal); margin-top: var(--spacing-xs); }
+.uxw-empty-action { margin-top: var(--spacing-md); }
.uxw-empty-after .uxw-empty-icon { opacity: 1; }
-.uxw-empty-after .uxw-empty-title { color: var(--c-text); }
+.uxw-empty-after .uxw-empty-title { color: var(--color-text); }
/* ============================================
SPATIAL DESIGN DEMOS
@@ -190,9 +190,9 @@
.spatial-demo {
width: 100%;
max-width: 340px;
- padding: var(--s-md);
- background: var(--c-paper);
- border: 1px solid var(--c-mist);
+ padding: var(--spacing-md);
+ background: var(--color-paper);
+ border: 1px solid var(--color-mist);
border-radius: 6px;
}
@@ -206,16 +206,16 @@
.spatial-grid-after {
display: grid;
grid-template-columns: 1fr 1fr;
- gap: var(--s-sm);
+ gap: var(--spacing-sm);
}
.spatial-card-item {
- padding: var(--s-sm);
- background: var(--c-bg);
- border: 1px solid var(--c-mist);
+ padding: var(--spacing-sm);
+ background: var(--color-bg);
+ border: 1px solid var(--color-mist);
border-radius: 4px;
font-size: 0.8125rem;
- color: var(--c-charcoal);
+ color: var(--color-charcoal);
text-align: center;
}
@@ -229,8 +229,8 @@
.spatial-hierarchy-before .spatial-h-cta,
.spatial-hierarchy-before .spatial-h-link {
font-size: 0.9375rem;
- margin-bottom: var(--s-xs);
- color: var(--c-charcoal);
+ margin-bottom: var(--spacing-xs);
+ color: var(--color-charcoal);
}
.spatial-hierarchy-after .spatial-h-title {
@@ -238,52 +238,52 @@
font-size: 1.75rem;
font-weight: 300;
font-style: italic;
- margin-bottom: var(--s-xs);
- color: var(--c-text);
+ margin-bottom: var(--spacing-xs);
+ color: var(--color-text);
}
.spatial-hierarchy-after .spatial-h-subtitle {
font-size: 0.6875rem;
text-transform: uppercase;
letter-spacing: 0.1em;
- color: var(--c-ash);
- margin-bottom: var(--s-md);
+ color: var(--color-ash);
+ margin-bottom: var(--spacing-md);
}
.spatial-hierarchy-after .spatial-h-cta {
display: inline-block;
- padding: var(--s-sm) var(--s-lg);
- background: var(--c-text);
- color: var(--c-paper);
+ padding: var(--spacing-sm) var(--spacing-lg);
+ background: var(--color-text);
+ color: var(--color-paper);
font-size: 0.875rem;
font-weight: 500;
border-radius: 4px;
- margin-bottom: var(--s-sm);
+ margin-bottom: var(--spacing-sm);
}
.spatial-hierarchy-after .spatial-h-link {
font-size: 0.75rem;
- color: var(--c-ash);
+ color: var(--color-ash);
}
/* Whitespace */
.spatial-whitespace-before {
- padding: var(--s-xs) !important;
+ padding: var(--spacing-xs) !important;
}
.spatial-whitespace-before .spatial-ws-title { font-size: 1rem; font-weight: 600; margin-bottom: 2px; }
-.spatial-whitespace-before .spatial-ws-price { font-size: 0.875rem; color: var(--c-ash); margin-bottom: 4px; }
-.spatial-whitespace-before .spatial-ws-features { font-size: 0.75rem; color: var(--c-ash); margin-bottom: 6px; }
-.spatial-whitespace-before .spatial-ws-btn { width: 100%; padding: 6px; font-size: 0.75rem; background: var(--c-text); color: var(--c-paper); border: none; border-radius: 3px; cursor: pointer; }
+.spatial-whitespace-before .spatial-ws-price { font-size: 0.875rem; color: var(--color-ash); margin-bottom: 4px; }
+.spatial-whitespace-before .spatial-ws-features { font-size: 0.75rem; color: var(--color-ash); margin-bottom: 6px; }
+.spatial-whitespace-before .spatial-ws-btn { width: 100%; padding: 6px; font-size: 0.75rem; background: var(--color-text); color: var(--color-paper); border: none; border-radius: 3px; cursor: pointer; }
.spatial-whitespace-after {
- padding: var(--s-lg) !important;
+ padding: var(--spacing-lg) !important;
}
-.spatial-whitespace-after .spatial-ws-title { font-family: var(--font-display); font-size: 1.5rem; font-weight: 400; margin-bottom: var(--s-sm); }
-.spatial-whitespace-after .spatial-ws-price { font-size: 1.25rem; font-weight: 600; color: var(--c-text); margin-bottom: var(--s-sm); }
-.spatial-whitespace-after .spatial-ws-features { font-size: 0.8125rem; color: var(--c-ash); margin-bottom: var(--s-lg); line-height: 1.6; }
-.spatial-whitespace-after .spatial-ws-btn { width: 100%; padding: var(--s-sm); font-size: 0.875rem; background: var(--c-text); color: var(--c-paper); border: none; border-radius: 4px; cursor: pointer; font-weight: 500; }
+.spatial-whitespace-after .spatial-ws-title { font-family: var(--font-display); font-size: 1.5rem; font-weight: 400; margin-bottom: var(--spacing-sm); }
+.spatial-whitespace-after .spatial-ws-price { font-size: 1.25rem; font-weight: 600; color: var(--color-text); margin-bottom: var(--spacing-sm); }
+.spatial-whitespace-after .spatial-ws-features { font-size: 0.8125rem; color: var(--color-ash); margin-bottom: var(--spacing-lg); line-height: 1.6; }
+.spatial-whitespace-after .spatial-ws-btn { width: 100%; padding: var(--spacing-sm); font-size: 0.875rem; background: var(--color-text); color: var(--color-paper); border: none; border-radius: 4px; cursor: pointer; font-weight: 500; }
/* ============================================
MOTION DESIGN DEMOS
@@ -293,7 +293,7 @@
display: flex;
flex-direction: column;
align-items: center;
- gap: var(--s-sm);
+ gap: var(--spacing-sm);
width: 100%;
max-width: 280px;
}
@@ -306,19 +306,19 @@
.motion-list-item {
display: flex;
align-items: center;
- gap: var(--s-sm);
- padding: var(--s-sm) var(--s-md);
- background: var(--c-bg);
- border: 1px solid var(--c-mist);
+ gap: var(--spacing-sm);
+ padding: var(--spacing-sm) var(--spacing-md);
+ background: var(--color-bg);
+ border: 1px solid var(--color-mist);
border-radius: 4px;
font-size: 0.875rem;
- color: var(--c-charcoal);
+ color: var(--color-charcoal);
}
.motion-dot {
width: 8px;
height: 8px;
- background: var(--c-accent);
+ background: var(--color-accent);
border-radius: 50%;
}
@@ -348,13 +348,13 @@
}
.motion-btn-before {
- background: var(--c-charcoal);
- color: var(--c-paper);
+ background: var(--color-charcoal);
+ color: var(--color-paper);
}
.motion-btn-after {
- background: var(--c-text);
- color: var(--c-paper);
+ background: var(--color-text);
+ color: var(--color-paper);
transition: transform 0.2s cubic-bezier(0.34, 1.56, 0.64, 1), box-shadow 0.2s ease;
}
@@ -369,24 +369,24 @@
/* State Transitions */
.motion-card {
- padding: var(--s-md);
- background: var(--c-bg);
- border: 1px solid var(--c-mist);
+ padding: var(--spacing-md);
+ background: var(--color-bg);
+ border: 1px solid var(--color-mist);
border-radius: 6px;
text-align: center;
min-width: 140px;
}
-.motion-card-icon { font-size: 1.5rem; margin-bottom: var(--s-xs); }
-.motion-card-text { font-size: 0.8125rem; color: var(--c-charcoal); }
+.motion-card-icon { font-size: 1.5rem; margin-bottom: var(--spacing-xs); }
+.motion-card-text { font-size: 0.8125rem; color: var(--color-charcoal); }
.motion-card-after {
transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
}
.demo-viewport[data-state="after"] .motion-card-after {
- background: color-mix(in oklch, var(--c-accent) 10%, var(--c-paper));
- border-color: var(--c-accent);
+ background: color-mix(in oklch, var(--color-accent) 10%, var(--color-paper));
+ border-color: var(--color-accent);
}
.demo-viewport[data-state="after"] .motion-card-after .motion-card-icon {
@@ -415,13 +415,13 @@
.typo-pairing-before .typo-heading {
font-size: 1.5rem;
font-weight: 600;
- margin-bottom: var(--s-xs);
+ margin-bottom: var(--spacing-xs);
}
.typo-pairing-before .typo-body {
font-size: 0.9375rem;
line-height: 1.5;
- color: var(--c-ash);
+ color: var(--color-ash);
}
.typo-pairing-after .typo-heading {
@@ -430,21 +430,21 @@
font-weight: 300;
font-style: italic;
letter-spacing: -0.02em;
- margin-bottom: var(--s-sm);
- color: var(--c-text);
+ margin-bottom: var(--spacing-sm);
+ color: var(--color-text);
}
.typo-pairing-after .typo-body {
font-family: var(--font-body);
font-size: 0.9375rem;
line-height: 1.7;
- color: var(--c-charcoal);
+ color: var(--color-charcoal);
}
/* Hierarchy */
.typo-hierarchy-before .typo-h1 { font-size: 1.125rem; font-weight: 600; margin-bottom: 4px; }
-.typo-hierarchy-before .typo-meta { font-size: 0.9375rem; color: var(--c-ash); margin-bottom: var(--s-xs); }
-.typo-hierarchy-before .typo-p { font-size: 0.875rem; line-height: 1.5; color: var(--c-charcoal); }
+.typo-hierarchy-before .typo-meta { font-size: 0.9375rem; color: var(--color-ash); margin-bottom: var(--spacing-xs); }
+.typo-hierarchy-before .typo-p { font-size: 0.875rem; line-height: 1.5; color: var(--color-charcoal); }
.typo-hierarchy-after .typo-h1 {
font-family: var(--font-display);
@@ -459,14 +459,14 @@
font-size: 0.6875rem;
text-transform: uppercase;
letter-spacing: 0.12em;
- color: var(--c-accent);
- margin-bottom: var(--s-md);
+ color: var(--color-accent);
+ margin-bottom: var(--spacing-md);
}
.typo-hierarchy-after .typo-p {
font-size: 0.9375rem;
line-height: 1.7;
- color: var(--c-ash);
+ color: var(--color-ash);
}
/* ============================================
@@ -476,33 +476,33 @@
.int-demo {
display: flex;
flex-direction: column;
- gap: var(--s-md);
+ gap: var(--spacing-md);
width: 100%;
max-width: 280px;
}
/* Button States */
.int-states-demo {
- gap: var(--s-lg);
+ gap: var(--spacing-lg);
}
.int-state-row {
display: flex;
align-items: center;
- gap: var(--s-md);
+ gap: var(--spacing-md);
}
.int-state-label {
font-size: 0.6875rem;
text-transform: uppercase;
letter-spacing: 0.08em;
- color: var(--c-ash);
+ color: var(--color-ash);
width: 40px;
}
.int-btn {
flex: 1;
- padding: var(--s-sm) var(--s-md);
+ padding: var(--spacing-sm) var(--spacing-md);
font-size: 0.875rem;
font-weight: 500;
border-radius: 4px;
@@ -510,26 +510,26 @@
}
.int-btn-poor {
- background: var(--c-charcoal);
- color: var(--c-paper);
+ background: var(--color-charcoal);
+ color: var(--color-paper);
border: none;
}
.int-btn-good {
- background: var(--c-text);
- color: var(--c-paper);
+ background: var(--color-text);
+ color: var(--color-paper);
border: 2px solid transparent;
transition: all 0.15s ease;
}
.int-btn-good:hover {
- background: var(--c-charcoal);
+ background: var(--color-charcoal);
}
.int-btn-good:focus {
outline: none;
- border-color: var(--c-accent);
- box-shadow: 0 0 0 3px color-mix(in oklch, var(--c-accent) 25%, transparent);
+ border-color: var(--color-accent);
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-accent) 25%, transparent);
}
.int-btn-good:active {
@@ -538,18 +538,18 @@
/* Affordances */
.int-aff-item {
- padding: var(--s-sm) var(--s-md);
+ padding: var(--spacing-sm) var(--spacing-md);
border-radius: 4px;
font-size: 0.875rem;
cursor: pointer;
}
.int-aff-poor {
- color: var(--c-charcoal);
+ color: var(--color-charcoal);
}
.int-aff-good {
- color: var(--c-accent);
+ color: var(--color-accent);
text-decoration: underline;
text-underline-offset: 2px;
}
@@ -559,16 +559,16 @@
}
.int-affordance-after .int-aff-item {
- background: var(--c-bg);
- border: 1px solid var(--c-mist);
- color: var(--c-accent);
+ background: var(--color-bg);
+ border: 1px solid var(--color-mist);
+ color: var(--color-accent);
text-decoration: underline;
text-underline-offset: 2px;
transition: background 0.15s ease;
}
.int-affordance-after .int-aff-item:hover {
- background: color-mix(in oklch, var(--c-accent) 5%, var(--c-paper));
+ background: color-mix(in oklch, var(--color-accent) 5%, var(--color-paper));
}
.int-affordance-after .int-aff-item::after {
@@ -580,7 +580,7 @@
.int-feedback-after {
display: flex;
align-items: center;
- gap: var(--s-md);
+ gap: var(--spacing-md);
flex-direction: row;
}
@@ -601,13 +601,13 @@
}
.int-fb-silent {
- background: var(--c-mist);
- color: var(--c-ash);
+ background: var(--color-mist);
+ color: var(--color-ash);
}
.int-fb-active {
- background: var(--c-charcoal);
- color: var(--c-paper);
+ background: var(--color-charcoal);
+ color: var(--color-paper);
transition: all 0.15s cubic-bezier(0.34, 1.56, 0.64, 1);
}
@@ -620,7 +620,7 @@
}
.int-fb-active.liked {
- background: var(--c-accent);
+ background: var(--color-accent);
animation: heartPop 0.35s cubic-bezier(0.34, 1.56, 0.64, 1);
}
@@ -630,7 +630,7 @@
.int-fb-label {
font-size: 0.875rem;
- color: var(--c-charcoal);
+ color: var(--color-charcoal);
}
/* ============================================
@@ -647,10 +647,10 @@
.color-palette-after {
display: flex;
flex-wrap: wrap;
- gap: var(--s-xs);
- padding: var(--s-md);
- background: var(--c-paper);
- border: 1px solid var(--c-mist);
+ gap: var(--spacing-xs);
+ padding: var(--spacing-md);
+ background: var(--color-paper);
+ border: 1px solid var(--color-mist);
border-radius: 6px;
}
@@ -663,10 +663,10 @@
.color-card {
width: 100%;
- margin-top: var(--s-sm);
- padding: var(--s-sm);
- background: var(--c-paper);
- border: 1px solid var(--c-mist);
+ margin-top: var(--spacing-sm);
+ padding: var(--spacing-sm);
+ background: var(--color-paper);
+ border: 1px solid var(--color-mist);
border-radius: 4px;
display: flex;
flex-direction: column;
@@ -687,18 +687,18 @@
.color-palette-before .card-btn { background: #ffe66d; color: #333; }
/* After - Harmonious palette */
-.color-palette-after .swatch-1 { background: var(--c-text); }
-.color-palette-after .swatch-2 { background: var(--c-charcoal); }
-.color-palette-after .swatch-3 { background: var(--c-ash); }
-.color-palette-after .swatch-4 { background: var(--c-mist); }
-.color-palette-after .swatch-5 { background: var(--c-accent); }
-.color-palette-after .card-title { color: var(--c-text); }
-.color-palette-after .card-subtitle { color: var(--c-ash); }
-.color-palette-after .card-btn { background: var(--c-accent); color: var(--c-paper); }
+.color-palette-after .swatch-1 { background: var(--color-text); }
+.color-palette-after .swatch-2 { background: var(--color-charcoal); }
+.color-palette-after .swatch-3 { background: var(--color-ash); }
+.color-palette-after .swatch-4 { background: var(--color-mist); }
+.color-palette-after .swatch-5 { background: var(--color-accent); }
+.color-palette-after .card-title { color: var(--color-text); }
+.color-palette-after .card-subtitle { color: var(--color-ash); }
+.color-palette-after .card-btn { background: var(--color-accent); color: var(--color-paper); }
/* Strategic Accent */
.color-accent-card {
- padding: var(--s-md);
+ padding: var(--spacing-md);
border-radius: 6px;
}
@@ -708,27 +708,27 @@
}
.color-accent-before .color-accent-title { font-weight: 600; color: #333; margin-bottom: 4px; }
-.color-accent-before .color-accent-text { font-size: 0.8125rem; color: #666; margin-bottom: var(--s-sm); }
-.color-accent-before .color-accent-btn { width: 100%; padding: var(--s-xs); background: #333; color: white; border: none; border-radius: 4px; font-size: 0.8125rem; cursor: pointer; }
+.color-accent-before .color-accent-text { font-size: 0.8125rem; color: #666; margin-bottom: var(--spacing-sm); }
+.color-accent-before .color-accent-btn { width: 100%; padding: var(--spacing-xs); background: #333; color: white; border: none; border-radius: 4px; font-size: 0.8125rem; cursor: pointer; }
.color-accent-after .color-accent-card {
- background: color-mix(in oklch, var(--c-accent) 8%, var(--c-paper));
- border: 1px solid color-mix(in oklch, var(--c-accent) 20%, var(--c-paper));
+ background: color-mix(in oklch, var(--color-accent) 8%, var(--color-paper));
+ border: 1px solid color-mix(in oklch, var(--color-accent) 20%, var(--color-paper));
}
-.color-accent-after .color-accent-title { font-weight: 600; color: var(--c-text); margin-bottom: 4px; }
-.color-accent-after .color-accent-text { font-size: 0.8125rem; color: var(--c-ash); margin-bottom: var(--s-sm); }
-.color-accent-after .color-accent-btn { width: 100%; padding: var(--s-xs); background: var(--c-accent); color: var(--c-paper); border: none; border-radius: 4px; font-size: 0.8125rem; font-weight: 500; cursor: pointer; }
+.color-accent-after .color-accent-title { font-weight: 600; color: var(--color-text); margin-bottom: 4px; }
+.color-accent-after .color-accent-text { font-size: 0.8125rem; color: var(--color-ash); margin-bottom: var(--spacing-sm); }
+.color-accent-after .color-accent-btn { width: 100%; padding: var(--spacing-xs); background: var(--color-accent); color: var(--color-paper); border: none; border-radius: 4px; font-size: 0.8125rem; font-weight: 500; cursor: pointer; }
/* Contrast Ratios */
.color-contrast-static {
display: flex;
flex-direction: column;
- gap: var(--s-sm);
+ gap: var(--spacing-sm);
}
.contrast-example {
- padding: var(--s-md);
+ padding: var(--spacing-md);
border-radius: 6px;
text-align: center;
}
@@ -739,8 +739,8 @@
}
.contrast-pass {
- background: var(--c-charcoal);
- color: var(--c-paper);
+ background: var(--color-charcoal);
+ color: var(--color-paper);
}
.contrast-badge {
@@ -755,7 +755,7 @@
}
.contrast-fail .contrast-badge { background: #ddd; }
-.contrast-pass .contrast-badge { background: var(--c-accent); color: var(--c-paper); }
+.contrast-pass .contrast-badge { background: var(--color-accent); color: var(--color-paper); }
.contrast-text { font-size: 1rem; font-weight: 500; margin-bottom: 2px; }
.contrast-ratio { font-size: 0.6875rem; opacity: 0.7; }
@@ -773,20 +773,20 @@
.resp-touch-demo {
display: flex;
flex-direction: column;
- gap: var(--s-lg);
+ gap: var(--spacing-lg);
}
.resp-touch-row {
display: flex;
align-items: center;
- gap: var(--s-md);
+ gap: var(--spacing-md);
}
.resp-label {
font-size: 0.6875rem;
text-transform: uppercase;
letter-spacing: 0.08em;
- color: var(--c-ash);
+ color: var(--color-ash);
width: 70px;
}
@@ -806,36 +806,36 @@
width: 24px;
height: 24px;
font-size: 0.75rem;
- background: var(--c-mist);
- color: var(--c-ash);
+ background: var(--color-mist);
+ color: var(--color-ash);
}
.resp-touch-good button {
width: 44px;
height: 44px;
font-size: 1rem;
- background: var(--c-text);
- color: var(--c-paper);
+ background: var(--color-text);
+ color: var(--color-paper);
}
/* Fluid Layout */
.resp-fluid-demo {
- padding: var(--s-md);
- background: var(--c-bg);
- border: 1px solid var(--c-mist);
+ padding: var(--spacing-md);
+ background: var(--color-bg);
+ border: 1px solid var(--color-mist);
border-radius: 6px;
}
.resp-fluid-container {
display: flex;
flex-direction: column;
- gap: var(--s-md);
+ gap: var(--spacing-md);
}
.resp-fluid-fixed,
.resp-fluid-adaptive {
font-size: 0.75rem;
- color: var(--c-ash);
+ color: var(--color-ash);
}
.resp-fluid-fixed span,
@@ -846,18 +846,18 @@
.resp-fluid-bar {
height: 24px;
- background: var(--c-mist);
+ background: var(--color-mist);
border-radius: 4px;
}
.resp-fluid-adaptive .resp-fluid-bar {
- background: var(--c-accent);
+ background: var(--color-accent);
}
/* Adaptive Content */
.resp-adapt-demo {
display: flex;
- gap: var(--s-sm);
+ gap: var(--spacing-sm);
align-items: flex-end;
}
@@ -869,14 +869,14 @@
display: block;
margin-top: 4px;
font-size: 0.625rem;
- color: var(--c-ash);
+ color: var(--color-ash);
text-transform: uppercase;
letter-spacing: 0.08em;
}
.resp-device-screen {
- background: var(--c-paper);
- border: 2px solid var(--c-mist);
+ background: var(--color-paper);
+ border: 2px solid var(--color-mist);
border-radius: 4px;
padding: 4px;
display: flex;
@@ -889,7 +889,7 @@
.resp-device-desktop .resp-device-screen { width: 120px; height: 70px; }
.resp-block {
- background: var(--c-mist);
+ background: var(--color-mist);
border-radius: 2px;
}
@@ -899,8 +899,8 @@
flex: 1;
}
-.resp-header { height: 16px; background: var(--c-charcoal); }
-.resp-sidebar { width: 30%; background: var(--c-charcoal); }
+.resp-header { height: 16px; background: var(--color-charcoal); }
+.resp-sidebar { width: 30%; background: var(--color-charcoal); }
.resp-content { flex: 1; }
/* ============================================
diff --git a/public/css/solution-section.css b/public/css/solution-section.css
deleted file mode 100644
index da34d1f9b..000000000
--- a/public/css/solution-section.css
+++ /dev/null
@@ -1,96 +0,0 @@
-/**
- * Solution Section - Skills + Commands explanation
- */
-
-.solution-section {
- padding: var(--s-2xl) 0;
- border-top: 1px solid var(--c-mist);
-}
-
-.solution-grid {
- display: grid;
- grid-template-columns: 1fr;
- gap: var(--s-xl);
-}
-
-.solution-content {
- max-width: 680px;
-}
-
-.solution-content .section-title {
- margin-bottom: var(--s-md);
-}
-
-.solution-lead {
- font-size: 1.375rem;
- line-height: 1.6;
- color: var(--c-charcoal);
-}
-
-.solution-lead strong {
- color: var(--c-text);
- font-weight: 600;
-}
-
-/* Solution Cards - Side by side */
-.solution-cards {
- display: grid;
- grid-template-columns: repeat(2, 1fr);
- gap: var(--s-lg);
-
- @media (max-width: 640px) {
- grid-template-columns: 1fr;
- }
-}
-
-.solution-card {
- padding: var(--s-lg);
- background: var(--c-paper);
- border-left: 3px solid var(--c-accent);
- transition: all var(--duration-base) var(--ease-out);
-}
-
-.solution-card:hover {
- background: color-mix(in oklch, var(--c-paper) 90%, var(--c-accent));
- transform: translateX(4px);
-}
-
-.solution-icon {
- width: 48px;
- height: 48px;
- display: flex;
- align-items: center;
- justify-content: center;
- margin-bottom: var(--s-md);
- color: var(--c-accent);
-}
-
-.solution-card h3 {
- font-family: var(--font-display);
- font-size: 1.75rem;
- font-weight: 400;
- margin: 0 0 var(--s-sm) 0;
- color: var(--c-text);
-}
-
-.solution-card p {
- font-size: 1rem;
- line-height: 1.6;
- color: var(--c-ash);
- margin: 0;
-}
-
-.solution-card code {
- font-family: 'Space Grotesk', monospace;
- font-size: 0.875em;
- background: color-mix(in oklch, var(--c-accent) 15%, transparent);
- color: var(--c-accent);
- padding: 0.125em 0.375em;
- border-radius: 3px;
-}
-
-.solution-card em {
- font-style: italic;
- color: var(--c-charcoal);
-}
-
diff --git a/public/css/tokens.css b/public/css/tokens.css
deleted file mode 100644
index 61d6f0fd8..000000000
--- a/public/css/tokens.css
+++ /dev/null
@@ -1,66 +0,0 @@
-/* Design Tokens — Single Source of Truth */
-
-:root {
- /* Typography Scale */
- --font-display: 'Cormorant Garamond', Georgia, serif;
- --font-body: 'Instrument Sans', system-ui, sans-serif;
-
- /* Base Colors — Refined Monochrome + Electric Accent */
- --c-ink: oklch(10% 0 0);
- --c-paper: oklch(98% 0 0);
- --c-charcoal: oklch(25% 0 0);
- --c-ash: oklch(55% 0 0);
- --c-mist: oklch(92% 0 0);
-
- /* Semantic aliases for common use */
- --c-text: var(--c-ink);
- --c-bg: oklch(96% 0.005 350); /* Very subtle pink tint */
-
- /* Accent — Vibrant Electric Pink using OKLCH for perceptual uniformity */
- --c-accent: oklch(60% 0.25 350);
- --c-accent-hover: oklch(from var(--c-accent) calc(l - 8%) c h);
- --c-accent-dim: color-mix(in oklch, var(--c-accent), transparent 85%);
-
- /* Spacing Scale — 8px base unit */
- --s-unit: 8px;
- --s-xs: calc(var(--s-unit) * 1); /* 8px */
- --s-sm: calc(var(--s-unit) * 2); /* 16px */
- --s-md: calc(var(--s-unit) * 3); /* 24px */
- --s-lg: calc(var(--s-unit) * 6); /* 48px */
- --s-xl: calc(var(--s-unit) * 10); /* 80px */
- --s-2xl: calc(var(--s-unit) * 16); /* 128px */
- --s-3xl: calc(var(--s-unit) * 24); /* 192px */
-
- /* Layout Constraints */
- --max-width: 1280px;
- --content-width: 840px;
-
- /* Animation Curves */
- --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;
-
- /* Shadows */
- --shadow-sm: 0 1px 2px color-mix(in oklch, var(--c-ink), transparent 90%);
- --shadow-md: 0 4px 8px color-mix(in oklch, var(--c-ink), transparent 85%);
-}
-
-/* Dark Mode — Automatic via prefers-color-scheme */
-@media (prefers-color-scheme: dark) {
- :root {
- --c-ink: oklch(98% 0 0);
- --c-paper: oklch(10% 0 0);
- --c-charcoal: oklch(92% 0 0);
- --c-ash: oklch(65% 0 0);
- --c-mist: oklch(20% 0 0);
- --c-accent: oklch(68% 0.23 350);
- --c-accent-hover: oklch(from var(--c-accent) calc(l + 8%) c h);
- --c-text: var(--c-ink);
- --c-bg: oklch(12% 0.005 350);
- }
-}
-
diff --git a/public/css/workflow.css b/public/css/workflow.css
index 76be59c66..357cf9004 100644
--- a/public/css/workflow.css
+++ b/public/css/workflow.css
@@ -14,7 +14,7 @@
display: flex;
flex-direction: column;
gap: 2px;
- margin-bottom: var(--s-sm);
+ margin-bottom: var(--spacing-sm);
&:last-child {
margin-bottom: 0;
@@ -26,10 +26,10 @@
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.08em;
- color: var(--c-ash);
- padding: var(--s-xs) var(--s-md);
+ color: var(--color-ash);
+ padding: var(--spacing-xs) var(--spacing-md);
margin-bottom: 2px;
- margin-top: var(--s-xs);
+ margin-top: var(--spacing-xs);
&:first-child {
margin-top: 0;
@@ -37,11 +37,11 @@
}
.command-nav-item {
- padding: var(--s-xs) var(--s-md);
+ padding: var(--spacing-xs) var(--spacing-md);
background: transparent;
border: none;
border-left: 2px solid transparent;
- color: var(--c-ash);
+ color: var(--color-ash);
font-family: 'Space Grotesk', monospace;
font-size: 0.875rem;
font-weight: 400;
@@ -52,14 +52,14 @@
}
.command-nav-item:hover {
- color: var(--c-text);
- background: color-mix(in oklch, var(--c-paper) 85%, var(--c-accent));
+ color: var(--color-text);
+ background: color-mix(in oklch, var(--color-paper) 85%, var(--color-accent));
}
.command-nav-item.active {
- color: var(--c-accent);
- border-left-color: var(--c-accent);
- background: color-mix(in oklch, var(--c-accent) 5%, var(--c-paper));
+ color: var(--color-accent);
+ border-left-color: var(--color-accent);
+ background: color-mix(in oklch, var(--color-accent) 5%, var(--color-paper));
font-weight: 500;
}
@@ -67,30 +67,30 @@
.commands-nav {
flex-direction: row;
flex-wrap: wrap;
- gap: var(--s-xs);
+ gap: var(--spacing-xs);
}
.command-nav-group {
flex-direction: row;
flex-wrap: wrap;
- gap: var(--s-xs);
- margin-bottom: var(--s-sm);
+ gap: var(--spacing-xs);
+ margin-bottom: var(--spacing-sm);
}
.command-nav-label {
width: 100%;
- padding: var(--s-xs) 0;
+ padding: var(--spacing-xs) 0;
margin-top: 0;
}
.command-nav-item {
border-left: none;
border-bottom: 2px solid transparent;
- padding: var(--s-xs) var(--s-sm);
+ padding: var(--spacing-xs) var(--spacing-sm);
}
.command-nav-item.active {
- border-bottom-color: var(--c-accent);
+ border-bottom-color: var(--color-accent);
}
}
@@ -98,7 +98,7 @@
.workflow-row {
display: flex;
align-items: center;
- gap: var(--s-md);
+ gap: var(--spacing-md);
flex-wrap: wrap;
}
@@ -107,20 +107,20 @@
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.1em;
- color: var(--c-ash);
+ color: var(--color-ash);
width: 120px;
flex-shrink: 0;
@media (max-width: 768px) {
width: 100%;
- margin-bottom: var(--s-xs);
+ margin-bottom: var(--spacing-xs);
}
}
.workflow-row-content {
display: flex;
align-items: center;
- gap: var(--s-sm);
+ gap: var(--spacing-sm);
flex-wrap: wrap;
}
@@ -130,35 +130,35 @@
align-items: center;
padding: 4px 10px;
background: transparent;
- border: 1px solid var(--c-mist);
+ border: 1px solid var(--color-mist);
border-radius: 3px;
font-family: 'Space Grotesk', monospace;
font-size: 0.8125rem;
font-weight: 500;
- color: var(--c-charcoal);
+ color: var(--color-charcoal);
cursor: pointer;
transition: all var(--duration-fast) var(--ease-out);
}
.workflow-node:hover {
- border-color: var(--c-accent);
- color: var(--c-accent);
- background: color-mix(in oklch, var(--c-accent) 5%, transparent);
+ border-color: var(--color-accent);
+ color: var(--color-accent);
+ background: color-mix(in oklch, var(--color-accent) 5%, transparent);
}
.workflow-node.active {
- background: var(--c-accent);
- border-color: var(--c-accent);
- color: var(--c-paper);
+ background: var(--color-accent);
+ border-color: var(--color-accent);
+ color: var(--color-paper);
}
/* Workflow Arrow */
.workflow-arrow {
display: flex;
align-items: center;
- color: var(--c-ash);
+ color: var(--color-ash);
font-size: 1.25rem;
- padding: 0 var(--s-xs);
+ padding: 0 var(--spacing-xs);
}
.workflow-arrow-bidirectional::before {
@@ -178,17 +178,17 @@
.workflow-group {
display: flex;
align-items: center;
- gap: var(--s-sm);
- padding: var(--s-sm);
- background: color-mix(in oklch, var(--c-paper) 50%, transparent);
- border: 1px dashed var(--c-mist);
+ gap: var(--spacing-sm);
+ padding: var(--spacing-sm);
+ background: color-mix(in oklch, var(--color-paper) 50%, transparent);
+ border: 1px dashed var(--color-mist);
border-radius: 4px;
}
.workflow-group-label {
font-size: 0.6875rem;
font-weight: 500;
- color: var(--c-ash);
+ color: var(--color-ash);
text-transform: uppercase;
letter-spacing: 0.05em;
writing-mode: vertical-lr;
@@ -198,7 +198,7 @@
writing-mode: horizontal-tb;
transform: none;
width: 100%;
- margin-bottom: var(--s-xs);
+ margin-bottom: var(--spacing-xs);
}
}
@@ -206,20 +206,20 @@
.workflow-production {
display: grid;
grid-template-columns: auto 1fr;
- gap: var(--s-md);
+ gap: var(--spacing-md);
align-items: start;
}
.workflow-production-stages {
display: flex;
flex-direction: column;
- gap: var(--s-sm);
+ gap: var(--spacing-sm);
}
.workflow-stage {
display: flex;
align-items: center;
- gap: var(--s-sm);
+ gap: var(--spacing-sm);
}
.workflow-stage-label {
@@ -227,21 +227,21 @@
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.08em;
- color: var(--c-ash);
+ color: var(--color-ash);
width: 80px;
}
.workflow-stage-nodes {
display: flex;
- gap: var(--s-xs);
+ gap: var(--spacing-xs);
flex-wrap: wrap;
}
/* Aesthetic Adjustments Section */
.workflow-aesthetics {
- border-top: 1px solid var(--c-mist);
- padding-top: var(--s-lg);
- margin-top: var(--s-sm);
+ border-top: 1px solid var(--color-mist);
+ padding-top: var(--spacing-lg);
+ margin-top: var(--spacing-sm);
}
.workflow-aesthetics-title {
@@ -249,26 +249,26 @@
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.1em;
- color: var(--c-ash);
- margin-bottom: var(--s-md);
+ color: var(--color-ash);
+ margin-bottom: var(--spacing-md);
}
.workflow-pairs {
display: flex;
flex-wrap: wrap;
- gap: var(--s-lg);
+ gap: var(--spacing-lg);
}
.workflow-pair {
display: flex;
align-items: center;
- gap: var(--s-sm);
+ gap: var(--spacing-sm);
}
/* Responsive */
@media (max-width: 768px) {
.workflow-container {
- padding: var(--s-md);
+ padding: var(--spacing-md);
}
.workflow-production {
@@ -282,15 +282,15 @@
.workflow-stage-label {
width: auto;
- margin-bottom: var(--s-xs);
+ margin-bottom: var(--spacing-xs);
}
}
/* Command Card in Grid */
.command-card {
- padding: var(--s-sm) var(--s-md);
- background: var(--c-paper);
- border: 1px solid var(--c-mist);
+ padding: var(--spacing-sm) var(--spacing-md);
+ background: var(--color-paper);
+ border: 1px solid var(--color-mist);
border-radius: 3px;
cursor: pointer;
transition: all var(--duration-fast) var(--ease-out);
@@ -298,27 +298,27 @@
}
.command-card:hover {
- border-color: var(--c-accent);
+ border-color: var(--color-accent);
transform: translateY(-2px);
- box-shadow: 0 4px 12px color-mix(in oklch, var(--c-accent) 10%, transparent);
+ box-shadow: 0 4px 12px color-mix(in oklch, var(--color-accent) 10%, transparent);
}
.command-card.active {
- border-color: var(--c-accent);
- background: color-mix(in oklch, var(--c-accent) 5%, var(--c-paper));
+ border-color: var(--color-accent);
+ background: color-mix(in oklch, var(--color-accent) 5%, var(--color-paper));
}
.command-card-name {
font-family: 'Space Grotesk', monospace;
font-size: 0.9375rem;
font-weight: 500;
- color: var(--c-text);
+ color: var(--color-text);
margin-bottom: 2px;
}
.command-card-desc {
font-size: 0.75rem;
- color: var(--c-ash);
+ color: var(--color-ash);
line-height: 1.4;
display: -webkit-box;
-webkit-line-clamp: 2;
@@ -334,9 +334,9 @@
text-transform: uppercase;
letter-spacing: 0.08em;
padding: 2px 6px;
- background: var(--c-mist);
- color: var(--c-ash);
+ background: var(--color-mist);
+ color: var(--color-ash);
border-radius: 2px;
- margin-top: var(--s-xs);
+ margin-top: var(--spacing-xs);
}
diff --git a/public/index.html b/public/index.html
index 94631304c..e6653d312 100644
--- a/public/index.html
+++ b/public/index.html
@@ -7,37 +7,38 @@
+
-
+
-
-
+
+
-
- Impeccable style
- made easy
+
+ Impeccable style
+ made easy
-
Your LLM can design beautiful interfaces.
It just needs to know what to ask for.
-
Works with Cursor · Claude Code · Gemini CLI · Codex CLI
+
Your LLM can design beautiful interfaces.
It just needs to know what to ask for.
+
Works with Cursor · Claude Code · Gemini CLI · Codex CLI
-
-
+
-
-
-
-
The Problem
-
LLMs are biased toward safe, generic design choices. Without guidance, you get the same predictable aesthetic every time.
+
+
+
+
The Problem
+
LLMs are biased toward safe, generic design choices. Without guidance, you get the same predictable aesthetic every time.
-