set up for matrix
This commit is contained in:
parent
c12b9f47fd
commit
2a0f022e3f
@ -1,22 +1,15 @@
|
|||||||
|
|
||||||
import { defineConfig } from 'astro/config';
|
import { defineConfig } from 'astro/config';
|
||||||
|
|
||||||
import cloudflare from '@astrojs/cloudflare';
|
import cloudflare from '@astrojs/cloudflare';
|
||||||
|
|
||||||
|
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
|
|
||||||
|
|
||||||
output: 'server',
|
output: 'server',
|
||||||
adapter: cloudflare({
|
adapter: cloudflare({
|
||||||
|
|
||||||
platformProxy: { enabled: true },
|
platformProxy: { enabled: true },
|
||||||
}),
|
}),
|
||||||
vite: {
|
vite: {
|
||||||
server: {
|
server: {
|
||||||
watch: {
|
watch: {
|
||||||
|
|
||||||
|
|
||||||
ignored: ['**/.wrangler/**', '**/.dev.vars', '**/.mf/**'],
|
ignored: ['**/.wrangler/**', '**/.dev.vars', '**/.mf/**'],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
1
public/.well-known/matrix/client
Normal file
1
public/.well-known/matrix/client
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"m.homeserver":{"base_url":"https://continuwuity.zachy.cc"}}
|
||||||
1
public/.well-known/matrix/server
Normal file
1
public/.well-known/matrix/server
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"m.server":"continuwuity.zachy.cc:443"}
|
||||||
4
public/_headers
Normal file
4
public/_headers
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
/.well-known/matrix/*
|
||||||
|
Content-Type: application/json
|
||||||
|
Access-Control-Allow-Origin: *
|
||||||
|
Cache-Control: public, max-age=3600
|
||||||
@ -1,24 +1,4 @@
|
|||||||
#!/usr/bin/env node
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
import { execFileSync } from "node:child_process";
|
import { execFileSync } from "node:child_process";
|
||||||
import {
|
import {
|
||||||
@ -53,7 +33,6 @@ const LOADER_BY_EXT = {
|
|||||||
".jsx": "jsx", ".tsx": "tsx",
|
".jsx": "jsx", ".tsx": "tsx",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
const KW_REGEX = new Set([
|
const KW_REGEX = new Set([
|
||||||
"return", "typeof", "instanceof", "in", "of", "yield", "await", "case",
|
"return", "typeof", "instanceof", "in", "of", "yield", "await", "case",
|
||||||
"delete", "void", "throw", "new", "do", "else",
|
"delete", "void", "throw", "new", "do", "else",
|
||||||
@ -77,38 +56,75 @@ process.on("SIGINT", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function stripJs(code, { lineComments = true, stats } = {}) {
|
function stripJs(code, { lineComments = true, stats } = {}) {
|
||||||
const out = [];
|
const out = [];
|
||||||
const n = code.length;
|
const n = code.length;
|
||||||
let i = 0;
|
let i = 0;
|
||||||
let state = "code";
|
let state = "code";
|
||||||
const frames = [];
|
const frames = [];
|
||||||
let braceDepth = 0;
|
let braceDepth = 0;
|
||||||
let inClass = false;
|
let inClass = false;
|
||||||
let lastSig = "";
|
let lastSig = "";
|
||||||
let lastWord = "";
|
let lastWord = "";
|
||||||
|
let lineStart = 0;
|
||||||
|
let lineContentEnd = 0;
|
||||||
|
let skipTerminator = false;
|
||||||
|
|
||||||
|
const truncateTo = (idx) => {
|
||||||
|
out.length = idx;
|
||||||
|
lastSig = "";
|
||||||
|
lastWord = "";
|
||||||
|
for (let j = idx - 1; j >= 0; j--) {
|
||||||
|
const ch = out[j];
|
||||||
|
if (/\s/.test(ch)) continue;
|
||||||
|
lastSig = ch;
|
||||||
|
let k = j;
|
||||||
|
while (k >= 0 && /[A-Za-z0-9_$]/.test(out[k])) k--;
|
||||||
|
lastWord = out.slice(k + 1, j + 1).join("");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const emit = (s) => {
|
const emit = (s) => {
|
||||||
for (const ch of s) {
|
for (const ch of s) {
|
||||||
out.push(ch);
|
out.push(ch);
|
||||||
if (/\s/.test(ch)) continue;
|
if (ch === "\n") {
|
||||||
lastSig = ch;
|
lineStart = lineContentEnd = out.length;
|
||||||
if (/[A-Za-z0-9_$]/.test(ch)) lastWord += ch;
|
} else if (/\s/.test(ch)) {
|
||||||
else lastWord = "";
|
} else {
|
||||||
|
lastSig = ch;
|
||||||
|
if (/[A-Za-z0-9_$]/.test(ch)) lastWord += ch;
|
||||||
|
else lastWord = "";
|
||||||
|
lineContentEnd = out.length;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const nextOnLine = (idx) => {
|
||||||
|
while (idx < n && (code[idx] === " " || code[idx] === "\t" || code[idx] === "\r")) idx++;
|
||||||
|
if (idx >= n || code[idx] === "\n") return "";
|
||||||
|
return code[idx];
|
||||||
|
};
|
||||||
|
|
||||||
while (i < n) {
|
while (i < n) {
|
||||||
const c = code[i];
|
const c = code[i];
|
||||||
const nx = code[i + 1];
|
const nx = code[i + 1];
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case "code":
|
case "code":
|
||||||
|
if (skipTerminator && (c === "\r" || c === "\n")) {
|
||||||
|
skipTerminator = false;
|
||||||
|
if (c === "\r" && nx === "\n") i += 2;
|
||||||
|
else i++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
if (c === "/" && nx === "/" && lineComments) {
|
if (c === "/" && nx === "/" && lineComments) {
|
||||||
if (stats) stats.removed++;
|
if (stats) stats.removed++;
|
||||||
|
if (lineContentEnd === lineStart) {
|
||||||
|
truncateTo(lineStart);
|
||||||
|
skipTerminator = true;
|
||||||
|
} else {
|
||||||
|
truncateTo(lineContentEnd);
|
||||||
|
}
|
||||||
state = "line";
|
state = "line";
|
||||||
i += 2;
|
i += 2;
|
||||||
} else if (c === "/" && nx === "*") {
|
} else if (c === "/" && nx === "*") {
|
||||||
@ -154,9 +170,13 @@ function stripJs(code, { lineComments = true, stats } = {}) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "line":
|
case "line":
|
||||||
if (c === "\r" || c === "\n") {
|
if (c === "\r" || c === "\n") {
|
||||||
if (c === "\r" && nx === "\n") {
|
if (skipTerminator) {
|
||||||
|
skipTerminator = false;
|
||||||
|
if (c === "\r" && nx === "\n") i += 2;
|
||||||
|
else i++;
|
||||||
|
} else if (c === "\r" && nx === "\n") {
|
||||||
emit("\r\n");
|
emit("\r\n");
|
||||||
i += 2;
|
i += 2;
|
||||||
} else {
|
} else {
|
||||||
@ -169,11 +189,21 @@ function stripJs(code, { lineComments = true, stats } = {}) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "block":
|
case "block":
|
||||||
if (c === "*" && nx === "/") {
|
if (c === "*" && nx === "/") {
|
||||||
emit(" ");
|
|
||||||
i += 2;
|
i += 2;
|
||||||
state = "code";
|
state = "code";
|
||||||
|
if (lineContentEnd === lineStart) {
|
||||||
|
truncateTo(lineStart);
|
||||||
|
skipTerminator = nextOnLine(i) === "";
|
||||||
|
} else {
|
||||||
|
truncateTo(lineContentEnd);
|
||||||
|
const prev = out[lineContentEnd - 1];
|
||||||
|
const next = nextOnLine(i);
|
||||||
|
if (prev !== undefined && next && /[A-Za-z0-9_$'"`]/.test(prev) && /[A-Za-z0-9_$'"`]/.test(next)) {
|
||||||
|
emit(" ");
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
@ -239,8 +269,6 @@ function stripCss(code, stats) {
|
|||||||
return stripJs(code, { lineComments: false, stats });
|
return stripJs(code, { lineComments: false, stats });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function stripAstro(code, stats, parts) {
|
function stripAstro(code, stats, parts) {
|
||||||
let rest = code;
|
let rest = code;
|
||||||
let head = "";
|
let head = "";
|
||||||
@ -304,9 +332,6 @@ function stripAstro(code, stats, parts) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function collect() {
|
function collect() {
|
||||||
const out = [];
|
const out = [];
|
||||||
const walk = (dir) => {
|
const walk = (dir) => {
|
||||||
@ -343,8 +368,6 @@ function stripFile(rel) {
|
|||||||
return { rel, src, out, stats, parts, changed: src !== out };
|
return { rel, src, out, stats, parts, changed: src !== out };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
async function validate(r) {
|
async function validate(r) {
|
||||||
const problems = [];
|
const problems = [];
|
||||||
for (const { code, loader, label } of r.parts) {
|
for (const { code, loader, label } of r.parts) {
|
||||||
@ -365,9 +388,6 @@ async function validate(r) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
async function main() {
|
async function main() {
|
||||||
if (DRY) {
|
if (DRY) {
|
||||||
console.log("dry run — stripping in memory, touching nothing\n");
|
console.log("dry run — stripping in memory, touching nothing\n");
|
||||||
@ -424,8 +444,6 @@ async function main() {
|
|||||||
try {
|
try {
|
||||||
execFileSync("git", ["add", "-A"], { stdio: "inherit" });
|
execFileSync("git", ["add", "-A"], { stdio: "inherit" });
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
let hasChanges = true;
|
let hasChanges = true;
|
||||||
try {
|
try {
|
||||||
execFileSync("git", ["diff", "--cached", "--quiet"], { stdio: "pipe" });
|
execFileSync("git", ["diff", "--cached", "--quiet"], { stdio: "pipe" });
|
||||||
|
|||||||
@ -12,7 +12,6 @@ function mulberry32(a) {
|
|||||||
}
|
}
|
||||||
const rand = mulberry32(20260906);
|
const rand = mulberry32(20260906);
|
||||||
|
|
||||||
|
|
||||||
const shades = [
|
const shades = [
|
||||||
[0x60, 0x47, 0x2b],
|
[0x60, 0x47, 0x2b],
|
||||||
[0x6b, 0x4f, 0x30], [0x6b, 0x4f, 0x30], [0x6b, 0x4f, 0x30],
|
[0x6b, 0x4f, 0x30], [0x6b, 0x4f, 0x30], [0x6b, 0x4f, 0x30],
|
||||||
@ -26,10 +25,8 @@ const grid = new Array(W * H);
|
|||||||
const wrap = (v, m) => ((v % m) + m) % m;
|
const wrap = (v, m) => ((v % m) + m) % m;
|
||||||
const idx = (x, y) => wrap(y, H) * W + wrap(x, W);
|
const idx = (x, y) => wrap(y, H) * W + wrap(x, W);
|
||||||
|
|
||||||
|
|
||||||
for (let i = 0; i < W * H; i++) grid[i] = shades[Math.floor(rand() * shades.length)];
|
for (let i = 0; i < W * H; i++) grid[i] = shades[Math.floor(rand() * shades.length)];
|
||||||
|
|
||||||
|
|
||||||
for (let pass = 0; pass < 3; pass++) {
|
for (let pass = 0; pass < 3; pass++) {
|
||||||
const next = grid.slice();
|
const next = grid.slice();
|
||||||
for (let y = 0; y < H; y++)
|
for (let y = 0; y < H; y++)
|
||||||
@ -43,7 +40,6 @@ for (let pass = 0; pass < 3; pass++) {
|
|||||||
for (let i = 0; i < W * H; i++) grid[i] = next[i];
|
for (let i = 0; i < W * H; i++) grid[i] = next[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const dark = [0x40, 0x2e, 0x1b];
|
const dark = [0x40, 0x2e, 0x1b];
|
||||||
const darker = [0x33, 0x24, 0x14];
|
const darker = [0x33, 0x24, 0x14];
|
||||||
const light = [0x9c, 0x7c, 0x54];
|
const light = [0x9c, 0x7c, 0x54];
|
||||||
|
|||||||
@ -1,5 +1,3 @@
|
|||||||
|
|
||||||
|
|
||||||
import { execFileSync } from "node:child_process";
|
import { execFileSync } from "node:child_process";
|
||||||
import { mkdtempSync, readFileSync, rmSync } from "node:fs";
|
import { mkdtempSync, readFileSync, rmSync } from "node:fs";
|
||||||
import { tmpdir } from "node:os";
|
import { tmpdir } from "node:os";
|
||||||
@ -14,7 +12,6 @@ try {
|
|||||||
const pngs = [];
|
const pngs = [];
|
||||||
for (const s of sizes) {
|
for (const s of sizes) {
|
||||||
const out = join(tmp, `${s}.png`);
|
const out = join(tmp, `${s}.png`);
|
||||||
|
|
||||||
await sharp(svg, { density: 384 })
|
await sharp(svg, { density: 384 })
|
||||||
.resize(s, s, { fit: "contain", background: { r: 0, g: 0, b: 0, alpha: 0 } })
|
.resize(s, s, { fit: "contain", background: { r: 0, g: 0, b: 0, alpha: 0 } })
|
||||||
.png()
|
.png()
|
||||||
@ -22,7 +19,6 @@ try {
|
|||||||
pngs.push(out);
|
pngs.push(out);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
execFileSync("magick", [...pngs, "public/favicon.ico"], { stdio: "inherit" });
|
execFileSync("magick", [...pngs, "public/favicon.ico"], { stdio: "inherit" });
|
||||||
console.log(`wrote public/favicon.ico (${sizes.join(", ")} px)`);
|
console.log(`wrote public/favicon.ico (${sizes.join(", ")} px)`);
|
||||||
} finally {
|
} finally {
|
||||||
|
|||||||
@ -1,12 +1,3 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
import { createServer } from "node:http";
|
import { createServer } from "node:http";
|
||||||
import { appendFileSync, readFileSync, writeFileSync, existsSync } from "node:fs";
|
import { appendFileSync, readFileSync, writeFileSync, existsSync } from "node:fs";
|
||||||
|
|
||||||
@ -71,7 +62,6 @@ const server = createServer(async (req, res) => {
|
|||||||
`SPOTIFY_CLIENT_SECRET=${clientSecret}\n` +
|
`SPOTIFY_CLIENT_SECRET=${clientSecret}\n` +
|
||||||
`SPOTIFY_REFRESH_TOKEN=${data.refresh_token}\n`;
|
`SPOTIFY_REFRESH_TOKEN=${data.refresh_token}\n`;
|
||||||
|
|
||||||
|
|
||||||
if (existsSync(".dev.vars")) {
|
if (existsSync(".dev.vars")) {
|
||||||
const cur = readFileSync(".dev.vars", "utf8").replace(/^SPOTIFY_[A-Z_]+=.*$/gm, "").replace(/\n{3,}/g, "\n\n");
|
const cur = readFileSync(".dev.vars", "utf8").replace(/^SPOTIFY_[A-Z_]+=.*$/gm, "").replace(/\n{3,}/g, "\n\n");
|
||||||
writeFileSync(".dev.vars", cur.trimEnd() + "\n" + block);
|
writeFileSync(".dev.vars", cur.trimEnd() + "\n" + block);
|
||||||
|
|||||||
@ -3,22 +3,19 @@ import { buttons, site } from "../data/site";
|
|||||||
import CopyText from "./CopyText.astro";
|
import CopyText from "./CopyText.astro";
|
||||||
import Egg from "./Egg.astro";
|
import Egg from "./Egg.astro";
|
||||||
|
|
||||||
|
|
||||||
const rnd = (i: number, seed: number) => {
|
const rnd = (i: number, seed: number) => {
|
||||||
const x = Math.sin((i + 1) * 127.1 + seed * 311.7) * 43758.5453;
|
const x = Math.sin((i + 1) * 127.1 + seed * 311.7) * 43758.5453;
|
||||||
return x - Math.floor(x);
|
return x - Math.floor(x);
|
||||||
};
|
};
|
||||||
const r1 = (i: number, seed: number, spread: number) =>
|
const r1 = (i: number, seed: number, spread: number) =>
|
||||||
Math.round((rnd(i, seed) - 0.5) * spread * 100) / 100;
|
Math.round((rnd(i, seed) - 0.5) * spread * 100) / 100;
|
||||||
|
|
||||||
const PINS = [
|
const PINS = [
|
||||||
["#ff9a9a", "#d64545", "#7a1f1f"],
|
["#ff9a9a", "#d64545", "#7a1f1f"],
|
||||||
["#9ec9ff", "#4a7fd6", "#1f3f7a"],
|
["#9ec9ff", "#4a7fd6", "#1f3f7a"],
|
||||||
["#ffd98a", "#e0a83c", "#8a5f16"],
|
["#ffd98a", "#e0a83c", "#8a5f16"],
|
||||||
["#a8e6b0", "#4caf68", "#1f5c33"],
|
["#a8e6b0", "#4caf68", "#1f5c33"],
|
||||||
["#d9b8ff", "#9a6cff", "#4a2f8a"],
|
["#d9b8ff", "#9a6cff", "#4a2f8a"],
|
||||||
];
|
];
|
||||||
|
|
||||||
const scatter = (i: number) => {
|
const scatter = (i: number) => {
|
||||||
const [pl, pb, pd] = PINS[i % PINS.length];
|
const [pl, pb, pd] = PINS[i % PINS.length];
|
||||||
return `--t:${r1(i, 1, 12)}deg;--x:${r1(i, 2, 14)}px;--y:${r1(i, 3, 12)}px;--pl:${pl};--pb:${pb};--pd:${pd}`;
|
return `--t:${r1(i, 1, 12)}deg;--x:${r1(i, 2, 14)}px;--y:${r1(i, 3, 12)}px;--pl:${pl};--pb:${pb};--pd:${pd}`;
|
||||||
@ -132,7 +129,6 @@ const badgeUrl = `https://${site.domain}/badges/zachy.gif`;
|
|||||||
</section>
|
</section>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
|
|
||||||
.badges__trigger {
|
.badges__trigger {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@ -191,9 +187,8 @@ const badgeUrl = `https://${site.domain}/badges/zachy.gif`;
|
|||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.wall {
|
.wall {
|
||||||
margin: auto;
|
margin: auto;
|
||||||
width: min(34rem, calc(100vw - 1.5rem));
|
width: min(34rem, calc(100vw - 1.5rem));
|
||||||
max-height: min(80vh, 40rem);
|
max-height: min(80vh, 40rem);
|
||||||
padding: 0;
|
padding: 0;
|
||||||
@ -261,7 +256,6 @@ const badgeUrl = `https://${site.domain}/badges/zachy.gif`;
|
|||||||
min-width: 0;
|
min-width: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.pile {
|
.pile {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
@ -272,7 +266,6 @@ const badgeUrl = `https://${site.domain}/badges/zachy.gif`;
|
|||||||
margin: 0.9rem;
|
margin: 0.9rem;
|
||||||
padding: 2.6rem 1.8rem 2.1rem;
|
padding: 2.6rem 1.8rem 2.1rem;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
|
|
||||||
background-color: #6b4f30;
|
background-color: #6b4f30;
|
||||||
background-image:
|
background-image:
|
||||||
radial-gradient(120% 80% at 50% 0%, rgba(0, 0, 0, 0) 52%, rgba(0, 0, 0, 0.32) 100%),
|
radial-gradient(120% 80% at 50% 0%, rgba(0, 0, 0, 0) 52%, rgba(0, 0, 0, 0.32) 100%),
|
||||||
@ -295,7 +288,6 @@ const badgeUrl = `https://${site.domain}/badges/zachy.gif`;
|
|||||||
transform: translate(var(--x), var(--y)) rotate(var(--t));
|
transform: translate(var(--x), var(--y)) rotate(var(--t));
|
||||||
transition: transform 0.4s cubic-bezier(0.17, 0.89, 0.32, 1.28);
|
transition: transform 0.4s cubic-bezier(0.17, 0.89, 0.32, 1.28);
|
||||||
}
|
}
|
||||||
|
|
||||||
.badge::before {
|
.badge::before {
|
||||||
content: "";
|
content: "";
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@ -320,12 +312,11 @@ const badgeUrl = `https://${site.domain}/badges/zachy.gif`;
|
|||||||
.badge:hover,
|
.badge:hover,
|
||||||
.badge:focus-visible {
|
.badge:focus-visible {
|
||||||
z-index: 3;
|
z-index: 3;
|
||||||
|
|
||||||
transform: translate(var(--x), calc(var(--y) - 5px)) rotate(0deg) scale(1.2);
|
transform: translate(var(--x), calc(var(--y) - 5px)) rotate(0deg) scale(1.2);
|
||||||
}
|
}
|
||||||
.badge:hover::before,
|
.badge:hover::before,
|
||||||
.badge:focus-visible::before {
|
.badge:focus-visible::before {
|
||||||
top: 3px;
|
top: 3px;
|
||||||
}
|
}
|
||||||
.badge:focus-visible {
|
.badge:focus-visible {
|
||||||
outline: 2px solid var(--accent);
|
outline: 2px solid var(--accent);
|
||||||
@ -355,7 +346,7 @@ const badgeUrl = `https://${site.domain}/badges/zachy.gif`;
|
|||||||
filter: none;
|
filter: none;
|
||||||
border-color: var(--muted);
|
border-color: var(--muted);
|
||||||
box-shadow: 0 12px 24px -8px rgba(0, 0, 0, 0.7);
|
box-shadow: 0 12px 24px -8px rgba(0, 0, 0, 0.7);
|
||||||
z-index: 10;
|
z-index: 10;
|
||||||
}
|
}
|
||||||
.badge__img--still {
|
.badge__img--still {
|
||||||
display: none;
|
display: none;
|
||||||
@ -385,8 +376,6 @@ const badgeUrl = `https://${site.domain}/badges/zachy.gif`;
|
|||||||
const open = document.querySelector<HTMLButtonElement>("[data-badges-open]");
|
const open = document.querySelector<HTMLButtonElement>("[data-badges-open]");
|
||||||
const close = document.querySelector<HTMLButtonElement>("[data-badges-close]");
|
const close = document.querySelector<HTMLButtonElement>("[data-badges-close]");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
let embedsLoaded = false;
|
let embedsLoaded = false;
|
||||||
const loadEmbeds = () => {
|
const loadEmbeds = () => {
|
||||||
if (embedsLoaded) return;
|
if (embedsLoaded) return;
|
||||||
@ -403,7 +392,6 @@ const badgeUrl = `https://${site.domain}/badges/zachy.gif`;
|
|||||||
});
|
});
|
||||||
close?.addEventListener("click", () => dialog?.close());
|
close?.addEventListener("click", () => dialog?.close());
|
||||||
|
|
||||||
|
|
||||||
dialog?.addEventListener("click", (e) => {
|
dialog?.addEventListener("click", (e) => {
|
||||||
if (e.target === dialog) dialog.close();
|
if (e.target === dialog) dialog.close();
|
||||||
});
|
});
|
||||||
|
|||||||
@ -56,7 +56,6 @@ const isExt = (href: string) => href.startsWith("http");
|
|||||||
grid-auto-rows: 3.75rem;
|
grid-auto-rows: 3.75rem;
|
||||||
gap: 8px;
|
gap: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.bx__cell--email {
|
.bx__cell--email {
|
||||||
grid-column: span 4;
|
grid-column: span 4;
|
||||||
}
|
}
|
||||||
@ -101,7 +100,6 @@ const isExt = (href: string) => href.startsWith("http");
|
|||||||
background 0.18s ease,
|
background 0.18s ease,
|
||||||
box-shadow 0.24s ease;
|
box-shadow 0.24s ease;
|
||||||
}
|
}
|
||||||
|
|
||||||
.bx__cell:hover .bx__item,
|
.bx__cell:hover .bx__item,
|
||||||
.bx__cell:focus-within .bx__item {
|
.bx__cell:focus-within .bx__item {
|
||||||
transform: scale(1.06);
|
transform: scale(1.06);
|
||||||
@ -138,7 +136,6 @@ const isExt = (href: string) => href.startsWith("http");
|
|||||||
fill: var(--ink);
|
fill: var(--ink);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.bx__name {
|
.bx__name {
|
||||||
font-family: var(--serif);
|
font-family: var(--serif);
|
||||||
font-size: 1rem;
|
font-size: 1rem;
|
||||||
@ -172,7 +169,6 @@ const isExt = (href: string) => href.startsWith("http");
|
|||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.bx__more {
|
.bx__more {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: 0;
|
left: 0;
|
||||||
@ -217,7 +213,6 @@ const isExt = (href: string) => href.startsWith("http");
|
|||||||
text-wrap: pretty;
|
text-wrap: pretty;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@media (max-width: 34rem) {
|
@media (max-width: 34rem) {
|
||||||
.bx {
|
.bx {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|||||||
@ -179,7 +179,6 @@ const rows: Row[] = [
|
|||||||
.finger a:hover .term__out {
|
.finger a:hover .term__out {
|
||||||
color: var(--accent-2);
|
color: var(--accent-2);
|
||||||
}
|
}
|
||||||
|
|
||||||
.finger dd :global(.copy) {
|
.finger dd :global(.copy) {
|
||||||
font-size: 1em;
|
font-size: 1em;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,7 +3,6 @@ interface Props {
|
|||||||
value: string;
|
value: string;
|
||||||
display?: string;
|
display?: string;
|
||||||
label?: string;
|
label?: string;
|
||||||
|
|
||||||
event?: string;
|
event?: string;
|
||||||
}
|
}
|
||||||
const { value, display = value, label = `copy ${value}`, event } = Astro.props;
|
const { value, display = value, label = `copy ${value}`, event } = Astro.props;
|
||||||
|
|||||||
@ -1,6 +1,4 @@
|
|||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
note: string;
|
note: string;
|
||||||
align?: "left" | "right";
|
align?: "left" | "right";
|
||||||
|
|||||||
@ -1,7 +1,5 @@
|
|||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<div class="music">
|
<div class="music">
|
||||||
@ -85,7 +83,6 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<style is:global>
|
<style is:global>
|
||||||
|
|
||||||
|
|
||||||
.music {
|
.music {
|
||||||
margin-top: var(--gap);
|
margin-top: var(--gap);
|
||||||
@ -171,7 +168,6 @@
|
|||||||
transform: translateX(0.25em);
|
transform: translateX(0.25em);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.music-wall {
|
.music-wall {
|
||||||
margin: auto;
|
margin: auto;
|
||||||
width: min(24rem, calc(100vw - 1.5rem));
|
width: min(24rem, calc(100vw - 1.5rem));
|
||||||
@ -234,7 +230,6 @@
|
|||||||
margin-bottom: 0.7rem;
|
margin-bottom: 0.7rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.np {
|
.np {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
border: 1px solid var(--faint);
|
border: 1px solid var(--faint);
|
||||||
@ -336,7 +331,6 @@
|
|||||||
transition: width 1s linear;
|
transition: width 1s linear;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.mosaic {
|
.mosaic {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(4, 1fr);
|
grid-template-columns: repeat(4, 1fr);
|
||||||
|
|||||||
@ -1,15 +1,12 @@
|
|||||||
|
|
||||||
|
|
||||||
export const site = {
|
export const site = {
|
||||||
name: "zach",
|
name: "zach",
|
||||||
wordmark: "ZACH",
|
wordmark: "ZACH",
|
||||||
domain: "zachy.cc",
|
domain: "zachy.cc",
|
||||||
version: "v3.0.1",
|
version: "v3.0.1",
|
||||||
|
|
||||||
tagline: "cool things for the web",
|
tagline: "cool things for the web",
|
||||||
description:
|
description:
|
||||||
"i make cool things sometimes.",
|
"i make cool things sometimes.",
|
||||||
|
|
||||||
bio: "call me zoop, i like to make cool projects, and my website is one of them :).",
|
bio: "call me zoop, i like to make cool projects, and my website is one of them :).",
|
||||||
email: "hi@zachy.cc",
|
email: "hi@zachy.cc",
|
||||||
availability: "poking at new projects for early 2026.",
|
availability: "poking at new projects for early 2026.",
|
||||||
@ -19,8 +16,6 @@ export const elsewhere = [
|
|||||||
{ label: "status", href: "https://status.zachy.cc", external: true },
|
{ label: "status", href: "https://status.zachy.cc", external: true },
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
export const socials = [
|
export const socials = [
|
||||||
{
|
{
|
||||||
label: "email",
|
label: "email",
|
||||||
@ -75,8 +70,6 @@ export const webrings = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
export const buttons = [
|
export const buttons = [
|
||||||
{ label: "zachy.cc", img: "/badges/zachy.gif", still: "/badges/zachy.png", href: null },
|
{ label: "zachy.cc", img: "/badges/zachy.gif", still: "/badges/zachy.png", href: null },
|
||||||
{ label: "powered by fedora", img: "/badges/fedora.gif", still: null, href: "https://fedoraproject.org/" },
|
{ label: "powered by fedora", img: "/badges/fedora.gif", still: null, href: "https://fedoraproject.org/" },
|
||||||
|
|||||||
@ -18,9 +18,6 @@ const {
|
|||||||
const path = Astro.url.pathname;
|
const path = Astro.url.pathname;
|
||||||
const canonical = new URL(path, `https://${site.domain}`).href;
|
const canonical = new URL(path, `https://${site.domain}`).href;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const KAO_DEADLINE = "2027-01-01T00:00:00";
|
const KAO_DEADLINE = "2027-01-01T00:00:00";
|
||||||
const kaoMs = new Date(KAO_DEADLINE).getTime() - Date.now();
|
const kaoMs = new Date(KAO_DEADLINE).getTime() - Date.now();
|
||||||
const kaoCount = kaoMs > 0 ? `${Math.floor(kaoMs / 86_400_000)}d` : "in effect";
|
const kaoCount = kaoMs > 0 ? `${Math.floor(kaoMs / 86_400_000)}d` : "in effect";
|
||||||
@ -128,7 +125,6 @@ const kaoCount = kaoMs > 0 ? `${Math.floor(kaoMs / 86_400_000)}d` : "in effect";
|
|||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
const mark = document.querySelector(".mark");
|
const mark = document.querySelector(".mark");
|
||||||
const still = window.matchMedia("(prefers-reduced-motion: reduce)");
|
const still = window.matchMedia("(prefers-reduced-motion: reduce)");
|
||||||
if (mark && !still.matches) {
|
if (mark && !still.matches) {
|
||||||
@ -140,7 +136,6 @@ const kaoCount = kaoMs > 0 ? `${Math.floor(kaoMs / 86_400_000)}d` : "in effect";
|
|||||||
setTimeout(sweep, 4000 + Math.random() * 4000);
|
setTimeout(sweep, 4000 + Math.random() * 4000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
document
|
document
|
||||||
.querySelector("[data-ribbon-dismiss]")
|
.querySelector("[data-ribbon-dismiss]")
|
||||||
?.addEventListener("click", () => {
|
?.addEventListener("click", () => {
|
||||||
@ -150,7 +145,6 @@ const kaoCount = kaoMs > 0 ? `${Math.floor(kaoMs / 86_400_000)}d` : "in effect";
|
|||||||
} catch (e) {}
|
} catch (e) {}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
const kaoEl = document.querySelector("[data-kao-count]");
|
const kaoEl = document.querySelector("[data-kao-count]");
|
||||||
if (kaoEl instanceof HTMLElement && kaoEl.dataset.kaoDeadline) {
|
if (kaoEl instanceof HTMLElement && kaoEl.dataset.kaoDeadline) {
|
||||||
const target = new Date(kaoEl.dataset.kaoDeadline).getTime();
|
const target = new Date(kaoEl.dataset.kaoDeadline).getTime();
|
||||||
|
|||||||
@ -1,11 +1,8 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
import { env as cfEnv } from "cloudflare:workers";
|
import { env as cfEnv } from "cloudflare:workers";
|
||||||
|
|
||||||
export interface Note {
|
export interface Note {
|
||||||
body: string;
|
body: string;
|
||||||
date: string;
|
date: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Project {
|
export interface Project {
|
||||||
@ -25,8 +22,6 @@ export const DEFAULT_NOTE: Note = {
|
|||||||
date: "2026-09-06T00:00:00.000Z",
|
date: "2026-09-06T00:00:00.000Z",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
export const DEFAULT_PROJECTS: Project[] = [
|
export const DEFAULT_PROJECTS: Project[] = [
|
||||||
{
|
{
|
||||||
id: "drop",
|
id: "drop",
|
||||||
@ -175,7 +170,6 @@ export async function getNote(): Promise<Note> {
|
|||||||
return { body: n.body, date: n.date ?? new Date().toISOString() };
|
return { body: n.body, date: n.date ?? new Date().toISOString() };
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
|
|
||||||
return { body: raw, date: new Date().toISOString() };
|
return { body: raw, date: new Date().toISOString() };
|
||||||
}
|
}
|
||||||
return DEFAULT_NOTE;
|
return DEFAULT_NOTE;
|
||||||
|
|||||||
@ -1,8 +1,4 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const esc = (s: string) =>
|
const esc = (s: string) =>
|
||||||
s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
||||||
|
|
||||||
@ -30,7 +26,6 @@ export function renderMarkdown(src: string): string {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (line.trim().startsWith("```")) {
|
if (line.trim().startsWith("```")) {
|
||||||
const buf: string[] = [];
|
const buf: string[] = [];
|
||||||
i++;
|
i++;
|
||||||
@ -38,12 +33,11 @@ export function renderMarkdown(src: string): string {
|
|||||||
buf.push(esc(lines[i]));
|
buf.push(esc(lines[i]));
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
out.push(`<pre><code>${buf.join("\n")}</code></pre>`);
|
out.push(`<pre><code>${buf.join("\n")}</code></pre>`);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const h = line.match(/^(#{2,4})\s+(.*)$/);
|
const h = line.match(/^(#{2,4})\s+(.*)$/);
|
||||||
if (h) {
|
if (h) {
|
||||||
const level = h[1].length;
|
const level = h[1].length;
|
||||||
@ -52,7 +46,6 @@ export function renderMarkdown(src: string): string {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (/^\s*[-*]\s+/.test(line)) {
|
if (/^\s*[-*]\s+/.test(line)) {
|
||||||
const items: string[] = [];
|
const items: string[] = [];
|
||||||
while (i < lines.length && /^\s*[-*]\s+/.test(lines[i])) {
|
while (i < lines.length && /^\s*[-*]\s+/.test(lines[i])) {
|
||||||
@ -63,7 +56,6 @@ export function renderMarkdown(src: string): string {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const para: string[] = [];
|
const para: string[] = [];
|
||||||
while (
|
while (
|
||||||
i < lines.length &&
|
i < lines.length &&
|
||||||
|
|||||||
@ -1,9 +1,7 @@
|
|||||||
|
|
||||||
|
|
||||||
import { env as cfEnv } from "cloudflare:workers";
|
import { env as cfEnv } from "cloudflare:workers";
|
||||||
|
|
||||||
const COOKIE = "admin_session";
|
const COOKIE = "admin_session";
|
||||||
const TTL = 60 * 60 * 24 * 7;
|
const TTL = 60 * 60 * 24 * 7;
|
||||||
|
|
||||||
function secrets(): Record<string, string | undefined> {
|
function secrets(): Record<string, string | undefined> {
|
||||||
const node = typeof process !== "undefined" ? process.env : {};
|
const node = typeof process !== "undefined" ? process.env : {};
|
||||||
@ -11,7 +9,6 @@ function secrets(): Record<string, string | undefined> {
|
|||||||
try {
|
try {
|
||||||
worker = cfEnv as any;
|
worker = cfEnv as any;
|
||||||
} catch {
|
} catch {
|
||||||
|
|
||||||
}
|
}
|
||||||
return { ...node, ...worker };
|
return { ...node, ...worker };
|
||||||
}
|
}
|
||||||
|
|||||||
@ -29,7 +29,6 @@ const routes = ["projects", "notes", "contact"];
|
|||||||
const fof = document.querySelector<HTMLElement>(".fof");
|
const fof = document.querySelector<HTMLElement>(".fof");
|
||||||
const reduce = window.matchMedia("(prefers-reduced-motion: reduce)");
|
const reduce = window.matchMedia("(prefers-reduced-motion: reduce)");
|
||||||
if (fof && !reduce.matches) {
|
if (fof && !reduce.matches) {
|
||||||
|
|
||||||
fof.classList.add("fof--running");
|
fof.classList.add("fof--running");
|
||||||
window.setTimeout(() => fof.classList.remove("fof--running"), 550);
|
window.setTimeout(() => fof.classList.remove("fof--running"), 550);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,14 +1,9 @@
|
|||||||
import type { APIRoute } from "astro";
|
import type { APIRoute } from "astro";
|
||||||
|
|
||||||
import { env as cfEnv } from "cloudflare:workers";
|
import { env as cfEnv } from "cloudflare:workers";
|
||||||
|
|
||||||
export const prerender = false;
|
export const prerender = false;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
type Env = Record<string, string | undefined>;
|
type Env = Record<string, string | undefined>;
|
||||||
|
|
||||||
interface Track {
|
interface Track {
|
||||||
@ -34,7 +29,6 @@ function getEnv(): Env {
|
|||||||
try {
|
try {
|
||||||
workerEnv = cfEnv as unknown as Env;
|
workerEnv = cfEnv as unknown as Env;
|
||||||
} catch {
|
} catch {
|
||||||
|
|
||||||
}
|
}
|
||||||
return { ...nodeEnv, ...workerEnv };
|
return { ...nodeEnv, ...workerEnv };
|
||||||
}
|
}
|
||||||
@ -87,7 +81,6 @@ async function nowPlaying(token: string): Promise<NowPlaying | null> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
res = await fetch(`${API}/me/player/recently-played?limit=1`, {
|
res = await fetch(`${API}/me/player/recently-played?limit=1`, {
|
||||||
headers: { Authorization: `Bearer ${token}` },
|
headers: { Authorization: `Bearer ${token}` },
|
||||||
});
|
});
|
||||||
|
|||||||
@ -3,7 +3,6 @@ import Base from "../layouts/Base.astro";
|
|||||||
import { getNote } from "../lib/content";
|
import { getNote } from "../lib/content";
|
||||||
import { renderMarkdown } from "../lib/md";
|
import { renderMarkdown } from "../lib/md";
|
||||||
|
|
||||||
|
|
||||||
const note = await getNote();
|
const note = await getNote();
|
||||||
const html = note.body.trim() ? renderMarkdown(note.body) : "";
|
const html = note.body.trim() ? renderMarkdown(note.body) : "";
|
||||||
|
|
||||||
|
|||||||
@ -2,7 +2,6 @@
|
|||||||
import Base from "../layouts/Base.astro";
|
import Base from "../layouts/Base.astro";
|
||||||
import { getProjects } from "../lib/content";
|
import { getProjects } from "../lib/content";
|
||||||
|
|
||||||
|
|
||||||
const projects = (await getProjects()).filter((p) => !p.draft);
|
const projects = (await getProjects()).filter((p) => !p.draft);
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,4 @@
|
|||||||
|
|
||||||
|
|
||||||
interface Track {
|
interface Track {
|
||||||
title: string;
|
title: string;
|
||||||
artist: string;
|
artist: string;
|
||||||
@ -143,7 +142,6 @@ async function load(): Promise<void> {
|
|||||||
if (data.nowPlaying) renderNowPlaying(data.nowPlaying as NP);
|
if (data.nowPlaying) renderNowPlaying(data.nowPlaying as NP);
|
||||||
if (Array.isArray(data.top)) renderTop(data.top as Track[]);
|
if (Array.isArray(data.top)) renderTop(data.top as Track[]);
|
||||||
|
|
||||||
|
|
||||||
const trigger = document.querySelector<HTMLButtonElement>(".music__trigger");
|
const trigger = document.querySelector<HTMLButtonElement>(".music__trigger");
|
||||||
if (trigger && (data.nowPlaying || (Array.isArray(data.top) && data.top.length))) {
|
if (trigger && (data.nowPlaying || (Array.isArray(data.top) && data.top.length))) {
|
||||||
trigger.hidden = false;
|
trigger.hidden = false;
|
||||||
|
|||||||
@ -1,14 +1,11 @@
|
|||||||
|
|
||||||
@import "@fontsource-variable/newsreader";
|
@import "@fontsource-variable/newsreader";
|
||||||
@import "@fontsource-variable/newsreader/wght-italic.css";
|
@import "@fontsource-variable/newsreader/wght-italic.css";
|
||||||
@import "@fontsource-variable/jetbrains-mono";
|
@import "@fontsource-variable/jetbrains-mono";
|
||||||
@import "@fontsource/unbounded/900.css";
|
@import "@fontsource/unbounded/900.css";
|
||||||
|
|
||||||
|
|
||||||
:root {
|
:root {
|
||||||
color-scheme: dark;
|
color-scheme: dark;
|
||||||
|
|
||||||
|
|
||||||
--paper: #1b1a18;
|
--paper: #1b1a18;
|
||||||
--paper-2: #232220;
|
--paper-2: #232220;
|
||||||
--ink: #e7e3dc;
|
--ink: #e7e3dc;
|
||||||
@ -16,10 +13,9 @@
|
|||||||
--faint: #6b655c;
|
--faint: #6b655c;
|
||||||
--line: #322f2b;
|
--line: #322f2b;
|
||||||
--accent: #ffab5e;
|
--accent: #ffab5e;
|
||||||
--accent-2: #5ea0ff;
|
--accent-2: #5ea0ff;
|
||||||
--star: #ffab5e;
|
--star: #ffab5e;
|
||||||
|
|
||||||
|
|
||||||
--grad: linear-gradient(
|
--grad: linear-gradient(
|
||||||
90deg,
|
90deg,
|
||||||
rgb(255, 224, 138),
|
rgb(255, 224, 138),
|
||||||
@ -40,7 +36,6 @@
|
|||||||
--gap: 2.5rem;
|
--gap: 2.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
*,
|
*,
|
||||||
*::before,
|
*::before,
|
||||||
*::after {
|
*::after {
|
||||||
@ -97,7 +92,6 @@ img {
|
|||||||
display: none !important;
|
display: none !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.skip {
|
.skip {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: -9999px;
|
left: -9999px;
|
||||||
@ -123,7 +117,6 @@ img {
|
|||||||
border: 0;
|
border: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.ribbon {
|
.ribbon {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: stretch;
|
align-items: stretch;
|
||||||
@ -208,7 +201,6 @@ img {
|
|||||||
background: rgba(255, 255, 255, 0.03);
|
background: rgba(255, 255, 255, 0.03);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.topbar {
|
.topbar {
|
||||||
margin: 0 0 clamp(2rem, 5vw, 3rem);
|
margin: 0 0 clamp(2rem, 5vw, 3rem);
|
||||||
display: flex;
|
display: flex;
|
||||||
@ -231,14 +223,12 @@ img {
|
|||||||
background-position: 0% 50%;
|
background-position: 0% 50%;
|
||||||
-webkit-background-clip: text;
|
-webkit-background-clip: text;
|
||||||
background-clip: text;
|
background-clip: text;
|
||||||
|
|
||||||
-webkit-text-fill-color: currentColor;
|
-webkit-text-fill-color: currentColor;
|
||||||
transition:
|
transition:
|
||||||
-webkit-text-fill-color 0.4s ease,
|
-webkit-text-fill-color 0.4s ease,
|
||||||
background-position 0.9s ease;
|
background-position 0.9s ease;
|
||||||
user-select: none;
|
user-select: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.mark:hover,
|
.mark:hover,
|
||||||
.mark:focus-visible,
|
.mark:focus-visible,
|
||||||
.mark.is-sweeping {
|
.mark.is-sweeping {
|
||||||
@ -263,7 +253,6 @@ img {
|
|||||||
color: var(--muted);
|
color: var(--muted);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.section {
|
.section {
|
||||||
margin-top: var(--gap);
|
margin-top: var(--gap);
|
||||||
}
|
}
|
||||||
@ -280,7 +269,6 @@ img {
|
|||||||
letter-spacing: 0.06em;
|
letter-spacing: 0.06em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.intro {
|
.intro {
|
||||||
margin-bottom: var(--gap);
|
margin-bottom: var(--gap);
|
||||||
}
|
}
|
||||||
@ -298,7 +286,6 @@ img {
|
|||||||
text-wrap: pretty;
|
text-wrap: pretty;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.pagenav {
|
.pagenav {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
@ -329,7 +316,6 @@ img {
|
|||||||
transform: translate(0.22em, -0.22em);
|
transform: translate(0.22em, -0.22em);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.contact .avail {
|
.contact .avail {
|
||||||
color: var(--muted);
|
color: var(--muted);
|
||||||
font-size: 0.95rem;
|
font-size: 0.95rem;
|
||||||
@ -358,7 +344,6 @@ img {
|
|||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.copy {
|
.copy {
|
||||||
font-family: var(--mono);
|
font-family: var(--mono);
|
||||||
font-size: 0.9em;
|
font-size: 0.9em;
|
||||||
@ -434,7 +419,6 @@ img {
|
|||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.colophon {
|
.colophon {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@ -462,7 +446,6 @@ img {
|
|||||||
color: var(--accent);
|
color: var(--accent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.backlink {
|
.backlink {
|
||||||
font-family: var(--mono);
|
font-family: var(--mono);
|
||||||
font-size: 0.78rem;
|
font-size: 0.78rem;
|
||||||
@ -475,7 +458,6 @@ img {
|
|||||||
color: var(--accent);
|
color: var(--accent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@media (prefers-reduced-motion: reduce) {
|
@media (prefers-reduced-motion: reduce) {
|
||||||
* {
|
* {
|
||||||
animation-duration: 0.001ms !important;
|
animation-duration: 0.001ms !important;
|
||||||
|
|||||||
@ -5,7 +5,6 @@
|
|||||||
"global_fetch_strictly_public"
|
"global_fetch_strictly_public"
|
||||||
],
|
],
|
||||||
"name": "website-v3",
|
"name": "website-v3",
|
||||||
|
|
||||||
"account_id": "5745d698d83c15e655924b25248a3029",
|
"account_id": "5745d698d83c15e655924b25248a3029",
|
||||||
"main": "@astrojs/cloudflare/entrypoints/server",
|
"main": "@astrojs/cloudflare/entrypoints/server",
|
||||||
"assets": {
|
"assets": {
|
||||||
@ -15,8 +14,6 @@
|
|||||||
"observability": {
|
"observability": {
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
"routes": [
|
"routes": [
|
||||||
{
|
{
|
||||||
"pattern": "zachy.cc",
|
"pattern": "zachy.cc",
|
||||||
@ -27,14 +24,10 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"kv_namespaces": [
|
"kv_namespaces": [
|
||||||
|
|
||||||
|
|
||||||
{
|
{
|
||||||
"binding": "CONTENT",
|
"binding": "CONTENT",
|
||||||
"id": "96b661e1818f4773acd2a3a1b39c58b0"
|
"id": "96b661e1818f4773acd2a3a1b39c58b0"
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
{
|
{
|
||||||
"binding": "SESSION",
|
"binding": "SESSION",
|
||||||
"id": "8d6df673f9934c1e9d15cfb4de09daac"
|
"id": "8d6df673f9934c1e9d15cfb4de09daac"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user