- _console_line.html: command + reply, error variant, "(no reply)" placeholder. - server_detail.html: console section between Live State and Files, replays last 50 history rows server-side; HTMX form appends new lines via hx-swap. - console-history.js: ArrowUp/Down recall against /console/history JSON; scroll-to-bottom on load and after each new line. - CSS: fixed-height scrolling transcript, terminal-ish styling, spinner via HTMX in-flight class. - test_console_routes.py: update 4 assertions from legacy [ERROR] literal to console-error CSS class (matches new semantic markup). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
47 lines
2.2 KiB
HTML
47 lines
2.2 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<meta name="csrf-token" content="{{ session.get('csrf_token', '') }}">
|
|
<title>{% block title %}left4me{% endblock %}</title>
|
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/tokens.css') }}">
|
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/layout.css') }}">
|
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/components.css') }}">
|
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/logs.css') }}">
|
|
</head>
|
|
<body>
|
|
<header class="site-header">
|
|
<div class="site-header-inner">
|
|
<nav class="primary-nav" aria-label="Main navigation">
|
|
<a class="brand" href="{{ '/dashboard' if g.user else '/login' }}">left4me</a>
|
|
{% if g.user %}
|
|
<a href="/servers">servers</a>
|
|
<a href="/blueprints">blueprints</a>
|
|
<a href="/overlays">overlays</a>
|
|
{% endif %}
|
|
</nav>
|
|
{% if g.user %}
|
|
<nav class="account-nav" aria-label="Account navigation">
|
|
{% if g.user.admin %}<a href="/admin">admin</a>{% endif %}
|
|
<a class="muted" href="/profile">{{ g.user.username }}</a>
|
|
<form method="post" action="/logout" class="inline-form">
|
|
<input type="hidden" name="csrf_token" value="{{ session.get('csrf_token', '') }}">
|
|
<button class="link-button" type="submit">logout</button>
|
|
</form>
|
|
</nav>
|
|
{% endif %}
|
|
</div>
|
|
</header>
|
|
<main class="container">
|
|
{% block content %}{% endblock %}
|
|
</main>
|
|
<script src="{{ url_for('static', filename='vendor/htmx.min.js') }}"></script>
|
|
<script src="{{ url_for('static', filename='js/csrf.js') }}"></script>
|
|
<script src="{{ url_for('static', filename='js/sse.js') }}"></script>
|
|
<script src="{{ url_for('static', filename='js/modal.js') }}"></script>
|
|
<script src="{{ url_for('static', filename='js/file-tree.js') }}"></script>
|
|
<script src="{{ url_for('static', filename='js/password-reveal.js') }}"></script>
|
|
<script defer src="{{ url_for('static', filename='js/console-history.js') }}"></script>
|
|
</body>
|
|
</html>
|