Compare commits

...
Sign in to create a new pull request.

56 commits

Author SHA1 Message Date
a3debba954
Fixed accidental checkbox behaviour change in messages. 2025-06-18 00:47:43 +00:00
a2cdedb03c
Fixed some detections. 2025-06-18 00:37:21 +00:00
9a28ec0a77
Cleaned up the code for the remaining macros. 2025-06-18 00:32:34 +00:00
c681e2699e
Switched to correct auth data fetcher. 2025-06-17 16:12:54 +00:00
c0a838773d
why was this using a macro????? 2025-06-17 15:18:20 +00:00
ce9272b935
Replaced all forum macros with includes. 2025-06-17 15:15:08 +00:00
0babeb9390
First batch of Twig macro reduction, forum ones will probably take as long as these combined. 2025-06-17 01:20:14 +00:00
8ef46fe475
Minor spacing fixes. 2025-06-16 20:59:05 +00:00
c8db915142
Increased base font size and switched to Inter, Victor Mono and Zen Kaku Gothic New.
You'll likely run into some jank with this update, and this is also the first in a series of visual overhauls to come.

I've been wanting to increase the base font size from 12px to 16px for a while now but never actually got around to it until getting really tired of the limits imposed on me by Verdana.
It will require some getting used to, even for me, though!
The only thing that really stands out is that big walls of text like news and forum posts are a bit bigger and actually have a non-claustrophobic amount of spacing inbetween them.

My efforts to avoid shoving too much spacing into things have severely backfired into making me afraid to introduce any in the first place.
Personally, I think this reads a lot nicer!

Verdana won't be gone for good though.
Once enough of the API is ready it will be featured on the Flashii Fundamentals for Legacy PCs subsite!!
2025-06-16 20:52:25 +00:00
a0e719c2d1
Updated libraries. 2025-06-12 20:17:54 +00:00
d8dbfaa7ab
Added leeway to the device code token polling process. 2025-05-18 15:55:06 +00:00
4e66852db1
Fixed tag script, potentially. 2025-05-13 17:28:26 +00:00
40a96029ff
Switched to the railgun/jwt library. 2025-05-13 17:27:04 +00:00
dd8ec7c8dd
Cleaned up forum templates. 2025-04-24 19:17:38 +00:00
5ec7dddd0e
Fixed categories without topics not being browseable. 2025-04-24 18:40:41 +00:00
af476491b2
Made OAuth2 IDs snowflakes and also removed the client_id field. 2025-04-24 00:17:35 +00:00
c91fa69362
Altered default token lifetimes and also made them configurable. 2025-04-23 21:56:33 +00:00
093266eb1e
Allow access and refresh tokens to not be associated with an app. 2025-04-23 21:24:02 +00:00
d9cf9674f3
Check for empty array. 2025-04-22 22:20:13 +00:00
e1155158d9
Should probably also bump the version. 2025-04-22 21:58:24 +00:00
86578c9ff4
Forgot to update the migration, oops. 2025-04-22 21:58:07 +00:00
3bd556fba9
Added chat server selection endpoints. 2025-04-22 21:55:51 +00:00
52632b42eb
Fixed oversights. 2025-04-22 21:10:47 +00:00
ca2c192330
Added new token/login endpoints for chat. 2025-04-22 20:16:55 +00:00
85c71f604a
Use URI instead of URL in the API.
URL equivalent of a field can still be requested using the fields parameter for the existing routes.
2025-04-22 18:33:47 +00:00
1d57fc3b45
Added kaomoji list to the database. 2025-04-21 01:25:02 +00:00
45635ddc5b
Updated libraries. 2025-04-21 00:52:00 +00:00
d675f1410f
Ported removeChild util. 2025-04-13 00:46:51 +00:00
a6b3cef7b4
Fixed incorrect path being used for CORS credentials check. 2025-04-12 21:15:14 +00:00
4b4ae1c820
Added Cache-Control rules for existing APIs. 2025-04-12 20:33:44 +00:00
d15e074674
Use --env-file-if-exists instead. 2025-04-11 19:28:57 +00:00
c7dc5de306
That should've been install, not update. 2025-04-11 19:02:37 +00:00
e8dcd5b878
Removed push. 2025-04-11 18:59:15 +00:00
4da099ca74
Use make for calling various scripts correctly. 2025-04-11 18:57:13 +00:00
0d8283495d
Allow filtering to a specific type of asset task. 2025-04-11 18:15:50 +00:00
99e3e3111a
Share .env file with the NodeJS build script. 2025-04-11 18:02:38 +00:00
35dce01323
Fixed authentication oversights. 2025-04-03 20:35:57 +00:00
277afa5b19
Removed SameSite=Strict. 2025-04-03 20:26:04 +00:00
55dc011df6
Also check folder permissions for the EEPROM scripts. 2025-04-03 20:09:18 +00:00
9d70505ad8
Added utility to nuke the templating cache directory. 2025-04-03 20:01:27 +00:00
155b301405
Fixed this thing being a layer up too high. 2025-04-03 19:42:43 +00:00
83068a4183
Replaced timings in the footer with a visual for the Server-Timing header. 2025-04-03 19:40:10 +00:00
ceb6bece09
Improved templating engine wrapping. 2025-04-03 14:37:19 +00:00
e4c3e4c052
Authn/z rework. 2025-03-31 15:35:24 +00:00
28be4f16c2
Added optional alphaless RGB field. 2025-03-30 19:26:54 +00:00
16a7e20441
Logging cleanup. 2025-03-28 20:19:54 +00:00
d1fad37022
Added new tables to data exports. 2025-03-28 02:05:40 +00:00
a1398fb179
Added field filtering to API endpoints and store colour presets in the database. 2025-03-28 01:47:24 +00:00
12d40e69a5
Tighter client side integrations for uploads. 2025-03-27 21:27:49 +00:00
41e27cdffa
Ensure storage folder exists. 2025-03-27 00:57:53 +00:00
104bf379b0
One day I won't forgot to bump VERSION. 2025-03-27 00:45:46 +00:00
5f6133c007
Shoved EEPROM into Misuzu. 2025-03-27 00:44:42 +00:00
0b7031959b
Removed RPCii dependency. 2025-03-25 14:28:04 +00:00
6c50a582cb
:))) 2025-03-25 14:22:28 +00:00
238bb3f48e
Updated leftovers from rebase. 2025-03-25 13:51:39 +00:00
5ba8b30047 Updated to latest Index as well as some minor bug fixes. 2025-03-25 14:27:48 +01:00
412 changed files with 11422 additions and 6496 deletions

View file

@ -6,3 +6,6 @@ insert_final_newline = true
charset = utf-8
indent_style = space
indent_size = 4
[Makefile]
indent_style = tab

View file

@ -1,3 +1,7 @@
# Enable debug mode
# Useful for debugging
MSZ_DEBUG=1
# Database connection setting
# This uses the Index library's DSN syntax
# Currently Misuzu only supports MariaDB, or Null of course since that does nothing
@ -23,3 +27,15 @@ DATABASE_DSN="null:"
# But to make things more understandable, the value for Flashii is also included
#DOMAIN_ROLES="flashii.net=main; fii.moe=redirect"
DOMAIN_ROLES="localhost=main,redirect:/go"
# Local storage path
# This determines where uploaded files are stored. If left unset, the storage folder in the project tree will be used.
#STORAGE_PATH_LOCAL="/path/to/storage"
# Remote storage path
# Path on which the storage folder is exposed to the web for NGINX.
#STORAGE_PATH_REMOTE="/_storage"
# Template cache directory
# Writeable directory path to which template files are cached.
#TEMPLATE_CACHE="/tmp/msz-tpl-cache"

2
.gitignore vendored
View file

