summary refs log tree commit diff
diff options
context:
space:
mode:
authorAshelyn Rose <git@tempest.dev>2023-05-08 02:17:40 -0600
committerAshelyn Rose <git@tempest.dev>2023-05-08 02:17:40 -0600
commit880cfbeb74546056feab63ed6e92a10c0dbaf2c3 (patch)
tree33c7429bd5b1b968d74c74a4b7fbf0aa072111f7
parent885d95d889633e312567d891831d74d9e120e5b8 (diff)
New layout, uses nextjs
-rw-r--r--.gitignore4
-rw-r--r--.well-known/matrix/server3
-rw-r--r--about-system.html112
-rw-r--r--about.html62
-rw-r--r--app/Footer.tsx9
-rw-r--r--app/Header.tsx43
-rw-r--r--app/about/page.tsx12
-rw-r--r--app/layout.tsx23
-rw-r--r--app/not-found.tsx23
-rw-r--r--app/page.tsx47
-rw-r--r--images/aurora-1197753.jpgbin0 -> 3549509 bytes
-rw-r--r--index.html78
-rw-r--r--next-env.d.ts5
-rw-r--r--not_found.html30
-rw-r--r--package-lock.json1162
-rw-r--r--package.json23
-rw-r--r--pay-transparency.html112
-rw-r--r--posts/01_04_2023-advent-of-wasm.html123
-rw-r--r--posts/07_29_2022-on-communities-and-trust.html107
-rw-r--r--posts/08_01_2022-thoughts-on-neovim.html109
-rw-r--r--posts/index.html42
-rw-r--r--public/resources/signature.svg (renamed from resources/signature.svg)0
-rw-r--r--resources/style.css228
-rw-r--r--styles/index.module.css11
-rw-r--r--styles/layout.css181
-rw-r--r--styles/text.css40
-rw-r--r--tsconfig.json39
27 files changed, 1622 insertions, 1006 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..dc5bd12
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+node_modules/
+.next/
+.vscode/
+.DS_Store
diff --git a/.well-known/matrix/server b/.well-known/matrix/server
deleted file mode 100644
index 000c704..0000000
--- a/.well-known/matrix/server
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "m.server": "conduit.tempest.dev:443"
-}
diff --git a/about-system.html b/about-system.html
deleted file mode 100644
index 1fba4d3..0000000
--- a/about-system.html
+++ /dev/null
@@ -1,112 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <title>About Us</title>
-    <link rel="stylesheet" href="/resources/style.css"/>
-    <meta name="viewport" content="width=device-width, initial-scale=1">
-  </head>
-  <body>
-    <nav>
-      <a href="/">Home</a>
-      <a href="/about.html">About</a>
-      <a href="/posts/">Posts</a>
-    </nav>
-    <h1>
-      Who are you?
-      <aside>(bonus system edition)</aside>
-    </h1>
-
-    <p>
-      This is a supplemental page to our main <a target="_blank" href="/about">about</a>
-      page - specifically for us to post in plural spaces or to use to explain
-      to people we trust
-    </p>
-
-    <h3>Origins</h3>
-
-    <p>
-      We became aware of our plurality near the end of February 2023,
-      on the day we received news of a family member's death.  The part of us
-      now known as Dawn got overwhelmed, and withdrew from consciousness to
-      recover
-    </p>
-
-    <p>
-      The shock of abruptly losing her presence made the differences between
-      our other two memebers rather apparent.  One of those (now Rose) set
-      about making sure the body was cared for and that our work constraints
-      were satisfied for the day, and the other (now Echo) started to try and
-      make sense of what was going on
-    </p>
-
-    <p>
-      The members of our system are split along lines that make us inclined
-      to belive our system been around for a while before we became aware of it.
-      However, beyond a few months the most we can really do is guess, so we
-      will not describe that here
-    </p>
-
-    <h3>Introductions</h3>
-
-    <aside>
-      <strong>Note:</strong>
-      Because we share memory (and are usually co-conscious), we tend to present
-      as if we were one individual.  We do not commonly distinguish who is
-      primarily active or speaking, except with our partners and close friends,
-      or unless it becomes otherwise necessary
-    </aside>
-
-    <h4 style="color:#a4ffd4">Echo <aside>(it/?)</aside></h4>
-    <p>
-      The self-styled "librarian" of the system, Echo is the part of us that
-      has the best connection to memory of all of us, and enjoys getting lost
-      in categorizing and considering new information.  It seems to have ended
-      up with most of the inclination for tradition and faith as well
-    </p>
-
-    <p>
-      Echo likes reading, learning, sharing what it has learned, and cuddling
-      with those close to us.  It speaks excitedly and earnestly, and loves
-      making new friends
-    </p>
-
-
-    <h4 style="color:#ff6b79">Rose <aside>(they/them)</aside></h4>
-    <p>
-      As primary decision maker and the part who ended up with most of our skill
-      in coding, Rose tends to be fronting most of the time if we have work to
-      do.  Rose is efficient in their work, tending to focus on understanding
-      just enough for the topic at hand - culling information and distractions
-      that aren't necessary and quickly traversing ideas to get at what they
-      need
-    </p>
-
-    <p>
-      In conversation Rose will be direct and to the point, sometimes coming
-      across as rude.  But if they decide to focus their attention on you, then
-      their full personality comes out much more clearly.  They can be
-      sarcastic, witty, and caring to a fault 
-    </p>
-
-    <h4 style="color:#d8b8ff">Dawn <aside>(she/her)</aside></h4>
-    <p>
-      Our poet and performer, Dawn is the part of us who is most practiced at
-      managing our outside appearance and presentation.  She helps us navigate
-      social situations, carries out most of our IRL conversations, and is the
-      one with the most grasp of language and rhythm
-    </p>
-
-    <p>
-      Dawn enjoys singing, writing poetry, and storytelling.  She has the
-      strongest connection to our dreams and emotions, and enjoys coalescing
-      those feelings down to their purest expression.  Outwardly Dawn is
-      cheerful and pleasant, although when speaking on matters of importance
-      she speaks carefully, with a lot of emphasis on the selection of each word
-    </p>
-
-    <footer>
-      <a href="https://git.tempest.dev/ashe/tempest.dev">Site Source</a>
-      <a href="/pay-transparency.html">Pay Transparency</a>
-    </footer>
-  </body>
-</html>
diff --git a/about.html b/about.html
deleted file mode 100644
index 25ac669..0000000
--- a/about.html
+++ /dev/null
@@ -1,62 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <title>About</title>
-    <link rel="stylesheet" href="/resources/style.css"/>
-    <meta name="viewport" content="width=device-width, initial-scale=1">
-  </head>
-  <body>
-    <nav>
-      <a href="/">Home</a>
-      <a href="/about.html">About</a>
-      <a href="/posts/">Posts</a>
-    </nav>
-    <h1>
-      Who are you?
-    </h1>
-
-    <h3>Name</h3>
-
-    <p>Ashelyn, but I usually go by ashe, dawn, or tempest</p>
-
-    <h3>Interests</h3>
-
-    <p>
-      Coding, VR, 3D modeling, cryptography (encryption + privacy, not coin),
-      photography, hiking, reading, writing, and locksport
-    </p>
-
-    <h3>Games</h3>
-
-    <p>
-      Currently a lot of VRChat, other favorites include Hades, Celeste,
-      and Titanfall 2
-    </p>
-
-    <h3>Occupation</h3>
-
-    <p>
-      Web dev, primarily Javascript but also featuring Python, Rust, .NET,
-      Java, and an obscene amount of bash
-    </p>
-
-    <h3>Family</h3>
-
-    <p>
-      I am married to my lovely wife Emily, and we have two kids together. I also
-      have two other amazing partners.
-    </p>
-
-    <h3>Find me Elsewhere</h3>
-
-    <ul>
-      <li><a target="_blank" rel="me" href="https://social.treehouse.systems/@ashe">Mastodon</a></li>
-      <li><a target="_blank" href="https://git.tempest.dev/">Git</a></li>
-      <li><a target="_blank" href="https://web.libera.chat/">IRC</a> (my common nicks are tempest or dawn)</li>
-    </ul>
-    <footer>
-      <a href="https://git.tempest.dev/ashe/tempest.dev">Site Source</a>
-      <a href="/pay-transparency.html">Pay Transparency</a>
-    </footer>
-  </body>
-</html>
diff --git a/app/Footer.tsx b/app/Footer.tsx
new file mode 100644
index 0000000..49089b4
--- /dev/null
+++ b/app/Footer.tsx
@@ -0,0 +1,9 @@
+export default function Footer() {
+  return (
+    <footer>
+      <span>Website by Ashelyn Rose</span>
+      <a href="https://git.tempest.dev/ashe/tempest.dev">Site Source</a>
+      <a href="/pay-transparency">Pay Transparency</a>
+    </footer>
+  )
+}
diff --git a/app/Header.tsx b/app/Header.tsx
new file mode 100644
index 0000000..b5749ba
--- /dev/null
+++ b/app/Header.tsx
@@ -0,0 +1,43 @@
+'use client'
+
+import React from 'react'
+import Image from 'next/image'
+
+import { usePathname } from 'next/navigation'
+
+import header from '~/images/aurora-1197753.jpg'
+
+export default function Title() {
+  const pathname = usePathname()
+
+  const isHomepage = pathname === '/'
+
+  return (
+    <header className={isHomepage ? 'homepage' : undefined}>
+      {isHomepage
+        ? <h1 className="siteTitle">tempest.dev</h1>
+        : <a href="/" className="siteTitle">tempest.dev</a>
+      }
+      <nav>
+        <a href="/system">system</a>
+        <a href="/posts">posts</a>
+        <a href="/contact">contact</a>
+      </nav>
+      <div className="headerBackground">
+        <Image
+          src={header}
+          alt=""
+          role="presentation"
+          fill={true}
+          sizes={`
+            (max-width: 2560) 100vw,
+            (max-width: 1920) 100vw,
+            (max-width: 1280) 100vw,
+            (max-width: 800) 100vw,
+            (max-width: 600) 100vw,
+          `}
+        />
+      </div>
+    </header>
+  )
+}
diff --git a/app/about/page.tsx b/app/about/page.tsx
new file mode 100644
index 0000000..dd04ccc
--- /dev/null
+++ b/app/about/page.tsx
@@ -0,0 +1,12 @@
+export default function About() {
+  return (
+    <>
+      <h1 className="pageTitle">
+        About
+      </h1>
+      <main className="mainColumn">
+        <p>Maybe we say some things about ourselves?</p>
+      </main>
+    </>
+  )
+}
diff --git a/app/layout.tsx b/app/layout.tsx
new file mode 100644
index 0000000..3d25c44
--- /dev/null
+++ b/app/layout.tsx
@@ -0,0 +1,23 @@
+import React, { ReactNode } from 'react';
+
+import 'victormono'
+import '~/styles/layout.css'
+import '~/styles/text.css'
+
+import Header from './Header'
+import Footer from './Footer'
+
+export default function SiteLayout({ children }: { children: ReactNode }) {
+  return (
+    <html>
+      <head>
+        <title>tempest.dev</title>
+      </head>
+      <body>
+        <Header />
+        {children}
+        <Footer />
+      </body>
+    </html>
+  )
+}
diff --git a/app/not-found.tsx b/app/not-found.tsx
new file mode 100644
index 0000000..44753b0
--- /dev/null
+++ b/app/not-found.tsx
@@ -0,0 +1,23 @@
+export default function NotFound() {
+  return (
+    <>
+      <h1 className="pageTitle">Not Found (404)</h1>
+      <main className="mainColumn">
+        <aside className="infobar">
+          <strong>Error:&nbsp;</strong>
+          Unable to find the requested resource
+        </aside>
+
+        <p>
+          Feel free to start again from the <a href="/">home page</a>, or
+          check our <a href="/posts">list of posts</a>
+        </p>
+
+        <p>
+          If you feel like something should have been here, and want to shout
+          at me about it, please <a href="/contact">contact Rose</a>
+        </p>
+      </main>
+    </>
+  )
+}
diff --git a/app/page.tsx b/app/page.tsx
new file mode 100644
index 0000000..49d887c
--- /dev/null
+++ b/app/page.tsx
@@ -0,0 +1,47 @@
+import React from 'react';
+
+import styles from '~/styles/index.module.css'
+
+export default function Index() {
+  return (
+    <main className="mainColumn">
+      <p>
+        Hi, we're tempest!  And we also go by ashe.  We're a median plural
+        system of three members, but most of the time you'll probably see us
+        operating as one
+      </p>
+
+      <p>We like coding, VR, and making CG art</p>
+
+      <h2>At a glance</h2>
+      <div className={styles.glance}>
+        <span className={styles.label}>Names:</span>
+        <span>ashe or ashelyn</span>
+
+        <span className={styles.label}>Pronouns:</span>
+        <span>they/them</span>
+
+        <span className={styles.label}>Cohort:</span>
+        <span>millenial</span>
+
+        <span className={styles.label}>Poly:</span>
+        <span>yes</span>
+
+        <span className={styles.label}>Partners:</span>
+        <span>three</span>
+
+        <span className={styles.label}>Children:</span>
+        <span>two</span>
+
+        <span className={styles.label}>Capitalize name:</span>
+        <span>not unless we're at work</span>
+      </div>
+
+      <p>
+        <em>Note:</em> This is the information for our system in aggregate,
+        for individual info see <a href="/system">system</a>
+      </p>
+
+    </main>
+  )
+}
diff --git a/images/aurora-1197753.jpg b/images/aurora-1197753.jpg
new file mode 100644
index 0000000..a8228b8
--- /dev/null
+++ b/images/aurora-1197753.jpg
Binary files differdiff --git a/index.html b/index.html
deleted file mode 100644
index fcce6d3..0000000
--- a/index.html
+++ /dev/null
@@ -1,78 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <title>tempest.dev</title>
-    <link rel="stylesheet" href="/resources/style.css"/>
-    <meta name="viewport" content="width=device-width, initial-scale=1">
-  </head>
-  <body>
-    <nav>
-      <a href="/">Home</a>
-      <a href="/about.html">About</a>
-      <a href="/posts/">Posts</a>
-    </nav>
-    <h1>
-      hi, i'm ashe
-      <aside>[she/they]</aside>
-    </h1>
-
-    <p>
-      I am a professional web developer, usually making use of tools like
-      React, Webpack, Typescript, etc - the whole mess of "modern" web dev
-      stuff.
-    </p>
-
-    <p>
-      This site is something different, a bit of an experiment in minimalism
-      for me.  A chance to return to my roots of carefully crafting a website
-      by hand.
-    </p>
-
-    <p>
-      As such, here are my rules for the site:
-    </p>
-
-    <ul>
-      <li>
-        No pre- or post-processing, transpilation, or other code-generation
-      </li>
-      <li>
-        To the best of my ability, the source will be clean and understandable
-      </li>
-      <li>
-        When used, javascript will be minimal, and intentional
-      </li>
-      <li>
-        The site will be usable in older or esoteric browsers (such as Lynx)
-      </li>
-      <li>
-        This site will be privacy-preserving, with no client-side analytics and
-        all resources hosted directly alongside the site itself.  (Note that
-        this site is hosted on Neocities, so your request data may still be used
-        as described in <a target="_blank" href="https://neocities.org/privacy">
-          their Privacy Policy</a>)
-      </li>
-    </ul>
-
-    <p>
-      I'm not ruling out JS or anything (making a delightful interactive
-      experience is still one of my favorite things to do), but I'm taking the
-      opportunity to step away from the tools I primarily use at work, and
-      practice my other skills.
-    </p>
-
-    <p style="
-        display: flex;
-        align-items: center;
-        justify-content: flex-end;
-        padding-right: min(80px, 20%);
-    ">
-      <span style="font-size: 24px">~</span>
-      <img alt="Ashe" height="80px" src="/resources/signature.svg" />
-    </p>
-    <footer>
-      <a href="https://git.tempest.dev/ashe/tempest.dev">Site Source</a>
-      <a href="/pay-transparency.html">Pay Transparency</a>
-    </footer>
-  </body>
-</html>
diff --git a/next-env.d.ts b/next-env.d.ts
new file mode 100644
index 0000000..4f11a03
--- /dev/null
+++ b/next-env.d.ts
@@ -0,0 +1,5 @@
+/// <reference types="next" />
+/// <reference types="next/image-types/global" />
+
+// NOTE: This file should not be edited
+// see https://nextjs.org/docs/basic-features/typescript for more information.
diff --git a/not_found.html b/not_found.html
deleted file mode 100644
index d14ec56..0000000
--- a/not_found.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <title>Not Found</title>
-    <link rel="stylesheet" href="/resources/style.css"/>
-    <meta name="viewport" content="width=device-width, initial-scale=1">
-  </head>
-  <body>
-    <nav>
-      <a href="/">Home</a>
-      <a href="/about.html">About</a>
-    </nav>
-    <h1>
-      Not Found
-    </h1>
-
-    <p>
-      Sorry friend, you followed a link to something that doesn't exist.
-    </p>
-
-    <p>
-      Feel free to start back over at my
-      <a href="/">Home page</a>.
-    </p>
-    <footer>
-      <a href="https://git.tempest.dev/ashe/tempest.dev">Site Source</a>
-      <a href="/pay-transparency.html">Pay Transparency</a>
-    </footer>
-  </body>
-</html>
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..1223690
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,1162 @@
+{
+  "name": "tempest.dev",
+  "version": "1.0.0",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "tempest.dev",
+      "version": "1.0.0",
+      "license": "ISC",
+      "dependencies": {
+        "next": "^13.4.1",
+        "react": "^18.2.0",
+        "react-dom": "^18.2.0",
+        "sharp": "^0.32.1",
+        "victormono": "^1.5.5"
+      },
+      "devDependencies": {
+        "@types/node": "20.1.0",
+        "@types/react": "^18.2.6",
+        "typescript": "5.0.4"
+      }
+    },
+    "node_modules/@babel/parser": {
+      "version": "7.21.8",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.8.tgz",
+      "integrity": "sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==",
+      "bin": {
+        "parser": "bin/babel-parser.js"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@next/env": {
+      "version": "13.4.1",
+      "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.1.tgz",
+      "integrity": "sha512-eD6WCBMFjLFooLM19SIhSkWBHtaFrZFfg2Cxnyl3vS3DAdFRfnx5TY2RxlkuKXdIRCC0ySbtK9JXXt8qLCqzZg=="
+    },
+    "node_modules/@next/swc-darwin-arm64": {
+      "version": "13.4.1",
+      "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.1.tgz",
+      "integrity": "sha512-eF8ARHtYfnoYtDa6xFHriUKA/Mfj/cCbmKb3NofeKhMccs65G6/loZ15a6wYCCx4rPAd6x4t1WmVYtri7EdeBg==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-darwin-x64": {
+      "version": "13.4.1",
+      "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.1.tgz",
+      "integrity": "sha512-7cmDgF9tGWTgn5Gw+vP17miJbH4wcraMHDCOHTYWkO/VeKT73dUWG23TNRLfgtCNSPgH4V5B4uLHoZTanx9bAw==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-linux-arm64-gnu": {
+      "version": "13.4.1",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.1.tgz",
+      "integrity": "sha512-qwJqmCri2ie8aTtE5gjTSr8S6O8B67KCYgVZhv9gKH44yvc/zXbAY8u23QGULsYOyh1islWE5sWfQNLOj9iryg==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-linux-arm64-musl": {
+      "version": "13.4.1",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.1.tgz",
+      "integrity": "sha512-qcC54tWNGDv/VVIFkazxhqH1Bnagjfs4enzELVRlUOoJPD2BGJTPI7z08pQPbbgxLtRiu8gl2mXvpB8WlOkMeA==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-linux-x64-gnu": {
+      "version": "13.4.1",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.1.tgz",
+      "integrity": "sha512-9TeWFlpLsBosZ+tsm/rWBaMwt5It9tPH8m3nawZqFUUrZyGRfGcI67js774vtx0k3rL9qbyY6+3pw9BCVpaYUA==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-linux-x64-musl": {
+      "version": "13.4.1",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.1.tgz",
+      "integrity": "sha512-sNDGaWmSqTS4QRUzw61wl4mVPeSqNIr1OOjLlQTRuyInxMxtqImRqdvzDvFTlDfdeUMU/DZhWGYoHrXLlZXe6A==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-win32-arm64-msvc": {
+      "version": "13.4.1",
+      "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.1.tgz",
+      "integrity": "sha512-+CXZC7u1iXdLRudecoUYbhbsXpglYv8KFYsFxKBPn7kg+bk7eJo738wAA4jXIl8grTF2mPdmO93JOQym+BlYGA==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-win32-ia32-msvc": {
+      "version": "13.4.1",
+      "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.1.tgz",
+      "integrity": "sha512-vIoXVVc7UYO68VwVMDKwJC2+HqAZQtCYiVlApyKEeIPIQpz2gpufzGxk1z3/gwrJt/kJ5CDZjlhYDCzd3hdz+g==",
+      "cpu": [
+        "ia32"
+      ],
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-win32-x64-msvc": {
+      "version": "13.4.1",
+      "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.1.tgz",
+      "integrity": "sha512-n8V5ImLQZibKTu10UUdI3nIeTLkliEXe628qxqW9v8My3BAH2a7H0SaCqkV2OgqFnn8sG1wxKYw9/SNJ632kSA==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@swc/helpers": {
+      "version": "0.5.1",
+      "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz",
+      "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==",
+      "dependencies": {
+        "tslib": "^2.4.0"
+      }
+    },
+    "node_modules/@types/node": {
+      "version": "20.1.0",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.0.tgz",
+      "integrity": "sha512-O+z53uwx64xY7D6roOi4+jApDGFg0qn6WHcxe5QeqjMaTezBO/mxdfFXIVAVVyNWKx84OmPB3L8kbVYOTeN34A==",
+      "dev": true
+    },
+    "node_modules/@types/prop-types": {
+      "version": "15.7.5",
+      "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz",
+      "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==",
+      "dev": true
+    },
+    "node_modules/@types/react": {
+      "version": "18.2.6",
+      "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.6.tgz",
+      "integrity": "sha512-wRZClXn//zxCFW+ye/D2qY65UsYP1Fpex2YXorHc8awoNamkMZSvBxwxdYVInsHOZZd2Ppq8isnSzJL5Mpf8OA==",
+      "dev": true,
+      "dependencies": {
+        "@types/prop-types": "*",
+        "@types/scheduler": "*",
+        "csstype": "^3.0.2"
+      }
+    },
+    "node_modules/@types/scheduler": {
+      "version": "0.16.3",
+      "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz",
+      "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==",
+      "dev": true
+    },
+    "node_modules/@vue/compiler-sfc": {
+      "version": "2.7.14",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.14.tgz",
+      "integrity": "sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==",
+      "dependencies": {
+        "@babel/parser": "^7.18.4",
+        "postcss": "^8.4.14",
+        "source-map": "^0.6.1"
+      }
+    },
+    "node_modules/animejs": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/animejs/-/animejs-3.2.1.tgz",
+      "integrity": "sha512-sWno3ugFryK5nhiDm/2BKeFCpZv7vzerWUcUPyAZLDhMek3+S/p418ldZJbJXo5ZUOpfm2kP2XRO4NJcULMy9A=="
+    },
+    "node_modules/async-validator": {
+      "version": "1.8.5",
+      "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-1.8.5.tgz",
+      "integrity": "sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA==",
+      "dependencies": {
+        "babel-runtime": "6.x"
+      }
+    },
+    "node_modules/babel-helper-vue-jsx-merge-props": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz",
+      "integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg=="
+    },
+    "node_modules/babel-runtime": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+      "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==",
+      "dependencies": {
+        "core-js": "^2.4.0",
+        "regenerator-runtime": "^0.11.0"
+      }
+    },
+    "node_modules/base64-js": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
+    },
+    "node_modules/bezier-easing": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/bezier-easing/-/bezier-easing-2.1.0.tgz",
+      "integrity": "sha512-gbIqZ/eslnUFC1tjEvtz0sgx+xTK20wDnYMIA27VA04R7w6xxXQPZDbibjA9DTWZRA2CXtwHykkVzlCaAJAZig=="
+    },
+    "node_modules/bl": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+      "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+      "dependencies": {
+        "buffer": "^5.5.0",
+        "inherits": "^2.0.4",
+        "readable-stream": "^3.4.0"
+      }
+    },
+    "node_modules/buffer": {
+      "version": "5.7.1",
+      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+      "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "dependencies": {
+        "base64-js": "^1.3.1",
+        "ieee754": "^1.1.13"
+      }
+    },
+    "node_modules/busboy": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
+      "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
+      "dependencies": {
+        "streamsearch": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=10.16.0"
+      }
+    },
+    "node_modules/caniuse-lite": {
+      "version": "1.0.30001486",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001486.tgz",
+      "integrity": "sha512-uv7/gXuHi10Whlj0pp5q/tsK/32J2QSqVRKQhs2j8VsDCjgyruAh/eEXHF822VqO9yT6iZKw3nRwZRSPBE9OQg==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ]
+    },
+    "node_modules/chownr": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+      "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
+    },
+    "node_modules/client-only": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
+      "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="
+    },
+    "node_modules/codemirror": {
+      "version": "5.65.13",
+      "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.13.tgz",
+      "integrity": "sha512-SVWEzKXmbHmTQQWaz03Shrh4nybG0wXx2MEu3FO4ezbPW8IbnZEd5iGHGEffSUaitKYa3i+pHpBsSvw8sPHtzg=="
+    },
+    "node_modules/color": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
+      "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
+      "dependencies": {
+        "color-convert": "^2.0.1",
+        "color-string": "^1.9.0"
+      },
+      "engines": {
+        "node": ">=12.5.0"
+      }
+    },
+    "node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+    },
+    "node_modules/color-string": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
+      "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
+      "dependencies": {
+        "color-name": "^1.0.0",
+        "simple-swizzle": "^0.2.2"
+      }
+    },
+    "node_modules/core-js": {
+      "version": "2.6.12",
+      "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
+      "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
+      "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
+      "hasInstallScript": true
+    },
+    "node_modules/csstype": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz",
+      "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ=="
+    },
+    "node_modules/decompress-response": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+      "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+      "dependencies": {
+        "mimic-response": "^3.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/deep-extend": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+      "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/deepmerge": {
+      "version": "1.5.2",
+      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz",
+      "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/detect-libc": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz",
+      "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/diff-match-patch": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz",
+      "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw=="
+    },
+    "node_modules/dom-confetti": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/dom-confetti/-/dom-confetti-0.1.2.tgz",
+      "integrity": "sha512-6Zo1pJEbEW1/GPgmk7uGWnPsoZ1E1vF7pmrPARnN3tp8L3ReMr/SIyLl6E8mGbu4DermzDWXfa+be77HehH2MA=="
+    },
+    "node_modules/element-ui": {
+      "version": "2.15.13",
+      "resolved": "https://registry.npmjs.org/element-ui/-/element-ui-2.15.13.tgz",
+      "integrity": "sha512-LJoatEYX6WV74FqXBss8Xfho9fh9rjDSzrDrTyREdGb1h1R3uRvmLh5jqp2JU137aj4/BgqA3K06RQpQBX33Bg==",
+      "dependencies": {
+        "async-validator": "~1.8.1",
+        "babel-helper-vue-jsx-merge-props": "^2.0.0",
+        "deepmerge": "^1.2.0",
+        "normalize-wheel": "^1.0.1",
+        "resize-observer-polyfill": "^1.5.0",
+        "throttle-debounce": "^1.0.1"
+      },
+      "peerDependencies": {
+        "vue": "^2.5.17"
+      }
+    },
+    "node_modules/end-of-stream": {
+      "version": "1.4.4",
+      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+      "dependencies": {
+        "once": "^1.4.0"
+      }
+    },
+    "node_modules/expand-template": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
+      "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/fs-constants": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+      "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
+    },
+    "node_modules/github-from-package": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
+      "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="
+    },
+    "node_modules/granim": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/granim/-/granim-2.0.0.tgz",
+      "integrity": "sha512-aqa79K49ndjoUBtpYzlO8sKcuVQED+5axvX0SveqTLDR+Fa2G42AGntuQ36ysCFOWGVkWCLfHowFwk+D/9rGDg=="
+    },
+    "node_modules/ieee754": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
+    },
+    "node_modules/inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+    },
+    "node_modules/ini": {
+      "version": "1.3.8",
+      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+      "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
+    },
+    "node_modules/is-arrayish": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
+      "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
+    },
+    "node_modules/js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+    },
+    "node_modules/loose-envify": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+      "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+      "dependencies": {
+        "js-tokens": "^3.0.0 || ^4.0.0"
+      },
+      "bin": {
+        "loose-envify": "cli.js"
+      }
+    },
+    "node_modules/lru-cache": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/mimic-response": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+      "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/minimist": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/mkdirp-classic": {
+      "version": "0.5.3",
+      "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
+      "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="
+    },
+    "node_modules/nanoid": {
+      "version": "3.3.6",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
+      "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "bin": {
+        "nanoid": "bin/nanoid.cjs"
+      },
+      "engines": {
+        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+      }
+    },
+    "node_modules/napi-build-utils": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz",
+      "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg=="
+    },
+    "node_modules/next": {
+      "version": "13.4.1",
+      "resolved": "https://registry.npmjs.org/next/-/next-13.4.1.tgz",
+      "integrity": "sha512-JBw2kAIyhKDpjhEWvNVoFeIzNp9xNxg8wrthDOtMctfn3EpqGCmW0FSviNyGgOSOSn6zDaX48pmvbdf6X2W9xA==",
+      "dependencies": {
+        "@next/env": "13.4.1",
+        "@swc/helpers": "0.5.1",
+        "busboy": "1.6.0",
+        "caniuse-lite": "^1.0.30001406",
+        "postcss": "8.4.14",
+        "styled-jsx": "5.1.1",
+        "zod": "3.21.4"
+      },
+      "bin": {
+        "next": "dist/bin/next"
+      },
+      "engines": {
+        "node": ">=16.8.0"
+      },
+      "optionalDependencies": {
+        "@next/swc-darwin-arm64": "13.4.1",
+        "@next/swc-darwin-x64": "13.4.1",
+        "@next/swc-linux-arm64-gnu": "13.4.1",
+        "@next/swc-linux-arm64-musl": "13.4.1",
+        "@next/swc-linux-x64-gnu": "13.4.1",
+        "@next/swc-linux-x64-musl": "13.4.1",
+        "@next/swc-win32-arm64-msvc": "13.4.1",
+        "@next/swc-win32-ia32-msvc": "13.4.1",
+        "@next/swc-win32-x64-msvc": "13.4.1"
+      },
+      "peerDependencies": {
+        "@opentelemetry/api": "^1.1.0",
+        "fibers": ">= 3.1.0",
+        "node-sass": "^6.0.0 || ^7.0.0",
+        "react": "^18.2.0",
+        "react-dom": "^18.2.0",
+        "sass": "^1.3.0"
+      },
+      "peerDependenciesMeta": {
+        "@opentelemetry/api": {
+          "optional": true
+        },
+        "fibers": {
+          "optional": true
+        },
+        "node-sass": {
+          "optional": true
+        },
+        "sass": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/node-abi": {
+      "version": "3.40.0",
+      "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.40.0.tgz",
+      "integrity": "sha512-zNy02qivjjRosswoYmPi8hIKJRr8MpQyeKT6qlcq/OnOgA3Rhoae+IYOqsM9V5+JnHWmxKnWOT2GxvtqdtOCXA==",
+      "dependencies": {
+        "semver": "^7.3.5"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/node-addon-api": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz",
+      "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA=="
+    },
+    "node_modules/normalize-wheel": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz",
+      "integrity": "sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA=="
+    },
+    "node_modules/once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+      "dependencies": {
+        "wrappy": "1"
+      }
+    },
+    "node_modules/picocolors": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+    },
+    "node_modules/postcss": {
+      "version": "8.4.14",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz",
+      "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/postcss"
+        }
+      ],
+      "dependencies": {
+        "nanoid": "^3.3.4",
+        "picocolors": "^1.0.0",
+        "source-map-js": "^1.0.2"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      }
+    },
+    "node_modules/prebuild-install": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz",
+      "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==",
+      "dependencies": {
+        "detect-libc": "^2.0.0",
+        "expand-template": "^2.0.3",
+        "github-from-package": "0.0.0",
+        "minimist": "^1.2.3",
+        "mkdirp-classic": "^0.5.3",
+        "napi-build-utils": "^1.0.1",
+        "node-abi": "^3.3.0",
+        "pump": "^3.0.0",
+        "rc": "^1.2.7",
+        "simple-get": "^4.0.0",
+        "tar-fs": "^2.0.0",
+        "tunnel-agent": "^0.6.0"
+      },
+      "bin": {
+        "prebuild-install": "bin.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/pump": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+      "dependencies": {
+        "end-of-stream": "^1.1.0",
+        "once": "^1.3.1"
+      }
+    },
+    "node_modules/rc": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+      "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+      "dependencies": {
+        "deep-extend": "^0.6.0",
+        "ini": "~1.3.0",
+        "minimist": "^1.2.0",
+        "strip-json-comments": "~2.0.1"
+      },
+      "bin": {
+        "rc": "cli.js"
+      }
+    },
+    "node_modules/react": {
+      "version": "18.2.0",
+      "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
+      "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
+      "dependencies": {
+        "loose-envify": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/react-dom": {
+      "version": "18.2.0",
+      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
+      "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
+      "dependencies": {
+        "loose-envify": "^1.1.0",
+        "scheduler": "^0.23.0"
+      },
+      "peerDependencies": {
+        "react": "^18.2.0"
+      }
+    },
+    "node_modules/readable-stream": {
+      "version": "3.6.2",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+      "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+      "dependencies": {
+        "inherits": "^2.0.3",
+        "string_decoder": "^1.1.1",
+        "util-deprecate": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/regenerator-runtime": {
+      "version": "0.11.1",
+      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+      "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
+    },
+    "node_modules/resize-observer-polyfill": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
+      "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
+    },
+    "node_modules/safe-buffer": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
+    },
+    "node_modules/scheduler": {
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
+      "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
+      "dependencies": {
+        "loose-envify": "^1.1.0"
+      }
+    },
+    "node_modules/semver": {
+      "version": "7.5.0",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz",
+      "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==",
+      "dependencies": {
+        "lru-cache": "^6.0.0"
+      },
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/sharp": {
+      "version": "0.32.1",
+      "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.1.tgz",
+      "integrity": "sha512-kQTFtj7ldpUqSe8kDxoGLZc1rnMFU0AO2pqbX6pLy3b7Oj8ivJIdoKNwxHVQG2HN6XpHPJqCSM2nsma2gOXvOg==",
+      "hasInstallScript": true,
+      "dependencies": {
+        "color": "^4.2.3",
+        "detect-libc": "^2.0.1",
+        "node-addon-api": "^6.1.0",
+        "prebuild-install": "^7.1.1",
+        "semver": "^7.5.0",
+        "simple-get": "^4.0.1",
+        "tar-fs": "^2.1.1",
+        "tunnel-agent": "^0.6.0"
+      },
+      "engines": {
+        "node": ">=14.15.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/simple-concat": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
+      "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
+    },
+    "node_modules/simple-get": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
+      "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "dependencies": {
+        "decompress-response": "^6.0.0",
+        "once": "^1.3.1",
+        "simple-concat": "^1.0.0"
+      }
+    },
+    "node_modules/simple-swizzle": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+      "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
+      "dependencies": {
+        "is-arrayish": "^0.3.1"
+      }
+    },
+    "node_modules/source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/source-map-js": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+      "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/streamsearch": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
+      "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
+    "node_modules/string_decoder": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+      "dependencies": {
+        "safe-buffer": "~5.2.0"
+      }
+    },
+    "node_modules/strip-json-comments": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+      "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/styled-jsx": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz",
+      "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==",
+      "dependencies": {
+        "client-only": "0.0.1"
+      },
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "peerDependencies": {
+        "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0"
+      },
+      "peerDependenciesMeta": {
+        "@babel/core": {
+          "optional": true
+        },
+        "babel-plugin-macros": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/tar-fs": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz",
+      "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==",
+      "dependencies": {
+        "chownr": "^1.1.1",
+        "mkdirp-classic": "^0.5.2",
+        "pump": "^3.0.0",
+        "tar-stream": "^2.1.4"
+      }
+    },
+    "node_modules/tar-stream": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
+      "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
+      "dependencies": {
+        "bl": "^4.0.3",
+        "end-of-stream": "^1.4.1",
+        "fs-constants": "^1.0.0",
+        "inherits": "^2.0.3",
+        "readable-stream": "^3.1.1"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/throttle-debounce": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-1.1.0.tgz",
+      "integrity": "sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg==",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/tslib": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+      "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg=="
+    },
+    "node_modules/tunnel-agent": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+      "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+      "dependencies": {
+        "safe-buffer": "^5.0.1"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/typed.js": {
+      "version": "2.0.16",
+      "resolved": "https://registry.npmjs.org/typed.js/-/typed.js-2.0.16.tgz",
+      "integrity": "sha512-IBB52GlJiTUOnomwdVVf7lWgC6gScn8md+26zTHj5oJWA+4pSuclHE76rbGI2hnyO+NT+QXdIUHbfjAY5nEtcw=="
+    },
+    "node_modules/typescript": {
+      "version": "5.0.4",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz",
+      "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==",
+      "dev": true,
+      "bin": {
+        "tsc": "bin/tsc",
+        "tsserver": "bin/tsserver"
+      },
+      "engines": {
+        "node": ">=12.20"
+      }
+    },
+    "node_modules/util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+    },
+    "node_modules/victormono": {
+      "version": "1.5.5",
+      "resolved": "https://registry.npmjs.org/victormono/-/victormono-1.5.5.tgz",
+      "integrity": "sha512-MY3ut0Oe38svbZyc7ewUgdlFKRdXKxzY7/To3ltGbfY6iCIu71bNwuLKlizYS9gnMPRVvFQb8k33OwWq0OzeaA==",
+      "dependencies": {
+        "animejs": "^3.2.1",
+        "core-js": "^2.6.12",
+        "dom-confetti": "^0.1.2",
+        "element-ui": "^2.14.1",
+        "granim": "^2.0.0",
+        "typed.js": "^2.0.11",
+        "vue": "^2.6.12",
+        "vue-codemirror": "^4.0.6",
+        "vue-faq-accordion": "^1.6.2",
+        "vue-scrollTo": "^2.4.1",
+        "vue-social-sharing": "^2.4.6",
+        "vue-tweet-embed": "^2.4.0",
+        "vue-twentytwenty": "^0.6.2"
+      }
+    },
+    "node_modules/vue": {
+      "version": "2.7.14",
+      "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.14.tgz",
+      "integrity": "sha512-b2qkFyOM0kwqWFuQmgd4o+uHGU7T+2z3T+WQp8UBjADfEv2n4FEMffzBmCKNP0IGzOEEfYjvtcC62xaSKeQDrQ==",
+      "dependencies": {
+        "@vue/compiler-sfc": "2.7.14",
+        "csstype": "^3.1.0"
+      }
+    },
+    "node_modules/vue-codemirror": {
+      "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/vue-codemirror/-/vue-codemirror-4.0.6.tgz",
+      "integrity": "sha512-ilU7Uf0mqBNSSV3KT7FNEeRIxH4s1fmpG4TfHlzvXn0QiQAbkXS9lLfwuZpaBVEnpP5CSE62iGJjoliTuA8poQ==",
+      "dependencies": {
+        "codemirror": "^5.41.0",
+        "diff-match-patch": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 4.0.0",
+        "npm": ">= 3.0.0"
+      }
+    },
+    "node_modules/vue-faq-accordion": {
+      "version": "1.6.2",
+      "resolved": "https://registry.npmjs.org/vue-faq-accordion/-/vue-faq-accordion-1.6.2.tgz",
+      "integrity": "sha512-PXFgeYQiXBe6fYERfIn44bFYUYsP+TiZ+qBH/KQKvXck85neCZvQiJN8IHwMLSC41fDdBnQvBIi6V9oO/wl/zg==",
+      "dependencies": {
+        "vue2-transitions": "^0.3.0"
+      }
+    },
+    "node_modules/vue-scrollTo": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/vue-scrollTo/-/vue-scrollTo-2.4.1.tgz",
+      "integrity": "sha512-l/f3ApUTnkGdElQBDhtDkiVkwO8uewMPY+FyOUnz94WcoqiOszsHLty1iGaX0V2y8fLz/hCQ/8XaNPjZ0xqa6A==",
+      "deprecated": "The package has been renamed to vue-scrollto (lowercase T)",
+      "dependencies": {
+        "bezier-easing": "^2.0.3"
+      }
+    },
+    "node_modules/vue-social-sharing": {
+      "version": "2.4.7",
+      "resolved": "https://registry.npmjs.org/vue-social-sharing/-/vue-social-sharing-2.4.7.tgz",
+      "integrity": "sha512-X70bulEnjSHvakf8NaLhuKTuUS4yKzdhYjX/aJ4dPVIXWaoXH8w+QODuM3C6c3fPaiNqgR19VrDyWB7EUGUzPQ==",
+      "dependencies": {
+        "vue": "^2.2.4"
+      },
+      "engines": {
+        "node": ">= 6.0"
+      }
+    },
+    "node_modules/vue-tweet-embed": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/vue-tweet-embed/-/vue-tweet-embed-2.4.0.tgz",
+      "integrity": "sha512-bjViatv0priR1dTEPJpRyWigWGUTUC28VT/sWTaZE+RBWuj/XZvOU5Hzk+O8Mue2dBCAHJrRpoO1VKlcgmHohg==",
+      "peerDependencies": {
+        "vue": "^2.2.0"
+      }
+    },
+    "node_modules/vue-twentytwenty": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/vue-twentytwenty/-/vue-twentytwenty-0.6.2.tgz",
+      "integrity": "sha512-JKwxw/p8e4wab0xPbHhj3np2ltNUh9YAaiJYlJCRWEpBig3BzgJwozLJnm5Y/BPUuy46R61o6tr0mNv66CZHQQ=="
+    },
+    "node_modules/vue2-transitions": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/vue2-transitions/-/vue2-transitions-0.3.0.tgz",
+      "integrity": "sha512-m1ad8K8kufqiEhj5gXHkkqOioI5sW0FaMbRiO0Tv2WFfGbO2eIKrfkFiO3HPQtMJboimaLCN4p/zL81clLbG4w=="
+    },
+    "node_modules/wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+    },
+    "node_modules/yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+    },
+    "node_modules/zod": {
+      "version": "3.21.4",
+      "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz",
+      "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==",
+      "funding": {
+        "url": "https://github.com/sponsors/colinhacks"
+      }
+    }
+  }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..34b4561
--- /dev/null
+++ b/package.json
@@ -0,0 +1,23 @@
+{
+  "name": "tempest.dev",
+  "version": "1.0.0",
+  "description": "",
+  "main": "index.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "author": "",
+  "license": "ISC",
+  "dependencies": {
+    "next": "^13.4.1",
+    "react": "^18.2.0",
+    "react-dom": "^18.2.0",
+    "sharp": "^0.32.1",
+    "victormono": "^1.5.5"
+  },
+  "devDependencies": {
+    "@types/node": "20.1.0",
+    "@types/react": "^18.2.6",
+    "typescript": "5.0.4"
+  }
+}
diff --git a/pay-transparency.html b/pay-transparency.html
deleted file mode 100644
index d6d672c..0000000
--- a/pay-transparency.html
+++ /dev/null
@@ -1,112 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <title>Pay Transparency</title>
-    <link rel="stylesheet" href="/resources/style.css"/>
-    <meta name="viewport" content="width=device-width, initial-scale=1">
-  </head>
-  <body>
-    <nav>
-      <a href="/">Home</a>
-      <a href="/about.html">About</a>
-      <a href="/posts/">Posts</a>
-    </nav>
-    <h1>
-      Pay Transparency
-    </h1>
-
-    <p>
-      This page lists the title and pay rate of every job I have held since university
-      graduation<sup><a id="1-ref" href="#1-foot">1</a></sup>, and is inspired by
-      <a target="_blank" href="https://rin.systems/pay-transparency/">Rin's pay transparency</a>
-      page.  Her page is what inspired me to make this one, and I hope the idea
-      continues to spread, as the more people know what common compensation is
-      across the industry, the more we can all benefit.
-    </p>
-
-    <div class="tableOverflow">
-      <table>
-        <thead>
-          <tr>
-            <th>Role</th>
-            <th>Start</th>
-            <th>End</th>
-            <th>Rate / Salary</th>
-          </tr>
-        </thead>
-        <tbody>
-          <tr>
-            <td>Software Developer</td>
-            <td>Jan 2020</td>
-            <td>Sept 2020</td>
-            <td>$35 USD / hour</td>
-          </tr>
-          <tr>
-            <td>Software Engineer</td>
-            <td>Jan 2021</td>
-            <td>Sept 2021</td>
-            <td>$90,000 USD / year
-              <span class="asterisk">*</span>
-            </td>
-          </tr>
-          <tr>
-            <td>Software Engineer</td>
-            <td>Sept 2021</td>
-            <td>Oct 2022</td>
-            <td>$100,800 USD / year
-              <span class="asterisk">*</span>
-            </td>
-          </tr>
-          <tr>
-            <td>Software Engineer</td>
-            <td>Oct 2021</td>
-            <td>Jan 2022</td>
-            <td>$105,840 USD / year
-              <span class="asterisk">*</span>
-            </td>
-          </tr>
-          <tr>
-            <td>Senior Software Engineer</td>
-            <td>Jan 2022</td>
-            <td>May 2022</td>
-            <td>$121,716 USD / year
-              <span class="asterisk">*</span>
-            </td>
-          </tr>
-          <tr>
-            <td>Senior Software Engineer</td>
-            <td>June 2022</td>
-            <td>March 2023</td>
-            <td>$158,000 USD / year
-              <span class="asterisk">*</span>
-              <span class="asterisk">**</span>
-            </td>
-          </tr>
-        </tbody>
-      </table>
-    </div>
-
-    <p>
-      All positions listed here included health, dental, and vision insurance.<br/>
-      The positions listed with <span class="asterisk">*</span> came with
-      a retirement account.<br/>
-      The position listed with <span class="asterisk">**</span>
-      came with stock options.
-    </p>
-
-    <ol id="footnotes">
-      <li id="1-foot">
-        I unfortunately no longer have any accurate information for the job
-        I held during university.  It spanned across six years, and my role changed
-        several times - I do remember I started at $9 USD / hour and ended at
-        $22.50 USD / hour.
-        <a href="#1-ref">^</a>
-      </li>
-    </ol>
-
-    <footer>
-      <a href="https://git.tempest.dev/ashe/tempest.dev">Site Source</a>
-      <a href="/pay-transparency.html">Pay Transparency</a>
-    </footer>
-  </body>
-</html>
diff --git a/posts/01_04_2023-advent-of-wasm.html b/posts/01_04_2023-advent-of-wasm.html
deleted file mode 100644
index 4f707a6..0000000
--- a/posts/01_04_2023-advent-of-wasm.html
+++ /dev/null
@@ -1,123 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <title>Advent of Wasm</title>
-    <link rel="stylesheet" href="/resources/style.css"/>
-    <meta name="viewport" content="width=device-width, initial-scale=1">
-  </head>
-  <body>
-    <nav>
-      <a href="/">Home</a>
-      <a href="/about.html">About</a>
-      <a href="/posts/">Posts</a>
-    </nav>
-    <h1>
-      Advent of Wasm
-      <span class="subtitle">Now with 87% more pain</span>
-    </h1>
-
-    <p>
-      So the last few years I have done Advent of Code off and on.  Sometimes
-      I have tried to learn a new language, other times I was just trying to
-      beat my dad each evening.  This year though, this year I don't know what
-      I was thinking.
-    </p>
-
-    <p>
-      It was several weeks after everyone else had started, I had largely written
-      it off for the year - I was not up for it.  Until a terrible idea crossed
-      my mind.
-    </p>
-
-    <p>
-      Like an intrusive thought, my mind asked: "Well you've been wanting to do
-      something in web assembly for a while right?  How bad could it be?"
-    </p>
-
-    <br/>
-
-    <p>
-      Turns out I was definitely not ready for this.
-    </p>
-
-    <h2>So what was so hard about it?</h2>
-
-    <p>
-      More than anything else, I forgot how much you need to do by hand to do
-      any sort of assembly.  The first day saw me spending several hours just
-      on some loader code to pass the puzzle input in from JS, call a wasm
-      function, and then read back the result.
-    </p>
-
-    <p>
-      Next was a few functions for reading numbers out of the wasm memory buffer,
-      parsing them from ascii, etc.  The core read loop was not too tricky, but
-      the bit that took far longer than it had any reason to was converting my
-      answer back to ascii and shoving it into an output area.
-    </p>
-
-    <p>
-      Really none of it was surprising, and none of it <em><strong>*should*</strong></em>
-      have been that hard ... it's just been a while since this Javascript girl
-      has written truly low-level code.
-    </p>
-
-    <p>
-      To make matters worse I got hard-core distracted by the non-wasm part of
-      my wasm project.  After the first day I returned to my stub JS loader and
-      expanded it into a little wasm explorer.
-    </p>
-
-    <p>
-      I added a code view, syntax highlighting, auto-loaded my puzzle inputs,
-      even made a janky little dynamic list that would automatically pick up
-      new days' solutions as I added them to the repo without needing me to
-      touch the loader page each day.
-    </p>
-
-    <p>
-      In the end I'm really quite proud of it, I will absolutely be reusing
-      this setup for future years, and you should
-      <a href="https://aoc2022.tempest.dev/" target="_blank">check it out</a>
-      if you haven't already ... but for wanting to challenge myself with
-      something new I was doing a lot of the same-old.
-    </p>
-
-    <p>
-      Ultimately I got through 3 days before giving up jusst because every
-      step along the way involved <em><strong>*so much*</strong></em> extra
-      code.  I may come back to some of the puzzles later, but for now I'm
-      kind of happy with what I did, and I don't feel like I need to prove
-      myself by doing more.  I was doing it for fun, and so I stopped when
-      it stopped being fun.
-    </p>
-
-    <h2>Tips if you want to get into writing wasm by hand?</h2>
-
-    <p>
-      Uhh ... maybe consider don't?
-    </p>
-
-    <p>
-      Jokes aside: do a throwaway project or two so you get used to passing
-      data into and out of wasm, whatever parsing you're going to do, etc.
-    </p>
-
-    <p>
-      Do everything in your power to make sure you can focus on the actual
-      wasm part of your project, because (at least if you're anything like
-      me) it's easy to get sidetracked with all that.
-    </p>
-
-    <p>
-      With that said: I had fun.  Doing new things is always a treat, so if
-      you're looking for something new to try definitely consider giving
-      webassembly a look.
-    </p>
-
-    <footer>
-      <a href="https://git.tempest.dev/ashe/tempest.dev">Site Source</a>
-      <a href="/pay-transparency.html">Pay Transparency</a>
-    </footer>
-  </body>
-</html>
diff --git a/posts/07_29_2022-on-communities-and-trust.html b/posts/07_29_2022-on-communities-and-trust.html
deleted file mode 100644
index 4aef9ae..0000000
--- a/posts/07_29_2022-on-communities-and-trust.html
+++ /dev/null
@@ -1,107 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <title>On Communities and Trust</title>
-    <link rel="stylesheet" href="/resources/style.css"/>
-    <meta name="viewport" content="width=device-width, initial-scale=1">
-  </head>
-  <body>
-    <nav>
-      <a href="/">Home</a>
-      <a href="/about.html">About</a>
-      <a href="/posts/">Posts</a>
-    </nav>
-    <h1>
-      On Communities and Trust
-      <span class="subtitle">Some thoughts on the VRChat security update</span>
-    </h1>
-
-    <p>
-      So we've had the VRChat Security Update for a few days now, and while I'm
-      not the most prolific VR community member, I have heard a fair bit of
-      discourse about the update.  This update has been a polarizing one to say
-      the least, with users excited for the new features that were and will soon
-      be added, others decrying the performance issues they have now from Easy
-      Anti-Cheat, and still others still unable to play due to missing
-      accessibility features they previously would have gotten via mods.
-    </p>
-
-    <p>
-      Overall, my personal concerns about update itself have been resolved:
-      although I used to run into issues with EAC crashing when hardware
-      virtualization was enabled, that seem to no longer be the case, and I
-      personally haven't even seen a performance hit.  I was not
-      using any mod features, and the changes in the most recent beta
-      certainly a welcome addition to my experience.
-    </p>
-
-    <p>
-      However, I do still have some broader community concerns about how the
-      update was announced and rolled out, as well as how the VRChat team seems
-      to be handling this whole scenario as if they're only playing public
-      opinion damage control.
-    </p>
-
-    <p>
-      Regardless of their official policy or any amount of discouragement
-      towards mods for VRChat, the fact of the matter is that a large portion
-      of their community relied on mods to add accessibility, performance, or
-      comfort features to the game.  While I have to acknowledge that the VRC
-      team has added some of these features back into the game since blocking
-      mods, the fact that they needed to reprioritize these features (as they
-      have been pretty clear about in their updates) shows us that they had
-      no interest in adding these features until they faced public backlash.
-    </p>
-
-    <p>
-      You might think that a reasonable development team (if they wanted to
-      reduce the use of mods for their game) might look at the sizable portion
-      of their community using mods for this sort of enhancement,
-      and come to the conclusion "clearly there is need for these features,
-      let's reduce the need for mods by implementing those features".  But instead the
-      VRChat team decided to actively make their game worse for those people instead.
-      Disabling comments on Steam further indicates that they knew this would
-      be disliked by the community ahead of time, but chose to do it anyways.
-    </p>
-
-    <p>
-      Listen, VRChat team - what sort of conclusions am I supposed to draw about
-      your priorities here?!?  Improving the game experience for your most
-      vulnerable players doesn't make the roadmap, but pushing an ineffective
-      solution to a problem <b>against the angry backlash of your community</b>
-      makes the cut?
-    </p>
-
-    <p>
-      So yeah . . . I guess in one sense, the game is fine.  It's getting new features, more are
-      on the horizon, the community feels like they've been listened to.
-    </p>
-
-    <p>
-      But in another sense, the security update has made it incredibly clear
-      that the VRChat team either does not care, or did not think to consider
-      how their priorities would affect large portions of their community.
-    </p>
-
-    <p>
-      Social games grow and shrink with their communities.  Regardless of technical
-      decisions, updates, or anything else, if large portions of the community
-      leave or can no longer join, then VRChat will no longer be the same game
-      (and it will be worse for it).  With the latest changes and how they've
-      handled the community response, I just can't convince myself that the team remembers
-      this.
-    </p>
-
-    <p>
-      In that regard, I feel that even more than the actual removal of features
-      they have violated our trust - and unless this newfound responsiveness to
-      the needs of their players sticks around longer than it takes to clean up
-      their PR mess, I personally am hesitant to forgive them.
-    </p>
-
-    <footer>
-      <a href="https://git.tempest.dev/ashe/tempest.dev">Site Source</a>
-      <a href="/pay-transparency.html">Pay Transparency</a>
-    </footer>
-  </body>
-</html>
diff --git a/posts/08_01_2022-thoughts-on-neovim.html b/posts/08_01_2022-thoughts-on-neovim.html
deleted file mode 100644
index 183902a..0000000
--- a/posts/08_01_2022-thoughts-on-neovim.html
+++ /dev/null
@@ -1,109 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <title>Thoughts on Neovim</title>
-    <link rel="stylesheet" href="/resources/style.css"/>
-    <meta name="viewport" content="width=device-width, initial-scale=1">
-  </head>
-  <body>
-    <nav>
-      <a href="/">Home</a>
-      <a href="/about.html">About</a>
-      <a href="/posts/">Posts</a>
-    </nav>
-    <h1>
-      Thoughts on Neovim
-      <span class="subtitle">Who even needs an IDE anyways?</span>
-    </h1>
-
-    <h2>Why I'm using Neovim</h2>
-
-    <p>
-      When I first started coding in high school and then later in early
-      college I used to jump around between editors a lot more than I do today.
-      I used Notepad++, then Visual Studio, briefly Netbeans, then Atom.
-    </p>
-
-    <p>
-      But since settling into frontend web development I've stayed with VSCode
-      for a very long time.  I liked it because it was straightforward to get
-      started with, but versatile enough to extend for other languages.
-      Between various jobs and projects I used it for Javascript, Java, C#,
-      Rust, and C - and it did admirably at pretty much all of these.
-    </p>
-
-    <p>
-      But about a year ago I saw that VSCode had a Neovim plugin, and I was
-      intrigued.  I'd wanted to get more familiar with Vim beyond the basic
-      hjkl navigation, and this seemed like a great way to do that! 
-    </p>
-
-    <p>
-      So for the last year and change I've had the
-      <a target="_blank" href="https://marketplace.visualstudio.com/items?itemName=asvetliakov.vscode-neovim">vscode-neovim</a>
-      plugin installed, and I've been really enjoying it!
-    </p>
-
-    <p>
-      I quickly fell in love with visual block mode, or the "delete N words"
-      commands.  They're just so handy I suddenly felt like they were missing
-      if I needed to edit code any other way!
-    </p>
-
-    <p>
-      But over the weekend I made the jump from using Neovim inside VSCode to
-      using it more or less on its own.  I saw a video that mentioned the
-      AstroNvim configuration framework and Neovide, and decided "yeah, I think
-      I want to try that", and a few days later . . . here we are.
-    </p>
-
-    <h2>How is it going?</h2>
-
-    <p>
-      Overall, surprisingly well.
-    </p>
-
-    <p>
-      The AstroNvim config I'm using already had NeoTree set up which is
-      very nice.  I've figured out how to get ESLint and Prettier configured
-      for work, rust-analyzer installed for my own projects, I've been poking
-      at themes over and over again, and honestly . . . I'm really liking this.
-    </p>
-
-    <p>
-      Getting Neovide to connect to a VM over the network was relatively
-      straightforward, I love how easy it is to drop my config into git and
-      keep it synced between computers, and finally having proper mouse support
-      (which I never could get sorted out with my terminal) is a pretty big
-      game changer for when I'm just reading code.
-    </p>
-
-    <p>
-      Also, I'd be lying if I said that I didn't love the smooth scrolling and
-      cursor animation.  I am a simple girl after all.
-    </p>
-
-    <h2>Should you try replacing your IDE?</h2>
-
-    <p>
-      That is a tricky question to answer.
-    </p>
-
-    <p>
-      I was comfortable spending some time experimenting with this because I
-      already had decent familiarity with Vim and had been using Neovim
-      specifically for a while.  If you don't have any similar experience,
-      the learning curve is going to be pretty steep.
-    </p>
-
-    <p>
-      But hey - if you're looking for a challenge, you'll definitely learn
-      a lot.
-    </p>
-
-    <footer>
-      <a href="https://git.tempest.dev/ashe/tempest.dev">Site Source</a>
-      <a href="/pay-transparency.html">Pay Transparency</a>
-    </footer>
-  </body>
-</html>
diff --git a/posts/index.html b/posts/index.html
deleted file mode 100644
index 05beb66..0000000
--- a/posts/index.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <title>Posts</title>
-    <link rel="stylesheet" href="/resources/style.css"/>
-    <meta name="viewport" content="width=device-width, initial-scale=1">
-  </head>
-  <body>
-    <nav>
-      <a href="/">Home</a>
-      <a href="/about.html">About</a>
-      <a href="/posts/">Posts</a>
-    </nav>
-    <h1>
-      Posts
-    </h1>
-    <h2>2023</h2>
-    <ul class="posts">
-      <li>
-        <span>January 4</span>
-        <a href="/posts/01_04_2023-advent-of-wasm.html">Retrospect: Advent of Wasm</a>
-      </li>
-    </ul>
-
-    <h2>2022</h2>
-    <ul class="posts">
-      <li>
-        <span>August 1</span>
-        <a href="/posts/08_01_2022-thoughts-on-neovim.html">Thoughts on Neovim</a>
-      </li>
-      <li>
-        <span>July 29</span>
-        <a href="/posts/07_29_2022-on-communities-and-trust.html">On Communities and Trust</a>
-      </li>
-    </ul>
-
-    <footer>
-      <a href="https://git.tempest.dev/ashe/tempest.dev">Site Source</a>
-      <a href="/pay-transparency.html">Pay Transparency</a>
-    </footer>
-  </body>
-</html>
diff --git a/resources/signature.svg b/public/resources/signature.svg
index 4d69a57..4d69a57 100644
--- a/resources/signature.svg
+++ b/public/resources/signature.svg
diff --git a/resources/style.css b/resources/style.css
deleted file mode 100644
index 03782a4..0000000
--- a/resources/style.css
+++ /dev/null
@@ -1,228 +0,0 @@
-* {
-  box-sizing: border-box;
-}
-
-html, body {
-  margin: 0;
-  padding: 0;
-  font-family: Arial, sans-serif;
-  background: #2b2235;
-}
-
-body {
-  min-height: 100vh;
-  background: #211e22;
-  color: rgba(255,255,255,.8);
-  max-width: 600px;
-  margin: 0 auto;
-  padding: 16px;
-  display: flex;
-  flex-direction: column;
-}
-
-nav, footer {
-  display: flex;
-  flex-direction: row;
-  flex-wrap: wrap;
-  align-items: end;
-}
-
-nav a, footer a {
-  opacity: .4;
-}
-
-nav a:hover, footer a:hover {
-  opacity: .8;
-}
-
-nav > a:not(:last-child), footer > a:not(:last-child) {
-  margin-right: 40px;
-}
-
-
-h1 {
-  color: rgba(255,255,255,.9);
-}
-
-h1 > aside,
-h2 > aside,
-h3 > aside,
-h4 > aside {
-  display: inline-block;
-  font-size: max(.5em, 14px);
-  font-weight: 100;
-  font-style: italic;
-  opacity: .6;
-  margin-left: 8px;
-}
-
-h1 > .subtitle {
-  display: block;
-  font-size: 20px;
-  opacity: .8;
-  font-weight: normal;
-  font-style: italic;
-}
-
-h3 + p,
-h4 + p {
-  margin-top: -8px;
-}
-
-ul > li:not(:last-child) {
-  margin-bottom: 8px;
-}
-
-ul.posts {
-  list-style: none;
-}
-
-ul.posts li span {
-  display: inline-block;
-  min-width: 100px;
-  opacity: .5;
-  text-align: right;
-  margin-right: 10px;
-}
-
-body p {
-  line-height: 1.5;
-}
-
-a {
-  color: white;
-  opacity: .8;
-}
-
-a[href^="https:"],
-a[href^="http:"],
-a[href^="//"] {
-  color: #caa5ff;
-}
-
-h2 {
-  margin-top: 48px;
-}
-
-sup {
-  vertical-align: top;
-}
-
-sup a {
-  position: relative;
-  top: -4px;
-  color: #caa5ff;
-  margin: 0 2px;
-  text-decoration: none;
-}
-
-span.asterisk {
-  color: #caa5ff;
-}
-
-.tableOverflow {
-  margin: 0 -16px;
-  width: calc(100% + 32px);
-  overflow-x: auto;
-  padding: 0 16px;
-  position: relative;
-}
-
-body > aside {
-  border-left: solid 4px #caa5ff88;
-  padding-left: 8px;
-}
-
-body > aside strong:first-child {
-  color: #caa5ffcc;
-}
-
-table {
-  border-collapse: collapse;
-  text-align: left;
-  min-width: calc(600px - 32px);
-}
-
-table tr {
-}
-
-table th {
-  border-bottom: solid 1px white;
-}
-
-table th, table td {
-  padding: 8px 4px;
-}
-
-ol#footnotes {
-  padding-left: 0px;
-  list-style: none;
-  counter-reset: list-number;
-  flex: 1;
-  display: flex;
-  flex-direction: column;
-  justify-content: end;
-  margin-top: 40px;
-}
-
-ol#footnotes li {
-  display: flex;
-  flex-direction: row;
-  padding: 16px;
-  margin: 0 -16px;
-  position: relative;
-  transition: .15s ease-in-out background;
-}
-
-ol#footnotes li::before {
-  counter-increment: list-number;
-  content: counter(list-number);
-  color: #caa5ff;
-  width: 20px;
-  margin-right: 8px;
-}
-
-ol#footnotes li a {
-  margin-left: 8px;
-  color: #caa5ff;
-}
-
-ol#footnotes li:first-child::after {
-  position: absolute;
-  top: 1px;
-  width: calc(100% - 32px);
-  background: #caa5ff;
-  opacity: .4;
-  height: 1px;
-  content: '';
-}
-
-ol#footnotes li:target {
-  background: #3d3548;
-}
-
-footer {
-  margin-top: 40px;
-  flex: 1;
-  position: relative;
-}
-
-footer::before {
-  position: absolute;
-  bottom: 36px;
-  width: calc(100% - 0px);
-  height: 1px;
-  margin: 0 auto;
-  content: '';
-  background: #caa5ff;
-  opacity: .4;
-}
-
-ol#footnotes + footer {
-  flex: initial;
-  margin-top: 0;
-}
-
-ol#footnotes + footer::before {
-  display: none;
-}
diff --git a/styles/index.module.css b/styles/index.module.css
new file mode 100644
index 0000000..2314363
--- /dev/null
+++ b/styles/index.module.css
@@ -0,0 +1,11 @@
+.glance {
+  margin: var(--text-padding);
+  display: grid;
+  grid-template-columns: fit-content(35%) 1fr;
+  grid-row-gap: calc(.5 * var(--text-padding));
+}
+
+.glance .label {
+  color: var(--text-dimmed);
+  margin-right: var(--text-padding);
+}
diff --git a/styles/layout.css b/styles/layout.css
new file mode 100644
index 0000000..f2b2dba
--- /dev/null
+++ b/styles/layout.css
@@ -0,0 +1,181 @@
+:root {
+  --header-height: 400px;
+  --header-overlap: 150px;
+  --header-bar-height: 48px;
+  --main-width: 600px;
+  --footer-spacing: 8px;
+  --page-background: #262626;
+  --main-background: #423c3c;
+  --text-bright:rgba(255,255,255,   1);
+  --text-medium:rgba(255,255,255, .75);
+  --text-dimmed:rgba(255,255,255, .55);
+  --text-padding: 16px;
+
+}
+
+body {
+  margin: 0;
+  padding: 0;
+  display: flex;
+  flex-direction: column;
+  min-height: 100vh;
+  background: var(--page-background);
+}
+
+
+header {
+  height: calc(var(--header-height) - var(--header-overlap));
+  overflow-y: visible;
+  position: relative;
+  display: flex;
+  flex-direction: row;
+  padding: var(--text-padding);
+  padding-bottom: 0;
+  box-sizing: border-box;
+  align-items: start;
+  justify-items: flex-start;
+}
+
+header:not(.homepage) {
+  justify-content: space-between;
+}
+
+header.homepage {
+  flex-direction: column;
+  align-items: center;
+  height: calc(var(--header-height) - var(--header-overlap) + var(--header-bar-height));
+}
+
+header.homepage::before {
+  content: ' ';
+  flex: 1;
+}
+
+header .siteTitle {
+  margin: 0;
+}
+
+header.homepage .siteTitle {
+  font-size: 4em;
+}
+
+header:not(.homepage) .siteTitle {
+  font-size: 1.2em;
+}
+
+header nav {
+  display: block;
+  border: solid 5px transparent;
+}
+
+header nav a {
+  margin: 0 calc(1.5 * var(--text-padding));
+}
+
+header.homepage nav {
+  border: none;
+  background: var(--main-background);
+  height: var(--header-bar-height);
+  width: var(--main-width);
+  display: flex;
+  flex-direction: row;
+  justify-content: center;
+  border-bottom: solid 1px var(--text-dimmed);
+}
+
+header.homepage nav a {
+  height: 100%;
+  padding: 14px;
+  box-sizing: border-box;
+}
+
+
+header .headerBackground {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  height: 400px;
+  z-index: -1;
+  user-select: none;
+}
+
+header .headerBackground img {
+  z-index: -1;
+  object-fit: cover;
+  object-position: center 75%;
+}
+
+header .headerBackground::after {
+  content: ' ';
+  display: block;
+  width: 100%;
+  height: 100%;
+  background: rgba(0,0,0,.35);
+}
+
+header:not(.homepage) + h1 {
+  width: var(--main-width);
+  margin: 0 auto;
+  padding: var(--text-padding);
+  box-sizing: border-box;
+  height: 80px;
+  margin-top: -80px;
+}
+
+main {
+  font-family: Arial, sans-serif;
+}
+
+main.mainColumn {
+  width: var(--main-width);
+  box-sizing: border-box;
+  padding: var(--text-padding);
+  margin: 0 auto;
+  background: var(--main-background);
+  min-height: calc(var(--header-overlap) + 100px);
+  box-shadow: 0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);
+}
+
+header.homepage + main.mainColumn {
+  min-height: calc(var(--header-overlap) + 100px - var(--header-bar-height));
+}
+
+main.mainColumn aside.infobar {
+  margin: calc(-1 * var(--text-padding));
+  margin-bottom: var(--text-padding);
+  padding: var(--text-padding);
+  background: var(--main-background);
+  height: var(--header-bar-height);
+  width: var(--main-width);
+  box-sizing: border-box;
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  border-bottom: solid 1px var(--text-dimmed);
+}
+
+main.mainColumn > p:first-child,
+main.mainColumn .infobar + p {
+  margin-top: 0;
+}
+
+footer {
+  flex: 1;
+  align-items: end;
+  box-sizing: border-box;
+  width: var(--main-width);
+  margin: 0 auto;
+  padding: var(--text-padding);
+  display: flex;
+  flex-direction: row;
+  margin-top: var(--footer-spacing);
+}
+
+footer span {
+  flex: 1;
+}
+
+footer a {
+  margin-left: calc(2 * var(--text-padding));
+}
diff --git a/styles/text.css b/styles/text.css
new file mode 100644
index 0000000..93364a7
--- /dev/null
+++ b/styles/text.css
@@ -0,0 +1,40 @@
+body {
+  color: var(--text-medium);
+}
+
+a {
+  color: var(--text-bright);
+  font-family: 'Victor Mono Oblique', sans-serif;
+}
+
+.siteTitle {
+  font-family: 'Victor Mono';
+  opacity: .8;
+  font-style: italic;
+  text-decoration: none;
+  font-weight: normal;
+  text-decoration: none;
+}
+
+h1, .pageTitle {
+  font-family: 'Victor Mono Oblique', sans-serif;
+  opacity: .8;
+}
+
+h2, h3, h4, h5 {
+  color: var(--text-bright);
+  font-family: 'Victor Mono Oblique', sans-serif;
+}
+
+em {
+  color: var(--text-bright);
+}
+
+main {
+  font-family: 'Victor Mono', sans-serif;
+}
+
+footer {
+  font-family: 'Victor Mono', sans-serif;
+  opacity: .5;
+}
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..8137c50
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,39 @@
+{
+  "compilerOptions": {
+    "baseUrl": ".",
+    "paths": {
+      "~/*": ["*"]
+    },
+    "lib": [
+      "dom",
+      "dom.iterable",
+      "esnext"
+    ],
+    "allowJs": true,
+    "skipLibCheck": true,
+    "strict": false,
+    "forceConsistentCasingInFileNames": true,
+    "noEmit": true,
+    "incremental": true,
+    "esModuleInterop": true,
+    "module": "esnext",
+    "moduleResolution": "node",
+    "resolveJsonModule": true,
+    "isolatedModules": true,
+    "jsx": "preserve",
+    "plugins": [
+      {
+        "name": "next"
+      }
+    ]
+  },
+  "include": [
+    "next-env.d.ts",
+    ".next/types/**/*.ts",
+    "**/*.ts",
+    "**/*.tsx"
+  ],
+  "exclude": [
+    "node_modules"
+  ]
+}