/* ── Reset & Base ────────────────────────────────────────── */ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } :root { --bg: linear-gradient(135deg, #050505 0%, #0c0c0f 45%, #111117 100%); --surface: rgba(20, 20, 24, 0.92); --surface-strong: #18181d; --surface2: #101015; --border: rgba(255, 255, 255, 0.08); --border-strong: rgba(255, 255, 255, 0.14); --text-primary: #f5f5f7; --text-secondary: #b3b3bd; --text-muted: #8a8a96; --accent: #7c6cff; --accent-2: #9b8cff; --accent-light: rgba(124, 108, 255, 0.14); --accent-soft: rgba(124, 108, 255, 0.08); --accent-text: #d7d1ff; --danger: #ff5c5c; --danger-light: rgba(255, 92, 92, 0.14); --danger-text: #ffd2d2; --success: #26c281; --success-light: rgba(38, 194, 129, 0.14); --success-text: #c9f5e2; --amber: #f2b94b; --amber-light: rgba(242, 185, 75, 0.14); --amber-text: #ffe9bb; --radius-sm: 8px; --radius-md: 12px; --radius-lg: 18px; --radius-xl: 26px; --shadow-sm: 0 6px 18px rgba(0, 0, 0, 0.28); --shadow: 0 14px 40px rgba(0, 0, 0, 0.34); --shadow-lg: 0 24px 70px rgba(0, 0, 0, 0.45); --max-width: 760px; } html { scroll-behavior: smooth; } body { font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; background: var(--bg); color: var(--text-primary); min-height: 100vh; display: flex; flex-direction: column; align-items: center; padding: 2rem 1rem 4rem; line-height: 1.6; position: relative; overflow-x: hidden; } body::before, body::after { content: ""; position: fixed; width: 280px; height: 280px; border-radius: 50%; filter: blur(90px); pointer-events: none; z-index: -1; } body::before { top: -70px; left: -90px; background: rgba(124, 108, 255, 0.14); } body::after { right: -70px; bottom: -70px; background: rgba(64, 64, 255, 0.09); } /* ── Header ─────────────────────────────────────────────── */ header { text-align: center; margin-bottom: 2rem; max-width: 720px; } #three-header { margin-bottom: 0.4rem !important; filter: drop-shadow(0 16px 34px rgba(124, 108, 255, 0.18)); } .logo-wrap { display: inline-flex; align-items: center; justify-content: center; width: 62px; height: 62px; background: linear-gradient(135deg, #181824 0%, #202033 100%); border-radius: var(--radius-lg); border: 1px solid rgba(124, 108, 255, 0.18); margin-bottom: 1rem; box-shadow: var(--shadow-sm); } .logo-wrap svg { width: 30px; height: 30px; } header h1 { font-size: clamp(2rem, 4vw, 2.6rem); font-weight: 800; color: var(--text-primary); letter-spacing: -0.04em; line-height: 1.1; } header p { font-size: 1rem; color: var(--text-secondary); margin-top: 0.7rem; max-width: 620px; margin-left: auto; margin-right: auto; } /* ── Main card ───────────────────────────────────────────── */ main { width: 100%; max-width: var(--max-width); } .card { background: var(--surface); backdrop-filter: blur(18px); -webkit-backdrop-filter: blur(18px); border-radius: var(--radius-xl); border: 1px solid var(--border); box-shadow: var(--shadow-lg); padding: 2rem; position: relative; overflow: hidden; } .card::before { content: ""; position: absolute; inset: 0 0 auto 0; height: 1px; background: linear-gradient(90deg, transparent, rgba(124, 108, 255, 0.5), transparent); } /* ── Drop zone ───────────────────────────────────────────── */ #drop-zone { border: 2px dashed rgba(124, 108, 255, 0.24); border-radius: calc(var(--radius-lg) + 2px); padding: 3.2rem 2rem; text-align: center; cursor: pointer; transition: 0.25s ease; background: radial-gradient(circle at top, rgba(124, 108, 255, 0.09), transparent 45%), var(--surface2); position: relative; overflow: hidden; } #drop-zone::before { content: ""; position: absolute; inset: 0; background: linear-gradient(135deg, rgba(124, 108, 255, 0.05), rgba(255, 255, 255, 0)); pointer-events: none; } #drop-zone:hover, #drop-zone.drag-over { border-color: var(--accent); background: radial-gradient(circle at top, rgba(124, 108, 255, 0.15), transparent 45%), #12121a; transform: translateY(-2px); box-shadow: 0 16px 36px rgba(124, 108, 255, 0.12); } #drop-zone input[type="file"] { position: absolute; inset: 0; opacity: 0; cursor: pointer; width: 100%; height: 100%; } .drop-icon { width: 56px; height: 56px; margin: 0 auto 1rem; background: linear-gradient(135deg, #171722 0%, #232338 100%); border-radius: 16px; display: flex; align-items: center; justify-content: center; border: 1px solid rgba(124, 108, 255, 0.16); box-shadow: 0 10px 24px rgba(124, 108, 255, 0.08); } .drop-icon svg { width: 26px; height: 26px; } #drop-zone h2 { font-size: 1.05rem; font-weight: 700; color: var(--text-primary); margin-bottom: 0.35rem; } #drop-zone p { font-size: 0.92rem; color: var(--text-muted); } /* ── Limit badge ─────────────────────────────────────────── */ .limit-badge { display: inline-flex; align-items: center; gap: 6px; background: var(--amber-light); color: var(--amber-text); font-size: 12px; font-weight: 700; padding: 6px 12px; border-radius: 999px; margin-top: 0.95rem; border: 1px solid rgba(242, 185, 75, 0.18); box-shadow: 0 6px 16px rgba(242, 185, 75, 0.08); } /* ── Counter bar ─────────────────────────────────────────── */ #counter-bar { display: none; align-items: center; justify-content: space-between; gap: 12px; margin-top: 1.25rem; padding: 0.8rem 1rem; background: rgba(255, 255, 255, 0.03); border-radius: var(--radius-md); border: 1px solid rgba(255, 255, 255, 0.06); font-size: 13px; color: var(--text-secondary); box-shadow: var(--shadow-sm); } #counter-bar.visible { display: flex; } #counter-bar .count-num { font-weight: 700; color: var(--text-primary); } .count-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--success); display: inline-block; margin-right: 6px; box-shadow: 0 0 0 4px rgba(38, 194, 129, 0.12); } .count-dot.warn { background: var(--amber); box-shadow: 0 0 0 4px rgba(242, 185, 75, 0.12); } .count-dot.danger { background: var(--danger); box-shadow: 0 0 0 4px rgba(255, 92, 92, 0.12); } /* ── Image preview grid ──────────────────────────────────── */ #preview-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(115px, 1fr)); gap: 14px; margin-top: 1.35rem; } .preview-item { position: relative; aspect-ratio: 1; border-radius: 18px; overflow: hidden; border: 1px solid rgba(255, 255, 255, 0.07); background: linear-gradient(180deg, #14141a 0%, #0f0f14 100%); box-shadow: 0 12px 28px rgba(0, 0, 0, 0.28); transition: transform 0.18s ease, box-shadow 0.18s ease, border-color 0.18s ease; } .preview-item:hover { transform: translateY(-4px); box-shadow: 0 20px 36px rgba(0, 0, 0, 0.34); border-color: rgba(124, 108, 255, 0.20); } .preview-item img { width: 100%; height: 100%; object-fit: cover; display: block; } .preview-item::after { content: ""; position: absolute; inset: auto 0 0 0; height: 40%; background: linear-gradient(to top, rgba(0, 0, 0, 0.32), transparent); pointer-events: none; } .preview-item .remove-btn { position: absolute; top: 8px; right: 8px; width: 28px; height: 28px; border-radius: 50%; background: rgba(12, 12, 16, 0.82); backdrop-filter: blur(8px); border: 1px solid rgba(255, 255, 255, 0.10); cursor: pointer; display: flex; align-items: center; justify-content: center; opacity: 0; transition: 0.18s ease; z-index: 2; } .preview-item:hover .remove-btn { opacity: 1; } .preview-item .remove-btn:hover { background: rgba(255, 92, 92, 0.92); transform: scale(1.05); } .preview-item .remove-btn svg { width: 12px; height: 12px; stroke: #fff; } .preview-item .order-badge { position: absolute; bottom: 8px; left: 8px; background: rgba(12, 12, 16, 0.72); backdrop-filter: blur(8px); color: #fff; font-size: 11px; font-weight: 700; padding: 3px 8px; border-radius: 999px; z-index: 2; } /* ── Actions ─────────────────────────────────────────────── */ .actions { display: flex; gap: 12px; margin-top: 1.6rem; } button { font-family: inherit; cursor: pointer; border-radius: 14px; font-size: 14px; font-weight: 700; padding: 12px 18px; transition: 0.18s ease; border: 1px solid var(--border-strong); outline: none; } button:focus-visible, #drop-zone:focus-within { box-shadow: 0 0 0 4px rgba(124, 108, 255, 0.16); } button:active { transform: scale(0.98); } .btn-primary { background: linear-gradient(135deg, var(--accent) 0%, var(--accent-2) 100%); color: #fff; border-color: transparent; flex: 1; display: flex; align-items: center; justify-content: center; gap: 8px; box-shadow: 0 14px 26px rgba(124, 108, 255, 0.20); } .btn-primary:hover { transform: translateY(-1px); box-shadow: 0 18px 34px rgba(124, 108, 255, 0.25); } .btn-primary:disabled { opacity: 0.5; cursor: not-allowed; transform: none; box-shadow: none; } .btn-ghost { background: rgba(255, 255, 255, 0.03); color: var(--text-secondary); border-color: rgba(255, 255, 255, 0.08); backdrop-filter: blur(8px); } .btn-ghost:hover { background: rgba(255, 255, 255, 0.06); color: var(--text-primary); border-color: rgba(124, 108, 255, 0.18); } /* ── Toast ───────────────────────────────────────────────── */ #toast { position: fixed; bottom: 1.6rem; left: 50%; transform: translateX(-50%) translateY(16px); background: rgba(17, 17, 22, 0.92); backdrop-filter: blur(14px); color: #fff; font-size: 13px; font-weight: 600; padding: 12px 18px; border-radius: 999px; opacity: 0; pointer-events: none; transition: opacity 0.25s ease, transform 0.25s ease; white-space: nowrap; z-index: 200; box-shadow: 0 14px 32px rgba(0, 0, 0, 0.30); border: 1px solid rgba(255, 255, 255, 0.06); } #toast.show { opacity: 1; transform: translateX(-50%) translateY(0); } /* ── Overlay + Premium dialog ────────────────────────────── */ #overlay { display: none; position: fixed; inset: 0; background: rgba(3, 3, 6, 0.72); backdrop-filter: blur(8px); z-index: 100; align-items: center; justify-content: center; padding: 1rem; } #overlay.show { display: flex; } #premium-dialog { background: rgba(20, 20, 25, 0.96); backdrop-filter: blur(16px); border-radius: 28px; border: 1px solid rgba(255, 255, 255, 0.08); box-shadow: 0 30px 70px rgba(0, 0, 0, 0.48); padding: 2rem; max-width: 430px; width: 100%; text-align: center; animation: pop-in 0.22s ease; } @keyframes pop-in { from { transform: scale(0.92) translateY(14px); opacity: 0; } to { transform: scale(1) translateY(0); opacity: 1; } } .dialog-icon { width: 68px; height: 68px; border-radius: 20px; background: linear-gradient(135deg, #2d2410 0%, #3f3114 100%); display: flex; align-items: center; justify-content: center; margin: 0 auto 1.25rem; border: 1px solid rgba(242, 185, 75, 0.18); box-shadow: 0 12px 24px rgba(242, 185, 75, 0.08); } .dialog-icon svg { width: 30px; height: 30px; } #premium-dialog h2 { font-size: 1.45rem; font-weight: 800; margin-bottom: 0.5rem; letter-spacing: -0.02em; color: var(--text-primary); } #premium-dialog p { font-size: 0.95rem; color: var(--text-secondary); margin-bottom: 1.4rem; line-height: 1.7; } .perks { list-style: none; text-align: left; margin-bottom: 1.7rem; background: rgba(255, 255, 255, 0.03); border: 1px solid rgba(255, 255, 255, 0.06); border-radius: 18px; padding: 0.85rem 1rem; } .perks li { font-size: 13px; color: var(--text-secondary); display: flex; align-items: center; gap: 10px; padding: 8px 0; } .perks li + li { border-top: 1px dashed rgba(255, 255, 255, 0.08); } .perk-check { width: 20px; height: 20px; border-radius: 50%; background: var(--success-light); display: flex; align-items: center; justify-content: center; flex-shrink: 0; } .perk-check svg { width: 10px; height: 10px; stroke: var(--success); } .dialog-actions { display: flex; flex-direction: column; gap: 10px; } .btn-upgrade { background: linear-gradient(135deg, #7c6cff 0%, #9b8cff 100%); color: #fff; border: none; padding: 13px; font-size: 15px; border-radius: 14px; width: 100%; box-shadow: 0 14px 26px rgba(124, 108, 255, 0.18); } .btn-upgrade:hover { transform: translateY(-1px); opacity: 0.97; } .btn-close-dialog { background: rgba(255, 255, 255, 0.03); border: 1px solid rgba(255, 255, 255, 0.08); color: var(--text-secondary); padding: 11px; width: 100%; border-radius: 14px; } .btn-close-dialog:hover { background: rgba(255, 255, 255, 0.06); color: var(--text-primary); } /* ── Progress bar (inside btn) ───────────────────────────── */ #loading-bar { display: none; height: 4px; background: rgba(255, 255, 255, 0.18); border-radius: 999px; overflow: hidden; width: 120px; } #loading-bar-fill { height: 100%; background: #fff; border-radius: 999px; animation: slide 1s infinite ease-in-out; } @keyframes slide { 0% { width: 0%; margin-left: 0; } 50% { width: 60%; margin-left: 20%; } 100% { width: 0%; margin-left: 100%; } } /* ── Scrollbar ───────────────────────────────────────────── */ ::-webkit-scrollbar { width: 10px; height: 10px; } ::-webkit-scrollbar-thumb { background: rgba(124, 108, 255, 0.22); border-radius: 999px; } ::-webkit-scrollbar-track { background: rgba(255, 255, 255, 0.03); } /* ── Responsive ──────────────────────────────────────────── */ @media (max-width: 768px) { body { padding: 1.25rem 0.85rem 3rem; } .card { padding: 1.2rem; border-radius: 22px; } #drop-zone { padding: 2.3rem 1rem; } .actions { flex-direction: column; } .btn-ghost, .btn-primary { width: 100%; } #counter-bar { flex-direction: column; align-items: flex-start; } #preview-grid { grid-template-columns: repeat(auto-fill, minmax(96px, 1fr)); gap: 10px; } } @media (max-width: 480px) { header h1 { font-size: 1.85rem; } header p { font-size: 0.92rem; } #premium-dialog { padding: 1.3rem; border-radius: 22px; } .dialog-icon { width: 60px; height: 60px; } #toast { white-space: normal; width: calc(100% - 24px); text-align: center; border-radius: 16px; } }