Terminal scrollIntoView was scrolling the entire page instead of just
the terminal panel. Replaced with container.scrollTop for scoped scroll.
Snippet cards in dark mode were invisible (surface-container-low ≈
background). Added border, background, and shadow to differentiate them.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Bio updates were sent directly to DBAL which returned 403 (user JWT lacks
admin privileges). Moved profile read/write through new Flask endpoints
(GET/PUT /api/profile) that use the DBAL admin token server-side.
Also fixed ProfileSettingsCard to fetch and populate the existing bio on
mount instead of always starting with an empty string.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The profile page was rendering without the shared PageLayout, so it was
missing the header (burger menu, logo, theme switcher, avatar) and footer.
Added PageLayout wrapper and a breadcrumb nav bar with back button.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The code runner used `python3 -c` to decode FILES_PAYLOAD inside every
container, but 6+ runner images (node, golang, bash, ruby, php, perl)
don't ship python3 — so JS/Go/Bash/Ruby/PHP/Perl snippets all failed.
Replaced with a pure POSIX `base64 -d | awk` pipeline that works on
every image. Also fixes:
- pids_limit 64→256 (Go compiler crashed spawning threads)
- Per-user configurable runTimeout via settings panel (5–300s)
- Default run timeout 10→30s, server-side cap at 300s
- Frontend AbortSignal raised to 310s to match max timeout
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add 18 data-testid selectors and improved ARIA attributes across sign-in,
register, and forgot-password forms for Playwright e2e testing and accessibility.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>