Migrate bootstrap 4 from bootstrap 3

Closes: #1818. The new navbar collapse handles items better without a scrollbar.

- Switch dependency to newer bootstrap4 library.

- Bootstrap 4 has 5 grid levels instead of 4. Adjust all classes accordingly to
retain current semantics.

- Update for newer markup for dropdowns.

- Replace use for labels with badges. Labels have been removed. Use
badge-secondary instead of label-default.

- Replace use of btn-xs with btn-sm. Size is roughly the same.

- Accommodate removal of form-horizontal.

- .hidden* and .visible* classes have been removed. Use alternate utilities.

- Replace use of table-condensed with table-sm.

- Update progress bar background styling. .progress-bar-* have been replaced
with bg-*.

- Drop support for IE9 and below. Bootstrap 4 does not support those browsers.

- Use the new simplified markup for navs, navbar and navbar-toggler. Accommodate
removal of .navbar-fixed-top.

- Update the JSXC page too.

- Update all values that are using rem units. The base font size is now 1rem =
16px instead of 1rem = 10px. This the default for bootstrap 4.

- A button inside a dropdown menu is natively supported by bootstrap 4. Remove
custom styling done earlier.

- Drop use of removed class thumbnail.

- Override colors for buttons and warnings to keep the old style.

- Use new markup for close buttons inside alerts.

- Use .collapse.show instead of .collapse.in as per bootstrap 4 styling.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: Veiko Aasa <veiko17@disroot.org>
This commit is contained in:
achalaramu 2019-01-16 12:15:39 +05:30 committed by Veiko Aasa
parent 58751d241e
commit 00bc55f762
No known key found for this signature in database
GPG Key ID: 478539CAE680674E
47 changed files with 468 additions and 380 deletions

4
debian/control vendored
View File

@ -17,7 +17,7 @@ Build-Depends:
docbook-xsl,
e2fsprogs,
gir1.2-nm-1.0,
libjs-bootstrap,
libjs-bootstrap4,
python3-all,
python3-apt,
python3-augeas,
@ -84,7 +84,7 @@ Depends:
ldapscripts,
# For gdbus used to call hooks into service
libglib2.0-bin,
libjs-bootstrap,
libjs-bootstrap4,
libjs-jquery,
libjs-modernizr,
lsof,

View File

@ -12,8 +12,8 @@
<p>{% trans "Delete this archive permanently?" %}</p>
<div class="row">
<div class="col-lg-12">
<table class="table table-bordered table-condensed table-striped">
<div class="col-xl-12">
<table class="table table-bordered table-sm table-striped">
<thead>
<th>{% trans "Name" %}</th>
<th>{% trans "Time" %}</th>

View File

@ -65,7 +65,7 @@
</tr>
</thead>
<tbody class="collapse in" id="{{ uuid }}">
<tbody class="collapse show" id="{{ uuid }}">
{% if repository.mounted %}
{% for archive in repository.archives %}

View File

@ -40,7 +40,7 @@
{% trans "How to verify?" %}
</a>
</p>
<div class="collapse panel-body" id="help">
<div class="collapse card-body" id="help">
<p>
{% blocktrans trimmed %}
Run the following command on the SSH host machine. The output

View File

@ -31,7 +31,7 @@
</div>
<div class="row">
<div class="col-sm-6">
<div class="col-md-6">
{% if not libraries %}
<p>{% trans 'No libraries available.' %}</p>
{% else %}

View File

@ -7,12 +7,7 @@
<form class="form form-diagnostics-button" method="post"
action="{% url 'diagnostics:app' app_id %}">
{% csrf_token %}
{% if enabled %}
<input type="submit" class="btn btn-default no-running-status"
value="{% trans "Run Diagnostics" %}"/>
{% else %}
<input type="submit" class="btn btn-default"
value="{% trans "Run Diagnostics" %}" disabled="disabled"/>
{% endif %}
<input type="submit" class="dropdown-item no-running-status"
value="{% trans "Run Diagnostics" %}"
{% if not enabled %} disabled="disabled" {% endif %}/>
</form>

View File

@ -17,11 +17,11 @@
<td>{{ test }}</td>
<td class="diagnostics-result">
{% if result == 'passed' %}
<span class="label label-success">{% trans result %}</span>
<span class="badge badge-success">{% trans result %}</span>
{% elif result == 'failed' %}
<span class="label label-danger">{% trans result %}</span>
<span class="badge badge-danger">{% trans result %}</span>
{% elif result == 'error' %}
<span class="label label-warning">{% trans result %}</span>
<span class="badge badge-warning">{% trans result %}</span>
{% else %}
{{ result }}
{% endif %}

View File

@ -33,7 +33,7 @@
{% block configuration %}
{% if domain_names|length > 0 %}
<h3>Configuration</h3>
<h3>{% trans "Configuration" %}</h3>
<form class="form" method="post">
{% csrf_token %}

View File

@ -38,22 +38,22 @@
<center>
<button data-toggle="collapse"
data-target=".{{component.component_id}}"
class="btn btn-info btn-xs">+</button>
class="btn btn-info btn-sm">+</button>
</center>
</td>
<td><strong>{{ component.name }}</strong></td>
<td>
{% if component.is_enabled %}
<span class='label label-success'>
<span class='badge badge-success'>
{% trans "Enabled" %}</span>
{% else %}
<span class='label label-warning'>
<span class='badge badge-warning'>
{% trans "Disabled" %}</span>
{% endif %}
</td>
</tr>
{% for port in component.ports_details %}
<tr class="collapse out {{component.component_id}}"
<tr class="collapse {{component.component_id}}"
style="background-color: #f9f9f9" >
<td></td>
<td class='cell-indented'><em>{{ port.name }}</em>:
@ -63,16 +63,16 @@
</td>
<td>
{% if port.name in internal_enabled_ports and port.name in external_enabled_ports %}
<span class='label label-success'>
<span class='badge badge-success'>
{% trans "Permitted" %}</span>
{% elif port.name in internal_enabled_ports %}
<span class='label label-warning'>
<span class='badge badge-warning'>
{% trans "Permitted (internal only)" %}</span>
{% elif port.name in external_enabled_ports %}
<span class='label label-warning'>
<span class='badge badge-warning'>
{% trans "Permitted (external only)" %}</span>
{% else %}
<span class='label label-danger'>
<span class='badge badge-danger'>
{% trans "Blocked" %}</span>
{% endif %}
</td>

View File

@ -39,7 +39,7 @@
</div>
<div class="row">
<div class="col-sm-6">
<div class="col-md-6">
{% if not repos %}
<p>{% trans 'No repositories available.' %}</p>
{% else %}

View File

@ -20,7 +20,7 @@
</div>
<div class="row">
<div class="col-sm-6">
<div class="col-md-6">
{% if not sites %}
<p>{% trans "No wikis or blogs available." %}</p>
{% else %}

