runique 2.1.21

A Django-inspired web framework for Rust with ORM, templates, and comprehensive security middleware
Documentation
<!DOCTYPE html>
{% block lang %}
    <html lang="{{ lang | default(value="fr") }}">
{% endblock %}
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
    <meta name="robots" content="noindex, nofollow">
    <meta name="csrf-token" content="{{ csrf_token }}">

    {# Anti-FOUC : pose data-theme avant le 1er paint pour éviter le flash sombre→clair.
       Choix stocké > préférence système. Si JS échoue, :root (sombre) s'applique. #}
    <script {% csp %}>
        (function () {
            try {
                var t = localStorage.getItem('runique-admin-theme');
                if (t !== 'light' && t !== 'dark') {
                    t = window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark';
                }
                document.documentElement.setAttribute('data-theme', t);
            } catch (e) {
                document.documentElement.setAttribute('data-theme', 'dark');
            }
        })();
    </script>

    <link rel="icon" type="image/x-icon" href="{{ icon_image }}">
    <meta property="og:image" content="{{ og_image }}">

    <title>{% if admin_base_title %}{{ admin_base_title }}{% endif %}</title>

    {% block extra_css %}{% endblock %}
</head>
<body>

{% block layout %}

<div class="admin-layout">

    {% block sidebar %}{% endblock %}

    <div class="admin-main">

        {% block topbar %}{% endblock %}

        <main class="admin-content">

            {% block messages %}{% messages %}{% endblock %}

            {% block content %}{% endblock %}

        </main>

    </div>

</div>

{% endblock %}

<div class="rq-modal-overlay" id="rqModalOverlay" role="dialog" aria-modal="true" aria-labelledby="rqModalTitle">
    <div class="rq-modal-box">
        <p class="rq-modal-title" id="rqModalTitle"></p>
        <p class="rq-modal-msg" id="rqModalMsg"></p>
        <div class="rq-modal-actions">
            <button type="button" class="btn btn-ghost btn-sm" id="rqModalCancel"></button>
            <button type="button" class="btn btn-danger btn-sm" id="rqModalOk"></button>
        </div>
    </div>
</div>

<script {% csp %} src="{{ "js/csrf.js" | runique_static }}" defer></script>

{% block extra_js %}{% endblock %}
<footer>
    {% block footer %}{% endblock %}
</footer>
</body>
</html>