Files
imperial-command-center/preview-modern.html

1396 lines
37 KiB
HTML
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Home Command Center - Modern Preview</title>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
:root {
--bg-primary: #0f0f0f;
--bg-secondary: #171717;
--bg-tertiary: #1f1f1f;
--bg-elevated: #262626;
--bg-hover: #2a2a2a;
--border: #2e2e2e;
--border-light: #3a3a3a;
--text-primary: #fafafa;
--text-secondary: #a1a1a1;
--text-muted: #737373;
--accent: #3b82f6;
--accent-light: #60a5fa;
--accent-glow: rgba(59, 130, 246, 0.15);
--success: #22c55e;
--warning: #f59e0b;
--error: #ef4444;
--purple: #a855f7;
--pink: #ec4899;
--radius: 12px;
--radius-lg: 16px;
--radius-sm: 8px;
}
body {
font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
background-color: var(--bg-primary);
color: var(--text-primary);
overflow: hidden;
height: 100vh;
-webkit-font-smoothing: antialiased;
}
/* Header */
.header {
height: 72px;
background: var(--bg-secondary);
border-bottom: 1px solid var(--border);
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 32px;
}
.header-left {
display: flex;
align-items: center;
gap: 16px;
}
.logo {
width: 42px;
height: 42px;
background: linear-gradient(135deg, var(--accent) 0%, #8b5cf6 100%);
border-radius: var(--radius);
display: flex;
align-items: center;
justify-content: center;
}
.header-title {
font-size: 1.25rem;
font-weight: 600;
letter-spacing: -0.02em;
}
.header-center {
text-align: center;
}
.time {
font-size: 2rem;
font-weight: 600;
letter-spacing: -0.02em;
}
.date {
font-size: 0.875rem;
color: var(--text-secondary);
margin-top: 2px;
}
.header-right {
display: flex;
align-items: center;
gap: 12px;
}
/* Status Icons Row */
.status-icons {
display: flex;
align-items: center;
gap: 8px;
padding: 6px 12px;
background: var(--bg-tertiary);
border-radius: 20px;
}
.status-icon {
width: 32px;
height: 32px;
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
position: relative;
cursor: pointer;
transition: all 0.15s ease;
}
.status-icon:hover {
transform: scale(1.1);
}
.status-icon svg {
width: 18px;
height: 18px;
}
.status-icon.package {
background: rgba(245, 158, 11, 0.2);
color: var(--warning);
}
.status-icon.package::after {
content: '';
position: absolute;
top: -2px;
right: -2px;
width: 10px;
height: 10px;
background: var(--warning);
border-radius: 50%;
border: 2px solid var(--bg-tertiary);
animation: pulse 2s infinite;
}
.person-status {
display: flex;
flex-direction: column;
align-items: center;
gap: 2px;
}
.person-avatar {
width: 32px;
height: 32px;
border-radius: 50%;
overflow: hidden;
border: 2px solid var(--border);
transition: border-color 0.15s ease;
}
.person-avatar.home {
border-color: var(--success);
box-shadow: 0 0 8px rgba(34, 197, 94, 0.3);
}
.person-avatar.away {
border-color: var(--text-muted);
opacity: 0.7;
}
.person-avatar.work {
border-color: var(--accent);
box-shadow: 0 0 8px rgba(59, 130, 246, 0.3);
}
.person-avatar img {
width: 100%;
height: 100%;
object-fit: cover;
}
.person-location {
font-size: 0.55rem;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.02em;
color: var(--text-muted);
}
.person-location.home {
color: var(--success);
}
.person-location.work {
color: var(--accent);
}
@keyframes pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.5; }
}
.status-badge {
display: flex;
align-items: center;
gap: 8px;
padding: 8px 14px;
background: var(--bg-tertiary);
border-radius: 20px;
font-size: 0.875rem;
color: var(--text-secondary);
}
.status-dot {
width: 8px;
height: 8px;
background: var(--success);
border-radius: 50%;
box-shadow: 0 0 8px var(--success);
}
.btn {
display: flex;
align-items: center;
gap: 8px;
padding: 10px 18px;
background: var(--bg-tertiary);
border: 1px solid var(--border);
border-radius: var(--radius);
color: var(--text-primary);
font-family: inherit;
font-size: 0.875rem;
font-weight: 500;
cursor: pointer;
transition: all 0.2s ease;
}
.btn:hover {
background: var(--bg-hover);
border-color: var(--border-light);
}
/* Main Content */
.main {
height: calc(100vh - 72px);
padding: 20px;
display: grid;
grid-template-columns: repeat(12, 1fr);
gap: 16px;
}
/* Widget Base */
.widget {
background: var(--bg-secondary);
border: 1px solid var(--border);
border-radius: var(--radius-lg);
padding: 16px;
display: flex;
flex-direction: column;
overflow: hidden;
}
.widget-title {
font-size: 0.75rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--text-secondary);
margin-bottom: 12px;
display: flex;
align-items: center;
gap: 8px;
}
.widget-title svg {
width: 16px;
height: 16px;
opacity: 0.7;
}
.widget-content {
flex: 1;
overflow: hidden;
}
/* Calendar Column */
.calendar-col {
grid-column: span 4;
}
.calendar-nav {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 12px;
}
.calendar-month {
font-size: 1rem;
font-weight: 600;
}
.calendar-nav-btns {
display: flex;
gap: 4px;
}
.calendar-nav-btn {
width: 28px;
height: 28px;
display: flex;
align-items: center;
justify-content: center;
background: var(--bg-tertiary);
border: none;
border-radius: 6px;
color: var(--text-secondary);
cursor: pointer;
transition: all 0.15s ease;
font-size: 0.75rem;
}
.calendar-nav-btn:hover {
background: var(--bg-hover);
color: var(--text-primary);
}
.calendar-grid {
display: grid;
grid-template-columns: repeat(7, 1fr);
gap: 3px;
}
.calendar-day-header {
text-align: center;
font-size: 0.65rem;
font-weight: 500;
color: var(--text-muted);
padding: 6px 0;
}
.calendar-day {
aspect-ratio: 1;
background: var(--bg-tertiary);
border-radius: 6px;
padding: 4px;
font-size: 0.7rem;
cursor: pointer;
transition: all 0.15s ease;
min-height: 52px;
}
.calendar-day:hover {
background: var(--bg-hover);
}
.calendar-day.today {
background: var(--accent-glow);
border: 1px solid var(--accent);
}
.calendar-day.today .day-num {
color: var(--accent-light);
font-weight: 600;
}
.calendar-day.other-month {
opacity: 0.3;
}
.day-num {
font-weight: 500;
margin-bottom: 2px;
}
.calendar-event {
font-size: 0.55rem;
background: var(--accent-glow);
color: var(--accent-light);
padding: 2px 4px;
border-radius: 3px;
margin-top: 2px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.day-details {
margin-top: 12px;
padding: 12px;
background: var(--bg-tertiary);
border-radius: var(--radius-sm);
}
.day-details-title {
font-size: 0.8rem;
font-weight: 600;
margin-bottom: 8px;
color: var(--text-primary);
}
.day-event {
display: flex;
gap: 10px;
font-size: 0.8rem;
padding: 6px 0;
}
.day-event-time {
color: var(--accent-light);
font-weight: 500;
min-width: 65px;
}
/* Middle Column */
.middle-col {
grid-column: span 4;
display: flex;
flex-direction: column;
gap: 16px;
}
.thermostat-row {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 16px;
}
.thermostat {
text-align: center;
padding: 4px 0;
}
.temp-label {
font-size: 0.65rem;
color: var(--text-muted);
text-transform: uppercase;
letter-spacing: 0.05em;
margin-bottom: 4px;
}
.temp-current {
font-size: 3rem;
font-weight: 300;
letter-spacing: -0.02em;
line-height: 1;
}
.temp-current.heating {
color: #fb923c;
}
.temp-current.cooling {
color: #38bdf8;
}
.temp-current.idle {
color: var(--text-secondary);
}
.temp-unit {
font-size: 1.25rem;
color: var(--text-muted);
font-weight: 400;
}
.temp-status {
font-size: 0.7rem;
color: var(--text-secondary);
margin: 6px 0 14px;
}
.temp-controls {
display: flex;
align-items: center;
justify-content: center;
gap: 12px;
}
.temp-btn {
width: 32px;
height: 32px;
background: var(--bg-tertiary);
border: 1px solid var(--border);
border-radius: 50%;
color: var(--text-primary);
font-size: 1rem;
cursor: pointer;
transition: all 0.15s ease;
display: flex;
align-items: center;
justify-content: center;
}
.temp-btn:hover {
background: var(--bg-hover);
border-color: var(--border-light);
}
.temp-btn.heat {
border-color: #fb923c;
color: #fb923c;
}
.temp-btn.heat:hover {
background: rgba(251, 146, 60, 0.15);
}
.temp-btn.cool {
border-color: #38bdf8;
color: #38bdf8;
}
.temp-btn.cool:hover {
background: rgba(56, 189, 248, 0.15);
}
.temp-range {
display: flex;
align-items: center;
gap: 8px;
}
.temp-setpoint {
text-align: center;
padding: 6px 10px;
background: var(--bg-tertiary);
border-radius: 8px;
}
.temp-setpoint-label {
font-size: 0.5rem;
color: var(--text-muted);
text-transform: uppercase;
letter-spacing: 0.03em;
margin-bottom: 2px;
}
.temp-setpoint-value {
font-size: 1.1rem;
font-weight: 600;
}
.temp-setpoint-value.heat {
color: #fb923c;
}
.temp-setpoint-value.cool {
color: #38bdf8;
}
.temp-range-divider {
color: var(--text-muted);
font-size: 0.8rem;
}
.temp-mode {
display: inline-flex;
align-items: center;
gap: 4px;
font-size: 0.65rem;
padding: 3px 8px;
background: var(--bg-tertiary);
border-radius: 4px;
color: var(--text-secondary);
margin-top: 8px;
}
.temp-mode svg {
width: 12px;
height: 12px;
}
.temp-mode.heat-cool {
background: linear-gradient(90deg, rgba(251, 146, 60, 0.2) 0%, rgba(56, 189, 248, 0.2) 100%);
}
/* Alarm */
.alarm-content {
display: flex;
flex-direction: column;
align-items: center;
padding: 12px 0;
}
.alarm-ring {
width: 80px;
height: 80px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 12px;
}
.alarm-ring.disarmed {
background: linear-gradient(135deg, rgba(34, 197, 94, 0.2) 0%, rgba(34, 197, 94, 0.05) 100%);
border: 2px solid var(--success);
}
.alarm-ring.disarmed svg {
color: var(--success);
}
.alarm-state {
font-size: 1.1rem;
font-weight: 600;
margin-bottom: 16px;
}
.alarm-modes {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
width: 100%;
}
.alarm-mode-btn {
display: flex;
flex-direction: column;
align-items: center;
gap: 6px;
padding: 14px 12px;
background: var(--bg-tertiary);
border: 1px solid var(--border);
border-radius: var(--radius-sm);
color: var(--text-primary);
cursor: pointer;
transition: all 0.15s ease;
}
.alarm-mode-btn:hover {
background: var(--bg-hover);
border-color: var(--accent);
}
.alarm-mode-btn svg {
width: 22px;
height: 22px;
color: var(--text-secondary);
}
.alarm-mode-btn span {
font-size: 0.7rem;
font-weight: 500;
}
/* Right Column */
.right-col {
grid-column: span 4;
display: flex;
flex-direction: column;
gap: 16px;
}
/* Lights - Compact */
.lights-widget {
flex: 1;
}
.lights-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 10px;
}
.room-section {
margin-bottom: 12px;
}
.room-section:last-child {
margin-bottom: 0;
}
.room-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 6px;
}
.room-name {
font-size: 0.7rem;
font-weight: 600;
color: var(--text-secondary);
}
.room-controls {
display: flex;
gap: 4px;
}
.room-btn {
font-size: 0.6rem;
padding: 3px 8px;
background: var(--bg-tertiary);
border: none;
border-radius: 4px;
color: var(--text-muted);
cursor: pointer;
transition: all 0.15s ease;
}
.room-btn:hover {
background: var(--bg-hover);
color: var(--text-primary);
}
.light-row {
display: flex;
align-items: center;
justify-content: space-between;
padding: 8px 10px;
background: var(--bg-tertiary);
border-radius: 6px;
margin-bottom: 4px;
transition: background 0.15s ease;
}
.light-row:hover {
background: var(--bg-hover);
}
.light-info {
display: flex;
align-items: center;
gap: 10px;
}
.light-dot {
width: 8px;
height: 8px;
border-radius: 50%;
}
.light-dot.on {
background: #fbbf24;
box-shadow: 0 0 10px rgba(251, 191, 36, 0.5);
}
.light-dot.off {
background: var(--text-muted);
}
.light-name {
font-size: 0.8rem;
}
.light-name.off {
color: var(--text-muted);
}
.toggle {
width: 36px;
height: 20px;
background: var(--bg-elevated);
border-radius: 10px;
position: relative;
cursor: pointer;
transition: background 0.2s ease;
}
.toggle.on {
background: var(--accent);
}
.toggle-thumb {
width: 16px;
height: 16px;
background: white;
border-radius: 50%;
position: absolute;
top: 2px;
left: 2px;
transition: transform 0.2s ease;
box-shadow: 0 1px 3px rgba(0,0,0,0.2);
}
.toggle.on .toggle-thumb {
transform: translateX(16px);
}
/* Locks - Compact */
.lock-row {
display: flex;
align-items: center;
justify-content: space-between;
padding: 10px 12px;
background: var(--bg-tertiary);
border-radius: var(--radius-sm);
margin-bottom: 6px;
}
.lock-info {
display: flex;
align-items: center;
gap: 10px;
}
.lock-icon {
width: 32px;
height: 32px;
background: rgba(34, 197, 94, 0.15);
border-radius: 6px;
display: flex;
align-items: center;
justify-content: center;
}
.lock-icon svg {
width: 16px;
height: 16px;
color: var(--success);
}
.lock-name {
font-size: 0.85rem;
font-weight: 500;
}
.lock-status {
font-size: 0.7rem;
color: var(--success);
}
.lock-btn {
padding: 6px 14px;
background: transparent;
border: 1px solid var(--border);
border-radius: 6px;
color: var(--text-primary);
font-family: inherit;
font-size: 0.75rem;
font-weight: 500;
cursor: pointer;
transition: all 0.15s ease;
}
.lock-btn:hover {
background: var(--bg-hover);
border-color: var(--error);
color: var(--error);
}
/* Todo - Compact */
.todo-input {
display: flex;
gap: 8px;
margin-bottom: 10px;
}
.todo-input input {
flex: 1;
background: var(--bg-tertiary);
border: 1px solid var(--border);
border-radius: 6px;
padding: 8px 12px;
color: var(--text-primary);
font-family: inherit;
font-size: 0.8rem;
transition: border-color 0.15s ease;
}
.todo-input input:focus {
outline: none;
border-color: var(--accent);
}
.todo-input input::placeholder {
color: var(--text-muted);
}
.todo-add-btn {
width: 36px;
height: 36px;
background: var(--accent);
border: none;
border-radius: 6px;
color: white;
font-size: 1.25rem;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: background 0.15s ease;
}
.todo-add-btn:hover {
background: var(--accent-light);
}
.todo-item {
display: flex;
align-items: center;
gap: 10px;
padding: 10px;
background: var(--bg-tertiary);
border-radius: 6px;
margin-bottom: 4px;
transition: background 0.15s ease;
}
.todo-item:hover {
background: var(--bg-hover);
}
.todo-checkbox {
width: 18px;
height: 18px;
border: 2px solid var(--border-light);
border-radius: 5px;
cursor: pointer;
transition: all 0.15s ease;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.todo-checkbox:hover {
border-color: var(--accent);
}
.todo-text {
font-size: 0.8rem;
}
.todo-count {
margin-left: auto;
background: var(--accent);
color: white;
font-size: 0.65rem;
font-weight: 600;
padding: 3px 8px;
border-radius: 8px;
}
/* SVG Icons */
svg {
width: 20px;
height: 20px;
stroke: currentColor;
stroke-width: 2;
fill: none;
}
/* Scrollbar */
::-webkit-scrollbar {
width: 4px;
}
::-webkit-scrollbar-track {
background: transparent;
}
::-webkit-scrollbar-thumb {
background: var(--border);
border-radius: 2px;
}
/* Tooltip */
.tooltip {
position: absolute;
bottom: calc(100% + 8px);
left: 50%;
transform: translateX(-50%);
background: var(--bg-elevated);
border: 1px solid var(--border);
border-radius: 6px;
padding: 6px 10px;
font-size: 0.7rem;
white-space: nowrap;
opacity: 0;
pointer-events: none;
transition: opacity 0.15s ease;
}
.status-icon:hover .tooltip {
opacity: 1;
}
</style>
</head>
<body>
<!-- Header -->
<header class="header">
<div class="header-left">
<div class="logo">
<svg viewBox="0 0 24 24" style="width: 22px; height: 22px; fill: white; stroke: none;">
<path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/>
</svg>
</div>
<h1 class="header-title">Home Command Center</h1>
</div>
<div class="header-center">
<div class="time" id="time">14:32</div>
<div class="date" id="date">Tuesday, February 4, 2025</div>
</div>
<div class="header-right">
<!-- Status Icons: Package + People -->
<div class="status-icons">
<!-- Package Icon -->
<div class="status-icon package">
<svg viewBox="0 0 24 24">
<path d="M20 7l-8-4-8 4m16 0l-8 4m8-4v10l-8 4m0-10L4 7m8 4v10M4 7v10l8 4"/>
</svg>
<div class="tooltip">Package at door</div>
</div>
<!-- Person 1 - Home -->
<div class="person-status">
<div class="person-avatar home">
<img src="https://i.pravatar.cc/64?img=68" alt="John">
</div>
<span class="person-location home">Home</span>
</div>
<!-- Person 2 - Work -->
<div class="person-status">
<div class="person-avatar work">
<img src="https://i.pravatar.cc/64?img=47" alt="Sarah">
</div>
<span class="person-location work">Work</span>
</div>
</div>
<div class="status-badge">
<div class="status-dot"></div>
Connected
</div>
<button class="btn">
<svg viewBox="0 0 24 24">
<path d="M15 10l4.553-2.276A1 1 0 0121 8.618v6.764a1 1 0 01-1.447.894L15 14M5 18h8a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v8a2 2 0 002 2z"/>
</svg>
Cameras
</button>
<button class="btn" style="padding: 10px;">
<svg viewBox="0 0 24 24">
<path d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"/>
<circle cx="12" cy="12" r="3"/>
</svg>
</button>
</div>
</header>
<!-- Main Dashboard -->
<main class="main">
<!-- Left Column - Calendar -->
<div class="calendar-col">
<div class="widget" style="height: 100%;">
<div class="widget-title">
<svg viewBox="0 0 24 24">
<path d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/>
</svg>
Calendar
</div>
<div class="widget-content">
<div class="calendar-nav">
<span class="calendar-month">February 2025</span>
<div class="calendar-nav-btns">
<button class="calendar-nav-btn"></button>
<button class="calendar-nav-btn"></button>
</div>
</div>
<div class="calendar-grid">
<div class="calendar-day-header">Sun</div>
<div class="calendar-day-header">Mon</div>
<div class="calendar-day-header">Tue</div>
<div class="calendar-day-header">Wed</div>
<div class="calendar-day-header">Thu</div>
<div class="calendar-day-header">Fri</div>
<div class="calendar-day-header">Sat</div>
<div class="calendar-day other-month"><div class="day-num">26</div></div>
<div class="calendar-day other-month"><div class="day-num">27</div></div>
<div class="calendar-day other-month"><div class="day-num">28</div></div>
<div class="calendar-day other-month"><div class="day-num">29</div></div>
<div class="calendar-day other-month"><div class="day-num">30</div></div>
<div class="calendar-day other-month"><div class="day-num">31</div></div>
<div class="calendar-day"><div class="day-num">1</div></div>
<div class="calendar-day"><div class="day-num">2</div></div>
<div class="calendar-day"><div class="day-num">3</div><div class="calendar-event">Team Mtg</div></div>
<div class="calendar-day today"><div class="day-num">4</div><div class="calendar-event">Doctor</div></div>
<div class="calendar-day"><div class="day-num">5</div></div>
<div class="calendar-day"><div class="day-num">6</div></div>
<div class="calendar-day"><div class="day-num">7</div><div class="calendar-event">Dinner</div></div>
<div class="calendar-day"><div class="day-num">8</div></div>
<div class="calendar-day"><div class="day-num">9</div></div>
<div class="calendar-day"><div class="day-num">10</div></div>
<div class="calendar-day"><div class="day-num">11</div></div>
<div class="calendar-day"><div class="day-num">12</div><div class="calendar-event">Birthday</div></div>
<div class="calendar-day"><div class="day-num">13</div></div>
<div class="calendar-day"><div class="day-num">14</div><div class="calendar-event">V-Day</div></div>
<div class="calendar-day"><div class="day-num">15</div></div>
<div class="calendar-day"><div class="day-num">16</div></div>
<div class="calendar-day"><div class="day-num">17</div></div>
<div class="calendar-day"><div class="day-num">18</div></div>
<div class="calendar-day"><div class="day-num">19</div></div>
<div class="calendar-day"><div class="day-num">20</div></div>
<div class="calendar-day"><div class="day-num">21</div></div>
<div class="calendar-day"><div class="day-num">22</div></div>
<div class="calendar-day"><div class="day-num">23</div></div>
<div class="calendar-day"><div class="day-num">24</div></div>
<div class="calendar-day"><div class="day-num">25</div></div>
<div class="calendar-day"><div class="day-num">26</div></div>
<div class="calendar-day"><div class="day-num">27</div></div>
<div class="calendar-day"><div class="day-num">28</div></div>
<div class="calendar-day other-month"><div class="day-num">1</div></div>
</div>
<div class="day-details">
<div class="day-details-title">Tuesday, February 4</div>
<div class="day-event">
<span class="day-event-time">10:00 AM</span>
<span>Doctor Appointment</span>
</div>
</div>
</div>
</div>
</div>
<!-- Middle Column -->
<div class="middle-col">
<!-- Thermostats -->
<div class="thermostat-row">
<div class="widget">
<div class="widget-title">
<svg viewBox="0 0 24 24">
<path d="M12 9v3m0 0v3m0-3h3m-3 0H9m12 0a9 9 0 11-18 0 9 9 0 0118 0z"/>
</svg>
Upstairs
</div>
<div class="thermostat">
<div class="temp-label">Current</div>
<div class="temp-current heating">72<span class="temp-unit">°</span></div>
<div class="temp-status">Heating to 70°</div>
<div class="temp-controls">
<button class="temp-btn heat"></button>
<div class="temp-range">
<div class="temp-setpoint">
<div class="temp-setpoint-label">Heat</div>
<div class="temp-setpoint-value heat">70°</div>
</div>
<span class="temp-range-divider"></span>
<div class="temp-setpoint">
<div class="temp-setpoint-label">Cool</div>
<div class="temp-setpoint-value cool">76°</div>
</div>
</div>
<button class="temp-btn cool">+</button>
</div>
<div class="temp-mode heat-cool">
<svg viewBox="0 0 24 24" style="color: #fb923c;"><path d="M12 3v1m0 16v1m9-9h-1M4 12H3"/></svg>
Heat • Cool
</div>
</div>
</div>
<div class="widget">
<div class="widget-title">
<svg viewBox="0 0 24 24">
<path d="M12 9v3m0 0v3m0-3h3m-3 0H9m12 0a9 9 0 11-18 0 9 9 0 0118 0z"/>
</svg>
Downstairs
</div>
<div class="thermostat">
<div class="temp-label">Current</div>
<div class="temp-current idle">73<span class="temp-unit">°</span></div>
<div class="temp-status">Idle</div>
<div class="temp-controls">
<button class="temp-btn heat"></button>
<div class="temp-range">
<div class="temp-setpoint">
<div class="temp-setpoint-label">Heat</div>
<div class="temp-setpoint-value heat">68°</div>
</div>
<span class="temp-range-divider"></span>
<div class="temp-setpoint">
<div class="temp-setpoint-label">Cool</div>
<div class="temp-setpoint-value cool">75°</div>
</div>
</div>
<button class="temp-btn cool">+</button>
</div>
<div class="temp-mode heat-cool">
<svg viewBox="0 0 24 24" style="color: #fb923c;"><path d="M12 3v1m0 16v1m9-9h-1M4 12H3"/></svg>
Heat • Cool
</div>
</div>
</div>
</div>
<!-- Alarm -->
<div class="widget" style="flex: 1;">
<div class="widget-title">
<svg viewBox="0 0 24 24">
<path d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"/>
</svg>
Security
</div>
<div class="alarm-content">
<div class="alarm-ring disarmed">
<svg viewBox="0 0 24 24" style="width: 32px; height: 32px;">
<path d="M8 11V7a4 4 0 118 0m-4 8v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2z"/>
</svg>
</div>
<div class="alarm-state">Disarmed</div>
<div class="alarm-modes">
<button class="alarm-mode-btn">
<svg viewBox="0 0 24 24">
<path d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6"/>
</svg>
<span>Home</span>
</button>
<button class="alarm-mode-btn">
<svg viewBox="0 0 24 24">
<path d="M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1"/>
</svg>
<span>Away</span>
</button>
<button class="alarm-mode-btn">
<svg viewBox="0 0 24 24">
<path d="M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z"/>
</svg>
<span>Night</span>
</button>
</div>
</div>
</div>
</div>
<!-- Right Column -->
<div class="right-col">
<!-- Lights -->
<div class="widget lights-widget">
<div class="lights-header">
<div class="widget-title" style="margin-bottom: 0;">
<svg viewBox="0 0 24 24" style="width: 16px; height: 16px;">
<path d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/>
</svg>
Lights
</div>
<button class="btn" style="padding: 4px 10px; font-size: 0.65rem;">All Off</button>
</div>
<div class="widget-content" style="margin-top: 10px;">
<!-- Living Room -->
<div class="room-section">
<div class="room-header">
<span class="room-name">Living Room</span>
<div class="room-controls">
<button class="room-btn">On</button>
<button class="room-btn">Off</button>
</div>
</div>
<div class="light-row">
<div class="light-info">
<div class="light-dot on"></div>
<span class="light-name">Main Light</span>
</div>
<div class="toggle on"><div class="toggle-thumb"></div></div>
</div>
<div class="light-row">
<div class="light-info">
<div class="light-dot off"></div>
<span class="light-name off">Floor Lamp</span>
</div>
<div class="toggle"><div class="toggle-thumb"></div></div>
</div>
</div>
<!-- Kitchen -->
<div class="room-section">
<div class="room-header">
<span class="room-name">Kitchen</span>
<div class="room-controls">
<button class="room-btn">On</button>
<button class="room-btn">Off</button>
</div>
</div>
<div class="light-row">
<div class="light-info">
<div class="light-dot on"></div>
<span class="light-name">Main Light</span>
</div>
<div class="toggle on"><div class="toggle-thumb"></div></div>
</div>
<div class="light-row">
<div class="light-info">
<div class="light-dot on"></div>
<span class="light-name">Under Cabinet</span>
</div>
<div class="toggle on"><div class="toggle-thumb"></div></div>
</div>
</div>
</div>
</div>
<!-- Locks -->
<div class="widget">
<div class="widget-title" style="justify-content: space-between;">
<div style="display: flex; align-items: center; gap: 8px;">
<svg viewBox="0 0 24 24" style="width: 16px; height: 16px;">
<path d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"/>
</svg>
Locks
</div>
<button class="btn" style="padding: 4px 10px; font-size: 0.65rem; background: rgba(34, 197, 94, 0.15); border-color: var(--success); color: var(--success);">Lock All</button>
</div>
<div class="widget-content">
<div class="lock-row">
<div class="lock-info">
<div class="lock-icon">
<svg viewBox="0 0 24 24">
<path d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"/>
</svg>
</div>
<div>
<div class="lock-name">Front Door</div>
<div class="lock-status">Locked</div>
</div>
</div>
<button class="lock-btn">Unlock</button>
</div>
<div class="lock-row">
<div class="lock-info">
<div class="lock-icon">
<svg viewBox="0 0 24 24">
<path d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"/>
</svg>
</div>
<div>
<div class="lock-name">Back Door</div>
<div class="lock-status">Locked</div>
</div>
</div>
<button class="lock-btn">Unlock</button>
</div>
</div>
</div>
<!-- Todo -->
<div class="widget">
<div class="widget-title">
<svg viewBox="0 0 24 24" style="width: 16px; height: 16px;">
<path d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"/>
</svg>
To-Do
<span class="todo-count">3</span>
</div>
<div class="widget-content">
<div class="todo-input">
<input type="text" placeholder="Add task...">
<button class="todo-add-btn">+</button>
</div>
<div class="todo-item">
<div class="todo-checkbox"></div>
<span class="todo-text">Buy groceries</span>
</div>
<div class="todo-item">
<div class="todo-checkbox"></div>
<span class="todo-text">Schedule HVAC maintenance</span>
</div>
<div class="todo-item">
<div class="todo-checkbox"></div>
<span class="todo-text">Update firewall rules</span>
</div>
</div>
</div>
</div>
</main>
<script>
function updateTime() {
const now = new Date();
document.getElementById('time').textContent = now.toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit', hour12: false });
document.getElementById('date').textContent = now.toLocaleDateString('en-US', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' });
}
updateTime();
setInterval(updateTime, 1000);
</script>
</body>
</html>