Merge branch 'main' of gitlab.com:bashrc2/epicyon

merge-requests/30/head
Bob Mottram 2022-04-05 13:59:06 +01:00
commit 31806d6f2d
9 changed files with 367 additions and 48 deletions

View File

@ -13,6 +13,7 @@ VALID_CONTEXTS = (
"https://w3id.org/identity/v1",
"https://w3id.org/security/v1",
"*/apschema/v1.9",
"*/apschema/v1.10",
"*/apschema/v1.21",
"*/apschema/v1.20",
"*/litepub-0.1.jsonld",
@ -156,6 +157,44 @@ def getApschemaV1_20() -> {}:
}
def getApschemaV1_10() -> {}:
# https://domain/apschema/v1.10
return {
'@context': {
'Hashtag': 'as:Hashtag',
'PropertyValue': 'schema:PropertyValue',
'commentPolicy': 'zot:commentPolicy',
'conversation': 'ostatus:conversation',
'diaspora': 'https://diasporafoundation.org/ns/',
'directMessage': 'zot:directMessage',
'emojiReaction': 'zot:emojiReaction',
'expires': 'zot:expires',
'guid': 'diaspora:guid',
'id': '@id',
'locationAddress': 'zot:locationAddress',
'locationDeleted': 'zot:locationDeleted',
'locationPrimary': 'zot:locationPrimary',
'magicEnv': {'@id': 'zot:magicEnv', '@type': '@id'},
'manuallyApprovesFollowers': 'as:manuallyApprovesFollowers',
'meAlgorithm': 'zot:meAlgorithm',
'meCreator': 'zot:meCreator',
'meData': 'zot:meData',
'meDataType': 'zot:meDataType',
'meEncoding': 'zot:meEncoding',
'meSignatureValue': 'zot:meSignatureValue',
'nomadicHubs': 'zot:nomadicHubs',
'nomadicLocation': 'zot:nomadicLocation',
'nomadicLocations': {'@id': 'zot:nomadicLocations',
'@type': '@id'},
'ostatus': 'http://ostatus.org#',
'schema': 'http://schema.org#',
'type': '@type',
'value': 'schema:value',
'zot': 'https://hubzilla.vikshepa.com/apschema#'
}
}
def getApschemaV1_21() -> {}:
# https://domain/apschema/v1.21
return {

View File

@ -16,7 +16,6 @@ import datetime
from socket import error as SocketError
import errno
from functools import partial
import pyqrcode
# for saving images
from hashlib import sha256
from hashlib import md5
@ -389,6 +388,7 @@ from webapp_likers import html_likers_of_post
from crawlers import update_known_crawlers
from crawlers import blocked_user_agent
from crawlers import load_known_web_bots
from qrcode import save_domain_qrcode
import os
@ -416,16 +416,6 @@ FOLLOWS_PER_PAGE = 6
SHARES_PER_PAGE = 12
def save_domain_qrcode(base_dir: str, http_prefix: str,
domain_full: str, scale=6) -> None:
"""Saves a qrcode image for the domain name
This helps to transfer onion or i2p domains to a mobile device
"""
qrcode_filename = base_dir + '/accounts/qrcode.png'
url = pyqrcode.create(http_prefix + '://' + domain_full)
url.png(qrcode_filename, scale)
class PubServer(BaseHTTPRequestHandler):
protocol_version = 'HTTP/1.1'
@ -2521,7 +2511,7 @@ class PubServer(BaseHTTPRequestHandler):
system_language)
set_theme(base_dir, theme_name, domain,
allow_local_network_access, system_language,
dyslexic_font)
dyslexic_font, True)
if calling_domain.endswith('.onion') and onion_domain:
origin_path_str = \
@ -5600,7 +5590,7 @@ class PubServer(BaseHTTPRequestHandler):
set_theme(base_dir, self.server.theme_name, domain,
allow_local_network_access,
system_language,
self.server.dyslexic_font)
self.server.dyslexic_font, True)
self.server.text_mode_banner = \
get_text_mode_banner(self.server.base_dir)
self.server.iconsCache = {}
@ -6555,7 +6545,7 @@ class PubServer(BaseHTTPRequestHandler):
set_theme(base_dir, curr_theme, domain,
allow_local_network_access,
system_language,
self.server.dyslexic_font)
self.server.dyslexic_font, False)
self.server.text_mode_banner = \
get_text_mode_banner(base_dir)
self.server.iconsCache = {}
@ -6852,7 +6842,7 @@ class PubServer(BaseHTTPRequestHandler):
self.server.domain,
self.server.allow_local_network_access,
self.server.system_language,
self.server.dyslexic_font)
self.server.dyslexic_font, False)
# low bandwidth images checkbox
if path.startswith('/users/' + admin_nickname + '/') or \

