mirror of
https://github.com/NovaOSS/nova-web.git
synced 2024-11-25 18:53:58 +01:00
Small refractoring
This commit is contained in:
parent
f10637baec
commit
50dd4dedb2
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -1,3 +1,7 @@
|
||||||
|
!.gitkeep
|
||||||
|
|
||||||
|
data/
|
||||||
|
|
||||||
# Byte-compiled / optimized / DLL files
|
# Byte-compiled / optimized / DLL files
|
||||||
__pycache__/
|
__pycache__/
|
||||||
*.py[cod]
|
*.py[cod]
|
||||||
|
|
42
app.py
42
app.py
|
@ -1,42 +0,0 @@
|
||||||
import os
|
|
||||||
import flask
|
|
||||||
import logging
|
|
||||||
|
|
||||||
from dotenv import load_dotenv
|
|
||||||
|
|
||||||
load_dotenv()
|
|
||||||
|
|
||||||
|
|
||||||
log = logging.getLogger('werkzeug')
|
|
||||||
log.disabled = True
|
|
||||||
|
|
||||||
def create_app() -> flask.Flask:
|
|
||||||
app = flask.Flask(__name__)
|
|
||||||
|
|
||||||
@app.context_processor
|
|
||||||
def inject_variables():
|
|
||||||
return {
|
|
||||||
'contact_email': os.getenv('CONTACT_EMAIL')
|
|
||||||
}
|
|
||||||
|
|
||||||
@app.route('/')
|
|
||||||
def index():
|
|
||||||
return flask.render_template('index.html')
|
|
||||||
|
|
||||||
|
|
||||||
@app.route('/panel')
|
|
||||||
def panel():
|
|
||||||
return flask.render_template('panel.html')
|
|
||||||
|
|
||||||
@app.route('/favicon.ico')
|
|
||||||
def favicon():
|
|
||||||
return flask.send_file('static/img/fav.ico', mimetype='image/vnd.microsoft.icon')
|
|
||||||
|
|
||||||
@app.route('/legal/<path:subpath>')
|
|
||||||
def legal_site(subpath):
|
|
||||||
return flask.render_template(f'legal/{subpath}.html')
|
|
||||||
|
|
||||||
return app
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
create_app().run(debug=True, use_evalex=False, port=2323, host='0.0.0.0', threaded=True)
|
|
1
config/emojis.txt
Normal file
1
config/emojis.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
🥇🥈🥉📒📕📗📘📙💩👻💀👽👾🤖🎃💛💚💙💜💔🐶🐱🐭🐹🐰🦊🐻🐼🐨🐯🦁🐮🐷🐽🐸🐵🙊🙉🙊🐒🐔🐧🐦🐤🐣🐥🦆🦅🦉🦇🐺🐗🐴🦄🐝🐛🦋🐌🐚🐞🐢🐍🦎🦂🦀🦑🐙🦐🐠🐟🐡🐬🦈🐳🐋🐊🐆🐅🐂🐄🦌🐪🐫🐘🦏🦍🐎🐖🐐🐏🐑🐕🐩🐈🐓🦃🐇🐁🐀🐾🐉🐲🌵🎄🌲🌳🌴🌱🌿🍀🎍🎋🍃🍂🍁🍄🌾💐🌷🌹🥀🌻🌼🌸🌺🌎🌍🌏🌕🌖🌗🌘🌑🌒🌓🌔🌚🌝🌞🌛🌜🌙💫⭐️🌟✨🔥💥⛅️🌈⛄️💨🌪🌊💧💦🍏🍎🍐🍊🍋🍌🍉🍇🍓🍈🍒🍑🍍🥝🥑🍅🍆🥒🥕🌽🥔🍠🌰🥜🍯🥐🍞🥖🧀🥚🍳🥓🥞🍤🍗🍖🍕🌭🍔🍟🥙🌮🌯🥗🥘🍝🍜🍲🍥🍣🍱🍛🍚🍙🍘🍢🍡🍧🍨🍦🍰🎂🍮🍭🍬🍫🍿🍩🍪🥛🍼🍵🍶🍺🍻🥂🍷🥃🍸🍹🍾🥄🍴⚽️🏀🏈⚾️🎾🏐🏉🎱🏓🏸🥅🏒🏑🏏⛳️🏹🎣🥊🥋
|
1
screen.sh
Executable file
1
screen.sh
Executable file
|
@ -0,0 +1 @@
|
||||||
|
screen -S nova-web python web #uvicorn app:production --host 0.0.0.0 --port 2323 --access-log --use-colors --no-server-header --limit-max-requests 666
|
|
@ -1 +0,0 @@
|
||||||
{"version":3,"sources":["base.sass","base.css","_vars.sass"],"names":[],"mappings":"AACQ,kFAAA;AAER;EACI,uBAAA;ACDJ;;ADGA;EACI,yBENS;ADMb;;ADEA;EACI,gBEKS;EFJT,cAAA;ACCJ;;ADCA;EACI,sBAAA;EACA,YAAA;EACA,cEhBG;EFiBH,gCAAA;ACEJ;;ADAA;EACI,qBAAA;ACGJ;;ADAI;EACI,gBAAA;EACA,iBAAA;EACA,+BAAA;ACGR;;ADAI;EACI,mBAAA;ACGR;;ADDA;EACI,0BAAA;EACA,8BE7BM;EF8BN,0BAAA;EACA,8BAAA;EAEA,gBAAA;ACGJ;ADDI;EACI,4BAAA;EACA,4CEnCO;ADsCf;;ADDA;EACI,YAAA;ACIJ;;ADFA;EACI,cAAA;EACA,eAAA;ACKJ;;ADHA;EACI,cEpDG;EFqDH,mBEhDM;EFiDN,gBAAA;EACA,kBAAA;ACMJ;;ADJA;EACI,cAAA;EACA,oBAAA;EACA,8BAAA;EACA,YAAA;EACA,mBE5DQ;ADmEZ;ADLI;EACI,0BEtDD;AD6DP;;ADLA;EACI,8CAAA;ACQJ;;ADNA;EACI,iBAAA;ACSJ;;ADPA;EAEI,aAAA;ACSJ;;ADPA;EACI,gFAAA;EACA,6BAAA;EACA,oCAAA;ACUJ;;ADRA;EACI;IACI,cAAA;ECWN;AACF","file":"base.css","sourcesContent":["@import '_vars'\n@import url('https://fonts.googleapis.com/css2?family=Syne:wght@700&display=swap')\n\nhtml\n scroll-behavior: smooth\n\nbody\n background-color: $background\n\nnav, main, footer\n max-width: $main-width\n margin: 0 auto\n\n*, *::before, *::after\n box-sizing: border-box\n border: none\n color: $text\n font-family: 'Inter', sans-serif\n\na\n text-decoration: none\n\nh1, h2, h3\n &, *\n font-weight: 700\n line-height: 3rem\n font-family: 'Syne', sans-serif\n\nh3\n &, *\n line-height: 1.5rem\n\nmain a\n text-decoration: underline\n text-decoration-color: $primary\n text-underline-offset: 2px\n text-decoration-thickness: 5px\n\n transition: 0.2s\n\n &:hover\n text-decoration-thickness: 0\n background: $primary-glow\n\nmain p\n opacity: 0.9\n\nimg\n display: block\n max-width: 100%\n\nmark\n color: $text\n background: $primary\n padding: 5px 7px\n border-radius: 5px\n\nblockquote\n margin-left: 0\n padding: 0.6rem 1rem\n border-left: 5px solid $accent\n opacity: 0.8\n background: $secondary\n\n &.warning\n border-left-color: $warn\n\ncode\n font-family: 'Courier New', Courier, monospace\n\np, p *, main ul\n line-height: 32px\n\n:focus:not(:focus-visible)\n\n outline: none\n\n.special-gradient\n background: linear-gradient(83deg, rgba(244,90,136,1) 7%, rgba(40,170,240,1) 100%)\n -webkit-background-clip: text\n -webkit-text-fill-color: transparent\n\n@media (max-width: 900px)\n body\n margin: 0 2rem\n","@import url(\"https://fonts.googleapis.com/css2?family=Syne:wght@700&display=swap\");\nhtml {\n scroll-behavior: smooth;\n}\n\nbody {\n background-color: #03060d;\n}\n\nnav, main, footer {\n max-width: 800px;\n margin: 0 auto;\n}\n\n*, *::before, *::after {\n box-sizing: border-box;\n border: none;\n color: #f3f3f3;\n font-family: \"Inter\", sans-serif;\n}\n\na {\n text-decoration: none;\n}\n\nh1, h1 *, h2, h2 *, h3, h3 * {\n font-weight: 700;\n line-height: 3rem;\n font-family: \"Syne\", sans-serif;\n}\n\nh3, h3 * {\n line-height: 1.5rem;\n}\n\nmain a {\n text-decoration: underline;\n text-decoration-color: #b53d61;\n text-underline-offset: 2px;\n text-decoration-thickness: 5px;\n transition: 0.2s;\n}\nmain a:hover {\n text-decoration-thickness: 0;\n background: rgba(244, 90, 136, 0.3803921569);\n}\n\nmain p {\n opacity: 0.9;\n}\n\nimg {\n display: block;\n max-width: 100%;\n}\n\nmark {\n color: #f3f3f3;\n background: #b53d61;\n padding: 5px 7px;\n border-radius: 5px;\n}\n\nblockquote {\n margin-left: 0;\n padding: 0.6rem 1rem;\n border-left: 5px solid #28aaf0;\n opacity: 0.8;\n background: #252a38;\n}\nblockquote.warning {\n border-left-color: #f09928;\n}\n\ncode {\n font-family: \"Courier New\", Courier, monospace;\n}\n\np, p *, main ul {\n line-height: 32px;\n}\n\n:focus:not(:focus-visible) {\n outline: none;\n}\n\n.special-gradient {\n background: linear-gradient(83deg, rgb(244, 90, 136) 7%, rgb(40, 170, 240) 100%);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n}\n\n@media (max-width: 900px) {\n body {\n margin: 0 2rem;\n }\n}","$text: #f3f3f3\n$background: #03060d\n$secondary: #252a38\n$border: #161d2bb0\n\n$primary: #b53d61\n$primary-light: #f45a88\n$primary-glow: #f45a8861\n$primary-soft: #f79ab624\n$accent: #28aaf0\n\n$warn: #f09928\n\n$edge: 5px\n\n$main-width: 800px\n$more-width: 1000px\n"]}
|
|
|
@ -1 +0,0 @@
|
||||||
{"version":3,"sources":["home.sass","_vars.sass","home.css"],"names":[],"mappings":"AAEA;EACI,gBCYS;EDXT,cAAA;EACA,eAAA;AEDJ;AFGI;EACI,iBAAA;AEDR;;AFGA;EACI;IACI,eAAA;EEAN;EFEM;IACI,iBAAA;EEAV;AACF","file":"home.css","sourcesContent":["@import '_vars'\n\nheader\n max-width: $main-width\n margin: 0 auto\n font-size: 40px\n\n h1\n line-height: 4rem\n\n@media (max-width: 800px)\n header\n font-size: 26px\n \n h1\n line-height: 3rem\n","$text: #f3f3f3\n$background: #03060d\n$secondary: #252a38\n$border: #161d2bb0\n\n$primary: #b53d61\n$primary-light: #f45a88\n$primary-glow: #f45a8861\n$primary-soft: #f79ab624\n$accent: #28aaf0\n\n$warn: #f09928\n\n$edge: 5px\n\n$main-width: 800px\n$more-width: 1000px\n","header {\n max-width: 800px;\n margin: 0 auto;\n font-size: 40px;\n}\nheader h1 {\n line-height: 4rem;\n}\n\n@media (max-width: 800px) {\n header {\n font-size: 26px;\n }\n header h1 {\n line-height: 3rem;\n }\n}"]}
|
|
|
@ -1 +0,0 @@
|
||||||
{"version":3,"sources":["input.sass","_vars.sass","input.css"],"names":[],"mappings":"AAEA;EACI,cAAA;EACA,eAAA;EACA,eAAA;EACA,kBCOG;EDNH,sBAAA;EACA,gBAAA;EAEA,cCVG;EDWH,mBCNM;EDQN,2BAAA;AEHJ;AFKI;EACI,uBAAA;AEHR;AFKI;EACI,qDAAA;AEHR;AFKQ;EACI,4BAAA;AEHZ;AFKI;EACI,cCzBD;ED0BC,mBCxBI;EDyBJ,gDAAA;AEHR;AFKI;EACI,YAAA;EACA,qBAAA;EACA,sBAAA;EACA,mBAAA;AEHR;;AFKA;EACI,WAAA;EACA,eAAA;EACA,kBCzBG;ED0BH,oBAAA;EAEA,cCzCG;ED0CH,mBCxCQ;EDyCR,yBAAA;AEHJ;AFKI;EACI,aAAA;AEHR;;AFKA;EACI,yBAAA;AEFJ","file":"input.css","sourcesContent":["@import '_vars'\n\nbutton\n line-height: 2\n cursor: pointer\n font-size: 16px\n border-radius: $edge\n padding: 0.7rem 1.5rem\n font-weight: 600\n\n color: $text\n background: $primary\n\n transition: box-shadow 0.2s\n\n &:hover\n filter: brightness(1.2)\n\n &.special\n box-shadow: 0 0 20px $primary-glow\n\n &:hover\n box-shadow: 0 0 20px $primary\n\n &.secondary\n color: $text\n background: $secondary\n border: 1px solid $border\n\n svg, img\n height: 24px\n display: inline-block\n vertical-align: middle\n filter: invert(180)\n\ninput:not([type=\"checkbox\"]):not([type=\"radio\"])\n width: 100%\n font-size: 18px\n border-radius: $edge\n padding: 0.5rem 1rem\n\n color: $text\n background: $secondary\n border: 1px solid $primary\n\n &:focus\n outline: none\n\ninput[type=\"radio\"]\n filter: hue-rotate(50deg)\n","$text: #f3f3f3\n$background: #03060d\n$secondary: #252a38\n$border: #161d2bb0\n\n$primary: #b53d61\n$primary-light: #f45a88\n$primary-glow: #f45a8861\n$primary-soft: #f79ab624\n$accent: #28aaf0\n\n$warn: #f09928\n\n$edge: 5px\n\n$main-width: 800px\n$more-width: 1000px\n","button {\n line-height: 2;\n cursor: pointer;\n font-size: 16px;\n border-radius: 5px;\n padding: 0.7rem 1.5rem;\n font-weight: 600;\n color: #f3f3f3;\n background: #b53d61;\n transition: box-shadow 0.2s;\n}\nbutton:hover {\n filter: brightness(1.2);\n}\nbutton.special {\n box-shadow: 0 0 20px rgba(244, 90, 136, 0.3803921569);\n}\nbutton.special:hover {\n box-shadow: 0 0 20px #b53d61;\n}\nbutton.secondary {\n color: #f3f3f3;\n background: #252a38;\n border: 1px solid rgba(22, 29, 43, 0.6901960784);\n}\nbutton svg, button img {\n height: 24px;\n display: inline-block;\n vertical-align: middle;\n filter: invert(180);\n}\n\ninput:not([type=checkbox]):not([type=radio]) {\n width: 100%;\n font-size: 18px;\n border-radius: 5px;\n padding: 0.5rem 1rem;\n color: #f3f3f3;\n background: #252a38;\n border: 1px solid #b53d61;\n}\ninput:not([type=checkbox]):not([type=radio]):focus {\n outline: none;\n}\n\ninput[type=radio] {\n filter: hue-rotate(50deg);\n}"]}
|
|
|
@ -1,23 +0,0 @@
|
||||||
{% include 'parts/begin.html' %}
|
|
||||||
<link rel="stylesheet" href="/static/css/home.css">
|
|
||||||
|
|
||||||
<header>
|
|
||||||
<h1>Free Generative AI for <span class="special-gradient">Everyone</span></h1>
|
|
||||||
<h3>Make AI Open Again</h3>
|
|
||||||
<a href="/panel">
|
|
||||||
<button class="special">
|
|
||||||
<img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGNsYXNzPSJpY29uIGljb24tdGFibGVyIGljb24tdGFibGVyLWFycm93LXJpZ2h0IiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgZmlsbD0ibm9uZSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cGF0aCBzdHJva2U9Im5vbmUiIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiPjwvcGF0aD48cGF0aCBkPSJNNSAxMmwxNCAwIj48L3BhdGg+PHBhdGggZD0iTTEzIDE4bDYgLTYiPjwvcGF0aD48cGF0aCBkPSJNMTMgNmw2IDYiPjwvcGF0aD48L3N2Zz4=">
|
|
||||||
Learn more
|
|
||||||
</button>
|
|
||||||
</a>
|
|
||||||
<a href="https://www.youtube.com/watch?v=YD91G8DdUsw" target="_blank">
|
|
||||||
<button class="secondary">
|
|
||||||
<img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGNsYXNzPSJpY29uIGljb24tdGFibGVyIGljb24tdGFibGVyLWJvb2stMiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIGZpbGw9Im5vbmUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggc3Ryb2tlPSJub25lIiBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIj48L3BhdGg+PHBhdGggZD0iTTE5IDR2MTZoLTEyYTIgMiAwIDAgMSAtMiAtMnYtMTJhMiAyIDAgMCAxIDIgLTJoMTJ6Ij48L3BhdGg+PHBhdGggZD0iTTE5IDE2aC0xMmEyIDIgMCAwIDAgLTIgMiI+PC9wYXRoPjxwYXRoIGQ9Ik05IDhoNiI+PC9wYXRoPjwvc3ZnPg==">
|
|
||||||
Learn less
|
|
||||||
</button>
|
|
||||||
</a>
|
|
||||||
</header>
|
|
||||||
<main>
|
|
||||||
|
|
||||||
</main>
|
|
||||||
{% include 'parts/end.html' %}
|
|
20
web/__main__.py
Normal file
20
web/__main__.py
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
try:
|
||||||
|
from cheroot.wsgi import Server as WSGIServer, PathInfoDispatcher
|
||||||
|
except ImportError:
|
||||||
|
from cherrypy.wsgiserver import CherryPyWSGIServer as WSGIServer, WSGIPathInfoDispatcher as PathInfoDispatcher
|
||||||
|
|
||||||
|
from app import production
|
||||||
|
|
||||||
|
d = PathInfoDispatcher({'/': production})
|
||||||
|
server = WSGIServer(('0.0.0.0', 2323), d)
|
||||||
|
|
||||||
|
print('Ready...')
|
||||||
|
|
||||||
|
try:
|
||||||
|
print('Starting...')
|
||||||
|
print()
|
||||||
|
print('* http://localhost:2323')
|
||||||
|
print('* https://nova-oss.com')
|
||||||
|
server.start()
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
server.stop()
|
92
web/app.py
Normal file
92
web/app.py
Normal file
|
@ -0,0 +1,92 @@
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import flask
|
||||||
|
import random
|
||||||
|
import secrets
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
from werkzeug.middleware.proxy_fix import ProxyFix
|
||||||
|
|
||||||
|
load_dotenv()
|
||||||
|
|
||||||
|
log = logging.getLogger('werkzeug')
|
||||||
|
log.disabled = True
|
||||||
|
|
||||||
|
def create_app() -> flask.Flask:
|
||||||
|
app = flask.Flask(__name__)
|
||||||
|
app.wsgi_app = ProxyFix(
|
||||||
|
app.wsgi_app, x_for=1, x_proto=1, x_host=1, x_prefix=1
|
||||||
|
)
|
||||||
|
|
||||||
|
@app.context_processor
|
||||||
|
def inject_variables():
|
||||||
|
return {
|
||||||
|
'contact_email': os.getenv('CONTACT_EMAIL')
|
||||||
|
}
|
||||||
|
|
||||||
|
@app.route('/')
|
||||||
|
def index():
|
||||||
|
return flask.render_template('index.html')
|
||||||
|
|
||||||
|
@app.route('/alt-design')
|
||||||
|
def alt_design():
|
||||||
|
return flask.render_template('alt-design.html')
|
||||||
|
|
||||||
|
@app.route('/panel')
|
||||||
|
def panel():
|
||||||
|
return flask.render_template('panel.html')
|
||||||
|
|
||||||
|
@app.route('/novacord')
|
||||||
|
def novacord():
|
||||||
|
return flask.render_template('novacord.html')
|
||||||
|
|
||||||
|
@app.route('/favicon.ico')
|
||||||
|
def favicon():
|
||||||
|
return flask.send_file('static/img/fav.ico', mimetype='image/vnd.microsoft.icon')
|
||||||
|
|
||||||
|
@app.route('/legal/<path:subpath>')
|
||||||
|
def legal_site(subpath):
|
||||||
|
emoji = None
|
||||||
|
if subpath == 'terms':
|
||||||
|
emoji = json.load(open('data/tos.json', encoding='utf8')).get(flask.request.args.get('verify'))
|
||||||
|
|
||||||
|
return flask.render_template(f'legal/{subpath}.html', verify=emoji)
|
||||||
|
|
||||||
|
@app.route('/api/tos-verification', methods=['POST'])
|
||||||
|
def tos_verification_api():
|
||||||
|
if not flask.request.headers.get('Authorization') == os.getenv('TOS_VERIFICATION_KEY'):
|
||||||
|
return 'Unauthorized', 401
|
||||||
|
|
||||||
|
code = secrets.token_urlsafe(6)
|
||||||
|
emoji = random.choice(open('config/emojis.txt', encoding='utf8').read())
|
||||||
|
|
||||||
|
if not os.path.exists('data/tos.json'):
|
||||||
|
open('data/tos.json', 'w', encoding='utf8').write('{}')
|
||||||
|
|
||||||
|
data = json.load(open('data/tos.json', encoding='utf8'))
|
||||||
|
data[code] = emoji
|
||||||
|
json.dump(data, open('data/tos.json', 'w', encoding='utf8'))
|
||||||
|
|
||||||
|
return {
|
||||||
|
'code': code,
|
||||||
|
'emoji': emoji
|
||||||
|
}
|
||||||
|
|
||||||
|
@app.route('/api/tos-verification/<code>', methods=['DELETE'])
|
||||||
|
def tos_verification_api_delete(code):
|
||||||
|
if not flask.request.headers.get('Authorization') == os.getenv('TOS_VERIFICATION_KEY'):
|
||||||
|
return 'Unauthorized', 401
|
||||||
|
|
||||||
|
data = json.load(open('data/tos.json', encoding='utf8'))
|
||||||
|
del data[code]
|
||||||
|
json.dump(secrets, open('data/tos.json', 'w', encoding='utf8'))
|
||||||
|
|
||||||
|
return 'Removed.', 204
|
||||||
|
|
||||||
|
return app
|
||||||
|
|
||||||
|
production = create_app()
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
create_app().run(debug=True, use_evalex=False, port=2323, host='0.0.0.0', threaded=True)
|
|
@ -1,6 +1,7 @@
|
||||||
$text: #f3f3f3
|
$text: #f3f3f3
|
||||||
$background: #03060d
|
$background: #03060d
|
||||||
$secondary: #252a38
|
$secondary: #252a38
|
||||||
|
$secondary-dark: #0e0e0e
|
||||||
$border: #161d2bb0
|
$border: #161d2bb0
|
||||||
|
|
||||||
$primary: #b53d61
|
$primary: #b53d61
|
||||||
|
@ -9,7 +10,9 @@ $primary-glow: #f45a8861
|
||||||
$primary-soft: #f79ab624
|
$primary-soft: #f79ab624
|
||||||
$accent: #28aaf0
|
$accent: #28aaf0
|
||||||
|
|
||||||
|
$error: #ef3628
|
||||||
$warn: #f09928
|
$warn: #f09928
|
||||||
|
$success: #28ef6b
|
||||||
|
|
||||||
$edge: 5px
|
$edge: 5px
|
||||||
|
|
|
@ -29,6 +29,10 @@ h1, h1 *, h2, h2 *, h3, h3 * {
|
||||||
font-family: "Syne", sans-serif;
|
font-family: "Syne", sans-serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
h2, h2 * {
|
||||||
|
line-height: 2.2rem;
|
||||||
|
}
|
||||||
|
|
||||||
h3, h3 * {
|
h3, h3 * {
|
||||||
line-height: 1.5rem;
|
line-height: 1.5rem;
|
||||||
}
|
}
|
||||||
|
@ -61,22 +65,47 @@ mark {
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
kbd {
|
||||||
|
font-family: "Courier New", Courier, monospace;
|
||||||
|
font-weight: 600;
|
||||||
|
background: #252a38;
|
||||||
|
border-radius: 5px;
|
||||||
|
padding: 0.2rem 0.4rem;
|
||||||
|
border-bottom: 3px solid #0e0e0e;
|
||||||
|
}
|
||||||
|
|
||||||
blockquote {
|
blockquote {
|
||||||
margin-left: 0;
|
margin-left: 0;
|
||||||
padding: 0.6rem 1rem;
|
padding: 1rem 1rem;
|
||||||
border-left: 5px solid #28aaf0;
|
border-left: 5px solid #28aaf0;
|
||||||
opacity: 0.8;
|
opacity: 0.8;
|
||||||
background: #252a38;
|
background: #252a38;
|
||||||
|
width: 100%;
|
||||||
|
border-radius: 5px;
|
||||||
|
}
|
||||||
|
blockquote.error {
|
||||||
|
border-left-color: #ef3628;
|
||||||
}
|
}
|
||||||
blockquote.warning {
|
blockquote.warning {
|
||||||
border-left-color: #f09928;
|
border-left-color: #f09928;
|
||||||
}
|
}
|
||||||
|
blockquote.success {
|
||||||
|
border-left-color: #28ef6b;
|
||||||
|
}
|
||||||
|
|
||||||
code {
|
code {
|
||||||
font-family: "Courier New", Courier, monospace;
|
font-family: "Courier New", Courier, monospace;
|
||||||
|
font-weight: 600;
|
||||||
|
background: #252a38;
|
||||||
|
border-radius: 5px;
|
||||||
|
padding: 0.2rem 0.4rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
p, p *, main ul {
|
pre code *, pre code {
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
p, p *, ol, ul, li {
|
||||||
line-height: 32px;
|
line-height: 32px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,5 +122,6 @@ p, p *, main ul {
|
||||||
@media (max-width: 900px) {
|
@media (max-width: 900px) {
|
||||||
body {
|
body {
|
||||||
margin: 0 2rem;
|
margin: 0 2rem;
|
||||||
|
margin-top: 2rem;
|
||||||
}
|
}
|
||||||
}/*# sourceMappingURL=base.css.map */
|
}/*# sourceMappingURL=base.css.map */
|
1
web/static/css/base.css.map
Normal file
1
web/static/css/base.css.map
Normal file
File diff suppressed because one or more lines are too long
|
@ -26,6 +26,10 @@ h1, h2, h3
|
||||||
line-height: 3rem
|
line-height: 3rem
|
||||||
font-family: 'Syne', sans-serif
|
font-family: 'Syne', sans-serif
|
||||||
|
|
||||||
|
h2
|
||||||
|
&, *
|
||||||
|
line-height: 2.2rem
|
||||||
|
|
||||||
h3
|
h3
|
||||||
&, *
|
&, *
|
||||||
line-height: 1.5rem
|
line-height: 1.5rem
|
||||||
|
@ -55,20 +59,42 @@ mark
|
||||||
padding: 5px 7px
|
padding: 5px 7px
|
||||||
border-radius: 5px
|
border-radius: 5px
|
||||||
|
|
||||||
|
kbd
|
||||||
|
font-family: 'Courier New', Courier, monospace
|
||||||
|
font-weight: 600
|
||||||
|
background: $secondary
|
||||||
|
border-radius: $edge
|
||||||
|
padding: 0.2rem 0.4rem
|
||||||
|
border-bottom: 3px solid $secondary-dark
|
||||||
|
|
||||||
blockquote
|
blockquote
|
||||||
margin-left: 0
|
margin-left: 0
|
||||||
padding: 0.6rem 1rem
|
padding: 1rem 1rem
|
||||||
border-left: 5px solid $accent
|
border-left: 5px solid $accent
|
||||||
opacity: 0.8
|
opacity: 0.8
|
||||||
background: $secondary
|
background: $secondary
|
||||||
|
width: 100%
|
||||||
|
border-radius: $edge
|
||||||
|
|
||||||
|
&.error
|
||||||
|
border-left-color: $error
|
||||||
&.warning
|
&.warning
|
||||||
border-left-color: $warn
|
border-left-color: $warn
|
||||||
|
&.success
|
||||||
|
border-left-color: $success
|
||||||
|
|
||||||
code
|
code
|
||||||
font-family: 'Courier New', Courier, monospace
|
font-family: 'Courier New', Courier, monospace
|
||||||
|
font-weight: 600
|
||||||
|
background: $secondary
|
||||||
|
border-radius: $edge
|
||||||
|
padding: 0.2rem 0.4rem
|
||||||
|
|
||||||
p, p *, main ul
|
pre code
|
||||||
|
*, &
|
||||||
|
font-weight: normal
|
||||||
|
|
||||||
|
p, p *, ol, ul, li
|
||||||
line-height: 32px
|
line-height: 32px
|
||||||
|
|
||||||
:focus:not(:focus-visible)
|
:focus:not(:focus-visible)
|
||||||
|
@ -83,3 +109,4 @@ p, p *, main ul
|
||||||
@media (max-width: 900px)
|
@media (max-width: 900px)
|
||||||
body
|
body
|
||||||
margin: 0 2rem
|
margin: 0 2rem
|
||||||
|
margin-top: 2rem
|
|
@ -1 +1 @@
|
||||||
{"version":3,"sources":["footer.sass","_vars.sass","footer.css"],"names":[],"mappings":"AAEA;EACI,iBAAA;EACA,iBAAA;EACA,gBCUS;ACXb;AFGI;EACI,iBCQK;ACTb;AFGI;EACI,aAAA;EACA,sBAAA;EAEA,mBAAA;AEFR;AFIQ;EACI,oBAAA;EACA,qBAAA;AEFZ;AFIY;EACI,eAAA;EACA,gBAAA;AEFhB;AFIY;EACI,UAAA;EACA,eAAA;EACA,gBAAA;EACA,cAAA;EACA,mBAAA;AEFhB;AFIY;EACI,uBAAA;EAAA,kBAAA;EACA,eAAA;EACA,YAAA;EACA,cAAA;EACA,qBAAA;EACA,mBAAA;AEFhB;AFIgB;EACI,YAAA;AEFpB;AFII;EACI,YAAA;AEFR;;AFIA;EAEQ;IACI,mBAAA;IACA,qCAAA;EEFV;EFIU;IACI,mBAAA;EEFd;AACF;AFGA;EAEQ;IACI,0BAAA;EEFV;AACF","file":"footer.css","sourcesContent":["@import '_vars'\n\nfooter\n padding-top: 4rem\n margin: 4rem auto\n max-width: $main-width\n\n &.wide\n max-width: $more-width\n\n div.rows\n display: grid\n grid-auto-flow: column\n // justify-content: space-between\n margin-bottom: 2rem\n\n div.row\n margin-right: 1.5rem\n margin-bottom: 0.5rem\n\n &:last-child\n margin-right: 0\n margin-bottom: 0\n\n h2\n opacity: 1\n font-size: 1rem\n font-weight: 500\n margin: 1rem 0\n line-height: normal\n\n a\n width: fit-content\n font-size: 14px\n opacity: 0.6\n display: block\n text-decoration: none\n margin-bottom: 1rem\n\n &:hover\n opacity: 0.8\n\n p\n opacity: 0.7\n\n@media (max-width: 1000px)\n footer\n div.rows\n grid-auto-flow: row\n grid-template-columns: repeat(2, 1fr)\n\n div.row\n margin-bottom: 1rem\n\n@media (max-width: 600px)\n footer\n div.rows\n grid-template-columns: 1fr\n","$text: #f3f3f3\n$background: #03060d\n$secondary: #252a38\n$border: #161d2bb0\n\n$primary: #b53d61\n$primary-light: #f45a88\n$primary-glow: #f45a8861\n$primary-soft: #f79ab624\n$accent: #28aaf0\n\n$warn: #f09928\n\n$edge: 5px\n\n$main-width: 800px\n$more-width: 1000px\n","footer {\n padding-top: 4rem;\n margin: 4rem auto;\n max-width: 800px;\n}\nfooter.wide {\n max-width: 1000px;\n}\nfooter div.rows {\n display: grid;\n grid-auto-flow: column;\n margin-bottom: 2rem;\n}\nfooter div.rows div.row {\n margin-right: 1.5rem;\n margin-bottom: 0.5rem;\n}\nfooter div.rows div.row:last-child {\n margin-right: 0;\n margin-bottom: 0;\n}\nfooter div.rows div.row h2 {\n opacity: 1;\n font-size: 1rem;\n font-weight: 500;\n margin: 1rem 0;\n line-height: normal;\n}\nfooter div.rows div.row a {\n width: fit-content;\n font-size: 14px;\n opacity: 0.6;\n display: block;\n text-decoration: none;\n margin-bottom: 1rem;\n}\nfooter div.rows div.row a:hover {\n opacity: 0.8;\n}\nfooter p {\n opacity: 0.7;\n}\n\n@media (max-width: 1000px) {\n footer div.rows {\n grid-auto-flow: row;\n grid-template-columns: repeat(2, 1fr);\n }\n footer div.rows div.row {\n margin-bottom: 1rem;\n }\n}\n@media (max-width: 600px) {\n footer div.rows {\n grid-template-columns: 1fr;\n }\n}"]}
|
{"version":3,"sources":["footer.sass","_vars.sass","footer.css"],"names":[],"mappings":"AAEA;EACI,iBAAA;EACA,iBAAA;EACA,gBCaS;ACdb;AFGI;EACI,iBCWK;ACZb;AFGI;EACI,aAAA;EACA,sBAAA;EAEA,mBAAA;AEFR;AFIQ;EACI,oBAAA;EACA,qBAAA;AEFZ;AFIY;EACI,eAAA;EACA,gBAAA;AEFhB;AFIY;EACI,UAAA;EACA,eAAA;EACA,gBAAA;EACA,cAAA;EACA,mBAAA;AEFhB;AFIY;EACI,uBAAA;EAAA,kBAAA;EACA,eAAA;EACA,YAAA;EACA,cAAA;EACA,qBAAA;EACA,mBAAA;AEFhB;AFIgB;EACI,YAAA;AEFpB;AFII;EACI,YAAA;AEFR;;AFIA;EAEQ;IACI,mBAAA;IACA,qCAAA;EEFV;EFIU;IACI,mBAAA;EEFd;AACF;AFGA;EAEQ;IACI,0BAAA;EEFV;AACF","file":"footer.css","sourcesContent":["@import '_vars'\n\nfooter\n padding-top: 4rem\n margin: 4rem auto\n max-width: $main-width\n\n &.wide\n max-width: $more-width\n\n div.rows\n display: grid\n grid-auto-flow: column\n // justify-content: space-between\n margin-bottom: 2rem\n\n div.row\n margin-right: 1.5rem\n margin-bottom: 0.5rem\n\n &:last-child\n margin-right: 0\n margin-bottom: 0\n\n h2\n opacity: 1\n font-size: 1rem\n font-weight: 500\n margin: 1rem 0\n line-height: normal\n\n a\n width: fit-content\n font-size: 14px\n opacity: 0.6\n display: block\n text-decoration: none\n margin-bottom: 1rem\n\n &:hover\n opacity: 0.8\n\n p\n opacity: 0.7\n\n@media (max-width: 1000px)\n footer\n div.rows\n grid-auto-flow: row\n grid-template-columns: repeat(2, 1fr)\n\n div.row\n margin-bottom: 1rem\n\n@media (max-width: 600px)\n footer\n div.rows\n grid-template-columns: 1fr\n","$text: #f3f3f3\n$background: #03060d\n$secondary: #252a38\n$secondary-dark: #0e0e0e\n$border: #161d2bb0\n\n$primary: #b53d61\n$primary-light: #f45a88\n$primary-glow: #f45a8861\n$primary-soft: #f79ab624\n$accent: #28aaf0\n\n$error: #ef3628\n$warn: #f09928\n$success: #28ef6b\n\n$edge: 5px\n\n$main-width: 800px\n$more-width: 1000px\n","footer {\n padding-top: 4rem;\n margin: 4rem auto;\n max-width: 800px;\n}\nfooter.wide {\n max-width: 1000px;\n}\nfooter div.rows {\n display: grid;\n grid-auto-flow: column;\n margin-bottom: 2rem;\n}\nfooter div.rows div.row {\n margin-right: 1.5rem;\n margin-bottom: 0.5rem;\n}\nfooter div.rows div.row:last-child {\n margin-right: 0;\n margin-bottom: 0;\n}\nfooter div.rows div.row h2 {\n opacity: 1;\n font-size: 1rem;\n font-weight: 500;\n margin: 1rem 0;\n line-height: normal;\n}\nfooter div.rows div.row a {\n width: fit-content;\n font-size: 14px;\n opacity: 0.6;\n display: block;\n text-decoration: none;\n margin-bottom: 1rem;\n}\nfooter div.rows div.row a:hover {\n opacity: 0.8;\n}\nfooter p {\n opacity: 0.7;\n}\n\n@media (max-width: 1000px) {\n footer div.rows {\n grid-auto-flow: row;\n grid-template-columns: repeat(2, 1fr);\n }\n footer div.rows div.row {\n margin-bottom: 1rem;\n }\n}\n@media (max-width: 600px) {\n footer div.rows {\n grid-template-columns: 1fr;\n }\n}"]}
|
|
@ -14,4 +14,7 @@ header h1 {
|
||||||
header h1 {
|
header h1 {
|
||||||
line-height: 3rem;
|
line-height: 3rem;
|
||||||
}
|
}
|
||||||
|
header h3 {
|
||||||
|
font-size: 28px;
|
||||||
|
}
|
||||||
}/*# sourceMappingURL=home.css.map */
|
}/*# sourceMappingURL=home.css.map */
|
1
web/static/css/home.css.map
Normal file
1
web/static/css/home.css.map
Normal file
|
@ -0,0 +1 @@
|
||||||
|
{"version":3,"sources":["home.sass","_vars.sass","home.css"],"names":[],"mappings":"AAEA;EACI,gBCeS;EDdT,cAAA;EACA,eAAA;AEDJ;AFGI;EACI,iBAAA;AEDR;;AFGA;EACI;IACI,eAAA;EEAN;EFEM;IACI,iBAAA;EEAV;EFEM;IACI,eAAA;EEAV;AACF","file":"home.css","sourcesContent":["@import '_vars'\n\nheader\n max-width: $main-width\n margin: 0 auto\n font-size: 40px\n\n h1\n line-height: 4rem\n\n@media (max-width: 800px)\n header\n font-size: 26px\n \n h1\n line-height: 3rem\n\n h3\n font-size: 28px\n","$text: #f3f3f3\n$background: #03060d\n$secondary: #252a38\n$secondary-dark: #0e0e0e\n$border: #161d2bb0\n\n$primary: #b53d61\n$primary-light: #f45a88\n$primary-glow: #f45a8861\n$primary-soft: #f79ab624\n$accent: #28aaf0\n\n$error: #ef3628\n$warn: #f09928\n$success: #28ef6b\n\n$edge: 5px\n\n$main-width: 800px\n$more-width: 1000px\n","header {\n max-width: 800px;\n margin: 0 auto;\n font-size: 40px;\n}\nheader h1 {\n line-height: 4rem;\n}\n\n@media (max-width: 800px) {\n header {\n font-size: 26px;\n }\n header h1 {\n line-height: 3rem;\n }\n header h3 {\n font-size: 28px;\n }\n}"]}
|
|
@ -14,3 +14,6 @@ header
|
||||||
|
|
||||||
h1
|
h1
|
||||||
line-height: 3rem
|
line-height: 3rem
|
||||||
|
|
||||||
|
h3
|
||||||
|
font-size: 28px
|
|
@ -5,6 +5,7 @@ button {
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
padding: 0.7rem 1.5rem;
|
padding: 0.7rem 1.5rem;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
|
margin-bottom: 1rem;
|
||||||
color: #f3f3f3;
|
color: #f3f3f3;
|
||||||
background: #b53d61;
|
background: #b53d61;
|
||||||
transition: box-shadow 0.2s;
|
transition: box-shadow 0.2s;
|
1
web/static/css/input.css.map
Normal file
1
web/static/css/input.css.map
Normal file
|
@ -0,0 +1 @@
|
||||||
|
{"version":3,"sources":["input.sass","_vars.sass","input.css"],"names":[],"mappings":"AAEA;EACI,cAAA;EACA,eAAA;EACA,eAAA;EACA,kBCUG;EDTH,sBAAA;EACA,gBAAA;EACA,mBAAA;EAEA,cCXG;EDYH,mBCNM;EDQN,2BAAA;AEHJ;AFKI;EACI,uBAAA;AEHR;AFKI;EACI,qDAAA;AEHR;AFKQ;EACI,4BAAA;AEHZ;AFKI;EACI,cC1BD;ED2BC,mBCzBI;ED0BJ,gDAAA;AEHR;AFKI;EACI,YAAA;EACA,qBAAA;EACA,sBAAA;EACA,mBAAA;AEHR;;AFKA;EACI,WAAA;EACA,eAAA;EACA,kBCvBG;EDwBH,oBAAA;EAEA,cC1CG;ED2CH,mBCzCQ;ED0CR,yBAAA;AEHJ;AFKI;EACI,aAAA;AEHR;;AFKA;EACI,yBAAA;AEFJ","file":"input.css","sourcesContent":["@import '_vars'\n\nbutton\n line-height: 2\n cursor: pointer\n font-size: 16px\n border-radius: $edge\n padding: 0.7rem 1.5rem\n font-weight: 600\n margin-bottom: 1rem\n\n color: $text\n background: $primary\n\n transition: box-shadow 0.2s\n\n &:hover\n filter: brightness(1.2)\n\n &.special\n box-shadow: 0 0 20px $primary-glow\n\n &:hover\n box-shadow: 0 0 20px $primary\n\n &.secondary\n color: $text\n background: $secondary\n border: 1px solid $border\n\n svg, img\n height: 24px\n display: inline-block\n vertical-align: middle\n filter: invert(180)\n\ninput:not([type=\"checkbox\"]):not([type=\"radio\"])\n width: 100%\n font-size: 18px\n border-radius: $edge\n padding: 0.5rem 1rem\n\n color: $text\n background: $secondary\n border: 1px solid $primary\n\n &:focus\n outline: none\n\ninput[type=\"radio\"]\n filter: hue-rotate(50deg)\n","$text: #f3f3f3\n$background: #03060d\n$secondary: #252a38\n$secondary-dark: #0e0e0e\n$border: #161d2bb0\n\n$primary: #b53d61\n$primary-light: #f45a88\n$primary-glow: #f45a8861\n$primary-soft: #f79ab624\n$accent: #28aaf0\n\n$error: #ef3628\n$warn: #f09928\n$success: #28ef6b\n\n$edge: 5px\n\n$main-width: 800px\n$more-width: 1000px\n","button {\n line-height: 2;\n cursor: pointer;\n font-size: 16px;\n border-radius: 5px;\n padding: 0.7rem 1.5rem;\n font-weight: 600;\n margin-bottom: 1rem;\n color: #f3f3f3;\n background: #b53d61;\n transition: box-shadow 0.2s;\n}\nbutton:hover {\n filter: brightness(1.2);\n}\nbutton.special {\n box-shadow: 0 0 20px rgba(244, 90, 136, 0.3803921569);\n}\nbutton.special:hover {\n box-shadow: 0 0 20px #b53d61;\n}\nbutton.secondary {\n color: #f3f3f3;\n background: #252a38;\n border: 1px solid rgba(22, 29, 43, 0.6901960784);\n}\nbutton svg, button img {\n height: 24px;\n display: inline-block;\n vertical-align: middle;\n filter: invert(180);\n}\n\ninput:not([type=checkbox]):not([type=radio]) {\n width: 100%;\n font-size: 18px;\n border-radius: 5px;\n padding: 0.5rem 1rem;\n color: #f3f3f3;\n background: #252a38;\n border: 1px solid #b53d61;\n}\ninput:not([type=checkbox]):not([type=radio]):focus {\n outline: none;\n}\n\ninput[type=radio] {\n filter: hue-rotate(50deg);\n}"]}
|
|
@ -7,6 +7,7 @@ button
|
||||||
border-radius: $edge
|
border-radius: $edge
|
||||||
padding: 0.7rem 1.5rem
|
padding: 0.7rem 1.5rem
|
||||||
font-weight: 600
|
font-weight: 600
|
||||||
|
margin-bottom: 1rem
|
||||||
|
|
||||||
color: $text
|
color: $text
|
||||||
background: $primary
|
background: $primary
|
|
@ -1 +1 @@
|
||||||
{"version":3,"sources":["navbar.sass","navbar.css","_vars.sass"],"names":[],"mappings":"AAEA;EACI,aAAA;EACA,mBAAA;EACA,kBAAA;ACDJ;ADGI;EACI,qBAAA;EACA,eEHQ;EFIR,gBAAA;EACA,eAAA;EACA,YAAA;EACA,WAAA;EAEA,iBAAA;EACA,uBAAA;ACFR;ADII;EACI,gBAAA;EACA,eAAA;EACA,yBAAA;KAAA,sBAAA;UAAA,iBAAA;ACFR;ADIQ;EACI,eAAA;EACA,kBAAA;EACA,SAAA;ACFZ;ADKI;EACI,YAAA;ACHR;ADMI;EACI,aAAA;EACA,eAAA;ACJR;;ADOI;EACI,eAAA;EACA,gBAAA;EACA,iBAAA;EACA,qBAAA;EACA,sBAAA;ACJR;ADMQ;EACI,cExCI;ADoChB;;ADMA;EACI;IACI,sCAAA;IACA,UAAA;IAEA,YAAA;IACA,YAAA;IACA,kBAAA;IACA,SAAA;IACA,WAAA;IACA,mBExDI;IFyDJ,eAAA;IACA,kBE/CD;IFgDC,kCAAA;YAAA,0BAAA;IACA,gDAAA;IAEA,wCAAA;ECLN;EDOM;IACI,UAAA;IACA,kBAAA;ECLV;EDOM;IACI,eAAA;IACA,cAAA;IACA,iBAAA;ECLV;EDQM;IACI,eEvEI;EDiEd;EDQM;IACI,cAAA;IACA,gBAAA;IACA,eAAA;IACA,YAAA;IACA,WAAA;IACA,eAAA;IACA,gBAAA;ECNV;EDQU;IACI,wBAAA;ECNd;AACF;ADOA;EAEQ;IACI,aAAA;ECNV;AACF","file":"navbar.css","sourcesContent":["@import '_vars'\n\nnav\n display: flex\n align-items: center\n position: relative\n\n >.logo\n display: inline-block\n stroke: $primary-light\n min-height: 40px\n min-width: 40px\n height: 40px\n width: 40px\n\n margin-right: 8px\n transition: stroke 0.2s\n\n >h1\n font-weight: 500\n font-size: 20px\n user-select: none\n\n mark\n font-size: 1rem\n position: relative\n top: -3px\n\n\n >span\n flex-grow: 1\n\n\n #menu\n display: none\n cursor: pointer\n\n.link-menu\n >a\n font-size: 14px\n font-weight: 600\n margin-left: 2rem\n text-decoration: none\n transition: color 0.1s\n\n &:hover\n color: $primary-light\n\n@media (max-width: 800px)\n .link-menu\n transform: scale(0.8) translateX(1rem)\n opacity: 0\n\n z-index: 100\n width: 200px\n position: absolute\n top: 5rem\n right: 2rem\n background: $secondary\n padding: 1rem 0\n border-radius: $edge\n backdrop-filter: blur(4px)\n border: 1px solid $border\n\n transition: transform 0.2s, opacity 0.2s\n\n &.open\n opacity: 1\n transform: inherit\n\n a\n font-size: 20px\n display: block\n line-height: 3rem\n\n nav\n .logo\n stroke: $primary-light\n\n #menu\n display: block\n min-height: 32px\n min-width: 32px\n height: 32px\n width: 32px\n cursor: pointer\n transition: 0.5s\n\n &.active\n transform: rotate(90deg)\n\n@media (max-width: 400px)\n nav\n h1\n display: none","nav {\n display: flex;\n align-items: center;\n position: relative;\n}\nnav > .logo {\n display: inline-block;\n stroke: #f45a88;\n min-height: 40px;\n min-width: 40px;\n height: 40px;\n width: 40px;\n margin-right: 8px;\n transition: stroke 0.2s;\n}\nnav > h1 {\n font-weight: 500;\n font-size: 20px;\n user-select: none;\n}\nnav > h1 mark {\n font-size: 1rem;\n position: relative;\n top: -3px;\n}\nnav > span {\n flex-grow: 1;\n}\nnav #menu {\n display: none;\n cursor: pointer;\n}\n\n.link-menu > a {\n font-size: 14px;\n font-weight: 600;\n margin-left: 2rem;\n text-decoration: none;\n transition: color 0.1s;\n}\n.link-menu > a:hover {\n color: #f45a88;\n}\n\n@media (max-width: 800px) {\n .link-menu {\n transform: scale(0.8) translateX(1rem);\n opacity: 0;\n z-index: 100;\n width: 200px;\n position: absolute;\n top: 5rem;\n right: 2rem;\n background: #252a38;\n padding: 1rem 0;\n border-radius: 5px;\n backdrop-filter: blur(4px);\n border: 1px solid rgba(22, 29, 43, 0.6901960784);\n transition: transform 0.2s, opacity 0.2s;\n }\n .link-menu.open {\n opacity: 1;\n transform: inherit;\n }\n .link-menu a {\n font-size: 20px;\n display: block;\n line-height: 3rem;\n }\n nav .logo {\n stroke: #f45a88;\n }\n nav #menu {\n display: block;\n min-height: 32px;\n min-width: 32px;\n height: 32px;\n width: 32px;\n cursor: pointer;\n transition: 0.5s;\n }\n nav #menu.active {\n transform: rotate(90deg);\n }\n}\n@media (max-width: 400px) {\n nav h1 {\n display: none;\n }\n}","$text: #f3f3f3\n$background: #03060d\n$secondary: #252a38\n$border: #161d2bb0\n\n$primary: #b53d61\n$primary-light: #f45a88\n$primary-glow: #f45a8861\n$primary-soft: #f79ab624\n$accent: #28aaf0\n\n$warn: #f09928\n\n$edge: 5px\n\n$main-width: 800px\n$more-width: 1000px\n"]}
|
{"version":3,"sources":["navbar.sass","navbar.css","_vars.sass"],"names":[],"mappings":"AAEA;EACI,aAAA;EACA,mBAAA;EACA,kBAAA;ACDJ;ADGI;EACI,qBAAA;EACA,eEFQ;EFGR,gBAAA;EACA,eAAA;EACA,YAAA;EACA,WAAA;EAEA,iBAAA;EACA,uBAAA;ACFR;ADII;EACI,gBAAA;EACA,eAAA;EACA,yBAAA;KAAA,sBAAA;UAAA,iBAAA;ACFR;ADIQ;EACI,eAAA;EACA,kBAAA;EACA,SAAA;ACFZ;ADKI;EACI,YAAA;ACHR;ADMI;EACI,aAAA;EACA,eAAA;ACJR;;ADOI;EACI,eAAA;EACA,gBAAA;EACA,iBAAA;EACA,qBAAA;EACA,sBAAA;ACJR;ADMQ;EACI,cEvCI;ADmChB;;ADMA;EACI;IACI,sCAAA;IACA,UAAA;IAEA,YAAA;IACA,YAAA;IACA,kBAAA;IACA,SAAA;IACA,WAAA;IACA,mBExDI;IFyDJ,eAAA;IACA,kBE5CD;IF6CC,kCAAA;YAAA,0BAAA;IACA,gDAAA;IAEA,wCAAA;ECLN;EDOM;IACI,UAAA;IACA,kBAAA;ECLV;EDOM;IACI,eAAA;IACA,cAAA;IACA,iBAAA;ECLV;EDQM;IACI,eEtEI;EDgEd;EDQM;IACI,cAAA;IACA,gBAAA;IACA,eAAA;IACA,YAAA;IACA,WAAA;IACA,eAAA;IACA,gBAAA;ECNV;EDQU;IACI,wBAAA;ECNd;AACF;ADOA;EAEQ;IACI,aAAA;ECNV;AACF","file":"navbar.css","sourcesContent":["@import '_vars'\n\nnav\n display: flex\n align-items: center\n position: relative\n\n >.logo\n display: inline-block\n stroke: $primary-light\n min-height: 40px\n min-width: 40px\n height: 40px\n width: 40px\n\n margin-right: 8px\n transition: stroke 0.2s\n\n >h1\n font-weight: 500\n font-size: 20px\n user-select: none\n\n mark\n font-size: 1rem\n position: relative\n top: -3px\n\n\n >span\n flex-grow: 1\n\n\n #menu\n display: none\n cursor: pointer\n\n.link-menu\n >a\n font-size: 14px\n font-weight: 600\n margin-left: 2rem\n text-decoration: none\n transition: color 0.1s\n\n &:hover\n color: $primary-light\n\n@media (max-width: 800px)\n .link-menu\n transform: scale(0.8) translateX(1rem)\n opacity: 0\n\n z-index: 100\n width: 200px\n position: absolute\n top: 5rem\n right: 2rem\n background: $secondary\n padding: 1rem 0\n border-radius: $edge\n backdrop-filter: blur(4px)\n border: 1px solid $border\n\n transition: transform 0.2s, opacity 0.2s\n\n &.open\n opacity: 1\n transform: inherit\n\n a\n font-size: 20px\n display: block\n line-height: 3rem\n\n nav\n .logo\n stroke: $primary-light\n\n #menu\n display: block\n min-height: 32px\n min-width: 32px\n height: 32px\n width: 32px\n cursor: pointer\n transition: 0.5s\n\n &.active\n transform: rotate(90deg)\n\n@media (max-width: 400px)\n nav\n h1\n display: none","nav {\n display: flex;\n align-items: center;\n position: relative;\n}\nnav > .logo {\n display: inline-block;\n stroke: #f45a88;\n min-height: 40px;\n min-width: 40px;\n height: 40px;\n width: 40px;\n margin-right: 8px;\n transition: stroke 0.2s;\n}\nnav > h1 {\n font-weight: 500;\n font-size: 20px;\n user-select: none;\n}\nnav > h1 mark {\n font-size: 1rem;\n position: relative;\n top: -3px;\n}\nnav > span {\n flex-grow: 1;\n}\nnav #menu {\n display: none;\n cursor: pointer;\n}\n\n.link-menu > a {\n font-size: 14px;\n font-weight: 600;\n margin-left: 2rem;\n text-decoration: none;\n transition: color 0.1s;\n}\n.link-menu > a:hover {\n color: #f45a88;\n}\n\n@media (max-width: 800px) {\n .link-menu {\n transform: scale(0.8) translateX(1rem);\n opacity: 0;\n z-index: 100;\n width: 200px;\n position: absolute;\n top: 5rem;\n right: 2rem;\n background: #252a38;\n padding: 1rem 0;\n border-radius: 5px;\n backdrop-filter: blur(4px);\n border: 1px solid rgba(22, 29, 43, 0.6901960784);\n transition: transform 0.2s, opacity 0.2s;\n }\n .link-menu.open {\n opacity: 1;\n transform: inherit;\n }\n .link-menu a {\n font-size: 20px;\n display: block;\n line-height: 3rem;\n }\n nav .logo {\n stroke: #f45a88;\n }\n nav #menu {\n display: block;\n min-height: 32px;\n min-width: 32px;\n height: 32px;\n width: 32px;\n cursor: pointer;\n transition: 0.5s;\n }\n nav #menu.active {\n transform: rotate(90deg);\n }\n}\n@media (max-width: 400px) {\n nav h1 {\n display: none;\n }\n}","$text: #f3f3f3\n$background: #03060d\n$secondary: #252a38\n$secondary-dark: #0e0e0e\n$border: #161d2bb0\n\n$primary: #b53d61\n$primary-light: #f45a88\n$primary-glow: #f45a8861\n$primary-soft: #f79ab624\n$accent: #28aaf0\n\n$error: #ef3628\n$warn: #f09928\n$success: #28ef6b\n\n$edge: 5px\n\n$main-width: 800px\n$more-width: 1000px\n"]}
|
|
@ -19,6 +19,7 @@ code[class*=language-], pre[class*=language-] {
|
||||||
tab-size: 4;
|
tab-size: 4;
|
||||||
-webkit-hyphens: none;
|
-webkit-hyphens: none;
|
||||||
hyphens: none;
|
hyphens: none;
|
||||||
|
border-radius: 5px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
pre[class*=language-] {
|
pre[class*=language-] {
|
||||||
|
@ -26,7 +27,7 @@ code[class*=language-], pre[class*=language-] {
|
||||||
padding: 1rem;
|
padding: 1rem;
|
||||||
margin: 0 0;
|
margin: 0 0;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
border-radius: 4px;
|
border-radius: 5px;
|
||||||
border-top-left-radius: 0;
|
border-top-left-radius: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,7 +39,7 @@ code[class*=language-], pre[class*=language-] {
|
||||||
|
|
||||||
:not(pre) > code[class*=language-] {
|
:not(pre) > code[class*=language-] {
|
||||||
padding: 0.1em;
|
padding: 0.1em;
|
||||||
border-radius: 0.3em;
|
border-radius: 5px;
|
||||||
white-space: normal;
|
white-space: normal;
|
||||||
}
|
}
|
||||||
|
|
Before Width: | Height: | Size: 744 KiB After Width: | Height: | Size: 744 KiB |
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 37 KiB |
144
web/templates/alt-design.html
Normal file
144
web/templates/alt-design.html
Normal file
|
@ -0,0 +1,144 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Alternative Design for NovaAI</title>
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||||
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Quicksand:wght@300&display=swap" rel="stylesheet">
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Quicksand:wght@400&display=swap" rel="stylesheet">
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Rubik:wght@500&display=swap" rel="stylesheet">
|
||||||
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||||
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.5/font/bootstrap-icons.css">
|
||||||
|
|
||||||
|
<style>
|
||||||
|
|
||||||
|
:root {
|
||||||
|
--red: #ea4e42;
|
||||||
|
--orange: #fe891a;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
* {
|
||||||
|
font-weight: 100;
|
||||||
|
color: white;
|
||||||
|
font-family: 'Quicksand', sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
main, body, nav, button {
|
||||||
|
background-color: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
nav {
|
||||||
|
padding: 1rem 1.5rem;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
border-bottom: #141414 1px solid;
|
||||||
|
font-size: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
nav span {
|
||||||
|
font-weight: 700;
|
||||||
|
margin-right: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
nav a {
|
||||||
|
opacity: 0.5;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
header {
|
||||||
|
padding-top: 10rem;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
header span.special {
|
||||||
|
background: -webkit-linear-gradient(var(--red), var(--orange));
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
header h1 * {
|
||||||
|
font-family: 'Rubik', sans-serif !important;
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
header p {
|
||||||
|
margin: 0 auto;
|
||||||
|
width: 600px;
|
||||||
|
opacity: 0.7;
|
||||||
|
font-size: 22px;
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
width: 400px;
|
||||||
|
font-size: 32px;
|
||||||
|
padding: 0.7rem 1rem;
|
||||||
|
border-radius: 5px;
|
||||||
|
border: 2px solid;
|
||||||
|
cursor: pointer;
|
||||||
|
border-image-slice: 1;
|
||||||
|
background-color: black;
|
||||||
|
|
||||||
|
border-image-source: linear-gradient(45deg, var(--red), var(--orange));
|
||||||
|
box-shadow: 0 0 50px #fe881a68;
|
||||||
|
transition: 0.2s;
|
||||||
|
}
|
||||||
|
|
||||||
|
button:hover {
|
||||||
|
background-color: #13100e;
|
||||||
|
}
|
||||||
|
|
||||||
|
header button {
|
||||||
|
margin-top: 5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
#go {
|
||||||
|
font-size: 22px;
|
||||||
|
width: 100%;
|
||||||
|
position: absolute;
|
||||||
|
bottom: 2rem;
|
||||||
|
opacity: 0.5;
|
||||||
|
text-decoration: none;
|
||||||
|
text-align: center;
|
||||||
|
margin: 0 auto;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<nav>
|
||||||
|
<i class="bi bi-circle-fill"></i>
|
||||||
|
|
||||||
|
<span>nova</span>
|
||||||
|
<a href="#">api docs</a>
|
||||||
|
</nav>
|
||||||
|
<header>
|
||||||
|
<h1>
|
||||||
|
<span class="special">Empower.</span>
|
||||||
|
<span>Envision.</span>
|
||||||
|
<span>Excel.</span>
|
||||||
|
</h1>
|
||||||
|
<p>NovaAI is an AI API that allows developers to integrate advanced capabilities like NLP into their apps for free.</p>
|
||||||
|
|
||||||
|
<button>
|
||||||
|
Join Now
|
||||||
|
</button>
|
||||||
|
|
||||||
|
</header>
|
||||||
|
<a id="go" href="#go">
|
||||||
|
DISCOVER NOVA<br>
|
||||||
|
<i class="bi bi-arrow-down"></i>
|
||||||
|
</a>
|
||||||
|
</body>
|
||||||
|
</html>
|
22
web/templates/index.html
Normal file
22
web/templates/index.html
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
{% include 'parts/begin.html' %}
|
||||||
|
<link rel="stylesheet" href="/static/css/home.css">
|
||||||
|
|
||||||
|
<header>
|
||||||
|
<h1>Free Generative AI for <span class="special-gradient">Everyone</span></h1>
|
||||||
|
<h3>Make AI Open Again</h3>
|
||||||
|
<a href="/panel">
|
||||||
|
<button class="special">
|
||||||
|
<i class="bi bi-arrow-right"></i>
|
||||||
|
Get started
|
||||||
|
</button>
|
||||||
|
</a>
|
||||||
|
<a href="https://discord.nova-oss.com" target="_blank">
|
||||||
|
<button class="secondary">
|
||||||
|
Join our Discord
|
||||||
|
</button>
|
||||||
|
</a>
|
||||||
|
</header>
|
||||||
|
<main>
|
||||||
|
|
||||||
|
</main>
|
||||||
|
{% include 'parts/end.html' %}
|
|
@ -73,22 +73,29 @@
|
||||||
<sup>1</sup> You <em>are</em> allowed to talk about these topics, but <em>do not</em> endorse them or depict them in any way.
|
<sup>1</sup> You <em>are</em> allowed to talk about these topics, but <em>do not</em> endorse them or depict them in any way.
|
||||||
<p>It goes without saying that illegal content, is forbidden, too! Copyright is a thing, if you like it or not.</p>
|
<p>It goes without saying that illegal content, is forbidden, too! Copyright is a thing, if you like it or not.</p>
|
||||||
|
|
||||||
|
{% if verify %}
|
||||||
|
<p>
|
||||||
|
Because you just ran <code>/key</code>:
|
||||||
|
<b>
|
||||||
|
If you accept both the privacy policy and terms of service, answer with the emoji below .
|
||||||
|
<i>Tip: you can use the search feature to find the emoji more quickly.</i>
|
||||||
|
</b>
|
||||||
|
<h1>{{ verify }}</h1>
|
||||||
|
</p>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
<h2>What you can expect from us</h2>
|
<h2>What you can expect from us</h2>
|
||||||
<p>We're working on getting all of these points.
|
<p>We're working on getting all of these points done.
|
||||||
<ol>
|
<ol>
|
||||||
<li><s>You get notified when we're changing our Terms of Service.</s> (How?)</li>
|
<li><s>You get notified when we're changing our Terms of Service.</s> (How?)</li>
|
||||||
<li>We provide a history of our Terms of Service. (Just check our source code)</li>
|
<li>We provide a history of our Terms of Service. (Just check our source code)</li>
|
||||||
<li>Your account won't be deleted without us stating a clear reason.</li>
|
|
||||||
<li>We won't ever sell your personal data to advertisers.</li>
|
<li>We won't ever sell your personal data to advertisers.</li>
|
||||||
<li>
|
<li>
|
||||||
When asked, we will give the government as little information as possible about you,
|
When asked, we will give the government as little information as possible about you,
|
||||||
unless we genuinely think you have made a strong violation of our ethics.
|
unless we genuinely think you have made a strong violation of our ethics.
|
||||||
</li>
|
</li>
|
||||||
<li>You maintain ownership of the content you create and upload on our platforms.</li>
|
<li>You maintain ownership of the content you create and upload on our platforms.</li>
|
||||||
<li>We only collect logs when necessary to ensure the functionality of our service.</li>
|
<li>We only collect logs when necessary to ensure the functionality and security of our service.</li>
|
||||||
<li>You can delete all your data at any time.</li>
|
|
||||||
<li>You can retrieve an archive of your data at any time.</li>
|
|
||||||
<li>We offer a hidden service, which especially comes in handy if you live in a country with a lot of censorship.</li>
|
|
||||||
</ol>
|
</ol>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
@ -96,7 +103,7 @@
|
||||||
<p>We ask you to...
|
<p>We ask you to...
|
||||||
<ol>
|
<ol>
|
||||||
<li>Follow our ethics</li>
|
<li>Follow our ethics</li>
|
||||||
<li>Follow the German law</li>
|
<li>Obey the German law</li>
|
||||||
<li>Use our APIs etc. responsibly and don't spam</li>
|
<li>Use our APIs etc. responsibly and don't spam</li>
|
||||||
</ol>
|
</ol>
|
||||||
</p>
|
</p>
|
42
web/templates/novacord.html
Normal file
42
web/templates/novacord.html
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
{% include 'parts/begin.html' %}
|
||||||
|
<link rel="stylesheet" href="/static/css/home.css">
|
||||||
|
|
||||||
|
<main>
|
||||||
|
<h1>NovaCord</h1>
|
||||||
|
<p>
|
||||||
|
Our Discord bot <i>NovaCord</i> can't be invited to your server as it's private, but its source code is at
|
||||||
|
<a href="https://github.com/NovaOSS/nova-cord" target="_blank">NovaOSS/nova-cord</a>, so feel free to self-host it.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Nontheless, you can freely use most commands of NovaCord on our Discord server.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>How to use it</h2>
|
||||||
|
<p>
|
||||||
|
On our Discord server (assuming you're already verified and can write in channels like <code>#general</code>), go to the channel <code>#commands</code> and type <code>/</code>.
|
||||||
|
You should then see a popup with a list of commands. On the left side of the popup, there should be an icon for each bot. Click the blue NovaAI icon with the caption <i>BOT</i>.
|
||||||
|
Then, you'll see all <i>NovaCord</i> commands which you can use.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<p>If you don't see the commands, try the following:
|
||||||
|
<ul>
|
||||||
|
<li>Update your Discord app/program.</li>
|
||||||
|
<li>Use Discord's website.</li>
|
||||||
|
<li>Contact the staff.</li>
|
||||||
|
</ul>
|
||||||
|
</p>
|
||||||
|
<p>If you don't have access to the commands channel:
|
||||||
|
<ul>
|
||||||
|
<li>Open the server options and tick <code>Show All Channels</code>.</li>
|
||||||
|
<li>Press <kbd>Ctrl</kbd>+<kbd>K</kbd>
|
||||||
|
(PC) or open up the search tab on the mobile app and search for
|
||||||
|
<code>#commands</code>. There might be multiple channels with the
|
||||||
|
same name, so make sure it says <code>NovaAI</code> at the right.
|
||||||
|
</li>
|
||||||
|
<li>Contact the staff.</li>
|
||||||
|
</ul>
|
||||||
|
</p>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
{% include 'parts/end.html' %}
|
Loading…
Reference in a new issue