/* global React, Icon, Logo, ROOMS */ const { useState: useStateDash } = React; const Sidebar = ({ items, current, onNav, footer }) => ( ); const SidebarFooter = ({ name, sub, onNav }) => (
{name[0]}
{name} {sub}
); const DashTopBar = ({ title, subtitle, action }) => (

{title}

{subtitle &&

{subtitle}

}
{action}
); // ─── LISTER DASHBOARD ──────────────────────────────────────────── const PageListerDash = ({ onNav }) => { const [section, setSection] = useStateDash("overview"); const items = [ { label: "Workspace", items: [ { id: "overview", icon: "chart", label: "Overview" }, { id: "properties", icon: "home", label: "My properties", badge: 3 }, { id: "inquiries", icon: "inbox", label: "Inquiries", badge: 7 }, { id: "messages", icon: "msg", label: "Messages" }, { id: "calendar", icon: "calendar", label: "Calendar" }, { id: "payouts", icon: "cash", label: "Payouts" }, ]}, { label: "Account", items: [ { id: "verify", icon: "shield", label: "Verification" }, { id: "settings", icon: "settings", label: "Settings" }, ]}, ]; return (
{ if (id === "messages") onNav("messages"); else setSection(id); }} footer={} />
{section === "overview" && } {section === "properties" && } {section === "inquiries" && } {section === "calendar" && } {section === "payouts" && } {section === "verify" && } {section === "settings" && }
); }; const ListerOverview = ({ onNav, setSection }) => ( <> setSection("properties")}> Add a room} />
{/* Stats */}
{[ { l: "Active listings", v: "3", d: "100% occupancy", up: true }, { l: "Open inquiries", v: "07", d: "+2 this week", up: true }, { l: "Income · May", v: "$2,160", d: "on track for $2,160", up: true }, { l: "Guest rating", v: "4.9", d: "47 reviews", up: false }, ].map(s => (
{s.l} {s.v} {s.d}
))}
{/* Income chart */}
Last 6 months

Income

{/* Calendar preview */}

Upcoming move-ins / outs

Open calendar →
{[ { d: "MAY 04", t: "Move-in · Carla T.", r: "Sunny private room", k: "in" }, { d: "MAY 08", t: "Move-in · Reggie W.", r: "Quiet upstairs room", k: "in" }, { d: "MAY 22", t: "Lease ends · Yasmin H.", r: "Ground-floor accessible", k: "out" }, { d: "JUN 01", t: "Renewal due · Mike R.", r: "Studio with private bath", k: "renew" }, ].map((e, i) => (
{e.d}
{e.t} {e.r}
{e.k === "in" ? "Move-in" : e.k === "out" ? "Move-out" : "Renew"}
))}
{/* Recent inquiries */}

New inquiries

3 new
{[ { n: "Marisol Rivera", a: "Bay Area Outreach", room: "Sunny private room", t: "2h ago", b: "b3" }, { n: "Carla Tran", a: "Direct inquiry", room: "Quiet upstairs room", t: "yesterday", b: "b2" }, { n: "James W.", a: "VA placement", room: "Veteran preferred", t: "2d ago", b: "b4" }, ].map((q, i) => (
setSection("inquiries")}> {q.n[0]}
{q.n} {q.a} · {q.room}
{q.t}
))}
{/* Verification */}

Compliance

Cleared
{[ { l: "Identity verified", s: "ok" }, { l: "Background check", s: "ok" }, { l: "Property safety inspection", s: "ok" }, { l: "W-9 on file", s: "ok" }, { l: "Insurance certificate", s: "warn", d: "expires Jul 14" }, ].map((v, i) => (
{v.l}
{v.d || "—"}
))}
{/* Recent reviews */}

Recent reviews

4.9
{[ { n: "Carla T.", t: "Dana picked me up from the bus station — felt safe right away.", r: 5 }, { n: "Reggie W.", t: "Fair price, clean room, weekly check-ins. No issues at all.", r: 5 }, { n: "Mike R.", t: "First stable address in three years. Just renewed.", r: 5 }, ].map((r, i) => (
{r.n} {"★".repeat(r.r)}

"{r.t}"

))}
); const IncomeChart = () => { const months = ["Dec", "Jan", "Feb", "Mar", "Apr", "May"]; const data = [1450, 1700, 1700, 2080, 2160, 2160]; const max = 2400; return (
{data.map((v, i) => (
${(v / 1000).toFixed(1)}k
))}
{months.map(m => {m})}
); }; const ListerProperties = ({ onNav }) => ( <> } />
{ROOMS.slice(0, 3).map((r, i) => ( onNav("listing", { id: r.id })}> ))}
Room Property Status Rent Occupancy Inquiries Rating
{r.title} {r.type}
1247 Adeline · #{i + 1} Live ${r.price}/mo 100% until Oct {[3, 2, 2][i]} new ★ {r.rating}
{/* Add new room CTA */}
Quick add

Add a second room in 4 minutes.

Most hosts who add a second room earn 80% more without doubling their workload. We'll prefill what we can from your existing listing.