View File

@ -3399,7 +3399,7 @@ if twitter_domain:
if set_theme(base_dir, theme_name, domain,
args.allow_local_network_access, args.language,
args.dyslexic_font):
args.dyslexic_font, False):
print('Theme set to ' + theme_name)
# whether new registrations are open or closed

View File

@ -119,6 +119,7 @@ ANNABA, ALGERIA:36.8222:7.80917:49
ANNECY, FRANCE:45.9292:6.09861:66
ANNEMASSE, FRANCE:46.1919:6.26833:4
ANNISTON, USA:33.5881:W85.8581:118
ANSAN, KOREA:37.316667:126.833333:716
ANTALYA, TURKEY:36.9014:30.7917:1417
ANTANANARIVO, MADAGASCAR:-18.7967:47.4786:85
ANTA, PERU:-9.34722:W77.5983:202
@ -400,7 +401,7 @@ BURGOS, SPAIN:42.3575:W3.62056:107
BURLINGTON, USA:44.4717:W73.1531:40
BURSA, TURKEY:40.2317:29.0092:1036
BURWASH, CANADA:61.3711:W139.041:30
BUSAN, KOREA:35.1708:129.129:770
BUSAN, KOREA:35.166667:129.066667:770
BUSHEHR, IRAN:28.9447:50.8344:50
BYDGOSZCZ, POLAND:53.121944:18.000278:175
CABALLOCOCHA, PERU:-3.91667:W70.5081
@ -511,6 +512,7 @@ CHAMBERY, FRANCE:45.5608:5.97556
CHANDIGARH, INDIA:30.6733:76.7883
CHANDRAGARHI, NEPAL:26.5706:88.0794
CHANGCHA, CHINA:28.1889:113.219:11819
CHANGWON, KOREA:35.270833:128.663056:747
CHANGUINOLA, PANAMA:9.45861:W82.5167
CHANIA, GREECE:35.5317:24.1494:12
CHAPACURA, BOLIVIA:-16.99:W65.1414
@ -533,6 +535,8 @@ CHATTANOOGA, USA:35.0353:W85.2036
CHEJU, KOREA:33.5111:126.493
CHELYABINSK, RUSSIA:55.3033:61.5067:530
CHENGDU, CHINA:30.5783:103.947:14378
CHEONAN, KOREA:36.816667:127.166667:636
CHEONGJU, KOREA:36.633333:127.483333:940
CHERBOURG, FRANCE:49.65:W1.47028:14
CHERKASY, UKRAINE:49.444444:32.059722:69
CHERNIVTSI, UKRAINE:48.3:25.933333:153
@ -699,7 +703,9 @@ CURUZU CUATIA, ARGENTINA:-29.7706:W57.9789
CUTBANK, USA:48.6083:W112.376
CUTRALCO, ARGENTINA:-38.9394:W69.2644
CUZCO, PERU:-13.5356:W71.9386
DAEJEON, KOREA:36.351:127.385:539
DAET, PHILIPPINES:14.1292:122.98
GAEGU, KOREA:35.866667:128.6:883
DAGLI, NORWAY:60.4167:8.51389
DAHRA, LIBYA:29.4697:17.9311
DAKAR, SENEGAL:14.7394:W17.49
@ -1138,6 +1144,7 @@ GUNUNG SITOLI, INDONESIA:1.16639:97.7028
GURIAT, SAUDI ARABIA:31.4108:37.2789
GUSAU, NIGERIA:12.1717:6.69611
GWADAR, PAKISTAN:25.2331:62.3294
GWANGJU, KOREA:35.166667:126.916667:501
GWALIOR, INDIA:26.2939:78.2275
GWERT, ZIMBABWE:-19.4367:29.8617
GWINN, USA:46.3536:W87.3958
@ -1272,6 +1279,7 @@ HURGHADA, EGYPT:27.1839:33.7983
HURON, USA:44.385:W98.2283
HUSAVIK, ICELAND:65.9522:W17.4258
HWANGE NATIONAL PARK, ZIMBABWE:-18.6297:27.0208
HWASEONG, KOREA:37.199722:126.831389:689
HYAKURI, JAPAN:36.1808:140.415
HYDERABAD, INDIA:17.4522:78.4611
HYDERABAD, PAKISTAN:25.3181:68.3661
@ -1304,6 +1312,7 @@ IMPERATRIZ, BRAZIL:-5.53111:W47.46
IMPERIAL, USA:32.8342:W115.579
IMPFONDO, CONGO:1.58944:18.0469
IMPHAL, INDIA:24.7597:93.8969
INCHEON, KOREA:37.483333:126.633333:1062
INDIANAPOLIS, USA:39.7172:W86.2942:936
INDIAN MOUNTAINS, USA:65.9928:W153.704
INDIAN SPRINGS, USA:36.5869:W115.673
@ -1381,6 +1390,7 @@ JAYAPURA, INDONESIA:-2.57694:140.516
JEBEL DHANA, UNITED ARAB EMIRATES:24.1872:52.6139
JEDDAH, SAUDI ARABIA:21.3481:39.1728
JENA, GERMANY:50.9172:11.7136:114
JEONJU, KOREA:35.816667:127.15:206
JEREZ, SPAIN:36.7444:W6.06
JERSEY, ENGLAND:51.7682578:W0.293425
JERUSALEM, ISRAEL:31.8667:35.2167
@ -3036,8 +3046,7 @@ SEMBAWANG, SINGAPORE:1.42361:103.811
SEMNAN, IRAN:35.5908:53.495
SENDAI, JAPAN:38.1394:140.917
SEO DE URGEL, SPAIN:42.3386:1.40917
SEOUL EAST, KOREA:37.4458:127.114
SEOUL, KOREA:37.5581:126.791
SEOUL, KOREA:37.56:126.99:605
SEPAH, IRAN:32.6208:51.6967
SEPT-ILES, CANADA:50.2233:W66.2656
SETIF, ALGERIA:36.1781:5.32444
@ -3220,7 +3229,7 @@ SURAT, INDIA:21.115:72.7428
SURAT THANI, THAILAND:9.54778:100.062
SURGUT, RUSSIA:61.25:73.5:354
SURIN, THAILAND:14.8692:103.489
SUWON, KOREA:37.2392:127.007
SUWON, KOREA:37.266667:127.016667:121
SVALBARD, NORWAY:78.2461:15.4656
SVARTNES, NORWAY:70.3553:31.0447
SVEG, SWEDEN:62.0478:14.4228

