From 3f954e525f1ccc109b59260f3793fb94b58968fb Mon Sep 17 00:00:00 2001 From: max/sooulix Date: Thu, 4 Jul 2024 20:01:35 +0200 Subject: [PATCH] initial commit --- .gitignore | 5 + Makefile | 72 ++++++++ content/hello_world.rst | 12 ++ publishconf.py | 22 +++ tasks.py | 147 ++++++++++++++++ theme/static/css/main.css | 1 + theme/static/css/stork-dark.css | 38 ++++ theme/static/css/stork.css | 212 ++++++++++++++++++++++ theme/templates/analytics.html | 33 ++++ theme/templates/archives.html | 120 +++++++++++++ theme/templates/article.html | 123 +++++++++++++ theme/templates/author.html | 2 + theme/templates/authors.html | 12 ++ theme/templates/base.html | 252 +++++++++++++++++++++++++++ theme/templates/categories.html | 21 +++ theme/templates/category.html | 7 + theme/templates/comments.html | 5 + theme/templates/disqus_script.html | 12 ++ theme/templates/index.html | 89 ++++++++++ theme/templates/page.html | 47 +++++ theme/templates/pagination.html | 20 +++ theme/templates/period_archives.html | 14 ++ theme/templates/search.html | 24 +++ theme/templates/tag.html | 7 + theme/templates/tags.html | 22 +++ theme/templates/translations.html | 16 ++ 26 files changed, 1335 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 content/hello_world.rst create mode 100644 publishconf.py create mode 100644 tasks.py create mode 100644 theme/static/css/main.css create mode 100644 theme/static/css/stork-dark.css create mode 100644 theme/static/css/stork.css create mode 100644 theme/templates/analytics.html create mode 100644 theme/templates/archives.html create mode 100644 theme/templates/article.html create mode 100644 theme/templates/author.html create mode 100644 theme/templates/authors.html create mode 100644 theme/templates/base.html create mode 100644 theme/templates/categories.html create mode 100644 theme/templates/category.html create mode 100644 theme/templates/comments.html create mode 100644 theme/templates/disqus_script.html create mode 100644 theme/templates/index.html create mode 100644 theme/templates/page.html create mode 100755 theme/templates/pagination.html create mode 100644 theme/templates/period_archives.html create mode 100644 theme/templates/search.html create mode 100644 theme/templates/tag.html create mode 100644 theme/templates/tags.html create mode 100644 theme/templates/translations.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2ce9f23 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +*.pyc +__pycache__ +*.swp +*.swo +output diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..252df93 --- /dev/null +++ b/Makefile @@ -0,0 +1,72 @@ +PY?= +PELICAN?=pelican +PELICANOPTS= + +BASEDIR=$(CURDIR) +INPUTDIR=$(BASEDIR)/content +OUTPUTDIR=$(BASEDIR)/output +CONFFILE=$(BASEDIR)/pelicanconf.py +PUBLISHCONF=$(BASEDIR)/publishconf.py + + +DEBUG ?= 0 +ifeq ($(DEBUG), 1) + PELICANOPTS += -D +endif + +RELATIVE ?= 0 +ifeq ($(RELATIVE), 1) + PELICANOPTS += --relative-urls +endif + +SERVER ?= "0.0.0.0" + +PORT ?= 0 +ifneq ($(PORT), 0) + PELICANOPTS += -p $(PORT) +endif + + +help: + @echo 'Makefile for a pelican Web site ' + @echo ' ' + @echo 'Usage: ' + @echo ' make html (re)generate the web site ' + @echo ' make clean remove the generated files ' + @echo ' make regenerate regenerate files upon modification ' + @echo ' make publish generate using production settings ' + @echo ' make serve [PORT=8000] serve site at http://localhost:8000' + @echo ' make serve-global [SERVER=0.0.0.0] serve (as root) to $(SERVER):80 ' + @echo ' make devserver [PORT=8000] serve and regenerate together ' + @echo ' make devserver-global regenerate and serve on 0.0.0.0 ' + @echo ' ' + @echo 'Set the DEBUG variable to 1 to enable debugging, e.g. make DEBUG=1 html ' + @echo 'Set the RELATIVE variable to 1 to enable relative urls ' + @echo ' ' + +html: + "$(PELICAN)" "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS) + +clean: + [ ! -d "$(OUTPUTDIR)" ] || rm -rf "$(OUTPUTDIR)" + +regenerate: + "$(PELICAN)" -r "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS) + +serve: + "$(PELICAN)" -l "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS) + +serve-global: + "$(PELICAN)" -l "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS) -b $(SERVER) + +devserver: + "$(PELICAN)" -lr "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS) + +devserver-global: + "$(PELICAN)" -lr "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS) -b 0.0.0.0 + +publish: + "$(PELICAN)" "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(PUBLISHCONF)" $(PELICANOPTS) + + +.PHONY: html help clean regenerate serve serve-global devserver devserver-global publish \ No newline at end of file diff --git a/content/hello_world.rst b/content/hello_world.rst new file mode 100644 index 0000000..e642b09 --- /dev/null +++ b/content/hello_world.rst @@ -0,0 +1,12 @@ +Hello World +########### + +:date: 2010-10-03 10:20 +:modified: 2010-10-04 18:40 +:tags: helloworld, test +:category: none +:slug: hello-world +:authors: toto +:summary: les shorts + +cucu hello wrlod diff --git a/publishconf.py b/publishconf.py new file mode 100644 index 0000000..16a0503 --- /dev/null +++ b/publishconf.py @@ -0,0 +1,22 @@ +# This file is only used if you use `make publish` or +# explicitly specify it as your config file. + +import os +import sys + +sys.path.append(os.curdir) +from pelicanconf import * + +# If your site is available via HTTPS, make sure SITEURL begins with https:// +SITEURL = "" +RELATIVE_URLS = False + +FEED_ALL_ATOM = "feeds/all.atom.xml" +CATEGORY_FEED_ATOM = "feeds/{slug}.atom.xml" + +DELETE_OUTPUT_DIRECTORY = True + +# Following items are often useful when publishing + +# DISQUS_SITENAME = "" +# GOOGLE_ANALYTICS = "" \ No newline at end of file diff --git a/tasks.py b/tasks.py new file mode 100644 index 0000000..16ba5e9 --- /dev/null +++ b/tasks.py @@ -0,0 +1,147 @@ +import os +import shlex +import shutil +import sys +import datetime + +from invoke import task +from invoke.main import program +from invoke.util import cd +from pelican import main as pelican_main +from pelican.server import ComplexHTTPRequestHandler, RootedHTTPServer +from pelican.settings import DEFAULT_CONFIG, get_settings_from_file + +OPEN_BROWSER_ON_SERVE = True +SETTINGS_FILE_BASE = "pelicanconf.py" +SETTINGS = {} +SETTINGS.update(DEFAULT_CONFIG) +LOCAL_SETTINGS = get_settings_from_file(SETTINGS_FILE_BASE) +SETTINGS.update(LOCAL_SETTINGS) + +CONFIG = { + "settings_base": SETTINGS_FILE_BASE, + "settings_publish": "publishconf.py", + # Output path. Can be absolute or relative to tasks.py. Default: 'output' + "deploy_path": SETTINGS["OUTPUT_PATH"], + # Host and port for `serve` + "host": "localhost", + "port": 8000, +} + + +@task +def clean(c): + """Remove generated files""" + if os.path.isdir(CONFIG["deploy_path"]): + shutil.rmtree(CONFIG["deploy_path"]) + os.makedirs(CONFIG["deploy_path"]) + + +@task +def build(c): + """Build local version of site""" + pelican_run("-s {settings_base}".format(**CONFIG)) + + +@task +def rebuild(c): + """`build` with the delete switch""" + pelican_run("-d -s {settings_base}".format(**CONFIG)) + + +@task +def regenerate(c): + """Automatically regenerate site upon file modification""" + pelican_run("-r -s {settings_base}".format(**CONFIG)) + + +@task +def serve(c): + """Serve site at http://$HOST:$PORT/ (default is localhost:8000)""" + + class AddressReuseTCPServer(RootedHTTPServer): + allow_reuse_address = True + + server = AddressReuseTCPServer( + CONFIG["deploy_path"], + (CONFIG["host"], CONFIG["port"]), + ComplexHTTPRequestHandler, + ) + + if OPEN_BROWSER_ON_SERVE: + # Open site in default browser + import webbrowser + + webbrowser.open("http://{host}:{port}".format(**CONFIG)) + + sys.stderr.write("Serving at {host}:{port} ...\n".format(**CONFIG)) + server.serve_forever() + + +@task +def reserve(c): + """`build`, then `serve`""" + build(c) + serve(c) + + +@task +def preview(c): + """Build production version of site""" + pelican_run("-s {settings_publish}".format(**CONFIG)) + +@task +def livereload(c): + """Automatically reload browser tab upon file modification.""" + from livereload import Server + + def cached_build(): + cmd = "-s {settings_base} -e CACHE_CONTENT=true LOAD_CONTENT_CACHE=true" + pelican_run(cmd.format(**CONFIG)) + + cached_build() + server = Server() + theme_path = SETTINGS["THEME"] + watched_globs = [ + CONFIG["settings_base"], + f"{theme_path}/templates/**/*.html", + ] + + content_file_extensions = [".md", ".rst"] + for extension in content_file_extensions: + content_glob = "{}/**/*{}".format(SETTINGS["PATH"], extension) + watched_globs.append(content_glob) + + static_file_extensions = [".css", ".js"] + for extension in static_file_extensions: + static_file_glob = f"{theme_path}/static/**/*{extension}" + watched_globs.append(static_file_glob) + + for glob in watched_globs: + server.watch(glob, cached_build) + + if OPEN_BROWSER_ON_SERVE: + # Open site in default browser + import webbrowser + + webbrowser.open("http://{host}:{port}".format(**CONFIG)) + + server.serve(host=CONFIG["host"], port=CONFIG["port"], root=CONFIG["deploy_path"]) + + +@task +def publish(c): + """Publish to production via rsync""" + pelican_run("-s {settings_publish}".format(**CONFIG)) + c.run( + 'rsync --delete --exclude ".DS_Store" -pthrvz -c ' + '-e "ssh -p {ssh_port}" ' + "{} {ssh_user}@{ssh_host}:{ssh_path}".format( + CONFIG["deploy_path"].rstrip("/") + "/", **CONFIG + ) + ) + + +def pelican_run(cmd): + cmd += " " + program.core.remainder # allows to pass-through args to pelican + pelican_main(shlex.split(cmd)) \ No newline at end of file diff --git a/theme/static/css/main.css b/theme/static/css/main.css new file mode 100644 index 0000000..792ed8d --- /dev/null +++ b/theme/static/css/main.css @@ -0,0 +1 @@ +/*! tailwindcss v3.4.4 | MIT License | https://tailwindcss.com*/*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{-webkit-text-size-adjust:100%;font-feature-settings:normal;-webkit-tap-highlight-color:transparent;font-family:-apple-system,BlinkMacSystemFont,segoe ui,Roboto,Oxygen,Ubuntu,Cantarell,open sans,helvetica neue,"sans-serif";font-variation-settings:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-feature-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{font-feature-settings:inherit;color:inherit;font-family:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af;opacity:1}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]{display:none}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-bottom:1.2em;margin-top:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);font-weight:500;text-decoration:underline}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-bottom:1.25em;margin-top:1.25em;padding-inline-start:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-bottom:1.25em;margin-top:1.25em;padding-inline-start:1.625em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-counters);font-weight:400}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-bottom:3em;margin-top:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){border-inline-start-color:var(--tw-prose-quote-borders);border-inline-start-width:.25rem;color:var(--tw-prose-quotes);font-style:italic;font-weight:500;margin-bottom:1.6em;margin-top:1.6em;padding-inline-start:1em;quotes:"\201C""\201D""\2018""\2019"}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:2.25em;font-weight:800;line-height:1.1111111;margin-bottom:.8888889em;margin-top:0}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:900}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:1.5em;font-weight:700;line-height:1.3333333;margin-bottom:1em;margin-top:2em}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:800}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:1.25em;font-weight:600;line-height:1.6;margin-bottom:.6em;margin-top:1.6em}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;line-height:1.5;margin-bottom:.5em;margin-top:1.5em}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-bottom:2em;margin-top:2em}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.3125rem;box-shadow:0 0 0 1px rgb(var(--tw-prose-kbd-shadows)/10%),0 3px 0 rgb(var(--tw-prose-kbd-shadows)/10%);color:var(--tw-prose-kbd);font-family:inherit;font-size:.875em;font-weight:500;padding-inline-end:.375em;padding-bottom:.1875em;padding-top:.1875em;padding-inline-start:.375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-size:.875em;font-weight:600}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:"`"}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:var(--tw-prose-pre-bg);border-radius:.375rem;color:var(--tw-prose-pre-code);font-size:.875em;font-weight:400;line-height:1.7142857;margin-bottom:1.7142857em;margin-top:1.7142857em;overflow-x:auto;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-top:.8571429em;padding-inline-start:1.1428571em}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-radius:0;border-width:0;color:inherit;font-family:inherit;font-size:inherit;font-weight:inherit;line-height:inherit;padding:0}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.875em;line-height:1.7142857;margin-bottom:2em;margin-top:2em;table-layout:auto;text-align:start;width:100%}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-color:var(--tw-prose-th-borders);border-bottom-width:1px}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em;vertical-align:bottom}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-color:var(--tw-prose-td-borders);border-bottom-width:1px}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-color:var(--tw-prose-th-borders);border-top-width:1px}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body:#374151;--tw-prose-headings:#111827;--tw-prose-lead:#4b5563;--tw-prose-links:#111827;--tw-prose-bold:#111827;--tw-prose-counters:#6b7280;--tw-prose-bullets:#d1d5db;--tw-prose-hr:#e5e7eb;--tw-prose-quotes:#111827;--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-kbd:#111827;--tw-prose-kbd-shadows:17 24 39;--tw-prose-code:#111827;--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:#d1d5db;--tw-prose-td-borders:#e5e7eb;--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:255 255 255;--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:rgba(0,0,0,.5);--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.5em;margin-top:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.75em;margin-top:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.75em;margin-top:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-top:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.aspect-h-9{--tw-aspect-h:9}.aspect-w-16{--tw-aspect-w:16;padding-bottom:calc(var(--tw-aspect-h)/var(--tw-aspect-w)*100%);position:relative}.aspect-w-16>*{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%}.absolute{position:absolute}.relative{position:relative}.left-0{left:0}.right-0{right:0}.m-1{margin:.25rem}.m-2{margin:.5rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-bottom:.25rem;margin-top:.25rem}.my-10{margin-bottom:2.5rem;margin-top:2.5rem}.my-12{margin-bottom:3rem;margin-top:3rem}.my-2{margin-bottom:.5rem;margin-top:.5rem}.my-4{margin-bottom:1rem;margin-top:1rem}.my-6{margin-bottom:1.5rem;margin-top:1.5rem}.my-8{margin-bottom:2rem;margin-top:2rem}.mb-12{margin-bottom:3rem}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.mr-2{margin-right:.5rem}.mr-4{margin-right:1rem}.mt-1{margin-top:.25rem}.mt-10{margin-top:2.5rem}.mt-12{margin-top:3rem}.mt-3{margin-top:.75rem}.mt-6{margin-top:1.5rem}.block{display:block}.flex{display:flex}.inline-flex{display:inline-flex}.contents{display:contents}.hidden{display:none}.h-10{height:2.5rem}.h-12{height:3rem}.h-3{height:.75rem}.h-5{height:1.25rem}.min-h-screen{min-height:100vh}.w-1\/2{width:50%}.w-3{width:.75rem}.w-5{width:1.25rem}.w-full{width:100%}.max-w-7xl{max-width:80rem}.flex-1{flex:1 1 0%}.flex-grow{flex-grow:1}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-center{justify-content:center}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.5rem*var(--tw-space-x-reverse))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1rem*var(--tw-space-x-reverse))}.overflow-hidden,.truncate{overflow:hidden}.truncate{text-overflow:ellipsis;white-space:nowrap}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-l-lg{border-bottom-left-radius:.5rem;border-top-left-radius:.5rem}.rounded-r-lg{border-bottom-right-radius:.5rem;border-top-right-radius:.5rem}.border-2{border-width:2px}.border-b-2{border-bottom-width:2px}.border-zinc-500{--tw-border-opacity:1;border-color:rgb(113 113 122/var(--tw-border-opacity))}.border-zinc-800{--tw-border-opacity:1;border-color:rgb(39 39 42/var(--tw-border-opacity))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.bg-neutral-100{--tw-bg-opacity:1;background-color:rgb(245 245 245/var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-zinc-100{--tw-bg-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity))}.bg-zinc-200{--tw-bg-opacity:1;background-color:rgb(228 228 231/var(--tw-bg-opacity))}.bg-zinc-300{--tw-bg-opacity:1;background-color:rgb(212 212 216/var(--tw-bg-opacity))}.bg-zinc-800{--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity))}.fill-current{fill:currentColor}.p-0{padding:0}.p-1{padding:.25rem}.p-4{padding:1rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.py-1\.5{padding-bottom:.375rem;padding-top:.375rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-2\.5{padding-bottom:.625rem;padding-top:.625rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-6{padding-bottom:1.5rem}.pl-4{padding-left:1rem}.pr-2{padding-right:.5rem}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-right{text-align:right}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-zinc-100{--tw-text-opacity:1;color:rgb(244 244 245/var(--tw-text-opacity))}.text-zinc-500{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity))}.text-zinc-700{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity))}.text-zinc-800{--tw-text-opacity:1;color:rgb(39 39 42/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.placeholder-zinc-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(161 161 170/var(--tw-placeholder-opacity))}.placeholder-zinc-400::placeholder{--tw-placeholder-opacity:1;color:rgb(161 161 170/var(--tw-placeholder-opacity))}.transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-75{transition-duration:75ms}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}html{-webkit-tap-highlight-color:transparent}#toc ul li{list-style-type:disc}.image-thumbnail{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}@media (min-width:640px){.image-thumbnail{width:16.666667%}}.image-small{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}@media (min-width:640px){.image-small{width:33.333333%}}.image-medium{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}@media (min-width:640px){.image-medium{width:50%}}.image-large{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);height:100%;width:100%}.image-left{margin-right:1.25rem}@media (min-width:640px){.image-left{float:left}.image-right{float:right;margin-left:1.25rem}}.image-center{margin-left:auto;margin-right:auto}.hover\:bg-zinc-300:hover{--tw-bg-opacity:1;background-color:rgb(212 212 216/var(--tw-bg-opacity))}.hover\:bg-zinc-400:hover{--tw-bg-opacity:1;background-color:rgb(161 161 170/var(--tw-bg-opacity))}.hover\:underline:hover{text-decoration-line:underline}.focus\:border-zinc-500:focus{--tw-border-opacity:1;border-color:rgb(113 113 122/var(--tw-border-opacity))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.active\:-translate-y-1:active{--tw-translate-y:-0.25rem}.active\:-translate-y-1:active,.active\:scale-110:active{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.active\:scale-110:active{--tw-scale-x:1.1;--tw-scale-y:1.1}.prose-headings\:font-semibold :is(:where(h1,h2,h3,h4,h5,h6,th):not(:where([class~=not-prose],[class~=not-prose] *))){font-weight:600}.prose-headings\:text-zinc-800 :is(:where(h1,h2,h3,h4,h5,h6,th):not(:where([class~=not-prose],[class~=not-prose] *))){--tw-text-opacity:1;color:rgb(39 39 42/var(--tw-text-opacity))}.prose-h1\:text-3xl :is(:where(h1):not(:where([class~=not-prose],[class~=not-prose] *))){font-size:1.875rem;line-height:2.25rem}.prose-a\:text-gray-500 :is(:where(a):not(:where([class~=not-prose],[class~=not-prose] *))){--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.prose-blockquote\:text-zinc-800 :is(:where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *))){--tw-text-opacity:1;color:rgb(39 39 42/var(--tw-text-opacity))}.prose-code\:bg-zinc-200 :is(:where(code):not(:where([class~=not-prose],[class~=not-prose] *))){--tw-bg-opacity:1;background-color:rgb(228 228 231/var(--tw-bg-opacity))}.prose-code\:font-light :is(:where(code):not(:where([class~=not-prose],[class~=not-prose] *))){font-weight:300}.prose-pre\:bg-zinc-200 :is(:where(pre):not(:where([class~=not-prose],[class~=not-prose] *))){--tw-bg-opacity:1;background-color:rgb(228 228 231/var(--tw-bg-opacity))}.prose-pre\:text-zinc-800 :is(:where(pre):not(:where([class~=not-prose],[class~=not-prose] *))){--tw-text-opacity:1;color:rgb(39 39 42/var(--tw-text-opacity))}.prose-img\:rounded-md :is(:where(img):not(:where([class~=not-prose],[class~=not-prose] *))){border-radius:.375rem}.dark\:border-zinc-300:is(.dark *){--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity))}.dark\:bg-neutral-700:is(.dark *){--tw-bg-opacity:1;background-color:rgb(64 64 64/var(--tw-bg-opacity))}.dark\:bg-neutral-900:is(.dark *){--tw-bg-opacity:1;background-color:rgb(23 23 23/var(--tw-bg-opacity))}.dark\:bg-zinc-300:is(.dark *){--tw-bg-opacity:1;background-color:rgb(212 212 216/var(--tw-bg-opacity))}.dark\:bg-zinc-700:is(.dark *){--tw-bg-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity))}.dark\:bg-zinc-800:is(.dark *){--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity))}.dark\:text-gray-300:is(.dark *){--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}.dark\:text-neutral-400:is(.dark *){--tw-text-opacity:1;color:rgb(163 163 163/var(--tw-text-opacity))}.dark\:text-zinc-300:is(.dark *){--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}.dark\:text-zinc-400:is(.dark *){--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.dark\:text-zinc-800:is(.dark *){--tw-text-opacity:1;color:rgb(39 39 42/var(--tw-text-opacity))}.dark\:placeholder-zinc-300:is(.dark *)::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(212 212 216/var(--tw-placeholder-opacity))}.dark\:placeholder-zinc-300:is(.dark *)::placeholder{--tw-placeholder-opacity:1;color:rgb(212 212 216/var(--tw-placeholder-opacity))}.dark\:hover\:bg-zinc-800:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity))}.prose-headings\:dark\:text-zinc-300:is(.dark *) :is(:where(h1,h2,h3,h4,h5,h6,th):not(:where([class~=not-prose],[class~=not-prose] *))){--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}.dark\:prose-a\:text-gray-400 :is(:where(a):not(:where([class~=not-prose],[class~=not-prose] *))):is(.dark *){--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.dark\:prose-blockquote\:text-zinc-200 :is(:where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *))):is(.dark *){--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity))}.dark\:prose-strong\:text-zinc-200 :is(:where(strong):not(:where([class~=not-prose],[class~=not-prose] *))):is(.dark *){--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity))}.dark\:prose-code\:bg-zinc-800 :is(:where(code):not(:where([class~=not-prose],[class~=not-prose] *))):is(.dark *){--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity))}.dark\:prose-code\:text-zinc-200 :is(:where(code):not(:where([class~=not-prose],[class~=not-prose] *))):is(.dark *){--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity))}.dark\:prose-pre\:bg-zinc-800 :is(:where(pre):not(:where([class~=not-prose],[class~=not-prose] *))):is(.dark *){--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity))}.dark\:prose-pre\:text-zinc-200 :is(:where(pre):not(:where([class~=not-prose],[class~=not-prose] *))):is(.dark *){--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity))}@media (min-width:640px){.sm\:flex{display:flex}.sm\:justify-between{justify-content:space-between}}@media (min-width:768px){.md\:mx-auto{margin-left:auto;margin-right:auto}.md\:my-12{margin-bottom:3rem;margin-top:3rem}.md\:my-24{margin-bottom:6rem;margin-top:6rem}.md\:mt-14{margin-top:3.5rem}.md\:mt-16{margin-top:4rem}.md\:mt-2{margin-top:.5rem}.md\:flex{display:flex}.md\:w-3\/4{width:75%}.md\:w-40{width:10rem}.md\:max-w-screen-md{max-width:768px}.md\:p-6{padding:1.5rem}.md\:px-3{padding-left:.75rem;padding-right:.75rem}.md\:px-4{padding-left:1rem;padding-right:1rem}.md\:pt-0{padding-top:0}}@media (min-width:1024px){.lg\:mr-24{margin-right:6rem}.lg\:max-w-none{max-width:none}.lg\:prose-h1\:text-3xl :is(:where(h1):not(:where([class~=not-prose],[class~=not-prose] *))){font-size:1.875rem;line-height:2.25rem}}@media (min-width:1280px){.xl\:ml-32{margin-left:8rem}} \ No newline at end of file diff --git a/theme/static/css/stork-dark.css b/theme/static/css/stork-dark.css new file mode 100644 index 0000000..96f2b21 --- /dev/null +++ b/theme/static/css/stork-dark.css @@ -0,0 +1,38 @@ +@import url(https://files.stork-search.net/basic.css); + +body:not(.stork-multitheme), +.stork-wrapper-dark { + --stork-border-color: hsl(0, 0%, 36%); + --stork-background-color: hsl(0, 0%, 22%); + --stork-accent-color: hsl(194, 90%, 53%); + + --stork-input-text-color: white; + + --stork-results-hover-color: hsl(210, 83%, 16%); + --stork-results-title-color: white; + --stork-results-excerpt-color: hsla(0, 0%, 80%, 1); + --stork-results-highlight-color: rgb(94, 201, 186); + --stork-results-border-color: hsl(0, 0%, 30%); +} + +body:not(.stork-multitheme) .stork-close-button, +.stork-wrapper-dark .stork-close-button { + background: linear-gradient( + to bottom, + hsl(0, 0%, 60%) 0%, + hsl(0, 0%, 50%) 100% + ); + border: 1px solid hsla(0, 0%, 50%, 0.8); + color: hsl(0, 0%, 25%); +} + +body:not(.stork-multitheme) .stork-close-button:hover, +.stork-wrapper-dark .stork-close-button:hover { + background: hsla(0, 0%, 45%); + cursor: pointer; +} + +body:not(.stork-multitheme) .stork-close-button:active, +.stork-wrapper-dark .stork-close-button:active { + background: hsla(0, 0%, 40%); +} diff --git a/theme/static/css/stork.css b/theme/static/css/stork.css new file mode 100644 index 0000000..381c786 --- /dev/null +++ b/theme/static/css/stork.css @@ -0,0 +1,212 @@ +:root { + --stork-border-color: hsl(0, 0%, 65%); + --stork-background-color: hsla(0, 0%, 97%, 1); + --stork-font-family: inherit; + --stork-size-multiplier: 1; + --stork-accent-color: hsl(210, 72%, 45%); + + --stork-input-width: 100%; + --stork-input-border-radius: 8px; + --stork-input-text-color: black; + --stork-input-shadow: 1; + + --stork-results-width: 100%; + --stork-results-border-radius: 4px; + --stork-results-shadow: 1; + --stork-results-hover-color: hsl(210, 65%, 75%); + --stork-results-title-color: black; + --stork-results-excerpt-color: black; + --stork-results-highlight-color: rgb(245, 230, 26); + --stork-results-border-color: var(--stork-border-color); +} + +.stork-wrapper { + position: relative; + font-family: var(--stork-font-family); + box-sizing: border-box; + font-size: 1em * var(--stork-size-multiplier); +} + +.stork-wrapper *, +.stork-wrapper *:before, +.stork-wrapper *:after { + box-sizing: border-box; +} + +.stork-input { + width: var(--stork-input-width); + height: 2.4em; + font-size: 1em; + padding: 0.4em 0.8em; + position: relative; + box-shadow: inset 0 0.1em 0.3em + hsla(0, 0%, 0%, calc(var(--stork-input-shadow) * 0.25)); + border: 1px solid var(--stork-border-color); + border-radius: var(--stork-input-border-radius); + background-color: var(--stork-background-color); + color: var(--stork-input-text-color); + font-family: var(--stork-font-family); +} + +.stork-input:focus { + outline: none; +} + +.stork-progress { + position: absolute; + display: block; + content: ""; + bottom: 1px; + background-color: var(--stork-accent-color); + box-shadow: 0 0 8px var(--stork-accent-color); + height: 1px; + transition: width 0.25s ease, opacity 0.4s ease 0.4s; +} + +.stork-output { + position: absolute; + width: var(--stork-results-width); + margin-top: 0.5em; + border-radius: var(--stork-results-border-radius); + display: flex; + flex-direction: column; + z-index: 100; + color: var(--stork-results-title-color); + font-weight: 400; + font-family: var(--stork-font-family); +} + +.stork-attribution a:link, +.stork-attribution a:visited { + color: var(--stork-accent-color); +} + +.stork-output-visible { + border: 1px solid var(--stork-border-color); + box-shadow: 0px 0px 2.2px + rgba(0, 0, 0, calc(var(--stork-results-shadow) * 0.02)), + 0px 0px 5.3px rgba(0, 0, 0, calc(var(--stork-results-shadow) * 0.028)), + 0px 0px 10px rgba(0, 0, 0, calc(var(--stork-results-shadow) * 0.035)), + 0px 0px 17.9px rgba(0, 0, 0, calc(var(--stork-results-shadow) * 0.042)), + 0px 0px 33.4px rgba(0, 0, 0, calc(var(--stork-results-shadow) * 0.05)), + 0px 0px 80px rgba(0, 0, 0, calc(var(--stork-results-shadow) * 0.07)); + background: var(--stork-background-color); +} + +.stork-message { + width: 100%; + padding: 0.5em 1em; + color: var(--stork-results-title-color); +} + +.stork-attribution { + width: 100%; + padding: 0.5em 1em; + font-size: 0.8em; + color: var(--stork-results-title-color); +} + +.stork-results { + margin: 0; + padding: 0.25em 0; + width: 100%; + list-style-type: none; + max-height: 25em; + overflow-y: scroll; + border-top: 1px solid var(--stork-border-color); + border-bottom: 1px solid var(--stork-border-color); + box-shadow: inset 0em 0.7em 0.7em -0.7em hsla(0, 0%, 0%, calc(var( + --stork-results-shadow + ) * 0.34)), + inset 0em -0.7em 0.7em -0.7em + hsl(0, 0%, 0%, calc(var(--stork-results-shadow) * 0.34)); +} + +.stork-result:not(:last-child) { + border-bottom: 1px solid var(--stork-results-border-color); +} + +.stork-result.selected { + background: var(--stork-results-hover-color); +} + +.stork-result a:link { + padding: 1em; + display: block; + color: currentcolor; + text-decoration: none; +} + +.stork-result p { + margin: 0; +} + +.stork-title { + font-weight: bold; + font-size: 0.95em; + margin: 0 0 0.75em 0; + color: var(--stork-results-title-color); + + /* Flexbox container for the title and the score, when debugging */ + display: flex; + justify-content: space-between; +} + +.stork-excerpt { + font-size: 0.8em; + line-height: 1; + margin: 0; + color: var(--stork-results-excerpt-color); + + /* Flexbox container for the title and the score, when debugging */ + display: flex; + justify-content: space-between; +} + +.stork-excerpt:not(:last-of-type) { + margin-bottom: 0.6em; +} + +.stork-highlight { + background-color: var(--stork-results-highlight-color); + padding: 0 0.1em; +} + +.stork-error { + outline: 2px solid hsl(0, 89%, 46%); +} + +.stork-close-button { + position: absolute; + bottom: 0; + right: 0; + margin: 0.3em 0.4em; + height: 1.5em; + width: 1.5em; + padding: 0px; + background: linear-gradient( + to bottom, + hsl(0, 0%, 85%) 0%, + hsl(0, 0%, 75%) 100% + ); + border: 1px solid hsla(0, 0%, 50%, 0.8); + font-size: 1.1em; + color: hsl(0, 0%, 45%); + border-radius: 15%; + line-height: 1; +} + +.stork-close-button svg { + width: 0.8em; + position: relative; + top: 1px; +} + +.stork-close-button:hover { + background: hsla(0, 0%, 70%); + cursor: pointer; +} + +.stork-close-button:active { + background: hsla(0, 0%, 65%); +} diff --git a/theme/templates/analytics.html b/theme/templates/analytics.html new file mode 100644 index 0000000..9762933 --- /dev/null +++ b/theme/templates/analytics.html @@ -0,0 +1,33 @@ +{% if GOOGLE_ANALYTICS %} + +{% endif %} +{% if GAUGES %} + +{% endif %} \ No newline at end of file diff --git a/theme/templates/archives.html b/theme/templates/archives.html new file mode 100644 index 0000000..bacc874 --- /dev/null +++ b/theme/templates/archives.html @@ -0,0 +1,120 @@ +{% extends "base.html" %} + +{% block title %}Archive | {{ SITENAME }}{% endblock %} +{% set current = "archive" %} + +{% macro countyear(year) %} + {% set name = namespace(y=0) %} + {% for article in dates %} + {% if article.date | strftime('%Y') == year %} + {% set name.y = name.y + 1 %} + {% endif %} + {% endfor %} + {{name.y}} +{% endmacro %} + +{% macro countmonth(month, year) %} + {% set name = namespace(m=0) %} + {% for article in dates %} + {% if article.date | strftime('%B') == month and article.date | strftime('%Y') == year %} + {% set name.m = name.m + 1 %} + {% endif %} + {% endfor %} + {{name.m}} +{% endmacro %} + +{% block content %} + +
+

