From b9a601894dde2068f09cc0f41530a79a393e8dd5 Mon Sep 17 00:00:00 2001 From: ilia Date: Wed, 20 May 2026 22:34:48 -0400 Subject: [PATCH] Add levkin.ca design concepts (Spec, Slab, Relay, Vault). Four static landing-page options with Vite build, cal booking, and links to sibling sites. Co-authored-by: Cursor --- .gitignore | 3 + README.md | 35 ++ index.html | 191 ++++++++ package-lock.json | 1143 ++++++++++++++++++++++++++++++++++++++++++++ package.json | 14 + public/favicon.svg | 4 + relay/index.html | 87 ++++ relay/relay.css | 205 ++++++++ relay/relay.js | 58 +++ slab/index.html | 73 +++ slab/slab.css | 191 ++++++++ spec/index.html | 153 ++++++ spec/spec.css | 287 +++++++++++ spec/spec.js | 17 + vault/index.html | 88 ++++ vault/vault.css | 242 ++++++++++ vite.config.js | 16 + 17 files changed, 2807 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/favicon.svg create mode 100644 relay/index.html create mode 100644 relay/relay.css create mode 100644 relay/relay.js create mode 100644 slab/index.html create mode 100644 slab/slab.css create mode 100644 spec/index.html create mode 100644 spec/spec.css create mode 100644 spec/spec.js create mode 100644 vault/index.html create mode 100644 vault/vault.css create mode 100644 vite.config.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3bdd52e --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules/ +dist/ +.DS_Store diff --git a/README.md b/README.md new file mode 100644 index 0000000..010d531 --- /dev/null +++ b/README.md @@ -0,0 +1,35 @@ +# levkin.ca + +Four design concepts for the Levkin software development company homepage. + +| Option | Path | Vibe | +|--------|------|------| +| **Spec** | `/spec/` | RFC documentation, endpoints, required properties | +| **Slab** | `/slab/` | Brutalist poster, massive typography | +| **Relay** | `/relay/` | Telegraph, signal chain, decoded messages | +| **Vault** | `/vault/` | Institutional trust, enterprise gravitas | + +Open `/` to compare all four. + +## Develop + +```bash +cd ~/Documents/code/levkin.ca +npm install +npm run dev +``` + +## Build + +```bash +npm run build +# output in dist/ +``` + +## Related sites + +- [auto.levkin.ca](https://auto.levkin.ca) — automation +- [caseware.levkin.ca](https://caseware.levkin.ca) — CaseWare consulting +- [jobs.levkin.ca](https://jobs.levkin.ca) — job orchestration +- [git.levkin.ca](https://git.levkin.ca) — source control +- [iliadobkin.com](https://iliadobkin.com) — SDET portfolio · quality engineering diff --git a/index.html b/index.html new file mode 100644 index 0000000..a5c0c1b --- /dev/null +++ b/index.html @@ -0,0 +1,191 @@ + + + + + + levkin.ca — design options + + + + + + + + + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..3a7af74 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1143 @@ +{ + "name": "levkin.ca", + "version": "0.3.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "levkin.ca", + "version": "0.3.0", + "devDependencies": { + "vite": "^6.3.5" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.4.tgz", + "integrity": "sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.4.tgz", + "integrity": "sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjkWokaw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.4.tgz", + "integrity": "sha512-tua0TaJxMOB1R0V0RS1jFZ/RpURFDJIOR2A6jWwQeawuFyS4gBW+rntLRaQd0EQ4bd6Vp44Z2rXW+YYDBsj6IA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.4.tgz", + "integrity": "sha512-CSKq7MsP+5PFIcydhAiR1K0UhEI1A2jWXVKHPCBZ151yOutENwvnPocgVHkivu2kviURtCEB6zUQw0vs8RrhMg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.4.tgz", + "integrity": "sha512-+O8OkVdyvXMtJEciu2wS/pzm1IxntEEQx3z5TAVy4l32G0etZn+RsA48ARRrFm6Ri8fvqPQfgrvNxSjKAbnd3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.4.tgz", + "integrity": "sha512-Iw3oMskH3AfNuhU0MSN7vNbdi4me/NiYo2azqPz/Le16zHSa+3RRmliCMWWQmh4lcndccU40xcJuTYJZxNo/lw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.4.tgz", + "integrity": "sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.4.tgz", + "integrity": "sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.4.tgz", + "integrity": "sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.4.tgz", + "integrity": "sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.4.tgz", + "integrity": "sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.4.tgz", + "integrity": "sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.4.tgz", + "integrity": "sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.4.tgz", + "integrity": "sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.4.tgz", + "integrity": "sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.4.tgz", + "integrity": "sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.4.tgz", + "integrity": "sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.4.tgz", + "integrity": "sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.4.tgz", + "integrity": "sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.4.tgz", + "integrity": "sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.4.tgz", + "integrity": "sha512-IPOsh5aRYuLv/nkU51X10Bf75Bsf6+gZdx1X+QP5QM6lIJFHHqbHLG0uJn/hWthzo13UAc2umiUorqZy3axoZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.4.tgz", + "integrity": "sha512-4QzE9E81OohJ/HKzHhsqU+zcYYojVOXlFMs1DdyMT6qXl/niOH7AVElmmEdUNHHS/oRkc++d5k6Vy85zFs0DEw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.4.tgz", + "integrity": "sha512-zTPgT1YuHHcd+Tmx7h8aml0FWFVelV5N54oHow9SLj+GfoDy/huQ+UV396N/C7KpMDMiPspRktzM1/0r1usYEA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.4.tgz", + "integrity": "sha512-DRS4G7mi9lJxqEDezIkKCaUIKCrLUUDCUaCsTPCi/rtqaC6D/jjwslMQyiDU50Ka0JKpeXeRBFBAXwArY52vBw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.4.tgz", + "integrity": "sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC6ksWtJw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/rollup": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.4.tgz", + "integrity": "sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.60.4", + "@rollup/rollup-android-arm64": "4.60.4", + "@rollup/rollup-darwin-arm64": "4.60.4", + "@rollup/rollup-darwin-x64": "4.60.4", + "@rollup/rollup-freebsd-arm64": "4.60.4", + "@rollup/rollup-freebsd-x64": "4.60.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.4", + "@rollup/rollup-linux-arm-musleabihf": "4.60.4", + "@rollup/rollup-linux-arm64-gnu": "4.60.4", + "@rollup/rollup-linux-arm64-musl": "4.60.4", + "@rollup/rollup-linux-loong64-gnu": "4.60.4", + "@rollup/rollup-linux-loong64-musl": "4.60.4", + "@rollup/rollup-linux-ppc64-gnu": "4.60.4", + "@rollup/rollup-linux-ppc64-musl": "4.60.4", + "@rollup/rollup-linux-riscv64-gnu": "4.60.4", + "@rollup/rollup-linux-riscv64-musl": "4.60.4", + "@rollup/rollup-linux-s390x-gnu": "4.60.4", + "@rollup/rollup-linux-x64-gnu": "4.60.4", + "@rollup/rollup-linux-x64-musl": "4.60.4", + "@rollup/rollup-openbsd-x64": "4.60.4", + "@rollup/rollup-openharmony-arm64": "4.60.4", + "@rollup/rollup-win32-arm64-msvc": "4.60.4", + "@rollup/rollup-win32-ia32-msvc": "4.60.4", + "@rollup/rollup-win32-x64-gnu": "4.60.4", + "@rollup/rollup-win32-x64-msvc": "4.60.4", + "fsevents": "~2.3.2" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/vite": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.2.tgz", + "integrity": "sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..1e28803 --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "name": "levkin.ca", + "private": true, + "version": "0.3.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "devDependencies": { + "vite": "^6.3.5" + } +} diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..3060a3e --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/relay/index.html b/relay/index.html new file mode 100644 index 0000000..9d7558b --- /dev/null +++ b/relay/index.html @@ -0,0 +1,87 @@ + + + + + + Levkin — Relay + + + + + + + + + + + + +
+
+

