/* 响应式布局 — 电脑 / 平板 / 手机 + PWA 独立窗口 */ :root { --safe-top: env(safe-area-inset-top, 0px); --safe-right: env(safe-area-inset-right, 0px); --safe-bottom: env(safe-area-inset-bottom, 0px); --safe-left: env(safe-area-inset-left, 0px); --touch-min: 44px; } html { -webkit-text-size-adjust: 100%; text-size-adjust: 100%; } body { padding-left: var(--safe-left); padding-right: var(--safe-right); padding-bottom: var(--safe-bottom); } .page-wrap { padding-top: var(--safe-top); } .header-bar { display: grid; grid-template-columns: auto 1fr auto; align-items: center; gap: .5rem .75rem; margin-bottom: .85rem; min-height: var(--touch-min); } .nav-toggle { display: none; width: var(--touch-min); height: var(--touch-min); border: 1px solid var(--toggle-border); border-radius: 10px; background: var(--toggle-bg); cursor: pointer; flex-direction: column; align-items: center; justify-content: center; gap: 5px; padding: 0; flex-shrink: 0; } .nav-toggle span { display: block; width: 18px; height: 2px; background: var(--text-primary); border-radius: 2px; transition: transform .2s, opacity .2s; } .nav-toggle[aria-expanded="true"] span:nth-child(1) { transform: translateY(7px) rotate(45deg); } .nav-toggle[aria-expanded="true"] span:nth-child(2) { opacity: 0; } .nav-toggle[aria-expanded="true"] span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); } .header-tools { position: static; justify-content: flex-start; flex-wrap: wrap; } .user-bar { position: static; text-align: right; justify-self: end; } .pwa-install-btn { padding: .38rem .7rem; border-radius: 999px; border: 1px solid var(--accent); background: transparent; color: var(--accent); font-size: .72rem; cursor: pointer; white-space: nowrap; width: auto; flex-shrink: 0; min-height: 32px; } .pwa-install-btn:hover { background: var(--dir-bg); } .pwa-ios-hint { display: none; font-size: .72rem; color: var(--text-muted); padding: .5rem .75rem; margin: 0 0 .75rem; border-radius: 10px; border: 1px dashed var(--card-border); background: var(--card-inner); line-height: 1.5; } .pwa-ios-hint.show { display: block; } .nav-backdrop { display: none; position: fixed; inset: 0; background: var(--modal-mask); z-index: 90; border: none; padding: 0; cursor: pointer; } .nav-backdrop.show { display: block; } @media (min-width: 1025px) { .site-header { padding: 1.5rem 1.5rem 1.25rem; } .site-nav { justify-content: center; } .main { padding: 1.5rem 1.75rem; } } @media (min-width: 768px) and (max-width: 1024px) { .site-header { padding: 1.25rem 1rem 1rem; } .site-title { font-size: 1.5rem; margin-bottom: 1rem; } .site-nav { gap: .4rem; justify-content: center; } .site-nav a { padding: .5rem .85rem; font-size: .82rem; } .main { padding: 1.25rem 1rem; } .card { padding: 1.25rem; } .split-grid { grid-template-columns: 1fr; } .trade-split .card { min-height: auto; } .trade-form-line.line-3 { grid-template-columns: 1fr 1fr; } .trade-form-line.line-3 .trade-field:first-child { grid-column: 1 / -1; } .form-compact .line-4, .form-compact .line-5 { grid-template-columns: repeat(2, 1fr); } .form-compact .line-plan-2 { grid-template-columns: repeat(2, 1fr); } .pos-metrics { grid-template-columns: repeat(2, 1fr); } .review-detail-grid { grid-template-columns: repeat(2, 1fr); } .stat-grid-summary { display: flex; flex-wrap: nowrap; overflow-x: auto; } } @media (max-width: 767px) { .nav-toggle { display: inline-flex; } .header-bar { grid-template-columns: auto 1fr; grid-template-areas: "toggle tools" "user user"; } .nav-toggle { grid-area: toggle; } .header-tools { grid-area: tools; justify-content: flex-end; } .user-bar { grid-area: user; text-align: center; width: 100%; } .site-header { padding: .85rem .75rem .75rem; text-align: left; } .site-title { font-size: 1.15rem; margin-bottom: .65rem; text-align: center; } .site-title-sub { font-size: .58rem; letter-spacing: .14em; } .site-nav { position: fixed; top: 0; left: 0; width: min(86vw, 320px); height: 100dvh; flex-direction: column; align-items: stretch; justify-content: flex-start; gap: .35rem; padding: calc(var(--safe-top) + 3.5rem) 1rem 1.5rem; background: var(--card-bg); border-right: 1px solid var(--card-border); box-shadow: var(--shadow-card-hover); z-index: 100; transform: translateX(-105%); transition: transform .28s ease; overflow-y: auto; -webkit-overflow-scrolling: touch; } .site-nav.open { transform: translateX(0); } .site-nav a { width: 100%; text-align: left; padding: .75rem 1rem; font-size: .9rem; min-height: var(--touch-min); display: flex; align-items: center; border-radius: 10px; } .main { padding: .85rem .75rem 1.25rem; } .card { padding: 1rem; border-radius: 12px; margin-bottom: 1rem; } .card h2 { font-size: 1rem; } .form-compact .line-2, .form-compact .line-3, .form-compact .line-4, .form-compact .line-5, .form-compact .line-plan-1, .form-compact .line-plan-2 { grid-template-columns: 1fr; } .form-compact-review .tag-grid { grid-template-columns: repeat(2, 1fr); } .form-compact-review .kline-row { grid-template-columns: 1fr 1fr; } .form-grid { grid-template-columns: 1fr; } .split-grid { grid-template-columns: 1fr; gap: 1rem; } .split-grid .card { min-height: auto; } .trade-split .card { min-height: auto; } .trade-top-bar { flex-direction: column; align-items: stretch; } .trade-top-bar-actions { width: 100%; } .trade-top-bar-actions .btn-ctp-sm { width: 100%; min-height: var(--touch-min); } .pos-metrics { grid-template-columns: repeat(2, 1fr); } .review-detail-grid { grid-template-columns: 1fr; } .review-detail-item.wide { grid-column: span 1; } .stat-grid, .stat-grid:not(.stat-grid-summary) { grid-template-columns: repeat(2, 1fr); gap: .65rem; } .stat-grid-summary { display: flex; flex-wrap: nowrap; overflow-x: auto; } .stat-grid-summary .stat-item { flex: 0 0 auto; min-width: 4.25rem; padding: .35rem .15rem; } .stat-grid-summary .stat-item .label { font-size: .58rem; } .stat-grid-summary .stat-item .value { font-size: .72rem; } .stat-item { padding: .75rem .5rem; } .stat-grid-summary .stat-item { padding: .35rem .15rem; } .stat-item .value { font-size: 1.1rem; } .filter-row .field { width: 100%; min-width: 0; } .trade-toolbar { flex-direction: column; align-items: stretch; } .profile-row { grid-template-columns: 1fr; gap: .25rem; } .modal-box { padding: 1rem; border-radius: 12px; max-height: calc(100dvh - 1rem); } .modal-box.review-modal-fullscreen { width: 100%; height: 100dvh; border-radius: 0; } th, td { padding: .55rem .45rem; font-size: .8rem; } .card-scroll { max-height: none; } .stats-card-head { flex-direction: column; align-items: stretch; } .stats-view-field { width: 100%; } input, select, textarea, button { font-size: 16px; } .form-compact input, .form-compact select { font-size: 16px; } } @media (max-width: 479px) { .stat-grid:not(.stat-grid-summary) { grid-template-columns: 1fr 1fr; } .stat-grid-summary .stat-item { min-width: 3.75rem; } .theme-switch-btn { padding: .35rem .55rem; font-size: .7rem; } .pos-metrics { grid-template-columns: 1fr; } } @media (display-mode: standalone) { .site-header { padding-top: max(.75rem, var(--safe-top)); } .pwa-install-btn, .pwa-ios-hint { display: none !important; } } @media (max-width: 767px) and (orientation: landscape) { .site-nav { width: min(50vw, 280px); padding-top: calc(var(--safe-top) + 2.5rem); } } @media (hover: none) and (pointer: coarse) { .site-nav a, .btn-del, .trade-actions a, .trade-actions button, .preset-tabs a { min-height: var(--touch-min); } .card:hover { transform: none; } .list-item:hover { box-shadow: none; } .stat-item:hover { transform: none; } } .table-responsive { width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; } .table-responsive table { min-width: 560px; } body.login-page { display: flex; align-items: center; justify-content: center; min-height: 100vh; min-height: 100dvh; padding: 1rem; padding-top: max(1rem, var(--safe-top)); padding-bottom: max(1rem, var(--safe-bottom)); } @media (max-width: 767px) { body.login-page { align-items: flex-start; padding: .75rem; padding-top: max(.75rem, var(--safe-top)); } body.login-page .login-wrap { max-width: 100%; } body.login-page .login-box { padding: 1.75rem 1.25rem 1.5rem; } }