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
PKGS_PER_ROW = 5
@bp.route("/gamejam/")
def gamejam():
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")))) \
.order_by(func.random()).limit(6).all()
new = package_load(query.order_by(db.desc(Package.approved_at))).limit(4).all()
pop_mod = package_load(query.filter_by(type=PackageType.MOD).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(8).all()
pop_txp = package_load(query.filter_by(type=PackageType.TXP).order_by(db.desc(Package.score))).limit(8).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(2*PKGS_PER_ROW).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(2*PKGS_PER_ROW).all()
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)
.filter_by(state=PackageState.APPROVED)
.order_by(db.desc(PackageRelease.releaseDate))
.limit(20)).all()
updated = updated[:4]
updated = updated[:PKGS_PER_ROW]
reviews = review_load(PackageReview.query.filter(PackageReview.rating > 3)
.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")
else:
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")
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.
<a href="https://github.com/minetest/contentdb/" class="btn btn-primary mr-1">Source code</a>
<a href="https://github.com/minetest/contentdb/issues/" class="btn btn-secondary mr-1">Issue tracker</a>
<a href="https://rubenwardy.com/contact/" class="btn btn-secondary mr-1">Contact admin</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 me-1">Issue tracker</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>
## 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
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)}">
<div class="card-body">
<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>
</div>
<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>
</button>
<h5>
@ -90,14 +90,14 @@ function addPackage(pkg) {
<p class="text-muted">
${escapeHtml(pkg.short_description)}
</p>
<div class="form-group">
<label for="descriptions-${nextId}">Short Description</label>
<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>
<label for="descriptions-${nextId}" class="form-label">Short Description</label>
<input class="form-control" id="descriptions-${nextId}" maxlength="500" minlength="0"
name="descriptions-${nextId}" type="text" value="">
<small class="form-text text-muted">You can replace the description with your own</small>
</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>
@ -128,7 +128,7 @@ function updateResults(packages) {
result.innerText = `${pkg.title} by ${pkg.author}`;
if (alreadyAdded.includes(`${pkg.author}/${pkg.name}`)) {
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));
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-body align-items-center text-center">
<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>
</div>
<div class="my-0 h4">
<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>

@ -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() {
const id = $("#forums").val();
if (/^\d+$/.test(id)) {

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

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

@ -9,8 +9,8 @@ document.querySelectorAll(".video-embed").forEach(ele => {
if (url.host == "www.youtube.com") {
ele.addEventListener("click", () => {
ele.parentNode.classList.add("d-block");
ele.classList.add("embed-responsive");
ele.classList.add("embed-responsive-16by9");
ele.classList.add("ratio");
ele.classList.add("ratio-16x9");
ele.innerHTML = `
<iframe title="YouTube video player" frameborder="0"
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 {
height: auto !important;
display: inline-block !important;
@ -51,6 +59,7 @@
white-space: nowrap;
background: transparent;
}
.bulletselector .badge {
float: left;
padding: 0.4em 0.8em;
@ -272,3 +281,7 @@ blockquote {
margin-bottom: 0 !important;
}
}
.form-group {
margin-bottom: 1rem !important;
}

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

@ -78,3 +78,14 @@
padding: 0;
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 %}
{% 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 %}
<h1>{{ entry.title }}</h1>

@ -9,7 +9,7 @@
{% endblock %}
{% 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>
{% from "macros/forms.html" import render_field, render_checkbox_field, render_submit_field %}

@ -5,7 +5,7 @@ Licenses
{% endblock %}
{% 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>
@ -13,7 +13,7 @@ Licenses
{% for l in licenses %}
<a class="list-group-item list-group-item-action"
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"}}
</span>
{{ l.name }}

@ -28,14 +28,14 @@
<form method="post" action="" class="card-body">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
<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() %}
<option value="{{ id }}" {% if loop.first %}selected{% endif %}>
{{ action["title"] }}
</option>
{% endfor %}
</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>
</form>
</div>

@ -11,7 +11,7 @@
<form method="post" action="" class="card-body">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
<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>
{% for p in deleted_packages %}
<option value="{{ p.id }}">
@ -21,8 +21,8 @@
</select>
<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 Changes Needed" class="col-sm-auto btn btn-danger ml-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 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 ms-2" />
</div>
</div>
</form>

@ -9,7 +9,7 @@
{% endblock %}
{% 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>
{% from "macros/forms.html" import render_field, render_submit_field, render_checkbox_field %}
@ -23,7 +23,7 @@
{% endif %}
{{ render_submit_field(form.submit) }}
{% 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
</a>
{% endif %}

@ -5,11 +5,11 @@
{% endblock %}
{% 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>
<p class="float-right">
<p class="float-end">
Sort by:
<a href="{{ url_set_query(sort='name') }}">Name</a> |
<a href="{{ url_set_query(sort='views') }}">Views</a>

@ -9,7 +9,7 @@
{% endblock %}
{% 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>
{% from "macros/forms.html" import render_field, render_submit_field %}

@ -5,7 +5,7 @@
{% endblock %}
{% 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>

@ -9,7 +9,7 @@
{% endblock %}
{% 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>
{% from "macros/forms.html" import render_field, render_submit_field %}

@ -5,7 +5,7 @@
{% endblock %}
{% 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>

@ -12,7 +12,7 @@
{% block content %}
{% 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 class="btn btn-danger" type="submit" value="{{ _('Delete') }}">
</form>

@ -5,8 +5,8 @@
{% endblock %}
{% 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-secondary mr-2 float-right" href="/help/api/">{{ _("API Documentation") }}</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 me-2 float-end" href="/help/api/">{{ _("API Documentation") }}</a>
<h2 class="mt-0">{{ _("API Tokens") }}</h2>
<div class="list-group">

@ -15,7 +15,7 @@
<meta name="og:description" content="{{ self.description() | normalize_whitespace }}">
{%- 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="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">
<div class="container">
<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>
</button>
<div class="collapse navbar-collapse" id="navbarColor01">
<ul class="navbar-nav mr-auto">
<ul class="navbar-nav me-auto">
<li class="nav-item">
<a class="nav-link" href="{{ url_for('packages.list_all', type='mod') }}">{{ _("Mods") }}</a>
</li>
@ -51,24 +51,22 @@
<a class="nav-link" href="{{ url_for('flatpage', path='help') }}">{{ _("Help") }}</a>
</li>
</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 %}
<div class="input-group mx-0 my-0">
<div class="input-group m-0">
<input class="form-control" name="q" type="text"
placeholder="{% if query_hint %}{{ _('Search %(type)s', type=query_hint | lower) }}{% else %}{{ _('Search all packages') }}{% endif %}"
value="{{ query or ''}}">
<div class="input-group-append">
<button type="submit" class="btn btn-secondary" title="{{ _('Search') }}">
<i class="fas fa-search"></i>
</button>
</div>
<button type="submit" class="btn btn-secondary" title="{{ _('Search') }}">
<i class="fas fa-search"></i>
</button>
</div>
<!-- <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."
type="submit" name="lucky" value="First" /> -->
</form>
<ul class="navbar-nav ml-auto">
<ul class="navbar-nav ms-auto">
{% if current_user.is_authenticated %}
{% if todo_list_count is not none %}
<li class="nav-item">
@ -77,7 +75,7 @@
title="{{ _('Work Queue') }}">
{% if todo_list_count > 0 %}
<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 %}
<i class="fas fa-inbox" ></i>
{% endif %}
@ -101,11 +99,11 @@
<i class="fas fa-bell"></i>
{% set num_notifs = current_user.notifications | length %}
{% if num_notifs > 60 %}
<span class="badge badge-pill badge-notify badge-emoji">
<span class="badge roaded-pill badge-notify badge-emoji">
😢
</span>
{% else %}
<span class="badge badge-pill badge-notify">
<span class="badge roaded-pill badge-notify">
{{ num_notifs }}
</span>
{% endif %}
@ -124,7 +122,7 @@
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle"
data-toggle="dropdown"
data-bs-toggle="dropdown"
role="button"
aria-expanded="false">
{{ current_user.display_name }}
@ -192,7 +190,7 @@
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle"
data-toggle="dropdown"
data-bs-toggle="dropdown"
role="button"
aria-expanded="false">
<i class="fas fa-language"></i>
@ -279,7 +277,7 @@
</footer>
<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>
<link rel="stylesheet" type="text/css" href="/static/libs/easymde.min.css">
<link href="/static/fa/css/all.css" rel="stylesheet">

@ -10,13 +10,13 @@
{% block scriptextra %}
<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 %}
{% block content %}
{% 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">
{{ 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>
{{ form.hidden_tag() }}
@ -36,10 +36,10 @@
{{ render_field(form.long_description, fieldclass="form-control markdown") }}
{% endif %}
{% if collection and collection.items %}
{% if collection %}
<h2>{{ _("Packages") }}</h2>
<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">
<p id="add_package_empty" class="mt-2" style="display: none;">
<i>{{ _("No results") }}</i>
@ -52,11 +52,11 @@
<article class="card my-3" data-id="{{ package.get_id() }}">
<div class="card-body">
<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>
</div>
<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') }}">
<i class="fas fa-trash"></i>
</button>
@ -68,9 +68,9 @@
<p class="text-muted">
{{ package.short_desc }}
</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_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>

@ -10,7 +10,7 @@
<h3 class="card-header">{{ self.title() }}</h3>
<div class="card-body">
<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" />
</div>
</form>

@ -17,7 +17,7 @@
{% block content %}
{% if user %}
{% 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") }}
</a>
{% endif %}
@ -30,17 +30,17 @@
{% for collection in collections -%}
<a class="list-group-item list-group-item-action" href="{{ collection.get_url('collections.view') }}">
{% 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 %}
{% 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 %}
{% if user != collection.author %}
{{ _("%(title)s by %(author)s", title=collection.title, author=collection.author.display_name) }}
{% else %}
{{ collection.title }}
{% endif %}
<span class="text-muted ml-4">
<span class="text-muted ms-4">
{{ collection.short_description }}
</span>
</a>

@ -5,7 +5,7 @@
{% endblock %}
{% 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") }}
</a>
<h1>{{ self.title() }}</h1>
@ -20,16 +20,16 @@
<button type="submit"
class="list-group-item list-group-item-action {% if active %}active{% endif %}">
{% if active %}
<i class="fas fa-check mr-3 text-success"></i>
<i class="fas fa-check me-3 text-success"></i>
{% else %}
<i class="fas fa-square mr-3 text-muted"></i>
<i class="fas fa-square me-3 text-muted"></i>
{% endif -%}
{% if collection.author != current_user %}{{ collection.author.display_name }}: {% endif -%}
{% 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 %}
{% 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 %}
{{ collection.title }}
</button>

@ -22,12 +22,12 @@
{%- endblock %}
{% 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) }}">
{{ _("%(author)s's collections", author=collection.author.display_name) }}
</a>
{% 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() }}" />
<button type="submit" class="btn btn-secondary">
{{ _("Make a copy") }}
@ -35,10 +35,10 @@
</form>
{% endif %}
{% 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") }}
</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") }}
</a>
{% endif %}
@ -46,8 +46,8 @@
<h1>{{ self.title() }}</h1>
<p class="text-muted">
{% if collection.private %}
<span class="badge badge-secondary mr-1">
<i class="fas fa-lock mr-1" style="color:#ffac33;"></i>
<span class="badge bg-secondary me-1">
<i class="fas fa-lock me-1" style="color:#ffac33;"></i>
{{ _("Private") }}
</span>
{% endif %}
@ -63,7 +63,7 @@
{% endif %}
<section class="mt-5">
<h2 class="sr-only">{{ _("Packages") }}</h2>
<h2 class="visually-hidden">{{ _("Packages") }}</h2>
{% if not items %}
<p class="text-muted">
{{ _("To add a package, go to the package's page and click 'Add to collection'") }}
@ -78,12 +78,12 @@
{% endset %}
<div>
<article class="card">
<div class="embed-responsive embed-responsive-16by9">
<img class="card-img-top embed-responsive-item" src="{{ item.package.get_thumb_or_placeholder(4) }}" alt="{{ item.package.title }} screenshot">
<div class="ratio ratio-16x9">
<img class="card-img-top" src="{{ item.package.get_thumb_or_placeholder(4) }}" alt="{{ item.package.title }} screenshot">
</div>
<div class="card-body">
{% if item.package.state.name != "APPROVED" %}
<span class="badge badge-warning float-right">
<span class="badge bg-warning float-end">
{{ item.package.state.value }}
</span>
{% endif %}

@ -27,7 +27,7 @@
style="max-height: 22px; max-width: 22px;"
src="{{ package.get_thumb_or_placeholder() }}" />
<span class="pl-2">
<span class="ps-2">
{{ package.title }}
</span>
</a>
@ -38,11 +38,11 @@
</div>
<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") }}
</a>
<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") }}
</a>
</div>

@ -22,26 +22,29 @@
}
</script>
{% if current_user.is_authenticated %}
<script src="/static/quick_review_voting.js"></script>
<script src="/static/quick_review_voting.js?v=2"></script>
{% endif %}
{% endblock %}
{% block content %}
{% from "macros/packagegridtile.html" import render_pkggrid %}
<div id="featuredCarousel" class="carousel slide my-0" data-ride="carousel" data-interval="7500">
<ol class="carousel-indicators">
<div id="featuredCarousel" class="carousel slide mt-0 mb-5" data-bs-ride="carousel" data-bs-interval="7500">
<div class="carousel-indicators">
{% 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 %}
</ol>
</div>
<div class="carousel-inner">
{% for package in spotlight_pkgs %}
{% set cover_image = package.get_cover_image_url() %}
{% set tags = package.tags | sort(attribute="views", reverse=True) %}
<div class="carousel-item {% if loop.index == 1 %}active{% endif %}">
<a href="{{ package.get_url('packages.view') }}">
<div class="embed-responsive embed-responsive-16by9">
<img class="embed-responsive-item" src="{{ cover_image }}"
<div class="ratio ratio-16x9">
<img src="{{ cover_image }}"
alt="{{ _('%(title)s by %(author)s', title=package.title, author=package.author.display_name) }}">
</div>
<div class="carousel-caption text-shadow">
@ -57,17 +60,17 @@
</p>
{% if package.author %}
<div class="d-none d-md-block">
<span class="mr-2">
<span class="me-2">
{{ package.type.text }}
</span>
{% 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>
{{ warning.title }}
</span>
{% endfor %}
{% 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 }}
</span>
{% endfor %}
@ -88,51 +91,51 @@
</div>
{% endfor %}
</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="sr-only">{{ _("Previous") }}</span>
</a>
<a class="carousel-control-next" href="#featuredCarousel" role="button" data-slide="next">
<span class="visually-hidden">{{ _("Previous") }}</span>
</button>
<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="sr-only">{{ _("Next") }}</span>
</a>
<span class="visually-hidden">{{ _("Next") }}</span>
</button>
</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">
<i class="fas fa-question-circle mr-1"></i>
<i class="fas fa-question-circle me-1"></i>
{{ _("Featured") }}
</a>
</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") }}
</a>
<h2 class="my-3">{{ _("Recently Added") }}</h2>
{{ 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") }}
</a>
<h2 class="my-3">{{ _("Recently Updated") }}</h2>
{{ 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") }}
</a>
<h2 class="my-3">{{ _("Top Games") }}</h2>
{{ 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") }}
</a>
<h2 class="my-3">{{ _("Top Mods") }}</h2>
{{ 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") }}
</a>
<h2 class="my-3">{{ _("Top Texture Packs") }}</h2>
@ -148,20 +151,20 @@
title="{{ tag.description or '' }}"
href="{{ url_for('packages.list_all', tag=tag.name) }}">
{{ 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>
{% endfor %}
<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") }}
</a>
<h2 class="my-3">{{ _("Highest Reviewed") }}</h2>
{{ 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") }}
</a>
<h2 class="my-3">{{ _("Recent Positive Reviews") }}</h2>

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

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

@ -18,11 +18,11 @@
{% set message %}
{% if package.check_perm(current_user, "MAKE_RELEASE") %}
{% 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") }}
</a>
{% 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") }}
</a>
{% endif %}
@ -95,7 +95,7 @@
{% if conflicting_modnames %}
<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
</a>
{% 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")) %}
<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") }}
</a>

@ -10,7 +10,7 @@
<small>{{ package.author.display_name }}</small>
{% endif %}
{% 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 }}
</span>
{% endif %}

@ -2,7 +2,7 @@
{% for rel in releases %}
<a class="list-group-item list-group-item-action" href="{{ rel.get_edit_url() }}">
{{ rel.title }}
<span class="text-muted ml-1">
<span class="text-muted ms-1">
{% if rel.min_rel and rel.max_rel %}
[MT {{ rel.min_rel.name }}-{{ rel.max_rel.name }}]
{% 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") %}
<a class="list-group-item list-group-item-action" href="{{ rel.get_download_url() }}">
{{ rel.title }}
<span class="text-muted ml-1">
<span class="text-muted ms-1">
{% if rel.min_rel and rel.max_rel %}
[MT {{ rel.min_rel.name }}-{{ rel.max_rel.name }}]
{% elif rel.min_rel %}
@ -55,7 +55,7 @@
{% macro render_releases(releases, package, current_user) -%}
{% for rel in releases %}
<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") %}
{{ _("Edit / Approve") }}
{% else %}
@ -69,7 +69,7 @@
{{ rel.title }}
</a>
<span class="text-muted ml-1">
<span class="text-muted ms-1">
{% if rel.min_rel and rel.max_rel %}
[MT {{ rel.min_rel.name }}-{{ rel.max_rel.name }}]
{% 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">
{{ _("Helpful") }}
{% if positive > 0 %}
<span class="badge badge-light ml-1">{{ positive }}</span>
<span class="badge bg-light text-dark ms-1">{{ positive }}</span>
{% endif %}
</button>
<button class="btn {% if is_positive == false %}btn-primary{% else %}btn-secondary{% endif %}" name="is_positive" value="no">
{{ _("Unhelpful") }}
{% if negative > 0 %}
<span class="badge badge-light ml-1">{{ negative }}</span>
<span class="badge bg-light text-dark ms-1">{{ negative }}</span>
{% endif %}
</button>
</div>
@ -30,7 +30,7 @@
<img class="img-fluid user-photo img-thumbnail img-thumbnail-1" src="{{ review.author.get_profile_pic_url() }}">
</a>
</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 %}
<i class="fas fa-thumbs-up" style="color:#6f6;"></i>
{% elif review.rating < 3 %}
@ -49,7 +49,7 @@
{{ review.author.display_name }}
</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 }}">
{{ review.created_at | datetime }}
</a>
@ -57,7 +57,7 @@
<div class="card-body markdown">
{% 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') }}">
<i class="fas fa-pen"></i>
</a>
@ -71,16 +71,16 @@
<div class="btn-toolbar mt-2 mb-0">
{% 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="<b>" | safe + review.package.title + "</b>" | safe,
author=review.package.author.display_name) }}
</a>
{% 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) }}">
<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) }}
</a>
@ -111,18 +111,21 @@
{{ _("Do you recommend this %(type)s?", type=package.type.text | lower) }}
</p>
<div class="btn-group btn-group-toggle" data-toggle="buttons">
<label class="btn btn-primary">
<i class="fas fa-thumbs-up mr-2"></i>
<input type="radio" name="rating" value="5" autocomplete="off"> {{ _("Yes") }}
<div class="btn-group" role="group">
<input type="radio" class="btn-check" name="rating" id="rating-5" value="5" autocomplete="off">
<label class="btn btn-primary" for="rating-5">
<i class="fas fa-thumbs-up me-2"></i>
{{ _("Yes") }}
</label>
<label class="btn btn-primary">
<i class="fas fa-minus mr-2"></i>
<input type="radio" name="rating" value="3" autocomplete="off"> {{ _("Neutral") }}
<input type="radio" class="btn-check" name="rating" id="rating-3" value="3" autocomplete="off">
<label class="btn btn-primary" for="rating-3">
<i class="fas fa-minus me-2"></i>
{{ _("Neutral") }}
</label>
<label class="btn btn-primary">
<i class="fas fa-thumbs-down mr-2"></i>
<input type="radio" name="rating" value="1" autocomplete="off"> {{ _("No") }}
<input type="radio" class="btn-check" name="rating" id="rating-1" value="1" autocomplete="off">
<label class="btn btn-primary" for="rating-1">
<i class="fas fa-thumbs-down me-2"></i>
{{ _("No") }}
</label>
</div>
@ -130,14 +133,14 @@
{{ _("Why or why not? Try to be constructive") }}
</p>
<div class="form-group">
<label for="title">{{ _("Title") }}</label>
<span class="ml-1 text-danger">
<div class="form-group mb-3">
<label for="title" class="form-label">{{ _("Title") }}</label>
<span class="ms-1 text-danger">
<small>
<i class="fas fa-asterisk"></i>
</small>
</span>
<span class="ml-3 text-muted">
<span class="ms-3 text-muted">
{{ _("Required") }}
</span>
<input class="form-control" id="title" name="title" required="" type="text">
@ -163,23 +166,23 @@
</p>
<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">
<i class="fas fa-thumbs-up mr-1"></i>
<i class="fas fa-thumbs-up me-1"></i>
{{ _("Yes") }}
</button>
<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") }}
</button>
<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") }}
</button>
</div>
<div class="btn-group">
<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") }}
</a>
</div>

@ -2,7 +2,7 @@
<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-plugin-annotation.min.js"></script>
<script src="/static/package_charts.js?v=11"></script>
<script src="/static/package_charts.js?v=12"></script>
{% endmacro %}
@ -31,7 +31,7 @@
{% 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">
{{ _("Date range...") }}
</button>
@ -69,7 +69,7 @@
<div class="card h-100">
<div class="card-body align-items-center text-center">
<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") }}
</div>
<div class="my-0 h4">

@ -10,29 +10,29 @@
<div class="col pr-0">
<div class="card">
<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) }}">
{{ r.author.display_name }}
</a>
{% 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 }})
</span>
{% endif %}
{% if r.author in thread.package.maintainers %}
<span class="badge badge-dark">
<span class="badge bg-dark">
{{ _("Maintainer") }}
</span>
{% endif %}
{% if r.author.rank == r.author.rank.BOT %}
<span class="badge badge-dark">
<span class="badge bg-dark">
{{ r.author.rank.get_title() }}
</span>
{% 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() }}">
{{ r.created_at | datetime }}
</a>
@ -40,26 +40,26 @@
<div class="card-body markdown">
{% 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) }}">
<i class="fas fa-trash"></i>
</a>
{% endif %}
{% 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') }}"
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>
{% endif %}
{% 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') }}">
<i class="fas fa-pen"></i>
</a>
{% 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) }}">
<i class="fas fa-pen"></i>
</a>
@ -94,7 +94,7 @@
{{ r.comment | markdown }}
</div>
<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() }}">
{{ r.created_at | datetime }}
</a>
@ -116,7 +116,7 @@
{% if thread.locked %}
<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.") }}
</p>
{% endif %}
@ -125,8 +125,8 @@
<div class="row mt-1">
<div class="col-md-1 p-1"></div>
<div class="col">
<a class="btn btn-primary ml-3" href="{{ url_for('threads.view', id=thread.id) }}">
<i class="fas fa-reply mr-1"></i>
<a class="btn btn-primary ms-3" href="{{ url_for('threads.view', id=thread.id) }}">
<i class="fas fa-reply me-1"></i>
{{ _("Reply") }}
</a>
</div>
@ -231,13 +231,13 @@
{% else %}
<i class="fas fa-minus" style="color:#999"></i>
{% endif %}
<strong class="ml-1">
<strong class="ms-1">
{{ t.title }}
</strong><br />
<span>
{{ t.author.display_name }}
</span>
<span class="text-muted ml-3">
<span class="text-muted ms-3">
{{ t.created_at | datetime }}
</span>
</div>
@ -245,7 +245,7 @@
{% if replies > 0 %}
<span class="col-md-auto text-muted">
{{ replies }}
<i class="fas fa-comment ml-1"></i>
<i class="fas fa-comment ms-1"></i>
</span>
{% endif %}
@ -261,14 +261,14 @@
{% endif %}
</div>
<div class="col-md-2 text-muted text-right">
<div class="col-md-2 text-muted text-end">
{% if t.package %}
<img
class="img-fluid"
style="max-height: 22px; max-width: 22px;"
src="{{ t.package.get_thumb_or_placeholder() }}" /><br />
<span class="pl-2">
<span class="ps-2">
{{ t.package.title }}
</span>
{% endif %}

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

@ -6,11 +6,11 @@
{% block content %}
{% 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="submit" class="btn btn-primary" value="Clear All" />
</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") }}
</a>
{% endif %}
@ -38,7 +38,7 @@
style="max-height: 22px; max-width: 22px;"
src="{{ n.package.get_thumb_or_placeholder() }}" />
<span class="pl-2">
<span class="ps-2">
{{ n.package.title }}
</span>
</div>
@ -48,8 +48,8 @@
{{ n.title}}
</div>
<div class="col-sm-auto text-muted text-right">
<span class="pr-2">{{ n.causer.display_name }}</span>
<div class="col-sm-auto text-muted text-end">
<span class="pe-2">{{ n.causer.display_name }}</span>
<img
class="img-fluid user-photo img-thumbnail img-thumbnail-1"
style="max-height: 22px;"
@ -76,7 +76,7 @@
style="max-height: 22px; max-width: 22px;"
src="{{ n.package.get_thumb_or_placeholder() }}" />
<span class="pl-2">
<span class="ps-2">
{{ n.package.title }}
</span>
</div>
@ -86,8 +86,8 @@
{{ n.title}}
</div>
<div class="col-sm-auto text-muted text-right">
<span class="pr-2">{{ n.causer.display_name }}</span>
<div class="col-sm-auto text-muted text-end">
<span class="pe-2">{{ n.causer.display_name }}</span>
<img
class="img-fluid user-photo img-thumbnail img-thumbnail-1"
style="max-height: 22px;"

@ -9,7 +9,7 @@
{% endblock %}
{% 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") }}
</a>
<h1>{{ _("Aliases for %(title)s by %(author)s", title=self.link(), author=package.author.display_name) }}</h1>

@ -5,7 +5,7 @@
{% endblock %}
{% 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>
<h2>{{ _("Packages with Update Settings") }}</h2>

@ -21,7 +21,7 @@
<script src="/static/polltask.js"></script>
<script src="/static/package_create.js?v=5"></script>
{% endif %}
<script src="/static/package_edit.js?v=4"></script>
<script src="/static/package_edit.js?v=5"></script>
{% endblock %}
{% block content %}
@ -38,13 +38,13 @@
{% if not package %}
<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?") }}
</div>
{% else %}
<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()) }}
</div>

@ -26,35 +26,35 @@
</a>
</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") }}
</a>
<h2 class="my-3">{{ _("Recently Added") }}</h2>
{{ 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") }}
</a>
<h2 class="my-3">{{ _("Recently Updated") }}</h2>
{{ 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") }}
</a>
<h2 class="my-3">{{ _("Top Mods") }}</h2>
{{ 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") }}
</a>
<h2 class="my-3">{{ _("Top Texture Packs") }}</h2>
{{ 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") }}
</a>
<h2 class="my-3">{{ _("Highest Reviewed") }}</h2>

@ -5,7 +5,7 @@
{% endblock %}
{% 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") }}
</a>
<h2 class="mt-0">{{ self.title() }}</h2>
@ -22,7 +22,7 @@
<span class="col-5">
{{ _("Source") }}
</span>
<span class="col-2 text-right">
<span class="col-2 text-end">
{{ _("Supported?") }}
</span>
</div>
@ -53,11 +53,11 @@
{{ support.confidence }}
{% endif %}
</span>
<span class="col-2 text-right">
<span class="col-2 text-end">
{% if support.supports %}
<span class="badge badge-success">Yes</span>
<span class="badge bg-success">Yes</span>
{% else %}
<span class="badge badge-danger">No</span>
<span class="badge bg-danger">No</span>
{% endif %}
</span>
</div>

@ -34,14 +34,14 @@
title="{{ tag.description or '' }}"
href="{{ url_set_query(page=1, _remove={ 'tag': tag.name }) }}">
{{ 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>
{% else %}
<a class="btn btn-sm btn-secondary m-1" rel="nofollow"
title="{{ tag.description or '' }}"
href="{{ url_set_query(page=1, _add={ 'tag': tag.name }) }}">
{{ 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>
{% endif %}
{% endfor %}

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

@ -72,7 +72,7 @@
{% if release.check_perm(current_user, "DELETE_RELEASE") %}
<form method="POST" action="{{ release.get_delete_url() }}" class="alert alert-secondary mb-5">
<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>
{{ _("Any associated uploads will not be deleted immediately, but the release will no longer be listed.") }}
<div style="clear:both;"></div>

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

@ -5,7 +5,7 @@
{% endblock %}
{% 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") }}
</a>
<h1>{{ self.title() }}</h1>
@ -33,10 +33,10 @@
<a class="btn btn-primary" href="{{ package.get_url('packages.update_config', trigger='commit') }}">
{{ _("Rolling Release") }}
</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") }}
</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") }}#}
{# </a>#}
</p>
@ -48,7 +48,7 @@
<a class="btn btn-secondary" href="{{ package.get_url('packages.update_config', action='notification') }}">
{{ _("With reminders") }}
</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") }}
</a>
</p>
@ -68,10 +68,10 @@
<a class="btn btn-primary" href="{{ package.get_url('packages.create_edit') }}">
{{ _("Add Git repo") }}
</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") }}
</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") }}
</a>
</p>

@ -6,26 +6,26 @@
{% block content %}
{% if package.check_perm(current_user, "MAKE_RELEASE") %}
<p class="float-right">
<p class="float-end">
{% if package.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") }}
</a>
{% elif package.repo %}
<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") }}
</a>
{% endif %}
<a class="btn btn-secondary ml-1" href="{{ package.get_url('packages.bulk_change_release') }}">
<i class="fas fa-wrench mr-1"></i>
<a class="btn btn-secondary ms-1" href="{{ package.get_url('packages.bulk_change_release') }}">
<i class="fas fa-wrench me-1"></i>
{{ _("Bulk update") }}
</a>
<a class="btn btn-primary ml-1" href="{{ package.get_url('packages.create_release') }}">
<i class="fas fa-plus mr-1"></i>
<a class="btn btn-primary ms-1" href="{{ package.get_url('packages.create_release') }}">
<i class="fas fa-plus me-1"></i>
{{ _("Create") }}
</a>
</p>

@ -23,14 +23,14 @@ Remove {{ package.title }}
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
<div class="form-group">
<label for="reason">{{ _("Reason") }}</label>
<span class="ml-1 text-danger">
<div class="form-group mb-3">
<label for="reason" class="form-label">{{ _("Reason") }}</label>
<span class="ms-1 text-danger">
<small>
<i class="fas fa-asterisk"></i>
</small>
</span>
<span class="ml-3 text-muted">
<span class="ms-3 text-muted">
{{ _("Required") }}
</span>
<input id="reason" class="form-control" type="text" name="reason" required minlength="5">
@ -39,9 +39,9 @@ Remove {{ package.title }}
</small>
</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 %}
<input type="submit" name="unapprove" value="{{ _('Unapprove') }}" class="btn btn-warning" />

@ -52,7 +52,7 @@
{% if review %}
<form method="POST" action="{{ review.get_delete_url() }}" class="alert alert-secondary my-5">
<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>
{{ _("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>

@ -55,11 +55,11 @@
<tr>
<th colspan="2">
{% 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 %}
<i class="fas fa-thumbs-down text-danger mr-2"></i>
<i class="fas fa-thumbs-down text-danger me-2"></i>
{% else %}
<i class="fas fa-minus mr-2"></i>
<i class="fas fa-minus me-2"></i>
{% endif %}
<a href="{{ review.thread.get_view_url() }}">
{{ review.thread.title }}
@ -70,7 +70,7 @@
<td>
{% for vote in review.votes %}
{% 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 }}
</a>
{% endif %}
@ -79,7 +79,7 @@
<td>
{% for vote in review.votes %}
{% 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 }}
</a>
{% endif %}

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

@ -23,7 +23,7 @@
{{ render_submit_field(form.submit) }}
</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 }}" />
</a>
</div>

@ -6,8 +6,8 @@
{% block content %}
{% if package.check_perm(current_user, "ADD_SCREENSHOTS") %}
<a href="{{ package.get_url('packages.create_screenshot') }}" class="btn btn-primary float-right">
<i class="fas fa-plus mr-1"></i>
<a href="{{ package.get_url('packages.create_screenshot') }}" class="btn btn-primary float-end">
<i class="fas fa-plus me-1"></i>
{{ _("Add Image") }}
</a>
{% endif %}
@ -19,7 +19,7 @@
{% if ss.approved or package.check_perm(current_user, "ADD_SCREENSHOTS") %}
<li class="list-group-item" data-id="{{ ss.id }}">
<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>
</div>
<div class="col-auto">
@ -32,32 +32,32 @@
{{ ss.width }} x {{ ss.height }}
{% if ss.is_low_res() %}
{% if ss.is_very_small() %}
<span class="badge badge-danger ml-3">
<span class="badge bg-danger ms-3">
{{ _("Way too small") }}
</span>
{% elif ss.is_too_small() %}
<span class="badge badge-warning ml-3">
<span class="badge bg-warning ms-3">
{{ _("Too small") }}
</span>
{% else %}
<span class="badge badge-secondary ml-3">
<span class="badge bg-secondary ms-3">
{{ _("Not HD") }}
</span>
{% endif %}
{% endif %}
{% if not ss.approved %}
<span class="ml-3">
<span class="ms-3">
{{ _("Awaiting approval") }}
</span>
{% endif %}
</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() }}" />
<a class="btn btn-sm btn-primary" href="{{ ss.get_edit_url() }}">
<i class="fas fa-pen"></i>
</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>
</button>
</form>
@ -91,7 +91,7 @@
</p>
<div class="client-preview d-flex flex-row align-items-center">
<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>
<span class="title">{{ package.title }}</span> by {{ package.author.username }}
</p>

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

@ -5,7 +5,7 @@
{% endblock %}
{% 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>
<p>
@ -46,7 +46,7 @@
<p class="mt-5 pt-4">
{{ 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>
</form>
{% endblock %}

@ -18,9 +18,9 @@
{% endblock %}
{% block scriptextra %}
<script src="/static/video_embed.js"></script>
<script src="/static/video_embed.js?v=2"></script>
{% if current_user.is_authenticated %}
<script src="/static/quick_review_voting.js"></script>
<script src="/static/quick_review_voting.js?v=2"></script>
{% endif %}
{% endblock %}
@ -34,7 +34,7 @@
{% block download_btn %}
{% 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() }}">
<div>
{{ _("Download") }}
@ -66,7 +66,7 @@
<p class="text-center mt-1 mb-4">
<a href="{{ installing_url }}">
<small>
<i class="fas fa-question-circle mr-1"></i>
<i class="fas fa-question-circle me-1"></i>
{{ _("How do I install this?") }}
</small>
</a>
@ -109,28 +109,28 @@
{% endif %}
{% 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 }}');
background-size: cover;
background-repeat: no-repeat;
background-position: center;">
<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") %}
<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") }}
</a>
{% endif %}
{% if package.check_perm(current_user, "MAKE_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") }}
</a>
{% endif %}
{% 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') }}">
<i class="fas fa-trash mr-1"></i>
<i class="fas fa-trash me-1"></i>
{{ _("Remove") }}
</a>
{% endif %}
@ -146,32 +146,32 @@
<p>
{% 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>
{{ package.dev_state.value }}
</span>
{% endif %}
{% 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>
{{ package_warning }}
</a>
{% endif %}
{% 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 }}">
<i class="fas fa-exclamation-circle" style="margin-right: 0.3em;"></i>
{{ warning.title }}
</a>
{% endfor %}
{% 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>
{{ _("Work in Progress") }}
</span>
{% endif %}
{% for t in package.tags %}
<a class="badge badge-primary" rel="nofollow"
<a class="badge bg-primary" rel="nofollow"
title="{{ t.description or '' }}"
href="{{ url_for('packages.list_all', tag=t.name) }}">
{{ t.title }}
@ -251,8 +251,8 @@
{% set screenshots = package.screenshots.all() %}
{% if package.check_perm(current_user, "ADD_SCREENSHOTS") %}
<a href="{{ package.get_url('packages.screenshots') }}" class="btn btn-primary float-right">
<i class="fas fa-images mr-1"></i>
<a href="{{ package.get_url('packages.screenshots') }}" class="btn btn-primary float-end">
<i class="fas fa-images me-1"></i>
{{ _("Edit") }}
</a>
{% endif %}
@ -355,12 +355,12 @@
<div class="d-flex mt-3 mb-4">
<form method="POST" action="{{ package.get_url('collections.package_toggle_favorite') }}">
<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>
</button>
</form>
<div class="flex-grow">
<a href="{{ package.get_url('collections.package_add') }}" class="btn btn-block btn-secondary">
<div class="flex-grow-1">
<a href="{{ package.get_url('collections.package_add') }}" class="btn d-block btn-secondary">
{{ _("Add to collection...") }}
</a>
</div>
@ -377,16 +377,16 @@
{{ config.get_message() }}
</p>
<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.") }}
</p>
<div class="btn-group btn-group-sm my-0">
<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") }}
</a>
<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") }}
</a>
</div>
@ -394,7 +394,7 @@
{% endif %}
{% if package_warning %}
<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 }}
</p>
{% endif %}
@ -402,15 +402,15 @@
{% if package.donate_url_actual %}
<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>
<a class="btn btn-block btn-primary" href="{{ package.donate_url_actual }}" rel="nofollow">
<i class="fas fa-heart mr-2"></i>
<a class="btn d-block btn-primary" href="{{ package.donate_url_actual }}" rel="nofollow">
<i class="fas fa-heart me-2"></i>
{{ _("Donate now") }}
</a>
</div>
{% endif %}
{% 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") }}
</a>
{% endif %}
@ -422,13 +422,13 @@
<dd>
{% for dep in package.get_sorted_hard_dependencies() %}
{%- if dep.package %}
<a class="badge badge-primary"
<a class="badge bg-primary"
href="{{ dep.package.get_url('packages.view') }}">
{{ _("%(title)s by %(display_name)s",
title=dep.package.title, display_name=dep.package.author.display_name) }}
</a>
{% elif dep.meta_package %}
<a class="badge badge-primary"
<a class="badge bg-primary"
href="{{ url_for('modnames.view', name=dep.meta_package.name) }}">
{{ dep.meta_package.name }}
</a>
@ -446,12 +446,12 @@
<dd>
{% for dep in optional_deps %}
{%- if dep.package %}
<a class="badge badge-secondary"
<a class="badge bg-secondary"
href="{{ dep.package.get_url('packages.view') }}">
{{ _("%(title)s by %(display_name)s",
title=dep.package.title, display_name=dep.package.author.display_name) }}
{% elif dep.meta_package %}
<a class="badge badge-secondary"
<a class="badge bg-secondary"
href="{{ url_for('modnames.view', name=dep.meta_package.name) }}">
{{ dep.meta_package.name }}
{% else %}
@ -471,7 +471,7 @@
{% if supported_games or unsupported_games or package.type == package.type.MOD %}
<h3>
{% 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>
</a>
{% endif %}
@ -491,7 +491,7 @@
{% if supported_games %}
<div style="max-height: 300px; overflow: hidden auto;" class="mb-3">
{% for support in supported_games %}
<a class="badge badge-secondary"
<a class="badge bg-secondary"
href="{{ support.game.get_url('packages.view') }}">
{{ _("%(title)s by %(display_name)s",
title=support.game.title, display_name=support.game.author.display_name) }}
@ -522,9 +522,9 @@
</p>
<div style="max-height: 300px; overflow: hidden auto;">
{% for support in unsupported_games %}
<a class="badge badge-danger"
<a class="badge bg-danger"
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=support.game.title, display_name=support.game.author.display_name) }}
</a>
@ -542,7 +542,7 @@
{% elif package.check_perm(current_user, "EDIT_PACKAGE") %}
<p class="alert alert-warning">
{% 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>
</a>
{% endif %}
@ -582,7 +582,7 @@
<dt>{{ _("Maintainers") }}</dt>
<dd>
{% for user in package.maintainers %}
<a class="badge badge-secondary"
<a class="badge bg-secondary"
href="{{ url_for('users.profile', username=user.username) }}">
{{ user.display_name }}
</a>
@ -598,7 +598,7 @@
{% if package.provides %}
<dt>{{ _("Provides") }}</dt>
<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>
{% endfor %}</dd>
{% endif %}
@ -606,7 +606,7 @@
<h3>
{% 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 %}
{{ _("Releases") }}
</h3>
@ -624,7 +624,7 @@
<h3>
{% 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>
</div>
{% endif %}
@ -638,7 +638,7 @@
<p class="mt-3">
{% if package.approved and current_user != package.author %}
<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") }}
</a>
{% endif %}

@ -16,7 +16,7 @@
{{ _("Please sign in or contact the admin in another way") }}
</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>
</p>

@ -15,7 +15,7 @@
<div class="card-body">
<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" />
</div>
</form>

@ -15,7 +15,7 @@
<div class="card-body">
<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" />
</div>
</form>

@ -9,7 +9,7 @@
{% block content %}
{% 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 %}
<h1>{{ self.title() }}</h1>

@ -25,29 +25,29 @@
<div class="card">
<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) }}">
{{ r.author.display_name }}
</a>
{% 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 }})
</span>
{% endif %}
{% 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 }}
</a>
{% else %}
<i class="fas fa-reply mr-2"></i>
<a class="badge badge-dark" href="{{ r.thread.get_view_url() }}">
<i class="fas fa-reply me-2"></i>
<a class="badge bg-dark" href="{{ r.thread.get_view_url() }}">
{{ _("Reply to <b>%(title)s</b>", title=r.thread.title) }}
</a>
{% 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 }}">
{{ r.created_at | datetime }}
</a>

@ -27,40 +27,40 @@
{% block scriptextra %}
{% if current_user.is_authenticated %}
<script src="/static/quick_review_voting.js"></script>
<script src="/static/quick_review_voting.js?v=2"></script>
{% endif %}
{% endblock %}
{% block content %}
{% if current_user.is_authenticated %}
{% 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="submit" class="btn btn-primary" value="{{ _('Unsubscribe') }}" />
</form>
{% 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="submit" class="btn btn-primary" value="{{ _('Subscribe') }}" />
</form>
{% endif %}
{% 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 %}
{% 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="submit" class="btn btn-danger" value="{{ _('Convert to Thread') }}" />
</form>
{% endif %}
{% if thread.check_perm(current_user, "LOCK_THREAD") %}
{% 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="submit" class="btn btn-secondary" value="{{ _('Unlock') }}" />
</form>
{% 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="submit" class="btn btn-secondary" value="{{ _('Lock') }}" />
</form>
@ -69,7 +69,7 @@
{% endif %}
{% 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') }}">
<i class="fas fa-pen"></i>
{{ _("Edit Review") }}
@ -79,11 +79,11 @@
<h1>
{% if thread.review %}
{% 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 %}
<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 %}
<i class="fas fa-minus mr-2" style="color:#999"></i>
<i class="fas fa-minus me-2" style="color:#999"></i>
{% endif %}
{% endif %}
{% if thread.private %}&#x1f512; {% endif %}{{ thread.title }}
@ -104,7 +104,7 @@
</div>
<div class="col-md-3">
<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:") }}
</span>
{% for viewer in thread.get_visible_to() %}

@ -9,7 +9,7 @@
{% if can_approve_scn and screenshots %}
<div class="card my-4">
<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="action" value="screenshots_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">
{% for p in packages %}
<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>
{{ p.created_at | timedelta }} ago
</small>
</span>
{% 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 %}
<span class="mr-2 badge badge-success">Ready</span>
<span class="me-2 badge bg-success">Ready</span>
{% endif %}
{{ p.title }} by {{ p.author.display_name }}
@ -77,7 +77,7 @@
{% for r in releases %}
<li class="list-group-item">
{% if r.task_id %}
<span class="mr-2 badge badge-warning">{{ _("Importing") }}</span>
<span class="me-2 badge bg-warning">{{ _("Importing") }}</span>
{% endif %}
<a href="{{ r.get_edit_url() }}">{{ r.title }}</a>
on
@ -108,13 +108,13 @@
<div class="list-group list-group-flush">
{% for p in license_needed %}
<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>
{{ p.created_at | timedelta }} ago
</small>
</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 }}
</a>
@ -142,7 +142,7 @@
{% if unfulfilled_meta_packages %}
<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 Dependencies") }}
</h2>
@ -165,16 +165,16 @@
<div class="list-group list-group-flush" style="max-height: 300px; overflow: hidden auto;">
{% for p in wip_packages %}
<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>
{{ p.created_at | timedelta }} ago
</small>
</span>
{% 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 %}
<span class="mr-2 badge badge-danger">{{ p.state.value }}</span>
<span class="me-2 badge bg-danger">{{ p.state.value }}</span>
{% endif %}
{{ p.title }} by {{ p.author.display_name }}
@ -189,7 +189,7 @@
<div class="mt-5"></div>
{% 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") }}
</a>
{% endif %}

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

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

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

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

@ -8,16 +8,14 @@
<div class="row">
<div class="col-md-6">
<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">
<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') }}">
</div>
<input class="form-control" id="q" name="q" type="text" placeholder="{{ _('Search all packages') }}">>
<input class="btn btn-primary" type="submit" value="{{ _('Search') }}">
</div>
</form>
</div>
<div class="col-md-6 text-right">
<div class="col-md-6 text-end">
{% if only_no_tags %}
<a class="btn btn-primary" href="{{ url_set_query(no_tags=0) }}">
{{ _("Missing tags only") }}
@ -28,7 +26,7 @@
</a>
{% endif %}
{% 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 %}
</div>
</div>
@ -57,12 +55,12 @@
</td>
<td class="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 }) }}">
{{ tag.title }}
</a>
{% 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>
</a> -->
</td>

@ -5,8 +5,8 @@ Topics to be Added
{% endblock %}
{% block content %}
<div class="float-right">
<div class="btn-group btn-group-sm mr-2">
<div class="float-end">
<div class="btn-group btn-group-sm me-2">
<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') }}">
{{ _("Sort by date") }}
@ -69,7 +69,7 @@ Topics to be Added
<input type="hidden" name="n" value={{ n }} />
<input type="hidden" name="sort" value={{ sort_by or "date" }} />
<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>
{% from "macros/topics.html" import render_topics_table %}

@ -26,7 +26,7 @@
style="max-height: 22px; max-width: 22px;"
src="{{ package.get_thumb_or_placeholder() }}" />
<span class="pl-2">
<span class="ps-2">
{{ package.title }}
</span>
</div>
@ -41,14 +41,14 @@
{% endfor %}
</div>
<a class="btn btn-secondary float-right" href="/help/update_config/">
<a class="btn btn-secondary float-end" href="/help/update_config/">
{{ _("Help") }}
</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") }}
</a>
{% 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 class="btn btn-primary" type="submit" value="{{ _('Create All Releases') }}" />
</form>
@ -65,10 +65,10 @@
<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") }}
</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") }}
</a>
<h2>{{ _("Missing Game Support") }}</h2>
@ -86,7 +86,7 @@
style="max-height: 22px; max-width: 22px;"
src="{{ package.get_thumb_or_placeholder() }}" />
<span class="pl-2">
<span class="ps-2">
{{ package.title }}
</span>
</a>
@ -106,7 +106,7 @@
style="max-height: 22px; max-width: 22px;"
src="{{ package.get_thumb_or_placeholder() }}" />
<span class="pl-2">
<span class="ps-2">
{{ package.title }}
</span>
</a>
@ -125,13 +125,13 @@
{{ _("The recommended resolution is 1920x1080, and screenshots must be at least %(width)dx%(height)d.",
width=920, height=517) }}
<span class="badge badge-danger ml-3">
<span class="badge bg-danger ms-3">
{{ _("Way too small") }}
</span>
<span class="badge badge-warning">
<span class="badge bg-warning">
{{ _("Too small") }}
</span>
<span class="badge badge-secondary">
<span class="badge bg-secondary">
{{ _("Not HD") }}
</span>
</p>
@ -146,7 +146,7 @@
style="max-height: 22px; max-width: 22px;"
src="{{ package.get_thumb_or_placeholder() }}" />
<span class="pl-2">
<span class="ps-2">
{{ package.title }}
</span>
</div>
@ -155,13 +155,13 @@
{% for ss in package.screenshots %}
{% if ss.is_low_res() %}
{% if ss.is_very_small() %}
{% set badge_color = "badge-danger" %}
{% set badge_color = "bg-danger" %}
{% elif ss.is_too_small() %}
{% set badge_color = "badge-warning" %}
{% set badge_color = "bg-warning" %}
{% else %}
{% set badge_color = "badge-secondary" %}
{% set badge_color = "bg-secondary" %}
{% 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 }}
</span>
{% endif %}
@ -175,7 +175,7 @@
</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>
<h2>{{ _("Packages Without Tags") }}</h2>
<p>
@ -189,7 +189,7 @@
style="max-height: 22px; max-width: 22px;"
src="{{ package.get_thumb_or_placeholder() }}" />
<span class="pl-2">
<span class="ps-2">
{{ package.title }}
</span>
</a>

@ -53,7 +53,7 @@
</a>
{% 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") }}
</a>
{% endif %}
@ -69,7 +69,7 @@
</table>
{% 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") }}
</a>
{% endif %}

@ -14,10 +14,10 @@
</p>
<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") }}
</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") }}
</a>
<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="card">
<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") }}
</div>
@ -52,7 +52,7 @@ Create Account from Forums User
<div class="col-sm-6">
<div class="card">
<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") }}
</div>

@ -26,7 +26,7 @@
</p>
{% 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") }}
</a>
<input type="submit"
@ -37,7 +37,7 @@
{% endif %}
class="btn btn-danger" />
{% 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 %}
</div>
</form>

@ -33,17 +33,17 @@
<div class="col-sm-2 {{ user.rank }}"
title="{{ _('Rank: %(rank)s.', rank=user.rank.get_title()) }}">
{% 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 %}
<i class="fas fa-user-shield mr-2"></i>
<i class="fas fa-user-shield me-2"></i>
{% 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 %}
<i class="fas fa-user-check mr-2"></i>
<i class="fas fa-user-check me-2"></i>
{% elif user.rank == user.rank.BOT %}
<i class="fas fa-robot mr-2"></i>
<i class="fas fa-robot me-2"></i>
{% else %}
<i class="fas fa-user mr-2"></i>
<i class="fas fa-user me-2"></i>
{% endif %}
{{ user.rank.get_title() }}
@ -52,7 +52,7 @@
<span class="col-sm {{ user.rank }}">
{{ 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 }})
</span>
{% endif %}

@ -20,17 +20,17 @@
{{ _("Forgot my password") }}
</a>
</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" />
<p>
<a class="btn btn-secondary mr-3" href="{{ url_for('github.start') }}">
<i class="fab fa-github mr-1"></i>
<a class="btn btn-secondary me-3" href="{{ url_for('github.start') }}">
<i class="fab fa-github me-1"></i>
{{ _("GitHub") }}
</a>
<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") }}
</a>
</p>

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

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

@ -7,7 +7,7 @@
{% block content %}
{% 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>
<form action="" method="POST" class="form card-body" role="form">

@ -9,7 +9,7 @@
<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;">
</span>
<span class="col m-0 p-0 pl-2">
<span class="col m-0 p-0 ps-2">
{{ user.display_name }}
</span>
</span>

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

@ -53,7 +53,7 @@
<div class="button-group mt-4">
{% 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") }}
</a>
{% endif %}

@ -5,7 +5,7 @@
{% endblock %}
{% 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>
<h2>{{ query }}</h2>