chore: create Multica handoff checkpoint

This commit is contained in:
leefer
2026-08-06 22:54:46 +08:00
parent bd97ba1829
commit 33f9db43b1
51 changed files with 3054 additions and 2883 deletions
+5 -5
View File
@@ -479,13 +479,13 @@
white-space: nowrap;
}
@media (min-width: 721px) and (max-width: 1279px) {
@media (min-width: 768px) and (max-width: 1279px) {
.account-button {
width: 32px;
}
}
@media (max-width: 720px) {
@media (max-width: 767px) {
.header-command-group .account-button {
width: 100%;
@@ -1020,7 +1020,7 @@ button.account-role-badge:focus-visible {
gap: 10px;
}
@media (max-width: 720px) {
@media (max-width: 767px) {
.account-menu-shell {
width: 100%;
@@ -1128,7 +1128,7 @@ button.account-role-badge:focus-visible {
box-shadow: rgba(22, 34, 46, 0.15) 0px 14px 35px;
}
@media (max-width: 720px) {
@media (max-width: 767px) {
.account-settings-dialog,
.settings-dialog {
width: calc(-16px + 100vw);
@@ -1648,7 +1648,7 @@ button.account-role-badge:focus-visible {
box-shadow: var(--shadow);
}
@media (min-width: 721px) {
@media (min-width: 768px) {
.account-menu-shell {
display: inline-flex;
}
+27 -2
View File
@@ -125,13 +125,13 @@ dialog::backdrop {
backdrop-filter: blur(2px);
}
@media (min-width: 721px) {
@media (min-width: 768px) {
body {
overflow-y: hidden;
}
}
@media (max-width: 720px), (max-width: 1023px) and (max-height: 600px) {
@media (max-width: 767px), (max-width: 1023px) and (max-height: 600px) {
html {
width: 100%;
@@ -185,3 +185,28 @@ dialog::backdrop {
animation: auto ease 0s 1 normal none running none;
}
}
/* Mobile document contract: the page owns the only vertical scrollbar. */
@media (max-width: 767px) {
html {
width: 100%;
min-width: var(--mobile-min-width);
min-height: 100%;
height: auto;
overflow-x: hidden;
}
body.mobile-shell {
width: 100%;
min-width: var(--mobile-min-width);
min-height: 100%;
height: auto;
padding-bottom: var(--mobile-content-bottom);
overflow-y: auto;
overscroll-behavior-y: contain;
}
body.mobile-shell.mobile-command-open {
overflow: hidden;
}
}
+2 -2
View File
@@ -168,7 +168,7 @@
font-size: 11px;
}
@media (max-width: 720px), (max-width: 1023px) and (max-height: 600px) {
@media (max-width: 767px), (max-width: 1023px) and (max-height: 600px) {
.redesigned-page-head {
align-items: flex-start;
@@ -178,7 +178,7 @@
}
}
@media (min-width: 721px) {
@media (min-width: 768px) {
:is(.redesigned-auction-view, .redesigned-theme-view, .redesigned-popularity-view, .redesigned-dragon-view) {
width: min(100%, 2200px);
+87 -37
View File
@@ -9,7 +9,7 @@
stroke-width: 1.75;
}
@media (max-width: 720px) {
@media (max-width: 767px) {
.header-command-group .command-button {
width: 100%;
@@ -106,7 +106,7 @@ body.sidebar-collapsed .sidebar-collapse-button .lucide {
transform: rotate(180deg);
}
@media (min-width: 721px) and (max-width: 1279px) {
@media (min-width: 768px) and (max-width: 1279px) {
.command-button {
width: 32px;
@@ -118,7 +118,7 @@ body.sidebar-collapsed .sidebar-collapse-button .lucide {
}
}
@media (min-width: 721px) and (max-width: 1023px) {
@media (min-width: 768px) and (max-width: 1023px) {
.sidebar-collapse-button span {
display: none;
}
@@ -132,7 +132,7 @@ body.sidebar-collapsed .sidebar-collapse-button .lucide {
}
}
@media (max-width: 720px) {
@media (max-width: 767px) {
.header-command-group .button.primary {
border-color: var(--action);
@@ -186,7 +186,7 @@ body.sidebar-collapsed .sidebar-collapse-button .lucide {
height: 15px;
}
@media (max-width: 720px) {
@media (max-width: 767px) {
.stock-heaven-button span {
display: none;
}
@@ -241,7 +241,7 @@ body.sidebar-collapsed .sidebar-collapse-button .lucide {
font-weight: 670;
}
@media (min-width: 721px) and (max-width: 1279px) {
@media (min-width: 768px) and (max-width: 1279px) {
.sidebar-collapse-button span {
display: none;
}
@@ -253,7 +253,7 @@ body.sidebar-collapsed .sidebar-collapse-button .lucide {
}
}
@media (max-width: 720px) {
@media (max-width: 767px) {
.header-menu-button {
width: 34px;
@@ -593,7 +593,7 @@ body.sidebar-collapsed .sidebar-collapse-button .lucide {
box-shadow: 0 0 0 3px var(--focus-ring);
}
@media (max-width: 720px) {
@media (max-width: 767px) {
.module-nav .sidebar-collapse-button {
display: none;
}
@@ -751,7 +751,7 @@ body.sidebar-collapsed .sidebar-collapse-button {
color: var(--text-inverse);
}
@media (max-width: 1023px) and (min-width: 721px) {
@media (max-width: 1023px) and (min-width: 768px) {
.sidebar-collapse-button span {
display: none;
}
@@ -944,33 +944,7 @@ textarea {
font-size: 12px;
}
.chat-input {
display: flex;
gap: 8px;
padding: 12px 16px;
border-top: 1px solid var(--line-soft);
}
.chat-input input {
flex: 1 1 0%;
border: 1px solid var(--line);
border-radius: 8px;
padding: 9px 12px;
outline: none;
}
.chat-input input:focus {
border-color: var(--blue-line);
}
@media (max-width: 720px), (max-width: 1023px) and (max-height: 600px) {
@media (max-width: 767px), (max-width: 1023px) and (max-height: 600px) {
.sidebar-collapse-button {
display: none;
}
@@ -1034,8 +1008,84 @@ textarea {
box-shadow: var(--control-shadow);
}
@media (min-width: 721px) {
@media (min-width: 768px) {
.header-menu-button {
display: none;
}
}
/* Mobile control contract. */
@media (max-width: 767px) {
body.mobile-shell .header-menu-button,
body.mobile-shell .header-actions > .header-menu-button {
width: var(--mobile-touch-size);
min-width: var(--mobile-touch-size);
height: var(--mobile-touch-size);
min-height: var(--mobile-touch-size);
display: grid;
place-items: center;
}
body.mobile-shell .header-command-group .command-button {
width: 100%;
height: auto;
min-height: var(--mobile-touch-size);
justify-content: flex-start;
padding: 0 var(--space-12);
border: 1px solid var(--border);
border-radius: var(--radius-md);
background: var(--control-surface);
color: var(--text-primary);
}
body.mobile-shell .header-command-group .command-button > span {
display: inline;
}
body.mobile-shell .mobile-command-shortcut {
width: 100%;
height: auto;
min-height: var(--mobile-touch-size);
}
body.mobile-shell .mobile-market-selector:not([hidden]) {
position: relative;
width: 100%;
height: var(--mobile-touch-size);
min-height: var(--mobile-touch-size);
display: grid;
grid-template-columns: auto minmax(0, 1fr) var(--mobile-nav-icon-size);
align-items: center;
gap: var(--space-8);
margin: var(--mobile-page-pad) 0 0;
padding: 0 var(--space-12);
border: 1px solid var(--border);
border-radius: var(--radius-md);
background: var(--surface);
box-shadow: none;
}
body.mobile-shell .mobile-market-selector select {
width: 100%;
height: calc(var(--mobile-touch-size) - 2px);
min-height: 0;
padding: 0;
border: 0;
background: transparent;
color: var(--text-primary);
font-size: var(--font-size-body);
font-weight: var(--font-weight-semibold);
text-align: right;
appearance: none;
}
body.mobile-shell :is(.button, .icon-button, button) {
touch-action: manipulation;
}
}
:root[data-theme="dark"] .mobile-command-shortcut {
border-color: var(--border);
background: var(--surface-subtle);
color: var(--text-secondary);
}
+4 -4
View File
@@ -53,7 +53,7 @@
}
}
@media (max-width: 720px) {
@media (max-width: 767px) {
.dialog-header-actions {
flex-wrap: wrap;
@@ -189,7 +189,7 @@
font-size: 12px;
}
@media (max-width: 720px) {
@media (max-width: 767px) {
.global-search-dialog {
width: calc(-16px + 100vw);
@@ -431,7 +431,7 @@
height: 34px;
}
@media (max-width: 720px) {
@media (max-width: 767px) {
.alerts-dialog {
width: calc(-16px + 100vw);
@@ -713,7 +713,7 @@
font-size: 10px;
}
@media (max-width: 720px) {
@media (max-width: 767px) {
.assistant-dialog {
max-width: none;
+1 -5
View File
@@ -14,10 +14,6 @@
}
}
.loading-message p {
color: var(--text-muted);
}
@keyframes breathe-core {
0%,
100% {
@@ -163,7 +159,7 @@
}
}
@media (max-width: 720px) {
@media (max-width: 767px) {
@keyframes command-menu-enter {
0% {
opacity: 0;
+39 -3
View File
@@ -23,7 +23,7 @@
}
}
@media (max-width: 720px) {
@media (max-width: 767px) {
.toolbar-controls {
width: 100%;
@@ -143,7 +143,7 @@
box-shadow: rgba(0, 0, 0, 0.08) 0px 1px 2px;
}
@media (max-width: 720px), (max-width: 1023px) and (max-height: 600px) {
@media (max-width: 767px), (max-width: 1023px) and (max-height: 600px) {
.redesigned-page-head .toolbar-controls {
width: 100%;
@@ -219,8 +219,44 @@
}
}
@media (min-width: 721px) {
@media (min-width: 768px) {
.toolbar-controls {
align-items: center;
}
}
/* Mobile navigation and filter contract. */
@media (max-width: 767px) {
body.mobile-shell .toolbar-controls,
body.mobile-shell .redesigned-page-head .toolbar-controls {
width: 100%;
min-width: 0;
display: flex;
align-items: center;
gap: var(--space-8);
margin-left: 0;
overflow-x: auto;
overflow-y: hidden;
scrollbar-width: none;
}
body.mobile-shell .toolbar-controls::-webkit-scrollbar,
body.mobile-shell .redesigned-page-head .toolbar-controls::-webkit-scrollbar {
display: none;
}
body.mobile-shell .segmented,
body.mobile-shell .redesigned-page-head .segmented {
width: max-content;
min-width: max-content;
min-height: var(--mobile-touch-size);
flex: 0 0 auto;
}
body.mobile-shell .segment,
body.mobile-shell .redesigned-page-head .segment {
min-width: var(--mobile-touch-size);
min-height: calc(var(--mobile-touch-size) - var(--space-4));
padding: 0 var(--space-12);
}
}
+1 -1
View File
@@ -157,7 +157,7 @@
background: var(--table-selected);
}
@media (max-width: 720px) {
@media (max-width: 767px) {
.data-table {
font-size: 12.5px;
}
+426 -27
View File
@@ -65,21 +65,13 @@ body.sidebar-collapsed .nav-group + .nav-group {
border-top: 1px solid var(--border);
}
@media (min-width: 721px) and (max-width: 1279px) {
@media (min-width: 768px) and (max-width: 1279px) {
.header-actions {
grid-column: 3;
}
}
@media (min-width: 721px) and (max-width: 1023px) {
.module-nav {
width: 64px;
padding-right: 7px;
padding-left: 7px;
}
@media (min-width: 768px) and (max-width: 1023px) {
.nav-group:first-of-type {
margin-top: 10px;
}
@@ -93,7 +85,7 @@ body.sidebar-collapsed .nav-group + .nav-group {
}
}
@media (max-width: 720px) {
@media (max-width: 767px) {
.market-tape {
display: none;
}
@@ -139,6 +131,16 @@ body.sidebar-collapsed .nav-group + .nav-group {
.status-bar {
display: none;
}
body:is(
[data-active-view="screenerView"],
[data-active-view="screenerTrackingView"],
[data-active-view="mentorView"],
[data-active-view="heavenView"],
[data-active-view="reviewWorkspaceView"]
) .overview-strip {
display: none;
}
}
.market-breadth-panel .workspace-heading {
@@ -295,7 +297,7 @@ body.sidebar-collapsed .nav-group + .nav-group {
font-weight: 770;
}
@media (min-width: 721px) and (max-width: 1279px) {
@media (min-width: 768px) and (max-width: 1279px) {
body.sidebar-collapsed .module-nav {
width: 68px;
@@ -315,7 +317,7 @@ body.sidebar-collapsed .nav-group + .nav-group {
}
}
@media (max-width: 720px) {
@media (max-width: 767px) {
.header-command-group {
position: fixed;
@@ -441,7 +443,7 @@ body.sidebar-collapsed .module-tab {
padding: 0px;
}
@media (min-width: 721px) and (max-width: 1023px) {
@media (min-width: 768px) and (max-width: 1023px) {
.module-tab span {
display: none;
}
@@ -457,7 +459,7 @@ body.sidebar-collapsed .module-tab {
}
}
@media (min-width: 721px) and (max-width: 1279px) {
@media (min-width: 768px) and (max-width: 1279px) {
.module-tab span {
display: none;
}
@@ -473,7 +475,7 @@ body.sidebar-collapsed .module-tab {
}
}
@media (max-width: 720px) {
@media (max-width: 767px) {
.header-date-group .icon-button {
width: 30px;
@@ -535,7 +537,7 @@ body.sidebar-collapsed .module-tab {
border-right-color: var(--border);
}
@media (max-width: 720px) {
@media (max-width: 767px) {
.metric {
gap: 2px;
@@ -557,7 +559,7 @@ body.sidebar-collapsed .module-tab {
font-size: 11px;
}
@media (max-width: 720px) {
@media (max-width: 767px) {
.metric-label {
font-size: 10.5px;
}
@@ -695,7 +697,7 @@ body.sidebar-collapsed .app-main {
}
}
@media (max-width: 720px) {
@media (max-width: 767px) {
.module-nav .market-sub-tab {
display: none;
}
@@ -1015,7 +1017,7 @@ body.sidebar-collapsed .app-main {
}
}
@media (min-width: 721px) and (max-width: 1279px) {
@media (min-width: 768px) and (max-width: 1279px) {
.app-header {
padding-left: 8px;
@@ -1033,7 +1035,7 @@ body.sidebar-collapsed .app-main {
}
}
@media (max-width: 720px) {
@media (max-width: 767px) {
body.sidebar-collapsed {
display: block;
@@ -2055,7 +2057,7 @@ body.sidebar-collapsed .status-bar {
}
}
@media (max-width: 1023px) and (min-width: 721px) {
@media (max-width: 1023px) and (min-width: 768px) {
.module-nav {
width: 64px;
@@ -2089,7 +2091,7 @@ body.sidebar-collapsed .status-bar {
}
}
@media (max-width: 720px), (max-width: 1023px) and (max-height: 600px) {
@media (max-width: 767px), (max-width: 1023px) and (max-height: 600px) {
.redesigned-page-head .section-title-group {
width: 100%;
@@ -2101,7 +2103,7 @@ body.sidebar-collapsed .status-bar {
}
}
@media (min-width: 721px) {
@media (min-width: 768px) {
.app-main {
min-height: 0px;
@@ -2397,7 +2399,7 @@ body.sidebar-collapsed .status-bar {
background: transparent;
}
@media (min-width: 721px) {
@media (min-width: 768px) {
body:is([data-active-view="sentimentCycleView"], [data-active-view="yesterdayView"]) .app-main {
height: var(--workspace-height);
@@ -2449,7 +2451,7 @@ body.sidebar-collapsed .status-bar {
}
}
@media (max-width: 720px), (max-width: 1023px) and (max-height: 600px) {
@media (max-width: 767px), (max-width: 1023px) and (max-height: 600px) {
body.sidebar-collapsed {
display: block;
@@ -2808,7 +2810,7 @@ body.sidebar-collapsed .status-bar {
color: var(--text-primary);
}
@media (min-width: 721px) {
@media (min-width: 768px) {
.header-actions > .icon-button {
min-width: 31px;
}
@@ -2823,3 +2825,400 @@ body.sidebar-collapsed .status-bar {
align-items: center;
}
}
@media (min-width: 768px) and (max-width: 1023px) {
.main,
body.sidebar-collapsed .main {
width: calc(100% - var(--sidebar-compact-width));
min-width: 0;
margin-left: var(--sidebar-compact-width);
}
.module-nav,
body.sidebar-collapsed .module-nav {
width: var(--sidebar-compact-width);
padding-right: 7px;
padding-left: 7px;
}
.status-bar,
body.sidebar-collapsed .status-bar {
left: var(--sidebar-compact-width);
}
}
/* Canonical mobile shell. Page-specific responsive rules remain with each page. */
.mobile-page-context,
.mobile-command-shortcuts,
.mobile-command-backdrop {
display: none;
}
@media (max-width: 767px) {
.mobile-shell,
.mobile-shell.sidebar-collapsed {
display: block;
min-height: 100dvh;
padding-bottom: var(--mobile-content-bottom);
}
body.mobile-shell .main,
body.mobile-shell.sidebar-collapsed .main {
width: 100%;
min-width: 0;
min-height: 100dvh;
margin-left: 0;
}
body.mobile-shell .app-header {
position: sticky;
top: 0;
z-index: var(--mobile-layer-header);
width: 100%;
height: var(--mobile-header-height);
min-height: var(--mobile-header-height);
display: flex;
align-items: center;
gap: var(--space-8);
padding: var(--space-4) var(--mobile-shell-pad);
border-bottom: 1px solid var(--border);
background: var(--surface);
box-shadow: none;
}
body.mobile-shell.mobile-command-open .app-header {
z-index: var(--mobile-layer-menu);
}
body.mobile-shell .mobile-page-context {
min-width: 0;
display: flex;
flex: 1 1 auto;
flex-direction: column;
justify-content: center;
gap: 0;
}
body.mobile-shell .mobile-page-context span {
color: var(--text-tertiary);
font-size: var(--font-size-aux);
line-height: 1.2;
}
body.mobile-shell .mobile-page-context strong {
overflow: hidden;
color: var(--text-primary);
font-size: var(--font-size-body);
font-weight: var(--font-weight-bold);
line-height: 1.35;
text-overflow: ellipsis;
white-space: nowrap;
}
body.mobile-shell .market-tape,
body.mobile-shell .header-actions > :is(.global-search-button, .theme-toggle, .alert-button, .assistant-button) {
display: none;
}
body.mobile-shell .header-actions {
position: static;
width: auto;
min-width: 0;
display: flex;
flex: 0 0 auto;
align-items: center;
gap: var(--space-4);
margin: 0;
}
body.mobile-shell .header-date-group {
width: var(--mobile-date-width);
height: var(--mobile-touch-size);
min-height: var(--mobile-touch-size);
padding: 0 var(--space-4);
border: 1px solid var(--border);
border-radius: var(--radius-md);
background: var(--control-surface);
}
body.mobile-shell .header-date-group > .icon-button {
display: none;
}
body.mobile-shell .header-date-group .date-input {
width: 100%;
height: calc(var(--mobile-touch-size) - 2px);
min-width: 0;
padding: 0;
border: 0;
background: transparent;
color: var(--text-primary);
font-size: var(--font-size-caption);
font-weight: var(--font-weight-semibold);
}
body.mobile-shell .app-header .header-actions > .header-menu-button {
width: var(--mobile-touch-size);
min-width: var(--mobile-touch-size);
height: var(--mobile-touch-size);
min-height: var(--mobile-touch-size);
display: grid;
place-items: center;
padding: 0;
border: 1px solid var(--border);
border-radius: var(--radius-md);
background: var(--control-surface);
}
body.mobile-shell .header-command-group {
position: fixed;
inset: auto var(--mobile-shell-pad) var(--mobile-content-bottom);
z-index: var(--mobile-layer-menu);
width: auto;
max-height: calc(100dvh - var(--mobile-header-height) - var(--mobile-content-bottom) - var(--space-16));
display: none;
grid-template-columns: 1fr;
align-items: stretch;
gap: var(--space-8);
padding: var(--space-12);
overflow-y: auto;
border: 1px solid var(--border);
border-radius: var(--radius-lg);
background: var(--surface-overlay);
box-shadow: var(--shadow-float);
}
body.mobile-shell .header-command-group.is-open {
display: grid;
}
body.mobile-shell .mobile-command-shortcuts {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: var(--space-8);
padding-bottom: var(--space-8);
border-bottom: 1px solid var(--border-subtle);
}
body.mobile-shell .header-command-group .mobile-command-shortcuts > .mobile-command-shortcut {
min-width: 0;
min-height: var(--mobile-touch-size);
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
gap: var(--space-4);
padding: var(--space-8) var(--space-4);
border: 1px solid var(--border);
border-radius: var(--radius-md);
background: var(--surface-subtle);
color: var(--text-secondary);
font-size: var(--font-size-caption);
}
body.mobile-shell .header-command-group > .command-button,
body.mobile-shell .header-command-group .account-button {
width: 100%;
min-height: var(--mobile-touch-size);
justify-content: flex-start;
}
body.mobile-shell .header-command-group .account-dropdown {
position: static;
grid-column: 1 / -1;
width: 100%;
margin-top: var(--space-8);
}
body.mobile-shell .mobile-command-backdrop:not([hidden]) {
position: fixed;
inset: 0;
z-index: var(--mobile-layer-backdrop);
display: block;
width: 100%;
height: 100%;
border: 0;
background: var(--backdrop);
}
body.mobile-shell .module-nav,
body.mobile-shell.sidebar-collapsed .module-nav {
position: fixed;
inset: auto 0 0;
z-index: var(--mobile-layer-nav);
width: 100%;
height: calc(var(--mobile-nav-height) + var(--mobile-safe-bottom));
min-height: calc(var(--mobile-nav-height) + var(--mobile-safe-bottom));
max-height: calc(var(--mobile-nav-height) + var(--mobile-safe-bottom));
display: grid;
grid-template-columns: repeat(5, minmax(0, 1fr));
align-items: start;
gap: 0;
padding: var(--space-4) var(--space-4) max(var(--space-4), var(--mobile-safe-bottom));
overflow: hidden;
border: 0;
border-top: 1px solid var(--border);
background: var(--surface-overlay);
box-shadow: var(--elevation-raised);
}
body.mobile-shell .module-nav :is(.sidebar-brand, .nav-group-label, .market-sub-tab, .sidebar-collapse-button),
body.mobile-shell.sidebar-collapsed .module-nav :is(.sidebar-brand, .nav-group-label, .market-sub-tab, .sidebar-collapse-button) {
display: none;
}
body.mobile-shell .module-nav .nav-group,
body.mobile-shell.sidebar-collapsed .module-nav .nav-group {
display: contents;
margin: 0;
padding: 0;
border: 0;
}
body.mobile-shell .module-nav .module-tab,
body.mobile-shell.sidebar-collapsed .module-nav .module-tab {
display: none;
}
body.mobile-shell .module-nav .module-tab.mobile-primary-tab,
body.mobile-shell.sidebar-collapsed .module-nav .module-tab.mobile-primary-tab {
position: relative;
min-width: 0;
min-height: var(--mobile-tab-height);
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
gap: var(--space-4);
margin: 0;
padding: var(--space-4);
border: 0;
border-radius: var(--radius-md);
background: transparent;
color: var(--text-tertiary);
font-size: var(--font-size-aux);
font-weight: var(--font-weight-medium);
}
body.mobile-shell .module-nav .module-tab.mobile-primary-tab .lucide {
width: var(--mobile-nav-icon-size);
height: var(--mobile-nav-icon-size);
}
body.mobile-shell .module-nav .module-tab.mobile-primary-tab:is(.active, .mobile-active) {
background: var(--action-soft);
color: var(--action);
font-weight: var(--font-weight-semibold);
}
body.mobile-shell .module-nav .module-tab.mobile-primary-tab span,
body.mobile-shell.sidebar-collapsed .module-nav .module-tab.mobile-primary-tab span {
display: block;
max-width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
body.mobile-shell .module-nav .module-tab.mobile-primary-tab .nav-label-desktop {
display: none;
}
body.mobile-shell .module-nav .module-tab.mobile-primary-tab .nav-label-mobile {
display: block;
}
body.mobile-shell .app-main,
body.mobile-shell.sidebar-collapsed .app-main,
body.mobile-shell:is([data-active-view]) .app-main {
width: 100%;
height: auto;
min-height: calc(100dvh - var(--mobile-header-height) - var(--mobile-content-bottom));
display: block;
margin: 0;
padding: 0 var(--mobile-page-pad) var(--mobile-page-pad);
overflow: visible;
background: var(--surface-canvas);
}
body.mobile-shell .overview-strip,
body.mobile-shell .overview-strip[data-overview-expanded="true"] {
width: calc(100% + var(--mobile-page-pad) + var(--mobile-page-pad));
height: var(--mobile-tab-height);
min-height: var(--mobile-tab-height);
display: flex;
margin: 0 calc(var(--mobile-page-pad) * -1);
padding: 0 var(--mobile-page-pad);
overflow-x: auto;
overflow-y: hidden;
border-bottom: 1px solid var(--border);
background: var(--surface);
scrollbar-width: none;
}
body.mobile-shell .overview-strip::-webkit-scrollbar {
display: none;
}
body.mobile-shell .overview-strip .row {
width: max-content;
min-width: 100%;
display: flex;
align-items: center;
gap: var(--space-8);
padding: 0;
}
body.mobile-shell .overview-strip .sentiment-block,
body.mobile-shell .overview-strip .metric,
body.mobile-shell .overview-strip[data-overview-expanded="true"] .metric {
min-width: max-content;
min-height: var(--mobile-touch-size);
display: flex;
flex: 0 0 auto;
flex-direction: row;
align-items: center;
gap: var(--space-4);
padding: 0 var(--space-8);
border: 0;
background: transparent;
}
body.mobile-shell .overview-strip .metric:nth-of-type(n) {
display: flex;
}
body.mobile-shell .overview-strip .metric-wide,
body.mobile-shell .overview-toggle {
display: none;
}
body.mobile-shell .workspace-view,
body.mobile-shell .workspace-view.page:not(#heavenView),
body.mobile-shell:is([data-active-view]) .workspace-view.active-view {
width: 100%;
height: auto;
min-height: 0;
margin: 0;
padding: var(--mobile-page-pad) 0 0;
overflow: visible;
border: 0;
border-radius: 0;
background: transparent;
box-shadow: none;
}
body.mobile-shell .status-bar {
display: none;
}
}
@media (max-width: 359px) {
.header-date-group {
width: calc(var(--mobile-date-width) - var(--space-16));
}
.mobile-page-context span {
display: none;
}
}
+41 -3
View File
@@ -2,25 +2,42 @@
"use strict";
const SIDEBAR_STORAGE_KEY = "xiaobai-sidebar-collapsed";
const MOBILE_BREAKPOINT = 767;
function isMobileViewport() {
return global.matchMedia(`(max-width: ${MOBILE_BREAKPOINT}px)`).matches;
}
function create(options) {
const state = options.state;
const registry = options.pages;
let initialized = false;
function syncViewportMode() {
document.body.classList.toggle("mobile-shell", isMobileViewport());
}
function toggleHeaderCommandMenu(force) {
const menu = document.querySelector("#headerCommandGroup");
const button = document.querySelector("#headerMenuButton");
const backdrop = document.querySelector("#mobileCommandBackdrop");
if (!menu || !button) return;
const open = typeof force === "boolean" ? force : !menu.classList.contains("is-open");
menu.classList.toggle("is-open", open);
button.setAttribute("aria-expanded", String(open));
document.body.classList.toggle("mobile-command-open", open && isMobileViewport());
if (backdrop) backdrop.hidden = !(open && isMobileViewport());
if (open && isMobileViewport()) {
global.requestAnimationFrame(() => menu.querySelector("button:not([hidden])")?.focus({ preventScroll: true }));
} else if (force === false && document.activeElement && menu.contains(document.activeElement)) {
button.focus({ preventScroll: true });
}
}
function updateSidebarControl() {
const button = document.querySelector("#sidebarCollapseButton");
if (!button) return;
const automaticallyCollapsed = global.innerWidth <= 1023 && global.innerWidth > 720;
const automaticallyCollapsed = global.innerWidth <= 1023 && !isMobileViewport();
const collapsed = document.body.classList.contains("sidebar-collapsed") || automaticallyCollapsed;
button.setAttribute("aria-expanded", String(!collapsed));
button.setAttribute("aria-label", collapsed ? "展开侧栏" : "收起侧栏");
@@ -44,11 +61,19 @@
const navigationId = page?.navigation_alias || viewId;
const marketView = page?.group === "market";
document.body.dataset.activeView = viewId;
const mobileGroup = document.querySelector("#mobilePageGroup");
const mobileTitle = document.querySelector("#mobilePageTitle");
if (mobileGroup) {
mobileGroup.textContent = page?.group === "market"
? "行情"
: page?.group === "personal" ? "复盘" : "工具";
}
if (mobileTitle) mobileTitle.textContent = page?.title || "小白复盘";
document.querySelectorAll(".module-tab").forEach((button) => {
button.classList.toggle("active", button.dataset.view === navigationId);
button.classList.toggle(
"mobile-active",
global.innerWidth <= 720
isMobileViewport()
&& marketView
&& button.dataset.view === "limitPool"
&& viewId !== "limitPool",
@@ -127,6 +152,7 @@
collapsed = false;
}
document.body.classList.toggle("sidebar-collapsed", collapsed);
syncViewportMode();
updateSidebarControl();
syncNavigation(state.activeView);
document.querySelectorAll(".module-tab").forEach((button) => {
@@ -143,6 +169,16 @@
event.stopPropagation();
toggleHeaderCommandMenu();
});
document.querySelector("#mobileCommandBackdrop")?.addEventListener("click", () => {
toggleHeaderCommandMenu(false);
});
document.querySelectorAll("[data-mobile-command-target]").forEach((button) => {
button.addEventListener("click", () => {
const target = document.getElementById(button.dataset.mobileCommandTarget || "");
toggleHeaderCommandMenu(false);
target?.click();
});
});
document.querySelector("#headerCommandGroup")?.addEventListener("click", (event) => {
if (event.target.closest("button") && !event.target.closest(".account-menu-shell")) {
toggleHeaderCommandMenu(false);
@@ -170,7 +206,8 @@
if (event.key === "Escape") toggleHeaderCommandMenu(false);
});
global.addEventListener("resize", () => {
if (global.innerWidth > 720) toggleHeaderCommandMenu(false);
toggleHeaderCommandMenu(false);
syncViewportMode();
updateSidebarControl();
syncNavigation(state.activeView);
});
@@ -184,6 +221,7 @@
setPageStatus,
setStatus,
syncNavigation,
syncViewportMode,
toggleHeaderCommandMenu,
toggleSidebar,
updateSidebarControl,
+27 -5
View File
@@ -150,6 +150,7 @@
--space-24: 24px;
--sidebar-width: var(--size-sidebar);
--sidebar-compact-width: 64px;
--topbar-height: var(--size-topbar);
--summary-height: var(--size-summary);
--statusbar-height: var(--size-statusbar);
@@ -173,12 +174,25 @@
--sentiment-history-min-height: 220px;
--primary-share: 1.45fr;
--secondary-share: .75fr;
--mobile-nav-height: 58px;
--mobile-header-height: 50px;
--mobile-tab-height: 54px;
--mobile-shell-pad: 8px;
--mobile-page-pad: 10px;
--mobile-nav-height: 64px;
--mobile-header-height: 52px;
--mobile-tab-height: 56px;
--mobile-touch-size: 44px;
--mobile-date-width: 116px;
--mobile-nav-icon-size: 20px;
--mobile-chart-height: 240px;
--mobile-table-min-height: 260px;
--mobile-phase-badge-width: 88px;
--mobile-summary-card-width: 124px;
--mobile-shell-pad: var(--space-8);
--mobile-page-pad: var(--space-12);
--mobile-min-width: 320px;
--mobile-safe-bottom: env(safe-area-inset-bottom, 0px);
--mobile-content-bottom: calc(var(--mobile-nav-height) + var(--mobile-safe-bottom) + var(--mobile-page-pad));
--mobile-layer-header: 50;
--mobile-layer-nav: 70;
--mobile-layer-menu: 80;
--mobile-layer-backdrop: 75;
--font-aux: var(--font-size-aux);
--dragon-profile-list-width: 340px;
@@ -205,6 +219,14 @@
--dragon-profile-weight-strong: 750;
--dragon-profile-weight-semibold: 600;
--mentor-directory-width: 280px;
--mentor-profile-width: 272px;
--mentor-pane-header-height: 58px;
--mentor-avatar-size: 38px;
--mentor-profile-avatar-size: 68px;
--mentor-composer-min-height: 94px;
--mentor-message-max-width: 82%;
--chart-background: #fbfcfd;
--chart-grid: #e2e8ec;
--chart-axis: #6c7983;