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", filePathPattern: "./projects/**/*.mdx",
contentType: "mdx", contentType: "mdx",
fields: { fields: {
published: {
type: "boolean",
},
title: { title: {
type: "string", type: "string",
required: true, required: true,
@ -91,4 +94,4 @@ var contentlayer_config_default = makeSource({
}, },
}); });
export { Page, Project, contentlayer_config_default as default }; 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 { import projects__upstashRedisMdx from "./projects__upstash-redis.mdx.json" assert {
type: "json", type: "json",
}; };
import projects__upstashWebAnalyticsMdx from "./projects__upstash-web-analytics.mdx.json" assert {
type: "json",
};
export const allProjects = [ export const allProjects = [
projects__accessMdx, projects__accessMdx,
@ -58,4 +61,5 @@ export const allProjects = [
projects__upstashRatelimitMdx, projects__upstashRatelimitMdx,
projects__upstashReactUiMdx, projects__upstashReactUiMdx,
projects__upstashRedisMdx, 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; _id: string;
_raw: Local.RawDocumentData; _raw: Local.RawDocumentData;
type: "Project"; type: "Project";
published?: boolean | undefined;
title: string; title: string;
description: string; description: string;
date?: IsoDateTimeString | undefined; date?: IsoDateTimeString | undefined;

View File

@ -1,7 +1,7 @@
{ {
"name": "dot-contentlayer", "name": "dot-contentlayer",
"description": "This package is auto-generated by Contentlayer", "description": "This package is auto-generated by Contentlayer",
"version": "0.0.0-KFUTZ636", "version": "0.0.0-AAEZAM7W",
"exports": { "exports": {
"./generated": { "./generated": {
"import": "./generated/index.mjs" "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, ...props }) => (
<h2 <h2
className={clsx( 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, className,
)} )}
{...props} {...props}

View File

@ -2,6 +2,7 @@
import { Github, Mail, Twitter } from "lucide-react"; import { Github, Mail, Twitter } from "lucide-react";
import Link from "next/link"; import Link from "next/link";
import { Navigation } from "../components/nav"; import { Navigation } from "../components/nav";
import { Card } from "../components/card";
const socials = [ const socials = [
{ {
@ -25,43 +26,35 @@ const socials = [
]; ];
export default function Example() { export default function Example() {
async function submit() {
const res = await fetch("/api/contact", {
method: "POST",
body: JSON.stringify({
name: "John Doe",
email: "",
}),
});
}
return ( return (
<div className=" bg-gradient-to-tl from-zinc-900/0 via-zinc-900 to-zinc-900/0"> <div className=" bg-gradient-to-tl from-zinc-900/0 via-zinc-900 to-zinc-900/0">
<Navigation /> <Navigation />
<div className="container flex items-center justify-center min-h-screen px-4 mx-auto"> <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"> <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) => ( {socials.map((s) => (
<Link <Card>
key={s.href} <Link
href="https://twitter.com/chronark_" href={s.href}
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" 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" <span
aria-hidden="true" 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 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">
</span>{" "} {s.icon}
<div className="z-10 flex flex-col items-center"> </span>{" "}
<span className="text-xl font-medium duration-150 lg:text-3xl text-zinc-200 group-hover:text-white font-display"> <div className="z-10 flex flex-col items-center">
{s.handle} <span className="text-xl font-medium duration-150 lg:text-3xl text-zinc-200 group-hover:text-white font-display">
</span> {s.handle}
<span className="mt-4 text-sm text-center duration-1000 text-zinc-400 group-hover:text-zinc-200"> </span>
{s.label} <span className="mt-4 text-sm text-center duration-1000 text-zinc-400 group-hover:text-zinc-200">
</span> {s.label}
</div> </span>
</Link> </div>
</Link>
</Card>
))} ))}
</div> </div>
</div> </div>

View File

@ -1,44 +1,47 @@
import Image from "next/image";
import Link from "next/link";
import "../global.css"; import "../global.css";
import { Inter, Hanken_Grotesk } from "@next/font/google"; import { Inter, Hanken_Grotesk } from "@next/font/google";
// import font from "@next/font/local"; import { Metadata } from "next";
// 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",
// });
export const metadata = { export const metadata: Metadata = {
title: "chronark.com", title: {
description: "The personal website of chronark", 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({ const inter = Inter({
subsets: ["latin"], subsets: ["latin"],
variable: "--font-inter", variable: "--font-inter",

View File

@ -1,11 +1,8 @@
import Image from "next/image";
import Link from "next/link"; import Link from "next/link";
import React from "react"; import React from "react";
const navigation = [ const navigation = [
// { name: "About", href: "/about" },
{ name: "Projects", href: "/projects" }, { name: "Projects", href: "/projects" },
// { name: "Blog", href: "/blog" },
{ name: "Contact", href: "/contact" }, { 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="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"> <div className="my-16 text-center animate-fade-in">
<h2 className="text-sm text-zinc-500 "> <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 <Link
href="https://upstash.com" href="https://upstash.com"
className="underline duration-500 hover:text-zinc-300" className="underline duration-500 hover:text-zinc-300"
@ -42,7 +39,7 @@ export default function Home() {
</Link> </Link>
<br /> <br />
and{" "} and working on my startup{" "}
<Link <Link
href="https://planetfall.io" href="https://planetfall.io"
className="underline duration-500 hover:text-zinc-300" 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 { notFound } from "next/navigation";
import { allProjects } from "contentlayer/generated"; import { allProjects } from "contentlayer/generated";
import { Mdx } from "@/app/components/mdx"; import { Mdx } from "@/app/components/mdx";
import { Navigation } from "@/app/components/article-nav"; import { Header } from "./header";
import "./mdx.css"; import "./mdx.css";
interface PostPageProps { type Props = {
params: { params: {
slug: string; 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< export default async function PostPage({ params }: Props) {
PostPageProps["params"][]
> {
return allProjects.map((p) => ({
slug: p.slug,
}));
}
export default async function PostPage({ params }: PostPageProps) {
const slug = params?.slug; const slug = params?.slug;
const project = allProjects.find((project) => project.slug === slug); const project = allProjects.find((project) => project.slug === slug);
@ -27,11 +27,11 @@ export default async function PostPage({ params }: PostPageProps) {
} }
return ( return (
<div className="min-h-screen bg-white "> <div className="min-h-screen">
<Navigation project={project} /> <Header project={project} />
<main className=" bg-zinc-50"> <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 "> <article className="px-4 py-12 mx-auto prose prose-zinc">
<Mdx code={project.body.code} /> <Mdx code={project.body.code} />
</article> </article>
</main> </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 React from "react";
import { allProjects } from "contentlayer/generated"; import { allProjects } from "contentlayer/generated";
import { Navigation } from "../components/nav"; import { Navigation } from "../components/nav";
import { Card } from "./card"; import { Card } from "../components/card";
import { Article } from "./article";
export default function ProjectsPage() { export default function ProjectsPage() {
const featured = allProjects.find( const featured = allProjects.find(
@ -11,6 +12,7 @@ export default function ProjectsPage() {
const top2 = allProjects.find((project) => project.slug === "envshare")!; const top2 = allProjects.find((project) => project.slug === "envshare")!;
const top3 = allProjects.find((project) => project.slug === "qstash")!; const top3 = allProjects.find((project) => project.slug === "qstash")!;
const sorted = allProjects const sorted = allProjects
.filter((p) => p.published)
.filter( .filter(
(project) => (project) =>
project.slug !== featured.slug && project.slug !== featured.slug &&
@ -24,7 +26,7 @@ export default function ProjectsPage() {
); );
return ( return (
<div className="relative"> <div className="relative pb-16">
<Navigation /> <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="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"> <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="w-full h-px bg-zinc-800" />
<div className="grid grid-cols-1 gap-8 mx-auto lg:grid-cols-2 "> <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"> <Card>
<div className="text-xs text-zinc-100"> <Link href={`/projects/${featured.slug}`}>
{featured.date ? ( <article className="relative h-full w-full max-w-2xl mx-auto lg:mx-0 lg:max-w-lg p-4 md:p-8">
<time dateTime={new Date(featured.date).toISOString()}> <div className="text-xs text-zinc-100">
{Intl.DateTimeFormat(undefined, { {featured.date ? (
dateStyle: "medium", <time dateTime={new Date(featured.date).toISOString()}>
}).format(new Date(featured.date))} {Intl.DateTimeFormat(undefined, {
</time> dateStyle: "medium",
) : ( }).format(new Date(featured.date))}
<span>SOON</span> </time>
)} ) : (
</div> <span>SOON</span>
<h2 )}
id="featured-post" </div>
className="mt-4 text-3xl font-bold tracking-tight text-zinc-100 group-hover:text-white sm:text-4xl font-display" <h2
> id="featured-post"
{featured.title} className="mt-4 text-3xl font-bold tracking-tight text-zinc-100 group-hover:text-white sm:text-4xl font-display"
</h2> >
<p className="mt-4 leading-8 duration-150 text-zinc-400 group-hover:text-zinc-300"> {featured.title}
{featured.description} </h2>
</p> <p className="mt-4 leading-8 duration-150 text-zinc-400 group-hover:text-zinc-300">
<div className="mt-4"> {featured.description}
<Link </p>
className="text-zinc-200 hover:text-zinc-50" <div className="absolute bottom-4 md:bottom-8">
href={`/projects/${featured.slug}`} <Link
> className="text-zinc-200 hover:text-zinc-50"
Read more <span aria-hidden="true">&rarr;</span> href={`/projects/${featured.slug}`}
</Link> >
</div> Read more <span aria-hidden="true">&rarr;</span>
</article> </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"> <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) => ( {[top2, top3].map((project) => (
<Card key={project.slug} project={project} /> <Card key={project.slug}>
<Article project={project} />
</Card>
))} ))}
</div> </div>
</div> </div>
@ -81,21 +90,27 @@ export default function ProjectsPage() {
{sorted {sorted
.filter((_, i) => i % 3 === 0) .filter((_, i) => i % 3 === 0)
.map((project) => ( .map((project) => (
<Card key={project.slug} project={project} /> <Card key={project.slug}>
<Article project={project} />
</Card>
))} ))}
</div> </div>
<div className="grid grid-cols-1 gap-4"> <div className="grid grid-cols-1 gap-4">
{sorted {sorted
.filter((_, i) => i % 3 === 1) .filter((_, i) => i % 3 === 1)
.map((project) => ( .map((project) => (
<Card key={project.slug} project={project} /> <Card key={project.slug}>
<Article project={project} />
</Card>
))} ))}
</div> </div>
<div className="grid grid-cols-1 gap-4"> <div className="grid grid-cols-1 gap-4">
{sorted {sorted
.filter((_, i) => i % 3 === 2) .filter((_, i) => i % 3 === 2)
.map((project) => ( .map((project) => (
<Card key={project.slug} project={project} /> <Card key={project.slug}>
<Article project={project} />
</Card>
))} ))}
</div> </div>
</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. 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 repository: chronark/access
date: "2022-11-13" 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. 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" date: "2023-01-16"
url: https://envshare.dev url: https://envshare.dev
repository: chronark/envshare repository: chronark/envshare
published: true
--- ---
EnvShare is a simple tool to share environment variables securely. It uses EnvShare is a simple tool to share environment variables securely. It uses

View File

@ -1,10 +1,12 @@
--- ---
title: planetfall.io 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" date: "2023-04-01"
url: https://planetfall.io 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. description: QStash is a fully managed serverless queue and messaging service designed for the serverless era.
date: "2022-07-18" date: "2022-07-18"
url: https://upstash.com/qstash 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" date: "2021-03-16"
repository: chronark/terraform-provider-vercel repository: chronark/terraform-provider-vercel
url: https://registry.terraform.io/providers/chronark/vercel/latest 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 description: A library to record and analyse Auth.js user behaviour
url: https://console.upstash.com/ratelimit url: https://console.upstash.com/ratelimit
repository: upstash/auth-analytics repository: upstash/auth-analytics
--- ---
TODO: TODO:

View File

@ -4,6 +4,7 @@ description: A CLI to provision and manage Upstash resources, including Redis an
date: "2022-05-16" date: "2022-05-16"
url: https://upstash.com/cli url: https://upstash.com/cli
repository: upstash/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" date: "2023-02-13"
url: https://console.upstash.com/ratelimit url: https://console.upstash.com/ratelimit
repository: upstash/core-analytics repository: upstash/core-analytics
published: true
--- ---

View File

@ -4,6 +4,7 @@ description: Featues flags for your edge functions.
date: "2022-12-12" date: "2022-12-12"
url: https://upstash.com/edge-flags url: https://upstash.com/edge-flags
repository: upstash/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" date: "2022-01-08"
url: https://upstash.com/kafka url: https://upstash.com/kafka
repository: upstash/upstash-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" date: "2022-07-18"
url: https://upstash.com/qstash url: https://upstash.com/qstash
repository: upstash/sdk-qstash-ts repository: upstash/sdk-qstash-ts
published: true
--- ---
TODO: TODO:

View File

@ -4,6 +4,7 @@ description: Near realtime analytics for your ratelimits. Integrated into the @u
repository: upstash/ratelimit repository: upstash/ratelimit
date: "2023-03-01" date: "2023-03-01"
website: https://console.upstash.com/ratelimit 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" date: "2022-06-06"
url: https://upstash.com/ratelimit url: https://upstash.com/ratelimit
repository: upstash/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" date: "2023-02-05"
url: https://upstash.com url: https://upstash.com
repository: upstash/react-ui 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" date: "2022-03-14"
url: https://upstash.com/redis url: https://upstash.com/redis
repository: upstash/upstash-redis repository: upstash/upstash-redis
published: true
--- ---

View File

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

View File

@ -22,6 +22,9 @@ export const Project = defineDocumentType(() => ({
contentType: "mdx", contentType: "mdx",
fields: { fields: {
published: {
type: "boolean",
},
title: { title: {
type: "string", type: "string",
required: true, 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": { "dependencies": {
"@next/font": "^13.2.1", "@next/font": "^13.2.1",
"@next/mdx": "^13.2.1", "@next/mdx": "^13.2.1",
"@types/node": "18.15.5", "@types/node": "18.15.10",
"@types/react": "18.0.28", "@types/react": "18.0.29",
"@types/react-dom": "18.0.11", "@types/react-dom": "18.0.11",
"@upstash/redis": "^1.20.1",
"@vercel/analytics": "^0.1.10", "@vercel/analytics": "^0.1.10",
"contentlayer": "^0.3.0", "contentlayer": "^0.3.0",
"framer-motion": "^10.8.5", "framer-motion": "^10.9.1",
"lucide-react": "^0.127.0", "lucide-react": "^0.127.0",
"markdown-wasm": "^1.2.0", "markdown-wasm": "^1.2.0",
"next": "13.2.4", "next": "13.2.4",
"next-contentlayer": "^0.3.0", "next-contentlayer": "^0.3.0",
"react": "18.2.0", "react": "18.2.0",
"react-dom": "18.2.0", "react-dom": "18.2.0",
"react-wrap-balancer": "^0.4.0",
"rehype-autolink-headings": "^6.1.1", "rehype-autolink-headings": "^6.1.1",
"rehype-pretty-code": "^0.9.4", "rehype-pretty-code": "^0.9.4",
"rehype-slug": "^5.1.0", "rehype-slug": "^5.1.0",
@ -35,7 +37,7 @@
"@tailwindcss/typography": "^0.5.9", "@tailwindcss/typography": "^0.5.9",
"autoprefixer": "^10.4.13", "autoprefixer": "^10.4.13",
"postcss": "^8.4.21", "postcss": "^8.4.21",
"postcss-nesting": "^11.2.1", "postcss-nesting": "^11.2.2",
"rome": "^11.0.0", "rome": "^11.0.0",
"tailwindcss": "^3.2.7", "tailwindcss": "^3.2.7",
"tailwindcss-debug-screens": "^2.2.1" "tailwindcss-debug-screens": "^2.2.1"

310
pnpm-lock.yaml generated
View File

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