Archive

+ +
+{% if dates_page.has_other_pages() %} + {% include 'pagination.html' %} +{% endif %} + +{% endblock %} \ No newline at end of file diff --git a/theme/templates/article.html b/theme/templates/article.html new file mode 100644 index 0000000..53f0bc4 --- /dev/null +++ b/theme/templates/article.html @@ -0,0 +1,123 @@ +{% extends "base.html" %} +{% block html_lang %}{{ article.lang }}{% endblock %} +{% block head -%} +{{ super() -}} +{% if article.summary %} + +{% endif %} +{% endblock %} +{% block title %}{{ article.title|striptags }}{% endblock %} +{% block extra_head %} +{% import 'translations.html' as translations with context %} +{% if translations.entry_hreflang(article) %} +{{ translations.entry_hreflang(article) }} +{% endif %} +{% endblock %} + +{% block content %} + +
+
+

{{article.title}}

+
+
+ +
+ {% if article.readtime %} +  · {{ article.readtime }} min read + {% endif %} +
+
+ {% if article.author != '' %} +  · {{ article.author }} + {% endif %} +
+
+
+ {% if article.modified %} +
+ Last updated: {{ article.modified|strftime('%B %d, %Y') }} +
+ {% endif %} +
+ {% if article.toc %} +
+ Table of contents +
+ {{ article.toc }} +
+
+ {% endif %} +
+ {{ article.content }} + +
+ +
+ {% include 'disqus_script.html' %} +
+
+ +{% endblock %} \ No newline at end of file diff --git a/theme/templates/author.html b/theme/templates/author.html new file mode 100644 index 0000000..0b37290 --- /dev/null +++ b/theme/templates/author.html @@ -0,0 +1,2 @@ +{% extends "index.html" %} +{% block title %}{{ SITENAME }} - {{ author }}{% endblock %} diff --git a/theme/templates/authors.html b/theme/templates/authors.html new file mode 100644 index 0000000..5755f45 --- /dev/null +++ b/theme/templates/authors.html @@ -0,0 +1,12 @@ +{% extends "base.html" %} + +{% block title %}{{ SITENAME }} - Authors{% endblock %} + +{% block content %} +

