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 ## 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 = "*" django-html_sanitizer = "*"
inscriptis = "*" inscriptis = "*"
lxml = "*" lxml = "*"
uwsgi = "*"
django-debug-toolbar = "*"
gunicorn = "*"
[dev-packages] [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. * [X] Add support for following, blocking, and muting users.
## Aesthetic ## Aesthetic
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.
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 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 from django.urls import reverse
def bookmarklet_url(request): 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")) 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 { return {
"bookmarklet_url": f"javascript:location.href='{share_url}?url='+encodeURIComponent(location.href)+';title='+encodeURIComponent(document.title)" "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 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 from django.conf import settings
# Module for translating text, returns strings
from django.utils.translation import gettext as _ 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 pytz import common_timezones
from .models import Theme, Preference from .models import Theme, Preference

View File

@ -19,58 +19,6 @@ def set_up_default_themes(apps, schema_editor):
is_brutalist=False, is_brutalist=False,
) )
dark.save() 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 = Theme(name="No styling at all", main_css=None, is_brutalist=True)
minimal.save() minimal.save()

File diff suppressed because one or more lines are too long

View File

@ -1,6 +1,10 @@
from django.db import models from django.db import models
# Module to access variables given to Django at runtime
from django.conf import settings from django.conf import settings
# Module to translate strings
from django.utils.translation import gettext as _ 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 from pytz import common_timezones
timezones = [(tz, tz) for tz in common_timezones] timezones = [(tz, tz) for tz in common_timezones]

View File

