/* ============================================ Cattle Breed Classifier – Design System Premium dark theme with warm amber accents ============================================ */ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&family=Outfit:wght@400;500;600;700;800&display=swap'); :root { /* Primary palette */ --color-bg-primary: #1f2330; --color-bg-secondary: #2c3144; --color-bg-card: #373e56; --color-bg-card-hover: #434b68; --color-bg-glass: rgba(118, 127, 158, 0.3); --color-bg-input: #2c3144; /* Accent */ --color-accent: #DAA464; --color-accent-light: #DEC384; --color-accent-dark: #b6854d; --color-accent-glow: rgba(218, 164, 100, 0.2); /* Success/Error */ --color-success: #10b981; --color-error: #ef4444; --color-warning: #DAA464; --color-info: #767F9E; /* Text */ --color-text-primary: #E8DDB4; --color-text-secondary: #DEC384; --color-text-muted: #767F9E; /* Borders */ --color-border: rgba(118, 127, 158, 0.3); --color-border-accent: rgba(218, 164, 100, 0.4); /* Gradients */ --gradient-hero: linear-gradient(135deg, #1f2330 0%, #373e56 50%, #2c3144 100%); --gradient-accent: linear-gradient(135deg, #DEC384 0%, #DAA464 100%); --gradient-card: linear-gradient(145deg, rgba(55, 62, 86, 0.9), rgba(44, 49, 68, 0.7)); /* Shadows */ --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.3); --shadow-md: 0 4px 14px rgba(0, 0, 0, 0.4); --shadow-lg: 0 10px 40px rgba(0, 0, 0, 0.5); --shadow-glow: 0 0 30px rgba(218, 164, 100, 0.15); /* Spacing */ --radius-sm: 8px; --radius-md: 12px; --radius-lg: 16px; --radius-xl: 24px; /* Typography */ --font-heading: 'Outfit', sans-serif; --font-body: 'Inter', sans-serif; /* Transitions */ --transition-fast: 150ms ease; --transition-normal: 250ms ease; --transition-slow: 400ms cubic-bezier(0.4, 0, 0.2, 1); } *, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; } html { font-size: 16px; scroll-behavior: smooth; } body { font-family: var(--font-body); background: var(--color-bg-primary); color: var(--color-text-primary); line-height: 1.6; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; min-height: 100vh; } #root { min-height: 100vh; display: flex; flex-direction: column; } /* ============ TYPOGRAPHY ============ */ h1, h2, h3, h4, h5, h6 { font-family: var(--font-heading); font-weight: 700; line-height: 1.2; } a { color: var(--color-accent); text-decoration: none; transition: color var(--transition-fast); } a:hover { color: var(--color-accent-light); } /* ============ HEADER/NAV ============ */ .navbar { position: sticky; top: 0; z-index: 100; background: rgba(10, 14, 23, 0.85); backdrop-filter: blur(16px) saturate(180%); border-bottom: 1px solid var(--color-border); padding: 0 2rem; } .navbar-inner { max-width: 1200px; margin: 0 auto; display: flex; align-items: center; justify-content: space-between; height: 64px; } .navbar-brand { display: flex; align-items: center; gap: 10px; font-family: var(--font-heading); font-size: 1.25rem; font-weight: 700; color: var(--color-text-primary); } .navbar-brand span { background: var(--gradient-accent); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } .nav-links { display: flex; gap: 6px; list-style: none; } .nav-links a { padding: 8px 16px; border-radius: var(--radius-sm); color: var(--color-text-secondary); font-weight: 500; font-size: 0.9rem; transition: all var(--transition-fast); } .nav-links a:hover, .nav-links a.active { background: var(--color-accent-glow); color: var(--color-accent); } /* ============ LAYOUT ============ */ .page { flex: 1; max-width: 1200px; width: 100%; margin: 0 auto; padding: 2rem; } .section-title { font-size: 2rem; margin-bottom: 0.5rem; } .section-subtitle { color: var(--color-text-secondary); font-size: 1.05rem; margin-bottom: 2rem; } /* ============ CARDS ============ */ .card { background: var(--gradient-card); border: 1px solid var(--color-border); border-radius: var(--radius-lg); padding: 1.5rem; backdrop-filter: blur(10px); transition: all var(--transition-normal); } .card:hover { border-color: var(--color-border-accent); box-shadow: var(--shadow-glow); transform: translateY(-2px); } .glass-card { background: var(--color-bg-glass); border: 1px solid var(--color-border); border-radius: var(--radius-lg); backdrop-filter: blur(16px); padding: 2rem; } /* ============ HERO SECTION ============ */ .hero { text-align: center; padding: 4rem 0 3rem; } .hero h1 { font-size: 3.2rem; font-weight: 800; margin-bottom: 1rem; letter-spacing: -0.02em; } .hero h1 .accent { background: var(--gradient-accent); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } .hero p { font-size: 1.15rem; color: var(--color-text-secondary); max-width: 600px; margin: 0 auto 2rem; } .hero-cta { display: inline-flex; align-items: center; gap: 8px; padding: 14px 32px; background: var(--gradient-accent); color: #000; font-weight: 600; font-size: 1rem; border: none; border-radius: var(--radius-md); cursor: pointer; transition: all var(--transition-normal); box-shadow: 0 4px 20px rgba(245, 158, 11, 0.3); } .hero-cta:hover { transform: translateY(-2px); box-shadow: 0 6px 30px rgba(245, 158, 11, 0.4); } /* ============ FEATURES GRID ============ */ .features-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 1.5rem; margin-top: 3rem; } .feature-card { text-align: center; padding: 2rem 1.5rem; } .feature-icon { font-size: 2.5rem; margin-bottom: 1rem; } .feature-card h3 { font-size: 1.1rem; margin-bottom: 0.5rem; } .feature-card p { color: var(--color-text-secondary); font-size: 0.9rem; } /* ============ PREDICT PAGE ============ */ .predict-layout { display: grid; grid-template-columns: 1fr 1fr; gap: 2rem; margin-top: 1.5rem; } @media (max-width: 768px) { .predict-layout { grid-template-columns: 1fr; } } .input-tabs { display: flex; gap: 4px; background: var(--color-bg-primary); padding: 4px; border-radius: var(--radius-md); margin-bottom: 1.5rem; } .input-tab { flex: 1; padding: 10px 16px; border: none; border-radius: var(--radius-sm); background: transparent; color: var(--color-text-secondary); font-weight: 500; font-size: 0.85rem; cursor: pointer; transition: all var(--transition-fast); } .input-tab.active { background: var(--color-accent-glow); color: var(--color-accent); } /* Upload zone */ .upload-zone { border: 2px dashed var(--color-border); border-radius: var(--radius-lg); padding: 3rem 2rem; text-align: center; cursor: pointer; transition: all var(--transition-normal); background: var(--color-bg-input); } .upload-zone:hover, .upload-zone.drag-over { border-color: var(--color-accent); background: var(--color-accent-glow); } .upload-zone .icon { font-size: 3rem; margin-bottom: 1rem; } .upload-zone p { color: var(--color-text-secondary); } .upload-zone .hint { font-size: 0.8rem; color: var(--color-text-muted); margin-top: 0.5rem; } /* Image preview */ .image-preview { position: relative; border-radius: var(--radius-lg); overflow: hidden; margin-top: 1rem; } .image-preview img { width: 100%; max-height: 350px; object-fit: contain; border-radius: var(--radius-lg); background: var(--color-bg-input); } .image-preview .remove-btn { position: absolute; top: 8px; right: 8px; width: 32px; height: 32px; border-radius: 50%; border: none; background: rgba(0,0,0,0.7); color: #fff; font-size: 1rem; cursor: pointer; display: flex; align-items: center; justify-content: center; } /* URL Input */ .url-input-group { display: flex; gap: 8px; margin-top: 0.5rem; } .url-input-group input { flex: 1; padding: 12px 16px; border-radius: var(--radius-md); border: 1px solid var(--color-border); background: var(--color-bg-input); color: var(--color-text-primary); font-size: 0.9rem; outline: none; transition: border-color var(--transition-fast); } .url-input-group input:focus { border-color: var(--color-accent); } /* Buttons */ .btn-primary { padding: 12px 28px; background: var(--gradient-accent); color: #000; font-weight: 600; border: none; border-radius: var(--radius-md); cursor: pointer; font-size: 0.95rem; transition: all var(--transition-normal); } .btn-primary:hover { transform: translateY(-1px); box-shadow: 0 4px 20px rgba(245, 158, 11, 0.3); } .btn-primary:disabled { opacity: 0.5; cursor: not-allowed; transform: none; } .btn-secondary { padding: 10px 20px; background: var(--color-bg-card); color: var(--color-text-primary); border: 1px solid var(--color-border); border-radius: var(--radius-md); cursor: pointer; font-size: 0.9rem; transition: all var(--transition-fast); } .btn-secondary:hover { border-color: var(--color-accent); } .predict-btn { width: 100%; margin-top: 1.5rem; padding: 14px; font-size: 1rem; } /* ============ RESULT CARD ============ */ .result-card { animation: slideIn 0.4s var(--transition-slow); } @keyframes slideIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } .result-header { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 1.5rem; } .result-breed-name { font-size: 1.6rem; font-weight: 700; font-family: var(--font-heading); } .result-badge { display: inline-flex; align-items: center; gap: 6px; padding: 6px 14px; border-radius: 20px; font-size: 0.8rem; font-weight: 600; } .result-badge.high { background: rgba(16, 185, 129, 0.15); color: var(--color-success); } .result-badge.medium { background: rgba(245, 158, 11, 0.15); color: var(--color-warning); } .result-badge.low { background: rgba(239, 68, 68, 0.15); color: var(--color-error); } /* Confidence bar */ .confidence-bar-container { margin-bottom: 1.5rem; } .confidence-bar-label { display: flex; justify-content: space-between; font-size: 0.85rem; color: var(--color-text-secondary); margin-bottom: 6px; } .confidence-bar { height: 8px; background: var(--color-bg-primary); border-radius: 4px; overflow: hidden; } .confidence-bar-fill { height: 100%; border-radius: 4px; background: var(--gradient-accent); transition: width 0.6s cubic-bezier(0.4, 0, 0.2, 1); } /* Top-K predictions */ .topk-list { margin-bottom: 1.5rem; } .topk-item { display: flex; justify-content: space-between; align-items: center; padding: 10px 0; border-bottom: 1px solid var(--color-border); } .topk-item:last-child { border-bottom: none; } .topk-rank { width: 28px; height: 28px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 0.75rem; font-weight: 600; background: var(--color-bg-primary); color: var(--color-text-secondary); margin-right: 12px; } .topk-rank.first { background: var(--color-accent-glow); color: var(--color-accent); } .topk-name { flex: 1; font-weight: 500; } .topk-conf { color: var(--color-text-secondary); font-size: 0.9rem; } /* Breed info grid */ .breed-info-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 12px; } .breed-info-item { padding: 12px; background: var(--color-bg-primary); border-radius: var(--radius-sm); } .breed-info-label { font-size: 0.75rem; color: var(--color-text-muted); text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 4px; } .breed-info-value { font-weight: 600; font-size: 0.95rem; } /* Warning */ .prediction-warning { display: flex; align-items: flex-start; gap: 10px; padding: 12px 16px; background: rgba(245, 158, 11, 0.1); border: 1px solid rgba(245, 158, 11, 0.2); border-radius: var(--radius-md); margin-top: 1rem; font-size: 0.85rem; color: var(--color-warning); } /* ============ BREED EXPLORER ============ */ .breed-filters { display: flex; gap: 12px; margin-bottom: 2rem; flex-wrap: wrap; } .breed-filters input, .breed-filters select { padding: 10px 16px; border-radius: var(--radius-md); border: 1px solid var(--color-border); background: var(--color-bg-input); color: var(--color-text-primary); font-size: 0.9rem; outline: none; } .breed-filters input:focus, .breed-filters select:focus { border-color: var(--color-accent); } .breeds-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); gap: 1.5rem; } .breed-card-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 0.75rem; } .breed-card-name { font-size: 1.1rem; font-weight: 600; font-family: var(--font-heading); } .breed-type-badge { padding: 4px 10px; border-radius: 12px; font-size: 0.7rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; } .breed-type-badge.cow { background: rgba(59, 130, 246, 0.15); color: var(--color-info); } .breed-type-badge.buffalo { background: rgba(139, 92, 246, 0.15); color: #8b5cf6; } .breed-card-detail { display: flex; justify-content: space-between; padding: 6px 0; font-size: 0.85rem; } .breed-card-detail .label { color: var(--color-text-muted); } .breed-card-detail .value { font-weight: 500; } .breed-card-description { margin-top: 0.75rem; color: var(--color-text-secondary); font-size: 0.85rem; line-height: 1.5; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; } /* ============ CAMERA ============ */ .camera-container { position: relative; border-radius: var(--radius-lg); overflow: hidden; background: #000; } .camera-container video { width: 100%; max-height: 350px; object-fit: cover; } .camera-controls { display: flex; justify-content: center; gap: 12px; margin-top: 1rem; } .camera-capture-btn { width: 56px; height: 56px; border-radius: 50%; border: 3px solid var(--color-accent); background: transparent; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: all var(--transition-fast); } .camera-capture-btn:hover { background: var(--color-accent-glow); } .camera-capture-btn::after { content: ''; width: 40px; height: 40px; border-radius: 50%; background: var(--color-accent); } /* ============ LOADING ============ */ .loading-spinner { display: flex; flex-direction: column; align-items: center; gap: 1rem; padding: 3rem; } .spinner { width: 40px; height: 40px; border: 3px solid var(--color-border); border-top-color: var(--color-accent); border-radius: 50%; animation: spin 0.8s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } /* ============ FOOTER ============ */ .footer { border-top: 1px solid var(--color-border); padding: 2rem; text-align: center; color: var(--color-text-muted); font-size: 0.85rem; margin-top: auto; } .footer a { color: var(--color-accent); } /* ============ ABOUT PAGE ============ */ .about-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 1.5rem; margin-top: 2rem; } .about-card h3 { font-size: 1.1rem; margin-bottom: 0.75rem; color: var(--color-accent); } .about-card p, .about-card li { color: var(--color-text-secondary); font-size: 0.9rem; line-height: 1.7; } .about-card ul { list-style: none; padding: 0; } .about-card li::before { content: '→ '; color: var(--color-accent); } /* Image quality tips */ .tips-box { background: rgba(59, 130, 246, 0.08); border: 1px solid rgba(59, 130, 246, 0.2); border-radius: var(--radius-md); padding: 1rem 1.25rem; margin-top: 1rem; } .tips-box h4 { color: var(--color-info); font-size: 0.9rem; margin-bottom: 0.5rem; } .tips-box li { color: var(--color-text-secondary); font-size: 0.8rem; margin-bottom: 4px; } /* ============ RESPONSIVE ============ */ @media (max-width: 768px) { .hero h1 { font-size: 2rem; } .page { padding: 1rem; } .breed-info-grid { grid-template-columns: 1fr; } .navbar-inner { padding: 0; } .nav-links a { padding: 8px 10px; font-size: 0.8rem; } .features-grid { grid-template-columns: 1fr; } .breeds-grid { grid-template-columns: 1fr; } }