@ -21,6 +21,8 @@
/.migrating
# Storage
/storage/*
!/storage/.gitkeep
/store
# OS specific

58
Makefile Normal file
View file

@ -0,0 +1,58 @@
PHP_EXE := $(shell which php8.4)
COMPOSER_EXE := $(shell which composer)
NODE_EXE := $(shell which node)
NPM_EXE := $(shell which npm)
SUDO_EXE := $(shell which sudo)
WWW_USER := www-data
BUILD_EXE := build.js
ENV_FILE := .env
TOOLS_DIR := tools
VENDOR_DIR := vendor
all: install migrate clear-cache build cron
install: composer_install npm_install
composer_install:
${PHP_EXE} ${COMPOSER_EXE} install
npm_install:
${NPM_EXE} ci
update: composer_update npm_update
composer_update:
${PHP_EXE} ${COMPOSER_EXE} update
npm_update:
${NPM_EXE} update --save
migrate:
${SUDO_EXE} -u ${WWW_USER} ${PHP_EXE} ${TOOLS_DIR}/migrate
clear-cache:
${SUDO_EXE} -u ${WWW_USER} ${PHP_EXE} ${TOOLS_DIR}/nuke-tpl-cache
cron:
${SUDO_EXE} -u ${WWW_USER} ${PHP_EXE} ${TOOLS_DIR}/cron slow
build:
${NODE_EXE} --env-file-if-exists ${ENV_FILE} ${BUILD_EXE}
rebuild-css:
${NODE_EXE} --env-file-if-exists ${ENV_FILE} ${BUILD_EXE} css
rebuild-js:
${NODE_EXE} --env-file-if-exists ${ENV_FILE} ${BUILD_EXE} js
rebuild-twig:
${NODE_EXE} --env-file-if-exists ${ENV_FILE} ${BUILD_EXE} twig
analyse:
${PHP_EXE} ${VENDOR_DIR}/bin/phpstan
tag: analyse
${PHP_EXE} ${TOOLS_DIR}/create-tag
.PHONY: all update composer npm build rebuild-css rebuild-js rebuild-twig migrate clear-cache cron analyse tag

View file

@ -1 +1 @@
20250325
20250617.1

View file

@ -17,8 +17,17 @@ html, body {
}
:root {
--font-regular: Verdana, Geneva, 'Dejavu Sans', Arial, Helvetica, sans-serif;
--font-monospace: Consolas, 'Liberation Mono', Menlo, Courier, monospace;
--font-regular: Inter, 'Zen Kaku Gothic New', sans-serif;
--font-monospace: 'Victor Mono', monospace;
font-feature-settings: 'calt' 1, 'dlig' 1, 'ss01' 1;
font-optical-sizing: auto;
}
@supports (font-variation-settings: normal) {
:root {
--font-regular: InterVariable, 'Zen Kaku Gothic New', sans-serif;
}
}
@include loading.css;
@include perf.css;

101
assets/common.css/perf.css Normal file
View file

@ -0,0 +1,101 @@
.msz-perfs {
position: fixed;
bottom: 4px;
left: 4px;
display: flex;
gap: 2px;
flex-direction: column-reverse;
align-items: flex-start;
opacity: .5;
}
.msz-perfs-right {
left: initial;
right: 4px;
}
.msz-perfs:hover {
opacity: 1;
}
.msz-perf {
background-color: #111d;
color: #fff;
font-family: var(--font-monospace);
font-feature-settings: 'ss07' 1;
font-size: 12px;
line-height: 20px;
padding: 4px 8px;
border-radius: 6px;
}
.msz-perfs:hover .msz-perf {
backdrop-filter: blur(10px);
}
.msz-perf-number {
color: #fff;
}
.msz-perf-unit {
color: #888;
}
.msz-perf-header {
display: flex;
flex: 0 0 auto;
gap: 4px;
}
.msz-perf:hover .msz-perf-header {
border-bottom: 1px solid #888;
margin-bottom: 2px;
}
.msz-perf-type {
flex: 0 0 auto;
font-weight: 700;
min-width: 60px;
}
.msz-perf-type-navigation {
color: #f0f;
}
.msz-perf-type-other {
color: #0ff;
}
.msz-perf-target {
flex: 1 0 auto;
min-width: 200px;
}
.msz-perf-target-host,
.msz-perf-target-path,
.msz-perf-target-query {
display: inline-block;
}
.msz-perf-target-host,
.msz-perf-target-query {
color: #888;
}
.msz-perf-total {
flex: 0 0 auto;
min-width: 80px;
text-align: right;
}
.msz-perf-timings {
display: none;
border-collapse: collapse;
width: 100%;
}
.msz-perf:hover .msz-perf-timings {
display: table;
}
.msz-perf-timing-name {
font-weight: 700;
min-width: 60px;
}
.msz-perf-timing-comment {
color: #888;
}
.msz-perf-timing-duration {
min-width: 80px;
text-align: right;
}

View file

@ -43,6 +43,24 @@ const $appendChildren = function(element, ...children) {
$appendChild(element, child);
};
const $removeChild = function(element, child) {
switch(typeof child) {
case 'function':
$removeChild(element, child());
break;
case 'object':
if(child === null)
break;
if(child instanceof Node)
element.removeChild(child);
else if(child?.element instanceof Node)
element.removeChild(child.element);
break;
}
};
const $removeChildren = function(element) {
while(element.lastChild)
element.removeChild(element.lastChild);

View file

@ -1,6 +1,8 @@
#include array.js
#include csrf.js
#include html.js
#include meta.js
#include perf.jsx
#include uniqstr.js
#include xhr.js

36
assets/common.js/meta.js Normal file
View file

@ -0,0 +1,36 @@
#include html.js
const $meta = (() => {
return {
get(name, prefixed=true) {
if(!name) return;
if(prefixed) name = `msz-${name}`;
const elem = $query(`meta[name="${name}"]`);
if(elem instanceof HTMLMetaElement && typeof elem.content === 'string')
return elem.content;
return null;
},
set(name, value, prefixed=true) {
if(!name) return;
if(prefixed) name = `msz-${name}`;
let elem = $query(`meta[name="${name}"]`);
if(elem instanceof HTMLMetaElement) {
if(typeof value === 'string')
elem.content = value;
else
elem.remove();
} else {
if(typeof value !== 'string')
return;
elem = document.createElement('meta');
elem.name = name;
elem.content = value;
document.head.appendChild(elem);
}
},
};
})();

72
assets/common.js/perf.jsx Normal file
View file

@ -0,0 +1,72 @@
#include html.js
(() => {
const perfs = <div class="msz-perfs"/>;
perfs.ondblclick = () => {
perfs.classList.toggle('msz-perfs-right');
};
const appendReal = elem => {
$appendChild(perfs, elem);
};
let append = elem => {
append = appendReal;
$appendChild(document.body, perfs);
appendReal(elem);
};
(new PerformanceObserver(list => {
for(const entry of list.getEntries()) {
if(entry.serverTiming.length < 1)
break;
const url = new URL(entry.name);
let total = 0;
let queries = -1;
const timings = <table class="msz-perf-timings"/>;
for(const timing of entry.serverTiming) {
if(timing.name === 'msz-queries') {
queries = Math.ceil(timing.duration);
continue;
}
total += timing.duration;
$appendChild(timings, <tr class="msz-perf-timing">
<td class="msz-perf-timing-name">{timing.name}</td>
<td class="msz-perf-timing-comment">{decodeURIComponent(timing.description)}</td>
<td class="msz-perf-timing-duration">
<span class="msz-perf-number">{timing.duration}</span>
<span class="msz-perf-unit">ms</span>
</td>
</tr>);
}
append(<div class="msz-perf">
<div class="msz-perf-header">
<div class={`msz-perf-type msz-perf-type-${entry instanceof PerformanceNavigationTiming ? 'navigation' : 'other'}`}>
{entry instanceof PerformanceNavigationTiming ? entry.type : (
entry.initiatorType === 'xmlhttprequest' ? 'xhr' : entry.initiatorType
)}
</div>
<div class="msz-perf-target">
{url.host !== location.host ? <div class="msz-perf-target-host">{url.host}</div> : null}
<div class="msz-perf-target-path">{url.pathname}</div>
{url.search !== '' ? <div class="msz-perf-target-query">{url.search}</div> : null}
</div>
{queries > 0 ? <div class="msz-perf-total">
<span class="msz-perf-number">{queries}</span>
{' '}
<span class="msz-perf-unit">{queries === 1 ? 'query' : 'queries'}</span>
</div> : null}
<div class="msz-perf-total">
<span class="msz-perf-number">{total.toFixed(5)}</span>
<span class="msz-perf-unit">ms</span>
</div>
</div>
{timings}
</div>);
}
})).observe({ entryTypes: ['navigation', 'resource'] });
})();

View file

@ -20,7 +20,9 @@ body {
color: #fff;
font-size: 16px;
line-height: 25px;
font-family: Verdana, Geneva, 'Dejavu Sans', Arial, Helvetica, sans-serif;
font-family: Inter, 'Zen Kaku Gothic New', sans-serif;
font-feature-settings: 'calt' 1, 'dlig' 1, 'ss01' 1;
font-optical-sizing: auto;
background-color: #8559a5;
background-color: var(--error-colour, #8559a5);
background-image: url('/images/clouds.png');
@ -30,6 +32,12 @@ body {
flex-direction: column;
}
@supports (font-variation-settings: normal) {
body {
--font-regular: InterVariable, 'Zen Kaku Gothic New', sans-serif;
}
}
.error {
display: flex;
flex-direction: column;
@ -93,8 +101,8 @@ body {
}
.error-home {
font-size: 1.5em;
line-height: 1.4em;
font-size: 1.5rem;
line-height: 1.375rem;
}
.error-nav {
@ -112,21 +120,24 @@ body {
justify-content: center;
}
.error-title {
line-height: 3rem;
}
.error-icon {
font-size: 4em;
line-height: 1.4em;
font-size: 4rem;
line-height: 1.5rem;
}
.error-blerb {
margin: 10px auto;
font-size: .9em;
line-height: 1.4em;
font-size: .875rem;
line-height: 1rem;
}
.error-footer {
text-align: center;
font-size: 12px;
line-height: 1.4em;
font-size: .75rem;
line-height: 1.375em;
color: #888;
border-top: 1px solid #444;
padding-top: 4px;

View file

@ -1,9 +1,7 @@
.input__button {
background-color: var(--background-colour);
font-family: var(--font-regular);
font-size: 1.2em;
line-height: 1.4em;
padding: 5px 10px;
padding: 4px 12px;
min-width: 80px;
text-align: center;
cursor: pointer;
@ -15,6 +13,8 @@
align-items: center;
justify-content: center;
text-decoration: none;
font-size: inherit;
line-height: inherit;
}
.input__button:hover, .input__button:active,
.input__button:focus, .input__button:checked,

View file

@ -49,6 +49,8 @@
.input__checkbox__text {
display: inline-block;
margin-left: 4px;
font-size: .875em;
line-height: 1.375em;
}
.input__checkbox--disabled {
opacity: .5;

View file

@ -4,10 +4,12 @@
background: #222;
color: #fff;
min-width: 150px;
font-size: 1.2em;
border-radius: 2px;
box-shadow: inset 0 0 4px #111;
transition: border-color .2s;
font-family: inherit;
font-size: 1em;
line-height: 1.25em;
}
.input__select:focus {
border-color: var(--accent-colour);

View file

@ -1,5 +1,4 @@
.input__text {
font-size: 1.2em;
border: 1px solid #222;
padding: 5px 10px;
background: #222;
@ -7,8 +6,11 @@
border-radius: 2px;
box-shadow: inset 0 0 4px #111;
transition: border-color .2s;
font-family: inherit;
font-size: 1em;
line-height: 1.25em;
}
.input__text:focus { border-color: var(--accent-colour); }
.input__text--readonly { color: #888; }
.input__text--monospace { font-family: var(--font-monospace); }
.input__text--monospace { font-family: var(--font-monospace); font-feature-settings: 'ss07' 1; }
.input__text--centre { text-align: center; }

View file

@ -1,11 +1,11 @@
.input__textarea {
font-size: 1.2em;
border: 1px solid #222;
padding: 5px 10px;
padding: 4px 12px;
vertical-align: bottom;
background: #222;
color: #fff;
font-family: var(--font-monospace);
font-feature-settings: 'ss07' 1;
border-radius: 2px;
box-shadow: inset 0 0 4px #111;
transition: border-color .2s;

View file

@ -10,9 +10,8 @@
}
.input__upload__selection {
text-align: center;
font-size: 1.2em;
border: 1px solid #222;
padding: 5px 10px;
padding: 4px 12px;
background: #222;
color: #fff;
border-radius: 2px;

View file

@ -43,7 +43,7 @@
.changelog__change__username {
color: inherit;
font-size: 1.4em;
font-size: 1.375em;
line-height: 1.5em;
text-decoration: none;
}
@ -52,7 +52,7 @@
}
.changelog__change__userrole {
font-size: .9em;
font-size: .875em;
line-height: 1.5em;
color: inherit;
text-decoration: none;
@ -64,15 +64,13 @@
.changelog__change__date {
color: inherit;
text-decoration: none;
font-size: 1.1em;
line-height: 1.5em;
}
.changelog__change__date:hover {
text-decoration: underline;
}
.changelog__change__text {
line-height: 1.2em;
line-height: 1.25em;
flex: 1 1 auto;
word-wrap: break-word;
overflow: hidden;

View file

@ -1,6 +1,8 @@
.changelog__entry {
display: flex;
margin: 5px;
font-size: .875em;
line-height: 1.5em;
}
.changelog__entry__info { display: flex; }
@ -68,7 +70,7 @@
.changelog__entry__tags {
display: flex;
flex-wrap: wrap;
font-size: .9em;
font-size: .75em;
line-height: 1.5em;
}

View file

@ -6,8 +6,6 @@
text-decoration: none;
padding: 1px 3px;
color: var(--accent-colour);
font-size: 1.2em;
line-height: 1.5em;
}
.changelog__listing__date:hover {
text-decoration: underline;

View file

@ -21,8 +21,8 @@
}
.changelog__log__text {
padding: 8px 12px;
font-size: 1.5em;
line-height: 1.3em;
font-size: 1.375em;
line-height: 1.25em;
align-self: center;
flex: 1 1 auto;
overflow: hidden;

View file

@ -19,7 +19,7 @@
}
.comments-form-wrap {
display: grid;
grid-template-rows: 1fr 32px;
grid-template-rows: 1fr 35px;
gap: 2px;
margin: 3px;
margin-left: 0;
@ -49,8 +49,6 @@
.comments-form-status {
flex: 1 1 auto;
font-size: 1.2em;
line-height: 1.4em;
padding: 0 6px;
overflow: hidden;
transition: color .2s;
@ -66,8 +64,8 @@
.comments-form-pin {
flex: 0 0 auto;
font-size: 1.2em;
line-height: 1.4em;
font-size: 1.25em;
line-height: 1.375em;
}
.comments-form-post {

View file

@ -3,8 +3,8 @@
justify-content: center;
align-items: center;
flex-wrap: wrap;
font-size: 1.4em;
line-height: 1.5em;
font-size: 1.25em;
line-height: 1.375em;
gap: 6px;
padding: 12px;
margin: 2px;

View file

@ -13,10 +13,12 @@
overflow: hidden;
}
.container__title__text {
font-size: 1.5em;
font-size: 1.125rem;
line-height: 1.5em;
padding: 8px 10px;
word-wrap: break-word;
font-weight: 500;
min-height: 44px;
}
.container__title__link {
color: inherit;

View file

@ -21,7 +21,7 @@
visibility: hidden;
}
.eeprom-widget-form-text {
font-size: 1.4em;
font-size: 1.325em;
line-height: 1.5em;
}
.eeprom-widget-form:focus,
@ -70,8 +70,8 @@
text-decoration: underline;
}
.eeprom-widget-file-progress {
font-size: .9em;
line-height: 1.4em;
font-size: .875em;
line-height: 1.325em;
text-align: right;
padding: 0 2px;
white-space: nowrap;

View file

@ -88,30 +88,26 @@
margin-left: 5px;
}
.embedph-info-title {
font-size: 2em !important;
font-weight: 400 !important;
line-height: 1.2em !important;
margin-bottom: 5px;
font-size: 1.5rem !important;
font-weight: 500 !important;
line-height: 1.5rem !important;
margin: 5px 0;
word-break: break-word;
margin: 0 !important;
padding: 0 !important;
border-width: 0 !important;
}
.embedph-info-desc {
line-height: 1.4em;
margin: .5em 0;
font-size: .875rem;
line-height: 1.5rem;
margin: .25rem 0;
word-break: break-word;
}
.embedph-info-site {
font-size: .9em;
line-height: 1.2em;
font-size: .75rem;
}
@media (max-width: 640px) {
.embedph-info-title {
font-size: 1.5em;
line-height: 1.2em;
}
.embedph-info-desc {
display: none;
}
@ -135,9 +131,7 @@
margin-bottom: 20px;
}
.embedph-play-external {
padding: 5px 10px;
font-size: 1.2em;
line-height: 1.5em;
padding: 4px 8px;
text-decoration: none !important;
color: var(--text-colour) !important;
background-color: var(--background-colour-translucent-6);
@ -225,6 +219,7 @@
height: 70px;
border-radius: 5px;
margin: 5px;
font-size: .75rem;
}
.aembedph:hover .aembedph-play,
.aembedph:active .aembedph-play,
@ -293,9 +288,9 @@
padding: 0 5px;
}
.aembedph-info-title {
font-size: 1.4em !important;
font-weight: 400 !important;
line-height: 1.2em !important;
font-size: 1.25em !important;
font-weight: 500 !important;
line-height: 1.25em !important;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
@ -309,10 +304,10 @@
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
font-weight: 700;
font-weight: 600;
}
.aembedph-info-album {
line-height: 1.4em;
line-height: 1.5em;
word-break: break-word;
white-space: nowrap;
overflow: hidden;
@ -321,7 +316,7 @@
}
.aembedph-info-site {
font-size: .9em;
line-height: 1.2em;
line-height: 1.25em;
}
.aembedph-play {

View file

@ -13,8 +13,8 @@
max-width: var(--site-max-width);
margin: 0 auto;
text-align: center;
font-size: .9em;
line-height: 1.5em;
font-size: .875rem;
line-height: 1.5rem;
padding: 1em 0;
}
.footer__background {

View file

@ -4,8 +4,6 @@
overflow: auto;
}
.forum__categories__empty {
font-size: 1.2em;
line-height: 1.5em;
text-align: center;
padding: 10px;
}
@ -63,8 +61,8 @@
background-size: 80px 80px;
background-image: radial-gradient(ellipse at center, rgba(255, 255, 255, .2) 0%, rgba(0, 0, 0, .4) 100%);
box-shadow: 0 1px 4px #111;
font-size: 2em;
line-height: 1.5em;
font-size: 1.5em;
line-height: 1.25em;
color: #fff;
display: flex;
justify-content: center;
@ -82,22 +80,25 @@
justify-content: center;
flex-direction: column;
line-height: 1.5em;
gap: 2px;
}
.forum__category__title {
font-size: 1.3em;
font-size: 1.125em;
line-height: 1.25em;
}
.forum__category__description,
.forum__category__subforums {
font-size: .9em;
font-size: .875em;
line-height: 1.25em;
}
.forum__category__subforums {
display: flex;
gap: 6px;
}
.forum__category__subforum {
padding: 2px;
pointer-events: initial;
color: var(--accent-colour);
text-decoration: none;
@ -125,21 +126,23 @@
}
.forum__category__stat {
font-size: .9em;
line-height: 1.3em;
font-size: .875em;
line-height: 1.25em;
opacity: .7;
pointer-events: auto;
font-feature-settings: 'ss01' 1, 'tnum' 1;
}
.forum__category__stat:first-child {
font-size: 1.5em;
font-size: 1.25em;
opacity: 1;
}
.forum__category__activity {
text-align: right;
min-width: 270px;
line-height: 1.4em;
min-width: 300px;
font-size: .875em;
line-height: 1.375em;
}
.forum__category__activity__none,
.forum__category__activity__details {
@ -160,7 +163,7 @@
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 200px;
max-width: 230px;
}
.forum__category__activity__post:hover,
.forum__category__activity__post:focus {
@ -194,7 +197,7 @@
flex-wrap: wrap;
}
.forum__category__details {
flex-basis: calc(100% - 100px);
flex-basis: calc(100% - 8em); /* god knows what this does */
}
.forum__category__stats {
min-width: initial;

View file

@ -7,8 +7,8 @@
}
.forum__header__title {
font-size: 2em;
line-height: 1.5em;
font-size: 1.5em;
line-height: 1.25em;
color: inherit;
text-decoration: none;
padding: 0 5px;
@ -28,19 +28,18 @@
margin: 0;
box-shadow: initial;
font-size: 1em;
font-family: inherit;
font-family: var(--font-regular);
}
.forum__header__breadcrumbs {
display: flex;
font-size: 1.1em;
line-height: 1.5em;
align-items: center;
}
.forum__header__breadcrumb {
color: var(--accent-colour);
text-decoration: none;
padding: 2px 5px;
padding: 2px 6px;
}
.forum__header__breadcrumb:hover {
text-decoration: underline;
@ -48,7 +47,7 @@
.forum__header__breadcrumb__separator {
color: var(--accent-colour);
margin: 0 4px;
font-size: .9em;
font-size: .875em;
}
.forum__header__actions {

View file

@ -36,14 +36,13 @@
.forum__leaderboard__user {
margin: 2px 0;
font-size: 1.2em;
}
.forum__leaderboard__user--rank-1 {
font-size: 1.6em;
font-size: 1.5em;
}
.forum__leaderboard__user--rank-2,
.forum__leaderboard__user--rank-3 {
font-size: 1.4em;
font-size: 1.25em;
}
.forum__leaderboard__user__background {
@ -69,6 +68,7 @@
justify-content: center;
font-weight: 700;
flex: 0 0 auto;
font-feature-settings: 'ss01' 1, 'tnum' 1;
}
.forum__leaderboard__user__rank:before {
content: "#";

View file

@ -22,8 +22,8 @@
}
.forum__post__details {
font-size: .9em;
line-height: 1.7em;
font-size: .875em;
line-height: 1.75em;
padding: 0 2px;
display: flex;
justify-content: space-between;
@ -36,6 +36,9 @@
color: inherit;
text-decoration: none;
}
.forum__post__id {
font-feature-settings: 'ss01' 1, 'tnum' 1;
}
.forum__post__datetime:hover,
.forum__post__datetime:focus,
.forum__post__id:hover,
@ -47,7 +50,7 @@
.forum__post__text {
padding: 2px;
line-height: 1.4em;
line-height: 1.5em;
flex: 1 1 auto;
}
.forum__post__text--edit {
@ -97,14 +100,14 @@
}
.forum__post__posts-count {
font-size: .9em;
margin-left: 4px;
font-size: .75em;
margin-left: 8px;
}
.forum__post__joined {
flex: 1 1 auto;
max-width: 170px;
font-size: .9em;
font-size: .75em;
justify-self: flex-end;
}
@ -117,7 +120,7 @@
.forum__post__username {
color: inherit;
font-size: 1.4em;
font-size: 1.25em;
line-height: 2em;
text-decoration: none;
}
@ -127,8 +130,8 @@
}
.forum__post__usertitle {
font-size: .9em;
line-height: 1.5em;
font-size: .75em;
line-height: 1.25em;
margin-bottom: 4px;
}
@ -187,12 +190,13 @@
.forum__post__badge {
background-color: var(--accent-colour);
border-radius: 12px;
border-radius: 24px;
width: 100%;
padding: 2px;
box-shadow: 0 2px 3px #000A;
margin: 4px;
overflow: hidden;
font-size: .875em;
}
.forum__post__badge__desktop {
display: block;
@ -207,13 +211,11 @@
}
.forum__post__text {
margin: 4px;
font-size: 1.2em;
line-height: 1.3em;
}
.forum__post__info {
flex-direction: row;
margin: 0;
padding: 5px;
padding: 4px;
}
.forum__post__info__content {
width: 100%;
@ -252,8 +254,8 @@
padding: 2px 10px;
margin: 0;
align-self: flex-start;
margin-left: 5px;
font-size: .9em;
margin-left: 10px;
font-size: .875em;
}
.forum__post__badge__desktop {
display: none;

View file

@ -12,7 +12,7 @@
display: flex;
justify-content: center;
align-items: center;
font-size: 2em;
font-size: 1.5em;
padding-bottom: 1px;
}
.forum__status__icon__background {

View file

@ -4,8 +4,6 @@
overflow: auto;
}
.forum__topics__empty {
font-size: 1.2em;
line-height: 1.5em;
text-align: center;
padding: 10px;
}
@ -76,7 +74,7 @@
background-size: 60px 60px;
background-image: radial-gradient(ellipse at center, rgba(255, 255, 255, .2) 0%, rgba(0, 0, 0, .4) 100%);
box-shadow: 0 1px 4px #111;
font-size: 1.5em;
font-size: 1.125em;
line-height: 1.5em;
color: #fff;
display: flex;
@ -114,14 +112,15 @@
}
.forum__topic__title {
font-size: 1.3em;
font-size: 1.125em;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.forum__topic__info {
font-size: .9em;
font-size: .875em;
line-height: 1.25em;
}
.forum__topic__stats,
@ -137,14 +136,15 @@
}
.forum__topic__stat {
font-size: .9em;
line-height: 1.3em;
font-size: .875em;
line-height: 1.25em;
opacity: .7;
pointer-events: auto;
cursor: default;
font-feature-settings: 'ss01' 1, 'tnum' 1;
}
.forum__topic__stat:first-child {
font-size: 1.4em;
font-size: 1.25em;
opacity: 1;
}
@ -153,7 +153,7 @@
align-items: center;
text-align: right;
min-width: 200px;
line-height: 1.5em;
line-height: 1.25em;
}
.forum__topic__activity__details {
display: flex;
@ -198,8 +198,9 @@
.forum__topic__pagination {
display: flex;
align-items: center;
font-size: .9em;
line-height: 1.2em;
font-size: .875em;
line-height: 1.25em;
font-feature-settings: 'ss01' 1, 'tnum' 1;
}
.forum__topic__pagination__separator {
margin: 0 8px;
@ -209,7 +210,7 @@
text-decoration: none;
pointer-events: initial;
margin: 0 1px;
padding: 2px 4px;
padding: 3px;
border-radius: 2px;
min-width: 25px;
height: 25px;
@ -262,8 +263,8 @@
.forum__topic__pagination__item {
min-width: 30px;
height: 30px;
line-height: 26px;
font-size: 1.2em;
line-height: 1.375em;
font-size: 1.25em;
}
}

View file

@ -69,8 +69,7 @@
}
.header__desktop__menu__link {
margin: var(--header-link-margin) 0;
font-size: 1.2em;
padding: 6px 10px;
padding: 4px 10px;
text-align: center;
}
@ -86,6 +85,8 @@
}
.header__desktop__submenu__link {
margin: 5px;
font-size: .875em;
line-height: 1.5em;
}
.header__desktop__submenu__background {
background: var(--header-accent-colour);
@ -128,8 +129,8 @@
margin: 2px;
color: inherit;
text-decoration: none;
font-size: 1.5em;
line-height: 32px;
font-size: 1.125rem;
line-height: 2rem;
width: 32px;
height: 32px;
transition: background-color .2s;
@ -149,8 +150,8 @@
top: -5px;
right: -3px;
z-index: 1;
font-size: .5em;
line-height: 1.4em;
font-size: .625rem;
line-height: 1.375rem;
text-align: right;
padding: 2px 2px 0;
border-radius: 4px;
@ -158,7 +159,8 @@
opacity: .9;
border-radius: 4px;
line-height: 12px;
padding: 2px 4px;
padding: 2px 3px;
font-feature-settings: 'ss01' 1, 'tnum' 1;
}
/** MOBILE HEADER **/
@ -186,18 +188,12 @@
.header__mobile__icon {
flex: 0 0 auto;
cursor: pointer;
font-size: 32px;
font-size: 1.5rem;
width: var(--header-icon-px);
height: var(--header-icon-px);
display: flex;
justify-content: center;
align-items: center;
-webkit-touch-callout: none !important;
-webkit-user-select: none !important;
-khtml-user-select: none !important;
-moz-user-select: none !important;
-ms-user-select: none !important;
user-select: none !important;
}
@ -227,7 +223,7 @@
background: var(--background-pattern);
background-color: var(--header-accent-colour);
background-blend-mode: multiply;
transition: max-height .2s;
transition: max-height .3s;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);
max-height: 0;
overflow: hidden;
@ -237,7 +233,7 @@
}
.header__mobile__toggle:checked ~ .header__mobile__menu {
max-height: 600px;
max-height: 100vh;
}
.header__mobile__user {
@ -255,24 +251,23 @@
color: inherit;
text-decoration: none;
display: block;
padding: 8px;
padding-left: 20px;
padding: 6px;
padding-left: 24px;
cursor: pointer;
border-radius: 2px;
transition: background-color .2s, margin .1s, opacity .1s;
font-size: 1.2em;
}
.header__mobile__link:not(:last-child) {
margin-bottom: 2px;
}
.header__mobile__link--primary {
font-size: 1.5em;
padding: 10px;
font-size: 1.25rem;
padding: 8px;
}
.header__mobile__link--user {
margin: 2px;
font-size: 1.5em;
padding: 10px;
font-size: 1.25rem;
padding: 8px;
}
.header__mobile__link:hover,
.header__mobile__link:focus {

View file

@ -2,8 +2,8 @@ pre code.hljs {
display: block;
overflow-x: auto;
padding: 1em;
font-size: 1.2em;
font-family: var(--font-monospace);
font-feature-settings: 'ss07' 1;
}
code.hljs {

View file

@ -46,8 +46,8 @@
.landingv2-footer-copyright {
text-align: right;
line-height: 1.8em;
font-size: .9em;
line-height: 1.5em;
font-size: .875em;
align-self: flex-end;
}

View file

@ -52,8 +52,8 @@
display: flex;
align-items: center;
min-height: 70px;
font-size: 1.4em;
padding: 10px 16px;
font-size: 1.5em;
padding: 8px 16px;
grid-column: 1;
}
.landingv2-header-menu-link:hover,

View file

@ -13,7 +13,6 @@
display: flex;
align-items: center;
margin: 10px;
text-shadow: 0 1px 4px #000;
}
.landingv2-stat-icon {
font-size: 4em;
@ -25,6 +24,7 @@
}
.landingv2-stat-value-num {
font-weight: 700;
font-feature-settings: 'ss01' 1, 'tnum' 1;
}
.landingv2-forum {
@ -37,7 +37,6 @@
.landingv2-forum-topics {
background-color: var(--container-colour);
box-shadow: 0 1px 2px #0009;
text-shadow: 0 1px 4px #000;
overflow: hidden;
word-wrap: break-word;
}
@ -95,7 +94,7 @@
background-size: 60px 60px;
background-image: radial-gradient(ellipse at center, rgba(255, 255, 255, .2) 0%, rgba(0, 0, 0, .4) 100%);
box-shadow: 0 1px 4px #111;
font-size: 1.5em;
font-size: 1.25em;
line-height: 1.5em;
color: #fff;
display: flex;
@ -110,34 +109,35 @@
display: flex;
justify-content: center;
flex-direction: column;
line-height: 1.6em;
line-height: 1.625em;
overflow: hidden;
}
.landingv2-forum-topic-info-details-title {
font-size: 1.3em;
font-size: 1.25em;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.landingv2-forum-topic-info-stats {
font-size: .9em;
font-size: .875em;
display: flex;
flex: 0 0 auto;
text-align: center;
min-width: 60px;
flex-direction: column;
font-feature-settings: 'ss01' 1, 'tnum' 1;
}
.landingv2-forum-topic-info-stats-posts,
.landingv2-forum-topic-info-stats-views {
font-size: .9em;
line-height: 1.3em;
font-size: .875em;
line-height: 1.25em;
opacity: .7;
pointer-events: auto;
cursor: default;
}
.landingv2-forum-topic-info-stats-posts {
font-size: 1.4em;
font-size: 1.25em;
opacity: 1;
}
@ -150,7 +150,6 @@
.landingv2-news-post {
background-color: var(--container-colour);
box-shadow: 0 1px 2px #0009;
text-shadow: 0 1px 4px #000;
overflow: hidden;
word-wrap: break-word;
padding: 0 10px 10px 10px;
@ -167,7 +166,6 @@
.landingv2-online {
background-color: var(--container-colour);
box-shadow: 0 1px 2px #0009;
text-shadow: 0 1px 4px #000;
margin: 4px 0;
}
.landingv2-online-users {

View file

@ -37,7 +37,6 @@
height: 30px;
line-height: 29px;
text-align: center;
font-size: 1.5em;
background-color: #222d;
display: block;
color: var(--text-colour);

View file

@ -57,13 +57,10 @@
width: 45%;
padding: 4px 0;
}
.landing__statistic__name {
font-size: 1.3em;
line-height: 2em;
}
.landing__statistic__value {
font-size: 1.5em;
line-height: 1.5em;
font-size: 1.25em;
line-height: 1.625em;
font-feature-settings: 'ss01' 1, 'tnum' 1;
}
.landing__latest {
@ -91,13 +88,13 @@
padding-left: 8px;
}
.landing__latest__username {
font-size: 1.5em;
line-height: 1.4em;
font-size: 1.25em;
line-height: 1.375em;
color: var(--user-colour);
}
.landing__latest__joined {
font-size: .9em;
line-height: 1.2em;
font-size: .875em;
line-height: 1.25em;
}
@media (max-width: 800px) {

View file

@ -1,6 +1,6 @@
:root {
--font-size: 12px;
--line-height: 20px;
--font-size: 16px;
--line-height: 25px;
--site-max-width: 1200px;
--site-mobile-width: 800px;

View file

@ -9,10 +9,10 @@
flex: 1 1 auto;
}
.manage__description {
font-size: .9em;
font-size: .875em;
margin: 1px 2px;
border-bottom: 1px solid var(--accent-colour);
padding: 2px 5px;
padding: 2px 4px;
}
@media (max-width: 800px) {

View file

@ -4,13 +4,13 @@
}
.manage__ban__title {
font-size: 1.4em;
font-size: 1.25em;
line-height: 1.5em;
padding: 0 4px;
}
.manage__ban__desc {
font-size: .9em;
font-size: .875em;
line-height: 1.5em;
font-style: italic;
border-bottom: 1px solid var(--accent-colour);

View file

@ -107,7 +107,7 @@
border-top: 1px solid var(--accent-colour);
}
.manage__bans__item__reason__title {
font-size: .9em;
font-size: .875em;
line-height: 1.5em;
font-style: italic;
}
@ -117,6 +117,6 @@
}
.manage__bans__item__noreason {
font-size: .9em;
font-size: .875em;
font-style: italic;
}

View file

@ -13,7 +13,8 @@
.manage__blacklist__textarea {
margin: 0;
padding: 5px 10px;
font-family: monospace;
font-family: var(--font-monospace);
font-feature-settings: 'ss07' 1;
width: 100%;
min-width: 100%;
max-width: 100%;

View file

@ -4,13 +4,11 @@
.manage__navigation__links {
display: flex;
flex-direction: column;
font-size: 1.2em;
}
.manage__navigation__link {
color: inherit;
text-decoration: none;
padding: 2px 5px;
margin-bottom: 2px;
padding: 2px 8px;
}
.manage__navigation__link:hover {
text-decoration: underline;

View file

@ -17,11 +17,11 @@
.manage__note__title {
flex-grow: 1;
flex-shrink: 1;
font-size: 1.4em;
line-height: 1.3em;
font-size: 1.375em;
line-height: 1.25em;
}
.manage__note__title__text {
padding: 2px 5px;
padding: 2px 6px;
}
.manage__note__title input {
width: 100%;
@ -73,7 +73,7 @@
.manage__note__nobody {
text-align: center;
font-size: .9em;
font-size: .875em;
font-style: italic;
}

View file

@ -24,9 +24,9 @@
.manage__notes__item__title {
flex-grow: 1;
flex-shrink: 1;
font-size: 1.4em;
line-height: 1.3em;
padding: 2px 5px;
font-size: 1.25em;
line-height: 1.25em;
padding: 2px 6px;
}
.manage__notes__item__title a {
color: inherit;
@ -96,7 +96,7 @@
.manage__notes__item__nobody {
text-align: center;
font-size: .9em;
font-size: .875em;
font-style: italic;
}

View file

@ -49,7 +49,7 @@
justify-content: center;
width: 100%;
height: 100%;
font-size: 1.5em;
font-size: 1.25em;
transition: background-color .2s;
}
.manage__role-item__icon__background {
@ -73,14 +73,9 @@
flex: 1 1 auto;
}
.manage__role-item__name {
font-size: 1.4em;
line-height: 1.4em;
}
.manage__role-item__details {
font-size: .9em;
line-height: 1.3em;
font-size: .875em;
line-height: 1.25em;
display: inline-flex;
align-items: center;
padding: 1px 0;
@ -90,11 +85,11 @@
border-radius: 10px;
background-color: var(--accent-colour);
box-shadow: 0 1px 4px #111;
padding: 2px 5px;
padding: 2px 6px;
}
.manage__role-item__title {
padding: 2px 5px;
padding: 2px 6px;
}
.manage__role-item__actions {

View file

@ -27,6 +27,7 @@
}
.manage-list-setting-key-text {
font-family: var(--font-monospace);
font-feature-settings: 'ss07' 1;
}
.manage-list-setting-type {
@ -53,7 +54,7 @@
border-radius: 5px;
font-weight: 700;
padding: 0 5px;
font-size: .9em;
font-size: .75em;
display: inline-block;
}
@ -63,6 +64,7 @@
}
.manage-list-setting-value-text {
font-family: var(--font-monospace);
font-feature-settings: 'ss07' 1;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;

View file

@ -1,20 +1,21 @@
.manage__statistic {
border: 1px solid var(--accent-colour);
border-radius: 2px;
padding: 2px 5px;
padding: 2px 6px;
}
.manage__statistic__name {
font-size: 1.1em;
font-size: 1.125em;
line-height: 1.5em;
}
.manage__statistic__value {
text-align: right;
font-size: 1.4em;
font-size: 1.375em;
line-height: 1.5em;
font-feature-settings: 'ss01' 1, 'tnum' 1;
}
.manage__statistic__updated {
text-align: right;
font-size: .9em;
font-size: .75em;
font-style: italic;
line-height: 1.5em;
}

View file

@ -57,25 +57,26 @@
}
.manage__user-item__name {
font-size: 1.4em;
line-height: 1.4em;
font-size: 1.125em;
line-height: 1.5em;
max-width: 600px; /* whatever */
}
.manage__user-item__details {
font-size: .9em;
line-height: 1.3em;
font-size: .875em;
line-height: 1.25em;
display: inline-flex;
align-items: center;
}
.manage__user-item__detail {
border-radius: 10px;
border-radius: 16px;
background-color: var(--accent-colour);
box-shadow: 0 1px 4px #111;
padding: 3px 8px;
padding: 2px 8px;
pointer-events: initial;
margin: 2px;
font-feature-settings: 'ss01' 1, 'tnum' 1;
}
.manage__user-item__actions {
@ -88,7 +89,7 @@
width: 32px;
height: 32px;
line-height: 32px;
font-size: 1.5em;
font-size: 1.25em;
border-radius: 2px;
margin: 5px;
margin-right: 0;

View file

@ -4,13 +4,13 @@
}
.manage__warning__title {
font-size: 1.4em;
font-size: 1.25em;
line-height: 1.5em;
padding: 0 4px;
}
.manage__warning__desc {
font-size: .9em;
font-size: .875em;
line-height: 1.5em;
font-style: italic;
border-bottom: 1px solid var(--accent-colour);

View file

@ -1,5 +1,5 @@
.markdown {
line-height: 1.7em;
line-height: 1.5em;
}
.markdown a {
@ -78,8 +78,7 @@
.markdown h1, .markdown h2,
.markdown h3, .markdown h4,
.markdown h5, .markdown h6 {
margin-top: calc(var(--font-size) * 1.2);
margin-bottom: var(--font-size);
margin: calc(var(--font-size) * 0.875) 0;
font-weight: 700;
line-height: 1em;
}

View file

@ -3,8 +3,6 @@
align-items: center;
height: 30px;
margin: 1px;
font-size: 1.3em;
line-height: 1.4em;
color: #fff;
text-decoration: none;
transition: background-color .1s;
@ -12,6 +10,7 @@
border: 0;
background-color: inherit;
text-align: left;
font-size: 1rem;
}
.messages-actions-item:hover,
.messages-actions-item:focus {

View file

@ -10,8 +10,6 @@
}
.messages-entry-header {
display: flex;
font-size: 1.1em;
line-height: 1.6em;
border-bottom: 2px solid #9999;
gap: 2px;
}
@ -60,12 +58,12 @@
align-self: flex-end;
}
.messages-entry-subject {
line-height: 1.4em;
line-height: 1.5em;
color: #fff;
overflow: hidden;
}
.messages-entry-preview {
line-height: 1.4em;
line-height: 1.5em;
color: #888;
overflow: hidden;
}

View file

@ -25,7 +25,7 @@
margin: 10px;
}
.messages-folder-notice-text {
font-size: 1.4em;
font-size: 1.375em;
line-height: 1.5em;
}
.messages-folder .pagination {

View file

@ -6,7 +6,7 @@
}
.messages-message-snippet {
cursor: pointer;
font-size: .9em;
font-size: .875em;
line-height: 1.5em;
color: #888;
gap: 5px;
@ -117,7 +117,7 @@
}
.messages-message-body {
line-height: 1.4em;
line-height: 1.5em;
}
.messages-message-body p:first-child {
margin-top: 0 !important;
@ -131,5 +131,5 @@
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
line-height: 1.4em;
line-height: 1.5em;
}

View file

@ -9,7 +9,7 @@
display: flex;
color: inherit;
text-decoration: none;
font-size: 1.5em;
font-size: 1.25em;
line-height: 32px;
height: 32px;
transition: background-color .2s;

View file

@ -44,7 +44,7 @@
.news__post__username {
color: inherit;
font-size: 1.4em;
font-size: 1.25em;
line-height: 1.5em;
text-decoration: none;
}
@ -53,14 +53,14 @@
}
.news__post__date {
font-size: 1.1em;
font-size: .875em;
line-height: 1.5em;
}
.news__post__category {
color: inherit;
text-decoration: none;
font-size: 1.1em;
font-size: 1.125em;
line-height: 1.5em;
margin: 6px 0;
}
@ -69,7 +69,6 @@
}
.news__post__text {
line-height: 1.2em;
flex: 1 1 auto;
word-wrap: break-word;
overflow: hidden;
@ -101,4 +100,4 @@
width: 50px;
height: 50px;
}
}
}

