mirror of
https://github.com/wizarrrr/wizarr.git
synced 2026-07-30 23:07:19 -04:00
- Refactored all cache-busting v arguments in base.html to pass directly through the Flask url_for Jinja function (v=app_version) rather than string concatenation. - Moved the os import in context_processors.py to the top level scope to avoid redundant runtime overhead on every request.
142 lines
6.8 KiB
HTML
142 lines
6.8 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<link rel="stylesheet"
|
|
href="{{ url_for('static', filename='css/main.css', v=app_version) }}" />
|
|
<link rel="stylesheet"
|
|
href="{{ url_for('static', filename='css/tiny-mde.min.css', v=app_version) }}" />
|
|
<link rel="stylesheet"
|
|
href="{{ url_for('static', filename='css/vendor/animate.min.css', v=app_version) }}">
|
|
<script src="{{ url_for('static', filename='js/vendor/htmx.min.js', v=app_version) }}"></script>
|
|
<script src="{{ url_for('static', filename='js/vendor/htmx-preload.min.js', v=app_version) }}"></script>
|
|
<link rel="icon"
|
|
type="image/x-icon"
|
|
href="{{ url_for('static', filename='favicon.ico') }}">
|
|
<!-- PWA Manifest -->
|
|
<link rel="manifest"
|
|
href="{{ url_for('static', filename='manifest.json') }}">
|
|
<meta name="viewport"
|
|
content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no, viewport-fit=cover">
|
|
<meta name="mobile-web-app-capable" content="yes">
|
|
<meta name="apple-mobile-web-app-capable" content="yes">
|
|
<meta name="apple-mobile-web-app-status-bar-style"
|
|
content="black-translucent">
|
|
<meta name="apple-mobile-web-app-title" content="Wizarr">
|
|
<meta name="HandheldFriendly" content="true" />
|
|
<!-- PWA Theme Color -->
|
|
<meta name="theme-color" content="#3b82f6">
|
|
<!-- Apple Touch Icons -->
|
|
<link rel="apple-touch-icon"
|
|
href="{{ url_for('static', filename='img/pwa-icons/icon-152x152.png') }}">
|
|
<link rel="apple-touch-icon"
|
|
sizes="72x72"
|
|
href="{{ url_for('static', filename='img/pwa-icons/icon-72x72.png') }}">
|
|
<link rel="apple-touch-icon"
|
|
sizes="96x96"
|
|
href="{{ url_for('static', filename='img/pwa-icons/icon-96x96.png') }}">
|
|
<link rel="apple-touch-icon"
|
|
sizes="128x128"
|
|
href="{{ url_for('static', filename='img/pwa-icons/icon-128x128.png') }}">
|
|
<link rel="apple-touch-icon"
|
|
sizes="144x144"
|
|
href="{{ url_for('static', filename='img/pwa-icons/icon-144x144.png') }}">
|
|
<link rel="apple-touch-icon"
|
|
sizes="152x152"
|
|
href="{{ url_for('static', filename='img/pwa-icons/icon-152x152.png') }}">
|
|
<link rel="apple-touch-icon"
|
|
sizes="192x192"
|
|
href="{{ url_for('static', filename='img/pwa-icons/icon-192x192.png') }}">
|
|
<link rel="apple-touch-icon"
|
|
sizes="384x384"
|
|
href="{{ url_for('static', filename='img/pwa-icons/icon-384x384.png') }}">
|
|
<link rel="apple-touch-icon"
|
|
sizes="512x512"
|
|
href="{{ url_for('static', filename='img/pwa-icons/icon-512x512.png') }}">
|
|
<meta name="robots" content="noindex">
|
|
<title>
|
|
{% block title %}
|
|
{% endblock title %}
|
|
- {{ _(server_name) }}</title>
|
|
<meta property="og:title"
|
|
content="{% block og_title %}
|
|
{% endblock og_title %}" />
|
|
<meta property="og:description"
|
|
content="{% block og_description %}
|
|
{% endblock og_description %}" />
|
|
<script>
|
|
// On page load or when changing themes, best to add inline in `head` to avoid FOUC
|
|
if (localStorage.getItem('color-theme') === 'dark' || (!('color-theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
|
|
document.documentElement.classList.add('dark');
|
|
} else {
|
|
document.documentElement.classList.remove('dark');
|
|
}
|
|
|
|
// Clipboard utility with fallback support for HTTP contexts
|
|
function copyToClipboard(text, callback) {
|
|
// Modern clipboard API (requires HTTPS or localhost)
|
|
if (navigator.clipboard && window.isSecureContext) {
|
|
navigator.clipboard.writeText(text).then(() => {
|
|
if (callback) callback(true);
|
|
}).catch(err => {
|
|
console.warn('Clipboard API failed, trying fallback:', err);
|
|
fallbackCopy(text, callback);
|
|
});
|
|
} else {
|
|
// Fallback for HTTP contexts
|
|
fallbackCopy(text, callback);
|
|
}
|
|
}
|
|
|
|
function fallbackCopy(text, callback) {
|
|
// Create a temporary textarea element
|
|
const textarea = document.createElement('textarea');
|
|
textarea.value = text;
|
|
textarea.style.position = 'fixed';
|
|
textarea.style.opacity = '0';
|
|
textarea.style.left = '-9999px';
|
|
document.body.appendChild(textarea);
|
|
|
|
try {
|
|
// Select and copy the text
|
|
textarea.select();
|
|
textarea.setSelectionRange(0, 99999); // For mobile devices
|
|
|
|
const successful = document.execCommand('copy');
|
|
if (callback) callback(successful);
|
|
|
|
if (!successful) {
|
|
console.warn('Fallback copy failed');
|
|
// Last resort: show alert with text to copy manually
|
|
alert('Please copy this link manually:\n\n' + text);
|
|
}
|
|
} catch (err) {
|
|
console.error('All copy methods failed:', err);
|
|
if (callback) callback(false);
|
|
// Last resort: show alert with text to copy manually
|
|
alert('Please copy this link manually:\n\n' + text);
|
|
} finally {
|
|
document.body.removeChild(textarea);
|
|
}
|
|
}
|
|
</script>
|
|
</head>
|
|
<body class="bg-gray-50 dark:bg-gray-900">
|
|
{% block main %}
|
|
{% endblock main %}
|
|
<script src="{{ url_for('static', filename='js/vendor/alpine-collapse.min.js', v=app_version) }}"></script>
|
|
<script src="{{ url_for('static', filename='js/vendor/alpine.min.js', v=app_version) }}"></script>
|
|
<script src="{{ url_for('static', filename='js/vendor/flowbite.min.js', v=app_version) }}"></script>
|
|
<script src="{{ url_for('static', filename='js/dark-mode-switch.js', v=app_version) }}"></script>
|
|
<script src="{{ url_for('static', filename='js/tiny-mde.min.js', v=app_version) }}"></script>
|
|
<script src="{{ url_for('static', filename='js/init-tinymde.js', v=app_version) }}"></script>
|
|
<script src="{{ url_for('static', filename='js/sortable.min.js', v=app_version) }}"></script>
|
|
<script src="{{ url_for('static', filename='js/wizard-steps.js', v=app_version) }}"></script>
|
|
<script src="{{ url_for('static', filename='js/pwa-registration.js', v=app_version) }}"></script>
|
|
<!-- In-app browser escape -->
|
|
<script src="{{ url_for('static', filename='js/vendor/bowser.min.js', v=app_version) }}"></script>
|
|
<script src="{{ url_for('static', filename='js/vendor/inapp-spy.min.js', v=app_version) }}"></script>
|
|
<script src="{{ url_for('static', filename='js/in-app-escape.js', v=app_version) }}"></script>
|
|
</body>
|
|
</html>
|