{["Address & photos", "Room facts (bed, bath, lock)", "Rent & length of stay", "Vouchers & program eligibility", "House rules & quiet hours"].map((s, i) => (
0{i + 1} {s}
))}
); const ListerInquiries = ({ onNav }) => { const [selected, setSelected] = useStateDash(0); const inquiries = [ { n: "Marisol Rivera", a: "Bay Area Outreach", room: "Sunny private room", t: "2h ago", b: "b3", st: "new", program: "HUD-VASH", move: "May 8", note: "Placing a 38-year-old veteran with stable employment. He's been in transitional housing for 90 days and is ready for a longer-term spot. References from VA case manager available." }, { n: "Carla Tran", a: "Direct inquiry", room: "Quiet upstairs room", t: "yesterday", b: "b2", st: "review", program: "Section 8", move: "May 15", note: "Hi! I work part-time as a dental assistant and am looking for a quiet place. Non-smoker, no pets. Happy to provide references from my last two landlords." }, { n: "James Whitaker", a: "VA placement", room: "Veteran preferred", t: "2d ago", b: "b4", st: "review", program: "HUD-VASH", move: "Jun 1", note: "Vietnam-era veteran. Needs ground-floor or elevator access. Service dog accompanies." }, { n: "Yasmin Hadid", a: "Roots Recovery", room: "Sunny private room", t: "3d ago", b: "b5", st: "approved", program: "EHV", move: "May 22" }, { n: "Reggie Williams", a: "Direct inquiry", room: "Quiet upstairs room", t: "5d ago", b: "b1", st: "approved", program: "EHV", move: "May 8" }, { n: "Tasha Brooks", a: "Bay Area Outreach", room: "Quiet upstairs room", t: "1wk ago", b: "b3", st: "declined", program: "Section 8", move: "—" }, { n: "Marcus Drew", a: "Direct inquiry", room: "Sunny private room", t: "1wk ago", b: "b4", st: "declined", program: "—", move: "—" }, ]; const cur = inquiries[selected]; return ( <> Export CSV} />
{inquiries.map((q, i) => (
setSelected(i)} style={{ padding: 16, borderBottom: "1px solid var(--line-1)", cursor: "pointer", background: selected === i ? "var(--bg-2)" : "transparent", borderLeft: selected === i ? "2px solid var(--accent)" : "2px solid transparent", }}>
{q.n[0]}
{q.n} {q.t}
{q.a}
{q.room.split(" ").slice(0, 2).join(" ")} {q.st}
))}
{cur.n[0]}

{cur.n}

{cur.a} · inquired {cur.t}

{cur.program} Move-in {cur.move} ID verified

About this room request

{cur.note || "No additional notes provided."}

Application details

{[ ["Requested room", cur.room], ["Move-in date", cur.move], ["Length of stay", "6 months"], ["Paying with", cur.program], ["Background check", "Cleared (Persona)"], ["Income verified", "Through agency"], ].map(([k, v]) => (
{k} {v}
))}

Documents

{["Voucher authorization · HUD-VASH", "Photo ID · Verified", "Income letter · Bay Area Outreach"].map((d, i) => (
{d}
))}
Case worker
M
Marisol Rivera Housing Navigator

Phone(510) 555 · 0142
Avg. response2h
Placements YTD38

Suggested response

"Hi Marisol — happy to move forward. I have tour slots Wed 5/6 at 2pm or Thu 5/7 at 4pm. Either work?"

); }; const ListerCalendar = () => { const days = Array.from({ length: 35 }, (_, i) => i - 3); const events = { 4: "in", 8: "in", 14: "tour", 22: "out", 28: "tour" }; return ( <> Block dates} />

May 2026

{["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"].map(d => (
{d}
))} {days.map((d, i) => { const valid = d >= 1 && d <= 31; const ev = events[d]; return (
{valid ? d : ""} {ev === "in" &&
Move-in
} {ev === "out" &&
Move-out
} {ev === "tour" &&
Tour 2pm
}
); })}
); }; const ListerPayouts = () => ( <> Download statement} />
{[ { l: "Available", v: "$2,160.00", d: "Lands May 4" }, { l: "Pending", v: "$0.00", d: "—" }, { l: "YTD income", v: "$10,580", d: "+24% YoY" }, ].map(s => (
{s.l} {s.v} {s.d}
))}
{[ ["May 04", "Sunny private room", "Carla T.", "May 2026", "HUD-VASH", "$685.00"], ["Apr 04", "Sunny private room", "Carla T.", "Apr 2026", "HUD-VASH", "$685.00"], ["Apr 04", "Quiet upstairs room", "Reggie W.", "Apr 2026", "EHV", "$540.00"], ["Apr 04", "Studio with bath", "Mike R.", "Apr 2026", "Section 8", "$935.00"], ["Mar 04", "Sunny private room", "Carla T.", "Mar 2026", "HUD-VASH", "$685.00"], ].map((row, i) => ( {row.map((c, j) => )} ))}
DateRoomGuestPeriodSourceAmount
{c}
); const ListerVerify = () => ( <>

Verified Host

5 of 5 checks complete · last refreshed Apr 12

All clear
{[ { l: "Identity", d: "Verified through Persona on Mar 02", st: "ok" }, { l: "Background check", d: "Clean record · refreshed annually", st: "ok" }, { l: "Property safety inspection", d: "Smoke alarms, locks, egress · last Mar 09", st: "ok" }, { l: "W-9 tax form", d: "On file since Feb 2024", st: "ok" }, { l: "Property insurance", d: "Expires Jul 14 — please re-upload", st: "warn" }, ].map((v, i) => (
{v.l}
{v.d}
))}
); const ListerSettings = () => ( <>

Profile

D