Upgrade to Bootstrap v5 (#457)

This commit is contained in:
rubenwardy 2023-08-22 19:58:43 +01:00 committed by GitHub
parent 70362ff7a6
commit 9df80d212e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
92 changed files with 505 additions and 477 deletions

@ -26,6 +26,9 @@ from sqlalchemy.orm import joinedload, subqueryload
from sqlalchemy.sql.expression import func from sqlalchemy.sql.expression import func
PKGS_PER_ROW = 5
@bp.route("/gamejam/") @bp.route("/gamejam/")
def gamejam(): def gamejam():
return redirect("https://forum.minetest.net/viewtopic.php?t=28802") return redirect("https://forum.minetest.net/viewtopic.php?t=28802")
@ -55,18 +58,18 @@ def home():
Package.collections.any(and_(Collection.name == "spotlight", Collection.author.has(username="ContentDB")))) \ Package.collections.any(and_(Collection.name == "spotlight", Collection.author.has(username="ContentDB")))) \
.order_by(func.random()).limit(6).all() .order_by(func.random()).limit(6).all()
new = package_load(query.order_by(db.desc(Package.approved_at))).limit(4).all() new = package_load(query.order_by(db.desc(Package.approved_at))).limit(PKGS_PER_ROW).all()
pop_mod = package_load(query.filter_by(type=PackageType.MOD).order_by(db.desc(Package.score))).limit(8).all() pop_mod = package_load(query.filter_by(type=PackageType.MOD).order_by(db.desc(Package.score))).limit(2*PKGS_PER_ROW).all()
pop_gam = package_load(query.filter_by(type=PackageType.GAME).order_by(db.desc(Package.score))).limit(8).all() pop_gam = package_load(query.filter_by(type=PackageType.GAME).order_by(db.desc(Package.score))).limit(2*PKGS_PER_ROW).all()
pop_txp = package_load(query.filter_by(type=PackageType.TXP).order_by(db.desc(Package.score))).limit(8).all() pop_txp = package_load(query.filter_by(type=PackageType.TXP).order_by(db.desc(Package.score))).limit(2*PKGS_PER_ROW).all()
high_reviewed = package_load(query.order_by(db.desc(Package.score - Package.score_downloads))) \ high_reviewed = package_load(query.order_by(db.desc(Package.score - Package.score_downloads))) \
.filter(Package.reviews.any()).limit(4).all() .filter(Package.reviews.any()).limit(PKGS_PER_ROW).all()
updated = package_load(db.session.query(Package).select_from(PackageRelease).join(Package) updated = package_load(db.session.query(Package).select_from(PackageRelease).join(Package)
.filter_by(state=PackageState.APPROVED) .filter_by(state=PackageState.APPROVED)
.order_by(db.desc(PackageRelease.releaseDate)) .order_by(db.desc(PackageRelease.releaseDate))
.limit(20)).all() .limit(20)).all()
updated = updated[:4] updated = updated[:PKGS_PER_ROW]
reviews = review_load(PackageReview.query.filter(PackageReview.rating > 3) reviews = review_load(PackageReview.query.filter(PackageReview.rating > 3)
.order_by(db.desc(PackageReview.created_at))).limit(5).all() .order_by(db.desc(PackageReview.created_at))).limit(5).all()

@ -289,7 +289,7 @@ def handle_create_edit(package: typing.Optional[Package], form: PackageForm, aut
"danger") "danger")
else: else:
flash(markupsafe.Markup( flash(markupsafe.Markup(
f"<a class='btn btn-sm btn-danger float-right' href='{package.get_url('packages.view')}'>View</a>" + f"<a class='btn btn-sm btn-danger float-end' href='{package.get_url('packages.view')}'>View</a>" +
gettext("Package already exists")), "danger") gettext("Package already exists")), "danger")
return None return None

@ -10,9 +10,9 @@ as it was submitted as university coursework. To learn about the history and dev
ContentDB is open source software, licensed under AGPLv3.0. ContentDB is open source software, licensed under AGPLv3.0.
<a href="https://github.com/minetest/contentdb/" class="btn btn-primary mr-1">Source code</a> <a href="https://github.com/minetest/contentdb/" class="btn btn-primary me-1">Source code</a>
<a href="https://github.com/minetest/contentdb/issues/" class="btn btn-secondary mr-1">Issue tracker</a> <a href="https://github.com/minetest/contentdb/issues/" class="btn btn-secondary me-1">Issue tracker</a>
<a href="https://rubenwardy.com/contact/" class="btn btn-secondary mr-1">Contact admin</a> <a href="https://rubenwardy.com/contact/" class="btn btn-secondary me-1">Contact admin</a>
<a href="https://monitor.rubenwardy.com/d/3ELzFy3Wz/contentdb" class="btn btn-secondary">Stats / monitoring</a> <a href="https://monitor.rubenwardy.com/d/3ELzFy3Wz/contentdb" class="btn btn-secondary">Stats / monitoring</a>
## Why was ContentDB created? ## Why was ContentDB created?
@ -36,4 +36,4 @@ for a guide to making mods and games using Minetest.
You can donate to rubenwardy to cover ContentDB's costs and support future You can donate to rubenwardy to cover ContentDB's costs and support future
development. development.
<a href="https://rubenwardy.com/donate/" class="btn btn-primary mr-1">Donate</a> <a href="https://rubenwardy.com/donate/" class="btn btn-primary me-1">Donate</a>

