Download templates/base.html from dn-scribe/attstore: direct link, hf CLI and curl.
- Browser
- Download file 10.8 kB
-
https://huggingface.co/spaces/dn-scribe/attstore/resolve/main/templates/base.html
- Command line
-
hf download hf://spaces/dn-scribe/attstore/templates/base.html
-
curl -L -o base.html https://huggingface.co/spaces/dn-scribe/attstore/resolve/main/templates/base.html
10.8 kB
| <html lang="en" data-bs-theme="dark"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>{% block title %}Attestation Store{% endblock %}</title> | |
| <!-- Favicon --> | |
| <link rel="icon" href="{{ url_for('static', filename='favicon.png') }}"> | |
| <!-- Bootstrap CSS (Replit Theme) --> | |
| <link href="{{ url_for('static', filename='vendor/bootstrap-agent-dark-theme.min.css') }}" rel="stylesheet"> | |
| <!-- Custom CSS --> | |
| <link rel="stylesheet" href="{{ url_for('static', filename='css/custom.css') }}"> | |
| <!-- JSONEditor CSS --> | |
| <link href="{{ url_for('static', filename='vendor/jsoneditor.min.css') }}" rel="stylesheet" /> | |
| </head> | |
| <body> | |
| <script> | |
| // Suppress Chrome extension async message errors as early as possible | |
| function _suppressExtError(e) { | |
| var msg = e.reason?.message || e.message; | |
| if (typeof msg === 'string' && msg.includes( | |
| 'A listener indicated an asynchronous response by returning true, but the message channel closed before a response was received' | |
| )) { | |
| e.preventDefault(); | |
| } | |
| } | |
| window.addEventListener('unhandledrejection', _suppressExtError, true); | |
| window.addEventListener('error', _suppressExtError, true); | |
| // Handle Escape key navigation (circular focus) | |
| document.addEventListener('keydown', function(event) { | |
| if (event.key === 'Escape') { | |
| const cancelBtn = document.querySelector('.btn-secondary'); | |
| if (cancelBtn && cancelBtn.href) { | |
| window.location.href = cancelBtn.href; | |
| } | |
| } | |
| }); | |
| </script> | |
| <body> | |
| <!-- Navigation --> | |
| <nav class="navbar navbar-expand-lg navbar-dark bg-dark"> | |
| <div class="container"> | |
| <a class="navbar-brand" href="{{ url_for('web.index') }}"> | |
| <img src="/static/scribe_letters_light.png" alt="Scribe Transparency" style="height:32px; width:auto; vertical-align:middle;"> | |
| </a> | |
| <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav"> | |
| <span class="navbar-toggler-icon"></span> | |
| </button> | |
| <div class="collapse navbar-collapse" id="navbarNav"> | |
| <ul class="navbar-nav me-auto"> | |
| {% if current_user %} | |
| <li class="nav-item"> | |
| <a class="nav-link" href="{{ url_for('web.dashboard') }}"> | |
| <i data-feather="home" class="me-1"></i> | |
| Dashboard | |
| </a> | |
| </li> | |
| <li class="nav-item"> | |
| <a class="nav-link" href="{{ url_for('web.products') }}"> | |
| <i data-feather="package" class="me-1"></i> | |
| Products | |
| </a> | |
| </li> | |
| <li class="nav-item"> | |
| <a class="nav-link" href="{{ url_for('web.policy_results') }}"> | |
| <i data-feather="shield" class="me-1"></i> | |
| Policy | |
| </a> | |
| </li> | |
| <li class="nav-item"> | |
| <a class="nav-link" href="{{ url_for('web.attestations') }}"> | |
| <i data-feather="file-text" class="me-1"></i> | |
| Attestations | |
| </a> | |
| </li> | |
| <li class="nav-item"> | |
| <a class="nav-link" href="{{ url_for('web.logs') }}"> | |
| <i data-feather="activity" class="me-1"></i> | |
| Logs | |
| </a> | |
| </li> | |
| <li class="nav-item dropdown"> | |
| <a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown"> | |
| <i data-feather="settings" class="me-1"></i> | |
| Settings | |
| </a> | |
| <ul class="dropdown-menu"> | |
| <li><a class="dropdown-item" href="{{ url_for('web.webhooks') }}"> | |
| <i data-feather="zap" class="me-1"></i> | |
| Webhooks | |
| </a></li> | |
| <li><a class="dropdown-item" href="{{ url_for('web.api_keys') }}"> | |
| <i data-feather="key" class="me-1"></i> | |
| API Keys | |
| </a></li> | |
| {% if current_user.is_admin or current_user.username == 'admin' %} | |
| <li><a class="dropdown-item" href="{{ url_for('web.users') }}"> | |
| <i data-feather="users" class="me-1"></i> | |
| User Management | |
| </a></li> | |
| {% endif %} | |
| <li><a class="dropdown-item" href="{{ url_for('badges.badges_list') }}"> | |
| <i data-feather="award" class="me-1"></i> | |
| Badges | |
| </a></li> | |
| </ul> | |
| </li> | |
| {% endif %} | |
| </ul> | |
| <ul class="navbar-nav"> | |
| {% if current_user %} | |
| <li class="nav-item dropdown"> | |
| <a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown"> | |
| <i data-feather="user" class="me-1"></i> | |
| {{ current_user.username }} | |
| </a> | |
| <ul class="dropdown-menu"> | |
| <li><a class="dropdown-item" href="{{ url_for('web.change_password') }}"> | |
| <i data-feather="key" class="me-1"></i> | |
| Change Password | |
| </a></li> | |
| <li><hr class="dropdown-divider"></li> | |
| <li><a class="dropdown-item" href="{{ url_for('web.logout') }}"> | |
| <i data-feather="log-out" class="me-1"></i> | |
| Logout | |
| </a></li> | |
| </ul> | |
| </li> | |
| {% else %} | |
| <li class="nav-item"> | |
| <a class="nav-link" href="{{ url_for('web.login') }}"> | |
| <i data-feather="log-in" class="me-1"></i> | |
| Login | |
| </a> | |
| </li> | |
| {% endif %} | |
| </ul> | |
| </div> | |
| </div> | |
| </nav> | |
| <!-- Flash Messages --> | |
| {% with messages = get_flashed_messages(with_categories=true) %} | |
| {% if messages %} | |
| <div class="container mt-3"> | |
| {% for category, message in messages %} | |
| <div class="alert alert-{{ 'danger' if category == 'error' else category }} alert-dismissible fade show" role="alert"> | |
| {{ message }} | |
| <button type="button" class="btn-close" data-bs-dismiss="alert"></button> | |
| </div> | |
| {% endfor %} | |
| </div> | |
| {% endif %} | |
| {% endwith %} | |
| <!-- Main Content --> | |
| <main> | |
| {% block content %}{% endblock %} | |
| </main> | |
| <!-- Footer --> | |
| <footer class="bg-dark text-light py-4 mt-5"> | |
| <div class="container"> | |
| <div class="row"> | |
| <div class="col-md-6"> | |
| <h6>Attestation Store</h6> | |
| <p class="text-muted small">Secure evidence storage and management</p> | |
| <p class="text-muted small">Version: {{ app_version }}</p> | |
| </div> | |
| <div class="col-md-6 text-md-end"> | |
| <p class="text-muted small"> | |
| <i data-feather="book-open" class="me-1"></i> | |
| <a href="/docs" target="_blank" class="text-light text-decoration-underline">Scribe Documentation</a> | |
| </p> | |
| </div> | |
| </div> | |
| </div> | |
| </footer> | |
| <!-- Bootstrap JS --> | |
| <script src="{{ url_for('static', filename='vendor/bootstrap-5.3.0.bundle.min.js') }}"></script> | |
| <!-- Axios for API calls --> | |
| <script src="{{ url_for('static', filename='vendor/axios.min.js') }}"></script> | |
| <!-- Auth token for API requests --> | |
| <script> | |
| // Make auth token available globally for main.js | |
| {% if 'access_token' in session %} | |
| var authToken = '{{ session["access_token"] }}'; | |
| {% else %} | |
| var authToken = null; | |
| {% endif %} | |
| </script> | |
| <!-- Custom JS --> | |
| <script src="{{ url_for('static', filename='js/main.js') }}"></script> | |
| <!-- Feather Icons --> | |
| <script src="{{ url_for('static', filename='vendor/feather.min.js') }}"></script> | |
| <script> | |
| feather.replace(); | |
| </script> | |
| <script src="{{ url_for('static', filename='vendor/jsoneditor.min.js') }}"></script> | |
| <!-- Global modal accessibility/focus fix --> | |
| <script> | |
| (function() { | |
| let lastModalTrigger = null; | |
| // Track only the last element that opened a modal | |
| document.body.addEventListener('click', function(e) { | |
| const modalTrigger = e.target.closest('[data-bs-toggle="modal"],[data-bs-target]'); | |
| if (modalTrigger) { | |
| lastModalTrigger = modalTrigger; | |
| } | |
| }); | |
| // Restore focus to the trigger when any modal is closed | |
| document.addEventListener('hidden.bs.modal', function(event) { | |
| if (lastModalTrigger && document.body.contains(lastModalTrigger)) { | |
| setTimeout(() => lastModalTrigger.focus(), 0); | |
| } else { | |
| document.body.focus(); | |
| } | |
| }); | |
| // Also handle ESC key for accessibility | |
| document.addEventListener('keydown', function(event) { | |
| if (event.key === 'Escape' || event.keyCode === 27) { | |
| // Focus will be restored in hidden.bs.modal, but for extra safety: | |
| setTimeout(() => { | |
| if (lastModalTrigger && document.body.contains(lastModalTrigger)) { | |
| lastModalTrigger.focus(); | |
| } else { | |
| document.body.focus(); | |
| } | |
| }, 100); | |
| } | |
| }); | |
| })(); | |
| </script> | |
| {% block scripts %}{% endblock %} | |
| </body> | |
| </html> | |