@ -41,9 +41,11 @@ INSTALLED_APPS = [
"sanitizer", "sanitizer",
"django.contrib.humanize", "django.contrib.humanize",
"brutaldon", "brutaldon",
"debug_toolbar",
] ]
MIDDLEWARE = [ MIDDLEWARE = [
"debug_toolbar.middleware.DebugToolbarMiddleware",
"django.middleware.security.SecurityMiddleware", "django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware", "django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware", "django.middleware.common.CommonMiddleware",
@ -216,3 +218,8 @@ DEFAULT_AUTO_FIELD='django.db.models.AutoField'
# Version number displayed on about page # Version number displayed on about page
BRUTALDON_VERSION = "2.15.0" 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 { body {
font-family: Terminus, Inconsolata, Consolas, "Droid Sans Mono", "DejaVu Sans Mono", "Monaco", monospace; font-family: Terminus, Inconsolata, Consolas, "Droid Sans Mono", "DejaVu Sans Mono", "Monaco", monospace;
background-color: #CCC; background-color: #fff;
color: #000; color: #000;
margin: 1em; margin: 1em;
} }
@ -236,12 +236,12 @@ img.is-32x32 {
.media { .media {
padding: 1em; padding: 1em;
margin: 4px; margin: 4px;
border: 8px ridge #CCC; border: 8px #000;
overflow: auto; overflow: auto;
} }
.media.active-context { .media.active-context {
background-color: #DDD; background-color: #fff;
} }
summary::before { summary::before {
@ -332,10 +332,10 @@ img.emoji
.modal-content .modal-content
{ {
z-index: 60; z-index: 60;
background-color: #CCC; background-color: #fff;
color: #000; color: #000;
padding: 1ex; padding: 1ex;
border: 8px ridge #CCC; border: 8px ridge #fff;
max-height: 90vh; max-height: 90vh;
overflow: auto; 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" %}" <img src="{% static "/images/brutaldon.png" %}"
</div> </div>
<h1 class="title">Brutaldon</h1> <h1>Brutaldon</h1>
<h2 class="subtitle">a brutalist web interface for Mastodon</h2> <p>a brutalist web interface for Mastodon</p>
<section class="section"> <section>
<p> <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>
<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> </p>
</section> </section>

View File

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

View File

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

View File

@ -15,15 +15,24 @@
{% endif %} {% endif %}
{% endblock %}</title> {% endblock %}</title>
<link rel="manifest" href="{% static 'manifest.webmanifest' %}"> <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 %} {% 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" <link rel="stylesheet"
href="{% static 'css/magnific-popup.css' %}"> href="{% static 'css/magnific-popup.css' %}">
<link rel="stylesheet" href="{% static "css/brutaldon.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 preferences.theme.tweaks_css %}">
<link rel="stylesheet" <link rel="stylesheet"
href="{% static 'css/magnific-popup.css' %}"> 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 %} {% if not preferences.no_javascript %}
<script type="text/javascript" src="{% static 'js/jquery.min.js' %}"></script> <script type="text/javascript" src="{% static 'js/jquery.min.js' %}"></script>
<script type="text/javascript" src="{% static 'js/intercooler.js' %}"></script> <script type="text/javascript" src="{% static 'js/intercooler.js' %}"></script>
@ -52,54 +53,31 @@
{% endblock %} {% endblock %}
{% endif %} {% endif %}
{% 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> </head>
<body ic-global-include='{"csrfmiddlewaretoken": "{{ csrf_token }}"}'> <body ic-global-include='{"csrfmiddlewaretoken": "{{ csrf_token }}"}'>
<div id="page-load-indicator"></div> <div id="page-load-indicator"></div>
<div id="new-toot-modal" class="modal"></div> <div id="new-toot-modal" class="modal"></div>
{% block navbar %} {% block navbar %}
<nav class="navbar is-primary" role="navigation" <nav role="navigation"
aria-label="main navigation" id="main-nav-bar"> aria-label="main navigation">
<div class="navbar-brand"> <span>
<a class="navbar-item" href="{% url "home" %}"> <a href="{% url "home" %}">
{% if own_acct %} {% if own_acct %}
<img src="{{ own_acct.avatar_static }}" <img class="avatar" src="{{ own_acct.avatar_static }}"
class="image is-32x32 avatar"
alt="Brutaldon ('{{ own_acct.username }}')"> alt="Brutaldon ('{{ own_acct.username }}')">
{% else %} {% else %}
<img loading="lazy" src="{% static "images/brutaldon.png" %}" <img class="avatar" loading="lazy" src="{% static "images/brutaldon.png" %}"
class="image is-32x32" alt="Brutaldon"> alt="Brutaldon">
{% endif %} {% endif %}
</a> </a>
</div> </span>
{% if request.session.active_instance and request.session.active_username %} {% if request.session.active_instance and request.session.active_username %}
<div class="navbar-menu is-active" id="navMenu">
<!-- navbar start, navbar end --> <!-- navbar start, navbar end -->
<div class="navbar-start"> <span>
<a href="{% url "home" %}" class="navbar-item"> <a href="{% url "home" %}">
<span class="fa fa-home"></span>
<span>Home</span> <span>Home</span>
</a> </a>
<a class="navbar-item" href="{% url "note" %}"> <a href="{% url "note" %}">
<span class="fa fa-bell"></span>
{% if preferences.notifications and not preferences.theme.is_brutalist %} {% if preferences.notifications and not preferences.theme.is_brutalist %}
<span ic-src="{% url 'notes_count' %}" <span ic-src="{% url 'notes_count' %}"
ic-poll="{{ preferences.poll_frequency }}s" ic-poll="{{ preferences.poll_frequency }}s"
@ -113,46 +91,30 @@
Notifications</span> Notifications</span>
</span> </span>
{% elif notifications and preferences.notifications %} {% elif notifications and preferences.notifications %}
<span ic-src="{% url 'notes_count' %}" <span
ic-poll="{{ preferences.poll_frequency }}s"
ic-target="this"
ic-select-from-response="#notes-count">
<span >Notifications ({{ notifications }})</span> <span >Notifications ({{ notifications }})</span>
</span> </span>
{% else %} {% else %}
<span >Notifications</span> <span >Notifications</span>
{% endif %} {% endif %}
</a> </a>
<a class="navbar-item" href="{% url "local" %}"> <a href="{% url "local" %}">
<span class="fa fa-community"></span>
<span >Local</span> <span >Local</span>
</a> </a>
<a class="navbar-item" href="{% url "fed" %}"> <a href="{% url "fed" %}">
<span class="fa fa-globe"></span>
<span >Federated</span> <span >Federated</span>
</a> </a>
<a class="navbar-item" href="{% url "toot" %}" <a 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>
<span >New Toot</span> <span >New Toot</span>
</a> </a>
<a class="navbar-item" href="{% url "search" %}" <a 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>
<span >Search</span> <span >Search</span>
</a> </a>
</div> </span>
<div class="navbar-end" > <a href="{% url "settings" %}">
<a class="navbar-item" href="{% url "settings" %}">
<span class="fa fa-gear"></span>
<span >Settings</span> <span >Settings</span>
</a> </a>
<a class="navbar-item" href="{% url "accounts" %}"> <a href="{% url "accounts" %}">
<span class="fa fa-id-card-o"> </span>
<span >Accounts</span> <span >Accounts</span>
</a> </a>
</div> </div>
@ -161,7 +123,7 @@
</nav> </nav>
{% endblock %} {% endblock %}
<main id="main" class="section"> <main>
<div class="container"> <div class="container">
{% block content %} {% block content %}
<h1 class="title"> <h1 class="title">
@ -174,18 +136,18 @@
</div> </div>
</main> </main>
<footer class="footer"> <footer>
<div class="level"> <div>
<div class="level-left"> <div>
<a class="level-item is-size-7" href="{% url "about" %}"> <a href="{% url "about" %}">
About About
</a> </a>
<a class="level-item is-size-7" href="https://gitlab.com/brutaldon/brutaldon"> <a href="https://gitlab.com/brutaldon/brutaldon">
Source Source
</a> </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>
<div class="level-right"> <div>
{% if preferences.theme.is_brutalist %} {% if preferences.theme.is_brutalist %}
<noscript class="loading-lazy"> <noscript class="loading-lazy">
<img loading="lazy" class="level-item" src="{% static '/images/lynx.gif' %}" <img loading="lazy" class="level-item" src="{% static '/images/lynx.gif' %}"
@ -194,14 +156,13 @@
alt="Netscape Now!"> alt="Netscape Now!">
</noscript> </noscript>
{% endif %} {% endif %}
<a class="level-item is-size-7" href="{% url "privacy" %}"> <a href="{% url "privacy" %}">
Privacy Privacy
</a> </a>
</div> </div>
</div> </div>
</footer> </footer>
{% if not preferences.no_javascript %}
{% if not preferences.no_javascript %}
<script type="application/javascript"> <script type="application/javascript">
$(document).ready(function () { $(document).ready(function () {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,12 +1,12 @@
{% extends "main/timeline.html" %} {% extends "main/timeline.html" %}
{% block pagination %} {% block pagination %}
<nav class="pagination is-centered" role="navigation" aria-label="pagination"> <nav role="navigation" aria-label="pagination">
{% if prev %} {% 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 %} {% endif %}
{% if next %} {% 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 %} {% endif %}
</nav> </nav>
{% endblock %} {% endblock %}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,12 +1,12 @@
{% extends "main/timeline.html" %} {% extends "main/timeline.html" %}
{% block pagination %} {% block pagination %}
<nav class="pagination is-centered" role="navigation" aria-label="pagination"> <nav role="navigation" aria-label="pagination">
{% if prev %} {% 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 %} {% endif %}
{% if next %} {% 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 %} {% endif %}
</nav> </nav>
{% endblock %} {% endblock %}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -2,17 +2,15 @@
{% load static %} {% load static %}
{% block content %} {% block content %}
<h1 class="title">Privacy statement</h1> <h1>Privacy statement</h1>
<h2 class="subtitle">A shameful attempt at ass-covering</h2> <section>
<h2>Summary</h2>
<section class="section">
<h2 class="subtitle">Summary</h2>
<p> <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. 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> </p>
</section> </section>
<section class="section"> <section>
<h2 class="subtitle"> <h2>
Information that is stored until a database wipe Information that is stored until a database wipe
</h2> </h2>
<p> <p>
@ -28,7 +26,7 @@
<p> <p>
You can always revoke an access token through the web interface of your instance. You can always revoke an access token through the web interface of your instance.
</p> </p>
<h2 class="subtitle"> <h2>
Information that is stored only during your session Information that is stored only during your session
</h2> </h2>
<p> <p>

View File

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

View File

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

View File

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

View File

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

View File

@ -2,195 +2,195 @@
{% load widget_tweaks %} {% load widget_tweaks %}
{% block content %} {% block content %}
<div class="container"> <div>
<h1 class="title">Settings</h1> <h1>Settings</h1>
<form method="post" action="{% url "settings" %}" > <form method="post" action="{% url "settings" %}" >
{% csrf_token %} {% csrf_token %}
<h2 class="subtitle">General Options</h2> <h2>General Options</h2>
<div class="field"> <div>
<label class="label" for="id_theme">{{ form.theme.label }}</label> <label for="id_theme">{{ form.theme.label }}</label>
<div class="control has-icons-left"> <div>
<div class="select"> <div>
{% render_field form.theme class+="select" %} {% render_field form.theme class+="select" %}
<span class="icon is-small is-left"> <span>
<span class="fa fa-paint-brush"></span> <span></span>
</div> </div>
</div> </div>
</div> </div>
<div class="field"> <div>
<label class="label" for="id_timezone">{{ form.timezone.label }}</label> <label for="id_timezone">{{ form.timezone.label }}</label>
<div class="control has-icons-left"> <div>
<div class="select"> <div>
{% render_field form.timezone class+="select" %} {% render_field form.timezone class+="select" %}
<span class="icon is-small is-left"> <span">
<span class="fa fa-clock-o"></span> <span></span>
</div> </div>
</div> </div>
</div> </div>
<h2 class="subtitle">Content Options</h2> <h2>Content Options</h2>
<div class="columns"> <div>
<div class="column is-quarter"> <div>
<label class="label checkbox" for="id_preview_sensitive"> <label for="id_preview_sensitive">
{% render_field form.preview_sensitive class+="checkbox" %} {% render_field form.preview_sensitive class+="checkbox" %}
{{ form.preview_sensitive.label }} {{ form.preview_sensitive.label }}
</label> </label>
</div> </div>
<div class="column is-quarter"> <div>
<p class="notification is-info preferences-help"> <p>
{{ form.preview_sensitive.help_text }} {{ form.preview_sensitive.help_text }}
</p> </p>
</div> </div>
<div class="column is-half"> <div>
</div> </div>
</div> </div>
<h2 class="subtitle">Timeline Options</h2> <h2>Timeline Options</h2>
<div class="field"> <div>
<label class="label checkbox"> <label>
{% render_field form.filter_replies %} {% render_field form.filter_replies %}
{{ form.filter_replies.label }} {{ form.filter_replies.label }}
</label> </label>
</div> </div>
<div class="field"> <div>
<label class="label checkbox""> <label>
{% render_field form.filter_boosts %} {% render_field form.filter_boosts %}
{{ form.filter_boosts.label }} {{ form.filter_boosts.label }}
</label> </label>
</div> </div>
<div class="columns"> <div>
<div class="column is-quarter"> <div>
<label class="label checkbox" for="id_filter_notifications"> <label class="label checkbox" for="id_filter_notifications">
{% render_field form.filter_notifications class+="checkbox" %} {% render_field form.filter_notifications class+="checkbox" %}
{{ form.filter_notifications.label }} {{ form.filter_notifications.label }}
</label> </label>
</div> </div>
<div class="column is-quarter"> <div>
<p class="notification is-info preferences-help"> <p>
{{ form.filter_notifications.help_text }} {{ form.filter_notifications.help_text }}
</p> </p>
</div> </div>
<div class="column is-half"> <div>
</div> </div>
</div> </div>
<div class="columns"> <div>
<div class="column is-quarter"> <div>
<label class="label checkbox" for="id_bundle_notifications"> <label for="id_bundle_notifications">
{% render_field form.bundle_notifications class+="checkbox" %} {% render_field form.bundle_notifications class+="checkbox" %}
{{ form.bundle_notifications.label }} {{ form.bundle_notifications.label }}
</label> </label>
</div> </div>
<div class="column is-quarter"> <div>
<p class="notification is-info preferences-help"> <p>
{{ form.bundle_notifications.help_text }} {{ form.bundle_notifications.help_text }}
</p> </p>
</div> </div>
<div class="column is-half"> <div>
</div> </div>
</div> </div>
<h2 class="subtitle">JavaScript Options</h2> <h2>JavaScript Options</h2>
<div class="columns"> <div>
<div class="column is-quarter"> <div>
<label class="label checkbox" for="id_no_javascript"> <label for="id_no_javascript">
{% render_field form.no_javascript class+="checkbox" %} {% render_field form.no_javascript class+="checkbox" %}
{{ form.no_javascript.label }} {{ form.no_javascript.label }}
</label> </label>
</div> </div>
<div class="column is-quarter"> <div>
<p class="notification is-info preferences-help"> <p>
{{ form.no_javascript.help_text }} {{ form.no_javascript.help_text }}
</p> </p>
</div> </div>
<div class="column is-half"> <div>
</div> </div>
</div> </div>
<div class="columns"> <div>
<div class="column is-quarter"> <div>
<label class="label checkbox" for="id_notifications"> <label for="id_notifications">
{% render_field form.notifications class+="checkbox" %} {% render_field form.notifications class+="checkbox" %}
{{ form.notifications.label }} {{ form.notifications.label }}
</label> </label>
</div> </div>
<div class="column is-quarter"> <div>
<p class="notification is-info preferences-help"> <p>
{{ form.notifications.help_text }} {{ form.notifications.help_text }}
</p> </p>
</div> </div>
<div class="column is-half"> <div>
</div> </div>
</div> </div>
<div class="columns"> <div>
<div class="column is-quarter"> <div>
<label class="label checkbox" for="id_click_to_load"> <label for="id_click_to_load">
{% render_field form.click_to_load class+="checkbox" %} {% render_field form.click_to_load class+="checkbox" %}
{{ form.click_to_load.label }} {{ form.click_to_load.label }}
</label> </label>
</div> </div>
<div class="column is-quarter"> <div>
<p class="notification is-info preferences-help"> <p>
{{ form.click_to_load.help_text }} {{ form.click_to_load.help_text }}
</p> </p>
</div> </div>
<div class="column is-half"> <div>
</div> </div>
</div> </div>
<div class="columns"> <div>
<div class="column is-quarter"> <div>
<label class="label checkbox" for="id_lightbox"> <label for="id_lightbox">
{% render_field form.lightbox class+="checkbox" %} {% render_field form.lightbox class+="checkbox" %}
{{ form.lightbox.label }} {{ form.lightbox.label }}
</label> </label>
</div> </div>
<div class="column is-quarter"> <div>
<p class="notification is-info preferences-help"> <p>
{{ form.lightbox.help_text }} {{ form.lightbox.help_text }}
</p> </p>
</div> </div>
<div class="column is-half"> <div>
</div> </div>
</div> </div>
<div class="columns"> <div>
<div class="column is-quarter"> <div>
<label class="label" for="id_poll_frequency"> <label for="id_poll_frequency">
{{ form.poll_frequency.label }} {{ form.poll_frequency.label }}
</label> </label>
<div class="control"> <div>
{% render_field form.poll_frequency class+="input" %} {% render_field form.poll_frequency class+="input" %}
</div> </div>
</div> </div>
<div class="column is-quarter"> <div>
<p class="notification is-info preferences-help"> <p>
{{ form.poll_frequency.help_text }} {{ form.poll_frequency.help_text }}
</p> </p>
</div> </div>
<div class="column is-half"> <div>
</div> </div>
</div> </div>
<div class="field"> <div>
<input type="submit" name="submit" <input type="submit" name="submit"
value="Save" class="button is-primary" > value="Save" class="button is-primary" >
</div> </div>
</form> </form>
<h2 class="subtitle">Bookmarklet</h2> <h2>Bookmarklet</h2>
<p> <p>
<a href="{{ bookmarklet_url }}">Share via brutaldon</a> <a href="{{ bookmarklet_url }}">Share via brutaldon</a>
</p> </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 "list_filters" %}">List filters</a></p>
<p><a href="{% url "follow_requests" %}">Follow requests</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')) 2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
""" """
from django.contrib import admin from django.contrib import admin
from django.urls import path from django.urls import include, path
from brutaldon import views from brutaldon import views
urlpatterns = [ urlpatterns = [
@ -76,4 +76,5 @@ urlpatterns = [
path("vote/<id>", views.vote, name="vote"), path("vote/<id>", views.vote, name="vote"),
path("share/", views.share, name="share"), path("share/", views.share, name="share"),
path("", views.home, name=""), 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 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") os.environ.setdefault("DJANGO_SETTINGS_MODULE", "brutaldon.settings")
application = get_wsgi_application() application = get_wsgi_application()