Levkin Relay

+

Software development · signal in · production out

+
+ +
+
+ INCOMING + +
+

+      
+    
+ +
+

Active lines

+ +
+ +
+

Every transmission handled with retries, documentation, and tests before it reaches production. Canadian. Remote.

+
+ +
+

Schedule transmission:

+ 15 min consultation → +

Or reply to:

+ hello@levkine.ca +
+
+ + + + + + diff --git a/relay/relay.css b/relay/relay.css new file mode 100644 index 0000000..fc80a0a --- /dev/null +++ b/relay/relay.css @@ -0,0 +1,205 @@ +:root { + --bg: #1a1814; + --paper: #e8e0d4; + --amber: #d4a574; + --dim: #6b6358; + --mono: 'Courier Prime', 'Courier New', monospace; +} + +* { box-sizing: border-box; margin: 0; padding: 0; } + +body { + font-family: var(--mono); + background: var(--bg); + color: var(--paper); + min-height: 100vh; + line-height: 1.55; +} + +.grain { + position: fixed; + inset: 0; + pointer-events: none; + opacity: 0.04; + background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E"); + z-index: 0; +} + +.nav { + position: relative; + z-index: 2; + display: flex; + justify-content: space-between; + padding: 1.25rem 2rem; + font-size: 0.75rem; + letter-spacing: 0.1em; +} + +.nav a { + color: var(--dim); + text-decoration: none; +} + +.nav a:hover { color: var(--amber); } + +.station { color: var(--amber); } + +main { + position: relative; + z-index: 1; + max-width: 560px; + margin: 0 auto; + padding: 2rem 2rem 4rem; +} + +.header { + margin-bottom: 2.5rem; + padding-bottom: 1.5rem; + border-bottom: 1px solid rgba(212, 165, 116, 0.25); +} + +.header h1 { + font-size: 1.5rem; + font-weight: 700; + letter-spacing: 0.15em; + text-transform: uppercase; + color: var(--amber); + margin-bottom: 0.5rem; +} + +.sub { + font-size: 0.8rem; + color: var(--dim); + letter-spacing: 0.05em; +} + +.tape { + background: rgba(0, 0, 0, 0.35); + border: 1px solid rgba(212, 165, 116, 0.2); + padding: 1.25rem; + margin-bottom: 2.5rem; +} + +.tape-head { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 1rem; + font-size: 0.65rem; + letter-spacing: 0.2em; + color: var(--amber); +} + +.decode-btn { + font-family: var(--mono); + font-size: 0.7rem; + background: transparent; + border: 1px solid var(--amber); + color: var(--amber); + padding: 0.35rem 0.65rem; + cursor: pointer; + letter-spacing: 0.08em; +} + +.decode-btn:hover { + background: rgba(212, 165, 116, 0.15); +} + +.morse { + font-size: 0.85rem; + color: var(--dim); + word-break: break-all; + line-height: 1.8; + min-height: 3rem; +} + +.decoded { + margin-top: 1rem; + padding-top: 1rem; + border-top: 1px dashed rgba(212, 165, 116, 0.3); + font-size: 0.95rem; + color: var(--paper); + line-height: 1.6; +} + +.decoded.hidden { display: none; } + +.channels { margin-bottom: 2rem; } + +.channels h2 { + font-size: 0.65rem; + letter-spacing: 0.25em; + color: var(--dim); + margin-bottom: 1rem; +} + +.channels ul { list-style: none; } + +.channels li { + display: grid; + grid-template-columns: 2.5rem 1fr auto; + gap: 0.5rem; + align-items: center; + padding: 0.65rem 0; + border-bottom: 1px solid rgba(212, 165, 116, 0.1); + font-size: 0.85rem; +} + +.line-id { color: var(--dim); font-size: 0.75rem; } +.line-status { color: var(--amber); font-size: 0.7rem; letter-spacing: 0.1em; } +.line-link { + color: var(--amber); + text-decoration: none; + font-size: 0.75rem; +} + +.line-link:hover { text-decoration: underline; } + +.principles { + font-size: 0.85rem; + color: var(--dim); + margin-bottom: 2.5rem; + line-height: 1.65; +} + +.send { + padding: 1.5rem 0; + border-top: 1px solid rgba(212, 165, 116, 0.25); +} + +.send-label { + font-size: 0.65rem; + letter-spacing: 0.2em; + color: var(--dim); + margin-bottom: 0.5rem; + margin-top: 1rem; +} + +.send-label:first-child { margin-top: 0; } + +.send-addr { + font-size: 1.1rem; + color: var(--amber); + text-decoration: none; + letter-spacing: 0.05em; +} + +.send-addr:hover { text-decoration: underline; } + +footer { + position: relative; + z-index: 1; + display: flex; + justify-content: space-between; + padding: 1.5rem 2rem; + font-size: 0.7rem; + color: var(--dim); + letter-spacing: 0.08em; +} + +footer a { + color: var(--dim); + text-decoration: none; +} + +footer a:hover { color: var(--amber); } diff --git a/relay/relay.js b/relay/relay.js new file mode 100644 index 0000000..717d514 --- /dev/null +++ b/relay/relay.js @@ -0,0 +1,58 @@ +const MESSAGES = [ + { + morse: '·−·−− · ·−·−− ·−· · ·−·−− −−− · ·−·−− ·−· · ·−·−− ·−−−', + text: 'Levkin builds production software for teams under pressure. Custom systems, automation, enterprise tooling.', + }, + { + morse: '−−− ·−·−− · ·−·−− ·−· · ·−·−− ·−−− · ·−·−− ·−· · ·−·−− −−− · ·−·−− ·−· · ·−·−− ·−−−', + text: 'Error handling required. Documentation required. Tests before live data. Scope creep rejected.', + }, +]; + +const morseEl = document.getElementById('morse'); +const decodedEl = document.getElementById('decoded'); +const btn = document.getElementById('decode-btn'); +let idx = 0; +let typing = false; + +function typeMorse(text, cb) { + typing = true; + morseEl.textContent = ''; + let i = 0; + const tick = () => { + if (i < text.length) { + morseEl.textContent += text[i]; + i++; + setTimeout(tick, 35 + Math.random() * 40); + } else { + typing = false; + cb?.(); + } + }; + tick(); +} + +function showMessage() { + const msg = MESSAGES[idx % MESSAGES.length]; + decodedEl.classList.add('hidden'); + typeMorse(msg.morse, () => { + btn.disabled = false; + btn.textContent = 'Decode ↵'; + }); + btn._pending = msg; +} + +btn.addEventListener('click', () => { + if (typing) return; + if (btn._pending && decodedEl.classList.contains('hidden')) { + decodedEl.textContent = btn._pending.text; + decodedEl.classList.remove('hidden'); + btn.textContent = 'Next signal →'; + btn._pending = null; + return; + } + idx++; + showMessage(); +}); + +showMessage(); diff --git a/slab/index.html b/slab/index.html new file mode 100644 index 0000000..978b576 --- /dev/null +++ b/slab/index.html @@ -0,0 +1,73 @@ + + + + + + Levkin + + + + + + + + + + +
+
+ EST · CA +

LEV
KIN

+

SOFTWARE DEVELOPMENT

+
+ +
+

WE BUILD WHAT RUNS.

+
+ +
+
+ 01 +

CUSTOM

+

Apps · APIs · tools

+
+
+ 02 +

AUTO

+

auto.levkin.ca

+
+
+ 03 +

CASE

+

caseware.levkin.ca

+
+
+ 04 +

OPS

+

jobs.levkin.ca

+
+
+ 05 +

QE

+

iliadobkin.com

+
+
+ +
+
    +
  • PRODUCTION READY
  • +
  • DOCUMENTED
  • +
  • TESTED FIRST
  • +
  • NO SCOPE CREEP
  • +
+
+ +
+ BOOK 15 MIN → + HELLO@LEVGINE.CA → +
+
+ +
LEVKIN.CA · GIT
+ + diff --git a/slab/slab.css b/slab/slab.css new file mode 100644 index 0000000..a0d2f75 --- /dev/null +++ b/slab/slab.css @@ -0,0 +1,191 @@ +:root { + --white: #f5f5f0; + --black: #0a0a0a; + --red: #e63946; + --font-display: 'Archivo Black', system-ui, sans-serif; + --font: 'Archivo', system-ui, sans-serif; +} + +* { box-sizing: border-box; margin: 0; padding: 0; } + +html { scroll-behavior: smooth; } + +body { + font-family: var(--font); + background: var(--white); + color: var(--black); + min-height: 100vh; +} + +.back { + position: fixed; + top: 1.25rem; + left: 1.25rem; + z-index: 10; + font-size: 1.25rem; + color: var(--black); + text-decoration: none; + font-weight: 500; +} + +main { max-width: 100%; } + +.mast { + padding: 4rem 1.5rem 3rem; + border-bottom: 6px solid var(--black); +} + +.year { + font-size: 0.7rem; + letter-spacing: 0.25em; + font-weight: 500; + display: block; + margin-bottom: 2rem; +} + +.mast h1 { + font-family: var(--font-display); + font-size: clamp(4rem, 18vw, 11rem); + line-height: 0.85; + letter-spacing: -0.04em; + font-weight: 400; +} + +.role { + margin-top: 1.5rem; + font-size: 0.8rem; + letter-spacing: 0.35em; + font-weight: 500; +} + +.strip { + padding: 1.25rem 1.5rem; + border-bottom: 4px solid var(--black); +} + +.strip-red { + background: var(--red); + color: var(--white); +} + +.strip-red p { + font-family: var(--font-display); + font-size: clamp(1.25rem, 4vw, 2rem); + letter-spacing: 0.02em; +} + +.blocks { + display: grid; + grid-template-columns: 1fr 1fr; +} + +@media (max-width: 500px) { + .blocks { grid-template-columns: 1fr; } +} + +.block { + padding: 2rem 1.5rem; + border-bottom: 4px solid var(--black); + border-right: 4px solid var(--black); + min-height: 160px; +} + +.block:nth-child(2n) { border-right: none; } + +.block-wide { + grid-column: 1 / -1; + border-right: none; +} + +.block-inv { + background: var(--black); + color: var(--white); +} + +.num { + font-size: 0.65rem; + letter-spacing: 0.2em; + opacity: 0.5; + display: block; + margin-bottom: 0.75rem; +} + +.block h2 { + font-family: var(--font-display); + font-size: 2rem; + letter-spacing: -0.02em; + margin-bottom: 0.35rem; +} + +.block p { + font-size: 0.85rem; + letter-spacing: 0.05em; +} + +.block a { + color: inherit; + text-decoration: underline; + text-underline-offset: 3px; +} + +.rules { + list-style: none; + display: grid; + gap: 0.5rem; +} + +.rules li { + font-family: var(--font-display); + font-size: clamp(0.9rem, 2.5vw, 1.1rem); + letter-spacing: 0.08em; +} + +.cta-block { + padding: 3rem 1.5rem; + border-bottom: 6px solid var(--black); + display: flex; + flex-direction: column; + gap: 1.25rem; +} + +.cta { + font-family: var(--font-display); + font-size: clamp(1rem, 3vw, 1.5rem); + color: var(--black); + text-decoration: none; + letter-spacing: 0.04em; + border-bottom: 4px solid var(--red); + padding-bottom: 0.25rem; + transition: color 0.15s, border-color 0.15s; +} + +.cta:hover { + color: var(--red); + border-color: var(--black); +} + +.cta-primary { + background: var(--black); + color: var(--white); + padding: 0.5rem 0; + border-bottom-color: var(--black); +} + +.cta-primary:hover { + color: var(--red); + background: var(--black); +} + +footer { + padding: 1.25rem 1.5rem; + font-size: 0.7rem; + letter-spacing: 0.2em; + font-weight: 500; +} + +footer a { + color: var(--black); + text-decoration: none; +} + +footer a:hover { text-decoration: underline; } diff --git a/spec/index.html b/spec/index.html new file mode 100644 index 0000000..a2ed9db --- /dev/null +++ b/spec/index.html @@ -0,0 +1,153 @@ + + + + + + Levkin — Company Specification + + + + + + + + + + +
+
+

Request for Comments

+

Levkin Software Development Company

+ + + + + +
StatusACTIVE
EntityLevkin
Domainlevkin.ca
Updated2026-05-20
+
+ +
+

Abstract

+

This document describes Levkin, a Canadian software development practice specializing in production systems, business automation, and enterprise tooling. Levkin ships software that must work when nobody is watching — with error handling, documentation, and tests as non-optional requirements.

+
+ +
+

1. Scope

+

Levkin operates as a boutique engineering practice, not a body shop. Engagements are scoped, shipped, and handed off with the expectation that the client (or their next hire) can maintain what was built.

+
interface Engagement {
+  discovery: "15min call, no obligation"; // cal.levkin.ca/ilia/consult
+  delivery: "production-ready, documented";
+  maintenance: "optional, not mandatory lock-in";
+}
+
+ +
+

2. Services

+

The following endpoints represent primary service offerings. Each maps to a deployable capability.

+ +
+
+ BUILD + /custom-software +
+

Web applications, APIs, internal tools. Stack-agnostic; preference for boring, proven technology.

+
    +
  • TypeScript / Node · Python · C# / .NET
  • +
  • PostgreSQL · SQL Server · SQLite
  • +
  • React · Vue · server-rendered where appropriate
  • +
+
+ +
+
+ BUILD + /automation + auto.levkin.ca +
+

n8n, Zapier, Make, GitHub Actions, webhooks, LLM integrations. Scripts that save hours; pipelines that run operations.

+
+ +
+
+ BUILD + /caseware + caseware.levkin.ca +
+

CaseWare & CaseView development, templates, release automation. 15+ years inside the ecosystem.

+
+ +
+
+ BUILD + /quality-engineering + iliadobkin.com +
+

Test automation, CI/CD, trace-driven debugging. Contract SDET services available.

+
+
+ +
+

3. Required Properties

+

All Levkin deliverables MUST satisfy the following constraints unless explicitly waived in writing.

+ + + + + + + + + + +
PropertyRequirementRationale
reliabilityRetries, alerts, graceful degradationProduction ≠ demo
documentationRunbook or README sufficient for handoffBus factor > 1
testabilityAutomated tests before live dataRegressions are expensive
pragmatismSmallest solution that solves the problem20-line script > 200-node workflow
+
+ +
+

4. Registered Subdomains

+ + + + + + + + + + + +
HostPurposeStatus
auto.levkin.caBusiness automationlive
caseware.levkin.caCaseWare consultinglive
jobs.levkin.caJob orchestration (internal)auth
git.levkin.caSource controllive
iliadobkin.comSDET portfolio · quality engineeringlive
+
+ +
+

5. Contact

+

To initiate an engagement, send a POST to the following channel:

+ + +
+
+ + + + diff --git a/spec/spec.css b/spec/spec.css new file mode 100644 index 0000000..0a5aa9f --- /dev/null +++ b/spec/spec.css @@ -0,0 +1,287 @@ +:root { + --paper: #f4f1ec; + --ink: #1a1a18; + --muted: #5c5a56; + --rule: #d4cfc6; + --accent: #2a4a6b; + --accent-bg: #e8eef4; + --mono: 'IBM Plex Mono', ui-monospace, monospace; + --serif: 'Literata', Georgia, serif; +} + +* { box-sizing: border-box; margin: 0; padding: 0; } + +body { + display: grid; + grid-template-columns: 200px 1fr; + min-height: 100vh; + background: var(--paper); + color: var(--ink); + font-family: var(--serif); + font-size: 1.05rem; + line-height: 1.65; +} + +@media (max-width: 800px) { + body { grid-template-columns: 1fr; } + .toc { + position: static !important; + border-bottom: 1px solid var(--rule); + padding: 1rem 1.5rem !important; + } + .toc nav { display: flex; flex-wrap: wrap; gap: 0.5rem 1rem; } + .toc .meta { display: none; } +} + +.toc { + position: sticky; + top: 0; + height: 100vh; + padding: 2rem 1.25rem; + border-right: 1px solid var(--rule); + font-family: var(--mono); + font-size: 0.7rem; +} + +.back { + display: block; + color: var(--muted); + text-decoration: none; + margin-bottom: 1.5rem; +} + +.back:hover { color: var(--accent); } + +.toc nav { + display: flex; + flex-direction: column; + gap: 0.35rem; +} + +.toc nav a { + color: var(--ink); + text-decoration: none; +} + +.toc nav a:hover { color: var(--accent); } + +.meta { + margin-top: 2rem; + color: var(--muted); + line-height: 1.5; +} + +.rfc { + max-width: 42rem; + padding: 3rem 2.5rem 5rem; +} + +@media (max-width: 600px) { + .rfc { padding: 2rem 1.25rem 4rem; } +} + +.rfc-header { + margin-bottom: 2.5rem; + padding-bottom: 1.5rem; + border-bottom: 2px solid var(--ink); +} + +.category { + font-family: var(--mono); + font-size: 0.7rem; + letter-spacing: 0.1em; + text-transform: uppercase; + color: var(--muted); + margin-bottom: 0.5rem; +} + +.rfc-header h1 { + font-size: 1.75rem; + font-weight: 600; + line-height: 1.25; + margin-bottom: 1.25rem; +} + +.rfc-meta { + width: 100%; + font-size: 0.85rem; + border-collapse: collapse; +} + +.rfc-meta th { + text-align: left; + font-family: var(--mono); + font-weight: 500; + color: var(--muted); + padding: 0.25rem 1rem 0.25rem 0; + width: 5rem; +} + +.badge { + font-family: var(--mono); + font-size: 0.65rem; + padding: 0.15rem 0.45rem; + background: #d4edda; + color: #1e5631; + letter-spacing: 0.04em; +} + +.badge.muted { + background: var(--rule); + color: var(--muted); +} + +section { + margin-bottom: 2.5rem; + scroll-margin-top: 2rem; +} + +section h2 { + font-size: 1.15rem; + font-weight: 600; + margin-bottom: 0.75rem; + display: flex; + align-items: baseline; + gap: 0.35rem; +} + +.sec-num { font-family: var(--mono); font-weight: 500; color: var(--muted); } + +section p { margin-bottom: 0.75rem; color: var(--ink); } + +.code-block { + background: var(--accent-bg); + border: 1px solid var(--rule); + padding: 1rem 1.25rem; + margin: 1rem 0; + overflow-x: auto; +} + +.code-block code { + font-family: var(--mono); + font-size: 0.8rem; + line-height: 1.5; + color: var(--accent); +} + +.endpoint { + border: 1px solid var(--rule); + margin: 1.25rem 0; + background: #fff; +} + +.endpoint-head { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 0.5rem 0.75rem; + padding: 0.75rem 1rem; + background: var(--accent-bg); + border-bottom: 1px solid var(--rule); + font-family: var(--mono); + font-size: 0.8rem; +} + +.method { + font-weight: 600; + color: #1e5631; + background: #d4edda; + padding: 0.15rem 0.4rem; + font-size: 0.7rem; +} + +.path { color: var(--accent); font-weight: 500; } + +.ext { margin-left: auto; font-size: 0.75rem; } +.ext a { color: var(--muted); } + +.endpoint > p, +.endpoint > ul { + padding: 0.75rem 1rem; + font-size: 0.95rem; +} + +.endpoint ul { + padding-top: 0; + padding-left: 2rem; + color: var(--muted); + font-size: 0.85rem; +} + +.spec-table { + width: 100%; + border-collapse: collapse; + font-size: 0.9rem; + margin-top: 0.75rem; +} + +.spec-table th, +.spec-table td { + border: 1px solid var(--rule); + padding: 0.5rem 0.75rem; + text-align: left; +} + +.spec-table th { + font-family: var(--mono); + font-size: 0.75rem; + background: var(--accent-bg); + font-weight: 500; +} + +.spec-table code { + font-family: var(--mono); + font-size: 0.8rem; + color: var(--accent); +} + +.spec-table a { color: var(--accent); } + +.contact-grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 1rem; + margin: 1.25rem 0; +} + +@media (max-width: 500px) { + .contact-grid { grid-template-columns: 1fr; } +} + +.contact-card { + display: flex; + flex-direction: column; + gap: 0.25rem; + padding: 1rem; + border: 2px solid var(--ink); + text-decoration: none; + color: var(--ink); + font-family: var(--mono); + font-size: 0.85rem; + transition: background 0.15s; +} + +.contact-card:hover { + background: var(--accent-bg); +} + +.method.post { + font-weight: 600; + color: #8b4513; + background: #fde8d8; + align-self: flex-start; + padding: 0.1rem 0.35rem; + font-size: 0.65rem; +} + +.contact-card .desc { + font-family: var(--serif); + font-size: 0.9rem; + color: var(--muted); +} + +.copyright { + font-size: 0.8rem; + color: var(--muted); + margin-top: 2rem; +} diff --git a/spec/spec.js b/spec/spec.js new file mode 100644 index 0000000..076660d --- /dev/null +++ b/spec/spec.js @@ -0,0 +1,17 @@ +const sections = document.querySelectorAll('section[id]'); +const links = document.querySelectorAll('.toc nav a'); + +const observer = new IntersectionObserver( + (entries) => { + entries.forEach((entry) => { + if (!entry.isIntersecting) return; + links.forEach((a) => { + a.style.fontWeight = a.getAttribute('href') === `#${entry.target.id}` ? '600' : ''; + a.style.color = a.getAttribute('href') === `#${entry.target.id}` ? 'var(--accent)' : ''; + }); + }); + }, + { rootMargin: '-30% 0px -60% 0px' } +); + +sections.forEach((s) => observer.observe(s)); diff --git a/vault/index.html b/vault/index.html new file mode 100644 index 0000000..641d32e --- /dev/null +++ b/vault/index.html @@ -0,0 +1,88 @@ + + + + + + Levkin — Software Development + + + + + + + + +
+ + +
+

Chartered software practice · Canada

+

Built to hold.
Built to hand off.

+

Levkin develops production systems, automation, and enterprise software for organizations that cannot afford failure in the field.

+
+ +
+ +
+
+

Custom software

+

Applications, APIs, and internal platforms engineered for longevity and auditability.

+
+
+

Automation

+

Operational pipelines and integrations. auto.levkin.ca

+
+
+

CaseWare practice

+

Fifteen years in audit and accounting systems. caseware.levkin.ca

+
+
+

Internal operations

+

Restricted orchestration systems. jobs.levkin.ca

+
+
+

Quality engineering

+

SDET portfolio — test automation, CI/CD, trace-driven QA. iliadobkin.com

+
+
+
+ +
+ +
    +
  • § Reliability is documented, not assumed
  • +
  • § Every deliverable includes a handoff path
  • +
  • § Tests precede production data
  • +
  • § Scope changes require explicit amendment
  • +
+
+ +
+ +
    +
  1. Discovery — Understand constraints and stakeholders
  2. +
  3. Proposal — Fixed scope, timeline, and cost
  4. +
  5. Delivery — Production-ready, tested, documented
  6. +
  7. Transition — Optional stewardship or clean exit
  8. +
+
+ +
+
+

Open an enquiry

+ Book 15 min consultation + hello@levkine.ca +

Remote · North America & Europe

+
+
+ + +
+ + diff --git a/vault/vault.css b/vault/vault.css new file mode 100644 index 0000000..1205ef5 --- /dev/null +++ b/vault/vault.css @@ -0,0 +1,242 @@ +:root { + --forest: #0c1410; + --forest-mid: #142820; + --brass: #c9b896; + --brass-dim: rgba(201, 184, 150, 0.5); + --cream: #f0ebe3; + --muted: #7a8f82; + --serif: 'Cormorant Garamond', Georgia, serif; + --sans: 'Source Sans 3', system-ui, sans-serif; +} + +* { box-sizing: border-box; margin: 0; padding: 0; } + +body { + font-family: var(--sans); + background: var(--forest); + color: var(--cream); + min-height: 100vh; + line-height: 1.6; +} + +.frame { + max-width: 680px; + margin: 0 auto; + padding: 0 2rem 4rem; + border-left: 1px solid var(--brass-dim); + border-right: 1px solid var(--brass-dim); + min-height: 100vh; + background: linear-gradient(180deg, var(--forest-mid) 0%, var(--forest) 30%); +} + +.nav { + display: flex; + justify-content: space-between; + align-items: center; + padding: 1.5rem 0; + border-bottom: 1px solid var(--brass-dim); + font-size: 0.8rem; +} + +.nav-back { + color: var(--muted); + text-decoration: none; + letter-spacing: 0.04em; +} + +.nav-back:hover { color: var(--brass); } + +.seal { + font-family: var(--serif); + font-size: 1.1rem; + font-weight: 600; + color: var(--brass); + letter-spacing: 0.12em; +} + +.hero { + padding: 3.5rem 0 3rem; + border-bottom: 1px solid var(--brass-dim); +} + +.charter { + font-size: 0.72rem; + letter-spacing: 0.2em; + text-transform: uppercase; + color: var(--muted); + margin-bottom: 1.25rem; +} + +.hero h1 { + font-family: var(--serif); + font-size: clamp(2rem, 6vw, 2.75rem); + font-weight: 500; + line-height: 1.2; + margin-bottom: 1.25rem; + color: var(--cream); +} + +.hero h1 em { + font-style: italic; + color: var(--brass); +} + +.lead { + font-size: 1.05rem; + color: var(--muted); + max-width: 40ch; + line-height: 1.65; +} + +.section-label { + font-family: var(--serif); + font-size: 0.85rem; + font-weight: 600; + letter-spacing: 0.25em; + text-transform: uppercase; + color: var(--brass); + margin-bottom: 1.25rem; + padding-top: 2.5rem; +} + +.holdings { padding-bottom: 1rem; } + +.holding-grid { + display: grid; + gap: 1px; + background: var(--brass-dim); +} + +.holding { + background: var(--forest); + padding: 1.35rem 1.25rem; +} + +.holding h3 { + font-family: var(--serif); + font-size: 1.2rem; + font-weight: 600; + color: var(--brass); + margin-bottom: 0.35rem; +} + +.holding p { + font-size: 0.9rem; + color: var(--muted); +} + +.holding a { + color: var(--brass); + text-decoration: none; +} + +.holding a:hover { text-decoration: underline; } + +.covenant ul { + list-style: none; +} + +.covenant li { + padding: 0.6rem 0; + border-bottom: 1px solid rgba(201, 184, 150, 0.12); + font-size: 0.95rem; + color: var(--muted); + display: flex; + gap: 0.75rem; +} + +.mark { + color: var(--brass); + font-family: var(--serif); +} + +.process ol { + list-style: none; + counter-reset: step; +} + +.process li { + counter-increment: step; + padding: 0.75rem 0; + border-bottom: 1px solid rgba(201, 184, 150, 0.12); + font-size: 0.9rem; + color: var(--muted); + padding-left: 2rem; + position: relative; +} + +.process li::before { + content: counter(step, decimal-leading-zero); + position: absolute; + left: 0; + font-family: var(--serif); + color: var(--brass); + font-size: 0.85rem; +} + +.process strong { + color: var(--cream); + font-weight: 500; +} + +.contact { + padding: 3rem 0 2rem; +} + +.contact-panel { + border: 1px solid var(--brass); + padding: 2rem; + text-align: center; + background: rgba(201, 184, 150, 0.04); +} + +.contact-title { + font-family: var(--serif); + font-size: 0.9rem; + letter-spacing: 0.15em; + text-transform: uppercase; + color: var(--brass); + margin-bottom: 0.75rem; +} + +.contact-email { + font-family: var(--serif); + font-size: 1.5rem; + color: var(--cream); + text-decoration: none; + display: inline-block; + margin-bottom: 0.5rem; +} + +.contact-email:hover { color: var(--brass); } + +.contact-email-secondary { + display: block; + font-size: 1rem; + margin-top: 0.75rem; + color: var(--muted); +} + +.contact-email-secondary:hover { color: var(--brass); } + +.contact-note { + font-size: 0.8rem; + color: var(--muted); +} + +footer { + display: flex; + justify-content: space-between; + padding-top: 2rem; + border-top: 1px solid var(--brass-dim); + font-size: 0.75rem; + color: var(--muted); + letter-spacing: 0.04em; +} + +footer a { + color: var(--muted); + text-decoration: none; +} + +footer a:hover { color: var(--brass); } diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..04951e7 --- /dev/null +++ b/vite.config.js @@ -0,0 +1,16 @@ +import { resolve } from 'path'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + build: { + rollupOptions: { + input: { + main: resolve(__dirname, 'index.html'), + spec: resolve(__dirname, 'spec/index.html'), + slab: resolve(__dirname, 'slab/index.html'), + relay: resolve(__dirname, 'relay/index.html'), + vault: resolve(__dirname, 'vault/index.html'), + }, + }, + }, +});