View file

@ -23,8 +23,8 @@
}
.news__preview__title h1 {
font-size: 2em;
line-height: 1.5em;
font-weight: 700;
line-height: 1.375em;
}
.news__preview__attrs {
@ -32,7 +32,7 @@
flex-shrink: 0;
display: flex;
gap: 4px;
font-size: .9em;
font-size: .875em;
}
.news__preview__attr {
@ -62,7 +62,7 @@
}
.news__preview__content {
line-height: 1.4em;
line-height: 1.5em;
word-wrap: break-word;
overflow: hidden;
}
@ -73,5 +73,5 @@
}
.news__preview__link {
font-size: .9em;
font-size: .875em;
}

View file

@ -23,9 +23,7 @@
.pagination__link {
display: flex;
min-width: 40px;
font-size: 1.2em;
line-height: 1.5em;
padding: 3px 10px 4px;
min-height: 36px;
text-align: center;
text-decoration: none;
background-color: var(--background-colour);
@ -37,13 +35,17 @@
align-items: center;
justify-content: center;
flex: 1 0 auto;
font-feature-settings: 'ss01' 1, 'tnum' 1;
}
.pagination__link:not(:last-child) { margin-right: 1px; }
.pagination__link--disabled { --accent-colour: #555; }
.pagination__link--first, .pagination__link--last,
.pagination__link--next, .pagination__link--prev {
padding-top: 5px;
.pagination__link:not(:last-child) {
margin-right: 1px;
}
.pagination__link--disabled {
--accent-colour: #555;
}
.pagination__link--current,
.pagination__link:not(.pagination__link--disabled):hover,
.pagination__link:not(.pagination__link--disabled):active,
@ -53,5 +55,7 @@
}
@media (max-width: 800px) {
.pagination__section--pages { display: none; }
.pagination__section--pages {
display: none;
}
}

View file

@ -6,12 +6,12 @@
.permissions__line {
display: flex;
font-size: .9em;
line-height: 1.7em;
font-size: .8rem;
line-height: 1.5rem;
}
.permissions__line--header {
font-size: 1.2em;
line-height: 1.4em;
font-size: 1rem;
line-height: 1.25rem;
border-bottom: 1px solid rgba(255, 255, 255, .1);
padding-bottom: 1px;
font-weight: 700;

View file

@ -1,30 +1,26 @@
.profile__accounts__content {
display: flex;
flex-direction: column;
padding: 2px 5px;
padding: 2px 6px;
}
.profile__accounts__item {
padding-bottom: 5px;
padding-bottom: 4px;
}
.profile__accounts__item:not(:last-child) {
border-bottom: 1px solid #222;
}
.profile__accounts__notice {
font-size: 1.2em;
line-height: 1.5em;
text-align: center;
padding: 10px;
}
.profile__accounts__title {
font-size: .9em;
line-height: 1.8em;
font-size: .875em;
line-height: 1.5em;
}
.profile__accounts__value {
font-size: 1.2em;
line-height: 1.2em;
color: inherit;
text-decoration: none;
}

View file

@ -1,5 +1,5 @@
.profile__birthdate__content {
padding: 2px 5px;
padding: 2px 6px;
}
.profile__birthdate__select {
min-width: auto;
@ -8,6 +8,6 @@
display: inline-block;
}
.profile__birthdate__title {
font-size: .9em;
line-height: 1.8em;
font-size: .875em;
line-height: 1.75em;
}

View file

@ -7,14 +7,14 @@
}
.profile__forum-activity__leader {
font-size: .9em;
margin: 0 5px;
font-size: .875em;
margin: 0 4px;
}
.profile__forum-activity .forum__category__icon {
width: 30px;
height: 30px;
font-size: 1.5em;
font-size: 1.25em;
line-height: 1.5em;
flex: 0 0 30px;
}

View file

@ -14,20 +14,18 @@
padding: 1px;
}
.profile__guidelines__line--header {
font-size: 1.2em;
line-height: 1.5em;
font-weight: 700;
font-weight: 600;
margin-bottom: 2px;
border-bottom: 1px solid var(--accent-colour);
padding-bottom: 2px;
}
.profile__guidelines__line:not(.profile__guidelines__line--header) {
margin-left: 1.3em;
margin-left: 1.25em;
list-style: square;
}
.profile__guidelines__emphasis {
font-weight: 700;
font-weight: 600;
}
.profile__guidelines__link {

View file

@ -101,12 +101,11 @@
min-width: 130px;
}
.profile__header__stat__name {
font-size: .9em;
font-variant: small-caps;
font-size: .875em;
cursor: inherit;
}
.profile__header__stat__value {
font-size: 1.3em;
font-size: 1.125em;
text-align: right;
cursor: inherit;
display: block;
@ -114,6 +113,9 @@
.profile__header__stat--date .profile__header__stat__value {
text-align: left;
}
.profile__header__stat:not(.profile__header__stat--date) .profile__header__stat__value {
font-feature-settings: 'ss01' 1, 'tnum' 1;
}
.profile__header__stat--link {
cursor: pointer;
}
@ -122,17 +124,18 @@
.profile__header__stat--link:focus,
.profile__header__stat--link:active,
.profile__header__stat--active {
padding-bottom: 8px;
border-bottom: 2px solid var(--accent-colour);
}
.profile__header__username {
font-size: 2em;
line-height: 1.5em;
font-size: 1.75em;
line-height: 1.125em;
}
.profile__header__title {
font-size: .9em;
line-height: 1.2em;
font-size: .875em;
line-height: 1.25em;
}
.profile__header__country {
@ -140,9 +143,9 @@
align-items: center;
}
.profile__header__country__name {
font-size: .9em;
font-size: .875em;
margin-left: 4px;
line-height: 1.2em;
line-height: 1.25em;
}
@media (max-width: 800px) {

View file

@ -12,15 +12,15 @@
}
.profile__warnings__datetime {
font-size: .9em;
font-size: .875em;
line-height: 1.5em;
font-style: italic;
padding-top: 2px;
}
.profile__warnings__body {
padding: 0 5px;
padding: 0 6px;
}
.profile__warnings__body p {
line-height: 1.4em;
line-height: 1.375em;
}

View file

@ -11,7 +11,6 @@
overflow: hidden;
border: 1px solid transparent;
border-radius: 5px;
font-size: 1.1em;
margin: 1px 1px 1px 0;
}
@ -33,5 +32,5 @@
}
.search__category__content {
padding: 2px 5px;
padding: 2px 6px;
}

