66 lines
2.8 KiB
HTML
66 lines
2.8 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh-CN">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>{% block title %}星笺{% endblock %}</title>
|
|
<link rel="stylesheet" href="/static/style.css">
|
|
</head>
|
|
<body>
|
|
{% block nav %}
|
|
<nav class="navbar">
|
|
<a href="/dashboard" class="nav-brand">{{ 'brand'|t(user.language if user else 'zh') }}</a>
|
|
{% if user is defined and user %}
|
|
<button class="nav-hamburger" onclick="document.querySelector('.nav-links').classList.toggle('open')">☰</button>
|
|
<div class="nav-links">
|
|
<a href="/profiles">{{ 'nav.profiles'|t(user.language) }}</a>
|
|
<a href="/u/{{ user.username }}" target="_blank">{{ 'nav.showcase'|t(user.language) }}</a>
|
|
<a href="/settings">{{ 'nav.settings'|t(user.language) }}</a>
|
|
{% if user.is_admin %}
|
|
<a href="/admin">{{ 'nav.admin'|t(user.language) }}</a>
|
|
{% endif %}
|
|
<a href="/api/docs">{{ 'nav.api_docs'|t(user.language) }}</a>
|
|
<div class="lang-switcher" id="langSwitcher">
|
|
<button type="button" class="lang-globe" onclick="document.getElementById('langDropdown').classList.toggle('show')">🌐</button>
|
|
<div class="lang-dropdown" id="langDropdown">
|
|
{% for code, name in available_languages.items() %}
|
|
<form method="post" action="/settings/language">
|
|
<input type="hidden" name="language" value="{{ code }}">
|
|
<button type="submit" class="lang-option {% if user.language == code %}active{% endif %}">{{ name }}</button>
|
|
</form>
|
|
{% endfor %}
|
|
</div>
|
|
</div>
|
|
<a href="/logout" class="nav-logout">{{ 'nav.logout'|t(user.language) }}</a>
|
|
</div>
|
|
{% endif %}
|
|
</nav>
|
|
{% endblock %}
|
|
<main class="container">
|
|
{% block content %}{% endblock %}
|
|
</main>
|
|
{% set _c = get_copyright() %}
|
|
{% if _c %}
|
|
<footer style="text-align:center;padding:2rem 1rem;color:var(--text-muted);font-size:.8rem;border-top:1px solid var(--border);margin-top:2rem">
|
|
{{ _c }}
|
|
</footer>
|
|
{% endif %}
|
|
</body>
|
|
<script>
|
|
// Auto-trim whitespace from all text inputs and textareas on form submit
|
|
document.addEventListener('submit', function(e) {
|
|
e.target.querySelectorAll('input[type="text"], textarea').forEach(function(el) {
|
|
el.value = el.value.trim();
|
|
});
|
|
}, true);
|
|
// Close language dropdown when clicking outside
|
|
document.addEventListener('click', function(e) {
|
|
var sw = document.getElementById('langSwitcher');
|
|
var dd = document.getElementById('langDropdown');
|
|
if (sw && dd && !sw.contains(e.target)) {
|
|
dd.classList.remove('show');
|
|
}
|
|
});
|
|
</script>
|
|
</html>
|