create-bablojs
Version:
CLI tool to quickly scaffold a new BABLOJS project. BABLOJS is a lightweight, fast, and scalable Single Page Application framework built with vanilla JavaScript, providing React-like features including Virtual DOM, hooks, routing, and component-based arch
2,305 lines (1,948 loc) • 86.5 kB
CSS
/* ============================================
MODERN DESIGN SYSTEM - CONSISTENT UI/UX
============================================ */
/* ============================================
RESET & BASE
============================================ */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
/* ============================================
ROOT VARIABLES - DESIGN TOKENS
============================================ */
:root {
/* ============================================
TYPOGRAPHY SYSTEM
============================================ */
/* Font Families */
--font-primary: 'Inter', -apple-system, 'Segoe UI', Roboto, sans-serif;
--font-mono: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
/* Font Sizes - Consistent Scale (1.250 - Major Third) */
--text-xs: 0.64rem;
/* 10.24px */
--text-sm: 0.8rem;
/* 12.8px */
--text-base: 1rem;
/* 16px - base */
--text-lg: 1.25rem;
/* 20px */
--text-xl: 1.563rem;
/* 25px */
--text-2xl: 1.953rem;
/* 31.25px */
--text-3xl: 2.441rem;
/* 39px */
--text-4xl: 3.052rem;
/* 48.83px */
--text-5xl: 3.815rem;
/* 61px */
--text-6xl: 4.768rem;
/* 76.29px */
--text-7xl: 5.96rem;
/* 95.36px */
/* Font Weights */
--font-light: 300;
--font-normal: 400;
--font-medium: 500;
--font-semibold: 600;
--font-bold: 700;
--font-extrabold: 800;
/* Line Heights */
--leading-none: 1;
--leading-tight: 1.25;
--leading-snug: 1.375;
--leading-normal: 1.5;
--leading-relaxed: 1.625;
--leading-loose: 2;
/* Letter Spacing */
--tracking-tighter: -0.05em;
--tracking-tight: -0.025em;
--tracking-normal: 0em;
--tracking-wide: 0.025em;
--tracking-wider: 0.05em;
--tracking-widest: 0.1em;
/* ============================================
SPACING SYSTEM - 8px Base
============================================ */
--space-0: 0;
--space-1: 0.25rem;
/* 4px */
--space-2: 0.5rem;
/* 8px */
--space-3: 0.75rem;
/* 12px */
--space-4: 1rem;
/* 16px */
--space-5: 1.25rem;
/* 20px */
--space-6: 1.5rem;
/* 24px */
--space-8: 2rem;
/* 32px */
--space-10: 2.5rem;
/* 40px */
--space-12: 3rem;
/* 48px */
--space-16: 4rem;
/* 64px */
--space-20: 5rem;
/* 80px */
--space-24: 6rem;
/* 96px */
--space-32: 8rem;
/* 128px */
/* ============================================
COLOR SYSTEM
============================================ */
/* Primary Colors - Charcoal Gray (No Black) */
--color-white: #ffffff;
--color-primary-50: #f8fafc;
--color-primary-100: #f1f5f9;
--color-primary-200: #e2e8f0;
--color-primary-300: #cbd5e1;
--color-primary-400: #94a3b8;
--color-primary-500: #64748b;
--color-primary-600: #475569;
--color-primary-700: #334155;
--color-primary-800: #1e293b;
--color-primary-900: #0f172a;
/* Secondary Colors - Purple to Pink Gradient */
--color-secondary-50: #faf5ff;
--color-secondary-100: #f3e8ff;
--color-secondary-200: #e9d5ff;
--color-secondary-300: #d8b4fe;
--color-secondary-400: #c084fc;
--color-secondary-500: #a855f7;
--color-secondary-600: #9333ea;
--color-secondary-700: #7c3aed;
--color-secondary-800: #6b21a8;
--color-secondary-900: #581c87;
/* Accent Colors - Pink */
--color-accent-50: #fdf2f8;
--color-accent-100: #fce7f3;
--color-accent-200: #fbcfe8;
--color-accent-300: #f9a8d4;
--color-accent-400: #f472b6;
--color-accent-500: #ec4899;
--color-accent-600: #db2777;
--color-accent-700: #be185d;
--color-accent-800: #9d174d;
--color-accent-900: #831843;
/* Neutral Colors */
--color-neutral-50: #f8fafc;
--color-neutral-100: #f1f5f9;
--color-neutral-200: #e2e8f0;
--color-neutral-300: #cbd5e1;
--color-neutral-400: #94a3b8;
--color-neutral-500: #64748b;
--color-neutral-600: #475569;
--color-neutral-700: #334155;
--color-neutral-800: #1e293b;
--color-neutral-900: #0f172a;
/* Semantic Colors */
--color-success: #10b981;
--color-warning: #f59e0b;
--color-error: #ef4444;
--color-info: #06b6d4;
/* Surface Colors */
--color-background: var(--color-neutral-50);
--color-surface: #ffffff;
--color-surface-elevated: #ffffff;
/* Text Colors */
--color-text-primary: #1a202c;
--color-text-secondary: var(--color-primary-600);
--color-text-tertiary: var(--color-primary-400);
--color-text-inverse: #ffffff;
/* Border Colors */
--color-border-primary: var(--color-neutral-200);
--color-border-secondary: var(--color-neutral-100);
/* ============================================
BORDER RADIUS
============================================ */
--radius-none: 0;
--radius-sm: 0.25rem;
/* 4px */
--radius-base: 0.5rem;
/* 8px */
--radius-md: 0.75rem;
/* 12px */
--radius-lg: 1rem;
/* 16px */
--radius-xl: 1.5rem;
/* 24px */
--radius-2xl: 2rem;
/* 32px */
--radius-full: 9999px;
/* ============================================
SHADOWS
============================================ */
--shadow-xs: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
--shadow-sm: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1);
--shadow-base: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1);
--shadow-md: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1);
--shadow-lg: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1);
--shadow-xl: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
/* ============================================
TRANSITIONS & ANIMATIONS
============================================ */
--transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);
--transition-base: 300ms cubic-bezier(0.4, 0, 0.2, 1);
--transition-slow: 500ms cubic-bezier(0.4, 0, 0.2, 1);
/* ============================================
LAYOUT
============================================ */
--container-max-width: 1280px;
--container-padding: var(--space-4);
--header-height: 4rem;
/* ============================================
Z-INDEX SCALE
============================================ */
--z-dropdown: 1000;
--z-sticky: 1020;
--z-fixed: 1030;
--z-modal-backdrop: 1040;
--z-modal: 1050;
--z-popover: 1060;
--z-tooltip: 1070;
}
/* ============================================
BASE STYLES
============================================ */
html {
font-size: 16px;
scroll-behavior: smooth;
}
body {
width: 100%;
min-height: 100vh;
overflow-x: hidden;
overflow-y: scroll;
font-family: var(--font-primary);
font-size: var(--text-base);
font-weight: var(--font-normal);
line-height: var(--leading-normal);
color: var(--color-text-primary);
background-color: var(--color-background);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
/* ============================================
TYPOGRAPHY
============================================ */
h1,
h2,
h3,
h4,
h5,
h6 {
font-weight: var(--font-bold);
line-height: var(--leading-tight);
margin-bottom: var(--space-4);
color: var(--color-text-primary);
}
h1 {
font-size: var(--text-4xl);
}
h2 {
font-size: var(--text-3xl);
}
h3 {
font-size: var(--text-2xl);
}
h4 {
font-size: var(--text-xl);
}
h5 {
font-size: var(--text-lg);
}
h6 {
font-size: var(--text-base);
}
/* Gradient Text Classes */
.heading-gradient-purple-pink {
background: linear-gradient(90deg, var(--color-secondary-600) 0%, var(--color-secondary-700) 50%, var(--color-accent-500) 100%);
background-clip: text;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.heading-gradient-primary {
background: linear-gradient(135deg, var(--color-primary-600) 0%, var(--color-primary-800) 100%);
background-clip: text;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.heading-gradient-secondary {
background: linear-gradient(135deg, var(--color-secondary-500) 0%, var(--color-secondary-700) 100%);
background-clip: text;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.heading-gradient-accent {
background: linear-gradient(135deg, var(--color-accent-500) 0%, var(--color-accent-700) 100%);
background-clip: text;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
@keyframes gradientText {
0% {
background-position: 0% 50%;
}
50% {
background-position: 100% 50%;
}
100% {
background-position: 0% 50%;
}
}
p {
margin-bottom: var(--space-4);
color: var(--color-text-secondary);
line-height: var(--leading-relaxed);
}
a {
color: var(--color-primary-600);
text-decoration: none;
transition: color var(--transition-fast);
}
a:hover {
color: var(--color-primary-700);
}
a:focus-visible {
outline: 2px solid var(--color-primary-500);
outline-offset: 2px;
border-radius: var(--radius-sm);
}
/* ============================================
LOADING STATE
============================================ */
.bablo-loader {
min-height: 100vh;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
background: radial-gradient(ellipse at center top, #ffffff 0%, #faf5ff 40%, #fce7f3 100%);
font-family: var(--font-primary);
position: relative;
animation: bablo-loader-fade-in 0.6s ease-out;
}
.bablo-loader-hamburger {
position: absolute;
top: 1.5rem;
right: 1.5rem;
width: 24px;
height: 18px;
display: flex;
flex-direction: column;
justify-content: space-between;
opacity: 0.3;
transition: opacity var(--transition-fast);
}
.bablo-loader-hamburger:hover {
opacity: 0.5;
}
.bablo-loader-hamburger-line {
width: 100%;
height: 2px;
background-color: var(--color-primary-400);
border-radius: 1px;
transition: background-color var(--transition-fast);
}
.bablo-loader-logo-container {
display: flex;
align-items: center;
gap: var(--space-4);
margin-top: calc(var(--space-8) * -1);
animation: bablo-loader-slide-up 0.8s ease-out;
}
.bablo-loader-rocket {
width: 48px;
height: 48px;
display: flex;
align-items: center;
justify-content: center;
animation: bablo-loader-rocket-float 2s ease-in-out infinite;
}
.bablo-loader-rocket svg {
width: 100%;
height: 100%;
}
.bablo-loader-text {
font-size: var(--text-5xl);
font-weight: var(--font-extrabold);
letter-spacing: var(--tracking-tighter);
display: flex;
align-items: baseline;
}
.bablo-loader-text-bablo {
background: linear-gradient(135deg, var(--color-secondary-600) 0%, var(--color-secondary-700) 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
animation: bablo-loader-text-fade-in 0.8s ease-out 0.2s both;
}
.bablo-loader-text-js {
background: linear-gradient(135deg, var(--color-accent-500) 0%, var(--color-accent-600) 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
animation: bablo-loader-text-fade-in 0.8s ease-out 0.4s both;
}
@keyframes bablo-loader-fade-in {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@keyframes bablo-loader-slide-up {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes bablo-loader-rocket-float {
0%,
100% {
transform: translateY(0) scale(1);
}
50% {
transform: translateY(-8px) scale(1.05);
}
}
@keyframes bablo-loader-text-fade-in {
from {
opacity: 0;
transform: translateY(10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@media (max-width: 768px) {
.bablo-loader-text {
font-size: var(--text-4xl);
}
.bablo-loader-rocket {
width: 40px;
height: 40px;
}
.bablo-loader-logo-container {
gap: var(--space-3);
}
}
/* ============================================
BUTTON SYSTEM
============================================ */
.btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: var(--space-2);
padding: var(--space-3) var(--space-6);
font-size: var(--text-base);
font-weight: var(--font-medium);
line-height: var(--leading-none);
border-radius: var(--radius-base);
border: none;
cursor: pointer;
transition: all var(--transition-fast);
white-space: nowrap;
font-family: var(--font-primary);
}
/* Button Sizes */
/* Button Sizes - Consistent Scaling */
.btn-xs {
padding: var(--space-1) var(--space-3);
font-size: var(--text-xs);
font-weight: var(--font-medium);
}
.btn-sm {
padding: var(--space-2) var(--space-4);
font-size: var(--text-sm);
font-weight: var(--font-medium);
}
.btn-md {
padding: var(--space-3) var(--space-6);
font-size: var(--text-base);
font-weight: var(--font-semibold);
}
.btn-lg {
padding: var(--space-4) var(--space-8);
font-size: var(--text-lg);
font-weight: var(--font-semibold);
}
.btn-xl {
padding: var(--space-5) var(--space-10);
font-size: var(--text-xl);
font-weight: var(--font-bold);
}
/* Button Variants */
.btn-primary {
background: linear-gradient(135deg, var(--color-secondary-600) 0%, var(--color-accent-500) 100%);
color: var(--color-text-inverse);
border: none;
position: relative;
overflow: hidden;
}
.btn-primary::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
transition: left 0.5s;
}
.btn-primary:hover {
background: linear-gradient(135deg, var(--color-secondary-700) 0%, var(--color-accent-600) 100%);
transform: translateY(-1px);
}
.btn-primary:hover::before {
left: 100%;
}
.btn-primary:active {
transform: translateY(0);
}
.btn-secondary {
background-color: var(--color-neutral-100);
color: var(--color-text-primary);
border: 1px solid var(--color-border-primary);
}
.btn-secondary:hover {
background-color: var(--color-neutral-200);
}
.btn-outline {
background-color: transparent;
color: var(--color-secondary-600);
border: 2px solid var(--color-secondary-600);
position: relative;
overflow: hidden;
}
.btn-outline:hover {
background-color: var(--color-secondary-600);
color: var(--color-text-inverse);
border-color: var(--color-secondary-600);
}
.btn-ghost {
background-color: transparent;
color: var(--color-text-secondary);
}
.btn-ghost:hover {
background-color: var(--color-neutral-100);
color: var(--color-text-primary);
}
.btn-gradient {
background: linear-gradient(135deg, var(--color-secondary-600) 0%, var(--color-accent-500) 100%);
color: var(--color-text-inverse);
border: none;
position: relative;
overflow: hidden;
}
.btn-gradient::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent);
transition: left 0.6s;
}
.btn-gradient:hover {
transform: translateY(-1px);
}
.btn-gradient:hover::before {
left: 100%;
}
.btn-gradient:active {
transform: translateY(0);
}
@keyframes gradientShift {
0% {
background-position: 0% 50%;
}
50% {
background-position: 100% 50%;
}
100% {
background-position: 0% 50%;
}
}
.btn:disabled {
opacity: 0.5;
cursor: not-allowed;
pointer-events: none;
}
.btn:focus-visible {
outline: 2px solid var(--color-primary-500);
outline-offset: 2px;
}
/* ============================================
FORM SYSTEM
============================================ */
.form-group {
margin-bottom: var(--space-6);
}
.form-label {
display: block;
margin-bottom: var(--space-2);
font-size: var(--text-sm);
font-weight: var(--font-medium);
color: var(--color-text-primary);
}
.form-input,
.form-textarea,
.form-select {
width: 100%;
padding: var(--space-3) var(--space-4);
font-size: var(--text-base);
font-family: var(--font-primary);
line-height: var(--leading-normal);
color: var(--color-text-primary);
background-color: var(--color-surface);
border: 1px solid var(--color-border-primary);
border-radius: var(--radius-base);
transition: all var(--transition-fast);
}
.form-input:focus,
.form-textarea:focus,
.form-select:focus {
outline: none;
border-color: var(--color-primary-500);
}
.form-textarea {
resize: vertical;
min-height: 120px;
}
/* ============================================
CARD SYSTEM
============================================ */
.card {
background-color: var(--color-white);
border-radius: var(--radius-lg);
border: 1px solid var(--color-border-primary);
padding: var(--space-6);
transition: all var(--transition-base);
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
}
.card:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}
/* Card variants */
.card-sm {
padding: var(--space-4);
}
.card-md {
padding: var(--space-6);
}
.card-lg {
padding: var(--space-8);
}
.card-header {
margin-bottom: var(--space-4);
}
.card-title {
font-size: var(--text-xl);
font-weight: var(--font-semibold);
margin-bottom: var(--space-2);
}
.card-body {
margin-bottom: var(--space-4);
}
.card-footer {
padding-top: var(--space-4);
border-top: 1px solid var(--color-border-secondary);
}
/* Section Header Badge - Consistent styling */
.section-badge {
display: inline-block;
padding: var(--space-2) var(--space-4);
margin-bottom: var(--space-4);
font-size: var(--text-sm);
font-weight: var(--font-semibold);
color: var(--color-primary-700);
background-color: var(--color-primary-100);
border-radius: var(--radius-full);
text-transform: uppercase;
letter-spacing: 0.05em;
}
/* Consistent section header spacing */
/* Page Hero Section */
.page-hero {
background: linear-gradient(135deg, rgba(139, 92, 246, 0.05) 0%, rgba(236, 72, 153, 0.05) 100%);
padding: var(--space-16) 0 var(--space-12) 0;
border-bottom: 1px solid var(--color-border-primary);
}
.page-hero .section-header {
text-align: center;
max-width: 900px;
margin: 0 auto;
margin-bottom: 0;
}
.page-hero .section-header h1 {
margin-bottom: var(--space-4);
}
.page-hero .section-header p {
color: var(--color-text-secondary);
margin-top: var(--space-4);
}
.section-header {
text-align: center;
margin-bottom: var(--space-12);
}
@media (min-width: 768px) {
.section-header {
margin-bottom: var(--space-16);
}
.page-hero {
padding: var(--space-20) 0 var(--space-16) 0;
}
}
/* ============================================
LAYOUT COMPONENTS
============================================ */
.container {
width: 100%;
max-width: var(--container-max-width);
margin: 0 auto;
padding: 0 var(--container-padding);
}
.section {
padding: var(--space-12);
}
.section:first-child {
padding: 0px;
}
.section:nth-child(even) {
background-color: var(--color-white);
}
.section-sm {
padding: var(--space-16) 0;
}
.section-lg {
padding: var(--space-24) 0;
}
.card-sm {
padding: var(--space-4);
}
.card-md {
padding: var(--space-6);
}
.card-lg {
padding: var(--space-8);
}
.grid {
display: grid;
gap: var(--space-6);
}
.grid-2 {
grid-template-columns: repeat(2, 1fr);
}
.grid-3 {
grid-template-columns: repeat(3, 1fr);
}
.grid-4 {
grid-template-columns: repeat(4, 1fr);
}
/* ============================================
HEADER
============================================ */
.header {
position: sticky;
top: 0;
z-index: var(--z-sticky);
background-color: rgba(255, 255, 255, 0.95);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
border-bottom: 1px solid var(--color-border-primary);
height: var(--header-height);
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
transition: all var(--transition-base);
}
.header-container {
display: flex;
align-items: center;
justify-content: space-between;
height: 100%;
max-width: var(--container-max-width);
margin: 0 auto;
padding: 0 var(--container-padding);
position: relative;
}
/* Enhanced Logo Styling */
.logo {
display: flex;
align-items: center;
gap: var(--space-2);
text-decoration: none;
transition: transform var(--transition-fast);
padding: var(--space-1) 0;
}
.logo:hover {
transform: translateY(-1px);
}
.logo-icon {
font-size: var(--text-2xl);
display: inline-block;
animation: float 3s ease-in-out infinite;
filter: drop-shadow(0 2px 4px rgba(139, 92, 246, 0.3));
}
@keyframes float {
0%, 100% {
transform: translateY(0px);
}
50% {
transform: translateY(-5px);
}
}
.logo-text {
font-size: var(--text-xl);
font-weight: 800;
background: linear-gradient(135deg, var(--color-secondary-600) 0%, var(--color-accent-500) 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
letter-spacing: -0.02em;
transition: all var(--transition-fast);
font-family: var(--font-primary);
display: inline-block;
line-height: 1.2;
}
.logo:hover .logo-text {
background: linear-gradient(135deg, var(--color-secondary-700) 0%, var(--color-accent-600) 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.nav {
display: flex;
align-items: center;
gap: var(--space-1);
}
.nav-link {
padding: var(--space-2) var(--space-4);
font-size: var(--text-base);
font-weight: var(--font-medium);
color: var(--color-text-secondary);
border-radius: var(--radius-base);
transition: all var(--transition-fast);
position: relative;
text-decoration: none;
white-space: nowrap;
border: 1px solid transparent;
}
.nav-link::before {
content: '';
position: absolute;
bottom: 0;
left: 50%;
transform: translateX(-50%);
width: 0;
height: 2px;
background: linear-gradient(90deg, var(--color-secondary-600), var(--color-accent-500));
transition: width var(--transition-fast), left var(--transition-fast);
border-radius: var(--radius-full);
}
.nav-link:hover {
background: linear-gradient(135deg, rgba(139, 92, 246, 0.08) 0%, rgba(236, 72, 153, 0.08) 100%);
color: var(--color-secondary-700);
border-color: var(--color-secondary-300);
font-weight: var(--font-semibold);
}
.nav-link:hover::before {
width: 80%;
background: linear-gradient(90deg, var(--color-secondary-600), var(--color-accent-500));
}
.nav-link.active {
background: linear-gradient(135deg, rgba(139, 92, 246, 0.1) 0%, rgba(236, 72, 153, 0.1) 100%);
color: var(--color-secondary-700);
border-color: var(--color-secondary-500);
font-weight: var(--font-semibold);
}
.nav-link.active::before {
width: 80%;
background: linear-gradient(90deg, var(--color-secondary-600), var(--color-accent-500));
}
.nav-link-demo {
background: linear-gradient(135deg, var(--color-secondary-600) 0%, var(--color-accent-500) 100%);
color: var(--color-text-inverse) !important;
font-weight: var(--font-semibold);
padding: var(--space-2) var(--space-5);
box-shadow: 0 2px 8px rgba(139, 92, 246, 0.3);
position: relative;
overflow: hidden;
border: none;
}
.nav-link-demo::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent 0%, rgba(255, 255, 255, 0.2) 50%, transparent 100%);
transition: left 0.6s;
pointer-events: none;
}
.nav-link-demo:hover {
transform: translateY(-1px);
box-shadow: 0 4px 16px rgba(139, 92, 246, 0.5);
background: linear-gradient(135deg, var(--color-secondary-600) 0%, var(--color-accent-500) 100%) !important;
color: var(--color-text-inverse) !important;
}
.nav-link-demo:hover::before {
left: 100%;
}
.nav-link-demo.active {
background: linear-gradient(135deg, var(--color-secondary-700) 0%, var(--color-accent-600) 100%);
box-shadow: 0 4px 16px rgba(139, 92, 246, 0.5);
}
/* ============================================
FOOTER
============================================ */
.footer {
background-color: var(--color-neutral-900);
color: var(--color-text-inverse);
padding: var(--space-16) 0 var(--space-8) 0;
}
.footer-content {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: var(--space-8);
margin-bottom: var(--space-8);
}
.footer-section-title {
font-size: var(--text-lg);
font-weight: var(--font-semibold);
margin-bottom: var(--space-4);
}
.footer-link {
display: block;
color: var(--color-neutral-400);
margin-bottom: var(--space-2);
transition: color var(--transition-fast);
}
.footer-link:hover {
color: var(--color-text-inverse);
}
.footer-bottom {
padding-top: var(--space-8);
border-top: 1px solid var(--color-neutral-800);
text-align: center;
color: var(--color-neutral-400);
font-size: var(--text-sm);
}
/* ============================================
UTILITY CLASSES
============================================ */
/* Spacing */
.m-0 {
margin: var(--space-0);
}
.m-2 {
margin: var(--space-2);
}
.m-4 {
margin: var(--space-4);
}
.m-6 {
margin: var(--space-6);
}
.m-8 {
margin: var(--space-8);
}
.mt-0 {
margin-top: var(--space-0);
}
.mt-2 {
margin-top: var(--space-2);
}
.mt-4 {
margin-top: var(--space-4);
}
.mt-6 {
margin-top: var(--space-6);
}
.mt-8 {
margin-top: var(--space-8);
}
.mb-0 {
margin-bottom: var(--space-0);
}
.mb-2 {
margin-bottom: var(--space-2);
}
.mb-4 {
margin-bottom: var(--space-4);
}
.mb-6 {
margin-bottom: var(--space-6);
}
.mb-8 {
margin-bottom: var(--space-8);
}
.p-0 {
padding: var(--space-0);
}
.p-2 {
padding: var(--space-2);
}
.p-4 {
padding: var(--space-4);
}
.p-6 {
padding: var(--space-6);
}
.p-8 {
padding: var(--space-8);
}
/* Text Alignment */
.text-left {
text-align: left;
}
.text-center {
text-align: center;
}
.text-right {
text-align: right;
}
/* Text Colors */
.text-primary {
color: var(--color-primary-600);
}
.text-secondary {
color: var(--color-text-secondary);
}
.text-primary-600 {
color: var(--color-primary-600);
}
.text-neutral-100 {
color: var(--color-neutral-100);
}
.text-neutral-900 {
color: var(--color-neutral-900);
}
/* Background Colors */
.bg-neutral-900 {
background-color: var(--color-neutral-900);
}
.bg-neutral-100 {
background-color: var(--color-neutral-100);
}
/* Border Colors */
.border-border-primary {
border-color: var(--color-border-primary);
}
.border-primary-600 {
border-color: var(--color-primary-600);
}
.border-transparent {
border-color: transparent;
}
/* Border Width */
.border-b {
border-bottom-width: 1px;
}
.border-b-2 {
border-bottom-width: 2px;
}
/* Max Width */
.max-w-3xl {
max-width: 48rem;
}
.max-w-4xl {
max-width: 56rem;
}
/* Margin Bottom */
.mb-4 {
margin-bottom: var(--space-4);
}
.mb-6 {
margin-bottom: var(--space-6);
}
.mb-8 {
margin-bottom: var(--space-8);
}
.mb-12 {
margin-bottom: var(--space-12);
}
.mb-16 {
margin-bottom: var(--space-16);
}
/* Margin Top */
.mt-16 {
margin-top: var(--space-16);
}
/* Padding */
.p-4 {
padding: var(--space-4);
}
.p-6 {
padding: var(--space-6);
}
.p-8 {
padding: var(--space-8);
}
/* Padding X */
.px-6 {
padding-left: var(--space-6);
padding-right: var(--space-6);
}
.px-8 {
padding-left: var(--space-8);
padding-right: var(--space-8);
}
/* Padding Y */
.py-3 {
padding-top: var(--space-3);
padding-bottom: var(--space-3);
}
/* Font Weight */
.font-semibold {
font-weight: var(--font-semibold);
}
/* Transition */
.transition-all {
transition: all var(--transition-fast);
}
/* Rounded */
.rounded-none {
border-radius: 0;
}
.rounded-lg {
border-radius: var(--radius-lg);
}
/* Text Size */
.text-sm {
font-size: var(--text-sm);
}
.text-xl {
font-size: var(--text-xl);
}
.text-3xl {
font-size: var(--text-3xl);
}
.text-4xl {
font-size: var(--text-4xl);
}
.text-5xl {
font-size: var(--text-5xl);
}
.text-6xl {
font-size: var(--text-6xl);
}
/* Display */
.block {
display: block;
}
/* Height Utilities */
.min-h-screen {
min-height: 100vh;
}
/* Grid Utilities */
.grid-2 {
grid-template-columns: repeat(2, 1fr);
}
/* Items Center */
.items-center {
align-items: center;
}
/* ============================================
GRADIENT UTILITIES
============================================ */
.text-gradient-primary {
background: linear-gradient(135deg, var(--color-primary-600) 0%, var(--color-primary-800) 100%);
background-clip: text;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.text-gradient-secondary {
background: linear-gradient(135deg, var(--color-secondary-500) 0%, var(--color-secondary-700) 100%);
background-clip: text;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.text-gradient-purple-pink {
background: linear-gradient(135deg, var(--color-secondary-600) 0%, var(--color-accent-500) 100%);
background-clip: text;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.bg-gradient-primary {
background: linear-gradient(135deg, var(--color-primary-600) 0%, var(--color-primary-800) 100%);
}
.bg-gradient-secondary {
background: linear-gradient(135deg, var(--color-secondary-500) 0%, var(--color-secondary-700) 100%);
}
.bg-gradient-purple-pink {
background: linear-gradient(135deg, var(--color-secondary-600) 0%, var(--color-accent-500) 100%);
}
/* Flex Utilities */
.flex {
display: flex;
}
.flex-col {
flex-direction: column;
}
.items-center {
align-items: center;
}
.justify-center {
justify-content: center;
}
.justify-between {
justify-content: space-between;
}
.gap-2 {
gap: var(--space-2);
}
.gap-4 {
gap: var(--space-4);
}
.gap-6 {
gap: var(--space-6);
}
/* ============================================
RESPONSIVE DESIGN
============================================ */
@media (max-width: 768px) {
:root {
--text-4xl: 2.441rem;
--text-3xl: 1.953rem;
--container-padding: var(--space-4);
}
.grid-2,
.grid-3,
.grid-4 {
grid-template-columns: 1fr;
}
.btn-lg {
padding: var(--space-3) var(--space-6);
font-size: var(--text-base);
}
.btn-xl {
padding: var(--space-4) var(--space-8);
font-size: var(--text-lg);
}
.nav {
flex-direction: column;
width: 100%;
}
}
@media (max-width: 480px) {
:root {
--text-4xl: 1.953rem;
--text-3xl: 1.563rem;
}
}
/* ============================================
MODAL SYSTEM
============================================ */
.modal-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.7);
backdrop-filter: blur(4px);
z-index: var(--z-modal);
display: flex;
align-items: center;
justify-content: center;
padding: var(--space-4);
animation: modalFadeIn 0.3s ease-out;
}
.modal-container {
background-color: var(--color-surface);
border-radius: var(--radius-xl);
max-width: 90vw;
max-height: 90vh;
width: 100%;
max-width: 900px;
display: flex;
flex-direction: column;
animation: modalSlideIn 0.3s ease-out;
overflow: hidden;
box-shadow: var(--shadow-xl);
margin: auto;
}
.modal-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: var(--space-6);
border-bottom: 1px solid var(--color-border-primary);
background-color: var(--color-surface-elevated);
}
.modal-title-section {
flex: 1;
}
.modal-title {
font-size: var(--text-xl);
font-weight: var(--font-semibold);
color: var(--color-text-primary);
margin: 0 0 var(--space-1) 0;
}
.modal-subtitle {
font-size: var(--text-sm);
color: var(--color-text-secondary);
margin: 0;
text-transform: uppercase;
letter-spacing: var(--tracking-wide);
}
.modal-actions {
display: flex;
gap: var(--space-2);
align-items: center;
}
.close-btn {
width: 32px;
height: 32px;
border-radius: var(--radius-full);
display: flex;
align-items: center;
justify-content: center;
font-size: var(--text-lg);
font-weight: var(--font-bold);
transition: all var(--transition-fast);
}
.close-btn:hover {
background-color: var(--color-error);
color: var(--color-text-inverse);
transform: scale(1.1);
}
.modal-body {
padding: var(--space-6);
overflow: auto;
flex: 1;
display: flex;
flex-direction: column;
min-height: 0;
}
.modal-body .code-block {
background-color: var(--color-neutral-900);
color: var(--color-neutral-100);
padding: var(--space-6);
border-radius: var(--radius-lg);
overflow-x: auto;
overflow-y: auto;
font-family: var(--font-mono);
font-size: var(--text-sm);
line-height: var(--leading-relaxed);
margin: 0;
border: 1px solid var(--color-neutral-800);
max-height: calc(90vh - 200px);
flex: 1;
min-height: 0;
}
.modal-body .code-block code {
color: inherit;
background: none;
padding: 0;
border-radius: 0;
font-size: inherit;
font-family: inherit;
}
.copy-icon,
.copied-icon {
margin-right: var(--space-1);
}
.modal-footer {
height: 40px;
width: 100%;
background-color: var(--color-white);
}
.btn-success {
background: linear-gradient(135deg, var(--color-success) 0%, #059669 100%);
color: var(--color-text-inverse);
border: none;
}
.btn-success:hover {
background: linear-gradient(135deg, #059669 0%, #047857 100%);
transform: translateY(-1px);
}
@keyframes modalFadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@keyframes modalSlideIn {
from {
opacity: 0;
transform: scale(0.9) translateY(-20px);
}
to {
opacity: 1;
transform: scale(1) translateY(0);
}
}
/* Modal Responsive */
@media (max-width: 768px) {
.modal-overlay {
padding: var(--space-2);
}
.modal-container {
max-width: 95vw;
max-height: 95vh;
}
.modal-header {
padding: var(--space-4);
flex-direction: column;
gap: var(--space-4);
align-items: stretch;
}
.modal-title-section {
text-align: center;
}
.modal-actions {
justify-content: center;
}
.modal-body {
padding: var(--space-4);
}
.modal-body .code-block {
padding: var(--space-4);
font-size: var(--text-xs);
}
}
/* ============================================
MAIN LAYOUT ENHANCEMENTS
============================================ */
/* Layout Container */
.layout-container {
min-height: 100vh;
display: flex;
flex-direction: column;
}
/* Header Enhancements */
.header.scrolled {
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
background-color: rgba(255, 255, 255, 0.98);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
}
.header-container {
position: relative;
}
/* Navigation Enhancements */
.nav {
position: relative;
}
.nav-link.active {
background-color: var(--color-primary-50);
color: var(--color-primary-600);
font-weight: var(--font-semibold);
}
/* Mobile Menu Styles */
.hamburger {
display: none;
flex-direction: column;
justify-content: space-around;
width: 28px;
height: 28px;
background: transparent;
border: none;
cursor: pointer;
padding: 0;
z-index: var(--z-dropdown);
position: relative;
transition: all var(--transition-fast);
}
.hamburger:hover {
opacity: 0.8;
}
.hamburger-line {
width: 100%;
height: 3px;
background: linear-gradient(90deg, var(--color-primary-600), var(--color-secondary-600));
border-radius: var(--radius-full);
transition: all var(--transition-base);
transform-origin: center;
}
.hamburger.active .hamburger-line:nth-child(1) {
transform: rotate(45deg) translate(8px, 8px);
}
.hamburger.active .hamburger-line:nth-child(2) {
opacity: 0;
transform: translateX(-10px);
}
.hamburger.active .hamburger-line:nth-child(3) {
transform: rotate(-45deg) translate(8px, -8px);
}
/* Mobile Menu Overlay */
.mobile-menu-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.5);
z-index: calc(var(--z-dropdown) - 1);
animation: fadeIn 0.3s ease-out;
}
@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
/* Header Actions */
.header-actions {
display: flex;
gap: var(--space-2);
align-items: center;
}
/* Demo Link Special Styling */
.nav-link.demo-link {
background-color: var(--color-primary-600);
color: var(--color-text-inverse);
border-radius: var(--radius-base);
transition: all var(--transition-fast);
}
.nav-link.demo-link:hover {
background-color: var(--color-primary-700);
transform: translateY(-1px);
}
.nav-link.demo-link.active {
background-color: var(--color-primary-700);
}
/* Footer Enhancements */
.footer-section {
display: flex;
flex-direction: column;
text-align: center;
max-width: 300px;
margin: 0 auto;
}
@media (min-width: 768px) {
.footer-section {
text-align: left;
margin: 0;
}
}
.footer-section-title {
font-size: var(--text-lg);
font-weight: var(--font-semibold);
margin-bottom: var(--space-4);
color: var(--color-text-inverse);
}
.footer-links {
list-style: none;
padding: 0;
margin: 0;
}
.footer-item {
margin-bottom: var(--space-2);
}
.footer-link {
color: var(--color-neutral-400);
transition: color var(--transition-fast);
display: inline-flex;
align-items: center;
}
.footer-link:hover {
color: var(--color-text-inverse);
}
/* Social Links */
.social-links {
display: flex;
gap: var(--space-4);
flex-wrap: wrap;
}
.footer-community {
margin-top: var(--space-6);
}
/* Community Stats Styling */
.footer-community-stats {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: var(--space-4);
margin-top: var(--space-4);
}
.community-stat-item {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: var(--space-4);
background-color: rgba(255, 255, 255, 0.05);
border-radius: var(--radius-base);
border: 1px solid rgba(255, 255, 255, 0.1);
transition: all var(--transition-fast);
}
.community-stat-item:hover {
background-color: rgba(255, 255, 255, 0.08);
border-color: rgba(255, 255, 255, 0.2);
transform: translateY(-2px);
}
.community-stat-value {
font-size: var(--text-2xl);
font-weight: var(--font-bold);
color: var(--color-text-inverse);
margin-bottom: var(--space-1);
background: linear-gradient(135deg, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0.8) 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
line-height: 1.2;
}
.community-stat-label {
font-size: var(--text-sm);
color: var(--color-neutral-400);
text-transform: uppercase;
letter-spacing: var(--tracking-wide);
font-weight: var(--font-medium);
}
.community-stat-item:hover .community-stat-label {
color: var(--color-neutral-300);
}
.footer-social {
margin-top: var(--space-4);
}
.social-item {
list-style: none;
}
.social-item a {
display: inline-flex;
align-items: center;
gap: var(--space-2);
padding: var(--space-2) var(--space-3);
border-radius: var(--radius-base);
transition: all var(--transition-fast);
color: var(--color-neutral-400);
text-decoration: none;
}
.social-item a:hover {
color: var(--color-text-inverse);
background-color: rgba(255, 255, 255, 0.1);
transform: translateY(-2px);
}
.social-item a i {
font-size: 1.25rem;
}
/* X (Twitter) Icon Special Styling */
.social-item a .x-icon,
.social-item a .fa-x-twitter {
font-weight: 900;
font-size: 1.1rem;
line-height: 1;
display: inline-block;
width: 1.25rem;
text-align: center;
}
.social-item a:hover .x-icon,
.social-item a:hover .fa-x-twitter {
color: var(--color-text-inverse);
}
.social-name {
font-size: var(--text-sm);
}
/* Newsletter Form */
.newsletter {
margin-top: var(--space-6);
}
.newsletter-title {
font-size: var(--text-base);
font-weight: var(--font-semibold);
margin-bottom: var(--space-2);
color: var(--color-text-inverse);
}
.newsletter-description {
font-size: var(--text-sm);
margin-bottom: var(--space-4);
color: var(--color-neutral-400);
}
/* Footer Bottom */
.footer-bottom {
margin-top: var(--space-8);
padding-top: var(--space-8);
border-top: 1px solid var(--color-neutral-800);
}
.footer-bottom-content {
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
gap: var(--space-4);
}
.copyright {
font-size: var(--text-sm);
color: var(--color-neutral-400);
margin: 0;
}
.footer-bottom-links {
display: flex;
gap: var(--space-4);
flex-wrap: wrap;
}
.footer-bottom-link {
font-size: var(--text-sm);
color: var(--color-neutral-400);
transition: color var(--transition-fast);
}
.footer-bottom-link:hover {
color: var(--color-text-inverse);
}
/* Community Stats */
.community-stats {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: var(--space-4);
margin-bottom: var(--space-6);
}
.stat-item {
text-align: center;
padding: var(--space-4);
background-color: var(--color-neutral-800);
border-radius: var(--radius-base);
}
.stat-number {
display: block;
font-size: var(--text-2xl);
font-weight: var(--font-bold);
color: var(--color-text-inverse);
margin-bottom: var(--space-1);
}
.stat-label {
font-size: var(--text-sm);
color: var(--color-neutral-400);
}
/* Mobile Responsive Enhancements */
@media (max-width: 768px) {
.header-container {
flex-wrap: nowrap;
gap: var(--space-4);
}
/* Hero Section Mobile Layout */
.grid-2 {
grid-template-columns: 1fr;
gap: var(--space-8);
}
.min-h-screen {
min-height: auto;
}
.hamburger {
display: flex;
order: 3;
margin-left: auto;
}
.header-actions {
display: none;
}
/* Side-slide Mobile Menu */
.nav {
position: fixed;
top: 0;
right: -100%;
width: 280px;
max-width: 85vw;
height: 100vh;
background-color: var(--color-white);
box-shadow: -4px 0 20px rgba(0, 0, 0, 0.15);
padding: var(--space-8) var(--space-6);
flex-direction: column;
align-items: flex-start;
gap: var(--space-2);
z-index: var(--z-dropdown);
transition: right 0.3s cubic-bezier(0.4, 0, 0.2, 1);
overflow-y: auto;
overflow-x: hidden;
}
.nav.mobile-open {
right: 0;
animation: slideInRight 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
@keyframes slideInRight {
from {
right: -100%;
}
to {
right: 0;
}
}
.nav-link {
width: 100%;
text-align: left;
padding: var(--space-4) var(--space-5);
font-size: var(--text-base);
border-radius: var(--radius-base);
position: relative;
transition: all var(--transition-fast);
margin-bottom: var(--space-1);
}
.nav-link::before {
left: 0;
transform: translateX(0);
width: 3px;
height: 100%;
top: 0;
bottom: 0;
}
.nav-link:hover::before,
.nav-link.active::before {
width: 3px;
height: 100%;
}
.nav-link:hover {
background: linear-gradient(135deg, rgba(139, 92, 246, 0.08) 0%, rgba(236, 72, 153, 0.08) 100%);
color: var(--color-secondary-700);
border-color: var(--color-secondary-300);
padding-left: var(--space-6);
transform: translateX(4px);
font-weight: var(--font-semibold);
}
.nav-link.active {
background: linear-gradient(135deg, rgba(139, 92, 246, 0.1) 0%, rgba(236, 72, 153, 0.1) 100%);
color: var(--color-secondary-700);
border-color: var(--color-secondary-500);
padding-left: var(--space-6);
font-weight: var(--font-semibold);
}
.nav-link-demo {
background: linear-gradient(135deg, var(--color-secondary-600) 0%, var(--color-accent-500) 100%);
color: var(--color-text-inverse) !important;
margin-top: var(--space-4);
padding: var(--space-4) var(--space-5);
text-align: center;
box-shadow: 0 4px 12px rgba(139, 92, 246, 0.3);
position: relative;
overflow: hidden;
border: none;
transition: all var(--transition-fast);
}
.nav-link-demo::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent 0%, rgba(255, 255, 255, 0.2) 50%, transparent 100%);
transition: left 0.6s;
pointer-events: none;
}
.nav-link-demo:hover {
transform: translateY(-2px);
box-shadow: 0 6px 20px rgba(139, 92, 246, 0.5);
padding-left: var(--space-5);
background: linear-gradient(135deg, var(--color-secondary-600) 0%, var(--color-accent-500) 100%) !important;
color: var(--color-text-inverse) !important;
background: linear-gradient(135deg, var(--color-secondary-600) 0%, var(--color-accent-500) 100%);
color: var(--color-text-inverse) !important;
}
.nav-link-demo:hover::before {
left: 100%;
}
.nav-link-demo:active {
transform: translateY(0);
}
.nav-link-demo.active {
background: linear-gradient(135deg, var(--color-secondary-700) 0%, var(--color-accent-600) 100%);
box-shadow: 0 6px 20px rgba(139, 92, 246, 0.5);
}
/* Logo adjustments for mobile */
.logo-text {
font-size: var(--text-lg);
font-weight: 800;
background: linear-gradient(135deg, var(--color-secondary-600) 0%, var(--color-accent-500) 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.logo-icon {
font-size: var(--text-xl);
}
.footer-content {
grid-template-columns: 1fr;
gap: var(--space-8);
}
.footer-bottom-content {
flex-direction: column;
text-align: center;
gap: var(--space-4);
}
.community-stats {
grid-template-columns: 1fr;
gap: var(--space-4);
}
.social-links {
justify-content: center;
}
.newsletter .form-group .input-group {
flex-direction: column;
}
.newsletter .form-group .input-group .form-input {
margin-bottom: var(--space-2);
}
}
@media (max-width: 480px) {
.header-container {
padding: 0 var(--space-4);
}
.logo {
font-size: var(--text-lg);
}
.footer-section {
text-align: center;
}
.footer-section-title {
text-align: center;
}
.footer-community-stats {
grid-template-columns: 1fr;
gap: var(--space-3);
}
.community-stat-item {
padding: var(--space-3);
}
/* ============================================
LEGAL PAGES STYLING (Privacy, Terms, License)
============================================ */
.legal-page {
padding: var(--space-16) 0;
background-color: var(--color-white);
}
.legal-page .section-header {
text-align: center;
margin-bottom: var(--space-12);
padding-bottom: var(--space-8);
border-bottom: 2px solid var(--color-border-primary);
}
.legal-page .section-header h1 {
margin-bottom: var(--space-4);
}
.legal-page .section-header p {
color: var(--color-text-secondary);
font-size: var(--text-base);
}
.legal-content {
max-width: 800px;
margin: 0 auto;
}
.legal-section {
margin-bottom: var(--space-10);
padding: var(--space-6);
background-color: var(--color-white);
border-radius: var(--radius-lg);
border-left: 4px solid var(--color-primary-500);
transition: all var(--transition-fast);
}
.legal-section:hover {
box-shadow: 0 4px 12px