Authors on {{ SITENAME }}

+ +{% endblock %} \ No newline at end of file diff --git a/theme/templates/base.html b/theme/templates/base.html new file mode 100644 index 0000000..5e4c99f --- /dev/null +++ b/theme/templates/base.html @@ -0,0 +1,252 @@ + + + + + {% block head %} + + + + {% block title %} {{ SITENAME }} {% endblock %} + + + + + + {% if FEED_ALL_ATOM %} + + {% endif %} + {% if FEED_ALL_RSS %} + + {% endif %} + {% block extra_head %}{% endblock extra_head %} + {% endblock head %} + + + + + +
+ {% if article %} + + {% elif tag %} + + {% elif page %} + + {% elif category %} + + {% endif %} + {% block content %} {% endblock %} +
+ + + {% include 'analytics.html' %} + {% include 'disqus_script.html' %} + + + + + + + \ No newline at end of file diff --git a/theme/templates/categories.html b/theme/templates/categories.html new file mode 100644 index 0000000..bbc65a3 --- /dev/null +++ b/theme/templates/categories.html @@ -0,0 +1,21 @@ +{% extends "base.html" %} + +{% block title %}{{ SITENAME }} | Categories{% endblock %} +{% set current = "categories" %} + +{% block content %} + +
+

Categories