@ -75,11 +75,11 @@ function addPackage(pkg) {
<article class="card my-3" data-id="${escapeHtml(id)}"> <article class="card my-3" data-id="${escapeHtml(id)}">
<div class="card-body"> <div class="card-body">
<div class="row"> <div class="row">
<div class="col-auto text-muted pr-2"> <div class="col-auto text-muted pe-2">
<i class="fas fa-bars"></i> <i class="fas fa-bars"></i>
</div> </div>
<div class="col"> <div class="col">
<button class="btn btn-sm btn-danger remove-package float-right" type="button" aria-label="Remove"> <button class="btn btn-sm btn-danger remove-package float-end" type="button" aria-label="Remove">
<i class="fas fa-trash"></i> <i class="fas fa-trash"></i>
</button> </button>
<h5> <h5>
@ -90,14 +90,14 @@ function addPackage(pkg) {
<p class="text-muted"> <p class="text-muted">
${escapeHtml(pkg.short_description)} ${escapeHtml(pkg.short_description)}
</p> </p>
<div class="form-group"> <input id="package_ids-${nextId}" name="package_ids-${nextId}" type="hidden" value="${id}">
<label for="descriptions-${nextId}">Short Description</label> <input id="package_removed-${nextId}" name="package_removed-${nextId}" type="hidden" value="0">
<div>
<label for="descriptions-${nextId}" class="form-label">Short Description</label>
<input class="form-control" id="descriptions-${nextId}" maxlength="500" minlength="0" <input class="form-control" id="descriptions-${nextId}" maxlength="500" minlength="0"
name="descriptions-${nextId}" type="text" value=""> name="descriptions-${nextId}" type="text" value="">
<small class="form-text text-muted">You can replace the description with your own</small> <small class="form-text text-muted">You can replace the description with your own</small>
</div> </div>
<input id="package_ids-${nextId}" name="package_ids-${nextId}" type="hidden" value="${id}">
<input id="package_removed-${nextId}" name="package_removed-${nextId}" type="hidden" value="0">
</div> </div>
</div> </div>
</div> </div>
@ -128,7 +128,7 @@ function updateResults(packages) {
result.innerText = `${pkg.title} by ${pkg.author}`; result.innerText = `${pkg.title} by ${pkg.author}`;
if (alreadyAdded.includes(`${pkg.author}/${pkg.name}`)) { if (alreadyAdded.includes(`${pkg.author}/${pkg.name}`)) {
result.classList.add("active"); result.classList.add("active");
result.innerHTML = "<i class='fas fa-check mr-3 text-success'></i>" + result.innerHTML; result.innerHTML = "<i class='fas fa-check me-3 text-success'></i>" + result.innerHTML;
} }
result.addEventListener("click", () => addPackage(pkg)); result.addEventListener("click", () => addPackage(pkg));
results.appendChild(result); results.appendChild(result);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -78,12 +78,12 @@ function add_summary_card(title, icon, value, extra) {
<div class="card h-100"> <div class="card h-100">
<div class="card-body align-items-center text-center"> <div class="card-body align-items-center text-center">
<div class="mt-0 mb-3"> <div class="mt-0 mb-3">
<i class="fas fa-${icon} mr-1"></i> <i class="fas fa-${icon} me-1"></i>
<span class="summary-title"></span> <span class="summary-title"></span>
</div> </div>
<div class="my-0 h4"> <div class="my-0 h4">
<span class="summary-value"></span> <span class="summary-value"></span>
<small class="text-muted ml-2 summary-extra"></small> <small class="text-muted ms-2 summary-extra"></small>
</div> </div>
</div> </div>
</div> </div>

@ -58,7 +58,7 @@ $(function() {
} }
}) })
const btn = $("#forums").parent().find("label").append("<a class='ml-3 btn btn-sm btn-primary'>Open</a>"); const btn = $("#forums").parent().find("label").append("<a class='ms-3 btn btn-sm btn-primary'>Open</a>");
btn.click(function() { btn.click(function() {
const id = $("#forums").val(); const id = $("#forums").val();
if (/^\d+$/.test(id)) { if (/^\d+$/.test(id)) {

@ -19,8 +19,9 @@ function setVoteCount(button, count) {
if (!badge) { if (!badge) {
badge = document.createElement("span") badge = document.createElement("span")
badge.classList.add("badge"); badge.classList.add("badge");
badge.classList.add("badge-light"); badge.classList.add("bg-light");
badge.classList.add("badge-ml-1"); badge.classList.add("text-dark");
badge.classList.add("ms-1");
button.appendChild(badge); button.appendChild(badge);
} }

@ -50,7 +50,7 @@
text = text.substr(0, idx); text = text.substr(0, idx);
} }
$('<span class="badge badge-pill badge-primary"/>') $('<span class="badge roaded-pill bg-primary"/>')
.text(text + ' ') .text(text + ' ')
.data("id", id) .data("id", id)
.append('<a>x</a>') .append('<a>x</a>')

@ -9,8 +9,8 @@ document.querySelectorAll(".video-embed").forEach(ele => {
if (url.host == "www.youtube.com") { if (url.host == "www.youtube.com") {
ele.addEventListener("click", () => { ele.addEventListener("click", () => {
ele.parentNode.classList.add("d-block"); ele.parentNode.classList.add("d-block");
ele.classList.add("embed-responsive"); ele.classList.add("ratio");
ele.classList.add("embed-responsive-16by9"); ele.classList.add("ratio-16x9");
ele.innerHTML = ` ele.innerHTML = `
<iframe title="YouTube video player" frameborder="0" <iframe title="YouTube video player" frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"

@ -32,6 +32,14 @@
} }
} }
.badge {
text-decoration: none;
}
a.badge:hover {
filter: brightness(0.9);
}
.bulletselector { .bulletselector {
height: auto !important; height: auto !important;
display: inline-block !important; display: inline-block !important;
@ -51,6 +59,7 @@
white-space: nowrap; white-space: nowrap;
background: transparent; background: transparent;
} }
.bulletselector .badge { .bulletselector .badge {
float: left; float: left;
padding: 0.4em 0.8em; padding: 0.4em 0.8em;
@ -272,3 +281,7 @@ blockquote {
margin-bottom: 0 !important; margin-bottom: 0 !important;
} }
} }
.form-group {
margin-bottom: 1rem !important;
}

@ -123,8 +123,9 @@ pre {
.jumbotron { .jumbotron {
background-size: cover; background-size: cover;
background-repeat: no-repeat; background: #111 no-repeat center;
background-position: center; padding: 3rem 0 1rem 0;
color: white;
.btn-outline-secondary { .btn-outline-secondary {
color: rgba(255, 255, 255, 0.8); color: rgba(255, 255, 255, 0.8);
@ -180,11 +181,11 @@ pre {
} }
#featuredCarousel { #featuredCarousel {
.embed-responsive-item { .ratio > * {
filter: brightness(0.85); filter: brightness(0.85);
object-fit: cover; object-fit: cover;
} }
.carousel-item, .embed-responsive-item { .carousel-item, .ratio {
max-height: 50vh; max-height: 50vh;
} }
.carousel-inner { .carousel-inner {

@ -78,3 +78,14 @@
padding: 0; padding: 0;
margin: 0 0.75em; margin: 0 0.75em;
} }
.jumbotron {
background-size: cover;
background-repeat: no-repeat;
background-position: center;
padding: 2rem 1rem;
margin-bottom: 2rem;
background-color: #303030;
border-radius: .3rem;
}

@ -6,7 +6,7 @@
{% block content %} {% block content %}
{% if entry.url %} {% if entry.url %}
<a class="float-right btn btn-primary" href="{{ entry.url }}">View</a> <a class="float-end btn btn-primary" href="{{ entry.url }}">View</a>
{% endif %} {% endif %}
<h1>{{ entry.title }}</h1> <h1>{{ entry.title }}</h1>

@ -9,7 +9,7 @@
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<a class="btn btn-primary float-right" href="{{ url_for('admin.create_edit_license') }}">New License</a> <a class="btn btn-primary float-end" href="{{ url_for('admin.create_edit_license') }}">New License</a>
<a class="btn btn-secondary mb-4" href="{{ url_for('admin.license_list') }}">Back to list</a> <a class="btn btn-secondary mb-4" href="{{ url_for('admin.license_list') }}">Back to list</a>
{% from "macros/forms.html" import render_field, render_checkbox_field, render_submit_field %} {% from "macros/forms.html" import render_field, render_checkbox_field, render_submit_field %}

@ -5,7 +5,7 @@ Licenses
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<a class="btn btn-primary float-right" href="{{ url_for('admin.create_edit_license') }}">{{ _("New License") }}</a> <a class="btn btn-primary float-end" href="{{ url_for('admin.create_edit_license') }}">{{ _("New License") }}</a>
<h1>{{ _("Licenses") }}</h1> <h1>{{ _("Licenses") }}</h1>
@ -13,7 +13,7 @@ Licenses
{% for l in licenses %} {% for l in licenses %}
<a class="list-group-item list-group-item-action" <a class="list-group-item list-group-item-action"
href="{{ url_for('admin.create_edit_license', name=l.name) }}"> href="{{ url_for('admin.create_edit_license', name=l.name) }}">
<span class="float-right badge {% if l.is_foss %}badge-primary{% else %}badge-warning{% endif %} badge-pill"> <span class="float-end badge {% if l.is_foss %}bg-primary{% else %}bg-warning{% endif %} roaded-pill">
{{ l.is_foss and "Free" or "Non-free"}} {{ l.is_foss and "Free" or "Non-free"}}
</span> </span>
{{ l.name }} {{ l.name }}

@ -28,14 +28,14 @@
<form method="post" action="" class="card-body"> <form method="post" action="" class="card-body">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" /> <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
<div class="row px-3"> <div class="row px-3">
<select name="action" class="custom-select col"> <select name="action" class="form-select col">
{% for id, action in actions.items() %} {% for id, action in actions.items() %}
<option value="{{ id }}" {% if loop.first %}selected{% endif %}> <option value="{{ id }}" {% if loop.first %}selected{% endif %}>
{{ action["title"] }} {{ action["title"] }}
</option> </option>
{% endfor %} {% endfor %}
</select> </select>
<input type="submit" value="Perform" class="col-sm-auto btn btn-primary ml-2" /> <input type="submit" value="Perform" class="col-sm-auto btn btn-primary ms-2" />
</div> </div>
</form> </form>
</div> </div>

@ -11,7 +11,7 @@
<form method="post" action="" class="card-body"> <form method="post" action="" class="card-body">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" /> <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
<div class=""> <div class="">
<select name="package" class="custom-select px-3" required> <select name="package" class="form-select px-3" required>
<option disabled selected>-- please select --</option> <option disabled selected>-- please select --</option>
{% for p in deleted_packages %} {% for p in deleted_packages %}
<option value="{{ p.id }}"> <option value="{{ p.id }}">
@ -21,8 +21,8 @@
</select> </select>
<div class="mt-3"> <div class="mt-3">
<input type="submit" name="submit" value="To Draft" class="col-sm-auto btn btn-warning" /> <input type="submit" name="submit" value="To Draft" class="col-sm-auto btn btn-warning" />
<input type="submit" name="submit" value="To Changes Needed" class="col-sm-auto btn btn-danger ml-2" /> <input type="submit" name="submit" value="To Changes Needed" class="col-sm-auto btn btn-danger ms-2" />
<input type="submit" name="submit" value="To Ready for Review" class="col-sm-auto btn btn-success ml-2" /> <input type="submit" name="submit" value="To Ready for Review" class="col-sm-auto btn btn-success ms-2" />
</div> </div>
</div> </div>
</form> </form>

@ -9,7 +9,7 @@
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<a class="btn btn-primary float-right" href="{{ url_for('admin.create_edit_tag') }}">New Tag</a> <a class="btn btn-primary float-end" href="{{ url_for('admin.create_edit_tag') }}">New Tag</a>
<a class="btn btn-secondary mb-4" href="{{ url_for('admin.tag_list') }}">Back to list</a> <a class="btn btn-secondary mb-4" href="{{ url_for('admin.tag_list') }}">Back to list</a>
{% from "macros/forms.html" import render_field, render_submit_field, render_checkbox_field %} {% from "macros/forms.html" import render_field, render_submit_field, render_checkbox_field %}
@ -23,7 +23,7 @@
{% endif %} {% endif %}
{{ render_submit_field(form.submit) }} {{ render_submit_field(form.submit) }}
{% if tag %} {% if tag %}
<a class="ml-5" target="_blank" href="{{ url_for('packages.list_all', tag=tag.name) }}"> <a class="ms-5" target="_blank" href="{{ url_for('packages.list_all', tag=tag.name) }}">
View packages with tag View packages with tag
</a> </a>
{% endif %} {% endif %}

@ -5,11 +5,11 @@
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<a class="btn btn-primary float-right" href="{{ url_for('admin.create_edit_tag') }}">{{ _("New Tag") }}</a> <a class="btn btn-primary float-end" href="{{ url_for('admin.create_edit_tag') }}">{{ _("New Tag") }}</a>
<h1>{{ _("Tags") }}</h1> <h1>{{ _("Tags") }}</h1>
<p class="float-right"> <p class="float-end">
Sort by: Sort by:
<a href="{{ url_set_query(sort='name') }}">Name</a> | <a href="{{ url_set_query(sort='name') }}">Name</a> |
<a href="{{ url_set_query(sort='views') }}">Views</a> <a href="{{ url_set_query(sort='views') }}">Views</a>

@ -9,7 +9,7 @@
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<a class="btn btn-primary float-right" href="{{ url_for('admin.create_edit_version') }}">New Version</a> <a class="btn btn-primary float-end" href="{{ url_for('admin.create_edit_version') }}">New Version</a>
<a class="btn btn-secondary mb-4" href="{{ url_for('admin.version_list') }}">Back to list</a> <a class="btn btn-secondary mb-4" href="{{ url_for('admin.version_list') }}">Back to list</a>
{% from "macros/forms.html" import render_field, render_submit_field %} {% from "macros/forms.html" import render_field, render_submit_field %}

@ -5,7 +5,7 @@
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<a class="btn btn-primary float-right" href="{{ url_for('admin.create_edit_version') }}">{{ _("New Version") }}</a> <a class="btn btn-primary float-end" href="{{ url_for('admin.create_edit_version') }}">{{ _("New Version") }}</a>
<h1>{{ _("Minetest Versions") }}</h1> <h1>{{ _("Minetest Versions") }}</h1>

@ -9,7 +9,7 @@
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<a class="btn btn-primary float-right" href="{{ url_for('admin.create_edit_warning') }}">New Warning</a> <a class="btn btn-primary float-end" href="{{ url_for('admin.create_edit_warning') }}">New Warning</a>
<a class="btn btn-secondary mb-4" href="{{ url_for('admin.warning_list') }}">Back to list</a> <a class="btn btn-secondary mb-4" href="{{ url_for('admin.warning_list') }}">Back to list</a>
{% from "macros/forms.html" import render_field, render_submit_field %} {% from "macros/forms.html" import render_field, render_submit_field %}

@ -5,7 +5,7 @@
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<a class="btn btn-primary float-right" href="{{ url_for('admin.create_edit_warning') }}">{{ _("New Warning") }}</a> <a class="btn btn-primary float-end" href="{{ url_for('admin.create_edit_warning') }}">{{ _("New Warning") }}</a>
<h1>{{ _("Warnings") }}</h1> <h1>{{ _("Warnings") }}</h1>

@ -12,7 +12,7 @@
{% block content %} {% block content %}
{% if token %} {% if token %}
<form class="float-right" method="POST" action="{{ url_for('api.delete_token', username=token.owner.username, id=token.id) }}"> <form class="float-end" method="POST" action="{{ url_for('api.delete_token', username=token.owner.username, id=token.id) }}">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/> <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
<input class="btn btn-danger" type="submit" value="{{ _('Delete') }}"> <input class="btn btn-danger" type="submit" value="{{ _('Delete') }}">
</form> </form>

@ -5,8 +5,8 @@
{% endblock %} {% endblock %}
{% block pane %} {% block pane %}
<a class="btn btn-primary float-right" href="{{ url_for('api.create_edit_token', username=user.username) }}">{{ _("Create") }}</a> <a class="btn btn-primary float-end" href="{{ url_for('api.create_edit_token', username=user.username) }}">{{ _("Create") }}</a>
<a class="btn btn-secondary mr-2 float-right" href="/help/api/">{{ _("API Documentation") }}</a> <a class="btn btn-secondary me-2 float-end" href="/help/api/">{{ _("API Documentation") }}</a>
<h2 class="mt-0">{{ _("API Tokens") }}</h2> <h2 class="mt-0">{{ _("API Tokens") }}</h2>
<div class="list-group"> <div class="list-group">

@ -15,7 +15,7 @@
<meta name="og:description" content="{{ self.description() | normalize_whitespace }}"> <meta name="og:description" content="{{ self.description() | normalize_whitespace }}">
{%- endif %} {%- endif %}
<link rel="stylesheet" type="text/css" href="/static/libs/bootstrap.min.css"> <link rel="stylesheet" type="text/css" href="/static/libs/bootstrap.min.css?v=2">
<link rel="stylesheet" type="text/css" href="/static/custom.css?v=42"> <link rel="stylesheet" type="text/css" href="/static/custom.css?v=42">
<link rel="search" type="application/opensearchdescription+xml" href="/static/opensearch.xml" title="ContentDB" /> <link rel="search" type="application/opensearchdescription+xml" href="/static/opensearch.xml" title="ContentDB" />
@ -29,12 +29,12 @@
<nav class="navbar navbar-expand-lg navbar-dark bg-primary"> <nav class="navbar navbar-expand-lg navbar-dark bg-primary">
<div class="container"> <div class="container">
<a class="navbar-brand" href="/">{{ config.USER_APP_NAME }}</a> <a class="navbar-brand" href="/">{{ config.USER_APP_NAME }}</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarColor01" aria-controls="navbarColor01" aria-expanded="false" aria-label="Toggle navigation"> <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarColor01" aria-controls="navbarColor01" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span> <span class="navbar-toggler-icon"></span>
</button> </button>
<div class="collapse navbar-collapse" id="navbarColor01"> <div class="collapse navbar-collapse" id="navbarColor01">
<ul class="navbar-nav mr-auto"> <ul class="navbar-nav me-auto">
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="{{ url_for('packages.list_all', type='mod') }}">{{ _("Mods") }}</a> <a class="nav-link" href="{{ url_for('packages.list_all', type='mod') }}">{{ _("Mods") }}</a>
</li> </li>
@ -51,24 +51,22 @@
<a class="nav-link" href="{{ url_for('flatpage', path='help') }}">{{ _("Help") }}</a> <a class="nav-link" href="{{ url_for('flatpage', path='help') }}">{{ _("Help") }}</a>
</li> </li>
</ul> </ul>
<form class="form-inline my-2 my-lg-0" method="GET" action="/packages/"> <form class="d-flex my-2 my-lg-0" method="GET" action="/packages/">
{% if type %}<input type="hidden" name="type" value="{{ type }}" />{% endif %} {% if type %}<input type="hidden" name="type" value="{{ type }}" />{% endif %}
<div class="input-group mx-0 my-0"> <div class="input-group m-0">
<input class="form-control" name="q" type="text" <input class="form-control" name="q" type="text"
placeholder="{% if query_hint %}{{ _('Search %(type)s', type=query_hint | lower) }}{% else %}{{ _('Search all packages') }}{% endif %}" placeholder="{% if query_hint %}{{ _('Search %(type)s', type=query_hint | lower) }}{% else %}{{ _('Search all packages') }}{% endif %}"
value="{{ query or ''}}"> value="{{ query or ''}}">
<div class="input-group-append"> <button type="submit" class="btn btn-secondary" title="{{ _('Search') }}">
<button type="submit" class="btn btn-secondary" title="{{ _('Search') }}"> <i class="fas fa-search"></i>
<i class="fas fa-search"></i> </button>
</button>
</div>
</div> </div>
<!-- <input class="btn btn-secondary my-2 my-sm-0" <!-- <input class="btn btn-secondary my-2 my-sm-0"
data-toggle="tooltip" data-placement="bottom" data-bs-toggle="tooltip" data-bs-placement="bottom"
title="Go to the first found result for this query." title="Go to the first found result for this query."
type="submit" name="lucky" value="First" /> --> type="submit" name="lucky" value="First" /> -->
</form> </form>
<ul class="navbar-nav ml-auto"> <ul class="navbar-nav ms-auto">
{% if current_user.is_authenticated %} {% if current_user.is_authenticated %}
{% if todo_list_count is not none %} {% if todo_list_count is not none %}
<li class="nav-item"> <li class="nav-item">
@ -77,7 +75,7 @@
title="{{ _('Work Queue') }}"> title="{{ _('Work Queue') }}">
{% if todo_list_count > 0 %} {% if todo_list_count > 0 %}
<i class="fas fa-inbox"></i> <i class="fas fa-inbox"></i>
<span class="badge badge-pill badge-notify">{{ todo_list_count }}</span> <span class="badge roaded-pill badge-notify">{{ todo_list_count }}</span>
{% else %} {% else %}
<i class="fas fa-inbox" ></i> <i class="fas fa-inbox" ></i>
{% endif %} {% endif %}
@ -101,11 +99,11 @@
<i class="fas fa-bell"></i> <i class="fas fa-bell"></i>
{% set num_notifs = current_user.notifications | length %} {% set num_notifs = current_user.notifications | length %}
{% if num_notifs > 60 %} {% if num_notifs > 60 %}
<span class="badge badge-pill badge-notify badge-emoji"> <span class="badge roaded-pill badge-notify badge-emoji">
😢 😢
</span> </span>
{% else %} {% else %}
<span class="badge badge-pill badge-notify"> <span class="badge roaded-pill badge-notify">
{{ num_notifs }} {{ num_notifs }}
</span> </span>
{% endif %} {% endif %}
@ -124,7 +122,7 @@
<li class="nav-item dropdown"> <li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" <a class="nav-link dropdown-toggle"
data-toggle="dropdown" data-bs-toggle="dropdown"
role="button" role="button"
aria-expanded="false"> aria-expanded="false">
{{ current_user.display_name }} {{ current_user.display_name }}
@ -192,7 +190,7 @@
<li class="nav-item dropdown"> <li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" <a class="nav-link dropdown-toggle"
data-toggle="dropdown" data-bs-toggle="dropdown"
role="button" role="button"
aria-expanded="false"> aria-expanded="false">
<i class="fas fa-language"></i> <i class="fas fa-language"></i>
@ -279,7 +277,7 @@
</footer> </footer>
<script src="/static/libs/jquery.min.js"></script> <script src="/static/libs/jquery.min.js"></script>
<script src="/static/libs/bootstrap.min.js"></script> <script src="/static/libs/bootstrap.min.js?v=2"></script>
<script src="/static/libs/easymde.min.js"></script> <script src="/static/libs/easymde.min.js"></script>
<link rel="stylesheet" type="text/css" href="/static/libs/easymde.min.css"> <link rel="stylesheet" type="text/css" href="/static/libs/easymde.min.css">
<link href="/static/fa/css/all.css" rel="stylesheet"> <link href="/static/fa/css/all.css" rel="stylesheet">

@ -10,13 +10,13 @@
{% block scriptextra %} {% block scriptextra %}
<script src="/static/libs/jquery-ui.min.js"></script> <script src="/static/libs/jquery-ui.min.js"></script>
<script src="/static/collection_editor.js?v=7"></script> <script src="/static/collection_editor.js?v=8"></script>
{% endblock %} {% endblock %}
{% block content %} {% block content %}
{% from "macros/forms.html" import render_field, render_submit_field, render_checkbox_field, render_field_prefix_button %} {% from "macros/forms.html" import render_field, render_submit_field, render_checkbox_field, render_field_prefix_button %}
<form method="POST" action="" enctype="multipart/form-data"> <form method="POST" action="" enctype="multipart/form-data">
{{ render_submit_field(form.submit, class_="btn btn-primary float-right") }} {{ render_submit_field(form.submit, class_="btn btn-primary float-end") }}
<h1>{{ self.title() }}</h1> <h1>{{ self.title() }}</h1>
{{ form.hidden_tag() }} {{ form.hidden_tag() }}
@ -36,10 +36,10 @@
{{ render_field(form.long_description, fieldclass="form-control markdown") }} {{ render_field(form.long_description, fieldclass="form-control markdown") }}
{% endif %} {% endif %}
{% if collection and collection.items %} {% if collection %}
<h2>{{ _("Packages") }}</h2> <h2>{{ _("Packages") }}</h2>
<div class="mb-5"> <div class="mb-5">
<label for="add_package" class="sr-only">Add package</label> <label for="add_package" class="visually-hidden">Add package</label>
<input id="add_package" type="search" class="form-control d-none" placeholder="Add package"> <input id="add_package" type="search" class="form-control d-none" placeholder="Add package">
<p id="add_package_empty" class="mt-2" style="display: none;"> <p id="add_package_empty" class="mt-2" style="display: none;">
<i>{{ _("No results") }}</i> <i>{{ _("No results") }}</i>
@ -52,11 +52,11 @@
<article class="card my-3" data-id="{{ package.get_id() }}"> <article class="card my-3" data-id="{{ package.get_id() }}">
<div class="card-body"> <div class="card-body">
<div class="row"> <div class="row">
<div class="col-auto text-muted pr-2"> <div class="col-auto text-muted pe-2">
<i class="fas fa-bars"></i> <i class="fas fa-bars"></i>
</div> </div>
<div class="col"> <div class="col">
<button class="btn btn-sm btn-danger remove-package float-right" <button class="btn btn-sm btn-danger remove-package float-end"
type="button" aria-label="{{ _('Remove') }}"> type="button" aria-label="{{ _('Remove') }}">
<i class="fas fa-trash"></i> <i class="fas fa-trash"></i>
</button> </button>
@ -68,9 +68,9 @@
<p class="text-muted"> <p class="text-muted">
{{ package.short_desc }} {{ package.short_desc }}
</p> </p>
{{ render_field(form.descriptions[loop.index - 1], hint=_("You can replace the description with your own")) }}
{{ form.package_ids[loop.index - 1]() }} {{ form.package_ids[loop.index - 1]() }}
{{ form.package_removed[loop.index - 1]() }} {{ form.package_removed[loop.index - 1]() }}
{{ render_field(form.descriptions[loop.index - 1], hint=_("You can replace the description with your own"), no_class=True) }}
</div> </div>
</div> </div>
</div> </div>

@ -10,7 +10,7 @@
<h3 class="card-header">{{ self.title() }}</h3> <h3 class="card-header">{{ self.title() }}</h3>
<div class="card-body"> <div class="card-body">
<p>{{ _("Deleting is permanent") }}</p> <p>{{ _("Deleting is permanent") }}</p>
<a class="btn btn-secondary mr-3" href="{{ collection.get_url('collections.create_edit') }}">{{ _("Cancel") }}</a> <a class="btn btn-secondary me-3" href="{{ collection.get_url('collections.create_edit') }}">{{ _("Cancel") }}</a>
<input type="submit" value="{{ _('Delete') }}" class="btn btn-danger" /> <input type="submit" value="{{ _('Delete') }}" class="btn btn-danger" />
</div> </div>
</form> </form>

@ -17,7 +17,7 @@
{% block content %} {% block content %}
{% if user %} {% if user %}
{% if current_user == user or (current_user.is_authenticated and current_user.rank.at_least(current_user.rank.EDITOR)) %} {% if current_user == user or (current_user.is_authenticated and current_user.rank.at_least(current_user.rank.EDITOR)) %}
<a class="btn btn-primary float-right" href="{{ url_for('collections.create_edit', author=user.username) }}"> <a class="btn btn-primary float-end" href="{{ url_for('collections.create_edit', author=user.username) }}">
{{ _("Create") }} {{ _("Create") }}
</a> </a>
{% endif %} {% endif %}
@ -30,17 +30,17 @@
{% for collection in collections -%} {% for collection in collections -%}
<a class="list-group-item list-group-item-action" href="{{ collection.get_url('collections.view') }}"> <a class="list-group-item list-group-item-action" href="{{ collection.get_url('collections.view') }}">
{% if collection.private %} {% if collection.private %}
<i class="fas fa-lock mr-1" style="color:#ffac33;"></i> <i class="fas fa-lock me-1" style="color:#ffac33;"></i>
{% endif %} {% endif %}
{% if collection.name == 'favorites' %} {% if collection.name == 'favorites' %}
<i class="fas fa-star mr-1 text-info"></i> <i class="fas fa-star me-1 text-info"></i>
{% endif %} {% endif %}
{% if user != collection.author %} {% if user != collection.author %}
{{ _("%(title)s by %(author)s", title=collection.title, author=collection.author.display_name) }} {{ _("%(title)s by %(author)s", title=collection.title, author=collection.author.display_name) }}
{% else %} {% else %}
{{ collection.title }} {{ collection.title }}
{% endif %} {% endif %}
<span class="text-muted ml-4"> <span class="text-muted ms-4">
{{ collection.short_description }} {{ collection.short_description }}
</span> </span>
</a> </a>

@ -5,7 +5,7 @@
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<a href="{{ url_for('collections.create_edit', package=package.get_id()) }}" class="btn btn-primary float-right"> <a href="{{ url_for('collections.create_edit', package=package.get_id()) }}" class="btn btn-primary float-end">
{{ _("Create Collection") }} {{ _("Create Collection") }}
</a> </a>
<h1>{{ self.title() }}</h1> <h1>{{ self.title() }}</h1>
@ -20,16 +20,16 @@
<button type="submit" <button type="submit"
class="list-group-item list-group-item-action {% if active %}active{% endif %}"> class="list-group-item list-group-item-action {% if active %}active{% endif %}">
{% if active %} {% if active %}
<i class="fas fa-check mr-3 text-success"></i> <i class="fas fa-check me-3 text-success"></i>
{% else %} {% else %}
<i class="fas fa-square mr-3 text-muted"></i> <i class="fas fa-square me-3 text-muted"></i>
{% endif -%} {% endif -%}
{% if collection.author != current_user %}{{ collection.author.display_name }}: {% endif -%} {% if collection.author != current_user %}{{ collection.author.display_name }}: {% endif -%}
{% if collection.name == 'favorites' %} {% if collection.name == 'favorites' %}
<i class="fas fa-star mr-1 text-info"></i> <i class="fas fa-star me-1 text-info"></i>
{% endif %} {% endif %}
{% if collection.private %} {% if collection.private %}
<i class="fas fa-lock mr-1" style="color:#ffac33;"></i> <i class="fas fa-lock me-1" style="color:#ffac33;"></i>
{% endif %} {% endif %}
{{ collection.title }} {{ collection.title }}
</button> </button>

@ -22,12 +22,12 @@
{%- endblock %} {%- endblock %}
{% block content %} {% block content %}
<div class="float-right"> <div class="float-end">
<a class="btn btn-secondary" href="{{ url_for('collections.list_all', author=collection.author.username) }}"> <a class="btn btn-secondary" href="{{ url_for('collections.list_all', author=collection.author.username) }}">
{{ _("%(author)s's collections", author=collection.author.display_name) }} {{ _("%(author)s's collections", author=collection.author.display_name) }}
</a> </a>
{% if current_user.is_authenticated %} {% if current_user.is_authenticated %}
<form method="POST" action="{{ collection.get_url('collections.clone') }}" class="d-inline-block ml-2"> <form method="POST" action="{{ collection.get_url('collections.clone') }}" class="d-inline-block ms-2">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" /> <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
<button type="submit" class="btn btn-secondary"> <button type="submit" class="btn btn-secondary">
{{ _("Make a copy") }} {{ _("Make a copy") }}
@ -35,10 +35,10 @@
</form> </form>
{% endif %} {% endif %}
{% if collection.check_perm(current_user, "EDIT_COLLECTION") %} {% if collection.check_perm(current_user, "EDIT_COLLECTION") %}
<a class="btn btn-danger ml-2" href="{{ collection.get_url('collections.delete') }}"> <a class="btn btn-danger ms-2" href="{{ collection.get_url('collections.delete') }}">
{{ _("Delete") }} {{ _("Delete") }}
</a> </a>
<a class="btn btn-primary ml-2" href="{{ collection.get_url('collections.create_edit') }}"> <a class="btn btn-primary ms-2" href="{{ collection.get_url('collections.create_edit') }}">
{{ _("Edit") }} {{ _("Edit") }}
</a> </a>
{% endif %} {% endif %}
@ -46,8 +46,8 @@
<h1>{{ self.title() }}</h1> <h1>{{ self.title() }}</h1>
<p class="text-muted"> <p class="text-muted">
{% if collection.private %} {% if collection.private %}
<span class="badge badge-secondary mr-1"> <span class="badge bg-secondary me-1">
<i class="fas fa-lock mr-1" style="color:#ffac33;"></i> <i class="fas fa-lock me-1" style="color:#ffac33;"></i>
{{ _("Private") }} {{ _("Private") }}
</span> </span>
{% endif %} {% endif %}
@ -63,7 +63,7 @@
{% endif %} {% endif %}
<section class="mt-5"> <section class="mt-5">
<h2 class="sr-only">{{ _("Packages") }}</h2> <h2 class="visually-hidden">{{ _("Packages") }}</h2>
{% if not items %} {% if not items %}
<p class="text-muted"> <p class="text-muted">
{{ _("To add a package, go to the package's page and click 'Add to collection'") }} {{ _("To add a package, go to the package's page and click 'Add to collection'") }}
@ -78,12 +78,12 @@
{% endset %} {% endset %}
<div> <div>
<article class="card"> <article class="card">
<div class="embed-responsive embed-responsive-16by9"> <div class="ratio ratio-16x9">
<img class="card-img-top embed-responsive-item" src="{{ item.package.get_thumb_or_placeholder(4) }}" alt="{{ item.package.title }} screenshot"> <img class="card-img-top" src="{{ item.package.get_thumb_or_placeholder(4) }}" alt="{{ item.package.title }} screenshot">
</div> </div>
<div class="card-body"> <div class="card-body">
{% if item.package.state.name != "APPROVED" %} {% if item.package.state.name != "APPROVED" %}
<span class="badge badge-warning float-right"> <span class="badge bg-warning float-end">
{{ item.package.state.value }} {{ item.package.state.value }}
</span> </span>
{% endif %} {% endif %}

@ -27,7 +27,7 @@
style="max-height: 22px; max-width: 22px;" style="max-height: 22px; max-width: 22px;"
src="{{ package.get_thumb_or_placeholder() }}" /> src="{{ package.get_thumb_or_placeholder() }}" />
<span class="pl-2"> <span class="ps-2">
{{ package.title }} {{ package.title }}
</span> </span>
</a> </a>
@ -38,11 +38,11 @@
</div> </div>
<div class="col-sm-auto"> <div class="col-sm-auto">
<a href="{{ package.get_url('packages.view') }}" class="btn btn-sm btn-secondary mr-1"> <a href="{{ package.get_url('packages.view') }}" class="btn btn-sm btn-secondary me-1">
{{ _("View package") }} {{ _("View package") }}
</a> </a>
<a href="{{ package.donate_url_actual }}" class="btn btn-sm btn-primary" rel="nofollow"> <a href="{{ package.donate_url_actual }}" class="btn btn-sm btn-primary" rel="nofollow">
<i class="fas fa-heart mr-1"></i> <i class="fas fa-heart me-1"></i>
{{ _("Donate") }} {{ _("Donate") }}
</a> </a>
</div> </div>

@ -22,26 +22,29 @@
} }
</script> </script>
{% if current_user.is_authenticated %} {% if current_user.is_authenticated %}
<script src="/static/quick_review_voting.js"></script> <script src="/static/quick_review_voting.js?v=2"></script>
{% endif %} {% endif %}
{% endblock %} {% endblock %}
{% block content %} {% block content %}
{% from "macros/packagegridtile.html" import render_pkggrid %} {% from "macros/packagegridtile.html" import render_pkggrid %}
<div id="featuredCarousel" class="carousel slide my-0" data-ride="carousel" data-interval="7500"> <div id="featuredCarousel" class="carousel slide mt-0 mb-5" data-bs-ride="carousel" data-bs-interval="7500">
<ol class="carousel-indicators"> <div class="carousel-indicators">
{% for package in spotlight_pkgs %} {% for package in spotlight_pkgs %}
<li data-target="#featuredCarousel" data-slide-to="{{ loop.index - 1 }}" {% if loop.index == 1 %}class="active"{% endif %}></li> <button
data-bs-target="#featuredCarousel"
data-bs-slide-to="{{ loop.index - 1 }}"
{% if loop.index == 1 %}class="active" aria-current="true"{% endif %}></button>
{% endfor %} {% endfor %}
</ol> </div>
<div class="carousel-inner"> <div class="carousel-inner">
{% for package in spotlight_pkgs %} {% for package in spotlight_pkgs %}
{% set cover_image = package.get_cover_image_url() %} {% set cover_image = package.get_cover_image_url() %}
{% set tags = package.tags | sort(attribute="views", reverse=True) %} {% set tags = package.tags | sort(attribute="views", reverse=True) %}
<div class="carousel-item {% if loop.index == 1 %}active{% endif %}"> <div class="carousel-item {% if loop.index == 1 %}active{% endif %}">
<a href="{{ package.get_url('packages.view') }}"> <a href="{{ package.get_url('packages.view') }}">
<div class="embed-responsive embed-responsive-16by9"> <div class="ratio ratio-16x9">
<img class="embed-responsive-item" src="{{ cover_image }}" <img src="{{ cover_image }}"
alt="{{ _('%(title)s by %(author)s', title=package.title, author=package.author.display_name) }}"> alt="{{ _('%(title)s by %(author)s', title=package.title, author=package.author.display_name) }}">
</div> </div>
<div class="carousel-caption text-shadow"> <div class="carousel-caption text-shadow">
@ -57,17 +60,17 @@
</p> </p>
{% if package.author %} {% if package.author %}
<div class="d-none d-md-block"> <div class="d-none d-md-block">
<span class="mr-2"> <span class="me-2">
{{ package.type.text }} {{ package.type.text }}
</span> </span>
{% for warning in package.content_warnings %} {% for warning in package.content_warnings %}
<span class="badge badge-warning" title="{{ warning.description }}"> <span class="badge bg-warning" title="{{ warning.description }}">
<i class="fas fa-exclamation-circle" style="margin-right: 0.3em;"></i> <i class="fas fa-exclamation-circle" style="margin-right: 0.3em;"></i>
{{ warning.title }} {{ warning.title }}
</span> </span>
{% endfor %} {% endfor %}
{% for t in tags[:3] %} {% for t in tags[:3] %}
<span class="badge badge-primary" title="{{ t.description or '' }}"> <span class="badge bg-primary" title="{{ t.description or '' }}">
{{ t.title }} {{ t.title }}
</span> </span>
{% endfor %} {% endfor %}
@ -88,51 +91,51 @@
</div> </div>
{% endfor %} {% endfor %}
</div> </div>
<a class="carousel-control-prev" href="#featuredCarousel" role="button" data-slide="prev"> <button class="carousel-control-prev" role="button" data-bs-target="#featuredCarousel" data-bs-slide="prev">
<span class="carousel-control-prev-icon" aria-hidden="true"></span> <span class="carousel-control-prev-icon" aria-hidden="true"></span>
<span class="sr-only">{{ _("Previous") }}</span> <span class="visually-hidden">{{ _("Previous") }}</span>
</a> </button>
<a class="carousel-control-next" href="#featuredCarousel" role="button" data-slide="next"> <button class="carousel-control-next" role="button" data-bs-target="#featuredCarousel" data-bs-slide="next">
<span class="carousel-control-next-icon" aria-hidden="true"></span> <span class="carousel-control-next-icon" aria-hidden="true"></span>
<span class="sr-only">{{ _("Next") }}</span> <span class="visually-hidden">{{ _("Next") }}</span>
</a> </button>
</div> </div>
<!-- <div class="text-right mb-5 text-muted" style="opacity: 0.4;"> <!-- <div class="text-end mb-5 text-muted" style="opacity: 0.4;">
<a href="/help/featured/" class="btn"> <a href="/help/featured/" class="btn">
<i class="fas fa-question-circle mr-1"></i> <i class="fas fa-question-circle me-1"></i>
{{ _("Featured") }} {{ _("Featured") }}
</a> </a>
</div> --> </div> -->
<a href="{{ url_for('packages.list_all', sort='approved_at', order='desc') }}" class="btn btn-secondary float-right"> <a href="{{ url_for('packages.list_all', sort='approved_at', order='desc') }}" class="btn btn-secondary float-end">
{{ _("See more") }} {{ _("See more") }}
</a> </a>
<h2 class="my-3">{{ _("Recently Added") }}</h2> <h2 class="my-3">{{ _("Recently Added") }}</h2>
{{ render_pkggrid(new) }} {{ render_pkggrid(new) }}
<a href="{{ url_for('packages.list_all', sort='last_release', order='desc') }}" class="btn btn-secondary float-right"> <a href="{{ url_for('packages.list_all', sort='last_release', order='desc') }}" class="btn btn-secondary float-end">
{{ _("See more") }} {{ _("See more") }}
</a> </a>
<h2 class="my-3">{{ _("Recently Updated") }}</h2> <h2 class="my-3">{{ _("Recently Updated") }}</h2>
{{ render_pkggrid(updated) }} {{ render_pkggrid(updated) }}
<a href="{{ url_for('packages.list_all', type='game', sort='score', order='desc') }}" class="btn btn-secondary float-right"> <a href="{{ url_for('packages.list_all', type='game', sort='score', order='desc') }}" class="btn btn-secondary float-end">
{{ _("See more") }} {{ _("See more") }}
</a> </a>
<h2 class="my-3">{{ _("Top Games") }}</h2> <h2 class="my-3">{{ _("Top Games") }}</h2>
{{ render_pkggrid(pop_gam) }} {{ render_pkggrid(pop_gam) }}
<a href="{{ url_for('packages.list_all', type='mod', sort='score', order='desc') }}" class="btn btn-secondary float-right"> <a href="{{ url_for('packages.list_all', type='mod', sort='score', order='desc') }}" class="btn btn-secondary float-end">
{{ _("See more") }} {{ _("See more") }}
</a> </a>
<h2 class="my-3">{{ _("Top Mods") }}</h2> <h2 class="my-3">{{ _("Top Mods") }}</h2>
{{ render_pkggrid(pop_mod) }} {{ render_pkggrid(pop_mod) }}
<a href="{{ url_for('packages.list_all', type='txp', sort='score', order='desc') }}" class="btn btn-secondary float-right"> <a href="{{ url_for('packages.list_all', type='txp', sort='score', order='desc') }}" class="btn btn-secondary float-end">
{{ _("See more") }} {{ _("See more") }}
</a> </a>
<h2 class="my-3">{{ _("Top Texture Packs") }}</h2> <h2 class="my-3">{{ _("Top Texture Packs") }}</h2>
@ -148,20 +151,20 @@
title="{{ tag.description or '' }}" title="{{ tag.description or '' }}"
href="{{ url_for('packages.list_all', tag=tag.name) }}"> href="{{ url_for('packages.list_all', tag=tag.name) }}">
{{ tag.title }} {{ tag.title }}
<span class="badge badge-pill badge-light ml-1">{{ count }}</span> <span class="badge roaded-pill bg-light text-dark ms-1">{{ count }}</span>
</a> </a>
{% endfor %} {% endfor %}
<div class="clearfix mb-4"></div> <div class="clearfix mb-4"></div>
<a href="{{ url_for('packages.list_all', sort='reviews', order='desc') }}" class="btn btn-secondary float-right"> <a href="{{ url_for('packages.list_all', sort='reviews', order='desc') }}" class="btn btn-secondary float-end">
{{ _("See more") }} {{ _("See more") }}
</a> </a>
<h2 class="my-3">{{ _("Highest Reviewed") }}</h2> <h2 class="my-3">{{ _("Highest Reviewed") }}</h2>
{{ render_pkggrid(high_reviewed) }} {{ render_pkggrid(high_reviewed) }}
<a href="{{ url_for('packages.list_reviews') }}" class="btn btn-secondary float-right"> <a href="{{ url_for('packages.list_reviews') }}" class="btn btn-secondary float-end">
{{ _("See more") }} {{ _("See more") }}
</a> </a>
<h2 class="my-3">{{ _("Recent Positive Reviews") }}</h2> <h2 class="my-3">{{ _("Recent Positive Reviews") }}</h2>

@ -27,7 +27,7 @@
style="max-height: 22px;" style="max-height: 22px;"
src="{{ entry.causer.get_profile_pic_url() }}" /> src="{{ entry.causer.get_profile_pic_url() }}" />
<span class="pl-2">{{ entry.causer.username }}</span> <span class="ps-2">{{ entry.causer.username }}</span>
{% else %} {% else %}
<i>{{ _("Deleted User") }}</i> <i>{{ _("Deleted User") }}</i>
{% endif %} {% endif %}
@ -37,13 +37,13 @@
{{ entry.title}} {{ entry.title}}
{% if entry.description %} {% if entry.description %}
<i class="fas fa-paperclip ml-3"></i> <i class="fas fa-paperclip ms-3"></i>
{% endif %} {% endif %}
</div> </div>
{% if entry.package %} {% if entry.package %}
<div class="col-sm-auto text-muted"> <div class="col-sm-auto text-muted">
<span class="pr-2"> <span class="pe-2">
{{ entry.package.title }} {{ entry.package.title }}
</span> </span>

@ -8,16 +8,16 @@
{% if field.type != 'HiddenField' %} {% if field.type != 'HiddenField' %}
{% if not label and label != "" %}{% set label=field.label.text %}{% endif %} {% if not label and label != "" %}{% set label=field.label.text %}{% endif %}
{% if label %} {% if label %}
<label for="{{ field.id }}" {% if not label_visible %}class="sr-only"{% endif %}> <label for="{{ field.id }}" {% if not label_visible %}class="visually-hidden"{% else %}class="form-label"{% endif %}>
{{ label|safe }} {{ label|safe }}
</label> </label>
{% if field.flags.required and label_visible %} {% if field.flags.required and label_visible %}
<span class="ml-1 text-danger"> <span class="ms-1 text-danger">
<small> <small>
<i class="fas fa-asterisk"></i> <i class="fas fa-asterisk"></i>
</small> </small>
</span> </span>
<span class="ml-3 text-muted"> <span class="ms-3 text-muted">
{{ _("Required") }} {{ _("Required") }}
</span> </span>
{% endif %} {% endif %}
@ -25,8 +25,8 @@
{% endif %} {% endif %}
{% endmacro %} {% endmacro %}
{% macro render_field(field, label=None, label_visible=true, right_url=None, right_label=None, fieldclass=None, hint=None) -%} {% macro render_field(field, label=None, label_visible=true, right_url=None, right_label=None, fieldclass=None, hint=None, no_class=False) -%}
<div class="form-group {% if field.errors %}has-danger{% endif %} {{ kwargs.pop('class_', '') }}"> <div class="{% if not no_class %}form-group mb-3{% endif %} {% if field.errors %}has-danger{% endif %} {{ kwargs.pop('class_', '') }}">
{{ render_label(field, label, label_visible) }} {{ render_label(field, label, label_visible) }}
{{ field(class_=fieldclass or 'form-control', **kwargs) }} {{ field(class_=fieldclass or 'form-control', **kwargs) }}
{% if hint %} {% if hint %}
@ -37,12 +37,10 @@
{%- endmacro %} {%- endmacro %}
{% macro render_field_prefix(field, label=None, prefix="@", label_visible=true, right_url=None, right_label=None, fieldclass=None) -%} {% macro render_field_prefix(field, label=None, prefix="@", label_visible=true, right_url=None, right_label=None, fieldclass=None) -%}
<div class="form-group {% if field.errors %}has-danger{% endif %} {{ kwargs.pop('class_', '') }}"> <div class="form-group mb-3 {% if field.errors %}has-danger{% endif %} {{ kwargs.pop('class_', '') }}">
{{ render_label(field, label, label_visible) }} {{ render_label(field, label, label_visible) }}
<div class="input-group mb-3"> <div class="input-group mb-3">
<div class="input-group-prepend"> <span class="input-group-text" id="basic-addon1">{{ prefix }}</span>
<span class="input-group-text" id="basic-addon1">{{ prefix }}</span>
</div>
{{ field(class_=fieldclass or 'form-control', **kwargs) }} {{ field(class_=fieldclass or 'form-control', **kwargs) }}
</div> </div>
@ -51,12 +49,10 @@
{%- endmacro %} {%- endmacro %}
{% macro render_field_prefix_button(field, label=None, prefix="@", label_visible=true, right_url=None, right_label=None, fieldclass=None, has_view=False, hint=None) -%} {% macro render_field_prefix_button(field, label=None, prefix="@", label_visible=true, right_url=None, right_label=None, fieldclass=None, has_view=False, hint=None) -%}
<div class="form-group {% if field.errors %}has-danger{% endif %} {{ kwargs.pop('class_', '') }}"> <div class="form-group mb-3 {% if field.errors %}has-danger{% endif %} {{ kwargs.pop('class_', '') }}">
{{ render_label(field, label, label_visible) }} {{ render_label(field, label, label_visible) }}
<div class="input-group mb-1"> <div class="input-group mb-1">
<div class="input-group-prepend"> <span class="input-group-text" id="basic-addon1">{{ prefix }}</span>
<span class="input-group-text" id="basic-addon1">{{ prefix }}</span>
</div>
{{ field(class_=fieldclass or 'form-control', **kwargs) }} {{ field(class_=fieldclass or 'form-control', **kwargs) }}
{% if has_view %} {% if has_view %}
<a class="btn btn-secondary" id="{{ field.name }}-button"> <a class="btn btn-secondary" id="{{ field.name }}-button">
@ -75,7 +71,7 @@
{% macro form_scripts() -%} {% macro form_scripts() -%}
<link href="/static/libs/jquery-ui.min.css" rel="stylesheet" type="text/css"> <link href="/static/libs/jquery-ui.min.css" rel="stylesheet" type="text/css">
<script src="/static/libs/jquery-ui.min.js"></script> <script src="/static/libs/jquery-ui.min.js"></script>
<script src="/static/tagselector.js?v=4"></script> <script src="/static/tagselector.js?v=5"></script>
{% endmacro %} {% endmacro %}
{% macro package_lists() -%} {% macro package_lists() -%}
@ -113,7 +109,7 @@
{% endmacro %} {% endmacro %}
{% macro render_multiselect_field(field, label=None, label_visible=true, right_url=None, right_label=None) -%} {% macro render_multiselect_field(field, label=None, label_visible=true, right_url=None, right_label=None) -%}
<div class="form-group {% if field.errors %}has-danger{% endif %} {{ kwargs.pop('class_', '') }}"> <div class="form-group mb-3 {% if field.errors %}has-danger{% endif %} {{ kwargs.pop('class_', '') }}">
{{ render_label(field, label, label_visible) }} {{ render_label(field, label, label_visible) }}
<div class="multichoice_selector bulletselector form-control"> <div class="multichoice_selector bulletselector form-control">
<input type="text" placeholder="{{ _('Start typing to see suggestions') }}"> <input type="text" placeholder="{{ _('Start typing to see suggestions') }}">
@ -127,15 +123,16 @@
{% macro render_checkbox_field(field, label=None) -%} {% macro render_checkbox_field(field, label=None) -%}
{% if not label %}{% set label=field.label.text %}{% endif %} {% if not label %}{% set label=field.label.text %}{% endif %}
<div class="checkbox {{ kwargs.pop('class_', '') }}"> <div class="form-check {{ kwargs.pop('class_', '') }}">
<label> {{ field(type='checkbox', class_="form-check-input", **kwargs) }}
{{ field(type='checkbox', class_="mr-2", **kwargs) }} {{ label }} <label class="form-check-label" for="{{ field.name }}">
{{ label }}
</label> </label>
</div> </div>
{%- endmacro %} {%- endmacro %}
{% macro render_radio_field(field, hint=None, label=None, label_visible=true) -%} {% macro render_radio_field(field, hint=None, label=None, label_visible=true) -%}
<div class="form-group {% if field.errors %}has-danger{% endif %} {{ kwargs.pop('class_', '') }}"> <div class="form-group mb-3 {% if field.errors %}has-danger{% endif %} {{ kwargs.pop('class_', '') }}">
{{ render_label(field, label, label_visible) }} {{ render_label(field, label, label_visible) }}
{% for value, label, checked in field.iter_choices() %} {% for value, label, checked in field.iter_choices() %}
<div class="form-check my-1"> <div class="form-check my-1">
@ -153,17 +150,17 @@
{%- endmacro %} {%- endmacro %}
{% macro render_toggle_field(field, icons=[]) -%} {% macro render_toggle_field(field, icons=[]) -%}
<div class="btn-group btn-group-toggle {{ kwargs.pop('class_', '') }}" data-toggle="buttons"> <div class="btn-group" role="group" >
{% for value, label, checked in field.iter_choices() %} {% for value, label, checked in field.iter_choices() %}
<label class="btn btn-primary{% if checked %} active{% endif %}"> <input type="radio" class="btn-check" name="{{ field.id }}" id="{{ field.id }}-{{ value }}" value="{{ value }}" autocomplete="off" {% if checked %} checked{% endif %}>
{% set icon = icons[value] %} <label class="btn btn-primary" for="{{ field.id }}-{{ value }}">
{% if icon %} {% set icon = icons[value] %}
<i class="fas {{ icon }} mr-2"></i> {% if icon %}
{% endif %} <i class="fas {{ icon }} me-2"></i>
<input type="radio" name="{{ field.id }}" id="{{ field.id }}" value="{{ value }}" autocomplete="off" {% if checked %} checked{% endif %}> {% endif %}
{{ label }} {{ label }}
</label> </label>
{% endfor %} {% endfor %}
</div> </div>
{%- endmacro %} {%- endmacro %}

@ -18,11 +18,11 @@
{% set message %} {% set message %}
{% if package.check_perm(current_user, "MAKE_RELEASE") %} {% if package.check_perm(current_user, "MAKE_RELEASE") %}
{% if package.update_config %} {% if package.update_config %}
<a class="btn btn-sm btn-warning float-right" href="{{ package.get_url('packages.create_release') }}"> <a class="btn btn-sm btn-warning float-end" href="{{ package.get_url('packages.create_release') }}">
{{ _("Create release") }} {{ _("Create release") }}
</a> </a>
{% else %} {% else %}
<a class="btn btn-sm btn-warning float-right" href="{{ package.get_url('packages.setup_releases') }}"> <a class="btn btn-sm btn-warning float-end" href="{{ package.get_url('packages.setup_releases') }}">
{{ _("Set up releases") }} {{ _("Set up releases") }}
</a> </a>
{% endif %} {% endif %}
@ -95,7 +95,7 @@
{% if conflicting_modnames %} {% if conflicting_modnames %}
<div class="alert alert-warning"> <div class="alert alert-warning">
<a class="float-right btn btn-sm btn-warning" href="{{ package.get_url('packages.similar') }}"> <a class="float-end btn btn-sm btn-warning" href="{{ package.get_url('packages.similar') }}">
More info More info
</a> </a>
{% if conflicting_modnames | length > 4 %} {% if conflicting_modnames | length > 4 %}
@ -108,7 +108,7 @@
{% if not package.review_thread and (package.author == current_user or package.check_perm(current_user, "APPROVE_NEW")) %} {% if not package.review_thread and (package.author == current_user or package.check_perm(current_user, "APPROVE_NEW")) %}
<div class="alert alert-secondary"> <div class="alert alert-secondary">
<a class="float-right btn btn-sm btn-secondary" href="{{ url_for('threads.new', pid=package.id, title='Package approval comments') }}"> <a class="float-end btn btn-sm btn-secondary" href="{{ url_for('threads.new', pid=package.id, title='Package approval comments') }}">
{{ _("Open Thread") }} {{ _("Open Thread") }}
</a> </a>

@ -10,7 +10,7 @@
<small>{{ package.author.display_name }}</small> <small>{{ package.author.display_name }}</small>
{% endif %} {% endif %}
{% if not package.approved %} {% if not package.approved %}
<span class="badge ml-1 {% if package.state == package.state.CHANGES_NEEDED %}bg-danger{% else %}bg-warning{% endif %}"> <span class="badge ms-1 {% if package.state == package.state.CHANGES_NEEDED %}bg-danger{% else %}bg-warning{% endif %}">
{{ package.state.value }} {{ package.state.value }}
</span> </span>
{% endif %} {% endif %}

@ -2,7 +2,7 @@
{% for rel in releases %} {% for rel in releases %}
<a class="list-group-item list-group-item-action" href="{{ rel.get_edit_url() }}"> <a class="list-group-item list-group-item-action" href="{{ rel.get_edit_url() }}">
{{ rel.title }} {{ rel.title }}
<span class="text-muted ml-1"> <span class="text-muted ms-1">
{% if rel.min_rel and rel.max_rel %} {% if rel.min_rel and rel.max_rel %}
[MT {{ rel.min_rel.name }}-{{ rel.max_rel.name }}] [MT {{ rel.min_rel.name }}-{{ rel.max_rel.name }}]
{% elif rel.min_rel %} {% elif rel.min_rel %}
@ -29,7 +29,7 @@
{% if rel.approved or package.check_perm(current_user, "MAKE_RELEASE") or rel.check_perm(current_user, "APPROVE_RELEASE") %} {% if rel.approved or package.check_perm(current_user, "MAKE_RELEASE") or rel.check_perm(current_user, "APPROVE_RELEASE") %}
<a class="list-group-item list-group-item-action" href="{{ rel.get_download_url() }}"> <a class="list-group-item list-group-item-action" href="{{ rel.get_download_url() }}">
{{ rel.title }} {{ rel.title }}
<span class="text-muted ml-1"> <span class="text-muted ms-1">
{% if rel.min_rel and rel.max_rel %} {% if rel.min_rel and rel.max_rel %}
[MT {{ rel.min_rel.name }}-{{ rel.max_rel.name }}] [MT {{ rel.min_rel.name }}-{{ rel.max_rel.name }}]
{% elif rel.min_rel %} {% elif rel.min_rel %}
@ -55,7 +55,7 @@
{% macro render_releases(releases, package, current_user) -%} {% macro render_releases(releases, package, current_user) -%}
{% for rel in releases %} {% for rel in releases %}
<div class="list-group-item"> <div class="list-group-item">
<a class="btn btn-sm btn-primary float-right" href="{{ rel.get_edit_url() }}"> <a class="btn btn-sm btn-primary float-end" href="{{ rel.get_edit_url() }}">
{% if not rel.task_id and not rel.approved and rel.check_perm(current_user, "APPROVE_RELEASE") %} {% if not rel.task_id and not rel.approved and rel.check_perm(current_user, "APPROVE_RELEASE") %}
{{ _("Edit / Approve") }} {{ _("Edit / Approve") }}
{% else %} {% else %}
@ -69,7 +69,7 @@
{{ rel.title }} {{ rel.title }}
</a> </a>
<span class="text-muted ml-1"> <span class="text-muted ms-1">
{% if rel.min_rel and rel.max_rel %} {% if rel.min_rel and rel.max_rel %}
[MT {{ rel.min_rel.name }}-{{ rel.max_rel.name }}] [MT {{ rel.min_rel.name }}-{{ rel.max_rel.name }}]
{% elif rel.min_rel %} {% elif rel.min_rel %}

@ -6,13 +6,13 @@
<button class="btn {% if is_positive == true %}btn-primary{% else %}btn-secondary{% endif %}" name="is_positive" value="yes"> <button class="btn {% if is_positive == true %}btn-primary{% else %}btn-secondary{% endif %}" name="is_positive" value="yes">
{{ _("Helpful") }} {{ _("Helpful") }}
{% if positive > 0 %} {% if positive > 0 %}
<span class="badge badge-light ml-1">{{ positive }}</span> <span class="badge bg-light text-dark ms-1">{{ positive }}</span>
{% endif %} {% endif %}
</button> </button>
<button class="btn {% if is_positive == false %}btn-primary{% else %}btn-secondary{% endif %}" name="is_positive" value="no"> <button class="btn {% if is_positive == false %}btn-primary{% else %}btn-secondary{% endif %}" name="is_positive" value="no">
{{ _("Unhelpful") }} {{ _("Unhelpful") }}
{% if negative > 0 %} {% if negative > 0 %}
<span class="badge badge-light ml-1">{{ negative }}</span> <span class="badge bg-light text-dark ms-1">{{ negative }}</span>
{% endif %} {% endif %}
</button> </button>
</div> </div>
@ -30,7 +30,7 @@
<img class="img-fluid user-photo img-thumbnail img-thumbnail-1" src="{{ review.author.get_profile_pic_url() }}"> <img class="img-fluid user-photo img-thumbnail img-thumbnail-1" src="{{ review.author.get_profile_pic_url() }}">
</a> </a>
</div> </div>
<div class="col-md-auto pl-1 pr-3 pt-2 text-center" style=" font-size: 200%;"> <div class="col-md-auto ps-1 pe-3 pt-2 text-center" style=" font-size: 200%;">
{% if review.rating > 3 %} {% if review.rating > 3 %}
<i class="fas fa-thumbs-up" style="color:#6f6;"></i> <i class="fas fa-thumbs-up" style="color:#6f6;"></i>
{% elif review.rating < 3 %} {% elif review.rating < 3 %}
@ -49,7 +49,7 @@
{{ review.author.display_name }} {{ review.author.display_name }}
</a> </a>
<a name="reply-{{ reply.id }}" class="text-muted float-right" <a name="reply-{{ reply.id }}" class="text-muted float-end"
href="{{ url_for('threads.view', id=review.thread.id) }}#reply-{{ reply.id }}"> href="{{ url_for('threads.view', id=review.thread.id) }}#reply-{{ reply.id }}">
{{ review.created_at | datetime }} {{ review.created_at | datetime }}
</a> </a>
@ -57,7 +57,7 @@
<div class="card-body markdown"> <div class="card-body markdown">
{% if current_user == review.author %} {% if current_user == review.author %}
<a class="btn btn-primary btn-sm ml-1 float-right" <a class="btn btn-primary btn-sm ms-1 float-end"
href="{{ review.package.get_url('packages.review') }}"> href="{{ review.package.get_url('packages.review') }}">
<i class="fas fa-pen"></i> <i class="fas fa-pen"></i>
</a> </a>
@ -71,16 +71,16 @@
<div class="btn-toolbar mt-2 mb-0"> <div class="btn-toolbar mt-2 mb-0">
{% if show_package_link %} {% if show_package_link %}
<a class="btn btn-primary mr-1" href="{{ review.package.get_url('packages.view') }}"> <a class="btn btn-primary me-1" href="{{ review.package.get_url('packages.view') }}">
{{ _("%(title)s by %(author)s", {{ _("%(title)s by %(author)s",
title="<b>" | safe + review.package.title + "</b>" | safe, title="<b>" | safe + review.package.title + "</b>" | safe,
author=review.package.author.display_name) }} author=review.package.author.display_name) }}
</a> </a>
{% endif %} {% endif %}
<a class="btn {% if review.thread.replies.count() > 1 %} btn-primary {% else %} btn-secondary {% endif %} mr-1" <a class="btn {% if review.thread.replies.count() > 1 %} btn-primary {% else %} btn-secondary {% endif %} me-1"
href="{{ url_for('threads.view', id=review.thread.id) }}"> href="{{ url_for('threads.view', id=review.thread.id) }}">
<i class="fas fa-comments mr-2"></i> <i class="fas fa-comments me-2"></i>
{{ _("%(num)d comments", num=review.thread.replies.count() - 1) }} {{ _("%(num)d comments", num=review.thread.replies.count() - 1) }}
</a> </a>
@ -111,18 +111,21 @@
{{ _("Do you recommend this %(type)s?", type=package.type.text | lower) }} {{ _("Do you recommend this %(type)s?", type=package.type.text | lower) }}
</p> </p>
<div class="btn-group btn-group-toggle" data-toggle="buttons"> <div class="btn-group" role="group">
<label class="btn btn-primary"> <input type="radio" class="btn-check" name="rating" id="rating-5" value="5" autocomplete="off">
<i class="fas fa-thumbs-up mr-2"></i> <label class="btn btn-primary" for="rating-5">
<input type="radio" name="rating" value="5" autocomplete="off"> {{ _("Yes") }} <i class="fas fa-thumbs-up me-2"></i>
{{ _("Yes") }}
</label> </label>
<label class="btn btn-primary"> <input type="radio" class="btn-check" name="rating" id="rating-3" value="3" autocomplete="off">
<i class="fas fa-minus mr-2"></i> <label class="btn btn-primary" for="rating-3">
<input type="radio" name="rating" value="3" autocomplete="off"> {{ _("Neutral") }} <i class="fas fa-minus me-2"></i>
{{ _("Neutral") }}
</label> </label>
<label class="btn btn-primary"> <input type="radio" class="btn-check" name="rating" id="rating-1" value="1" autocomplete="off">
<i class="fas fa-thumbs-down mr-2"></i> <label class="btn btn-primary" for="rating-1">
<input type="radio" name="rating" value="1" autocomplete="off"> {{ _("No") }} <i class="fas fa-thumbs-down me-2"></i>
{{ _("No") }}
</label> </label>
</div> </div>
@ -130,14 +133,14 @@
{{ _("Why or why not? Try to be constructive") }} {{ _("Why or why not? Try to be constructive") }}
</p> </p>
<div class="form-group"> <div class="form-group mb-3">
<label for="title">{{ _("Title") }}</label> <label for="title" class="form-label">{{ _("Title") }}</label>
<span class="ml-1 text-danger"> <span class="ms-1 text-danger">
<small> <small>
<i class="fas fa-asterisk"></i> <i class="fas fa-asterisk"></i>
</small> </small>
</span> </span>
<span class="ml-3 text-muted"> <span class="ms-3 text-muted">
{{ _("Required") }} {{ _("Required") }}
</span> </span>
<input class="form-control" id="title" name="title" required="" type="text"> <input class="form-control" id="title" name="title" required="" type="text">
@ -163,23 +166,23 @@
</p> </p>
<div class="btn-toolbar" role="toolbar"> <div class="btn-toolbar" role="toolbar">
<div class="btn-group mr-2"> <div class="btn-group me-2">
<button class="btn btn-primary" name="rating" value="5"> <button class="btn btn-primary" name="rating" value="5">
<i class="fas fa-thumbs-up mr-1"></i> <i class="fas fa-thumbs-up me-1"></i>
{{ _("Yes") }} {{ _("Yes") }}
</button> </button>
<button class="btn btn-primary" name="rating" value="3"> <button class="btn btn-primary" name="rating" value="3">
<i class="fas fa-minus mr-1"></i> <i class="fas fa-minus me-1"></i>
{{ _("Neutral") }} {{ _("Neutral") }}
</button> </button>
<button class="btn btn-primary" name="rating" value="1"> <button class="btn btn-primary" name="rating" value="1">
<i class="fas fa-thumbs-down mr-1"></i> <i class="fas fa-thumbs-down me-1"></i>
{{ _("No") }} {{ _("No") }}
</button> </button>
</div> </div>
<div class="btn-group"> <div class="btn-group">
<a class="btn btn-secondary" href="{{ package.issueTracker or url_for('threads.new', pid=package.id) }}" rel="ugc"> <a class="btn btn-secondary" href="{{ package.issueTracker or url_for('threads.new', pid=package.id) }}" rel="ugc">
<i class="fas fa-bug mr-1"></i> <i class="fas fa-bug me-1"></i>
{{ _("Report an Issue") }} {{ _("Report an Issue") }}
</a> </a>
</div> </div>

@ -2,7 +2,7 @@
<script src="/static/libs/chart.min.js"></script> <script src="/static/libs/chart.min.js"></script>
<script src="/static/libs/chartjs-adapter-date-fns.bundle.min.js"></script> <script src="/static/libs/chartjs-adapter-date-fns.bundle.min.js"></script>
<script src="/static/libs/chartjs-plugin-annotation.min.js"></script> <script src="/static/libs/chartjs-plugin-annotation.min.js"></script>
<script src="/static/package_charts.js?v=11"></script> <script src="/static/package_charts.js?v=12"></script>
{% endmacro %} {% endmacro %}
@ -31,7 +31,7 @@
{% macro render_daterange_selector(options, is_active) %} {% macro render_daterange_selector(options, is_active) %}
<nav class="dropdown d-inline-block mr-2"> <nav class="dropdown d-inline-block me-2">
<button class="btn {% if is_active %}btn-primary{% else %}btn-secondary{% endif %} dropdown-toggle" type="button" id="dropdownDateRange" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <button class="btn {% if is_active %}btn-primary{% else %}btn-secondary{% endif %} dropdown-toggle" type="button" id="dropdownDateRange" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
{{ _("Date range...") }} {{ _("Date range...") }}
</button> </button>
@ -69,7 +69,7 @@
<div class="card h-100"> <div class="card h-100">
<div class="card-body align-items-center text-center"> <div class="card-body align-items-center text-center">
<div class="mt-0 mb-3"> <div class="mt-0 mb-3">
<i class="fas fa-download mr-1"></i> <i class="fas fa-download me-1"></i>
{{ _("Lifetime unique downloads") }} {{ _("Lifetime unique downloads") }}
</div> </div>
<div class="my-0 h4"> <div class="my-0 h4">

@ -10,29 +10,29 @@
<div class="col pr-0"> <div class="col pr-0">
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
<a class="author {{ r.author.rank.name }} mr-3" <a class="author {{ r.author.rank.name }} me-3"
href="{{ url_for('users.profile', username=r.author.username) }}"> href="{{ url_for('users.profile', username=r.author.username) }}">
{{ r.author.display_name }} {{ r.author.display_name }}
</a> </a>
{% if r.author.username != r.author.display_name %} {% if r.author.username != r.author.display_name %}
<span class="text-muted small mr-2"> <span class="text-muted small me-2">
({{ r.author.username }}) ({{ r.author.username }})
</span> </span>
{% endif %} {% endif %}
{% if r.author in thread.package.maintainers %} {% if r.author in thread.package.maintainers %}
<span class="badge badge-dark"> <span class="badge bg-dark">
{{ _("Maintainer") }} {{ _("Maintainer") }}
</span> </span>
{% endif %} {% endif %}
{% if r.author.rank == r.author.rank.BOT %} {% if r.author.rank == r.author.rank.BOT %}
<span class="badge badge-dark"> <span class="badge bg-dark">
{{ r.author.rank.get_title() }} {{ r.author.rank.get_title() }}
</span> </span>
{% endif %} {% endif %}
<a name="reply-{{ r.id }}" class="text-muted float-right" <a name="reply-{{ r.id }}" class="text-muted float-end"
href="{{ r.get_url() }}"> href="{{ r.get_url() }}">
{{ r.created_at | datetime }} {{ r.created_at | datetime }}
</a> </a>
@ -40,26 +40,26 @@
<div class="card-body markdown"> <div class="card-body markdown">
{% if r.check_perm(current_user, "DELETE_REPLY") %} {% if r.check_perm(current_user, "DELETE_REPLY") %}
<a class="float-right btn btn-secondary btn-sm ml-2" <a class="float-end btn btn-secondary btn-sm ms-2"
href="{{ url_for('threads.delete_reply', id=thread.id, reply=r.id) }}"> href="{{ url_for('threads.delete_reply', id=thread.id, reply=r.id) }}">
<i class="fas fa-trash"></i> <i class="fas fa-trash"></i>
</a> </a>
{% endif %} {% endif %}
{% if current_user != r.author %} {% if current_user != r.author %}
<a class="float-right btn-secondary btn-sm ml-2" <a class="float-end btn-secondary btn-sm ms-2"
title="{{ _('Report') }}" title="{{ _('Report') }}"
href="{{ url_for('report.report', url=r.get_url()) }}"> href="{{ url_for('report.report', url=r.get_url()) }}">
<i class="fas fa-flag mr-1"></i> <i class="fas fa-flag me-1"></i>
</a> </a>
{% endif %} {% endif %}
{% if current_user == thread.author and thread.review and thread.first_reply == r %} {% if current_user == thread.author and thread.review and thread.first_reply == r %}
<a class="float-right btn btn-primary btn-sm ml-2" <a class="float-end btn btn-primary btn-sm ms-2"
href="{{ thread.review.package.get_url('packages.review') }}"> href="{{ thread.review.package.get_url('packages.review') }}">
<i class="fas fa-pen"></i> <i class="fas fa-pen"></i>
</a> </a>
{% elif r.check_perm(current_user, "EDIT_REPLY") %} {% elif r.check_perm(current_user, "EDIT_REPLY") %}
<a class="float-right btn btn-primary btn-sm ml-2" <a class="float-end btn btn-primary btn-sm ms-2"
href="{{ url_for('threads.edit_reply', id=thread.id, reply=r.id) }}"> href="{{ url_for('threads.edit_reply', id=thread.id, reply=r.id) }}">
<i class="fas fa-pen"></i> <i class="fas fa-pen"></i>
</a> </a>
@ -94,7 +94,7 @@
{{ r.comment | markdown }} {{ r.comment | markdown }}
</div> </div>
<div class="col-auto"> <div class="col-auto">
<a name="reply-{{ r.id }}" class="text-muted float-right" <a name="reply-{{ r.id }}" class="text-muted float-end"
href="{{ r.get_url() }}"> href="{{ r.get_url() }}">
{{ r.created_at | datetime }} {{ r.created_at | datetime }}
</a> </a>
@ -116,7 +116,7 @@
{% if thread.locked %} {% if thread.locked %}
<p class="my-0 py-4 text-center"> <p class="my-0 py-4 text-center">
<i class="fas fa-lock mr-3"></i> <i class="fas fa-lock me-3"></i>
{{ _("This thread has been locked by a moderator.") }} {{ _("This thread has been locked by a moderator.") }}
</p> </p>
{% endif %} {% endif %}
@ -125,8 +125,8 @@
<div class="row mt-1"> <div class="row mt-1">
<div class="col-md-1 p-1"></div> <div class="col-md-1 p-1"></div>
<div class="col"> <div class="col">
<a class="btn btn-primary ml-3" href="{{ url_for('threads.view', id=thread.id) }}"> <a class="btn btn-primary ms-3" href="{{ url_for('threads.view', id=thread.id) }}">
<i class="fas fa-reply mr-1"></i> <i class="fas fa-reply me-1"></i>
{{ _("Reply") }} {{ _("Reply") }}
</a> </a>
</div> </div>
@ -231,13 +231,13 @@
{% else %} {% else %}
<i class="fas fa-minus" style="color:#999"></i> <i class="fas fa-minus" style="color:#999"></i>
{% endif %} {% endif %}
<strong class="ml-1"> <strong class="ms-1">
{{ t.title }} {{ t.title }}
</strong><br /> </strong><br />
<span> <span>
{{ t.author.display_name }} {{ t.author.display_name }}
</span> </span>
<span class="text-muted ml-3"> <span class="text-muted ms-3">
{{ t.created_at | datetime }} {{ t.created_at | datetime }}
</span> </span>
</div> </div>
@ -245,7 +245,7 @@
{% if replies > 0 %} {% if replies > 0 %}
<span class="col-md-auto text-muted"> <span class="col-md-auto text-muted">
{{ replies }} {{ replies }}
<i class="fas fa-comment ml-1"></i> <i class="fas fa-comment ms-1"></i>
</span> </span>
{% endif %} {% endif %}
@ -261,14 +261,14 @@
{% endif %} {% endif %}
</div> </div>
<div class="col-md-2 text-muted text-right"> <div class="col-md-2 text-muted text-end">
{% if t.package %} {% if t.package %}
<img <img
class="img-fluid" class="img-fluid"
style="max-height: 22px; max-width: 22px;" style="max-height: 22px; max-width: 22px;"
src="{{ t.package.get_thumb_or_placeholder() }}" /><br /> src="{{ t.package.get_thumb_or_placeholder() }}" /><br />
<span class="pl-2"> <span class="ps-2">
{{ t.package.title }} {{ t.package.title }}
</span> </span>
{% endif %} {% endif %}

@ -10,7 +10,7 @@
style="max-height: 22px; max-width: 22px;" style="max-height: 22px; max-width: 22px;"
src="{{ package.get_thumb_or_placeholder() }}" /> src="{{ package.get_thumb_or_placeholder() }}" />
<span class="pl-2"> <span class="ps-2">
{{ package.title }} {{ package.title }}
</span> </span>
</a> </a>
@ -30,21 +30,21 @@
<div class="col-sm-auto"> <div class="col-sm-auto">
{% if not show_config %} {% if not show_config %}
{% if package.check_perm(current_user, "MAKE_RELEASE") %} {% if package.check_perm(current_user, "MAKE_RELEASE") %}
<a class="btn btn-sm btn-primary mr-2" href="{{ config.get_create_release_url() }}"> <a class="btn btn-sm btn-primary me-2" href="{{ config.get_create_release_url() }}">
<i class="fas fa-plus mr-1"></i> <i class="fas fa-plus me-1"></i>
{{ _("Release") }} {{ _("Release") }}
</a> </a>
{% endif %} {% endif %}
{% endif %} {% endif %}
<a class="btn btn-sm btn-secondary mr-2" href="{{ package.repo }}"> <a class="btn btn-sm btn-secondary me-2" href="{{ package.repo }}">
<i class="fas fa-code-branch mr-1"></i> <i class="fas fa-code-branch me-1"></i>
{{ _("Repo") }} {{ _("Repo") }}
</a> </a>
{% if package.check_perm(current_user, "MAKE_RELEASE") %} {% if package.check_perm(current_user, "MAKE_RELEASE") %}
<a class="btn btn-sm btn-secondary" href="{{ package.get_url('packages.update_config') }}"> <a class="btn btn-sm btn-secondary" href="{{ package.get_url('packages.update_config') }}">
<i class="fas fa-cog mr-1"></i> <i class="fas fa-cog me-1"></i>
{{ _("Update settings") }} {{ _("Update settings") }}
</a> </a>
{% endif %} {% endif %}
@ -68,7 +68,7 @@
style="max-height: 22px; max-width: 22px;" style="max-height: 22px; max-width: 22px;"
src="{{ package.get_thumb_or_placeholder() }}" /> src="{{ package.get_thumb_or_placeholder() }}" />
<span class="pl-2"> <span class="ps-2">
{{ package.title }} {{ package.title }}
</span> </span>
</div> </div>

@ -6,11 +6,11 @@
{% block content %} {% block content %}
{% if current_user.notifications %} {% if current_user.notifications %}
<form method="post" action="{{ url_for('notifications.clear') }}" class="float-right"> <form method="post" action="{{ url_for('notifications.clear') }}" class="float-end">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" /> <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
<input type="submit" class="btn btn-primary" value="Clear All" /> <input type="submit" class="btn btn-primary" value="Clear All" />
</form> </form>
<a href="{{ url_for('users.email_notifications', username=current_user.username) }}" class="btn btn-secondary float-right mr-3"> <a href="{{ url_for('users.email_notifications', username=current_user.username) }}" class="btn btn-secondary float-end me-3">
{{ _("Edit email notification settings") }} {{ _("Edit email notification settings") }}
</a> </a>
{% endif %} {% endif %}
@ -38,7 +38,7 @@
style="max-height: 22px; max-width: 22px;" style="max-height: 22px; max-width: 22px;"
src="{{ n.package.get_thumb_or_placeholder() }}" /> src="{{ n.package.get_thumb_or_placeholder() }}" />
<span class="pl-2"> <span class="ps-2">
{{ n.package.title }} {{ n.package.title }}
</span> </span>
</div> </div>
@ -48,8 +48,8 @@
{{ n.title}} {{ n.title}}
</div> </div>
<div class="col-sm-auto text-muted text-right"> <div class="col-sm-auto text-muted text-end">
<span class="pr-2">{{ n.causer.display_name }}</span> <span class="pe-2">{{ n.causer.display_name }}</span>
<img <img
class="img-fluid user-photo img-thumbnail img-thumbnail-1" class="img-fluid user-photo img-thumbnail img-thumbnail-1"
style="max-height: 22px;" style="max-height: 22px;"
@ -76,7 +76,7 @@
style="max-height: 22px; max-width: 22px;" style="max-height: 22px; max-width: 22px;"
src="{{ n.package.get_thumb_or_placeholder() }}" /> src="{{ n.package.get_thumb_or_placeholder() }}" />
<span class="pl-2"> <span class="ps-2">
{{ n.package.title }} {{ n.package.title }}
</span> </span>
</div> </div>
@ -86,8 +86,8 @@
{{ n.title}} {{ n.title}}
</div> </div>
<div class="col-sm-auto text-muted text-right"> <div class="col-sm-auto text-muted text-end">
<span class="pr-2">{{ n.causer.display_name }}</span> <span class="pe-2">{{ n.causer.display_name }}</span>
<img <img
class="img-fluid user-photo img-thumbnail img-thumbnail-1" class="img-fluid user-photo img-thumbnail img-thumbnail-1"
style="max-height: 22px;" style="max-height: 22px;"

@ -9,7 +9,7 @@
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<a class="btn btn-primary float-right" href="{{ package.get_url('packages.alias_create_edit') }}"> <a class="btn btn-primary float-end" href="{{ package.get_url('packages.alias_create_edit') }}">
{{ _("Create") }} {{ _("Create") }}
</a> </a>
<h1>{{ _("Aliases for %(title)s by %(author)s", title=self.link(), author=package.author.display_name) }}</h1> <h1>{{ _("Aliases for %(title)s by %(author)s", title=self.link(), author=package.author.display_name) }}</h1>

@ -5,7 +5,7 @@
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<a class="btn btn-secondary float-right" href="/help/update_config/">{{ _("Help") }}</a> <a class="btn btn-secondary float-end" href="/help/update_config/">{{ _("Help") }}</a>
<h1 class="mb-5">{{ self.title() }}</h1> <h1 class="mb-5">{{ self.title() }}</h1>
<h2>{{ _("Packages with Update Settings") }}</h2> <h2>{{ _("Packages with Update Settings") }}</h2>

@ -21,7 +21,7 @@
<script src="/static/polltask.js"></script> <script src="/static/polltask.js"></script>
<script src="/static/package_create.js?v=5"></script> <script src="/static/package_create.js?v=5"></script>
{% endif %} {% endif %}
<script src="/static/package_edit.js?v=4"></script> <script src="/static/package_edit.js?v=5"></script>
{% endblock %} {% endblock %}
{% block content %} {% block content %}
@ -38,13 +38,13 @@
{% if not package %} {% if not package %}
<div class="alert alert-info"> <div class="alert alert-info">
<a class="float-right btn btn-sm btn-default" href="{{ url_for('flatpage', path='policy_and_guidance') }}">{{ _("View") }}</a> <a class="float-end btn btn-sm btn-default" href="{{ url_for('flatpage', path='policy_and_guidance') }}">{{ _("View") }}</a>
{{ _("Have you read the Package Inclusion Policy and Guidance yet?") }} {{ _("Have you read the Package Inclusion Policy and Guidance yet?") }}
</div> </div>
{% else %} {% else %}
<div class="alert alert-secondary"> <div class="alert alert-secondary">
<a class="float-right btn btn-sm btn-default" href="/help/package_config/#cdbjson">{{ _("Read more") }}</a> <a class="float-end btn btn-sm btn-default" href="/help/package_config/#cdbjson">{{ _("Read more") }}</a>
{{ _("You can include a .cdb.json file in your %(type)s to update these details automatically.", type=package.type.text.lower()) }} {{ _("You can include a .cdb.json file in your %(type)s to update these details automatically.", type=package.type.text.lower()) }}
</div> </div>

@ -26,35 +26,35 @@
</a> </a>
</h1> </h1>
<a href="{{ url_for('packages.list_all', sort='approved_at', order='desc', game=package.get_id()) }}" class="btn btn-secondary float-right"> <a href="{{ url_for('packages.list_all', sort='approved_at', order='desc', game=package.get_id()) }}" class="btn btn-secondary float-end">
{{ _("See more") }} {{ _("See more") }}
</a> </a>
<h2 class="my-3">{{ _("Recently Added") }}</h2> <h2 class="my-3">{{ _("Recently Added") }}</h2>
{{ render_pkggrid(new) }} {{ render_pkggrid(new) }}
<a href="{{ url_for('packages.list_all', sort='last_release', order='desc', game=package.get_id()) }}" class="btn btn-secondary float-right"> <a href="{{ url_for('packages.list_all', sort='last_release', order='desc', game=package.get_id()) }}" class="btn btn-secondary float-end">
{{ _("See more") }} {{ _("See more") }}
</a> </a>
<h2 class="my-3">{{ _("Recently Updated") }}</h2> <h2 class="my-3">{{ _("Recently Updated") }}</h2>
{{ render_pkggrid(updated) }} {{ render_pkggrid(updated) }}
<a href="{{ url_for('packages.list_all', type='mod', sort='score', order='desc', game=package.get_id()) }}" class="btn btn-secondary float-right"> <a href="{{ url_for('packages.list_all', type='mod', sort='score', order='desc', game=package.get_id()) }}" class="btn btn-secondary float-end">
{{ _("See more") }} {{ _("See more") }}
</a> </a>
<h2 class="my-3">{{ _("Top Mods") }}</h2> <h2 class="my-3">{{ _("Top Mods") }}</h2>
{{ render_pkggrid(pop_mod) }} {{ render_pkggrid(pop_mod) }}
<a href="{{ url_for('packages.list_all', type='txp', sort='score', order='desc', game=package.get_id()) }}" class="btn btn-secondary float-right"> <a href="{{ url_for('packages.list_all', type='txp', sort='score', order='desc', game=package.get_id()) }}" class="btn btn-secondary float-end">
{{ _("See more") }} {{ _("See more") }}
</a> </a>
<h2 class="my-3">{{ _("Top Texture Packs") }}</h2> <h2 class="my-3">{{ _("Top Texture Packs") }}</h2>
{{ render_pkggrid(pop_txp) }} {{ render_pkggrid(pop_txp) }}
<a href="{{ url_for('packages.list_all', sort='reviews', order='desc', game=package.get_id()) }}" class="btn btn-secondary float-right"> <a href="{{ url_for('packages.list_all', sort='reviews', order='desc', game=package.get_id()) }}" class="btn btn-secondary float-end">
{{ _("See more") }} {{ _("See more") }}
</a> </a>
<h2 class="my-3">{{ _("Highest Reviewed") }}</h2> <h2 class="my-3">{{ _("Highest Reviewed") }}</h2>

@ -5,7 +5,7 @@
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<a class="float-right btn btn-secondary" href="{{ url_for('flatpage', path='help/game_support') }}"> <a class="float-end btn btn-secondary" href="{{ url_for('flatpage', path='help/game_support') }}">
{{ _("Documentation") }} {{ _("Documentation") }}
</a> </a>
<h2 class="mt-0">{{ self.title() }}</h2> <h2 class="mt-0">{{ self.title() }}</h2>
@ -22,7 +22,7 @@
<span class="col-5"> <span class="col-5">
{{ _("Source") }} {{ _("Source") }}
</span> </span>
<span class="col-2 text-right"> <span class="col-2 text-end">
{{ _("Supported?") }} {{ _("Supported?") }}
</span> </span>
</div> </div>
@ -53,11 +53,11 @@
{{ support.confidence }} {{ support.confidence }}
{% endif %} {% endif %}
</span> </span>
<span class="col-2 text-right"> <span class="col-2 text-end">
{% if support.supports %} {% if support.supports %}
<span class="badge badge-success">Yes</span> <span class="badge bg-success">Yes</span>
{% else %} {% else %}
<span class="badge badge-danger">No</span> <span class="badge bg-danger">No</span>
{% endif %} {% endif %}
</span> </span>
</div> </div>

@ -34,14 +34,14 @@
title="{{ tag.description or '' }}" title="{{ tag.description or '' }}"
href="{{ url_set_query(page=1, _remove={ 'tag': tag.name }) }}"> href="{{ url_set_query(page=1, _remove={ 'tag': tag.name }) }}">
{{ tag.title }} {{ tag.title }}
<span class="badge badge-pill badge-light ml-1">{{ count }}</span> <span class="badge roaded-pill bg-light text-dark ms-1">{{ count }}</span>
</a> </a>
{% else %} {% else %}
<a class="btn btn-sm btn-secondary m-1" rel="nofollow" <a class="btn btn-sm btn-secondary m-1" rel="nofollow"
title="{{ tag.description or '' }}" title="{{ tag.description or '' }}"
href="{{ url_set_query(page=1, _add={ 'tag': tag.name }) }}"> href="{{ url_set_query(page=1, _add={ 'tag': tag.name }) }}">
{{ tag.title }} {{ tag.title }}
<span class="badge badge-pill badge-light ml-1">{{ count }}</span> <span class="badge roaded-pill bg-light text-dark ms-1">{{ count }}</span>
</a> </a>
{% endif %} {% endif %}
{% endfor %} {% endfor %}

@ -12,7 +12,7 @@
<img class="img-fluid user-photo img-thumbnail img-thumbnail-1" <img class="img-fluid user-photo img-thumbnail img-thumbnail-1"
src="{{ package.get_thumb_or_placeholder(1) }}" alt="{{ _('Thumbnail') }}" style="max-height: 20px;"> src="{{ package.get_thumb_or_placeholder(1) }}" alt="{{ _('Thumbnail') }}" style="max-height: 20px;">
</span> </span>
<span class="col m-0 p-0 pl-2"> <span class="col m-0 p-0 ps-2">
{{ package.title }} {{ package.title }}
</span> </span>
</span> </span>

@ -72,7 +72,7 @@
{% if release.check_perm(current_user, "DELETE_RELEASE") %} {% if release.check_perm(current_user, "DELETE_RELEASE") %}
<form method="POST" action="{{ release.get_delete_url() }}" class="alert alert-secondary mb-5"> <form method="POST" action="{{ release.get_delete_url() }}" class="alert alert-secondary mb-5">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" /> <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
<input class="btn btn-sm btn-danger float-right" type="submit" value="{{ _('Delete') }}"> <input class="btn btn-sm btn-danger float-end" type="submit" value="{{ _('Delete') }}">
<b>{{ _("This is permanent.") }}</b> <b>{{ _("This is permanent.") }}</b>
{{ _("Any associated uploads will not be deleted immediately, but the release will no longer be listed.") }} {{ _("Any associated uploads will not be deleted immediately, but the release will no longer be listed.") }}
<div style="clear:both;"></div> <div style="clear:both;"></div>

@ -9,7 +9,7 @@
{% if package.update_config %} {% if package.update_config %}
<p class="alert alert-secondary mb-4"> <p class="alert alert-secondary mb-4">
<a class="float-right btn btn-sm btn-secondary" href="{{ package.get_url('packages.update_config') }}">{{ _("Settings") }}</a> <a class="float-end btn btn-sm btn-secondary" href="{{ package.get_url('packages.update_config') }}">{{ _("Settings") }}</a>
{% if package.update_config.make_release %} {% if package.update_config.make_release %}
{{ _("You have automatic releases enabled.") }} {{ _("You have automatic releases enabled.") }}
{% else %} {% else %}
@ -20,13 +20,13 @@
{% else %} {% else %}
<p class="alert alert-info mb-4"> <p class="alert alert-info mb-4">
{% if package.repo %} {% if package.repo %}
<a class="float-right btn btn-sm btn-info" href="{{ package.get_url('packages.setup_releases') }}">{{ _("Set up") }}</a> <a class="float-end btn btn-sm btn-info" href="{{ package.get_url('packages.setup_releases') }}">{{ _("Set up") }}</a>
<i class="fas fa-info mr-2"></i> <i class="fas fa-info me-2"></i>
{{ _("You can create releases automatically when you push commits or tags to your repository.") }} {{ _("You can create releases automatically when you push commits or tags to your repository.") }}
{% else %} {% else %}
<a class="float-right btn btn-sm btn-info" href="{{ package.get_url('packages.create_edit') }}">{{ _("Add Git repo") }}</a> <a class="float-end btn btn-sm btn-info" href="{{ package.get_url('packages.create_edit') }}">{{ _("Add Git repo") }}</a>
<i class="fas fa-info mr-2"></i> <i class="fas fa-info me-2"></i>
{{ _("Using Git would allow you to create releases automatically when you push code or tags.") }} {{ _("Using Git would allow you to create releases automatically when you push code or tags.") }}
{% endif %} {% endif %}
@ -71,7 +71,7 @@
</p> </p>
<p> <p>
<i class="fas fa-exclamation-circle mr-2"></i> <i class="fas fa-exclamation-circle me-2"></i>
{{ _("The .conf of your package can <a href='/help/package_config/'>set this automatically</a>, {{ _("The .conf of your package can <a href='/help/package_config/'>set this automatically</a>,
which will override your selection.") }} which will override your selection.") }}
</p> </p>

@ -5,7 +5,7 @@
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<a class="btn btn-secondary float-right" href="{{ package.get_url('packages.view') }}"> <a class="btn btn-secondary float-end" href="{{ package.get_url('packages.view') }}">
{{ _("Later") }} {{ _("Later") }}
</a> </a>
<h1>{{ self.title() }}</h1> <h1>{{ self.title() }}</h1>
@ -33,10 +33,10 @@
<a class="btn btn-primary" href="{{ package.get_url('packages.update_config', trigger='commit') }}"> <a class="btn btn-primary" href="{{ package.get_url('packages.update_config', trigger='commit') }}">
{{ _("Rolling Release") }} {{ _("Rolling Release") }}
</a> </a>
<a class="btn btn-primary ml-2" href="{{ package.get_url('packages.update_config', trigger='tag') }}"> <a class="btn btn-primary ms-2" href="{{ package.get_url('packages.update_config', trigger='tag') }}">
{{ _("On Git Tag") }} {{ _("On Git Tag") }}
</a> </a>
{# <a class="btn btn-secondary ml-2" href="{{ package.get_url('packages.update_config') }}">#} {# <a class="btn btn-secondary ms-2" href="{{ package.get_url('packages.update_config') }}">#}
{# {{ _("Advanced") }}#} {# {{ _("Advanced") }}#}
{# </a>#} {# </a>#}
</p> </p>
@ -48,7 +48,7 @@
<a class="btn btn-secondary" href="{{ package.get_url('packages.update_config', action='notification') }}"> <a class="btn btn-secondary" href="{{ package.get_url('packages.update_config', action='notification') }}">
{{ _("With reminders") }} {{ _("With reminders") }}
</a> </a>
<a class="btn btn-secondary ml-2" href="{{ package.get_url('packages.create_release') }}"> <a class="btn btn-secondary ms-2" href="{{ package.get_url('packages.create_release') }}">
{{ _("No reminders") }} {{ _("No reminders") }}
</a> </a>
</p> </p>
@ -68,10 +68,10 @@
<a class="btn btn-primary" href="{{ package.get_url('packages.create_edit') }}"> <a class="btn btn-primary" href="{{ package.get_url('packages.create_edit') }}">
{{ _("Add Git repo") }} {{ _("Add Git repo") }}
</a> </a>
<a class="btn btn-secondary ml-2" href="{{ package.get_url('packages.create_release') }}"> <a class="btn btn-secondary ms-2" href="{{ package.get_url('packages.create_release') }}">
{{ _("Create releases manually") }} {{ _("Create releases manually") }}
</a> </a>
<a class="btn btn-secondary ml-2" href="{{ package.get_url('packages.view') }}"> <a class="btn btn-secondary ms-2" href="{{ package.get_url('packages.view') }}">
{{ _("Later") }} {{ _("Later") }}
</a> </a>
</p> </p>

@ -6,26 +6,26 @@
{% block content %} {% block content %}
{% if package.check_perm(current_user, "MAKE_RELEASE") %} {% if package.check_perm(current_user, "MAKE_RELEASE") %}
<p class="float-right"> <p class="float-end">
{% if package.update_config %} {% if package.update_config %}
<a class="btn btn-secondary" href="{{ package.get_url('packages.update_config') }}"> <a class="btn btn-secondary" href="{{ package.get_url('packages.update_config') }}">
<i class="fas fa-cog mr-1"></i> <i class="fas fa-cog me-1"></i>
{{ _("Update settings") }} {{ _("Update settings") }}
</a> </a>
{% elif package.repo %} {% elif package.repo %}
<a class="btn btn-secondary" href="{{ package.get_url('packages.setup_releases') }}"> <a class="btn btn-secondary" href="{{ package.get_url('packages.setup_releases') }}">
<i class="fas fa-hat-wizard mr-1"></i> <i class="fas fa-hat-wizard me-1"></i>
{{ _("Set up automatic releases") }} {{ _("Set up automatic releases") }}
</a> </a>
{% endif %} {% endif %}
<a class="btn btn-secondary ml-1" href="{{ package.get_url('packages.bulk_change_release') }}"> <a class="btn btn-secondary ms-1" href="{{ package.get_url('packages.bulk_change_release') }}">
<i class="fas fa-wrench mr-1"></i> <i class="fas fa-wrench me-1"></i>
{{ _("Bulk update") }} {{ _("Bulk update") }}
</a> </a>
<a class="btn btn-primary ml-1" href="{{ package.get_url('packages.create_release') }}"> <a class="btn btn-primary ms-1" href="{{ package.get_url('packages.create_release') }}">
<i class="fas fa-plus mr-1"></i> <i class="fas fa-plus me-1"></i>
{{ _("Create") }} {{ _("Create") }}
</a> </a>
</p> </p>

@ -23,14 +23,14 @@ Remove {{ package.title }}
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" /> <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
<div class="form-group"> <div class="form-group mb-3">
<label for="reason">{{ _("Reason") }}</label> <label for="reason" class="form-label">{{ _("Reason") }}</label>
<span class="ml-1 text-danger"> <span class="ms-1 text-danger">
<small> <small>
<i class="fas fa-asterisk"></i> <i class="fas fa-asterisk"></i>
</small> </small>
</span> </span>
<span class="ml-3 text-muted"> <span class="ms-3 text-muted">
{{ _("Required") }} {{ _("Required") }}
</span> </span>
<input id="reason" class="form-control" type="text" name="reason" required minlength="5"> <input id="reason" class="form-control" type="text" name="reason" required minlength="5">
@ -39,9 +39,9 @@ Remove {{ package.title }}
</small> </small>
</div> </div>
<a class="btn btn-secondary float-right" href="{{ package.get_url('packages.view') }}">{{ _("Cancel") }}</a> <a class="btn btn-secondary float-end" href="{{ package.get_url('packages.view') }}">{{ _("Cancel") }}</a>
<input type="submit" name="delete" value="{{ _('Remove') }}" class="btn btn-danger mr-2" /> <input type="submit" name="delete" value="{{ _('Remove') }}" class="btn btn-danger me-2" />
{% if package.approved %} {% if package.approved %}
<input type="submit" name="unapprove" value="{{ _('Unapprove') }}" class="btn btn-warning" /> <input type="submit" name="unapprove" value="{{ _('Unapprove') }}" class="btn btn-warning" />

@ -52,7 +52,7 @@
{% if review %} {% if review %}
<form method="POST" action="{{ review.get_delete_url() }}" class="alert alert-secondary my-5"> <form method="POST" action="{{ review.get_delete_url() }}" class="alert alert-secondary my-5">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" /> <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
<input class="btn btn-sm btn-danger float-right" type="submit" value="{{ _('Delete') }}"> <input class="btn btn-sm btn-danger float-end" type="submit" value="{{ _('Delete') }}">
<b>{{ _("Delete review.") }}</b> <b>{{ _("Delete review.") }}</b>
{{ _("This will convert the review into a thread, keeping the comments but removing its effect on the package's rating.") }} {{ _("This will convert the review into a thread, keeping the comments but removing its effect on the package's rating.") }}
<div style="clear:both;"></div> <div style="clear:both;"></div>

@ -55,11 +55,11 @@
<tr> <tr>
<th colspan="2"> <th colspan="2">
{% if review.rating > 3 %} {% if review.rating > 3 %}
<i class="fas fa-thumbs-up text-success mr-2"></i> <i class="fas fa-thumbs-up text-success me-2"></i>
{% elif review.rating < 3 %} {% elif review.rating < 3 %}
<i class="fas fa-thumbs-down text-danger mr-2"></i> <i class="fas fa-thumbs-down text-danger me-2"></i>
{% else %} {% else %}
<i class="fas fa-minus mr-2"></i> <i class="fas fa-minus me-2"></i>
{% endif %} {% endif %}
<a href="{{ review.thread.get_view_url() }}"> <a href="{{ review.thread.get_view_url() }}">
{{ review.thread.title }} {{ review.thread.title }}
@ -70,7 +70,7 @@
<td> <td>
{% for vote in review.votes %} {% for vote in review.votes %}
{% if vote.is_positive %} {% if vote.is_positive %}
<a href="{{ url_for('users.profile', username=vote.user.username) }}" class="badge badge-secondary"> <a href="{{ url_for('users.profile', username=vote.user.username) }}" class="badge bg-secondary">
{{ vote.user.username }} {{ vote.user.username }}
</a> </a>
{% endif %} {% endif %}
@ -79,7 +79,7 @@
<td> <td>
{% for vote in review.votes %} {% for vote in review.votes %}
{% if not vote.is_positive %} {% if not vote.is_positive %}
<a href="{{ url_for('users.profile', username=vote.user.username) }}" class="badge badge-secondary"> <a href="{{ url_for('users.profile', username=vote.user.username) }}" class="badge bg-secondary">
{{ vote.user.username }} {{ vote.user.username }}
</a> </a>
{% endif %} {% endif %}

@ -6,7 +6,7 @@
{% block scriptextra %} {% block scriptextra %}
{% if current_user.is_authenticated %} {% if current_user.is_authenticated %}
<script src="/static/quick_review_voting.js"></script> <script src="/static/quick_review_voting.js?v=2"></script>
{% endif %} {% endif %}
{% endblock %} {% endblock %}

@ -23,7 +23,7 @@
{{ render_submit_field(form.submit) }} {{ render_submit_field(form.submit) }}
</form> </form>
<a href="{{ screenshot.url }}" class="col-md-4 text-right"> <a href="{{ screenshot.url }}" class="col-md-4 text-end">
<img src="{{ screenshot.get_thumb_url() }}" alt="{{ screenshot.title }}" /> <img src="{{ screenshot.get_thumb_url() }}" alt="{{ screenshot.title }}" />
</a> </a>
</div> </div>

@ -6,8 +6,8 @@
{% block content %} {% block content %}
{% if package.check_perm(current_user, "ADD_SCREENSHOTS") %} {% if package.check_perm(current_user, "ADD_SCREENSHOTS") %}
<a href="{{ package.get_url('packages.create_screenshot') }}" class="btn btn-primary float-right"> <a href="{{ package.get_url('packages.create_screenshot') }}" class="btn btn-primary float-end">
<i class="fas fa-plus mr-1"></i> <i class="fas fa-plus me-1"></i>
{{ _("Add Image") }} {{ _("Add Image") }}
</a> </a>
{% endif %} {% endif %}
@ -19,7 +19,7 @@
{% if ss.approved or package.check_perm(current_user, "ADD_SCREENSHOTS") %} {% if ss.approved or package.check_perm(current_user, "ADD_SCREENSHOTS") %}
<li class="list-group-item" data-id="{{ ss.id }}"> <li class="list-group-item" data-id="{{ ss.id }}">
<div class="row"> <div class="row">
<div class="col-auto text-muted pr-2"> <div class="col-auto text-muted pe-2">
<i class="fas fa-bars"></i> <i class="fas fa-bars"></i>
</div> </div>
<div class="col-auto"> <div class="col-auto">
@ -32,32 +32,32 @@
{{ ss.width }} x {{ ss.height }} {{ ss.width }} x {{ ss.height }}
{% if ss.is_low_res() %} {% if ss.is_low_res() %}
{% if ss.is_very_small() %} {% if ss.is_very_small() %}
<span class="badge badge-danger ml-3"> <span class="badge bg-danger ms-3">
{{ _("Way too small") }} {{ _("Way too small") }}
</span> </span>
{% elif ss.is_too_small() %} {% elif ss.is_too_small() %}
<span class="badge badge-warning ml-3"> <span class="badge bg-warning ms-3">
{{ _("Too small") }} {{ _("Too small") }}
</span> </span>
{% else %} {% else %}
<span class="badge badge-secondary ml-3"> <span class="badge bg-secondary ms-3">
{{ _("Not HD") }} {{ _("Not HD") }}
</span> </span>
{% endif %} {% endif %}
{% endif %} {% endif %}
{% if not ss.approved %} {% if not ss.approved %}
<span class="ml-3"> <span class="ms-3">
{{ _("Awaiting approval") }} {{ _("Awaiting approval") }}
</span> </span>
{% endif %} {% endif %}
</div> </div>
</div> </div>
<form action="{{ ss.get_delete_url() }}" method="POST" class="col-auto text-right" role="form"> <form action="{{ ss.get_delete_url() }}" method="POST" class="col-auto text-end" role="form">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" /> <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
<a class="btn btn-sm btn-primary" href="{{ ss.get_edit_url() }}"> <a class="btn btn-sm btn-primary" href="{{ ss.get_edit_url() }}">
<i class="fas fa-pen"></i> <i class="fas fa-pen"></i>
</a> </a>
<button type="submit" class="btn btn-sm btn-danger ml-2"> <button type="submit" class="btn btn-sm btn-danger ms-2">
<i class="fas fa-trash"></i> <i class="fas fa-trash"></i>
</button> </button>
</form> </form>
@ -91,7 +91,7 @@
</p> </p>
<div class="client-preview d-flex flex-row align-items-center"> <div class="client-preview d-flex flex-row align-items-center">
<img class="mt-thumb" src="{{ package.get_thumb_or_placeholder(1) }}" alt="{{ _('Thumbnail') }}"> <img class="mt-thumb" src="{{ package.get_thumb_or_placeholder(1) }}" alt="{{ _('Thumbnail') }}">
<div class="flex-grow desc align-self-stretch"> <div class="flex-grow-1 desc align-self-stretch">
<p> <p>
<span class="title">{{ package.title }}</span> by {{ package.author.username }} <span class="title">{{ package.title }}</span> by {{ package.author.username }}
</p> </p>

@ -12,9 +12,9 @@
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<div class="float-right"> <div class="float-end">
<a class="btn btn-secondary mr-2" href="{{ package.get_url('packages.stats_csv') }}"> <a class="btn btn-secondary me-2" href="{{ package.get_url('packages.stats_csv') }}">
<i class="fas fa-download mr-1"></i> <i class="fas fa-download me-1"></i>
{{ _("Download (.csv)") }} {{ _("Download (.csv)") }}
</a> </a>
{{ render_daterange_selector(options, start or end) }} {{ render_daterange_selector(options, start or end) }}

@ -5,7 +5,7 @@
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<a class="btn btn-secondary float-right" href="/help/update_config/">{{ _("Help") }}</a> <a class="btn btn-secondary float-end" href="/help/update_config/">{{ _("Help") }}</a>
<h1>{{ _("Configure Git Update Detection") }}</h1> <h1>{{ _("Configure Git Update Detection") }}</h1>
<p> <p>
@ -46,7 +46,7 @@
<p class="mt-5 pt-4"> <p class="mt-5 pt-4">
{{ render_submit_field(form.submit) }} {{ render_submit_field(form.submit) }}
{{ render_submit_field(form.disable, class_="btn btn-secondary ml-2") }} {{ render_submit_field(form.disable, class_="btn btn-secondary ms-2") }}
</p> </p>
</form> </form>
{% endblock %} {% endblock %}

@ -18,9 +18,9 @@
{% endblock %} {% endblock %}
{% block scriptextra %} {% block scriptextra %}
<script src="/static/video_embed.js"></script> <script src="/static/video_embed.js?v=2"></script>
{% if current_user.is_authenticated %} {% if current_user.is_authenticated %}
<script src="/static/quick_review_voting.js"></script> <script src="/static/quick_review_voting.js?v=2"></script>
{% endif %} {% endif %}
{% endblock %} {% endblock %}
@ -34,7 +34,7 @@
{% block download_btn %} {% block download_btn %}
{% if release %} {% if release %}
<a class="btn btn-block btn-download" rel="nofollow" download="{{ release.get_download_filename() }}" <a class="btn d-block btn-download" rel="nofollow" download="{{ release.get_download_filename() }}"
href="{{ release.get_download_url() }}"> href="{{ release.get_download_url() }}">
<div> <div>
{{ _("Download") }} {{ _("Download") }}
@ -66,7 +66,7 @@
<p class="text-center mt-1 mb-4"> <p class="text-center mt-1 mb-4">
<a href="{{ installing_url }}"> <a href="{{ installing_url }}">
<small> <small>
<i class="fas fa-question-circle mr-1"></i> <i class="fas fa-question-circle me-1"></i>
{{ _("How do I install this?") }} {{ _("How do I install this?") }}
</small> </small>
</a> </a>
@ -109,28 +109,28 @@
{% endif %} {% endif %}
{% set cover_image = package.get_cover_image_url() %} {% set cover_image = package.get_cover_image_url() %}
<header class="jumbotron pb-3" <header class="jumbotron"
style="background: linear-gradient(rgba(0, 0, 0, 0.4), rgba(0, 0, 0, 0.7)), url('{{ cover_image }}'); style="background: linear-gradient(rgba(0, 0, 0, 0.4), rgba(0, 0, 0, 0.7)), url('{{ cover_image }}');
background-size: cover; background-size: cover;
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: center;"> background-position: center;">
<div class="container"> <div class="container">
<div class="btn-group float-right mb-4"> <div class="btn-group float-end mb-4">
{% if package.check_perm(current_user, "EDIT_PACKAGE") %} {% if package.check_perm(current_user, "EDIT_PACKAGE") %}
<a class="btn btn-primary" href="{{ package.get_url('packages.create_edit') }}"> <a class="btn btn-primary" href="{{ package.get_url('packages.create_edit') }}">
<i class="fas fa-pen mr-1"></i> <i class="fas fa-pen me-1"></i>
{{ _("Edit") }} {{ _("Edit") }}
</a> </a>
{% endif %} {% endif %}
{% if package.check_perm(current_user, "MAKE_RELEASE") %} {% if package.check_perm(current_user, "MAKE_RELEASE") %}
<a class="btn btn-primary" href="{{ package.get_url('packages.create_release') }}"> <a class="btn btn-primary" href="{{ package.get_url('packages.create_release') }}">
<i class="fas fa-plus mr-1"></i> <i class="fas fa-plus me-1"></i>
{{ _("Release") }} {{ _("Release") }}
</a> </a>
{% endif %} {% endif %}
{% if package.check_perm(current_user, "DELETE_PACKAGE") or package.check_perm(current_user, "UNAPPROVE_PACKAGE") %} {% if package.check_perm(current_user, "DELETE_PACKAGE") or package.check_perm(current_user, "UNAPPROVE_PACKAGE") %}
<a class="btn btn-danger" href="{{ package.get_url('packages.remove') }}"> <a class="btn btn-danger" href="{{ package.get_url('packages.remove') }}">
<i class="fas fa-trash mr-1"></i> <i class="fas fa-trash me-1"></i>
{{ _("Remove") }} {{ _("Remove") }}
</a> </a>
{% endif %} {% endif %}
@ -146,32 +146,32 @@
<p> <p>
{% if package.dev_state.name == "LOOKING_FOR_MAINTAINER" or package.dev_state.name == "DEPRECATED" %} {% if package.dev_state.name == "LOOKING_FOR_MAINTAINER" or package.dev_state.name == "DEPRECATED" %}
<span class="badge badge-warning" title="{{ package.dev_state.get_desc() }}"> <span class="badge bg-warning" title="{{ package.dev_state.get_desc() }}">
<i class="fas fa-exclamation-circle" style="margin-right: 0.3em;"></i> <i class="fas fa-exclamation-circle" style="margin-right: 0.3em;"></i>
{{ package.dev_state.value }} {{ package.dev_state.value }}
</span> </span>
{% endif %} {% endif %}
{% if package_warning %} {% if package_warning %}
<a class="badge badge-danger" href="/help/non_free/"> <a class="badge bg-danger" href="/help/non_free/">
<i class="fas fa-exclamation-circle" style="margin-right: 0.3em;"></i> <i class="fas fa-exclamation-circle" style="margin-right: 0.3em;"></i>
{{ package_warning }} {{ package_warning }}
</a> </a>
{% endif %} {% endif %}
{% for warning in package.content_warnings %} {% for warning in package.content_warnings %}
<a class="badge badge-warning" rel="nofollow" href="/help/content_flags/" <a class="badge bg-warning" rel="nofollow" href="/help/content_flags/"
title="{{ warning.description }}"> title="{{ warning.description }}">
<i class="fas fa-exclamation-circle" style="margin-right: 0.3em;"></i> <i class="fas fa-exclamation-circle" style="margin-right: 0.3em;"></i>
{{ warning.title }} {{ warning.title }}
</a> </a>
{% endfor %} {% endfor %}
{% if package.dev_state.name == "WIP" %} {% if package.dev_state.name == "WIP" %}
<span class="badge badge-info" title="{{ package.dev_state.get_desc() }}"> <span class="badge bg-info" title="{{ package.dev_state.get_desc() }}">
<i class="fas fa-tools" style="margin-right: 0.3em;"></i> <i class="fas fa-tools" style="margin-right: 0.3em;"></i>
{{ _("Work in Progress") }} {{ _("Work in Progress") }}
</span> </span>
{% endif %} {% endif %}
{% for t in package.tags %} {% for t in package.tags %}
<a class="badge badge-primary" rel="nofollow" <a class="badge bg-primary" rel="nofollow"
title="{{ t.description or '' }}" title="{{ t.description or '' }}"
href="{{ url_for('packages.list_all', tag=t.name) }}"> href="{{ url_for('packages.list_all', tag=t.name) }}">
{{ t.title }} {{ t.title }}
@ -251,8 +251,8 @@
{% set screenshots = package.screenshots.all() %} {% set screenshots = package.screenshots.all() %}
{% if package.check_perm(current_user, "ADD_SCREENSHOTS") %} {% if package.check_perm(current_user, "ADD_SCREENSHOTS") %}
<a href="{{ package.get_url('packages.screenshots') }}" class="btn btn-primary float-right"> <a href="{{ package.get_url('packages.screenshots') }}" class="btn btn-primary float-end">
<i class="fas fa-images mr-1"></i> <i class="fas fa-images me-1"></i>
{{ _("Edit") }} {{ _("Edit") }}
</a> </a>
{% endif %} {% endif %}
@ -355,12 +355,12 @@
<div class="d-flex mt-3 mb-4"> <div class="d-flex mt-3 mb-4">
<form method="POST" action="{{ package.get_url('collections.package_toggle_favorite') }}"> <form method="POST" action="{{ package.get_url('collections.package_toggle_favorite') }}">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" /> <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
<button type="submit" class="btn {% if is_favorited %}text-info{% endif %} btn-secondary mr-2" aria-label="{{ _('Favorite') }}"> <button type="submit" class="btn {% if is_favorited %}text-info{% endif %} btn-secondary me-2" aria-label="{{ _('Favorite') }}">
<i class="fas fa-star"></i> <i class="fas fa-star"></i>
</button> </button>
</form> </form>
<div class="flex-grow"> <div class="flex-grow-1">
<a href="{{ package.get_url('collections.package_add') }}" class="btn btn-block btn-secondary"> <a href="{{ package.get_url('collections.package_add') }}" class="btn d-block btn-secondary">
{{ _("Add to collection...") }} {{ _("Add to collection...") }}
</a> </a>
</div> </div>
@ -377,16 +377,16 @@
{{ config.get_message() }} {{ config.get_message() }}
</p> </p>
<p class="mt-0 my-1" style="font-size: 80%; opacity: 85%;"> <p class="mt-0 my-1" style="font-size: 80%; opacity: 85%;">
<i class="fas fa-lock mr-1"></i> <i class="fas fa-lock me-1"></i>
{{ _("Only visible to the author and Editors.") }} {{ _("Only visible to the author and Editors.") }}
</p> </p>
<div class="btn-group btn-group-sm my-0"> <div class="btn-group btn-group-sm my-0">
<a class="btn btn-warning" href="{{ config.get_create_release_url() }}"> <a class="btn btn-warning" href="{{ config.get_create_release_url() }}">
<i class="fas fa-plus mr-1"></i> <i class="fas fa-plus me-1"></i>
{{ _("Release") }} {{ _("Release") }}
</a> </a>
<a class="btn btn-warning" href="{{ package.get_url('packages.update_config') }}"> <a class="btn btn-warning" href="{{ package.get_url('packages.update_config') }}">
<i class="fas fa-cog mr-1"></i> <i class="fas fa-cog me-1"></i>
{{ _("Update settings") }} {{ _("Update settings") }}
</a> </a>
</div> </div>
@ -394,7 +394,7 @@
{% endif %} {% endif %}
{% if package_warning %} {% if package_warning %}
<p class="alert alert-danger"> <p class="alert alert-danger">
<a href="/help/non_free/" class="float-right">Info</a> <a href="/help/non_free/" class="float-end">Info</a>
<b>{{ _("Warning") }}:</b> {{ package_warning }} <b>{{ _("Warning") }}:</b> {{ package_warning }}
</p> </p>
{% endif %} {% endif %}
@ -402,15 +402,15 @@
{% if package.donate_url_actual %} {% if package.donate_url_actual %}
<div class="alert alert-secondary mb-4"> <div class="alert alert-secondary mb-4">
<p>{{ _("Like this package? Help support its development by making a donation", display_name=package.author.display_name) }}</p> <p>{{ _("Like this package? Help support its development by making a donation", display_name=package.author.display_name) }}</p>
<a class="btn btn-block btn-primary" href="{{ package.donate_url_actual }}" rel="nofollow"> <a class="btn d-block btn-primary" href="{{ package.donate_url_actual }}" rel="nofollow">
<i class="fas fa-heart mr-2"></i> <i class="fas fa-heart me-2"></i>
{{ _("Donate now") }} {{ _("Donate now") }}
</a> </a>
</div> </div>
{% endif %} {% endif %}
{% if package.type == package.type.GAME %} {% if package.type == package.type.GAME %}
<a href="{{ package.get_url('packages.game_hub') }}" class="btn btn-lg btn-block mb-4 btn-primary"> <a href="{{ package.get_url('packages.game_hub') }}" class="btn btn-lg d-block mb-4 btn-primary">
{{ _("View content for game") }} {{ _("View content for game") }}
</a> </a>
{% endif %} {% endif %}
@ -422,13 +422,13 @@
<dd> <dd>
{% for dep in package.get_sorted_hard_dependencies() %} {% for dep in package.get_sorted_hard_dependencies() %}
{%- if dep.package %} {%- if dep.package %}
<a class="badge badge-primary" <a class="badge bg-primary"
href="{{ dep.package.get_url('packages.view') }}"> href="{{ dep.package.get_url('packages.view') }}">
{{ _("%(title)s by %(display_name)s", {{ _("%(title)s by %(display_name)s",
title=dep.package.title, display_name=dep.package.author.display_name) }} title=dep.package.title, display_name=dep.package.author.display_name) }}
</a> </a>
{% elif dep.meta_package %} {% elif dep.meta_package %}
<a class="badge badge-primary" <a class="badge bg-primary"
href="{{ url_for('modnames.view', name=dep.meta_package.name) }}"> href="{{ url_for('modnames.view', name=dep.meta_package.name) }}">
{{ dep.meta_package.name }} {{ dep.meta_package.name }}
</a> </a>
@ -446,12 +446,12 @@
<dd> <dd>
{% for dep in optional_deps %} {% for dep in optional_deps %}
{%- if dep.package %} {%- if dep.package %}
<a class="badge badge-secondary" <a class="badge bg-secondary"
href="{{ dep.package.get_url('packages.view') }}"> href="{{ dep.package.get_url('packages.view') }}">
{{ _("%(title)s by %(display_name)s", {{ _("%(title)s by %(display_name)s",
title=dep.package.title, display_name=dep.package.author.display_name) }} title=dep.package.title, display_name=dep.package.author.display_name) }}
{% elif dep.meta_package %} {% elif dep.meta_package %}
<a class="badge badge-secondary" <a class="badge bg-secondary"
href="{{ url_for('modnames.view', name=dep.meta_package.name) }}"> href="{{ url_for('modnames.view', name=dep.meta_package.name) }}">
{{ dep.meta_package.name }} {{ dep.meta_package.name }}
{% else %} {% else %}
@ -471,7 +471,7 @@
{% if supported_games or unsupported_games or package.type == package.type.MOD %} {% if supported_games or unsupported_games or package.type == package.type.MOD %}
<h3> <h3>
{% if package.check_perm(current_user, "EDIT_PACKAGE") %} {% if package.check_perm(current_user, "EDIT_PACKAGE") %}
<a href="{{ package.get_url('packages.game_support') }}" class="btn btn-secondary btn-sm float-right"> <a href="{{ package.get_url('packages.game_support') }}" class="btn btn-secondary btn-sm float-end">
<i class="fas fa-pen"></i> <i class="fas fa-pen"></i>
</a> </a>
{% endif %} {% endif %}
@ -491,7 +491,7 @@
{% if supported_games %} {% if supported_games %}
<div style="max-height: 300px; overflow: hidden auto;" class="mb-3"> <div style="max-height: 300px; overflow: hidden auto;" class="mb-3">
{% for support in supported_games %} {% for support in supported_games %}
<a class="badge badge-secondary" <a class="badge bg-secondary"
href="{{ support.game.get_url('packages.view') }}"> href="{{ support.game.get_url('packages.view') }}">
{{ _("%(title)s by %(display_name)s", {{ _("%(title)s by %(display_name)s",
title=support.game.title, display_name=support.game.author.display_name) }} title=support.game.title, display_name=support.game.author.display_name) }}
@ -522,9 +522,9 @@
</p> </p>
<div style="max-height: 300px; overflow: hidden auto;"> <div style="max-height: 300px; overflow: hidden auto;">
{% for support in unsupported_games %} {% for support in unsupported_games %}
<a class="badge badge-danger" <a class="badge bg-danger"
href="{{ support.game.get_url('packages.view') }}"> href="{{ support.game.get_url('packages.view') }}">
<i class="fas fa-times mr-1"></i> <i class="fas fa-times me-1"></i>
{{ _("%(title)s by %(display_name)s", {{ _("%(title)s by %(display_name)s",
title=support.game.title, display_name=support.game.author.display_name) }} title=support.game.title, display_name=support.game.author.display_name) }}
</a> </a>
@ -542,7 +542,7 @@
{% elif package.check_perm(current_user, "EDIT_PACKAGE") %} {% elif package.check_perm(current_user, "EDIT_PACKAGE") %}
<p class="alert alert-warning"> <p class="alert alert-warning">
{% if package.check_perm(current_user, "EDIT_PACKAGE") %} {% if package.check_perm(current_user, "EDIT_PACKAGE") %}
<a href="{{ package.get_url('packages.game_support') }}" class="btn btn-warning btn-sm float-right"> <a href="{{ package.get_url('packages.game_support') }}" class="btn btn-warning btn-sm float-end">
<i class="fas fa-pen"></i> <i class="fas fa-pen"></i>
</a> </a>
{% endif %} {% endif %}
@ -582,7 +582,7 @@
<dt>{{ _("Maintainers") }}</dt> <dt>{{ _("Maintainers") }}</dt>
<dd> <dd>
{% for user in package.maintainers %} {% for user in package.maintainers %}
<a class="badge badge-secondary" <a class="badge bg-secondary"
href="{{ url_for('users.profile', username=user.username) }}"> href="{{ url_for('users.profile', username=user.username) }}">
{{ user.display_name }} {{ user.display_name }}
</a> </a>
@ -598,7 +598,7 @@
{% if package.provides %} {% if package.provides %}
<dt>{{ _("Provides") }}</dt> <dt>{{ _("Provides") }}</dt>
<dd>{% for meta in package.provides %} <dd>{% for meta in package.provides %}
<a class="badge badge-secondary" <a class="badge bg-secondary"
href="{{ url_for('modnames.view', name=meta.name) }}">{{ meta.name }}</a> href="{{ url_for('modnames.view', name=meta.name) }}">{{ meta.name }}</a>
{% endfor %}</dd> {% endfor %}</dd>
{% endif %} {% endif %}
@ -606,7 +606,7 @@
<h3> <h3>
{% if package.check_perm(current_user, "MAKE_RELEASE") %} {% if package.check_perm(current_user, "MAKE_RELEASE") %}
<a class="btn btn-primary btn-sm float-right" href="{{ package.get_url('packages.create_release') }}"><i class="fas fa-plus"></i></a> <a class="btn btn-primary btn-sm float-end" href="{{ package.get_url('packages.create_release') }}"><i class="fas fa-plus"></i></a>
{% endif %} {% endif %}
{{ _("Releases") }} {{ _("Releases") }}
</h3> </h3>
@ -624,7 +624,7 @@
<h3> <h3>
{% if package.approved and package.check_perm(current_user, "CREATE_THREAD") %} {% if package.approved and package.check_perm(current_user, "CREATE_THREAD") %}
<div class="btn-group float-right"> <div class="btn-group float-end">
<a class="btn btn-primary btn-sm mx-1" href="{{ url_for('threads.new', pid=package.id) }}"><i class="fas fa-plus"></i></a> <a class="btn btn-primary btn-sm mx-1" href="{{ url_for('threads.new', pid=package.id) }}"><i class="fas fa-plus"></i></a>
</div> </div>
{% endif %} {% endif %}
@ -638,7 +638,7 @@
<p class="mt-3"> <p class="mt-3">
{% if package.approved and current_user != package.author %} {% if package.approved and current_user != package.author %}
<a href="{{ url_for('report.report', url=url_current()) }}"> <a href="{{ url_for('report.report', url=url_current()) }}">
<i class="fas fa-flag mr-1"></i> <i class="fas fa-flag me-1"></i>
{{ _("Report") }} {{ _("Report") }}
</a> </a>
{% endif %} {% endif %}

@ -16,7 +16,7 @@
{{ _("Please sign in or contact the admin in another way") }} {{ _("Please sign in or contact the admin in another way") }}
</p> </p>
<p> <p>
<a href="{{ url_for('users.login') }}" class="btn btn-primary mr-2">Login</a> <a href="{{ url_for('users.login') }}" class="btn btn-primary me-2">Login</a>
<a href="https://rubenwardy.com/contact/" class="btn btn-secondary">Contact the admin</a> <a href="https://rubenwardy.com/contact/" class="btn btn-secondary">Contact the admin</a>
</p> </p>

@ -15,7 +15,7 @@
<div class="card-body"> <div class="card-body">
<p>{{ _("Deleting is permanent") }}</p> <p>{{ _("Deleting is permanent") }}</p>
<a class="btn btn-secondary mr-3" href="{{ thread.get_view_url() }}">{{ _("Cancel") }}</a> <a class="btn btn-secondary me-3" href="{{ thread.get_view_url() }}">{{ _("Cancel") }}</a>
<input type="submit" value="{{ _('Delete') }}" class="btn btn-danger" /> <input type="submit" value="{{ _('Delete') }}" class="btn btn-danger" />
</div> </div>
</form> </form>

@ -15,7 +15,7 @@
<div class="card-body"> <div class="card-body">
<p>{{ _("Deleting is permanent") }}</p> <p>{{ _("Deleting is permanent") }}</p>
<a class="btn btn-secondary mr-3" href="{{ thread.get_view_url() }}">{{ _("Cancel") }}</a> <a class="btn btn-secondary me-3" href="{{ thread.get_view_url() }}">{{ _("Cancel") }}</a>
<input type="submit" value="{{ _('Delete') }}" class="btn btn-danger" /> <input type="submit" value="{{ _('Delete') }}" class="btn btn-danger" />
</div> </div>
</form> </form>

@ -9,7 +9,7 @@
{% block content %} {% block content %}
{% if current_user.is_authenticated and package %} {% if current_user.is_authenticated and package %}
<a href="{{ url_for('threads.new', pid=package and package.id) }}" class="btn btn-primary float-right">{{ _("New Thread") }}</a> <a href="{{ url_for('threads.new', pid=package and package.id) }}" class="btn btn-primary float-end">{{ _("New Thread") }}</a>
{% endif %} {% endif %}
<h1>{{ self.title() }}</h1> <h1>{{ self.title() }}</h1>

@ -25,29 +25,29 @@
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
<a class="author {{ r.author.rank.name }} mr-3" <a class="author {{ r.author.rank.name }} me-3"
href="{{ url_for('users.profile', username=r.author.username) }}"> href="{{ url_for('users.profile', username=r.author.username) }}">
{{ r.author.display_name }} {{ r.author.display_name }}
</a> </a>
{% if r.author.username != r.author.display_name %} {% if r.author.username != r.author.display_name %}
<span class="text-muted small mr-2"> <span class="text-muted small me-2">
({{ r.author.username }}) ({{ r.author.username }})
</span> </span>
{% endif %} {% endif %}
{% if r == r.thread.first_reply %} {% if r == r.thread.first_reply %}
<a class="badge badge-primary" href="{{ r.thread.get_view_url() }}"> <a class="badge bg-primary" href="{{ r.thread.get_view_url() }}">
{{ r.thread.title }} {{ r.thread.title }}
</a> </a>
{% else %} {% else %}
<i class="fas fa-reply mr-2"></i> <i class="fas fa-reply me-2"></i>
<a class="badge badge-dark" href="{{ r.thread.get_view_url() }}"> <a class="badge bg-dark" href="{{ r.thread.get_view_url() }}">
{{ _("Reply to <b>%(title)s</b>", title=r.thread.title) }} {{ _("Reply to <b>%(title)s</b>", title=r.thread.title) }}
</a> </a>
{% endif %} {% endif %}
<a name="reply-{{ r.id }}" class="text-muted float-right" <a name="reply-{{ r.id }}" class="text-muted float-end"
href="{{ url_for('threads.view', id=r.thread.id) }}#reply-{{ r.id }}"> href="{{ url_for('threads.view', id=r.thread.id) }}#reply-{{ r.id }}">
{{ r.created_at | datetime }} {{ r.created_at | datetime }}
</a> </a>

@ -27,40 +27,40 @@
{% block scriptextra %} {% block scriptextra %}
{% if current_user.is_authenticated %} {% if current_user.is_authenticated %}
<script src="/static/quick_review_voting.js"></script> <script src="/static/quick_review_voting.js?v=2"></script>
{% endif %} {% endif %}
{% endblock %} {% endblock %}
{% block content %} {% block content %}
{% if current_user.is_authenticated %} {% if current_user.is_authenticated %}
{% if current_user in thread.watchers %} {% if current_user in thread.watchers %}
<form method="post" action="{{ thread.get_unsubscribe_url() }}" class="float-right"> <form method="post" action="{{ thread.get_unsubscribe_url() }}" class="float-end">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" /> <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
<input type="submit" class="btn btn-primary" value="{{ _('Unsubscribe') }}" /> <input type="submit" class="btn btn-primary" value="{{ _('Unsubscribe') }}" />
</form> </form>
{% else %} {% else %}
<form method="post" action="{{ thread.get_subscribe_url() }}" class="float-right"> <form method="post" action="{{ thread.get_subscribe_url() }}" class="float-end">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" /> <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
<input type="submit" class="btn btn-primary" value="{{ _('Subscribe') }}" /> <input type="submit" class="btn btn-primary" value="{{ _('Subscribe') }}" />
</form> </form>
{% endif %} {% endif %}
{% if thread.check_perm(current_user, "DELETE_THREAD") %} {% if thread.check_perm(current_user, "DELETE_THREAD") %}
<a href="{{ url_for('threads.delete_thread', id=thread.id) }}" class="float-right mr-2 btn btn-danger">{{ _('Delete') }}</a> <a href="{{ url_for('threads.delete_thread', id=thread.id) }}" class="float-end me-2 btn btn-danger">{{ _('Delete') }}</a>
{% endif %} {% endif %}
{% if thread.review and thread.review.check_perm(current_user, "DELETE_REVIEW") and current_user.username != thread.review.author.username %} {% if thread.review and thread.review.check_perm(current_user, "DELETE_REVIEW") and current_user.username != thread.review.author.username %}
<form method="post" action="{{ thread.review.get_delete_url() }}" class="float-right mr-2"> <form method="post" action="{{ thread.review.get_delete_url() }}" class="float-end me-2">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" /> <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
<input type="submit" class="btn btn-danger" value="{{ _('Convert to Thread') }}" /> <input type="submit" class="btn btn-danger" value="{{ _('Convert to Thread') }}" />
</form> </form>
{% endif %} {% endif %}
{% if thread.check_perm(current_user, "LOCK_THREAD") %} {% if thread.check_perm(current_user, "LOCK_THREAD") %}
{% if thread.locked %} {% if thread.locked %}
<form method="post" action="{{ url_for('threads.set_lock', id=thread.id, lock=0) }}" class="float-right mr-2"> <form method="post" action="{{ url_for('threads.set_lock', id=thread.id, lock=0) }}" class="float-end me-2">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" /> <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
<input type="submit" class="btn btn-secondary" value="{{ _('Unlock') }}" /> <input type="submit" class="btn btn-secondary" value="{{ _('Unlock') }}" />
</form> </form>
{% else %} {% else %}
<form method="post" action="{{ url_for('threads.set_lock', id=thread.id, lock=1) }}" class="float-right mr-2"> <form method="post" action="{{ url_for('threads.set_lock', id=thread.id, lock=1) }}" class="float-end me-2">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" /> <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
<input type="submit" class="btn btn-secondary" value="{{ _('Lock') }}" /> <input type="submit" class="btn btn-secondary" value="{{ _('Lock') }}" />
</form> </form>
@ -69,7 +69,7 @@
{% endif %} {% endif %}
{% if current_user == thread.author and thread.review %} {% if current_user == thread.author and thread.review %}
<a class="btn btn-primary ml-1 float-right mr-2" <a class="btn btn-primary ms-1 float-end me-2"
href="{{ thread.review.package.get_url('packages.review') }}"> href="{{ thread.review.package.get_url('packages.review') }}">
<i class="fas fa-pen"></i> <i class="fas fa-pen"></i>
{{ _("Edit Review") }} {{ _("Edit Review") }}
@ -79,11 +79,11 @@
<h1> <h1>
{% if thread.review %} {% if thread.review %}
{% if thread.review.rating > 3 %} {% if thread.review.rating > 3 %}
<i class="fas fa-thumbs-up mr-2" style="color:#6f6;"></i> <i class="fas fa-thumbs-up me-2" style="color:#6f6;"></i>
{% elif thread.review.rating < 3 %} {% elif thread.review.rating < 3 %}
<i class="fas fa-thumbs-down mr-2" style="color:#f66;"></i> <i class="fas fa-thumbs-down me-2" style="color:#f66;"></i>
{% else %} {% else %}
<i class="fas fa-minus mr-2" style="color:#999"></i> <i class="fas fa-minus me-2" style="color:#999"></i>
{% endif %} {% endif %}
{% endif %} {% endif %}
{% if thread.private %}&#x1f512; {% endif %}{{ thread.title }} {% if thread.private %}&#x1f512; {% endif %}{{ thread.title }}
@ -104,7 +104,7 @@
</div> </div>
<div class="col-md-3"> <div class="col-md-3">
<div class="d-flex flex-row justify-content-end flex-wrap align-items-center" style="gap: 0.5em;"> <div class="d-flex flex-row justify-content-end flex-wrap align-items-center" style="gap: 0.5em;">
<span class="text-muted mr-2" title="{{ _('This thread is visible to the following users') }}"> <span class="text-muted me-2" title="{{ _('This thread is visible to the following users') }}">
{{ _("Visible to:") }} {{ _("Visible to:") }}
</span> </span>
{% for viewer in thread.get_visible_to() %} {% for viewer in thread.get_visible_to() %}

@ -9,7 +9,7 @@
{% if can_approve_scn and screenshots %} {% if can_approve_scn and screenshots %}
<div class="card my-4"> <div class="card my-4">
<h3 class="card-header">{{ _("Screenshots") }} <h3 class="card-header">{{ _("Screenshots") }}
<form class="float-right" method="post" action="{{ url_for('todo.view_editor') }}"> <form class="float-end" method="post" action="{{ url_for('todo.view_editor') }}">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" /> <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
<input type="hidden" name="action" value="screenshots_approve_all" /> <input type="hidden" name="action" value="screenshots_approve_all" />
<input class="btn btn-sm btn-primary" type="submit" value="{{ _('Approve All') }}" /> <input class="btn btn-sm btn-primary" type="submit" value="{{ _('Approve All') }}" />
@ -47,16 +47,16 @@
<div class="list-group list-group-flush"> <div class="list-group list-group-flush">
{% for p in packages %} {% for p in packages %}
<a href="{{ p.get_url('packages.view') }}" class="list-group-item list-group-item-action"> <a href="{{ p.get_url('packages.view') }}" class="list-group-item list-group-item-action">
<span class="float-right" title="Created {{ p.created_at | datetime }}"> <span class="float-end" title="Created {{ p.created_at | datetime }}">
<small> <small>
{{ p.created_at | timedelta }} ago {{ p.created_at | timedelta }} ago
</small> </small>
</span> </span>
{% if "Other" in p.license.name or "Other" in p.media_license.name %} {% if "Other" in p.license.name or "Other" in p.media_license.name %}
<span class="mr-2 badge badge-info">License</span> <span class="me-2 badge bg-info">License</span>
{% else %} {% else %}
<span class="mr-2 badge badge-success">Ready</span> <span class="me-2 badge bg-success">Ready</span>
{% endif %} {% endif %}
{{ p.title }} by {{ p.author.display_name }} {{ p.title }} by {{ p.author.display_name }}
@ -77,7 +77,7 @@
{% for r in releases %} {% for r in releases %}
<li class="list-group-item"> <li class="list-group-item">
{% if r.task_id %} {% if r.task_id %}
<span class="mr-2 badge badge-warning">{{ _("Importing") }}</span> <span class="me-2 badge bg-warning">{{ _("Importing") }}</span>
{% endif %} {% endif %}
<a href="{{ r.get_edit_url() }}">{{ r.title }}</a> <a href="{{ r.get_edit_url() }}">{{ r.title }}</a>
on on
@ -108,13 +108,13 @@
<div class="list-group list-group-flush"> <div class="list-group list-group-flush">
{% for p in license_needed %} {% for p in license_needed %}
<a href="{{ p.get_url('packages.view') }}" class="list-group-item list-group-item-action"> <a href="{{ p.get_url('packages.view') }}" class="list-group-item list-group-item-action">
<span class="float-right" title="Created {{ p.created_at | datetime }}"> <span class="float-end" title="Created {{ p.created_at | datetime }}">
<small> <small>
{{ p.created_at | timedelta }} ago {{ p.created_at | timedelta }} ago
</small> </small>
</span> </span>
<span class="mr-2 badge badge-{{ p.state.color }}">{{ p.state.value }}</span> <span class="me-2 badge bg-{{ p.state.color }}">{{ p.state.value }}</span>
{{ p.title }} by {{ p.author.display_name }} {{ p.title }} by {{ p.author.display_name }}
</a> </a>
@ -142,7 +142,7 @@
{% if unfulfilled_meta_packages %} {% if unfulfilled_meta_packages %}
<h2 class="mt-5"> <h2 class="mt-5">
<span class="fas fa-exclamation-triangle pr-2" style="color: orange;"></span> <span class="fas fa-exclamation-triangle pe-2" style="color: orange;"></span>
{{ unfulfilled_meta_packages }} {{ unfulfilled_meta_packages }}
{{ _("Unfulfilled Dependencies") }} {{ _("Unfulfilled Dependencies") }}
</h2> </h2>
@ -165,16 +165,16 @@
<div class="list-group list-group-flush" style="max-height: 300px; overflow: hidden auto;"> <div class="list-group list-group-flush" style="max-height: 300px; overflow: hidden auto;">
{% for p in wip_packages %} {% for p in wip_packages %}
<a href="{{ p.get_url('packages.view') }}" class="list-group-item list-group-item-action"> <a href="{{ p.get_url('packages.view') }}" class="list-group-item list-group-item-action">
<span class="float-right" title="Created {{ p.created_at | datetime }}"> <span class="float-end" title="Created {{ p.created_at | datetime }}">
<small> <small>
{{ p.created_at | timedelta }} ago {{ p.created_at | timedelta }} ago
</small> </small>
</span> </span>
{% if p.state == p.state.WIP %} {% if p.state == p.state.WIP %}
<span class="mr-2 badge badge-warning">{{ _("WIP") }}</span> <span class="me-2 badge bg-warning">{{ _("WIP") }}</span>
{% else %} {% else %}
<span class="mr-2 badge badge-danger">{{ p.state.value }}</span> <span class="me-2 badge bg-danger">{{ p.state.value }}</span>
{% endif %} {% endif %}
{{ p.title }} by {{ p.author.display_name }} {{ p.title }} by {{ p.author.display_name }}
@ -189,7 +189,7 @@
<div class="mt-5"></div> <div class="mt-5"></div>
{% if current_user.rank.at_least(current_user.rank.MODERATOR) %} {% if current_user.rank.at_least(current_user.rank.MODERATOR) %}
<a class="btn btn-secondary float-right" href="{{ url_for('admin.audit') }}"> <a class="btn btn-secondary float-end" href="{{ url_for('admin.audit') }}">
{{ _("View All") }} {{ _("View All") }}
</a> </a>
{% endif %} {% endif %}

@ -5,7 +5,7 @@
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<a class="btn btn-secondary float-right" href="/help/game_support/">{{ _("Help") }}</a> <a class="btn btn-secondary float-end" href="/help/game_support/">{{ _("Help") }}</a>
<h1 class="mb-5">{{ self.title() }}</h1> <h1 class="mb-5">{{ self.title() }}</h1>
<p> <p>
{{ _("You should specify the games supported by your mods and texture packs.") }} {{ _("You should specify the games supported by your mods and texture packs.") }}
@ -24,13 +24,13 @@
style="max-height: 22px; max-width: 22px;" style="max-height: 22px; max-width: 22px;"
src="{{ package.get_thumb_or_placeholder() }}" /> src="{{ package.get_thumb_or_placeholder() }}" />
<span class="pl-2"> <span class="ps-2">
{{ package.title }} {{ package.title }}
</span> </span>
</div> </div>
<div class="col"> <div class="col">
{% if package.supports_all_games %} {% if package.supports_all_games %}
<span class="text-muted pr-2"> <span class="text-muted pe-2">
<i> <i>
{{ _("Supports all games") }} {{ _("Supports all games") }}
</i> </i>
@ -40,7 +40,7 @@
{% set supported_games = package.get_sorted_game_support_pair()[0] %} {% set supported_games = package.get_sorted_game_support_pair()[0] %}
{% if supported_games %} {% if supported_games %}
{% for support in supported_games %} {% for support in supported_games %}
<a class="badge badge-secondary" <a class="badge bg-secondary"
href="{{ support.game.get_url('packages.view') }}"> href="{{ support.game.get_url('packages.view') }}">
{{ _("%(title)s by %(display_name)s", {{ _("%(title)s by %(display_name)s",
title=support.game.title, display_name=support.game.author.display_name) }} title=support.game.title, display_name=support.game.author.display_name) }}

@ -6,8 +6,8 @@
{% block content %} {% block content %}
<h1>{{ self.title() }}</h1> <h1>{{ self.title() }}</h1>
<div class="btn-toolbar float-right"> <div class="btn-toolbar float-end">
<div class="btn-group btn-group-sm mr-2"> <div class="btn-group btn-group-sm me-2">
{% if is_mtm_only %} {% if is_mtm_only %}
<a class="btn btn-sm btn-primary active" href="{{ url_set_query(mtm=0) }}"> <a class="btn btn-sm btn-primary active" href="{{ url_set_query(mtm=0) }}">
{{ _("Minetest-Mods org only") }} {{ _("Minetest-Mods org only") }}

@ -5,8 +5,8 @@
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<div class="btn-toolbar float-right"> <div class="btn-toolbar float-end">
<div class="btn-group btn-group-sm mr-2"> <div class="btn-group btn-group-sm me-2">
{% if is_mtm_only %} {% if is_mtm_only %}
<a class="btn btn-sm btn-primary active" href="{{ url_set_query(mtm=0) }}"> <a class="btn btn-sm btn-primary active" href="{{ url_set_query(mtm=0) }}">
{{ _("Minetest-Mods org only") }} {{ _("Minetest-Mods org only") }}

@ -5,8 +5,8 @@
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<div class="btn-toolbar float-right"> <div class="btn-toolbar float-end">
<div class="btn-group btn-group-sm mr-2"> <div class="btn-group btn-group-sm me-2">
{% if is_mtm_only %} {% if is_mtm_only %}
<a class="btn btn-sm btn-primary active" href="{{ url_set_query(mtm=0) }}"> <a class="btn btn-sm btn-primary active" href="{{ url_set_query(mtm=0) }}">
{{ _("Minetest-Mods org only") }} {{ _("Minetest-Mods org only") }}

@ -8,16 +8,14 @@
<div class="row"> <div class="row">
<div class="col-md-6"> <div class="col-md-6">
<form method="GET"> <form method="GET">
<label for="q" class="sr-only">{{ _('Search all packages') }}</label> <label for="q" class="visually-hidden">{{ _('Search all packages') }}</label>
<div class="input-group"> <div class="input-group">
<input class="form-control" id="q" name="q" type="text" placeholder="{{ _('Search all packages') }}"> <input class="form-control" id="q" name="q" type="text" placeholder="{{ _('Search all packages') }}">>
<div class="input-group-append"> <input class="btn btn-primary" type="submit" value="{{ _('Search') }}">
<input class="btn btn-primary" type="submit" value="{{ _('Search') }}">
</div>
</div> </div>
</form> </form>
</div> </div>
<div class="col-md-6 text-right"> <div class="col-md-6 text-end">
{% if only_no_tags %} {% if only_no_tags %}
<a class="btn btn-primary" href="{{ url_set_query(no_tags=0) }}"> <a class="btn btn-primary" href="{{ url_set_query(no_tags=0) }}">
{{ _("Missing tags only") }} {{ _("Missing tags only") }}
@ -28,7 +26,7 @@
</a> </a>
{% endif %} {% endif %}
{% if check_global_perm(current_user, "EDIT_TAGS") %} {% if check_global_perm(current_user, "EDIT_TAGS") %}
<a class="btn btn-secondary ml-2" href="{{ url_for('admin.tag_list') }}">{{ _("Edit Tags") }}</a> <a class="btn btn-secondary ms-2" href="{{ url_for('admin.tag_list') }}">{{ _("Edit Tags") }}</a>
{% endif %} {% endif %}
</div> </div>
</div> </div>
@ -57,12 +55,12 @@
</td> </td>
<td class="tags"> <td class="tags">
{% for tag in package.tags %} {% for tag in package.tags %}
<a class="badge badge-primary mr-1" <a class="badge bg-primary me-1"
href="{{ url_set_query(_add={ 'tag': tag.name }) }}"> href="{{ url_set_query(_add={ 'tag': tag.name }) }}">
{{ tag.title }} {{ tag.title }}
</a> </a>
{% endfor %} {% endfor %}
<!-- <a class="badge badge-secondary add-btn px-2" href="#"> <!-- <a class="badge bg-secondary add-btn px-2" href="#">
<i class="fas fa-plus"></i> <i class="fas fa-plus"></i>
</a> --> </a> -->
</td> </td>

@ -5,8 +5,8 @@ Topics to be Added
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<div class="float-right"> <div class="float-end">
<div class="btn-group btn-group-sm mr-2"> <div class="btn-group btn-group-sm me-2">
<a class="btn btn-secondary {% if sort_by=='date' %}active{% endif %}" <a class="btn btn-secondary {% if sort_by=='date' %}active{% endif %}"
href="{{ url_for('todo.topics', q=query, show_discarded=show_discarded, n=n, sort='date') }}"> href="{{ url_for('todo.topics', q=query, show_discarded=show_discarded, n=n, sort='date') }}">
{{ _("Sort by date") }} {{ _("Sort by date") }}
@ -69,7 +69,7 @@ Topics to be Added
<input type="hidden" name="n" value={{ n }} /> <input type="hidden" name="n" value={{ n }} />
<input type="hidden" name="sort" value={{ sort_by or "date" }} /> <input type="hidden" name="sort" value={{ sort_by or "date" }} />
<input name="q" type="text" placeholder="Search topics" value="{{ query or ''}}"> <input name="q" type="text" placeholder="Search topics" value="{{ query or ''}}">
<input class="btn btn-secondary my-2 my-sm-0 mr-sm-2" type="submit" value="Search" /> <input class="btn btn-secondary my-2 my-sm-0 me-sm-2" type="submit" value="Search" />
</form> </form>
{% from "macros/topics.html" import render_topics_table %} {% from "macros/topics.html" import render_topics_table %}

@ -26,7 +26,7 @@
style="max-height: 22px; max-width: 22px;" style="max-height: 22px; max-width: 22px;"
src="{{ package.get_thumb_or_placeholder() }}" /> src="{{ package.get_thumb_or_placeholder() }}" />
<span class="pl-2"> <span class="ps-2">
{{ package.title }} {{ package.title }}
</span> </span>
</div> </div>
@ -41,14 +41,14 @@
{% endfor %} {% endfor %}
</div> </div>
<a class="btn btn-secondary float-right" href="/help/update_config/"> <a class="btn btn-secondary float-end" href="/help/update_config/">
{{ _("Help") }} {{ _("Help") }}
</a> </a>
<a class="btn btn-secondary float-right mr-2" href="{{ url_for('packages.bulk_update_config', username=user.username) }}"> <a class="btn btn-secondary float-end me-2" href="{{ url_for('packages.bulk_update_config', username=user.username) }}">
{{ _("See all Update Settings") }} {{ _("See all Update Settings") }}
</a> </a>
{% if outdated_packages %} {% if outdated_packages %}
<form class="float-right mr-2" method="post" action="{{ url_for('todo.apply_all_updates', username=user.username) }}"> <form class="float-end me-2" method="post" action="{{ url_for('todo.apply_all_updates', username=user.username) }}">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" /> <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
<input class="btn btn-primary" type="submit" value="{{ _('Create All Releases') }}" /> <input class="btn btn-primary" type="submit" value="{{ _('Create All Releases') }}" />
</form> </form>
@ -65,10 +65,10 @@
<div class="mb-4"></div> <div class="mb-4"></div>
<a class="btn btn-secondary float-right" href="/help/game_support/"> <a class="btn btn-secondary float-end" href="/help/game_support/">
{{ _("Help") }} {{ _("Help") }}
</a> </a>
<a class="btn btn-secondary float-right mr-2" href="{{ url_for('todo.all_game_support', username=user.username) }}"> <a class="btn btn-secondary float-end me-2" href="{{ url_for('todo.all_game_support', username=user.username) }}">
{{ _("See game support for your packages") }} {{ _("See game support for your packages") }}
</a> </a>
<h2>{{ _("Missing Game Support") }}</h2> <h2>{{ _("Missing Game Support") }}</h2>
@ -86,7 +86,7 @@
style="max-height: 22px; max-width: 22px;" style="max-height: 22px; max-width: 22px;"
src="{{ package.get_thumb_or_placeholder() }}" /> src="{{ package.get_thumb_or_placeholder() }}" />
<span class="pl-2"> <span class="ps-2">
{{ package.title }} {{ package.title }}
</span> </span>
</a> </a>
@ -106,7 +106,7 @@
style="max-height: 22px; max-width: 22px;" style="max-height: 22px; max-width: 22px;"
src="{{ package.get_thumb_or_placeholder() }}" /> src="{{ package.get_thumb_or_placeholder() }}" />
<span class="pl-2"> <span class="ps-2">
{{ package.title }} {{ package.title }}
</span> </span>
</a> </a>
@ -125,13 +125,13 @@
{{ _("The recommended resolution is 1920x1080, and screenshots must be at least %(width)dx%(height)d.", {{ _("The recommended resolution is 1920x1080, and screenshots must be at least %(width)dx%(height)d.",
width=920, height=517) }} width=920, height=517) }}
<span class="badge badge-danger ml-3"> <span class="badge bg-danger ms-3">
{{ _("Way too small") }} {{ _("Way too small") }}
</span> </span>
<span class="badge badge-warning"> <span class="badge bg-warning">
{{ _("Too small") }} {{ _("Too small") }}
</span> </span>
<span class="badge badge-secondary"> <span class="badge bg-secondary">
{{ _("Not HD") }} {{ _("Not HD") }}
</span> </span>
</p> </p>
@ -146,7 +146,7 @@
style="max-height: 22px; max-width: 22px;" style="max-height: 22px; max-width: 22px;"
src="{{ package.get_thumb_or_placeholder() }}" /> src="{{ package.get_thumb_or_placeholder() }}" />
<span class="pl-2"> <span class="ps-2">
{{ package.title }} {{ package.title }}
</span> </span>
</div> </div>
@ -155,13 +155,13 @@
{% for ss in package.screenshots %} {% for ss in package.screenshots %}
{% if ss.is_low_res() %} {% if ss.is_low_res() %}
{% if ss.is_very_small() %} {% if ss.is_very_small() %}
{% set badge_color = "badge-danger" %} {% set badge_color = "bg-danger" %}
{% elif ss.is_too_small() %} {% elif ss.is_too_small() %}
{% set badge_color = "badge-warning" %} {% set badge_color = "bg-warning" %}
{% else %} {% else %}
{% set badge_color = "badge-secondary" %} {% set badge_color = "bg-secondary" %}
{% endif %} {% endif %}
<span class="badge {{ badge_color }} ml-2" title="{{ ss.title }}"> <span class="badge {{ badge_color }} ms-2" title="{{ ss.title }}">
{{ ss.width }} x {{ ss.height }} {{ ss.width }} x {{ ss.height }}
</span> </span>
{% endif %} {% endif %}
@ -175,7 +175,7 @@
</div> </div>
<a class="btn btn-secondary float-right" href="{{ url_for('todo.tags', author=user.username) }}"> <a class="btn btn-secondary float-end" href="{{ url_for('todo.tags', author=user.username) }}">
{{_ ("See All") }}</a> {{_ ("See All") }}</a>
<h2>{{ _("Packages Without Tags") }}</h2> <h2>{{ _("Packages Without Tags") }}</h2>
<p> <p>
@ -189,7 +189,7 @@
style="max-height: 22px; max-width: 22px;" style="max-height: 22px; max-width: 22px;"
src="{{ package.get_thumb_or_placeholder() }}" /> src="{{ package.get_thumb_or_placeholder() }}" />
<span class="pl-2"> <span class="ps-2">
{{ package.title }} {{ package.title }}
</span> </span>
</a> </a>

@ -53,7 +53,7 @@
</a> </a>
{% if user == current_user %} {% if user == current_user %}
<a class="btn btn-secondary ml-2" href="{{ url_for('github.view_permissions') }}"> <a class="btn btn-secondary ms-2" href="{{ url_for('github.view_permissions') }}">
{{ _("View ContentDB's GitHub Permissions") }} {{ _("View ContentDB's GitHub Permissions") }}
</a> </a>
{% endif %} {% endif %}
@ -69,7 +69,7 @@
</table> </table>
{% if current_user.rank.at_least(current_user.rank.MODERATOR) %} {% if current_user.rank.at_least(current_user.rank.MODERATOR) %}
<a class="btn btn-secondary float-right" href="{{ url_for('admin.audit', username=user.username) }}"> <a class="btn btn-secondary float-end" href="{{ url_for('admin.audit', username=user.username) }}">
{{ _("View All") }} {{ _("View All") }}
</a> </a>
{% endif %} {% endif %}

@ -14,10 +14,10 @@
</p> </p>
<p class="mt-5"> <p class="mt-5">
<a class="btn btn-primary mr-3" href="{{ url_for('users.claim_forums') }}"> <a class="btn btn-primary me-3" href="{{ url_for('users.claim_forums') }}">
{{ _("<b>Yes</b>, I have a forums account") }} {{ _("<b>Yes</b>, I have a forums account") }}
</a> </a>
<a class="btn btn-primary mr-3" href="{{ url_for('users.register') }}"> <a class="btn btn-primary me-3" href="{{ url_for('users.register') }}">
{{ _("<b>No</b>, I don't have one") }} {{ _("<b>No</b>, I don't have one") }}
</a> </a>
<a class="btn btn-secondary" href="https://forum.minetest.net/ucp.php?mode=register"> <a class="btn btn-secondary" href="https://forum.minetest.net/ucp.php?mode=register">

@ -23,7 +23,7 @@ Create Account from Forums User
<div class="col-sm-6"> <div class="col-sm-6">
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
<span class="badge badge-pill badge-dark mr-2">{{ _("Option 1") }}</span> <span class="badge roaded-pill bg-dark me-2">{{ _("Option 1") }}</span>
{{ _("Use GitHub field in forum profile") }} {{ _("Use GitHub field in forum profile") }}
</div> </div>
@ -52,7 +52,7 @@ Create Account from Forums User
<div class="col-sm-6"> <div class="col-sm-6">
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
<span class="badge badge-pill badge-dark mr-2">{{ _("Option 2") }}</span> <span class="badge roaded-pill bg-dark me-2">{{ _("Option 2") }}</span>
{{ _("Verification token") }} {{ _("Verification token") }}
</div> </div>

@ -26,7 +26,7 @@
</p> </p>
{% endif %} {% endif %}
<a class="btn btn-secondary mr-3" href="{{ url_for('users.account', username=user.username) }}"> <a class="btn btn-secondary me-3" href="{{ url_for('users.account', username=user.username) }}">
{{ _("Cancel") }} {{ _("Cancel") }}
</a> </a>
<input type="submit" <input type="submit"
@ -37,7 +37,7 @@
{% endif %} {% endif %}
class="btn btn-danger" /> class="btn btn-danger" />
{% if not can_delete and current_user.rank.at_least(current_user.rank.ADMIN) %} {% if not can_delete and current_user.rank.at_least(current_user.rank.ADMIN) %}
<input type="submit" name="delete" value="{{ _('Delete Anyway') }}" class="btn btn-danger ml-3" /> <input type="submit" name="delete" value="{{ _('Delete Anyway') }}" class="btn btn-danger ms-3" />
{% endif %} {% endif %}
</div> </div>
</form> </form>

@ -33,17 +33,17 @@
<div class="col-sm-2 {{ user.rank }}" <div class="col-sm-2 {{ user.rank }}"
title="{{ _('Rank: %(rank)s.', rank=user.rank.get_title()) }}"> title="{{ _('Rank: %(rank)s.', rank=user.rank.get_title()) }}">
{% if user.rank == user.rank.ADMIN %} {% if user.rank == user.rank.ADMIN %}
<i class="fas fa-user-cog mr-2"></i> <i class="fas fa-user-cog me-2"></i>
{% elif user.rank == user.rank.MODERATOR %} {% elif user.rank == user.rank.MODERATOR %}
<i class="fas fa-user-shield mr-2"></i> <i class="fas fa-user-shield me-2"></i>
{% elif user.rank == user.rank.EDITOR %} {% elif user.rank == user.rank.EDITOR %}
<i class="fas fa-user-edit mr-2"></i> <i class="fas fa-user-edit me-2"></i>
{% elif user.rank == user.rank.APPROVER %} {% elif user.rank == user.rank.APPROVER %}
<i class="fas fa-user-check mr-2"></i> <i class="fas fa-user-check me-2"></i>
{% elif user.rank == user.rank.BOT %} {% elif user.rank == user.rank.BOT %}
<i class="fas fa-robot mr-2"></i> <i class="fas fa-robot me-2"></i>
{% else %} {% else %}
<i class="fas fa-user mr-2"></i> <i class="fas fa-user me-2"></i>
{% endif %} {% endif %}
{{ user.rank.get_title() }} {{ user.rank.get_title() }}
@ -52,7 +52,7 @@
<span class="col-sm {{ user.rank }}"> <span class="col-sm {{ user.rank }}">
{{ user.display_name }} {{ user.display_name }}
{% if user.username != user.display_name %} {% if user.username != user.display_name %}
<span class="text-muted small ml-2"> <span class="text-muted small ms-2">
({{ user.username }}) ({{ user.username }})
</span> </span>
{% endif %} {% endif %}

@ -20,17 +20,17 @@
{{ _("Forgot my password") }} {{ _("Forgot my password") }}
</a> </a>
</div> </div>
{{ render_submit_field(form.submit, tabindex=140, class_="btn btn-lg btn-primary btn-block") }} {{ render_submit_field(form.submit, tabindex=140, class_="btn btn-lg btn-primary d-block") }}
<hr class="my-5" /> <hr class="my-5" />
<p> <p>
<a class="btn btn-secondary mr-3" href="{{ url_for('github.start') }}"> <a class="btn btn-secondary me-3" href="{{ url_for('github.start') }}">
<i class="fab fa-github mr-1"></i> <i class="fab fa-github me-1"></i>
{{ _("GitHub") }} {{ _("GitHub") }}
</a> </a>
<a class="btn btn-secondary" href="{{ url_for('users.claim') }}"> <a class="btn btn-secondary" href="{{ url_for('users.claim') }}">
<i class="fas fa-user-plus mr-1"></i> <i class="fas fa-user-plus me-1"></i>
{{ _("Register") }} {{ _("Register") }}
</a> </a>
</p> </p>

@ -58,14 +58,14 @@
{% else %} {% else %}
<form method="POST" action="{{ url_for('users.modtools_ban', username=user.username) }}"> <form method="POST" action="{{ url_for('users.modtools_ban', username=user.username) }}">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" /> <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
<div class="form-group"> <div class="form-group mb-3">
<label for="message">{{ _("Message") }}</label> <label for="message" class="form-label">{{ _("Message") }}</label>
<span class="ml-1 text-danger"> <span class="ms-1 text-danger">
<small> <small>
<i class="fas fa-asterisk"></i> <i class="fas fa-asterisk"></i>
</small> </small>
</span> </span>
<span class="ml-3 text-muted"> <span class="ms-3 text-muted">
{{ _("Required") }} {{ _("Required") }}
</span> </span>
<input id="message" class="form-control" type="text" name="message" required minlength="5"> <input id="message" class="form-control" type="text" name="message" required minlength="5">
@ -73,8 +73,8 @@
{{ _("Message to display to banned user") }} {{ _("Message to display to banned user") }}
</small> </small>
</div> </div>
<div class="form-group"> <div class="form-group mb-3">
<label for="expires_at">{{ _("Expires At") }}</label> <label for="expires_at" class="form-label">{{ _("Expires At") }}</label>
<input id="expires_at" class="form-control" type="date" name="expires_at"> <input id="expires_at" class="form-control" type="date" name="expires_at">
<small class="form-text text-muted"> <small class="form-text text-muted">
{{ _("Expiry date. Leave blank for permanent ban") }} {{ _("Expiry date. Leave blank for permanent ban") }}
@ -87,8 +87,8 @@
<h3>{{ _("Change Email and Send Password Reset") }}</h3> <h3>{{ _("Change Email and Send Password Reset") }}</h3>
<form method="POST" action="{{ url_for('users.modtools_set_email', username=user.username) }}"> <form method="POST" action="{{ url_for('users.modtools_set_email', username=user.username) }}">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" /> <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
<div class="form-group"> <div class="form-group mb-3">
<label for="email">{{ _("Email Address") }}</label> <label for="email" class="form-label">{{ _("Email Address") }}</label>
<input type="email" class="form-control" name="email" id="email" value="{{ user.email or '' }}" /> <input type="email" class="form-control" name="email" id="email" value="{{ user.email or '' }}" />
</div> </div>
<input type="submit" value="{{ _('Save') }}" class="btn btn-primary" /> <input type="submit" value="{{ _('Save') }}" class="btn btn-primary" />

@ -10,7 +10,7 @@
{% block scriptextra %} {% block scriptextra %}
{% if current_user.is_authenticated %} {% if current_user.is_authenticated %}
<script src="/static/quick_review_voting.js"></script> <script src="/static/quick_review_voting.js?v=2"></script>
{% endif %} {% endif %}
{% endblock %} {% endblock %}
@ -21,41 +21,41 @@
</div> </div>
<div class="col"> <div class="col">
{% if user.can_see_edit_profile(current_user) %} {% if user.can_see_edit_profile(current_user) %}
<a class="btn btn-primary float-right" href="{{ url_for('users.profile_edit', username=user.username) }}"> <a class="btn btn-primary float-end" href="{{ url_for('users.profile_edit', username=user.username) }}">
<i class="fas fa-pen mr-1"></i> <i class="fas fa-pen me-1"></i>
{{ _("Edit Profile") }} {{ _("Edit Profile") }}
</a> </a>
<a class="btn btn-secondary float-right mr-3" href="{{ url_for('todo.view_user', username=user.username) }}"> <a class="btn btn-secondary float-end me-3" href="{{ url_for('todo.view_user', username=user.username) }}">
<i class="fas fa-tasks mr-1"></i> <i class="fas fa-tasks me-1"></i>
{{ _("To Do List") }} {{ _("To Do List") }}
</a> </a>
{% endif %} {% endif %}
<a class="btn btn-secondary float-right mr-3" href="{{ url_for('report.report', url=url_current()) }}"> <a class="btn btn-secondary float-end me-3" href="{{ url_for('report.report', url=url_current()) }}">
<i class="fas fa-flag mr-1"></i> <i class="fas fa-flag me-1"></i>
{{ _("Report") }} {{ _("Report") }}
</a> </a>
{% if current_user.is_authenticated and current_user.rank.at_least(current_user.rank.MODERATOR) %} {% if current_user.is_authenticated and current_user.rank.at_least(current_user.rank.MODERATOR) %}
{% if not user.rank.at_least(current_user.rank) %} {% if not user.rank.at_least(current_user.rank) %}
<a class="btn btn-secondary float-right mr-3" href="{{ url_for('users.modtools', username=user.username) }}"> <a class="btn btn-secondary float-end me-3" href="{{ url_for('users.modtools', username=user.username) }}">
<i class="fas fa-user-shield mr-1"></i> <i class="fas fa-user-shield me-1"></i>
{{ _("Moderator Tools") }} {{ _("Moderator Tools") }}
</a> </a>
{% endif %} {% endif %}
{% if user.email %} {% if user.email %}
<a class="btn btn-secondary float-right mr-3" href="{{ url_for('admin.send_single_email', username=user.username) }}"> <a class="btn btn-secondary float-end me-3" href="{{ url_for('admin.send_single_email', username=user.username) }}">
<i class="fas fa-envelope mr-1"></i> <i class="fas fa-envelope me-1"></i>
{{ _("Send Email") }} {{ _("Send Email") }}
</a> </a>
{% endif %} {% endif %}
{% endif %} {% endif %}
<h1 class="ml-3 my-0 {{ user.rank.name }}"> <h1 class="ms-3 my-0 {{ user.rank.name }}">
{{ user.display_name }} {{ user.display_name }}
{% if user.username != user.display_name %} {% if user.username != user.display_name %}
<span class="text-muted small ml-2"> <span class="text-muted small ms-2">
({{ user.username }}) ({{ user.username }})
</span> </span>
{% endif %} {% endif %}
@ -157,7 +157,7 @@
{% if not current_user.is_authenticated and user.rank == user.rank.NOT_JOINED and user.forums_username %} {% if not current_user.is_authenticated and user.rank == user.rank.NOT_JOINED and user.forums_username %}
<div class="alert alert-secondary mb-5"> <div class="alert alert-secondary mb-5">
<a class="float-right btn btn-default btn-sm" <a class="float-end btn btn-default btn-sm"
href="{{ url_for('users.claim_forums', username=user.forums_username) }}">{{ _("Claim") }}</a> href="{{ url_for('users.claim_forums', username=user.forums_username) }}">{{ _("Claim") }}</a>
{{ _("Is this you? Claim your account now!") }} {{ _("Is this you? Claim your account now!") }}
@ -167,10 +167,10 @@
{% for medal in medals_unlocked %} {% for medal in medals_unlocked %}
<div class="col-md-4"> <div class="col-md-4">
<div class="card h-100"> <div class="card h-100">
<div class="card-body media align-items-center"> <div class="card-body d-flex align-items-center">
<i class="fas {{ medal.icon }} ml-2 mr-4 text-size" <i class="flex-shrink-0 fas {{ medal.icon }} ms-2 me-4 text-size"
style="font-size: 45px; color: {{ medal.color }};"></i> style="font-size: 45px; color: {{ medal.color }};"></i>
<div class="media-body"> <div class="flex-grow-1 ms-3">
<h5 class="mt-0"> <h5 class="mt-0">
{{ medal.title }} {{ medal.title }}
</h5> </h5>
@ -201,7 +201,7 @@
</div> </div>
{% if value < target * 0.2 %} {% if value < target * 0.2 %}
<div class="ml-3 d-flex align-items-center text-muted h-100"> <div class="ms-3 d-flex align-items-center text-muted h-100">
{{ _("%(value)d / %(target)d", value=medal.progress[0], target=medal.progress[1]) }} {{ _("%(value)d / %(target)d", value=medal.progress[0], target=medal.progress[1]) }}
</div> </div>
{% endif %} {% endif %}
@ -213,9 +213,9 @@
</div> </div>
{% endif %} {% endif %}
<div class="float-right"> <div class="float-end">
{% if packages %} {% if packages %}
<div class="btn-group btn-group-sm mr-2" role="group" aria-label="Sorting"> <div class="btn-group btn-group-sm me-2" role="group" aria-label="Sorting">
<span class="btn btn-sm btn-primary"> <span class="btn btn-sm btn-primary">
{{ _("Alphabetical") }} {{ _("Alphabetical") }}
</span> </span>
@ -229,7 +229,7 @@
</a> </a>
</div> </div>
{% if current_user == user or (current_user.is_authenticated and current_user.rank.at_least(current_user.rank.EDITOR)) %} {% if current_user == user or (current_user.is_authenticated and current_user.rank.at_least(current_user.rank.EDITOR)) %}
<a class="btn btn-sm btn-secondary mr-2" <a class="btn btn-sm btn-secondary me-2"
href="{{ url_for('todo.tags', author=user.username) }}"> href="{{ url_for('todo.tags', author=user.username) }}">
{{ _("View list of tags") }} {{ _("View list of tags") }}
</a> </a>
@ -238,7 +238,7 @@
{% if current_user == user or user.check_perm(current_user, "CHANGE_AUTHOR") %} {% if current_user == user or user.check_perm(current_user, "CHANGE_AUTHOR") %}
<a class="btn btn-sm btn-primary" <a class="btn btn-sm btn-primary"
href="{{ url_for('packages.create_edit', author=user.username) }}"> href="{{ url_for('packages.create_edit', author=user.username) }}">
<i class="fas fa-plus mr-1"></i> <i class="fas fa-plus me-1"></i>
{{ _("Create package") }} {{ _("Create package") }}
</a> </a>
{% endif %} {% endif %}

@ -7,7 +7,7 @@
{% block content %} {% block content %}
{% from "macros/forms.html" import render_field, render_checkbox_field, render_submit_field %} {% from "macros/forms.html" import render_field, render_checkbox_field, render_submit_field %}
<div class="card w-50 text-left" style="margin: 2em auto;"> <div class="card w-50 text-start" style="margin: 2em auto;">
<h2 class="card-header">{{ self.title() }}</h2> <h2 class="card-header">{{ self.title() }}</h2>
<form action="" method="POST" class="form card-body" role="form"> <form action="" method="POST" class="form card-body" role="form">

@ -9,7 +9,7 @@
<span class="col-auto m-0 p-0"> <span class="col-auto m-0 p-0">
<img class="img-fluid user-photo img-thumbnail img-thumbnail-1" src="{{ user.get_profile_pic_url() }}" alt="Profile picture" style="max-height: 20px;"> <img class="img-fluid user-photo img-thumbnail img-thumbnail-1" src="{{ user.get_profile_pic_url() }}" alt="Profile picture" style="max-height: 20px;">
</span> </span>
<span class="col m-0 p-0 pl-2"> <span class="col m-0 p-0 ps-2">
{{ user.display_name }} {{ user.display_name }}
</span> </span>
</span> </span>

@ -12,7 +12,7 @@
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<div class="float-right"> <div class="float-end">
{{ render_daterange_selector(options, start or end) }} {{ render_daterange_selector(options, start or end) }}
{{ render_package_selector(user, package=None) }} {{ render_package_selector(user, package=None) }}
</div> </div>

@ -53,7 +53,7 @@
<div class="button-group mt-4"> <div class="button-group mt-4">
{% if user %} {% if user %}
<a class="btn btn-primary mr-3" href="{{ url_for('users.email_notifications', username=user.username) }}"> <a class="btn btn-primary me-3" href="{{ url_for('users.email_notifications', username=user.username) }}">
{{ _("Edit Notification Preferences") }} {{ _("Edit Notification Preferences") }}
</a> </a>
{% endif %} {% endif %}

@ -5,7 +5,7 @@
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<a class="btn btn-secondary float-right" href="{{ url_for('zipgrep.zipgrep_search') }}">New Query</a> <a class="btn btn-secondary float-end" href="{{ url_for('zipgrep.zipgrep_search') }}">New Query</a>
<h1>{{ _("Search in Package Releases") }}</h1> <h1>{{ _("Search in Package Releases") }}</h1>
<h2>{{ query }}</h2> <h2>{{ query }}</h2>