View file

@ -4,7 +4,8 @@
overflow: hidden;
border: 1px solid transparent;
border-radius: 5px;
font-size: 1.5em;
font-family: var(--font-regular);
font-size: 1.125em;
}
.search__input__background {
background-color: var(--background-colour-translucent-9);
@ -24,7 +25,7 @@
border: 0;
background-color: transparent;
color: #fff;
padding: 5px 10px;
padding: 4px 12px;
font-size: inherit;
}

View file

@ -6,7 +6,7 @@
height: 60px;
line-height: 60px;
text-align: center;
font-size: 3em;
font-size: 2.5em;
flex: 0 0 auto;
}
.search__none__content {
@ -16,6 +16,6 @@
flex: 1 1 auto;
}
.search__none__title {
font-size: 1.5em;
line-height: 1.5em;
font-size: 1.25em;
line-height: 1.25em;
}

View file

@ -22,7 +22,7 @@
.settings__account-log__important {
display: flex;
align-items: center;
font-size: 1.4em;
font-size: 1.25em;
z-index: 2;
}

View file

@ -18,8 +18,8 @@
}
.settings__account__title {
font-size: .9em;
line-height: 1.8em;
font-size: .875em;
line-height: 1.75em;
}
.settings__account__input {
@ -43,4 +43,4 @@
.settings__account__section {
grid-column: 1 / 1;
}
}
}

