Better theme support

This commit is contained in:
Thomas Sileo 2018-07-01 11:40:44 +02:00
parent 3bf77b2e82
commit a5b7e21600
8 changed files with 51 additions and 187 deletions

View file

@ -1,9 +1,11 @@
import os import os
import subprocess import subprocess
from datetime import datetime from datetime import datetime
from enum import Enum
import requests import requests
import yaml import yaml
import sass
from itsdangerous import JSONWebSignatureSerializer from itsdangerous import JSONWebSignatureSerializer
from pymongo import MongoClient from pymongo import MongoClient
@ -13,6 +15,19 @@ from utils.key import get_key
from utils.key import get_secret_key from utils.key import get_secret_key
class ThemeStyle(Enum):
LIGHT = "light"
DARK = "dark"
DEFAULT_THEME_STYLE = ThemeStyle.LIGHT.value
DEFAULT_THEME_PRIMARY_COLOR = {
ThemeStyle.LIGHT: "#1d781d", # Green
ThemeStyle.DARK: "#e14eea", # Purple
}
def noop(): def noop():
pass pass
@ -54,8 +69,22 @@ with open(os.path.join(KEY_DIR, "me.yml")) as f:
ICON_URL = conf["icon_url"] ICON_URL = conf["icon_url"]
PASS = conf["pass"] PASS = conf["pass"]
PUBLIC_INSTANCES = conf.get("public_instances", []) PUBLIC_INSTANCES = conf.get("public_instances", [])
# TODO(tsileo): choose dark/light style
THEME_COLOR = conf.get("theme_color") # Theme-related config
theme_conf = conf.get("theme", {})
THEME_STYLE = ThemeStyle(theme_conf.get("style", DEFAULT_THEME_STYLE))
THEME_COLOR = theme_conf.get("color", DEFAULT_THEME_PRIMARY_COLOR[THEME_STYLE])
SASS_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "sass")
theme_css = f"$primary-color: {THEME_COLOR};\n"
with open(os.path.join(SASS_DIR, f"{THEME_STYLE.value}.scss")) as f:
theme_css += f.read()
theme_css += '\n'
with open(os.path.join(SASS_DIR, "base_theme.scss")) as f:
raw_css = theme_css + f.read()
CSS = sass.compile(string=raw_css)
USER_AGENT = ( USER_AGENT = (
f"{requests.utils.default_user_agent()} (microblog.pub/{VERSION}; +{BASE_URL})" f"{requests.utils.default_user_agent()} (microblog.pub/{VERSION}; +{BASE_URL})"

View file

@ -1,24 +1,3 @@
// a4.io dark theme
$background-color: #060606;
$background-light: #222;
$color: #808080;
$color-title-link: #fefefe;
$color-summary: #ddd;
$color-light: #bbb;
$color-menu-background: #222;
$color-note-link: #666;
$primary-color: #f7ca18;
$background-color: #eee;
$background-light: #ccc;
$color: #111;
$color-title-link: #333;
$color-light: #555;
$color-summary: #111;
$color-note-link: #333;
$color-menu-background: #ddd;
$primary-color: #1d781d;
.note-container p:first-child { .note-container p:first-child {
margin-top: 0; margin-top: 0;
} }

8
sass/dark.scss Normal file
View file

@ -0,0 +1,8 @@
$background-color: #060606;
$background-light: #222;
$color: #808080;
$color-title-link: #fefefe;
$color-summary: #ddd;
$color-light: #bbb;
$color-menu-background: #222;
$color-note-link: #666;

9
sass/light.scss Normal file
View file

@ -0,0 +1,9 @@
$background-color: #eee;
$background-light: #ccc;
$color: #111;
$color-title-link: #333;
$color-light: #555;
$color-summary: #111;
$color-note-link: #333;
$color-menu-background: #ddd;
// $primary-color: #1d781d;

View file

@ -1,160 +0,0 @@
.note-container p:first-child {
margin-top: 0;
}
html, body {
height: 100%;
}
body {
background-color: #060606;
color: #808080;
display: flex;
flex-direction: column;
}
.base-container {
flex: 1 0 auto;
}
.footer {
flex-shrink: 0;
}
a, h1, h2, h3, h4, h5, h6 {
color: #fefefe;
}
a {
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
.gold {
color: #f7ca18;
}
#header {
margin-bottom: 40px;
}
#header .h-card {
}
#header .title {
font-size:1.2em;padding-right:15px;color:#fefefe;
}
#header .title:hover {
text-decoration: none;
}
#header .menu {
padding: 20px 0 10px 0;
}
#header .menu ul {
display:inline;list-style-type:none;padding:0;
}
#header .menu li {
float:left;
padding-right:10px;
margin-bottom:10px;
}
#header .menu a {
padding: 2px 7px;
}
#header .menu a.selected {
background:#f7ca18;color:#634806;
border-radius:2px;
}
#header .menu a:hover {
background:#f7ca18;color:#060606;
text-decoration: none;
}
#container {
width:90%;max-width: 720px;margin:40px auto;
}
#container #notes {
margin-top:20px;
}
.actor-box {
display:block;text-decoration:none;margin-bottom:40px;
}
.actor-box .actor-icon {
width: 100%;
max-width:120px;
border-radius:2px;
}
.actor-box h3 { margin:0; }
.note .l {
color:#666;
}
.note {
display:flex;margin-bottom:70px;
}
.note .h-card {
flex:initial;width:50px;
}
.note .u-photo {
width:50px;border-radius:2px;
}
.note .note-wrapper {
flex:1;padding-left:15px;
}
.note .bottom-bar {
margin-top:10px;
}
.bar-item {
background: #222;
padding: 5px;
color:#bbb;
margin-right:5px;
border-radius:2px;
}
.bottom-bar .perma-item {
margin-right:5px;
}
.bottom-bar a.bar-item:hover {
text-decoration: none;
}
.note .img-attachment {
max-width:100%;
border-radius:2px;
}
.note h3 {
font-size:1.1em;color:#ccc;
}
.note .note-container {
clear:right;padding:10px 0;
}
.note strong {
font-weight:600;
}
.footer > div {
width:90%;max-width: 720px;margin:40px auto;
}
.footer a, .footer a:hover, .footer a:visited {
text-decoration:underline;
color:#808080;
}
.summary {
color: #ddd;
font-size:1.3em;
margin-top:50px;
margin-bottom:70px;
}
.summary a, .summay a:hover {
color:#ddd;
text-decoration:underline;
}
#followers, #following, #new {
margin-top:50px;
}
#admin {
margin-top:50px;
}
textarea, input {
background: #222;
padding: 10px;
color: #bbb;
border: 0px;
border-radius: 2px;
}
input {
padding: 10px;
}
input[type=submit] {
color: #f7ca18;
text-transform: uppercase;
}