+ +
+ +{% endblock %} \ No newline at end of file diff --git a/theme/templates/category.html b/theme/templates/category.html new file mode 100644 index 0000000..8e6e379 --- /dev/null +++ b/theme/templates/category.html @@ -0,0 +1,7 @@ +{% extends "index.html" %} + +{% block title %}{{ category }} | {{SITENAME}}{% endblock %} + +{% block content_title %} + +{% endblock %} \ No newline at end of file diff --git a/theme/templates/comments.html b/theme/templates/comments.html new file mode 100644 index 0000000..40a4159 --- /dev/null +++ b/theme/templates/comments.html @@ -0,0 +1,5 @@ +{% if DISQUS_SITENAME %} +

+ There are comments. +

+{% endif %} diff --git a/theme/templates/disqus_script.html b/theme/templates/disqus_script.html new file mode 100644 index 0000000..de2209a --- /dev/null +++ b/theme/templates/disqus_script.html @@ -0,0 +1,12 @@ +{% if DISQUS_SITENAME %} + +{% endif %} \ No newline at end of file diff --git a/theme/templates/index.html b/theme/templates/index.html new file mode 100644 index 0000000..df92f80 --- /dev/null +++ b/theme/templates/index.html @@ -0,0 +1,89 @@ +{% extends "base.html" %} + +{% block content %} + +{% block content_title %} +{% if not category and not tag %} +
+ {% if SUBTITLE %} +

