Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 74 additions & 0 deletions client/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -577,6 +577,80 @@ <h3>Notifications</h3>
<script src="terminal.js"></script>
<script src="notifications.js"></script>
<script src="agent-modal.js"></script>
<script>
// Trailer neon cycle with fixed glow overlay
(function() {
let running = false;
let stopped = false;
let overlay = null;

function getOverlay() {
if (!overlay) {
overlay = document.createElement('div');
overlay.className = 'neon-glow-overlay';
overlay.style.opacity = '0';
document.body.appendChild(overlay);
}
return overlay;
}

function positionOverlay(el) {
const ov = getOverlay();
const rect = el.getBoundingClientRect();
const pad = 4;
ov.style.left = (rect.left - pad) + 'px';
ov.style.top = (rect.top - pad) + 'px';
ov.style.width = (rect.width + pad * 2) + 'px';
ov.style.height = (rect.height + pad * 2) + 'px';
ov.style.opacity = '1';
ov.style.transform = 'scale(1.03)';
}

function hideOverlay() {
const ov = getOverlay();
ov.style.opacity = '0';
ov.style.transform = 'scale(1)';
}

async function sleep(ms) { return new Promise(r => setTimeout(r, ms)); }

async function runCycle() {
running = true;
while (!stopped) {
const wrappers = document.querySelectorAll('.terminal-grid .terminal-wrapper, .terminal-pair .terminal-wrapper');
if (!wrappers.length) { await sleep(1000); continue; }

for (let i = 0; i < wrappers.length; i++) {
if (stopped) break;
wrappers.forEach(w => w.classList.remove('neon-active'));
wrappers[i].classList.add('neon-active');
positionOverlay(wrappers[i]);
await sleep(700);
}

wrappers.forEach(w => w.classList.remove('neon-active'));
hideOverlay();
if (!stopped) await sleep(5000);
}
running = false;
}

function startNeonCycle() {
stopped = false;
if (!running) runCycle();
}

function stopNeonCycle() {
stopped = true;
document.querySelectorAll('.terminal-wrapper.neon-active').forEach(w => w.classList.remove('neon-active'));
hideOverlay();
}

setTimeout(startNeonCycle, 2000);
window.startNeonCycle = startNeonCycle;
window.stopNeonCycle = stopNeonCycle;
})();
</script>
</body>

</html>
43 changes: 38 additions & 5 deletions client/styles.css
Original file line number Diff line number Diff line change
Expand Up @@ -1449,7 +1449,7 @@ header {
Pairs stack top-to-bottom; within each pair terminals sit side-by-side. */
.terminal-grid {
padding: var(--space-xs);
overflow: hidden;
overflow: visible;
display: grid;
gap: var(--space-xs);
grid-template-columns: repeat(var(--grid-cols, 1), minmax(0, 1fr));
Expand All @@ -1467,7 +1467,7 @@ header {
gap: var(--space-xs);
min-height: 0;
min-width: 0;
overflow: hidden;
overflow: visible;
}

.terminal-pair > .terminal-wrapper {
Expand All @@ -1494,14 +1494,47 @@ header {
.terminal-wrapper {
background: var(--bg-tertiary);
border-radius: var(--radius-md);
border: 1px solid var(--border-color);
border: 2px solid var(--border-color);
overflow: hidden;
display: flex;
flex-direction: column;
height: 100%; /* Fill grid cell completely */
height: 100%;
width: 100%;
position: relative;
isolation: isolate;
transition: border-color 0.5s ease, box-shadow 0.5s ease, transform 0.5s cubic-bezier(0.2, 0, 0.2, 1);
}

.terminal-wrapper.neon-active,
.terminal-wrapper:hover {
border-color: #fff;
border-width: 3px;
box-shadow:
0 0 4px #fff,
0 0 8px #fff,
inset 0 0 50px rgba(0, 229, 255, 0.25),
inset 0 0 100px rgba(0, 229, 255, 0.12);
}

/* Fixed-position glow overlay that escapes all parent clipping */
.neon-glow-overlay {
position: fixed;
pointer-events: none;
z-index: 999999;
border-radius: 10px;
transition: opacity 0.5s ease, transform 0.5s cubic-bezier(0.2, 0, 0.2, 1);
box-shadow:
0 0 4px #fff,
0 0 10px #fff,
0 0 20px #00e5ff,
0 0 40px #00e5ff,
0 0 70px #00e5ff,
0 0 110px rgba(0, 229, 255, 0.9),
0 0 180px rgba(0, 229, 255, 0.6),
0 0 280px rgba(0, 229, 255, 0.4),
0 0 400px rgba(0, 229, 255, 0.25),
0 0 550px rgba(0, 229, 255, 0.12);
border: 1px solid rgba(255, 255, 255, 0.3);
background: transparent;
}

.terminal-header {
Expand Down
7 changes: 7 additions & 0 deletions site/assets/Claude_AI_symbol.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added site/assets/Open-AI-White-Logo-Icon-PNG.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added site/assets/click.wav
Binary file not shown.
Binary file added site/assets/openai_logo_icon_248315.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added site/assets/trailer-music.mp3
Binary file not shown.
Binary file added site/assets/trailer.mp4
Binary file not shown.
Loading
Loading