View file

@ -1,2 +0,0 @@
*
!.gitignore

View file

@ -1 +0,0 @@
.note-container p:first-child{margin-top:0}html,body{height:100%}body{background-color:#eee;color:#111;display:flex;flex-direction:column}.base-container{flex:1 0 auto}.footer{flex-shrink:0}a,h1,h2,h3,h4,h5,h6{color:#333}a{text-decoration:none}a:hover{text-decoration:underline}.gold{color:#1d781d}#header{margin-bottom:70px}#header .title{font-size:1.2em;padding-right:15px;color:#333}#header .title:hover{text-decoration:none}#header .subtitle-username{color:#111}#header .menu{clear:both;padding:0 0 10px 0}#header .menu ul{display:inline;list-style-type:none;padding:0}#header .menu ul li{float:left;padding-right:10px;margin-bottom:10px}#header .menu a{padding:5px 10px}#header .menu a small.badge{background-color:#ddd;color:#555;border-radius:2px;margin-left:5px;padding:3px 5px 0px 5px;font-weight:bold}#header .menu a.selected{background:#1d781d;color:#eee;border-radius:2px}#header .menu a.selected .badge{color:#1d781d;background:#eee}#header .menu a:hover{background:#1d781d;color:#eee;text-decoration:none;border-radius:2px}#header .menu a:hover .badge{color:#1d781d;background:#eee}#container{width:90%;max-width:720px;margin:40px auto}#container #notes{margin-top:20px}.actor-box{display:block;text-decoration:none;margin-bottom:40px}.actor-box .actor-icon{width:120px;border-radius:2px}.actor-box h3{margin:0}.actor-box .actor-inline{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.actor-box-big{display:block;text-decoration:none}.actor-box-big .actor-box-wrapper{margin-bottom:40px}.actor-box-big .actor-box-wrapper .actor-icon{width:120px;border-radius:2px}.actor-box-big .actor-box-wrapper h3{margin:0}.note{display:flex;margin-bottom:70px}.note .l{color:#333}.note .h-card{flex:initial;width:50px}.note .u-photo{width:50px;border-radius:2px}.note .note-wrapper{flex:1;padding-left:15px}.note .bottom-bar{margin-top:10px}.note .img-attachment{max-width:100%;border-radius:2px}.note h3{font-size:1.1em;color:#555}.note strong{font-weight:600}.note .note-container{clear:right;padding:10px 0}.bar-item{background:#ddd;padding:5px;color:#555;margin-right:5px;border-radius:2px}button.bar-item{border:0}form.action-form{display:inline}.perma{font-size:1.25em}.bottom-bar .perma-item{margin-right:5px}.bottom-bar a.bar-item:hover{text-decoration:none}.footer>div{width:90%;max-width:720px;margin:40px auto}.footer a,.footer a:hover,.footer a:visited{text-decoration:underline;color:#111}.summary{color:#111;font-size:1.1em;margin-top:10px;margin-bottom:30px}.summary a,.summay a:hover{color:#111;text-decoration:underline}#followers,#following,#new{margin-top:50px}#admin{margin-top:50px}textarea,input{background:#ddd;padding:10px;color:#555;border:0px;border-radius:2px}input{padding:10px}input[type=submit]{color:#1d781d;text-transform:uppercase}

View file

@ -6,7 +6,6 @@
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>{% block title %}{{ config.NAME }}{% endblock %} - microblog.pub</title> <title>{% block title %}{{ config.NAME }}{% endblock %} - microblog.pub</title>
<link rel="stylesheet" href="https://unpkg.com/purecss@1.0.0/build/pure-min.css" integrity="sha384-nn4HPE8lTHyVtfCBi5yW9d20FjT8BJwUXyWZT9InLYax14RDjBj46LmSztkmNP9w" crossorigin="anonymous"> <link rel="stylesheet" href="https://unpkg.com/purecss@1.0.0/build/pure-min.css" integrity="sha384-nn4HPE8lTHyVtfCBi5yW9d20FjT8BJwUXyWZT9InLYax14RDjBj46LmSztkmNP9w" crossorigin="anonymous">
<link rel="stylesheet" href="/static/css/theme.css">
<link rel="authorization_endpoint" href="{{ config.ID }}/indieauth"> <link rel="authorization_endpoint" href="{{ config.ID }}/indieauth">
<link rel="token_endpoint" href="{{ config.ID }}/token"> <link rel="token_endpoint" href="{{ config.ID }}/token">
<link rel="micropub" href="{{ config.ID }}/micropub"> <link rel="micropub" href="{{ config.ID }}/micropub">
@ -15,6 +14,9 @@
<link rel="alternate" href="{{ config.ID }}/feed.rss" type="application/rss+xml" title="RSS"> <link rel="alternate" href="{{ config.ID }}/feed.rss" type="application/rss+xml" title="RSS">
<link rel="alternate" href="{{ config.ID }}/feed.atom" type="application/atom+xml" title="Atom 0.3"> <link rel="alternate" href="{{ config.ID }}/feed.atom" type="application/atom+xml" title="Atom 0.3">
{% if config.THEME_COLOR %}<meta name="theme-color" content="{{ config.THEME_COLOR }}">{% endif %} {% if config.THEME_COLOR %}<meta name="theme-color" content="{{ config.THEME_COLOR }}">{% endif %}
<style>
{{ config.CSS }}
</style>
</head> </head>
<body> <body>
<div class="base-container"> <div class="base-container">