View File

@ -27,6 +27,14 @@
# THE SOFTWARE.
*/
h1 {
/* From bootstrap 3 .page-header */
text-align: center;
padding-bottom: 0.5625rem;
margin: 2.5rem 0 1.25rem;
border-bottom: 1px solid #eee;
}
/* Elements to hide on page load */
.logout {
display: none;

View File

@ -37,7 +37,7 @@
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="/javascript/bootstrap/css/bootstrap.min.css" media="all"
<link href="/javascript/bootstrap4/css/bootstrap.min.css" media="all"
rel="stylesheet" type="text/css" />
<link href="/javascript/jquery-ui/themes/base/jquery-ui.min.css"
media="all" rel="stylesheet" type="text/css" />
@ -50,7 +50,7 @@
<script src="/javascript/jquery-ui/jquery-ui.min.js"></script>
<script src="/javascript/jquery-slimscroll/jquery.slimscroll.min.js"></script>
<script src="/javascript/jquery-fullscreen/jquery.fullscreen.js"></script>
<script src="/javascript/bootstrap/js/bootstrap.min.js"></script>
<script src="/javascript/bootstrap4/js/bootstrap.bundle.min.js"></script>
<script src="/javascript/jsxc/lib/jsxc.dep.js"></script>
<script src="/javascript/jsxc/jsxc.js"></script>
@ -61,49 +61,49 @@
data-jsxc-root="{% static 'jsxc/libjs-jsxc' %}">
<div class="container" id="content" role="main">
<div class="row">
<div class="col-md-6 col-md-offset-3 col-xs-8 col-xs-offset-2">
<h1 class="page-header text-center">Jabber Chat</h1>
<div class="col-lg-6 offset-lg-3">
<h1>Jabber Chat</h1>
<div class="form form-horizontal">
<div class="form-group">
<label for="xmpp-domain" class="col-xs-4 control-label">
<div class="form">
<div class="form-group row">
<label for="xmpp-domain" class="col-sm-4 col-form-label">
Domain:
</label>
<div class="col-xs-8">
<div class="col-sm-8">
<input type="text" id="xmpp-domain" name="xmpp-domain"
class="form-control" />
<p id="server-flash"></p>
</div>
</div>
<form id="jsxc-login-form" class="form form-horizontal">
<form id="jsxc-login-form" class="form">
<fieldset>
<div class="form-group row">
<label for="jsxc-username" class="col-xs-4 control-label">
<label for="jsxc-username" class="col-sm-4 col-form-label">
Username:
</label>
<div class="col-xs-8">
<div class="col-sm-8">
<input type="text" id="jsxc-username"
class="form-control" />
</div>
</div>
<div class="form-group row">
<label for="jsxc-password" class="col-xs-4 control-label">
<label for="jsxc-password" class="col-sm-4 col-form-label">
Password:
</label>
<div class="col-xs-8">
<div class="col-sm-8">
<input type="password" id="jsxc-password"
class="form-control" />
</div>
</div>
<div class="form-group row">
<div class="col-xs-offset-4 col-xs-8">
<div class="offset-sm-4 col-sm-8">
<button type="submit" id="jsxc-submit"
class="submit btn btn-primary"
data-loading-text="Logging in...">Log in</button>
<button class="logout btn btn-default">Log out</button>
<button class="logout btn btn-secondary">Log out</button>
</div>
</div>
</fieldset>
@ -113,7 +113,7 @@
</div>
</div>
<div class="hidden">
<div class="d-none">
<a href="{% static 'jslicense.html' %}" data-jslicense="1">
{% trans "JavaScript license information" %}</a>
</div>

View File

@ -23,7 +23,7 @@
<h3>{% trans "Status" %}</h3>
{% if status.domains %}
<table class="table table-bordered table-condensed table-striped">
<table class="table table-bordered table-sm table-striped">
<thead>
<tr>
<th>{% trans "Domain" %}</th>
@ -38,13 +38,13 @@
<td>{{ domain }}</td>
<td>
{% if domain_status.certificate_available and domain_status.validity == "valid" %}
<span class="label label-success">
<span class="badge badge-success">
{% blocktrans trimmed with expiry_date=domain_status.expiry_date %}
Valid, expires on {{ expiry_date }}
{% endblocktrans %}
</span>
{% elif domain_status.certificate_available and not domain_status.validity == "valid" %}
<span class="label label-warning">
<span class="badge badge-warning">
{% if "revoked" in domain_status.validity %}
{% blocktrans trimmed %}
Revoked
@ -64,16 +64,16 @@
{% endif %}
</span>
{% else %}
<span class="label label-warning">
<span class="badge badge-warning">
{% trans "No certificate" %}
</span>
{% endif %}
</td>
<td>
{% if domain_status.web_enabled %}
<span class="label label-success">{% trans "Enabled" %}</span>
<span class="badge badge-success">{% trans "Enabled" %}</span>
{% else %}
<span class="label label-warning">{% trans "Disabled" %}</span>
<span class="badge badge-warning">{% trans "Disabled" %}</span>
{% endif %}
</td>
<td>

View File

@ -36,8 +36,10 @@ class PrependWidget(Widget):
field = self.base_widget.render(name, value, attrs, renderer)
widget_html = '''
<div class="input-group">
<span class="input-group-addon">
%(data)s
<span class="input-group-prepend">
<span class="input-group-text">
%(data)s
</span>
</span>
%(field)s
</div>'''

View File

@ -11,8 +11,8 @@
{% if domains %}
<div class="row">
<div class="col-sm-6">
<table class="table table-bordered table-condensed table-striped">
<div class="col-md-6">
<table class="table table-bordered table-sm table-striped">
<thead>
<tr>
<th>{% trans "Address" %}</th>

View File

@ -74,7 +74,7 @@
{% for domain in key.all_domains %}
{% if domain not in key.imported_domains %}
<li>
<span class="label label-default"
<span class="badge badge-secondary"
><span class="fa fa-times"
aria-hidden="true"></span></span>
<span class="monkeysphere-importable-domain"
@ -82,7 +82,7 @@
</li>
{% elif domain not in key.available_domains %}
<li>
<span class="label label-warning"
<span class="badge badge-warning"
><span class="fa fa-exclamation-triangle"
aria-hidden="true"></span></span>
<span class="monkeysphere-unavailable-domain"
@ -90,7 +90,7 @@
</li>
{% else %}
<li>
<span class="label label-success"
<span class="badge badge-success"
><span class="fa fa-check"
aria-hidden="true"></span></span>
<span class="monkeysphere-imported-domain"

View File

@ -10,7 +10,7 @@
<h2>{% trans "Monkeysphere" %}</h2>
<table class="table table-bordered table-condensed table-striped">
<table class="table table-bordered table-sm table-striped">
<tbody>
<tr>
<td>{% trans "OpenPGP Fingerprint" %}</td>

View File

@ -8,7 +8,7 @@
{% block configuration %}
<table class="table table-bordered table-condensed table-striped names-table">
<table class="table table-bordered table-sm table-striped names-table">
<thead>
<tr>
<th>{% trans "Type" %}</th>

View File

@ -21,7 +21,7 @@
{% block content %}
<div class="row">
<div class="col-sm-8 col-sm-offset-2">
<div class="col-md-8 offset-md-2">
<div>
<a href="{% url 'networks:edit' connection.uuid %}"
class="btn btn-primary" role="button"
@ -55,7 +55,7 @@
<div class="list-group-item">
{% trans "Primary connection" %}
<div class="pull-right">
<span class="label label-success">{% trans "yes" %}</span>
<span class="badge badge-success">{% trans "yes" %}</span>
</div>
</div>
{% endif %}
@ -106,10 +106,10 @@
{% trans "Link state" %}
<div class="pull-right">
{% if device.ethernet.carrier %}
<span class='label label-success'>
<span class='badge badge-success'>
{% trans "cable is connected" %}</span>
{% else %}
<span class='label label-warning'>
<span class='badge badge-warning'>
{% trans "please check cable" %}</span>
{% endif %}
</div>
@ -147,7 +147,7 @@
<div class="list-group-item">
{% trans "Signal strength" %}
<div class="pull-right">
<span class="btn btn-primary btn-xs">
<span class="btn btn-primary btn-sm">
{{ access_point.strength }}%
</span>
</div>
@ -255,7 +255,7 @@
<div class="list-group-item">
{% trans "Firewall zone" %}
<div class="pull-right">
<span class="label label-success">{{ connection.zone_string }}</span>
<span class="badge badge-success">{{ connection.zone_string }}</span>
</div>
</div>
</div>
@ -275,7 +275,7 @@
<div class="list-group-item">
{% trans "Firewall zone" %}
<div class="pull-right">
<span class="label label-warning">{{ connection.zone_string }}</span>
<span class="badge badge-warning">{{ connection.zone_string }}</span>
</div>
</div>
</div>
@ -294,7 +294,7 @@
<div class="list-group-item">
{% trans "Firewall zone" %}
<div class="pull-right">
<span class="label label-warning">{% trans "External" %}</span>
<span class="badge badge-danger">{% trans "External" %}</span>
</div>
</div>
</div>

View File

@ -45,19 +45,19 @@
</style>
<div class="row connection-diagram">
<div class="col-sm-2">
<div class="col-md-2">
<img src="{% static 'theme/img/network-internet.svg' %}"
class="col-image network-entity" alt="{% trans "Internet" %}"/>
</div>
<div class="col-sm-3">
<div class="col-md-3">
<img src="{% static 'theme/img/network-spacing.svg' %}"
class="col-image network-spacing hidden-xs"
class="col-image network-spacing d-none d-md-block"
alt="{% trans "Spacing" %}"/>
<img src="{% static 'theme/img/network-connection.svg' %}"
class="col-image network-connection hidden-xs"
class="col-image network-connection d-none d-md-block "
alt="{% trans "Connection" %}"/>
<img src="{% static 'theme/img/network-connection-vertical.svg' %}"
class="network-connection-vertical visible-xs-block"
class="network-connection-vertical d-md-none"
alt="{% trans "Connection" %}"/>
<div class="connection-list">
<p class="connection-list-heading">{% trans "External" %}</p>
@ -77,16 +77,16 @@
{% endfor %}
</div>
</div>
<div class="col-sm-2">
<div class="col-md-2">
<img src="{% static 'theme/img/network-freedombox.svg' %}"
class="col-image network-entity" alt="{{ box_name }}"/>
</div>
<div class="col-sm-3">
<div class="col-md-3">
<img src="{% static 'theme/img/network-spacing.svg' %}"
class="col-image network-spacing hidden-xs"
class="col-image network-spacing d-none d-md-block"
alt="{% trans "Spacing" %}"/>
<img src="{% static 'theme/img/network-connection.svg' %}"
class="col-image network-connection hidden-xs"
class="col-image network-connection d-none d-md-block"
alt="{% trans "Connection" %}"/>
<div class="connection-list">
<p class="connection-list-heading">{% trans "Internal" %}</p>
@ -108,10 +108,10 @@
{% endfor %}
</div>
<img src="{% static 'theme/img/network-connection-vertical.svg' %}"
class="network-connection-vertical visible-xs-block"
class="network-connection-vertical d-md-none"
alt="{% trans "Connection" %}"/>
</div>
<div class="col-sm-2">
<div class="col-md-2">
<img src="{% static 'theme/img/network-computer.svg' %}"
class="col-image network-entity" alt="{% trans "Computer" %}"/>
</div>

View File

@ -50,10 +50,10 @@
{% endif %}
{% if connection.is_active %}
<span class="label label-success connection-status-label">
<span class="badge badge-success connection-status-label">
{% trans "Active" %}</span>
{% else %}
<span class="label label-warning connection-status-label">
<span class="badge badge-warning connection-status-label">
{% trans "Inactive" %}</span>
{% endif %}

View File

@ -11,7 +11,7 @@
<h3>{{ title }}</h3>
<div class="row">
<div class="col-sm-6">
<div class="col-md-6">
<div class="list-group">
{% for access_point in access_points %}
<div class="list-group-item clearfix">
@ -23,7 +23,7 @@
{% else %}
--
{% endif %}
<span class="btn btn-primary btn-xs pull-right">
<span class="btn btn-primary btn-sm pull-right">
{{ access_point.strength }}%
</span>
</div>

View File

@ -22,7 +22,7 @@
{% endblocktrans %}
</p>
<p class="bg-warning">
<p class="alert alert-warning">
{% blocktrans trimmed %}
<b>Warning:</b> Existing client profiles will be invalidated by this operation. All
OpenVPN users on {{ box_name }} must download their new profiles. OpenVPN

View File

@ -31,10 +31,10 @@
{% if is_enabled %}
<h3>{% trans "Shares" %}</h3>
<p>
{% blocktrans trimmed %}
Note: Only specially created directories will be shared on selected disks,
not the whole disk.
{% endblocktrans %}
{% blocktrans trimmed %}
Note: Only specially created directories will be shared on selected
disks, not the whole disk.
{% endblocktrans %}
</p>
{% for disk in disks %}
@ -48,11 +48,11 @@
<div class="progress">
<div class="progress-bar progress-bar-striped
{% if disk.percent_used < 75 %}
progress-bar-success
bg-success
{% elif disk.percent_used < 90 %}
progress-bar-warning
bg-warning
{% else %}
progress-bar-danger
bg-danger
{% endif %}"
role="progressbar" aria-valuenow="{{ disk.percent_used }}"
aria-valuemin="0" aria-valuemax="100"

View File

@ -31,7 +31,7 @@
{% if not shares %}
<p>{% trans 'No shares currently configured.' %}</p>
{% else %}
<table class="table table-bordered table-condensed table-striped" id="shares-list">
<table class="table table-bordered table-sm table-striped" id="shares-list">
<thead>
<tr>
<th>{% trans "Name" %}</th>

View File

@ -7,10 +7,10 @@
{% load i18n %}
{% block configuration %}
<form class="form-horizontal" method="post">
<form id="snapshot-configure" class="form-horizontal" method="post">
{% csrf_token %}
<h3>{% trans "Configuration" %}</h3>
{{ form|bootstrap_horizontal:'col-sm-4' }}
{{ form|bootstrap_horizontal:'col-md-4' }}
<input type="submit" class="btn btn-primary" name="update"
value="{% trans "Update setup" %}"/>
</form>

View File

@ -11,7 +11,7 @@
<p>{% trans "Delete the following snapshots permanently?" %}</p>
<table class="table table-bordered table-condensed table-striped">
<table class="table table-bordered table-sm table-striped">
<thead>
<th>{% trans "Number" %}</th>
<th>{% trans "Date" %}</th>

View File

@ -11,20 +11,17 @@
<form class="form" method="post">
<div class="button-table">
<div class="button-row row">
{% csrf_token %}
<div class="col-xs-6 text-left">
<input type="submit" class="btn btn-primary" name="create"
value="{% trans 'Create Snapshot' %}"/>
</div>
<div class="col-xs-6 text-right">
<input type="submit" class="btn btn-danger" name="delete_selected"
value="{% trans 'Delete Snapshots' %}"
{{ has_deletable_snapshots|yesno:',disabled="disabled"' }}/>
</div>
<div class="btn-toolbar">
{% csrf_token %}
<input type="submit" class="btn btn-primary" name="create"
value="{% trans 'Create Snapshot' %}"/>
<input type="submit" class="btn btn-danger button-secondary"
name="delete_selected"
value="{% trans 'Delete Snapshots' %}"
{{ has_deletable_snapshots|yesno:',disabled="disabled"' }}/>
</div>
<table class="table table-bordered table-condensed table-striped">
<table class="table table-bordered table-sm table-striped">
<thead>
<th>{% trans "Number" %}</th>
<th>{% trans "Date" %}</th>
@ -38,12 +35,12 @@
<td>
{{ snapshot.number }}
{% if snapshot.is_default %}
<span class="label label-default">
<span class="badge badge-secondary">
{% trans "will be used at next boot" %}
</span>
{% endif %}
{% if snapshot.is_active %}
<span class="label label-success">
<span class="badge badge-success">
{% trans "in use" %}
</span>
{% endif %}

View File

@ -19,7 +19,7 @@
{% endblocktrans %}
</p>
<table class="table table-bordered table-condensed table-striped">
<table class="table table-bordered table-sm table-striped">
<thead>
<th>{% trans "Number" %}</th>
<th>{% trans "Date" %}</th>

View File

@ -12,7 +12,7 @@
<div class="row">
{% csrf_token %}
<div class="col-sm-4 col-sm-offset-4">
<div class="col-md-4 offset-md-4">
{{ form|bootstrap }}
<div class="text-center">

View File

@ -19,7 +19,7 @@
<p>{% trans "The following storage devices are in use:" %}</p>
<table class="table table-bordered table-condensed table-striped">
<table class="table table-bordered table-sm table-striped">
<thead>
<tr>
<th>{% trans "Device" %}</th>
@ -42,11 +42,11 @@
<div class="progress">
<div class="progress-bar progress-bar-striped
{% if disk.percent_used < 75 %}
progress-bar-success
bg-success
{% elif disk.percent_used < 90 %}
progress-bar-warning
bg-warning
{% else %}
progress-bar-danger
bg-danger
{% endif %}"
role="progressbar" aria-valuenow="disk.percent_used"
aria-valuemin="0" aria-valuemax="100"

View File

@ -19,7 +19,7 @@
{{ block.super }}
{% if status.hs_enabled %}
<table class="table table-bordered table-condensed table-striped tor-hs">
<table class="table table-bordered table-sm table-striped tor-hs">
<thead>
<tr>
<th>{% trans "Onion Service" %}</th>
@ -63,8 +63,8 @@
{% endblocktrans %}
</p>
<div class="row">
<div class="col-sm-6">
<table class="table table-bordered table-condensed table-striped tor-relay-ports">
<div class="col-md-6">
<table class="table table-bordered table-sm table-striped tor-relay-ports">
<thead>
<tr>
<th>{% trans "Service" %}</th>

View File

@ -31,7 +31,7 @@
</div>
<div class="row">
<div class="col-sm-6">
<div class="col-md-6">
<div class="list-group">
{% for user in object_list %}
<div class="list-group-item clearfix">

View File

@ -25,7 +25,7 @@
{% block status %}
{% if is_running is not None and not is_running %}
<div id='service-not-running' role="alert"
class="alert alert-danger {{ is_enabled|yesno:',hidden' }}">
class="alert alert-danger {{ is_enabled|yesno:',d-none' }}">
{% blocktrans trimmed with service_name=app_info.name %}
Service <em>{{ service_name }}</em> is not running.
{% endblocktrans %}

View File

@ -6,11 +6,7 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
{% endcomment %}
<!doctype html>
<!--[if lt IE 7 ]> <html class="ie ie6 no-js" lang="en"> <![endif]-->
<!--[if IE 7 ]> <html class="ie ie7 no-js" lang="en"> <![endif]-->
<!--[if IE 8 ]> <html class="ie ie8 no-js" lang="en"> <![endif]-->
<!--[if IE 9 ]> <html class="ie ie9 no-js" lang="en"> <![endif]-->
<!--[if gt IE 9]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
<html class="no-js" lang="en">
<!-- the "no-js" class is for Modernizr -->
<head>
<meta charset="utf-8" />
@ -52,7 +48,7 @@
<link rel="apple-touch-icon" sizes="114x114" href="{% static 'theme/img/apple-touch-icon-114px-precomposed.png' %}"/>
<!-- Bootstrap base CSS -->
<link rel="stylesheet" href="{% static '/javascript/bootstrap/css/bootstrap.min.css' %}"/>
<link rel="stylesheet" href="{% static '/javascript/bootstrap4/css/bootstrap.min.css' %}"/>
<link rel="stylesheet" href="{% static '/javascript/fork-awesome/css/fork-awesome.css' %}"/>
<link rel="stylesheet" href="{% static 'theme/css/main.css' %}"/>
<!-- Local link to system Modernizr (includes HTML5 Shiv) -->
@ -61,7 +57,7 @@
<!-- TODO Deferring jQuery is causing scripts to be loaded before jQuery is available -->
<script type="text/javascript" src="{% static '/javascript/jquery/jquery.min.js' %}"></script>
<!-- Local link to system Bootstrap JS -->
<script type="text/javascript" src="{% static '/javascript/bootstrap/js/bootstrap.min.js' %}" defer></script>
<script type="text/javascript" src="{% static '/javascript/bootstrap4/js/bootstrap.bundle.min.js' %}" defer></script>
<script type="text/javascript" src="{% static 'theme/js/main.js' %}" defer></script>
@ -80,21 +76,9 @@
data-refresh-page-sec="{{ refresh_page_sec }}"
{% endif %}>
<div id="wrapper">
<!--[if lt IE 7]><p class=chromeframe>Your browser is <em>ancient!</em> <a href="http://mozilla.org/firefox">Upgrade to a modern version of Firefox</a> to experience this site.</p><![endif]-->
<div class="navbar navbar-fixed-top navbar-default main-header" role="navigation">
<div class="main-header fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse"
data-target=".navbar-collapse">
<span class="sr-only">{% trans "Toggle navigation" %}</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<ul class="nav navbar-nav">
{% include "notifications-dropdown.html" %}
</ul>
<nav class="navbar navbar-expand-md">
{% block mainmenu_left %}
<a href="{% url 'index' %}" class="navbar-brand
@ -103,123 +87,138 @@
<i class="fa fa-freedombox fa-2x fa-inverse" aria-hidden="true"></i>
</a>
{% endblock %}
</div>
<div class="collapse navbar-collapse">
<ul class="nav navbar-nav">
{% block mainmenu_left_collapse %}
{% if user.is_authenticated and user_is_admin %}
<li>
{% url 'index' as index_url %}
<a href="{{ index_url }}" title='{% trans "Home" %}'
class="{% if not submenu.url %}
menu_link_active {% else %} menu_link {% endif %}">
{% trans "Home" %}
</a>
</li>
<li>
{% url 'apps' as apps_url %}
<a href="{{ apps_url }}" title='{% trans "Apps" %}'
class="{% if apps_url == submenu.url %}
menu_link_active {% else %} menu_link {% endif %}">
<span class="fa fa-th"></span>
{% trans "Apps" %}
</a>
</li>
<li>
{% url 'system' as system_url %}
<a href="{{ system_url }}" title='{% trans "System" %}'
class="{% if system_url == submenu.url %}
menu_link_active {% else %} menu_link {% endif %}">
<span class="fa fa-cog nav-icon"></span>
{% trans "System" %}
</a>
</li>
{% endif %}
{% endblock %}
<ul class="navbar-nav">
{% include "notifications-dropdown.html" %}
</ul>
<ul class="nav navbar-nav navbar-right">
{% block mainmenu_right %}
{% if user.is_authenticated %}
<button class="navbar-toggler" type="button" data-toggle="collapse"
data-target="#navbar-collapse" aria-controls="navbar-collapse"
aria-expanded="false" aria-label="Toggle navigation">
<span class="fa fa-bars"></span>
</button>
{% include "notifications-dropdown.html" %}
<div class="collapse navbar-collapse" id="navbar-collapse">
<ul class="navbar-nav flex-grow-1">
{% block mainmenu_left_collapse %}
{% if user.is_authenticated and user_is_admin %}
<li class="nav-item">
{% url 'index' as index_url %}
<a href="{{ index_url }}" title='{% trans " Home" %}'
class="nav-link {% if not submenu.url %}
menu_link_active {% else %} menu_link {% endif %}">
{% trans "Home" %}
</a>
</li>
<li class="nav-item">
{% url 'apps' as apps_url %}
<a href="{{ apps_url }}" title='{% trans " Apps" %}'
class="nav-link {% if apps_url == submenu.url %}
menu_link_active {% else %} menu_link {% endif %}">
<span class="fa fa-th nav-icon"></span>
{% trans "Apps" %}
</a>
</li>
<li class="nav-item">
{% url 'system' as system_url %}
<a href="{{ system_url }}" title='{% trans " System" %}'
class="nav-link {% if system_url == submenu.url %}
menu_link_active {% else %} menu_link {% endif %}">
<span class="fa fa-cog nav-icon"></span>
{% trans "System" %}
</a>
</li>
{% endif %}
{% endblock %}
</ul>
<ul class="navbar-nav">
{% block mainmenu_right %}
{% include "help-menu.html" %}
{% if user.is_authenticated %}
<li id="id_user_menu" class="dropdown">
<a href="{% url 'users:edit' request.user.username %}"
class="dropdown-toggle" data-toggle="dropdown"
role="button" aria-expanded="false">
<i class="fa fa-user nav-icon"></i>
{{ request.user.username }}
<span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu">
<li>
<a id="id_user_edit_menu"
href="{% url 'users:edit' request.user.username %}"
title="{% trans "Edit"%}">
{% trans "Edit" %}
</a>
</li>
<li>
<a id='id_change_password_menu'
href="{% url 'users:change_password' request.user.username %}"
title="{% trans "Change password" %}">
{% trans "Change password" %}
</a>
</li>
<li class="divider hidden-xs"></li>
{% if user_is_admin %}
<li class="hidden-xs">
<a href="{% url 'power:restart' %}"
title="{% trans "Restart"%}">
{% trans "Restart" %}
{% include "notifications-dropdown.html" %}
{% include "help-menu.html" %}
<li id="id_user_menu" class="nav-item dropdown">
<a href="{% url 'users:edit' request.user.username %}"
class="nav-link dropdown-toggle" data-toggle="dropdown"
role="button" aria-expanded="false" aria-haspopup="true"
id="id_user_menu_link">
<i class="fa fa-user nav-icon"></i>
{{ request.user.username }}
</a>
<ul class="dropdown-menu" role="menu"
aria-labelledby="id_user_menu_link">
<li>
<a id="id_user_edit_menu" class="dropdown-item"
href="{% url 'users:edit' request.user.username %}"
title="{% trans "Edit"%}">
{% trans "Edit" %}
</a>
</li>
<li class="hidden-xs">
<a href="{% url 'power:shutdown' %}"
title="{% trans "Shut down" %}">
{% trans "Shut down" %}
<li>
<a id="id_change_password_menu" class="dropdown-item"
href="{% url 'users:change_password' request.user.username %}"
title="{% trans "Change password" %}">
{% trans "Change password" %}
</a>
</li>
<li class="divider hidden-xs"></li>
{% endif %}
<li>
<a href="{% url 'users:logout' %}"
title="{% trans "Log out" %}">
{% trans "Log out" %}
</a>
</li>
</ul>
</li>
{% else %}
<li>
<a href="{% url 'language-selection' %}?next={{ request.path|iriencode }}"
title="{% trans "Select language" %}">
<span class="fa fa-globe-w nav-icon"></span>
<span class="nav-text hidden-sm hidden-md hidden-lg">
{% trans "Select language" %}
</span>
</a>
</li>
<li>
<a href="{% url 'users:login' %}" title="{% trans "Log in" %}">
<li class="dropdown-divider d-none d-md-block"></li>
{% if user_is_admin %}
<li>
<a class="dropdown-item" href="{% url 'power:restart' %}"
title="{% trans "Restart"%}">
{% trans "Restart" %}
</a>
</li>
<li>
<a class="dropdown-item" href="{% url 'power:shutdown' %}"
title="{% trans "Shut down" %}">
{% trans "Shut down" %}
</a>
</li>
<li class="dropdown-divider d-none d-md-block"></li>
{% endif %}
<li>
<a class="dropdown-item" href="{% url 'users:logout' %}"
title="{% trans "Log out" %}">
{% trans "Log out" %}
</a>
</li>
</ul>
</li>
{% else %}
<li class="nav-item">
<a class="nav-link"
href="{% url 'language-selection' %}?next={{ request.path|iriencode }}"
title="{% trans "Select language" %}">
<span class="fa fa-globe-w nav-icon"></span>
<span class="nav-text d-inline-block d-md-none">
{% trans "Select language" %}
</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{% url 'users:login' %}"
title="{% trans "Log in" %}">
<i class="fa fa-user nav-icon"></i>
{% trans "Log in" %}</a>
</li>
{% endif %}
</li>
{% endif %}
{% if user.is_authenticated %}
<li id="logout-nojs">
<a href="{% url 'users:logout' %}" title="{% trans "Log out" %}">
<i class="fa fa-times-circle nav-icon"></i>
{% trans "Log out" %}</a>
</li>
{% endif %}
{% endblock %}
</ul>
</div>
{% if user.is_authenticated %}
<li id="logout-nojs" class="nav-item">
<a class="nav-link" href="{% url 'users:logout' %}"
title="{% trans "Log out" %}">
<i class="fa fa-times-circle nav-icon"></i>
{% trans "Log out" %}</a>
</li>
{% endif %}
{% endblock %}
</ul>
</div>
</nav>
{% include "notifications.html" %}
</div>
@ -243,7 +242,7 @@
{% endblock %}
</div>
<div class="hidden">
<div class="d-none">
<a href="{% static 'jslicense.html' %}" data-jslicense="1">
{% trans "JavaScript license information" %}</a>
</div>

View File

@ -4,7 +4,7 @@
{% load static %}
<div class="card thumbnail">
<div class="card">
<a href="{{ item.url }}" class="nav-link">
<div class="card-title">{{ item.name }}</div>
<div class="card-icon">

View File

@ -9,7 +9,7 @@
{% block container %}
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="col-lg-8 offset-lg-2">
{% include 'messages.html' %}
</div>
</div>

View File

@ -4,45 +4,45 @@
{% load i18n %}
<li class="dropdown">
<li id="id_help_menu" class="dropdown nav-item">
<a href="{% url 'help:index' %}" title="{% trans "Help" %}"
class="dropdown-toggle" data-toggle="dropdown"
role="button" aria-expanded="false">
class="nav-link dropdown-toggle" data-toggle="dropdown"
role="button" aria-expanded="false" aria-haspopup="true"
id="id_help_menu_link">
<span class="fa fa-question-circle nav-icon"></span>
<span class="nav-text hidden-sm hidden-md hidden-lg">
<span class="nav-text d-md-none">
{% trans "Help" %}
</span>
<span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu">
<ul class="dropdown-menu" role="menu" aria-labelledby="id_help_menu_link">
<li>
<a href="{% url 'help:manual' %}"
<a href="{% url 'help:manual' %}" class="dropdown-item"
title="{% trans "Manual" context "User guide" %}">
{% trans "Manual" context "User guide" %}
</a>
</li>
<li role="separator" class="divider hidden-xs"></li>
<li role="separator" class="dropdown-divider d-none d-md-block"></li>
<li>
<a href="{% url 'help:support' %}"
<a href="{% url 'help:support' %}" class="dropdown-item"
title="{% trans "Get Support" %}">
{% trans "Get Support" %}
</a>
</li>
<li>
<a href="{% url 'help:feedback' %}"
<a href="{% url 'help:feedback' %}" class="dropdown-item"
title="{% trans "Submit Feedback" %}">
{% trans "Submit Feedback" %}
</a>
</li>
<li>
<a href="{% url 'help:contribute' %}"
<a href="{% url 'help:contribute' %}" class="dropdown-item"
title="{% trans "Contribute" %}">
{% trans "Contribute" %}
</a>
</li>
<li role="separator" class="divider hidden-xs"></li>
<li role="separator" class="dropdown-divider d-none d-md-block"></li>
<li>
<a href="{% url 'help:about' %}"
<a href="{% url 'help:about' %}" class="dropdown-item"
title="{% trans "About" %}">
{% trans "About" %}
</a>

View File

@ -63,7 +63,7 @@
{% for shortcut in shortcuts %}
{% if shortcut.is_enabled %}
{% if user.is_authenticated or not shortcut.login_required %}
<div class="card thumbnail">
<div class="card">
{% if selected_shortcut.component_id == shortcut.component_id %}
<a href="{{ shortcut.url }}" class="nav-link active">
{% else %}
@ -122,7 +122,7 @@
</p>
<div class="row">
<div class="col-md-2 col-md-offset-3">
<div class="col-lg-2 offset-lg-3">
<p>
<a href="https://wiki.debian.org/FreedomBox/Manual">
{% trans "Manual" context "User guide"%}
@ -132,7 +132,7 @@
<a href="https://wiki.debian.org/FreedomBox">{% trans "Wiki" %}</a>
</p>
</div>
<div class="col-md-2">
<div class="col-lg-2">
<p>
<a href="https://freedombox.org">{% trans "Homepage" %}</a>
</p>
@ -148,7 +148,7 @@
</a>
</p>
</div>
<div class="col-md-2">
<div class="col-lg-2">
<p>
<a href="https://webchat.oftc.net/?randomnick=1&channels=freedombox&prompt=1">
{%trans "IRC Chatroom" %}

View File

@ -7,7 +7,7 @@
{% block internal_zone_warning %}
{% for component in firewall %}
{% if not component.is_external %}
<div class="bg-warning">
<div class="alert alert-warning" role="alert">
{% blocktrans trimmed with service_name=component.name %}
<em>{{ service_name }}</em> is available only on internal networks or when the client is connected to {{ box_name }} through VPN.
{% endblocktrans %}

View File

@ -6,7 +6,10 @@
{% for message in messages %}
<div class='alert alert-{{ message.tags }} alert-dismissable'>
<a class="close" data-dismiss="alert">&times;</a>
{{ message }}
<button type="button" class="close" data-dismiss="alert"
aria-label="{% trans "Close" %}">
<span aria-hidden="true">&times;</span>
</button>
</div>
{% endfor %}

View File

@ -7,15 +7,15 @@
{% load i18n %}
{% if notifications %}
<li class="dropdown notifications-dropdown">
<a href="#" title="{% trans "Notifications" %}" class="dropdown-toggle"
data-toggle="dropdown" role="button" aria-expanded="false"
<li class="nav-item dropdown notifications-dropdown">
<a href="#" title="{% trans "Notifications" %}"
class="nav-link dropdown-toggle" data-toggle="dropdown"
role="button" aria-expanded="false" aria-haspopup="true"
data-target=".notifications">
<span class="fa fa-bell nav-icon"></span>
<span class="badge badge-{{ notifications_max_severity }}">
<span class="badge badge-pill badge-{{ notifications_max_severity }}">
{{ notifications|length }}
</span>
<span class="caret"></span>
</a>
</li>
{% endif %}

View File

@ -6,9 +6,9 @@
<ul class="nav nav-tabs">
{% for urlitem in subsubmenu %}
<li {% if urlitem.active %} class="active"{% endif %}
role="presentation">
<a href="{{ urlitem.url }}">{{ urlitem.text }}</a>
<li class="nav-item" role="presentation">
<a class="{% if urlitem.active %} active {% endif %} nav-link"
href="{{ urlitem.url }}">{{ urlitem.text }}</a>
</li>
{% endfor %}
</ul>

View File

@ -11,28 +11,9 @@
{% include "clients-button.html" with clients=app_info.clients enabled=is_enabled %}
{% if has_diagnostics %}
<!-- Single button -->
<div class="btn-group button-extra-actions">
<button type="button" class="btn btn-default dropdown-toggle"
data-toggle="dropdown" aria-haspopup="true"
aria-expanded="false">
<span class="fa fa-cog" aria-hidden="true"></span>
<span class="caret"></span>
</button>
<ul class="dropdown-menu">
{% if has_diagnostics %}
<li>
{% include "diagnostics_button.html" with app_id=app_id enabled=is_enabled %}
</li>
{% endif %}
</ul>
</div>
{% endif %}
{% if app_info.donation_url %}
<a target="_blank" rel="noopener noreferrer"
class="btn btn-default button-donate" role="button"
class="btn btn-default button-secondary button-donate" role="button"
href="{{ app_info.donation_url }}">
<span class="fa fa-heart"></span>
{% trans "Donate" %}
@ -40,6 +21,22 @@
</a>
{% endif %}
{% if has_diagnostics %}
<!-- Single button -->
<div class="btn-group button-secondary">
<button type="button" class="btn btn-default dropdown-toggle"
data-toggle="dropdown" aria-haspopup="true"
aria-expanded="false" id="id_extra_actions_button">
<span class="fa fa-cog" aria-hidden="true"></span>
</button>
<div class="dropdown-menu" aria-labelledby="id_extra_actions_button">
{% if has_diagnostics %}
{% include "diagnostics_button.html" with app_id=app_id enabled=is_enabled %}
{% endif %}
</div>
</div>
{% endif %}
</div>
<div class="toolbar-collapsed-content">
{% include "clients.html" with clients=app_info.clients enabled=is_enabled %}

View File

@ -464,7 +464,7 @@ def networks_set_firewall_zone(browser, zone):
""""Set the network device firewall zone as internal or external."""
nav_to_module(browser, 'networks')
device = browser.find_by_xpath(
'//span[contains(@class, "label-success") '
'//span[contains(@class, "badge-success") '
'and contains(@class, "connection-status-label")]/following::a').first
network_id = device['href'].split('/')[-3]
device.click()

View File

@ -69,12 +69,91 @@
font-weight: 800;
}
/*
* Bootstrap override
*/
/* Heading margins from bootstrap 3 */
h1, h2, h3, h4, h5, h6 {
margin-top: 1.25rem;
margin-bottom: 0.625rem;
}
/* Warning colors from bootstrap 3 */
.badge-warning,
.bg-warning,
.btn-warning {
background-color: #f0ad4e !important;
color: #fff;
}
.btn[disabled] {
cursor: not-allowed !important;
opacity: .65;
box-shadow: none;
}
/* Primary color changed in bootstrap 4 */
.btn-primary {
background-color: #337ab7;
border-color: #2e6da4;
}
.btn-primary:hover,
.btn-primary:active,
.btn-primary:focus,
.btn-primary:disabled,
.btn-primary.disabled,
.btn-primary[disabled] {
background-color: #286090;
border-color: #204d74;
}
/* Default style removed in bootstrap 4 */
.btn-default {
color: #333;
background-color: #fff;
border-color: #ccc;
}
.btn-default:hover,
.btn-default:focus,
.btn-default:active {
color: #333;
background-color: #e6e6e6;
border-color: #adadad;
}
/* Help block removed from bootstrap 4, needs updated django-bootstrap-from */
.help-block {
display: block;
margin-top: 5px;
margin-bottom: 10px;
color: #737373;
}
/* form-horizontal removed in bootstrap, needs updated django-bootstrap-form */
.form-horizontal > .form-group {
display: flex;
flex-wrap: wrap;
margin-right: -15px;
margin-left: -15px;
}
.radio .help-block {
padding-left: 1.2rem;
}
.checkbox .help-block {
padding-left: 1.4rem;
}
/*
* Basic styling
*/
body {
padding-top: 6em;
position: relative;
font-family: Lato, sans-serif;
font-size: 15px;
background: url('../img/noise.png') var(--background-color);
}
@ -94,25 +173,35 @@ body {
list-style-type: none;
}
.nav .fa {
.navbar .fa:not(.fa-bars) {
margin-right: 4px;
}
.navbar-brand .fa {
float: left;
margin-top: -19px;
margin-top: -7px;
padding: 8px;
}
.navbar-brand {
height: 53px;
margin-right: -30px;
margin-right: -20px;
}
@media (max-width: 767px) {
.navbar-brand {
margin-right: auto;
}
}
.nav-tabs {
margin-bottom: 20px;
}
.dropdown-toggle::after {
vertical-align: middle;
}
.running-status-parent {
display: inline-block;
}
@ -148,30 +237,13 @@ body {
}
}
.form-diagnostics-button {
display: block;
}
.form-diagnostics-button .btn {
width: 100%;
border-radius: 0;
border: none;
text-align: left;
padding: 3px 20px;
}
.form-diagnostics-button .btn:hover,
.form-diagnostics-button .btn:focus {
background-color: var(--neutral-light-color)
}
/* Hide log out button if user dropdown is available */
.js #logout-nojs {
display: none;
}
/* Hide the dropdown icon when javascript is not available */
.no-js .nav .dropdown .caret {
.no-js .dropdown-toggle:after {
display: none;
}
@ -247,7 +319,7 @@ footer {
}
#clients .btn {
width: 8em;
width: 9em;
margin-right: 1em;
}
@ -278,42 +350,49 @@ footer {
text-align: right;
}
/* applying styles to header - begin */
/*
* Top navigation
*/
.main-header {
background: var(--freedombox-blue-color);
box-shadow: 0 4px 6px 0 rgba(0, 0, 0, 0.25);
border: none;
}
.main-header .navbar-nav>li>a {
.main-header > .container > nav.navbar {
padding: 0;
}
.main-header .navbar-nav > li > a,
.main-header .navbar-toggler {
color: #FFF;
}
.main-header.navbar-default .navbar-nav>li>a:focus,
.main-header.navbar-default .navbar-nav>li>a:hover,
.main-header.navbar-default .navbar-nav>.active>a,
.main-header.navbar-default .navbar-nav>.active>a:hover,
.main-header.navbar-default .navbar-nav>.active>a:focus,
.main-header.navbar-default .navbar-nav>.open>a,
.main-header.navbar-default .navbar-nav>.open>a:hover,
.main-header.navbar-default .navbar-nav>.open>a:focus {
color: #FFF;
background: transparent;
.main-header .nav-item .nav-link {
padding: 15px !important;
height: 52px;
}
.main-header .navbar-toggler {
border: 1px solid #ddd;
}
@media screen and (max-width: 767px) {
.main-header.navbar-default .navbar-nav>.open .dropdown-menu > li > a,
.main-header.navbar-default .navbar-nav>.open .dropdown-menu > li > a:hover {
.main-header .navbar-nav .dropdown-menu {
background-color: var(--freedombox-blue-color);
}
.main-header .navbar-nav > li > a:focus,
.main-header .navbar-nav > li > a:hover,
.main-header .navbar-nav .show a,
.main-header .navbar-nav .show a:hover,
.main-header .navbar-nav .show a:focus {
color: #FFF;
background: transparent;
}
}
.navbar-default .navbar-toggle .icon-bar {
background-color: #FFF;
}
/* applying styles to header - end */
/* Cards in Apps, System and Help pages */
.card-list {
display: flex;
flex-wrap: wrap;
@ -325,8 +404,8 @@ footer {
font-style: italic;
font-weight: 800;
font-size: 20px;
padding: 0 4.6rem;
margin: 2rem 0;
padding: 0 2.875rem;
margin: 1.25rem 0;
}
.card-section-title:before, .card-section-title:after {
@ -334,7 +413,7 @@ footer {
content: '';
flex: 1;
border-bottom: var(--neutral-dark-color) solid 2px;
margin: auto 1.8rem;
margin: auto 1.125rem;
}
a.menu_link {
@ -350,13 +429,16 @@ a.menu_link_active {
}
.card {
display: block;
line-height: 1.42857143;
text-align: center;
box-shadow: 0 3px 5px 0 rgba(0,0,0,0.12);
width: 16rem;
width: 10rem;
padding: 0;
margin: 0 10px 20px;
border: none;
border-radius: 8px;
transition: border .2s ease-in-out;
}
.card:hover {
@ -374,6 +456,7 @@ a.menu_link_active {
font-weight: 800;
font-size: 20px;
padding: 12px 0;
margin-bottom: 0;
}
.card-description {
@ -407,7 +490,7 @@ a.menu_link_active {
/* System page - special card styling */
.system-page .card {
text-align: left;
width: 23rem;
width: 14.375rem;
}
.system-page .card .nav-link {
@ -443,7 +526,7 @@ a.menu_link_active {
grid-row: 2;
grid-column: 2;
padding: 0;
min-height: 1.8rem;
min-height: 1.125rem;
}
/* Button table - Tables with a list of actions as buttons on top */
@ -451,25 +534,16 @@ a.menu_link_active {
margin-top: 10px;
}
.bg-warning {
margin: 10px 0;
padding: 15px;
}
.bg-warning p:last-child {
margin: 0;
}
.index-page .card-list:before,
.apps-page .card-list:before,
.system-page .card-list:before {
position: relative;
width: 40rem;
height: 40rem;
margin-left: -40rem;
margin-bottom: -40rem;
left: 30rem;
top: -2rem;
width: 25rem;
height: 25rem;
margin-left: -25rem;
margin-bottom: -25rem;
left: 18.75rem;
top: -1.25rem;
content: " ";
background-size: 100%;
background-repeat: no-repeat;
@ -573,9 +647,19 @@ input[type='submit'].running-status-button {
margin-bottom: 10px;
}
.btn-toolbar .button-extra-actions,
.btn-toolbar .button-donate {
float: right;
.btn-toolbar > :not(:last-child):not(.running-status-button-before) {
margin-right: 0.5rem;
}
.btn-toolbar .button-secondary:first-child,
.btn-toolbar .btn:not(.button-secondary) + .button-secondary,
.btn-toolbar .btn:not(.button-secondary) + .running-status-button-before {
margin-left: auto;
}
.btn-toolbar > .running-status-button-before {
margin-bottom: 0;
align-self: center;
}
/*
@ -611,9 +695,9 @@ input[type='submit'].running-status-button {
}
.app-titles h3 {
margin-top: -0.5rem;
margin-bottom: 1.6rem;
font-size: 1.6rem;
margin-top: -0.3125rem;
margin-bottom: 1rem;
font-size: 1rem;
font-weight: normal;
font-style: italic;
}
@ -678,12 +762,12 @@ input[type='submit'].running-status-button {
border-top-left-radius: 0;
border-top-right-radius: 0;
margin-top: 0;
background-clip: border-box;
}
/* Style for individual notification */
.notification {
padding: 1rem 1.5rem;
font-size: 15px;
padding: 0.625rem 0.9375rem;
border-left: 5px solid;
}
@ -697,9 +781,9 @@ input[type='submit'].running-status-button {
img.notification-icon {
display: inline-block;
width: 1.4rem;
height: 1.4rem;
margin-top: -0.4rem;
width: 0.875rem;
height: 0.875rem;
margin-top: -0.25rem;
}
/* Show badge with various colors and overlap it onto icon */
@ -709,6 +793,7 @@ img.notification-icon {
color: #fff;
}
/* TODO: match with or use bootstrap 4 colors */
.badge-exception, .badge-error {
background-color: var(--error-color);
}
@ -733,19 +818,21 @@ img.notification-icon {
border-left-color: var(--info-color)
}
/* Don't collapse notifications on small screens */
.collapsing .notifications-dropdown,
.collapse.in .notifications-dropdown {
/* Two different notifications for each small and one for large screens */
.notifications-dropdown {
display: none;
}
.navbar-header .navbar-nav {
float: right;
margin: 6px 10px;
.collapse .notifications-dropdown {
display: block;
}
@media(min-width:768px) {
.navbar-header .navbar-nav {
@media screen and (max-width: 767px) {
.notifications-dropdown {
display: block;
}
.collapse .notifications-dropdown {
display: none;
}
}