Small refractoring

This commit is contained in:
nsde 2023-07-25 03:38:53 +02:00
parent f10637baec
commit 50dd4dedb2
38 changed files with 420 additions and 83 deletions

4
.gitignore vendored
View file

@ -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
View file

@ -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
View file

@ -0,0 +1 @@
🥇🥈🥉📒📕📗📘📙💩👻💀👽👾🤖🎃💛💚💙💜💔🐶🐱🐭🐹🐰🦊🐻🐼🐨🐯🦁🐮🐷🐽🐸🐵🙊🙉🙊🐒🐔🐧🐦🐤🐣🐥🦆🦅🦉🦇🐺🐗🐴🦄🐝🐛🦋🐌🐚🐞🐢🐍🦎🦂🦀🦑🐙🦐🐠🐟🐡🐬🦈🐳🐋🐊🐆🐅🐂🐄🦌🐪🐫🐘🦏🦍🐎🐖🐐🐏🐑🐕🐩🐈🐓🦃🐇🐁🐀🐾🐉🐲🌵🎄🌲🌳🌴🌱🌿🍀🎍🎋🍃🍂🍁🍄🌾💐🌷🌹🥀🌻🌼🌸🌺🌎🌍🌏🌕🌖🌗🌘🌑🌒🌓🌔🌚🌝🌞🌛🌜🌙💫⭐️🌟✨🔥💥⛅️🌈⛄️💨🌪🌊💧💦🍏🍎🍐🍊🍋🍌🍉🍇🍓🍈🍒🍑🍍🥝🥑🍅🍆🥒🥕🌽🥔🍠🌰🥜🍯🥐🍞🥖🧀🥚🍳🥓🥞🍤🍗🍖🍕🌭🍔🍟🥙🌮🌯🥗🥘🍝🍜🍲🍥🍣🍱🍛🍚🍙🍘🍢🍡🍧🍨🍦🍰🎂🍮🍭🍬🍫🍿🍩🍪🥛🍼🍵🍶🍺🍻🥂🍷🥃🍸🍹🍾🥄🍴⚽️🏀🏈⚾️🎾🏐🏉🎱🏓🏸🥅🏒🏑🏏⛳️🏹🎣🥊🥋

1
screen.sh Executable file
View 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

View file

@ -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"]}

View file

@ -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}"]}

View file

@ -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}"]}

View file

@ -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
View 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
View 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)

View file

@ -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

View file

@ -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 */

File diff suppressed because one or more lines are too long

View file

@ -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

View file

@ -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}"]}

View file

@ -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 */

View 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}"]}

View file

@ -14,3 +14,6 @@ header
h1 h1
line-height: 3rem line-height: 3rem
h3
font-size: 28px

View file

@ -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;

View 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}"]}

View file

@ -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

View file

@ -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"]}

View file

@ -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;
} }

View file

Before

Width:  |  Height:  |  Size: 744 KiB

After

Width:  |  Height:  |  Size: 744 KiB

View file

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View file

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 37 KiB

View 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
View 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' %}

View file

@ -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>

View 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' %}