+ {label && (
+
+ )}
+
+ {icon && (
+
+ {icon}
+
+ )}
+
+
+ {error && (
+
{error}
+ )}
+ {helperText && !error && (
+
{helperText}
+ )}
+
+ );
+};
diff --git a/packages/ui/index.ts b/packages/ui/index.ts
new file mode 100644
index 0000000..e5cfd42
--- /dev/null
+++ b/packages/ui/index.ts
@@ -0,0 +1,23 @@
+/**
+ * AeThex UI Component Library
+ * Shared components across all platforms
+ */
+
+// Design tokens
+export * from './styles/tokens';
+
+// Components
+export { Button } from './components/Button';
+export type { ButtonProps } from './components/Button';
+
+export { Input } from './components/Input';
+export type { InputProps } from './components/Input';
+
+export { Avatar } from './components/Avatar';
+export type { AvatarProps } from './components/Avatar';
+
+export { Card } from './components/Card';
+export type { CardProps } from './components/Card';
+
+export { Badge } from './components/Badge';
+export type { BadgeProps } from './components/Badge';
diff --git a/packages/ui/package.json b/packages/ui/package.json
new file mode 100644
index 0000000..0db16b1
--- /dev/null
+++ b/packages/ui/package.json
@@ -0,0 +1,24 @@
+{
+ "name": "@aethex/ui",
+ "version": "1.0.0",
+ "description": "Shared UI components for AeThex Connect",
+ "main": "dist/index.js",
+ "types": "dist/index.d.ts",
+ "scripts": {
+ "build": "tsc",
+ "dev": "tsc --watch"
+ },
+ "dependencies": {
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0"
+ },
+ "devDependencies": {
+ "@types/react": "^18.2.43",
+ "@types/react-dom": "^18.2.17",
+ "typescript": "^5.3.3"
+ },
+ "peerDependencies": {
+ "react": ">=18.0.0",
+ "react-dom": ">=18.0.0"
+ }
+}
diff --git a/packages/ui/styles/tokens.ts b/packages/ui/styles/tokens.ts
new file mode 100644
index 0000000..82d0d2e
--- /dev/null
+++ b/packages/ui/styles/tokens.ts
@@ -0,0 +1,166 @@
+/**
+ * Design System Tokens
+ * Shared design tokens across all platforms
+ */
+
+export const colors = {
+ // Brand colors
+ primary: {
+ 50: '#faf5ff',
+ 100: '#f3e8ff',
+ 200: '#e9d5ff',
+ 300: '#d8b4fe',
+ 400: '#c084fc',
+ 500: '#a855f7',
+ 600: '#9333ea',
+ 700: '#7e22ce',
+ 800: '#6b21a8',
+ 900: '#581c87',
+ },
+
+ // Accent colors
+ accent: {
+ 50: '#fdf4ff',
+ 100: '#fae8ff',
+ 200: '#f5d0fe',
+ 300: '#f0abfc',
+ 400: '#e879f9',
+ 500: '#d946ef',
+ 600: '#c026d3',
+ 700: '#a21caf',
+ 800: '#86198f',
+ 900: '#701a75',
+ },
+
+ // Neutral colors (dark theme)
+ gray: {
+ 50: '#fafafa',
+ 100: '#f4f4f5',
+ 200: '#e4e4e7',
+ 300: '#d4d4d8',
+ 400: '#a1a1aa',
+ 500: '#71717a',
+ 600: '#52525b',
+ 700: '#3f3f46',
+ 800: '#27272a',
+ 900: '#18181b',
+ 950: '#09090b',
+ },
+
+ // Semantic colors
+ success: '#22c55e',
+ warning: '#f59e0b',
+ error: '#ef4444',
+ info: '#3b82f6',
+
+ // Background
+ background: {
+ primary: '#0a0a0f',
+ secondary: '#18181b',
+ tertiary: '#27272a',
+ },
+
+ // Text
+ text: {
+ primary: '#e4e4e7',
+ secondary: '#a1a1aa',
+ tertiary: '#71717a',
+ muted: '#52525b',
+ },
+};
+
+export const spacing = {
+ 0: '0',
+ 1: '0.25rem', // 4px
+ 2: '0.5rem', // 8px
+ 3: '0.75rem', // 12px
+ 4: '1rem', // 16px
+ 5: '1.25rem', // 20px
+ 6: '1.5rem', // 24px
+ 8: '2rem', // 32px
+ 10: '2.5rem', // 40px
+ 12: '3rem', // 48px
+ 16: '4rem', // 64px
+ 20: '5rem', // 80px
+ 24: '6rem', // 96px
+};
+
+export const typography = {
+ fontFamily: {
+ sans: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',
+ mono: '"Fira Code", Consolas, Monaco, "Courier New", monospace',
+ },
+
+ fontSize: {
+ xs: '0.75rem', // 12px
+ sm: '0.875rem', // 14px
+ base: '1rem', // 16px
+ lg: '1.125rem', // 18px
+ xl: '1.25rem', // 20px
+ '2xl': '1.5rem', // 24px
+ '3xl': '1.875rem', // 30px
+ '4xl': '2.25rem', // 36px
+ '5xl': '3rem', // 48px
+ },
+
+ fontWeight: {
+ normal: 400,
+ medium: 500,
+ semibold: 600,
+ bold: 700,
+ },
+
+ lineHeight: {
+ none: 1,
+ tight: 1.25,
+ snug: 1.375,
+ normal: 1.5,
+ relaxed: 1.625,
+ loose: 2,
+ },
+};
+
+export const borderRadius = {
+ none: '0',
+ sm: '0.25rem', // 4px
+ base: '0.5rem', // 8px
+ md: '0.75rem', // 12px
+ lg: '1rem', // 16px
+ xl: '1.5rem', // 24px
+ full: '9999px',
+};
+
+export const shadows = {
+ sm: '0 1px 2px 0 rgba(0, 0, 0, 0.05)',
+ base: '0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)',
+ md: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',
+ lg: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',
+ xl: '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)',
+ '2xl': '0 25px 50px -12px rgba(0, 0, 0, 0.25)',
+ glow: '0 0 20px rgba(139, 92, 246, 0.4)',
+};
+
+export const breakpoints = {
+ sm: '640px',
+ md: '768px',
+ lg: '1024px',
+ xl: '1280px',
+ '2xl': '1536px',
+};
+
+export const zIndex = {
+ dropdown: 1000,
+ sticky: 1100,
+ fixed: 1200,
+ modalBackdrop: 1300,
+ modal: 1400,
+ popover: 1500,
+ tooltip: 1600,
+};
+
+export const transitions = {
+ fast: '150ms cubic-bezier(0.4, 0, 0.2, 1)',
+ base: '200ms cubic-bezier(0.4, 0, 0.2, 1)',
+ slow: '300ms cubic-bezier(0.4, 0, 0.2, 1)',
+ slower: '500ms cubic-bezier(0.4, 0, 0.2, 1)',
+};
diff --git a/packages/ui/tsconfig.json b/packages/ui/tsconfig.json
new file mode 100644
index 0000000..0718dbc
--- /dev/null
+++ b/packages/ui/tsconfig.json
@@ -0,0 +1,19 @@
+{
+ "compilerOptions": {
+ "target": "ES2020",
+ "module": "commonjs",
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
+ "jsx": "react",
+ "declaration": true,
+ "outDir": "./dist",
+ "rootDir": "./",
+ "strict": true,
+ "moduleResolution": "node",
+ "esModuleInterop": true,
+ "skipLibCheck": true,
+ "forceConsistentCasingInFileNames": true,
+ "resolveJsonModule": true
+ },
+ "include": ["**/*.ts", "**/*.tsx"],
+ "exclude": ["node_modules", "dist"]
+}
diff --git a/src/frontend/Demo.css b/src/frontend/Demo.css
index 760c806..63eca1e 100644
--- a/src/frontend/Demo.css
+++ b/src/frontend/Demo.css
@@ -1,10 +1,11 @@
-/* Demo App Styles */
+/* Demo App Styles - Dark Modern Theme */
.demo-app {
min-height: 100vh;
display: flex;
flex-direction: column;
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+ background: #0a0a0f;
+ color: #e4e4e7;
}
/* Loading Screen */
@@ -13,35 +14,40 @@
display: flex;
flex-direction: column;
align-items: center;
- justify-content: center;
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
- color: white;
+ justify-cont#0a0a0f;
+ color: #e4e4e7;
}
.loading-spinner {
font-size: 4rem;
- animation: spin 2s linear infinite;
+ animation: pulse 2s ease-in-out infinite;
margin-bottom: 1rem;
+ filter: drop-shadow(0 0 20px rgba(139, 92, 246, 0.6));
}
-@keyframes spin {
- from {
- transform: rotate(0deg);
+@keyframes pulse {
+ 0%, 100% {
+ transform: scale(1);
+ opacity: 1;
}
- to {
- transform: rotate(360deg);
+ 50% {
+ transform: scale(1.1);
+ opacity: 0.8;
}
}
.loading-screen p {
font-size: 1.2rem;
- opacity: 0.9;
+ opacity: 0.7;
+ font-weight: 500;
}
/* Header */
.demo-header {
- background: rgba(255, 255, 255, 0.98);
- box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
+ background: #18181b;
+ border-bottom: 1px solid #27272a;
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.3);
+ padding: 10 2px 10px rgba(0, 0, 0, 0.1);
padding: 1.5rem 2rem;
}
@@ -55,15 +61,20 @@
.logo-section h1 {
margin: 0;
- font-size: 2rem;
- color: #667eea;
+ font-size: 1.75rem;
+ background: linear-gradient(135deg, #8b5cf6 0%, #ec4899 100%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
font-weight: 700;
+ letter-spacing: -0.02em;
}
.tagline {
margin: 0.25rem 0 0 0;
- color: #666;
- font-size: 0.9rem;
+ color: #71717a;
+ font-size: 0.875rem;
+ font-weight: 500;
}
.user-section {
@@ -80,66 +91,88 @@
.user-name {
font-weight: 600;
- color: #333;
+ color: #e4e4e7;
}
.user-email {
- font-size: 0.85rem;
- color: #666;
+ font-size: 0.8rem;
+ color: #71717a;
}
/* Navigation */
.demo-nav {
- background: rgba(255, 255, 255, 0.95);
+ background: #18181b;
+ border-bottom: 1px solid #27272a;
display: flex;
gap: 0.5rem;
- padding: 1rem 2rem;
+ padding: 0.75rem 2rem;
overflow-x: auto;
- box-shadow: 0 2px 5px rgba(0, 0, 0, 0.05);
+ scrollbar-width: thin;
+ scrollbar-color: #3f3f46 transparent;
+}
+
+.demo-nav::-webkit-scrollbar {
+ height: 6px;
+}
+
+.demo-nav::-webkit-scrollbar-track {
+ background: transparent;
+}
+
+.demo-nav::-webkit-scrollbar-thumb {
+ background: #3f3f46;
+ border-radius: 3px;
}
.nav-tab {
- background: white;
- border: 2px solid #e0e0e0;
- padding: 0.75rem 1.5rem;
- border-radius: 8px;
+ background: #09090b;
+ border: 1px solid #27272a;
+ padding: 0.625rem 1.25rem;
+ border-radius: 6px;
cursor: pointer;
- transition: all 0.3s ease;
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
white-space: nowrap;
display: flex;
flex-direction: column;
align-items: center;
gap: 0.25rem;
- min-width: 140px;
+ min-width: 120px;
+ color: #a1a1aa;
+ font-size: 0.875rem;
}
.nav-tab:hover {
- border-color: #667eea;
- transform: translateY(-2px);
- box-shadow: 0 4px 8px rgba(102, 126, 234, 0.2);
+ background: #18181b;
+ border-color: #3f3f46;
+ color: #e4e4e7;
+ transform: translateY(-1px);
}
.nav-tab.active {
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
- border-color: #667eea;
+ background: linear-gradient(135deg, #8b5cf6 0%, #ec4899 100%);
+ border-color: transparent;
color: white;
+ box-shadow: 0 4px 12px rgba(139, 92, 246, 0.3);
}
.tab-label {
font-weight: 600;
- font-size: 0.95rem;
+ font-size: 0.8rem;
}
.tab-phase {
- font-size: 0.7rem;
- opacity: 0.8;
- background: rgba(0, 0, 0, 0.1);
- padding: 2px 8px;
- border-radius: 10px;
+ font-size: 0.65rem;
+ opacity: 0.7;
+ background: rgba(255, 255, 255, 0.05);
+ padding: 2px 6px;
+ border-radius: 4px;
+ letter-spacing: 0.02em;
+ text-transform: uppercase;
}
.nav-tab.active .tab-phase {
- background: rgba(255, 255, 255, 0.2);
+ background: rgba(255, 255, 255, 0.15);
+ opacity: 0.9;
}
/* Main Content */
@@ -153,21 +186,24 @@
/* Overview Section */
.overview-section {
- background: white;
+ background: #18181b;
+ border: 1px solid #27272a;
border-radius: 12px;
padding: 2rem;
- box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
+ box-shadow: 0 4px 24px rgba(0, 0, 0, 0.4);
}
.overview-section h2 {
- margin: 0 0 1rem 0;
- color: #333;
+ margin: 0 0 0.75rem 0;
+ color: #e4e4e7;
font-size: 2rem;
+ font-weight: 700;
+ letter-spacing: -0.02em;
}
.intro {
- color: #666;
- font-size: 1.1rem;
+ color: #a1a1aa;
+ font-size: 1rem;
margin-bottom: 2rem;
line-height: 1.6;
}
@@ -176,39 +212,61 @@
.feature-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
- gap: 1.5rem;
+ gap: 1.25rem;
margin: 2rem 0;
}
.feature-card {
- background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
+ background: #09090b;
+ border: 1px solid #27272a;
border-radius: 12px;
padding: 1.5rem;
- transition: transform 0.3s ease, box-shadow 0.3s ease;
- border: 2px solid transparent;
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+ position: relative;
+ overflow: hidden;
+}
+
+.feature-card::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: 2px;
+ background: linear-gradient(90deg, #8b5cf6, #ec4899);
+ opacity: 0;
+ transition: opacity 0.3s;
}
.feature-card:hover {
- transform: translateY(-5px);
- box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
- border-color: #667eea;
+ transform: translateY(-4px);
+ border-color: #3f3f46;
+ box-shadow: 0 12px 32px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(139, 92, 246, 0.1);
+}
+
+.feature-card:hover::before {
+ opacity: 1;
}
.feature-icon {
- font-size: 3rem;
+ font-size: 2.5rem;
margin-bottom: 1rem;
+ filter: drop-shadow(0 4px 8px rgba(139, 92, 246, 0.3));
}
.feature-card h3 {
margin: 0.5rem 0;
- color: #333;
- font-size: 1.3rem;
+ color: #e4e4e7;
+ font-size: 1.25rem;
+ font-weight: 600;
+ letter-spacing: -0.01em;
}
.feature-card p {
- color: #555;
+ color: #71717a;
margin: 0.5rem 0 1rem 0;
line-height: 1.5;
+ font-size: 0.9rem;
}
.feature-card ul {
@@ -218,110 +276,178 @@
}
.feature-card ul li {
- padding: 0.3rem 0;
- color: #666;
- font-size: 0.9rem;
+ padding: 0.4rem 0;
+ color: #a1a1aa;
+ font-size: 0.875rem;
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
}
.feature-card ul li:before {
- content: "✓ ";
- color: #4caf50;
+ content: "✓";
+ color: #8b5cf6;
font-weight: bold;
- margin-right: 0.5rem;
+ font-size: 0.875rem;
}
/* Badges */
.badge {
display: inline-block;
- padding: 0.25rem 0.75rem;
- border-radius: 12px;
- font-size: 0.75rem;
+ padding: 0.25rem 0.625rem;
+ border-radius: 6px;
+ font-size: 0.7rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
}
-.phase-1 { background: #e3f2fd; color: #1976d2; }
-.phase-2 { background: #f3e5f5; color: #7b1fa2; }
-.phase-3 { background: #e8f5e9; color: #388e3c; }
-.phase-4 { background: #fff3e0; color: #f57c00; }
-.phase-5 { background: #fce4ec; color: #c2185b; }
-.phase-6 { background: #fff9c4; color: #f57f17; }
+.phase-1 { background: rgba(59, 130, 246, 0.15); color: #60a5fa; border: 1px solid rgba(59, 130, 246, 0.3); }
+.phase-2 { background: rgba(168, 85, 247, 0.15); color: #c084fc; border: 1px solid rgba(168, 85, 247, 0.3); }
+.phase-3 { background: rgba(34, 197, 94, 0.15); color: #4ade80; border: 1px solid rgba(34, 197, 94, 0.3); }
+.phase-4 { background: rgba(251, 146, 60, 0.15); color: #fb923c; border: 1px solid rgba(251, 146, 60, 0.3); }
+.phase-5 { background: rgba(236, 72, 153, 0.15); color: #f472b6; border: 1px solid rgba(236, 72, 153, 0.3); }
+.phase-6 { background: rgba(234, 179, 8, 0.15); color: #fbbf24; border: 1px solid rgba(234, 179, 8, 0.3); }
/* Status Section */
.status-section {
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
- color: white;
+ background: linear-gradient(135deg, #18181b 0%, #27272a 100%);
+ border: 1px solid #3f3f46;
+ color: #e4e4e7;
padding: 2rem;
border-radius: 12px;
margin: 2rem 0;
+ position: relative;
+ overflow: hidden;
+}
+
+.status-section::before {
+ content: '';
+ position: absolute;
+ top: -50%;
+ right: -50%;
+ width: 200%;
+ height: 200%;
+ background: radial-gradient(circle, rgba(139, 92, 246, 0.1) 0%, transparent 70%);
+ animation: rotate 20s linear infinite;
+}
+
+@keyframes rotate {
+ from { transform: rotate(0deg); }
+ to { transform: rotate(360deg); }
}
.status-section h3 {
margin: 0 0 1rem 0;
font-size: 1.5rem;
+ position: relative;
+ z-index: 1;
}
.status-section p {
margin: 0.5rem 0;
- opacity: 0.95;
+ opacity: 0.9;
+ position: relative;
+ z-index: 1;
}
.platform-badges {
display: flex;
- gap: 1rem;
+ gap: 0.75rem;
flex-wrap: wrap;
margin: 1rem 0;
+ position: relative;
+ z-index: 1;
}
.platform-badge {
- background: rgba(255, 255, 255, 0.2);
+ background: rgba(24, 24, 27, 0.6);
+ border: 1px solid #3f3f46;
padding: 0.5rem 1rem;
- border-radius: 20px;
- font-size: 0.9rem;
+ border-radius: 8px;
+ font-size: 0.875rem;
backdrop-filter: blur(10px);
+ transition: all 0.2s;
+}
+
+.platform-badge:hover {
+ background: rgba(139, 92, 246, 0.15);
+ border-color: #8b5cf6;
+ transform: translateY(-2px);
}
.timeline {
font-style: italic;
- opacity: 0.9;
+ opacity: 0.8;
margin-top: 1rem;
+ position: relative;
+ z-index: 1;
}
/* Quick Stats */
.quick-stats {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
- gap: 1.5rem;
+ gap: 1.25rem;
margin-top: 2rem;
}
.stat {
text-align: center;
padding: 1.5rem;
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+ background: #09090b;
+ border: 1px solid #27272a;
border-radius: 12px;
- color: white;
+ transition: all 0.3s;
+ position: relative;
+ overflow: hidden;
+}
+
+.stat::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: 2px;
+ background: linear-gradient(90deg, #8b5cf6, #ec4899);
+ transform: scaleX(0);
+ transition: transform 0.3s;
+}
+
+.stat:hover {
+ border-color: #3f3f46;
+ transform: translateY(-4px);
+}
+
+.stat:hover::before {
+ transform: scaleX(1);
}
.stat-value {
- font-size: 3rem;
+ font-size: 2.5rem;
font-weight: 700;
line-height: 1;
+ background: linear-gradient(135deg, #8b5cf6 0%, #ec4899 100%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
}
.stat-label {
- font-size: 0.9rem;
- opacity: 0.9;
+ font-size: 0.875rem;
+ color: #71717a;
margin-top: 0.5rem;
+ font-weight: 500;
}
/* Feature Section */
.feature-section {
- background: white;
+ background: #18181b;
+ border: 1px solid #27272a;
border-radius: 12px;
padding: 2rem;
- box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
+ box-shadow: 0 4px 24px rgba(0, 0, 0, 0.4);
min-height: 500px;
}
@@ -331,27 +457,30 @@
gap: 1rem;
margin-bottom: 1rem;
padding-bottom: 1rem;
- border-bottom: 2px solid #f0f0f0;
+ border-bottom: 1px solid #27272a;
}
.section-header h2 {
margin: 0;
- color: #333;
- font-size: 1.8rem;
+ color: #e4e4e7;
+ font-size: 1.75rem;
+ font-weight: 700;
+ letter-spacing: -0.01em;
}
.section-description {
- color: #666;
+ color: #a1a1aa;
margin-bottom: 2rem;
line-height: 1.6;
+ font-size: 0.95rem;
}
/* Footer */
.demo-footer {
- background: rgba(255, 255, 255, 0.98);
+ background: #18181b;
+ border-top: 1px solid #27272a;
margin-top: auto;
padding: 2rem;
- box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.05);
}
.footer-content {
@@ -365,14 +494,19 @@
.footer-section h4 {
margin: 0 0 1rem 0;
- color: #667eea;
- font-size: 1.1rem;
+ background: linear-gradient(135deg, #8b5cf6 0%, #ec4899 100%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ font-size: 1rem;
+ font-weight: 600;
}
.footer-section p {
- color: #666;
+ color: #71717a;
margin: 0;
- font-size: 0.9rem;
+ font-size: 0.875rem;
+ line-height: 1.5;
}
.footer-section ul {
@@ -382,30 +516,36 @@
}
.footer-section ul li {
- padding: 0.3rem 0;
- font-size: 0.9rem;
+ padding: 0.375rem 0;
+ font-size: 0.875rem;
+ color: #71717a;
+ transition: color 0.2s;
+}
+
+.footer-section ul li:hover {
+ color: #a1a1aa;
}
.footer-section ul li a {
- color: #666;
+ color: inherit;
text-decoration: none;
- transition: color 0.3s ease;
+ transition: color 0.2s;
}
.footer-section ul li a:hover {
- color: #667eea;
+ color: #8b5cf6;
}
.footer-bottom {
text-align: center;
padding-top: 1.5rem;
- border-top: 1px solid #e0e0e0;
+ border-top: 1px solid #27272a;
}
.footer-bottom p {
margin: 0;
- color: #999;
- font-size: 0.85rem;
+ color: #52525b;
+ font-size: 0.8rem;
}
/* Responsive */
diff --git a/src/frontend/index.css b/src/frontend/index.css
index 7fe479c..e9480f1 100644
--- a/src/frontend/index.css
+++ b/src/frontend/index.css
@@ -1,5 +1,43 @@
-body {
+* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
+
+body {
+ margin: 0;
+ padding: 0;
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ background: #0a0a0f;
+ color: #e4e4e7;
+ line-height: 1.5;
+}
+
+code {
+ font-family: 'Fira Code', 'Consolas', 'Monaco', 'Courier New', monospace;
+}
+
+::-webkit-scrollbar {
+ width: 10px;
+ height: 10px;
+}
+
+::-webkit-scrollbar-track {
+ background: #18181b;
+}
+
+::-webkit-scrollbar-thumb {
+ background: #3f3f46;
+ border-radius: 5px;
+}
+
+::-webkit-scrollbar-thumb:hover {
+ background: #52525b;
+}
+
+::selection {
+ background: rgba(139, 92, 246, 0.3);
+ color: #e4e4e7;
+}