fix(sf-13): MarketTab above-the-fold headline + 3 KPI cards #294
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
вторичка
ИРД
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#294
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/sf-13-above-fold-kpi"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
SF FixList #13 (Wave 2) — Market tab без headline-bar и KPI row выше fold (нарушение
code/patterns/UI_Brief_GenDesign_May17).Изменения
frontend/src/components/site-finder/MarketTab.tsx:var(--bg-headline, #0F172A)/var(--fg-on-dark, #E2E8F0):grid grid-cols-3 gap-3 mb-4:data.competitors.lengthdata.velocity.monthly_velocity_sqmв м²/месpipeline_24mo.flats_total / (velocity / 50)(proxy через 50 м² avg)activeCount > 0 || velocityPerMonth !== null(нет ghost при absence)Helpers:
getRadiusKm,getMaxMixPct,getSalesPeriodMonths— derive из existingParcelAnalysisfields.Vault:
fixes/Fix_SF_AboveTheFold_KPI_May17.md.Test plan
66:41:0702048:27→ Market tab → headline-bar выше foldNote:
site_status='Строящиеся'filter будет точным после deploy PR #289+#290 (Wave 2/3). Сейчас competitors.length proxy.Related: epic #271 item #13 · Wave 2
Merged via deep-code-reviewer — verdict APPROVE.
Cross-file impact verified:
Velocity.monthly_velocity_sqm: number(non-optional) —site-finder.ts:236. Optional chaindata.velocity?.monthly_velocity_sqm ?? nullкорректен (velocity сам Optional на ParcelAnalysis).Pipeline24mo.flats_total: number+radius_km?: number— derive logic OK.MarketTrend.radius_km: number(non-optional) —getRadiusKmfallback chainmarket_trend → pipeline_24mo → 3корректен.SuccessRankingBucket.success_score: number(0..1) →Math.max * 100→ корректно для headline (description упоминалаmix[*].pct— на самом деле используется ranking success_score, в коде правильно).Correctness:
if (!supply || !velocitySqm || velocitySqm <= 0) return null— корректно.showHeadlineBar = activeCount > 0 || velocityPerMonth !== null— no ghost UI.ParcelAnalysis(не undefined) — caller гарантирует через Props.Style nits (не блокирующие, для следующей итерации):
#fff,#e6e8ec,#111,#5b6066,#73767e) — по.claude/rules/ui-ux.mdэто должны быть токены (var(--bg-card),var(--border-card),var(--fg-primary),var(--fg-secondary),var(--fg-tertiary)). Только headline-bar используетvar(--bg-headline, ...)правильно.<KpiCard>(components/analytics/KpiCard.tsx) — дублирование стилей. Refactor → KpiCard reuse в отдельном PR (его API нужно расширить для unit/hint, что не входит в scope этого hotfix).<div>, не<h2>/ role="status") — небольшая a11y потеря. KPI label uppercase + letter-spacing 0.04em — соответствует ui-ux rules.pipeline_24mo.flats_total / (velocity / 50)— 50 м² avg proxy документирован JSDoc, acceptable до появления real avg_unit_area из backend.Anti-regression: main content (Competitors, BestLayouts, Velocity, MarketTrend, Pipeline24mo, SuccessRecommendation) preserved below new above-fold block. PR #272 порядок секций сохранён.
Recommended follow-up issue: refactor KPI inline styles → tokens + reuse
<KpiCard>(SF FixList: low priority, UX consistency).