Skip to content

Commit 094e364

Browse files
ferr079claude
andcommitted
style: /chat — collapsible code panel, chat takes full width by default
- Code panel hidden by default, "View source" toggle on the side - Click to expand/collapse with smooth transition - Chat gets full width when code panel is closed - Hidden on mobile (chat only) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 779f336 commit 094e364

1 file changed

Lines changed: 83 additions & 15 deletions

File tree

src/pages/chat.astro

Lines changed: 83 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -106,16 +106,22 @@ const codeEndpoint = `<span class="c-cmt">// POST /api/chat — unified AI endpo
106106
</form>
107107
</div>
108108

109-
<!-- Right: code/config panel -->
110-
<div class="code-panel">
111-
<div class="code-header">
112-
<button class="code-tab active" data-tab="prompt">system prompt</button>
113-
<button class="code-tab" data-tab="config">wrangler.toml</button>
114-
<button class="code-tab" data-tab="endpoint">endpoint</button>
109+
<!-- Right: code/config panel — collapsed by default -->
110+
<div class="code-panel" id="code-panel">
111+
<button class="code-toggle" id="code-toggle">
112+
<span class="code-toggle-icon" id="code-toggle-icon">&lsaquo;</span>
113+
<span class="code-toggle-label">View source</span>
114+
</button>
115+
<div class="code-inner" id="code-inner" style="display:none">
116+
<div class="code-header">
117+
<button class="code-tab active" data-tab="prompt">system prompt</button>
118+
<button class="code-tab" data-tab="config">wrangler.toml</button>
119+
<button class="code-tab" data-tab="endpoint">endpoint</button>
120+
</div>
121+
<pre id="tab-prompt" class="code-block" set:html={codePrompt} />
122+
<pre id="tab-config" class="code-block" style="display:none" set:html={codeConfig} />
123+
<pre id="tab-endpoint" class="code-block" style="display:none" set:html={codeEndpoint} />
115124
</div>
116-
<pre id="tab-prompt" class="code-block" set:html={codePrompt} />
117-
<pre id="tab-config" class="code-block" style="display:none" set:html={codeConfig} />
118-
<pre id="tab-endpoint" class="code-block" style="display:none" set:html={codeEndpoint} />
119125
</div>
120126
</div>
121127

@@ -133,6 +139,20 @@ const codeEndpoint = `<span class="c-cmt">// POST /api/chat — unified AI endpo
133139

134140
const history: { role: string; content: string }[] = [];
135141
let isStreaming = false;
142+
let codeOpen = false;
143+
144+
// Code panel toggle
145+
const codeToggle = document.getElementById('code-toggle')!;
146+
const codeInner = document.getElementById('code-inner')!;
147+
const codePanel = document.getElementById('code-panel')!;
148+
const codeToggleIcon = document.getElementById('code-toggle-icon')!;
149+
150+
codeToggle.addEventListener('click', () => {
151+
codeOpen = !codeOpen;
152+
codeInner.style.display = codeOpen ? 'flex' : 'none';
153+
codePanel.classList.toggle('expanded', codeOpen);
154+
codeToggleIcon.textContent = codeOpen ? '\u203A' : '\u2039';
155+
});
136156

137157
// Tab switching — toggle visibility of pre-rendered blocks
138158
const tabs = document.querySelectorAll('.code-tab');
@@ -229,8 +249,8 @@ const codeEndpoint = `<span class="c-cmt">// POST /api/chat — unified AI endpo
229249
margin: 0 auto;
230250
padding: 0 1.5rem;
231251
display: grid;
232-
grid-template-columns: 1fr 1fr;
233-
gap: 1.5rem;
252+
grid-template-columns: 1fr auto;
253+
gap: 0;
234254
height: calc(100vh - 10rem);
235255
min-height: 30rem;
236256
}
@@ -342,14 +362,62 @@ const codeEndpoint = `<span class="c-cmt">// POST /api/chat — unified AI endpo
342362

343363
#chat-send:hover { color: var(--color-accent-hover); }
344364

345-
/* Code panel */
365+
/* Code panel — collapsed by default */
346366
.code-panel {
367+
display: flex;
368+
flex-direction: row;
369+
width: 2.5rem;
370+
transition: width 0.3s ease;
371+
position: relative;
372+
}
373+
374+
.code-panel.expanded {
375+
width: 28rem;
376+
gap: 0;
377+
}
378+
379+
.code-toggle {
347380
display: flex;
348381
flex-direction: column;
382+
align-items: center;
383+
justify-content: center;
384+
gap: 0.5rem;
385+
width: 2.5rem;
386+
flex-shrink: 0;
349387
background: var(--color-surface);
350388
border: 1px solid var(--color-border);
351-
border-radius: 8px;
389+
border-radius: 8px 0 0 8px;
390+
cursor: pointer;
391+
color: var(--color-text-muted);
392+
font-family: var(--font-mono);
393+
padding: 0;
394+
transition: color 0.2s;
395+
}
396+
397+
.code-toggle:hover { color: var(--color-accent); }
398+
399+
.code-toggle-icon {
400+
font-size: 1.2rem;
401+
line-height: 1;
402+
}
403+
404+
.code-toggle-label {
405+
writing-mode: vertical-rl;
406+
text-orientation: mixed;
407+
font-size: 0.6rem;
408+
letter-spacing: 0.08em;
409+
text-transform: uppercase;
410+
}
411+
412+
.code-inner {
413+
flex: 1;
414+
flex-direction: column;
415+
background: var(--color-surface);
416+
border: 1px solid var(--color-border);
417+
border-left: none;
418+
border-radius: 0 8px 8px 0;
352419
overflow: hidden;
420+
min-width: 0;
353421
}
354422

355423
.code-header {
@@ -420,7 +488,7 @@ const codeEndpoint = `<span class="c-cmt">// POST /api/chat — unified AI endpo
420488
height: auto;
421489
}
422490

423-
.chat-panel { height: 60vh; min-height: 20rem; }
424-
.code-panel { height: 20rem; }
491+
.chat-panel { height: 75vh; min-height: 20rem; }
492+
.code-panel { display: none; }
425493
}
426494
</style>

0 commit comments

Comments
 (0)