* { box-sizing: border-box; margin: 0; padding: 0; font-family: system-ui, sans-serif; } body { display: flex; flex-direction: column; align-items: center; gap: 1.5rem; padding: 1rem; max-width: 960px; margin-inline: auto; } header { text-align: center; } #upload-section { display: flex; flex-wrap: wrap; gap: 2rem; justify-content: center; width: 100%; } .upload-wrapper { border: 2px dashed #aaa; border-radius: 0.75rem; padding: 1rem; flex: 1 1 280px; max-width: 420px; text-align: center; } .file-block { display: flex; flex-direction: column; align-items: center; } input[type="file"] { margin-block: 0.75rem; } #action-container { margin-top: 1rem; } button.generate-btn { padding: 0.5rem 1.25rem; font-size: 1.1rem; background: #1e88e5; color: #fff; border: none; border-radius: 0.5rem; cursor: pointer; } button.generate-btn:disabled { opacity: 0.6; cursor: not-allowed; } .loader { border: 4px solid #f3f3f3; border-top: 4px solid #1e88e5; border-radius: 50%; width: 42px; height: 42px; animation: spin 1s linear infinite; margin-inline: auto; margin-top: 1rem; } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } #results { position: relative; width: 100%; margin-top: 2rem; display: flex; gap: 2rem; justify-content: flex-start; overflow-x: auto; } /* ─── RESULT LAYOUT ───────────────────────────────── */ #result-layout{ display:flex; justify-content:center; align-items:center; position:relative; width:100%; padding:2rem 0; gap:clamp(3rem,8vw,6rem); /* ⬅︎ lớn hơn ⇒ label + line không bị chạm */ overflow-x:auto; /* nếu màn nhỏ sẽ scroll ngang */ } /* Tester đứng giữa cột trái */ #tester-column{ display:flex; justify-content:center; align-items:center; } /* Sampler xếp cột phải */ #sampler-column{ display:flex; flex-direction:column; gap:2.5rem; /* giãn từng ảnh */ align-items:center; } /* Ảnh vuông */ .square{ width:120px; height:120px; border-radius:0.5rem; overflow:hidden; flex-shrink:0; } .square img{width:100%;height:100%;object-fit:cover} /* Canvas + nhãn */ #lines-canvas{position:absolute;top:0;left:0;pointer-events:none;z-index:0} .label{position:absolute;transform:translate(-50%,-50%);z-index:1} /* ─── MOBILE ≤600 px: giữ hai cột nhưng thu nhỏ ảnh ─── */ @media (max-width:600px){ #result-layout{gap:2rem} /* hẹp lại */ .square{width:72px;height:72px;} /* nhỏ hơn */ } .tester-node { box-shadow: 0 0 10px rgba(59,130,246,0.5); }