View File

@ -39,6 +39,7 @@ from collections import deque, namedtuple
from numbers import Integral, Real
from context import getApschemaV1_9
from context import getApschemaV1_10
from context import getApschemaV1_20
from context import getApschemaV1_21
from context import getLitepubV0_1
@ -410,6 +411,13 @@ def load_document(url):
'document': getApschemaV1_9()
}
return doc
elif url.endswith('/apschema/v1.10'):
doc = {
'contextUrl': None,
'documentUrl': url,
'document': getApschemaV1_10()
}
return doc
elif url.endswith('/apschema/v1.20'):
doc = {
'contextUrl': None,

20
qrcode.py 100644
View File

@ -0,0 +1,20 @@
__filename__ = "qrcode.py"
__author__ = "Bob Mottram"
__license__ = "AGPL3+"
__version__ = "1.3.0"
__maintainer__ = "Bob Mottram"
__email__ = "bob@libreserver.org"
__status__ = "Production"
__module_group__ = "Core"
import pyqrcode
def save_domain_qrcode(base_dir: str, http_prefix: str,
domain_full: str, scale: int = 6) -> None:
"""Saves a qrcode image for the domain name
This helps to transfer onion or i2p domains to a mobile device
"""
qrcode_filename = base_dir + '/accounts/qrcode.png'
url = pyqrcode.create(http_prefix + '://' + domain_full)
url.png(qrcode_filename, scale)

View File

@ -528,7 +528,7 @@ def set_theme_from_designer(base_dir: str, theme_name: str, domain: str,
save_json(theme_params, custom_theme_filename)
set_theme(base_dir, theme_name, domain,
allow_local_network_access, system_language,
dyslexic_font)
dyslexic_font, False)
def reset_theme_designer_settings(base_dir: str, theme_name: str, domain: str,
@ -575,24 +575,30 @@ def _set_theme_default(base_dir: str, allow_local_network_access: bool):
name = 'default'
_remove_theme(base_dir)
_set_theme_in_config(base_dir, name)
bg_params = {
"login": "jpg",
"follow": "jpg",
"options": "jpg",
"search": "jpg"
}
theme_params = {
"newswire-publish-icon": True,
"full-width-timeline-buttons": False,
"icons-as-buttons": False,
"rss-icon-at-top": True,
"publish-button-at-top": False,
"banner-height": "20vh",
"banner-height-mobile": "10vh",
"search-banner-height-mobile": "15vh"
}
_set_theme_from_dict(base_dir, name, theme_params, bg_params,
allow_local_network_access)
variables_file = base_dir + '/theme/' + name + '/theme.json'
if os.path.isfile(variables_file):
_read_variables_file(base_dir, name, variables_file,
allow_local_network_access)
else:
bg_params = {
"login": "jpg",
"follow": "jpg",
"options": "jpg",
"search": "jpg"
}
theme_params = {
"newswire-publish-icon": True,
"full-width-timeline-buttons": False,
"icons-as-buttons": False,
"rss-icon-at-top": True,
"publish-button-at-top": False,
"banner-height": "20vh",
"banner-height-mobile": "10vh",
"search-banner-height-mobile": "15vh"
}
_set_theme_from_dict(base_dir, name, theme_params, bg_params,
allow_local_network_access)
def _set_theme_fonts(base_dir: str, theme_name: str) -> None:
@ -846,7 +852,7 @@ def _set_clear_cache_flag(base_dir: str) -> None:
def set_theme(base_dir: str, name: str, domain: str,
allow_local_network_access: bool, system_language: str,
dyslexic_font: bool) -> bool:
dyslexic_font: bool, designer_reset: bool) -> bool:
"""Sets the theme with the given name as the current theme
"""
result = False
@ -854,7 +860,7 @@ def set_theme(base_dir: str, name: str, domain: str,
prev_theme_name = get_theme(base_dir)
# if the theme has changed then remove any custom settings
if prev_theme_name != name:
if prev_theme_name != name or designer_reset:
reset_theme_designer_settings(base_dir, name, domain,
allow_local_network_access,
system_language)
@ -867,7 +873,8 @@ def set_theme(base_dir: str, name: str, domain: str,
theme_name_lower = theme_name.lower()
if name == theme_name_lower:
if prev_theme_name:
if prev_theme_name.lower() != theme_name_lower:
if prev_theme_name.lower() != theme_name_lower or \
designer_reset:
# change the banner and profile image
# to the default for the theme
_set_theme_images(base_dir, name)

View File

@ -1,12 +1,258 @@
{
"post-separator-margin-top": "10px",
"post-separator-margin-bottom": "10px",
{
"newswire-publish-icon": "True",
"full-width-timeline-buttons": "False",
"full-width-timeline-buttons": "False",
"icons-as-buttons": "False",
"rss-icon-at-top": "True",
"publish-button-at-top": "False",
"banner-height": "20vh",
"search-banner-height": "30vh",
"search-banner-height-mobile": "15vh",
"likes-names-margin": "2%",
"likes-names-size1": "30px",
"likes-names-size2": "40px",
"liker-names-margin": "2%",
"liker-names-vertical-spacing1": "50px",
"liker-names-vertical-spacing2": "100px",
"pwa-theme-color": "apple-mobile-web-app-status-bar-style",
"pwa-theme-background-color": "black-translucent",
"avatar-rounding": "10%",
"timeline-icon-width": "50px",
"timeline-icon-width-mobile": "100px",
"timeline-icon-width-tiny": "50px",
"cw-style": "normal",
"cw-weight": "bold",
"column-right-fg-color-voted-on": "red",
"font-size-header": "18px",
"font-size-header-mobile": "32px",
"font-size-header-tiny": "16px",
"font-size-button-tiny": "13px",
"font-size-publish-button": "18px",
"font-size-newswire-tiny": "16px",
"font-size-dropdown-header": "40px",
"font-size-dropdown-header-tiny": "20px",
"font-size-mobile": "50px",
"font-size-tiny": "25px",
"font-size-likes-mobile": "64px",
"font-size-likes-tiny": "16px",
"likes-margin-left-tiny": "10px",
"likes-margin-right-tiny": "10px",
"likes-margin-top-tiny": "-10px",
"likes-margin-left-mobile": "20px",
"likes-margin-right-mobile": "0px",
"likes-margin-top-mobile": "0px",
"font-size-pgp-key": "16px",
"font-size-pgp-key2": "18px",
"font-size-tox": "16px",
"font-size-tox2": "18px",
"font-size-emoji-reaction": "16px",
"font-size-emoji-reaction-mobile": "24px",
"font-size-emoji-reaction-tiny": "12px",
"follow-text-size1": "24px",
"follow-text-size2": "40px",
"follow-text-entry-width": "90%",
"time-color": "#aaa",
"time-vertical-align": "0%",
"time-vertical-align-mobile": "1.5%",
"time-vertical-align-tiny": "0.75%",
"publish-button-text": "#FFFFFF",
"button-margin": "5px",
"button-left-margin": "none",
"button-text": "#FFFFFF",
"button-selected-text": "#FFFFFF",
"publish-button-background": "#999",
"button-background": "#999",
"button-background-hover": "#777",
"button-text-hover": "white",
"button-selected": "#666",
"button-fg-highlighted": "#FFFFFF",
"button-deny": "darkred",
"button-width-chars": "10ch",
"button-height": "10px",
"button-height-padding-mobile": "20px",
"button-height-padding-tiny": "10px",
"button-height-padding": "10px",
"image-corners": "10%",
"gallery-border": "#ccc",
"gallery-hover": "#777",
"gallery-font-size": "22px",
"gallery-font-size-mobile": "35px",
"gallery-font-size-tiny": "17.5px",
"icons-side": "right",
"quote-right-margin": "0.1em",
"quote-font-weight": "normal",
"quote-font-size": "120%",
"quote-font-size-mobile": "120%",
"quote-font-size-tiny": "60%",
"line-spacing": "180%",
"line-spacing-newswire": "120%",
"column-left-width": "10vw",
"column-center-width": "80vw",
"column-right-width": "10vw",
"column-left-mobile-margin": "2%",
"column-left-tiny-margin": "1%",
"column-left-top-margin": "0",
"column-right-top-margin": "0",
"column-left-header-style": "uppercase",
"column-left-header-background": "#555",
"column-left-header-color": "#fff",
"column-left-header-size": "20px",
"column-left-header-size-mobile": "50px",
"column-left-header-size-tiny": "25px",
"column-left-border-width": "0",
"column-left-icons-margin": "0",
"column-right-border-width": "0",
"column-left-border-color": "black",
"column-left-icon-size": "2.1vw",
"column-left-icon-size-mobile": "10%",
"column-left-icon-size-tiny": "5%",
"column-left-image-width-mobile": "40vw",
"column-left-image-width-tiny": "20vw",
"column-right-image-width-mobile": "100vw",
"column-right-image-width-tiny": "50vw",
"column-right-icon-size": "2.1vw",
"column-right-icon-size-mobile": "10%",
"column-right-icon-size-tiny": "5%",
"newswire-voted-background-color": "black",
"login-button-fg-color": "black",
"button-event-corner-radius": "60px",
"button-event-fg-color": "white",
"hashtag-fg-color": "white",
"tab-border-width": "0px",
"tab-border-color": "grey",
"icon-brightness-change": "150%",
"container-button-padding": "20px",
"header-button-padding": "20px",
"container-padding": "2%",
"container-padding-bottom": "1%",
"container-padding-bottom-mobile": "0%",
"container-padding-bottom-tiny": "0%",
"vertical-between-posts": "10px",
"vertical-between-posts-header": "10px",
"containericons-horizontal-spacing": "1%",
"containericons-horizontal-spacing-mobile": "3%",
"containericons-horizontal-spacing-tiny": "1.5%",
"containericons-horizontal-offset": "-1%",
"containericons-vertical-align": "0.5%",
"containericons-vertical-align-mobile": "1%",
"containericons-vertical-align-tiny": "0.5%",
"likes-count-offset": "5px",
"publish-button-vertical-offset": "10px",
"publish-button-bottom-offset": "10px",
"banner-height-mobile": "10vh",
"search-banner-height-mobile": "15vh"
"banner-height-tiny": "10vh",
"post-separator-background": "transparent",
"post-separator-width": "95%",
"separator-width-left": "95%",
"separator-width-right": "95%",
"post-separator-height": "1px",
"header-vertical-offset": "0",
"profile-background-height": "25vw",
"profile-text-align": "left",
"verticals-width": "0",
"italic-font-style": "italic",
"button-bottom-margin": "10px",
"rendering": "normal",
"voteresult-color": "#dddddd",
"voteresult-border-color": "#aaaaaa",
"voteresult-height": "32px",
"voteresult-height-mobile": "32px",
"voteresult-height-tiny": "16px",
"voteresult-width": "80%",
"voteresult-width-mobile": "80%",
"voteresult-width-tiny": "40%",
"vcard-icon-size": "32px",
"vcard-icon-size-mobile": "80px",
"vcard-icon-size-tiny": "80px",
"lines-color": "grey",
"place-color": "black",
"event-color": "grey",
"event-public-color": "#282c37",
"today-foreground": "black",
"today-circle": "grey",
"event-background": "black",
"event-background-private": "#222",
"event-foreground": "white",
"title-text": "white",
"title-background": "grey",
"calendar-horizontal-padding": "0",
"calendar-cell-size": "1.5vw",
"calendar-cell-size-mobile": "1.5vw",
"calendar-cell-size-tiny": "1.5vw",
"font-size-calendar": "20px",
"font-size-calendar-mobile": "30px",
"font-size-calendar-tiny": "15px",
"font-size-calendar-header": "3rem",
"font-size-calendar-day": "1rem",
"font-size-calendar-cell": "2rem",
"font-size-calendar-cell-mobile": "4rem",
"font-size-calendar-cell-tiny": "2rem",
"calendar-header-font": "'Montserrat'",
"calendar-header-font-style": "italic",
"ical-icon-size": "32px",
"ical-icon-size-mobile": "80px",
"ical-icon-size-tiny": "80px",
"hashtag-vertical-spacing1": "50px",
"hashtag-vertical-spacing2": "100px",
"hashtag-vertical-spacing3": "100px",
"hashtag-vertical-spacing4": "150px",
"hashtag-size1": "30px",
"hashtag-size2": "40px",
"hashtag-margin": "2%",
"text-entry-foreground": "#ccc",
"text-entry-background": "#111",
"header-bg-color": "#282c37",
"post-bg-color": "#282c37",
"column-left-color": "#282c37",
"link-bg-color": "#282c37",
"dropdown-fg-color": "#dddddd",
"dropdown-bg-color": "#111",
"dropdown-bg-color-hover": "#333",
"dropdown-fg-color-hover": "#dddddd",
"main-bg-color": "#282c37",
"calendar-bg-color": "#282c37",
"main-bg-color-reply": "#212c37",
"main-bg-color-dm": "#222",
"main-bg-color-report": "#221c27",
"main-header-color-roles": "#282237",
"main-fg-color": "#dddddd",
"day-number": "#dddddd",
"day-number2": "#bbbbbb",
"cw-color": "#dddddd",
"column-left-fg-color": "#dddddd",
"column-right-fg-color": "yellow",
"main-link-color": "#999",
"main-link-color-hover": "#bbb",
"main-visited-color": "#888",
"border-color": "#505050",
"border-width": "2px",
"border-width-header": "2px",
"font-color-header": "#ccc",
"font-size-button-mobile": "34px",
"font-size-links": "18px",
"font-size-newswire": "18px",
"font-size-newswire-mobile": "38px",
"font-size": "30px",
"font-size2": "24px",
"font-size3": "38px",
"font-size4": "22px",
"font-size5": "20px",
"font-size-likes": "20px",
"button-highlighted": "green",
"button-selected-highlighted": "darkgreen",
"button-approve": "darkgreen",
"gallery-text-color": "#ccc",
"button-corner-radius": "15px",
"timeline-border-radius": "30px",
"timeline-posts-background-color": "#282c37",
"title-color": "#999",
"focus-color": "white",
"newswire-item-moderated-color": "white",
"newswire-date-moderated-color": "white",
"newswire-date-color": "white",
"login-button-color": "#2965",
"button-event-background-color": "green",
"hashtag-background-color": "black",
"banner-height": "15vh",
"post-separator-margin-top": "0",
"post-separator-margin-bottom": "0",
"header-font": "Arial, Helvetica, sans-serif"
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB