.app-loading { min-height: 100vh; display: grid; place-items: center; color: var(--color-text-secondary); background: var(--color-canvas); } .loading-stack { display: grid; justify-items: center; gap: var(--s-12); } .app-shell { min-height: 100vh; padding-left: var(--shell-sidebar-width); padding-bottom: var(--shell-status-height); background: var(--color-canvas); } .sidebar { position: fixed; inset: 0 auto 0 0; z-index: var(--z-sidebar); width: var(--shell-sidebar-width); display: flex; flex-direction: column; border-right: var(--s-1) solid var(--color-border); background: var(--color-surface); } .brand { height: var(--shell-topbar-height); display: flex; align-items: center; gap: var(--s-8); padding: 0 var(--s-16); border-bottom: var(--s-1) solid var(--color-divider); } .brand-mark { width: var(--s-26); height: var(--s-26); display: grid; place-items: center; border-radius: var(--control-radius); color: var(--c-gray-050); background: var(--color-primary); font-size: var(--font-14); font-weight: var(--weight-700); } .brand-name { font-size: var(--font-15); font-weight: var(--weight-700); } .sidebar-nav { flex: 1; overflow-y: auto; padding: var(--s-8); } .nav-group-label { padding: var(--s-12) var(--s-10) var(--s-4); color: var(--color-text-faint); font-size: var(--font-11); } .nav-item { min-height: var(--s-32); display: flex; align-items: center; gap: var(--s-8); margin-bottom: var(--s-1); padding: var(--s-6) var(--s-10); border-radius: var(--control-radius); color: var(--color-text-secondary); font-size: var(--font-13); transition: color var(--duration-fast) var(--ease-standard), background var(--duration-fast) var(--ease-standard); } .nav-item:hover { color: var(--color-text); background: var(--color-surface-muted); } .nav-item.router-link-active { color: var(--color-primary); background: var(--color-primary-soft); font-weight: var(--weight-600); } .nav-mark { width: var(--s-20); color: var(--color-text-faint); font-size: var(--font-11); text-align: center; } .nav-item.router-link-active .nav-mark { color: var(--color-primary); } .shell-main { min-width: 0; } .topbar { position: sticky; top: 0; z-index: var(--z-topbar); height: var(--shell-topbar-height); display: flex; align-items: center; gap: var(--s-10); padding: 0 var(--s-16); border-bottom: var(--s-1) solid var(--color-border); background: var(--color-surface); } .topbar-title { min-width: 0; font-size: var(--font-14); font-weight: var(--weight-700); white-space: nowrap; } .topbar-spacer { flex: 1; } .date-control { display: inline-flex; align-items: center; gap: var(--s-4); } .date-input { height: var(--s-32); padding: var(--s-4) var(--s-8); border: var(--s-1) solid var(--color-border); border-radius: var(--control-radius); color: var(--color-text); background: var(--color-surface); font-size: var(--font-12); font-variant-numeric: tabular-nums; } .identity-cluster { display: inline-flex; align-items: center; gap: var(--s-6); } .account-menu-wrap { position: relative; } .account-trigger { max-width: var(--s-200); } .account-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .mobile-account-label { display: none; } .account-menu { position: absolute; top: calc(100% + var(--s-8)); right: 0; z-index: var(--z-popover); width: var(--s-200); padding: var(--s-6); border: var(--s-1) solid var(--color-border); border-radius: var(--control-radius); background: var(--color-surface-raised); box-shadow: var(--shadow-float); } .account-menu button { width: 100%; min-height: var(--s-32); padding: var(--s-6) var(--s-10); border-radius: var(--radius-5); color: var(--color-text-secondary); background: var(--c-transparent); text-align: left; } .account-menu button:hover { color: var(--color-text); background: var(--color-surface-muted); } .market-strip { border-bottom: var(--s-1) solid var(--color-border); background: var(--color-surface); } .market-strip-row { min-height: var(--shell-summary-height); display: flex; align-items: center; gap: var(--s-18); padding: var(--s-6) var(--s-16); color: var(--color-text-secondary); font-size: var(--font-12); } .market-emotion { display: inline-flex; align-items: center; gap: var(--s-6); color: var(--color-text-secondary); } .emotion-dot { width: var(--s-8); height: var(--s-8); border-radius: var(--radius-round); background: var(--color-text-faint); animation: emotion-pulse 2.2s var(--ease-standard) infinite; } @keyframes emotion-pulse { 50% { opacity: var(--opacity-muted); transform: scale(var(--scale-pulse)); } } .market-toggle { margin-left: auto; color: var(--color-primary); background: var(--c-transparent); font-size: var(--font-12); } .market-details { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); border-top: var(--s-1) solid var(--color-divider); background: var(--color-divider); gap: var(--s-1); } .market-cell { min-height: var(--s-64); padding: var(--s-10) var(--s-16); background: var(--color-surface); } .market-cell-label { color: var(--color-text-faint); font-size: var(--font-11); } .market-cell-value { min-height: var(--s-24); padding-top: var(--s-4); font-size: var(--font-18); font-weight: var(--weight-700); font-variant-numeric: tabular-nums; } .page-frame { width: min(100%, var(--s-content-max)); min-height: calc(100vh - var(--shell-topbar-height) - var(--shell-summary-height) - var(--shell-status-height)); margin: 0 auto; padding: var(--page-padding-y) var(--page-padding-x); } .page-header { display: flex; align-items: baseline; gap: var(--s-12); margin-bottom: var(--s-12); } .page-header h1 { font-size: var(--font-17); font-weight: var(--weight-800); } .page-subtitle { color: var(--color-text-faint); font-size: var(--font-12); } .statusbar { position: fixed; right: 0; bottom: 0; left: var(--shell-sidebar-width); z-index: var(--z-status); height: var(--shell-status-height); display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: var(--s-12); padding: 0 var(--s-16); border-top: var(--s-1) solid var(--color-border); color: var(--color-text-faint); background: var(--color-surface); font-size: var(--font-11); } .statusbar-center { color: var(--color-text-secondary); } .statusbar-right { text-align: right; } .mobile-nav { display: none; }