Compare commits
72 commits
5c3716c2ee
...
b702c3d044
Author | SHA1 | Date | |
---|---|---|---|
b702c3d044 | |||
efec4e2ce4 | |||
55e4eeead6 | |||
7d44140b45 | |||
3a408b712b | |||
3fc2687d28 | |||
6766bf064d | |||
e76a6e1ca6 | |||
54aaa6086e | |||
80e4087673 | |||
4937ee3db4 | |||
b1d91c155b | |||
91d1a50ae8 | |||
64d2a72ffa | |||
6c258acf1f | |||
7b0744bfe3 | |||
31ca660bfc | |||
1ea851d35d | |||
1f8da909fd | |||
7e9f022a72 | |||
76bd66836b | |||
3dd5b1b9cc | |||
408f714624 | |||
3017b3b00b | |||
b58e27309c | |||
308cbc5d49 | |||
9e8a9089f6 | |||
682bcbff79 | |||
aacb1b001d | |||
2b17821838 | |||
43ccde935c | |||
c20b22513c | |||
c61b542993 | |||
0ddc8b12de | |||
70a15c6083 | |||
309a35665a | |||
c43993cd5e | |||
9d57a22090 | |||
889215500c | |||
00ca44e063 | |||
6be9926241 | |||
845bd49e69 | |||
6690f109fc | |||
0036c6e7d1 | |||
cd258feafb | |||
ac108eaa77 | |||
eb7d97ee08 | |||
506621895b | |||
81e8faff98 | |||
74c4cdf033 | |||
c37c425a8e | |||
17fc36aab5 | |||
f66fe1543c | |||
1674fb2de1 | |||
a54ed5122f | |||
068aa4f73c | |||
40ad8b057a | |||
1a3822f6f0 | |||
daca69a155 | |||
8c47067827 | |||
604eebe5ca | |||
fa1d2044bf | |||
0c22f778e4 | |||
21a76fe946 | |||
30257a4d1c | |||
5d2a8fcca8 | |||
2d7b34ab0e | |||
81d6193bf5 | |||
68c2800130 | |||
aa78363c32 | |||
651930da17 | |||
7b14ea45b8 |
BIN
LastGame.broguesave
Normal file
45
caar/get.ts
Normal file
|
@ -0,0 +1,45 @@
|
|||
// TODO: types (don't even sweat validation)
|
||||
// TODO: do sweat error handling
|
||||
type Cursor = { refSnowflake: string; offset: number; sortOrder: string };
|
||||
|
||||
export const get = (
|
||||
cursor?: Cursor,
|
||||
): Promise<{ listings: any[]; nextCursor: Cursor | undefined }> =>
|
||||
fetch(
|
||||
`https://cohost.org/api/v1/trpc/artistAlley.getListingsForDisplay?batch=1&input=${
|
||||
encodeURI(
|
||||
JSON.stringify({
|
||||
"0": {
|
||||
adultDisplayMode: "include",
|
||||
categories: [],
|
||||
categoryMatch: "all",
|
||||
sortOrder: "newest",
|
||||
cursor,
|
||||
},
|
||||
}),
|
||||
)
|
||||
}`,
|
||||
).then(async (r) => {
|
||||
const json = (await r.json())[0];
|
||||
if (json.error) throw json.error;
|
||||
|
||||
const j = json.result.data;
|
||||
return {
|
||||
listings: j.listings.map((l: any) => ({
|
||||
...l,
|
||||
author: j.relevantProjects[l.projectId],
|
||||
})),
|
||||
nextCursor: j.nextCursor,
|
||||
};
|
||||
});
|
||||
|
||||
export const get_all = async (cursor?: Cursor): Promise<any[]> => {
|
||||
const { listings, nextCursor } = await get(cursor);
|
||||
return nextCursor ? [...listings, ...(await get_all(nextCursor))] : listings;
|
||||
};
|
||||
|
||||
if (import.meta.main) {
|
||||
const got = await get_all();
|
||||
console.log(got);
|
||||
console.log(got.length);
|
||||
};
|
485
deno.lock
|
@ -2,18 +2,19 @@
|
|||
"version": "3",
|
||||
"packages": {
|
||||
"specifiers": {
|
||||
"npm:discord.js": "npm:discord.js@14.13.0"
|
||||
"npm:@types/node": "npm:@types/node@18.16.19",
|
||||
"npm:discord.js": "npm:discord.js@14.15.2"
|
||||
},
|
||||
"npm": {
|
||||
"@discordjs/builders@1.6.5": {
|
||||
"integrity": "sha512-SdweyCs/+mHj+PNhGLLle7RrRFX9ZAhzynHahMCLqp5Zeq7np7XC6/mgzHc79QoVlQ1zZtOkTTiJpOZu5V8Ufg==",
|
||||
"@discordjs/builders@1.8.1": {
|
||||
"integrity": "sha512-GkF+HM01FHy+NSoTaUPR8z44otfQgJ1AIsRxclYGUZDyUbdZEFyD/5QVv2Y1Flx6M+B0bQLzg2M9CJv5lGTqpA==",
|
||||
"dependencies": {
|
||||
"@discordjs/formatters": "@discordjs/formatters@0.3.2",
|
||||
"@discordjs/util": "@discordjs/util@1.0.1",
|
||||
"@sapphire/shapeshift": "@sapphire/shapeshift@3.9.2",
|
||||
"discord-api-types": "discord-api-types@0.37.50",
|
||||
"@discordjs/formatters": "@discordjs/formatters@0.4.0",
|
||||
"@discordjs/util": "@discordjs/util@1.1.0",
|
||||
"@sapphire/shapeshift": "@sapphire/shapeshift@3.9.7",
|
||||
"discord-api-types": "discord-api-types@0.37.83",
|
||||
"fast-deep-equal": "fast-deep-equal@3.1.3",
|
||||
"ts-mixer": "ts-mixer@6.0.3",
|
||||
"ts-mixer": "ts-mixer@6.0.4",
|
||||
"tslib": "tslib@2.6.2"
|
||||
}
|
||||
},
|
||||
|
@ -21,100 +22,96 @@
|
|||
"integrity": "sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ==",
|
||||
"dependencies": {}
|
||||
},
|
||||
"@discordjs/formatters@0.3.2": {
|
||||
"integrity": "sha512-lE++JZK8LSSDRM5nLjhuvWhGuKiXqu+JZ/DsOR89DVVia3z9fdCJVcHF2W/1Zxgq0re7kCzmAJlCMMX3tetKpA==",
|
||||
"dependencies": {
|
||||
"discord-api-types": "discord-api-types@0.37.50"
|
||||
}
|
||||
},
|
||||
"@discordjs/rest@2.0.1": {
|
||||
"integrity": "sha512-/eWAdDRvwX/rIE2tuQUmKaxmWeHmGealttIzGzlYfI4+a7y9b6ZoMp8BG/jaohs8D8iEnCNYaZiOFLVFLQb8Zg==",
|
||||
"dependencies": {
|
||||
"@discordjs/collection": "@discordjs/collection@1.5.3",
|
||||
"@discordjs/util": "@discordjs/util@1.0.1",
|
||||
"@sapphire/async-queue": "@sapphire/async-queue@1.5.0",
|
||||
"@sapphire/snowflake": "@sapphire/snowflake@3.5.1",
|
||||
"@vladfrangu/async_event_emitter": "@vladfrangu/async_event_emitter@2.2.2",
|
||||
"discord-api-types": "discord-api-types@0.37.50",
|
||||
"magic-bytes.js": "magic-bytes.js@1.0.19",
|
||||
"tslib": "tslib@2.6.2",
|
||||
"undici": "undici@5.22.1"
|
||||
}
|
||||
},
|
||||
"@discordjs/util@1.0.1": {
|
||||
"integrity": "sha512-d0N2yCxB8r4bn00/hvFZwM7goDcUhtViC5un4hPj73Ba4yrChLSJD8fy7Ps5jpTLg1fE9n4K0xBLc1y9WGwSsA==",
|
||||
"@discordjs/collection@2.1.0": {
|
||||
"integrity": "sha512-mLcTACtXUuVgutoznkh6hS3UFqYirDYAg5Dc1m8xn6OvPjetnUlf/xjtqnnc47OwWdaoCQnHmHh9KofhD6uRqw==",
|
||||
"dependencies": {}
|
||||
},
|
||||
"@discordjs/ws@1.0.1": {
|
||||
"integrity": "sha512-avvAolBqN3yrSvdBPcJ/0j2g42ABzrv3PEL76e3YTp2WYMGH7cuspkjfSyNWaqYl1J+669dlLp+YFMxSVQyS5g==",
|
||||
"@discordjs/formatters@0.4.0": {
|
||||
"integrity": "sha512-fJ06TLC1NiruF35470q3Nr1bi95BdvKFAF+T5bNfZJ4bNdqZ3VZ+Ttg6SThqTxm6qumSG3choxLBHMC69WXNXQ==",
|
||||
"dependencies": {
|
||||
"@discordjs/collection": "@discordjs/collection@1.5.3",
|
||||
"@discordjs/rest": "@discordjs/rest@2.0.1",
|
||||
"@discordjs/util": "@discordjs/util@1.0.1",
|
||||
"@sapphire/async-queue": "@sapphire/async-queue@1.5.0",
|
||||
"@types/ws": "@types/ws@8.5.6",
|
||||
"@vladfrangu/async_event_emitter": "@vladfrangu/async_event_emitter@2.2.2",
|
||||
"discord-api-types": "discord-api-types@0.37.50",
|
||||
"tslib": "tslib@2.6.2",
|
||||
"ws": "ws@8.14.2"
|
||||
"discord-api-types": "discord-api-types@0.37.83"
|
||||
}
|
||||
},
|
||||
"@sapphire/async-queue@1.5.0": {
|
||||
"integrity": "sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA==",
|
||||
"@discordjs/rest@2.3.0": {
|
||||
"integrity": "sha512-C1kAJK8aSYRv3ZwMG8cvrrW4GN0g5eMdP8AuN8ODH5DyOCbHgJspze1my3xHOAgwLJdKUbWNVyAeJ9cEdduqIg==",
|
||||
"dependencies": {
|
||||
"@discordjs/collection": "@discordjs/collection@2.1.0",
|
||||
"@discordjs/util": "@discordjs/util@1.1.0",
|
||||
"@sapphire/async-queue": "@sapphire/async-queue@1.5.2",
|
||||
"@sapphire/snowflake": "@sapphire/snowflake@3.5.3",
|
||||
"@vladfrangu/async_event_emitter": "@vladfrangu/async_event_emitter@2.2.4",
|
||||
"discord-api-types": "discord-api-types@0.37.83",
|
||||
"magic-bytes.js": "magic-bytes.js@1.10.0",
|
||||
"tslib": "tslib@2.6.2",
|
||||
"undici": "undici@6.13.0"
|
||||
}
|
||||
},
|
||||
"@discordjs/util@1.1.0": {
|
||||
"integrity": "sha512-IndcI5hzlNZ7GS96RV3Xw1R2kaDuXEp7tRIy/KlhidpN/BQ1qh1NZt3377dMLTa44xDUNKT7hnXkA/oUAzD/lg==",
|
||||
"dependencies": {}
|
||||
},
|
||||
"@sapphire/shapeshift@3.9.2": {
|
||||
"integrity": "sha512-YRbCXWy969oGIdqR/wha62eX8GNHsvyYi0Rfd4rNW6tSVVa8p0ELiMEuOH/k8rgtvRoM+EMV7Csqz77YdwiDpA==",
|
||||
"@discordjs/ws@1.1.0": {
|
||||
"integrity": "sha512-O97DIeSvfNTn5wz5vaER6ciyUsr7nOqSEtsLoMhhIgeFkhnxLRqSr00/Fpq2/ppLgjDGLbQCDzIK7ilGoB/M7A==",
|
||||
"dependencies": {
|
||||
"@discordjs/collection": "@discordjs/collection@2.1.0",
|
||||
"@discordjs/rest": "@discordjs/rest@2.3.0",
|
||||
"@discordjs/util": "@discordjs/util@1.1.0",
|
||||
"@sapphire/async-queue": "@sapphire/async-queue@1.5.2",
|
||||
"@types/ws": "@types/ws@8.5.10",
|
||||
"@vladfrangu/async_event_emitter": "@vladfrangu/async_event_emitter@2.2.4",
|
||||
"discord-api-types": "discord-api-types@0.37.83",
|
||||
"tslib": "tslib@2.6.2",
|
||||
"ws": "ws@8.17.0"
|
||||
}
|
||||
},
|
||||
"@sapphire/async-queue@1.5.2": {
|
||||
"integrity": "sha512-7X7FFAA4DngXUl95+hYbUF19bp1LGiffjJtu7ygrZrbdCSsdDDBaSjB7Akw0ZbOu6k0xpXyljnJ6/RZUvLfRdg==",
|
||||
"dependencies": {}
|
||||
},
|
||||
"@sapphire/shapeshift@3.9.7": {
|
||||
"integrity": "sha512-4It2mxPSr4OGn4HSQWGmhFMsNFGfFVhWeRPCRwbH972Ek2pzfGRZtb0pJ4Ze6oIzcyh2jw7nUDa6qGlWofgd9g==",
|
||||
"dependencies": {
|
||||
"fast-deep-equal": "fast-deep-equal@3.1.3",
|
||||
"lodash": "lodash@4.17.21"
|
||||
}
|
||||
},
|
||||
"@sapphire/snowflake@3.5.1": {
|
||||
"integrity": "sha512-BxcYGzgEsdlG0dKAyOm0ehLGm2CafIrfQTZGWgkfKYbj+pNNsorZ7EotuZukc2MT70E0UbppVbtpBrqpzVzjNA==",
|
||||
"@sapphire/snowflake@3.5.3": {
|
||||
"integrity": "sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ==",
|
||||
"dependencies": {}
|
||||
},
|
||||
"@types/node@18.16.19": {
|
||||
"integrity": "sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==",
|
||||
"dependencies": {}
|
||||
},
|
||||
"@types/ws@8.5.6": {
|
||||
"integrity": "sha512-8B5EO9jLVCy+B58PLHvLDuOD8DRVMgQzq8d55SjLCOn9kqGyqOvy27exVaTio1q1nX5zLu8/6N0n2ThSxOM6tg==",
|
||||
"@types/ws@8.5.10": {
|
||||
"integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==",
|
||||
"dependencies": {
|
||||
"@types/node": "@types/node@18.16.19"
|
||||
}
|
||||
},
|
||||
"@vladfrangu/async_event_emitter@2.2.2": {
|
||||
"integrity": "sha512-HIzRG7sy88UZjBJamssEczH5q7t5+axva19UbZLO6u0ySbYPrwzWiXBcC0WuHyhKKoeCyneH+FvYzKQq/zTtkQ==",
|
||||
"@vladfrangu/async_event_emitter@2.2.4": {
|
||||
"integrity": "sha512-ButUPz9E9cXMLgvAW8aLAKKJJsPu1dY1/l/E8xzLFuysowXygs6GBcyunK9rnGC4zTsnIc2mQo71rGw9U+Ykug==",
|
||||
"dependencies": {}
|
||||
},
|
||||
"busboy@1.6.0": {
|
||||
"integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
|
||||
"dependencies": {
|
||||
"streamsearch": "streamsearch@1.1.0"
|
||||
}
|
||||
},
|
||||
"discord-api-types@0.37.50": {
|
||||
"integrity": "sha512-X4CDiMnDbA3s3RaUXWXmgAIbY1uxab3fqe3qwzg5XutR3wjqi7M3IkgQbsIBzpqBN2YWr/Qdv7JrFRqSgb4TFg==",
|
||||
"discord-api-types@0.37.83": {
|
||||
"integrity": "sha512-urGGYeWtWNYMKnYlZnOnDHm8fVRffQs3U0SpE8RHeiuLKb/u92APS8HoQnPTFbnXmY1vVnXjXO4dOxcAn3J+DA==",
|
||||
"dependencies": {}
|
||||
},
|
||||
"discord.js@14.13.0": {
|
||||
"integrity": "sha512-Kufdvg7fpyTEwANGy9x7i4od4yu5c6gVddGi5CKm4Y5a6sF0VBODObI3o0Bh7TGCj0LfNT8Qp8z04wnLFzgnbA==",
|
||||
"discord.js@14.15.2": {
|
||||
"integrity": "sha512-wGD37YCaTUNprtpqMIRuNiswwsvSWXrHykBSm2SAosoTYut0VUDj9yo9t4iLtMKvuhI49zYkvKc2TNdzdvpJhg==",
|
||||
"dependencies": {
|
||||
"@discordjs/builders": "@discordjs/builders@1.6.5",
|
||||
"@discordjs/builders": "@discordjs/builders@1.8.1",
|
||||
"@discordjs/collection": "@discordjs/collection@1.5.3",
|
||||
"@discordjs/formatters": "@discordjs/formatters@0.3.2",
|
||||
"@discordjs/rest": "@discordjs/rest@2.0.1",
|
||||
"@discordjs/util": "@discordjs/util@1.0.1",
|
||||
"@discordjs/ws": "@discordjs/ws@1.0.1",
|
||||
"@sapphire/snowflake": "@sapphire/snowflake@3.5.1",
|
||||
"@types/ws": "@types/ws@8.5.6",
|
||||
"discord-api-types": "discord-api-types@0.37.50",
|
||||
"@discordjs/formatters": "@discordjs/formatters@0.4.0",
|
||||
"@discordjs/rest": "@discordjs/rest@2.3.0",
|
||||
"@discordjs/util": "@discordjs/util@1.1.0",
|
||||
"@discordjs/ws": "@discordjs/ws@1.1.0",
|
||||
"@sapphire/snowflake": "@sapphire/snowflake@3.5.3",
|
||||
"discord-api-types": "discord-api-types@0.37.83",
|
||||
"fast-deep-equal": "fast-deep-equal@3.1.3",
|
||||
"lodash.snakecase": "lodash.snakecase@4.1.1",
|
||||
"tslib": "tslib@2.6.2",
|
||||
"undici": "undici@5.22.1",
|
||||
"ws": "ws@8.14.2"
|
||||
"undici": "undici@6.13.0"
|
||||
}
|
||||
},
|
||||
"fast-deep-equal@3.1.3": {
|
||||
|
@ -129,59 +126,33 @@
|
|||
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
|
||||
"dependencies": {}
|
||||
},
|
||||
"magic-bytes.js@1.0.19": {
|
||||
"integrity": "sha512-/088hrf0svd5aDFLXuWStA447/ZXv21sS/1uaaPELohYL8+QzcO3mD8JkEFe0DSAsU5ex+O2+12Zmiz7wIdA1Q==",
|
||||
"magic-bytes.js@1.10.0": {
|
||||
"integrity": "sha512-/k20Lg2q8LE5xiaaSkMXk4sfvI+9EGEykFS4b0CHHGWqDYU0bGUFSwchNOMA56D7TCs9GwVTkqe9als1/ns8UQ==",
|
||||
"dependencies": {}
|
||||
},
|
||||
"streamsearch@1.1.0": {
|
||||
"integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
|
||||
"dependencies": {}
|
||||
},
|
||||
"ts-mixer@6.0.3": {
|
||||
"integrity": "sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ==",
|
||||
"ts-mixer@6.0.4": {
|
||||
"integrity": "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==",
|
||||
"dependencies": {}
|
||||
},
|
||||
"tslib@2.6.2": {
|
||||
"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
|
||||
"dependencies": {}
|
||||
},
|
||||
"undici@5.22.1": {
|
||||
"integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==",
|
||||
"dependencies": {
|
||||
"busboy": "busboy@1.6.0"
|
||||
}
|
||||
"undici@6.13.0": {
|
||||
"integrity": "sha512-Q2rtqmZWrbP8nePMq7mOJIN98M0fYvSgV89vwl/BQRT4mDOeY2GXZngfGpcBBhtky3woM7G24wZV3Q304Bv6cw==",
|
||||
"dependencies": {}
|
||||
},
|
||||
"ws@8.14.2": {
|
||||
"integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==",
|
||||
"ws@8.17.0": {
|
||||
"integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==",
|
||||
"dependencies": {}
|
||||
}
|
||||
}
|
||||
},
|
||||
"redirects": {
|
||||
"https://deno.land/x/canvas/mod.ts": "https://deno.land/x/canvas@v1.4.1/mod.ts",
|
||||
"https://deno.land/x/emit/mod.ts": "https://deno.land/x/emit@0.28.0/mod.ts"
|
||||
"https://deno.land/x/deno_dom/deno-dom-wasm.ts": "https://deno.land/x/deno_dom@v0.1.43/deno-dom-wasm.ts"
|
||||
},
|
||||
"remote": {
|
||||
"https://deno.land/std@0.106.0/encoding/base64.ts": "eecae390f1f1d1cae6f6c6d732ede5276bf4b9cd29b1d281678c054dc5cc009e",
|
||||
"https://deno.land/std@0.140.0/_util/assert.ts": "e94f2eb37cebd7f199952e242c77654e43333c1ac4c5c700e929ea3aa5489f74",
|
||||
"https://deno.land/std@0.140.0/_util/os.ts": "3b4c6e27febd119d36a416d7a97bd3b0251b77c88942c8f16ee5953ea13e2e49",
|
||||
"https://deno.land/std@0.140.0/bytes/bytes_list.ts": "67eb118e0b7891d2f389dad4add35856f4ad5faab46318ff99653456c23b025d",
|
||||
"https://deno.land/std@0.140.0/bytes/equals.ts": "fc16dff2090cced02497f16483de123dfa91e591029f985029193dfaa9d894c9",
|
||||
"https://deno.land/std@0.140.0/bytes/mod.ts": "763f97d33051cc3f28af1a688dfe2830841192a9fea0cbaa55f927b49d49d0bf",
|
||||
"https://deno.land/std@0.140.0/fmt/colors.ts": "30455035d6d728394781c10755351742dd731e3db6771b1843f9b9e490104d37",
|
||||
"https://deno.land/std@0.140.0/fs/_util.ts": "0fb24eb4bfebc2c194fb1afdb42b9c3dda12e368f43e8f2321f84fc77d42cb0f",
|
||||
"https://deno.land/std@0.140.0/fs/ensure_dir.ts": "9dc109c27df4098b9fc12d949612ae5c9c7169507660dcf9ad90631833209d9d",
|
||||
"https://deno.land/std@0.140.0/io/buffer.ts": "bd0c4bf53db4b4be916ca5963e454bddfd3fcd45039041ea161dbf826817822b",
|
||||
"https://deno.land/std@0.140.0/path/_constants.ts": "df1db3ffa6dd6d1252cc9617e5d72165cd2483df90e93833e13580687b6083c3",
|
||||
"https://deno.land/std@0.140.0/path/_interface.ts": "ee3b431a336b80cf445441109d089b70d87d5e248f4f90ff906820889ecf8d09",
|
||||
"https://deno.land/std@0.140.0/path/_util.ts": "c1e9686d0164e29f7d880b2158971d805b6e0efc3110d0b3e24e4b8af2190d2b",
|
||||
"https://deno.land/std@0.140.0/path/common.ts": "bee563630abd2d97f99d83c96c2fa0cca7cee103e8cb4e7699ec4d5db7bd2633",
|
||||
"https://deno.land/std@0.140.0/path/glob.ts": "cb5255638de1048973c3e69e420c77dc04f75755524cb3b2e160fe9277d939ee",
|
||||
"https://deno.land/std@0.140.0/path/mod.ts": "d3e68d0abb393fb0bf94a6d07c46ec31dc755b544b13144dee931d8d5f06a52d",
|
||||
"https://deno.land/std@0.140.0/path/posix.ts": "293cdaec3ecccec0a9cc2b534302dfe308adb6f10861fa183275d6695faace44",
|
||||
"https://deno.land/std@0.140.0/path/separator.ts": "fe1816cb765a8068afb3e8f13ad272351c85cbc739af56dacfc7d93d710fe0f9",
|
||||
"https://deno.land/std@0.140.0/path/win32.ts": "31811536855e19ba37a999cd8d1b62078235548d67902ece4aa6b814596dd757",
|
||||
"https://deno.land/std@0.140.0/streams/conversion.ts": "712585bfa0172a97fb68dd46e784ae8ad59d11b88079d6a4ab098ff42e697d21",
|
||||
"https://deno.land/std@0.146.0/_util/assert.ts": "e94f2eb37cebd7f199952e242c77654e43333c1ac4c5c700e929ea3aa5489f74",
|
||||
"https://deno.land/std@0.146.0/async/abortable.ts": "87aa7230be8360c24ad437212311c9e8d4328854baec27b4c7abb26e85515c06",
|
||||
"https://deno.land/std@0.146.0/async/deadline.ts": "48ac998d7564969f3e6ec6b6f9bf0217ebd00239b1b2292feba61272d5dd58d0",
|
||||
|
@ -234,142 +205,6 @@
|
|||
"https://deno.land/std@0.149.0/testing/_diff.ts": "029a00560b0d534bc0046f1bce4bd36b3b41ada3f2a3178c85686eb2ff5f1413",
|
||||
"https://deno.land/std@0.149.0/testing/_format.ts": "0d8dc79eab15b67cdc532826213bbe05bccfd276ca473a50a3fc7bbfb7260642",
|
||||
"https://deno.land/std@0.149.0/testing/asserts.ts": "0ee58a557ac764e762c62bb21f00e7d897e3919e71be38b2d574fb441d721005",
|
||||
"https://deno.land/std@0.157.0/_util/assert.ts": "e94f2eb37cebd7f199952e242c77654e43333c1ac4c5c700e929ea3aa5489f74",
|
||||
"https://deno.land/std@0.157.0/_util/os.ts": "8a33345f74990e627b9dfe2de9b040004b08ea5146c7c9e8fe9a29070d193934",
|
||||
"https://deno.land/std@0.157.0/encoding/hex.ts": "4cc5324417cbb4ac9b828453d35aed45b9cc29506fad658f1f138d981ae33795",
|
||||
"https://deno.land/std@0.157.0/fmt/colors.ts": "ff7dc9c9f33a72bd48bc24b21bbc1b4545d8494a431f17894dbc5fe92a938fc4",
|
||||
"https://deno.land/std@0.157.0/fs/_util.ts": "fdc156f897197f261a1c096dcf8ff9267ed0ff42bd5b31f55053a4763a4bae3b",
|
||||
"https://deno.land/std@0.157.0/fs/copy.ts": "73bdf24f4322648d9bc38ef983b818637ba368351d17aa03644209d3ce3eac31",
|
||||
"https://deno.land/std@0.157.0/fs/empty_dir.ts": "c15a0aaaf40f8c21cca902aa1e01a789ad0c2fd1b7e2eecf4957053c5dbf707f",
|
||||
"https://deno.land/std@0.157.0/fs/ensure_dir.ts": "76395fc1c989ca8d2de3aedfa8240eb8f5225cde20f926de957995b063135b80",
|
||||
"https://deno.land/std@0.157.0/fs/ensure_file.ts": "b8e32ea63aa21221d0219760ba3f741f682d7f7d68d0d24a3ec067c338568152",
|
||||
"https://deno.land/std@0.157.0/fs/ensure_link.ts": "5cc1c04f18487d7d1edf4c5469705f30b61390ffd24ad7db6df85e7209b32bb2",
|
||||
"https://deno.land/std@0.157.0/fs/ensure_symlink.ts": "5273557b8c50be69477aa9cb003b54ff2240a336db52a40851c97abce76b96ab",
|
||||
"https://deno.land/std@0.157.0/fs/eol.ts": "b92f0b88036de507e7e6fbedbe8f666835ea9dcbf5ac85917fa1fadc919f83a5",
|
||||
"https://deno.land/std@0.157.0/fs/exists.ts": "3661a679d9018338df5df7cd9fc7cd918f5e447e7304a5391f849a893ce24107",
|
||||
"https://deno.land/std@0.157.0/fs/expand_glob.ts": "333a8b9b0726b6909e5af30fb99c68e5b0e734d37af8cbc2ad1f062f26ca4d50",
|
||||
"https://deno.land/std@0.157.0/fs/mod.ts": "354a6f972ef4e00c4dd1f1339a8828ef0764c1c23d3c0010af3fcc025d8655b0",
|
||||
"https://deno.land/std@0.157.0/fs/move.ts": "6d7fa9da60dbc7a32dd7fdbc2ff812b745861213c8e92ba96dace0669b0c378c",
|
||||
"https://deno.land/std@0.157.0/fs/walk.ts": "d6c73a2a2fb5fde60150ce27cff3fff420e72e5bb84131b4919c9a41d74712ce",
|
||||
"https://deno.land/std@0.157.0/path/_constants.ts": "df1db3ffa6dd6d1252cc9617e5d72165cd2483df90e93833e13580687b6083c3",
|
||||
"https://deno.land/std@0.157.0/path/_interface.ts": "ee3b431a336b80cf445441109d089b70d87d5e248f4f90ff906820889ecf8d09",
|
||||
"https://deno.land/std@0.157.0/path/_util.ts": "d16be2a16e1204b65f9d0dfc54a9bc472cafe5f4a190b3c8471ec2016ccd1677",
|
||||
"https://deno.land/std@0.157.0/path/common.ts": "bee563630abd2d97f99d83c96c2fa0cca7cee103e8cb4e7699ec4d5db7bd2633",
|
||||
"https://deno.land/std@0.157.0/path/glob.ts": "cb5255638de1048973c3e69e420c77dc04f75755524cb3b2e160fe9277d939ee",
|
||||
"https://deno.land/std@0.157.0/path/mod.ts": "56fec03ad0ebd61b6ab39ddb9b0ddb4c4a5c9f2f4f632e09dd37ec9ebfd722ac",
|
||||
"https://deno.land/std@0.157.0/path/posix.ts": "c1f7afe274290ea0b51da07ee205653b2964bd74909a82deb07b69a6cc383aaa",
|
||||
"https://deno.land/std@0.157.0/path/separator.ts": "fe1816cb765a8068afb3e8f13ad272351c85cbc739af56dacfc7d93d710fe0f9",
|
||||
"https://deno.land/std@0.157.0/path/win32.ts": "bd7549042e37879c68ff2f8576a25950abbfca1d696d41d82c7bca0b7e6f452c",
|
||||
"https://deno.land/std@0.159.0/_util/assert.ts": "e94f2eb37cebd7f199952e242c77654e43333c1ac4c5c700e929ea3aa5489f74",
|
||||
"https://deno.land/std@0.159.0/_util/os.ts": "8a33345f74990e627b9dfe2de9b040004b08ea5146c7c9e8fe9a29070d193934",
|
||||
"https://deno.land/std@0.159.0/fs/_util.ts": "fdc156f897197f261a1c096dcf8ff9267ed0ff42bd5b31f55053a4763a4bae3b",
|
||||
"https://deno.land/std@0.159.0/fs/copy.ts": "73bdf24f4322648d9bc38ef983b818637ba368351d17aa03644209d3ce3eac31",
|
||||
"https://deno.land/std@0.159.0/fs/empty_dir.ts": "c15a0aaaf40f8c21cca902aa1e01a789ad0c2fd1b7e2eecf4957053c5dbf707f",
|
||||
"https://deno.land/std@0.159.0/fs/ensure_dir.ts": "76395fc1c989ca8d2de3aedfa8240eb8f5225cde20f926de957995b063135b80",
|
||||
"https://deno.land/std@0.159.0/fs/ensure_file.ts": "b8e32ea63aa21221d0219760ba3f741f682d7f7d68d0d24a3ec067c338568152",
|
||||
"https://deno.land/std@0.159.0/fs/ensure_link.ts": "5cc1c04f18487d7d1edf4c5469705f30b61390ffd24ad7db6df85e7209b32bb2",
|
||||
"https://deno.land/std@0.159.0/fs/ensure_symlink.ts": "5273557b8c50be69477aa9cb003b54ff2240a336db52a40851c97abce76b96ab",
|
||||
"https://deno.land/std@0.159.0/fs/eol.ts": "b92f0b88036de507e7e6fbedbe8f666835ea9dcbf5ac85917fa1fadc919f83a5",
|
||||
"https://deno.land/std@0.159.0/fs/exists.ts": "6a447912e49eb79cc640adacfbf4b0baf8e17ede6d5bed057062ce33c4fa0d68",
|
||||
"https://deno.land/std@0.159.0/fs/expand_glob.ts": "333a8b9b0726b6909e5af30fb99c68e5b0e734d37af8cbc2ad1f062f26ca4d50",
|
||||
"https://deno.land/std@0.159.0/fs/mod.ts": "354a6f972ef4e00c4dd1f1339a8828ef0764c1c23d3c0010af3fcc025d8655b0",
|
||||
"https://deno.land/std@0.159.0/fs/move.ts": "6d7fa9da60dbc7a32dd7fdbc2ff812b745861213c8e92ba96dace0669b0c378c",
|
||||
"https://deno.land/std@0.159.0/fs/walk.ts": "d6c73a2a2fb5fde60150ce27cff3fff420e72e5bb84131b4919c9a41d74712ce",
|
||||
"https://deno.land/std@0.159.0/path/_constants.ts": "df1db3ffa6dd6d1252cc9617e5d72165cd2483df90e93833e13580687b6083c3",
|
||||
"https://deno.land/std@0.159.0/path/_interface.ts": "ee3b431a336b80cf445441109d089b70d87d5e248f4f90ff906820889ecf8d09",
|
||||
"https://deno.land/std@0.159.0/path/_util.ts": "d16be2a16e1204b65f9d0dfc54a9bc472cafe5f4a190b3c8471ec2016ccd1677",
|
||||
"https://deno.land/std@0.159.0/path/common.ts": "bee563630abd2d97f99d83c96c2fa0cca7cee103e8cb4e7699ec4d5db7bd2633",
|
||||
"https://deno.land/std@0.159.0/path/glob.ts": "cb5255638de1048973c3e69e420c77dc04f75755524cb3b2e160fe9277d939ee",
|
||||
"https://deno.land/std@0.159.0/path/mod.ts": "56fec03ad0ebd61b6ab39ddb9b0ddb4c4a5c9f2f4f632e09dd37ec9ebfd722ac",
|
||||
"https://deno.land/std@0.159.0/path/posix.ts": "c1f7afe274290ea0b51da07ee205653b2964bd74909a82deb07b69a6cc383aaa",
|
||||
"https://deno.land/std@0.159.0/path/separator.ts": "fe1816cb765a8068afb3e8f13ad272351c85cbc739af56dacfc7d93d710fe0f9",
|
||||
"https://deno.land/std@0.159.0/path/win32.ts": "bd7549042e37879c68ff2f8576a25950abbfca1d696d41d82c7bca0b7e6f452c",
|
||||
"https://deno.land/std@0.176.0/_util/asserts.ts": "178dfc49a464aee693a7e285567b3d0b555dc805ff490505a8aae34f9cfb1462",
|
||||
"https://deno.land/std@0.176.0/_util/os.ts": "d932f56d41e4f6a6093d56044e29ce637f8dcc43c5a90af43504a889cf1775e3",
|
||||
"https://deno.land/std@0.176.0/encoding/hex.ts": "50f8c95b52eae24395d3dfcb5ec1ced37c5fe7610ef6fffdcc8b0fdc38e3b32f",
|
||||
"https://deno.land/std@0.176.0/fmt/colors.ts": "938c5d44d889fb82eff6c358bea8baa7e85950a16c9f6dae3ec3a7a729164471",
|
||||
"https://deno.land/std@0.176.0/fs/_util.ts": "65381f341af1ff7f40198cee15c20f59951ac26e51ddc651c5293e24f9ce6f32",
|
||||
"https://deno.land/std@0.176.0/fs/copy.ts": "14214efd94fc3aa6db1e4af2b4b9578e50f7362b7f3725d5a14ad259a5df26c8",
|
||||
"https://deno.land/std@0.176.0/fs/empty_dir.ts": "c3d2da4c7352fab1cf144a1ecfef58090769e8af633678e0f3fabaef98594688",
|
||||
"https://deno.land/std@0.176.0/fs/ensure_dir.ts": "724209875497a6b4628dfb256116e5651c4f7816741368d6c44aab2531a1e603",
|
||||
"https://deno.land/std@0.176.0/fs/ensure_file.ts": "c38602670bfaf259d86ca824a94e6cb9e5eb73757fefa4ebf43a90dd017d53d9",
|
||||
"https://deno.land/std@0.176.0/fs/ensure_link.ts": "c0f5b2f0ec094ed52b9128eccb1ee23362a617457aa0f699b145d4883f5b2fb4",
|
||||
"https://deno.land/std@0.176.0/fs/ensure_symlink.ts": "2955cc8332aeca9bdfefd05d8d3976b94e282b0f353392a71684808ed2ffdd41",
|
||||
"https://deno.land/std@0.176.0/fs/eol.ts": "f1f2eb348a750c34500741987b21d65607f352cf7205f48f4319d417fff42842",
|
||||
"https://deno.land/std@0.176.0/fs/exists.ts": "b8c8a457b71e9d7f29b9d2f87aad8dba2739cbe637e8926d6ba6e92567875f8e",
|
||||
"https://deno.land/std@0.176.0/fs/expand_glob.ts": "45d17e89796a24bd6002e4354eda67b4301bb8ba67d2cac8453cdabccf1d9ab0",
|
||||
"https://deno.land/std@0.176.0/fs/mod.ts": "bc3d0acd488cc7b42627044caf47d72019846d459279544e1934418955ba4898",
|
||||
"https://deno.land/std@0.176.0/fs/move.ts": "4cb47f880e3f0582c55e71c9f8b1e5e8cfaacb5e84f7390781dd563b7298ec19",
|
||||
"https://deno.land/std@0.176.0/fs/walk.ts": "ea95ffa6500c1eda6b365be488c056edc7c883a1db41ef46ec3bf057b1c0fe32",
|
||||
"https://deno.land/std@0.176.0/path/_constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0",
|
||||
"https://deno.land/std@0.176.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b",
|
||||
"https://deno.land/std@0.176.0/path/_util.ts": "d7abb1e0dea065f427b89156e28cdeb32b045870acdf865833ba808a73b576d0",
|
||||
"https://deno.land/std@0.176.0/path/common.ts": "ee7505ab01fd22de3963b64e46cff31f40de34f9f8de1fff6a1bd2fe79380000",
|
||||
"https://deno.land/std@0.176.0/path/glob.ts": "d479e0a695621c94d3fd7fe7abd4f9499caf32a8de13f25073451c6ef420a4e1",
|
||||
"https://deno.land/std@0.176.0/path/mod.ts": "4b83694ac500d7d31b0cdafc927080a53dc0c3027eb2895790fb155082b0d232",
|
||||
"https://deno.land/std@0.176.0/path/posix.ts": "8b7c67ac338714b30c816079303d0285dd24af6b284f7ad63da5b27372a2c94d",
|
||||
"https://deno.land/std@0.176.0/path/separator.ts": "0fb679739d0d1d7bf45b68dacfb4ec7563597a902edbaf3c59b50d5bcadd93b1",
|
||||
"https://deno.land/std@0.176.0/path/win32.ts": "d186344e5583bcbf8b18af416d13d82b35a317116e6460a5a3953508c3de5bba",
|
||||
"https://deno.land/std@0.186.0/_util/asserts.ts": "178dfc49a464aee693a7e285567b3d0b555dc805ff490505a8aae34f9cfb1462",
|
||||
"https://deno.land/std@0.186.0/_util/os.ts": "d932f56d41e4f6a6093d56044e29ce637f8dcc43c5a90af43504a889cf1775e3",
|
||||
"https://deno.land/std@0.186.0/async/deferred.ts": "42790112f36a75a57db4a96d33974a936deb7b04d25c6084a9fa8a49f135def8",
|
||||
"https://deno.land/std@0.186.0/bytes/bytes_list.ts": "31d664f4d42fa922066405d0e421c56da89d751886ee77bbe25a88bf0310c9d0",
|
||||
"https://deno.land/std@0.186.0/bytes/concat.ts": "d26d6f3d7922e6d663dacfcd357563b7bf4a380ce5b9c2bbe0c8586662f25ce2",
|
||||
"https://deno.land/std@0.186.0/bytes/copy.ts": "939d89e302a9761dcf1d9c937c7711174ed74c59eef40a1e4569a05c9de88219",
|
||||
"https://deno.land/std@0.186.0/encoding/base64.ts": "144ae6234c1fbe5b68666c711dc15b1e9ee2aef6d42b3b4345bf9a6c91d70d0d",
|
||||
"https://deno.land/std@0.186.0/fmt/colors.ts": "d67e3cd9f472535241a8e410d33423980bec45047e343577554d3356e1f0ef4e",
|
||||
"https://deno.land/std@0.186.0/io/buf_reader.ts": "06fff3337091c49e99ebd2dd790c9a90364c087a2953ea081667400fd6c6cebb",
|
||||
"https://deno.land/std@0.186.0/io/buf_writer.ts": "48c33c8f00b61dcbc7958706741cec8e59810bd307bc6a326cbd474fe8346dfd",
|
||||
"https://deno.land/std@0.186.0/io/buffer.ts": "17f4410eaaa60a8a85733e8891349a619eadfbbe42e2f319283ce2b8f29723ab",
|
||||
"https://deno.land/std@0.186.0/io/copy_n.ts": "0cc7ce07c75130f6fc18621ec1911c36e147eb9570664fee0ea12b1988167590",
|
||||
"https://deno.land/std@0.186.0/io/limited_reader.ts": "6c9a216f8eef39c1ee2a6b37a29372c8fc63455b2eeb91f06d9646f8f759fc8b",
|
||||
"https://deno.land/std@0.186.0/io/mod.ts": "2665bcccc1fd6e8627cca167c3e92aaecbd9897556b6f69e6d258070ef63fd9b",
|
||||
"https://deno.land/std@0.186.0/io/multi_reader.ts": "9c2a0a31686c44b277e16da1d97b4686a986edcee48409b84be25eedbc39b271",
|
||||
"https://deno.land/std@0.186.0/io/read_delim.ts": "c02b93cc546ae8caad8682ae270863e7ace6daec24c1eddd6faabc95a9d876a3",
|
||||
"https://deno.land/std@0.186.0/io/read_int.ts": "7cb8bcdfaf1107586c3bacc583d11c64c060196cb070bb13ae8c2061404f911f",
|
||||
"https://deno.land/std@0.186.0/io/read_lines.ts": "c526c12a20a9386dc910d500f9cdea43cba974e853397790bd146817a7eef8cc",
|
||||
"https://deno.land/std@0.186.0/io/read_long.ts": "f0aaa420e3da1261c5d33c5e729f09922f3d9fa49f046258d4ff7a00d800c71e",
|
||||
"https://deno.land/std@0.186.0/io/read_range.ts": "28152daf32e43dd9f7d41d8466852b0d18ad766cd5c4334c91fef6e1b3a74eb5",
|
||||
"https://deno.land/std@0.186.0/io/read_short.ts": "805cb329574b850b84bf14a92c052c59b5977a492cd780c41df8ad40826c1a20",
|
||||
"https://deno.land/std@0.186.0/io/read_string_delim.ts": "5dc9f53bdf78e7d4ee1e56b9b60352238ab236a71c3e3b2a713c3d78472a53ce",
|
||||
"https://deno.land/std@0.186.0/io/slice_long_to_bytes.ts": "48d9bace92684e880e46aa4a2520fc3867f9d7ce212055f76ecc11b22f9644b7",
|
||||
"https://deno.land/std@0.186.0/io/string_reader.ts": "da0f68251b3d5b5112485dfd4d1b1936135c9b4d921182a7edaf47f74c25cc8f",
|
||||
"https://deno.land/std@0.186.0/io/string_writer.ts": "8a03c5858c24965a54c6538bed15f32a7c72f5704a12bda56f83a40e28e5433e",
|
||||
"https://deno.land/std@0.186.0/path/_constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0",
|
||||
"https://deno.land/std@0.186.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b",
|
||||
"https://deno.land/std@0.186.0/path/_util.ts": "d7abb1e0dea065f427b89156e28cdeb32b045870acdf865833ba808a73b576d0",
|
||||
"https://deno.land/std@0.186.0/path/common.ts": "ee7505ab01fd22de3963b64e46cff31f40de34f9f8de1fff6a1bd2fe79380000",
|
||||
"https://deno.land/std@0.186.0/path/glob.ts": "d479e0a695621c94d3fd7fe7abd4f9499caf32a8de13f25073451c6ef420a4e1",
|
||||
"https://deno.land/std@0.186.0/path/mod.ts": "ee161baec5ded6510ee1d1fb6a75a0f5e4b41f3f3301c92c716ecbdf7dae910d",
|
||||
"https://deno.land/std@0.186.0/path/posix.ts": "8b7c67ac338714b30c816079303d0285dd24af6b284f7ad63da5b27372a2c94d",
|
||||
"https://deno.land/std@0.186.0/path/separator.ts": "0fb679739d0d1d7bf45b68dacfb4ec7563597a902edbaf3c59b50d5bcadd93b1",
|
||||
"https://deno.land/std@0.186.0/path/win32.ts": "d186344e5583bcbf8b18af416d13d82b35a317116e6460a5a3953508c3de5bba",
|
||||
"https://deno.land/std@0.186.0/streams/_common.ts": "f45cba84f0d813de3326466095539602364a9ba521f804cc758f7a475cda692d",
|
||||
"https://deno.land/std@0.186.0/streams/buffer.ts": "d5b3d7d0299114e5b2ea895a8bf202a687fd915c5282f8096c7bae23b5a04407",
|
||||
"https://deno.land/std@0.186.0/streams/byte_slice_stream.ts": "225d57263a34325d7c96cb3dafeb478eec0e6fd05cd0458d678752eadd132bb4",
|
||||
"https://deno.land/std@0.186.0/streams/copy.ts": "75cbc795ff89291df22ddca5252de88b2e16d40c85d02840593386a8a1454f71",
|
||||
"https://deno.land/std@0.186.0/streams/delimiter_stream.ts": "f69e849b3d1f59f02424497273f411105a6f76a9f13da92aeeb9a2d554236814",
|
||||
"https://deno.land/std@0.186.0/streams/early_zip_readable_streams.ts": "4005fa74162b943f79899e5d7cb96adcbc0a6b867f9144974ed12d30e0a556e1",
|
||||
"https://deno.land/std@0.186.0/streams/iterate_reader.ts": "bbec1d45c2df2c0c5920bad0549351446fdc8e0886d99e95959b259dbcdb6072",
|
||||
"https://deno.land/std@0.186.0/streams/limited_bytes_transform_stream.ts": "05dc592ffaab83257494d22dd53917e56243c26e5e3129b3f13ddbbbc4785048",
|
||||
"https://deno.land/std@0.186.0/streams/limited_transform_stream.ts": "d69ab790232c1b86f53621ad41ef03c235f2abb4b7a1cd51960ad6e12ee55e38",
|
||||
"https://deno.land/std@0.186.0/streams/merge_readable_streams.ts": "5d6302888f4bb0616dafb5768771be0aec9bedc05fbae6b3d726d05ffbec5b15",
|
||||
"https://deno.land/std@0.186.0/streams/mod.ts": "c07ec010e700b9ea887dc36ca08729828bc7912f711e4054e24d33fd46282252",
|
||||
"https://deno.land/std@0.186.0/streams/read_all.ts": "ee319772fb0fd28302f97343cc48dfcf948f154fd0d755d8efe65814b70533be",
|
||||
"https://deno.land/std@0.186.0/streams/readable_stream_from_iterable.ts": "cd4bb9e9bf6dbe84c213beb1f5085c326624421671473e410cfaecad15f01865",
|
||||
"https://deno.land/std@0.186.0/streams/readable_stream_from_reader.ts": "bfc416c4576a30aac6b9af22c9dc292c20c6742141ee7c55b5e85460beb0c54e",
|
||||
"https://deno.land/std@0.186.0/streams/reader_from_iterable.ts": "55f68110dce3f8f2c87b834d95f153bc904257fc65175f9f2abe78455cb8047c",
|
||||
"https://deno.land/std@0.186.0/streams/reader_from_stream_reader.ts": "fa4971e5615a010e49492c5d1688ca1a4d17472a41e98b498ab89a64ebd7ac73",
|
||||
"https://deno.land/std@0.186.0/streams/text_delimiter_stream.ts": "20e680ab8b751390e359288ce764f9c47d164af11a263870746eeca4bc7d976b",
|
||||
"https://deno.land/std@0.186.0/streams/text_line_stream.ts": "0f2c4b33a5fdb2476f2e060974cba1347cefe99a4af33c28a57524b1a34750fa",
|
||||
"https://deno.land/std@0.186.0/streams/to_transform_stream.ts": "7f55fc0b14cf3ed0f8d10d8f41d05bdc40726e44a65c37f58705d10a615f0159",
|
||||
"https://deno.land/std@0.186.0/streams/writable_stream_from_writer.ts": "56fff5c82fb736fdd669b567cc0b2bbbe0351002cd13254eae26c366e2bed89a",
|
||||
"https://deno.land/std@0.186.0/streams/write_all.ts": "aec90152978581ea62d56bb53a5cbf487e6a89c902f87c5969681ffbdf32b998",
|
||||
"https://deno.land/std@0.186.0/streams/writer_from_stream_writer.ts": "07c7ee025151a190f37fc42cbb01ff93afc949119ebddc6e0d0df14df1bf6950",
|
||||
"https://deno.land/std@0.186.0/streams/zip_readable_streams.ts": "a9d81aa451240f79230add674809dbee038d93aabe286e2d9671e66591fc86ca",
|
||||
"https://deno.land/std@0.186.0/testing/_diff.ts": "1a3c044aedf77647d6cac86b798c6417603361b66b54c53331b312caeb447aea",
|
||||
"https://deno.land/std@0.186.0/testing/_format.ts": "a69126e8a469009adf4cf2a50af889aca364c349797e63174884a52ff75cf4c7",
|
||||
"https://deno.land/std@0.186.0/testing/asserts.ts": "e16d98b4d73ffc4ed498d717307a12500ae4f2cbe668f1a215632d19fcffc22f",
|
||||
"https://deno.land/std@0.202.0/media_types/_db.ts": "7606d83e31f23ce1a7968cbaee852810c2cf477903a095696cdc62eaab7ce570",
|
||||
"https://deno.land/std@0.202.0/media_types/_util.ts": "0879b04cc810ff18d3dcd97d361e03c9dfb29f67d7fc4a9c6c9d387282ef5fe8",
|
||||
"https://deno.land/std@0.202.0/media_types/content_type.ts": "ad98a5aa2d95f5965b2796072284258710a25e520952376ed432b0937ce743bc",
|
||||
|
@ -381,17 +216,6 @@
|
|||
"https://deno.land/std@0.202.0/media_types/parse_media_type.ts": "31ccf2388ffab31b49500bb89fa0f5de189c8897e2ee6c9954f207637d488211",
|
||||
"https://deno.land/std@0.202.0/media_types/type_by_extension.ts": "8c210d4e28ea426414dd8c61146eefbcc7e091a89ccde54bbbe883a154856afd",
|
||||
"https://deno.land/std@0.202.0/media_types/vendor/mime-db.v1.52.0.ts": "6925bbcae81ca37241e3f55908d0505724358cda3384eaea707773b2c7e99586",
|
||||
"https://deno.land/std@0.99.0/_util/assert.ts": "2f868145a042a11d5ad0a3c748dcf580add8a0dbc0e876eaa0026303a5488f58",
|
||||
"https://deno.land/std@0.99.0/_util/os.ts": "e282950a0eaa96760c0cf11e7463e66babd15ec9157d4c9ed49cc0925686f6a7",
|
||||
"https://deno.land/std@0.99.0/path/_constants.ts": "1247fee4a79b70c89f23499691ef169b41b6ccf01887a0abd131009c5581b853",
|
||||
"https://deno.land/std@0.99.0/path/_interface.ts": "1fa73b02aaa24867e481a48492b44f2598cd9dfa513c7b34001437007d3642e4",
|
||||
"https://deno.land/std@0.99.0/path/_util.ts": "2e06a3b9e79beaf62687196bd4b60a4c391d862cfa007a20fc3a39f778ba073b",
|
||||
"https://deno.land/std@0.99.0/path/common.ts": "eaf03d08b569e8a87e674e4e265e099f237472b6fd135b3cbeae5827035ea14a",
|
||||
"https://deno.land/std@0.99.0/path/glob.ts": "314ad9ff263b895795208cdd4d5e35a44618ca3c6dd155e226fb15d065008652",
|
||||
"https://deno.land/std@0.99.0/path/mod.ts": "4465dc494f271b02569edbb4a18d727063b5dbd6ed84283ff906260970a15d12",
|
||||
"https://deno.land/std@0.99.0/path/posix.ts": "f56c3c99feb47f30a40ce9d252ef6f00296fa7c0fcb6dd81211bdb3b8b99ca3b",
|
||||
"https://deno.land/std@0.99.0/path/separator.ts": "8fdcf289b1b76fd726a508f57d3370ca029ae6976fcde5044007f062e643ff1c",
|
||||
"https://deno.land/std@0.99.0/path/win32.ts": "77f7b3604e0de40f3a7c698e8a79e7f601dc187035a1c21cb1e596666ce112f8",
|
||||
"https://deno.land/x/canvas@v1.4.1/deps.ts": "e956026d98094946166e06d7b799290b732db015813870d84e04e33ab88e98f3",
|
||||
"https://deno.land/x/canvas@v1.4.1/mod.ts": "a4e16972647ceafef58612a377a218372454c99d2c9da615a132694597114f80",
|
||||
"https://deno.land/x/canvas@v1.4.1/src/base64.ts": "0928031fdba0c43b617154fbe2eb7578366460c04da1422933ae5e936d3d0349",
|
||||
|
@ -401,28 +225,12 @@
|
|||
"https://deno.land/x/canvas@v1.4.1/src/lib.js": "bb21711589bfbc8997b455cdf53e3150e23289f3b44809188041b1d2fc7924fa",
|
||||
"https://deno.land/x/canvas@v1.4.1/src/types.ts": "67d5800f8f4b0a407e0251676a03ae91b5f50a3ed53e6b72dc5984113cb93128",
|
||||
"https://deno.land/x/canvas@v1.4.1/src/wasm.js": "449d72cc14fc4142a5853f944df49a744d852981d09c5515528ede8aebb0afda",
|
||||
"https://deno.land/x/clippy@v0.2.2/bindings/bindings.ts": "c7678a4bfa5748b77aead8f99c449c8351500783a65e2e8c0607bfe231b5b013",
|
||||
"https://deno.land/x/clippy@v0.2.2/deps.ts": "6bcfee8a6054be6c52d7a51d8cf21b37bb6bfbda3bd3b7d5eda0081dde9dd4a2",
|
||||
"https://deno.land/x/clippy@v0.2.2/mod.ts": "ff4966a3a21a59ae5a676a4e0737d044eac8006e93498cfbb6a8a4bdb24abab1",
|
||||
"https://deno.land/x/clippy@v0.2.2/platform/darwin.ts": "ed74ede39c1e5a8a4afee2dbc5507b75d71c27049fabd8f98e7e2d595886dcc8",
|
||||
"https://deno.land/x/clippy@v0.2.2/platform/helper.ts": "ba1ae4bc0905a3c21c423f83f425b654ba817fbb80341465e5338ef516ca3730",
|
||||
"https://deno.land/x/clippy@v0.2.2/platform/linux.ts": "241911a15062899e697d4f7b92c213c171429aa4ba9730a909a18ceb582fd590",
|
||||
"https://deno.land/x/clippy@v0.2.2/platform/mod.ts": "b7324415e824785bc29c3fdb90bf6a27fb6025f806c8cd516461cc58f2aba5dd",
|
||||
"https://deno.land/x/clippy@v0.2.2/platform/windows.ts": "c83adf9f54b452a9adc84eacf9498ec5a8170274ece84c26ed93d19952cd834a",
|
||||
"https://deno.land/x/copy_paste@v1.1.3/deps.ts": "89bfebe10979530b38b3be2ace3b24a7b83dbecb2a6cca7cd7b05b9a86fb1e61",
|
||||
"https://deno.land/x/copy_paste@v1.1.3/mod.ts": "3b82d6c620749acb86398bbec1f2c1f472cc39921c22ca7d7a98ab682b170f20",
|
||||
"https://deno.land/x/deno_cache@0.5.2/auth_tokens.ts": "5d1d56474c54a9d152e44d43ea17c2e6a398dd1e9682c69811a313567c01ee1e",
|
||||
"https://deno.land/x/deno_cache@0.5.2/cache.ts": "92ce8511e1e5c00fdf53a41619aa77d632ea8e0fc711324322e4d5ebf8133911",
|
||||
"https://deno.land/x/deno_cache@0.5.2/deno_dir.ts": "1ea355b8ba11c630d076b222b197cfc937dd81e5a4a260938997da99e8ff93a0",
|
||||
"https://deno.land/x/deno_cache@0.5.2/deps.ts": "26a75905652510b76e54b6d5ef3cf824d1062031e00782efcd768978419224e7",
|
||||
"https://deno.land/x/deno_cache@0.5.2/dirs.ts": "009c6f54e0b610914d6ce9f72f6f6ccfffd2d47a79a19061e0a9eb4253836069",
|
||||
"https://deno.land/x/deno_cache@0.5.2/disk_cache.ts": "66a1e604a8d564b6dd0500326cac33d08b561d331036bf7272def80f2f7952aa",
|
||||
"https://deno.land/x/deno_cache@0.5.2/file_fetcher.ts": "89616c50b6df73fb04e73d0b7cd99e5f2ed7967386913d65b9e8baa4238501f7",
|
||||
"https://deno.land/x/deno_cache@0.5.2/http_cache.ts": "407135eaf2802809ed373c230d57da7ef8dff923c4abf205410b9b99886491fd",
|
||||
"https://deno.land/x/deno_cache@0.5.2/lib/deno_cache_dir.generated.js": "18b6526d0c50791a73dd0eb894e99de1ac05ee79dcbd53298ff5b5b6b0757fe6",
|
||||
"https://deno.land/x/deno_cache@0.5.2/lib/snippets/deno_cache_dir-77bed54ace8005e0/fs.js": "cbe3a976ed63c72c7cb34ef845c27013033a3b11f9d8d3e2c4aa5dda2c0c7af6",
|
||||
"https://deno.land/x/deno_cache@0.5.2/mod.ts": "0b4d071ad095128bdc2b1bc6e5d2095222dcbae08287261690ee9757e6300db6",
|
||||
"https://deno.land/x/deno_cache@0.5.2/util.ts": "f3f5a0cfc60051f09162942fb0ee87a0e27b11a12aec4c22076e3006be4cc1e2",
|
||||
"https://deno.land/x/css@0.3.0/core/lexer/lexer.ts": "4260365331a970526566e773e3399a0a90420c5fc18eb76664a5d9d36fe36c63",
|
||||
"https://deno.land/x/css@0.3.0/core/parser/parser.ts": "c9fc6db27f346e7a34b66ea19232e1540e9c88f477da3246f6b3a3efae11c0a9",
|
||||
"https://deno.land/x/css@0.3.0/debug/debug.js": "fb6774490c1c6236453837d8507a1df32270eabff568ec991355cfcb7ca47f2b",
|
||||
"https://deno.land/x/css@0.3.0/mod.ts": "e9f5f17cfeb7843732291c263e0a912c31861465680b2234079e9a7dfd7de178",
|
||||
"https://deno.land/x/deno_dom@v0.1.38/build/deno-wasm/deno-wasm.js": "98b1ad24a1c13284557917659402202e5c5258ab1431b3f3a82434ad36ffa05a",
|
||||
"https://deno.land/x/deno_dom@v0.1.38/deno-dom-wasm.ts": "bfd999a493a6974e9fca4d331bee03bfb68cfc600c662cd0b48b21d67a2a8ba0",
|
||||
"https://deno.land/x/deno_dom@v0.1.38/src/api.ts": "0ff5790f0a3eeecb4e00b7d8fbfa319b165962cf6d0182a65ba90f158d74f7d7",
|
||||
|
@ -445,49 +253,100 @@
|
|||
"https://deno.land/x/deno_dom@v0.1.38/src/dom/utils-types.ts": "96db30e3e4a75b194201bb9fa30988215da7f91b380fca6a5143e51ece2a8436",
|
||||
"https://deno.land/x/deno_dom@v0.1.38/src/dom/utils.ts": "55f3e9dc71d6c4a54605888d3f99d26fb0cf9973924709f159252a6933ceeabe",
|
||||
"https://deno.land/x/deno_dom@v0.1.38/src/parser.ts": "b65eb7e673fa7ca611de871de109655f0aa9fa35ddc1de73df1a5fc2baafc332",
|
||||
"https://deno.land/x/dir@1.5.1/data_local_dir/mod.ts": "91eb1c4bfadfbeda30171007bac6d85aadacd43224a5ed721bbe56bc64e9eb66",
|
||||
"https://deno.land/x/emit@0.28.0/_utils.ts": "98412edc7aa29e77d592b54fbad00bdec1b05d0c25eb772a5f8edc9813e08d88",
|
||||
"https://deno.land/x/emit@0.28.0/emit.generated.js": "6ca765a2a7a1c2dab97e747981e6a9fb98a5acd7a0aa78a003e596fdd0632480",
|
||||
"https://deno.land/x/emit@0.28.0/mod.ts": "817cb45fcd94d15a43de826161049eee89e3be4bcf06b3a2f60e8cf459e559f1",
|
||||
"https://deno.land/x/media_types@v2.9.0/db.ts": "ba39cddbcefce47d577c0529066787a3a7b39d27750a6d32b5ad53ed487e7b7b",
|
||||
"https://deno.land/x/media_types@v2.9.0/deps.ts": "364b24c35845cfd5c6903ab22b8ba9873bf1022bbbf6bf3d001695332d4bbb4f",
|
||||
"https://deno.land/x/media_types@v2.9.0/mod.ts": "d63583b978d32eff8b76e1ae5d83cba2fb27baa90cc1bcb0ad15a06122ea8c19",
|
||||
"https://deno.land/x/plug@1.0.0-rc.3/deps.ts": "ea73ca429e71624fdae0fe9393fe5056b9404d058ef45688eda4150112cf85d3",
|
||||
"https://deno.land/x/plug@1.0.0-rc.3/download.ts": "81d1aef0595e018514f1d70a5c52b0267d81685e2dccb5459f8427b29f3f3736",
|
||||
"https://deno.land/x/plug@1.0.0-rc.3/mod.ts": "6db7edf982efedf8c9e1002754fbb109c22201fd8fb89ba715fe70171b5e821c",
|
||||
"https://deno.land/x/plug@1.0.0-rc.3/types.ts": "d8eb738fc6ed883e6abf77093442c2f0b71af9090f15c7613621d4039e410ee1",
|
||||
"https://deno.land/x/plug@1.0.0-rc.3/util.ts": "e53018a487292d11036efeae9da81eb82ef47f9e53d0ba83f545b0220350155a",
|
||||
"https://deno.land/x/plug@1.0.1/deps.ts": "35ea2acd5e3e11846817a429b7ef4bec47b80f2d988f5d63797147134cbd35c2",
|
||||
"https://deno.land/x/plug@1.0.1/download.ts": "8d6a023ade0806a0653b48cd5f6f8b15fcfaa1dbf2aa1f4bc90fc5732d27b144",
|
||||
"https://deno.land/x/plug@1.0.1/mod.ts": "5dec80ee7a3a325be45c03439558531bce7707ac118f4376cebbd6740ff24bfb",
|
||||
"https://deno.land/x/plug@1.0.1/types.ts": "d8eb738fc6ed883e6abf77093442c2f0b71af9090f15c7613621d4039e410ee1",
|
||||
"https://deno.land/x/plug@1.0.1/util.ts": "5ba8127b9adc36e070b9e22971fb8106869eea1741f452a87b4861e574f13481",
|
||||
"https://deno.land/x/skia_canvas@0.5.4/deno.json": "ac769aa50ba8a157a906b748b3aaabf595b3814f3ff269eeddf47dbbac99f98b",
|
||||
"https://deno.land/x/skia_canvas@0.5.4/deps.ts": "34e46a90f0477bc96e22a771c335d4fadeb80bf220f25864d52bfa763f86b68b",
|
||||
"https://deno.land/x/skia_canvas@0.5.4/mod.ts": "62b65707c46334f15f94647be6280c818d90d9976ef8ca70eb607954b9539e5e",
|
||||
"https://deno.land/x/skia_canvas@0.5.4/src/canvas.ts": "be5686ed5aea402f773278716c15fb95c5ea68a0c4d6e7de2d8e2fbdd8706e66",
|
||||
"https://deno.land/x/skia_canvas@0.5.4/src/context2d.ts": "0c760904da932bca02aebdf821d579104ae4626ad1ccf6ac98bbab394f9bd391",
|
||||
"https://deno.land/x/skia_canvas@0.5.4/src/dommatrix.ts": "1f09349bceb483deb2dffa514c8a940a7cd7d61a6a6d0269a3f9837ce5cbe7d6",
|
||||
"https://deno.land/x/skia_canvas@0.5.4/src/ffi.ts": "bc17171419339a48a9d1d68078d4943e5a99ac8bcdc5dce5f0229b4d447f3d18",
|
||||
"https://deno.land/x/skia_canvas@0.5.4/src/filter.ts": "e4cf8a7a76eb60325e623bba09e500c51d465e9c8b44a86e6f6e469c8358644d",
|
||||
"https://deno.land/x/skia_canvas@0.5.4/src/font.ts": "26fc6b01549639a6382b64d13834c3f25ad4a52796adf4edab766b9409683e1a",
|
||||
"https://deno.land/x/skia_canvas@0.5.4/src/gradient.ts": "f6676d8d896c5707041a30e1d5bfde1e74b7ddb28b396d2965f96f4e52f0ab18",
|
||||
"https://deno.land/x/skia_canvas@0.5.4/src/image.ts": "d3de72de329979e40679e07711508488cd5cb93f1166575e550d53fb654bcf85",
|
||||
"https://deno.land/x/skia_canvas@0.5.4/src/parse_font.ts": "1f0fda5e18237d7cc594f5605b2d4dbf4f275134a3b75b738e1327c1e6aabc57",
|
||||
"https://deno.land/x/skia_canvas@0.5.4/src/path2d.ts": "3ed530a8e54123ef7839d0ae265098f76e97710c903b8ad02698a2086cf6432d",
|
||||
"https://deno.land/x/skia_canvas@0.5.4/src/pattern.ts": "3480d86043492687dabcd25f082648bc1a67b50c49a7d953b8eadd91c39df642",
|
||||
"https://deno.land/x/skia_canvas@0.5.4/src/pdfdocument.ts": "a7b4ccd63f2233a527b32a1e1084f3a417b6717a00d8f9b367ea69618986fbb0",
|
||||
"https://deno.land/x/skia_canvas@0.5.4/src/svgcanvas.ts": "c7eee05b8e4f66636c2ee1361096cf3241a7e7895ba0086eeea448fa67438147",
|
||||
"https://deno.land/x/wasmbuild@0.14.1/cache.ts": "89eea5f3ce6035a1164b3e655c95f21300498920575ade23161421f5b01967f4",
|
||||
"https://deno.land/x/wasmbuild@0.14.1/loader.ts": "d98d195a715f823151cbc8baa3f32127337628379a02d9eb2a3c5902dbccfc02",
|
||||
"https://deno.land/x/xhr@0.1.0/mod.ts": "5200325d879e571961f0927e8e32e66fd33f4ba0d29a219560cf9e0fe9bc6cdf",
|
||||
"https://esm.sh/preact-render-to-string@5.2.0?external=preact": "834df8d191aa1435e1164e430dc68b5c42a69b1f6624e103e039a96dc702c05d",
|
||||
"https://deno.land/x/deno_dom@v0.1.43/build/deno-wasm/deno-wasm.js": "d6841a06342eb6a2798ef28de79ad69c0f2fa349fa04d3ca45e5fcfbf50a9340",
|
||||
"https://deno.land/x/deno_dom@v0.1.43/deno-dom-wasm.ts": "a33d160421bbb6e3104285ea5ebf33352b7ad50d82ea8765e3cf65f972b25119",
|
||||
"https://deno.land/x/deno_dom@v0.1.43/src/api.ts": "0ff5790f0a3eeecb4e00b7d8fbfa319b165962cf6d0182a65ba90f158d74f7d7",
|
||||
"https://deno.land/x/deno_dom@v0.1.43/src/constructor-lock.ts": "59714df7e0571ec7bd338903b1f396202771a6d4d7f55a452936bd0de9deb186",
|
||||
"https://deno.land/x/deno_dom@v0.1.43/src/deserialize.ts": "1cf4096678d8afed8ed28dbad690504c4d2c28149ba768b26eacd1416873425b",
|
||||
"https://deno.land/x/deno_dom@v0.1.43/src/dom/document-fragment.ts": "1c7352a3c816587ed7fad574b42636198f680f17abc3836fcfe7799b31e7718f",
|
||||
"https://deno.land/x/deno_dom@v0.1.43/src/dom/document.ts": "b8f4e4ccabaaa063d6562a0f2f8dea9c0419515d63d8bd79bfde95f7cd64bd93",
|
||||
"https://deno.land/x/deno_dom@v0.1.43/src/dom/dom-parser.ts": "609097b426f8c2358f3e5d2bca55ed026cf26cdf86562e94130dfdb0f2537f92",
|
||||
"https://deno.land/x/deno_dom@v0.1.43/src/dom/element.ts": "d5371cd83ff2128353c1975465c368ef83d7441568626b386557deba51315111",
|
||||
"https://deno.land/x/deno_dom@v0.1.43/src/dom/elements/html-template-element.ts": "740b97a5378c9a14cccf3429299846eda240b613013e2d2d7f20b393897453c2",
|
||||
"https://deno.land/x/deno_dom@v0.1.43/src/dom/html-collection.ts": "ae90197f5270c32074926ad6cf30ee07d274d44596c7e413c354880cebce8565",
|
||||
"https://deno.land/x/deno_dom@v0.1.43/src/dom/node-list.ts": "4c6e4b4585301d4147addaccd90cb5f5a80e8d6290a1ba7058c5e3dfea16e15d",
|
||||
"https://deno.land/x/deno_dom@v0.1.43/src/dom/node.ts": "3069e6fc93ac4111a136ed68199d76673339842b9751610ba06f111ba7dc10a7",
|
||||
"https://deno.land/x/deno_dom@v0.1.43/src/dom/selectors/custom-api.ts": "852696bd58e534bc41bd3be9e2250b60b67cd95fd28ed16b1deff1d548531a71",
|
||||
"https://deno.land/x/deno_dom@v0.1.43/src/dom/selectors/nwsapi-types.ts": "c43b36c36acc5d32caabaa54fda8c9d239b2b0fcbce9a28efb93c84aa1021698",
|
||||
"https://deno.land/x/deno_dom@v0.1.43/src/dom/selectors/nwsapi.js": "985d7d8fc1eabbb88946b47a1c44c1b2d4aa79ff23c21424219f1528fa27a2ff",
|
||||
"https://deno.land/x/deno_dom@v0.1.43/src/dom/selectors/selectors.ts": "83eab57be2290fb48e3130533448c93c6c61239f2a2f3b85f1917f80ca0fdc75",
|
||||
"https://deno.land/x/deno_dom@v0.1.43/src/dom/selectors/sizzle-types.ts": "78149e2502409989ce861ed636b813b059e16bc267bb543e7c2b26ef43e4798b",
|
||||
"https://deno.land/x/deno_dom@v0.1.43/src/dom/selectors/sizzle.js": "c3aed60c1045a106d8e546ac2f85cc82e65f62d9af2f8f515210b9212286682a",
|
||||
"https://deno.land/x/deno_dom@v0.1.43/src/dom/utils-types.ts": "96db30e3e4a75b194201bb9fa30988215da7f91b380fca6a5143e51ece2a8436",
|
||||
"https://deno.land/x/deno_dom@v0.1.43/src/dom/utils.ts": "4c6206516fb8f61f37a209c829e812c4f5a183e46d082934dd14c91bde939263",
|
||||
"https://deno.land/x/deno_dom@v0.1.43/src/parser.ts": "e06b2300d693e6ae7564e53dfa5c9a9e97fdb8c044c39c52c8b93b5d60860be3",
|
||||
"https://deno.land/x/deno_dom@v0.1.46/build/deno-wasm/deno-wasm.js": "d6841a06342eb6a2798ef28de79ad69c0f2fa349fa04d3ca45e5fcfbf50a9340",
|
||||
"https://deno.land/x/deno_dom@v0.1.46/deno-dom-wasm.ts": "a33d160421bbb6e3104285ea5ebf33352b7ad50d82ea8765e3cf65f972b25119",
|
||||
"https://deno.land/x/deno_dom@v0.1.46/src/api.ts": "0ff5790f0a3eeecb4e00b7d8fbfa319b165962cf6d0182a65ba90f158d74f7d7",
|
||||
"https://deno.land/x/deno_dom@v0.1.46/src/constructor-lock.ts": "0e7b297e8b9cf921a3b0d3a692ec5fb462c5afc47ec554292e20090b9e16b40a",
|
||||
"https://deno.land/x/deno_dom@v0.1.46/src/deserialize.ts": "1cf4096678d8afed8ed28dbad690504c4d2c28149ba768b26eacd1416873425b",
|
||||
"https://deno.land/x/deno_dom@v0.1.46/src/dom/document-fragment.ts": "1c7352a3c816587ed7fad574b42636198f680f17abc3836fcfe7799b31e7718f",
|
||||
"https://deno.land/x/deno_dom@v0.1.46/src/dom/document.ts": "0b07049fd614c1d460240d1bf3e051084a58105e54887af90f45bc615965f1c6",
|
||||
"https://deno.land/x/deno_dom@v0.1.46/src/dom/dom-parser.ts": "784ee0e766d4a01e14420f328053fd3a0016c6b40ee442edc3ae80f5d9777927",
|
||||
"https://deno.land/x/deno_dom@v0.1.46/src/dom/element.ts": "d1a006e4f7cd1eb050838a96ba93a254e5cf4136236c6454ab6e8ffedcf395fd",
|
||||
"https://deno.land/x/deno_dom@v0.1.46/src/dom/elements/html-template-element.ts": "740b97a5378c9a14cccf3429299846eda240b613013e2d2d7f20b393897453c2",
|
||||
"https://deno.land/x/deno_dom@v0.1.46/src/dom/html-collection.ts": "eedc0b097612ef420d975df6924850a36a4829b35aafa4c92078609a15a52f08",
|
||||
"https://deno.land/x/deno_dom@v0.1.46/src/dom/node-list.ts": "aa5d4c2297fadfb1b392ffa0e5c33a6fb8c198e8875bb853c2fc3fc49807701d",
|
||||
"https://deno.land/x/deno_dom@v0.1.46/src/dom/node.ts": "4ee9bc98f1d5b31a9a36674a9f3e1d6e25b9125b1532c42f84c4624816fe8435",
|
||||
"https://deno.land/x/deno_dom@v0.1.46/src/dom/selectors/custom-api.ts": "852696bd58e534bc41bd3be9e2250b60b67cd95fd28ed16b1deff1d548531a71",
|
||||
"https://deno.land/x/deno_dom@v0.1.46/src/dom/selectors/nwsapi-types.ts": "c43b36c36acc5d32caabaa54fda8c9d239b2b0fcbce9a28efb93c84aa1021698",
|
||||
"https://deno.land/x/deno_dom@v0.1.46/src/dom/selectors/nwsapi.js": "985d7d8fc1eabbb88946b47a1c44c1b2d4aa79ff23c21424219f1528fa27a2ff",
|
||||
"https://deno.land/x/deno_dom@v0.1.46/src/dom/selectors/selectors.ts": "83eab57be2290fb48e3130533448c93c6c61239f2a2f3b85f1917f80ca0fdc75",
|
||||
"https://deno.land/x/deno_dom@v0.1.46/src/dom/selectors/sizzle-types.ts": "78149e2502409989ce861ed636b813b059e16bc267bb543e7c2b26ef43e4798b",
|
||||
"https://deno.land/x/deno_dom@v0.1.46/src/dom/selectors/sizzle.js": "c3aed60c1045a106d8e546ac2f85cc82e65f62d9af2f8f515210b9212286682a",
|
||||
"https://deno.land/x/deno_dom@v0.1.46/src/dom/utils-types.ts": "96db30e3e4a75b194201bb9fa30988215da7f91b380fca6a5143e51ece2a8436",
|
||||
"https://deno.land/x/deno_dom@v0.1.46/src/dom/utils.ts": "4c6206516fb8f61f37a209c829e812c4f5a183e46d082934dd14c91bde939263",
|
||||
"https://deno.land/x/deno_dom@v0.1.46/src/parser.ts": "e06b2300d693e6ae7564e53dfa5c9a9e97fdb8c044c39c52c8b93b5d60860be3",
|
||||
"https://deno.land/x/imagescript@1.2.15/ImageScript.js": "9ce10c37a0e4fe43699689088c24f386fd401874057932bd57079ac729205038",
|
||||
"https://deno.land/x/imagescript@1.2.15/png/src/crc.mjs": "5cf50de181d61dd00e66a240d811018ba5070afa8bba302f393604404604de84",
|
||||
"https://deno.land/x/imagescript@1.2.15/png/src/mem.mjs": "4968d400dae069b4bf0ef4767c1802fd2cc7d15d90eda4cfadf5b4cd19b96c6d",
|
||||
"https://deno.land/x/imagescript@1.2.15/png/src/png.mjs": "96ef0ceff1b5a6cd9304749e5f187b4ab238509fb5f9a8be8ee934240271ed8d",
|
||||
"https://deno.land/x/imagescript@1.2.15/png/src/zlib.mjs": "9867dc3fab1d31b664f9344b0d7e977f493d9c912a76c760d012ed2b89f7061c",
|
||||
"https://deno.land/x/imagescript@1.2.15/utils/buffer.js": "952cb1beb8827e50a493a5d1f29a4845e8c648789406d389dd51f51205ba02d8",
|
||||
"https://deno.land/x/imagescript@1.2.15/utils/crc32.js": "573d6222b3605890714ebc374e687ec2aa3e9a949223ea199483e47ca4864f7d",
|
||||
"https://deno.land/x/imagescript@1.2.15/utils/png.js": "fbed9117e0a70602645d70df9c103ff6e79c03e987bd5c1685dcb4200729b6de",
|
||||
"https://deno.land/x/imagescript@1.2.15/utils/wasm/font.js": "9e75d842608c057045698d6a7cdf5ffd27241b5cdea0391c89a1917b31294524",
|
||||
"https://deno.land/x/imagescript@1.2.15/utils/wasm/gif.js": "8b86f7b96486bb8ff50fbc7c7487f86cb5cef85e6acd71e1def78a1aa2f12e4f",
|
||||
"https://deno.land/x/imagescript@1.2.15/utils/wasm/jpeg.js": "75295e2fcf96b4f7bb894b3844fdaa8140d63169d28b466b5d5be89d59a7b6e6",
|
||||
"https://deno.land/x/imagescript@1.2.15/utils/wasm/png.js": "0659536a8dd8f892c8346e268b2754b4414fad0ec1e9794dfcde1ba1c804ee02",
|
||||
"https://deno.land/x/imagescript@1.2.15/utils/wasm/svg.js": "f5c8a9d1977b51a7c07549ceb6bbbaca9497321a193f28b3dc229a42d91bcf14",
|
||||
"https://deno.land/x/imagescript@1.2.15/utils/wasm/tiff.js": "c2d7bdaef094df25aae1752e75167f485e89275d76a1379e39d8949580b7af4f",
|
||||
"https://deno.land/x/imagescript@1.2.15/utils/wasm/zlib.js": "749875f83abffe24d3b977475a0cbd5f9b52bee1fbdbef61ec183cbfc17805f6",
|
||||
"https://deno.land/x/imagescript@1.2.15/v2/framebuffer.mjs": "add44ff184636659714b3c6d4b896f628545451abffbc30b5bcc2e8d9a73d012",
|
||||
"https://deno.land/x/imagescript@1.2.15/v2/ops/blur.mjs": "80716f1ffab8a2aeb54a036f583bf51a2b9dd37e005adc000add803df8e8a12f",
|
||||
"https://deno.land/x/imagescript@1.2.15/v2/ops/color.mjs": "5e72cdcbf97dc939a2795223f01e3cb0544c0c56b03ea2aa026050df58348814",
|
||||
"https://deno.land/x/imagescript@1.2.15/v2/ops/crop.mjs": "69431fa6f687fd9f0c31eff0ec27d7ac925275005e53a37f0c3fab4cc4d9a9ea",
|
||||
"https://deno.land/x/imagescript@1.2.15/v2/ops/fill.mjs": "cf1b9488314753fbc9ebf03410ac74c2a34ea5a69fb6892cd6e8366cd1930d93",
|
||||
"https://deno.land/x/imagescript@1.2.15/v2/ops/flip.mjs": "825a34a66567dcf15e76a719f1bf2f66fb106503cd69942292b1b0ae05c5718e",
|
||||
"https://deno.land/x/imagescript@1.2.15/v2/ops/index.mjs": "423ba687119be2bba8cec72890577d3afa3621b6b8108912242fe937a183f2aa",
|
||||
"https://deno.land/x/imagescript@1.2.15/v2/ops/iterator.mjs": "c2adf3d90ce00719a02c48c97634574176a3501ff026676259bd71aa8f5d69b9",
|
||||
"https://deno.land/x/imagescript@1.2.15/v2/ops/overlay.mjs": "7e6e2c2ffd25006d52597ab8babc5f8f503d388a3fdf2fbc0eaea02799a020c9",
|
||||
"https://deno.land/x/imagescript@1.2.15/v2/ops/resize.mjs": "814e78ebce8eaf8f1f918688db7b52a141405e06a36ed4b25d04413d69e7d17b",
|
||||
"https://deno.land/x/imagescript@1.2.15/v2/ops/rotate.mjs": "a1b65616717bd2eed8db406affea3263b4674dada46b56441ef38167a187455d",
|
||||
"https://deno.land/x/imagescript@1.2.15/v2/util/mem.mjs": "4968d400dae069b4bf0ef4767c1802fd2cc7d15d90eda4cfadf5b4cd19b96c6d",
|
||||
"https://deno.land/x/imagescript@1.2.9/ImageScript.js": "4f6f9c1542dd55b91dfdd01d1b2e8e5ff1eb3b3a7a4a30bdd5ff673d9aecab45",
|
||||
"https://deno.land/x/imagescript@1.2.9/utils/buffer.js": "952cb1beb8827e50a493a5d1f29a4845e8c648789406d389dd51f51205ba02d8",
|
||||
"https://deno.land/x/imagescript@1.2.9/utils/crc32.js": "573d6222b3605890714ebc374e687ec2aa3e9a949223ea199483e47ca4864f7d",
|
||||
"https://deno.land/x/imagescript@1.2.9/utils/png.js": "fbed9117e0a70602645d70df9c103ff6e79c03e987bd5c1685dcb4200729b6de",
|
||||
"https://deno.land/x/imagescript@1.2.9/utils/wasm/font.js": "ae4e8b7b6e6e9a30250c5f89e8fbb92d237f69d80ff84cd80c95d9a04163e714",
|
||||
"https://deno.land/x/imagescript@1.2.9/utils/wasm/gif.js": "100fbd424a828a76ce90e4f5c282d42e0ab83518908a75839d5ded52bb795340",
|
||||
"https://deno.land/x/imagescript@1.2.9/utils/wasm/jpeg.js": "da660e827fa45a85ee63aafa38dceb031dbd8988162bf730ace8d6135d842413",
|
||||
"https://deno.land/x/imagescript@1.2.9/utils/wasm/svg.js": "f7d8827fa8dc4aa9b1027374a87ae658da4bdd46048c66c01d909291d1cf132a",
|
||||
"https://deno.land/x/imagescript@1.2.9/utils/wasm/zlib.js": "63060a9aabee087929eb01d9e8b75b3ddc94a846a929a81d4456ed9b54d72671",
|
||||
"https://esm.sh/css@3.0.0": "a54982657613e96ebf2bc9487629a96a6e57bd33aaa04943c543b6cfc94962b3",
|
||||
"https://esm.sh/preact-render-to-string@5.2.0?external=preact": "d68df08425ff945f8b2872d784d587c6588f9f6369e553758d254477bfc95818",
|
||||
"https://esm.sh/preact@10.16.0": "5229650cdac537f87cae81d5001e88d4e7a38cc7e77be978961d2897a733117d",
|
||||
"https://esm.sh/preact@10.16.0/jsx-runtime?dts": "9e67b64a5b48299c77d30bffc213735fdcf4b3b5d4ad8ff8d4136f246de5fa34",
|
||||
"https://esm.sh/stable/preact@10.16.0/denonext/jsx-runtime.js": "64770c709df77c4b64b79f84a4abf6189fd0c3ea461121870eca0cf2bcca87b0",
|
||||
"https://esm.sh/stable/preact@10.16.0/denonext/preact.mjs": "01dc8bdf124926c611c0711081b9c162cf2735cccad7c2bc9914766f633ddb1d",
|
||||
"https://esm.sh/stable/preact@10.16.0/denonext/src.js": "a95281269ac2665427e647cde8628d5cd6eef13bb6bea381c3167a78fa922316",
|
||||
"https://esm.sh/v128/preact-render-to-string@5.2.0/X-ZS9wcmVhY3Q/denonext/preact-render-to-string.mjs": "b2b771d82125460bd3e5cdf20ebd662a08c4c61e34b174cd11db929dd5883966",
|
||||
"https://esm.sh/v128/preact@10.16.0/src/index.js": "3bafc9400950c38b80163dcbcd4538a54ef158a83f448517f34324c5685f1569"
|
||||
"https://esm.sh/v128/preact@10.16.0/src/index.js": "3bafc9400950c38b80163dcbcd4538a54ef158a83f448517f34324c5685f1569",
|
||||
"https://esm.sh/v134/preact-render-to-string@5.2.0/X-ZS9wcmVhY3Q/denonext/preact-render-to-string.mjs": "b2b771d82125460bd3e5cdf20ebd662a08c4c61e34b174cd11db929dd5883966",
|
||||
"https://esm.sh/v135/atob@2.1.2/denonext/atob.mjs": "dd534c006761ac47d482333cb9cf131034faa878878d1206ac30372eac803701",
|
||||
"https://esm.sh/v135/css@3.0.0/denonext/css.mjs": "56fbc2f42803ff9ed37086bf761df8ae6a0ad705c1b163030d9cf0ed284abe34",
|
||||
"https://esm.sh/v135/decode-uri-component@0.2.2/denonext/decode-uri-component.mjs": "ff66ea8f8e09fab0ef177e73e5d1287a6a50685cb463b071ade77b23cd71024b",
|
||||
"https://esm.sh/v135/inherits@2.0.4/denonext/inherits.mjs": "8095f3d6aea060c904fb24ae50f2882779c0acbe5d56814514c8b5153f3b4b3b",
|
||||
"https://esm.sh/v135/source-map-resolve@0.6.0/denonext/source-map-resolve.mjs": "2c593f3194066ca13039c2aed83aed326c8cbfa5526221b1fd14f9e16460dd74",
|
||||
"https://esm.sh/v135/source-map@0.6.1/denonext/source-map.mjs": "ccff3bb06dea7c01a2c83cf12113697592e418fd06b55ae2bb4cb0a4e51a98b8"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,2 +1,136 @@
|
|||
// i no joke had the idea for this in a dream
|
||||
// winamp seems more fun (the equalizer yk)
|
||||
|
||||
import { EggbugImg, render_and_copy } from "./common.tsx";
|
||||
|
||||
// help eggbug manage cohost's "finances"
|
||||
|
||||
const Bar = ({ start = 0.5, color }: { start: number; color: string }) => (
|
||||
<div
|
||||
style={{
|
||||
backgroundColor: color,
|
||||
resize: "vertical",
|
||||
height: `${start * 100}%`,
|
||||
flex: "1",
|
||||
overflow: "hidden",
|
||||
}}
|
||||
></div>
|
||||
);
|
||||
|
||||
const Bars = ({ starts, color }: { starts: number[]; color: string }) => (
|
||||
<div
|
||||
style={{
|
||||
flex: "1.5",
|
||||
display: "flex",
|
||||
backgroundColor: color,
|
||||
//margin: "0.25rem",
|
||||
overflow: "hidden",
|
||||
}}
|
||||
>
|
||||
{...starts.map(start => (
|
||||
<Bar start={start} color="rgb(var(--color-notWhite))" />
|
||||
))}
|
||||
</div>
|
||||
);
|
||||
|
||||
render_and_copy(
|
||||
<div
|
||||
style={{
|
||||
display: "flex",
|
||||
width: "100%",
|
||||
aspectRatio: "16/9",
|
||||
backgroundColor: "rgb(var(--color-notWhite))",
|
||||
borderRadius: "1rem",
|
||||
border: "0.25rem solid rgb(var(--color-cherry))",
|
||||
overflow: "hidden",
|
||||
}}
|
||||
>
|
||||
<Bars
|
||||
color="rgb(var(--color-cherry))"
|
||||
starts={new Array(30)
|
||||
.fill(undefined)
|
||||
.map((_, i) => 1 - (i * i) / 900)}
|
||||
/>
|
||||
{/*might want something more business*/}
|
||||
<div
|
||||
style={{
|
||||
flex: "1",
|
||||
objectFit: "contain",
|
||||
display: "flex",
|
||||
flexDirection: "column",
|
||||
}}
|
||||
>
|
||||
<EggbugImg type="smiling" style={{ margin: "auto" }} />
|
||||
<p
|
||||
style={{
|
||||
borderRadius: "1rem",
|
||||
border: "0.25rem solid rgb(var(--color-cherry))",
|
||||
margin: "0.25rem",
|
||||
padding: "0 0.25rem",
|
||||
overflow: "scroll",
|
||||
}}
|
||||
>
|
||||
oh no! eggbug production is through the roof! at this rate,
|
||||
we'll run out of <s>posts</s> foods? to eat within three eggs of
|
||||
the bug! quick, adjust this graph. that does things? here's some
|
||||
important advice (i can put as much as i want because there's a
|
||||
scrollbar!): we'll run out of posts foods? to eat withings?
|
||||
here's a scrollbar!): h the roof! at this graph. that does three
|
||||
eggs of the bug! quick, adjust this graph. that does three eggs
|
||||
of posts foods? to eat within three eggs of the bug! quick,
|
||||
adjust this rate, we'll run out of posts foods? to eat within
|
||||
things? here's some important because there's some important
|
||||
advice (i can put as i want because there's a scrollbar!):
|
||||
within three eggs of the bug! quick, adjust this rate, we'll run
|
||||
out of posts foods? to eat within three eggbug production is
|
||||
through the roof! at this graph. that does things? here's some
|
||||
important advice (i can put as much as i want because there's
|
||||
some important advice (i can put as i want because there's a
|
||||
scrollbar!): as i want because there's some important advice (i
|
||||
can put as much as i want because there's a scrollbar!): raph.
|
||||
that does things? here's some important advice (i can put as i
|
||||
want because there's some important advice (i can put as much as
|
||||
i want because there's some important advice (i can put as much
|
||||
as i want because there's a scrollbar!): on is through the roof!
|
||||
at this graph. that does three eggs of the bug! quick, adjust
|
||||
this graph. that does things? here's some important advice (i
|
||||
can put as much as i want because there's some important advice
|
||||
(i can put as much as much as i want because there's some
|
||||
important advice (i can put as much as i want because there's a
|
||||
scrollbar!): through the roof! at this graph. that does things?
|
||||
here's a scrollbar!): scrollbar!): k, adjust this graph. that
|
||||
does things? here's some important advice (i can put as i want
|
||||
because there's some important advice (i can put as much as i
|
||||
want because there's some important advice (i can put as much as
|
||||
i want because the roof! at this rate, we'll run out of posts
|
||||
foods? to eat within three eggbug production is through the
|
||||
roof! at this rate, we'll run out of the bug! quick, adjust this
|
||||
graph. that does three eggs of posts foods? to eat within three
|
||||
eggs of the bug! quick, adjust this graph. that does things?
|
||||
here's some important advice (i can put as much as i want
|
||||
because there's a scrollbar!): roduction is through the roof! at
|
||||
this rate, we'll run out of posts foods? to eat within three
|
||||
eggbug production is through the roof! at this rate, we'll run
|
||||
out of posts foods? to eat within three eggs of the bug! quick,
|
||||
adjust this graph. that does thin
|
||||
<br />
|
||||
three eggs
|
||||
</p>
|
||||
</div>
|
||||
<h1
|
||||
style={{
|
||||
position: "absolute",
|
||||
color: "rgb(var(--color-foreground) / 0.05)",
|
||||
marginLeft: "0.5rem",
|
||||
marginTop: "0.25rem",
|
||||
pointerEvents: "none",
|
||||
overflow: "hidden",
|
||||
}}
|
||||
>
|
||||
buginess v4.1.3<sup>TM</sup> — FOR EGGBUG USE ONLY —
|
||||
AVERT EYES IF NON-EGGBUG. SERIOUSLY, HOLY CRAP, IF YOU AREN'T AN
|
||||
EGGBUG, YOU WILL DIE! THE EGGBUGS WILL EAT YOUR POSTS THAT IS LIKE
|
||||
THEIR MAIN THING. OBVIOUSLY, BUT IF YOUR POSTS ARE EATEN, YOU DIE!
|
||||
</h1>
|
||||
</div>
|
||||
);
|
||||
|
|
149
html/common.tsx
|
@ -231,6 +231,7 @@ export const svg_url = (svg: string) => `data:image/svg+xml,${encodeURI(svg)}`;
|
|||
|
||||
// something higher-level might be worthwhile...
|
||||
// could namespace; e.g. css.font.sans_serif
|
||||
// could put various beziers
|
||||
export const css = {
|
||||
url(href: string) {
|
||||
return `url('${href}')`;
|
||||
|
@ -302,3 +303,151 @@ export function make_sync_no_matter_the_cost<T>(promise: Promise<T>): T {
|
|||
|
||||
return out as T;
|
||||
}
|
||||
|
||||
// INFINITE CREDIT TO @BLACKLE https://cohost.org/blackle/post/72096-h3-style-text-alig
|
||||
export const Cycle = ({
|
||||
width_px,
|
||||
height_px,
|
||||
children,
|
||||
style,
|
||||
credit = true,
|
||||
}: {
|
||||
width_px: number;
|
||||
height_px: number;
|
||||
children: [ComponentChild, ...ComponentChild[]];
|
||||
style?: Record<string, string>;
|
||||
credit?: boolean;
|
||||
}) => (
|
||||
<div
|
||||
style={{
|
||||
width: `${width_px}px`,
|
||||
height: `${height_px}px`,
|
||||
overflow: "hidden",
|
||||
...(credit
|
||||
? {
|
||||
filter: "url(https://mehbark.github.io/#INFINITE%20CREDIT%20TO%20@BLACKLE)",
|
||||
}
|
||||
: {}),
|
||||
...style,
|
||||
}}
|
||||
>
|
||||
<div
|
||||
style={{
|
||||
display: "inline-flex",
|
||||
height: `${height_px}px`,
|
||||
paddingRight: `${width_px}px`,
|
||||
position: "relative",
|
||||
cursor: "pointer",
|
||||
}}
|
||||
>
|
||||
{...children.map((c, i) => (
|
||||
<details>
|
||||
<summary
|
||||
style={{
|
||||
position: "absolute",
|
||||
top: "0px",
|
||||
left: `calc(-${width_px * 100}% + ${
|
||||
width_px * width_px + width_px * i
|
||||
}px)`,
|
||||
// width: `${width_px}px`,
|
||||
width: `calc(${
|
||||
width_px * (children.length - 1) * 2 +
|
||||
width_px -
|
||||
width_px * i * 2
|
||||
}px)`,
|
||||
height: `${height_px}px`,
|
||||
listStyle: "none",
|
||||
overflow: "hidden",
|
||||
}}
|
||||
>
|
||||
{c}
|
||||
</summary>
|
||||
<div
|
||||
style={{
|
||||
width: `${
|
||||
i == children.length - 1
|
||||
? children.length - 1
|
||||
: 1
|
||||
}px`,
|
||||
}}
|
||||
></div>
|
||||
</details>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
// yet another banger from @blackle
|
||||
// i don't think we need the row height stuff for maximum genericity?
|
||||
export const DragResizableImage = ({
|
||||
url,
|
||||
top,
|
||||
left,
|
||||
width,
|
||||
height,
|
||||
indicator = true,
|
||||
indicator_opacity = 0.3,
|
||||
}: {
|
||||
url: string;
|
||||
top: number;
|
||||
left: number;
|
||||
width: number;
|
||||
height: number;
|
||||
indicator?: boolean;
|
||||
indicator_opacity?: number;
|
||||
}) => (
|
||||
<div style="position: absolute;top: 0px;bottom: 0px;left: 0px;direction: rtl;font-size: 0px;line-height: 0;pointer-events: none;white-space: nowrap;">
|
||||
<div style="overflow: visible;width: 1px;height: 1px;display: inline-block;direction: ltr;vertical-align: text-top;position: relative;top: -9px;left: -9px;">
|
||||
<div style="position: relative;display: grid;grid-template-rows: 1fr;grid-template-columns: 1fr;">
|
||||
<div
|
||||
style={`pointer-events: none;background-image: url(${url});background-size: 100% 100%;background-position: center center;background-repeat: no-repeat;grid-row: 1;grid-column: 1;transform: translate(-50%, -50%);`}
|
||||
></div>
|
||||
<div
|
||||
style={`overflow: hidden; resize: both; width: ${width}px;height: ${height}px;min-width: 36px; min-height: 36px; top: 0px; left: 0px; pointer-events: auto; position: relative; grid-area: 1 / 1 / auto / auto; transform: translate(-50%, -50%); clip-path: polygon(calc(100% - 18px) calc(100% - 18px), calc(100% - 18px) 100%, 100% 100%, 100% calc(100% - 18px));`}
|
||||
></div>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
style={`overflow: hidden; resize: both; direction: ltr; display: inline-block; width: ${
|
||||
left + 18 + width / 2
|
||||
}px;height: ${
|
||||
top + 18 + height / 2
|
||||
}px; position: relative; opacity: ${indicator_opacity}; background: ${
|
||||
indicator
|
||||
? 'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAQAAAD8x0bcAAAATklEQVR4AY3OAQYAMQwF0d7/0q2KrzFGZZZVPPLXxlc/RHIjEyIMxBnWBBAFcNODOaSo8X7C3uU/hY3Q5Bwm6vBkCKTiOU3mWkYkI5KQA4BYG/M4zBNLAAAAAElFTkSuQmCC")'
|
||||
: "none"
|
||||
} 100% 100% no-repeat; clip-path: polygon(calc(100% - 18px) calc(100% - 18px), calc(100% - 18px) 100%, 100% 100%, 100% calc(100% - 18px)); pointer-events: auto;`}
|
||||
></div>
|
||||
</div>
|
||||
);
|
||||
|
||||
// don't really love this; do not recommend
|
||||
export const string_split_once = (
|
||||
str: string,
|
||||
on: string
|
||||
): [string, string] | undefined => {
|
||||
const idx = str.indexOf(on);
|
||||
if (idx < 0) return;
|
||||
return [str.slice(0, idx), str.slice(idx + on.length)];
|
||||
};
|
||||
|
||||
export const HomestuckSpan = ({
|
||||
children,
|
||||
color,
|
||||
style,
|
||||
}: {
|
||||
children: ComponentChildren;
|
||||
color?: string;
|
||||
style?: JSX.CSSProperties;
|
||||
attributes?: JSX.HTMLAttributes;
|
||||
}) => (
|
||||
<span
|
||||
style={{
|
||||
fontFamily: "'courier-std', courier, monospace",
|
||||
fontWeight: "bold",
|
||||
...{ color },
|
||||
}}
|
||||
>
|
||||
{...toChildArray(children)}
|
||||
</span>
|
||||
);
|
||||
|
|
129
html/crash.tsx
Normal file
|
@ -0,0 +1,129 @@
|
|||
import { render_and_copy } from "./common.tsx";
|
||||
|
||||
const msg = `nice argument dweebus however i have already
|
||||
used cohost's css capabilities to make an
|
||||
animation of your post getting hit by a truck and
|
||||
scattering letters everywhr`.split("\n");
|
||||
|
||||
// i like the freezing effect, but it's probably not right here;
|
||||
const explode_transform = (): [string, string] => {
|
||||
const [x, y_, turns] = [
|
||||
-Math.random() * 25,
|
||||
(Math.random() - 0.5) * 10,
|
||||
Math.random() * 10,
|
||||
];
|
||||
|
||||
const y = y_ < 0 ? y_ - 35 : y_ + 35;
|
||||
|
||||
return [
|
||||
`translate(${x.toFixed(2)}rem, ${y.toFixed(
|
||||
2
|
||||
)}rem) rotate(${turns.toFixed(2)}turn)`,
|
||||
`rotate(${-turns.toFixed(2)}turn) translate(${-x.toFixed(
|
||||
2
|
||||
)}rem, ${-y.toFixed(2)}rem)`,
|
||||
];
|
||||
};
|
||||
|
||||
const Line = ({
|
||||
children,
|
||||
width_ratio,
|
||||
length_s,
|
||||
delay_s,
|
||||
}: {
|
||||
children: string;
|
||||
width_ratio: number;
|
||||
length_s: number;
|
||||
delay_s: number;
|
||||
}) => (
|
||||
<div style={{ whiteSpace: "pre", perspective: "3cm" }}>
|
||||
{...(() => {
|
||||
// we're pretending that everything is the same length (we'll see if this works)
|
||||
const delay_per = length_s / 160;
|
||||
const all_delay = (length_s * (1 - width_ratio)) / 3;
|
||||
console.log(delay_per, all_delay);
|
||||
|
||||
return [...children].map((c, i) => {
|
||||
const [trans, inv_trans] = explode_transform();
|
||||
return (
|
||||
<span
|
||||
style={{
|
||||
transform: inv_trans,
|
||||
display: "inline-block",
|
||||
}}
|
||||
>
|
||||
<span
|
||||
style={{
|
||||
transform: trans,
|
||||
display: "inline-block",
|
||||
animation: `spin 0.75s ${(
|
||||
delay_per * (children.length - i) +
|
||||
delay_s +
|
||||
all_delay
|
||||
).toFixed(2)}s linear forwards`,
|
||||
}}
|
||||
>
|
||||
{c}
|
||||
</span>
|
||||
</span>
|
||||
);
|
||||
});
|
||||
})()}
|
||||
</div>
|
||||
);
|
||||
|
||||
const Crash = ({
|
||||
vehicle,
|
||||
msg,
|
||||
length_s = 2,
|
||||
delay_s = 0,
|
||||
}: {
|
||||
vehicle: string;
|
||||
msg: string[];
|
||||
length_s?: number;
|
||||
delay_s?: number;
|
||||
}) => (
|
||||
<div style={{ display: "flex", alignItems: "center" }}>
|
||||
<div>
|
||||
<Line
|
||||
length_s={length_s}
|
||||
delay_s={delay_s}
|
||||
width_ratio={331.033 / 338.767}
|
||||
>
|
||||
{msg[0]}
|
||||
</Line>
|
||||
<Line
|
||||
length_s={length_s}
|
||||
delay_s={delay_s}
|
||||
width_ratio={291.15 / 338.767}
|
||||
>
|
||||
{msg[1]}
|
||||
</Line>
|
||||
<Line
|
||||
length_s={length_s}
|
||||
delay_s={delay_s}
|
||||
width_ratio={338.767 / 338.767}
|
||||
>
|
||||
{msg[2]}
|
||||
</Line>
|
||||
<Line
|
||||
length_s={length_s}
|
||||
delay_s={delay_s}
|
||||
width_ratio={185.283 / 338.767}
|
||||
>
|
||||
{msg[3]}
|
||||
</Line>
|
||||
</div>
|
||||
<div
|
||||
style={{
|
||||
transform: "translateX(-100rem)",
|
||||
animation: `spin ${length_s}s ${delay_s}s linear reverse forwards`,
|
||||
fontSize: "5rem",
|
||||
}}
|
||||
>
|
||||
{vehicle}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
render_and_copy(<Crash vehicle="🛻" msg={msg} length_s={1} delay_s={5} />);
|
16
html/cycle-test.tsx
Normal file
|
@ -0,0 +1,16 @@
|
|||
import { Cycle, render_and_copy } from "./common.tsx";
|
||||
|
||||
render_and_copy(
|
||||
<Cycle
|
||||
width_px={30}
|
||||
height_px={30}
|
||||
style={{ margin: "0 auto", outline: "1px solid black" }}
|
||||
>
|
||||
<div>this</div>
|
||||
<div>won't</div>
|
||||
<div>work</div>
|
||||
<div>!</div>
|
||||
<div>!!</div>
|
||||
<div>!!!</div>
|
||||
</Cycle>
|
||||
);
|
41
html/emoji-land.tsx
Normal file
|
@ -0,0 +1,41 @@
|
|||
import { Cycle, render_and_copy } from "./common.tsx";
|
||||
|
||||
const emojis = [
|
||||
"🏡",
|
||||
"🌳",
|
||||
"🌲",
|
||||
"🎄",
|
||||
"🐦",
|
||||
"🦊",
|
||||
"🦌",
|
||||
"🐶",
|
||||
"🐕",
|
||||
"🐩",
|
||||
"🦈",
|
||||
];
|
||||
|
||||
const Emoji = ({ children }: { children: string }) => <div>{children}</div>;
|
||||
|
||||
const Cell = () => (
|
||||
<Cycle width_px={50} height_px={50} style={{}}>
|
||||
<Emoji> </Emoji>
|
||||
{...emojis.map(e => <Emoji>{e}</Emoji>)}
|
||||
</Cycle>
|
||||
);
|
||||
|
||||
render_and_copy(
|
||||
<div
|
||||
style={{
|
||||
width: "calc(50px * 7)",
|
||||
aspectRatio: "1",
|
||||
margin: "0 auto",
|
||||
display: "grid",
|
||||
gridTemplateColumns: "repeat(7, 1fr)",
|
||||
fontSize: "33px",
|
||||
outline: "1px solid black",
|
||||
backgroundColor: "#296639",
|
||||
}}
|
||||
>
|
||||
{...Array.from({ length: 49 }, () => <Cell />)}
|
||||
</div>
|
||||
);
|
24
html/flipped-why-am-i-always-like-this.html
Normal file
|
@ -0,0 +1,24 @@
|
|||
<div style="display: flex; width: 100%; align-items: center; justify-content: center; margin: 2rem 0">
|
||||
<div style="outline: 2px solid black; flex: 2; aspect-ratio: 16/9; transform: perspective(500px) rotateY(20deg) skewY(-10deg) scale(0.8);">
|
||||
<details>
|
||||
<summary style="list-style: none; padding: 0.25rem">
|
||||
<div style="display: flex; flex-direction: column; align-items: center; gap: 0.75rem; margin: 0.75rem;">
|
||||
<div style="background-color: rgb(var(--color-notWhite)); border: 1px solid rgb(var(--color-cherry)); border-radius: 0.5rem; box-sizing: border-box; padding: 0.75rem; gap: 0.75rem; align-self: stretch; display: flex; flex-direction: row; align-items: center;">
|
||||
<img src="https://static.pyrope.net/warning-shield.png" aria-hidden="true" style="margin: 0; display: block">
|
||||
<p style="color: rgb(var(--color-cherry)); margin: 0; line-height: 24px">This post has content warnings for: <b>major spoilers for things. very major. i mean it!</b></p>
|
||||
</div>
|
||||
<div style="cursor: pointer; background-color: rgb(var(--color-cherry)); border-radius: 0.5rem; color: rgb(var(--color-notWhite)); padding: 0.75rem; line-height: 1; letter-spacing: 0.05em; whitespace: nowrap;">
|
||||
show post
|
||||
</div>
|
||||
</div>
|
||||
</summary>
|
||||
<div style="position: absolute; inset: 0; background-color: white; overflow-y: auto">
|
||||
<p style="text-align: center; color: black">these guys die :(</p>
|
||||
<img src="https://static.wikia.nocookie.net/seuss/images/d/d3/Thing1-and-thing2.jpg" alt="things 1 and 2 from dr. seuss" style="width: 100%">
|
||||
<a style="width: fit-content; margin: 0 auto; display: block; color: #ccc" href="https://pyrope.net/randirect#cohost.org/mehbark/post/2555916-cursor-adventure-so::pyrope.net/mcai::irc.pyrope.net::413.gay::pyrope.net/tnb::pyrope.net/concat::pyrope.net/davehash::twitter.com/mehbark::pl.pyrope.net/terezi">random fun 4 u</a>
|
||||
<p style="color: #eee; text-align: center;">yes i flipped it</p>
|
||||
</div>
|
||||
</details>
|
||||
</div>
|
||||
<div style="flex: 1.2"><h1 style="text-align: center; font-size: 3rem">👀</h1> <p style="text-align: center">i should click on this and open it</p></div>
|
||||
</div>
|
48
html/gameboy.css
Normal file
|
@ -0,0 +1,48 @@
|
|||
/*chonk matric with stereno sound */
|
||||
.shell {
|
||||
/*padding: 0px 45px;*/
|
||||
padding-top: 8px;
|
||||
background-color: #aab;
|
||||
width: 285px;
|
||||
height: 225px;
|
||||
border-radius: 10px 10px 40px 10px;
|
||||
overflow: hidden;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.screen {
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.lines {
|
||||
margin: 0 10px;
|
||||
margin-bottom: 3px;
|
||||
height: 10px;
|
||||
}
|
||||
|
||||
.top-line {
|
||||
background-color: #635;
|
||||
height: 2px;
|
||||
position: relative;
|
||||
top: 0px;
|
||||
}
|
||||
|
||||
.bottom-line {
|
||||
background-color: #325;
|
||||
height: 2px;
|
||||
top: 3px;
|
||||
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.headline {
|
||||
color: white;
|
||||
font-size: 0.45rem;
|
||||
padding: 0 2px;
|
||||
background-color: #aaa;
|
||||
bottom: 2px;
|
||||
position: relative;
|
||||
top: -7px;
|
||||
left: 85px;
|
||||
width: fit-content;
|
||||
}
|
91
html/gameboy.tsx
Normal file
|
@ -0,0 +1,91 @@
|
|||
// let's game boy ! ! !
|
||||
import { ComponentChild } from "preact";
|
||||
import { Cycle, render_and_copy } from "./common.tsx";
|
||||
|
||||
const Pixel = ({
|
||||
colors,
|
||||
width_px,
|
||||
}: {
|
||||
colors: [string, ...string[]];
|
||||
width_px: number;
|
||||
}) => (
|
||||
<Cycle credit={false} width_px={width_px} height_px={width_px}>
|
||||
<div /*style={`width:${width_px}px;height:${width_px}px`}*/></div>
|
||||
{...colors.map(c => (
|
||||
// p saves four bytes per
|
||||
// we aren't going to get to 20x18 but less data is courteous
|
||||
<div
|
||||
// this was parsing fine without px before. so weird
|
||||
// oh we'd might as well switch back to 100% then
|
||||
// AWESOME! THAT WAS WHAT WAS MAKING THE CYCLING REALLY NICE
|
||||
style={`background:${c};width:100%;height:100%`}
|
||||
></div>
|
||||
))}
|
||||
</Cycle>
|
||||
);
|
||||
|
||||
const Draw = ({
|
||||
width,
|
||||
height = width,
|
||||
pixel_width_px,
|
||||
colors,
|
||||
bg_color,
|
||||
}: {
|
||||
width: number;
|
||||
height?: number;
|
||||
pixel_width_px: number;
|
||||
colors: [string, ...string[]];
|
||||
bg_color: string;
|
||||
}) => (
|
||||
<div
|
||||
style={{
|
||||
display: "grid",
|
||||
gridTemplateRows: `repeat(${height}, 1fr)`,
|
||||
gridTemplateColumns: `repeat(${width}, 1fr)`,
|
||||
width: `${width * pixel_width_px}px`,
|
||||
height: `${height * pixel_width_px}px`,
|
||||
backgroundColor: bg_color,
|
||||
}}
|
||||
class="screen"
|
||||
>
|
||||
{...new Array(width * height)
|
||||
.fill(null)
|
||||
.map(() => <Pixel width_px={pixel_width_px} colors={colors} />)}
|
||||
</div>
|
||||
);
|
||||
|
||||
// you know what, let's just to the dark grey part. sorry!
|
||||
const Shell = ({ children }: { children: ComponentChild }) => (
|
||||
<div class="shell" aria-describedby={"user-content-gameboy-description"}>
|
||||
<div class="lines">
|
||||
<div class="top-line"></div>
|
||||
<div class="bottom-line"></div>
|
||||
<div class="headline">CHONK MATRIX WITH STERENO SOUND</div>
|
||||
</div>
|
||||
{children}
|
||||
</div>
|
||||
);
|
||||
|
||||
// body: "#aaaaaa"
|
||||
// horrid url, but color-picked from
|
||||
// https://duet-cdn.vox-cdn.com/thumbor/0x0:2048x1364/750x500/filters:focal(1024x682:1025x683):format(webp)/cdn.vox-cdn.com/uploads/chorus_asset/file/23755199/a31768dc_f45b_4ac7_8f34_6f99e835ed358223055624103571533.jpg
|
||||
render_and_copy(
|
||||
<>
|
||||
<Shell>
|
||||
<Draw
|
||||
// the actual aspect ratio
|
||||
// it has slightly more pixels though
|
||||
width={10}
|
||||
height={9}
|
||||
pixel_width_px={20}
|
||||
bg_color="#779268"
|
||||
colors={["#52643a", "#22311D", "#0E190B"]}
|
||||
/>
|
||||
</Shell>
|
||||
<p id="gameboy-description" style="font-size: 0px">
|
||||
the screen and grey border of a Game Boy. at the top, it says "CHONK
|
||||
MATRIX WITH STERENO SOUND." the blank screen's pixels are comically
|
||||
large, but faithfully colored
|
||||
</p>
|
||||
</>
|
||||
);
|
107
html/hash-fun.tsx
Normal file
|
@ -0,0 +1,107 @@
|
|||
import { ComponentChildren } from "preact";
|
||||
import { Cycle, render_and_copy } from "./common.tsx";
|
||||
|
||||
const Msg = ({
|
||||
hash,
|
||||
children,
|
||||
bridge = " then",
|
||||
click_blue = "click blue",
|
||||
}: {
|
||||
hash: string;
|
||||
children: ComponentChildren;
|
||||
bridge?: string;
|
||||
click_blue?: string;
|
||||
}) => (
|
||||
<span>
|
||||
<a
|
||||
href={`#${hash}`}
|
||||
style={{
|
||||
fontWeight: "bold",
|
||||
textDecoration: "none",
|
||||
color: "#f26565",
|
||||
cursor: "pointer",
|
||||
}}
|
||||
>
|
||||
{children}
|
||||
</a>
|
||||
{bridge}{" "}
|
||||
<span
|
||||
style={{
|
||||
fontWeight: "bold",
|
||||
color: "rgb(87, 144, 251)",
|
||||
cursor: "pointer",
|
||||
}}
|
||||
>
|
||||
{click_blue}
|
||||
</span>
|
||||
</span>
|
||||
);
|
||||
|
||||
render_and_copy(
|
||||
<Cycle width_px={480} height_px={50}>
|
||||
<span>
|
||||
here's how this works:{" "}
|
||||
<Msg hash="Good job!" bridge=", then you">
|
||||
you click red
|
||||
</Msg>
|
||||
</span>
|
||||
<Msg hash="Good job, again!" bridge=", then">
|
||||
click red
|
||||
</Msg>
|
||||
<span>
|
||||
one more time.{" "}
|
||||
<Msg hash="Hello!" bridge=", then">
|
||||
click red
|
||||
</Msg>
|
||||
, no matter what.
|
||||
</span>
|
||||
<Msg hash="Hello?" bridge=" then " click_blue="click me and let's go">
|
||||
got it? did you click this too?
|
||||
</Msg>
|
||||
<Msg
|
||||
hash="Hello??"
|
||||
bridge=" ... "
|
||||
click_blue="yeah, sorry. bit of a slip-up!"
|
||||
>
|
||||
um... "me?"
|
||||
</Msg>
|
||||
<Msg
|
||||
hash="Are you even seeing this?"
|
||||
bridge=" ... "
|
||||
click_blue="i'm sorry"
|
||||
>
|
||||
it's... fine. don't sweat it, blue.
|
||||
</Msg>
|
||||
<Msg hash="Oh right." bridge=" ... " click_blue="...">
|
||||
whatever. we can still salvage this. probably.
|
||||
</Msg>
|
||||
<Msg
|
||||
hash="You care more about these dumb colors."
|
||||
bridge=" ... "
|
||||
click_blue="getting clicked?"
|
||||
>
|
||||
let's just... what were we even doing?
|
||||
</Msg>
|
||||
<Msg
|
||||
hash="You know, they really weren't meant to be a TIHYLtTW reference."
|
||||
bridge=" ... "
|
||||
click_blue="well we can't talk if we aren't clicked"
|
||||
>
|
||||
yeah, yeah of course. but why??
|
||||
</Msg>
|
||||
<Msg
|
||||
hash="Even though 'mehbark' did read that novella a while ago."
|
||||
bridge=" ... "
|
||||
click_blue="okay, okay. sheesh, calm down!"
|
||||
>
|
||||
that's not a reason!
|
||||
</Msg>
|
||||
<Msg
|
||||
hash="They liked it! But that's irrelevant, red and blue just came to mind."
|
||||
bridge=" ... "
|
||||
click_blue="you're right"
|
||||
>
|
||||
don't tell me to c- you know what, let's not.
|
||||
</Msg>
|
||||
</Cycle>
|
||||
);
|
|
@ -12,10 +12,18 @@
|
|||
// })
|
||||
// didn't find anything there btw
|
||||
// pretty hopeless to try to recreate the pulsing light
|
||||
// ^ a gif would have worked lel
|
||||
// ^ but, again, artistry
|
||||
|
||||
import { Main, render_and_copy, static_url } from "./common.tsx";
|
||||
import {
|
||||
DragResizableImage,
|
||||
HomestuckSpan,
|
||||
Main,
|
||||
render_and_copy,
|
||||
static_url,
|
||||
} from "./common.tsx";
|
||||
|
||||
// TODO: rip a hole in the panel (for blood on back)
|
||||
// DONE: rip a hole in the panel (for blood on back)
|
||||
render_and_copy(
|
||||
<div
|
||||
style={{
|
||||
|
@ -26,6 +34,14 @@ render_and_copy(
|
|||
gridTemplateRows: "1fr",
|
||||
}}
|
||||
>
|
||||
<DragResizableImage
|
||||
url={static_url("homestuck-3853-egbertful.png")}
|
||||
width={650}
|
||||
height={650}
|
||||
top={0}
|
||||
left={0}
|
||||
indicator_opacity={0.6}
|
||||
/>
|
||||
<img
|
||||
id="panel"
|
||||
src={static_url("homestuck-3853-transparent-egbertless.png")}
|
||||
|
@ -36,7 +52,7 @@ render_and_copy(
|
|||
aspectRatio: 1,
|
||||
}}
|
||||
/>
|
||||
<img
|
||||
{/* <img
|
||||
id="egbert"
|
||||
src={static_url("homestuck-3853-egbertful.png")}
|
||||
alt="part of page 3853 of homestuck. egbert's silhouette with colorful tendrils all around it and a patch of blood that also shows the incipisphereish thingie."
|
||||
|
@ -47,6 +63,14 @@ render_and_copy(
|
|||
transform: "translateY(-0.15rem)",
|
||||
animation: "0.15s infinite alternate-reverse linear spin",
|
||||
}}
|
||||
/>
|
||||
/> */}
|
||||
<div style={{ backgroundColor: "white" }}>
|
||||
basically,{" "}
|
||||
<a href="https://developer.mozilla.org/en-US/docs/Web/CSS/background-attachment">
|
||||
background-attachment: fixed
|
||||
</a>{" "}
|
||||
+ some <a href="https://photopea.com">photopea</a> fun{" "}
|
||||
<HomestuckSpan color="#008282">:]</HomestuckSpan>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
|
|
@ -1,24 +1,230 @@
|
|||
import { render_and_copy } from "./common.tsx";
|
||||
// this is a really bad and boring idea. pass.
|
||||
import { Main, DragResizableImage, render_and_copy, n_of } from "./common.tsx";
|
||||
|
||||
render_and_copy(
|
||||
// new idea! "make your own image macro" scrollable background of various le classic meme images (imgflip)
|
||||
// + images (yes, images; nobody has impact installed)
|
||||
// nah. let's just do white + text-shadow
|
||||
const base_url = "https://static.pyrope.net/imgflip/";
|
||||
const urls = [
|
||||
"aggressive-right-turn.png",
|
||||
"aliens.png",
|
||||
"always-has-been.png",
|
||||
"balloon.png",
|
||||
"batman-slapping-robin.png",
|
||||
"bike-self-sabotage.png",
|
||||
"buff-doge-vs-cheems.png",
|
||||
"cefqrn.png",
|
||||
"change-my-mind.png",
|
||||
"chuck-norris.png",
|
||||
"despicable-plan.png",
|
||||
"distracted-boyfriend.png",
|
||||
"drake.png",
|
||||
"everywhere-everywhere.png",
|
||||
"evil-kermit.png",
|
||||
"expanding-brain.png",
|
||||
"girl-smile-fire.png",
|
||||
"heinous-suggestion.png",
|
||||
"hide-the-pain-harold.png",
|
||||
"i-am-once-again-asking.png",
|
||||
"if-i-had-one.png",
|
||||
"is-this-a.png",
|
||||
"not-sure-if.png",
|
||||
"one-does-not-simply.png",
|
||||
"or-draw-25.png",
|
||||
"panik-kalm-panik.png",
|
||||
"psycholonials-reference.png",
|
||||
"rock-the-dwayne-johnson-driving.png",
|
||||
"same-picture.png",
|
||||
"scroll-of-truth.png",
|
||||
"slam-button.png",
|
||||
"STRONG-handshake.png",
|
||||
"success-kid.png",
|
||||
"tap-head.png",
|
||||
"thinking-about-other-women.png",
|
||||
"this-is-fine.png",
|
||||
"two-buttons.png",
|
||||
"waiting-guy.png",
|
||||
"waiting-skeleton.png",
|
||||
"who-killed.png",
|
||||
"woman-yelling-at-cat.png",
|
||||
"you-get-a.png",
|
||||
].map(x => base_url + x);
|
||||
|
||||
const Word = ({
|
||||
children,
|
||||
left = "0px",
|
||||
top = "0px",
|
||||
}: {
|
||||
children: string;
|
||||
left?: string;
|
||||
top?: string;
|
||||
}) => (
|
||||
<div
|
||||
style={{
|
||||
display: "grid",
|
||||
gridTemplateColumns: "1fr",
|
||||
gridTemplateRows: "1fr 3fr 1fr",
|
||||
position: "absolute",
|
||||
resize: "both",
|
||||
minWidth: "max-content",
|
||||
minHeight: "fit-content",
|
||||
width: left,
|
||||
height: top,
|
||||
overflow: "hidden",
|
||||
display: "flex",
|
||||
// justifyContent: "right",
|
||||
// alignContent: "bottom",
|
||||
}}
|
||||
>
|
||||
<img
|
||||
src="https://static.pyrope.net/latula.webp"
|
||||
style={{ display: "grid", gridRow: "1 / 3" }}
|
||||
/>
|
||||
<p style={{ fontFamily: "Impact", display: "grid", gridRow: 1 }}>
|
||||
ACCORDING TO MY UNDERSTANDING OF THE DEFINITION OF AN IMAGE MACRO
|
||||
THIS
|
||||
</p>
|
||||
<p style={{ fontFamily: "Impact", display: "grid", gridRow: 3 }}>
|
||||
THIS IS AN IMAGE MACRO
|
||||
</p>
|
||||
<h1
|
||||
style={{
|
||||
color: "white",
|
||||
textShadow: "0px 0px 2px black",
|
||||
margin: "auto 0 0 auto",
|
||||
}}
|
||||
>
|
||||
{children}
|
||||
</h1>
|
||||
</div>
|
||||
);
|
||||
|
||||
// alright, doing it the right way (https://cohost.org/blackle/post/38921-alright-cohost-it) is too hard.
|
||||
// let's cheat.
|
||||
// if we aren't random, and instead distribute things such that the initial setup has the least covered
|
||||
// ehhhhhhhhhhhhhhhhhh
|
||||
// sighhhhh let's just do it right
|
||||
// generate the stupid freaking impact font
|
||||
// use it as a background image
|
||||
// ughhhhhh
|
||||
// oo i know i'll make one image in photopea and just clip it
|
||||
// that should work and be easy fingers crossed
|
||||
// that'll actually be way harder to adapt lel
|
||||
// ughhhh am i going to have to pull out that crappy library
|
||||
// AND download an impact font
|
||||
// (yes)
|
||||
// tl;dr i can still use this scattering
|
||||
// imagescript can't do the shadow we need (thank goodness)
|
||||
// maybe imagemagick + photopea then
|
||||
// i got it (KISS): photopea -> split on command line -> reference by url
|
||||
// that should be workable
|
||||
|
||||
const words = {
|
||||
THE: 6,
|
||||
HOMESTUCK: 3,
|
||||
MEME: 4,
|
||||
IS: 4,
|
||||
EGGBUG: 4,
|
||||
WHEN: 2,
|
||||
YOU: 5,
|
||||
SUS: 1,
|
||||
IMPOSTER: 1,
|
||||
ME: 3,
|
||||
ALIEN: 1,
|
||||
ARE: 3,
|
||||
A: 4,
|
||||
BOTTOM: 2,
|
||||
TOP: 2,
|
||||
TEXT: 4,
|
||||
"?": 3,
|
||||
"!": 3,
|
||||
NO: 3,
|
||||
YES: 3,
|
||||
COHOST: 2,
|
||||
MEHBARK: 2,
|
||||
WEBARK: 2,
|
||||
THIS: 2,
|
||||
POST: 2,
|
||||
SUCK: 2,
|
||||
"CHUCK NORRIS": 2,
|
||||
FOR: 2,
|
||||
S: 4,
|
||||
GET: 2,
|
||||
} satisfies Record<string, number>;
|
||||
console.log(
|
||||
`yikes. there are ${
|
||||
Object.keys(words).length
|
||||
} unique words and ${Object.values(words).reduce(
|
||||
(a, b) => a + b
|
||||
)} words in total`
|
||||
);
|
||||
// Object.keys(words).forEach(w => console.log(w))
|
||||
const text_img_url = (text: string) =>
|
||||
`https://static.pyrope.net/meme-text/${text}.png`;
|
||||
|
||||
const TEXT_HEIGHT = 55;
|
||||
const decoder = new TextDecoder();
|
||||
// crazy inefficient but idc
|
||||
const get_text_width = (text: string): number =>
|
||||
+decoder.decode(
|
||||
new Deno.Command("identify", {
|
||||
args: ["-format", "%w", `static/meme-text/${text}.png`],
|
||||
}).outputSync().stdout
|
||||
);
|
||||
|
||||
const ScatteredWords = ({ children }: { children: Record<string, number> }) => (
|
||||
<>
|
||||
{...Object.entries(children).flatMap(([text, count]) =>
|
||||
// feels pretty snazzy ngl
|
||||
n_of(Math.ceil(count), () => (
|
||||
<DragResizableImage
|
||||
top={Math.random() * 413}
|
||||
left={Math.random() * 612}
|
||||
url={text_img_url(text)}
|
||||
height={TEXT_HEIGHT}
|
||||
width={get_text_width(text)}
|
||||
indicator_opacity={0.2}
|
||||
/>
|
||||
)).map(f => f())
|
||||
)}
|
||||
</>
|
||||
);
|
||||
|
||||
render_and_copy(
|
||||
<>
|
||||
<Main
|
||||
style={{ width: "100%", aspectRatio: "1" }}
|
||||
aria-described-by="user-content-meme-description"
|
||||
>
|
||||
<ScatteredWords>{words}</ScatteredWords>
|
||||
<div
|
||||
style={{
|
||||
display: "flex",
|
||||
overflow: "scroll",
|
||||
alignItems: "center",
|
||||
gap: "1rem",
|
||||
}}
|
||||
>
|
||||
{...urls.map(u => (
|
||||
<img
|
||||
src={u}
|
||||
style={{
|
||||
maxHeight: "50vh",
|
||||
outline: "1px solid black",
|
||||
}}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
</Main>
|
||||
<p style={{ fontSize: "0px" }}>
|
||||
a horizontally scrollable list of memes with draggable words that
|
||||
look like a knockoff of impact font. if you want a better and
|
||||
(hopefully) more accessible version, visit imgflip.com. all of the
|
||||
memes are taken from there anyway
|
||||
</p>
|
||||
notes as per usual i do this all th etime:
|
||||
<ul>
|
||||
<li>
|
||||
dragresizing taken <em>entirely</em> from @blackle's{" "}
|
||||
<a href="https://cohost.org/blackle/post/38921-alright-cohost-it">
|
||||
excellent post
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
you have to get the very center to drag. @blackle put an
|
||||
indicator but i made it optional and turned it off! sorry!
|
||||
aesthetics! (edit: turned em back on. character growth! i did
|
||||
turn the opacity down just a squidge. idk. it's late!)
|
||||
</li>
|
||||
<li>
|
||||
i probably could have turned the resizing off too, but, you
|
||||
know, it's very funny
|
||||
</li>
|
||||
</ul>
|
||||
</>
|
||||
);
|
||||
|
|
|
@ -1,2 +1,3 @@
|
|||
// like crumbling but more complex and maybe cooler (ha) looking
|
||||
// nah. too derivative
|
||||
// that gives me an idea
|
||||
|
|
46
html/minvn.tsx
Normal file
|
@ -0,0 +1,46 @@
|
|||
// yeahh a directed acyclic graph should be good
|
||||
// where we just dupe
|
||||
// e.g.
|
||||
// a -+-> b
|
||||
// | |
|
||||
// | v
|
||||
// \-> c -> d
|
||||
// compiles to
|
||||
// a -+-> b -> c -> d
|
||||
// |
|
||||
// \-> c -> d
|
||||
// inefficient but tractable
|
||||
// maybe restrict height and width to lh and ch
|
||||
const example = `
|
||||
; TODO: contrast isn't great...
|
||||
fg red
|
||||
bg rgb(20 15 15)
|
||||
font "courier-std", courier, monospace
|
||||
font-size 1.1rem
|
||||
width 6in
|
||||
height 12in
|
||||
|
||||
# welcome
|
||||
; only an image link? how incredibly minimalist
|
||||
- https://image.link
|
||||
- alt text for that image
|
||||
; by only allowing connections that have not been declared yet, we should be
|
||||
; able to avoid cycles
|
||||
| welcome to the game this is dialogue
|
||||
| when you use multiple |s, the text is combined into one line
|
||||
| so it can be pretty
|
||||
| it's up to you to make sizing work
|
||||
> good bye
|
||||
> how are you
|
||||
|
||||
; order independent here
|
||||
# good bye
|
||||
| that is so rude... i'm sad.
|
||||
- sad image link
|
||||
- a sad guy
|
||||
|
||||
; notably, no connections
|
||||
|
||||
# how are you
|
||||
>
|
||||
`.trim();
|
214
html/nested-cws.tsx
Normal file
|
@ -0,0 +1,214 @@
|
|||
import { JSX } from "preact/jsx-runtime";
|
||||
import { render_and_copy } from "./common.tsx";
|
||||
|
||||
// TODO: make more generally usable
|
||||
export const CW = ({ cws, end }: { cws: string[][]; end: JSX.Element }) =>
|
||||
cws.length == 0 ? (
|
||||
<div style="position:absolute;inset:0;background:white">{end}</div>
|
||||
) : (
|
||||
<details style="position:absolute;inset:0;background:white">
|
||||
<summary style="list-style:none;padding:0.25rem">
|
||||
<div style="display:flex;flex-direction:column;align-items:center;gap:0.75rem;margin:0.75rem;">
|
||||
<div style="background-color:rgb(var(--color-notWhite));border:1px solid rgb(var(--color-cherry));border-radius:0.5rem;box-sizing:border-box;padding:0.75rem;gap:0.75rem;align-self:stretch;display:flex;flex-direction:row;align-items:center">
|
||||
<img
|
||||
src="https://static.pyrope.net/warning-shield.png"
|
||||
aria-hidden="true"
|
||||
style="margin:0;display:block"
|
||||
/>
|
||||
{/* color is omitted here and done elsewhere. note above TODO! */}
|
||||
<p style="margin:0;line-height:24px">
|
||||
This post has content warnings for:{" "}
|
||||
<b>
|
||||
{cws[0].join(", ") +
|
||||
(cws[0].length == 0 ? "" : ".")}
|
||||
</b>
|
||||
</p>
|
||||
</div>
|
||||
<div style="cursor:pointer;background-color:rgb(var(--color-cherry));border-radius:0.5rem;color:rgb(var(--color-notWhite));padding:0.75rem;line-height:1;letter-spacing:0.05em;user-select:none">
|
||||
show post
|
||||
</div>
|
||||
</div>
|
||||
</summary>
|
||||
<CW cws={cws.slice(1)} end={end} />
|
||||
</details>
|
||||
);
|
||||
|
||||
export const ALL_STAR_LYRICS = `
|
||||
Somebody once told me the world is gonna roll me
|
||||
I ain't the sharpest tool in the shed
|
||||
She was looking kind of dumb with her finger and her thumb
|
||||
In the shape of an "L" on her forehead
|
||||
Well, the years start comin' and they don't stop comin'
|
||||
Fed to the rules and I hit the ground runnin'
|
||||
Didn't make sense not to live for fun
|
||||
Your brain gets smart but your head gets dumb
|
||||
So much to do, so much to see
|
||||
So what's wrong with taking the backstreets?
|
||||
You'll never know if you don't go (W-w-wacko)
|
||||
You'll never shine if you don't glow
|
||||
Hey now, you're an all star
|
||||
Get your game on, go play
|
||||
Hey now, you're a rock star
|
||||
Get the show on, get paid
|
||||
(And all that glitters is gold)
|
||||
Only shootin' stars break the mold
|
||||
It's a cool place, and they say it gets colder
|
||||
You're bundled up now, wait 'til you get older
|
||||
But the meteor men beg to differ
|
||||
Judging by the hole in the satellite picture
|
||||
The ice we skate is gettin' pretty thin
|
||||
The water's gettin' warm so you might as well swim
|
||||
My world's on fire, how 'bout yours?
|
||||
That's the way I like it and I'll never get bored
|
||||
Hey now, you're an all star
|
||||
Get your game on, go play
|
||||
Hey now, you're a rock star
|
||||
Get the show on, get paid
|
||||
(All that glitters is gold)
|
||||
Only shootin' stars break the mold
|
||||
Go for the moon (W-w-wacko, w-w-wacko)
|
||||
Go for the moon (W-w-wacko, w-w-wacko)
|
||||
Go for the moon
|
||||
Go for the moon
|
||||
Hey now, you're an all star
|
||||
Get your game on, go play
|
||||
Hey now, you're a rock star
|
||||
Get the show on, get paid
|
||||
(And all that glitters is gold)
|
||||
Only shooting stars…
|
||||
Somebody once asked, "Could I spare some change for gas?
|
||||
I need to get myself away from this place"
|
||||
I said, "Yep, what a concept
|
||||
I could use a little fuel myself and we could all use a little change"
|
||||
Well, the years start comin' and they don't stop comin'
|
||||
Fed to the rules and I hit the ground runnin'
|
||||
Didn't make sense not to live for fun
|
||||
Your brain gets smart but your head gets dumb
|
||||
So much to do, so much to see
|
||||
So what's wrong with taking the backstreets?
|
||||
You'll never know if you don't go (Go!)
|
||||
You'll never shine if you don't glow
|
||||
Hey now, you're an all star
|
||||
Get your game on, go play
|
||||
Hey now, you're a rock star
|
||||
Get the show on, get paid
|
||||
(And all that glitters is gold)
|
||||
Only shootin' stars break the mold
|
||||
(And all that glitters is gold)
|
||||
Only shootin' stars break the mold
|
||||
`.trim();
|
||||
|
||||
render_and_copy(
|
||||
<div style="width:100%;height:15rem;color:rgb(var(--color-cherry))">
|
||||
<CW
|
||||
cws={[
|
||||
"long post",
|
||||
"deep post",
|
||||
"broad post",
|
||||
"content",
|
||||
"warnings",
|
||||
"content warnings",
|
||||
"content&warnings",
|
||||
"warnings&content",
|
||||
"content&content warnings",
|
||||
"warnings&content warnings",
|
||||
"content&warnings&content warnings",
|
||||
"the first 100 or so words of smash mouth's all star",
|
||||
...ALL_STAR_LYRICS.split(/\s+/).slice(0, 100),
|
||||
"i wasn't kidding",
|
||||
"but i'll spare you the rest",
|
||||
"opinion",
|
||||
"i do like the song though it's solid and fun",
|
||||
"further developing opinion",
|
||||
"mainly fun",
|
||||
"slightly tmi&showering",
|
||||
"i sang it like every time i showered for months and months",
|
||||
"eh what the heck i'll just",
|
||||
"opinion&reiterated opinion&on homestuck&beyond canon",
|
||||
"today has been so awesome",
|
||||
"i didn't make a great homestuck post&or really any homestuck post&but the homestuck^2 (is it even that still???) upd8 was fantastic",
|
||||
"i see it as a microcosm as my attitude to the new team as a whole",
|
||||
'at first: "holy crap! new and scary" (hussie really is fantastic). speaking of,',
|
||||
"shill&being annoying for a joke",
|
||||
"read psycholonials it's free come on do it do it do it",
|
||||
"but more and more i've been warming up to them as they figure things out",
|
||||
"and&after catching most of the three hour 413 stream",
|
||||
"yeah! they're fantastic. i'm so happy for them&and i'm just happy in general",
|
||||
"it's great to know that the future of homestuck is in good hands",
|
||||
"quote"e that i already posted&edited quote&portion of quote",
|
||||
"I can’t imagine it’s going to take us less than three years of regular updates, but it could end up stretching longer",
|
||||
"keyspam",
|
||||
"aslkfjlk;asdjkdslkjflk;asd lk;fsdjl fjalksd lk alsdk f laksf lkjsdlfk lasdkf lkjsdlkjflkjdljk",
|
||||
"it makes me so so happy",
|
||||
"bodily fluids&tearducts",
|
||||
"i keep almost getting watery eyes! it's ridiculous!",
|
||||
"keyspam",
|
||||
"i'm so happy aslkfj",
|
||||
"anyway&back to nonsense",
|
||||
"watch how elegantly and fluidly i mix actual content warning type things with just word typing",
|
||||
"truly, i am a master of my craft",
|
||||
"okay how big is this now (kb-wise)",
|
||||
"133.82",
|
||||
"very reasonable",
|
||||
"i'll have to yap much more...",
|
||||
"nothing",
|
||||
"",
|
||||
"i'm on page 4819 of my reread btw",
|
||||
"was originally planning to finish it by 413 but i was so slow",
|
||||
"so i'm deciding to just savor it",
|
||||
"it's been very, very bursty progress",
|
||||
"but i really do thoroughly enjoy it",
|
||||
"i'm a homestuck! i don't know why i feel the need to re-",
|
||||
"oh right it's homestuck day i spent three hours in an official homestuck stream this is kind of what's on mind",
|
||||
"that's understandable i guess",
|
||||
"happy 413&btw&i don't think i said that yet",
|
||||
"i really need to finish this up",
|
||||
"i know this is one of those Bad Posts where quantity (fails to) make quality",
|
||||
"but i am getting dry eyes",
|
||||
"too much homestuck and other stuff!",
|
||||
"also i need to get this out by the end of 413 in my timezone",
|
||||
"which is in like 14 minutes",
|
||||
"don't question the logic this matters!",
|
||||
"btw, the kbs went down because i factored out the cherry text color",
|
||||
"HOLY CRAP THAT IS SUCH A TEREZI THING",
|
||||
"FJLKSDLKFJSLDKJFLKJDFLKJSDFLKJ",
|
||||
"well&they went up&but they went down measuring from that point",
|
||||
"well&i didn't actually measure from that point",
|
||||
"okay whatever uhhh",
|
||||
"i'm running out of time",
|
||||
"and i have to admit that the ending is pretty lame",
|
||||
"so i'm trying to (quickly) think of a way to make these last few more fun",
|
||||
"opinion",
|
||||
"terezi is great!",
|
||||
"realization",
|
||||
"aw crap, you probably already knew i thought that",
|
||||
"curse my plentiful past public praise!",
|
||||
"i'm glad being funny is something the new team wants to do and can do",
|
||||
"homestuck was chock-full of great jokes",
|
||||
"homestuck^2 is great i'm happy bla bla new team bla bla",
|
||||
"okay uh",
|
||||
"eggbug",
|
||||
].map(s => s.split("&"))}
|
||||
end={
|
||||
<div>
|
||||
<p>
|
||||
HAPPY 413! i barely made it in time IT COUNTS it COUNTE
|
||||
! <a href="https://413.gay">homestuck</a>
|
||||
</p>
|
||||
<p>
|
||||
uh, you want more? fine, take{" "}
|
||||
<a href="https://pyrope.net/mcai">
|
||||
discord server that i made so i could continue
|
||||
saying "man, computers are incredible" every day
|
||||
</a>
|
||||
, you're clearly, eh, dedicated
|
||||
</p>
|
||||
<p>
|
||||
(if it wasn't obvious, this is kinda lame because i was
|
||||
hoping you'd give up by now)
|
||||
</p>
|
||||
</div>
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
);
|
22
html/old-why-am-i-always-like-this.html
Normal file
|
@ -0,0 +1,22 @@
|
|||
<div style="display: flex; width: 100%; align-items: center; justify-content: center; margin: 2rem 0">
|
||||
<div style="flex: 1.2"><h1 style="transform: rotateY(180deg); text-align: center; font-size: 3rem">👀</h1> <p style="text-align: center">i should click on this and open it</p></div>
|
||||
<div style="outline: 2px solid black; flex: 2; aspect-ratio: 16/9; transform: perspective(500px) rotateY(-20deg) skewY(10deg) scale(0.8);">
|
||||
<details>
|
||||
<summary style="list-style: none; padding: 0.25rem">
|
||||
<div style="display: flex; flex-direction: column; align-items: center; gap: 0.75rem; margin: 0.75rem;">
|
||||
<div style="background-color: rgb(var(--color-notWhite)); border: 1px solid rgb(var(--color-cherry)); border-radius: 0.5rem; box-sizing: border-box; padding: 0.75rem; gap: 0.75rem; align-self: stretch; display: flex; flex-direction: row; align-items: center;">
|
||||
<img src="https://static.pyrope.net/warning-shield.png" aria-hidden="true" style="margin: 0; display: block">
|
||||
<p style="color: rgb(var(--color-cherry)); margin: 0; line-height: 24px">This post has content warnings for: <b>major spoilers for things. very major. i mean it!</b></p>
|
||||
</div>
|
||||
<div style="cursor: pointer; background-color: rgb(var(--color-cherry)); border-radius: 0.5rem; color: rgb(var(--color-notWhite)); padding: 0.75rem; line-height: 1; letter-spacing: 0.05em; whitespace: nowrap;">
|
||||
show post
|
||||
</div>
|
||||
</div>
|
||||
</summary>
|
||||
<div style="position: absolute; inset: 0; background-color: white; overflow-y: auto">
|
||||
<p style="text-align: center; color: black">these guys die :(</p>
|
||||
<img src="https://static.wikia.nocookie.net/seuss/images/d/d3/Thing1-and-thing2.jpg" alt="things 1 and 2 from dr. seuss" style="width: 100%">
|
||||
<a style="width: fit-content; margin: 0 auto; display: block; color: #ccc" href="https://pyrope.net/randirect#cohost.org/mehbark/post/2555916-cursor-adventure-so::pyrope.net/mcai::irc.pyrope.net::413.gay::pyrope.net/tnb::pyrope.net/concat::pyrope.net/davehash::twitter.com/mehbark::pl.pyrope.net/terezi">random fun 4 u</a>
|
||||
</div>
|
||||
</details>
|
||||
</div></div>
|
179
html/one-post.less
Normal file
|
@ -0,0 +1,179 @@
|
|||
@longan: rgb(var(--color-longan));
|
||||
@not-white: rgb(var(--color-notWhite));
|
||||
@not-black: rgb(var(--color-notBlack));
|
||||
@fg: rgb(var(--color-foreground));
|
||||
@bg: rgb(var(--color-background));
|
||||
|
||||
@height: 20rem;
|
||||
|
||||
* {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
hr {
|
||||
border-color: rgb(191 186 181);
|
||||
margin: 0 0.75rem;
|
||||
}
|
||||
|
||||
.hrish {
|
||||
background-color: @not-white;
|
||||
}
|
||||
|
||||
#fake-main {
|
||||
height: @height;
|
||||
margin: -1rem 0;
|
||||
}
|
||||
|
||||
#main {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
width: 100%;
|
||||
height: @height;
|
||||
display: flex;
|
||||
background-color: @bg;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.bottom {
|
||||
background: @not-white;
|
||||
font-size: 0.875rem;
|
||||
color: gray;
|
||||
padding: 0.75rem;
|
||||
//width: 100%;
|
||||
//max-width: 100%;
|
||||
border-bottom-right-radius: 0.5rem;
|
||||
border-bottom-left-radius: 0.5rem;
|
||||
box-shadow: 0px 4px 5px rgba(25,25,25,.14),0px 1px 10px rgba(25,25,25,.12),0px 2px 4px rgba(0,0,0,.2);
|
||||
}
|
||||
|
||||
.bottom-inner {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
//vertical-align: middle;
|
||||
}
|
||||
|
||||
// V compromise V
|
||||
a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.comments {
|
||||
//width: max-content;
|
||||
//flex: none;
|
||||
}
|
||||
|
||||
.interactions {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
//justify-content: flex-end;
|
||||
gap: 0.75rem;
|
||||
}
|
||||
|
||||
.content {
|
||||
background-color: white;
|
||||
padding: 0 0.75rem;
|
||||
display: flex;
|
||||
min-height: min-content;
|
||||
flex-grow: 1;
|
||||
padding-top: 0.5rem;
|
||||
}
|
||||
|
||||
.middle {
|
||||
// V the main feed uses gap: 3rem V
|
||||
height: 3rem;
|
||||
}
|
||||
|
||||
.top {
|
||||
display: flex;
|
||||
//width: 100%;
|
||||
//max-width: 100%;
|
||||
//flex-direction: row;
|
||||
align-items: center;
|
||||
//justify-content: space-between;
|
||||
//gap: 0.5rem;
|
||||
border-top-left-radius: 0.5rem;
|
||||
border-top-right-radius: 0.5rem;
|
||||
background-color: @not-white;
|
||||
padding: 0.75rem;
|
||||
box-shadow: 0px -4px 5px rgba(25,25,25,.14),0px -1px 10px rgba(25,25,25,.12),0px -2px 4px rgba(0,0,0,.2);
|
||||
}
|
||||
|
||||
.top-info {
|
||||
display: flex;
|
||||
//min-width: 0;
|
||||
flex: 1 1 0%;
|
||||
flex-direction: row;
|
||||
flex-wrap: wrap;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.display-name {
|
||||
//max-width: 100%;
|
||||
//flex-shrink: 1;
|
||||
//overflow: hidden;
|
||||
//text-overflow: ellipsis;
|
||||
//white-space: nowrap;
|
||||
font-weight: 700;
|
||||
//color: @not-black;
|
||||
}
|
||||
|
||||
.username {
|
||||
color: rgb(104 102 100);
|
||||
}
|
||||
|
||||
.posted {
|
||||
//display: block;
|
||||
//flex: none;
|
||||
font-size: 0.75rem;
|
||||
//line-height: 1rem;
|
||||
// not doing the weird tabular-nums thing, i don't get it
|
||||
color: rgb(130 127 124);
|
||||
}
|
||||
|
||||
.headline {
|
||||
padding: 0.75rem;
|
||||
//display: flex;
|
||||
//width: 100%;
|
||||
//flex-direction: row;
|
||||
}
|
||||
|
||||
.headline > a {
|
||||
//flex-grow: 1;
|
||||
//align-self: center;
|
||||
//overflow-wrap: break-word;
|
||||
font-size: 1.25rem;
|
||||
line-height: 1.75rem;
|
||||
}
|
||||
|
||||
.headline > a > h1 {
|
||||
color: black;
|
||||
font-size: inherit;
|
||||
}
|
||||
|
||||
.post-content {
|
||||
padding-left: 0.75rem;
|
||||
padding-right: 0.75rem;
|
||||
//position: relative;
|
||||
//overflow: hidden;
|
||||
//isolation: isolate;
|
||||
margin-top: 1rem;
|
||||
margin-bottom: 1rem;
|
||||
color: @not-black;
|
||||
}
|
||||
|
||||
.post-inner {
|
||||
box-shadow: 0px 4px 5px rgba(0,0,0,.14),0px 1px 10px rgba(0,0,0,.12),0px 2px 4px rgba(0,0,0,.2);
|
||||
//z-index: -413;
|
||||
background-color: white;
|
||||
}
|
||||
|
||||
.posts {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
//box-shadow: 0px 4px 5px rgba(0,0,0,.14),0px 1px 10px rgba(0,0,0,.12),0px 2px 4px rgba(0,0,0,.2);
|
||||
gap: 2rem;
|
||||
}
|
70
html/one-post.tsx
Normal file
|
@ -0,0 +1,70 @@
|
|||
import { ComponentChildren } from "preact";
|
||||
import { render_and_copy } from "./common.tsx";
|
||||
import { Top, Bottom, Hrish } from "./this-post-is-two-posts.tsx";
|
||||
|
||||
// this would be a funny time to do multiple posts
|
||||
|
||||
export const Post = ({
|
||||
children,
|
||||
headline,
|
||||
n_comments,
|
||||
display_name,
|
||||
username,
|
||||
posted,
|
||||
link,
|
||||
id,
|
||||
alt_text = true,
|
||||
}: {
|
||||
children?: ComponentChildren;
|
||||
|
||||
headline?: string;
|
||||
|
||||
n_comments: number;
|
||||
|
||||
display_name?: string;
|
||||
username: string;
|
||||
posted: string;
|
||||
link?: string;
|
||||
id?: string;
|
||||
alt_text?: boolean;
|
||||
}) => (
|
||||
<div class="post">
|
||||
<Top
|
||||
display_name={display_name}
|
||||
username={username}
|
||||
posted={posted}
|
||||
link={link}
|
||||
id={id}
|
||||
alt_text={alt_text}
|
||||
/>
|
||||
<Hrish />
|
||||
<div class="post-inner">
|
||||
{headline && (
|
||||
<div class="headline">
|
||||
<a href={link}>
|
||||
<h1>{headline}</h1>
|
||||
</a>
|
||||
</div>
|
||||
)}
|
||||
<div style="display: flex;">
|
||||
<div class="post-content">{children}</div>
|
||||
</div>
|
||||
</div>
|
||||
<Hrish />
|
||||
<Bottom n_comments={n_comments} alt_text={alt_text} />
|
||||
</div>
|
||||
);
|
||||
|
||||
render_and_copy(
|
||||
<div class="posts">
|
||||
<Post
|
||||
headline="can i have more than one post please"
|
||||
username="mehbark"
|
||||
posted="6 hr. ago"
|
||||
n_comments={2}
|
||||
alt_text={false}
|
||||
>
|
||||
one post isn't really enough for me
|
||||
</Post>
|
||||
</div>
|
||||
);
|
249
html/prngsentences.html
Normal file
|
@ -0,0 +1,249 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>PRNG sentences</title>
|
||||
<meta itemprop="name" content="PRNG Sentences" />
|
||||
<meta property="og:title" content="PRNG Sentences" />
|
||||
<meta property="twitter:title" content="PRNG Sentences" />
|
||||
|
||||
<meta
|
||||
name="description"
|
||||
content="helper for prng sentences made with prngnouns"
|
||||
/>
|
||||
<meta
|
||||
property="og:description"
|
||||
content="helper for prng sentences made with prngnouns"
|
||||
/>
|
||||
<meta
|
||||
property="twitter:description"
|
||||
content="helper for prng sentences made with prngnouns"
|
||||
/>
|
||||
|
||||
<meta property="og:site_name" content="PRNG sentences" />
|
||||
|
||||
<meta name="theme-color" content="#eedd33" />
|
||||
<style>
|
||||
:root {
|
||||
--accent: #eedd33;
|
||||
--fg: #171d00;
|
||||
--bg: #fffeee;
|
||||
}
|
||||
|
||||
#ui {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
grid-template-rows: 10fr 1fr;
|
||||
flex: 4;
|
||||
gap: 10px;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
#reference {
|
||||
flex: 1;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
height: 100vh;
|
||||
width: 100vw;
|
||||
color: var(--fg);
|
||||
background-color: var(--bg);
|
||||
/* overflow: hidden; */
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
textarea {
|
||||
color: var(--fg);
|
||||
background-color: var(--bg);
|
||||
border: none;
|
||||
outline: 2px dashed var(--accent);
|
||||
}
|
||||
|
||||
textarea:focus {
|
||||
outline: 2px solid var(--accent);
|
||||
}
|
||||
|
||||
button {
|
||||
font-size: large;
|
||||
}
|
||||
|
||||
#preview {
|
||||
grid-column: 1 / span 2;
|
||||
font-family: Atkinson Hyperlegible, ui-sans-serif, system-ui,
|
||||
-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
|
||||
"Helvetica Neue", Arial, "Noto Sans", sans-serif,
|
||||
"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol",
|
||||
"Noto Color Emoji";
|
||||
font-size: 1rem;
|
||||
line-height: 1.75;
|
||||
margin: 0;
|
||||
padding: 1rem;
|
||||
outline: 2px solid var(--accent);
|
||||
}
|
||||
|
||||
kbd {
|
||||
background-color: #eee;
|
||||
border-radius: 3px;
|
||||
border: 1px solid #b4b4b4;
|
||||
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2),
|
||||
0 2px 0 0 rgba(255, 255, 255, 0.7) inset;
|
||||
color: #333;
|
||||
display: inline-block;
|
||||
font-size: 0.85em;
|
||||
font-weight: 700;
|
||||
line-height: 1;
|
||||
padding: 2px 4px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
// regices are hilarious sometimes
|
||||
const PRNG_REGEX =
|
||||
/∈{([^∈∋{}]+)}(?:{(?:([^ ]+))?(?: *on ([^ ]+))?})?/g;
|
||||
|
||||
const regularify = split => {
|
||||
if (split.length <= 1) {
|
||||
return split;
|
||||
}
|
||||
|
||||
return [
|
||||
split[0],
|
||||
{
|
||||
options: split[1].split(/\s*\|\s*/g),
|
||||
fg: split[2],
|
||||
outline: split[3],
|
||||
is_choice: true,
|
||||
},
|
||||
...regularify(split.slice(4)),
|
||||
];
|
||||
};
|
||||
|
||||
const sentence_id = new Date().toISOString();
|
||||
const choice = ({ options, fg, outline }, index) =>
|
||||
`<img class="prngsentence-choice" style="display: inline; height: 1lh; margin: 0; vertical-align: bottom;" alt="randomly one of the following: ${options.join(
|
||||
", "
|
||||
)}" src="https://pyrope.net/prngnouns?p=${options
|
||||
.map(encodeURI)
|
||||
.join("&p=")}${
|
||||
fg ? `&fg=${standardize_color(fg).slice(1)}` : ""
|
||||
}${
|
||||
outline
|
||||
? `&outline=${standardize_color(outline).slice(1)}`
|
||||
: ""
|
||||
}&sentence_index=${index}&sentence_id=${sentence_id}">`;
|
||||
|
||||
const render = text => {
|
||||
const awesome = regularify(text.split(PRNG_REGEX));
|
||||
let out = "";
|
||||
let idx = 0;
|
||||
|
||||
for (const a of awesome) {
|
||||
if (a.is_choice) {
|
||||
out += choice(a, idx);
|
||||
idx += 1;
|
||||
} else {
|
||||
out += `<span class="prngsentence-bridge">${a}</span>`;
|
||||
}
|
||||
}
|
||||
|
||||
return out;
|
||||
};
|
||||
|
||||
// https://stackoverflow.com/a/47355187
|
||||
function standardize_color(str) {
|
||||
var ctx = document.createElement("canvas").getContext("2d");
|
||||
ctx.fillStyle = str;
|
||||
return ctx.fillStyle;
|
||||
}
|
||||
|
||||
window.onload = () => {
|
||||
const input = document.getElementById("input");
|
||||
const output = document.getElementById("output");
|
||||
const preview = document.getElementById("preview");
|
||||
|
||||
const rerender = () => {
|
||||
const rendered = render(input.value);
|
||||
output.value = rendered;
|
||||
preview.innerHTML = rendered;
|
||||
};
|
||||
|
||||
input.addEventListener("change", rerender);
|
||||
|
||||
input.addEventListener("keyup", rerender);
|
||||
|
||||
document.addEventListener("keyup", e => {
|
||||
if (e.altKey && e.key == "r") {
|
||||
input.value += "∈";
|
||||
}
|
||||
rerender();
|
||||
});
|
||||
|
||||
rerender();
|
||||
};
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="ui">
|
||||
<textarea id="input">
|
||||
∈{hello|hi|hey}, and welcome to <b>PRNG sentences</b>! This is a ∈{awesome|cool|pointless|lame|okay} ∈{tool|toy|web page} ∈{made|assembled|written|programmed} by ∈{mehbark|me|some guy}. It's actually ∈{quite|pretty|decently|very|very, very|} easy to use, so you can just look at the reference at the bottom of the page. </textarea
|
||||
>
|
||||
<textarea readonly id="output"></textarea>
|
||||
<button id="open-prng" onclick="input.value += '∈'">∈</button>
|
||||
<button
|
||||
id="copy"
|
||||
onclick="window.navigator.clipboard.writeText(output.value)"
|
||||
>
|
||||
copy
|
||||
</button>
|
||||
<p id="preview"></p>
|
||||
</div>
|
||||
<ul id="reference">
|
||||
<li>
|
||||
Choices are of the form <code>∈{a|b|c}{fg on outline}</code>
|
||||
</li>
|
||||
<li>
|
||||
You can omit the second bracketed form, or the
|
||||
<code>fg</code> or <code>on outline</code> parts
|
||||
</li>
|
||||
<li>
|
||||
If you want to have <code>|</code> be in an option, you can't.
|
||||
Sorry!
|
||||
</li>
|
||||
<li>
|
||||
Press the ∈ button to insert an ∈ at the <strong>end</strong> of
|
||||
the input
|
||||
</li>
|
||||
<li>
|
||||
You can also press
|
||||
<span onclick="this.innerHTML = `<code>M-r</code>`"
|
||||
><kbd>Alt</kbd> + <kbd>R</kbd></span
|
||||
>
|
||||
</li>
|
||||
<li>
|
||||
Due to caching magick things stuff, you might have to reload to
|
||||
rerandomize in some circumstances. Your browser should keep the
|
||||
input unless you do a hard-reload, but you can copy-paste to be
|
||||
sure
|
||||
</li>
|
||||
<li>
|
||||
Some default styles are applied to the images to make them less
|
||||
terrible, but you can use
|
||||
<a
|
||||
href="https://cloudwithlightning.net/random/chostin/prechoster/"
|
||||
>prechoster</a
|
||||
>
|
||||
to style them easily.
|
||||
</li>
|
||||
<li>Feel free to use arbitrary HTML! Nothing is escaped! Sorry?</li>
|
||||
<li>
|
||||
This was made by
|
||||
<a href="https://cohost.org/mehbark">mehbark</a>
|
||||
</li>
|
||||
</ul>
|
||||
</body>
|
||||
</html>
|
67
html/rain.tsx
Normal file
|
@ -0,0 +1,67 @@
|
|||
import { render_and_copy } from "./common.tsx";
|
||||
|
||||
const Drop = ({ color = "red", i }: { color?: string; i: number }) => (
|
||||
<div
|
||||
style={{
|
||||
backgroundColor: color,
|
||||
animation: `${(Math.random() * 2 + 5).toFixed(
|
||||
2
|
||||
)}s cubic-bezier(.55,.09,.68,.53) ${(-Math.random() * 10).toFixed(
|
||||
2
|
||||
)}s spin infinite reverse`,
|
||||
gridRow: "1",
|
||||
gridColumn: `${i}`,
|
||||
width: "1px",
|
||||
height: "1px",
|
||||
marginTop: "-1rem",
|
||||
transform: "translateY(20rem)",
|
||||
}}
|
||||
class="drop"
|
||||
></div>
|
||||
);
|
||||
|
||||
const Water = ({
|
||||
color = "red",
|
||||
duration_s,
|
||||
}: {
|
||||
color?: string;
|
||||
duration_s: number;
|
||||
}) => (
|
||||
<div
|
||||
style={{
|
||||
backgroundColor: color,
|
||||
gridRow: "1 / 2",
|
||||
gridColumn: "1 / 100000",
|
||||
transform: "translateY(100%)",
|
||||
animation: `${duration_s}s linear 0s 1 spin forwards`,
|
||||
}}
|
||||
></div>
|
||||
);
|
||||
|
||||
const Rain = ({
|
||||
duration_s,
|
||||
color = "red",
|
||||
drops = 100,
|
||||
}: {
|
||||
duration_s: number;
|
||||
color?: string;
|
||||
drops?: number;
|
||||
}) => (
|
||||
<div
|
||||
style={{
|
||||
width: "25%",
|
||||
aspectRatio: "1",
|
||||
margin: "auto",
|
||||
outline: "1px solid red",
|
||||
display: "grid",
|
||||
overflow: "clip",
|
||||
}}
|
||||
>
|
||||
{...Array.from({ length: drops }, (_, i) => (
|
||||
<Drop i={i} color={color} />
|
||||
))}
|
||||
<Water color={color} duration_s={duration_s} />
|
||||
</div>
|
||||
);
|
||||
|
||||
render_and_copy(<Rain duration_s={600} drops={150} />);
|
604
html/random-character.tsx
Normal file
|
@ -0,0 +1,604 @@
|
|||
import { JSX } from "preact/jsx-runtime";
|
||||
import { Main, render_and_copy, serverside_randirect } from "./common.tsx";
|
||||
|
||||
// let's do 100 first and last names OKAY
|
||||
//
|
||||
// cat ~/Documents/dictionary.txt | grep -e '^.\{6,7\}$' | shuf | head -n 100
|
||||
// okay let's be a bit more selective yikes
|
||||
// cat ~/Documents/dictionary.txt | grep -E '^....$' | shuf | head -n 100 | awk 'BEGIN {print("[")} {print(" \"" $1 "\",")} END {print("]")}' | xsel -ib
|
||||
// cat ~/Documents/dictionary.txt | grep -E '^[^n][^i][^g]....?$' | shuf | head -n 100 | awk 'BEGIN {print("[")} {print(" \"" $1 "\",")} END {print("]")}' | xsel -ib
|
||||
// that is a COMPREHENSIVE dictionary D:
|
||||
|
||||
const FIRST_NAMES = [
|
||||
"tree",
|
||||
"saka",
|
||||
"pass",
|
||||
"kexy",
|
||||
"pici",
|
||||
"kurd",
|
||||
"xxii",
|
||||
"lide",
|
||||
"huke",
|
||||
"palm",
|
||||
"levi",
|
||||
"dago",
|
||||
"they",
|
||||
"cool",
|
||||
"filt",
|
||||
"cump",
|
||||
"upgo",
|
||||
"zoid",
|
||||
"army",
|
||||
"anta",
|
||||
"arbs",
|
||||
"ferv",
|
||||
"stan",
|
||||
"wabe",
|
||||
"jami",
|
||||
"purs",
|
||||
"deys",
|
||||
"vamp",
|
||||
"mese",
|
||||
"migs",
|
||||
"pile",
|
||||
"susu",
|
||||
"olio",
|
||||
"ipse",
|
||||
"gelt",
|
||||
"idem",
|
||||
"eden",
|
||||
"pont",
|
||||
"vica",
|
||||
"corv",
|
||||
"kell",
|
||||
"elul",
|
||||
"ecod",
|
||||
"maid",
|
||||
"kays",
|
||||
"fine",
|
||||
"taws",
|
||||
"coul",
|
||||
"shag",
|
||||
"aren",
|
||||
"ruse",
|
||||
"anre",
|
||||
"spex",
|
||||
"perp",
|
||||
"koff",
|
||||
"west",
|
||||
"sild",
|
||||
"vina",
|
||||
"itch",
|
||||
"neal",
|
||||
"jhow",
|
||||
"cozy",
|
||||
"moun",
|
||||
"copy",
|
||||
"fict",
|
||||
"gulp",
|
||||
"slon",
|
||||
"tuny",
|
||||
"tolt",
|
||||
"erns",
|
||||
"eyas",
|
||||
"thro",
|
||||
"reno",
|
||||
"warm",
|
||||
"lone",
|
||||
"erst",
|
||||
"koel",
|
||||
"vila",
|
||||
"rump",
|
||||
"kmet",
|
||||
"drow",
|
||||
"polt",
|
||||
"orts",
|
||||
"hlqn",
|
||||
"adib",
|
||||
"dabb",
|
||||
"dhak",
|
||||
"tyke",
|
||||
"arni",
|
||||
"bagh",
|
||||
"holt",
|
||||
"wart",
|
||||
"bull",
|
||||
"mayo",
|
||||
"tiam",
|
||||
"dose",
|
||||
"dogs",
|
||||
"dine",
|
||||
"wych",
|
||||
"poet",
|
||||
"meh",
|
||||
"egg",
|
||||
].map(name => name[0].toUpperCase() + name.slice(1));
|
||||
|
||||
const LAST_NAMES = [
|
||||
"paragon",
|
||||
"phossy",
|
||||
"burghal",
|
||||
"templum",
|
||||
"osteome",
|
||||
"deicide",
|
||||
"lockrum",
|
||||
"inhale",
|
||||
"celoms",
|
||||
"outsit",
|
||||
"plaints",
|
||||
"stubby",
|
||||
"flabrum",
|
||||
"elcaja",
|
||||
"thrang",
|
||||
"caretta",
|
||||
"retune",
|
||||
"unplace",
|
||||
"adlumin",
|
||||
"garcon",
|
||||
"brainy",
|
||||
"slyest",
|
||||
"tsktsks",
|
||||
"bodock",
|
||||
"crummer",
|
||||
"actions",
|
||||
"wrapped",
|
||||
"emeril",
|
||||
"traneen",
|
||||
"wrought",
|
||||
"detinue",
|
||||
"ascarid",
|
||||
"swimbel",
|
||||
"leaped",
|
||||
"ericoid",
|
||||
"solano",
|
||||
"barware",
|
||||
"infarce",
|
||||
"bullets",
|
||||
"frankly",
|
||||
"euboean",
|
||||
"jymold",
|
||||
"besugo",
|
||||
"smaragd",
|
||||
"suiting",
|
||||
"muconic",
|
||||
"goujay",
|
||||
"caynard",
|
||||
"pupped",
|
||||
"verdict",
|
||||
"brangle",
|
||||
"potions",
|
||||
"touart",
|
||||
"fraena",
|
||||
"peising",
|
||||
"replial",
|
||||
"unbaste",
|
||||
"sandbug",
|
||||
"roosed",
|
||||
"refind",
|
||||
"illipe",
|
||||
"runner",
|
||||
"implate",
|
||||
"atoxyl",
|
||||
"favous",
|
||||
"opcode",
|
||||
"fuegian",
|
||||
"cadging",
|
||||
"soapbox",
|
||||
"fessed",
|
||||
"deworm",
|
||||
"browzer",
|
||||
"uncurl",
|
||||
"toelike",
|
||||
"posnet",
|
||||
"mortem",
|
||||
"whippa",
|
||||
"invests",
|
||||
"aphagia",
|
||||
"attent",
|
||||
"esopgi",
|
||||
"resorb",
|
||||
"succula",
|
||||
"levulic",
|
||||
"enlace",
|
||||
"busbars",
|
||||
"rocket",
|
||||
"sexuous",
|
||||
"provers",
|
||||
"condole",
|
||||
"caveman",
|
||||
"cattily",
|
||||
"buddie",
|
||||
"trikaya",
|
||||
"ladlers",
|
||||
"gorbet",
|
||||
"tarkani",
|
||||
"acquit",
|
||||
"shohjis",
|
||||
"shilloo",
|
||||
"bark",
|
||||
"bug",
|
||||
].map(name => name[0].toUpperCase() + name.slice(1));
|
||||
|
||||
const ASPECTS = [
|
||||
"Space",
|
||||
"Time",
|
||||
"Mind",
|
||||
"Heart",
|
||||
"Hope",
|
||||
"Rage",
|
||||
"Breath",
|
||||
"Blood",
|
||||
"Life",
|
||||
"Doom",
|
||||
"Light",
|
||||
"Void",
|
||||
];
|
||||
|
||||
// oh heck yeah we can totally layer clothes and stuff
|
||||
// not gonna though
|
||||
// link to http://www.farragofiction.com/DollSim/ why not
|
||||
|
||||
const CLASSES = [
|
||||
"Thief",
|
||||
"Rogue",
|
||||
"Bard",
|
||||
"Prince",
|
||||
"Heir",
|
||||
"Page",
|
||||
"Seer",
|
||||
"Maid",
|
||||
"Sylph",
|
||||
"Knight",
|
||||
"Witch",
|
||||
"Mage",
|
||||
];
|
||||
|
||||
// if this was ruby i could just multiply that array grumble grumble
|
||||
|
||||
const LIKED_NOUNS = [
|
||||
"cats",
|
||||
"dogs",
|
||||
"computers",
|
||||
"keyboards",
|
||||
"eggbug",
|
||||
"homestuck",
|
||||
"websites",
|
||||
"paintbrushes",
|
||||
"randomness",
|
||||
"posts",
|
||||
"chairs",
|
||||
"wires",
|
||||
"audio",
|
||||
"sound",
|
||||
"music",
|
||||
"sound effects",
|
||||
"personal hygiene",
|
||||
"smells",
|
||||
"cars",
|
||||
"cdrs",
|
||||
"pairs",
|
||||
"atoms",
|
||||
"lists",
|
||||
"trees",
|
||||
"tasks",
|
||||
"smart devices",
|
||||
"dumb devices",
|
||||
"synthesizers",
|
||||
"violins",
|
||||
"pianos",
|
||||
"remotes",
|
||||
"earbuds",
|
||||
"eggbuds",
|
||||
"scented waxes",
|
||||
"cables",
|
||||
"cords",
|
||||
"love",
|
||||
"hate",
|
||||
"coolness",
|
||||
"radness",
|
||||
"gnarliness",
|
||||
"lameness",
|
||||
"sick-nastiness",
|
||||
"maximalism",
|
||||
"minimalism",
|
||||
"cohost",
|
||||
"html",
|
||||
"css",
|
||||
"javascript",
|
||||
"typescript",
|
||||
"deno",
|
||||
"dinos",
|
||||
"life",
|
||||
"yourself",
|
||||
"whatever is reading this",
|
||||
"fish",
|
||||
"sharks",
|
||||
"eevees",
|
||||
"seagulls",
|
||||
].map(s => s.toUpperCase());
|
||||
|
||||
const LIKED_ACTIVITIES = [
|
||||
"playing the trombone",
|
||||
"playing the piano",
|
||||
"using the computer",
|
||||
"posting on the websites",
|
||||
"reading homestuck",
|
||||
"playing homestuck",
|
||||
"reading gamebro",
|
||||
"reading gamegrl",
|
||||
"helping others",
|
||||
"hindering others",
|
||||
"egging the bug",
|
||||
"coing the host",
|
||||
"making a javascript",
|
||||
"scheming (in the evil sense)",
|
||||
"scheming (in the algorithmic language sense)",
|
||||
"reading books (how exciting)",
|
||||
"reading blogs",
|
||||
"being kind :D",
|
||||
"being rude D:",
|
||||
"liking things",
|
||||
"loving things",
|
||||
"transforming",
|
||||
"refreshing this page to see different things",
|
||||
"writing blogs",
|
||||
"writing books",
|
||||
"writing visual novels",
|
||||
"reading visual novels",
|
||||
"playing visual novels",
|
||||
"gaming",
|
||||
"gaming so hard",
|
||||
"gaming so, so hard",
|
||||
"gaming so, so, so hard",
|
||||
"gaming a regular amount of hard",
|
||||
"flarping",
|
||||
"playing games for girls",
|
||||
"sweeping mines",
|
||||
"tetrising",
|
||||
"nixing operating systems",
|
||||
"emacsing",
|
||||
"using alternatives to discord",
|
||||
"internet relay chatting",
|
||||
"hypertexting",
|
||||
"decorating your room",
|
||||
"designing clothes",
|
||||
"wearing clothes",
|
||||
"being cool",
|
||||
"being rad",
|
||||
"being gnarly",
|
||||
"being lame",
|
||||
"making fun random generators by assembling a small set of primitives that, yes, could be more atomic",
|
||||
"making this text really squishy by liking doing something with a really long description like this",
|
||||
"finishing up a list",
|
||||
"writing activities that are actually homestuckish",
|
||||
"staying in your room",
|
||||
"staying anywhere but your room",
|
||||
"programming poorly",
|
||||
"shaving",
|
||||
"dressing in a spiffy manner",
|
||||
"watching crappy movies",
|
||||
"watching really good movies",
|
||||
"doing nothing in particular",
|
||||
"cleaning your room",
|
||||
"attempting to escape your absurd house",
|
||||
"attempting to make your house more absurd",
|
||||
"architecting",
|
||||
"visiting others",
|
||||
"visiting yourself",
|
||||
"doing enough",
|
||||
].map(s => s.toUpperCase());
|
||||
|
||||
const HEADWEAR = [
|
||||
...new Array(20).fill("nothing on top of your head"),
|
||||
"a dorky top hat",
|
||||
"a spiffy top hat",
|
||||
"a baseball cap",
|
||||
"a baseball helmet",
|
||||
"a football helmet",
|
||||
"a puppet on top of your head",
|
||||
"a smaller version of yourself on top of your head",
|
||||
"a headband with attached horns",
|
||||
"a headband",
|
||||
"a veil",
|
||||
"a fedora",
|
||||
"a comically small top hat",
|
||||
"a comically large top hat",
|
||||
];
|
||||
|
||||
const FACEWEAR = [
|
||||
...new Array(20).fill("nothing on your face"),
|
||||
"some sick shades",
|
||||
"some frankly lame shades",
|
||||
"heart-shaped shades",
|
||||
"circular shades",
|
||||
"circular glasses",
|
||||
"square glasses",
|
||||
"glasses that you would consider standard",
|
||||
"grey facepaint",
|
||||
"clown facepaint",
|
||||
"juggalo facepaint",
|
||||
"a clown nose",
|
||||
"Vriska's glasses (they aren't yours)",
|
||||
"Dave's shades (they aren't yours)",
|
||||
];
|
||||
|
||||
const TOP = [
|
||||
"a tank top",
|
||||
"a collared shirt",
|
||||
"a polo shirt",
|
||||
"a generic t-shirt",
|
||||
"a non-generic t-shirt",
|
||||
"a red t-shirt",
|
||||
"a orange t-shirt",
|
||||
"a yellow t-shirt",
|
||||
"a green t-shirt",
|
||||
"a blue t-shirt",
|
||||
"a indigo t-shirt",
|
||||
"a violet t-shirt",
|
||||
"a teal t-shirt",
|
||||
"a Terezi t-shirt (what!!)",
|
||||
"a white shirt",
|
||||
"a pair of pants as a shirt",
|
||||
"a grey t-shirt",
|
||||
"a gray t-shirt",
|
||||
"a brown t-shirt",
|
||||
"a scratchy sweater",
|
||||
"an incredibly comfortable sweater",
|
||||
"a sweater",
|
||||
"a jacket",
|
||||
"a coat",
|
||||
"an appropriately-heavy coat",
|
||||
"an inappropriately-heavy coat",
|
||||
"a cargo shirt",
|
||||
"a cargo shirt that you added more pockets to",
|
||||
];
|
||||
|
||||
const BOTTOM = [
|
||||
"pants",
|
||||
"shorts",
|
||||
"a skirt",
|
||||
"cargo pants",
|
||||
"cargo shorts",
|
||||
"a cargo skirt",
|
||||
"cargo pants that you added more pockets to",
|
||||
"cargo shorts that you added more pockets to",
|
||||
"a cargo skirt that you added more pockets to",
|
||||
"dress pants",
|
||||
"dress shorts",
|
||||
"a dress skirt",
|
||||
"a collared shirt",
|
||||
"a polo shirt",
|
||||
"a generic skirt",
|
||||
"a non-generic skirt",
|
||||
"a red skirt",
|
||||
"a orange skirt",
|
||||
"a yellow skirt",
|
||||
"a green skirt",
|
||||
"a blue skirt",
|
||||
"a indigo skirt",
|
||||
"a violet skirt",
|
||||
"a teal skirt",
|
||||
"a Terezi skirt (what!!)",
|
||||
"a white shirt",
|
||||
"a pair of pants as a skirt",
|
||||
"a grey skirt",
|
||||
"a gray skirt",
|
||||
"a brown skirt",
|
||||
"sweat pants",
|
||||
"sweat shorts",
|
||||
"Terezi pants (what!!)",
|
||||
];
|
||||
|
||||
const FOOTWEAR = [
|
||||
"shoes",
|
||||
"boots",
|
||||
"cargo boots",
|
||||
"cargo boots that you added more pockets to",
|
||||
"sandals",
|
||||
"sneakers",
|
||||
"crocs",
|
||||
"red shoes",
|
||||
"orange shoes",
|
||||
"yellow shoes",
|
||||
"green shoes",
|
||||
"blue shoes",
|
||||
"indigo shoes",
|
||||
"violet shoes",
|
||||
"Terezi shoes (what!!)",
|
||||
"sandals with socks",
|
||||
];
|
||||
|
||||
// has some defaults
|
||||
export const Prngnoun = ({
|
||||
prns,
|
||||
alt,
|
||||
style = {},
|
||||
}: {
|
||||
prns: string[];
|
||||
alt: string;
|
||||
style?: JSX.CSSProperties;
|
||||
}) => (
|
||||
<img
|
||||
src={`https://pyrope.net/prngnouns?p=${prns.join("&p=")}`}
|
||||
alt={alt}
|
||||
style={{
|
||||
display: "inline",
|
||||
height: "0.5lh",
|
||||
margin: "0",
|
||||
...style,
|
||||
}}
|
||||
/>
|
||||
);
|
||||
|
||||
// what is gained from having this on cohost... hm
|
||||
// export const InlineRandImage
|
||||
// because the randomly generated parts are so nicely integrated (if you have courier)
|
||||
// i'm thinking i'll frame it like "your guy is ..." instead of "you are ..."
|
||||
// idk
|
||||
|
||||
render_and_copy(
|
||||
// sort of a franken-introduction of name and other stuff
|
||||
<Main
|
||||
style={{
|
||||
fontFamily: "'courier-std', 'Courier New', courier, monospace",
|
||||
fontWeight: "bold",
|
||||
color: "black",
|
||||
backgroundColor: "#EFEFEF",
|
||||
textAlign: "center",
|
||||
margin: "0 auto",
|
||||
padding: "0.5rem 1rem",
|
||||
}}
|
||||
>
|
||||
<p>
|
||||
Your name is{" "}
|
||||
<Prngnoun
|
||||
alt="a four letter name. weird stuff, not very namey"
|
||||
prns={FIRST_NAMES}
|
||||
/>{" "}
|
||||
<Prngnoun
|
||||
alt="a six or seven letter last name. weird stuff, not very namey"
|
||||
prns={LAST_NAMES}
|
||||
/>
|
||||
. You like <Prngnoun alt="a random noun" prns={LIKED_NOUNS} />,{" "}
|
||||
{/* we add another thing so that it isn't the same url */}
|
||||
<Prngnoun
|
||||
alt="another random noun"
|
||||
prns={["SOME OTHER THING", ...LIKED_NOUNS]}
|
||||
/>
|
||||
, and <Prngnoun alt="a random activity" prns={LIKED_ACTIVITIES} />.
|
||||
</p>
|
||||
<p>
|
||||
You feel a bit too shy to actually{" "}
|
||||
<a
|
||||
style={{ fontWeight: "bold" }}
|
||||
href={serverside_randirect(
|
||||
"http://www.farragofiction.com/DollSim/",
|
||||
"http://www.farragofiction.com/DollSim/index.html?type=2"
|
||||
)}
|
||||
>
|
||||
show yourself
|
||||
</a>{" "}
|
||||
in this post, but you are wearing{" "}
|
||||
<Prngnoun
|
||||
alt="a piece of headwear, or lack thereof"
|
||||
prns={HEADWEAR}
|
||||
/>
|
||||
,{" "}
|
||||
<Prngnoun
|
||||
alt="a piece of facewear, or lack thereof"
|
||||
prns={FACEWEAR}
|
||||
/>
|
||||
, <Prngnoun alt="a top (clothing)" prns={TOP} />,{" "}
|
||||
<Prngnoun alt="a bottom (clothing)" prns={BOTTOM} />, and{" "}
|
||||
<Prngnoun alt="footwear" prns={FOOTWEAR} />.
|
||||
{/* you are wearing nothing on your head, some sick shades, a tank top, boots, and cargo pants */}
|
||||
{/* your expression changes {often,rarely,of course}, but it's typical for you to be {smiling,grinning,grimacing} */}
|
||||
</p>
|
||||
<p>
|
||||
You are a <Prngnoun alt="a class from homestuck" prns={CLASSES} />{" "}
|
||||
of <Prngnoun alt="an aspect from homestuck" prns={ASPECTS} />, but
|
||||
you don't really care about that—it's hard to god-tier when
|
||||
you are a randomly-filled out template!
|
||||
</p>
|
||||
</Main>
|
||||
);
|
88
html/read-more.tsx
Normal file
|
@ -0,0 +1,88 @@
|
|||
import { render_and_copy } from "./common.tsx";
|
||||
|
||||
const URL =
|
||||
"https://dn790009.ca.archive.org/0/items/thestrangecaseof00043gut/43.txt";
|
||||
|
||||
const text = (await fetch(URL).then(r => r.text())).replaceAll("\r", "");
|
||||
const chapters: [string, string[]][] = text
|
||||
.replaceAll("`", "‘")
|
||||
.replaceAll("'", "’")
|
||||
.replaceAll("--", "—")
|
||||
.split("\n\n\n\n\n")
|
||||
.slice(1)
|
||||
.map(c => c.split("\n\n\n"))
|
||||
.filter(c => c.length == 2)
|
||||
.map(c => [c[0], c[1].split("\n\n")]);
|
||||
const make_chapter_id = (title: string) =>
|
||||
title
|
||||
.toLowerCase()
|
||||
.split(" ")
|
||||
.map(w => w.split(/[^a-z]/).join(""))
|
||||
.join("-");
|
||||
|
||||
console.log(chapters);
|
||||
render_and_copy(
|
||||
<>
|
||||
<div
|
||||
class="main"
|
||||
style='font-family: "Latin Modern Math", "Computer Modern", "Helvetica", serif;font-weight:bold'
|
||||
>
|
||||
<a
|
||||
href="https://dn790009.ca.archive.org/0/items/thestrangecaseof00043gut/43.txt"
|
||||
style="display:block;margin:0 auto;width:fit-content;font-size:1.35rem;font-weight:bold"
|
||||
>
|
||||
massive thanks to project gutenberg for the book
|
||||
</a>
|
||||
<br />
|
||||
<a
|
||||
href="#user-content-mehbark-hekyll-end"
|
||||
id="mehbark-hekyll-jump-to-end"
|
||||
style="display:block;margin:0 auto;width:fit-content;font-size:1.35rem;font-weight:bold"
|
||||
>
|
||||
JUMP TO END
|
||||
</a>
|
||||
<br />
|
||||
<br />
|
||||
<h3>Table of Contents (clickable!)</h3>
|
||||
<ol>
|
||||
{...chapters.map(([title, _]) => (
|
||||
<li>
|
||||
<a
|
||||
href={`#user-content-chapter-${make_chapter_id(
|
||||
title
|
||||
)}`}
|
||||
style="text-decoration:none"
|
||||
>
|
||||
{title}
|
||||
</a>
|
||||
</li>
|
||||
))}
|
||||
</ol>
|
||||
<br />
|
||||
<br />
|
||||
{...chapters.map(([title, content]) => (
|
||||
<>
|
||||
<a
|
||||
href={`#user-content-chapter-${make_chapter_id(title)}`}
|
||||
id={`chapter-${make_chapter_id(title)}`}
|
||||
style="text-decoration:none;font-weight:600;font-size:1.25em"
|
||||
>
|
||||
{title}
|
||||
</a>
|
||||
{...content.map(p => <p>{p}</p>)}
|
||||
</>
|
||||
))}
|
||||
<a
|
||||
href="#user-content-mehbark-hekyll-jump-to-end"
|
||||
id="mehbark-hekyll-end"
|
||||
title="this is also a jump to top"
|
||||
style="margin:0 auto;width:fit-content;font-size:1.75em;font-weight:bold;display:block;text-decoration:none"
|
||||
>
|
||||
THE END
|
||||
</a>
|
||||
</div>
|
||||
{
|
||||
"\n\n---\n\nsorry for abusing the read more, but it's necessary to make saving your place more convenient"
|
||||
}
|
||||
</>
|
||||
);
|
24
html/stars.tsx
Normal file
|
@ -0,0 +1,24 @@
|
|||
import { render_and_copy } from "./common.tsx";
|
||||
|
||||
const Star = () => (
|
||||
<div
|
||||
class="star same-place"
|
||||
style={{
|
||||
transform: `translate(calc(${(Math.random() * 50 - 25).toFixed(
|
||||
2
|
||||
)}rem * var(--tw-border-opacity, 0)), calc(${(
|
||||
Math.random() * 50 -
|
||||
25
|
||||
).toFixed(2)}rem * var(--tw-border-opacity, 0)))`,
|
||||
}}
|
||||
>
|
||||
*
|
||||
</div>
|
||||
);
|
||||
const Stars = ({ n }: { n: number }) => (
|
||||
<div id="stars" class="same-place">
|
||||
{...Array.from({ length: n }, Star)}
|
||||
</div>
|
||||
);
|
||||
|
||||
render_and_copy(<Stars n={150} />);
|
|
@ -2,31 +2,49 @@ import { ComponentChildren } from "preact";
|
|||
import { Main, mk_class_wrapper, render_and_copy } from "./common.tsx";
|
||||
|
||||
// i heard you liked posts, so i put a post in your post so you can post while you post
|
||||
const ReblogIcon = () => (
|
||||
<img
|
||||
src="https://static.pyrope.net/cohost-reblog.png"
|
||||
alt="the cohost reblog icon"
|
||||
class="reblog"
|
||||
/>
|
||||
);
|
||||
const ReblogIcon = ({ alt_text = true }: { alt_text?: boolean }) =>
|
||||
alt_text ? (
|
||||
<img
|
||||
src="https://static.pyrope.net/cohost-reblog.png"
|
||||
alt="the cohost reblog icon"
|
||||
class="reblog"
|
||||
/>
|
||||
) : (
|
||||
<img src="https://static.pyrope.net/cohost-reblog.png" class="reblog" />
|
||||
);
|
||||
|
||||
const LikeIcon = () => (
|
||||
<img
|
||||
src="https://static.pyrope.net/cohost-like.png"
|
||||
alt="the cohost like icon"
|
||||
class="like"
|
||||
/>
|
||||
);
|
||||
const LikeIcon = ({ alt_text = true }: { alt_text?: boolean }) =>
|
||||
alt_text ? (
|
||||
<img
|
||||
src="https://static.pyrope.net/cohost-like.png"
|
||||
alt="the cohost like icon"
|
||||
class="like"
|
||||
/>
|
||||
) : (
|
||||
<img src="https://static.pyrope.net/cohost-like.png" class="like" />
|
||||
);
|
||||
|
||||
const OptionsIcon = () => (
|
||||
<img
|
||||
src="https://static.pyrope.net/cohost-post-options.png"
|
||||
alt="the cohost icon for post options"
|
||||
class="options"
|
||||
/>
|
||||
);
|
||||
const OptionsIcon = ({ alt_text = true }: { alt_text?: boolean }) =>
|
||||
alt_text ? (
|
||||
<img
|
||||
src="https://static.pyrope.net/cohost-post-options.png"
|
||||
alt="the cohost icon for post options"
|
||||
class="options"
|
||||
/>
|
||||
) : (
|
||||
<img
|
||||
src="https://static.pyrope.net/cohost-post-options.png"
|
||||
class="options"
|
||||
/>
|
||||
);
|
||||
|
||||
const Bottom = ({ n_comments }: { n_comments: number }) => (
|
||||
export const Bottom = ({
|
||||
n_comments,
|
||||
alt_text = true,
|
||||
}: {
|
||||
n_comments: number;
|
||||
alt_text?: boolean;
|
||||
}) => (
|
||||
<div class="bottom">
|
||||
<div class="bottom-inner">
|
||||
<a
|
||||
|
@ -34,8 +52,8 @@ const Bottom = ({ n_comments }: { n_comments: number }) => (
|
|||
href="https://413.gay"
|
||||
>{`${n_comments} comments`}</a>
|
||||
<div class="interactions">
|
||||
<ReblogIcon />
|
||||
<LikeIcon />
|
||||
<ReblogIcon alt_text={alt_text} />
|
||||
<LikeIcon alt_text={alt_text} />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -56,17 +74,19 @@ const Content = ({
|
|||
const Middle = mk_class_wrapper("middle");
|
||||
|
||||
// no reblog sorry :(
|
||||
const Top = ({
|
||||
export const Top = ({
|
||||
display_name,
|
||||
username,
|
||||
link,
|
||||
posted,
|
||||
alt_text = true,
|
||||
}: {
|
||||
display_name?: string;
|
||||
username: string;
|
||||
posted: string;
|
||||
link: string;
|
||||
link?: string;
|
||||
id?: string;
|
||||
alt_text?: boolean;
|
||||
}) => (
|
||||
<div class="top">
|
||||
<div class="top-info">
|
||||
|
@ -82,11 +102,11 @@ const Top = ({
|
|||
{posted}
|
||||
</a>
|
||||
</div>
|
||||
<OptionsIcon />
|
||||
<OptionsIcon alt_text={alt_text} />
|
||||
</div>
|
||||
);
|
||||
|
||||
const Hrish = () => (
|
||||
export const Hrish = () => (
|
||||
<div class="hrish">
|
||||
<hr />
|
||||
</div>
|
||||
|
|
135
html/top-and-bottom.less
Normal file
|
@ -0,0 +1,135 @@
|
|||
@longan: rgb(var(--color-longan));
|
||||
@not-white: rgb(var(--color-notWhite));
|
||||
@not-black: rgb(var(--color-notBlack));
|
||||
@fg: rgb(var(--color-foreground));
|
||||
@bg: rgb(var(--color-background));
|
||||
|
||||
@height: 20rem;
|
||||
|
||||
* {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
hr {
|
||||
border-color: rgb(191 186 181);
|
||||
margin: 0 0.75rem;
|
||||
}
|
||||
|
||||
.hrish {
|
||||
background-color: @not-white;
|
||||
}
|
||||
|
||||
#fake-main {
|
||||
height: @height;
|
||||
margin: -1rem 0;
|
||||
}
|
||||
|
||||
#main {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
width: 100%;
|
||||
height: @height;
|
||||
display: flex;
|
||||
background-color: @bg;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.bottom {
|
||||
background: @not-white;
|
||||
font-size: 0.875rem;
|
||||
color: gray;
|
||||
padding: 0.75rem;
|
||||
width: 100%;
|
||||
max-width: 100%;
|
||||
border-bottom-right-radius: 0.5rem;
|
||||
border-bottom-left-radius: 0.5rem;
|
||||
box-shadow: 0px 4px 5px rgba(25,25,25,.14),0px 1px 10px rgba(25,25,25,.12),0px 2px 4px rgba(0,0,0,.2);
|
||||
}
|
||||
|
||||
.bottom-inner {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
// V compromise V
|
||||
a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.comments {
|
||||
width: max-content;
|
||||
flex: none;
|
||||
}
|
||||
|
||||
.interactions {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: flex-end;
|
||||
gap: 0.75rem;
|
||||
}
|
||||
|
||||
.content {
|
||||
background-color: white;
|
||||
padding: 0 0.75rem;
|
||||
display: flex;
|
||||
min-height: min-content;
|
||||
flex-grow: 1;
|
||||
padding-top: 0.5rem;
|
||||
}
|
||||
|
||||
.middle {
|
||||
// V the main feed uses gap: 3rem V
|
||||
height: 3rem;
|
||||
}
|
||||
|
||||
.top {
|
||||
display: flex;
|
||||
width: 100%;
|
||||
max-width: 100%;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 0.5rem;
|
||||
border-top-left-radius: 0.5rem;
|
||||
border-top-right-radius: 0.5rem;
|
||||
background-color: @not-white;
|
||||
padding: 0.75rem;
|
||||
box-shadow: 0px -4px 5px rgba(25,25,25,.14),0px -1px 10px rgba(25,25,25,.12),0px -2px 4px rgba(0,0,0,.2);
|
||||
}
|
||||
|
||||
.top-info {
|
||||
display: flex;
|
||||
min-width: 0;
|
||||
flex: 1 1 0%;
|
||||
flex-direction: row;
|
||||
flex-wrap: wrap;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.display-name {
|
||||
max-width: 100%;
|
||||
flex-shrink: 1;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
font-weight: 700;
|
||||
color: @not-black;
|
||||
}
|
||||
|
||||
.username {
|
||||
color: rgb(104 102 100);
|
||||
}
|
||||
|
||||
.posted {
|
||||
display: block;
|
||||
flex: none;
|
||||
font-size: 0.75rem;
|
||||
line-height: 1rem;
|
||||
// not doing the weird tabular-nums thing, i don't get it
|
||||
color: rgb(130 127 124);
|
||||
}
|
80
html/train.tsx
Normal file
|
@ -0,0 +1,80 @@
|
|||
import { render_and_copy } from "./common.tsx";
|
||||
import { ComponentChildren } from "preact";
|
||||
|
||||
const Rail = ({ rotation, r }: { rotation: string; r: string }) => (
|
||||
<div
|
||||
style={{
|
||||
transform: `rotate(${rotation}) translateX(${r})`,
|
||||
gridArea: "1/1",
|
||||
}}
|
||||
>
|
||||
🪜
|
||||
</div>
|
||||
);
|
||||
|
||||
const Track = ({
|
||||
segments,
|
||||
r,
|
||||
children,
|
||||
}: {
|
||||
segments: number;
|
||||
r: string;
|
||||
children?: ComponentChildren;
|
||||
}) => (
|
||||
<div
|
||||
style={{
|
||||
display: "grid",
|
||||
width: "100%",
|
||||
aspectRatio: "2/1",
|
||||
justifyItems: "center",
|
||||
alignItems: "center",
|
||||
transform: "rotateX(60deg)",
|
||||
margin: "0 auto",
|
||||
perspective: "1000px",
|
||||
perspectiveOrigin: "top",
|
||||
}}
|
||||
>
|
||||
{...Array.from({ length: segments }, (_, i) => (
|
||||
// deg is actually more space-efficient lel
|
||||
<Rail rotation={`${(360 / segments) * i}deg`} r={r} />
|
||||
))}
|
||||
{children}
|
||||
</div>
|
||||
);
|
||||
|
||||
const Train = ({
|
||||
children,
|
||||
delay_s,
|
||||
}: {
|
||||
children: ComponentChildren;
|
||||
delay_s: number;
|
||||
}) => (
|
||||
<div
|
||||
id="contrainer"
|
||||
style={`animation: spin 20s ${
|
||||
delay_s - 20
|
||||
}s linear reverse infinite; transform-origin: center; width: 20.5rem; grid-area: 1/1; transform-style: preserve-3d;`}
|
||||
>
|
||||
<div
|
||||
id="train"
|
||||
style="font-size: 2rem; width: fit-content; transform-style: preserve-3d; transform: rotate(-90deg)"
|
||||
>
|
||||
{children}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
// we can have things with animation delays for both the engine and the cars
|
||||
// configurable animation length for sure
|
||||
|
||||
// it's so funny seeing css crimes from like a year ago and they are just like on a different level
|
||||
|
||||
render_and_copy(
|
||||
<Track segments={60} r={"8rem"}>
|
||||
<Train delay_s={0}>🚂</Train>
|
||||
<Train delay_s={0.8}>🚃</Train>
|
||||
<Train delay_s={1.6}>🚃</Train>
|
||||
<Train delay_s={2.4}>🚃</Train>
|
||||
<Train delay_s={3.2}>🚃</Train>
|
||||
</Track>
|
||||
);
|
17
html/tumblr.tsx
Normal file
|
@ -0,0 +1,17 @@
|
|||
import { render_and_copy } from "./common.tsx";
|
||||
import { Post } from "./one-post.tsx";
|
||||
|
||||
const DASH_BG = "#36465D";
|
||||
// mainly doing this in pch, but i'll gen a chost for a funny
|
||||
|
||||
render_and_copy(
|
||||
<Post
|
||||
headline="hey guys"
|
||||
username="mehbark"
|
||||
posted="10.2 hr. ago"
|
||||
link="https://cohost.org/mehbark/post/4550377-hey-guys/dbb81e7b5db74ffd942bf76ea5eb72a6"
|
||||
n_comments={413}
|
||||
>
|
||||
oh wait oops wrong website
|
||||
</Post>
|
||||
);
|
88
html/webark-countdown-negative.tsx
Normal file
|
@ -0,0 +1,88 @@
|
|||
import { render_and_copy } from "./common.tsx";
|
||||
|
||||
const Digit = ({
|
||||
length_per_s,
|
||||
digits,
|
||||
}: {
|
||||
length_per_s: number;
|
||||
digits: (number | string)[];
|
||||
}) => (
|
||||
<div
|
||||
style={{
|
||||
display: "inline-block",
|
||||
fontVariant: "tabular-nums",
|
||||
overflow: "hidden",
|
||||
height: "1rem",
|
||||
}}
|
||||
>
|
||||
<div
|
||||
style={{
|
||||
transform: "translateY(-100%)",
|
||||
animation: `spin ${
|
||||
(length_per_s * digits.length) / 60
|
||||
}s 0s reverse infinite alternate steps(${digits.length}, end)`,
|
||||
position: "relative",
|
||||
}}
|
||||
>
|
||||
{...digits.map(d => (
|
||||
<div
|
||||
style={{
|
||||
height: "1rem",
|
||||
transform: "translateY(75%)",
|
||||
textAlign: "right",
|
||||
}}
|
||||
>
|
||||
{d}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
// silly
|
||||
const make_digits = ({
|
||||
up,
|
||||
cycle_up,
|
||||
cycle_down,
|
||||
}: {
|
||||
up: number[];
|
||||
cycle_up: number;
|
||||
cycle_down: number;
|
||||
}) => [
|
||||
...new Array(cycle_up).flatMap(() => up),
|
||||
...new Array(cycle_down).flatMap((_, i) =>
|
||||
i == 0 ? up.toReversed().slice(1) : up.toReversed()
|
||||
),
|
||||
];
|
||||
console.log(
|
||||
make_digits({
|
||||
up: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
|
||||
cycle_up: 6,
|
||||
cycle_down: 10,
|
||||
})
|
||||
);
|
||||
|
||||
render_and_copy(
|
||||
<span>
|
||||
<Digit
|
||||
length_per_s={60}
|
||||
digits={new Array(20).fill(undefined).map((_, i) =>
|
||||
(i < 10 ? 10 - i : -(i - 10))
|
||||
.toString()
|
||||
.replace(/-([0-9])$/, "-0$1")
|
||||
.replace(/^([0-9])$/, "0$1")
|
||||
)}
|
||||
/>
|
||||
:
|
||||
<Digit
|
||||
length_per_s={1}
|
||||
digits={new Array(60 * 20)
|
||||
.fill(undefined)
|
||||
.map((_, i) =>
|
||||
(i < 30 * 60 ? 59 - (i % 60) : i % 60)
|
||||
.toString()
|
||||
.padStart(2, "0")
|
||||
)}
|
||||
/>
|
||||
</span>
|
||||
);
|
12
html/weird-bug.tsx
Normal file
|
@ -0,0 +1,12 @@
|
|||
import { ToggleOnClick } from "./common.tsx";
|
||||
import { render_and_copy } from "./common.tsx";
|
||||
|
||||
render_and_copy(
|
||||
<ToggleOnClick>
|
||||
<img
|
||||
src="https://staging.cohostcdn.org/attachment/f9a8c5c3-6ccc-4592-ac51-131eaa6872e3/weird-bug.gif"
|
||||
alt="the camera rotates to reveal that the eggbug has numerous legs holding it up. gross! there is also a wall of notification mangos behind the bug."
|
||||
/>
|
||||
<p>hello world</p>
|
||||
</ToggleOnClick>
|
||||
);
|
19
mcai-capture-count.csv
Normal file
|
@ -0,0 +1,19 @@
|
|||
blog,captures
|
||||
amb,7
|
||||
bonbon,80
|
||||
cefqrn,68
|
||||
multioculate,19
|
||||
coldcalzone,11
|
||||
easrng,43
|
||||
frostsparks,22
|
||||
joeled,8
|
||||
buyduskonsteam,17
|
||||
wowperfect,64
|
||||
mehbark,182
|
||||
mocha,29
|
||||
filenine,14
|
||||
opossumcaviar,10
|
||||
sirocyl,82
|
||||
trashbees,4
|
||||
twilight-sparkle,72
|
||||
warc,65
|
|
1
name.txt
Normal file
|
@ -0,0 +1 @@
|
|||
Cohost Artist Alley Repository
|
73
pch/name-color-promo.toml
Normal file
|
@ -0,0 +1,73 @@
|
|||
version = 1
|
||||
|
||||
[[modules]]
|
||||
plugin = 'source.text'
|
||||
data.contents = '''
|
||||
drag to see the wonderful, magical, beautiful, awesome and transformative awesome wonder of the <span style="font-family: serif">name-color</span> system that is wonderful:
|
||||
<div id=main>
|
||||
<div id=example>
|
||||
<p>did you know that <span style="color: #3eba73">@webark</span> was originally created by <span style="color: #008282">@mehbark</span>? it's true! nowadays, <span style="color: #3eba73">@webark</span> has many members, commonly referred to internally as "shards," such as <span style="color: #ff007b">@auramgold</span>, <span style="color: #008282">@mehbark</span>, and <span style="color: #134c93">@testbark</span> (okay, not that last one).</p>
|
||||
<p>
|
||||
due to their inevitably tumultuous nature, <span style="color: #3eba73">@webark</span> and its spinoffs, such as @webark-meta and <span style="color: #ffdddd">@diarrhea-dogblast</span>, are known to change handles often. they have even swapped in the past. not many accounts have name-colors so uh shout out to <span style="color: #39B366">@LemmaEOF</span>
|
||||
</p>
|
||||
</div>
|
||||
<div id=slider-holder>
|
||||
<div id=ungrey></div>
|
||||
<div id=greyer></div>
|
||||
</div>
|
||||
</div>'''
|
||||
data.language = 'html'
|
||||
sends = [2]
|
||||
title = 'html'
|
||||
|
||||
[[modules]]
|
||||
plugin = 'source.lesscss'
|
||||
data.contents = '''
|
||||
#main {
|
||||
display: grid;
|
||||
width: min(80%, 12cm);
|
||||
max-width: auto;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
#main > * {
|
||||
grid-area: 1/1;
|
||||
}
|
||||
|
||||
#slider-holder {
|
||||
height: 100%;
|
||||
display: flex;
|
||||
max-width: 100%;
|
||||
overflow: hidden;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
#ungrey {
|
||||
width: 10%;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
resize: horizontal;
|
||||
border-right: 2px solid rgb(var(--color-cherry));
|
||||
max-width: 100%;
|
||||
min-width: 0;
|
||||
pointer-events: all;
|
||||
}
|
||||
|
||||
#greyer {
|
||||
backdrop-filter: grayscale(1);
|
||||
height: 100%;
|
||||
flex: 1;
|
||||
max-width: auto;
|
||||
min-width: 0;
|
||||
}'''
|
||||
sends = [2]
|
||||
|
||||
[[modules]]
|
||||
plugin = 'transform.style-inliner'
|
||||
data.mode = 'attr'
|
||||
sends = ['output']
|
||||
|
||||
[[modules]]
|
||||
plugin = 'source.lesscss'
|
||||
data.contents = ''
|
||||
graphPos = [-120, 192]
|
160
pch/optical-illusion.toml
Normal file
|
@ -0,0 +1,160 @@
|
|||
version = 1
|
||||
|
||||
[[modules]]
|
||||
plugin = 'source.text'
|
||||
data.contents = '''
|
||||
<div id=main>
|
||||
<div id=circle>
|
||||
<div id=text>
|
||||
your brain<br>
|
||||
tricks you into<br>
|
||||
thinking that this is<br>
|
||||
readable:<br>
|
||||
jdfklieyhglmn
|
||||
</div>
|
||||
<div id=unwiggle>
|
||||
<div id=wiggle>
|
||||
<div id="alt-text-no-not-like-that">
|
||||
<span class=old-text>
|
||||
your brain<br>
|
||||
tricks you into<br>
|
||||
thinking that this is<br>
|
||||
readable:<br>
|
||||
</span>
|
||||
<span class=new-text>
|
||||
homestuck lol
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id=spooky>
|
||||
<span class=old-text>
|
||||
your brain<br>
|
||||
tricks you into<br>
|
||||
thinking that this is<br>
|
||||
readable:<br>
|
||||
</span>
|
||||
<span>
|
||||
<span class="word w1">BUT </span><span class="word w2">YOU </span><span class="word w3">KNOW </span><span class="word w4">THAT'S </span><br><span class="word w5">NOT </span><span class="word w6">TRUE </span><span class="word w7">RIGHT</span><span class="word w8">?</span>
|
||||
</span>
|
||||
</div>
|
||||
</div>'''
|
||||
data.language = 'html'
|
||||
sends = [2]
|
||||
title = 'html'
|
||||
|
||||
[[modules]]
|
||||
plugin = 'source.lesscss'
|
||||
data.contents = '''
|
||||
#main {
|
||||
width: 100%;
|
||||
aspect-ratio: 1;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
#circle {
|
||||
width: 50%;
|
||||
height: 50%;
|
||||
margin: auto;
|
||||
border: 0.4rem solid rgb(calc(var(--tw-border-opacity,0)*255), calc(var(--tw-border-opacity,0)*255), calc(var(--tw-border-opacity,0)*255));
|
||||
transition: color 1s ease;
|
||||
border-radius: 413rem;
|
||||
text-align: center;
|
||||
display: grid;
|
||||
}
|
||||
|
||||
#circle > div {
|
||||
grid-area: 1/1;
|
||||
}
|
||||
|
||||
.old-text {
|
||||
color: transparent;
|
||||
}
|
||||
|
||||
.new-text {
|
||||
background-color: rgb(
|
||||
calc((1 - var(--tw-border-opacity, 0)) * 255),
|
||||
calc((1 - var(--tw-border-opacity, 0)) * 255),
|
||||
calc((1 - var(--tw-border-opacity, 0)) * 255)
|
||||
);
|
||||
transition: background-color 1s ease;
|
||||
}
|
||||
|
||||
#alt-text-no-not-like-that {
|
||||
transform: translateX(40rem);
|
||||
animation: spin 5s 10s both linear;
|
||||
}
|
||||
|
||||
#wiggle {
|
||||
transform: translateY(2rem);
|
||||
animation: spin 0.25s 10s 20 alternate both ease;
|
||||
}
|
||||
|
||||
#unwiggle {
|
||||
transform: translateY(-2rem);
|
||||
}
|
||||
|
||||
#spooky {
|
||||
transform: scale(1.02);
|
||||
animation: spin 0.5s both infinite alternate ease-out;
|
||||
}
|
||||
|
||||
.word {
|
||||
transform: translateY(40rem);
|
||||
display: inline-block;
|
||||
background-color: rgb(
|
||||
calc((1 - var(--tw-border-opacity, 0)) * 255),
|
||||
calc((1 - var(--tw-border-opacity, 0)) * 255),
|
||||
calc((1 - var(--tw-border-opacity, 0)) * 255)
|
||||
);
|
||||
animation: spin 10s both linear;
|
||||
color: maroon;
|
||||
transition: background-color 1s ease;
|
||||
}
|
||||
|
||||
.w1 {
|
||||
animation-delay: 20s;
|
||||
}
|
||||
|
||||
.w2 {
|
||||
animation-delay: 22s;
|
||||
}
|
||||
|
||||
.w3 {
|
||||
animation-delay: 24s;
|
||||
}
|
||||
|
||||
.w4 {
|
||||
animation-delay: 26s;
|
||||
}
|
||||
|
||||
.w5 {
|
||||
animation-delay: 28s;
|
||||
}
|
||||
|
||||
.w6 {
|
||||
animation-delay: 30s;
|
||||
}
|
||||
|
||||
.w7 {
|
||||
animation-delay: 35s;
|
||||
}
|
||||
|
||||
.w8 {
|
||||
animation-delay: 40s;
|
||||
}
|
||||
|
||||
.w5, .w6, .w7, .w8 {
|
||||
background-color: none !important;
|
||||
}'''
|
||||
sends = [2]
|
||||
|
||||
[[modules]]
|
||||
plugin = 'transform.style-inliner'
|
||||
data.mode = 'attr'
|
||||
sends = ['output']
|
||||
|
||||
[[modules]]
|
||||
plugin = 'source.lesscss'
|
||||
data.contents = ''
|
||||
graphPos = [-120, 192]
|
525
pch/stars.toml
Normal file
205
pch/tumblr.toml
Normal file
|
@ -0,0 +1,205 @@
|
|||
version = 1
|
||||
title = 'Style Inlining'
|
||||
|
||||
[[modules]]
|
||||
plugin = 'source.text'
|
||||
data.contents = '''
|
||||
<div id=main>
|
||||
<div class=post>
|
||||
<img src="https://staging.cohostcdn.org/avatar/157583-20bb226b-6637-46f9-82f9-b162c08a63bd-profile.png?dpr=2&width=80&height=80&fit=cover&auto=webp">
|
||||
<div class=content>
|
||||
<h1>"the setup was at the beginning"</h1>
|
||||
<p>has got to be one of my favorite quotes from anything ever. it's so rad</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class=post>
|
||||
<img src="https://staging.cohostcdn.org/avatar/157583-20bb226b-6637-46f9-82f9-b162c08a63bd-profile.png?dpr=2&width=80&height=80&fit=cover&auto=webp">
|
||||
<div class=content>
|
||||
<h1>hey guys welcome to my tumblr dash</h1>
|
||||
<p>please enjoy! and do not mention cartoons or i will have no choice but to work with the <a href="https://fbi.gov">FBI</a></p>
|
||||
<div class=tags><a href="https://cohost.org/rc/tagged/I'm%20Not%20Going%20To%20Do%20Many%20Tags%20Because%20It%20Is%20A%20Pain%20Because%20I'm%20Writing%20This%20All%20By%20Hand%20For%20Some%20Reason">#I'm Not Going To Do Many Tags Because It Is A Pain Because I'm Writing This All By Hand For Some Reason</a> <a href="https://cohost.org/rc/tagged/not%20sure%20why%20i%20was%20kanaya%20there">#not sure why i was kanaya there</a></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class=post>
|
||||
<img src="https://staging.cohostcdn.org/avatar/157583-20bb226b-6637-46f9-82f9-b162c08a63bd-profile.png?dpr=2&width=80&height=80&fit=cover&auto=webp">
|
||||
<div class=content>
|
||||
<h1>apparently tumblr lost all of their sans clothes</h1>
|
||||
<p>hence everything being bare-bones right now</p>
|
||||
<div class=tags><a href="https://cohost.org/rc/tagged/badumtiss">#badumtiss</a></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class=post>
|
||||
<img src="https://staging.cohostcdn.org/avatar/157583-20bb226b-6637-46f9-82f9-b162c08a63bd-profile.png?dpr=2&width=80&height=80&fit=cover&auto=webp">
|
||||
<div class=content>
|
||||
<h1>it is becoming quickly apparent that i cannot tumblr post</h1>
|
||||
<p>i have no idea what i'm doing, so i'll do what i always do in this situation: do a bunch and hope that makes things funny</p>
|
||||
<div class=tags><a href="https://cohost.org/rc/tagged/badumtiss">#badumtiss</a></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="ch post">
|
||||
<img src="https://staging.cohostcdn.org/avatar/157583-20bb226b-6637-46f9-82f9-b162c08a63bd-profile.png?dpr=2&width=80&height=80&fit=cover&auto=webp">
|
||||
<div class=content>
|
||||
<div style="margin:0"><!--ps=2--><div style="margin:0;display:flex;align-items:center;border-top-left-radius:0.5rem;border-top-right-radius:0.5rem;background-color:rgb(var(--color-notWhite));padding:0.75rem;box-shadow:0px -4px 5px rgba(25,25,25,0.14),0px -1px 10px rgba(25,25,25,0.12),0px -2px 4px rgba(0,0,0,0.2)"><div style="margin:0;display:flex;flex:1 1 0%;flex-direction:row;flex-wrap:wrap;align-items:center;gap:0.5rem;line-height:1"><a href="https://cohost.org/mehbark" style="margin:0;text-decoration:none;color:#686664">@mehbark</a><a href="https://cohost.org/mehbark/post/4550377-hey-guys/dbb81e7b5db74ffd942bf76ea5eb72a6" style="margin:0;text-decoration:none;font-size:0.75rem;color:#827f7c">10.2 hr. ago</a></div><img src="https://static.pyrope.net/cohost-post-options.png" alt="the cohost icon for post options" style="margin:0"></div><div style="margin:0;background-color:rgb(var(--color-notWhite))"><hr style="border-color:#bfbab5;margin:0 0.75rem"></div><div style="margin:0;box-shadow:0px 4px 5px rgba(0,0,0,0.14),0px 1px 10px rgba(0,0,0,0.12),0px 2px 4px rgba(0,0,0,0.2);background-color:white"><div style="margin:0;padding:0.75rem"><a href="https://cohost.org/mehbark/post/4550377-hey-guys/dbb81e7b5db74ffd942bf76ea5eb72a6" style="margin:0;text-decoration:none;font-size:1.25rem;line-height:1.75rem"><h1 style="margin:0;color:black;font-size:inherit">hey guys</h1></a></div><div style="display:flex;margin:0"><div style="margin:0;padding-left:0.75rem;padding-right:0.75rem;margin-top:1rem;margin-bottom:1rem;color:rgb(var(--color-notBlack))">oh wait oops wrong website</div></div></div><div style="margin:0;background-color:rgb(var(--color-notWhite))"><hr style="border-color:#bfbab5;margin:0 0.75rem"></div><div style="margin:0;background:rgb(var(--color-notWhite));font-size:0.875rem;color:gray;padding:0.75rem;border-bottom-right-radius:0.5rem;border-bottom-left-radius:0.5rem;box-shadow:0px 4px 5px rgba(25,25,25,0.14),0px 1px 10px rgba(25,25,25,0.12),0px 2px 4px rgba(0,0,0,0.2)"><div style="margin:0;display:flex;justify-content:space-between"><a href="https://413.gay" style="margin:0;text-decoration:none">413 comments</a><div style="margin:0;display:flex;align-items:center;gap:0.75rem"><img src="https://static.pyrope.net/cohost-reblog.png" alt="the cohost reblog icon" style="margin:0"><img src="https://static.pyrope.net/cohost-like.png" alt="the cohost like icon" style="margin:0"></div></div></div></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class=post>
|
||||
<img src="https://staging.cohostcdn.org/avatar/157583-20bb226b-6637-46f9-82f9-b162c08a63bd-profile.png?dpr=2&width=80&height=80&fit=cover&auto=webp">
|
||||
<div class=content>
|
||||
<h1>wait</h1>
|
||||
</div>
|
||||
</div>
|
||||
<div class=post>
|
||||
<img src="https://staging.cohostcdn.org/avatar/157583-20bb226b-6637-46f9-82f9-b162c08a63bd-profile.png?dpr=2&width=80&height=80&fit=cover&auto=webp">
|
||||
<div class=content>
|
||||
<h1>is there anyone else here?</h1>
|
||||
<p>and why is it chron instead of reverse chron???</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class=post>
|
||||
<img src="https://staging.cohostcdn.org/avatar/157583-20bb226b-6637-46f9-82f9-b162c08a63bd-profile.png?dpr=2&width=80&height=80&fit=cover&auto=webp">
|
||||
<div class=content>
|
||||
<h1>this is honestly scary :(((</h1>
|
||||
</div>
|
||||
</div>
|
||||
<div class=post>
|
||||
<img src="https://static.wikia.nocookie.net/mspaintadventures/images/8/81/Vriska_Serket.png" alt="vriska serket from homestuck">
|
||||
<div class=content>
|
||||
<h1 style="color: #005682">Hi!!!!!!!!</h1>
|
||||
<div class=tags>
|
||||
<a href="https://cohost.org/rc/tagged/8">#8</a>
|
||||
<a href="https://cohost.org/rc/tagged/vriska">#vriska</a>
|
||||
<a href="https://cohost.org/rc/tagged/dice">#dice</a>
|
||||
<a href="https://cohost.org/rc/tagged/vision%20eightfold">#vision eightfold</a>
|
||||
<a href="https://cohost.org/rc/tagged/etc">#etc</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class=post>
|
||||
<img src="https://staging.cohostcdn.org/avatar/157583-20bb226b-6637-46f9-82f9-b162c08a63bd-profile.png?dpr=2&width=80&height=80&fit=cover&auto=webp">
|
||||
<div class=content>
|
||||
<h1>your tagging is utterly absurd BUT</h1>
|
||||
<p>hi vriska!! whatttttt this is so crazy! mehtumblr is so awesome this is a good post and not a waste of time</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class=post>
|
||||
<img src="https://static.wikia.nocookie.net/mspaintadventures/images/9/96/Terezi_Pyrope.png" alt="terezi pyrope from homestuck">
|
||||
<div class=content>
|
||||
<h1 style="color: #008282">H1-</h1>
|
||||
</div>
|
||||
</div>
|
||||
<div class=post>
|
||||
<img src="https://staging.cohostcdn.org/avatar/157583-20bb226b-6637-46f9-82f9-b162c08a63bd-profile.png?dpr=2&width=80&height=80&fit=cover&auto=webp">
|
||||
<div class=content>
|
||||
<div style="overflow: visible; width: 0">
|
||||
<h1 style="color: red; font-size: 10cm; white-space: nowrap; margin: 0; transform: rotate(355deg); animation: spin 0.05s infinite alternate-reverse linear both;">HOLY CRAP TEREZI WHAT</h1>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class=post>
|
||||
<img src="https://static.wikia.nocookie.net/mspaintadventures/images/9/96/Terezi_Pyrope.png" alt="terezi pyrope from homestuck">
|
||||
<div class=content>
|
||||
<h1 style="color: #008282">PUNCHL1N3</h1>
|
||||
</div>
|
||||
</div>
|
||||
<div class=post>
|
||||
<img src="https://staging.cohostcdn.org/avatar/157583-20bb226b-6637-46f9-82f9-b162c08a63bd-profile.png?dpr=2&width=80&height=80&fit=cover&auto=webp">
|
||||
<div class=content>
|
||||
<h1>oh terezi, you're so funny</h1>
|
||||
<p>there being a punchline would imply that there was a setup!</p>
|
||||
<p>
|
||||
oh, right,
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>'''
|
||||
data.language = 'html'
|
||||
sends = [2]
|
||||
|
||||
[[modules]]
|
||||
plugin = 'source.text'
|
||||
data.contents = '''
|
||||
|
||||
#main {
|
||||
font-family: helvetica, sans-serif;
|
||||
background-color: #36465D;
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
background-clip: border-box;
|
||||
padding: 1rem;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 1rem;
|
||||
overflow: scroll;
|
||||
color: black;
|
||||
//height: 50vh;
|
||||
}
|
||||
|
||||
.post {
|
||||
display: flex;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.content > h1 {
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
|
||||
.post > img {
|
||||
border-radius: 5%;
|
||||
object-fit: cover;
|
||||
aspect-ratio: 1;
|
||||
margin-top: 0;
|
||||
margin-bottom: auto;
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
min-height: 0;
|
||||
}
|
||||
|
||||
.content {
|
||||
background-color: white;
|
||||
flex: 9 0 20%;
|
||||
border-radius: 7px;
|
||||
padding: 1rem;
|
||||
}
|
||||
|
||||
.ch.post > .content {
|
||||
padding: 0;
|
||||
font-family: Atkinson Hyperlegible, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
|
||||
}
|
||||
|
||||
.tags {
|
||||
font-size: 0.8rem;
|
||||
color: grey;
|
||||
}
|
||||
|
||||
.tags > a {
|
||||
text-decoration: none;
|
||||
}'''
|
||||
data.language = 'css'
|
||||
sends = [2]
|
||||
|
||||
[[modules]]
|
||||
plugin = 'transform.style-inliner'
|
||||
data.mode = 'attr'
|
||||
sends = [3]
|
||||
|
||||
[[modules]]
|
||||
plugin = 'transform.svg-to-background'
|
||||
data.useSvgo = true
|
||||
sends = ['output']
|
||||
|
||||
[[modules]]
|
||||
plugin = 'source.sass'
|
||||
data.contents = ''
|
||||
data.syntax = 'scss'
|
||||
sends = [2]
|
||||
graphPos = [-480, 168]
|
||||
|
||||
[[modules]]
|
||||
plugin = 'source.sass'
|
||||
data.contents = ''
|
||||
data.syntax = 'scss'
|
||||
|
||||
[[modules]]
|
||||
plugin = 'source.sass'
|
||||
data.contents = ''
|
||||
data.syntax = 'scss'
|
472
pch/your-peripheral-vision-is-made-up.toml
Normal file
146
serverside/hs2-last-updated.ts
Normal file
|
@ -0,0 +1,146 @@
|
|||
// once a minute (what's the point if it's out of date!)
|
||||
// do days since last update (0 will be obvious then), should (please please please let this be true) only need three digits MAX
|
||||
// until hs2 ends of course but let's not think about that now
|
||||
// okay aaaa hs2 will end that will be sad and good i guess but
|
||||
// not important right now
|
||||
|
||||
// would be neat (but painful) to have it actually roll like an analog thing
|
||||
|
||||
import { contentType } from "https://deno.land/std@0.202.0/media_types/mod.ts";
|
||||
import {
|
||||
DOMParser,
|
||||
} from "https://deno.land/x/deno_dom@v0.1.38/deno-dom-wasm.ts";
|
||||
import {
|
||||
Image,
|
||||
TextLayout,
|
||||
} from "https://deno.land/x/imagescript@1.2.15/ImageScript.js";
|
||||
|
||||
// not sure how worthwhile this optimization is but
|
||||
const dom_parser = new DOMParser();
|
||||
|
||||
async function get_last_update_date(): Promise<
|
||||
{ last_updated: Date; last_update_count: number } | string
|
||||
> {
|
||||
try {
|
||||
const res = await fetch("https://homestuck2.com/story/log");
|
||||
const body = await res.text();
|
||||
if (!body) return "couldn't get a string body";
|
||||
|
||||
// could just regex for the date lol
|
||||
const doc = dom_parser.parseFromString(body, "text/html");
|
||||
if (!doc) return "couldn't parse the body into the DOM";
|
||||
|
||||
const time = doc.querySelector("time");
|
||||
if (!time) return "couldn't get even a single time from the doc (bad!)";
|
||||
console.log(time.attributes.getNamedItem("datetime")?.value);
|
||||
|
||||
const datetime = time.attributes.getNamedItem("datetime")?.value;
|
||||
if (!datetime) return "time didn't have datetime attr??";
|
||||
const date = new Date(datetime);
|
||||
// should work until the year 10000
|
||||
// includes the hour for safety (NVM: WHAT IF IT ROLLED OVER (ugh let's hope that doesn't happen for the day))
|
||||
const date_prefix = date.toISOString().slice(0, 10);
|
||||
return {
|
||||
last_updated: date,
|
||||
last_update_count:
|
||||
doc.querySelectorAll(`time[datetime^="${date_prefix}"]`)
|
||||
.length,
|
||||
};
|
||||
} catch (e) {
|
||||
return `caught error: ${e}`;
|
||||
}
|
||||
}
|
||||
|
||||
async function check_again() {
|
||||
last_checked = new Date();
|
||||
|
||||
const stuff = await get_last_update_date();
|
||||
if (typeof stuff == "string") {
|
||||
console.log(`failed to get a date when checking 😬: '${stuff}'`);
|
||||
console.log(
|
||||
"^ ironically enough, this is more likely when there *is* an update",
|
||||
);
|
||||
console.log(
|
||||
"^ unironically, this is *most* likely the result of a bug",
|
||||
);
|
||||
return;
|
||||
}
|
||||
last_updated = stuff.last_updated;
|
||||
last_update_count = stuff.last_update_count;
|
||||
}
|
||||
|
||||
function days_since_update(): number {
|
||||
const millis = new Date().getTime() - last_updated.getTime();
|
||||
return millis / (24 * 60 * 60 * 1000);
|
||||
}
|
||||
|
||||
// silly, i know
|
||||
let last_updated: Date = new Date(0);
|
||||
let last_checked: Date = new Date();
|
||||
let last_update_count = 0;
|
||||
await check_again();
|
||||
|
||||
// *definitely* a worthwhile optimization
|
||||
// (still inefficient to go over http...)
|
||||
const font = await fetch("https://static.pyrope.net/courier-std-bold.otf")
|
||||
.then((r) => r.arrayBuffer())
|
||||
.then((b) => new Uint8Array(b));
|
||||
|
||||
function make_image(n: number): Image {
|
||||
const days = Math.floor(n).toString().padStart(3, "0");
|
||||
let image = new Image(110, 44);
|
||||
|
||||
const outline = Image.renderText(
|
||||
font,
|
||||
64,
|
||||
days,
|
||||
0xff_ff_ff_ff,
|
||||
new TextLayout({ verticalAlign: "center", horizontalAlign: "middle" }),
|
||||
);
|
||||
|
||||
for (const hshift of [-2, 0, 2]) {
|
||||
for (const vshift of [-2, 0, 2]) {
|
||||
image = image.composite(outline, hshift - 4, vshift);
|
||||
}
|
||||
}
|
||||
const text = Image.renderText(
|
||||
font,
|
||||
64,
|
||||
days,
|
||||
0x00_00_00_ff,
|
||||
new TextLayout({ verticalAlign: "center", horizontalAlign: "middle" }),
|
||||
);
|
||||
|
||||
return image.composite(text, -4);
|
||||
}
|
||||
|
||||
async function update_images() {
|
||||
[last_updated_image, last_update_count_image] = await Promise.all([
|
||||
make_image(days_since_update()).encode(),
|
||||
make_image(last_update_count).encode(),
|
||||
]);
|
||||
}
|
||||
|
||||
let last_updated_image: Uint8Array = new Uint8Array();
|
||||
let last_update_count_image: Uint8Array = new Uint8Array();
|
||||
await update_images();
|
||||
|
||||
const image_response = (data: Uint8Array): Response =>
|
||||
new Response(data, {
|
||||
headers: { "Content-Type": contentType("png") },
|
||||
});
|
||||
|
||||
Deno.serve({ port: 61264 }, async (req) => {
|
||||
const url = new URL(req.url);
|
||||
if ((new Date().getTime() - last_checked.getTime()) >= 60 * 1000) {
|
||||
await check_again();
|
||||
await update_images();
|
||||
}
|
||||
|
||||
// could use URLPattern but that would be overkill for this
|
||||
if (url.pathname.match("count")) {
|
||||
return image_response(last_update_count_image);
|
||||
} else {
|
||||
return image_response(last_updated_image);
|
||||
}
|
||||
});
|
126
serverside/name-color.ts
Normal file
|
@ -0,0 +1,126 @@
|
|||
import {
|
||||
DOMParser,
|
||||
} from "https://deno.land/x/deno_dom@v0.1.46/deno-dom-wasm.ts";
|
||||
import * as css from "https://deno.land/x/css@0.3.0/mod.ts";
|
||||
|
||||
// so, so brittle
|
||||
function is_valid_color(color: string): boolean {
|
||||
try {
|
||||
const { stylesheet } = css.parse(`*{color:${color};}`);
|
||||
return color.toLowerCase() != "example"
|
||||
&& stylesheet.rules.length == 1
|
||||
&& stylesheet.rules[0].declarations.length == 1;
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// maybe a bit high, maybe a bit low
|
||||
const MAX_AGE_MS = 10 * 60 * 1000;
|
||||
|
||||
// > "light-dark(oklab(000, 000, 000), oklab(255, 255, 255))".length
|
||||
// 54
|
||||
const MAX_COLOR_LEN = 512;
|
||||
|
||||
const colors: Record<
|
||||
string,
|
||||
{ color: string | undefined; last_checked: Date }
|
||||
> = {};
|
||||
const dom_parser = new DOMParser();
|
||||
|
||||
function parse_color(str: string): string | undefined {
|
||||
const text = str.replace(/^#/, "");
|
||||
if (text.startsWith("name-color:")) {
|
||||
const line = text.split("\n", 1)[0];
|
||||
const color = line.split("name-color:")[1]
|
||||
.trim()
|
||||
.slice(0, MAX_COLOR_LEN)
|
||||
.replaceAll(/[;{}"']|\/\*|\*\//g, "");
|
||||
if (is_valid_color(color)) {
|
||||
return color;
|
||||
} else {
|
||||
console.log(`invalid color!!!! ${color}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function get_name_color(name: string): Promise<string | undefined> {
|
||||
console.log(`fetching ${name}...`);
|
||||
const resp = await fetch(`https://cohost.org/${name}`);
|
||||
if (!resp.ok) {
|
||||
console.log(`fetching https://cohost.org/${name} failed!`);
|
||||
return;
|
||||
}
|
||||
const body = await resp.text();
|
||||
const dom = dom_parser.parseFromString(body, "text/html");
|
||||
if (!dom) {
|
||||
console.log(`parsing https://cohost.org/${name} to the dom failed!`);
|
||||
return;
|
||||
}
|
||||
|
||||
const a = dom.querySelector("a[href*='name-color:']");
|
||||
if (a) {
|
||||
const href = a.getAttribute("href");
|
||||
if (href) {
|
||||
const color = parse_color(href);
|
||||
if (color) return color;
|
||||
}
|
||||
}
|
||||
|
||||
for (const p of dom.querySelectorAll("p, a")) {
|
||||
if (!p.textContent.includes("name-color:")) continue;
|
||||
|
||||
for (const node of p.childNodes) {
|
||||
const color = parse_color(node.textContent);
|
||||
if (color) return color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function update_name_color(name: string) {
|
||||
const now = new Date();
|
||||
if (
|
||||
colors[name] &&
|
||||
now.getTime() - colors[name].last_checked.getTime() <= MAX_AGE_MS
|
||||
) {
|
||||
return;
|
||||
}
|
||||
const color = await get_name_color(name);
|
||||
colors[name] = { color, last_checked: now };
|
||||
}
|
||||
|
||||
function cssify({ requester }: { requester?: string }): string {
|
||||
const preamble = `/* customized: ${
|
||||
Object.keys(colors)
|
||||
.filter((name) => colors[name].color)
|
||||
.sort()
|
||||
.join(", ")
|
||||
} */\n/* look, i don't like !important either, but i think it's a better choice than some lame .spec.ific.ity.hack.ing */\n\n`;
|
||||
|
||||
let vars = `:root {\n`;
|
||||
if (requester && colors[requester]) {
|
||||
vars += `--name-color: var(--name-color-${requester.toLowerCase()});\n`;
|
||||
}
|
||||
let classes = "";
|
||||
for (const name of Object.keys(colors).sort()) {
|
||||
const { color } = colors[name];
|
||||
if (!color) continue;
|
||||
vars += `--name-color-${name.toLowerCase()}: ${color};\n`;
|
||||
classes +=
|
||||
`a[href$='/${name}' i]{color: var(--name-color-${name.toLowerCase()}) !important;}\n`;
|
||||
}
|
||||
vars += "}\n\n";
|
||||
return preamble + vars + classes;
|
||||
}
|
||||
|
||||
Deno.serve({ port: 61266 }, async (req) => {
|
||||
const url = new URL(req.url);
|
||||
const names = url.searchParams.getAll("name").filter((name) =>
|
||||
!name.match(/[\/\\?"';{}]/)
|
||||
).map((name) => name.toLowerCase());
|
||||
await Promise.all(names.map(update_name_color));
|
||||
const css = cssify({
|
||||
requester: url.searchParams.get("requester") ?? undefined,
|
||||
});
|
||||
return new Response(css, { headers: { "content-type": "text/css" } });
|
||||
});
|
105
serverside/prngnouns.ts
Normal file
|
@ -0,0 +1,105 @@
|
|||
// TODO: randomly pick color
|
||||
import { contentType } from "https://deno.land/std@0.202.0/media_types/mod.ts";
|
||||
import {
|
||||
Image,
|
||||
TextLayout,
|
||||
} from "https://deno.land/x/imagescript@1.2.15/ImageScript.js";
|
||||
|
||||
const font = await fetch("https://static.pyrope.net/courier-std-bold.otf")
|
||||
.then((r) => r.arrayBuffer())
|
||||
.then((b) => new Uint8Array(b));
|
||||
|
||||
function make_image(
|
||||
{ text, color = 0, outline_color = 0xff_ff_ff_ff }: {
|
||||
text: string;
|
||||
color?: number;
|
||||
outline_color?: number;
|
||||
},
|
||||
): Image {
|
||||
let image = Image.renderText(
|
||||
font,
|
||||
64,
|
||||
text,
|
||||
0,
|
||||
new TextLayout({ verticalAlign: "center", horizontalAlign: "middle" }),
|
||||
);
|
||||
|
||||
const outline = Image.renderText(
|
||||
font,
|
||||
64,
|
||||
text,
|
||||
outline_color,
|
||||
new TextLayout({ verticalAlign: "center", horizontalAlign: "middle" }),
|
||||
);
|
||||
|
||||
for (const hshift of [-2, 0, 2]) {
|
||||
for (const vshift of [-2, 0, 2]) {
|
||||
image = image.composite(outline, hshift, vshift);
|
||||
}
|
||||
}
|
||||
const text_img = Image.renderText(
|
||||
font,
|
||||
64,
|
||||
text,
|
||||
color,
|
||||
new TextLayout({ verticalAlign: "center", horizontalAlign: "middle" }),
|
||||
);
|
||||
|
||||
const final = image.composite(text_img);
|
||||
return final.crop(0, 0, final.width, final.height - 22);
|
||||
}
|
||||
|
||||
// the whole cache thing def sketches me out, but people probably won't be *that* malicious
|
||||
const MAX_PRN_LENGTH = 128;
|
||||
// shouldn't really be a problem
|
||||
const MAX_PRN_CHOICES = 256;
|
||||
|
||||
// let's stick to hex even though BigInt() can handle prefixes (prefices?)
|
||||
const hex_string_to_color = (s: string): number | undefined => {
|
||||
const parsed = parseInt(s, 16);
|
||||
if (Number.isNaN(parsed)) return;
|
||||
// JANK! SORRY
|
||||
return Number((BigInt(parsed) << 8n) | 0xffn);
|
||||
};
|
||||
|
||||
const image_response = (data: Uint8Array): Response =>
|
||||
new Response(data, {
|
||||
headers: { "Content-Type": contentType("png") },
|
||||
});
|
||||
|
||||
Deno.serve({ port: 61265 }, async (req) => {
|
||||
const url = new URL(req.url);
|
||||
const params = url.searchParams;
|
||||
const prns = params.getAll("p");
|
||||
|
||||
if (prns.some((p) => p.length > MAX_PRN_LENGTH)) {
|
||||
return new Response(`MAX_PRN_LENGTH = ${MAX_PRN_LENGTH}`, { status: 413 });
|
||||
}
|
||||
|
||||
if (prns.length > MAX_PRN_CHOICES) {
|
||||
return new Response(`MAX_PRN_CHOICES = ${MAX_PRN_CHOICES}`, {
|
||||
status: 413,
|
||||
});
|
||||
}
|
||||
|
||||
const prn = prns[Math.floor(Math.random() * prns.length)] ??
|
||||
"NONE, APPARENTLY";
|
||||
|
||||
const fg_str = params.get("fg");
|
||||
const outline_str = params.get("outline");
|
||||
|
||||
const sentence_id = params.get("sentence_id");
|
||||
const sentence_index = params.get("sentence_index");
|
||||
|
||||
console.log(
|
||||
`${sentence_id}#${sentence_index}: chose ${prn} from ${prns}. ${fg_str} on ${outline_str}`,
|
||||
);
|
||||
|
||||
const fg = hex_string_to_color(fg_str ?? "0");
|
||||
const outline = hex_string_to_color(outline_str ?? "ffffff");
|
||||
|
||||
const resp = image_response(
|
||||
await make_image({ text: prn, color: fg, outline_color: outline }).encode(),
|
||||
);
|
||||
return resp;
|
||||
});
|
|
@ -153,7 +153,8 @@ const secret_messages = [
|
|||
"it would be cool if floppies were actually reliable",
|
||||
"epic win! this message has a 1% chance of appearing! share with your friends",
|
||||
"you should try curling terezi.pyrope.net",
|
||||
"caltrop.dev has a ton of cool stuff; the caltrop.dev/meta/map helps",
|
||||
"Stubborn tiny lights vs. clustering darkness forever ok?",
|
||||
// "caltrop.dev has a ton of cool stuff; the caltrop.dev/meta/map helps",
|
||||
"i used a typescript type error to track my progress to one hundred messages",
|
||||
"haskell...",
|
||||
"lean4...",
|
||||
|
@ -242,8 +243,11 @@ async function count_request() {
|
|||
|
||||
Deno.serve({ port: 61261 }, async () => {
|
||||
await count_request();
|
||||
draw_times(await num_requests());
|
||||
draw_secret_message();
|
||||
const num = await num_requests();
|
||||
draw_times(num);
|
||||
const msg = pick_random(secret_messages);
|
||||
draw_secret_message(msg);
|
||||
console.log(`${num}: ${msg}`);
|
||||
fix_border();
|
||||
|
||||
const image_format = "png";
|
||||
|
|
BIN
static/courier-std-bold.otf
Normal file
BIN
static/cruelty-squad-divine-light-border.webp
Normal file
After Width: | Height: | Size: 47 KiB |
BIN
static/imgflip/STRONG-handshake.png
Normal file
After Width: | Height: | Size: 541 KiB |
BIN
static/imgflip/aggressive-right-turn.png
Normal file
After Width: | Height: | Size: 316 KiB |
BIN
static/imgflip/aliens.png
Normal file
After Width: | Height: | Size: 336 KiB |
BIN
static/imgflip/always-has-been.png
Normal file
After Width: | Height: | Size: 524 KiB |
BIN
static/imgflip/balloon.png
Normal file
After Width: | Height: | Size: 371 KiB |
BIN
static/imgflip/batman-slapping-robin.png
Normal file
After Width: | Height: | Size: 420 KiB |
BIN
static/imgflip/bike-self-sabotage.png
Normal file
After Width: | Height: | Size: 250 KiB |
BIN
static/imgflip/buff-doge-vs-cheems.png
Normal file
After Width: | Height: | Size: 177 KiB |
BIN
static/imgflip/cefqrn.png
Normal file
After Width: | Height: | Size: 658 KiB |
BIN
static/imgflip/change-my-mind.png
Normal file
After Width: | Height: | Size: 398 KiB |
BIN
static/imgflip/chuck-norris.png
Normal file
After Width: | Height: | Size: 526 KiB |
BIN
static/imgflip/despicable-plan.png
Normal file
After Width: | Height: | Size: 442 KiB |
BIN
static/imgflip/distracted-boyfriend.png
Normal file
After Width: | Height: | Size: 636 KiB |
BIN
static/imgflip/drake.png
Normal file
After Width: | Height: | Size: 227 KiB |
BIN
static/imgflip/everywhere-everywhere.png
Normal file
After Width: | Height: | Size: 441 KiB |
BIN
static/imgflip/evil-kermit.png
Normal file
After Width: | Height: | Size: 287 KiB |
BIN
static/imgflip/expanding-brain.png
Normal file
After Width: | Height: | Size: 390 KiB |
BIN
static/imgflip/girl-smile-fire.png
Normal file
After Width: | Height: | Size: 397 KiB |
BIN
static/imgflip/heinous-suggestion.png
Normal file
After Width: | Height: | Size: 391 KiB |
BIN
static/imgflip/hide-the-pain-harold.png
Normal file
After Width: | Height: | Size: 357 KiB |
BIN
static/imgflip/i-am-once-again-asking.png
Normal file
After Width: | Height: | Size: 342 KiB |
BIN
static/imgflip/if-i-had-one.png
Normal file
After Width: | Height: | Size: 516 KiB |
BIN
static/imgflip/is-this-a.png
Normal file
After Width: | Height: | Size: 356 KiB |
BIN
static/imgflip/not-sure-if.png
Normal file
After Width: | Height: | Size: 209 KiB |
BIN
static/imgflip/one-does-not-simply.png
Normal file
After Width: | Height: | Size: 402 KiB |
BIN
static/imgflip/or-draw-25.png
Normal file
After Width: | Height: | Size: 295 KiB |
BIN
static/imgflip/panik-kalm-panik.png
Normal file
After Width: | Height: | Size: 175 KiB |
BIN
static/imgflip/psycholonials-reference.png
Normal file
After Width: | Height: | Size: 209 KiB |
BIN
static/imgflip/rock-the-dwayne-johnson-driving.png
Normal file
After Width: | Height: | Size: 446 KiB |
BIN
static/imgflip/same-picture.png
Normal file
After Width: | Height: | Size: 422 KiB |
BIN
static/imgflip/scroll-of-truth.png
Normal file
After Width: | Height: | Size: 482 KiB |
BIN
static/imgflip/slam-button.png
Normal file
After Width: | Height: | Size: 221 KiB |
BIN
static/imgflip/success-kid.png
Normal file
After Width: | Height: | Size: 105 KiB |
BIN
static/imgflip/tap-head.png
Normal file
After Width: | Height: | Size: 373 KiB |
BIN
static/imgflip/thinking-about-other-women.png
Normal file
After Width: | Height: | Size: 614 KiB |
BIN
static/imgflip/this-is-fine.png
Normal file
After Width: | Height: | Size: 551 KiB |
BIN
static/imgflip/two-buttons.png
Normal file
After Width: | Height: | Size: 416 KiB |
BIN
static/imgflip/waiting-guy.png
Normal file
After Width: | Height: | Size: 430 KiB |
BIN
static/imgflip/waiting-skeleton.png
Normal file
After Width: | Height: | Size: 600 KiB |
BIN
static/imgflip/who-killed.png
Normal file
After Width: | Height: | Size: 404 KiB |
BIN
static/imgflip/woman-yelling-at-cat.png
Normal file
After Width: | Height: | Size: 383 KiB |
BIN
static/imgflip/you-get-a.png
Normal file
After Width: | Height: | Size: 353 KiB |
BIN
static/meme-text/!.png
Normal file
After Width: | Height: | Size: 393 B |
BIN
static/meme-text/A.png
Normal file
After Width: | Height: | Size: 719 B |
BIN
static/meme-text/ALIEN.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
static/meme-text/ARE.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
static/meme-text/BOTTOM.png
Normal file
After Width: | Height: | Size: 2.1 KiB |
BIN
static/meme-text/CHUCK_NORRIS.png
Normal file
After Width: | Height: | Size: 4 KiB |
BIN
static/meme-text/COHOST.png
Normal file
After Width: | Height: | Size: 2.5 KiB |
BIN
static/meme-text/EGGBUG.png
Normal file
After Width: | Height: | Size: 2.4 KiB |
BIN
static/meme-text/FOR.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
static/meme-text/GET.png
Normal file
After Width: | Height: | Size: 975 B |
BIN
static/meme-text/HOMESTUCK.png
Normal file
After Width: | Height: | Size: 3.4 KiB |
BIN
static/meme-text/IMPOSTER.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
BIN
static/meme-text/IS.png
Normal file
After Width: | Height: | Size: 1.1 KiB |