// Hotel Walks — Property User Dashboard ("Today").
// The operator's daily view: outbound walks in progress, urgent items, queue health.
(function() {
const { Caps, Btn, Pill, SerifI, Hr, money } = window.UI;
const { SmartKey } = window.HW;
const STATUS_LABELS = {
broadcasting: { label: "Broadcasting", tone: "warn" },
accepted: { label: "Accepted", tone: "good" },
letter_sent: { label: "Letter sent", tone: "filled" },
declined: { label: "Declined", tone: "muted" },
};
function PageHead() {
const { ME } = window.HW_DATA;
const today = new Date().toLocaleDateString(undefined, { weekday: "long", month: "long", day: "numeric" });
return (
{today}
Today at {ME.property.name}.
Walked 3 · 1 inbound · all timers green
);
}
function StatStrip() {
const stats = [
{ label: "Walks open now", value: "3", sub: "2 broadcasting · 1 awaiting letter" },
{ label: "Next escalation", value: "12m", sub: "Ifeoma Okonkwo · broadcasting to 3" },
];
return (
{stats.map((s, i) => (
{s.label}
{s.value}
{s.sub}
))}
);
}
function SentTable() {
const { SENT, HOTEL_BY_ID } = window.HW_DATA;
return (
{/* Header row */}
{["Sent", "Guest", "Re-housed at", "Rate", "Status", "Timer", ""].map((h, i) => (
{h}
))}
{SENT.map(w => {
const s = STATUS_LABELS[w.status];
return (
{w.sentAt}
{w.guest.name}
{w.guest.confirmation} · {w.guest.party} guest{w.guest.party>1?"s":""} · {w.guest.nights}n
{w.to ? (
<>
{w.to.name}
{w.to.area}
>
) : (
— pending —
Broadcasting to {w.broadcastTo.length} partners
)}
{w.rate ? money(w.rate) : —}
{w.status === "broadcasting" && (
{w.timer}m
)}
{w.status === "accepted" &&
—}
{w.status === "letter_sent" &&
—}
{w.status === "accepted" && (
Letter →
)}
{w.status === "letter_sent" && (
View
)}
{w.status === "broadcasting" && (
alert("Cancelled (demo)")}>Cancel
)}
);
})}
);
}
function CountdownDot({ mins }) {
const tone = mins <= 5 ? "var(--warn)" : mins <= 15 ? "#c89048" : "var(--good)";
return ;
}
function InboundPanel() {
const { INCOMING } = window.HW_DATA;
return (
Inbound · awaiting your decision
You have {INCOMING.length} opportunities.
See all →
);
}
const responsiveCSS = `
@media (max-width: 900px) {
.walks-grid { grid-template-columns: 1fr !important; gap: 8px; padding: 18px 0 !important; }
.walks-grid > *:empty { display: none; }
}
@media (max-width: 720px) {
.stat-strip { grid-template-columns: 1fr !important; padding: 0 20px !important; }
.stat-strip > div { border-right: none !important; border-bottom: 1px solid var(--rule); padding: 20px 0 22px !important; }
.stat-strip > div:last-child { border-bottom: none; }
.stat-strip > div .serif-i { font-size: 36px !important; }
.page-head { grid-template-columns: 1fr !important; }
.page-head .serif-i { font-size: 38px !important; }
.page-head .head-ctas { flex-direction: row !important; flex-wrap: wrap; }
.page-head .head-ctas a { flex: 1; }
.page-head .head-ctas a > * { width: 100%; }
.inbound-grid { grid-template-columns: 1fr !important; }
}
`;
function Dashboard() {
return (
);
}
window.Screens = window.Screens || {};
window.Screens.Dashboard = Dashboard;
})();