diff --git a/frontend/components/dashboard/Dashboard.module.css b/frontend/components/dashboard/Dashboard.module.css index e3558c5f..757c3ef8 100644 --- a/frontend/components/dashboard/Dashboard.module.css +++ b/frontend/components/dashboard/Dashboard.module.css @@ -774,8 +774,39 @@ .root :global(.panel-body) { overflow-y: auto; flex: 1; + position: relative; padding: 0 20px 24px; } + +.root :global(.panel-sync-blocker) { + position: sticky; + top: 0; + z-index: 6; + display: flex; + align-items: center; + gap: 10px; + margin: 0 0 12px; + padding: 12px 14px; + border: 1px solid rgba(34, 211, 238, 0.22); + border-radius: 8px; + background: rgba(8, 16, 30, 0.96); + color: var(--text-primary); + box-shadow: 0 14px 34px rgba(2, 6, 23, 0.38); + backdrop-filter: blur(18px); + font-size: 12px; + font-weight: 650; + line-height: 1.45; +} + +.root :global(.panel-content-stale) { + opacity: 0.28; + pointer-events: none; + user-select: none; +} + +.root :global(.panel-content-stale canvas) { + visibility: hidden; +} .root :global(.panel-body::-webkit-scrollbar) { width: 4px; } diff --git a/frontend/components/dashboard/DetailPanel.tsx b/frontend/components/dashboard/DetailPanel.tsx index 8a7acd93..25a2269a 100644 --- a/frontend/components/dashboard/DetailPanel.tsx +++ b/frontend/components/dashboard/DetailPanel.tsx @@ -196,6 +196,7 @@ export function DetailPanel() { (detail.forecast?.daily?.length ?? 0) <= 1), ); const isPanelSyncing = store.loadingState.cityDetail; + const isShowingCachedDetailDuringSync = Boolean(detail && isPanelSyncing); const blurActiveElement = () => { if (typeof document === "undefined") return; @@ -384,7 +385,18 @@ export function DetailPanel() { -