diff --git a/fishtank-dashboard.html b/fishtank-dashboard.html index f5b2789..3a4394c 100644 --- a/fishtank-dashboard.html +++ b/fishtank-dashboard.html @@ -1000,7 +1000,6 @@ /* Inline chat panel */ .chat-panel { - grid-area: chat; display: flex; flex-direction: column; background: var(--panel); @@ -1131,6 +1130,188 @@ z-index: 10; } + /* Notification log */ + #notifLog { + position: fixed; + top: 73px; + right: 0; + width: 320px; + max-height: calc(100vh - 73px); + background: var(--panel); + border-left: 1px solid var(--border); + display: flex; + flex-direction: column; + z-index: 200; + transform: translateX(100%); + transition: transform 0.2s ease; + } + #notifLog.open { transform: translateX(0); } + .notif-log-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 8px 12px; + border-bottom: 1px solid var(--border); + font-family: 'Bebas Neue', sans-serif; + font-size: 14px; + letter-spacing: 2px; + color: var(--accent); + flex-shrink: 0; + } + .notif-log-clear { + background: none; + border: none; + color: var(--muted); + font-family: 'Share Tech Mono', monospace; + font-size: 10px; + cursor: pointer; + padding: 2px 6px; + } + .notif-log-clear:hover { color: var(--accent2); } + #notifLogFeed { + flex: 1; + overflow-y: auto; + padding: 8px; + display: flex; + flex-direction: column; + gap: 6px; + } + #notifLogFeed::-webkit-scrollbar { width: 4px; } + #notifLogFeed::-webkit-scrollbar-track { background: transparent; } + #notifLogFeed::-webkit-scrollbar-thumb { background: var(--border); border-radius: 2px; } + .notif-log-item { + background: var(--bg); + border: 1px solid var(--border); + border-radius: 4px; + padding: 8px 10px; + } + .notif-log-item-msg { font-size: 12px; color: var(--text); } + .notif-log-item-sub { font-size: 10px; color: var(--muted); margin-top: 2px; } + .notif-log-item-time { + font-family: 'Share Tech Mono', monospace; + font-size: 9px; + color: var(--muted); + margin-top: 4px; + } + #notifLogBtn { position: relative; } + .notif-log-badge { + display: none; + position: absolute; + top: -4px; + right: -4px; + background: var(--accent2); + color: #fff; + font-family: 'Share Tech Mono', monospace; + font-size: 9px; + border-radius: 8px; + padding: 1px 5px; + pointer-events: none; + } + + /* Floor plan panel */ + .floor-plan-panel { + flex-shrink: 0; + border-bottom: 1px solid var(--border); + background: var(--panel); + padding: 6px; + display: flex; + flex-direction: column; + gap: 4px; + } + .floor-plan-tabs { + display: flex; + gap: 4px; + } + .floor-plan-tab { + flex: 1; + background: transparent; + border: 1px solid var(--border); + color: var(--muted); + font-family: 'Share Tech Mono', monospace; + font-size: 9px; + letter-spacing: 1px; + padding: 3px 0; + cursor: pointer; + border-radius: 2px; + transition: all 0.15s; + } + .floor-plan-tab.active { + border-color: var(--accent); + color: var(--accent); + background: rgba(0,229,255,0.06); + } + .floor-plan-wrap { + position: relative; + width: 100%; + } + .floor-plan-wrap img { + width: 100%; + display: block; + opacity: 0.85; + } + .floor-plan-btn { + position: absolute; + background: transparent; + border: none; + color: #DC6F41; + font-family: 'Share Tech Mono', monospace; + font-size: 9px; + cursor: pointer; + padding: 2px; + line-height: 1.2; + text-align: center; + transition: background 0.15s; + font-weight: bold; + text-shadow: 0 0 4px rgba(0,0,0,0.8); + } + .floor-plan-btn:hover { + background: rgba(220,111,65,0.25); + color: #fff; + } + .floor-plan-btn.active-room { + background: rgba(220,111,65,0.35); + color: #fff; + outline: 1px solid #DC6F41; + } + + /* Camera navigation overlay */ + .cam-nav-overlay { + position: absolute; + inset: 0; + pointer-events: none; + z-index: 10; + } + .cam-nav-overlay svg { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + } + .cam-nav-overlay polygon { + fill: transparent; + transition: fill 0.15s; + pointer-events: auto; + cursor: pointer; + } + .cam-nav-overlay polygon:hover { + fill: rgba(255,255,255,0.18); + } + .cam-nav-tooltip { + position: absolute; + background: rgba(0,0,0,0.85); + color: var(--accent); + font-family: 'Share Tech Mono', monospace; + font-size: 10px; + padding: 4px 8px; + border-radius: 3px; + border: 1px solid var(--border); + pointer-events: none; + white-space: nowrap; + z-index: 20; + display: none; + letter-spacing: 1px; + } + /* Viewer count badge */ .cam-viewers { position: absolute; @@ -1407,7 +1588,6 @@ /* Inline chat panel */ .chat-panel { - grid-area: chat; display: flex; flex-direction: column; background: var(--panel); @@ -1538,6 +1718,188 @@ z-index: 10; } + /* Notification log */ + #notifLog { + position: fixed; + top: 73px; + right: 0; + width: 320px; + max-height: calc(100vh - 73px); + background: var(--panel); + border-left: 1px solid var(--border); + display: flex; + flex-direction: column; + z-index: 200; + transform: translateX(100%); + transition: transform 0.2s ease; + } + #notifLog.open { transform: translateX(0); } + .notif-log-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 8px 12px; + border-bottom: 1px solid var(--border); + font-family: 'Bebas Neue', sans-serif; + font-size: 14px; + letter-spacing: 2px; + color: var(--accent); + flex-shrink: 0; + } + .notif-log-clear { + background: none; + border: none; + color: var(--muted); + font-family: 'Share Tech Mono', monospace; + font-size: 10px; + cursor: pointer; + padding: 2px 6px; + } + .notif-log-clear:hover { color: var(--accent2); } + #notifLogFeed { + flex: 1; + overflow-y: auto; + padding: 8px; + display: flex; + flex-direction: column; + gap: 6px; + } + #notifLogFeed::-webkit-scrollbar { width: 4px; } + #notifLogFeed::-webkit-scrollbar-track { background: transparent; } + #notifLogFeed::-webkit-scrollbar-thumb { background: var(--border); border-radius: 2px; } + .notif-log-item { + background: var(--bg); + border: 1px solid var(--border); + border-radius: 4px; + padding: 8px 10px; + } + .notif-log-item-msg { font-size: 12px; color: var(--text); } + .notif-log-item-sub { font-size: 10px; color: var(--muted); margin-top: 2px; } + .notif-log-item-time { + font-family: 'Share Tech Mono', monospace; + font-size: 9px; + color: var(--muted); + margin-top: 4px; + } + #notifLogBtn { position: relative; } + .notif-log-badge { + display: none; + position: absolute; + top: -4px; + right: -4px; + background: var(--accent2); + color: #fff; + font-family: 'Share Tech Mono', monospace; + font-size: 9px; + border-radius: 8px; + padding: 1px 5px; + pointer-events: none; + } + + /* Floor plan panel */ + .floor-plan-panel { + flex-shrink: 0; + border-bottom: 1px solid var(--border); + background: var(--panel); + padding: 6px; + display: flex; + flex-direction: column; + gap: 4px; + } + .floor-plan-tabs { + display: flex; + gap: 4px; + } + .floor-plan-tab { + flex: 1; + background: transparent; + border: 1px solid var(--border); + color: var(--muted); + font-family: 'Share Tech Mono', monospace; + font-size: 9px; + letter-spacing: 1px; + padding: 3px 0; + cursor: pointer; + border-radius: 2px; + transition: all 0.15s; + } + .floor-plan-tab.active { + border-color: var(--accent); + color: var(--accent); + background: rgba(0,229,255,0.06); + } + .floor-plan-wrap { + position: relative; + width: 100%; + } + .floor-plan-wrap img { + width: 100%; + display: block; + opacity: 0.85; + } + .floor-plan-btn { + position: absolute; + background: transparent; + border: none; + color: #DC6F41; + font-family: 'Share Tech Mono', monospace; + font-size: 9px; + cursor: pointer; + padding: 2px; + line-height: 1.2; + text-align: center; + transition: background 0.15s; + font-weight: bold; + text-shadow: 0 0 4px rgba(0,0,0,0.8); + } + .floor-plan-btn:hover { + background: rgba(220,111,65,0.25); + color: #fff; + } + .floor-plan-btn.active-room { + background: rgba(220,111,65,0.35); + color: #fff; + outline: 1px solid #DC6F41; + } + + /* Camera navigation overlay */ + .cam-nav-overlay { + position: absolute; + inset: 0; + pointer-events: none; + z-index: 10; + } + .cam-nav-overlay svg { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + } + .cam-nav-overlay polygon { + fill: transparent; + transition: fill 0.15s; + pointer-events: auto; + cursor: pointer; + } + .cam-nav-overlay polygon:hover { + fill: rgba(255,255,255,0.18); + } + .cam-nav-tooltip { + position: absolute; + background: rgba(0,0,0,0.85); + color: var(--accent); + font-family: 'Share Tech Mono', monospace; + font-size: 10px; + padding: 4px 8px; + border-radius: 3px; + border: 1px solid var(--border); + pointer-events: none; + white-space: nowrap; + z-index: 20; + display: none; + letter-spacing: 1px; + } + /* Viewer count badge */ .cam-viewers { position: absolute; @@ -1794,6 +2156,16 @@ +