View file

@ -2,7 +2,7 @@
margin: 4px;
}
.settings__login-attempts__none {
padding: 2px 5px;
padding: 2px 6px;
text-align: center;
}
@ -31,7 +31,7 @@
.settings__login-attempt__important {
display: flex;
align-items: center;
font-size: 1.4em;
font-size: 1.25em;
z-index: 2;
}

View file

@ -22,8 +22,7 @@
}
.settings__role__name {
font-size: 1.2em;
line-height: 1.7em;
line-height: 1.5em;
padding: 0 5px;
margin: 2px 0;
min-width: 160px;
@ -40,8 +39,8 @@
}
.settings__role__description {
font-size: .9em;
line-height: 1.8em;
font-size: .875em;
line-height: 1.75em;
padding: 0 2px;
margin: 0 2px;
flex: 1 1 auto;
@ -50,7 +49,7 @@
.settings__role__options {
flex: 0 0 auto;
display: flex;
font-size: 1.5em;
font-size: 1.25em;
justify-content: space-evenly;
}

View file

@ -29,7 +29,7 @@
.settings__session__important {
display: flex;
align-items: center;
font-size: 1.4em;
font-size: 1.25em;
z-index: 2;
}

View file

@ -6,10 +6,13 @@
}
.settings__description {
font-size: .9em;
padding: 2px 5px;
font-size: .875rem;
line-height: 1.25rem;
border-bottom: 1px solid var(--accent-colour);
margin: 1px 1px 2px;
padding: 2px 6px;
}
.settings__description p {
margin: .25rem 0;
}
.settings__pagination {
@ -39,7 +42,7 @@
display: block;
padding: 4px;
margin: 2px;
font-size: 1.5em;
font-size: 1.25em;
line-height: 1.5em;
border-radius: 2px;
transition: background-color .2s;
@ -62,4 +65,4 @@
display: inline-block;
padding: 4px 10px;
}
}
}

