Compare commits

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

2 commits

13 changed files with 669 additions and 761 deletions

2
.gitignore vendored
View file

@ -24,7 +24,7 @@ dist/
.err .err
.vscode .vscode
/run.sh /run.sh
**/static/css #**/static/css
#**/static/js #**/static/js
**.priv.js **.priv.js
/ver.sh /ver.sh

View file

@ -1,8 +1,21 @@
# Changelog # Changelog
## 0.4.2
- Fix requirements
## 0.4.1
- libsuou bumped to 0.14.2
- Removed Sass, back to plain CSS. Can't believe this, but libsass-python has gone EOL with no valid and stable replacement.
## 0.5.0
I gave up on releasing 0.5.0.
## 0.4.0 ## 0.4.0
- Added dependency to [SUOU](https://github.com/sakuragasaki46/suou) library - Added dependency to [SUOU](https://github.com/yusurko/suou) library
- Users can now block each other - Users can now block each other
+ Blocking a user prevents them from seeing your comments, posts (standalone or in feed) and profile + Blocking a user prevents them from seeing your comments, posts (standalone or in feed) and profile
- Added user strikes: a strike logs the content of a removed message for future use - Added user strikes: a strike logs the content of a removed message for future use

View file

@ -85,7 +85,7 @@ Licensed under the [Apache License, Version 2.0](LICENSE), a non-copyleft free a
This is a hobby project, made available “AS IS”, with __no warranty__ express or implied. This is a hobby project, made available “AS IS”, with __no warranty__ express or implied.
I (sakuragasaki46) may NOT be held accountable for Your use of my code. I (yusurko) may NOT be held accountable for Your use of my code.
> It's pointless to file a lawsuit because you feel damaged, and it's only going to turn against you. What a waste of money you could have spent on a vacation or charity, or invested in stocks. > It's pointless to file a lawsuit because you feel damaged, and it's only going to turn against you. What a waste of money you could have spent on a vacation or charity, or invested in stocks.

View file

@ -16,7 +16,6 @@ from sqlalchemy import select
from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.exc import SQLAlchemyError
from suou import Snowflake, ssv_list from suou import Snowflake, ssv_list
from werkzeug.routing import BaseConverter from werkzeug.routing import BaseConverter
from sassutils.wsgi import SassMiddleware
from werkzeug.middleware.proxy_fix import ProxyFix from werkzeug.middleware.proxy_fix import ProxyFix
from suou.configparse import ConfigOptions, ConfigValue from suou.configparse import ConfigOptions, ConfigValue
@ -24,7 +23,7 @@ from suou.configparse import ConfigOptions, ConfigValue
from .colors import color_themes, theme_classes from .colors import color_themes, theme_classes
from .utils import twocolon_list from .utils import twocolon_list
__version__ = '0.4.0' __version__ = '0.4.2'
APP_BASE_DIR = os.path.dirname(os.path.dirname(__file__)) APP_BASE_DIR = os.path.dirname(os.path.dirname(__file__))
@ -51,11 +50,6 @@ app.config['JSONIFY_PRETTYPRINT_REGULAR'] = False
from .models import db, User, Post from .models import db, User, Post
# SASS
app.wsgi_app = SassMiddleware(app.wsgi_app, dict(
freak=('static/sass', 'static/css', '/static/css', True)
))
# proxy fix # proxy fix
if app_config.app_is_behind_proxy: if app_config.app_is_behind_proxy:
app.wsgi_app = ProxyFix( app.wsgi_app = ProxyFix(

View file

@ -1,10 +1,10 @@
from flask import Blueprint, redirect, url_for from flask import Blueprint, redirect, url_for
from flask_login import login_required
from flask_restx import Resource from flask_restx import Resource
from sqlalchemy import select from sqlalchemy import select
from suou import Snowflake from suou import Snowflake
from suou.flask_sqlalchemy import require_auth
from suou.flask_restx import Api from suou.flask_restx import Api
@ -13,8 +13,6 @@ from ..models import Post, User, db
rest_bp = Blueprint('rest', __name__, url_prefix='/v1') rest_bp = Blueprint('rest', __name__, url_prefix='/v1')
rest = Api(rest_bp) rest = Api(rest_bp)
auth_required = require_auth(User, db)
@rest.route('/nurupo') @rest.route('/nurupo')
class Nurupo(Resource): class Nurupo(Resource):
def get(self): def get(self):
@ -29,7 +27,7 @@ class Nurupo(Resource):
@rest.route('/user/@me') @rest.route('/user/@me')
class UserInfoMe(Resource): class UserInfoMe(Resource):
@auth_required(required=True) @login_required
def get(self, user: User): def get(self, user: User):
return redirect(url_for('rest.UserInfo', user.id)), 302 return redirect(url_for('rest.UserInfo', user.id)), 302

649
freak/static/css/style.css Normal file
View file

@ -0,0 +1,649 @@
@charset "UTF-8";
* {
box-sizing: border-box; }
:root {
--c0-accent: #ff7300;
--c1-accent: #ff7300;
--c2-accent: #f837ce;
--c3-accent: #38b8ff;
--c4-accent: #ffe338;
--c5-accent: #78f038;
--c6-accent: #ff9aae;
--c7-accent: #606080;
--c8-accent: #aeaac0;
--c9-accent: #3ae0b8;
--c10-accent: #8828ea;
--c11-accent: #1871d8;
--c12-accent: #885a18;
--c13-accent: #38a856;
--c14-accent: #ff3018;
--c15-accent: #ff1668;
--light-text-primary: #181818;
--light-text-alt: #444;
--light-border: #999;
--light-success: #73af00;
--light-error: #e04830;
--light-warning: #dea800;
--light-canvas: #eaecee;
--light-background: #f9f9f9;
--light-bg-sharp: #fdfdff;
--dark-text-primary: #e8e8e8;
--dark-text-alt: #c0cad3;
--dark-border: #777;
--dark-success: #93cf00;
--dark-error: #e04830;
--dark-warning: #dea800;
--dark-canvas: #0a0a0e;
--dark-background: #181a21;
--dark-bg-sharp: #080808;
--accent: var(--c0-accent);
--light-accent: var(--accent);
--dark-accent: var(--accent);
--text-primary: var(--light-text-primary);
--text-alt: var(--light-text-alt);
--border: var(--light-border);
--success: var(--light-success);
--error: var(--light-error);
--warning: var(--light-warning);
--canvas: var(--light-canvas);
--background: var(--light-background);
--bg-sharp: var(--light-bg-sharp); }
@media (prefers-color-scheme: dark) {
:root {
--text-primary: var(--dark-text-primary);
--text-alt: var(--dark-text-alt);
--border: var(--dark-border);
--success: var(--dark-success);
--error: var(--dark-error);
--warning: var(--dark-warning);
--canvas: var(--dark-canvas);
--background: var(--dark-background);
--bg-sharp: var(--dark-bg-sharp); } }
.color-scheme-light {
--text-primary: var(--light-text-primary);
--text-alt: var(--light-text-alt);
--border: var(--light-border);
--success: var(--light-success);
--error: var(--light-error);
--warning: var(--light-warning);
--canvas: var(--light-canvas);
--background: var(--light-background);
--bg-sharp: var(--light-bg-sharp); }
.color-scheme-dark {
--text-primary: var(--dark-text-primary);
--text-alt: var(--dark-text-alt);
--border: var(--dark-border);
--success: var(--dark-success);
--error: var(--dark-error);
--warning: var(--dark-warning);
--canvas: var(--dark-canvas);
--background: var(--dark-background);
--bg-sharp: var(--dark-bg-sharp); }
.color-theme-1 {
--accent: var(--c1-accent); }
.color-theme-2 {
--accent: var(--c2-accent); }
.color-theme-3 {
--accent: var(--c3-accent); }
.color-theme-4 {
--accent: var(--c4-accent); }
.color-theme-5 {
--accent: var(--c5-accent); }
.color-theme-6 {
--accent: var(--c6-accent); }
.color-theme-7 {
--accent: var(--c7-accent); }
.color-theme-8 {
--accent: var(--c8-accent); }
.color-theme-9 {
--accent: var(--c9-accent); }
.color-theme-10 {
--accent: var(--c10-accent); }
.color-theme-11 {
--accent: var(--c11-accent); }
.color-theme-12 {
--accent: var(--c12-accent); }
.color-theme-13 {
--accent: var(--c13-accent); }
.color-theme-14 {
--accent: var(--c14-accent); }
.color-theme-15 {
--accent: var(--c15-accent); }
body, input, select, button {
font-family: system-ui, -apple-system, BlinkMacSystemFont, "Noto Sans", sans-serif; }
body {
line-height: 1.5;
font-size: 18px; }
input, button, select {
font-family: inherit;
font-size: inherit;
line-height: inherit; }
textarea {
font-family: monospace; }
input:not([type="submit"], [type="button"], [type="reset"]), textarea {
background: var(--bg-sharp);
color: var(--text-main);
border: var(--border);
border-radius: 9px; }
body {
color: var(--text-primary);
background-color: var(--canvas); }
.card {
background-color: var(--background);
border: var(--canvas) 1px solid;
border-radius: 9px;
margin: 12px auto;
padding: 12px;
max-width: 960px; }
.centered {
text-align: center;
font-size: 110%; }
a:link, a:visited {
color: var(--accent);
transition: ease 5s; }
img {
max-width: 100%;
max-height: 100vh; }
.faint {
opacity: .75; }
strong .faint {
font-weight: 400; }
.callout {
color: var(--text-alt); }
.success {
color: var(--success); }
.error {
color: var(--error); }
.warning {
color: var(--warning); }
body {
margin: 0; }
.content-container {
display: flex;
flex-direction: row-reverse;
align-items: start;
justify-content: flex-start; }
.content-nav {
width: 320px;
font-size: smaller; }
.content-main {
flex: 1; }
main {
min-height: 70vh;
margin: 12px auto; }
header.header {
background-color: var(--background);
display: flex;
justify-content: space-between;
overflow: hidden;
height: 3em;
padding: .75em 1.5em;
line-height: 1; }
header.header h1 {
margin: 0;
padding: 0;
font-size: 1.5em; }
header.header .metanav {
align-self: flex-end;
font-size: 1.5em;
margin: auto;
margin-inline-start: 2em; }
header.header .metanav ul {
list-style: none;
padding: 0;
margin: 0; }
header.header .metanav ul > li {
margin: 0 6px; }
header.header .metanav ul, header.header .metanav ul > li {
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-end; }
header.header .metanav, header.header .metanav > ul, header.header .metanav > ul > li:has(.mini-search-bar) {
flex: 1; }
header.header .metanav ul > li span {
color: var(--text-primary);
font-size: .6em; }
header.header .header-username > * {
display: block;
font-size: .5em;
line-height: 1.25; }
header.header .header-username .icon {
font-size: inherit; }
header.header a {
text-decoration: none; }
header.header .mini-search-bar {
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-end;
flex: 1;
font-size: 1.2rem; }
header.header .mini-search-bar [type="search"] {
flex: 1;
border-radius: 0;
border: 0;
border-bottom: 2px solid var(--border);
background-color: inherit; }
header.header .mini-search-bar [type="search"] :focus {
background-color: var(--bg-sharp);
border-color: var(--accent); }
header.header .mini-search-bar [type="submit"] {
height: 0;
width: 0;
padding: 0;
margin: 0;
border-radius: 0;
opacity: 0;
overflow: hidden; }
header.header .mini-search-bar + a {
display: none; }
aside.card {
overflow: hidden; }
aside.card > :is(h1, h2, h3, h4, h5, h6):first-child {
background-color: var(--accent);
padding: 6px 12px;
margin: -12px -12px 0 -12px;
position: relative; }
aside.card > :is(h1, h2, h3, h4, h5, h6):first-child a {
color: inherit;
text-decoration: underline; }
aside.card > ul {
list-style: none;
margin: 0;
padding: 0; }
aside.card > ul > li {
border-bottom: 1px solid var(--canvas);
padding: 12px; }
aside.card > ul > li:last-child {
border-bottom: none; }
aside.card > p {
padding: 12px;
margin: 0; }
.flash {
border-color: yellow;
background-color: #fff00040; }
ul.timeline {
list-style: none;
padding: 0 1em; }
ul.timeline > li {
border-bottom: 1px solid var(--border);
margin-bottom: 6px; }
ul.timeline > li:last-child {
border-bottom: 0;
margin-bottom: 0; }
ul.inline {
list-style: none;
padding: 0;
margin: 0;
display: inline; }
ul.inline > li {
display: inline; }
ul.inline > li::before {
content: ' · ';
margin: 0 .5em; }
ul.inline > li:first-child::before {
content: '';
margin: 0; }
ul.grid {
list-style: none;
padding: 0;
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr;
grid-template-rows: auto; }
ul.grid > li {
border: 1px solid var(--border);
border-radius: .5em;
padding: .5em;
margin: 1em .5em;
text-align: center; }
ul.grid > li small {
display: block; }
ul.message-options {
color: var(--text-alt);
list-style: none;
padding: 0;
font-size: smaller; }
.post-frame {
margin-left: 3em;
position: relative;
min-height: 6em;
clear: right; }
[dir="rtl"] .post-frame {
margin-left: 0;
margin-right: 3em; }
.post-frame .message-options {
margin-bottom: 1em; }
.post-frame .message-stats {
position: absolute;
left: -3em;
top: 0;
display: flex;
flex-direction: column;
width: 2em;
text-align: center;
line-height: 1.0; }
[dir="rtl"] .post-frame .message-stats {
right: -3em;
left: unset; }
.post-frame .message-stats > * {
display: flex;
flex-direction: column; }
.post-frame .message-stats strong {
font-size: smaller; }
.post-frame .message-stats a {
text-decoration: none;
margin: .25em 0; }
.message-meta {
font-size: smaller;
color: var(--text-alt); }
.shorten {
max-height: 18em;
overflow-y: hidden;
position: relative; }
.shorten::after {
content: '';
position: absolute;
z-index: 10;
top: 16em;
left: 0;
width: 100%;
height: 2em;
display: block;
background: linear-gradient(to bottom, rgba(0, 0, 0, 0) 0%, var(--background) 100%); }
.comments-button .comment-count {
display: inline-block;
min-width: 1em;
text-align: center; }
i.icon {
font-size: inherit;
font-style: normal; }
form.boundaryless {
flex: 1;
background: transparent;
color: inherit;
border: 0;
border-top: 1px solid var(--border);
border-bottom: 1px solid var(--border); }
form.boundaryless dd {
display: flex;
flex-direction: row;
width: 100%;
box-sizing: border-box;
margin: 0; }
form.boundaryless textarea, form.boundaryless input[type="text"] {
width: 100%; }
form.boundaryless textarea {
min-height: 4em; }
form.boundaryless p input[type="text"] {
width: unset; }
.big-search-bar form {
display: flex;
flex-direction: row;
font-size: 1.6em;
width: 80%;
margin: auto; }
.big-search-bar form > [type="search"] {
flex: 1;
border-bottom: 2px solid var(--border); }
footer.footer {
text-align: center;
font-size: smaller; }
footer.footer ul {
list-style: none;
padding: 0;
margin: 0; }
footer.footer ul > li {
display: inline-block;
margin: 0 2em; }
textarea.comment-area {
width: 100%; }
button, [type="submit"], [type="reset"], [type="button"] {
background-color: transparent;
color: var(--accent);
border: 1px solid var(--accent);
border-radius: 6px;
padding: 6px 12px;
margin: 6px;
cursor: pointer; }
button.primary, [type="submit"].primary, [type="reset"].primary, [type="button"].primary {
background-color: var(--accent);
color: var(--background); }
button[disabled], [type="submit"][disabled], [type="reset"][disabled], [type="button"][disabled] {
opacity: .5;
cursor: not-allowed;
border: var(--border);
color: var(--border); }
button.primary[disabled], [type="submit"].primary[disabled], [type="reset"].primary[disabled], [type="button"].primary[disabled] {
color: var(--background);
background-color: var(--border); }
button:first-child, [type="submit"]:first-child, [type="reset"]:first-child, [type="button"]:first-child {
margin-inline-start: 0; }
button:last-child, [type="submit"]:last-child, [type="reset"]:last-child, [type="button"]:last-child {
margin-inline-end: 0; }
.button-row-right {
display: flex;
flex-direction: row;
justify-content: flex-end; }
.comment-frame {
border: 1px solid var(--border);
background: var(--background);
padding: 12px 12px 6px;
border-radius: 24px;
border-start-start-radius: 0;
min-width: 50%;
width: 0;
margin-inline-end: auto;
margin-bottom: 12px;
position: relative; }
.comment-frame::before {
content: '';
border: 1px solid var(--border);
border-inline-end: 0;
border-bottom: 0;
background: var(--background);
height: 1em;
width: 1em;
position: absolute;
left: calc(-1px - .5em);
top: -1px;
transform: skewX(45deg); }
li:has(> .comment-frame) {
list-style: none; }
.border-accent {
border: var(--accent) 1px solid;
display: inline-flex;
align-items: center;
padding: 0 4px; }
.round {
border-radius: 1em; }
.done {
opacity: .5; }
button.card {
width: 100%;
padding: .5em 1em;
background-color: transparent;
border-color: var(--accent);
color: var(--accent);
border-radius: 1em; }
button.card.primary {
background-color: var(--accent);
color: var(--background); }
.big_icon {
display: block;
margin: 12px auto;
font-size: 36px;
text-align: center; }
textarea.create_text {
min-height: 8em; }
form.boundaryless textarea.create_text {
min-height: 8em; }
:is(input, select, textarea).fullwidth {
width: 100%;
padding: 0; }
label:has([type="checkbox"]:not(:checked)) {
opacity: .75; }
.content {
margin: 2em auto;
max-width: 1280px; }
blockquote {
padding-left: 1em;
border-left: 4px solid var(--border);
margin-left: 0; }
[dir="rtl"] blockquote {
padding-left: 0;
border-left: 0;
padding-right: 1em;
border-right: 4px solid var(--border); }
.message-content p {
margin: 4px 0; }
.message-content ul {
margin: 4px 0;
padding: 0;
padding-inline-start: 1.5em; }
.message-content ul > li {
margin: 0; }
h1, h2, h3, h4, h5, h6 {
font-weight: 500; }
@media screen and (max-width: 800px) {
.content-container {
display: block; }
.content-nav, .content-main {
width: 100%; }
ul.grid {
grid-template-columns: 1fr 1fr; }
.nomobile {
display: none !important; }
body {
position: relative; }
footer.mobile-nav {
position: sticky;
bottom: 0;
left: 0;
width: 100%;
overflow: hidden;
margin: 0;
padding: 0;
background-color: var(--background);
box-shadow: 0 0 6px var(--border);
z-index: 150; }
footer.mobile-nav > ul {
display: flex;
list-style: none;
margin: 0;
padding: 0;
flex-direction: row;
align-items: stretch;
justify-content: stretch; }
footer.mobile-nav > ul > li {
flex: 1;
padding: .5em;
margin: 0;
text-align: center; }
footer.mobile-nav > ul > li a {
text-decoration: none; }
footer.mobile-nav > ul > li .icon {
font-size: 2rem; }
.content-nav {
margin: 1em;
width: unset; }
header.header h1 {
margin-top: 4px;
margin-left: 6px; }
.content-header {
text-align: center; }
.big-search-bar form {
flex-direction: column; }
.big-search-bar form [type="submit"] {
width: unset;
margin: 12px auto; } }
@media screen and (max-width: 960px) {
.header-username {
display: none; }
header.header {
padding: .5em .5em; }
header.header .mini-search-bar {
display: none; }
header.header .mini-search-bar + a {
display: inline-block; }
header.header ul > li:has(.mini-search-bar) {
flex: unset; } }
@media screen and (min-width: 801px) {
.mobileonly {
display: none !important; } }
/*# sourceMappingURL=style.css.map */

View file

@ -1,202 +0,0 @@
@import "constants.sass"
*
box-sizing: border-box
\:root
--c0-accent: #ff7300
--c1-accent: #ff7300
--c2-accent: #f837ce
--c3-accent: #38b8ff
--c4-accent: #ffe338
--c5-accent: #78f038
--c6-accent: #ff9aae
--c7-accent: #606080
--c8-accent: #aeaac0
--c9-accent: #3ae0b8
--c10-accent: #8828ea
--c11-accent: #1871d8
--c12-accent: #885a18
--c13-accent: #38a856
--c14-accent: #ff3018
--c15-accent: #ff1668
--light-text-primary: #181818
--light-text-alt: #444
--light-border: #999
--light-success: #73af00
--light-error: #e04830
--light-warning: #dea800
--light-canvas: #eaecee
--light-background: #f9f9f9
--light-bg-sharp: #fdfdff
--dark-text-primary: #e8e8e8
--dark-text-alt: #c0cad3
--dark-border: #777
--dark-success: #93cf00
--dark-error: #e04830
--dark-warning: #dea800
--dark-canvas: #0a0a0e
--dark-background: #181a21
--dark-bg-sharp: #080808
--accent: var(--c0-accent)
// the following are DEPRECATED //
--light-accent: var(--accent)
--dark-accent: var(--accent)
--text-primary: var(--light-text-primary)
--text-alt: var(--light-text-alt)
--border: var(--light-border)
--success: var(--light-success)
--error: var(--light-error)
--warning: var(--light-warning)
--canvas: var(--light-canvas)
--background: var(--light-background)
--bg-sharp: var(--light-bg-sharp)
@media (prefers-color-scheme: dark)
\:root
--text-primary: var(--dark-text-primary)
--text-alt: var(--dark-text-alt)
--border: var(--dark-border)
--success: var(--dark-success)
--error: var(--dark-error)
--warning: var(--dark-warning)
--canvas: var(--dark-canvas)
--background: var(--dark-background)
--bg-sharp: var(--dark-bg-sharp)
.color-scheme-light
--text-primary: var(--light-text-primary)
--text-alt: var(--light-text-alt)
--border: var(--light-border)
--success: var(--light-success)
--error: var(--light-error)
--warning: var(--light-warning)
--canvas: var(--light-canvas)
--background: var(--light-background)
--bg-sharp: var(--light-bg-sharp)
.color-scheme-dark
--text-primary: var(--dark-text-primary)
--text-alt: var(--dark-text-alt)
--border: var(--dark-border)
--success: var(--dark-success)
--error: var(--dark-error)
--warning: var(--dark-warning)
--canvas: var(--dark-canvas)
--background: var(--dark-background)
--bg-sharp: var(--dark-bg-sharp)
.color-theme-1
--accent: var(--c1-accent)
.color-theme-2
--accent: var(--c2-accent)
.color-theme-3
--accent: var(--c3-accent)
.color-theme-4
--accent: var(--c4-accent)
.color-theme-5
--accent: var(--c5-accent)
.color-theme-6
--accent: var(--c6-accent)
.color-theme-7
--accent: var(--c7-accent)
.color-theme-8
--accent: var(--c8-accent)
.color-theme-9
--accent: var(--c9-accent)
.color-theme-10
--accent: var(--c10-accent)
.color-theme-11
--accent: var(--c11-accent)
.color-theme-12
--accent: var(--c12-accent)
.color-theme-13
--accent: var(--c13-accent)
.color-theme-14
--accent: var(--c14-accent)
.color-theme-15
--accent: var(--c15-accent)
body, input, select, button
font-family: $ui-fonts
body
line-height: $ui-line-height
font-size: $ui-size
input, button, select
font-family: inherit
font-size: inherit
line-height: inherit
textarea
font-family: $monospace-fonts
input:not([type="submit"], [type="button"], [type="reset"]), textarea
background: var(--bg-sharp)
color: var(--text-main)
border: var(--border)
border-radius: $corner-radius
body
color: var(--text-primary)
background-color: var(--canvas)
.card
background-color: var(--background)
border: var(--canvas) 1px solid
border-radius: $corner-radius
margin: 12px auto
padding: 12px
max-width: 960px
.centered
text-align: center
font-size: 110%
a
&:link, &:visited
color: var(--accent)
transition: ease 5s
img
max-width: 100%
max-height: 100vh
.faint
opacity: .75
strong &
font-weight: 400
.callout
color: var(--text-alt)
.success
color: var(--success)
.error
color: var(--error)
.warning
color: var(--warning)

View file

@ -1,19 +0,0 @@
$ui-fonts: system-ui, -apple-system, BlinkMacSystemFont, "Noto Sans", sans-serif
$heading-fonts: $ui-fonts
$content-fonts: $ui-fonts
$monospace-fonts: monospace
$ui-line-height: 1.5
$content-line-height: 1.5
$ui-size: 18px
$content-size: 18px
$h1-size: $ui-size * 2.5
$h2-size: $ui-size * 1.85
$h3-size: $ui-size * 1.55
$h4-size: $ui-size * 1.3
$h5-size: $ui-size * 1.1
$h6-size: $ui-size * 1.0
$corner-radius: 9px

View file

@ -1,30 +0,0 @@
.content
margin: 2em auto
max-width: 1280px
blockquote
padding-left: 1em
border-left: 4px solid var(--border)
margin-left: 0
[dir="rtl"] &
padding-left: 0
border-left: 0
padding-right: 1em
border-right: 4px solid var(--border)
.message-content
p
margin: 4px 0
ul
margin: 4px 0
padding: 0
padding-inline-start: 1.5em
> li
margin: 0
h1, h2, h3, h4, h5, h6
font-weight: 500

View file

@ -1,403 +0,0 @@
@import "constants.sass"
body
margin: 0
.content-container
display: flex
flex-direction: row-reverse
align-items: start
justify-content: flex-start
.content-nav
width: 320px
font-size: smaller
.content-main
flex: 1
main
min-height: 70vh
margin: 12px auto
// __ header styles __ //
header.header
background-color: var(--background)
display: flex
justify-content: space-between
overflow: hidden
height: 3em
padding: .75em 1.5em
line-height: 1
h1
margin: 0
padding: 0
font-size: 1.5em
.metanav
align-self: flex-end
font-size: 1.5em
margin: auto
margin-inline-start: 2em
ul
list-style: none
padding: 0
margin: 0
> li
margin: 0 6px
ul, ul > li
display: flex
flex-direction: row
align-items: center
justify-content: flex-end
&, > ul, > ul > li:has(.mini-search-bar)
flex: 1
ul > li span
color: var(--text-primary)
font-size: .6em
.header-username
> *
display: block
font-size: .5em
line-height: 1.25
.icon
font-size: inherit
a
text-decoration: none
.mini-search-bar
display: flex
flex-direction: row
align-items: center
justify-content: flex-end
flex: 1
font-size: 1.2rem
[type="search"]
flex: 1
border-radius: 0
border: 0
border-bottom: 2px solid var(--border)
background-color: inherit
:focus
background-color: var(--bg-sharp)
border-color: var(--accent)
[type="submit"]
height: 0
width: 0
padding: 0
margin: 0
border-radius: 0
opacity: 0
overflow: hidden
+ a
display: none
// __ aside styles __ //
aside.card
overflow: hidden
> :is(h1, h2, h3, h4, h5, h6):first-child
background-color: var(--accent)
padding: 6px 12px
margin: -12px -12px 0 -12px
position: relative
a
color: inherit
text-decoration: underline
> ul
list-style: none
margin: 0
padding: 0
> li
border-bottom: 1px solid var(--canvas)
padding: 12px
&:last-child
border-bottom: none
> p
padding: 12px
margin: 0
.flash
border-color: yellow
background-color: #fff00040
ul.timeline
list-style: none
padding: 0 1em
> li
border-bottom: 1px solid var(--border)
margin-bottom: 6px
&:last-child
border-bottom: 0
margin-bottom: 0
ul.inline
list-style: none
padding: 0
margin: 0
display: inline
> li
display: inline
&::before
content: ' · '
margin: 0 .5em
&:first-child::before
content: ''
margin: 0
ul.grid
list-style: none
padding: 0
display: grid
grid-template-columns: 1fr 1fr 1fr 1fr
grid-template-rows: auto
> li
border: 1px solid var(--border)
border-radius: .5em
padding: .5em
margin: 1em .5em
text-align: center
small
display: block
ul.message-options
color: var(--text-alt)
list-style: none
padding: 0
font-size: smaller
.post-frame
margin-left: 3em
position: relative
min-height: 6em
clear: right
[dir="rtl"] &
margin-left: 0
margin-right: 3em
.message-options
margin-bottom: 1em
.message-stats
position: absolute
left: -3em
top: 0
display: flex
flex-direction: column
width: 2em
text-align: center
line-height: 1.0
[dir="rtl"] &
right: -3em
left: unset
> *
display: flex
flex-direction: column
strong
font-size: smaller
a
text-decoration: none
margin: .25em 0
.message-meta
font-size: smaller
color: var(--text-alt)
.shorten
max-height: 18em
overflow-y: hidden
position: relative
&::after
content: ''
position: absolute
z-index: 10
top: 16em
left: 0
width: 100%
height: 2em
display: block
background: linear-gradient(to bottom, rgba(0,0,0,0) 0%, var(--background) 100%)
.comments-button
.comment-count
display: inline-block
min-width: 1em
text-align: center
i.icon
font-size: inherit
font-style: normal
form.boundaryless
flex: 1
background: transparent
color: inherit
border: 0
border-top: 1px solid var(--border)
border-bottom: 1px solid var(--border)
dd
display: flex
flex-direction: row
width: 100%
box-sizing: border-box
margin: 0
textarea, input[type="text"]
width: 100%
textarea
min-height: 4em
p input[type="text"]
width: unset
.big-search-bar
form
display: flex
flex-direction: row
font-size: 1.6em
width: 80%
margin: auto
> [type="search"]
flex: 1
border-bottom: 2px solid var(--border)
footer.footer
text-align: center
font-size: smaller
ul
list-style: none
padding: 0
margin: 0
> li
display: inline-block
margin: 0 2em
textarea.comment-area
width: 100%
button, [type="submit"], [type="reset"], [type="button"]
background-color: transparent
color: var(--accent)
border: 1px solid var(--accent)
border-radius: 6px
padding: 6px 12px
margin: 6px
cursor: pointer
&.primary
background-color: var(--accent)
color: var(--background)
&[disabled]
opacity: .5
cursor: not-allowed
border: var(--border)
color: var(--border)
&.primary[disabled]
color: var(--background)
background-color: var(--border)
&:first-child
margin-inline-start: 0
&:last-child
margin-inline-end: 0
.button-row-right
display: flex
flex-direction: row
justify-content: flex-end
.comment-frame
border: 1px solid var(--border)
background: var(--background)
padding: 12px 12px 6px
border-radius: 24px
border-start-start-radius: 0
min-width: 50%
width: 0
margin-inline-end: auto
margin-bottom: 12px
position: relative
&::before
content: ''
border: 1px solid var(--border)
border-inline-end: 0
border-bottom: 0
background: var(--background)
height: 1em
width: 1em
position: absolute
left: calc(-1px - .5em)
top: -1px
transform: skewX(45deg)
li:has(> &)
list-style: none
.border-accent
border: var(--accent) 1px solid
display: inline-flex
align-items: center
padding: 0 4px
.round
border-radius: 1em
.done
opacity: .5
button.card
width: 100%
padding: .5em 1em
background-color: transparent
border-color: var(--accent)
color: var(--accent)
border-radius: 1em
&.primary
background-color: var(--accent)
color: var(--background)
.big_icon
display: block
margin: 12px auto
font-size: 36px
text-align: center
textarea.create_text
min-height: 8em
// specificity ew //
form.boundaryless &
min-height: 8em
\:is(input, select, textarea).fullwidth
width: 100%
padding: 0
label:has([type="checkbox"]:not(:checked))
opacity: .75

View file

@ -1,87 +0,0 @@
@media screen and (max-width: 800px)
.content-container
display: block
.content-nav, .content-main
width: 100%
ul.grid
grid-template-columns: 1fr 1fr
.nomobile
display: none !important
body
position: relative
footer.mobile-nav
position: sticky
bottom: 0
left: 0
width: 100%
overflow: hidden
margin: 0
padding: 0
background-color: var(--background)
box-shadow: 0 0 6px var(--border)
z-index: 150
> ul
display: flex
list-style: none
margin: 0
padding: 0
flex-direction: row
align-items: stretch
justify-content: stretch
> li
flex: 1
padding: .5em
margin: 0
text-align: center
a
text-decoration: none
.icon
font-size: 2rem
.content-nav
margin: 1em
width: unset
header.header h1
margin-top: 4px
margin-left: 6px
.content-header
text-align: center
.big-search-bar form
flex-direction: column
[type="submit"]
width: unset
margin: 12px auto
@media screen and (max-width: 960px)
.header-username
display: none
header.header
padding: .5em .5em
.mini-search-bar
display: none
+ a
display: inline-block
ul > li:has(.mini-search-bar)
flex: unset
// not mobile: //
@media screen and (min-width: 801px)
.mobileonly
display: none !important

View file

@ -1,4 +0,0 @@
@import "base.sass"
@import "layout.sass"
@import "content.sass"
@import "mobile.sass"

View file

@ -16,9 +16,8 @@ dependencies = [
"Alembic", "Alembic",
"Markdown>=3.0.0", "Markdown>=3.0.0",
"PsycoPG2-binary", "PsycoPG2-binary",
"libsass",
"setuptools>=78.1.0", "setuptools>=78.1.0",
"sakuragasaki46-suou>=0.4.0" "suou[sqlalchemy]>=0.14.2"
] ]
requires-python = ">=3.10" requires-python = ">=3.10"
classifiers = [ classifiers = [