mirror of
https://github.com/retspen/webvirtcloud
synced 2026-11-08 19:26:48 +00:00
Three upstream rules in webvirtcloud.css set every page's layout
against Bootstrap 5.3:
- .container { max-width: 900px } held each page to 900px at any
screen width, below Bootstrap's own widths. Pages now take
Bootstrap's container widths up to its lg one, 960px, and stop
there on wider screens: its xl and xxl widths (1140px, 1320px) leave
the panel's forms and lists too wide;
- .page-header (margins of 5px 5px 20px 20px) put headings 20px right
of the content under them; its 14 uses are mb-3, flush with the
content (one carried Bootstrap 4's mr-auto, now me-auto);
- p { margin: 10px } indented every paragraph 10px from the content
beside it; paragraphs take Bootstrap's own bottom margin.
webvirtcloud.css keeps only what Bootstrap has no utility for: the
page width cap, the XML editor's place and height, the Tom Select
colour fix, the sortable table headers' arrows, the grouped VM list's
collapsed hosts and the charts' height.
97 lines
3.8 KiB
HTML
97 lines
3.8 KiB
HTML
{% load static %}
|
|
{% load django_bootstrap5 %}
|
|
{% load i18n %}
|
|
<!DOCTYPE html>
|
|
{% get_current_language as LANGUAGE_CODE %}<html lang="{{ LANGUAGE_CODE }}">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
|
<meta name="description" content="WebVirtCloud panel for manage virtual machine">
|
|
<meta name="author" content="anatoliy.guskov@gmail.com">
|
|
|
|
<title>{% block title %}{% endblock %}</title>
|
|
|
|
<!-- Bootstrap Core CSS -->
|
|
{# error pages render without app_settings: they get zephyr #}
|
|
{% with theme=app_settings.BOOTSTRAP_THEME|default:"zephyr" %}<link href="{% static "css/themes/"|add:theme|add:".min.css" %}" rel="stylesheet" id="wvc_css">{% endwith %}
|
|
|
|
<!-- WebVirtCloud CSS -->
|
|
<link href="{% static "css/webvirtcloud.css" %}" rel="stylesheet">
|
|
|
|
<!-- Aditional CSS -->
|
|
{% block style %}{% endblock %}
|
|
|
|
<!-- Custom Fonts -->
|
|
<link href="{% static "css/bootstrap-icons.min.css" %}" rel="stylesheet" type="text/css">
|
|
|
|
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
|
|
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
|
|
<!--[if lt IE 9]>
|
|
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
|
|
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
|
|
<![endif]-->
|
|
<link rel="shortcut icon" href="{% static 'favicon.ico' %}">
|
|
</head>
|
|
|
|
<body class="pb-5"{% block body_attrs %}{% endblock %}>
|
|
|
|
{% if request.user.is_authenticated %}
|
|
{% include 'navbar.html' %}
|
|
{% endif %}
|
|
|
|
<div role="main" class="container">
|
|
<div>
|
|
<div>
|
|
<div class="float-end">
|
|
{% block page_heading_extra %}
|
|
{% endblock page_heading_extra %}
|
|
</div>
|
|
<h3 class="mb-3">
|
|
{% block page_heading %}
|
|
{% endblock page_heading %}
|
|
</h3>
|
|
</div>
|
|
</div>
|
|
<div id="messages">{% bootstrap_messages %}</div>
|
|
{% block content %}{% endblock %}
|
|
</div>
|
|
|
|
<!-- Bootstrap core JavaScript
|
|
================================================== -->
|
|
<!-- Placed at the end of the document so the pages load faster -->
|
|
<!-- jQuery -->
|
|
<script src="{% static 'js/jquery.js' %}"></script>
|
|
<!-- Bootstrap Core JavaScript -->
|
|
<script src="{% static 'js/bootstrap.bundle.min.js' %}"></script>
|
|
<!-- JavaScript Cookie -->
|
|
<script src="{% static 'js/js.cookie.js' %}"></script>
|
|
<!-- Table sorting -->
|
|
<script src="{% static 'js/tablesort.min.js' %}"></script>
|
|
<script src="{% static 'js/tablesort.number.min.js' %}"></script>
|
|
<script src="{% static 'js/sort_tables.js' %}"></script>
|
|
<script>
|
|
// After a refused submission, start at the error. The places an error
|
|
// can be, most specific first: a refused field, its form's summary, an
|
|
// open dialog's copy of the messages (the page's are behind it), the
|
|
// page's messages. A page that sets itself up first has
|
|
// data-error-focus="manual" and calls this when it is ready.
|
|
const ERROR_PLACES = [".is-invalid", ".form-errors", ".modal.show .modal-messages .alert-danger",
|
|
"#messages .alert-danger"];
|
|
|
|
function focusFirstError() {
|
|
for (const selector of ERROR_PLACES) {
|
|
const target = [...document.querySelectorAll(selector)].find(e => e.offsetParent !== null);
|
|
if (target) {
|
|
if (!target.matches("input, select, textarea")) target.tabIndex = -1;
|
|
target.focus();
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
window.focusFirstError = focusFirstError;
|
|
if (document.body.dataset.errorFocus !== "manual") focusFirstError();
|
|
</script>
|
|
{% block script %}{% endblock %}
|
|
</body>
|
|
</html>
|