Stabilize homepage focus card
This commit is contained in:
@@ -679,31 +679,50 @@
|
|||||||
|
|
||||||
.root :global(.home-risk-badge) {
|
.root :global(.home-risk-badge) {
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 6px;
|
||||||
|
min-height: 28px;
|
||||||
border-radius: 999px;
|
border-radius: 999px;
|
||||||
padding: 7px 10px;
|
padding: 5px 10px 5px 8px;
|
||||||
border: 1px solid rgba(148, 163, 184, 0.18);
|
border: 1px solid rgba(148, 163, 184, 0.14);
|
||||||
background: rgba(15, 23, 42, 0.58);
|
background: rgba(8, 15, 30, 0.52);
|
||||||
color: var(--text-secondary);
|
box-shadow:
|
||||||
font-size: 11px;
|
inset 0 1px 0 rgba(255, 255, 255, 0.05),
|
||||||
|
0 8px 18px rgba(2, 6, 23, 0.14);
|
||||||
|
color: rgba(226, 232, 240, 0.9);
|
||||||
|
font-size: 10px;
|
||||||
font-weight: 800;
|
font-weight: 800;
|
||||||
|
letter-spacing: 0.04em;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.root :global(.home-risk-badge::before) {
|
||||||
|
content: "";
|
||||||
|
width: 7px;
|
||||||
|
height: 7px;
|
||||||
|
border-radius: 999px;
|
||||||
|
background: currentColor;
|
||||||
|
opacity: 0.92;
|
||||||
|
box-shadow: 0 0 12px color-mix(in srgb, currentColor 28%, transparent);
|
||||||
}
|
}
|
||||||
|
|
||||||
.root :global(.home-risk-badge.high) {
|
.root :global(.home-risk-badge.high) {
|
||||||
border-color: rgba(248, 113, 113, 0.32);
|
border-color: rgba(248, 113, 113, 0.22);
|
||||||
color: #fecaca;
|
color: #fca5a5;
|
||||||
background: rgba(127, 29, 29, 0.22);
|
background: rgba(69, 10, 10, 0.34);
|
||||||
}
|
}
|
||||||
|
|
||||||
.root :global(.home-risk-badge.medium) {
|
.root :global(.home-risk-badge.medium) {
|
||||||
border-color: rgba(251, 191, 36, 0.32);
|
border-color: rgba(251, 191, 36, 0.2);
|
||||||
color: #fde68a;
|
color: #fbbf24;
|
||||||
background: rgba(120, 53, 15, 0.22);
|
background: rgba(67, 36, 6, 0.34);
|
||||||
}
|
}
|
||||||
|
|
||||||
.root :global(.home-risk-badge.low) {
|
.root :global(.home-risk-badge.low) {
|
||||||
border-color: rgba(52, 211, 153, 0.3);
|
border-color: rgba(52, 211, 153, 0.22);
|
||||||
color: #bbf7d0;
|
color: #34d399;
|
||||||
background: rgba(20, 83, 45, 0.18);
|
background: rgba(7, 47, 35, 0.34);
|
||||||
}
|
}
|
||||||
|
|
||||||
.root :global(.home-panel-subtitle) {
|
.root :global(.home-panel-subtitle) {
|
||||||
|
|||||||
@@ -852,7 +852,6 @@ function DashboardScreen() {
|
|||||||
const store = useDashboardStore();
|
const store = useDashboardStore();
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
const didAutoFocusRef = useRef(false);
|
const didAutoFocusRef = useRef(false);
|
||||||
const autoFocusedCityRef = useRef<string | null>(null);
|
|
||||||
const preloadedOpportunityRef = useRef<Set<string>>(new Set());
|
const preloadedOpportunityRef = useRef<Set<string>>(new Set());
|
||||||
const activeSummary = store.selectedCity
|
const activeSummary = store.selectedCity
|
||||||
? store.citySummariesByName[store.selectedCity] || null
|
? store.citySummariesByName[store.selectedCity] || null
|
||||||
@@ -923,28 +922,9 @@ function DashboardScreen() {
|
|||||||
if (!topOpportunity) return;
|
if (!topOpportunity) return;
|
||||||
|
|
||||||
didAutoFocusRef.current = true;
|
didAutoFocusRef.current = true;
|
||||||
autoFocusedCityRef.current = topOpportunity;
|
|
||||||
void store.focusCity(topOpportunity);
|
void store.focusCity(topOpportunity);
|
||||||
}, [homepageSnapshots, showHomepageChrome, store]);
|
}, [homepageSnapshots, showHomepageChrome, store]);
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (!showHomepageChrome) return;
|
|
||||||
if (!store.selectedCity) return;
|
|
||||||
if (store.selectedCity !== autoFocusedCityRef.current) return;
|
|
||||||
|
|
||||||
const topOpportunity = homepageSnapshots[0];
|
|
||||||
if (!topOpportunity || topOpportunity.city.name === store.selectedCity) return;
|
|
||||||
|
|
||||||
const selectedSnapshot = homepageSnapshots.find(
|
|
||||||
(snapshot) => snapshot.city.name === store.selectedCity,
|
|
||||||
);
|
|
||||||
if (!selectedSnapshot?.detail?.market_scan) return;
|
|
||||||
if (selectedSnapshot.tradableOpportunity) return;
|
|
||||||
|
|
||||||
autoFocusedCityRef.current = topOpportunity.city.name;
|
|
||||||
void store.focusCity(topOpportunity.city.name);
|
|
||||||
}, [homepageSnapshots, showHomepageChrome, store]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!showHomepageChrome) return;
|
if (!showHomepageChrome) return;
|
||||||
const targets = homepageSnapshots.slice(0, 4).map((snapshot) => snapshot.city.name);
|
const targets = homepageSnapshots.slice(0, 4).map((snapshot) => snapshot.city.name);
|
||||||
|
|||||||
Reference in New Issue
Block a user