diff --git a/app/frontend/m/css/features.css b/app/frontend/m/css/features.css index ccd6488..943bc86 100644 --- a/app/frontend/m/css/features.css +++ b/app/frontend/m/css/features.css @@ -1076,7 +1076,7 @@ .m-chart-card { padding: 8px 6px; - height: var(--mobile-chart-height); + height: var(--mobile-chart-height-compact); } .m-chart-card svg { @@ -1148,18 +1148,18 @@ .m-sent-metrics { display: flex; - gap: 8px; + gap: 6px; margin-top: 12px; - flex-wrap: wrap; + flex-wrap: nowrap; } .m-sent-metric { - flex: 1; - min-width: 72px; + flex: 1 1 0; + min-width: 0; display: flex; flex-direction: column; gap: 2px; - padding: 8px; + padding: 8px 6px; border-radius: 6px; background: var(--surface-muted); } @@ -1167,18 +1167,31 @@ .m-sent-metric span { font-size: var(--font-size-aux); color: var(--text-tertiary); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } .m-sent-metric b { font-size: var(--font-size-card-title); font-weight: 600; font-variant-numeric: tabular-nums; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } .m-sent-up b { color: var(--market-up); } .m-sent-warn b { color: var(--warning); } .m-sent-down b { color: var(--market-down); } +@media (max-width: 359px) { + .m-sent-metrics { gap: 4px; } + .m-sent-metric { padding: 8px 4px; } + .m-sent-metric span { font-size: 10.5px; } + .m-sent-metric b { font-size: 14px; } +} + .m-sent-advice { margin-top: 10px; font-size: var(--font-size-label); @@ -1337,12 +1350,14 @@ .m-ladder-tier-count { font-size: var(--font-size-label); color: var(--text-secondary); + white-space: nowrap; } .m-ladder-rate { - margin-left: auto; + flex: 0 0 auto; font-size: var(--font-size-aux); color: var(--text-tertiary); + white-space: nowrap; } .m-ladder-stocks { @@ -1426,15 +1441,24 @@ color: var(--text-tertiary); } -.m-ladder-more { - width: 100%; - height: 40px; +.m-ladder-fold { + margin-left: auto; + flex: 0 0 auto; + min-height: 32px; + padding: 0 2px; border: 0; - border-top: 1px solid var(--border-subtle); background: transparent; color: var(--action); - font-size: var(--font-size-label); + font-size: var(--font-size-aux); + white-space: nowrap; cursor: pointer; + -webkit-tap-highlight-color: transparent; + transition: transform var(--motion-press-release) var(--ease-press); +} + +.m-ladder-fold:active { + transform: scale(0.94); + transition-duration: var(--motion-press); } .m-rate-list { @@ -1512,16 +1536,17 @@ } .m-rotation-chips { - display: flex; - flex-wrap: wrap; + display: grid; + grid-template-columns: repeat(2, 1fr); gap: 8px; } .m-rotation-chip { - display: inline-flex; + display: flex; align-items: center; - gap: 6px; - padding: 6px 10px; + gap: 8px; + min-width: 0; + padding: 8px 10px; border-radius: 8px; border: 1px solid var(--border-strong); background: var(--surface); @@ -1536,14 +1561,28 @@ background: var(--surface-hover); } +.m-rotation-copy { + display: flex; + flex-direction: column; + gap: 2px; + min-width: 0; + flex: 1; +} + .m-rotation-chip strong { font-size: var(--font-size-label); font-weight: 500; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } .m-rotation-chip small { font-size: var(--font-size-aux); color: var(--text-secondary); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } .m-rotation-chip.heat-strong { diff --git a/app/frontend/m/css/tokens.css b/app/frontend/m/css/tokens.css index f710d13..c53a081 100644 --- a/app/frontend/m/css/tokens.css +++ b/app/frontend/m/css/tokens.css @@ -45,6 +45,7 @@ --mobile-safe-bottom: env(safe-area-inset-bottom, 0px); --mobile-page-padding: 12px; --mobile-chart-height: 240px; + --mobile-chart-height-compact: 168px; --mobile-table-row-height: 44px; --mobile-table-header-height: 40px; --mobile-icon-cell: 78px; diff --git a/app/frontend/m/js/pages.js b/app/frontend/m/js/pages.js index 0f5e8a0..49cc544 100644 --- a/app/frontend/m/js/pages.js +++ b/app/frontend/m/js/pages.js @@ -372,7 +372,7 @@ } const head = ordered.map(function (col, i) { - const sortable = sortableColumn(col); + const sortable = !(opts && opts.noSort) && sortableColumn(col); let extraCls = ""; let extraAttrs = ""; let indicator = ""; @@ -813,7 +813,7 @@ } function sentimentTrendChart(rows) { - const W = 360, H = 240, padL = 8, padR = 30, padT = 12, padB = 22; + const W = 360, H = 168, padL = 8, padR = 30, padT = 10, padB = 20; const pw = W - padL - padR; const ph = H - padT - padB; if (!rows.length) return emptyChart("暂无情绪历史数据"); @@ -927,7 +927,7 @@ return raw.slice().reverse().map(function (r) { return Object.assign({}, r, { trade_date: displayCompactDate(r.trade_date) }); }); - }, {}); + }, { noSort: true }); } function sentMetric(label, valueHtml, tone) { @@ -951,6 +951,7 @@ function loadLadder() { const seq = nextSeq(); + Object.keys(expandedLadder).forEach(function (level) { delete expandedLadder[level]; }); const date = state.requestedDate; global.MobileAPI.request("/api/dashboard?trade_date=" + encodeURIComponent(date)).then(function (payload) { if (seq !== state.seq) return; @@ -974,6 +975,7 @@ const rateHtml = level > 1 && count ? '较' + (level - 1) + "板 " + rate + "%" : ""; let stocksHtml = ""; + let foldBtn = ""; if (gap) { stocksHtml = '
' + (spaceStocks.length ? spaceStocks.map(function (s) { return "" + escapeHtml(s.name) + "(" + escapeHtml(s.sector || "其他") + ")"; }).join(" · ") : "暂无空间板") + "
" + "" + escapeHtml(spaceNote) + "${spaceStocks.length ? spaceStocks.map((stock) => `${escapeHtml(stock.name)}(${escapeHtml(stock.sector || "其他")})`).join(" · ") : "暂无空间板"}
${spaceNote}
${spaceNote}
断层越少,梯队从低位向高位传导越连贯。当前腰部为 ${escapeHtml(strongestGroup?.label || "--")}。