summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoreltrac <hi@eltr.ac>2026-10-25 18:45:40 +0800
committereltrac <hi@eltr.ac>2026-10-25 20:14:45 +0800
commit7c35081ca94b9c840969775e38ab3e7ad933435f (patch)
treed317ec2319f618bef770fa503e78030ee1f37262
parentf706343afb3a132562101d205da49ad4a21f5849 (diff)
basic layouts; some content on index page
initial home page
-rw-r--r--.gitignore1
-rw-r--r--builder/base.scm29
-rw-r--r--builder/components.scm43
-rw-r--r--content/pages.scm44
-rw-r--r--haunt.scm16
-rw-r--r--static/avatar.jpgbin0 -> 42156 bytes
-rw-r--r--static/brcn.pngbin0 -> 1151 bytes
-rw-r--r--static/codeberg.svg15
-rw-r--r--static/confetti-doodles.svg1
-rw-r--r--static/main.css139
-rw-r--r--static/normalize.css351
-rw-r--r--static/reset.css48
-rw-r--r--static/weepinbell.pngbin0 -> 170105 bytes
13 files changed, 683 insertions, 4 deletions
diff --git a/.gitignore b/.gitignore
index c9490a5..0e60903 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,2 @@
/site
+.DS_Store
diff --git a/builder/base.scm b/builder/base.scm
new file mode 100644
index 0000000..3ce2536
--- /dev/null
+++ b/builder/base.scm
@@ -0,0 +1,29 @@
+(define-module (builder base)
+ #:use-module (haunt site)
+ #:export (base-template
+ contained-template))
+
+(define (base-template site . content)
+ `((doctype "html")
+ (html (@ (lang "en"))
+ (head
+ (meta (@ (charset "utf-8")))
+ (meta (@ (content "width=device-width,initial-scale=1")
+ (name "viewport")))
+ ;; fonts
+ (link (@ (rel "preconnect")
+ (href "https://fonts.bunny.net")))
+ (link (@ (rel "stylesheet")
+ (href "https://fonts.bunny.net/css?family=alegreya:400,400i,800,800i")))
+ ;; stylesheet
+ (link (@ (rel "stylesheet") (href "/static/normalize.css")))
+ (link (@ (rel "stylesheet") (href "/static/reset.css")))
+ (link (@ (rel "stylesheet") (href "/static/main.css")))
+ (title ,(site-title site)))
+ (body ,@content))))
+
+(define (contained-template site . content)
+ (base-template site
+ `(div (@ (class "container"))
+ ,@content)))
+
diff --git a/builder/components.scm b/builder/components.scm
new file mode 100644
index 0000000..1e0d9fe
--- /dev/null
+++ b/builder/components.scm
@@ -0,0 +1,43 @@
+(define-module (builder components)
+ #:export (header badge prose small-prose linkbox
+ linkline slash link elink))
+
+(define (header name desc image)
+ `(header (@ (class "header"))
+ (div (img (@ (src ,image) (class "header-image"))))
+ (div (@ (class "header-text"))
+ (h2 (@ (class "header-title")) ,name)
+ (div (@ (class "header-desc")) ,desc))))
+
+(define (badge name icon link)
+ `(a (@ (class "badge") (target "_blank") (href ,link))
+ (img (@ (src ,icon)))
+ (span ,name)))
+
+(define (prose . content)
+ `(div (@ (class "prose-container"))
+ ,@content))
+(define (small-prose . content)
+ `(div (@ (class "prose-container small"))
+ ,@content))
+
+(define (linkbox name desc link image)
+ `(a (@ (class "linkbox") (href ,link) (target "_blank"))
+ (img (@ (src ,image)))
+ (div
+ (h4 ,name)
+ (p ,desc))))
+
+(define (link url text)
+ `(a (@ (href ,url)) ,text))
+(define (elink url text)
+ `(a (@ (href ,url) (target "_blank")) ,text))
+
+(define (linkline . links)
+ `(ul (@ (class "linkline"))
+ ,(map (lambda (link)
+ `(li (a (@ (href ,(car link))) ,(cdr link))))
+ links)))
+(define (slash url)
+ (cons url url))
+
diff --git a/content/pages.scm b/content/pages.scm
new file mode 100644
index 0000000..a1d67d1
--- /dev/null
+++ b/content/pages.scm
@@ -0,0 +1,44 @@
+(define-module (content pages)
+ #:use-module (haunt page)
+ #:use-module (haunt html)
+ #:use-module (builder base)
+ #:use-module (builder components)
+ #:export (index-page))
+
+(define (index-page)
+ (lambda (site posts)
+ (make-page "index.html"
+ (contained-template site
+ (header "Hi, Eltrac here 👋"
+ `(p "I write software, fictions and non-fictions.")
+ "/static/avatar.jpg")
+ (prose
+ `(p "Member of " ,(badge "Codeberg e.V." "/static/codeberg.svg"
+ "https://codeberg.org/Codeberg-e.V./") ", "
+ "I maintain and contribute to FOSS projects, mostly in Go, Clojure, and JavaScript."))
+ (small-prose
+ `(p "Recently, I've been developing weepinbell, a Webmention receiver.")
+ (linkbox "weepinbell" "A Webmention receiver written in Clojure."
+ "https://codeberg.org/eltrac/weepinbell" "/static/weepinbell.png"))
+ (prose
+ `(p "Former moderator of "
+ ,(badge "Backrooms Wiki CN" "/static/brcn.png"
+ "https://backrooms-wiki-cn.wikidot.com/") ", "
+ "I wrote some " ,(elink "https://backrooms-wiki-cn.wikidot.com/author:eltrac" "fictions") " there in Chinese. "
+ "Now I write some " ,(elink "https://www.geedea.pro/fiction/" "short stories") " on my own blog."))
+ (prose
+ `(p "Indie web blogger, I write in both " ,(elink "https://geedea.pro/" "Chinese") " and " ,(elink "https://geedea.pro/en/" "English") ", "
+ "about computer science, software freedom, philosophy, literature and my life. My blog is named " (em (@ (style "font-style: italic")) "Geek Death Project") ". "
+ "Consider this a monologue of a committed observer."))
+ (small-prose
+ `(p "Check out some of my " ,(elink "https://slashpages.net/" "slash pages") " :3")
+ (linkline
+ (slash "/contact")
+ (slash "/uses")
+ (slash "/elsewhere")
+ (slash "/donates")))
+ `(footer (@ (style "text-align: right; line-height: 1.5"))
+ (p "This page is still under construction. 🚧")
+ (p "Built using " ,(elink "https://dthompson.dev/projects/haunt.html" "haunt") ", "
+ "with " (em (@ (style "font-style: italic")) "Lisp") " magic. 👻")))
+ sxml->html)))
diff --git a/haunt.scm b/haunt.scm
index 65eb760..3fc75bd 100644
--- a/haunt.scm
+++ b/haunt.scm
@@ -1,9 +1,15 @@
(use-modules (haunt asset)
(haunt builder blog)
+ (haunt builder flat-pages)
(haunt builder atom)
- ;(haunt builder assets)
+ (haunt builder assets)
(haunt reader commonmark)
- (haunt site))
+ (haunt html)
+ (haunt page)
+ (haunt site)
+ (builder base)
+ (builder components)
+ (content pages))
(site #:title "Eltrac"
#:domain "eltr.ac"
@@ -12,6 +18,8 @@
(email . "hi@eltr.ac"))
#:readers (list commonmark-reader)
#:builders (list (blog)
- ;(static-directory "images")
+ (flat-pages)
+ (static-directory "static")
(atom-feed)
- (atom-feeds-by-tag)))
+ (atom-feeds-by-tag)
+ (index-page)))
diff --git a/static/avatar.jpg b/static/avatar.jpg
new file mode 100644
index 0000000..4430627
--- /dev/null
+++ b/static/avatar.jpg
Binary files differ
diff --git a/static/brcn.png b/static/brcn.png
new file mode 100644
index 0000000..2d1d60e
--- /dev/null
+++ b/static/brcn.png
Binary files differ
diff --git a/static/codeberg.svg b/static/codeberg.svg
new file mode 100644
index 0000000..cdcc6cb
--- /dev/null
+++ b/static/codeberg.svg
@@ -0,0 +1,15 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 4.233 4.233">
+ <defs>
+ <style>
+ .codeberg-stop-color { stop-color: #2185d0; }
+ .codeberg-fill { fill: #2185d0; }
+ /*@media (prefers-color-scheme: dark) {
+ .codeberg-stop-color { stop-color: #ffffff; }
+ .codeberg-fill { fill: #ffffff; }
+ }*/
+ </style>
+ <linearGradient id="A" x1="42519.285" y1="-7078.789" x2="42575.336" y2="-6966.931" gradientUnits="userSpaceOnUse"><stop offset="0" class="codeberg-stop-color" stop-opacity="0"/><stop offset=".495" class="codeberg-stop-color" stop-opacity=".3"/></linearGradient>
+ </defs>
+ <path d="M42519.285-7078.789c-.225.002-.437.078-.58.208s-.2.3-.158.465l33.586 125.889a87.18 87.18 0 0 0 39.381-33.764l-71.565-92.52c-.138-.175-.392-.282-.664-.279z" transform="matrix(.024279 0 0 .024279 -1030.151335 172.969984)" fill="url(#A)" paint-order="stroke markers fill"/>
+ <path d="M2.113.12C.944.12-.004 1.067-.004 2.236c0 .398.112.787.323 1.124l1.765-2.282c.013-.016.045-.016.057 0l1.765 2.282c.211-.337.323-.727.323-1.124C4.23 1.067 3.282.12 2.113.12z" class="codeberg-fill" paint-order="markers fill stroke"/>
+</svg>
diff --git a/static/confetti-doodles.svg b/static/confetti-doodles.svg
new file mode 100644
index 0000000..d1c4965
--- /dev/null
+++ b/static/confetti-doodles.svg
@@ -0,0 +1 @@
+<svg xmlns='http://www.w3.org/2000/svg' width='1600' height='800' viewBox='0 0 1600 800'><rect fill='#F3E8DF' width='1600' height='800'/><path fill='#E8D1C5' d='M1102.5 734.8c2.5-1.2 24.8-8.6 25.6-7.5.5.7-3.9 23.8-4.6 24.5C1123.3 752.1 1107.5 739.5 1102.5 734.8zM1226.3 229.1c0-.1-4.9-9.4-7-14.2-.1-.3-.3-1.1-.4-1.6-.1-.4-.3-.7-.6-.9-.3-.2-.6-.1-.8.1l-13.1 12.3c0 0 0 0 0 0-.2.2-.3.5-.4.8 0 .3 0 .7.2 1 .1.1 1.4 2.5 2.1 3.6 2.4 3.7 6.5 12.1 6.5 12.2.2.3.4.5.7.6.3 0 .5-.1.7-.3 0 0 1.8-2.5 2.7-3.6 1.5-1.6 3-3.2 4.6-4.7 1.2-1.2 1.6-1.4 2.1-1.6.5-.3 1.1-.5 2.5-1.9C1226.5 230.4 1226.6 229.6 1226.3 229.1zM33 770.3C33 770.3 33 770.3 33 770.3c0-.7-.5-1.2-1.2-1.2-.1 0-.3 0-.4.1-1.6.2-14.3.1-22.2 0-.3 0-.6.1-.9.4-.2.2-.4.5-.4.9 0 .2 0 4.9.1 5.9l.4 13.6c0 .3.2.6.4.9.2.2.5.3.8.3 0 0 .1 0 .1 0 7.3-.7 14.7-.9 22-.6.3 0 .7-.1.9-.3.2-.2.4-.6.4-.9C32.9 783.3 32.9 776.2 33 770.3z'/><path fill='#E8D1C5' d='M171.1 383.4c1.3-2.5 14.3-22 15.6-21.6.8.3 11.5 21.2 11.5 22.1C198.1 384.2 177.9 384 171.1 383.4zM596.4 711.8c-.1-.1-6.7-8.2-9.7-12.5-.2-.3-.5-1-.7-1.5-.2-.4-.4-.7-.7-.8-.3-.1-.6 0-.8.3L574 712c0 0 0 0 0 0-.2.2-.2.5-.2.9 0 .3.2.7.4.9.1.1 1.8 2.2 2.8 3.1 3.1 3.1 8.8 10.5 8.9 10.6.2.3.5.4.8.4.3 0 .5-.2.6-.5 0 0 1.2-2.8 2-4.1 1.1-1.9 2.3-3.7 3.5-5.5.9-1.4 1.3-1.7 1.7-2 .5-.4 1-.7 2.1-2.4C596.9 713.1 596.8 712.3 596.4 711.8zM727.5 179.9C727.5 179.9 727.5 179.9 727.5 179.9c.6.2 1.3-.2 1.4-.8 0-.1 0-.2 0-.4.2-1.4 2.8-12.6 4.5-19.5.1-.3 0-.6-.2-.8-.2-.3-.5-.4-.8-.5-.2 0-4.7-1.1-5.7-1.3l-13.4-2.7c-.3-.1-.7 0-.9.2-.2.2-.4.4-.5.6 0 0 0 .1 0 .1-.8 6.5-2.2 13.1-3.9 19.4-.1.3 0 .6.2.9.2.3.5.4.8.5C714.8 176.9 721.7 178.5 727.5 179.9zM728.5 178.1c-.1-.1-.2-.2-.4-.2C728.3 177.9 728.4 178 728.5 178.1z'/><g fill-opacity='1' fill='#E8D1C5'><path d='M699.6 472.7c-1.5 0-2.8-.8-3.5-2.3-.8-1.9 0-4.2 1.9-5 3.7-1.6 6.8-4.7 8.4-8.5 1.6-3.8 1.7-8.1.2-11.9-.3-.9-.8-1.8-1.2-2.8-.8-1.7-1.8-3.7-2.3-5.9-.9-4.1-.2-8.6 2-12.8 1.7-3.1 4.1-6.1 7.6-9.1 1.6-1.4 4-1.2 5.3.4 1.4 1.6 1.2 4-.4 5.3-2.8 2.5-4.7 4.7-5.9 7-1.4 2.6-1.9 5.3-1.3 7.6.3 1.4 1 2.8 1.7 4.3.5 1.1 1 2.2 1.5 3.3 2.1 5.6 2 12-.3 17.6-2.3 5.5-6.8 10.1-12.3 12.5C700.6 472.6 700.1 472.7 699.6 472.7zM740.4 421.4c1.5-.2 3 .5 3.8 1.9 1.1 1.8.4 4.2-1.4 5.3-3.7 2.1-6.4 5.6-7.6 9.5-1.2 4-.8 8.4 1.1 12.1.4.9 1 1.7 1.6 2.7 1 1.7 2.2 3.5 3 5.7 1.4 4 1.2 8.7-.6 13.2-1.4 3.4-3.5 6.6-6.8 10.1-1.5 1.6-3.9 1.7-5.5.2-1.6-1.4-1.7-3.9-.2-5.4 2.6-2.8 4.3-5.3 5.3-7.7 1.1-2.8 1.3-5.6.5-7.9-.5-1.3-1.3-2.7-2.2-4.1-.6-1-1.3-2.1-1.9-3.2-2.8-5.4-3.4-11.9-1.7-17.8 1.8-5.9 5.8-11 11.2-14C739.4 421.6 739.9 421.4 740.4 421.4zM261.3 590.9c5.7 6.8 9 15.7 9.4 22.4.5 7.3-2.4 16.4-10.2 20.4-3 1.5-6.7 2.2-11.2 2.2-7.9-.1-12.9-2.9-15.4-8.4-2.1-4.7-2.3-11.4 1.8-15.9 3.2-3.5 7.8-4.1 11.2-1.6 1.2.9 1.5 2.7.6 3.9-.9 1.2-2.7 1.5-3.9.6-1.8-1.3-3.6.6-3.8.8-2.4 2.6-2.1 7-.8 9.9 1.5 3.4 4.7 5 10.4 5.1 3.6 0 6.4-.5 8.6-1.6 4.7-2.4 7.7-8.6 7.2-15-.5-7.3-5.3-18.2-13-23.9-4.2-3.1-8.5-4.1-12.9-3.1-3.1.7-6.2 2.4-9.7 5-6.6 5.1-11.7 11.8-14.2 19-2.7 7.7-2.1 15.8 1.9 23.9.7 1.4.1 3.1-1.3 3.7-1.4.7-3.1.1-3.7-1.3-4.6-9.4-5.4-19.2-2.2-28.2 2.9-8.2 8.6-15.9 16.1-21.6 4.1-3.1 8-5.1 11.8-6 6-1.4 12 0 17.5 4C257.6 586.9 259.6 588.8 261.3 590.9z'/><circle cx='1013.7' cy='153.9' r='7.1'/><circle cx='1024.3' cy='132.1' r='7.1'/><circle cx='1037.3' cy='148.9' r='7.1'/><path d='M1508.7 297.2c-4.8-5.4-9.7-10.8-14.8-16.2 5.6-5.6 11.1-11.5 15.6-18.2 1.2-1.7.7-4.1-1-5.2-1.7-1.2-4.1-.7-5.2 1-4.2 6.2-9.1 11.6-14.5 16.9-4.8-5-9.7-10-14.7-14.9-1.5-1.5-3.9-1.5-5.3 0-1.5 1.5-1.5 3.9 0 5.3 4.9 4.8 9.7 9.8 14.5 14.8-1.1 1.1-2.3 2.2-3.5 3.2-4.1 3.8-8.4 7.8-12.4 12-1.4 1.5-1.4 3.8 0 5.3 0 0 0 0 0 0 1.5 1.4 3.9 1.4 5.3-.1 3.9-4 8.1-7.9 12.1-11.7 1.2-1.1 2.3-2.2 3.5-3.3 4.9 5.3 9.8 10.6 14.6 15.9.1.1.1.1.2.2 1.4 1.4 3.7 1.5 5.2.2C1510 301.2 1510.1 298.8 1508.7 297.2zM327.6 248.6l-.4-2.6c-1.5-11.1-2.2-23.2-2.3-37 0-5.5 0-11.5.2-18.5 0-.7 0-1.5 0-2.3 0-5 0-11.2 3.9-13.5 2.2-1.3 5.1-1 8.5.9 5.7 3.1 13.2 8.7 17.5 14.9 5.5 7.8 7.3 16.9 5 25.7-3.2 12.3-15 31-30 32.1L327.6 248.6zM332.1 179.2c-.2 0-.3 0-.4.1-.1.1-.7.5-1.1 2.7-.3 1.9-.3 4.2-.3 6.3 0 .8 0 1.7 0 2.4-.2 6.9-.2 12.8-.2 18.3.1 12.5.7 23.5 2 33.7 11-2.7 20.4-18.1 23-27.8 1.9-7.2.4-14.8-4.2-21.3l0 0C347 188.1 340 183 335 180.3 333.6 179.5 332.6 179.2 332.1 179.2zM516.3 60.8c-.1 0-.2 0-.4-.1-2.4-.7-4-.9-6.7-.7-.7 0-1.3-.5-1.4-1.2 0-.7.5-1.3 1.2-1.4 3.1-.2 4.9 0 7.6.8.7.2 1.1.9.9 1.6C517.3 60.4 516.8 60.8 516.3 60.8zM506.1 70.5c-.5 0-1-.3-1.2-.8-.8-2.1-1.2-4.3-1.3-6.6 0-.7.5-1.3 1.2-1.3.7 0 1.3.5 1.3 1.2.1 2 .5 3.9 1.1 5.8.2.7-.1 1.4-.8 1.6C506.4 70.5 506.2 70.5 506.1 70.5zM494.1 64.4c-.4 0-.8-.2-1-.5-.4-.6-.3-1.4.2-1.8 1.8-1.4 3.7-2.6 5.8-3.6.6-.3 1.4 0 1.7.6.3.6 0 1.4-.6 1.7-1.9.9-3.7 2-5.3 3.3C494.7 64.3 494.4 64.4 494.1 64.4zM500.5 55.3c-.5 0-.9-.3-1.2-.7-.5-1-1.2-1.9-2.4-3.4-.3-.4-.7-.9-1.1-1.4-.4-.6-.3-1.4.2-1.8.6-.4 1.4-.3 1.8.2.4.5.8 1 1.1 1.4 1.3 1.6 2.1 2.6 2.7 3.9.3.6 0 1.4-.6 1.7C500.9 55.3 500.7 55.3 500.5 55.3zM506.7 55c-.3 0-.5-.1-.8-.2-.6-.4-.7-1.2-.3-1.8 1.2-1.7 2.3-3.4 3.3-5.2.3-.6 1.1-.9 1.7-.5.6.3.9 1.1.5 1.7-1 1.9-2.2 3.8-3.5 5.6C507.4 54.8 507.1 55 506.7 55zM1029.3 382.8c-.1 0-.2 0-.4-.1-2.4-.7-4-.9-6.7-.7-.7 0-1.3-.5-1.4-1.2 0-.7.5-1.3 1.2-1.4 3.1-.2 4.9 0 7.6.8.7.2 1.1.9.9 1.6C1030.3 382.4 1029.8 382.8 1029.3 382.8zM1019.1 392.5c-.5 0-1-.3-1.2-.8-.8-2.1-1.2-4.3-1.3-6.6 0-.7.5-1.3 1.2-1.3.7 0 1.3.5 1.3 1.2.1 2 .5 3.9 1.1 5.8.2.7-.1 1.4-.8 1.6C1019.4 392.5 1019.2 392.5 1019.1 392.5zM1007.1 386.4c-.4 0-.8-.2-1-.5-.4-.6-.3-1.4.2-1.8 1.8-1.4 3.7-2.6 5.8-3.6.6-.3 1.4 0 1.7.6.3.6 0 1.4-.6 1.7-1.9.9-3.7 2-5.3 3.3C1007.7 386.3 1007.4 386.4 1007.1 386.4zM1013.5 377.3c-.5 0-.9-.3-1.2-.7-.5-1-1.2-1.9-2.4-3.4-.3-.4-.7-.9-1.1-1.4-.4-.6-.3-1.4.2-1.8.6-.4 1.4-.3 1.8.2.4.5.8 1 1.1 1.4 1.3 1.6 2.1 2.6 2.7 3.9.3.6 0 1.4-.6 1.7C1013.9 377.3 1013.7 377.3 1013.5 377.3zM1019.7 377c-.3 0-.5-.1-.8-.2-.6-.4-.7-1.2-.3-1.8 1.2-1.7 2.3-3.4 3.3-5.2.3-.6 1.1-.9 1.7-.5.6.3.9 1.1.5 1.7-1 1.9-2.2 3.8-3.5 5.6C1020.4 376.8 1020.1 377 1019.7 377zM1329.7 573.4c-1.4 0-2.9-.2-4.5-.7-8.4-2.7-16.6-12.7-18.7-20-.4-1.4-.7-2.9-.9-4.4-8.1 3.3-15.5 10.6-15.4 21 0 1.5-1.2 2.7-2.7 2.8 0 0 0 0 0 0-1.5 0-2.7-1.2-2.7-2.7-.1-6.7 2.4-12.9 7-18 3.6-4 8.4-7.1 13.7-8.8.5-6.5 3.1-12.9 7.4-17.4 7-7.4 18.2-8.9 27.3-10.1l.7-.1c1.5-.2 2.9.9 3.1 2.3.2 1.5-.9 2.9-2.3 3.1l-.7.1c-8.6 1.2-18.4 2.5-24 8.4-3 3.2-5 7.7-5.7 12.4 7.9-1 17.7 1.3 24.3 5.7 4.3 2.9 7.1 7.8 7.2 12.7.2 4.3-1.7 8.3-5.2 11.1C1335.2 572.4 1332.6 573.4 1329.7 573.4zM1311 546.7c.1 1.5.4 3 .8 4.4 1.7 5.8 8.7 14.2 15.1 16.3 2.8.9 5.1.5 7.2-1.1 2.7-2.1 3.2-4.8 3.1-6.6-.1-3.2-2-6.4-4.8-8.3C1326.7 547.5 1317.7 545.6 1311 546.7z'/></g></svg>
diff --git a/static/main.css b/static/main.css
new file mode 100644
index 0000000..41381a9
--- /dev/null
+++ b/static/main.css
@@ -0,0 +1,139 @@
+:root {
+ --foreground-color: hsl(355, 26%, 21%);
+ --background-color: hsl(27, 45%, 91%);
+ --decorative-color: hsl(20, 43%, 84%);
+}
+body {
+ font-family: 'Alegreya', serif;
+ color: var(--foreground-color);
+ background-color: var(--background-color);
+ background-size: 20vw;
+ background-image: url('/static/confetti-doodles.svg');
+}
+
+a {
+ color: var(--foreground-color);
+ text-decoration-style: wavy;
+ text-decoration-color: var(--decorative-color);
+ text-underline-offset: 0.25rem;
+ transition: text-decoration-color 0.3s;
+ &:hover {
+ text-decoration-color: var(--foreground-color);
+ }
+}
+
+.container {
+ width: 500px;
+ margin: 5rem auto;
+}
+
+.header {
+ @media screen and (min-width: 786px) {
+ display: flex;
+ align-items: center;
+ gap: 3rem;
+ }
+
+ .header-image {
+ width: 80px;
+ height: 80px;
+ border-radius: 50%;
+ filter: sepia(50%);
+ transition: filter 0.3s
+ }
+
+ .header-image:hover {
+ filter: sepia(0)
+ }
+
+ .header-text {
+ display: flex;
+ flex-direction: column;
+ line-height: 2;
+
+ .header-title {
+ font-weight: 800;
+ font-size: 2rem;
+ }
+
+ .header-desc {
+ font-size: 1.25rem;
+ }
+ }
+}
+
+.badge {
+ padding: 0.35rem 0.5rem;
+ background-color: hsl(from var(--decorative-color) h s calc(l + 3));
+ border-radius: 1rem;
+ display: inline-flex;
+ align-items: center;
+ gap: 0.25rem;
+ line-height: 1;
+ text-decoration: none;
+ font-size: 95%;
+ margin: 0 0.25rem;
+ transition: background 0.3;
+ img {
+ display: inline-block;
+ width: 1rem;
+ height: 1rem;
+ }
+ span {
+ display: inline-block;
+ }
+ &:hover {
+ background-color: var(--decorative-color);
+ }
+}
+
+.prose-container {
+ font-size: 1.25rem;
+ line-height: 2;
+ width: 500px;
+ margin: 2rem auto;
+ &.small {
+ font-size: 1.15rem;
+ color: hsl(from var(--foreground-color) h calc(s - 10) calc(l + 30));
+ }
+}
+
+.linkbox {
+ display: flex;
+ align-items: center;
+ gap: 1rem;
+ padding: 0.5rem 1rem;
+
+ text-decoration: none;
+ border: 1px dashed hsl(from var(--foreground-color) h 15% 76%);
+
+ &:hover {
+ border-style: solid;
+ }
+
+ h4 {
+ font-weight: 800;
+ font-size: 1.1rem;
+ }
+
+ p {
+ font-size: 1rem;
+ }
+
+ img {
+ filter: sepia(50%);
+ width: 60px;
+ height: 60px;
+ }
+}
+
+.linkline {
+ --gap: 0.5rem;
+ display: flex;
+ flex-wrap: wrap;
+ gap: var(--gap);
+ li:not(:last-child):after {
+ margin-left: var(--gap);
+ content: "·"
+ }
+}
diff --git a/static/normalize.css b/static/normalize.css
new file mode 100644
index 0000000..e710298
--- /dev/null
+++ b/static/normalize.css
@@ -0,0 +1,351 @@
+/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */
+
+/* Document
+ ========================================================================== */
+
+/**
+ * 1. Correct the line height in all browsers.
+ * 2. Prevent adjustments of font size after orientation changes in iOS.
+ */
+
+html {
+ line-height: 1.15; /* 1 */
+ -webkit-text-size-adjust: 100%; /* 2 */
+}
+
+/* Sections
+ ========================================================================== */
+
+/**
+ * Remove the margin in all browsers.
+ */
+
+body {
+ margin: 0;
+}
+
+/**
+ * Render the `main` element consistently in IE.
+ */
+
+main {
+ display: block;
+}
+
+/**
+ * Correct the font size and margin on `h1` elements within `section` and
+ * `article` contexts in Chrome, Firefox, and Safari.
+ */
+
+h1 {
+ font-size: 2em;
+ margin: 0.67em 0;
+}
+
+/* Grouping content
+ ========================================================================== */
+
+/**
+ * 1. Add the correct box sizing in Firefox.
+ * 2. Show the overflow in Edge and IE.
+ */
+
+hr {
+ box-sizing: content-box; /* 1 */
+ height: 0; /* 1 */
+ overflow: visible; /* 2 */
+}
+
+/**
+ * 1. Correct the inheritance and scaling of font size in all browsers.
+ * 2. Correct the odd `em` font sizing in all browsers.
+ */
+
+pre {
+ font-family: monospace, monospace; /* 1 */
+ font-size: 1em; /* 2 */
+}
+
+/* Text-level semantics
+ ========================================================================== */
+
+/**
+ * Remove the gray background on active links in IE 10.
+ */
+
+a {
+ background-color: transparent;
+}
+
+/**
+ * 1. Remove the bottom border in Chrome 57-
+ * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
+ */
+
+abbr[title] {
+ border-bottom: none; /* 1 */
+ text-decoration: underline; /* 2 */
+ text-decoration: underline dotted; /* 2 */
+}
+
+/**
+ * Add the correct font weight in Chrome, Edge, and Safari.
+ */
+
+b,
+strong {
+ font-weight: bolder;
+}
+
+/**
+ * 1. Correct the inheritance and scaling of font size in all browsers.
+ * 2. Correct the odd `em` font sizing in all browsers.
+ */
+
+code,
+kbd,
+samp {
+ font-family: monospace, monospace; /* 1 */
+ font-size: 1em; /* 2 */
+}
+
+/**
+ * Add the correct font size in all browsers.
+ */
+
+small {
+ font-size: 80%;
+}
+
+/**
+ * Prevent `sub` and `sup` elements from affecting the line height in
+ * all browsers.
+ */
+
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+sup {
+ top: -0.5em;
+}
+
+/* Embedded content
+ ========================================================================== */
+
+/**
+ * Remove the border on images inside links in IE 10.
+ */
+
+img {
+ border-style: none;
+}
+
+/* Forms
+ ========================================================================== */
+
+/**
+ * 1. Change the font styles in all browsers.
+ * 2. Remove the margin in Firefox and Safari.
+ */
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ font-family: inherit; /* 1 */
+ font-size: 100%; /* 1 */
+ line-height: 1.15; /* 1 */
+ margin: 0; /* 2 */
+}
+
+/**
+ * Show the overflow in IE.
+ * 1. Show the overflow in Edge.
+ */
+
+button,
+input { /* 1 */
+ overflow: visible;
+}
+
+/**
+ * Remove the inheritance of text transform in Edge, Firefox, and IE.
+ * 1. Remove the inheritance of text transform in Firefox.
+ */
+
+button,
+select { /* 1 */
+ text-transform: none;
+}
+
+/**
+ * Correct the inability to style clickable types in iOS and Safari.
+ */
+
+button,
+[type="button"],
+[type="reset"],
+[type="submit"] {
+ -webkit-appearance: button;
+}
+
+/**
+ * Remove the inner border and padding in Firefox.
+ */
+
+button::-moz-focus-inner,
+[type="button"]::-moz-focus-inner,
+[type="reset"]::-moz-focus-inner,
+[type="submit"]::-moz-focus-inner {
+ border-style: none;
+ padding: 0;
+}
+
+/**
+ * Restore the focus styles unset by the previous rule.
+ */
+
+button:-moz-focusring,
+[type="button"]:-moz-focusring,
+[type="reset"]:-moz-focusring,
+[type="submit"]:-moz-focusring {
+ outline: 1px dotted ButtonText;
+}
+
+/**
+ * Correct the padding in Firefox.
+ */
+
+fieldset {
+ padding: 0.35em 0.75em 0.625em;
+}
+
+/**
+ * 1. Correct the text wrapping in Edge and IE.
+ * 2. Correct the color inheritance from `fieldset` elements in IE.
+ * 3. Remove the padding so developers are not caught out when they zero out
+ * `fieldset` elements in all browsers.
+ */
+
+legend {
+ box-sizing: border-box; /* 1 */
+ color: inherit; /* 2 */
+ display: table; /* 1 */
+ max-width: 100%; /* 1 */
+ padding: 0; /* 3 */
+ white-space: normal; /* 1 */
+}
+
+/**
+ * Add the correct vertical alignment in Chrome, Firefox, and Opera.
+ */
+
+progress {
+ vertical-align: baseline;
+}
+
+/**
+ * Remove the default vertical scrollbar in IE 10+.
+ */
+
+textarea {
+ overflow: auto;
+}
+
+/**
+ * 1. Add the correct box sizing in IE 10.
+ * 2. Remove the padding in IE 10.
+ */
+
+[type="checkbox"],
+[type="radio"] {
+ box-sizing: border-box; /* 1 */
+ padding: 0; /* 2 */
+}
+
+/**
+ * Correct the cursor style of increment and decrement buttons in Chrome.
+ */
+
+[type="number"]::-webkit-inner-spin-button,
+[type="number"]::-webkit-outer-spin-button {
+ height: auto;
+}
+
+/**
+ * 1. Correct the odd appearance in Chrome and Safari.
+ * 2. Correct the outline style in Safari.
+ */
+
+[type="search"] {
+ -webkit-appearance: textfield; /* 1 */
+ outline-offset: -2px; /* 2 */
+}
+
+/**
+ * Remove the inner padding in Chrome and Safari on macOS.
+ */
+
+[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+/**
+ * 1. Correct the inability to style clickable types in iOS and Safari.
+ * 2. Change font properties to `inherit` in Safari.
+ */
+
+::-webkit-file-upload-button {
+ -webkit-appearance: button; /* 1 */
+ font: inherit; /* 2 */
+}
+
+/* Interactive
+ ========================================================================== */
+
+/*
+ * Add the correct display in Edge, IE 10+, and Firefox.
+ */
+
+details {
+ display: block;
+}
+
+/*
+ * Add the correct display in all browsers.
+ */
+
+summary {
+ display: list-item;
+}
+
+/* Misc
+ ========================================================================== */
+
+/**
+ * Add the correct display in IE 10+.
+ */
+
+template {
+ display: none;
+}
+
+/**
+ * Add the correct display in IE 10.
+ */
+
+[hidden] {
+ display: none;
+}
+
+
diff --git a/static/reset.css b/static/reset.css
new file mode 100644
index 0000000..e29c0f5
--- /dev/null
+++ b/static/reset.css
@@ -0,0 +1,48 @@
+/* http://meyerweb.com/eric/tools/css/reset/
+ v2.0 | 20110126
+ License: none (public domain)
+*/
+
+html, body, div, span, applet, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, big, cite, code,
+del, dfn, em, img, ins, kbd, q, s, samp,
+small, strike, strong, sub, sup, tt, var,
+b, u, i, center,
+dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td,
+article, aside, canvas, details, embed,
+figure, figcaption, footer, header, hgroup,
+menu, nav, output, ruby, section, summary,
+time, mark, audio, video {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ font-size: 100%;
+ font: inherit;
+ vertical-align: baseline;
+}
+/* HTML5 display-role reset for older browsers */
+article, aside, details, figcaption, figure,
+footer, header, hgroup, menu, nav, section {
+ display: block;
+}
+body {
+ line-height: 1;
+}
+ol, ul {
+ list-style: none;
+}
+blockquote, q {
+ quotes: none;
+}
+blockquote:before, blockquote:after,
+q:before, q:after {
+ content: '';
+ content: none;
+}
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
diff --git a/static/weepinbell.png b/static/weepinbell.png
new file mode 100644
index 0000000..a07342f
--- /dev/null
+++ b/static/weepinbell.png
Binary files differ