:root { --bg: #0e1013; --surface: #15181d; --surface-2: #1a1e24; --border: #262b33; --text: #e7eaf0; --muted: #98a1af; --accent: #3f7bf6; --accent-strong: #2f63d8; --danger: #e05555; --ok: #46b076; --radius: 8px; } * { box-sizing: border-box; } body { margin: 0; font-family: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; background: var(--bg); color: var(--text); min-height: 100vh; } button, input { font: inherit; } button { cursor: pointer; } .app { max-width: 1180px; margin: 0 auto; padding: 0 20px 48px; } /* ---- top bar ---- */ .topbar { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 20px 0 18px; border-bottom: 1px solid var(--border); margin-bottom: 22px; } .brand { display: flex; align-items: center; gap: 12px; } .logo { width: 40px; height: 40px; display: block; } .brand-text h1 { margin: 0; font-size: 18px; font-weight: 650; line-height: 1.1; } .sub { font-size: 12px; color: var(--muted); } .topbar-actions { display: flex; gap: 8px; } /* ---- buttons ---- */ .btn { border: 1px solid transparent; border-radius: var(--radius); padding: 9px 14px; font-size: 13px; font-weight: 600; transition: background 0.12s, border-color 0.12s, color 0.12s; } .btn-primary { background: var(--accent); color: #fff; } .btn-primary:hover { background: var(--accent-strong); } .btn-primary:disabled { opacity: 0.5; cursor: not-allowed; } .btn-ghost { background: transparent; border-color: var(--border); color: var(--muted); } .btn-ghost:hover { color: var(--text); border-color: var(--muted); } .btn-danger { background: transparent; border: 1px solid var(--danger); color: var(--danger); } .btn-danger:hover { background: rgba(224, 85, 85, 0.1); } .btn-block { width: 100%; margin-top: 14px; } /* ---- layout ---- */ .layout { display: grid; grid-template-columns: 340px 1fr; gap: 20px; align-items: start; } .panel { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); padding: 20px; } .panel h2 { margin: 0 0 16px; font-size: 15px; font-weight: 650; letter-spacing: 0.2px; } /* ---- upload panel ---- */ .upload-panel { position: sticky; top: 20px; } .dropzone { border: 1.5px dashed var(--border); border-radius: var(--radius); padding: 26px 16px; text-align: center; cursor: pointer; transition: border-color 0.15s, background 0.15s; outline: none; } .dropzone:hover, .dropzone.drag, .dropzone:focus-visible { border-color: var(--accent); background: rgba(63, 123, 246, 0.06); } .dz-main { margin: 0; font-weight: 600; font-size: 14px; } .dz-sub { margin: 6px 0 0; color: var(--muted); font-size: 12px; } .dz-file { margin: 12px 0 0; font-size: 13px; font-weight: 600; color: var(--accent); word-break: break-all; } .field { margin-top: 16px; } .field label { display: block; font-size: 12px; font-weight: 600; color: var(--muted); margin-bottom: 6px; letter-spacing: 0.3px; } .field label .optional { font-weight: 500; text-transform: lowercase; letter-spacing: 0; opacity: 0.75; } .field input { width: 100%; background: var(--bg); border: 1px solid var(--border); color: var(--text); border-radius: var(--radius); padding: 11px 12px; font-size: 14px; } .field input:focus { outline: none; border-color: var(--accent); } /* ---- progress ---- */ .progress { margin-top: 16px; } .progress-label { display: flex; justify-content: space-between; gap: 12px; font-size: 12px; color: var(--muted); margin-bottom: 8px; } .progress-label span:first-child { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .progress-track { height: 6px; background: var(--surface-2); border-radius: 99px; overflow: hidden; } .progress-bar { height: 100%; width: 0%; background: var(--accent); border-radius: 99px; transition: width 0.15s; } /* ---- result banner ---- */ .result { margin-top: 16px; border: 1px solid var(--border); border-radius: var(--radius); background: var(--surface-2); padding: 12px; } .result-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-bottom: 10px; } .result-head span:first-child { font-size: 13px; font-weight: 600; word-break: break-all; } .url-row { display: flex; gap: 8px; } .url-row input { flex: 1; min-width: 0; background: var(--bg); border: 1px solid var(--border); color: var(--text); border-radius: var(--radius); padding: 10px 12px; font-size: 13px; } /* ---- files panel ---- */ .panel-head { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; } .panel-head h2 { margin-bottom: 4px; } .count { font-size: 12px; color: var(--muted); font-variant-numeric: tabular-nums; } .files-note { margin: 0 0 16px; font-size: 12px; color: var(--muted); } .table-wrap { border: 1px solid var(--border); border-radius: var(--radius); overflow-x: auto; } .files-table { width: 100%; border-collapse: collapse; min-width: 520px; } .files-table th, .files-table td { text-align: left; padding: 12px 14px; border-bottom: 1px solid var(--border); font-size: 13px; vertical-align: middle; } .files-table thead th { font-size: 11px; text-transform: uppercase; letter-spacing: 0.6px; color: var(--muted); background: var(--surface-2); border-bottom: 1px solid var(--border); font-weight: 600; } .files-table tbody tr:last-child td { border-bottom: none; } .files-table tbody tr:hover td { background: rgba(255, 255, 255, 0.015); } .col-name { width: 40%; } .col-size { width: 12%; } .col-date { width: 20%; } .col-actions { width: 28%; text-align: right; } .file-name { display: flex; align-items: center; gap: 8px; font-weight: 600; word-break: break-all; } .lock { flex-shrink: 0; font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.4px; color: var(--muted); background: rgba(63, 123, 246, 0.12); border: 1px solid rgba(63, 123, 246, 0.3); border-radius: 99px; padding: 2px 8px; } .lock.public { background: rgba(130, 190, 140, 0.1); border-color: rgba(130, 190, 140, 0.3); } .file-sub { display: block; font-size: 12px; color: var(--muted); font-weight: 400; margin-top: 2px; word-break: break-all; } .file-size, .file-date { color: var(--muted); font-variant-numeric: tabular-nums; white-space: nowrap; } .row-actions { display: flex; justify-content: flex-end; gap: 6px; } .row-actions .btn { padding: 7px 10px; font-size: 12px; } .empty { text-align: center; color: var(--muted); font-size: 13px; padding: 28px 0 6px; margin: 0; } /* ---- notice ---- */ #notice { margin-top: 14px; font-size: 13px; border-radius: var(--radius); padding: 10px 12px; } #notice.error { color: var(--danger); background: rgba(224, 85, 85, 0.08); border: 1px solid rgba(224, 85, 85, 0.3); } #notice.info { color: var(--ok); background: rgba(70, 176, 118, 0.08); border: 1px solid rgba(70, 176, 118, 0.3); } .hidden { display: none !important; } /* ---- responsive ---- */ @media (max-width: 860px) { .layout { grid-template-columns: 1fr; } .upload-panel { position: static; } } @media (max-width: 640px) { .app { padding: 0 14px 36px; } .topbar { padding: 14px 0 12px; margin-bottom: 16px; } .logo { width: 34px; height: 34px; } .brand { gap: 10px; min-width: 0; } .brand-text h1 { font-size: 16px; } .sub { font-size: 11px; } .topbar-actions { gap: 6px; } .topbar-actions .btn { padding: 8px 10px; font-size: 12px; } .panel { padding: 16px; } .dropzone { padding: 34px 16px; } .btn-block { padding: 13px; } /* 16px inputs prevent iOS auto-zoom on focus */ .field input, .url-row input { font-size: 16px; } /* files table -> stacked cards */ .table-wrap { overflow: visible; border: none; border-radius: 0; background: transparent; } .files-table { display: block; min-width: 0; } .files-table thead { display: none; } .files-table tbody { display: block; } .files-table tr { display: block; background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--radius); padding: 12px 14px; margin-bottom: 10px; } .files-table tbody tr:last-child { margin-bottom: 0; } .files-table td { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 7px 0; border-bottom: 1px solid var(--border); font-size: 13px; white-space: normal; } .files-table td:last-child { border-bottom: none; } .files-table tbody tr:last-child td { border-bottom: 1px solid var(--border); } .files-table tbody tr:last-child td:last-child { border-bottom: none; } .files-table td[data-label]::before { content: attr(data-label); font-size: 11px; text-transform: uppercase; letter-spacing: 0.5px; color: var(--muted); flex-shrink: 0; } .file-name { flex-wrap: wrap; } .row-actions { justify-content: stretch; } .row-actions .btn { flex: 1; text-align: center; padding: 11px 8px; font-size: 13px; } }