feat(THI-47): modernize dashboard - #23
Merged
tdody merged 1 commit intoApr 19, 2026
Merged
Conversation
Rebuild the dashboard around the THI-45/46 design system.
Editorial hero
- Caps label + serif 44px headline ("N properties tracked" or "Start
tracking a property") replacing the bold-slate title
- 4-cell MetricStrip (Portfolio / Avg Cashflow [large serif emphasis] /
Best CoC / Total Invested) replacing the 4 shadowed white cards
Toolbar
- Search input (filters name / city / state) styled with .field
- Segmented portfolio filter (All / In portfolio / Not in) replacing the
3-button pill row
- Bottom-rule select for sort order
- Segmented view-mode toggle (Cards / Rows) — new
- Compare button (conditional, >=2 selected), Quick Test, + New Property
buttons with token-based styling (ink / canvas / paper)
Cards view (PropertyCard.tsx rewrite)
- PropertyThumb fallback (per property_type → multi-unit / duplex / cape /
default hue) when image_url is null, plus img tag when present
- RentalBadge primitive replaces the pastel sky/violet chip
- Selection checkbox top-left, rental badge top-right both overlayed on
the thumbnail with bg-canvas/90
- In-portfolio highlight: border-accent (vs border-rule-strong default,
border-ink when selected)
- Token-based Cashflow / CoC mini-metrics; star / View / Delete action row
Rows view (new)
- Full data table: checkbox | 56x40 thumbnail | serif name + city / state |
price | beds·ba·sqft | cashflow | CoC | rental badge | portfolio star |
View / Delete
- Row hover + selection background via bg-paper
- Note: the ticket mentions inline OccupancyGauge per row; PropertySummary
doesn't yet carry an occupancy field, so rows show cashflow tone instead.
Adding occupancy requires a backend schema change — deferred to a
follow-up.
Add Property form
- Restyled with Field (URL + Name) + CurrencyInput (Listing Price)
- Divider with caps "Or enter manually" label
- Fetch / Create buttons use bg-ink text-canvas
- Close × in the header; Cancel handled by the outer dashboard state
Empty / no-match states
- New EmptyState helper with dashed 2px border-rule-strong, serif 22px
title, and optional action slot
All indigo / violet / sky / slate / emerald / red / amber classes replaced
with token utilities. No data / API changes — listProperties,
createProperty, deleteProperty, scrapeProperty, updateProperty,
compareProperties flows unchanged.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Rebuilds the Dashboard (the app's entry point) around the THI-45/46 design system. No data or API changes.
Editorial hero
<MetricStrip>(Portfolio / Avg Cashflow with large serif emphasis / Best CoC / Total Invested) replacing the 4 shadowed white cardsToolbar
.field<Segmented>(All / In portfolio / Not in) replacing the 3-button pill row<Segmented>Cards / Rows — newbg-ink text-canvas/ outlinedCards view (PropertyCard rewrite)
<PropertyThumb>fallback perproperty_type(multi_family → multi-unit, townhouse → duplex, condo → cape, else default) whenimage_urlis null; falls back to the hatched placeholder. Image tag when present.<RentalBadge>primitive replaces the sky / violet pastel chipbg-canvas/90border-accent(selection =border-ink, default =border-rule-strong)Rows view (new)
Full data table:
checkbox | 56×40 thumbnail | serif name + city/state | price | beds·ba·sqft | cashflow | CoC | rental badge | portfolio star | View / DeleteRow hover + selection highlighted via
bg-paper.Add Property form
Restyled around the primitives:
<Field>for Redfin URL + Property Name<CurrencyInput>for Listing Price.capsdivider ("Or enter manually")bg-ink text-canvas; close × in the headerEmpty / no-match states
New
EmptyStatehelper with dashed 2pxborder-rule-strong+ serif 22px title + optional actions slot.Scope note
The ticket mentions inline OccupancyGauge per row.
PropertySummarydoesn't yet carry anoccupancy_pctfield — surfacing that requires a backend schema change. Deferred; rows use the cashflow tone as the status cue for now.Test plan
npm run lint— cleannpm run build— passes, CSS 51.25 kB (-0.8 kB), JS 453.83 kB (-1.1 kB), 118 modules/compare?ids=…/property/:id🤖 Generated with Claude Code