This commit is contained in:
Andreas Thomas 2023-03-26 12:29:53 +02:00
parent f7765e018d
commit d13531c222
No known key found for this signature in database
63 changed files with 1625 additions and 485 deletions

View File

@ -19,6 +19,9 @@ var Project = defineDocumentType(() => ({
filePathPattern: "./projects/**/*.mdx",
contentType: "mdx",
fields: {
published: {
type: "boolean",
},
title: {
type: "string",
required: true,
@ -91,4 +94,4 @@ var contentlayer_config_default = makeSource({
},
});
export { Page, Project, contentlayer_config_default as default };
//# sourceMappingURL=compiled-contentlayer-config-KFUTZ636.mjs.map
//# sourceMappingURL=compiled-contentlayer-config-AAEZAM7W.mjs.map

View File

@ -0,0 +1,7 @@
{
"version": 3,
"sources": ["../../../contentlayer.config.js"],
"sourcesContent": ["import { defineDocumentType, makeSource } from \"contentlayer/source-files\";\nimport remarkGfm from \"remark-gfm\";\nimport rehypePrettyCode from \"rehype-pretty-code\";\nimport rehypeSlug from \"rehype-slug\";\nimport rehypeAutolinkHeadings from \"rehype-autolink-headings\";\n\n/** @type {import('contentlayer/source-files').ComputedFields} */\nconst computedFields = {\n\tpath: {\n\t\ttype: \"string\",\n\t\tresolve: (doc) => `/${doc._raw.flattenedPath}`,\n\t},\n\tslug: {\n\t\ttype: \"string\",\n\t\tresolve: (doc) => doc._raw.flattenedPath.split(\"/\").slice(1).join(\"/\"),\n\t},\n};\n\nexport const Project = defineDocumentType(() => ({\n\tname: \"Project\",\n\tfilePathPattern: \"./projects/**/*.mdx\",\n\tcontentType: \"mdx\",\n\n\tfields: {\n\t\tpublished: {\n\t\t\ttype: \"boolean\",\n\t\t},\n\t\ttitle: {\n\t\t\ttype: \"string\",\n\t\t\trequired: true,\n\t\t},\n\t\tdescription: {\n\t\t\ttype: \"string\",\n\t\t\trequired: true,\n\t\t},\n\t\tdate: {\n\t\t\ttype: \"date\",\n\t\t},\n\t\turl: {\n\t\t\ttype: \"string\",\n\t\t},\n\t\trepository: {\n\t\t\ttype: \"string\",\n\t\t},\n\t},\n\tcomputedFields,\n}));\n\nexport const Page = defineDocumentType(() => ({\n\tname: \"Page\",\n\tfilePathPattern: \"pages/**/*.mdx\",\n\tcontentType: \"mdx\",\n\tfields: {\n\t\ttitle: {\n\t\t\ttype: \"string\",\n\t\t\trequired: true,\n\t\t},\n\t\tdescription: {\n\t\t\ttype: \"string\",\n\t\t},\n\t},\n\tcomputedFields,\n}));\n\nexport default makeSource({\n\tcontentDirPath: \"./content\",\n\tdocumentTypes: [Page, Project],\n\tmdx: {\n\t\tremarkPlugins: [remarkGfm],\n\t\trehypePlugins: [\n\t\t\trehypeSlug,\n\t\t\t[\n\t\t\t\trehypePrettyCode,\n\t\t\t\t{\n\t\t\t\t\ttheme: \"github-dark\",\n\t\t\t\t\tonVisitLine(node) {\n\t\t\t\t\t\t// Prevent lines from collapsing in `display: grid` mode, and allow empty\n\t\t\t\t\t\t// lines to be copy/pasted\n\t\t\t\t\t\tif (node.children.length === 0) {\n\t\t\t\t\t\t\tnode.children = [{ type: \"text\", value: \" \" }];\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tonVisitHighlightedLine(node) {\n\t\t\t\t\t\tnode.properties.className.push(\"line--highlighted\");\n\t\t\t\t\t},\n\t\t\t\t\tonVisitHighlightedWord(node) {\n\t\t\t\t\t\tnode.properties.className = [\"word--highlighted\"];\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\t[\n\t\t\t\trehypeAutolinkHeadings,\n\t\t\t\t{\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tclassName: [\"subheading-anchor\"],\n\t\t\t\t\t\tariaLabel: \"Link to section\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t],\n\t},\n});\n"],
"mappings": ";AAAA,SAAS,oBAAoB,kBAAkB;AAC/C,OAAO,eAAe;AACtB,OAAO,sBAAsB;AAC7B,OAAO,gBAAgB;AACvB,OAAO,4BAA4B;AAGnC,IAAM,iBAAiB;AAAA,EACtB,MAAM;AAAA,IACL,MAAM;AAAA,IACN,SAAS,CAAC,QAAQ,IAAI,IAAI,KAAK;AAAA,EAChC;AAAA,EACA,MAAM;AAAA,IACL,MAAM;AAAA,IACN,SAAS,CAAC,QAAQ,IAAI,KAAK,cAAc,MAAM,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG;AAAA,EACtE;AACD;AAEO,IAAM,UAAU,mBAAmB,OAAO;AAAA,EAChD,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,aAAa;AAAA,EAEb,QAAQ;AAAA,IACP,WAAW;AAAA,MACV,MAAM;AAAA,IACP;AAAA,IACA,OAAO;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,IACX;AAAA,IACA,aAAa;AAAA,MACZ,MAAM;AAAA,MACN,UAAU;AAAA,IACX;AAAA,IACA,MAAM;AAAA,MACL,MAAM;AAAA,IACP;AAAA,IACA,KAAK;AAAA,MACJ,MAAM;AAAA,IACP;AAAA,IACA,YAAY;AAAA,MACX,MAAM;AAAA,IACP;AAAA,EACD;AAAA,EACA;AACD,EAAE;AAEK,IAAM,OAAO,mBAAmB,OAAO;AAAA,EAC7C,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,QAAQ;AAAA,IACP,OAAO;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,IACX;AAAA,IACA,aAAa;AAAA,MACZ,MAAM;AAAA,IACP;AAAA,EACD;AAAA,EACA;AACD,EAAE;AAEF,IAAO,8BAAQ,WAAW;AAAA,EACzB,gBAAgB;AAAA,EAChB,eAAe,CAAC,MAAM,OAAO;AAAA,EAC7B,KAAK;AAAA,IACJ,eAAe,CAAC,SAAS;AAAA,IACzB,eAAe;AAAA,MACd;AAAA,MACA;AAAA,QACC;AAAA,QACA;AAAA,UACC,OAAO;AAAA,UACP,YAAY,MAAM;AAGjB,gBAAI,KAAK,SAAS,WAAW,GAAG;AAC/B,mBAAK,WAAW,CAAC,EAAE,MAAM,QAAQ,OAAO,IAAI,CAAC;AAAA,YAC9C;AAAA,UACD;AAAA,UACA,uBAAuB,MAAM;AAC5B,iBAAK,WAAW,UAAU,KAAK,mBAAmB;AAAA,UACnD;AAAA,UACA,uBAAuB,MAAM;AAC5B,iBAAK,WAAW,YAAY,CAAC,mBAAmB;AAAA,UACjD;AAAA,QACD;AAAA,MACD;AAAA,MACA;AAAA,QACC;AAAA,QACA;AAAA,UACC,YAAY;AAAA,YACX,WAAW,CAAC,mBAAmB;AAAA,YAC/B,WAAW;AAAA,UACZ;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACD,CAAC;",
"names": []
}

View File

@ -1,7 +0,0 @@
{
"version": 3,
"sources": ["../../../contentlayer.config.js"],
"sourcesContent": ["import { defineDocumentType, makeSource } from \"contentlayer/source-files\";\nimport remarkGfm from \"remark-gfm\";\nimport rehypePrettyCode from \"rehype-pretty-code\";\nimport rehypeSlug from \"rehype-slug\";\nimport rehypeAutolinkHeadings from \"rehype-autolink-headings\";\n\n/** @type {import('contentlayer/source-files').ComputedFields} */\nconst computedFields = {\n\tpath: {\n\t\ttype: \"string\",\n\t\tresolve: (doc) => `/${doc._raw.flattenedPath}`,\n\t},\n\tslug: {\n\t\ttype: \"string\",\n\t\tresolve: (doc) => doc._raw.flattenedPath.split(\"/\").slice(1).join(\"/\"),\n\t},\n};\n\nexport const Project = defineDocumentType(() => ({\n\tname: \"Project\",\n\tfilePathPattern: \"./projects/**/*.mdx\",\n\tcontentType: \"mdx\",\n\n\tfields: {\n\t\ttitle: {\n\t\t\ttype: \"string\",\n\t\t\trequired: true,\n\t\t},\n\t\tdescription: {\n\t\t\ttype: \"string\",\n\t\t\trequired: true,\n\t\t},\n\t\tdate: {\n\t\t\ttype: \"date\",\n\t\t},\n\t\turl: {\n\t\t\ttype: \"string\",\n\t\t},\n\t\trepository: {\n\t\t\ttype: \"string\",\n\t\t},\n\t},\n\tcomputedFields,\n}));\n\nexport const Page = defineDocumentType(() => ({\n\tname: \"Page\",\n\tfilePathPattern: \"pages/**/*.mdx\",\n\tcontentType: \"mdx\",\n\tfields: {\n\t\ttitle: {\n\t\t\ttype: \"string\",\n\t\t\trequired: true,\n\t\t},\n\t\tdescription: {\n\t\t\ttype: \"string\",\n\t\t},\n\t},\n\tcomputedFields,\n}));\n\nexport default makeSource({\n\tcontentDirPath: \"./content\",\n\tdocumentTypes: [Page, Project],\n\tmdx: {\n\t\tremarkPlugins: [remarkGfm],\n\t\trehypePlugins: [\n\t\t\trehypeSlug,\n\t\t\t[\n\t\t\t\trehypePrettyCode,\n\t\t\t\t{\n\t\t\t\t\ttheme: \"github-dark\",\n\t\t\t\t\tonVisitLine(node) {\n\t\t\t\t\t\t// Prevent lines from collapsing in `display: grid` mode, and allow empty\n\t\t\t\t\t\t// lines to be copy/pasted\n\t\t\t\t\t\tif (node.children.length === 0) {\n\t\t\t\t\t\t\tnode.children = [{ type: \"text\", value: \" \" }];\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tonVisitHighlightedLine(node) {\n\t\t\t\t\t\tnode.properties.className.push(\"line--highlighted\");\n\t\t\t\t\t},\n\t\t\t\t\tonVisitHighlightedWord(node) {\n\t\t\t\t\t\tnode.properties.className = [\"word--highlighted\"];\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\t[\n\t\t\t\trehypeAutolinkHeadings,\n\t\t\t\t{\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tclassName: [\"subheading-anchor\"],\n\t\t\t\t\t\tariaLabel: \"Link to section\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t],\n\t},\n});\n"],
"mappings": ";AAAA,SAAS,oBAAoB,kBAAkB;AAC/C,OAAO,eAAe;AACtB,OAAO,sBAAsB;AAC7B,OAAO,gBAAgB;AACvB,OAAO,4BAA4B;AAGnC,IAAM,iBAAiB;AAAA,EACtB,MAAM;AAAA,IACL,MAAM;AAAA,IACN,SAAS,CAAC,QAAQ,IAAI,IAAI,KAAK;AAAA,EAChC;AAAA,EACA,MAAM;AAAA,IACL,MAAM;AAAA,IACN,SAAS,CAAC,QAAQ,IAAI,KAAK,cAAc,MAAM,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG;AAAA,EACtE;AACD;AAEO,IAAM,UAAU,mBAAmB,OAAO;AAAA,EAChD,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,aAAa;AAAA,EAEb,QAAQ;AAAA,IACP,OAAO;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,IACX;AAAA,IACA,aAAa;AAAA,MACZ,MAAM;AAAA,MACN,UAAU;AAAA,IACX;AAAA,IACA,MAAM;AAAA,MACL,MAAM;AAAA,IACP;AAAA,IACA,KAAK;AAAA,MACJ,MAAM;AAAA,IACP;AAAA,IACA,YAAY;AAAA,MACX,MAAM;AAAA,IACP;AAAA,EACD;AAAA,EACA;AACD,EAAE;AAEK,IAAM,OAAO,mBAAmB,OAAO;AAAA,EAC7C,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,QAAQ;AAAA,IACP,OAAO;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,IACX;AAAA,IACA,aAAa;AAAA,MACZ,MAAM;AAAA,IACP;AAAA,EACD;AAAA,EACA;AACD,EAAE;AAEF,IAAO,8BAAQ,WAAW;AAAA,EACzB,gBAAgB;AAAA,EAChB,eAAe,CAAC,MAAM,OAAO;AAAA,EAC7B,KAAK;AAAA,IACJ,eAAe,CAAC,SAAS;AAAA,IACzB,eAAe;AAAA,MACd;AAAA,MACA;AAAA,QACC;AAAA,QACA;AAAA,UACC,OAAO;AAAA,UACP,YAAY,MAAM;AAGjB,gBAAI,KAAK,SAAS,WAAW,GAAG;AAC/B,mBAAK,WAAW,CAAC,EAAE,MAAM,QAAQ,OAAO,IAAI,CAAC;AAAA,YAC9C;AAAA,UACD;AAAA,UACA,uBAAuB,MAAM;AAC5B,iBAAK,WAAW,UAAU,KAAK,mBAAmB;AAAA,UACnD;AAAA,UACA,uBAAuB,MAAM;AAC5B,iBAAK,WAAW,YAAY,CAAC,mBAAmB;AAAA,UACjD;AAAA,QACD;AAAA,MACD;AAAA,MACA;AAAA,QACC;AAAA,QACA;AAAA,UACC,YAAY;AAAA,YACX,WAAW,CAAC,mBAAmB;AAAA,YAC/B,WAAW;AAAA,UACZ;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACD,CAAC;",
"names": []
}

View File

@ -0,0 +1,97 @@
// contentlayer.config.js
import { defineDocumentType, makeSource } from "contentlayer/source-files";
import remarkGfm from "remark-gfm";
import rehypePrettyCode from "rehype-pretty-code";
import rehypeSlug from "rehype-slug";
import rehypeAutolinkHeadings from "rehype-autolink-headings";
var computedFields = {
path: {
type: "string",
resolve: (doc) => `/${doc._raw.flattenedPath}`,
},
slug: {
type: "string",
resolve: (doc) => doc._raw.flattenedPath.split("/").slice(1).join("/"),
},
};
var Project = defineDocumentType(() => ({
name: "Project",
filePathPattern: "./projects/**/*.mdx",
contentType: "mdx",
fields: {
published: {
type: "boolean",
},
title: {
type: "string",
required: true,
},
description: {
type: "string",
required: true,
},
date: {
type: "date",
},
url: {
type: "string",
},
repository: {
type: "string",
},
},
computedFields,
}));
var Page = defineDocumentType(() => ({
name: "Page",
filePathPattern: "pages/**/*.mdx",
contentType: "mdx",
fields: {
title: {
type: "string",
required: true,
},
description: {
type: "string",
},
},
computedFields,
}));
var contentlayer_config_default = makeSource({
contentDirPath: "./content",
documentTypes: [Page, Project],
mdx: {
remarkPlugins: [remarkGfm],
rehypePlugins: [
rehypeSlug,
[
rehypePrettyCode,
{
theme: "github-dark",
onVisitLine(node) {
if (node.children.length === 0) {
node.children = [{ type: "text", value: " " }];
}
},
onVisitHighlightedLine(node) {
node.properties.className.push("line--highlighted");
},
onVisitHighlightedWord(node) {
node.properties.className = ["word--highlighted"];
},
},
],
[
rehypeAutolinkHeadings,
{
properties: {
className: ["subheading-anchor"],
ariaLabel: "Link to section",
},
},
],
],
},
});
export { Page, Project, contentlayer_config_default as default };
//# sourceMappingURL=compiled-contentlayer-config-RHAHPX7F.mjs.map

View File

@ -0,0 +1,7 @@
{
"version": 3,
"sources": ["../../../contentlayer.config.js"],
"sourcesContent": ["import { defineDocumentType, makeSource } from \"contentlayer/source-files\";\nimport remarkGfm from \"remark-gfm\";\nimport rehypePrettyCode from \"rehype-pretty-code\";\nimport rehypeSlug from \"rehype-slug\";\nimport rehypeAutolinkHeadings from \"rehype-autolink-headings\";\n\n/** @type {import('contentlayer/source-files').ComputedFields} */\nconst computedFields = {\n\tpath: {\n\t\ttype: \"string\",\n\t\tresolve: (doc) => `/${doc._raw.flattenedPath}`,\n\t},\n\tslug: {\n\t\ttype: \"string\",\n\t\tresolve: (doc) => doc._raw.flattenedPath.split(\"/\").slice(1).join(\"/\"),\n\t},\n};\n\nexport const Project = defineDocumentType(() => ({\n\tname: \"Project\",\n\tfilePathPattern: \"./projects/**/*.mdx\",\n\tcontentType: \"mdx\",\n\n\tfields: {\n\t\tpublished:{\n\t\t\ttype: \"boolean\",\n\t\t},\n\t\ttitle: {\n\t\t\ttype: \"string\",\n\t\t\trequired: true,\n\t\t},\n\t\tdescription: {\n\t\t\ttype: \"string\",\n\t\t\trequired: true,\n\t\t},\n\t\tdate: {\n\t\t\ttype: \"date\",\n\t\t},\n\t\turl: {\n\t\t\ttype: \"string\",\n\t\t},\n\t\trepository: {\n\t\t\ttype: \"string\",\n\t\t},\n\t},\n\tcomputedFields,\n}));\n\nexport const Page = defineDocumentType(() => ({\n\tname: \"Page\",\n\tfilePathPattern: \"pages/**/*.mdx\",\n\tcontentType: \"mdx\",\n\tfields: {\n\t\ttitle: {\n\t\t\ttype: \"string\",\n\t\t\trequired: true,\n\t\t},\n\t\tdescription: {\n\t\t\ttype: \"string\",\n\t\t},\n\t},\n\tcomputedFields,\n}));\n\nexport default makeSource({\n\tcontentDirPath: \"./content\",\n\tdocumentTypes: [Page, Project],\n\tmdx: {\n\t\tremarkPlugins: [remarkGfm],\n\t\trehypePlugins: [\n\t\t\trehypeSlug,\n\t\t\t[\n\t\t\t\trehypePrettyCode,\n\t\t\t\t{\n\t\t\t\t\ttheme: \"github-dark\",\n\t\t\t\t\tonVisitLine(node) {\n\t\t\t\t\t\t// Prevent lines from collapsing in `display: grid` mode, and allow empty\n\t\t\t\t\t\t// lines to be copy/pasted\n\t\t\t\t\t\tif (node.children.length === 0) {\n\t\t\t\t\t\t\tnode.children = [{ type: \"text\", value: \" \" }];\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tonVisitHighlightedLine(node) {\n\t\t\t\t\t\tnode.properties.className.push(\"line--highlighted\");\n\t\t\t\t\t},\n\t\t\t\t\tonVisitHighlightedWord(node) {\n\t\t\t\t\t\tnode.properties.className = [\"word--highlighted\"];\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\t[\n\t\t\t\trehypeAutolinkHeadings,\n\t\t\t\t{\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tclassName: [\"subheading-anchor\"],\n\t\t\t\t\t\tariaLabel: \"Link to section\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t],\n\t},\n});\n"],
"mappings": ";AAAA,SAAS,oBAAoB,kBAAkB;AAC/C,OAAO,eAAe;AACtB,OAAO,sBAAsB;AAC7B,OAAO,gBAAgB;AACvB,OAAO,4BAA4B;AAGnC,IAAM,iBAAiB;AAAA,EACtB,MAAM;AAAA,IACL,MAAM;AAAA,IACN,SAAS,CAAC,QAAQ,IAAI,IAAI,KAAK;AAAA,EAChC;AAAA,EACA,MAAM;AAAA,IACL,MAAM;AAAA,IACN,SAAS,CAAC,QAAQ,IAAI,KAAK,cAAc,MAAM,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG;AAAA,EACtE;AACD;AAEO,IAAM,UAAU,mBAAmB,OAAO;AAAA,EAChD,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,aAAa;AAAA,EAEb,QAAQ;AAAA,IACP,WAAU;AAAA,MACT,MAAM;AAAA,IACP;AAAA,IACA,OAAO;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,IACX;AAAA,IACA,aAAa;AAAA,MACZ,MAAM;AAAA,MACN,UAAU;AAAA,IACX;AAAA,IACA,MAAM;AAAA,MACL,MAAM;AAAA,IACP;AAAA,IACA,KAAK;AAAA,MACJ,MAAM;AAAA,IACP;AAAA,IACA,YAAY;AAAA,MACX,MAAM;AAAA,IACP;AAAA,EACD;AAAA,EACA;AACD,EAAE;AAEK,IAAM,OAAO,mBAAmB,OAAO;AAAA,EAC7C,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,QAAQ;AAAA,IACP,OAAO;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,IACX;AAAA,IACA,aAAa;AAAA,MACZ,MAAM;AAAA,IACP;AAAA,EACD;AAAA,EACA;AACD,EAAE;AAEF,IAAO,8BAAQ,WAAW;AAAA,EACzB,gBAAgB;AAAA,EAChB,eAAe,CAAC,MAAM,OAAO;AAAA,EAC7B,KAAK;AAAA,IACJ,eAAe,CAAC,SAAS;AAAA,IACzB,eAAe;AAAA,MACd;AAAA,MACA;AAAA,QACC;AAAA,QACA;AAAA,UACC,OAAO;AAAA,UACP,YAAY,MAAM;AAGjB,gBAAI,KAAK,SAAS,WAAW,GAAG;AAC/B,mBAAK,WAAW,CAAC,EAAE,MAAM,QAAQ,OAAO,IAAI,CAAC;AAAA,YAC9C;AAAA,UACD;AAAA,UACA,uBAAuB,MAAM;AAC5B,iBAAK,WAAW,UAAU,KAAK,mBAAmB;AAAA,UACnD;AAAA,UACA,uBAAuB,MAAM;AAC5B,iBAAK,WAAW,YAAY,CAAC,mBAAmB;AAAA,UACjD;AAAA,QACD;AAAA,MACD;AAAA,MACA;AAAA,QACC;AAAA,QACA;AAAA,UACC,YAAY;AAAA,YACX,WAAW,CAAC,mBAAmB;AAAA,YAC/B,WAAW;AAAA,UACZ;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACD,CAAC;",
"names": []
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -42,6 +42,9 @@ import projects__upstashReactUiMdx from "./projects__upstash-react-ui.mdx.json"
import projects__upstashRedisMdx from "./projects__upstash-redis.mdx.json" assert {
type: "json",
};
import projects__upstashWebAnalyticsMdx from "./projects__upstash-web-analytics.mdx.json" assert {
type: "json",
};
export const allProjects = [
projects__accessMdx,
@ -58,4 +61,5 @@ export const allProjects = [
projects__upstashRatelimitMdx,
projects__upstashReactUiMdx,
projects__upstashRedisMdx,
projects__upstashWebAnalyticsMdx,
];

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -31,6 +31,7 @@ export type Project = {
_id: string;
_raw: Local.RawDocumentData;
type: "Project";
published?: boolean | undefined;
title: string;
description: string;
date?: IsoDateTimeString | undefined;

View File

@ -1,7 +1,7 @@
{
"name": "dot-contentlayer",
"description": "This package is auto-generated by Contentlayer",
"version": "0.0.0-KFUTZ636",
"version": "0.0.0-AAEZAM7W",
"exports": {
"./generated": {
"import": "./generated/index.mjs"

2
.env Normal file
View File

@ -0,0 +1,2 @@
UPSTASH_REDIS_REST_URL="https://eu2-leading-tortoise-32227.upstash.io"
UPSTASH_REDIS_REST_TOKEN="AX3jASQgNWE1ZWQ4ZWYtNTUwOC00NzQ3LWEwNjAtZmY4NzQwNzYwMWRiMDlkZTIyMmRiNWVhNDBhM2E2ZWYyZGZlYmQ4ZTk1Zjc="

View File

@ -1,107 +0,0 @@
"use client";
import { ArrowLeft } from "lucide-react";
import Link from "next/link";
import React, { useEffect, useMemo, useRef, useState } from "react";
import { usePathname } from "next/navigation";
type Props = {
project: {
url?: string;
title: string;
description: string;
repository?: string;
};
};
export const Navigation: React.FC<Props> = ({ project }) => {
const pathname = usePathname();
const ref = useRef<HTMLElement>(null);
const [isIntersecting, setIntersecting] = useState(true);
useEffect(() => {
if (!ref.current) return;
const observer = new IntersectionObserver(([entry]) =>
setIntersecting(entry.isIntersecting),
);
observer.observe(ref.current);
return () => observer.disconnect();
}, []);
return (
<header
ref={ref}
className="bg-gradient-to-tl from-black via-zinc-900 to-black"
>
<div
className={`fixed inset-x-0 top-0 z-50 backdrop-blur lg:backdrop-blur-none duration-200 border-b lg:bg-transparent ${
isIntersecting
? "bg-zinc-900/0 border-transparent"
: "bg-white/10 border-zinc-200 lg:border-transparent"
}`}
>
<div className="container flex flex-row-reverse items-center justify-between p-6 mx-auto">
<div className="flex justify-between gap-8">
<Link
target="_blank"
href="https://github.com/chronark/chronark.com"
>
<span
className={`duration-200 hover:font-medium ${
isIntersecting
? " text-zinc-400 hover:text-zinc-100"
: "text-zinc-600 hover:text-zinc-900"
} `}
>
GitHub
</span>
</Link>
</div>
<Link
href="/projects"
className={`duration-200 hover:font-medium ${
isIntersecting
? " text-zinc-400 hover:text-zinc-100"
: "text-zinc-600 hover:text-zinc-900"
} `}
>
<ArrowLeft className="w-6 h-6 " />
</Link>
</div>
</div>
<div>
<div className="relative px-6 lg:px-8">
<div className="max-w-3xl pt-20 pb-16 mx-auto sm:pt-48">
<div>
<h1 className="text-4xl font-bold uppercase text-zinc-100 sm:text-center sm:text-6xl font-display">
{project.title}
</h1>
</div>
</div>
</div>
<div className="flex items-center justify-center gap-4">
{project.url ? (
<Link
target="_blank"
className="px-4 py-2 font-semibold text-right duration-500 border-b border-transparent text-zinc-200 hover:border-zinc-100"
href={project.url}
>
Website
</Link>
) : null}
{project.repository ? (
<Link
target="_blank"
className="px-4 py-2 font-semibold text-left duration-500 border-b border-transparent text-zinc-200 hover:border-zinc-100"
href={`https://github.com/${project.repository}`}
>
Repository
</Link>
) : null}
</div>
</div>
</header>
);
};

43
app/components/card.tsx Normal file
View File

@ -0,0 +1,43 @@
"use client";
import {
motion,
useMotionTemplate,
useMotionValue,
useSpring,
} from "framer-motion";
import { MouseEventHandler, PropsWithChildren } from "react";
export const Card: React.FC<PropsWithChildren> = ({ children }) => {
const mouseX = useSpring(0, { stiffness: 200, damping: 100 });
const mouseY = useSpring(0, { stiffness: 200, damping: 100 });
function onMouseMove({ currentTarget, clientX, clientY }: any) {
const { left, top } = currentTarget.getBoundingClientRect();
mouseX.set(clientX - left);
mouseY.set(clientY - top);
}
let maskImage = useMotionTemplate`radial-gradient(240px at ${mouseX}px ${mouseY}px, white, transparent)`;
let style = { maskImage, WebkitMaskImage: maskImage };
return (
<div
onMouseMove={onMouseMove}
className="overflow-hidden relative duration-700 border rounded-xl hover:bg-zinc-800/30 group md:gap-8 hover:border-zinc-400/50 border-zinc-600 "
>
<div className="pointer-events-none">
<div className="absolute inset-0 z-0 transition duration-1000 [mask-image:linear-gradient(black,transparent)]" />
<motion.div
className="absolute inset-0 z-10 bg-gradient-to-br opacity-100 via-zinc-100/10 transition duration-1000 group-hover:opacity-50 "
style={style}
/>
<motion.div
className="absolute inset-0 z-10 opacity-0 mix-blend-overlay transition duration-1000 group-hover:opacity-100"
style={style}
/>
</div>
{children}
</div>
);
};

View File

@ -20,7 +20,7 @@ const components = {
h2: ({ className, ...props }) => (
<h2
className={clsx(
"mt-10 scroll-m-20 border-b border-b-zinc-200 pb-1 text-3xl font-semibold tracking-tight first:mt-0",
"mt-10 scroll-m-20 border-b border-b-zinc-800 pb-1 text-3xl font-semibold tracking-tight first:mt-0",
className,
)}
{...props}

View File

@ -2,6 +2,7 @@
import { Github, Mail, Twitter } from "lucide-react";
import Link from "next/link";
import { Navigation } from "../components/nav";
import { Card } from "../components/card";
const socials = [
{
@ -25,43 +26,35 @@ const socials = [
];
export default function Example() {
async function submit() {
const res = await fetch("/api/contact", {
method: "POST",
body: JSON.stringify({
name: "John Doe",
email: "",
}),
});
}
return (
<div className=" bg-gradient-to-tl from-zinc-900/0 via-zinc-900 to-zinc-900/0">
<Navigation />
<div className="container flex items-center justify-center min-h-screen px-4 mx-auto">
<div className="grid w-full grid-cols-1 gap-8 mx-auto mt-32 sm:mt-0 sm:grid-cols-3 lg:gap-16">
{socials.map((s) => (
<Link
key={s.href}
href="https://twitter.com/chronark_"
className="relative flex flex-col items-center gap-4 p-8 pb-16 duration-700 border rounded-xl hover:bg-zinc-800/30 group md:gap-8 md:py-24 hover:border-zinc-600 lg:pb-48 border-zinc-700 md:p-16"
>
<span
className="absolute w-px h-2/3 bg-gradient-to-b from-zinc-500 via-zinc-500/50 to-transparent"
aria-hidden="true"
/>
<span className="relative z-10 flex items-center justify-center w-12 h-12 text-sm duration-1000 border rounded-full text-zinc-200 group-hover:text-white group-hover:bg-zinc-900 border-zinc-500 bg-zinc-900 group-hover:border-zinc-200 drop-shadow-orange">
{s.icon}
</span>{" "}
<div className="z-10 flex flex-col items-center">
<span className="text-xl font-medium duration-150 lg:text-3xl text-zinc-200 group-hover:text-white font-display">
{s.handle}
</span>
<span className="mt-4 text-sm text-center duration-1000 text-zinc-400 group-hover:text-zinc-200">
{s.label}
</span>
</div>
</Link>
<Card>
<Link
href={s.href}
target="_blank"
className="p-4 relative flex flex-col items-center gap-4 duration-700 group md:gap-8 md:py-24 lg:pb-48 md:p-16"
>
<span
className="absolute w-px h-2/3 bg-gradient-to-b from-zinc-500 via-zinc-500/50 to-transparent"
aria-hidden="true"
/>
<span className="relative z-10 flex items-center justify-center w-12 h-12 text-sm duration-1000 border rounded-full text-zinc-200 group-hover:text-white group-hover:bg-zinc-900 border-zinc-500 bg-zinc-900 group-hover:border-zinc-200 drop-shadow-orange">
{s.icon}
</span>{" "}
<div className="z-10 flex flex-col items-center">
<span className="text-xl font-medium duration-150 lg:text-3xl text-zinc-200 group-hover:text-white font-display">
{s.handle}
</span>
<span className="mt-4 text-sm text-center duration-1000 text-zinc-400 group-hover:text-zinc-200">
{s.label}
</span>
</div>
</Link>
</Card>
))}
</div>
</div>

View File

@ -1,44 +1,47 @@
import Image from "next/image";
import Link from "next/link";
import "../global.css";
import { Inter, Hanken_Grotesk } from "@next/font/google";
// import font from "@next/font/local";
// const pangea = font({
// src: [
// {
// path: "../public/fonts/PangeaAfrikanTrial-Light.woff2",
// weight: "100",
// style: "normal",
// },
// {
// path: "../public/fonts/PangeaAfrikanTrial-Regular.woff2",
// weight: "300",
// style: "normal",
// },
// {
// path: "../public/fonts/PangeaAfrikanTrial-Medium.woff2",
// weight: "500",
// style: "normal",
// },
// {
// path: "../public/fonts/PangeaAfrikanTrial-SemiBold.woff2",
// weight: "700",
// style: "normal",
// },
// {
// path: "../public/fonts/PangeaAfrikanTrial-Bold.woff2",
// weight: "900",
// style: "normal",
// },
// ],
// variable: "--font-pangea",
// });
import { Metadata } from "next";
export const metadata = {
title: "chronark.com",
description: "The personal website of chronark",
export const metadata: Metadata = {
title: {
default: "chronark.com",
template: "%s | chronark.com",
},
description: "software engineer at Upstash and founder of planetfall.io",
openGraph: {
title: "chronark.com",
description: "software engineer at Upstash and founder of planetfall.io",
url: "https://chronark.com",
siteName: "chronark.com",
images: [
{
url: "https://chronark.com/og.png",
width: 1920,
height: 1080,
},
],
locale: "en-US",
type: "website",
},
robots: {
index: true,
follow: true,
googleBot: {
index: true,
follow: true,
"max-video-preview": -1,
"max-image-preview": "large",
"max-snippet": -1,
},
},
twitter: {
title: "Chronark",
card: "summary_large_image",
},
icons: {
shortcut: "/favicon.png",
},
};
const inter = Inter({
subsets: ["latin"],
variable: "--font-inter",

View File

@ -1,11 +1,8 @@
import Image from "next/image";
import Link from "next/link";
import React from "react";
const navigation = [
// { name: "About", href: "/about" },
{ name: "Projects", href: "/projects" },
// { name: "Blog", href: "/blog" },
{ name: "Contact", href: "/contact" },
];
@ -33,7 +30,7 @@ export default function Home() {
<div className="hidden w-screen h-px animate-glow md:block animate-fade-right bg-gradient-to-r from-zinc-300/0 via-zinc-300/50 to-zinc-300/0" />
<div className="my-16 text-center animate-fade-in">
<h2 className="text-sm text-zinc-500 ">
Hi, I'm building serverless and open source solutions at{" "}
Hi, i'm building serverless and open source solutions at{" "}
<Link
href="https://upstash.com"
className="underline duration-500 hover:text-zinc-300"
@ -42,7 +39,7 @@ export default function Home() {
</Link>
<br />
and{" "}
and working on my startup{" "}
<Link
href="https://planetfall.io"
className="underline duration-500 hover:text-zinc-300"

View File

@ -0,0 +1,113 @@
"use client";
import { ArrowLeft, Github, Twitter } from "lucide-react";
import Link from "next/link";
import React, { useEffect, useMemo, useRef, useState } from "react";
import { usePathname } from "next/navigation";
import Balancer from "react-wrap-balancer";
type Props = {
project: {
url?: string;
title: string;
description: string;
repository?: string;
};
};
export const Header: React.FC<Props> = ({ project }) => {
const pathname = usePathname();
const ref = useRef<HTMLElement>(null);
const [isIntersecting, setIntersecting] = useState(true);
const links: { label: string; href: string }[] = [];
if (project.repository) {
links.push({
label: "GitHub",
href: `https://github.com/${project.repository}`,
});
}
if (project.url) {
links.push({
label: "Live",
href: project.url,
});
}
useEffect(() => {
if (!ref.current) return;
const observer = new IntersectionObserver(([entry]) =>
setIntersecting(entry.isIntersecting),
);
observer.observe(ref.current);
return () => observer.disconnect();
}, []);
return (
<header
ref={ref}
className="relative isolate overflow-hidden bg-gradient-to-tl from-black via-zinc-900 to-black"
>
<div
className={`fixed inset-x-0 top-0 z-50 backdrop-blur lg:backdrop-blur-none duration-200 border-b lg:bg-transparent ${
isIntersecting
? "bg-zinc-900/0 border-transparent"
: "bg-white/10 border-zinc-200 lg:border-transparent"
}`}
>
<div className="container flex flex-row-reverse items-center justify-between p-6 mx-auto">
<div className="flex justify-between gap-8">
<Link target="_blank" href="https://twitter/chronark_">
<Twitter
className={`w-6 h-6 duration-200 hover:font-medium ${
isIntersecting
? " text-zinc-400 hover:text-zinc-100"
: "text-zinc-600 hover:text-zinc-900"
} `}
/>
</Link>
<Link target="_blank" href="https://github.com/chronark">
<Github
className={`w-6 h-6 duration-200 hover:font-medium ${
isIntersecting
? " text-zinc-400 hover:text-zinc-100"
: "text-zinc-600 hover:text-zinc-900"
} `}
/>
</Link>
</div>
<Link
href="/projects"
className={`duration-200 hover:font-medium ${
isIntersecting
? " text-zinc-400 hover:text-zinc-100"
: "text-zinc-600 hover:text-zinc-900"
} `}
>
<ArrowLeft className="w-6 h-6 " />
</Link>
</div>
</div>
<div className="container mx-auto relative isolate overflow-hidden py-24 sm:py-32">
<div className="mx-auto max-w-7xl px-6 lg:px-8 text-center flex flex-col items-center">
<div className="mx-auto max-w-2xl lg:mx-0">
<h1 className="text-4xl font-bold tracking-tight text-white sm:text-6xl">
<Balancer>{project.title}</Balancer>
</h1>
<p className="mt-6 text-lg leading-8 text-zinc-300">
{project.description}
</p>
</div>
<div className="mx-auto mt-10 max-w-2xl lg:mx-0 lg:max-w-none">
<div className="grid grid-cols-1 gap-y-6 gap-x-8 text-base font-semibold leading-7 text-white sm:grid-cols-2 md:flex lg:gap-x-10">
{links.map((link) => (
<Link target="_blank" key={link.label} href={link.href}>
{link.label} <span aria-hidden="true">&rarr;</span>
</Link>
))}
</div>
</div>
</div>
</div>
</header>
);
};

View File

@ -1,24 +1,24 @@
import { notFound } from "next/navigation";
import { allProjects } from "contentlayer/generated";
import { Mdx } from "@/app/components/mdx";
import { Navigation } from "@/app/components/article-nav";
import { Header } from "./header";
import "./mdx.css";
interface PostPageProps {
type Props = {
params: {
slug: string;
};
};
export async function generateStaticParams(): Promise<Props["params"][]> {
return allProjects
.filter((p) => p.published)
.map((p) => ({
slug: p.slug,
}));
}
export async function generateStaticParams(): Promise<
PostPageProps["params"][]
> {
return allProjects.map((p) => ({
slug: p.slug,
}));
}
export default async function PostPage({ params }: PostPageProps) {
export default async function PostPage({ params }: Props) {
const slug = params?.slug;
const project = allProjects.find((project) => project.slug === slug);
@ -27,11 +27,11 @@ export default async function PostPage({ params }: PostPageProps) {
}
return (
<div className="min-h-screen bg-white ">
<Navigation project={project} />
<div className="min-h-screen">
<Header project={project} />
<main className=" bg-zinc-50">
<article className="px-4 py-12 mx-auto prose sm:prose-sm md:prose-md lg:prose-lg text-zinc-600 ">
<main className="bg-zinc-50">
<article className="px-4 py-12 mx-auto prose prose-zinc">
<Mdx code={project.body.code} />
</article>
</main>

27
app/projects/article.tsx Normal file
View File

@ -0,0 +1,27 @@
import type { Project } from "@/.contentlayer/generated";
import Link from "next/link";
export const Article = ({ project }: { project: Project }) => {
return (
<Link href={`/projects/${project.slug}`}>
<article className="p-4 md:p-8">
<span className="text-xs duration-1000 text-zinc-200 group-hover:text-white group-hover:border-zinc-200 drop-shadow-orange">
{project.date ? (
<time dateTime={new Date(project.date).toISOString()}>
{Intl.DateTimeFormat(undefined, { dateStyle: "medium" }).format(
new Date(project.date),
)}
</time>
) : (
<span>SOON</span>
)}
</span>
<h2 className="z-20 text-xl font-medium duration-1000 lg:text-3xl text-zinc-200 group-hover:text-white font-display">
{project.title}
</h2>
<p className="z-20 mt-4 text-sm duration-1000 text-zinc-400 group-hover:text-zinc-200">
{project.description}
</p>
</article>
</Link>
);
};

View File

@ -1,74 +0,0 @@
"use client";
import {
motion,
MotionValue,
useMotionTemplate,
useMotionValue,
} from "framer-motion";
import type { Project } from "contentlayer/generated";
import Link from "next/link";
const Flashlight: React.FC<{
x: MotionValue<number>;
y: MotionValue<number>;
}> = ({ x, y }) => {
let maskImage = useMotionTemplate`radial-gradient(320px at ${x}px ${y}px, white, transparent)`;
let style = { maskImage, WebkitMaskImage: maskImage };
return (
<div className="pointer-events-none">
<div className="absolute inset-0 z-0 transition duration-300 [mask-image:linear-gradient(black,transparent)] group-hover:opacity-50" />
<motion.div
className="absolute inset-0 z-10 bg-gradient-to-br opacity-100 via-zinc-100/10 transition duration-1000 group-hover:opacity-50 "
style={style}
/>
<motion.div
className="absolute inset-0 z-10 opacity-0 mix-blend-overlay transition duration-1000 group-hover:opacity-100"
style={style}
/>
</div>
);
};
export const Card: React.FC<{ project: Project }> = ({ project }) => {
const mouseX = useMotionValue(0); //randomBetween(rect?.left, rect?.right));
const mouseY = useMotionValue(0); //randomBetween(rect?.top, rect?.bottom));
function onMouseMove({ currentTarget, clientX, clientY }: any) {
const { left, top } = currentTarget.getBoundingClientRect();
mouseX.set(clientX - left);
mouseY.set(clientY - top);
}
return (
<Link
key={project._id}
onMouseMove={onMouseMove}
href={`/projects/${project.slug}`}
// className="group relative flex rounded-2xl bg-zinc-50 transition-shadow hover:shadow-md hover:shadow-zinc-900/5 dark:bg-white/2.5 dark:hover:shadow-black/5"
className="overflow-hidden relative p-4 duration-700 border rounded-xl hover:bg-zinc-800/30 group md:gap-8 hover:border-zinc-600 border-zinc-600 md:p-8"
>
<Flashlight x={mouseX} y={mouseY} />
<span className="text-xs duration-1000 text-zinc-200 group-hover:text-white group-hover:border-zinc-200 drop-shadow-orange">
{project.date ? (
<time dateTime={new Date(project.date).toISOString()}>
{Intl.DateTimeFormat(undefined, { dateStyle: "medium" }).format(
new Date(project.date),
)}
</time>
) : (
<span>SOON</span>
)}
</span>
<h2 className="z-20 text-xl font-medium duration-1000 lg:text-3xl text-zinc-200 group-hover:text-white font-display">
{project.title}
</h2>
<p className="z-20 mt-4 text-sm duration-1000 text-zinc-400 group-hover:text-zinc-200">
{project.description}
</p>
</Link>
);
};

View File

@ -2,7 +2,8 @@ import Link from "next/link";
import React from "react";
import { allProjects } from "contentlayer/generated";
import { Navigation } from "../components/nav";
import { Card } from "./card";
import { Card } from "../components/card";
import { Article } from "./article";
export default function ProjectsPage() {
const featured = allProjects.find(
@ -11,6 +12,7 @@ export default function ProjectsPage() {
const top2 = allProjects.find((project) => project.slug === "envshare")!;
const top3 = allProjects.find((project) => project.slug === "qstash")!;
const sorted = allProjects
.filter((p) => p.published)
.filter(
(project) =>
project.slug !== featured.slug &&
@ -24,7 +26,7 @@ export default function ProjectsPage() {
);
return (
<div className="relative">
<div className="relative pb-16">
<Navigation />
<div className="px-6 pt-16 mx-auto space-y-8 max-w-7xl lg:px-8 md:space-y-16 md:pt-24 lg:pt-32">
<div className="max-w-2xl mx-auto lg:mx-0">
@ -38,39 +40,46 @@ export default function ProjectsPage() {
<div className="w-full h-px bg-zinc-800" />
<div className="grid grid-cols-1 gap-8 mx-auto lg:grid-cols-2 ">
<article className="w-full max-w-2xl mx-auto lg:mx-0 lg:max-w-lg">
<div className="text-xs text-zinc-100">
{featured.date ? (
<time dateTime={new Date(featured.date).toISOString()}>
{Intl.DateTimeFormat(undefined, {
dateStyle: "medium",
}).format(new Date(featured.date))}
</time>
) : (
<span>SOON</span>
)}
</div>
<h2
id="featured-post"
className="mt-4 text-3xl font-bold tracking-tight text-zinc-100 group-hover:text-white sm:text-4xl font-display"
>
{featured.title}
</h2>
<p className="mt-4 leading-8 duration-150 text-zinc-400 group-hover:text-zinc-300">
{featured.description}
</p>
<div className="mt-4">
<Link
className="text-zinc-200 hover:text-zinc-50"
href={`/projects/${featured.slug}`}
>
Read more <span aria-hidden="true">&rarr;</span>
</Link>
</div>
</article>
<Card>
<Link href={`/projects/${featured.slug}`}>
<article className="relative h-full w-full max-w-2xl mx-auto lg:mx-0 lg:max-w-lg p-4 md:p-8">
<div className="text-xs text-zinc-100">
{featured.date ? (
<time dateTime={new Date(featured.date).toISOString()}>
{Intl.DateTimeFormat(undefined, {
dateStyle: "medium",
}).format(new Date(featured.date))}
</time>
) : (
<span>SOON</span>
)}
</div>
<h2
id="featured-post"
className="mt-4 text-3xl font-bold tracking-tight text-zinc-100 group-hover:text-white sm:text-4xl font-display"
>
{featured.title}
</h2>
<p className="mt-4 leading-8 duration-150 text-zinc-400 group-hover:text-zinc-300">
{featured.description}
</p>
<div className="absolute bottom-4 md:bottom-8">
<Link
className="text-zinc-200 hover:text-zinc-50"
href={`/projects/${featured.slug}`}
>
Read more <span aria-hidden="true">&rarr;</span>
</Link>
</div>
</article>
</Link>
</Card>
<div className="flex flex-col w-full max-w-2xl gap-8 pt-12 mx-auto border-t border-gray-900/10 sm:pt-16 lg:mx-0 lg:max-w-none lg:border-t-0 lg:pt-0">
{[top2, top3].map((project) => (
<Card key={project.slug} project={project} />
<Card key={project.slug}>
<Article project={project} />
</Card>
))}
</div>
</div>
@ -81,21 +90,27 @@ export default function ProjectsPage() {
{sorted
.filter((_, i) => i % 3 === 0)
.map((project) => (
<Card key={project.slug} project={project} />
<Card key={project.slug}>
<Article project={project} />
</Card>
))}
</div>
<div className="grid grid-cols-1 gap-4">
{sorted
.filter((_, i) => i % 3 === 1)
.map((project) => (
<Card key={project.slug} project={project} />
<Card key={project.slug}>
<Article project={project} />
</Card>
))}
</div>
<div className="grid grid-cols-1 gap-4">
{sorted
.filter((_, i) => i % 3 === 2)
.map((project) => (
<Card key={project.slug} project={project} />
<Card key={project.slug}>
<Article project={project} />
</Card>
))}
</div>
</div>

View File

@ -3,6 +3,7 @@ title: "@chronark/access"
description: A minimal library for access control. It is designed to be used together with opaque access tokens by providing a simple interface to define roles with different access permissions and verifying requests to resources.
repository: chronark/access
date: "2022-11-13"
published: true
---
A minimal library for access control. It is designed to be used together with opaque access tokens by providing a simple interface to define roles with different access permissions and verifying requests to resources.

View File

@ -4,7 +4,7 @@ description: EnvShare is a simple tool to share environment variables securely.
date: "2023-01-16"
url: https://envshare.dev
repository: chronark/envshare
published: true
---
EnvShare is a simple tool to share environment variables securely. It uses

View File

@ -1,10 +1,12 @@
---
title: planetfall.io
description: I'm building a SAAS, that provides global latency monitoring for your APIs and websites from edge locations around the world. Have you ever wondered how fast your API is in any part of the world? Planetfall allows you to find out and monitor it continuously.
description: I'm building a SAAS providing global latency monitoring for your APIs and websites from edge locations around the world. Have you ever wondered how fast your API is in any part of the world? Planetfall allows you to find out and monitor it continuously.
date: "2023-04-01"
url: https://planetfall.io
published: true
---
I'm building a SAAS, that provides global latency monitoring for your APIs and websites from edge locations around the world. Have you ever wondered how fast your API is in any part of the world? Planetfall allows you to find out and monitor it continuously.
Planetfall is a SaaS platform that provides global latency monitoring and synthetic monitoring for APIs. With over 60 regions to monitor from, customers can gain insights into the true performance of their API by checking latency from around the world.
Planetfall offers custom timeouts, threshold notifications, and real-time alerts for potential performance issues. Additionally, customers can create custom status pages to share with their customers, which can display availability and latency for every region. Planetfall offers a free tier that includes 100k checks per month and scales as customers grow. Overall, Planetfall helps customers stay in control of their API's performance, improve communication with their customers, and build trust.

View File

@ -3,6 +3,7 @@ title: QStash
description: QStash is a fully managed serverless queue and messaging service designed for the serverless era.
date: "2022-07-18"
url: https://upstash.com/qstash
published: true
---

View File

@ -4,6 +4,7 @@ description: A Terraform provider for Vercel. It has been deprecated it when Ver
date: "2021-03-16"
repository: chronark/terraform-provider-vercel
url: https://registry.terraform.io/providers/chronark/vercel/latest
published: true
---

View File

@ -3,7 +3,6 @@ title: Upstash Auth Analytics
description: A library to record and analyse Auth.js user behaviour
url: https://console.upstash.com/ratelimit
repository: upstash/auth-analytics
---
TODO:

View File

@ -4,6 +4,7 @@ description: A CLI to provision and manage Upstash resources, including Redis an
date: "2022-05-16"
url: https://upstash.com/cli
repository: upstash/cli
published: true
---

View File

@ -4,6 +4,7 @@ description: Low level utilities to build analytics tools on top of Redis.
date: "2023-02-13"
url: https://console.upstash.com/ratelimit
repository: upstash/core-analytics
published: true
---

View File

@ -4,6 +4,7 @@ description: Featues flags for your edge functions.
date: "2022-12-12"
url: https://upstash.com/edge-flags
repository: upstash/edge-flags
published: true
---

View File

@ -4,6 +4,7 @@ description: A fully typed Kafka client built for Upstash Kafka and HTTP, perfec
date: "2022-01-08"
url: https://upstash.com/kafka
repository: upstash/upstash-kafka
published: true
---

View File

@ -4,6 +4,7 @@ description: A typescript client and consumer for QStash.
date: "2022-07-18"
url: https://upstash.com/qstash
repository: upstash/sdk-qstash-ts
published: true
---
TODO:

View File

@ -4,6 +4,7 @@ description: Near realtime analytics for your ratelimits. Integrated into the @u
repository: upstash/ratelimit
date: "2023-03-01"
website: https://console.upstash.com/ratelimit
published: true
---

View File

@ -4,6 +4,7 @@ description: Ratelimiting library for serverless and edge runtimes. Built on top
date: "2022-06-06"
url: https://upstash.com/ratelimit
repository: upstash/ratelimit
published: true
---

View File

@ -4,6 +4,7 @@ description: A CLI React component to interact with Upstash Redis databases.
date: "2023-02-05"
url: https://upstash.com
repository: upstash/react-ui
published: true
---

View File

@ -4,6 +4,7 @@ description: A fully typed Redis client built for Upstash Redis and HTTP, perfec
date: "2022-03-14"
url: https://upstash.com/redis
repository: upstash/upstash-redis
published: true
---

View File

@ -2,7 +2,7 @@
title: Upstash Web Analytics
description: A library to record and analyse web page traffic and user behaviour
repository: upstash/web-analytics
published: true
---
TODO:

View File

@ -22,6 +22,9 @@ export const Project = defineDocumentType(() => ({
contentType: "mdx",
fields: {
published: {
type: "boolean",
},
title: {
type: "string",
required: true,

41
middleware.ts Normal file
View File

@ -0,0 +1,41 @@
import { Redis } from "@upstash/redis";
import { NextRequest, NextResponse, NextFetchEvent } from "next/server";
const redis = Redis.fromEnv();
export const config = {
runtime: "experimental-edge",
matcher: "/projects/:slug*",
};
export default async function middleware(
req: NextRequest,
evt: NextFetchEvent,
): Promise<NextResponse> {
const path = new URL(req.url).pathname;
console.log({ path });
evt.waitUntil(incrementPageView(req.ip, path));
return NextResponse.next();
}
async function incrementPageView(
identifier: string | undefined,
pathname: string,
): Promise<void> {
if (identifier) {
// deduplicate the ip for each slug
const isNew = await redis.set(
["deduplicate", identifier, pathname].join(":"),
true,
{
nx: true,
ex: 24 * 60 * 60,
},
);
if (!isNew) {
return;
}
}
await redis.incr(["pageviews", pathname].join(":"));
}

View File

@ -11,18 +11,20 @@
"dependencies": {
"@next/font": "^13.2.1",
"@next/mdx": "^13.2.1",
"@types/node": "18.15.5",
"@types/react": "18.0.28",
"@types/node": "18.15.10",
"@types/react": "18.0.29",
"@types/react-dom": "18.0.11",
"@upstash/redis": "^1.20.1",
"@vercel/analytics": "^0.1.10",
"contentlayer": "^0.3.0",
"framer-motion": "^10.8.5",
"framer-motion": "^10.9.1",
"lucide-react": "^0.127.0",
"markdown-wasm": "^1.2.0",
"next": "13.2.4",
"next-contentlayer": "^0.3.0",
"react": "18.2.0",
"react-dom": "18.2.0",
"react-wrap-balancer": "^0.4.0",
"rehype-autolink-headings": "^6.1.1",
"rehype-pretty-code": "^0.9.4",
"rehype-slug": "^5.1.0",
@ -35,7 +37,7 @@
"@tailwindcss/typography": "^0.5.9",
"autoprefixer": "^10.4.13",
"postcss": "^8.4.21",
"postcss-nesting": "^11.2.1",
"postcss-nesting": "^11.2.2",
"rome": "^11.0.0",
"tailwindcss": "^3.2.7",
"tailwindcss-debug-screens": "^2.2.1"

310
pnpm-lock.yaml generated
View File

@ -6,21 +6,23 @@ specifiers:
'@opentelemetry/api': ^1.4.1
'@tailwindcss/line-clamp': ^0.4.2
'@tailwindcss/typography': ^0.5.9
'@types/node': 18.15.5
'@types/react': 18.0.28
'@types/node': 18.15.10
'@types/react': 18.0.29
'@types/react-dom': 18.0.11
'@upstash/redis': ^1.20.1
'@vercel/analytics': ^0.1.10
autoprefixer: ^10.4.13
contentlayer: ^0.3.0
framer-motion: ^10.8.5
framer-motion: ^10.9.1
lucide-react: ^0.127.0
markdown-wasm: ^1.2.0
next: 13.2.4
next-contentlayer: ^0.3.0
postcss: ^8.4.21
postcss-nesting: ^11.2.1
postcss-nesting: ^11.2.2
react: 18.2.0
react-dom: 18.2.0
react-wrap-balancer: ^0.4.0
rehype-autolink-headings: ^6.1.1
rehype-pretty-code: ^0.9.4
rehype-slug: ^5.1.0
@ -33,18 +35,20 @@ specifiers:
dependencies:
'@next/font': 13.2.4
'@next/mdx': 13.2.4
'@types/node': 18.15.5
'@types/react': 18.0.28
'@types/node': 18.15.10
'@types/react': 18.0.29
'@types/react-dom': 18.0.11
'@upstash/redis': 1.20.1
'@vercel/analytics': 0.1.11_react@18.2.0
contentlayer: 0.3.0_qmecdceofcvmurqim4ud7myj3a
framer-motion: 10.8.5_biqbaboplfbrettd7655fr4n2y
contentlayer: 0.3.0_e24fifms7lyt2dudodzemqbuwu
framer-motion: 10.9.1_biqbaboplfbrettd7655fr4n2y
lucide-react: 0.127.0_react@18.2.0
markdown-wasm: 1.2.0
next: 13.2.4_756ubwvsgazzkcxtigvs4yqbci
next-contentlayer: 0.3.0_fwtlsludu3mxobm5kzti3ccmlm
next-contentlayer: 0.3.0_4jrksbpguxv75tdufwflb7i7k4
react: 18.2.0
react-dom: 18.2.0_react@18.2.0
react-wrap-balancer: 0.4.0_react@18.2.0
rehype-autolink-headings: 6.1.1
rehype-pretty-code: 0.9.4_shiki@0.14.1
rehype-slug: 5.1.0
@ -57,7 +61,7 @@ devDependencies:
'@tailwindcss/typography': 0.5.9_tailwindcss@3.2.7
autoprefixer: 10.4.14_postcss@8.4.21
postcss: 8.4.21
postcss-nesting: 11.2.1_postcss@8.4.21
postcss-nesting: 11.2.2_postcss@8.4.21
rome: 11.0.0
tailwindcss: 3.2.7_postcss@8.4.21
tailwindcss-debug-screens: 2.2.1_tailwindcss@3.2.7
@ -71,10 +75,10 @@ packages:
regenerator-runtime: 0.13.11
dev: false
/@contentlayer/cli/0.3.0_qmecdceofcvmurqim4ud7myj3a:
/@contentlayer/cli/0.3.0_e24fifms7lyt2dudodzemqbuwu:
resolution: {integrity: sha512-Mqb6NlIKINt2qsPKft+o8m5tJhJXVgVSd0zP1BH+CQRmvR/zwTT3maz1bDCPHBYGKgGCQKtvgM66IjvH+dmC6Q==}
dependencies:
'@contentlayer/core': 0.3.0_qmecdceofcvmurqim4ud7myj3a
'@contentlayer/core': 0.3.0_e24fifms7lyt2dudodzemqbuwu
'@contentlayer/utils': 0.3.0
clipanion: 3.2.0_typanion@3.12.1
typanion: 3.12.1
@ -85,10 +89,10 @@ packages:
- supports-color
dev: false
/@contentlayer/client/0.3.0_qmecdceofcvmurqim4ud7myj3a:
/@contentlayer/client/0.3.0_e24fifms7lyt2dudodzemqbuwu:
resolution: {integrity: sha512-yzDYiZtqOJwWrsykieA1LMnhKbaYcJhAy7s8Xs7zU5wFfyBTO258gvmK5dVi4LuzmOOPVMJn6FpEofT/RAKVtg==}
dependencies:
'@contentlayer/core': 0.3.0_qmecdceofcvmurqim4ud7myj3a
'@contentlayer/core': 0.3.0_e24fifms7lyt2dudodzemqbuwu
transitivePeerDependencies:
- '@effect-ts/otel-node'
- esbuild
@ -96,7 +100,7 @@ packages:
- supports-color
dev: false
/@contentlayer/core/0.3.0_qmecdceofcvmurqim4ud7myj3a:
/@contentlayer/core/0.3.0_e24fifms7lyt2dudodzemqbuwu:
resolution: {integrity: sha512-5cL4W0nK9kNqxgBkIgauUko0SRAHf8oPoxRhdsSPQ7FSCgZGz2crMeSJOFmj3a3govh863/mKhXfkoUJBoDgnA==}
peerDependencies:
esbuild: 0.17.x
@ -110,10 +114,10 @@ packages:
'@contentlayer/utils': 0.3.0
camel-case: 4.1.2
comment-json: 4.2.3
esbuild: 0.17.12
esbuild: 0.17.14
gray-matter: 4.0.3
markdown-wasm: 1.2.0
mdx-bundler: 9.2.1_esbuild@0.17.12
mdx-bundler: 9.2.1_esbuild@0.17.14
rehype-stringify: 9.0.3
remark-frontmatter: 4.0.1
remark-parse: 10.0.1
@ -126,10 +130,10 @@ packages:
- supports-color
dev: false
/@contentlayer/source-files/0.3.0_qmecdceofcvmurqim4ud7myj3a:
/@contentlayer/source-files/0.3.0_e24fifms7lyt2dudodzemqbuwu:
resolution: {integrity: sha512-6crNuRdWGYFec0Kn/DpbrzpOu8bttFmOmOpX1HIYQz4iPisg+8biybLBiNU7Y6aCUjEZLOnM7AaHpMFvhrYWsw==}
dependencies:
'@contentlayer/core': 0.3.0_qmecdceofcvmurqim4ud7myj3a
'@contentlayer/core': 0.3.0_e24fifms7lyt2dudodzemqbuwu
'@contentlayer/utils': 0.3.0
chokidar: 3.5.3
fast-glob: 3.2.12
@ -147,11 +151,11 @@ packages:
- supports-color
dev: false
/@contentlayer/source-remote-files/0.3.0_qmecdceofcvmurqim4ud7myj3a:
/@contentlayer/source-remote-files/0.3.0_e24fifms7lyt2dudodzemqbuwu:
resolution: {integrity: sha512-4PnaK5cfQiduMUEO6nzqsD4ttD5RG4ffcyeSp5MLhpU0DTEZcfGXFRO777ddEI8PZ0/NJuhfz9MGbdO90QYlsw==}
dependencies:
'@contentlayer/core': 0.3.0_qmecdceofcvmurqim4ud7myj3a
'@contentlayer/source-files': 0.3.0_qmecdceofcvmurqim4ud7myj3a
'@contentlayer/core': 0.3.0_e24fifms7lyt2dudodzemqbuwu
'@contentlayer/source-files': 0.3.0_e24fifms7lyt2dudodzemqbuwu
'@contentlayer/utils': 0.3.0
transitivePeerDependencies:
- '@effect-ts/otel-node'
@ -192,14 +196,12 @@ packages:
type-fest: 3.6.1
dev: false
/@csstools/selector-specificity/2.1.1_wajs5nedgkikc5pcuwett7legi:
resolution: {integrity: sha512-jwx+WCqszn53YHOfvFMJJRd/B2GqkCBt+1MJSG6o5/s8+ytHMvDZXsJgUEWLk12UnLd7HYKac4BYU5i/Ron1Cw==}
/@csstools/selector-specificity/2.2.0_laljekdltgzr3kfi7r4exvsr5a:
resolution: {integrity: sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==}
engines: {node: ^14 || ^16 || >=18}
peerDependencies:
postcss: ^8.4
postcss-selector-parser: ^6.0.10
dependencies:
postcss: 8.4.21
postcss-selector-parser: 6.0.11
dev: true
@ -274,22 +276,22 @@ packages:
dev: false
optional: true
/@esbuild-plugins/node-resolve/0.1.4_esbuild@0.17.12:
/@esbuild-plugins/node-resolve/0.1.4_esbuild@0.17.14:
resolution: {integrity: sha512-haFQ0qhxEpqtWWY0kx1Y5oE3sMyO1PcoSiWEPrAw6tm/ZOOLXjSs6Q+v1v9eyuVF0nNt50YEvrcrvENmyoMv5g==}
peerDependencies:
esbuild: '*'
dependencies:
'@types/resolve': 1.20.2
debug: 4.3.4
esbuild: 0.17.12
esbuild: 0.17.14
escape-string-regexp: 4.0.0
resolve: 1.22.1
transitivePeerDependencies:
- supports-color
dev: false
/@esbuild/android-arm/0.17.12:
resolution: {integrity: sha512-E/sgkvwoIfj4aMAPL2e35VnUJspzVYl7+M1B2cqeubdBhADV4uPon0KCc8p2G+LqSJ6i8ocYPCqY3A4GGq0zkQ==}
/@esbuild/android-arm/0.17.14:
resolution: {integrity: sha512-0CnlwnjDU8cks0yJLXfkaU/uoLyRf9VZJs4p1PskBr2AlAHeEsFEwJEo0of/Z3g+ilw5mpyDwThlxzNEIxOE4g==}
engines: {node: '>=12'}
cpu: [arm]
os: [android]
@ -297,8 +299,8 @@ packages:
dev: false
optional: true
/@esbuild/android-arm64/0.17.12:
resolution: {integrity: sha512-WQ9p5oiXXYJ33F2EkE3r0FRDFVpEdcDiwNX3u7Xaibxfx6vQE0Sb8ytrfQsA5WO6kDn6mDfKLh6KrPBjvkk7xA==}
/@esbuild/android-arm64/0.17.14:
resolution: {integrity: sha512-eLOpPO1RvtsP71afiFTvS7tVFShJBCT0txiv/xjFBo5a7R7Gjw7X0IgIaFoLKhqXYAXhahoXm7qAmRXhY4guJg==}
engines: {node: '>=12'}
cpu: [arm64]
os: [android]
@ -306,8 +308,8 @@ packages:
dev: false
optional: true
/@esbuild/android-x64/0.17.12:
resolution: {integrity: sha512-m4OsaCr5gT+se25rFPHKQXARMyAehHTQAz4XX1Vk3d27VtqiX0ALMBPoXZsGaB6JYryCLfgGwUslMqTfqeLU0w==}
/@esbuild/android-x64/0.17.14:
resolution: {integrity: sha512-nrfQYWBfLGfSGLvRVlt6xi63B5IbfHm3tZCdu/82zuFPQ7zez4XjmRtF/wIRYbJQ/DsZrxJdEvYFE67avYXyng==}
engines: {node: '>=12'}
cpu: [x64]
os: [android]
@ -315,8 +317,8 @@ packages:
dev: false
optional: true
/@esbuild/darwin-arm64/0.17.12:
resolution: {integrity: sha512-O3GCZghRIx+RAN0NDPhyyhRgwa19MoKlzGonIb5hgTj78krqp9XZbYCvFr9N1eUxg0ZQEpiiZ4QvsOQwBpP+lg==}
/@esbuild/darwin-arm64/0.17.14:
resolution: {integrity: sha512-eoSjEuDsU1ROwgBH/c+fZzuSyJUVXQTOIN9xuLs9dE/9HbV/A5IqdXHU1p2OfIMwBwOYJ9SFVGGldxeRCUJFyw==}
engines: {node: '>=12'}
cpu: [arm64]
os: [darwin]
@ -324,8 +326,8 @@ packages:
dev: false
optional: true
/@esbuild/darwin-x64/0.17.12:
resolution: {integrity: sha512-5D48jM3tW27h1qjaD9UNRuN+4v0zvksqZSPZqeSWggfMlsVdAhH3pwSfQIFJwcs9QJ9BRibPS4ViZgs3d2wsCA==}
/@esbuild/darwin-x64/0.17.14:
resolution: {integrity: sha512-zN0U8RWfrDttdFNkHqFYZtOH8hdi22z0pFm0aIJPsNC4QQZv7je8DWCX5iA4Zx6tRhS0CCc0XC2m7wKsbWEo5g==}
engines: {node: '>=12'}
cpu: [x64]
os: [darwin]
@ -333,8 +335,8 @@ packages:
dev: false
optional: true
/@esbuild/freebsd-arm64/0.17.12:
resolution: {integrity: sha512-OWvHzmLNTdF1erSvrfoEBGlN94IE6vCEaGEkEH29uo/VoONqPnoDFfShi41Ew+yKimx4vrmmAJEGNoyyP+OgOQ==}
/@esbuild/freebsd-arm64/0.17.14:
resolution: {integrity: sha512-z0VcD4ibeZWVQCW1O7szaLxGsx54gcCnajEJMdYoYjLiq4g1jrP2lMq6pk71dbS5+7op/L2Aod+erw+EUr28/A==}
engines: {node: '>=12'}
cpu: [arm64]
os: [freebsd]
@ -342,8 +344,8 @@ packages:
dev: false
optional: true
/@esbuild/freebsd-x64/0.17.12:
resolution: {integrity: sha512-A0Xg5CZv8MU9xh4a+7NUpi5VHBKh1RaGJKqjxe4KG87X+mTjDE6ZvlJqpWoeJxgfXHT7IMP9tDFu7IZ03OtJAw==}
/@esbuild/freebsd-x64/0.17.14:
resolution: {integrity: sha512-hd9mPcxfTgJlolrPlcXkQk9BMwNBvNBsVaUe5eNUqXut6weDQH8whcNaKNF2RO8NbpT6GY8rHOK2A9y++s+ehw==}
engines: {node: '>=12'}
cpu: [x64]
os: [freebsd]
@ -351,8 +353,8 @@ packages:
dev: false
optional: true
/@esbuild/linux-arm/0.17.12:
resolution: {integrity: sha512-WsHyJ7b7vzHdJ1fv67Yf++2dz3D726oO3QCu8iNYik4fb5YuuReOI9OtA+n7Mk0xyQivNTPbl181s+5oZ38gyA==}
/@esbuild/linux-arm/0.17.14:
resolution: {integrity: sha512-BNTl+wSJ1omsH8s3TkQmIIIQHwvwJrU9u1ggb9XU2KTVM4TmthRIVyxSp2qxROJHhZuW/r8fht46/QE8hU8Qvg==}
engines: {node: '>=12'}
cpu: [arm]
os: [linux]
@ -360,8 +362,8 @@ packages:
dev: false
optional: true
/@esbuild/linux-arm64/0.17.12:
resolution: {integrity: sha512-cK3AjkEc+8v8YG02hYLQIQlOznW+v9N+OI9BAFuyqkfQFR+DnDLhEM5N8QRxAUz99cJTo1rLNXqRrvY15gbQUg==}
/@esbuild/linux-arm64/0.17.14:
resolution: {integrity: sha512-FhAMNYOq3Iblcj9i+K0l1Fp/MHt+zBeRu/Qkf0LtrcFu3T45jcwB6A1iMsemQ42vR3GBhjNZJZTaCe3VFPbn9g==}
engines: {node: '>=12'}
cpu: [arm64]
os: [linux]
@ -369,8 +371,8 @@ packages:
dev: false
optional: true
/@esbuild/linux-ia32/0.17.12:
resolution: {integrity: sha512-jdOBXJqcgHlah/nYHnj3Hrnl9l63RjtQ4vn9+bohjQPI2QafASB5MtHAoEv0JQHVb/xYQTFOeuHnNYE1zF7tYw==}
/@esbuild/linux-ia32/0.17.14:
resolution: {integrity: sha512-91OK/lQ5y2v7AsmnFT+0EyxdPTNhov3y2CWMdizyMfxSxRqHazXdzgBKtlmkU2KYIc+9ZK3Vwp2KyXogEATYxQ==}
engines: {node: '>=12'}
cpu: [ia32]
os: [linux]
@ -378,8 +380,8 @@ packages:
dev: false
optional: true
/@esbuild/linux-loong64/0.17.12:
resolution: {integrity: sha512-GTOEtj8h9qPKXCyiBBnHconSCV9LwFyx/gv3Phw0pa25qPYjVuuGZ4Dk14bGCfGX3qKF0+ceeQvwmtI+aYBbVA==}
/@esbuild/linux-loong64/0.17.14:
resolution: {integrity: sha512-vp15H+5NR6hubNgMluqqKza85HcGJgq7t6rMH7O3Y6ApiOWPkvW2AJfNojUQimfTp6OUrACUXfR4hmpcENXoMQ==}
engines: {node: '>=12'}
cpu: [loong64]
os: [linux]
@ -387,8 +389,8 @@ packages:
dev: false
optional: true
/@esbuild/linux-mips64el/0.17.12:
resolution: {integrity: sha512-o8CIhfBwKcxmEENOH9RwmUejs5jFiNoDw7YgS0EJTF6kgPgcqLFjgoc5kDey5cMHRVCIWc6kK2ShUePOcc7RbA==}
/@esbuild/linux-mips64el/0.17.14:
resolution: {integrity: sha512-90TOdFV7N+fgi6c2+GO9ochEkmm9kBAKnuD5e08GQMgMINOdOFHuYLPQ91RYVrnWwQ5683sJKuLi9l4SsbJ7Hg==}
engines: {node: '>=12'}
cpu: [mips64el]
os: [linux]
@ -396,8 +398,8 @@ packages:
dev: false
optional: true
/@esbuild/linux-ppc64/0.17.12:
resolution: {integrity: sha512-biMLH6NR/GR4z+ap0oJYb877LdBpGac8KfZoEnDiBKd7MD/xt8eaw1SFfYRUeMVx519kVkAOL2GExdFmYnZx3A==}
/@esbuild/linux-ppc64/0.17.14:
resolution: {integrity: sha512-NnBGeoqKkTugpBOBZZoktQQ1Yqb7aHKmHxsw43NddPB2YWLAlpb7THZIzsRsTr0Xw3nqiPxbA1H31ZMOG+VVPQ==}
engines: {node: '>=12'}
cpu: [ppc64]
os: [linux]
@ -405,8 +407,8 @@ packages:
dev: false
optional: true
/@esbuild/linux-riscv64/0.17.12:
resolution: {integrity: sha512-jkphYUiO38wZGeWlfIBMB72auOllNA2sLfiZPGDtOBb1ELN8lmqBrlMiucgL8awBw1zBXN69PmZM6g4yTX84TA==}
/@esbuild/linux-riscv64/0.17.14:
resolution: {integrity: sha512-0qdlKScLXA8MGVy21JUKvMzCYWovctuP8KKqhtE5A6IVPq4onxXhSuhwDd2g5sRCzNDlDjitc5sX31BzDoL5Fw==}
engines: {node: '>=12'}
cpu: [riscv64]
os: [linux]
@ -414,8 +416,8 @@ packages:
dev: false
optional: true
/@esbuild/linux-s390x/0.17.12:
resolution: {integrity: sha512-j3ucLdeY9HBcvODhCY4b+Ds3hWGO8t+SAidtmWu/ukfLLG/oYDMaA+dnugTVAg5fnUOGNbIYL9TOjhWgQB8W5g==}
/@esbuild/linux-s390x/0.17.14:
resolution: {integrity: sha512-Hdm2Jo1yaaOro4v3+6/zJk6ygCqIZuSDJHdHaf8nVH/tfOuoEX5Riv03Ka15LmQBYJObUTNS1UdyoMk0WUn9Ww==}
engines: {node: '>=12'}
cpu: [s390x]
os: [linux]
@ -423,8 +425,8 @@ packages:
dev: false
optional: true
/@esbuild/linux-x64/0.17.12:
resolution: {integrity: sha512-uo5JL3cgaEGotaqSaJdRfFNSCUJOIliKLnDGWaVCgIKkHxwhYMm95pfMbWZ9l7GeW9kDg0tSxcy9NYdEtjwwmA==}
/@esbuild/linux-x64/0.17.14:
resolution: {integrity: sha512-8KHF17OstlK4DuzeF/KmSgzrTWQrkWj5boluiiq7kvJCiQVzUrmSkaBvcLB2UgHpKENO2i6BthPkmUhNDaJsVw==}
engines: {node: '>=12'}
cpu: [x64]
os: [linux]
@ -432,8 +434,8 @@ packages:
dev: false
optional: true
/@esbuild/netbsd-x64/0.17.12:
resolution: {integrity: sha512-DNdoRg8JX+gGsbqt2gPgkgb00mqOgOO27KnrWZtdABl6yWTST30aibGJ6geBq3WM2TIeW6COs5AScnC7GwtGPg==}
/@esbuild/netbsd-x64/0.17.14:
resolution: {integrity: sha512-nVwpqvb3yyXztxIT2+VsxJhB5GCgzPdk1n0HHSnchRAcxqKO6ghXwHhJnr0j/B+5FSyEqSxF4q03rbA2fKXtUQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [netbsd]
@ -441,8 +443,8 @@ packages:
dev: false
optional: true
/@esbuild/openbsd-x64/0.17.12:
resolution: {integrity: sha512-aVsENlr7B64w8I1lhHShND5o8cW6sB9n9MUtLumFlPhG3elhNWtE7M1TFpj3m7lT3sKQUMkGFjTQBrvDDO1YWA==}
/@esbuild/openbsd-x64/0.17.14:
resolution: {integrity: sha512-1RZ7uQQ9zcy/GSAJL1xPdN7NDdOOtNEGiJalg/MOzeakZeTrgH/DoCkbq7TaPDiPhWqnDF+4bnydxRqQD7il6g==}
engines: {node: '>=12'}
cpu: [x64]
os: [openbsd]
@ -450,8 +452,8 @@ packages:
dev: false
optional: true
/@esbuild/sunos-x64/0.17.12:
resolution: {integrity: sha512-qbHGVQdKSwi0JQJuZznS4SyY27tYXYF0mrgthbxXrZI3AHKuRvU+Eqbg/F0rmLDpW/jkIZBlCO1XfHUBMNJ1pg==}
/@esbuild/sunos-x64/0.17.14:
resolution: {integrity: sha512-nqMjDsFwv7vp7msrwWRysnM38Sd44PKmW8EzV01YzDBTcTWUpczQg6mGao9VLicXSgW/iookNK6AxeogNVNDZA==}
engines: {node: '>=12'}
cpu: [x64]
os: [sunos]
@ -459,8 +461,8 @@ packages:
dev: false
optional: true
/@esbuild/win32-arm64/0.17.12:
resolution: {integrity: sha512-zsCp8Ql+96xXTVTmm6ffvoTSZSV2B/LzzkUXAY33F/76EajNw1m+jZ9zPfNJlJ3Rh4EzOszNDHsmG/fZOhtqDg==}
/@esbuild/win32-arm64/0.17.14:
resolution: {integrity: sha512-xrD0mccTKRBBIotrITV7WVQAwNJ5+1va6L0H9zN92v2yEdjfAN7864cUaZwJS7JPEs53bDTzKFbfqVlG2HhyKQ==}
engines: {node: '>=12'}
cpu: [arm64]
os: [win32]
@ -468,8 +470,8 @@ packages:
dev: false
optional: true
/@esbuild/win32-ia32/0.17.12:
resolution: {integrity: sha512-FfrFjR4id7wcFYOdqbDfDET3tjxCozUgbqdkOABsSFzoZGFC92UK7mg4JKRc/B3NNEf1s2WHxJ7VfTdVDPN3ng==}
/@esbuild/win32-ia32/0.17.14:
resolution: {integrity: sha512-nXpkz9bbJrLLyUTYtRotSS3t5b+FOuljg8LgLdINWFs3FfqZMtbnBCZFUmBzQPyxqU87F8Av+3Nco/M3hEcu1w==}
engines: {node: '>=12'}
cpu: [ia32]
os: [win32]
@ -477,8 +479,8 @@ packages:
dev: false
optional: true
/@esbuild/win32-x64/0.17.12:
resolution: {integrity: sha512-JOOxw49BVZx2/5tW3FqkdjSD/5gXYeVGPDcB0lvap0gLQshkh1Nyel1QazC+wNxus3xPlsYAgqU1BUmrmCvWtw==}
/@esbuild/win32-x64/0.17.14:
resolution: {integrity: sha512-gPQmsi2DKTaEgG14hc3CHXHp62k8g6qr0Pas+I4lUxRMugGSATh/Bi8Dgusoz9IQ0IfdrvLpco6kujEIBoaogA==}
engines: {node: '>=12'}
cpu: [x64]
os: [win32]
@ -495,7 +497,7 @@ packages:
engines: {node: ^8.13.0 || >=10.10.0}
dependencies:
'@grpc/proto-loader': 0.7.5
'@types/node': 18.15.5
'@types/node': 18.15.10
dev: false
/@grpc/proto-loader/0.6.13:
@ -530,13 +532,13 @@ packages:
tslib: 2.5.0
dev: false
/@mdx-js/esbuild/2.3.0_esbuild@0.17.12:
/@mdx-js/esbuild/2.3.0_esbuild@0.17.14:
resolution: {integrity: sha512-r/vsqsM0E+U4Wr0DK+0EfmABE/eg+8ITW4DjvYdh3ve/tK2safaqHArNnaqbOk1DjYGrhxtoXoGaM3BY8fGBTA==}
peerDependencies:
esbuild: '>=0.11.0'
dependencies:
'@mdx-js/mdx': 2.3.0
esbuild: 0.17.12
esbuild: 0.17.14
node-fetch: 3.3.0
vfile: 5.3.7
transitivePeerDependencies:
@ -1053,8 +1055,8 @@ packages:
resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==}
dev: false
/@types/node/18.15.5:
resolution: {integrity: sha512-Ark2WDjjZO7GmvsyFFf81MXuGTA/d6oP38anyxWOL6EREyBKAxKoFHwBhaZxCfLRLpO8JgVXwqOwSwa7jRcjew==}
/@types/node/18.15.10:
resolution: {integrity: sha512-9avDaQJczATcXgfmMAW3MIWArOO7A+m90vuCFLr8AotWf8igO/mRoYukrk2cqZVtv38tHs33retzHEilM7FpeQ==}
dev: false
/@types/parse5/6.0.3:
@ -1068,14 +1070,14 @@ packages:
/@types/react-dom/18.0.11:
resolution: {integrity: sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==}
dependencies:
'@types/react': 18.0.28
'@types/react': 18.0.29
dev: false
/@types/react/18.0.28:
resolution: {integrity: sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==}
/@types/react/18.0.29:
resolution: {integrity: sha512-wXHktgUABxplw1+UnljseDq4+uztQyp2tlWZRIxHlpchsCFqiYkvaDS8JR7eKOQm8wziTH/el5qL7D6gYNkYcw==}
dependencies:
'@types/prop-types': 15.7.5
'@types/scheduler': 0.16.2
'@types/scheduler': 0.16.3
csstype: 3.1.1
dev: false
@ -1083,14 +1085,22 @@ packages:
resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==}
dev: false
/@types/scheduler/0.16.2:
resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==}
/@types/scheduler/0.16.3:
resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==}
dev: false
/@types/unist/2.0.6:
resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==}
dev: false
/@upstash/redis/1.20.1:
resolution: {integrity: sha512-mYwV8uvQROJnq5aOxmQH3KDa0E8+DRdU0zJ/VGQV84HrhQQNy0IsLFFTo97WEhZAlHcJnVbrbwqUK9disWqx/w==}
dependencies:
isomorphic-fetch: 3.0.0
transitivePeerDependencies:
- encoding
dev: false
/@vercel/analytics/0.1.11_react@18.2.0:
resolution: {integrity: sha512-mj5CPR02y0BRs1tN3oZcBNAX9a8NxsIUl9vElDPcqxnMfP0RbRc9fI9Ud7+QDg/1Izvt5uMumsr+6YsmVHcyuw==}
peerDependencies:
@ -1317,17 +1327,17 @@ packages:
repeat-string: 1.6.1
dev: false
/contentlayer/0.3.0_qmecdceofcvmurqim4ud7myj3a:
/contentlayer/0.3.0_e24fifms7lyt2dudodzemqbuwu:
resolution: {integrity: sha512-3LEF5HMHjSytlT8SErC3U59Pt2LP80a6Z2f/0mSIPeA4xty0LNChyHqzALySSM0osAEz32RY56Fifk5P+2dCIA==}
engines: {node: '>=14.18'}
hasBin: true
requiresBuild: true
dependencies:
'@contentlayer/cli': 0.3.0_qmecdceofcvmurqim4ud7myj3a
'@contentlayer/client': 0.3.0_qmecdceofcvmurqim4ud7myj3a
'@contentlayer/core': 0.3.0_qmecdceofcvmurqim4ud7myj3a
'@contentlayer/source-files': 0.3.0_qmecdceofcvmurqim4ud7myj3a
'@contentlayer/source-remote-files': 0.3.0_qmecdceofcvmurqim4ud7myj3a
'@contentlayer/cli': 0.3.0_e24fifms7lyt2dudodzemqbuwu
'@contentlayer/client': 0.3.0_e24fifms7lyt2dudodzemqbuwu
'@contentlayer/core': 0.3.0_e24fifms7lyt2dudodzemqbuwu
'@contentlayer/source-files': 0.3.0_e24fifms7lyt2dudodzemqbuwu
'@contentlayer/source-remote-files': 0.3.0_e24fifms7lyt2dudodzemqbuwu
'@contentlayer/utils': 0.3.0
transitivePeerDependencies:
- '@effect-ts/otel-node'
@ -1413,34 +1423,34 @@ packages:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
dev: false
/esbuild/0.17.12:
resolution: {integrity: sha512-bX/zHl7Gn2CpQwcMtRogTTBf9l1nl+H6R8nUbjk+RuKqAE3+8FDulLA+pHvX7aA7Xe07Iwa+CWvy9I8Y2qqPKQ==}
/esbuild/0.17.14:
resolution: {integrity: sha512-vOO5XhmVj/1XQR9NQ1UPq6qvMYL7QFJU57J5fKBKBKxp17uDt5PgxFDb4A2nEiXhr1qQs4x0F5+66hVVw4ruNw==}
engines: {node: '>=12'}
hasBin: true
requiresBuild: true
optionalDependencies:
'@esbuild/android-arm': 0.17.12
'@esbuild/android-arm64': 0.17.12
'@esbuild/android-x64': 0.17.12
'@esbuild/darwin-arm64': 0.17.12
'@esbuild/darwin-x64': 0.17.12
'@esbuild/freebsd-arm64': 0.17.12
'@esbuild/freebsd-x64': 0.17.12
'@esbuild/linux-arm': 0.17.12
'@esbuild/linux-arm64': 0.17.12
'@esbuild/linux-ia32': 0.17.12
'@esbuild/linux-loong64': 0.17.12
'@esbuild/linux-mips64el': 0.17.12
'@esbuild/linux-ppc64': 0.17.12
'@esbuild/linux-riscv64': 0.17.12
'@esbuild/linux-s390x': 0.17.12
'@esbuild/linux-x64': 0.17.12
'@esbuild/netbsd-x64': 0.17.12
'@esbuild/openbsd-x64': 0.17.12
'@esbuild/sunos-x64': 0.17.12
'@esbuild/win32-arm64': 0.17.12
'@esbuild/win32-ia32': 0.17.12
'@esbuild/win32-x64': 0.17.12
'@esbuild/android-arm': 0.17.14
'@esbuild/android-arm64': 0.17.14
'@esbuild/android-x64': 0.17.14
'@esbuild/darwin-arm64': 0.17.14
'@esbuild/darwin-x64': 0.17.14
'@esbuild/freebsd-arm64': 0.17.14
'@esbuild/freebsd-x64': 0.17.14
'@esbuild/linux-arm': 0.17.14
'@esbuild/linux-arm64': 0.17.14
'@esbuild/linux-ia32': 0.17.14
'@esbuild/linux-loong64': 0.17.14
'@esbuild/linux-mips64el': 0.17.14
'@esbuild/linux-ppc64': 0.17.14
'@esbuild/linux-riscv64': 0.17.14
'@esbuild/linux-s390x': 0.17.14
'@esbuild/linux-x64': 0.17.14
'@esbuild/netbsd-x64': 0.17.14
'@esbuild/openbsd-x64': 0.17.14
'@esbuild/sunos-x64': 0.17.14
'@esbuild/win32-arm64': 0.17.14
'@esbuild/win32-ia32': 0.17.14
'@esbuild/win32-x64': 0.17.14
dev: false
/escalade/3.1.1:
@ -1575,8 +1585,8 @@ packages:
resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==}
dev: true
/framer-motion/10.8.5_biqbaboplfbrettd7655fr4n2y:
resolution: {integrity: sha512-qwvUAIwCc6fEZhg7ST+/z+f7Vt882jJvLiWZUHNdq2oZ/Y7gM6mLlpKi9xQg+pLu6DQVypikcKQ+MKnoFoXAJg==}
/framer-motion/10.9.1_biqbaboplfbrettd7655fr4n2y:
resolution: {integrity: sha512-fuCDRGKOu5n9gN2/R7O22mE+BHMGK5D57S3Oq8n2ITd4aYR7D22QM5I4VPD3CWahNt/lyDUs20u9Aw+6ah9oAQ==}
peerDependencies:
react: ^18.0.0
react-dom: ^18.0.0
@ -1877,6 +1887,15 @@ packages:
'@types/estree': 1.0.0
dev: false
/isomorphic-fetch/3.0.0:
resolution: {integrity: sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==}
dependencies:
node-fetch: 2.6.9
whatwg-fetch: 3.6.2
transitivePeerDependencies:
- encoding
dev: false
/js-tokens/4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
dev: false
@ -2181,17 +2200,17 @@ packages:
'@types/mdast': 3.0.10
dev: false
/mdx-bundler/9.2.1_esbuild@0.17.12:
/mdx-bundler/9.2.1_esbuild@0.17.14:
resolution: {integrity: sha512-hWEEip1KU9MCNqeH2rqwzAZ1pdqPPbfkx9OTJjADqGPQz4t9BO85fhI7AP9gVYrpmfArf9/xJZUN0yBErg/G/Q==}
engines: {node: '>=14', npm: '>=6'}
peerDependencies:
esbuild: 0.*
dependencies:
'@babel/runtime': 7.21.0
'@esbuild-plugins/node-resolve': 0.1.4_esbuild@0.17.12
'@esbuild-plugins/node-resolve': 0.1.4_esbuild@0.17.14
'@fal-works/esbuild-plugin-global-externals': 2.1.2
'@mdx-js/esbuild': 2.3.0_esbuild@0.17.12
esbuild: 0.17.12
'@mdx-js/esbuild': 2.3.0_esbuild@0.17.14
esbuild: 0.17.14
gray-matter: 4.0.3
remark-frontmatter: 4.0.1
remark-mdx-frontmatter: 1.1.1
@ -2571,14 +2590,14 @@ packages:
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
/next-contentlayer/0.3.0_fwtlsludu3mxobm5kzti3ccmlm:
/next-contentlayer/0.3.0_4jrksbpguxv75tdufwflb7i7k4:
resolution: {integrity: sha512-vt+RaD3nIgZ6oXadtZH19a1mpxvGEoiifdtmXqBSz4rHMRcMA1YZCuSWyj+P9uX7MDmIL6JT6QSp+hvTBMaxiw==}
peerDependencies:
next: ^12 || ^13
react: '*'
react-dom: '*'
dependencies:
'@contentlayer/core': 0.3.0_qmecdceofcvmurqim4ud7myj3a
'@contentlayer/core': 0.3.0_e24fifms7lyt2dudodzemqbuwu
'@contentlayer/utils': 0.3.0
next: 13.2.4_756ubwvsgazzkcxtigvs4yqbci
react: 18.2.0
@ -2650,6 +2669,18 @@ packages:
engines: {node: '>=10.5.0'}
dev: false
/node-fetch/2.6.9:
resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==}
engines: {node: 4.x || >=6.0.0}
peerDependencies:
encoding: ^0.1.0
peerDependenciesMeta:
encoding:
optional: true
dependencies:
whatwg-url: 5.0.0
dev: false
/node-fetch/3.3.0:
resolution: {integrity: sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@ -2782,13 +2813,13 @@ packages:
postcss-selector-parser: 6.0.11
dev: true
/postcss-nesting/11.2.1_postcss@8.4.21:
resolution: {integrity: sha512-E6Jq74Jo/PbRAtZioON54NPhUNJYxVWhwxbweYl1vAoBYuGlDIts5yhtKiZFLvkvwT73e/9nFrW3oMqAtgG+GQ==}
/postcss-nesting/11.2.2_postcss@8.4.21:
resolution: {integrity: sha512-aOTiUniAB1bcPE6GGiynWRa6PZFPhOTAm5q3q5cem6QeSijIHHkWr6gs65ukCZMXeak8yXeZVbBJET3VM+HlhA==}
engines: {node: ^14 || ^16 || >=18}
peerDependencies:
postcss: ^8.4
dependencies:
'@csstools/selector-specificity': 2.1.1_wajs5nedgkikc5pcuwett7legi
'@csstools/selector-specificity': 2.2.0_laljekdltgzr3kfi7r4exvsr5a
postcss: 8.4.21
postcss-selector-parser: 6.0.11
dev: true
@ -2851,7 +2882,7 @@ packages:
'@protobufjs/pool': 1.1.0
'@protobufjs/utf8': 1.1.0
'@types/long': 4.0.2
'@types/node': 18.15.5
'@types/node': 18.15.10
long: 4.0.0
dev: false
@ -2870,7 +2901,7 @@ packages:
'@protobufjs/path': 1.1.2
'@protobufjs/pool': 1.1.0
'@protobufjs/utf8': 1.1.0
'@types/node': 18.15.5
'@types/node': 18.15.10
long: 5.2.1
dev: false
@ -2892,6 +2923,14 @@ packages:
scheduler: 0.23.0
dev: false
/react-wrap-balancer/0.4.0_react@18.2.0:
resolution: {integrity: sha512-MUsROihHd7bFHCo9kCOifKDYBEZPgKTyGvfa8RcwRQKtT2cL7Um9Cc8A7GvuT8t3np7LAGsEkzdEyJdKrr5lVQ==}
peerDependencies:
react: ^18.0.0
dependencies:
react: 18.2.0
dev: false
/react/18.2.0:
resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==}
engines: {node: '>=0.10.0'}
@ -3238,6 +3277,10 @@ packages:
resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==}
dev: false
/tr46/0.0.3:
resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
dev: false
/trim-lines/3.0.1:
resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
dev: false
@ -3407,6 +3450,21 @@ packages:
engines: {node: '>= 8'}
dev: false
/webidl-conversions/3.0.1:
resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
dev: false
/whatwg-fetch/3.6.2:
resolution: {integrity: sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==}
dev: false
/whatwg-url/5.0.0:
resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
dependencies:
tr46: 0.0.3
webidl-conversions: 3.0.1
dev: false
/wrap-ansi/7.0.0:
resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
engines: {node: '>=10'}

BIN
public/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 759 B

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 394 80"><path fill="#000" d="M262 0h68.5v12.7h-27.2v66.6h-13.6V12.7H262V0ZM149 0v12.7H94v20.4h44.3v12.6H94v21h55v12.6H80.5V0h68.7zm34.3 0h-17.8l63.8 79.4h17.9l-32-39.7 32-39.6h-17.9l-23 28.6-23-28.6zm18.3 56.7-9-11-27.1 33.7h17.8l18.3-22.7z"/><path fill="#000" d="M81 79.3 17 0H0v79.3h13.6V17l50.2 62.3H81Zm252.6-.4c-1 0-1.8-.4-2.5-1s-1.1-1.6-1.1-2.6.3-1.8 1-2.5 1.6-1 2.6-1 1.8.3 2.5 1a3.4 3.4 0 0 1 .6 4.3 3.7 3.7 0 0 1-3 1.8zm23.2-33.5h6v23.3c0 2.1-.4 4-1.3 5.5a9.1 9.1 0 0 1-3.8 3.5c-1.6.8-3.5 1.3-5.7 1.3-2 0-3.7-.4-5.3-1s-2.8-1.8-3.7-3.2c-.9-1.3-1.4-3-1.4-5h6c.1.8.3 1.6.7 2.2s1 1.2 1.6 1.5c.7.4 1.5.5 2.4.5 1 0 1.8-.2 2.4-.6a4 4 0 0 0 1.6-1.8c.3-.8.5-1.8.5-3V45.5zm30.9 9.1a4.4 4.4 0 0 0-2-3.3 7.5 7.5 0 0 0-4.3-1.1c-1.3 0-2.4.2-3.3.5-.9.4-1.6 1-2 1.6a3.5 3.5 0 0 0-.3 4c.3.5.7.9 1.3 1.2l1.8 1 2 .5 3.2.8c1.3.3 2.5.7 3.7 1.2a13 13 0 0 1 3.2 1.8 8.1 8.1 0 0 1 3 6.5c0 2-.5 3.7-1.5 5.1a10 10 0 0 1-4.4 3.5c-1.8.8-4.1 1.2-6.8 1.2-2.6 0-4.9-.4-6.8-1.2-2-.8-3.4-2-4.5-3.5a10 10 0 0 1-1.7-5.6h6a5 5 0 0 0 3.5 4.6c1 .4 2.2.6 3.4.6 1.3 0 2.5-.2 3.5-.6 1-.4 1.8-1 2.4-1.7a4 4 0 0 0 .8-2.4c0-.9-.2-1.6-.7-2.2a11 11 0 0 0-2.1-1.4l-3.2-1-3.8-1c-2.8-.7-5-1.7-6.6-3.2a7.2 7.2 0 0 1-2.4-5.7 8 8 0 0 1 1.7-5 10 10 0 0 1 4.3-3.5c2-.8 4-1.2 6.4-1.2 2.3 0 4.4.4 6.2 1.2 1.8.8 3.2 2 4.3 3.4 1 1.4 1.5 3 1.5 5h-5.8z"/></svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

BIN
public/og.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 341 KiB

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="40" height="31" fill="none"><g opacity=".9"><path fill="url(#a)" d="M13 .4v29.3H7V6.3h-.2L0 10.5V5L7.2.4H13Z"/><path fill="url(#b)" d="M28.8 30.1c-2.2 0-4-.3-5.7-1-1.7-.8-3-1.8-4-3.1a7.7 7.7 0 0 1-1.4-4.6h6.2c0 .8.3 1.4.7 2 .4.5 1 .9 1.7 1.2.7.3 1.6.4 2.5.4 1 0 1.7-.2 2.5-.5.7-.3 1.3-.8 1.7-1.4.4-.6.6-1.2.6-2s-.2-1.5-.7-2.1c-.4-.6-1-1-1.8-1.4-.8-.4-1.8-.5-2.9-.5h-2.7v-4.6h2.7a6 6 0 0 0 2.5-.5 4 4 0 0 0 1.7-1.3c.4-.6.6-1.3.6-2a3.5 3.5 0 0 0-2-3.3 5.6 5.6 0 0 0-4.5 0 4 4 0 0 0-1.7 1.2c-.4.6-.6 1.2-.6 2h-6c0-1.7.6-3.2 1.5-4.5 1-1.3 2.2-2.3 3.8-3C25 .4 26.8 0 28.8 0s3.8.4 5.3 1.1c1.5.7 2.7 1.7 3.6 3a7.2 7.2 0 0 1 1.2 4.2c0 1.6-.5 3-1.5 4a7 7 0 0 1-4 2.2v.2c2.2.3 3.8 1 5 2.2a6.4 6.4 0 0 1 1.6 4.6c0 1.7-.5 3.1-1.4 4.4a9.7 9.7 0 0 1-4 3.1c-1.7.8-3.7 1.1-5.8 1.1Z"/></g><defs><linearGradient id="a" x1="20" x2="20" y1="0" y2="30.1" gradientUnits="userSpaceOnUse"><stop/><stop offset="1" stop-color="#3D3D3D"/></linearGradient><linearGradient id="b" x1="20" x2="20" y1="0" y2="30.1" gradientUnits="userSpaceOnUse"><stop/><stop offset="1" stop-color="#3D3D3D"/></linearGradient></defs></svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 283 64"><path fill="black" d="M141 16c-11 0-19 7-19 18s9 18 20 18c7 0 13-3 16-7l-7-5c-2 3-6 4-9 4-5 0-9-3-10-7h28v-3c0-11-8-18-19-18zm-9 15c1-4 4-7 9-7s8 3 9 7h-18zm117-15c-11 0-19 7-19 18s9 18 20 18c6 0 12-3 16-7l-8-5c-2 3-5 4-8 4-5 0-9-3-11-7h28l1-3c0-11-8-18-19-18zm-10 15c2-4 5-7 10-7s8 3 9 7h-19zm-39 3c0 6 4 10 10 10 4 0 7-2 9-5l8 5c-3 5-9 8-17 8-11 0-19-7-19-18s8-18 19-18c8 0 14 3 17 8l-8 5c-2-3-5-5-9-5-6 0-10 4-10 10zm83-29v46h-9V5h9zM37 0l37 64H0L37 0zm92 5-27 48L74 5h10l18 30 17-30h10zm59 12v10l-3-1c-6 0-10 4-10 10v15h-9V17h9v9c0-5 6-9 13-9z"/></svg>

Before

Width:  |  Height:  |  Size: 629 B