:root { --ink: #163044; --muted: #64748b; --line: #dbe7ee; --paper: #ffffff; --page: #f4f8fb; --brand: #bd2d42; --accent: #087d86; --gold: #c58b2c; --focus: rgba(8, 125, 134, .18); } * { box-sizing: border-box; } html, body { margin: 0; min-height: 100%; background: var(--page); color: var(--ink); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif; letter-spacing: 0; } body { padding-bottom: env(safe-area-inset-bottom); } button, input, select { font: inherit; } .usvisa-page { min-height: 100vh; background: linear-gradient(180deg, rgba(255, 255, 255, 0) 0, #f4f8fb 330px), linear-gradient(180deg, #f4f8fb 0, #ffffff 52%, #eef7f8 100%); } .hero { position: relative; min-height: 264px; padding: 24px 20px 44px; overflow: hidden; color: var(--ink); background: #d9eef8; } .hero::before { position: absolute; inset: 0; content: ""; background: linear-gradient(180deg, rgba(255, 255, 255, .48), rgba(255, 255, 255, .78)), linear-gradient(90deg, rgba(244, 250, 253, .96) 0%, rgba(244, 250, 253, .72) 45%, rgba(244, 250, 253, .46) 100%), url("../images/index_bj_1.jpg") 31% center/cover no-repeat; } .hero::after { position: absolute; left: 0; right: 0; bottom: 0; height: 5px; content: ""; background: linear-gradient(90deg, var(--brand), var(--gold), var(--accent)); } .hero-inner { position: relative; z-index: 1; max-width: 560px; margin: 0 auto; } .hero-title { margin: 18px 0 12px; font-size: 34px; line-height: 1.08; font-weight: 850; color: #163044; text-shadow: 0 2px 0 rgba(255, 255, 255, .58); } .hero-subtitle { margin: 0; max-width: 20em; color: #4e667a; font-size: 15px; line-height: 1.72; } .branch-strip { position: relative; z-index: 2; max-width: 560px; margin: -30px auto 0; padding: 0 16px; } .branch-panel { position: relative; display: flex; align-items: center; justify-content: space-between; gap: 12px; min-height: 78px; padding: 16px; border: 1px solid rgba(255, 255, 255, .86); border-radius: 8px; background: rgba(255, 255, 255, .97); box-shadow: 0 18px 38px rgba(70, 102, 126, .14); overflow: hidden; } .branch-panel::before { position: absolute; left: 0; top: 14px; bottom: 14px; width: 4px; content: ""; border-radius: 999px; background: linear-gradient(180deg, var(--brand), var(--gold), var(--accent)); } .branch-kicker { margin: 0 0 5px; color: var(--muted); font-size: 12px; line-height: 1.2; } .branch-name { margin: 0; color: var(--ink); font-size: 18px; line-height: 1.3; font-weight: 750; } .branch-code { flex: 0 0 auto; padding: 7px 11px; border-radius: 6px; background: #e8f6f2; color: #0b756d; font-size: 12px; line-height: 16px; font-weight: 700; } .materials-section { max-width: 560px; margin: 16px auto 0; padding: 0 16px; } .materials-panel { border: 1px solid var(--line); border-radius: 8px; background: #ffffff; box-shadow: 0 18px 42px rgba(70, 102, 126, .08); overflow: hidden; } .materials-heading { padding: 20px 18px 15px; background: linear-gradient(135deg, rgba(8, 125, 134, .1), rgba(197, 139, 44, .1)), #ffffff; } .materials-kicker { margin: 0 0 6px; color: #087d86; font-size: 12px; line-height: 1.2; font-weight: 800; } .materials-heading h2 { margin: 0; color: var(--ink); font-size: 20px; line-height: 1.35; font-weight: 850; } .materials-heading p { margin: 8px 0 0; color: #52687b; font-size: 14px; line-height: 1.6; } .materials-essential { display: grid; grid-template-columns: 1fr 1fr; gap: 9px; padding: 16px 18px 14px; } .material-item { min-height: 68px; padding: 11px 10px; border: 1px solid #dbe7ee; border-radius: 8px; background: #fbfcfe; } .material-item:last-child:nth-child(odd) { grid-column: 1 / -1; min-height: 56px; } .material-item span { display: block; margin-bottom: 6px; color: #bd2d42; font-size: 12px; line-height: 1; font-weight: 850; } .material-item strong { display: block; color: #23384a; font-size: 14px; line-height: 1.35; font-weight: 760; } .materials-alert { margin: 0 18px 16px; padding: 12px 12px; border-left: 4px solid #c58b2c; border-radius: 8px; background: #fff8e8; color: #6f4a0f; font-size: 13px; line-height: 1.6; font-weight: 650; } .materials-details { border-top: 1px solid var(--line); } .materials-details details { border-bottom: 1px solid var(--line); background: #ffffff; } .materials-details details:last-child { border-bottom: 0; } .materials-details summary { position: relative; display: block; padding: 15px 44px 15px 18px; color: var(--ink); font-size: 15px; line-height: 1.4; font-weight: 800; cursor: pointer; list-style: none; } .materials-details summary::-webkit-details-marker { display: none; } .materials-details summary::after { position: absolute; top: 50%; right: 20px; width: 9px; height: 9px; content: ""; border-right: 2px solid #667085; border-bottom: 2px solid #667085; transform: translateY(-65%) rotate(45deg); transition: transform .18s ease; } .materials-details details[open] summary::after { transform: translateY(-35%) rotate(225deg); } .materials-details ul { margin: 0; padding: 0 18px 16px 36px; color: #536779; font-size: 13px; line-height: 1.65; } .materials-details li + li { margin-top: 7px; } .materials-details .photo-requirement-list { margin-top: 8px; padding: 0 0 0 18px; } .materials-details .photo-requirement-list li + li { margin-top: 5px; } .materials-link { color: #1769e0; font-weight: 800; text-decoration: underline; text-underline-offset: 3px; } .form-shell { max-width: 560px; margin: 18px auto 0; padding: 0 16px 30px; } .form-surface { border: 1px solid var(--line); border-radius: 8px; background: var(--paper); box-shadow: 0 18px 42px rgba(70, 102, 126, .09); overflow: hidden; } .form-section { padding: 22px 18px; border-top: 1px solid var(--line); } .form-section:first-child { border-top: 0; } .section-title { margin: 0 0 16px; display: flex; align-items: center; justify-content: space-between; gap: 10px; font-size: 19px; line-height: 1.35; font-weight: 800; } .section-mark { flex: 0 0 auto; height: 5px; width: 38px; border-radius: 999px; background: linear-gradient(90deg, var(--brand), var(--gold), var(--accent)); } .field { margin: 0 0 15px; } .field:last-child { margin-bottom: 0; } .field.is-hidden { display: none; } .field label { display: flex; align-items: center; justify-content: space-between; margin: 0 0 8px; color: #344054; font-size: 14px; line-height: 1.35; font-weight: 650; } .required { color: var(--brand); } .control, .select-control { display: block; width: 100%; min-height: 50px; border: 1px solid #d4dde8; border-radius: 8px; background: #fbfcfe; color: var(--ink); padding: 12px 13px; font-size: 16px; line-height: 22px; outline: none; transition: border-color .18s ease, box-shadow .18s ease, background .18s ease; } .select-control { appearance: none; background-image: linear-gradient(45deg, transparent 50%, #667085 50%), linear-gradient(135deg, #667085 50%, transparent 50%); background-position: calc(100% - 18px) 20px, calc(100% - 12px) 20px; background-size: 6px 6px; background-repeat: no-repeat; padding-right: 34px; } .control:focus, .select-control:focus { border-color: var(--accent); box-shadow: 0 0 0 4px var(--focus); } .control::placeholder { color: #98a2b3; } .scan-control-row { display: flex; align-items: stretch; gap: 8px; } .scan-control-row .control { flex: 1 1 auto; min-width: 0; } .scan-btn { flex: 0 0 78px; min-height: 50px; border: 0; border-radius: 8px; background: #087d86; color: #fff; font-size: 15px; line-height: 20px; font-weight: 720; box-shadow: 0 10px 22px rgba(8, 125, 134, .18); } .scan-btn:active { transform: translateY(1px); } .scan-btn:disabled { background: #98a2b3; box-shadow: none; } .readonly-control { background: #f2f6f9; color: #667085; } .toggle-row { display: flex; align-items: center; justify-content: space-between; gap: 14px; min-height: 62px; padding: 14px 0 16px; } .toggle-copy strong { display: block; margin-bottom: 3px; font-size: 16px; line-height: 1.3; } .toggle-copy span { display: block; color: var(--muted); font-size: 13px; line-height: 1.45; } .switch { position: relative; flex: 0 0 auto; width: 56px; height: 32px; } .switch input { position: absolute; opacity: 0; } .slider { position: absolute; inset: 0; cursor: pointer; border-radius: 999px; background: #d0d5dd; transition: background .2s ease; } .slider::before { position: absolute; content: ""; width: 26px; height: 26px; left: 3px; top: 3px; border-radius: 50%; background: #fff; box-shadow: 0 3px 8px rgba(16, 24, 40, .24); transition: transform .2s ease; } .switch input:checked + .slider { background: var(--accent); } .switch input:checked + .slider::before { transform: translateX(24px); } .passport-panel { display: none; padding-top: 10px; } .passport-panel.is-open { display: block; margin-bottom: 22px; } .passport-copy { margin-bottom: 12px; } .upload-zone { position: relative; display: flex; align-items: center; gap: 13px; min-height: 92px; padding: 15px; border: 1px dashed #9fc9c2; border-radius: 8px; background: #f7fbfa; overflow: hidden; } .upload-zone input[type="file"] { position: absolute; inset: 0; opacity: 0; cursor: pointer; } .upload-symbol { flex: 0 0 auto; width: 52px; height: 52px; border-radius: 8px; border: 1px solid #dce8e7; background: #fff; display: grid; place-items: center; } .upload-symbol::before { content: ""; width: 25px; height: 18px; border: 2px solid var(--accent); border-radius: 4px; background: radial-gradient(circle at 50% 50%, var(--accent) 0 3px, transparent 4px); } .upload-text { min-width: 0; } .upload-text strong { display: block; font-size: 15px; line-height: 1.4; } .upload-text span { display: block; margin-top: 3px; color: var(--muted); font-size: 13px; line-height: 1.45; } .preview { display: none; margin: 12px 0 3px; width: 100%; aspect-ratio: 16 / 10; border-radius: 8px; object-fit: cover; border: 1px solid var(--line); background: #eef2f6; } .preview.is-visible { display: block; } .ocr-progress { display: none; align-items: center; gap: 10px; margin: 12px 0 0; padding: 10px 12px; border: 1px solid #cdece8; border-radius: 8px; background: #effaf8; color: #087d86; font-size: 13px; line-height: 1.45; font-weight: 650; } .ocr-progress.is-visible { display: flex; } .ocr-spinner { flex: 0 0 auto; width: 18px; height: 18px; border: 2px solid rgba(8, 125, 134, .18); border-top-color: var(--accent); border-radius: 50%; animation: usvisa-spin .72s linear infinite; } @keyframes usvisa-spin { to { transform: rotate(360deg); } } .field-grid { display: grid; grid-template-columns: 1fr; gap: 15px; margin-top: 15px; } .field-wide { grid-column: 1 / -1; } .consulate-options { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; } .field .consulate-option { position: relative; display: flex; align-items: center; justify-content: center; text-align: center; min-height: 42px; margin: 0; border: 1px solid #d4dde8; border-radius: 8px; background: #fbfcfe; color: #344054; font-size: 14px; line-height: 18px; font-weight: 650; transition: border-color .18s ease, background .18s ease, color .18s ease, box-shadow .18s ease; } .field .consulate-option span { width: 100%; } .consulate-option input { position: absolute; opacity: 0; pointer-events: none; } .consulate-option:has(input:checked) { border-color: var(--accent); background: #effaf8; color: #087d86; box-shadow: 0 0 0 4px var(--focus); } .status-line { min-height: 20px; margin: 10px 0 0; color: var(--muted); font-size: 13px; line-height: 1.5; } .agreement { display: flex; align-items: flex-start; gap: 9px; margin-top: 18px; color: #475467; font-size: 13px; line-height: 1.55; } .agreement input { width: 18px; height: 18px; margin: 1px 0 0; accent-color: var(--accent); } .action-bar { position: sticky; bottom: 0; z-index: 3; margin: 18px -16px 0; padding: 12px 16px calc(12px + env(safe-area-inset-bottom)); background: rgba(244, 248, 251, .9); backdrop-filter: blur(12px); } .submit-btn { width: 100%; min-height: 52px; border: 0; border-radius: 8px; background: linear-gradient(90deg, #bd2d42, #087d86); color: #fff; font-size: 17px; line-height: 22px; font-weight: 760; box-shadow: 0 16px 30px rgba(8, 125, 134, .2); } .submit-btn:disabled { cursor: not-allowed; background: #98a2b3; box-shadow: none; } .barcode-scanner-layer { position: fixed; inset: 0; z-index: 40; display: none; align-items: center; justify-content: center; padding: env(safe-area-inset-top) 14px env(safe-area-inset-bottom); background: rgba(12, 18, 28, .86); } .barcode-scanner-layer.is-visible { display: flex; } .barcode-scanner-panel { width: 100%; max-width: 560px; max-height: 96vh; overflow: hidden; border-radius: 16px; background: #111827; color: #fff; box-shadow: 0 24px 64px rgba(0, 0, 0, .34); } .barcode-scanner-header { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 14px 16px; background: #0b1220; } .barcode-scanner-header strong { font-size: 16px; line-height: 22px; } .barcode-close-btn, .barcode-tool-btn { border: 0; border-radius: 8px; background: rgba(255, 255, 255, .12); color: #fff; font-size: 14px; line-height: 20px; } .barcode-close-btn { padding: 8px 12px; } .barcode-video-wrap { position: relative; width: 100%; overflow: hidden; background: #000; } .barcode-video-wrap video { display: block; width: 100%; height: min(68vh, 520px); object-fit: cover; background: #000; } .barcode-scan-frame { position: absolute; left: 50%; top: 50%; width: 88%; height: 142px; transform: translate(-50%, -50%); border: 2px solid #36d399; border-radius: 14px; box-shadow: 0 0 0 9999px rgba(0, 0, 0, .28); pointer-events: none; } .barcode-scan-line { position: absolute; left: 8%; right: 8%; top: 50%; height: 2px; background: #ff5a6a; transform: translateY(-50%); box-shadow: 0 0 12px rgba(255, 90, 106, .9); pointer-events: none; } .barcode-distance-tip { position: absolute; left: 50%; bottom: 16px; width: calc(100% - 28px); max-width: 470px; transform: translateX(-50%); padding: 10px 12px; border-radius: 10px; background: rgba(17, 24, 39, .72); color: #f9fafb; font-size: 13px; line-height: 1.55; text-align: center; pointer-events: none; } .barcode-scanner-tools { display: flex; align-items: center; justify-content: center; flex-wrap: wrap; gap: 10px; padding: 12px; border-top: 1px solid rgba(255, 255, 255, .08); background: #111827; } .barcode-tool-btn { padding: 8px 12px; } .barcode-zoom-box { display: flex; align-items: center; gap: 8px; min-width: 210px; padding: 7px 10px; border-radius: 999px; background: rgba(255, 255, 255, .1); color: #e5e7eb; font-size: 13px; } .barcode-zoom-box input { flex: 1; } .barcode-scanner-status { min-height: 44px; padding: 12px 16px 16px; background: #111827; color: #d1d5db; font-size: 14px; line-height: 1.55; text-align: center; } .barcode-scanner-status.is-ok { color: #86efac; } .barcode-scanner-status.is-error { color: #fca5a5; } .toast { position: fixed; left: 50%; bottom: calc(84px + env(safe-area-inset-bottom)); z-index: 20; width: min(88vw, 420px); min-height: 46px; padding: 12px 14px; border-radius: 8px; background: rgba(23, 33, 43, .94); color: #fff; font-size: 14px; line-height: 1.55; text-align: center; transform: translate(-50%, 18px); opacity: 0; pointer-events: none; transition: opacity .2s ease, transform .2s ease; } .toast.is-visible { opacity: 1; transform: translate(-50%, 0); } .success-panel { display: none; padding: 24px 18px; text-align: center; } .success-panel.is-visible { display: block; } .success-seal { width: 58px; height: 58px; margin: 0 auto 14px; border-radius: 50%; background: #e7f6f2; display: grid; place-items: center; } .success-seal::before { content: ""; width: 26px; height: 14px; border-left: 4px solid var(--accent); border-bottom: 4px solid var(--accent); transform: rotate(-45deg) translate(2px, -2px); } .success-panel h2 { margin: 0 0 8px; font-size: 22px; line-height: 1.3; } .success-panel p { margin: 0; color: var(--muted); font-size: 14px; line-height: 1.6; } @media (min-width: 680px) { .hero { border-bottom-left-radius: 24px; border-bottom-right-radius: 24px; } .hero-title { font-size: 38px; } .field-grid { grid-template-columns: 1fr 1fr; } } @media (max-width: 430px) { .barcode-scanner-layer { padding-left: 10px; padding-right: 10px; } .barcode-video-wrap video { height: 66vh; } .barcode-scan-frame { width: 90%; height: 128px; } }