1
0
mirror of https://gitlab.com/brutaldon/brutaldon.git synced 2024-12-04 14:46:24 -05:00

Merge branch 'main' into 'main'

Brutal CSS Strip

See merge request brutaldon/brutaldon!14
This commit is contained in:
Dorian Vertumna 2024-07-23 16:34:52 +00:00
commit 17b3193060
73 changed files with 1395 additions and 9525 deletions

View File

@ -26,4 +26,6 @@ We currently lack a formal process for this. Translations can be submitted via m
## Documentation
We would love assistance in creating a formal documentation process for this project.
Current documentation efforts are focused on adding usable comments in the code itself.
Guides on how to set up and admin a brutaldon instance are likely to follow after that.
Feel free to send in a merge request with other documentation ideas you have!

View File

@ -25,5 +25,8 @@ Django = "~=3.2"
django-html_sanitizer = "*"
inscriptis = "*"
lxml = "*"
uwsgi = "*"
django-debug-toolbar = "*"
gunicorn = "*"
[dev-packages]

View File

@ -64,5 +64,8 @@ People love screenshots, whatever the project, so here we are. These screenshots
* [X] Add support for following, blocking, and muting users.
## Aesthetic
No automatic page updates: refresh the page to see new toots. No endless scroll: there's a "next page" link. No autocompletion of anything: use another lynx process in another screen window to look things up. UTF8 clean.
Brutaldon seeks to be a minimalist activity-pub client, taking visual and functional inspiration from the web of the 90s. HTML only websites are quite usable actually. Very little CSS and javascript should be used to polish the edges of a powerful and robust tool.
- Brutaldon will function without javascript.
- Brutaldon will function without css.
- No automatic page updates.
- UTF8 clean.

View File

@ -1,8 +1,12 @@
# Module for reversing urls.
# In the sense of a reverse proxy I think.
from django.urls import reverse
def bookmarklet_url(request):
# takes var request and add a /share/ to the end of the url
share_url = request.build_absolute_uri(reverse("share"))
# return the share_url embedded in a string of other stuff.
# not yet sure what that other stuff is for.
return {
"bookmarklet_url": f"javascript:location.href='{share_url}?url='+encodeURIComponent(location.href)+';title='+encodeURIComponent(document.title)"
}

View File

@ -1,6 +1,13 @@
# The Forms modules supplies tools for http get and post,
# and building the <form> html elements to use them.
from django import forms
# This module gives us access to the settings given to
# Django at runtime via settings files.
from django.conf import settings
# Module for translating text, returns strings
from django.utils.translation import gettext as _
# Module for calculating times
# Note: Python 3.9 or later projects should be using internal libraries per pytz docs
from pytz import common_timezones
from .models import Theme, Preference

View File

@ -19,58 +19,6 @@ def set_up_default_themes(apps, schema_editor):
is_brutalist=False,
)
dark.save()
lux = Theme(
name="Lux",
main_css="css/bulmaswatch-lux.min.css",
tweaks_css="css/brutaldon.css",
is_brutalist=False,
)
lux.save()
solar = Theme(
name="Solar",
main_css="css/bulmaswatch-solar.min.css",
tweaks_css="css/brutaldon.css",
is_brutalist=False,
)
solar.save()
material = Theme(
name="Material",
main_css="css/bulmaswatch-materia.min.css",
tweaks_css="css/brutaldon-material.css",
is_brutalist=False,
)
material.save()
brutalism = Theme(
name="FULLBRUTALISM", main_css="css/fullbrutalism.css", is_brutalist=True
)
brutalism.save()
brutstrap = Theme(
name="Brutstrap",
main_css="css/brutstrap.css",
is_brutalist=True,
tweaks_css="css/brutstrap-tweaks.css",
)
brutstrap.save()
large = Theme(
name="Minimalist Large", main_css="css/minimal-large.css", is_brutalist=True
)
large.save()
small = Theme(
name="Minimalist Small", main_css="css/minimal-small.css", is_brutalist=True
)
small.save()
dark2 = Theme(
name="Minimalist Dark", main_css="css/minimal-dark.css", is_brutalist=True
)
dark2.save()
vt240 = Theme(
name="vt240 amber", main_css="css/vt240don-amber.css", is_brutalist=True
)
vt240.save()
vt240_green = Theme(
name="vt240 green", main_css="css/vt240don-green.css", is_brutalist=True
)
vt240_green.save()
minimal = Theme(name="No styling at all", main_css=None, is_brutalist=True)
minimal.save()

File diff suppressed because one or more lines are too long

View File

@ -1,6 +1,10 @@
from django.db import models
# Module to access variables given to Django at runtime
from django.conf import settings
# Module to translate strings
from django.utils.translation import gettext as _
# Module for calculating time
# Note: Python 3.9 or later programs should use internal libraries, per pytz docs
from pytz import common_timezones
timezones = [(tz, tz) for tz in common_timezones]

View File

