diff --git a/app/@breadcrumbs/about/page.tsx b/app/@breadcrumbs/about/page.tsx
index ed78d5e..c04bb9f 100644
--- a/app/@breadcrumbs/about/page.tsx
+++ b/app/@breadcrumbs/about/page.tsx
@@ -1,4 +1,4 @@
-import { Breadcrumbs } from '@/components/layout/Breadcrumbs';
+import { Breadcrumbs } from '@/components/layout/breadcrumbs';
export default function AboutBreadcrumb() {
return (
diff --git a/app/@breadcrumbs/blog/[...slug]/page.tsx b/app/@breadcrumbs/blog/[...slug]/page.tsx
index a2dc242..21c9398 100644
--- a/app/@breadcrumbs/blog/[...slug]/page.tsx
+++ b/app/@breadcrumbs/blog/[...slug]/page.tsx
@@ -1,4 +1,4 @@
-import { Breadcrumbs } from '@/components/layout/Breadcrumbs';
+import { Breadcrumbs } from '@/components/layout/breadcrumbs';
import { getPostBySlug } from '@/lib/markdown';
interface BreadcrumbItem {
diff --git a/app/@breadcrumbs/blog/page.tsx b/app/@breadcrumbs/blog/page.tsx
index 6abd4ba..e3897f5 100644
--- a/app/@breadcrumbs/blog/page.tsx
+++ b/app/@breadcrumbs/blog/page.tsx
@@ -1,4 +1,4 @@
-import { Breadcrumbs } from '@/components/layout/Breadcrumbs';
+import { Breadcrumbs } from '@/components/layout/breadcrumbs';
export default function BlogBreadcrumb() {
return (
diff --git a/app/@breadcrumbs/default.tsx b/app/@breadcrumbs/default.tsx
index 8f1d385..f934837 100644
--- a/app/@breadcrumbs/default.tsx
+++ b/app/@breadcrumbs/default.tsx
@@ -1,6 +1,6 @@
'use client';
-import { Breadcrumbs } from '@/components/layout/Breadcrumbs';
+import { Breadcrumbs } from '@/components/layout/breadcrumbs';
export default function DefaultBreadcrumb() {
return ;
diff --git a/app/@breadcrumbs/tags/[tag]/page.tsx b/app/@breadcrumbs/tags/[tag]/page.tsx
index 9451e8d..7f3c00a 100644
--- a/app/@breadcrumbs/tags/[tag]/page.tsx
+++ b/app/@breadcrumbs/tags/[tag]/page.tsx
@@ -1,4 +1,4 @@
-import { Breadcrumbs } from '@/components/layout/Breadcrumbs';
+import { Breadcrumbs } from '@/components/layout/breadcrumbs';
export default async function TagBreadcrumb({
params,
diff --git a/app/@breadcrumbs/tags/page.tsx b/app/@breadcrumbs/tags/page.tsx
index 8d74cd3..01aa702 100644
--- a/app/@breadcrumbs/tags/page.tsx
+++ b/app/@breadcrumbs/tags/page.tsx
@@ -1,4 +1,4 @@
-import { Breadcrumbs } from '@/components/layout/Breadcrumbs';
+import { Breadcrumbs } from '@/components/layout/breadcrumbs';
export default function TagsBreadcrumb() {
return (
diff --git a/app/globals.css b/app/globals.css
index 4e99d8c..073c34a 100644
--- a/app/globals.css
+++ b/app/globals.css
@@ -1,5 +1,37 @@
@import "tailwindcss";
+@theme {
+ --color-*: initial;
+}
+
+@variant dark (&:where(.dark, .dark *));
+
+@layer base {
+ :root {
+ /* Light mode colors */
+ --bg-primary: 241 245 249;
+ --bg-secondary: 226 232 240;
+ --bg-tertiary: 203 213 225;
+ --text-primary: 15 23 42;
+ --text-secondary: 51 65 85;
+ --text-muted: 100 116 139;
+ --border-primary: 203 213 225;
+ --border-subtle: 226 232 240;
+ }
+
+ .dark {
+ /* Dark mode colors - INDUSTRIAL */
+ --bg-primary: 24 24 27;
+ --bg-secondary: 15 23 42;
+ --bg-tertiary: 30 41 59;
+ --text-primary: 241 245 249;
+ --text-secondary: 203 213 225;
+ --text-muted: 100 116 139;
+ --border-primary: 71 85 105;
+ --border-subtle: 30 41 59;
+ }
+}
+
@layer utilities {
.scrollbar-hide {
-ms-overflow-style: none;
@@ -11,21 +43,99 @@
/* Industrial/Terminal aesthetic utilities */
.grid-bg {
- background-image: url('/grid.svg');
+ background-image:
+ linear-gradient(rgba(100, 116, 139, 0.1) 1px, transparent 1px),
+ linear-gradient(90deg, rgba(100, 116, 139, 0.1) 1px, transparent 1px);
+ background-size: 20px 20px;
}
+ /* Noise texture */
.noise-bg {
background-image: url('/noise.svg');
+ opacity: 0.03;
+ pointer-events: none;
}
+ /* Scanline effect */
.scanline {
- background: repeating-linear-gradient(
+ background: linear-gradient(
0deg,
- transparent,
- transparent 2px,
- rgba(0, 0, 0, 0.3) 2px,
- rgba(0, 0, 0, 0.3) 4px
+ transparent 0%,
+ rgba(6, 182, 212, 0.1) 50%,
+ transparent 100%
);
+ background-size: 100% 3px;
+ pointer-events: none;
+ }
+
+ .scanline::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: linear-gradient(
+ to bottom,
+ transparent 0%,
+ rgba(6, 182, 212, 0.05) 50%,
+ transparent 100%
+ );
+ animation: scanline 8s linear infinite;
+ pointer-events: none;
+ }
+
+ /* CRT screen curvature effect */
+ .crt-effect {
+ animation: flicker 0.15s infinite;
+ }
+
+ /* Glitch text effect */
+ .glitch-text {
+ position: relative;
+ }
+
+ .glitch-text::before,
+ .glitch-text::after {
+ content: attr(data-text);
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ opacity: 0;
+ }
+
+ .glitch-text.active::before {
+ color: #06b6d4;
+ animation: glitch-1 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94);
+ clip-path: polygon(0 0, 100% 0, 100% 45%, 0 45%);
+ transform: translate(-2px, -2px);
+ opacity: 0.8;
+ }
+
+ .glitch-text.active::after {
+ color: #10b981;
+ animation: glitch-2 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94);
+ clip-path: polygon(0 55%, 100% 55%, 100% 100%, 0 100%);
+ transform: translate(2px, 2px);
+ opacity: 0.8;
+ }
+
+ @keyframes glitch-1 {
+ 0%, 100% { clip-path: polygon(0 0, 100% 0, 100% 45%, 0 45%); transform: translate(0); }
+ 20% { clip-path: polygon(0 15%, 100% 15%, 100% 65%, 0 65%); }
+ 40% { clip-path: polygon(0 30%, 100% 30%, 100% 70%, 0 70%); }
+ 60% { clip-path: polygon(0 5%, 100% 5%, 100% 60%, 0 60%); }
+ 80% { clip-path: polygon(0 25%, 100% 25%, 100% 40%, 0 40%); }
+ }
+
+ @keyframes glitch-2 {
+ 0%, 100% { clip-path: polygon(0 55%, 100% 55%, 100% 100%, 0 100%); transform: translate(0); }
+ 20% { clip-path: polygon(0 70%, 100% 70%, 100% 95%, 0 95%); }
+ 40% { clip-path: polygon(0 40%, 100% 40%, 100% 85%, 0 85%); }
+ 60% { clip-path: polygon(0 60%, 100% 60%, 100% 100%, 0 100%); }
+ 80% { clip-path: polygon(0 50%, 100% 50%, 100% 90%, 0 90%); }
}
/* Grayscale filter with instant toggle */
@@ -36,4 +146,105 @@
.grayscale-0 {
filter: grayscale(0%);
}
+
+ /* Cyberpunk Glitch Effect for Button */
+ .glitch-btn {
+ position: relative;
+ animation: glitch 300ms cubic-bezier(.25, .46, .45, .94);
+ }
+
+ .glitch-layer {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ opacity: 0.8;
+ clip-path: polygon(0 0, 100% 0, 100% 45%, 0 45%);
+ }
+
+ .glitch-layer:first-of-type {
+ animation: glitch-1 300ms cubic-bezier(.25, .46, .45, .94);
+ color: rgb(6 182 212); /* cyan-500 */
+ transform: translate(-2px, 0);
+ clip-path: polygon(0 0, 100% 0, 100% 35%, 0 35%);
+ }
+
+ .glitch-layer:last-of-type {
+ animation: glitch-2 300ms cubic-bezier(.25, .46, .45, .94);
+ color: rgb(16 185 129); /* emerald-500 */
+ transform: translate(2px, 0);
+ clip-path: polygon(0 65%, 100% 65%, 100% 100%, 0 100%);
+ }
+
+ @keyframes glitch-1 {
+ 0%, 100% {
+ transform: translate(0, 0);
+ clip-path: polygon(0 0, 100% 0, 100% 35%, 0 35%);
+ }
+ 25% {
+ transform: translate(-3px, 2px);
+ clip-path: polygon(0 10%, 100% 10%, 100% 45%, 0 45%);
+ }
+ 50% {
+ transform: translate(3px, -2px);
+ clip-path: polygon(0 20%, 100% 20%, 100% 55%, 0 55%);
+ }
+ 75% {
+ transform: translate(-2px, -1px);
+ clip-path: polygon(0 5%, 100% 5%, 100% 40%, 0 40%);
+ }
+ }
+
+ @keyframes glitch-2 {
+ 0%, 100% {
+ transform: translate(0, 0);
+ clip-path: polygon(0 65%, 100% 65%, 100% 100%, 0 100%);
+ }
+ 25% {
+ transform: translate(3px, -2px);
+ clip-path: polygon(0 55%, 100% 55%, 100% 90%, 0 90%);
+ }
+ 50% {
+ transform: translate(-3px, 2px);
+ clip-path: polygon(0 45%, 100% 45%, 100% 80%, 0 80%);
+ }
+ 75% {
+ transform: translate(2px, 1px);
+ clip-path: polygon(0 60%, 100% 60%, 100% 95%, 0 95%);
+ }
+ }
+
+ /* Border Pulse Animation */
+ .border-pulse {
+ animation: pulse-border 2s ease-in-out infinite;
+ }
+
+ /* Screen Flicker Effect */
+ body.screen-flicker {
+ animation: flicker 150ms ease-in-out;
+ }
+
+ body.screen-flicker::before {
+ content: '';
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: rgba(6, 182, 212, 0.1);
+ pointer-events: none;
+ z-index: 9999;
+ animation: flicker 150ms ease-in-out;
+ }
+
+ /* CRT Noise Texture */
+ @supports (filter: url('#noise')) {
+ .noise-bg {
+ filter: url('#noise');
+ }
+ }
}
diff --git a/app/layout.tsx b/app/layout.tsx
index 0dfc5e4..153a0bd 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -1,6 +1,7 @@
import type { Metadata } from 'next'
import { JetBrains_Mono } from 'next/font/google'
import './globals.css'
+import { ThemeProvider } from '@/providers/providers'
const jetbrainsMono = JetBrains_Mono({ subsets: ['latin'], variable: '--font-mono' })
@@ -33,20 +34,28 @@ export default function RootLayout({
children: React.ReactNode
}) {
return (
-
-
- {children}
+
+
+
+ {children}
- {/* Footer - from worktree-agent-1 */}
-