{{ SUBTITLE }}

+ {%endif%} + {%if SUBTEXT %} +

{{ SUBTEXT }}

+ {% endif %} + {% if SOCIAL or FEED_ALL_ATOM or FEED_ALL_RSS %} + + {% endif %} +
+{% endif %} +{% endblock %} + +
+ +
+{% if articles_page.has_other_pages() %} + {% include 'pagination.html' %} +{% endif %} + +{% endblock content %} \ No newline at end of file diff --git a/theme/templates/page.html b/theme/templates/page.html new file mode 100644 index 0000000..0a60a45 --- /dev/null +++ b/theme/templates/page.html @@ -0,0 +1,47 @@ +{% extends "base.html" %} +{% block html_lang %}{{ page.lang }}{% endblock %} + +{% block title %}{{ SITENAME }} | {{ page.title }}{%endblock%} + +{% block content %} + +
+
+ {% import 'translations.html' as translations with context %} + {{ translations.translations_for(page) }} + {{ page.content }} + +
+
+ {% for name, link in SHARE %} + + {% endfor %} +
+
+ {% include 'disqus_script.html' %} +
+
+ +{% endblock %} \ No newline at end of file diff --git a/theme/templates/pagination.html b/theme/templates/pagination.html new file mode 100755 index 0000000..0847c52 --- /dev/null +++ b/theme/templates/pagination.html @@ -0,0 +1,20 @@ +{% if DEFAULT_PAGINATION %} +{% set first_page = articles_paginator.page(1) %} +{% set last_page = articles_paginator.page(articles_paginator.num_pages) %} +
+ {% if articles_page.has_previous() %} + + + {% endif %} + {% if articles_page.has_next() %} + + + {% endif %} +
+{% endif %} \ No newline at end of file diff --git a/theme/templates/period_archives.html b/theme/templates/period_archives.html new file mode 100644 index 0000000..3e709ba --- /dev/null +++ b/theme/templates/period_archives.html @@ -0,0 +1,14 @@ +{% extends "base.html" %} + +{% block title %}{{ SITENAME }} | {{ period | reverse | join(' ') }} archives{% endblock %} + +{% block content %} +

