ioget's picture
Clean deployment for Hugging Face Spaces - no binary files
16dd7c8
/* =====================================================
GLOBAL RESET
===================================================== */
*{
margin:0;
padding:0;
box-sizing:border-box;
font-family:'Poppins', sans-serif;
}
html {
font-size: 150%;
}
/* =====================================================
NAVBAR (shared by all pages)
===================================================== */
.navbar{
display:flex;
justify-content:space-between;
align-items:center;
padding: 10px 0; /* slightly taller than before */
}
.logo{
display:flex;
align-items:center;
}
.logo-img{
height:48px;
width:auto;
display:block;
}
.logo-name{
font-size:35px;
font-weight:700;
color:#003d12;
letter-spacing:-0.3px;
margin-left:10px;
white-space:nowrap;
}
.logo-ai{
color:#2f9b4b;
font-weight:700;
}
/* Reset button */
.btn-reset{
margin-top:8px;
width:100%;
padding:10px;
background:transparent;
color:#888;
border:1.5px solid #d0d0d0;
border-radius:20px;
font-family:'Poppins',sans-serif;
font-size:11px;
font-weight:500;
letter-spacing:0.5px;
text-transform:uppercase;
cursor:pointer;
transition:0.25s;
flex-shrink:0;
display:none;
}
.btn-reset.visible{ display:block; }
.btn-reset:hover{ border-color:#2f9b4b; color:#2f9b4b; background:#f4fbf4; }
.menu{
display:flex;
align-items:center;
gap:55px;
}
.menu a{
text-decoration:none;
color:#2f9b4b;
font-size:11px;
font-weight:500;
text-transform:uppercase;
transition:0.3s;
}
.menu a:hover{ opacity:0.7; }
.menu a.active{
color:#003d12;
font-weight:700;
border-bottom:2px solid #003d12;
padding-bottom:2px;
}
.signup-btn{
background:#003d12;
color:#fff;
padding:10px 22px;
border-radius:20px;
font-size:11px;
text-decoration:none;
font-weight:600;
transition:0.3s;
}
.signup-btn:hover{
transform:translateY(-2px);
box-shadow:0 8px 15px rgba(0,0,0,0.12);
}
/* =====================================================
INDEX — HERO
===================================================== */
body.page-index{
background:#f7f7f7;
overflow:hidden;
}
body.page-index .container{
width:100%;
height:80vh;
position:relative;
padding:28px 70px 0; /* reduced top padding so image fits */
}
.hero{
display:flex;
justify-content:space-between;
align-items:flex-end; /* image sits at bottom — feet fully visible */
margin-top:40px;
position:relative;
height: calc(100vh - 110px); /* fills remaining viewport */
}
.content{
width:35%;
z-index:2;
padding-bottom: 60px; /* align text with mid-image */
}
.content h1{
font-size:62px;
line-height:1.05;
color:#004d12;
margin-bottom:30px;
font-weight:700;
}
.content p{
width:260px;
font-size:12px;
line-height:1.75;
color:#6d6d6d;
margin-bottom:30px;
}
.read-btn{
display:inline-block;
background:#003d12;
color:#fff;
text-decoration:none;
padding:12px 28px;
border-radius:25px;
font-size:11px;
font-weight:600;
transition:0.3s;
}
.read-btn:hover{
transform:translateY(-3px);
box-shadow:0 8px 15px rgba(0,0,0,0.15);
}
.image-section{
width:65%;
display:flex;
justify-content:center;
align-items:flex-end; /* image anchored to bottom — feet visible */
}
.hero-image{
position:relative;
width:620px; /* slightly smaller so feet aren't cropped */
z-index:2;
animation:float 4s ease-in-out infinite;
}
.hero-image img{
width:100%;
object-fit:contain;
display:block;
user-select:none;
pointer-events:none;
}
@keyframes float{
0% { transform:translateY(0px); }
50% { transform:translateY(-10px); }
100%{ transform:translateY(0px); }
}
/* =====================================================
PREDICTION PAGE — two-column, zero-scroll layout
===================================================== */
body.page-prediction{
background:#f7f7f7;
height:100vh;
overflow:hidden;
}
body.page-prediction .container{
width:100%;
height:100vh;
padding:24px 60px 0;
display:flex;
flex-direction:column;
}
/* Two-panel row — fills remaining height, no scroll */
.page-body{
flex:1;
display:flex;
align-items:stretch;
justify-content:center;
gap:22px;
padding:14px 0 24px;
overflow:hidden;
}
/* ── LEFT card (input) — flex column, no overflow ── */
.pred-card{
background:#fff;
border-radius:24px;
box-shadow:0 20px 60px rgba(0,61,18,.12);
padding:26px 30px 20px;
width:480px;
flex-shrink:0;
display:flex;
flex-direction:column;
overflow:hidden; /* never shows scrollbar */
text-align:center;
}
.pred-card h2{
font-size:21px;
font-weight:700;
color:#004d12;
margin-bottom:4px;
flex-shrink:0;
}
.pred-card .subtitle{
font-size:10.5px;
color:#8a8a8a;
line-height:1.6;
margin-bottom:14px;
flex-shrink:0;
}
/* ── RIGHT card (results) — hidden until predict ── */
.result-card{
background:#fff;
border-radius:24px;
box-shadow:0 20px 60px rgba(0,61,18,.12);
padding:26px 30px 20px;
width:390px;
flex-shrink:0;
display:none;
flex-direction:column;
overflow:hidden;
animation:slideIn .35s ease;
}
.result-card.visible{ display:flex; }
@keyframes slideIn{
from{ opacity:0; transform:translateX(20px); }
to { opacity:1; transform:translateX(0); }
}
.result-card h3{
font-size:15px;
font-weight:700;
color:#004d12;
margin-bottom:12px;
flex-shrink:0;
text-align:center;
}
/* Tabs */
.tabs{
display:flex;
gap:7px;
justify-content:center;
margin-bottom:14px;
flex-wrap:wrap;
flex-shrink:0;
}
.tab{
display:inline-flex;
align-items:center;
gap:6px;
padding:7px 13px;
border-radius:20px;
border:1.5px solid #ccc;
background:#fff;
font-family:'Poppins', sans-serif;
font-size:10px;
font-weight:600;
color:#666;
cursor:pointer;
text-transform:uppercase;
transition:0.25s;
letter-spacing:0.3px;
}
.tab:hover{ border-color:#2f9b4b; color:#2f9b4b; }
.tab.active{ background:#003d12; color:#fff; border-color:#003d12; }
/* Panels — fill remaining space in left card */
.panel{ display:none; flex:1; flex-direction:column; min-height:0; }
.panel.active{ display:flex; }
/* Upload zone — grows to fill the panel */
.upload-zone{
position:relative;
border:2px dashed #b5ddb5;
border-radius:14px;
cursor:pointer;
background:#f8fdf8;
transition:0.2s;
flex:1; /* fills available space */
display:flex;
flex-direction:column;
align-items:center;
justify-content:center;
gap:6px;
min-height:0;
}
.upload-zone:hover{ background:#edf7ed; border-color:#2f9b4b; }
.upload-zone input[type="file"]{
position:absolute; inset:0; opacity:0; cursor:pointer; width:100%; height:100%;
}
.upload-icon{ width:42px; height:42px; flex-shrink:0; }
.upload-zone p{ font-size:12px; font-weight:600; color:#555; margin:0; }
.upload-zone span{ font-size:10.5px; color:#aaa; }
/* Tiny file name badge (replaces image preview on left) */
.file-indicator{
margin-top:8px;
padding:6px 12px;
background:#f0faf0;
border-radius:8px;
font-size:10.5px;
color:#2f9b4b;
font-weight:600;
border:1px solid #b5ddb5;
flex-shrink:0;
white-space:nowrap;
overflow:hidden;
text-overflow:ellipsis;
}
/* URL panel */
.panel#panel-url{ gap:10px; justify-content:center; }
.url-row{ display:flex; gap:8px; flex-shrink:0; }
.url-row input{
flex:1; border:1.5px solid #ddd; border-radius:10px;
padding:10px 13px; font-family:'Poppins',sans-serif; font-size:12px;
outline:none; color:#333; transition:border-color 0.2s;
}
.url-row input:focus{ border-color:#2f9b4b; }
.url-row button{
padding:10px 18px; border-radius:10px; background:#003d12; color:#fff;
border:none; font-family:'Poppins',sans-serif; font-size:12px;
font-weight:600; cursor:pointer; transition:0.2s;
}
.url-row button:hover{ background:#0c5d18; }
/* Webcam panel */
.panel#panel-webcam{ justify-content:center; }
.webcam-area{ display:flex; flex-direction:column; align-items:center; gap:10px; width:100%; }
.wc-placeholder{
width:100%; flex:1; min-height:120px; max-height:200px;
border-radius:14px; background:#e8f5e9;
display:flex; flex-direction:column; align-items:center; justify-content:center; gap:8px;
}
.wc-placeholder p{ font-size:11px; color:#999; font-weight:500; }
.wc-video-wrap{ position:relative; width:100%; display:none; }
#webcamVideo{ width:100%; border-radius:14px; background:#000; display:block; }
.wc-live-badge{
position:absolute; bottom:9px; left:9px; right:9px;
background:rgba(0,61,18,0.82); backdrop-filter:blur(6px);
border-radius:9px; padding:8px 12px;
display:none; align-items:center; justify-content:space-between; gap:10px;
}
.wc-live-badge.visible{ display:flex; }
.wc-badge-label{ font-size:14px; font-weight:700; color:#fff; text-transform:capitalize; }
.wc-badge-conf { font-size:10px; font-weight:500; color:#a8e6b8; white-space:nowrap; }
.wc-live-dot{
position:absolute; top:8px; right:9px;
display:none; align-items:center; gap:5px;
background:rgba(0,0,0,0.45); border-radius:20px; padding:3px 8px;
}
.wc-live-dot.visible{ display:flex; }
.wc-live-dot span{ font-size:9px; font-weight:700; color:#fff; letter-spacing:1px; }
.wc-dot-circle{
width:7px; height:7px; border-radius:50%; background:#ff4444;
animation:livePulse 1s ease-in-out infinite;
}
@keyframes livePulse{ 0%,100%{opacity:1;transform:scale(1);} 50%{opacity:.4;transform:scale(0.7);} }
.wc-btns{ display:flex; gap:8px; flex-wrap:wrap; justify-content:center; flex-shrink:0; }
.wc-btn{
padding:7px 15px; border-radius:20px; font-family:'Poppins',sans-serif;
font-size:10.5px; font-weight:600; cursor:pointer; transition:0.2s;
text-transform:uppercase; letter-spacing:0.3px;
}
.wc-btn.solid { background:#003d12; color:#fff; border:1.5px solid #003d12; }
.wc-btn.outline{ background:#fff; color:#003d12; border:1.5px solid #003d12; }
.wc-btn:hover { opacity:0.8; transform:translateY(-1px); }
.wc-btn:disabled{ opacity:0.35; cursor:not-allowed; transform:none; }
/* Analyze button */
.btn-analyze{
margin-top:10px;
width:100%;
padding:11px;
background:#003d12;
color:#fff;
border:none;
border-radius:20px;
font-family:'Poppins',sans-serif;
font-size:11.5px;
font-weight:600;
letter-spacing:0.5px;
text-transform:uppercase;
cursor:pointer;
transition:0.3s;
flex-shrink:0;
}
.btn-analyze:hover{ background:#0c5d18; transform:translateY(-2px); box-shadow:0 8px 15px rgba(0,0,0,0.12); }
.btn-analyze:disabled{ opacity:0.45; cursor:not-allowed; transform:none; box-shadow:none; }
/* ── Result content (right card) — image fills top, box below ── */
#resultContent{
flex:1;
display:flex;
flex-direction:column;
gap:10px;
min-height:0;
overflow:hidden;
}
.result-img-wrap{
flex:1;
border-radius:12px;
overflow:hidden;
min-height:0;
background:#f0f5f0;
display:flex;
align-items:center;
justify-content:center;
}
.result-img-wrap img{
width:100%; height:100%; object-fit:cover; display:block;
}
.result-box{
background:#eaf7ea; border-radius:12px; padding:12px 14px;
text-align:left; flex-shrink:0;
}
.result-box h4{ font-size:9px; font-weight:700; color:#004d12; letter-spacing:1.2px; text-transform:uppercase; margin-bottom:5px; }
.result-label{ font-size:22px; font-weight:700; color:#0c5d18; margin-bottom:2px; text-transform:capitalize; }
.result-conf { font-size:11px; color:#888; font-weight:500; margin-bottom:9px; }
.pills{ display:flex; flex-wrap:wrap; gap:5px; }
.pill{
background:#fff; border:1.5px solid #b5ddb5; border-radius:20px;
padding:2px 10px; font-size:9.5px; font-weight:600; color:#2f9b4b; text-transform:capitalize;
}
.pill.on{ background:#003d12; color:#fff; border-color:#003d12; }
/* Spinner */
.spinner{
display:inline-block; width:13px; height:13px;
border:2px solid rgba(255,255,255,.35); border-top-color:#fff;
border-radius:50%; animation:spin .6s linear infinite;
vertical-align:middle; margin-right:6px;
}
@keyframes spin{ to{ transform:rotate(360deg); } }
/* Classes note */
.classes-note{
margin-top:8px; font-size:9.5px; color:#ccc; line-height:1.8;
flex-shrink:0; text-align:center;
}
.classes-note strong{ color:#2f9b4b; font-weight:600; }
/* =====================================================
CONTACT & SIGNUP PAGES
===================================================== */
body.page-contact,
body.page-signup{
background:#f7f7f7;
min-height:100vh;
}
body.page-contact .container,
body.page-signup .container{
width:100%;
min-height:100vh;
padding:28px 70px;
}
.page-form-body{
display:flex;
align-items:center;
justify-content:center;
padding:50px 0 40px;
}
.card{
background:#fff;
border-radius:24px;
box-shadow:0 20px 60px rgba(0,61,18,.12);
padding:46px 42px 38px;
width:100%;
max-width:520px;
text-align:center;
}
.card h2{ font-size:26px; font-weight:700; color:#004d12; margin-bottom:10px; }
.card p { font-size:12px; color:#8a8a8a; line-height:1.7; margin-bottom:26px; }
.card input,
.card textarea{
width:100%;
border:1.5px solid #ddd;
border-radius:10px;
padding:12px 14px;
font-family:'Poppins', sans-serif;
font-size:12px;
margin-bottom:12px;
outline:none;
color:#333;
transition:border-color .2s;
}
.card input:focus,
.card textarea:focus{ border-color:#2f9b4b; }
.card textarea{ resize:vertical; min-height:110px; }
.btn-submit{
display:inline-block;
background:#003d12;
color:#fff;
font-family:'Poppins', sans-serif;
font-size:11px;
font-weight:600;
letter-spacing:0.5px;
text-transform:uppercase;
padding:12px 36px;
border-radius:25px;
border:none;
cursor:pointer;
transition:0.3s;
}
.btn-submit:hover{ transform:translateY(-3px); box-shadow:0 8px 15px rgba(0,0,0,0.15); }
/* =====================================================
RESPONSIVE
===================================================== */
@media(max-width:1100px){
.hero{ flex-direction:column; gap:30px; align-items:center; height:auto; }
.content{ width:100%; text-align:center; padding-bottom:0; }
.content p{ margin:auto; margin-bottom:30px; }
.image-section{ width:100%; }
.hero-image{ width:100%; }
body.page-index{ overflow:auto; }
.page-body{ flex-direction:column; overflow-y:auto; }
.pred-card, .result-card{ width:100%; max-width:520px; }
body.page-prediction{ height:auto; overflow:auto; }
body.page-prediction .container{ height:auto; }
}
@media(max-width:768px){
body.page-index .container,
body.page-contact .container,
body.page-signup .container,
body.page-prediction .container{ padding:24px 28px; }
.menu{ gap:18px; }
.content h1{ font-size:44px; }
}
@media(max-width:560px){
.menu a:not(.signup-btn){ display:none; }
}