:root{--ubet-bg: #f8fafc;--ubet-surface: #ffffff;--ubet-surface-muted: #f1f5f9;--ubet-text: #0f172a;--ubet-text-muted: #64748b;--ubet-border: #e2e8f0;--ubet-primary: #4f46e5;--ubet-primary-hover: #4338ca;--ubet-primary-soft: #eef2ff;--ubet-danger: #dc2626;--ubet-danger-soft: #fef2f2;--ubet-warning: #b45309;--ubet-warning-soft: #fffbeb;--ubet-success: #15803d;--ubet-success-soft: #f0fdf4;--ubet-radius: 12px;--ubet-radius-sm: 8px;--ubet-shadow: 0 1px 3px rgba(15, 23, 42, .08);--ubet-font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Microsoft YaHei", sans-serif;--ubet-safe-bottom: env(safe-area-inset-bottom, 0px)}*,*:before,*:after{box-sizing:border-box}html,body{margin:0;min-height:100%;background:var(--ubet-bg);color:var(--ubet-text);font-family:var(--ubet-font);-webkit-font-smoothing:antialiased}body{line-height:1.5}a{color:var(--ubet-primary);text-decoration:none}a:hover{color:var(--ubet-primary-hover)}h1,h2,h3,p,ul{margin-top:0}button,input,textarea,select{font:inherit}.app-shell{max-width:480px;margin:0 auto;min-height:100vh;display:flex;flex-direction:column;background:var(--ubet-bg)}.app-header{position:sticky;top:0;z-index:10;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 16px;background:var(--ubet-surface);border-bottom:1px solid var(--ubet-border);box-shadow:var(--ubet-shadow)}.app-brand{font-size:18px;font-weight:800;letter-spacing:-.02em;color:var(--ubet-text)}.app-balance{font-size:13px;font-weight:600;color:var(--ubet-primary);background:var(--ubet-primary-soft);padding:6px 10px;border-radius:999px;white-space:nowrap}.app-main{flex:1;padding:16px 16px calc(88px + var(--ubet-safe-bottom))}.app-bottom-nav{position:fixed;left:50%;transform:translate(-50%);bottom:0;width:min(480px,100%);display:grid;grid-template-columns:repeat(4,1fr);gap:4px;padding:8px 8px calc(8px + var(--ubet-safe-bottom));background:var(--ubet-surface);border-top:1px solid var(--ubet-border);box-shadow:0 -4px 16px #0f172a0f}.app-nav-item{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;padding:8px 4px;border-radius:var(--ubet-radius-sm);color:var(--ubet-text-muted);font-size:11px;font-weight:600;text-decoration:none;transition:background .15s,color .15s}.app-nav-item:hover,.app-nav-item.active{color:var(--ubet-primary);background:var(--ubet-primary-soft)}.app-nav-icon{font-size:18px;line-height:1}.page-title{margin:0 0 4px;font-size:24px;font-weight:800;letter-spacing:-.02em}.page-subtitle{margin:0 0 16px;color:var(--ubet-text-muted);font-size:14px}.card{background:var(--ubet-surface);border:1px solid var(--ubet-border);border-radius:var(--ubet-radius);padding:16px;box-shadow:var(--ubet-shadow)}.card-muted{background:var(--ubet-surface-muted);border-color:transparent}.balance-hero{display:flex;flex-direction:column;gap:4px}.balance-hero__amount{font-size:28px;font-weight:800;letter-spacing:-.03em}.balance-hero__sub{color:var(--ubet-text-muted);font-size:14px}.quick-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px;margin-top:16px}.quick-link{display:flex;align-items:center;justify-content:center;min-height:56px;padding:12px;border:1px solid var(--ubet-border);border-radius:var(--ubet-radius);background:var(--ubet-surface);color:var(--ubet-text);font-weight:600;text-align:center;box-shadow:var(--ubet-shadow);transition:border-color .15s,transform .15s}.quick-link:hover{border-color:var(--ubet-primary);color:var(--ubet-primary);transform:translateY(-1px)}.list-card{list-style:none;margin:0;padding:0;background:var(--ubet-surface);border:1px solid var(--ubet-border);border-radius:var(--ubet-radius);overflow:hidden}.list-card li{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:12px 14px;border-top:1px solid var(--ubet-border)}.list-card li:first-child{border-top:none}.list-card__meta{color:var(--ubet-text-muted);font-size:13px}.bet-summary{flex:1;min-width:0}.bet-summary__head{display:flex;align-items:baseline;justify-content:space-between;gap:12px}.bet-summary__order{font-weight:700;font-size:15px;word-break:break-all}.bet-summary__status{flex-shrink:0;font-weight:600;color:var(--ubet-text)}.bet-summary__line{margin:4px 0 0;font-size:14px;line-height:1.5}.section-header{display:flex;align-items:center;justify-content:space-between;margin:24px 0 10px}.section-header h2{margin:0;font-size:18px}.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:44px;padding:10px 16px;border:1px solid transparent;border-radius:var(--ubet-radius-sm);font-weight:600;cursor:pointer;transition:background .15s,border-color .15s,opacity .15s}.btn:disabled{opacity:.55;cursor:not-allowed}.btn-primary{background:var(--ubet-primary);color:#fff}.btn-primary:hover:not(:disabled){background:var(--ubet-primary-hover)}.btn-secondary{background:var(--ubet-surface);border-color:var(--ubet-border);color:var(--ubet-text)}.btn-ghost{background:transparent;color:var(--ubet-text-muted);min-height:auto;padding:6px 10px;font-size:13px}.btn-block{width:100%}.input,.textarea{width:100%;min-height:44px;padding:10px 12px;border:1px solid var(--ubet-border);border-radius:var(--ubet-radius-sm);background:var(--ubet-surface);color:var(--ubet-text)}.input:focus,.textarea:focus{outline:2px solid var(--ubet-primary-soft);border-color:var(--ubet-primary)}.textarea{min-height:96px;resize:vertical}.field-label{display:block;margin-bottom:12px;font-size:14px;font-weight:600}.field-label span{display:block;margin-bottom:6px;color:var(--ubet-text-muted);font-weight:500}.alert{padding:12px 14px;border-radius:var(--ubet-radius-sm);font-size:14px}.alert-error{background:var(--ubet-danger-soft);border:1px solid #fecaca;color:var(--ubet-danger)}.alert-warning{background:var(--ubet-warning-soft);border:1px solid #fde68a;color:var(--ubet-warning)}.status-badge{display:inline-block;padding:3px 8px;border-radius:999px;font-size:11px;font-weight:700;white-space:nowrap}.status-pending{background:#fff3cd;color:#856404}.status-confirmed{background:#dbeafe;color:#1e40af}.status-settling{background:#e0e7ff;color:#3730a3}.status-won{background:var(--ubet-success-soft);color:var(--ubet-success)}.status-lost{background:var(--ubet-danger-soft);color:#991b1b}.status-void{background:#e2e8f0;color:#475569}.status-settle_error{background:#fecaca;color:#991b1b}.login-page{max-width:420px;margin:0 auto;min-height:100vh;display:flex;flex-direction:column;justify-content:center;padding:24px 16px}.login-card{background:var(--ubet-surface);border:1px solid var(--ubet-border);border-radius:var(--ubet-radius);padding:24px;box-shadow:var(--ubet-shadow)}.loading-screen{min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;color:var(--ubet-text-muted)}.loading-spinner{width:28px;height:28px;border:3px solid var(--ubet-border);border-top-color:var(--ubet-primary);border-radius:50%;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.back-link{display:inline-flex;align-items:center;gap:4px;margin-bottom:12px;font-size:14px;font-weight:600}.game-card{display:block;padding:16px;background:var(--ubet-surface);border:1px solid var(--ubet-border);border-radius:var(--ubet-radius);color:var(--ubet-text);box-shadow:var(--ubet-shadow);transition:border-color .15s,transform .15s}.game-card:hover{border-color:var(--ubet-primary);transform:translateY(-1px)}.game-card+.game-card{margin-top:10px}.game-card__title{font-size:17px;font-weight:700}.game-card__desc{margin-top:4px;color:var(--ubet-text-muted);font-size:13px}.game-detail-page{padding-bottom:calc(24px + var(--ubet-safe-bottom))}.game-detail-page--bet-bar{padding-bottom:calc(132px + var(--ubet-safe-bottom))}.game-panel{display:flex;flex-direction:column;gap:16px}.game-mode-section{background:var(--ubet-surface);border:1px solid var(--ubet-border);border-radius:var(--ubet-radius);padding:14px;box-shadow:var(--ubet-shadow);transition:border-color .15s,box-shadow .15s}.game-mode-section--active{border-color:var(--ubet-primary);box-shadow:0 0 0 1px var(--ubet-primary-soft)}.game-mode-section__title{margin:0 0 6px;font-size:15px;font-weight:700;line-height:1.4}.game-mode-section__prompt{margin:0 0 12px;color:var(--ubet-text-muted);font-size:14px}.side-grid{display:grid;gap:8px}.side-chip{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;min-height:52px;padding:10px 6px;border:1px solid var(--ubet-border);border-radius:var(--ubet-radius-sm);background:var(--ubet-surface);color:var(--ubet-text);cursor:pointer;transition:border-color .15s,background .15s,transform .1s}.side-chip:active{transform:scale(.98)}.side-chip--selected{border-color:var(--ubet-primary);background:var(--ubet-primary-soft);color:var(--ubet-primary-hover)}.side-chip__label{font-size:16px;font-weight:700}.side-chip__odds{font-size:12px;color:var(--ubet-text-muted);font-weight:600}.side-chip--selected .side-chip__odds{color:var(--ubet-primary)}.bet-focus-bar{position:fixed;left:50%;transform:translate(-50%);bottom:calc(72px + var(--ubet-safe-bottom));width:min(448px,calc(100% - 32px));display:flex;align-items:flex-start;gap:12px;padding:12px 14px;background:var(--ubet-surface);border:1px solid var(--ubet-border);border-radius:var(--ubet-radius);box-shadow:0 8px 24px #0f172a1f;z-index:9}.bet-focus-bar__body{flex:1;min-width:0;display:flex;flex-direction:column;gap:6px}.bet-focus-bar__text{flex:1;min-width:0}.bet-focus-bar__game{font-size:12px;color:var(--ubet-text-muted);font-weight:600}.bet-focus-bar__pick{font-size:14px;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.bet-focus-bar__amount{width:100%;min-height:36px;padding:8px 10px;border:1px solid var(--ubet-border);border-radius:var(--ubet-radius-sm);background:var(--ubet-bg);color:var(--ubet-text);font-size:14px}.bet-focus-bar__amount:focus{outline:none;border-color:var(--ubet-primary);box-shadow:0 0 0 2px var(--ubet-primary-soft)}.bet-focus-bar__amount--error{border-color:var(--ubet-danger)}.bet-focus-bar__amount::placeholder{color:var(--ubet-text-muted);font-size:13px}.bet-focus-bar__error{margin:0;font-size:12px;color:var(--ubet-danger);line-height:1.3}.bet-focus-bar__cta{flex-shrink:0;align-self:center;min-height:40px;min-width:64px;padding:8px 14px;font-size:14px}.bet-confirm-card{margin-bottom:12px}.bet-confirm-card__game{margin:0 0 4px;font-size:13px;color:var(--ubet-text-muted);font-weight:600}.bet-confirm-card__pick{margin:0 0 8px;font-size:18px;font-weight:800}.bet-confirm-card__hint{margin:0;font-size:13px;color:var(--ubet-text-muted);line-height:1.5}.bet-confirm-balance{margin:0 0 12px;font-size:14px;color:var(--ubet-text-muted)}.amount-chips{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px}.amount-chip{min-height:36px;padding:6px 14px;border:1px solid var(--ubet-border);border-radius:999px;background:var(--ubet-surface);color:var(--ubet-text);font-weight:600;font-size:14px;cursor:pointer}.amount-chip--active{border-color:var(--ubet-primary);background:var(--ubet-primary-soft);color:var(--ubet-primary)}.bet-confirm-footnote{margin:12px 0 0;text-align:center;font-size:13px;color:var(--ubet-text-muted)}.bet-preview{margin-top:16px}.bet-preview__title{margin:0 0 8px;font-weight:700;font-size:14px}.bet-preview__table{width:100%;border-collapse:collapse;font-size:14px}.bet-preview__table td{padding:4px 0}.bet-preview__table td:first-child{color:var(--ubet-text-muted)}.bet-preview__table td:last-child{text-align:right}.bet-preview__strong{font-weight:700}.order-no-line{font-family:ui-monospace,monospace;word-break:break-all}.order-status-bar{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:12px}.order-status-bar__hint{font-size:13px;color:var(--ubet-text-muted)}.order-status-bar__polling{font-size:12px;color:var(--ubet-text-muted)}.tab-bar{display:flex;gap:8px;margin-bottom:12px;padding:4px;background:var(--ubet-surface-muted);border-radius:var(--ubet-radius-sm)}.tab-bar__btn{flex:1;min-height:40px;border:none;border-radius:6px;background:transparent;color:var(--ubet-text-muted);font-weight:600;cursor:pointer}.tab-bar__btn--active{background:var(--ubet-surface);color:var(--ubet-primary);box-shadow:var(--ubet-shadow)}.detail-tx{margin:12px 0 0;font-size:13px;word-break:break-all}.detail-tx small{color:var(--ubet-text-muted)}.draw-verify{background:var(--ubet-surface);border:1px solid var(--ubet-border);border-radius:var(--ubet-radius);padding:16px}.draw-verify__title{margin:0 0 12px;font-size:17px}.verify-kv{margin:0 0 16px;display:grid;grid-template-columns:auto 1fr;gap:6px 12px;font-size:14px}.verify-kv dt{color:var(--ubet-text-muted);font-weight:600}.verify-kv dd{margin:0;word-break:break-all}.verify-status{padding:10px 12px;border-radius:var(--ubet-radius-sm);font-size:14px;font-weight:600;margin-bottom:16px}.verify-status--verified{background:var(--ubet-success-soft);color:var(--ubet-success)}.verify-status--mismatch{background:var(--ubet-danger-soft);color:var(--ubet-danger)}.verify-section{margin-bottom:16px;padding-top:12px;border-top:1px solid var(--ubet-border)}.verify-section h4{margin:0 0 8px;font-size:15px}.verify-section--rule .verify-rule{margin:0 0 8px;font-size:13px;color:var(--ubet-text-muted);line-height:1.5}.verify-row{display:flex;flex-direction:column;gap:2px;margin-bottom:8px;font-size:13px}.verify-row__label{color:var(--ubet-text-muted);font-weight:600}.verify-row__value{word-break:break-all}.verify-steps{margin:0;padding-left:1.2rem;font-size:13px;color:var(--ubet-text-muted)}.verify-footnote{margin:0;padding-top:12px;border-top:1px solid var(--ubet-border);font-size:12px;color:var(--ubet-text-muted)}.status-customer-pending{background:#fff3cd;color:#856404}.status-customer-settled{background:var(--ubet-success-soft);color:var(--ubet-success)}.status-customer-cancelled{background:#e2e8f0;color:#475569}.toast-host{position:fixed;left:50%;bottom:calc(72px + var(--ubet-safe-bottom));z-index:1000;max-width:min(420px,calc(100vw - 32px));padding:12px 16px;border-radius:var(--ubet-radius);background:#0f172aeb;color:#fff;font-size:14px;line-height:1.45;text-align:center;box-shadow:0 8px 24px #0f172a33;transform:translate(-50%);animation:toast-in .25s ease-out;pointer-events:none}@keyframes toast-in{0%{opacity:0;transform:translate(-50%) translateY(12px)}to{opacity:1;transform:translate(-50%) translateY(0)}}