@ -41,9 +41,11 @@ INSTALLED_APPS = [
"sanitizer",
"django.contrib.humanize",
"brutaldon",
"debug_toolbar",
]
MIDDLEWARE = [
"debug_toolbar.middleware.DebugToolbarMiddleware",
"django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
@ -216,3 +218,8 @@ DEFAULT_AUTO_FIELD='django.db.models.AutoField'
# Version number displayed on about page
BRUTALDON_VERSION = "2.15.0"
# Set the internal IP address, this needs to be explicitly set for the debug toolbar to work.
INTERNAL_IPS = [
"127.0.0.1",
]

View File

@ -0,0 +1,3 @@
img.avatar {
height: 90px;
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -145,7 +145,7 @@ input[type=button] {width: auto; overflow: visible;}
body {
font-family: Terminus, Inconsolata, Consolas, "Droid Sans Mono", "DejaVu Sans Mono", "Monaco", monospace;
background-color: #CCC;
background-color: #fff;
color: #000;
margin: 1em;
}
@ -236,12 +236,12 @@ img.is-32x32 {
.media {
padding: 1em;
margin: 4px;
border: 8px ridge #CCC;
border: 8px #000;
overflow: auto;
}
.media.active-context {
background-color: #DDD;
background-color: #fff;
}
summary::before {
@ -332,10 +332,10 @@ img.emoji
.modal-content
{
z-index: 60;
background-color: #CCC;
background-color: #fff;
color: #000;
padding: 1ex;
border: 8px ridge #CCC;
border: 8px ridge #fff;
max-height: 90vh;
overflow: auto;
}

View File

@ -1,351 +0,0 @@
/* Magnific Popup CSS */
.mfp-bg {
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 1042;
overflow: hidden;
position: fixed;
background: #0b0b0b;
opacity: 0.8; }
.mfp-wrap {
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 1043;
position: fixed;
outline: none !important;
-webkit-backface-visibility: hidden; }
.mfp-container {
text-align: center;
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
padding: 0 8px;
box-sizing: border-box; }
.mfp-container:before {
content: '';
display: inline-block;
height: 100%;
vertical-align: middle; }
.mfp-align-top .mfp-container:before {
display: none; }
.mfp-content {
position: relative;
display: inline-block;
vertical-align: middle;
margin: 0 auto;
text-align: left;
z-index: 1045; }
.mfp-inline-holder .mfp-content,
.mfp-ajax-holder .mfp-content {
width: 100%;
cursor: auto; }
.mfp-ajax-cur {
cursor: progress; }
.mfp-zoom-out-cur, .mfp-zoom-out-cur .mfp-image-holder .mfp-close {
cursor: -moz-zoom-out;
cursor: -webkit-zoom-out;
cursor: zoom-out; }
.mfp-zoom {
cursor: pointer;
cursor: -webkit-zoom-in;
cursor: -moz-zoom-in;
cursor: zoom-in; }
.mfp-auto-cursor .mfp-content {
cursor: auto; }
.mfp-close,
.mfp-arrow,
.mfp-preloader,
.mfp-counter {
-webkit-user-select: none;
-moz-user-select: none;
user-select: none; }
.mfp-loading.mfp-figure {
display: none; }
.mfp-hide {
display: none !important; }
.mfp-preloader {
color: #CCC;
position: absolute;
top: 50%;
width: auto;
text-align: center;
margin-top: -0.8em;
left: 8px;
right: 8px;
z-index: 1044; }
.mfp-preloader a {
color: #CCC; }
.mfp-preloader a:hover {
color: #FFF; }
.mfp-s-ready .mfp-preloader {
display: none; }
.mfp-s-error .mfp-content {
display: none; }
button.mfp-close,
button.mfp-arrow {
overflow: visible;
cursor: pointer;
background: transparent;
border: 0;
-webkit-appearance: none;
display: block;
outline: none;
padding: 0;
z-index: 1046;
box-shadow: none;
touch-action: manipulation; }
button::-moz-focus-inner {
padding: 0;
border: 0; }
.mfp-close {
width: 44px;
height: 44px;
line-height: 44px;
position: absolute;
right: 0;
top: 0;
text-decoration: none;
text-align: center;
opacity: 0.65;
padding: 0 0 18px 10px;
color: #FFF;
font-style: normal;
font-size: 28px;
font-family: Arial, Baskerville, monospace; }
.mfp-close:hover,
.mfp-close:focus {
opacity: 1; }
.mfp-close:active {
top: 1px; }
.mfp-close-btn-in .mfp-close {
color: #333; }
.mfp-image-holder .mfp-close,
.mfp-iframe-holder .mfp-close {
color: #FFF;
right: -6px;
text-align: right;
padding-right: 6px;
width: 100%; }
.mfp-counter {
position: absolute;
top: 0;
right: 0;
color: #CCC;
font-size: 12px;
line-height: 18px;
white-space: nowrap; }
.mfp-arrow {
position: absolute;
opacity: 0.65;
margin: 0;
top: 50%;
margin-top: -55px;
padding: 0;
width: 90px;
height: 110px;
-webkit-tap-highlight-color: transparent; }
.mfp-arrow:active {
margin-top: -54px; }
.mfp-arrow:hover,
.mfp-arrow:focus {
opacity: 1; }
.mfp-arrow:before,
.mfp-arrow:after {
content: '';
display: block;
width: 0;
height: 0;
position: absolute;
left: 0;
top: 0;
margin-top: 35px;
margin-left: 35px;
border: medium inset transparent; }
.mfp-arrow:after {
border-top-width: 13px;
border-bottom-width: 13px;
top: 8px; }
.mfp-arrow:before {
border-top-width: 21px;
border-bottom-width: 21px;
opacity: 0.7; }
.mfp-arrow-left {
left: 0; }
.mfp-arrow-left:after {
border-right: 17px solid #FFF;
margin-left: 31px; }
.mfp-arrow-left:before {
margin-left: 25px;
border-right: 27px solid #3F3F3F; }
.mfp-arrow-right {
right: 0; }
.mfp-arrow-right:after {
border-left: 17px solid #FFF;
margin-left: 39px; }
.mfp-arrow-right:before {
border-left: 27px solid #3F3F3F; }
.mfp-iframe-holder {
padding-top: 40px;
padding-bottom: 40px; }
.mfp-iframe-holder .mfp-content {
line-height: 0;
width: 100%;
max-width: 900px; }
.mfp-iframe-holder .mfp-close {
top: -40px; }
.mfp-iframe-scaler {
width: 100%;
height: 0;
overflow: hidden;
padding-top: 56.25%; }
.mfp-iframe-scaler iframe {
position: absolute;
display: block;
top: 0;
left: 0;
width: 100%;
height: 100%;
box-shadow: 0 0 8px rgba(0, 0, 0, 0.6);
background: #000; }
/* Main image in popup */
img.mfp-img {
width: auto;
max-width: 100%;
height: auto;
display: block;
line-height: 0;
box-sizing: border-box;
padding: 40px 0 40px;
margin: 0 auto; }
/* The shadow behind the image */
.mfp-figure {
line-height: 0; }
.mfp-figure:after {
content: '';
position: absolute;
left: 0;
top: 40px;
bottom: 40px;
display: block;
right: 0;
width: auto;
height: auto;
z-index: -1;
box-shadow: 0 0 8px rgba(0, 0, 0, 0.6);
background: #444; }
.mfp-figure small {
color: #BDBDBD;
display: block;
font-size: 12px;
line-height: 14px; }
.mfp-figure figure {
margin: 0; }
.mfp-bottom-bar {
margin-top: -36px;
position: absolute;
top: 100%;
left: 0;
width: 100%;
cursor: auto; }
.mfp-title {
text-align: left;
line-height: 18px;
color: #F3F3F3;
word-wrap: break-word;
padding-right: 36px; }
.mfp-image-holder .mfp-content {
max-width: 100%; }
.mfp-gallery .mfp-image-holder .mfp-figure {
cursor: pointer; }
@media screen and (max-width: 800px) and (orientation: landscape), screen and (max-height: 300px) {
/**
* Remove all paddings around the image on small screen
*/
.mfp-img-mobile .mfp-image-holder {
padding-left: 0;
padding-right: 0; }
.mfp-img-mobile img.mfp-img {
padding: 0; }
.mfp-img-mobile .mfp-figure:after {
top: 0;
bottom: 0; }
.mfp-img-mobile .mfp-figure small {
display: inline;
margin-left: 5px; }
.mfp-img-mobile .mfp-bottom-bar {
background: rgba(0, 0, 0, 0.6);
bottom: 0;
margin: 0;
top: auto;
padding: 3px 5px;
position: fixed;
box-sizing: border-box; }
.mfp-img-mobile .mfp-bottom-bar:empty {
padding: 0; }
.mfp-img-mobile .mfp-counter {
right: 5px;
top: 3px; }
.mfp-img-mobile .mfp-close {
top: 0;
right: 0;
width: 35px;
height: 35px;
line-height: 35px;
background: rgba(0, 0, 0, 0.6);
position: fixed;
text-align: center;
padding: 0; } }
@media all and (max-width: 900px) {
.mfp-arrow {
-webkit-transform: scale(0.75);
transform: scale(0.75); }
.mfp-arrow-left {
-webkit-transform-origin: 0;
transform-origin: 0; }
.mfp-arrow-right {
-webkit-transform-origin: 100%;
transform-origin: 100%; }
.mfp-container {
padding-left: 6px;
padding-right: 6px; } }

View File

@ -1,296 +0,0 @@
body, input, textarea, select {
font-family: sans-serif;
background-color: #111111;
color: #CCCCCC;
margin: 1ex;
font-size: 11pt;
}
input[text], textarea
{
margin: 0 auto;
position: relative;
width: 100%;
max-width: 100em;
}
a {
color: cornflowerblue;
text-decoration: underline;
}
a:active {
color: lightcoral;
text-decoration: underline;
}
a:visited {
color: orchid;
text-decoration: underline;
}
img.is-32x32 {
float: left;
max-width: 32px;
max-height: auto;
margin: 4px;
}
.container {
margin: 0 auto;
position: relative;
}
@media screen and (min-width: 1024px) {
.container {
max-width: 960px;
width: 960px;
}
.container.is-fluid {
margin-left: 64px;
margin-right: 64px;
max-width: none;
width: auto;
}
.navbar,
.navbar-menu,
.navbar-start,
.navbar-end {
align-items: stretch;
display: flex;
}
.navbar-start {
justify-content: flex-start;
margin-right: auto;
}
.navbar-end {
justify-content: flex-end;
margin-left: auto;
}
}
@media screen and (max-width: 1279px) {
.container.is-widescreen {
max-width: 1152px;
width: auto;
}
}
@media screen and (max-width: 1471px) {
.container.is-fullhd {
max-width: 1344px;
width: auto;
}
}
@media screen and (min-width: 1280px) {
.container {
max-width: 1152px;
width: 1152px;
}
}
@media screen and (min-width: 1472px) {
.container {
max-width: 1344px;
width: 1344px;
}
}
main > div.container {
max-width: 100ex;
}
.level {
clear: both;
}
.title {
font-size: 3ex;
font-weight: bold;
margin-top: 1ex;
margin-bottom: 1ex;
}
.subtitle {
font-size: 1.5ex;
font-weight: bold;
margin-top: 0.25ex;
margin-bottom: 0.25ex;
}
.toot {
clear: both;
}
.image.is-32x32, .is-32x32 img, img.is-32x32 {
width: 32px;
height: 32px;
}
.image.is-48x48, .is-48x48 img, img.is-48x48 {
width: 48px;
height: 48px;
}
.image.is-64x64, .is-64x64 img, img.is-64x64 {
width: 64px;
height: 64px;
}
.image.is-96x96, .is-96x96 img, img.is-96x96 {
width: 96px;
height: 96px;
}
.is-max-128 {
max-height: 128px;
max-width: 128px;
}
.is-max-256 {
max-height: 256px;
max-width: 256px;
}
.media {
padding: 1ex;
margin: 4px;
overflow: auto;
}
.media.active-context {
background-color: #2C2C2C;
}
.field
{
margin-top: 1em;
}
label
{
font-weight: bold;
}
.control, .select
{
margin-top: 0.5ex;
margin-bottom: 0.5ex;
}
.account-avatar
{
display: inline-block;
}
.reblog-icon
{
margin-top: 32px;
display: inline-block;
}
.media-content
{
margin-top: 1ex;
}
.media-content > div > p
{
margin-bottom: 1ex;
}
.textarea
{
max-width: 100%;
}
.errorlist
{
color: #FF0000;
}
img.emoji
{
display: inline;
max-height: 1.5rem;
max-width: 1.5rem;
vertical-align: text-bottom;
}
hr.is-hidden
{
display: none;
}
.box
{
border-radius: 3px;
border: 1px solid #000;
padding: 1em;
margin-bottom: 1em;
background-color: #1C1C1C;
color: #CCCCCC;
}
.modal {
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
display: none;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
overflow: hidden;
position: fixed;
z-index: 40;
}
.modal-background {
position: absolute;
background-color: rgba(10,10,10,.86);
}
.modal, .modal-background {
bottom: 0;
left: 0;
right: 0;
top: 0;
}
.modal-content
{
height: 90vh;
overflow: auto;
z-index: 60;
}
.modal.is-active {
display: flex;
}
.navbar-item span {
padding-right: 1ex;
}
.card
{
padding: 1em;
margin-top: 1em;
border: 0.2em solid white;
}
.card-header
{
padding-bottom: 1em;
border-bottom: 0.2em solid white;
}
.card-image
{
padding: 1em;
margin 0, auto;
}
.button
{
border: 0.2em solid #CCC;
display: inline;
padding: 0.4em;
}

View File

@ -1,267 +0,0 @@
body, input, textarea, select {
font-family: sans-serif;
background-color: #FAFAFA;
color: #000;
margin: 1em;
font-size: larger;
}
input[text], textarea
{
margin: 0 auto;
position: relative;
width: 100%;
max-width: 120em;
}
a {
color: blue;
text-decoration: underline;
}
a:active {
color: red;
text-decoration: underline;
}
a:visited {
color: purple;
text-decoration: underline;
}
img.is-32x32 {
float: left;
max-width: 512px;
max-height: auto;
margin: 4px;
}
.container {
margin: 0 auto;
position: relative;
}
@media screen and (min-width: 1024px) {
.container {
max-width: 960px;
width: 960px;
}
.container.is-fluid {
margin-left: 64px;
margin-right: 64px;
max-width: none;
width: auto;
}
.navbar,
.navbar-menu,
.navbar-start,
.navbar-end {
align-items: stretch;
display: flex;
}
.navbar-start {
justify-content: flex-start;
margin-right: auto;
}
.navbar-end {
justify-content: flex-end;
margin-left: auto;
}
}
@media screen and (max-width: 1279px) {
.container.is-widescreen {
max-width: 1152px;
width: auto;
}
}
@media screen and (max-width: 1471px) {
.container.is-fullhd {
max-width: 1344px;
width: auto;
}
}
@media screen and (min-width: 1280px) {
.container {
max-width: 1152px;
width: 1152px;
}
}
@media screen and (min-width: 1472px) {
.container {
max-width: 1344px;
width: 1344px;
}
}
body > section > div.container {
max-width: 100ex;
}
.level {
clear: both;
}
.title {
font-size: 3ex;
font-weight: bold;
margin-top: 1ex;
margin-bottom: 1ex;
}
.subtitle {
font-size: 1.5ex;
font-weight: bold;
margin-top: 0.25ex;
margin-bottom: 0.25ex;
}
.toot {
clear: both;
}
.image.is-32x32, .is-32x32 img, img.is-32x32 {
width: 32px;
height: 32px;
}
.image.is-48x48, .is-48x48 img, img.is-48x48 {
width: 48px;
height: 48px;
}
.image.is-64x64, .is-64x64 img, img.is-64x64 {
width: 64px;
height: 64px;
}
.image.is-96x96, .is-96x96 img, img.is-96x96 {
width: 96px;
height: 96px;
}
.is-max-128 {
max-height: 128px;
max-width: 128px;
}
.is-max-256 {
max-height: 256px;
max-width: 256px;
}
.media {
padding: 1ex;
margin: 4px;
overflow: auto;
}
.media.active-context {
background-color: #DDD;
}
.field
{
margin-top: 1em;
}
label
{
font-weight: bold;
}
.control, .select
{
margin-top: 0.5ex;
margin-bottom: 0.5ex;
}
.account-avatar
{
display: inline-block;
}
.reblog-icon
{
margin-top: 32px;
display: inline-block;
}
.media-content
{
margin-top: 1ex;
}
.media-content > div > p
{
margin-bottom: 1ex;
}
.textarea
{
max-width: 100%;
}
.errorlist
{
color: #FF0000;
}
img.emoji
{
display: inline;
max-height: 1.5rem;
max-width: 1.5rem;
vertical-align: text-bottom;
}
hr.is-hidden
{
display: none;
}
.box
{
border-radius: 5px;
border: 1px solid #000;
padding: 1.5em;
margin-bottom: 1.5em;
background-color: white;
color: black;
}
.modal {
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
display: none;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
overflow: hidden;
position: fixed;
z-index: 40;
}
.modal-background {
position: absolute;
background-color: rgba(10,10,10,.86);
}
.modal, .modal-background {
bottom: 0;
left: 0;
right: 0;
top: 0;
}
.modal-content
{
height: 90vh;
overflow: auto;
z-index: 60;
}
.modal.is-active {
display: flex;
}

View File

@ -1,296 +0,0 @@
body, input, textarea, select {
font-family: sans-serif;
background-color: #FAFAFA;
color: #000;
margin: 1ex;
font-size: 11pt;
}
input[text], textarea
{
margin: 0 auto;
position: relative;
width: 100%;
max-width: 100em;
}
a {
color: blue;
text-decoration: underline;
}
a:active {
color: red;
text-decoration: underline;
}
a:visited {
color: purple;
text-decoration: underline;
}
img.is-32x32 {
float: left;
max-width: 32px;
max-height: auto;
margin: 4px;
}
.container {
margin: 0 auto;
position: relative;
}
@media screen and (min-width: 1024px) {
.container {
max-width: 960px;
width: 960px;
}
.container.is-fluid {
margin-left: 64px;
margin-right: 64px;
max-width: none;
width: auto;
}
.navbar,
.navbar-menu,
.navbar-start,
.navbar-end {
align-items: stretch;
display: flex;
}
.navbar-start {
justify-content: flex-start;
margin-right: auto;
}
.navbar-end {
justify-content: flex-end;
margin-left: auto;
}
}
@media screen and (max-width: 1279px) {
.container.is-widescreen {
max-width: 1152px;
width: auto;
}
}
@media screen and (max-width: 1471px) {
.container.is-fullhd {
max-width: 1344px;
width: auto;
}
}
@media screen and (min-width: 1280px) {
.container {
max-width: 1152px;
width: 1152px;
}
}
@media screen and (min-width: 1472px) {
.container {
max-width: 1344px;
width: 1344px;
}
}
main > div.container {
max-width: 100ex;
}
.level {
clear: both;
}
.title {
font-size: 3ex;
font-weight: bold;
margin-top: 1ex;
margin-bottom: 1ex;
}
.subtitle {
font-size: 1.5ex;
font-weight: bold;
margin-top: 0.25ex;
margin-bottom: 0.25ex;
}
.toot {
clear: both;
}
.image.is-32x32, .is-32x32 img, img.is-32x32 {
width: 32px;
height: 32px;
}
.image.is-48x48, .is-48x48 img, img.is-48x48 {
width: 48px;
height: 48px;
}
.image.is-64x64, .is-64x64 img, img.is-64x64 {
width: 64px;
height: 64px;
}
.image.is-96x96, .is-96x96 img, img.is-96x96 {
width: 96px;
height: 96px;
}
.is-max-128 {
max-height: 128px;
max-width: 128px;
}
.is-max-256 {
max-height: 256px;
max-width: 256px;
}
.media {
padding: 1ex;
margin: 4px;
overflow: auto;
}
.media.active-context {
background-color: #DDD;
}
.field
{
margin-top: 1em;
}
label
{
font-weight: bold;
}
.control, .select
{
margin-top: 0.5ex;
margin-bottom: 0.5ex;
}
.account-avatar
{
display: inline-block;
}
.reblog-icon
{
margin-top: 32px;
display: inline-block;
}
.media-content
{
margin-top: 1ex;
}
.media-content > div > p
{
margin-bottom: 1ex;
}
.textarea
{
max-width: 100%;
}
.errorlist
{
color: #FF0000;
}
img.emoji
{
display: inline;
max-height: 1.5rem;
max-width: 1.5rem;
vertical-align: text-bottom;
}
hr.is-hidden
{
display: none;
}
.box
{
border-radius: 3px;
border: 1px solid #000;
padding: 1em;
margin-bottom: 1em;
background-color: white;
color: black;
}
.modal {
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
display: none;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
overflow: hidden;
position: fixed;
z-index: 40;
}
.modal-background {
position: absolute;
background-color: rgba(10,10,10,.86);
}
.modal, .modal-background {
bottom: 0;
left: 0;
right: 0;
top: 0;
}
.modal-content
{
height: 90vh;
overflow: auto;
z-index: 60;
}
.modal.is-active {
display: flex;
}
.navbar-item span {
padding-right: 1ex;
}
.card
{
padding: 1em;
margin-top: 1em;
border: 0.2em solid black;
}
.card-header
{
padding-bottom: 1em;
border-bottom: 0.2em solid black;
}
.card-image
{
padding: 1em;
margin 0, auto;
}
.button
{
border: 0.2em solid #444;
display: inline;
padding: 0.4em;
}

View File

@ -0,0 +1,704 @@
/* Global variables. */
:root,
::backdrop {
/* Set sans-serif & mono fonts */
--sans-font: -apple-system, BlinkMacSystemFont, "Avenir Next", Avenir,
"Nimbus Sans L", Roboto, "Noto Sans", "Segoe UI", Arial, Helvetica,
"Helvetica Neue", sans-serif;
--mono-font: Consolas, Menlo, Monaco, "Andale Mono", "Ubuntu Mono", monospace;
--standard-border-radius: 5px;
/* Default (light) theme */
--bg: #fff;
--accent-bg: #f5f7ff;
--text: #212121;
--text-light: #585858;
--border: #898EA4;
--accent: #0d47a1;
--accent-hover: #1266e2;
--accent-text: var(--bg);
--code: #d81b60;
--preformatted: #444;
--marked: #ffdd33;
--disabled: #efefef;
}
/* Dark theme */
@media (prefers-color-scheme: dark) {
:root,
::backdrop {
color-scheme: dark;
--bg: #212121;
--accent-bg: #2b2b2b;
--text: #dcdcdc;
--text-light: #ababab;
--accent: #ffb300;
--accent-hover: #ffe099;
--accent-text: var(--bg);
--code: #f06292;
--preformatted: #ccc;
--disabled: #111;
}
/* Add a bit of transparency so light media isn't so glaring in dark mode */
img,
video {
opacity: 0.8;
}
}
/* Reset box-sizing */
*, *::before, *::after {
box-sizing: border-box;
}
/* Reset default appearance */
textarea,
select,
input,
progress {
appearance: none;
-webkit-appearance: none;
-moz-appearance: none;
}
html {
/* Set the font globally */
font-family: var(--sans-font);
scroll-behavior: smooth;
}
/* Make the body a nice central block */
body {
color: var(--text);
background-color: var(--bg);
font-size: 1.15rem;
line-height: 1.5;
display: grid;
grid-template-columns: 1fr min(45rem, 90%) 1fr;
margin: 0;
}
body > * {
grid-column: 2;
}
/* Make the header bg full width, but the content inline with body */
body > header {
background-color: var(--accent-bg);
border-bottom: 1px solid var(--border);
text-align: center;
padding: 0 0.5rem 2rem 0.5rem;
grid-column: 1 / -1;
}
body > header > *:only-child {
margin-block-start: 2rem;
}
body > header h1 {
max-width: 1200px;
margin: 1rem auto;
}
body > header p {
max-width: 40rem;
margin: 1rem auto;
}
/* Add a little padding to ensure spacing is correct between content and header > nav */
main {
padding-top: 1.5rem;
}
body > footer {
margin-top: 4rem;
padding: 2rem 1rem 1.5rem 1rem;
color: var(--text-light);
font-size: 0.9rem;
text-align: center;
border-top: 1px solid var(--border);
}
/* Format headers */
h1 {
font-size: 3rem;
}
h2 {
font-size: 2.6rem;
margin-top: 3rem;
}
h3 {
font-size: 2rem;
margin-top: 3rem;
}
h4 {
font-size: 1.44rem;
}
h5 {
font-size: 1.15rem;
}
h6 {
font-size: 0.96rem;
}
p {
margin: 1.5rem 0;
}
/* Prevent long strings from overflowing container */
p, h1, h2, h3, h4, h5, h6 {
overflow-wrap: break-word;
}
/* Fix line height when title wraps */
h1,
h2,
h3 {
line-height: 1.1;
}
/* Reduce header size on mobile */
@media only screen and (max-width: 720px) {
h1 {
font-size: 2.5rem;
}
h2 {
font-size: 2.1rem;
}
h3 {
font-size: 1.75rem;
}
h4 {
font-size: 1.25rem;
}
}
/* Format links & buttons */
a,
a:visited {
color: var(--accent);
}
a:hover {
text-decoration: none;
}
button,
.button,
a.button, /* extra specificity to override a */
input[type="submit"],
input[type="reset"],
input[type="button"],
label[type="button"] {
border: 1px solid var(--accent);
background-color: var(--accent);
color: var(--accent-text);
padding: 0.5rem 0.9rem;
text-decoration: none;
line-height: normal;
}
.button[aria-disabled="true"],
input:disabled,
textarea:disabled,
select:disabled,
button[disabled] {
cursor: not-allowed;
background-color: var(--disabled);
border-color: var(--disabled);
color: var(--text-light);
}
input[type="range"] {
padding: 0;
}
/* Set the cursor to '?' on an abbreviation and style the abbreviation to show that there is more information underneath */
abbr[title] {
cursor: help;
text-decoration-line: underline;
text-decoration-style: dotted;
}
button:enabled:hover,
.button:not([aria-disabled="true"]):hover,
input[type="submit"]:enabled:hover,
input[type="reset"]:enabled:hover,
input[type="button"]:enabled:hover,
label[type="button"]:hover {
background-color: var(--accent-hover);
border-color: var(--accent-hover);
cursor: pointer;
}
.button:focus-visible,
button:focus-visible:where(:enabled),
input:enabled:focus-visible:where(
[type="submit"],
[type="reset"],
[type="button"]
) {
outline: 2px solid var(--accent);
outline-offset: 1px;
}
/* Format navigation */
header > nav {
font-size: 1rem;
line-height: 2;
padding: 1rem 0 0 0;
}
/* Use flexbox to allow items to wrap, as needed */
header > nav ul,
header > nav ol {
align-content: space-around;
align-items: center;
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: center;
list-style-type: none;
margin: 0;
padding: 0;
}
/* List items are inline elements, make them behave more like blocks */
header > nav ul li,
header > nav ol li {
display: inline-block;
}
header > nav a,
header > nav a:visited {
margin: 0 0.5rem 1rem 0.5rem;
border: 1px solid var(--border);
border-radius: var(--standard-border-radius);
color: var(--text);
display: inline-block;
padding: 0.1rem 1rem;
text-decoration: none;
}
header > nav a:hover,
header > nav a.current,
header > nav a[aria-current="page"] {
border-color: var(--accent);
color: var(--accent);
cursor: pointer;
}
/* Reduce nav side on mobile */
@media only screen and (max-width: 720px) {
header > nav a {
border: none;
padding: 0;
text-decoration: underline;
line-height: 1;
}
}
/* Consolidate box styling */
aside, details, pre, progress {
background-color: var(--accent-bg);
border: 1px solid var(--border);
border-radius: var(--standard-border-radius);
margin-bottom: 1rem;
}
aside {
font-size: 1rem;
width: 30%;
padding: 0 15px;
margin-inline-start: 15px;
float: right;
}
*[dir="rtl"] aside {
float: left;
}
/* Make aside full-width on mobile */
@media only screen and (max-width: 720px) {
aside {
width: 100%;
float: none;
margin-inline-start: 0;
}
}
article, fieldset, dialog {
border: 1px solid var(--border);
padding: 1rem;
border-radius: var(--standard-border-radius);
margin-bottom: 1rem;
}
article h2:first-child,
section h2:first-child {
margin-top: 1rem;
}
section {
border-top: 1px solid var(--border);
border-bottom: 1px solid var(--border);
padding: 2rem 1rem;
margin: 3rem 0;
}
/* Don't double separators when chaining sections */
section + section,
section:first-child {
border-top: 0;
padding-top: 0;
}
section:last-child {
border-bottom: 0;
padding-bottom: 0;
}
details {
padding: 0.7rem 1rem;
}
summary {
cursor: pointer;
font-weight: bold;
padding: 0.7rem 1rem;
margin: -0.7rem -1rem;
word-break: break-all;
}
details[open] > summary + * {
margin-top: 0;
}
details[open] > summary {
margin-bottom: 0.5rem;
}
details[open] > :last-child {
margin-bottom: 0;
}
/* Format tables */
table {
border-collapse: collapse;
margin: 1.5rem 0;
}
figure > table {
width: max-content;
}
td,
th {
border: 1px solid var(--border);
text-align: start;
padding: 0.5rem;
}
th {
background-color: var(--accent-bg);
font-weight: bold;
}
tr:nth-child(even) {
/* Set every other cell slightly darker. Improves readability. */
background-color: var(--accent-bg);
}
table caption {
font-weight: bold;
margin-bottom: 0.5rem;
}
/* Format forms */
textarea,
select,
input,
button,
.button {
font-size: inherit;
font-family: inherit;
padding: 0.5rem;
margin-bottom: 0.5rem;
border-radius: var(--standard-border-radius);
box-shadow: none;
max-width: 100%;
display: inline-block;
}
textarea,
select,
input {
color: var(--text);
background-color: var(--bg);
border: 1px solid var(--border);
}
label {
display: block;
}
textarea:not([cols]) {
width: 100%;
}
/* Add arrow to drop-down */
select:not([multiple]) {
background-image: linear-gradient(45deg, transparent 49%, var(--text) 51%),
linear-gradient(135deg, var(--text) 51%, transparent 49%);
background-position: calc(100% - 15px), calc(100% - 10px);
background-size: 5px 5px, 5px 5px;
background-repeat: no-repeat;
padding-inline-end: 25px;
}
*[dir="rtl"] select:not([multiple]) {
background-position: 10px, 15px;
}
/* checkbox and radio button style */
input[type="checkbox"],
input[type="radio"] {
vertical-align: middle;
position: relative;
width: min-content;
}
input[type="checkbox"] + label,
input[type="radio"] + label {
display: inline-block;
}
input[type="radio"] {
border-radius: 100%;
}
input[type="checkbox"]:checked,
input[type="radio"]:checked {
background-color: var(--accent);
}
input[type="checkbox"]:checked::after {
/* Creates a rectangle with colored right and bottom borders which is rotated to look like a check mark */
content: " ";
width: 0.18em;
height: 0.32em;
border-radius: 0;
position: absolute;
top: 0.05em;
left: 0.17em;
background-color: transparent;
border-right: solid var(--bg) 0.08em;
border-bottom: solid var(--bg) 0.08em;
font-size: 1.8em;
transform: rotate(45deg);
}
input[type="radio"]:checked::after {
/* creates a colored circle for the checked radio button */
content: " ";
width: 0.25em;
height: 0.25em;
border-radius: 100%;
position: absolute;
top: 0.125em;
background-color: var(--bg);
left: 0.125em;
font-size: 32px;
}
/* Makes input fields wider on smaller screens */
@media only screen and (max-width: 720px) {
textarea,
select,
input {
width: 100%;
}
}
/* Set a height for color input */
input[type="color"] {
height: 2.5rem;
padding: 0.2rem;
}
/* do not show border around file selector button */
input[type="file"] {
border: 0;
}
/* Misc body elements */
hr {
border: none;
height: 1px;
background: var(--border);
margin: 1rem auto;
}
mark {
padding: 2px 5px;
border-radius: var(--standard-border-radius);
background-color: var(--marked);
color: black;
}
mark a {
color: #0d47a1;
}
img,
video {
max-width: 100%;
height: auto;
border-radius: var(--standard-border-radius);
}
figure {
margin: 0;
display: block;
overflow-x: auto;
}
figure > img,
figure > picture > img {
display: block;
margin-inline: auto;
}
figcaption {
text-align: center;
font-size: 0.9rem;
color: var(--text-light);
margin-block: 1rem;
}
blockquote {
margin-inline-start: 2rem;
margin-inline-end: 0;
margin-block: 2rem;
padding: 0.4rem 0.8rem;
border-inline-start: 0.35rem solid var(--accent);
color: var(--text-light);
font-style: italic;
}
cite {
font-size: 0.9rem;
color: var(--text-light);
font-style: normal;
}
dt {
color: var(--text-light);
}
/* Use mono font for code elements */
code,
pre,
pre span,
kbd,
samp {
font-family: var(--mono-font);
color: var(--code);
}
kbd {
color: var(--preformatted);
border: 1px solid var(--preformatted);
border-bottom: 3px solid var(--preformatted);
border-radius: var(--standard-border-radius);
padding: 0.1rem 0.4rem;
}
pre {
padding: 1rem 1.4rem;
max-width: 100%;
overflow: auto;
color: var(--preformatted);
}
/* Fix embedded code within pre */
pre code {
color: var(--preformatted);
background: none;
margin: 0;
padding: 0;
}
/* Progress bars */
/* Declarations are repeated because you */
/* cannot combine vendor-specific selectors */
progress {
width: 100%;
}
progress:indeterminate {
background-color: var(--accent-bg);
}
progress::-webkit-progress-bar {
border-radius: var(--standard-border-radius);
background-color: var(--accent-bg);
}
progress::-webkit-progress-value {
border-radius: var(--standard-border-radius);
background-color: var(--accent);
}
progress::-moz-progress-bar {
border-radius: var(--standard-border-radius);
background-color: var(--accent);
transition-property: width;
transition-duration: 0.3s;
}
progress:indeterminate::-moz-progress-bar {
background-color: var(--accent-bg);
}
dialog {
max-width: 40rem;
margin: auto;
}
dialog::backdrop {
background-color: var(--bg);
opacity: 0.8;
}
@media only screen and (max-width: 720px) {
dialog {
max-width: 100%;
margin: auto 1em;
}
}
/* Superscript & Subscript */
/* Prevent scripts from affecting line-height. */
sup, sub {
vertical-align: baseline;
position: relative;
}
sup {
top: -0.4em;
}
sub {
top: 0.3em;
}
/* Classes for notices */
.notice {
background: var(--accent-bg);
border: 2px solid var(--border);
border-radius: var(--standard-border-radius);
padding: 1.5rem;
margin: 2rem 0;
}

View File

@ -1,232 +0,0 @@
html, a, div, div.notification, body, body div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, abbr, address, cite, code, del, dfn, em, img, ins, kbd, q, samp, small, strong, sub, sup, var, b, i, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, figure, footer, header, menu, nav, section, time, mark, audio, video, details, summary, h1.title, h2.subtitle {
font-family: "DEC Terminal Modern", Terminus, Inconsolata, Consolas, "Droid Sans Mono", "DejaVu Sans Mono", "Monaco", monospace;
color: #ff7700;
background-color: #000000;
font-size: 1.2rem;
}
tr, td, ul, ol {
border-color: #ff7700;
outline: 1px solid #ff7700;
padding-top: 5px;
padding-bottom: 5px;
margin-top: 5px;
margin-bottom: 10px;
}
a, a.button, a.button.is-primary, input.button.is-primary, input, .input, .textarea, .footer, .label, select, textarea {
color: #ff8800;
border-color: #ff8800;
background-color: #000000;
font-weight: bolder;
text-decoration-line: none;
}
a:hover, a.button:hover, a.button.is-primary:hover, input.button.is-primary:hover {
color: #000000;
background-color: #ff8800;
}
.media-content a:not(.mention):not(.tag)
{
text-decoration-line: underline;
text-decoration-style: solid;
text-decoration:color: #ff7700;
}
.control input[type=text], .control textarea
{
width: 100%;
max-width: 80em;
border: 1px solid #ff7700;
margin-bottom: 1ex;
}
.control input, .control select
{
border: 1px solid #ff7700;
background-color: #000000;
margin-bottom: 1ex;
}
img {
filter: grayscale(100%);
-webkit-filter: grayscale(100%);
}
div.card-header-title, div.card-header-icon {
color: #ff7700;
}
.container {
margin: 0 auto;
max-width: 80ex;
}
.box {
padding: 1em;
border-color: #ff7700;
outline: 1px solid #ff7700;
background-color: #000;
margin-bottom: 1em;
}
hr.is-hidden {
display: none;
}
.image.is-32x32, .is-32x32 img, img.is-32x32 {
width: 32px;
height: 32px;
}
.image.is-48x48, .is-48x48 img, img.is-48x48 {
width: 48px;
height: 48px;
}
.image.is-64x64, .is-64x64 img, img.is-64x64 {
width: 64px;
height: 64px;
}
.image.is-96x96, .is-96x96 img, img.is-96x96 {
width: 96px;
height: 96px;
}
.is-max-128 {
max-height: 128px;
max-width: 128px;
}
.is-max-256 {
max-height: 256px;
max-width: 256px;
}
.media {
background-color: black;
border-radius: 5px;
/*-webkit-box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1);
box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1);*/
color: #4a4a00;
padding: 1.25rem;
margin-bottom: 0.75rem;
margin-top: 0.75rem;
}
.is-max-128 {
max-height: 128px;
max-width: 128px;
}
.is-max-256 {
max-height: 256px;
max-width: 256px;
}
figure.media-left p.image a img
{
border-radius: 5px;
}
.active-context {
background-color: #000000;
border-color: #ffcc00;
outline: 1px solid #ffcc00;
}
.account-avatar
{
display: inline-block;
}
.reblog-icon
{
margin-top: 32px;
display: inline-block;
}
img.fav-avatar {
display: inline;
}
.level {
display: block;
margin-bottom: 1ex;
margin-top: 1ex;
}
img.emoji
{
display: inline;
max-height: 1.5em;
max-width: 1.5em;
vertical-align: text-bottom;
}
.modal {
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
display: none;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
overflow: hidden;
position: fixed;
z-index: 40;
}
.modal-background {
position: absolute;
background-color: rgba(10,10,10,.86);
}
.modal, .modal-background {
bottom: 0;
left: 0;
right: 0;
top: 0;
}
.modal-content
{
z-index: 60;
max-height: 90vh;
overflow: auto;
}
.modal.is-active {
display: flex;
}
.navbar-item {
margin-right: 2em;
}
@media screen and (max-width: 768px) {
.media {
display: block;
}
}
@media screen and (min-width: 1024px) {
.navbar,
.navbar-menu,
.navbar-start,
.navbar-end {
align-items: stretch;
display: flex;
}
.navbar-start {
justify-content: flex-start;
margin-right: auto;
}
.navbar-end {
justify-content: flex-end;
margin-left: auto;
}
}

View File

@ -1,237 +0,0 @@
html, body, a, div, div.notification, body, body div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, abbr, address, cite, code, del, dfn, em, img, ins, kbd, q, samp, small, strong, sub, sup, var, b, i, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, figure, footer, header, menu, nav, section, time, mark, audio, video, details, summary, h1.title, h2.subtitle {
font-family: "DEC Terminal Modern", Terminus, Inconsolata, Consolas, "Droid Sans Mono", "DejaVu Sans Mono", "Monaco", monospace;
color: #00ff77;
background-color: #000;
font-size: 1.2rem;
}
tr, td, ul, ol {
border-color: #00ff77;
outline: 1px solid #00ff77;
padding-top: 5px;
padding-bottom: 5px;
margin-top: 5px;
margin-bottom: 10px;
background-color: #000000;
}
a, a.button, a.button.is-primary, input.button.is-primary, input, .input, .textarea, .footer, .label, select, textarea {
color: #00ff88;
border-color: #00ff88;
background-color: #000000;
font-weight: bolder;
text-decoration-line: none;
font-size: 1.2rem;
}
a:hover, a.button:hover, a.button.is-primary:hover, input.button.is-primary:hover {
color: #000000;
background-color: #00ff88;
}
.media-content a:not(.mention):not(.tag)
{
text-decoration-line: underline;
text-decoration-style: solid;
text-decoration:color: #00ff77;
}
.control input[type=text], .control textarea
{
width: 100%;
max-width: 80ex;
border: 1px solid #00ff77;
background-color: #000000;
margin-bottom: 1ex;
}
.control input, .control select
{
border: 1px solid #00ff77;
background-color: #000000;
margin-bottom: 1ex;
}
img {
filter: grayscale(100%);
-webkit-filter: grayscale(100%);
}
div.card-header-title, div.card-header-icon {
color: #00ff77;
}
.container {
margin: 0 auto;
max-width: 80ex;
color: #00ff88;
background-color: #000000;
}
.box {
padding: 1em;
border-color: #00ff77;
outline: 1px solid #00ff77;
background-color: #000;
margin-bottom: 1em;
}
hr.is-hidden {
display: none;
}
.image.is-32x32, .is-32x32 img, img.is-32x32 {
width: 32px;
height: 32px;
}
.image.is-48x48, .is-48x48 img, img.is-48x48 {
width: 48px;
height: 48px;
}
.image.is-64x64, .is-64x64 img, img.is-64x64 {
width: 64px;
height: 64px;
}
.image.is-96x96, .is-96x96 img, img.is-96x96 {
width: 96px;
height: 96px;
}
.is-max-128 {
max-height: 128px;
max-width: 128px;
}
.is-max-256 {
max-height: 256px;
max-width: 256px;
}
.media {
background-color: black;
border-radius: 5px;
/*-webkit-box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1);
box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1);*/
color: #4a4a00;
padding: 1.25rem;
margin-bottom: 0.75rem;
margin-top: 0.75rem;
}
.is-max-128 {
max-height: 128px;
max-width: 128px;
}
.is-max-256 {
max-height: 256px;
max-width: 256px;
}
figure.media-left p.image a img
{
border-radius: 5px;
}
.active-context {
background-color: #000000;
border-color: #00ff88;
outline: 1px solid #00ff88;
}
.account-avatar
{
display: inline-block;
}
.reblog-icon
{
margin-top: 32px;
display: inline-block;
}
img.fav-avatar {
display: inline;
}
.level {
display: block;
margin-bottom: 1ex;
margin-top: 1ex;
}
img.emoji
{
display: inline;
max-height: 1.5em;
max-width: 1.5em;
vertical-align: text-bottom;
}
.modal {
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
display: none;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
overflow: hidden;
position: fixed;
z-index: 40;
}
.modal-background {
position: absolute;
background-color: rgba(10,10,10,.86);
}
.modal, .modal-background {
bottom: 0;
left: 0;
right: 0;
top: 0;
}
.modal-content
{
z-index: 60;
max-height: 90vh;
overflow: auto;
}
.modal.is-active {
display: flex;
}
.navbar-item {
margin-right: 2em;
}
@media screen and (max-width: 768px) {
.media {
display: block;
}
}
@media screen and (min-width: 1024px) {
.navbar,
.navbar-menu,
.navbar-start,
.navbar-end {
align-items: stretch;
display: flex;
}
.navbar-start {
justify-content: flex-start;
margin-right: auto;
}
.navbar-end {
justify-content: flex-end;
margin-left: auto;
}
}

View File

@ -7,15 +7,17 @@
<img src="{% static "/images/brutaldon.png" %}"
</div>
<h1 class="title">Brutaldon</h1>
<h2 class="subtitle">a brutalist web interface for Mastodon</h2>
<section class="section">
<h1>Brutaldon</h1>
<p>a brutalist web interface for Mastodon</p>
<section>
<p>
Brutaldon is a client for <a href="https://joinmastodon.org/">Mastodon</a>. You can use it to log in to any Mastodon instance from any browser, including text browsers such as lynx.
Brutaldon is a client for <a href="https://joinmastodon.org/">Mastodon</a>.
You can use it to log in to any Mastodon instance from any browser,
including text browsers such as lynx.
</p>
<p>
You do not need a separate brutaldon account to use it. Brutaldon will authenticate you to your instance.
You do not need a separate brutaldon account to use it.
Brutaldon will authenticate you to your instance.
</p>
</section>

View File

@ -1,18 +1,18 @@
<article class="media box">
<figure class="media-left">
<p class="image is-64x64">
<article >
<figure >
<p >
<img src="{{ account.user.avatar_static }}"
alt="{{ account.user.acct }}">
</p>
</figure>
<div class="media-content">
<div >
<strong>{{ account.user.display_name }}</strong> ({{ account.user.username }})
</div>
<div class="media-right">
<div >
<form method="POST" action="{% url "accounts" account.account_id %}">
{% csrf_token %}
<button class="button" name="activate" value="1">Activate</button>
<button class="button" name="forget" value="1">Forget</button>
<button name="activate" value="1">Activate</button>
<button name="forget" value="1">Forget</button>
</form>
</div>
</article>

View File

@ -2,8 +2,8 @@
{% load widget_tweaks %}
{% block content %}
<div class="container">
<h1 class="title">Signed-in accounts</h1>
<div >
<h1 >Signed-in accounts</h1>
{% if not accounts %}
<p>No accounts.</p>

View File

@ -15,15 +15,24 @@
{% endif %}
{% endblock %}</title>
<link rel="manifest" href="{% static 'manifest.webmanifest' %}">
{% if own_acct %}
<link rel="icon" href="{{ own_acct.avatar_static }}">
{% else %}
<link rel="icon" href="{% static "images/brutaldon.png" %}" type="image/png">
{% endif %}
<meta name="twitter:card" content="summary">
<meta property="og:type" content="website">
<meta name="twitter:url" property="og:url" content="{% url "about" %}">
<meta name="twitter:title" property="og:title" content="Brutaldon">
<meta name="twitter:image" property="og:image"
content="{% static "images/brutaldon.png" %}">
<meta name="twitter:description" property="og:description"
content="A brutalist, web-1.0 web client for Mastodon and Pleroma. Supports text-only browsers like Lynx, older browsers, as well as the latest mainstream browsers. All JavaScript is completely optional and progressively enhances the core application.">
<!-- Minified version -->
<link rel="stylesheet" href="https://cdn.simplecss.org/simple.min.css">
<link rel="stylesheet" href="{% static 'css/brutal-css.css' %}">
{% if not preferences %}
<link rel="stylesheet"
href="{% static 'css/bulma.min.css' %}">
<link rel="stylesheet"
href="{% static 'css/fork-awesome.min.css' %}">
<link rel="stylesheet"
href="{% static 'css/bulma-badge.min.css' %}">
<link rel="stylesheet"
href="{% static 'css/bulma-tooltip.min.css' %}">
<link rel="stylesheet"
href="{% static 'css/magnific-popup.css' %}">
<link rel="stylesheet" href="{% static "css/brutaldon.css" %}">
@ -33,14 +42,6 @@
<link rel="stylesheet" href="{% static preferences.theme.tweaks_css %}">
<link rel="stylesheet"
href="{% static 'css/magnific-popup.css' %}">
{% if not preferences.theme.is_brutalist %}
<link rel="stylesheet"
href="{% static 'css/fork-awesome.min.css' %}">
<link rel="stylesheet"
href="{% static 'css/bulma-badge.min.css' %}">
<link rel="stylesheet"
href="{% static 'css/bulma-tooltip.min.css' %}">
{% endif %}
{% if not preferences.no_javascript %}
<script type="text/javascript" src="{% static 'js/jquery.min.js' %}"></script>
<script type="text/javascript" src="{% static 'js/intercooler.js' %}"></script>
@ -52,54 +53,31 @@
{% endblock %}
{% endif %}
{% endif %}
{% if own_acct %}
<link rel="icon" href="{{ own_acct.avatar_static }}">
{% else %}
<link rel="icon" href="{% static "images/brutaldon.png" %}" type="image/png">
{% endif %}
<meta name="twitter:card" content="summary">
<meta property="og:type" content="website">
<meta name="twitter:site" content="@jfmcbrayer">
<meta name="twitter:url" property="og:url" content="{% url "about" %}">
<meta name="twitter:title" property="og:title" content="Brutaldon">
<meta name="twitter:image" property="og:image"
content="{% static "images/brutaldon.png" %}">
<meta name="twitter:description" property="og:description"
content="A brutalist, web-1.0 web client for Mastodon and Pleroma. Supports text-only browsers like Lynx, older browsers, as well as the latest mainstream browsers. All JavaScript is completely optional and progressively enhances the core application.">
</head>
<body ic-global-include='{"csrfmiddlewaretoken": "{{ csrf_token }}"}'>
<div id="page-load-indicator"></div>
<div id="new-toot-modal" class="modal"></div>
{% block navbar %}
<nav class="navbar is-primary" role="navigation"
aria-label="main navigation" id="main-nav-bar">
<div class="navbar-brand">
<a class="navbar-item" href="{% url "home" %}">
<nav role="navigation"
aria-label="main navigation">
<span>
<a href="{% url "home" %}">
{% if own_acct %}
<img src="{{ own_acct.avatar_static }}"
class="image is-32x32 avatar"
<img class="avatar" src="{{ own_acct.avatar_static }}"
alt="Brutaldon ('{{ own_acct.username }}')">
{% else %}
<img loading="lazy" src="{% static "images/brutaldon.png" %}"
class="image is-32x32" alt="Brutaldon">
<img class="avatar" loading="lazy" src="{% static "images/brutaldon.png" %}"
alt="Brutaldon">
{% endif %}
</a>
</div>
</span>
{% if request.session.active_instance and request.session.active_username %}
<div class="navbar-menu is-active" id="navMenu">
<!-- navbar start, navbar end -->
<div class="navbar-start">
<a href="{% url "home" %}" class="navbar-item">
<span class="fa fa-home"></span>
<span>
<a href="{% url "home" %}">
<span>Home</span>
</a>
<a class="navbar-item" href="{% url "note" %}">
<span class="fa fa-bell"></span>
<a href="{% url "note" %}">
{% if preferences.notifications and not preferences.theme.is_brutalist %}
<span ic-src="{% url 'notes_count' %}"
ic-poll="{{ preferences.poll_frequency }}s"
@ -113,46 +91,30 @@
Notifications</span>
</span>
{% elif notifications and preferences.notifications %}
<span ic-src="{% url 'notes_count' %}"
ic-poll="{{ preferences.poll_frequency }}s"
ic-target="this"
ic-select-from-response="#notes-count">
<span
<span >Notifications ({{ notifications }})</span>
</span>
{% else %}
<span >Notifications</span>
{% endif %}
</a>
<a class="navbar-item" href="{% url "local" %}">
<span class="fa fa-community"></span>
<a href="{% url "local" %}">
<span >Local</span>
</a>
<a class="navbar-item" href="{% url "fed" %}">
<span class="fa fa-globe"></span>
<a href="{% url "fed" %}">
<span >Federated</span>
</a>
<a class="navbar-item" href="{% url "toot" %}"
ic-get-from="{% url "toot" %}"
ic-target="#new-toot-modal"
ic-on-complete="$('#new-toot-modal').toggleClass('is-active');">
<span class="fa fa-edit"> </span>
<a href="{% url "toot" %}"
<span >New Toot</span>
</a>
<a class="navbar-item" href="{% url "search" %}"
ic-get-from="{% url "search" %}"
ic-target="#new-toot-modal"
ic-on-complete="$('#new-toot-modal').toggleClass('is-active');">
<span class="fa fa-search"> </span>
<a href="{% url "search" %}"
<span >Search</span>
</a>
</div>
<div class="navbar-end" >
<a class="navbar-item" href="{% url "settings" %}">
<span class="fa fa-gear"></span>
</span>
<a href="{% url "settings" %}">
<span >Settings</span>
</a>
<a class="navbar-item" href="{% url "accounts" %}">
<span class="fa fa-id-card-o"> </span>
<a href="{% url "accounts" %}">
<span >Accounts</span>
</a>
</div>
@ -161,7 +123,7 @@
</nav>
{% endblock %}
<main id="main" class="section">
<main>
<div class="container">
{% block content %}
<h1 class="title">
@ -174,18 +136,18 @@
</div>
</main>
<footer class="footer">
<div class="level">
<div class="level-left">
<a class="level-item is-size-7" href="{% url "about" %}">
<footer>
<div>
<div>
<a href="{% url "about" %}">
About
</a>
<a class="level-item is-size-7" href="https://gitlab.com/brutaldon/brutaldon">
<a href="https://gitlab.com/brutaldon/brutaldon">
Source
</a>
<span class="level-item is-size-7" >Bookmarklet: <a href="{{ bookmarklet_url }}">Share via brutaldon</a></span>
<span>Bookmarklet: <a href="{{ bookmarklet_url }}">Share via brutaldon</a></span>
</div>
<div class="level-right">
<div>
{% if preferences.theme.is_brutalist %}
<noscript class="loading-lazy">
<img loading="lazy" class="level-item" src="{% static '/images/lynx.gif' %}"
@ -194,13 +156,12 @@
alt="Netscape Now!">
</noscript>
{% endif %}
<a class="level-item is-size-7" href="{% url "privacy" %}">
<a href="{% url "privacy" %}">
Privacy
</a>
</div>
</div>
</footer>
{% if not preferences.no_javascript %}
<script type="application/javascript">

View File

@ -3,8 +3,8 @@
{% block content %}
<div class="container">
<h1 class="title">Create Filter</h1>
<div >
<h1 >Create Filter</h1>
<form method="post" id="create-filter-form" action="{% url "create_filter" %}">
{% csrf_token %}
@ -13,62 +13,62 @@
{{ form.non_field_errors }}
</div>
<div class="field">
<label class="label"> {{ form.phrase.label }}</label>
<div class="control">
<div >
<label > {{ form.phrase.label }}</label>
<div >
{% render_field form.phrase class+="input" %}
</div>
</div>
<div class="columns">
<div class="column field">
<label class="label checkbox">
<div >
<div >
<label >
{{ form.context_home.label }}
{% render_field form.context_home %}
</label>
</div>
<div class="column field">
<label class="label checkbox">
<div >
<label >
{{ form.context_public.label }}
{% render_field form.context_public %}
</label>
</div>
<div class="column field">
<label class="label checkbox">
<div >
<label >
{{ form.context_notes.label }}
{% render_field form.context_notes %}
</label>
</div>
<div class="column field">
<label class="label checkbox">
<div >
<label >
{{ form.context_thread.label }}
{% render_field form.context_thread %}
</label>
</div>
</div>
<div class="field">
<label class="label checkbox">
<div >
<label >
{{ form.whole_word.label }}
{% render_field form.whole_word %}
</label>
</div>
<div class="field">
<label class="label" for="expires_in">{{ form.expires_in.label }}</label>
<div class="control has-icons-left">
<div class="select">
<div >
<label for="expires_in">{{ form.expires_in.label }}</label>
<div >
<div >
{% render_field form.expires_in class+="select" %}
<span class="icon is-small is-left">
<span class="fa fa-clock-o"></span>
<span >
<span ></span>
</span>
</div>
</div>
</div>
<div class="field">
<div >
<input type="submit" name="submit" value="Save"
class="button is-primary">
>
</div>
</form>

View File

@ -2,26 +2,26 @@
{% load widget_tweaks %}
{% block content %}
<h1 class="title">Delete that filter?</h1>
<h1 >Delete that filter?</h1>
<div class="container">
<p class="label">Phrase: {{ filter.phrase }}</p>
<p class="label">Context: {{ filter.context|join:", " }}</p>
<p class="label">Whole word? {{ filter.whole_word }}</p>
<div >
<p >Phrase: {{ filter.phrase }}</p>
<p >Context: {{ filter.context|join:", " }}</p>
<p >Whole word? {{ filter.whole_word }}</p>
</div>
<div class="container">
<div >
<form method="POST" action="{% url "delete_filter" filter.id %}">
{% csrf_token %}
<div class="level is-mobile">
<div class="level-left">
<div class="level-item">
<input class="button" type="submit" name="cancel" value="Cancel">
<div >
<div >
<div >
<input type="submit" name="cancel" value="Cancel">
</div>
</div>
<div class="level-right">
<div class="level-item">
<input class="button is-primary" type="submit" name="delete"
<div >
<div >
<input type="submit" name="delete"
value="Delete">
</div>
</div>

View File

@ -3,8 +3,8 @@
{% block content %}
<div class="container">
<h1 class="title">Edit Filter</h1>
<div >
<h1 >Edit Filter</h1>
<form method="post" id="edit-filter-form"
action="{% url "edit_filter" filter.id %}">
@ -14,62 +14,62 @@
{{ form.non_field_errors }}
</div>
<div class="field">
<label class="label"> {{ form.phrase.label }}</label>
<div class="control">
<div >
<label > {{ form.phrase.label }}</label>
<div >
{% render_field form.phrase class+="input" %}
</div>
</div>
<div class="columns">
<div class="column field">
<label class="label checkbox">
<div >
<div >
<label >
{{ form.context_home.label }}
{% render_field form.context_home %}
</label>
</div>
<div class="column field">
<label class="label checkbox">
<div >
<label >
{{ form.context_public.label }}
{% render_field form.context_public %}
</label>
</div>
<div class="column field">
<label class="label checkbox">
<div >
<label >
{{ form.context_notes.label }}
{% render_field form.context_notes %}
</label>
</div>
<div class="column field">
<label class="label checkbox">
<div >
<label >
{{ form.context_thread.label }}
{% render_field form.context_thread %}
</label>
</div>
</div>
<div class="field">
<label class="label checkbox">
<div >
<label >
{{ form.whole_word.label }}
{% render_field form.whole_word %}
</label>
</div>
<div class="field">
<label class="label" for="expires_in">{{ form.expires_in.label }}</label>
<div class="control has-icons-left">
<div class="select">
<div >
<label for="expires_in">{{ form.expires_in.label }}</label>
<div >
<div >
{% render_field form.expires_in class+="select" %}
<span class="icon is-small is-left">
<span class="fa fa-clock-o"></span>
<span >
<span ></span>
</span>
</div>
</div>
</div>
<div class="field">
<div >
<input type="submit" name="submit" value="Save"
class="button is-primary">
>
</div>
</form>

View File

@ -2,17 +2,17 @@
{% load widget_tweaks %}
{% block content %}
<div class="container">
<h1 class="title">Filters</h1>
<div >
<h1 >Filters</h1>
<table class="table">
<table >
<thead>
<tr>
<th>Phrase</th>
<th>Filter contexts</th>
<th></th>
<th></th>
<th class="empty-cell"></th>
<th ></th>
</thead>
<tbody>
{% for filter in filters %}
@ -36,12 +36,11 @@
ic-confirm="Really delete that filter?"
ic-success-action="fadeOut;remove"
ic-action-target="#filter-{{ filter.id }}">
<span class="fa fa-times"></span>
<span ></span>
Delete filter
</td>
<td class="empty-cell">
<td >
<i id="filter-spinner-{{filter.id}}"
class="fa fa-spinner fa-spin"
style="display:none"></i>
</td>
</tr>
@ -50,7 +49,7 @@
</table>
<p>
<a class="button is-primary" href="{% url "create_filter" %}">
<a href="{% url "create_filter" %}">
Create filter
</a>
</div>

View File

@ -1,15 +1,15 @@
{% if not relationship.blocking %}
<a class="level-item fa fa-ban" title="block"
<a title="block"
href="{% url 'block' user.id %}"
ic-post-to="{% url 'block' user.id %}"
ic-indicator="#user-spinner" ic-replace-target="true">
<span class="is-hidden">Block</span>
<span >Block</span>
</a>
{% else %}
<a class="level-item fa fa-circle-o" title="unblock"
<a title="unblock"
href="{% url 'block' user.id %}"
ic-post-to="{% url 'block' user.id %}"
ic-indicator="#user-spinner" ic-replace-target="true">
<span class="is-hidden">Unblock</span>
<span >Unblock</span>
</a>
{% endif %}

View File

@ -1,10 +1,10 @@
{% if toot.visibility != 'private' and toot.visibility != 'direct' %}
{% if toot.reblogged %}
<span class="fa fa-retweet has-text-warning">
<strong class="is-hidden-mobile" >Boosted</strong>
<span >
<strong >Boosted</strong>
{% else %}
<span class="fa fa-retweet" >
<span class="is-hidden-mobile" >Boost</span>
<span >
<span >Boost</span>
{% endif %}
</span>
</span>

View File

@ -1,9 +1,9 @@
{% if toot.favourited %}
<span class="fa fa-heart has-text-warning">
<strong class="is-hidden-mobile" >Favorited</strong>
<span >
<strong >Favorited</strong>
{% else %}
<span class="fa fa-heart">
<span class="is-hidden-mobile" >Favorite</span>
<span >
<span >Favorite</span>
{% endif %}
</span>
</span>

View File

@ -1,22 +1,22 @@
{% if relationship.requested %}
<a class="level-item fa fa-hourglass" title="cancel request"
<a title="cancel request"
href="{% url 'follow' user.id %}"
ic-post-to="{% url 'follow' user.id %}"
ic-indicator="#user-spinner" ic-replace-target="true">
<span class="is-hidden">Cancel request</span>
<span >Cancel request</span>
</a>
{% elif not relationship.following %}
<a class="level-item fa fa-user-plus" title="follow"
<a title="follow"
href="{% url 'follow' user.id %}"
ic-post-to="{% url 'follow' user.id %}"
ic-indicator="#user-spinner" ic-replace-target="true">
<span class="is-hidden">Follow</span>
<span >Follow</span>
</a>
{% else %}
<a class="level-item fa fa-user-times" title="unfollow"
<a title="unfollow"
href="{% url 'follow' user.id %}"
ic-post-to="{% url 'follow' user.id %}"
ic-indicator="#user-spinner" ic-replace-target="true">
<span class="is-hidden">Unfollow</span>
<span >Unfollow</span>
</a>
{% endif %}

View File

@ -1,15 +1,15 @@
{% if not relationship.muting %}
<a class="level-item fa fa-volume-off" title="mute"
<a title="mute"
href="{% url 'mute' user.id %}"
ic-post-to="{% url 'mute' user.id %}"
ic-indicator="#user-spinner" ic-replace-target="true">
<span class="is-hidden">Mute</span>
</a>
{% else %}
<a class="level-item fa fa-volume-up" title="unmute"
<a title="unmute"
href="{% url 'mute' user.id %}"
ic-post-to="{% url 'mute' user.id %}"
ic-indicator="#user-spinner" ic-replace-target="true">
<span class="is-hidden">Unmute</span>
<span >Unmute</span>
</a>
{% endif %}

View File

@ -1,10 +1,10 @@
<div class="modal-background" ></div>
<div class="modal-content">
<div class="box">
<div ></div>
<div >
<div >
{% include "main/post_partial.html" %}
</div>
</div>
<button id="toot-modal-close" class="modal-close is-large" aria-label="close"></button>
<button aria-label="close"></button>
<script type="application/javascript">
$("#toot-modal-close").on("click", function () { $("#new-toot-modal").toggleClass("is-active"); });

View File

@ -1,10 +1,10 @@
<div class="modal-background" ></div>
<div class="modal-content">
<div ></div>
<div >
<div class="box">
<h1 class="title">Search</h1>
<div >
<h1 >Search</h1>
<div class="notification">
<div >
<div>
You can search for tags, users, or for specific toots by URL. You may
also be able to full-text search for toots you have previously
@ -12,23 +12,23 @@
</div>
</div>
<form method="get" action="{% url "search_results" %}">
<div class="field">
<label class="label">{{ form.instance.label }}</label>
<div class="control has-icons-left">
<div >
<label >{{ form.instance.label }}</label>
<div >
<input type="search" name="q" id="q" class="input">
<span class="icon is-small is-left">
<i class="fa fa-search"></i>
<span >
<i ></i>
</span>
</div>
</div>
<div class="field">
<input type="submit" value="Search" class="button is-primary" >
<div >
<input type="submit" value="Search" >
</div>
</form>
</div>
</div>
<button id="toot-modal-close" class="modal-close is-large" aria-label="close"></button>
<button aria-label="close"></button>
<script type="application/javascript">
$("#toot-modal-close").on("click", function () { $("#new-toot-modal").toggleClass("is-active"); });

View File

@ -1,2 +1,2 @@
<div class="tooltip is-tooltip-active is-tooltip-multiline is-tooltip-bottom"
<div
data-tooltip="{{ users }}"></div>

View File

@ -6,22 +6,22 @@
{% block content %}
{% if relationship.blocking %}
<h1 class="title">Unblock this user?</h1>
<h1>Unblock this user?</h1>
{% else %}
<h1 class="title">Block this user?</h1>
<h1>Block this user?</h1>
{% endif %}
<article class="media user-info">
<figure class="media-left">
<p class="image is-64x64">
<article>
<figure>
<p>
<a href="{% url "user" user.acct %}">
<img src="{{ user.avatar }}"
alt="">
</a>
</p>
</figure>
<div class="media-content">
<div class="content">
<div>
<div>
<p>
<strong>{{ user.display_name }}</strong>
<small>
@ -40,15 +40,15 @@
<form method="POST" action="{% url 'block' user.id %}">
{% csrf_token %}
<div class="level is-mobile">
<div class="level-left">
<div class="level-item">
<input class="button" type="submit" name="cancel" value="Cancel">
<div>
<div>
<div>
<input type="submit" name="cancel" value="Cancel">
</div>
</div>
<div class="level-right">
<div class="level-item">
<input class="button is-primary" type="submit" name="block"
<div>
<div>
<input type="submit" name="block"
value="Confirm">
</div>
</div>

View File

@ -4,27 +4,27 @@
{% block content %}
{% if toot.reblogged %}
<h1 class="title">Unboost that toot?</h1>
<h1>Unboost that toot?</h1>
{% else %}
<h1 class="title" >Boost that toot?</h1>
<h1>Boost that toot?</h1>
{% endif %}
{% include "main/toot_partial.html" with toot=toot %}
<form method="POST" action="{% url "boost" toot.id %}">
{% csrf_token %}
<div class="level is-mobile">
<div class="level-left">
<div class="level-item">
<input class="button" type="submit" name="cancel" value="Cancel">
<div>
<div>
<div>
<input type="submit" name="cancel" value="Cancel">
</div>
</div>
<div class="level-right">
<div class="level-item">
<div>
<div>
{% if toot.reblogged %}
<input class="button is-primary" type="submit" name="boost"
<input type="submit" name="boost"
value="Unboost">
{% else %}
<input class="button is-primary" type="submit" name="boost"
<input type="submit" name="boost"
value="Boost">
{% endif %}
</div>

View File

@ -3,20 +3,20 @@
{% block title %} Brutaldon - confirm delete {% endblock %}
{% block content %}
<h1 class="title">Delete that toot?</h1>
<h1>Delete that toot?</h1>
{% include "main/toot_partial.html" with toot=toot %}
<form method="POST" action="{% url "delete" toot.id %}">
{% csrf_token %}
<div class="level is-mobile">
<div class="level-left">
<div class="level-item">
<div>
<div>
<div>
<input class="button" type="submit" name="cancel" value="Cancel">
</div>
</div>
<div class="level-right">
<div class="level-item">
<input class="button is-primary" type="submit" name="delete"
<div>
<div>
<input type="submit" name="delete"
value="Delete">
</div>
</div>

View File

@ -4,20 +4,20 @@
{% block content %}
<section>
<h1 class="title">Custom emoji reference</h1>
<p class="subtitle">
<h1>Custom emoji reference</h1>
<p>
Copy shortcodes from the list below to use your instance's custom emoji.
</p>
</section>
<hr>
<section>
<div class="columns is-9 is-variable is-centered is-multiline">
<div>
{% for emojo in emojos %}
<div class="column is-one-fifth">
<p class="level emoji-box">
<img alt="" class="level-item emoji" src="{{ emojo.url }}">
<span class="level-item">:{{ emojo.shortcode }}:</span>
<div>
<p>
<img alt="" src="{{ emojo.url }}">
<span>:{{ emojo.shortcode }}:</span>
</p>
</div>
{% endfor %}

View File

@ -4,27 +4,27 @@
{% block content %}
{% if toot.favourited %}
<h1 class="title">Unfav that toot?</h1>
<h1>Unfav that toot?</h1>
{% else %}
<h1 class="title" >Fav that toot?</h1>
<h1 >Fav that toot?</h1>
{% endif %}
{% include "main/toot_partial.html" with toot=toot %}
<form method="POST" action="{% url "fav" toot.id %}">
{% csrf_token %}
<div class="level is-mobile">
<div class="level-left">
<div class="level-item">
<input class="button" type="submit" name="cancel" value="Cancel">
<div>
<div>
<div>
<input type="submit" name="cancel" value="Cancel">
</div>
</div>
<div class="level-right">
<div class="level-item">
<div>
<div>
{% if toot.favorited %}
<input class="button is-primary" type="submit" name="fav"
<input type="submit" name="fav"
value="Unfavorite">
{% else %}
<input class="button is-primary" type="submit" name="fav"
<input type="submit" name="fav"
value="Favorite">
{% endif %}
</div>

View File

@ -6,24 +6,24 @@
{% block content %}
{% if relationship.requested %}
<h1 class="title">Cancel follow request?</h1>
<h1 >Cancel follow request?</h1>
{% elif relationship.following %}
<h1 class="title">Unfollow this user?</h1>
<h1 >Unfollow this user?</h1>
{% else %}
<h1 class="title">Follow this user?</h1>
<h1 >Follow this user?</h1>
{% endif %}
<article class="media user-info">
<figure class="media-left">
<p class="image is-64x64">
<article>
<figure>
<p>
<a href="{% url "user" user.acct %}">
<img src="{{ user.avatar }}"
alt="">
</a>
</p>
</figure>
<div class="media-content">
<div class="content">
<div>
<div>
<p>
<strong>{{ user.display_name }}</strong>
<small>
@ -42,15 +42,15 @@
<form method="POST" action="{% url 'follow' user.id %}">
{% csrf_token %}
<div class="level is-mobile">
<div class="level-left">
<div class="level-item">
<input class="button" type="submit" name="cancel" value="Cancel">
<div>
<div>
<div>
<input type="submit" name="cancel" value="Cancel">
</div>
</div>
<div class="level-right">
<div class="level-item">
<input class="button is-primary" type="submit" name="follow"
<div>
<div>
<input type="submit" name="follow"
value="Confirm">
</div>
</div>

View File

@ -1,12 +1,12 @@
{% extends "main/timeline.html" %}
{% block pagination %}
<nav class="pagination is-centered" role="navigation" aria-label="pagination">
<nav role="navigation" aria-label="pagination">
{% if prev %}
<a class="pagination-next" rel="next" href="{% url 'local_prev' prev.min_id %}">Newer</a>
<a rel="next" href="{% url 'local_prev' prev.min_id %}">Newer</a>
{% endif %}
{% if next %}
<a class="pagination-previous" rel="prev" href="{% url 'local_next' next.max_id %}">Older</a>
<a rel="prev" href="{% url 'local_next' next.max_id %}">Older</a>
{% endif %}
</nav>
{% endblock %}

View File

@ -6,22 +6,22 @@
{% block content %}
{% if relationship.muting %}
<h1 class="title">Unmute this user?</h1>
<h1>Unmute this user?</h1>
{% else %}
<h1 class="title">Mute this user?</h1>
<h1>Mute this user?</h1>
{% endif %}
<article class="media user-info">
<figure class="media-left">
<p class="image is-64x64">
<article>
<figure>
<p>
<a href="{% url "user" user.acct %}">
<img src="{{ user.avatar }}"
alt="">
</a>
</p>
</figure>
<div class="media-content">
<div class="content">
<div >
<div >
<p>
<strong>{{ user.display_name }}</strong>
<small>
@ -40,15 +40,15 @@
<form method="POST" action="{% url 'mute' user.id %}">
{% csrf_token %}
<div class="level is-mobile">
<div class="level-left">
<div class="level-item">
<input class="button" type="submit" name="cancel" value="Cancel">
<div >
<div >
<div >
<input type="submit" name="cancel" value="Cancel">
</div>
</div>
<div class="level-right">
<div class="level-item">
<input class="button is-primary" type="submit" name="mute"
<div >
<div >
<input type="submit" name="mute"
value="Confirm">
</div>
</div>

View File

@ -22,7 +22,7 @@ mastodon.notifications()[0]
{% block content %}
<h1 class="title">Your notifications timeline</h1>
<h1>Your notifications timeline</h1>
{% for group in groups %}
{% if bundle_notifications and group.0.type in bundleable %}
{% if group.0.type == 'favourite' %}
@ -34,7 +34,7 @@ mastodon.notifications()[0]
favorited your toot.
</p>
{% include "main/toot_partial.html" with toot=group.0.status %}
<hr class="is-hidden">
<hr>
{% elif group.0.type == 'reblog' %}
<p>
{% for account in group.accounts %}
@ -44,7 +44,7 @@ mastodon.notifications()[0]
boosted your toot.
</p>
{% include "main/toot_partial.html" with toot=group.0.status reblog=True reblog_by=group.0.account.acct reblog_icon=group.0.account.avatar_static %}
<hr class="is-hidden">
<hr>
{% endif %}
{% else %}
{% for note in group %}
@ -56,7 +56,7 @@ mastodon.notifications()[0]
</p>
<br>
{% include "main/toot_partial.html" with toot=note.status reblog=False %}
<hr class="is-hidden">
<hr>
{% elif note.type == 'reblog' %}
<p>
{{ note.account.display_name | fix_emojos:note.account.emojis |strip_html |safe }}
@ -67,7 +67,7 @@ mastodon.notifications()[0]
</span>)
</p>
{% include "main/toot_partial.html" with toot=note.status reblog=True reblog_by=note.account.acct reblog_icon=note.account.avatar_static %}
<hr class="is-hidden">
<hr>
{% elif note.type == 'favourite' %}
<p>
{{ note.account.display_name | fix_emojos:note.account.emojis |strip_html |safe }}
@ -78,16 +78,16 @@ mastodon.notifications()[0]
</span>)
</p>
{% include "main/toot_partial.html" with toot=note.status %}
<hr class="is-hidden">
<hr>
{% elif note.type == 'follow' %}
<article class="media">
<figure class="media-left">
<p class="image is-64x64">
<article>
<figure>
<p>
<img src="{{ note.account.avatar_static }}" alt="">
</p>
</figure>
<div class="media-content" >
<div class="content">
<div>
<div>
<strong>{{ note.account.display_name | fix_emojos:note.account.emojis |strip_html |safe }}</strong>
(<a href="{{ note.account.url |localuser }}">{{ note.account.acct }}</a>)
followed you.
@ -97,22 +97,22 @@ mastodon.notifications()[0]
</div>
</div>
</article>
<hr class="is-hidden">
<hr>
{% elif note.type == 'poll' %}
<p>A poll you created or voted in has ended.</p>
{% include "main/toot_partial.html" with toot=note.status %}
<hr class="is-hidden">
<hr>
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
<nav class="pagination is-centered" role="navigation" aria-label="pagination">
<nav role="navigation" aria-label="pagination">
{% if prev %}
<a class="pagination-next" rel="next" href="{% url 'note_prev' prev.min_id %}">Newer</a>
<a rel="next" href="{% url 'note_prev' prev.min_id %}">Newer</a>
{% endif %}
{% if next %}
<a class="pagination-previous" rel="prev" href="{% url 'note_next' next.max_id %}">Older</a>
<a rel="prev" href="{% url 'note_next' next.max_id %}">Older</a>
{% endif %}
</nav>

View File

@ -4,8 +4,8 @@
{% block title %} Brutaldon ({{ own_acct.username }}) - toot {% endblock %}
{% block content %}
<h1 class="title" >Toot!</h1>
<div class="box">
<h1>Toot!</h1>
<div>
{% include "main/post_partial.html" %}
</div>
{% endblock %}

View File

@ -7,49 +7,39 @@
<br>
</div>
<div class="field">
<label class="label"> {{ form.spoiler_text.label }}</label>
<div class="control">
<div >
<label> {{ form.spoiler_text.label }}</label>
<div>
{% render_field form.spoiler_text class+="input mousetrap" placeholder="Optional" %}
</div>
</div>
<div class="field" >
<label class="label" >{{ form.status.label }}</label>
<div class="control">
<textarea name="status" cols="40" rows="3" class="textarea is-primary mousetrap"
required="" id="id_status"
ic-post-to="{% url "user_search" %}"
ic-trigger-on="keyup changed" ic-trigger-delay="500ms"
ic-target="#username_autocomplete">{% if form.status.value %}{{ form.status.value }}{% endif %}</textarea>
<div id="username_autocomplete"></div>
<div>
<label >{{ form.status.label }}</label>
<div>
<textarea name="status" cols="40" rows="3"
required="" id="id_status">
{% if form.status.value %}{{ form.status.value }}{% endif %}</textarea>
<div></div>
</div>
<div id="status_count"></div>
<div></div>
</div>
<div class="field has-addons">
<div class="control level is-mobile">
<a href="{% url "user" own_acct.acct %}" class="image avatar is-48x48 level-item">
<img src="{{ own_acct.avatar_static }}" alt="[{{ own_acct.acct }}]">
<div>
<div>
<a href="{% url "user" own_acct.acct %}" >
<img class="avatar" src="{{ own_acct.avatar_static }}" alt="[{{ own_acct.acct }}]">
</a>
<input type="submit" class="button is-primary level-item"
<input type="submit"
name="toot" value="Toot">
<a href="{% url "emoji" %}" target="_blank" rel="noopener noreferrer"
class="level-item emoji-link" title="custom emoji reference">😊</a>
title="custom emoji reference">😊</a>
<a href="{% url "toot" %}"
ic-get-from="{% url "toot" %}"
ic-target="#post-form"
ic-select-from-response="#post-form"
ic-include="#id_status,#id_spoiler_text"
title="Complete toot form (media, visibility, etc"
class="fa fa-edit">
<span class="is-hidden">Complete toot form (media, visibility etc)</span>
title="Complete toot form (media, visibility, etc">
<span>Complete toot form (media, visibility etc)</span>
</a>
</div>
</div>
{% if not preferences.theme.no_javascript %}
<script type="application/javascript">
Intercooler.ready(characterCountSetup);
</script>
{% endif %}
</form>

View File

@ -14,130 +14,121 @@
<br>
</div>
<div class="field">
<label class="label"> {{ form.spoiler_text.label }}</label>
<div class="control">
<div>
<label> {{ form.spoiler_text.label }}</label>
<div>
{% render_field form.spoiler_text class+="input mousetrap" placeholder="Optional" %}
</div>
</div>
<div class="field" >
<label class="label" >{{ form.status.label }}</label>
<div class="control">
<textarea name="status" cols="40" rows="3" class="textarea is-primary mousetrap"
required="" id="id_status"
ic-post-to="{% url "user_search" %}"
ic-trigger-on="keyup changed" ic-trigger-delay="500ms"
ic-target="#username_autocomplete">{% if form.status.value %}{{ form.status.value }}{% endif %}</textarea>
<div id="username_autocomplete"></div>
<div >
<label >{{ form.status.label }}</label>
<div >
<textarea name="status" cols="40" rows="3"
required="" id="id_status">
{% if form.status.value %}{{ form.status.value }}{% endif %}</textarea>
<div></div>
</div>
<div id="status_count"></div>
<div></div>
</div>
<div class="field">
<label class="label" > {{ form.visibility.label }}</label>
<div class="control has-icons-left">
<div class="select">
<div >
<label > {{ form.visibility.label }}</label>
<div >
<div >
{% render_field form.visibility class+="select"%}
<span class="icon is-small is-left" >
<i class="fa fa-address-card"></i>
<span >
<i ></i>
</span>
</div>
</div>
</div>
<div class="field has-addons">
<div class="file">
<label class="file-label">
<div >
<div >
<label >
{% render_field form.media_file_1 class+="file-input" %}
<span class="file-cta">
<span class="file-icon">
<i class="fa fa-upload"></i>
<span >
<span >
<i ></i>
</span>
<span class="file-label" id="media_filename_1">
<span >
{{ form.media_file_1.label }}
</span>
</span>
</label>
</div>
<div class="control is-expanded">
<div >
{% render_field form.media_text_1 class+="input mousetrap" placeholder="Describe attachment" %}
</div>
</div>
<div class="field has-addons">
<div class="file">
<label class="file-label">
<div >
<div >
<label >
{% render_field form.media_file_2 class+="file-input" %}
<span class="file-cta">
<span class="file-icon">
<i class="fa fa-upload"></i>
<span >
<span >
<i ></i>
</span>
<span class="file-label" id="media_filename_2">
<span >
{{ form.media_file_2.label }}
</span>
</span>
</label>
</div>
<div class="control is-expanded">
<div >
{% render_field form.media_text_2 class+="input mousetrap" placeholder="Describe attachment" %}
</div>
</div>
<div class="field has-addons">
<div class="file">
<label class="file-label">
<div >
<div >
<label >
{% render_field form.media_file_3 class+="file-input" %}
<span class="file-cta">
<span class="file-icon">
<i class="fa fa-upload"></i>
<span >
<span >
<i ></i>
</span>
<span class="file-label" id="media_filename_3">
<span >
{{ form.media_file_3.label }}
</span>
</span>
</label>
</div>
<div class="control is-expanded">
<div >
{% render_field form.media_text_3 class+="input mousetrap" placeholder="Describe attachment" %}
</div>
</div>
<div class="field has-addons">
<div class="file">
<label class="file-label">
<div >
<div >
<label >
{% render_field form.media_file_4 class+="file-input" %}
<span class="file-cta">
<span class="file-icon">
<i class="fa fa-upload"></i>
<span >
<span >
<i ></i>
</span>
<span class="file-label" id="media_filename_4">
<span >
{{ form.media_file_4.label }}
</span>
</span>
</label>
</div>
<div class="control is-expanded">
<div >
{% render_field form.media_text_4 class+="input mousetrap" placeholder="Describe attachment" %}
</div>
</div>
<div class="field has-addons">
<div class="control level is-mobile">
<a href="{% url "user" own_acct.acct %}" class="image avatar is-48x48 level-item" >
<img src="{{ own_acct.avatar_static }}" alt="[{{ own_acct.acct }}]">
<div >
<div >
<a href="{% url "user" own_acct.acct %}" >
<img class="avatar" src="{{ own_acct.avatar_static }}" alt="[{{ own_acct.acct }}]">
</a>
<input type="submit" class="button is-primary level-item"
<input type="submit"
name="toot" value="Toot">
<a href="{% url "emoji" %}" target="_blank" rel="noopener noreferrer"
class="level-item emoji-link" title="custom emoji reference">😊</a>
title="custom emoji reference">😊</a>
</div>
</div>
{% if not preferences.no_javascript %}
<script type="application/javascript">
fileButtonUpdaters();
Intercooler.ready(fileButtonUpdaters);
Intercooler.ready(characterCountSetup);
</script>
{% endif %}
</form>

View File

@ -1,12 +1,12 @@
{% extends "main/timeline.html" %}
{% block pagination %}
<nav class="pagination is-centered" role="navigation" aria-label="pagination">
<nav role="navigation" aria-label="pagination">
{% if prev %}
<a class="pagination-next" rel="next" href="{% url 'fed_prev' prev.min_id %}">Newer</a>
<a rel="next" href="{% url 'fed_prev' prev.min_id %}">Newer</a>
{% endif %}
{% if next %}
<a class="pagination-previous" rel="prev" href="{% url 'fed_next' next.max_id %}">Older</a>
<a rel="prev" href="{% url 'fed_next' next.max_id %}">Older</a>
{% endif %}
</nav>
{% endblock %}

View File

@ -11,19 +11,19 @@ Brutaldon ({{ own_acct.username }}) - reply
{% endblock %}
{% block content %}
<h1 class="title">Redraft</h1>
<h1 >Redraft</h1>
{% include "main/toot_partial.html" with toot=toot active=True %}
<hr class="is-hidden">
<div class="notification">
<hr >
<div >
<p>
Submitting this form will <em>post</em> this replacement toot, and
<em class="error">delete</em> the original toot. The replacement toot will not
<em>delete</em> the original toot. The replacement toot will not
have any favs, boosts, or replies that the original toot had.
Currently, media attachments must be re-uploaded. Sorry, working on it.
</p>
</div>
<div class="box">
<div >
{% include "main/post_partial.html" %}
</div>

View File

@ -11,14 +11,14 @@ Brutaldon ({{ own_acct.username }}) - reply
{% endblock %}
{% block content %}
<h1 class="title">Thread</h1>
<h1 >Thread</h1>
{% for ancestor in context.ancestors %}
{% include "main/toot_partial.html" with toot=ancestor %}
<hr class="is-hidden">
<hr >
{% endfor %}
{% include "main/toot_partial.html" with toot=toot active=True %}
<hr class="is-hidden">
<div class="box">
<hr >
<div >
{% include "main/post_partial.html" %}
</div>

View File

@ -4,9 +4,9 @@
{% block title %}brutaldon ({{ own_acct.username }}) search {% endblock %}
{% block content %}
<h1 class="title">Search</h1>
<h1 >Search</h1>
<div class="notification">
<div >
<div>
You can search for tags, users, or for specific toots by URL. You may
also be able to full-text search for toots you have previously
@ -15,18 +15,18 @@
</div>
<form method="get" action="{% url "search_results" %}">
<div class="field">
<label class="label">{{ form.instance.label }}</label>
<div class="control has-icons-left">
<input type="search" name="q" id="q" class="input">
<span class="icon is-small is-left">
<i class="fa fa-search"></i>
<div >
<label >{{ form.instance.label }}</label>
<div >
<input type="search" name="q" id="q" >
<span >
<i ></i>
</span>
</div>
</div>
<div class="field">
<input type="submit" value="Search" class="button is-primary" >
<div >
<input type="submit" value="Search" >
</div>
</form>

View File

@ -22,36 +22,36 @@ mastodon.search("<query>")
<section>
<form method="get" action="{% url "search_results" %}">
<div class="field has-addons">
<label class="label">{{ form.instance.label }}</label>
<div class="control has-icons-left">
<input type="search" name="q" id="q" class="input">
<span class="icon is-small is-left">
<i class="fa fa-search"></i>
<div >
<label >{{ form.instance.label }}</label>
<div >
<input type="search" name="q" id="q" >
<span >
<i ></i>
</span>
</div>
<input type="submit" value="Search" class="button is-primary" >
<input type="submit" value="Search" >
</div>
</form>
<br>
</section>
<h1 class="title">Search results</h1>
<div class="container">
<h2 class="subtitle">Users</h2>
<h1 >Search results</h1>
<div >
<h2 >Users</h2>
{% for user in results.accounts %}
<article class="media user-info">
<figure class="media-left">
<p class="image is-64x64">
<article >
<figure >
<p >
<a href="{% url "user" user.acct %}">
<img src="{{ user.avatar }}"
alt="">
</a>
</p>
</figure>
<div class="media-content">
<div class="content">
<div >
<div >
<p>
<strong>{{ user.display_name }}</strong>
<small>
@ -72,14 +72,14 @@ mastodon.search("<query>")
{% endfor %}
<h2 class="subtitle">Tags</h2>
<h2 >Tags</h2>
<ul>
{% for tag in results.hashtags %}
<li><a href="{% url 'tag' tag.name %}">#{{ tag.name }}</a></li>
{% endfor %}
</ul>
<h2 class="subtitle">Toots</h2>
<h2 >Toots</h2>
{% for toot in results.statuses %}
{% include "main/toot_partial.html" with toot=toot reblog=False %}
{% endfor %}

View File

@ -15,17 +15,19 @@ mastodon.status_context(<numerical id>)
{% endcomment %}
{% block content %}
<h1 id="title" class="title">
<h1>
Thread
</h1>
<hr>
{% include "main/toot_partial.html" with toot=root %}
<hr>
{% for descendant in descendants %}
{% if descendant == toot %}
{% include "main/toot_partial.html" with toot=toot active=True %}
{% else %}
{% include "main/toot_partial.html" with toot=descendant %}
{% endif %}
<hr class="is-hidden">
<hr>
{% endfor %}
{% if not preferences.no_javascript %}

View File

@ -16,14 +16,14 @@
{% block content %}
<h1>Brutaldon ({{ own_acct.username }}) - {{ timeline_name }} timelime</h1>
{% if form %}
<h2 class="title">Post</h2>
<div class="box">
<h2 >Post</h2>
<div >
{% include "main/post_minimal_partial.html" %}
</div>
<hr class="is-hidden">
<hr >
{% endif %}
<h2 class="title">Your {{ timeline_name }} timeline</h2>
<div id="timeline">
<h2 >Your {{ timeline_name }} timeline</h2>
<div>
{% for toot in toots %}
{% cache 600 toot_partial toot.id %}
{% if toot.reblog %}
@ -32,15 +32,15 @@
{% include "main/toot_partial.html" with toot=toot reblog=False %}
{% endif %}
{% endcache %}
<hr class="is-hidden">
<hr >
{% endfor %}
{% block pagination %}
<div class="around-pagination">
<div class="columns">
<div >
<div >
{% if next %}
<p class="column is-one-quarter">
<a class="pagination-previous is-fullwidth button"
<p >
<a
rel="prev"
href="{% url 'home_next' next.max_id %}"
{% if preferences.click_to_load %}
@ -54,11 +54,11 @@
Older
</a>
</p>
<p class="column is-one-half"></p>
<p ></p>
{% endif %}
{% if prev %}
<p class="column is-one-quarter">
<a class="pagination-next is-fullwidth button"
<p >
<a
rel="next"
href="{% url 'home_prev' prev.min_id %}">
Newer

View File

@ -6,28 +6,21 @@
{% if toot %}
{% if active %}
<article id="toot-{{toot.id}}" class="media box active-context">
<article>
{% else %}
<article id="toot-{{toot.id}}" class="media box">
<article>
{% endif %}
<figure class="media-left">
<p class="image is-64x64 account-avatar">
<figure >
<p >
<a href="{% url "user" toot.account.acct %}">
<img loading="auto" src="{{ toot.account.avatar_static }}"
<img class="avatar" loading="auto" src="{{ toot.account.avatar_static }}"
alt="">
</a>
</p>
{% if reblog %}
<p class="image is-32x32 reblog-icon" >
<a href="{% url "user" reblog_by %}">
<img loading="auto" src ="{{ reblog_icon }}" alt="">
</a>
</p>
{% endif %}
</figure>
<div class="media-content">
<div class="content">
<div >
<div >
<p>
<h3><strong>{{ toot.account.display_name | fix_emojos:toot.account.emojis | strip_html |safe}}</strong></h3>
<small><a href="{% url "user" toot.account.acct %}">
@ -38,23 +31,26 @@
{% if reblog %}
<br>
Boosted by @{{ reblog_by }}
<a href="{% url "user" reblog_by %}">
<img class="avatar" loading="auto" src ="{{ reblog_icon }}" alt="">
</a>
{% endif %}
</p>
{% if toot.spoiler_text %}
<details class="toot">
<details >
<summary><strong>{{ toot.spoiler_text }} </strong></summary>
<div class="toot">
<div >
{{ toot.content | relink_toot | fix_emojos:toot.emojis | strip_html | safe }}
</div>
</details>
{% else %}
<div class="toot">
<div >
{{ toot.content | relink_toot | fix_emojos:toot.emojis | strip_html | safe }}
</div>
{% endif %}
{% if toot.poll %}
<div class="poll">
<div >
{% if toot.poll.voted or toot.poll.expired %}
{% include "polls/completed_partial.html" with toot=toot %}
{% else %}
@ -66,20 +62,19 @@
{% if toot.card %}
<div class="card">
<div class="card-content columns">
<div >
<div >
{% if toot.card.image %}
<div class="column is-one-third">
<div >
<a href="{{ toot.card.url }}">
<noscript class="loading-lazy">
<img loading="lazy" alt="{{ toot.card.title }}"
src="{{ toot.card.image }}"
class="is-max-128">
src="{{ toot.card.image }}">
</noscript>
</a>
</div>
{% endif %}
<div class="column is-two-thirds">
<div >
<p>
<strong>
<a href="{{ toot.card.url }}">
@ -95,10 +90,10 @@
{% if toot.media_attachments %}
<br>
<div class="columns is-multiline attachments is-gapless">
<div >
{% for media in toot.media_attachments %}
{% if media.type == "image" %}
<figure class="column attachment-image">
<figure >
<a href="{{ media.url }}">
<noscript class="loading-lazy">
{% if toot.sensitive and not preferences.preview_sensitive %}
@ -116,13 +111,13 @@
{% if media.description %}
title="{{ media.description }}"
{% endif %}
class="image is-max-256">
>
</noscript>
</a>
</figure>
{% else %}
<figure class="column">
<video controls loop class="is-max-256"
<figure >
<video controls loop
poster="{{ media.preview_url }}">
<source src="{{ media.url }}" type="video/mp4">
<a href="{{ media.url }}">
@ -142,7 +137,7 @@
{% if media.description %}
title="{{ media.description }}"
{% endif %}
class="image is-max-256">
>
</noscript>
</a>
</video>
@ -153,20 +148,19 @@
</div>
{% endif %}
<br>
<p class="is-hidden"></p>
</div>
{% if not confirm_page %}
<nav class="level is-mobile">
<div class="level-left">
<a href="{% url "reply" toot.id %}#toot-{{ toot.id }}" class="level-item">
<nav >
<div >
<a href="{% url "reply" toot.id %}#toot-{{ toot.id }}" >
{% if toot.replies_count > 0 %}
<span class="fa fa-reply-all">
<span class="is-hidden-mobile"><strong>Reply</strong></span>
<span >
<span ><strong>Reply</strong></span>
</span>
{% else %}
<span class="fa fa-reply">
<span class="is-hidden-mobile">Reply</span>
<span >
<span >Reply</span>
</span>
{% endif %}
</a>
@ -175,11 +169,11 @@
ic-post-to="{% url "boost" toot.id %}"
ic-indicator="#toot-spinner-{{toot.id}}">
{% if toot.reblogged %}
<span class="fa fa-retweet has-text-warning">
<strong class="is-hidden-mobile" >Boosted</strong>
<span >
<strong >Boosted</strong>
{% else %}
<span class="fa fa-retweet" >
<span class="is-hidden-mobile" >Boost</span>
<span >
<span >Boost</span>
{% endif %}
</span>
</span>
@ -189,23 +183,23 @@
ic-post-to="{% url "fav" toot.id %}"
ic-indicator="#toot-spinner-{{toot.id}}">
{% if toot.favourited %}
<span class="fa fa-heart has-text-warning">
<strong class="is-hidden-mobile" >Favorited</strong>
<span >
<strong >Favorited</strong>
{% else %}
<span class="fa fa-heart">
<span class="is-hidden-mobile" >Favorite</span>
<span >
<span >Favorite</span>
{% endif %}
</span>
</span>
</a>
<i id="toot-spinner-{{toot.id}}" class="fa fa-spinner fa-spin" style="display:none"></i>
<i></i>
</div>
<div class="level-right">
<div >
{% if toot.account.acct == own_acct.acct %}
<a class="level-item" href="{% url "redraft" toot.id %}">
<a href="{% url "redraft" toot.id %}">
redraft
</a>
<a class="level-item" href="{% url "delete" toot.id %}"
<a href="{% url "delete" toot.id %}"
ic-delete-from="{% url "delete" toot.id %}"
ic-indicator="#toot-spinner-{{toot.id}}"
ic-confirm="Really delete that toot?"
@ -221,12 +215,12 @@
{% endif %}
&nbsp;&nbsp;
{% if toot.in_reply_to_id or toot.replies_count > 0 %}
<a class="level-item" href="{% url "thread" toot.id %}#toot-{{ toot.id }}">
<span class="fa fa-comments"></span>
<a href="{% url "thread" toot.id %}#toot-{{ toot.id }}">
<span ></span>
<strong> thread</strong>
</a>
{% else %}
<a class="level-item" href="{% url "thread" toot.id %}#toot-{{ toot.id }}">
<a href="{% url "thread" toot.id %}#toot-{{ toot.id }}">
thread
</a>
{% endif %}
@ -235,6 +229,6 @@
{% endif %}
</div>
<div class="media-right"></div>
<div ></div>
</article>
{% endif %}

View File

@ -9,97 +9,97 @@ Brutaldon ({{ own_acct.username }}) - {{ user.acct }} timelime
{% block content %}
<div class="card user-card">
<div >
{% if not preferences.theme.is_brutalist %}
<div class="card-header" style="background-image: url({{ user.header }});">
<div style="background-image: url({{ user.header }});">
{% else %}
<div class="card-header">
<div >
{% endif %}
<div class="card-header-title title">
<div >
<a href="{{ user.url }}">
{{ user.display_name }}
</a>
</div>
<figure class="image is-96x96 card-header-icon">
<figure >
<img src="{{ user.avatar }}" alt="Avatar">
{% if user.locked %}
<span class="fa fa-lock account-locked">
<span class="is-hidden">Private</span>
<span >
<span >Private</span>
</span>
{% endif %}
</figure>
</div>
<div class="card-content">
<div class="content">
<div >
<div >
{{ user.note | relink_toot | strip_html | safe }}
</div>
{% if user.acct != own_acct.acct %}
<div class="level is-mobile">
<div class="level-left">
<div >
<div >
{% if relationship.requested %}
<a class="level-item fa fa-hourglass" title="cancel request"
<a title="cancel request"
href="{% url 'follow' user.id %}"
ic-post-to="{% url 'follow' user.id %}"
ic-indicator="#user-spinner" ic-replace-target="true">
<span class="is-hidden">Cancel request</span>
<span >Cancel request</span>
</a>
{% elif not relationship.following %}
<a class="level-item fa fa-user-plus" title="follow"
<a title="follow"
href="{% url 'follow' user.id %}"
ic-post-to="{% url 'follow' user.id %}"
ic-indicator="#user-spinner" ic-replace-target="true">
<span class="is-hidden">Follow</span>
<span >Follow</span>
</a>
{% else %}
<a class="level-item fa fa-user-times" title="unfollow"
<a title="unfollow"
href="{% url 'follow' user.id %}"
ic-post-to="{% url 'follow' user.id %}"
ic-indicator="#user-spinner" ic-replace-target="true"
ic-confirm="Unfollow this user?">
<span class="is-hidden">Unfollow</span>
<span >Unfollow</span>
</a>
{% endif %}
<a class="level-item fa fa-social-home"
<a
href="{{ user.url }}" title="home">
<span class="is-hidden">View on home site</span>
<span >View on home site</span>
</a>
<a class="level-item fa fa-envelope"
<a
href="{% url 'toot' user.acct %}" title="mention">
<span class="is-hidden">Mention</span>
<span >Mention</span>
</a>
<i id="user-spinner" class="fa fa-spinner fa-spin" style="display:none"></i>
<i style="display:none"></i>
</div>
<div class="level-right">
<div >
{% if not relationship.muting %}
<a class="level-item fa fa-volume-off" title="mute"
<a title="mute"
href="{% url 'mute' user.id %}"
ic-post-to="{% url 'mute' user.id %}"
ic-indicator="#user-spinner" ic-replace-target="true"
ic-confirm="Mute this user?">
<span class="is-hidden">Mute</span>
<span >Mute</span>
</a>
{% else %}
<a class="level-item fa fa-volume-up" title="unmute"
<a title="unmute"
href="{% url 'mute' user.id %}"
ic-post-to="{% url 'mute' user.id %}"
ic-indicator="#user-spinner" ic-replace-target="true">
<span class="is-hidden">Unmute</span>
<span >Unmute</span>
</a>
{% endif %}
{% if not relationship.blocking %}
<a class="level-item fa fa-ban" title="block"
<a title="block"
href="{% url 'block' user.id %}"
ic-post-to="{% url 'block' user.id %}"
ic-indicator="#user-spinner" ic-replace-target="true"
ic-confirm="Block this user?">
<span class="is-hidden">Block</span>
<span >Block</span>
</a>
{% else %}
<a class="level-item fa fa-circle-o" title="unblock"
<a title="unblock"
href="{% url 'block' user.id %}"
ic-post-to="{% url 'block' user.id %}"
ic-indicator="#user-spinner" ic-replace-target="true">
<span class="is-hidden">Unblock</span>
<span >Unblock</span>
</a>
{% endif %}
</div>
@ -116,14 +116,14 @@ Brutaldon ({{ own_acct.username }}) - {{ user.acct }} timelime
{% else %}
{% include "main/toot_partial.html" with toot=toot reblog=False %}
{% endif %}
<hr class="is-hidden">
<hr >
{% endfor %}
<nav class="pagination is-centered" role="navigation" aria-label="pagination">
<nav role="navigation" aria-label="pagination">
{% if prev %}
<a class="pagination-next" rel="next" href="{% url 'user_prev' user.acct prev.min_id %}">Newer</a>
<a rel="next" href="{% url 'user_prev' user.acct prev.min_id %}">Newer</a>
{% endif %}
{% if next %}
<a class="pagination-previous" rel="prev" href="{% url 'user_next' user.acct next.max_id %}">Older</a>
<a rel="prev" href="{% url 'user_next' user.acct next.max_id %}">Older</a>
{% endif %}
</nav>

View File

@ -1,15 +1,15 @@
{% load sanitizer %}
{% load taglinks %}
{% load static %}
<div class="columns is-multiline">
<div>
{% for option in toot.poll.options %}
<div class="column is-one-quarter">
<div>
<strong>{{ option.title }}</strong>
({{ option.votes_count}} vote{{ option.votes_count|pluralize }})
</div>
<div class="column is-three-quarters">
<progress class="progress is-primary"
<div>
<progress
value="{{ option.votes_count }}"
max="{{ toot.poll.votes_count }}"
{{ option.votes_count }}

View File

@ -2,23 +2,19 @@
{% load taglinks %}
{% load static %}
<form method="POST" action="{% url "vote" toot.id %}"
ic-post-to="{% url "vote" toot.id %}"
ic-target="closest article"
ic-indicator="#poll-spinner-{{ toot.id }}"
ic-replace-target="true">
<form method="POST" action="{% url "vote" toot.id %}">
{% csrf_token %}
{% for option in toot.poll.options %}
<div class="field">
<div>
{% if toot.poll.multiple %}
<label class="checkbox">
<label>
<input type="checkbox"
name="poll-multiple"
value="{{ forloop.counter0 }}">
{{ option.title }}
</label>
{% else %}
<label class="radio">
<label>
<input type="radio"
name="poll-single"
value="{{ forloop.counter0 }}">
@ -27,8 +23,8 @@
{% endif %}
</div>
{% endfor %}
<input type="submit" class="button is-primary" name="Vote" value="Vote">
<span id="poll-spinner-{{toot.id}}" class="fa fa-spinner fa-spin"
<input type="submit" name="Vote" value="Vote">
<span id="poll-spinner-{{toot.id}}"
style="display:none"></span>
</form>

View File

@ -2,17 +2,15 @@
{% load static %}
{% block content %}
<h1 class="title">Privacy statement</h1>
<h2 class="subtitle">A shameful attempt at ass-covering</h2>
<section class="section">
<h2 class="subtitle">Summary</h2>
<h1>Privacy statement</h1>
<section>
<h2>Summary</h2>
<p>
Brutaldon tries to collect as little information about you as possible. The information that it collects in order to log you in to your instance and to implement client features is stored as transiently as possible.
</p>
</section>
<section class="section">
<h2 class="subtitle">
<section>
<h2>
Information that is stored until a database wipe
</h2>
<p>
@ -28,7 +26,7 @@
<p>
You can always revoke an access token through the web interface of your instance.
</p>
<h2 class="subtitle">
<h2>
Information that is stored only during your session
</h2>
<p>

View File

@ -2,8 +2,8 @@
{% load widget_tweaks %}
{% block content %}
<div class="container">
<h1 class="title">Follow requests</h1>
<div>
<h1>Follow requests</h1>
{% if not requests %}
<p>No follow requests.</p>

View File

@ -1,20 +1,20 @@
<article class="media box">
<figure class="media-left">
<p class="image is-64x64">
<article>
<figure>
<p>
<img src="{{ request.avatar_static }}"
alt="{{ request.acct }}">
</p>
</figure>
<div class="media-content">
<div>
<strong>{{ request.display_name }}</strong> ({{ request.acct }})
</div>
<div class="media-right">
<div>
<form method="POST" action="{% url "follow_requests" request.id %}">
{% csrf_token %}
<button name="accept" class="button is-success" value="Accept">
<button name="accept" value="Accept">
Accept
</button>
<button name="reject" class="button is-danger" value="Reject">
<button name="reject" value="Reject">
Reject
</button>
</form>

View File

@ -2,28 +2,28 @@
{% load widget_tweaks %}
{% block content %}
<h1 class="title">Log in to your instance</h1>
<h1>Log in to your instance</h1>
<form method="post" action="{% url "login" %}">
{% csrf_token %}
<div class="field">
<label class="label">{{ form.instance.label }}</label>
<div class="control has-icons-left">
<div>
<label>{{ form.instance.label }}</label>
<div>
{% render_field form.instance class+="input" %}
<span class="icon is-small is-left">
<i class="fa fa-mastodon"></i>
<span>
<i></i>
</span>
</div>
</div>
<div class="field">
<div>
<input type="submit" name="log_in"
value="Log in" class="button is-primary" >
</div>
</form>
<div class="notification">
<button class="delete"></button>
<div>
<button></button>
<div>
Not able to log in with this form? Maybe your brutaldon instance isn't
visible on the internet to your Mastodon instance? If so, you can use

View File

@ -2,39 +2,39 @@
{% load widget_tweaks %}
{% block content %}
<h1 class="title">Log in to your instance</h1>
<h1>Log in to your instance</h1>
<form method="post" action="{% url "oldlogin" %}">
{% csrf_token %}
<div class="field">
<label class="label">{{ form.instance.label }}</label>
<div class="control has-icons-left">
<label>{{ form.instance.label }}</label>
<div>
{% render_field form.instance class+="input" %}
<span class="icon is-small is-left">
<i class="fa fa-mastodon"></i>
<span>
<i></i>
</span>
</div>
</div>
<div class="field">
<label class="label">{{ form.email.label }}</label>
<div class="control has-icons-left">
<div>
<label>{{ form.email.label }}</label>
<div>
{% render_field form.email class+="input" %}
<span class="icon is-small is-left">
<i class="fa fa-user"></i>
<span>
<i></i>
</span>
</div>
</div>
<div class="field" >
<label class="label" >{{ form.password.label }}</label>
<div class="control has-icons-left" >
<div>
<label>{{ form.password.label }}</label>
<div>
{% render_field form.password class+="input" type="password" %}
<span class="icon is-small is-left">
<i class="fa fa-lock" ></i>
<span>
<i></i>
</span>
</div>
</div>
<div class="field">
<div>
<input type="submit" name="log_in"
value="Log in" class="button is-primary" >
</div>
@ -45,8 +45,8 @@
</p>
{% endif %}
<div class="notification">
<button class="delete"></button>
<div>
<button></button>
<p>
This information is only used to log you in to your instance for the
first time. Brutaldon never stores your username and password; it

View File

@ -2,195 +2,195 @@
{% load widget_tweaks %}
{% block content %}
<div class="container">
<h1 class="title">Settings</h1>
<div>
<h1>Settings</h1>
<form method="post" action="{% url "settings" %}" >
{% csrf_token %}
<h2 class="subtitle">General Options</h2>
<div class="field">
<label class="label" for="id_theme">{{ form.theme.label }}</label>
<div class="control has-icons-left">
<div class="select">
<h2>General Options</h2>
<div>
<label for="id_theme">{{ form.theme.label }}</label>
<div>
<div>
{% render_field form.theme class+="select" %}
<span class="icon is-small is-left">
<span class="fa fa-paint-brush"></span>
<span>
<span></span>
</div>
</div>
</div>
<div class="field">
<label class="label" for="id_timezone">{{ form.timezone.label }}</label>
<div class="control has-icons-left">
<div class="select">
<div>
<label for="id_timezone">{{ form.timezone.label }}</label>
<div>
<div>
{% render_field form.timezone class+="select" %}
<span class="icon is-small is-left">
<span class="fa fa-clock-o"></span>
<span">
<span></span>
</div>
</div>
</div>
<h2 class="subtitle">Content Options</h2>
<div class="columns">
<div class="column is-quarter">
<label class="label checkbox" for="id_preview_sensitive">
<h2>Content Options</h2>
<div>
<div>
<label for="id_preview_sensitive">
{% render_field form.preview_sensitive class+="checkbox" %}
{{ form.preview_sensitive.label }}
</label>
</div>
<div class="column is-quarter">
<p class="notification is-info preferences-help">
<div>
<p>
{{ form.preview_sensitive.help_text }}
</p>
</div>
<div class="column is-half">
<div>
</div>
</div>
<h2 class="subtitle">Timeline Options</h2>
<div class="field">
<label class="label checkbox">
<h2>Timeline Options</h2>
<div>
<label>
{% render_field form.filter_replies %}
{{ form.filter_replies.label }}
</label>
</div>
<div class="field">
<label class="label checkbox"">
<div>
<label>
{% render_field form.filter_boosts %}
{{ form.filter_boosts.label }}
</label>
</div>
<div class="columns">
<div class="column is-quarter">
<div>
<div>
<label class="label checkbox" for="id_filter_notifications">
{% render_field form.filter_notifications class+="checkbox" %}
{{ form.filter_notifications.label }}
</label>
</div>
<div class="column is-quarter">
<p class="notification is-info preferences-help">
<div>
<p>
{{ form.filter_notifications.help_text }}
</p>
</div>
<div class="column is-half">
<div>
</div>
</div>
<div class="columns">
<div class="column is-quarter">
<label class="label checkbox" for="id_bundle_notifications">
<div>
<div>
<label for="id_bundle_notifications">
{% render_field form.bundle_notifications class+="checkbox" %}
{{ form.bundle_notifications.label }}
</label>
</div>
<div class="column is-quarter">
<p class="notification is-info preferences-help">
<div>
<p>
{{ form.bundle_notifications.help_text }}
</p>
</div>
<div class="column is-half">
<div>
</div>
</div>
<h2 class="subtitle">JavaScript Options</h2>
<div class="columns">
<div class="column is-quarter">
<label class="label checkbox" for="id_no_javascript">
<h2>JavaScript Options</h2>
<div>
<div>
<label for="id_no_javascript">
{% render_field form.no_javascript class+="checkbox" %}
{{ form.no_javascript.label }}
</label>
</div>
<div class="column is-quarter">
<p class="notification is-info preferences-help">
<div>
<p>
{{ form.no_javascript.help_text }}
</p>
</div>
<div class="column is-half">
<div>
</div>
</div>
<div class="columns">
<div class="column is-quarter">
<label class="label checkbox" for="id_notifications">
<div>
<div>
<label for="id_notifications">
{% render_field form.notifications class+="checkbox" %}
{{ form.notifications.label }}
</label>
</div>
<div class="column is-quarter">
<p class="notification is-info preferences-help">
<div>
<p>
{{ form.notifications.help_text }}
</p>
</div>
<div class="column is-half">
<div>
</div>
</div>
<div class="columns">
<div class="column is-quarter">
<label class="label checkbox" for="id_click_to_load">
<div>
<div>
<label for="id_click_to_load">
{% render_field form.click_to_load class+="checkbox" %}
{{ form.click_to_load.label }}
</label>
</div>
<div class="column is-quarter">
<p class="notification is-info preferences-help">
<div>
<p>
{{ form.click_to_load.help_text }}
</p>
</div>
<div class="column is-half">
<div>
</div>
</div>
<div class="columns">
<div class="column is-quarter">
<label class="label checkbox" for="id_lightbox">
<div>
<div>
<label for="id_lightbox">
{% render_field form.lightbox class+="checkbox" %}
{{ form.lightbox.label }}
</label>
</div>
<div class="column is-quarter">
<p class="notification is-info preferences-help">
<div>
<p>
{{ form.lightbox.help_text }}
</p>
</div>
<div class="column is-half">
<div>
</div>
</div>
<div class="columns">
<div class="column is-quarter">
<label class="label" for="id_poll_frequency">
<div>
<div>
<label for="id_poll_frequency">
{{ form.poll_frequency.label }}
</label>
<div class="control">
<div>
{% render_field form.poll_frequency class+="input" %}
</div>
</div>
<div class="column is-quarter">
<p class="notification is-info preferences-help">
<div>
<p>
{{ form.poll_frequency.help_text }}
</p>
</div>
<div class="column is-half">
<div>
</div>
</div>
<div class="field">
<div>
<input type="submit" name="submit"
value="Save" class="button is-primary" >
</div>
</form>
<h2 class="subtitle">Bookmarklet</h2>
<h2>Bookmarklet</h2>
<p>
<a href="{{ bookmarklet_url }}">Share via brutaldon</a>
</p>
<h2 class="subtitle">Filters and More</h2>
<h2>Filters and More</h2>
<p><a href="{% url "list_filters" %}">List filters</a></p>
<p><a href="{% url "follow_requests" %}">Follow requests</a></p>

View File

@ -14,7 +14,7 @@ Including another URLconf
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from django.urls import include, path
from brutaldon import views
urlpatterns = [
@ -76,4 +76,5 @@ urlpatterns = [
path("vote/<id>", views.vote, name="vote"),
path("share/", views.share, name="share"),
path("", views.home, name=""),
path("__debug__/", include("debug_toolbar.urls")),
]

View File

@ -11,6 +11,8 @@ import os
from django.core.wsgi import get_wsgi_application
# Setting the key DJANGO_SETTINGS_MODULE to brutaldon.settings in the process environment.
# Think of modifying the environment variables of the parent shell.
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "brutaldon.settings")
application = get_wsgi_application()