Archives for {{ period | reverse | join(' ') }}

+ +
+{% for article in dates %} +
{{ article.locale_date }}
+
{{ article.title }}
+{% endfor %} +
+{% endblock %} diff --git a/theme/templates/search.html b/theme/templates/search.html new file mode 100644 index 0000000..407b315 --- /dev/null +++ b/theme/templates/search.html @@ -0,0 +1,24 @@ +{% extends "base.html" %} + +{% block title %}Search | {{ SITENAME }}{% endblock %} +{% set current = "search" %} + +{% block content %} + +
+

Search  + + + + +

+
+ +
+
+
+ +{% endblock %} \ No newline at end of file diff --git a/theme/templates/tag.html b/theme/templates/tag.html new file mode 100644 index 0000000..d9d854c --- /dev/null +++ b/theme/templates/tag.html @@ -0,0 +1,7 @@ +{% extends "index.html" %} + +{% block title %} {{ tag }} | {{ SITENAME }}{% endblock %} + +{% block content_title %} + +{% endblock %} \ No newline at end of file diff --git a/theme/templates/tags.html b/theme/templates/tags.html new file mode 100644 index 0000000..ce19e1b --- /dev/null +++ b/theme/templates/tags.html @@ -0,0 +1,22 @@ +{% extends "base.html" %} + +{% block title %}{{ SITENAME }} | Tags{% endblock %} +{% set current = "tags" %} + +{% block content %} + +
+

Tags

+ +
+ +{% endblock %} \ No newline at end of file diff --git a/theme/templates/translations.html b/theme/templates/translations.html new file mode 100644 index 0000000..cac234f --- /dev/null +++ b/theme/templates/translations.html @@ -0,0 +1,16 @@ +{% macro translations_for(article) %} + {% if article.translations %} + Translations: + {% for translation in article.translations %} + {{ translation.lang }} + {% endfor %} + {% endif %} +{% endmacro %} + +{% macro entry_hreflang(entry) %} + {% if entry.translations %} + {% for translation in entry.translations %} + + {% endfor %} + {% endif %} +{% endmacro %} \ No newline at end of file