View file

@ -17,9 +17,9 @@
.settings__two-factor__code__text {
color: #000;
flex: 0 0 auto;
font-size: 1.2em;
line-height: 1.5em;
padding: 2px 6px;
font-family: var(--font-monospace);
font-feature-settings: 'ss07' 1;
}
.settings__two-factor__settings {
@ -30,7 +30,7 @@
flex: 1 1 auto;
}
.settings__two-factor__settings__status {
font-size: 1.5em;
font-size: 1.25em;
line-height: 2em;
}

View file

@ -51,16 +51,16 @@
}
.usercard__details__username {
font-size: 1.4em;
line-height: 1.4em;
font-size: 1.125em;
line-height: 1.5em;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.usercard__details__title {
font-size: .9em;
line-height: 1.2em;
font-size: .75em;
line-height: 1em;
}
.usercard__details__country {
@ -68,9 +68,9 @@
align-items: center;
}
.usercard__details__country__name {
font-size: .9em;
font-size: .75em;
margin-left: 4px;
line-height: 1.2em;
line-height: 1em;
}
.usercard__stats {
@ -111,17 +111,19 @@
}
.usercard__stat__name {
display: block;
font-size: .9em;
font-size: .875em;
line-height: 1.5em;
font-variant: small-caps;
cursor: inherit;
}
.usercard__stat__value {
display: block;
font-size: 1.2em;
line-height: 1.5em;
font-size: 1.125em;
line-height: 1.25em;
cursor: inherit;
}
.usercard__stat:not(.usercard__stat--wide) .usercard__stat__value {
font-feature-settings: 'ss01' 1, 'tnum' 1;
}
@media (max-width: 800px) {
.usercard {
@ -153,8 +155,8 @@
.usercard__stat__name,
.usercard__stat__value {
display: inline-block;
font-size: .9em;
line-height: 1.2em;
font-size: .875em;
line-height: 1.25em;
font-variant: initial;
}
}

View file

@ -8,8 +8,8 @@
}
.userlist__empty {
text-align: center;
font-size: 2em;
line-height: 1.5em;
font-size: 1.5em;
line-height: 1.25em;
margin: 1em;
}
.userlist__container {

View file

@ -14,7 +14,7 @@
--end-colour: #f00;
}
.warning--bigger {
font-size: 1.4em;
font-size: 1.375em;
line-height: 1.5em;
}
.warning__content {

View file

@ -1,4 +1,12 @@
const MszCommentsApi = (() => {
const argsToFormData = args => {
const formData = new FormData;
for(const name in args)
formData.append(name, args[name]);
return formData;
};
return {
getCategory: async name => {
if(typeof name !== 'string' || name.trim() === '')
@ -62,7 +70,7 @@ const MszCommentsApi = (() => {
const { status, body } = await $xhr.post(
'/comments/posts',
{ csrf: true, type: 'json' },
args
argsToFormData(args)
);
if(status !== 201)
throw new Error(body.error?.text ?? 'something went wrong', { cause: body.error?.name ?? 'something' });
@ -75,10 +83,10 @@ const MszCommentsApi = (() => {
if(typeof args !== 'object' || args === null)
throw new Error('args must be a non-null object');
const { status, body } = await $xhr.post(
const { status, body } = await $xhr.patch(
`/comments/posts/${post}`,
{ csrf: true, type: 'json' },
args
argsToFormData(args)
);
if(status !== 200)
throw new Error(body.error?.text ?? 'something went wrong', { cause: body.error?.name ?? 'something' });

View file

@ -1,8 +1,6 @@
const MszEEPROM = function(appId, endPoint) {
const MszEEPROM = function(appId) {
if(typeof appId !== 'string')
throw 'appId must be a string';
if(typeof endPoint !== 'string')
throw 'endPoint must be a string';
return {
create: fileInput => {
@ -42,7 +40,7 @@ const MszEEPROM = function(appId, endPoint) {
formData.append('src', appId);
formData.append('file', fileInput);
const { status, body } = await $xhr.post(`${endPoint}/uploads`, {
const { status, body } = await $xhr.post('/uploads', {
type: 'json',
authed: true,
upload: reportProgress,

View file

@ -19,142 +19,144 @@ const MszForumEditor = function(form) {
let lastPostText = '';
let lastPostParser;
const eepromClient = new MszEEPROM(peepApp, peepPath);
const eepromHistory = <div class="eeprom-widget-history-items"/>;
const storagePool = $meta.get('forum-storage-pool');
if(storagePool) {
const eepromClient = new MszEEPROM(storagePool);
const eepromHistory = <div class="eeprom-widget-history-items"/>;
const eepromHandleFileUpload = async file => {
const uploadElemNameValue = <div class="eeprom-widget-file-name-value" title={file.name}>{file.name}</div>;
const uploadElemName = <a class="eeprom-widget-file-name" target="_blank">{uploadElemNameValue}</a>;
const uploadElemProgressText = <div class="eeprom-widget-file-progress">Please wait...</div>;
const uploadElemProgressBarValue = <div class="eeprom-widget-file-bar-fill" style={{ width: '0%' }}/>;
const uploadElem = <div class="eeprom-widget-file">
<div class="eeprom-widget-file-info">
{uploadElemName}
{uploadElemProgressText}
</div>
<div class="eeprom-widget-file-bar">
{uploadElemProgressBarValue}
</div>
</div>;
const eepromHandleFileUpload = async file => {
const uploadElemNameValue = <div class="eeprom-widget-file-name-value" title={file.name}>{file.name}</div>;
const uploadElemName = <a class="eeprom-widget-file-name" target="_blank">{uploadElemNameValue}</a>;
const uploadElemProgressText = <div class="eeprom-widget-file-progress">Please wait...</div>;
const uploadElemProgressBarValue = <div class="eeprom-widget-file-bar-fill" style={{ width: '0%' }}/>;
const uploadElem = <div class="eeprom-widget-file">
<div class="eeprom-widget-file-info">
{uploadElemName}
{uploadElemProgressText}
eepromHistory.insertAdjacentElement('afterbegin', uploadElem);
const explodeUploadElem = () => { uploadElem.remove(); };
const uploadTask = eepromClient.create(file);
uploadTask.onProgress(prog => {
uploadElemProgressBarValue.style.width = `${Math.ceil(prog.progress * 100)}%`;
uploadElemProgressText.textContent = `${prog.progress.toLocaleString(undefined, { style: 'percent' })} (${prog.total - prog.loaded} bytes remaining)`;
});
try {
const fileInfo = await uploadTask.start();
uploadElem.classList.add('eeprom-widget-file-done');
uploadElemName.href = fileInfo.url;
uploadElemProgressText.textContent = '';
const insertTheLinkIntoTheBoxEx2 = () => {
let insertText = location.protocol + fileInfo.url;
if(parserElem.value == 'bb') { // bbcode
if(fileInfo.isImage())
insertText = `[img]${fileInfo.url}[/img]`;
else if(fileInfo.isAudio())
insertText = `[audio]${fileInfo.url}[/audio]`;
else if(fileInfo.isVideo())
insertText = `[video]${fileInfo.url}[/video]`;
} else if(parserElem.value == 'md') { // markdown
if(fileInfo.isMedia())
insertText = `![](${fileInfo.url})`;
}
$insertTags(textElem, insertText, '');
textElem.value = textElem.value.trim();
};
uploadElemProgressText.appendChild(<a href="javascript:void(0)" onclick={() => insertTheLinkIntoTheBoxEx2()}>Insert</a>);
uploadElemProgressText.appendChild($text(' '));
uploadElemProgressText.appendChild(<a href="javascript:void(0)" onclick={() => {
eepromClient.delete(fileInfo)
.then(() => explodeUploadElem())
.catch(ex => {
console.error(ex);
MszShowMessageBox(ex, 'Upload Error');
});
}}>Delete</a>);
insertTheLinkIntoTheBoxEx2();
} catch(ex) {
let errorText = 'Upload aborted.';
if(!ex.aborted) {
console.error(ex);
errorText = ex.toString();
}
uploadElem.classList.add('eeprom-widget-file-fail');
uploadElemProgressText.textContent = errorText;
await MszShowMessageBox(errorText, 'Upload Error');
}
};
const eepromFormInput = <input type="file" multiple={true} class="eeprom-widget-form-input"
onchange={() => {
const files = eepromFormInput.files;
for(const file of files)
eepromHandleFileUpload(file);
eepromFormInput.value = '';
}}/>;
const eepromForm = <label class="eeprom-widget-form">
{eepromFormInput}
<div class="eeprom-widget-form-text">
Select Files...
</div>
<div class="eeprom-widget-file-bar">
{uploadElemProgressBarValue}
</label>;
const eepromWidget = <div class="eeprom-widget">
{eepromForm}
<div class="eeprom-widget-history">
{eepromHistory}
</div>
</div>;
eepromHistory.insertAdjacentElement('afterbegin', uploadElem);
form.appendChild(eepromWidget);
const explodeUploadElem = () => { uploadElem.remove(); };
const uploadTask = eepromClient.create(file);
textElem.addEventListener('paste', ev => {
if(ev.clipboardData && ev.clipboardData.files.length > 0) {
ev.preventDefault();
uploadTask.onProgress(prog => {
uploadElemProgressBarValue.style.width = `${Math.ceil(prog.progress * 100)}%`;
uploadElemProgressText.textContent = `${prog.progress.toLocaleString(undefined, { style: 'percent' })} (${prog.total - prog.loaded} bytes remaining)`;
const files = ev.clipboardData.files;
for(const file of files)
eepromHandleFileUpload(file);
}
});
try {
const fileInfo = await uploadTask.start();
uploadElem.classList.add('eeprom-widget-file-done');
uploadElemName.href = fileInfo.url;
uploadElemProgressText.textContent = '';
const insertTheLinkIntoTheBoxEx2 = () => {
let insertText = location.protocol + fileInfo.url;
if(parserElem.value == 'bb') { // bbcode
if(fileInfo.isImage())
insertText = `[img]${fileInfo.url}[/img]`;
else if(fileInfo.isAudio())
insertText = `[audio]${fileInfo.url}[/audio]`;
else if(fileInfo.isVideo())
insertText = `[video]${fileInfo.url}[/video]`;
} else if(parserElem.value == 'md') { // markdown
if(fileInfo.isMedia())
insertText = `![](${fileInfo.url})`;
}
$insertTags(textElem, insertText, '');
textElem.value = textElem.value.trim();
};
uploadElemProgressText.appendChild(<a href="javascript:void(0)" onclick={() => insertTheLinkIntoTheBoxEx2()}>Insert</a>);
uploadElemProgressText.appendChild($text(' '));
uploadElemProgressText.appendChild(<a href="javascript:void(0)" onclick={() => {
eepromClient.delete(fileInfo)
.then(() => explodeUploadElem())
.catch(ex => {
console.error(ex);
MszShowMessageBox(ex, 'Upload Error');
});
}}>Delete</a>);
insertTheLinkIntoTheBoxEx2();
} catch(ex) {
let errorText = 'Upload aborted.';
if(!ex.aborted) {
console.error(ex);
errorText = ex.toString();
}
uploadElem.classList.add('eeprom-widget-file-fail');
uploadElemProgressText.textContent = errorText;
await MszShowMessageBox(errorText, 'Upload Error');
}
};
const eepromFormInput = <input type="file" multiple={true} class="eeprom-widget-form-input"
onchange={() => {
const files = eepromFormInput.files;
for(const file of files)
eepromHandleFileUpload(file);
eepromFormInput.value = '';
}}/>;
const eepromForm = <label class="eeprom-widget-form">
{eepromFormInput}
<div class="eeprom-widget-form-text">
Select Files...
</div>
</label>;
const eepromWidget = <div class="eeprom-widget">
{eepromForm}
<div class="eeprom-widget-history">
{eepromHistory}
</div>
</div>;
form.appendChild(eepromWidget);
textElem.addEventListener('paste', ev => {
if(ev.clipboardData && ev.clipboardData.files.length > 0) {
document.body.addEventListener('dragenter', ev => {
ev.preventDefault();
ev.stopPropagation();
});
document.body.addEventListener('dragover', ev => {
ev.preventDefault();
ev.stopPropagation();
});
document.body.addEventListener('dragleave', ev => {
ev.preventDefault();
ev.stopPropagation();
});
document.body.addEventListener('drop', ev => {
ev.preventDefault();
ev.stopPropagation();
const files = ev.clipboardData.files;
for(const file of files)
eepromHandleFileUpload(file);
}
});
document.body.addEventListener('dragenter', ev => {
ev.preventDefault();
ev.stopPropagation();
});
document.body.addEventListener('dragover', ev => {
ev.preventDefault();
ev.stopPropagation();
});
document.body.addEventListener('dragleave', ev => {
ev.preventDefault();
ev.stopPropagation();
});
document.body.addEventListener('drop', ev => {
ev.preventDefault();
ev.stopPropagation();
if(ev.dataTransfer && ev.dataTransfer.files.length > 0) {
const files = ev.dataTransfer.files;
for(const file of files)
eepromHandleFileUpload(file);
}
});
if(ev.dataTransfer && ev.dataTransfer.files.length > 0) {
const files = ev.dataTransfer.files;
for(const file of files)
eepromHandleFileUpload(file);
}
});
}
// hack: don't prompt user when hitting submit, really need to make this not stupid.
buttonsElem.firstChild.addEventListener('click', () => MszForumEditorAllowClose = true);

View file

@ -102,7 +102,8 @@ const MsgMessagesEntry = function(entry) {
entry.dataset.msgRead = state ? 'sent' : 'draft';
};
const checkbox = entry.querySelector('.js-entry-checkbox');
const checkboxWrapper = entry.querySelector('.js-entry-checkbox-wrapper');
const checkbox = checkboxWrapper.querySelector('.js-entry-checkbox');
const getSelected = () => checkbox.checked;
const setSelected = state => checkbox.checked = state;
const toggleSelected = () => checkbox.checked = !checkbox.checked;
@ -113,6 +114,7 @@ const MsgMessagesEntry = function(entry) {
watchers.define(['select']);
checkbox.addEventListener('click', ev => ev.stopPropagation());
checkboxWrapper.addEventListener('click', ev => ev.stopPropagation());
checkbox.addEventListener('keydown', ev => ev.stopPropagation());
checkbox.addEventListener('change', () => {

View file

@ -52,7 +52,7 @@ const MszMessages = () => {
formData.append('format', format);
formData.append('draft', draft);
const { body } = await $xhr.post(`/messages/${encodeURIComponent(messageId)}`, { type: 'json', csrf: true }, formData);
const { body } = await $xhr.patch(`/messages/${encodeURIComponent(messageId)}`, { type: 'json', csrf: true }, formData);
if(body.error !== undefined)
throw body.error;

View file

@ -65,73 +65,76 @@ const MszMessagesReply = function(element) {
// this implementation is godawful but it'll do for now lol
// need to make it easier to share the forum's implementation
const eepromClient = new MszEEPROM(peepApp, peepPath);
const eepromHandleFileUpload = async file => {
const uploadTask = eepromClient.create(file);
const storagePool = $meta.get('messages-storage-pool');
if(storagePool) {
const eepromClient = new MszEEPROM(storagePool);
const eepromHandleFileUpload = async file => {
const uploadTask = eepromClient.create(file);
try {
const fileInfo = await uploadTask.start();
const parserMode = parseInt(parserSelect.value);
let insertText = location.protocol + fileInfo.url;
try {
const fileInfo = await uploadTask.start();
const parserMode = parseInt(parserSelect.value);
let insertText = location.protocol + fileInfo.url;
if(parserMode == 1) { // bbcode
if(fileInfo.isImage())
insertText = `[img]${fileInfo.url}[/img]`;
else if(fileInfo.isAudio())
insertText = `[audio]${fileInfo.url}[/audio]`;
else if(fileInfo.isVideo())
insertText = `[video]${fileInfo.url}[/video]`;
} else if(parserMode == 2) { // markdown
if(fileInfo.isMedia())
insertText = `![](${fileInfo.url})`;
if(parserMode == 1) { // bbcode
if(fileInfo.isImage())
insertText = `[img]${fileInfo.url}[/img]`;
else if(fileInfo.isAudio())
insertText = `[audio]${fileInfo.url}[/audio]`;
else if(fileInfo.isVideo())
insertText = `[video]${fileInfo.url}[/video]`;
} else if(parserMode == 2) { // markdown
if(fileInfo.isMedia())
insertText = `![](${fileInfo.url})`;
}
$insertTags(bodyElem, insertText, '');
bodyElem.value = bodyElem.value.trim();
} catch(ex) {
let errorText = 'Upload aborted.';
if(!ex.aborted) {
console.error(ex);
errorText = ex.toString();
}
await MszShowMessageBox(errorText, 'Upload Error');
}
};
$insertTags(bodyElem, insertText, '');
bodyElem.value = bodyElem.value.trim();
} catch(ex) {
let errorText = 'Upload aborted.';
bodyElem.addEventListener('paste', ev => {
if(ev.clipboardData && ev.clipboardData.files.length > 0) {
ev.preventDefault();
if(!ex.aborted) {
console.error(ex);
errorText = ex.toString();
const files = ev.clipboardData.files;
for(const file of files)
eepromHandleFileUpload(file);
}
});
await MszShowMessageBox(errorText, 'Upload Error');
}
};
bodyElem.addEventListener('paste', ev => {
if(ev.clipboardData && ev.clipboardData.files.length > 0) {
document.body.addEventListener('dragenter', ev => {
ev.preventDefault();
ev.stopPropagation();
});
document.body.addEventListener('dragover', ev => {
ev.preventDefault();
ev.stopPropagation();
});
document.body.addEventListener('dragleave', ev => {
ev.preventDefault();
ev.stopPropagation();
});
document.body.addEventListener('drop', ev => {
ev.preventDefault();
ev.stopPropagation();
const files = ev.clipboardData.files;
for(const file of files)
eepromHandleFileUpload(file);
}
});
document.body.addEventListener('dragenter', ev => {
ev.preventDefault();
ev.stopPropagation();
});
document.body.addEventListener('dragover', ev => {
ev.preventDefault();
ev.stopPropagation();
});
document.body.addEventListener('dragleave', ev => {
ev.preventDefault();
ev.stopPropagation();
});
document.body.addEventListener('drop', ev => {
ev.preventDefault();
ev.stopPropagation();
if(ev.dataTransfer && ev.dataTransfer.files.length > 0) {
const files = ev.dataTransfer.files;
for(const file of files)
eepromHandleFileUpload(file);
}
});
if(ev.dataTransfer && ev.dataTransfer.files.length > 0) {
const files = ev.dataTransfer.files;
for(const file of files)
eepromHandleFileUpload(file);
}
});
}
return {
get element() { return element; },

View file

@ -3,6 +3,7 @@
.oauth2-appinfo-name {
font-size: 2em;
line-height: 1.5em;
font-weight: 500;
}
.oauth2-appinfo-links {
@ -30,13 +31,13 @@
mask: url('/images/globe-solid.svg') no-repeat center;
}
.oauth2-appinfo-link-text {
font-size: .8em;
line-height: 1.4em;
font-size: .75em;
line-height: 1.25em;
}
.oauth2-appinfo-summary {
font-size: .9em;
line-height: 1.4em;
font-size: .875em;
line-height: 1.375em;
}
.oauth2-appinfo-summary p {
margin: .5em 0;

View file

@ -20,7 +20,7 @@
.oauth2-approval-header {
text-align: center;
font-size: 1.2em;
font-size: 1.5em;
line-height: 1.5em;
}
@ -30,6 +30,6 @@
.oauth2-approval-text p {
margin: .5em 0;
font-size: .8em;
font-size: .875em;
line-height: 1.5em;
}

View file

@ -1,6 +1,6 @@
.oauth2-authorise-requesting {
font-size: .8em;
line-height: 1.4em;
font-size: .875em;
line-height: 1.5em;
border-bottom: 1px solid #333;
}
.oauth2-authorise-requesting p {
@ -8,8 +8,8 @@
}
.oauth2-authorise-device {
font-size: .8em;
line-height: 1.4em;
font-size: .875em;
line-height: 1.375em;
}
.oauth2-authorise-device p {
margin: .5em 0;

View file

@ -6,8 +6,6 @@
}
.oauth2-banner-text {
font-size: .9em;
line-height: 1.4em;
flex: 1 1 auto;
}
.oauth2-banner-logo {

View file

@ -5,7 +5,7 @@
}
.oauth2-device-code {
font-size: 1.4em;
font-size: 1.25em;
border: 1px solid #222;
padding: 5px 10px;
background: #222;
@ -15,6 +15,7 @@
transition: border-color .2s;
text-align: center;
font-family: var(--font-monospace);
font-feature-settings: 'ss07' 1;
min-width: 0;
max-width: 200px;
width: 100%;

View file

@ -12,6 +12,7 @@ body {
pre, code {
font-family: var(--font-monospace);
font-feature-settings: 'ss07' 1;
}
a {

View file

@ -33,6 +33,6 @@
background-color: #c80;
}
.oauth2-scope-perm-text {
font-size: .8em;
line-height: 1.4em;
font-size: .875em;
line-height: 1.375em;
}

View file

@ -25,6 +25,6 @@
}
.oauth2-simplehead-text {
font-size: 1.8em;
line-height: 1.4em;
font-size: 1.75em;
line-height: 1.375em;
}

View file

@ -25,8 +25,8 @@
border: 0;
}
.oauth2-userhead-main-name {
font-size: 1.8em;
line-height: 1.4em;
font-size: 1.75em;
line-height: 1.375em;
}
.oauth2-userhead-main-name a {
color: inherit;
@ -54,8 +54,8 @@
border: 0;
}
.oauth2-userhead-guise-text {
font-size: .8em;
line-height: 1.5em;
font-size: .75em;
line-height: 1.375em;
overflow: hidden;
padding: 2px 0;
}

View file

@ -188,7 +188,7 @@ const MszOAuth2Authorise = async () => {
params.scope = scope;
try {
const { body } = await $xhr.post('/oauth2/authorise', { authed: true, csrf: true, type: 'json' }, params);
const { body } = await $xhr.post('/oauth2/authorize', { authed: true, csrf: true, type: 'json' }, params);
if(!body)
throw 'authorisation failed';
if(typeof body.error === 'string')

View file

@ -24,8 +24,8 @@
}
.redir-landing-footer {
font-size: .8em;
line-height: 1.4em;
font-size: .75em;
line-height: 1.375em;
text-align: center;
margin: 10px;
}

Some files were not shown because too many files have changed in this diff Show more