diff --git a/.contentlayer/.cache/v0.3.4/compiled-contentlayer-config-BLLLZBRR.mjs b/.contentlayer/.cache/v0.3.4/compiled-contentlayer-config-BLLLZBRR.mjs new file mode 100644 index 0000000..84bffdd --- /dev/null +++ b/.contentlayer/.cache/v0.3.4/compiled-contentlayer-config-BLLLZBRR.mjs @@ -0,0 +1,108 @@ +// contentlayer.config.ts +import { defineDocumentType, makeSource } from "contentlayer/source-files"; +var Page = defineDocumentType(() => ({ + name: "Page", + filePathPattern: "pages/**/*.mdx", + contentType: "mdx", + fields: { + title: { type: "string", required: true }, + description: { type: "string", required: true } + } +})); +var Article = defineDocumentType(() => ({ + name: "Article", + filePathPattern: "articles/**/*.mdx", + contentType: "mdx", + fields: { + title: { type: "string", required: true }, + tags: { type: "list", of: { type: "string" }, required: true }, + description: { type: "string", required: true }, + image: { type: "string", required: false }, + publishedAt: { type: "date", required: false } + } +})); +var Project = defineDocumentType(() => ({ + name: "Project", + filePathPattern: "projects/**/*.mdx", + contentType: "mdx", + fields: { + title: { type: "string", required: true }, + order: { type: "number", required: true }, + tags: { type: "list", of: { type: "string" }, required: true }, + description: { type: "string", required: true }, + image: { type: "string", required: false } + } +})); +var Book = defineDocumentType(() => ({ + name: "Book", + filePathPattern: "books/**/*.mdx", + contentType: "mdx", + fields: { + title: { type: "string", required: true }, + rating: { type: "number", required: true }, + author: { type: "string", required: true }, + url: { type: "string", required: true }, + category: { type: "string", required: true }, + description: { type: "string", required: true }, + tags: { type: "list", of: { type: "string" }, required: true }, + cover: { type: "string", required: true }, + year: { type: "number", required: true } + } +})); +var Film = defineDocumentType(() => ({ + name: "Film", + filePathPattern: "films/**/*.mdx", + contentType: "mdx", + fields: { + title: { type: "string", required: true }, + rating: { type: "number", required: true }, + image: { type: "string", required: false }, + url: { type: "string", required: true } + } +})); +var Show = defineDocumentType(() => ({ + name: "Show", + filePathPattern: "shows/**/*.mdx", + contentType: "mdx", + fields: { + title: { type: "string", required: true }, + rating: { type: "number", required: true }, + image: { type: "string", required: false }, + url: { type: "string", required: true } + } +})); +var Musician = defineDocumentType(() => ({ + name: "Musician", + filePathPattern: "musicians/**/*.mdx", + contentType: "mdx", + fields: { + name: { type: "string", required: true }, + url: { type: "string", required: true }, + image: { type: "string", required: false } + } +})); +var Quote = defineDocumentType(() => ({ + name: "Quote", + filePathPattern: "quotes/**/*.mdx", + contentType: "mdx", + fields: { + text: { type: "string", required: true }, + author: { type: "string", required: true } + } +})); +var contentlayer_config_default = makeSource({ + contentDirPath: "content", + documentTypes: [Page, Article, Project, Book, Film, Show, Musician, Quote] +}); +export { + Article, + Book, + Film, + Musician, + Page, + Project, + Quote, + Show, + contentlayer_config_default as default +}; +//# sourceMappingURL=compiled-contentlayer-config-BLLLZBRR.mjs.map diff --git a/.contentlayer/.cache/v0.3.4/compiled-contentlayer-config-BLLLZBRR.mjs.map b/.contentlayer/.cache/v0.3.4/compiled-contentlayer-config-BLLLZBRR.mjs.map new file mode 100644 index 0000000..4a37382 --- /dev/null +++ b/.contentlayer/.cache/v0.3.4/compiled-contentlayer-config-BLLLZBRR.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../contentlayer.config.ts"], + "sourcesContent": ["import { defineDocumentType, makeSource } from \"contentlayer/source-files\";\nimport { z } from \"zod\";\n\nexport const Page = defineDocumentType(() => ({\n name: \"Page\",\n filePathPattern: \"pages/**/*.mdx\",\n contentType: \"mdx\",\n fields: {\n title: { type: \"string\", required: true },\n description: { type: \"string\", required: true },\n },\n}));\n\nexport const Article = defineDocumentType(() => ({\n name: \"Article\",\n filePathPattern: \"articles/**/*.mdx\",\n contentType: \"mdx\",\n fields: {\n title: { type: \"string\", required: true },\n tags: { type: \"list\", of: { type: \"string\" }, required: true },\n description: { type: \"string\", required: true },\n image: { type: \"string\", required: false },\n publishedAt: { type: \"date\", required: false },\n },\n}));\n\nexport const Project = defineDocumentType(() => ({\n name: \"Project\",\n filePathPattern: \"projects/**/*.mdx\",\n contentType: \"mdx\",\n fields: {\n title: { type: \"string\", required: true },\n order: { type: \"number\", required: true },\n tags: { type: \"list\", of: { type: \"string\" }, required: true },\n description: { type: \"string\", required: true },\n image: { type: \"string\", required: false },\n },\n}));\n\nexport const Book = defineDocumentType(() => ({\n name: \"Book\",\n filePathPattern: \"books/**/*.mdx\",\n contentType: \"mdx\",\n fields: {\n title: { type: \"string\", required: true },\n rating: { type: \"number\", required: true },\n author: { type: \"string\", required: true },\n url: { type: \"string\", required: true },\n category: { type: \"string\", required: true },\n description: { type: \"string\", required: true },\n tags: { type: \"list\", of: { type: \"string\" }, required: true },\n cover: { type: \"string\", required: true },\n year: { type: \"number\", required: true },\n },\n}));\n\nexport const Film = defineDocumentType(() => ({\n name: \"Film\",\n filePathPattern: \"films/**/*.mdx\",\n contentType: \"mdx\",\n fields: {\n title: { type: \"string\", required: true },\n rating: { type: \"number\", required: true },\n image: { type: \"string\", required: false },\n url: { type: \"string\", required: true },\n },\n}));\n\nexport const Show = defineDocumentType(() => ({\n name: \"Show\",\n filePathPattern: \"shows/**/*.mdx\",\n contentType: \"mdx\",\n fields: {\n title: { type: \"string\", required: true },\n rating: { type: \"number\", required: true },\n image: { type: \"string\", required: false },\n url: { type: \"string\", required: true },\n },\n}));\n\nexport const Musician = defineDocumentType(() => ({\n name: \"Musician\",\n filePathPattern: \"musicians/**/*.mdx\",\n contentType: \"mdx\",\n fields: {\n name: { type: \"string\", required: true },\n url: { type: \"string\", required: true },\n image: { type: \"string\", required: false },\n },\n}));\n\nexport const Quote = defineDocumentType(() => ({\n name: \"Quote\",\n filePathPattern: \"quotes/**/*.mdx\",\n contentType: \"mdx\",\n fields: {\n text: { type: \"string\", required: true },\n author: { type: \"string\", required: true },\n },\n}));\n\nexport default makeSource({\n contentDirPath: \"content\",\n documentTypes: [Page, Article, Project, Book, Film, Show, Musician, Quote],\n});\n"], + "mappings": ";AAAA,SAAS,oBAAoB,kBAAkB;AAGxC,IAAM,OAAO,mBAAmB,OAAO;AAAA,EAC5C,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,QAAQ;AAAA,IACN,OAAO,EAAE,MAAM,UAAU,UAAU,KAAK;AAAA,IACxC,aAAa,EAAE,MAAM,UAAU,UAAU,KAAK;AAAA,EAChD;AACF,EAAE;AAEK,IAAM,UAAU,mBAAmB,OAAO;AAAA,EAC/C,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,QAAQ;AAAA,IACN,OAAO,EAAE,MAAM,UAAU,UAAU,KAAK;AAAA,IACxC,MAAM,EAAE,MAAM,QAAQ,IAAI,EAAE,MAAM,SAAS,GAAG,UAAU,KAAK;AAAA,IAC7D,aAAa,EAAE,MAAM,UAAU,UAAU,KAAK;AAAA,IAC9C,OAAO,EAAE,MAAM,UAAU,UAAU,MAAM;AAAA,IACzC,aAAa,EAAE,MAAM,QAAQ,UAAU,MAAM;AAAA,EAC/C;AACF,EAAE;AAEK,IAAM,UAAU,mBAAmB,OAAO;AAAA,EAC/C,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,QAAQ;AAAA,IACN,OAAO,EAAE,MAAM,UAAU,UAAU,KAAK;AAAA,IACxC,OAAO,EAAE,MAAM,UAAU,UAAU,KAAK;AAAA,IACxC,MAAM,EAAE,MAAM,QAAQ,IAAI,EAAE,MAAM,SAAS,GAAG,UAAU,KAAK;AAAA,IAC7D,aAAa,EAAE,MAAM,UAAU,UAAU,KAAK;AAAA,IAC9C,OAAO,EAAE,MAAM,UAAU,UAAU,MAAM;AAAA,EAC3C;AACF,EAAE;AAEK,IAAM,OAAO,mBAAmB,OAAO;AAAA,EAC5C,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,QAAQ;AAAA,IACN,OAAO,EAAE,MAAM,UAAU,UAAU,KAAK;AAAA,IACxC,QAAQ,EAAE,MAAM,UAAU,UAAU,KAAK;AAAA,IACzC,QAAQ,EAAE,MAAM,UAAU,UAAU,KAAK;AAAA,IACzC,KAAK,EAAE,MAAM,UAAU,UAAU,KAAK;AAAA,IACtC,UAAU,EAAE,MAAM,UAAU,UAAU,KAAK;AAAA,IAC3C,aAAa,EAAE,MAAM,UAAU,UAAU,KAAK;AAAA,IAC9C,MAAM,EAAE,MAAM,QAAQ,IAAI,EAAE,MAAM,SAAS,GAAG,UAAU,KAAK;AAAA,IAC7D,OAAO,EAAE,MAAM,UAAU,UAAU,KAAK;AAAA,IACxC,MAAM,EAAE,MAAM,UAAU,UAAU,KAAK;AAAA,EACzC;AACF,EAAE;AAEK,IAAM,OAAO,mBAAmB,OAAO;AAAA,EAC5C,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,QAAQ;AAAA,IACN,OAAO,EAAE,MAAM,UAAU,UAAU,KAAK;AAAA,IACxC,QAAQ,EAAE,MAAM,UAAU,UAAU,KAAK;AAAA,IACzC,OAAO,EAAE,MAAM,UAAU,UAAU,MAAM;AAAA,IACzC,KAAK,EAAE,MAAM,UAAU,UAAU,KAAK;AAAA,EACxC;AACF,EAAE;AAEK,IAAM,OAAO,mBAAmB,OAAO;AAAA,EAC5C,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,QAAQ;AAAA,IACN,OAAO,EAAE,MAAM,UAAU,UAAU,KAAK;AAAA,IACxC,QAAQ,EAAE,MAAM,UAAU,UAAU,KAAK;AAAA,IACzC,OAAO,EAAE,MAAM,UAAU,UAAU,MAAM;AAAA,IACzC,KAAK,EAAE,MAAM,UAAU,UAAU,KAAK;AAAA,EACxC;AACF,EAAE;AAEK,IAAM,WAAW,mBAAmB,OAAO;AAAA,EAChD,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,QAAQ;AAAA,IACN,MAAM,EAAE,MAAM,UAAU,UAAU,KAAK;AAAA,IACvC,KAAK,EAAE,MAAM,UAAU,UAAU,KAAK;AAAA,IACtC,OAAO,EAAE,MAAM,UAAU,UAAU,MAAM;AAAA,EAC3C;AACF,EAAE;AAEK,IAAM,QAAQ,mBAAmB,OAAO;AAAA,EAC7C,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,QAAQ;AAAA,IACN,MAAM,EAAE,MAAM,UAAU,UAAU,KAAK;AAAA,IACvC,QAAQ,EAAE,MAAM,UAAU,UAAU,KAAK;AAAA,EAC3C;AACF,EAAE;AAEF,IAAO,8BAAQ,WAAW;AAAA,EACxB,gBAAgB;AAAA,EAChB,eAAe,CAAC,MAAM,SAAS,SAAS,MAAM,MAAM,MAAM,UAAU,KAAK;AAC3E,CAAC;", + "names": [] +} diff --git a/.contentlayer/.cache/v0.3.4/compiled-contentlayer-config-H3R7XACO.mjs b/.contentlayer/.cache/v0.3.4/compiled-contentlayer-config-H3R7XACO.mjs new file mode 100644 index 0000000..3e174a1 --- /dev/null +++ b/.contentlayer/.cache/v0.3.4/compiled-contentlayer-config-H3R7XACO.mjs @@ -0,0 +1,71 @@ +// contentlayer.config.ts +import { defineDocumentType, makeSource } from "contentlayer/source-files"; +import rehypeSlug from "rehype-slug"; +import remarkGfm from "remark-gfm"; +var Article = defineDocumentType(() => ({ + name: "Article", + filePathPattern: "articles/**/*.mdx", + contentType: "mdx", + fields: { + title: { type: "string", required: true }, + description: { type: "string", required: true }, + date: { type: "date", required: true }, + tags: { type: "list", of: { type: "string" }, required: true } + }, + computedFields: { + slug: { + type: "string", + resolve: (doc) => doc._raw.sourceFileName.replace(/\.mdx$/, "") + } + } +})); +var Project = defineDocumentType(() => ({ + name: "Project", + filePathPattern: "projects/**/*.mdx", + contentType: "mdx", + fields: { + title: { type: "string", required: true }, + description: { type: "string", required: true }, + date: { type: "date", required: true }, + tags: { type: "list", of: { type: "string" }, required: true }, + url: { type: "string", required: false } + }, + computedFields: { + slug: { + type: "string", + resolve: (doc) => doc._raw.sourceFileName.replace(/\.mdx$/, "") + } + } +})); +var Book = defineDocumentType(() => ({ + name: "Book", + filePathPattern: "books/**/*.mdx", + contentType: "mdx", + fields: { + title: { type: "string", required: true }, + description: { type: "string", required: true }, + author: { type: "string", required: true }, + rating: { type: "number", required: true }, + date: { type: "date", required: true }, + tags: { type: "list", of: { type: "string" }, required: true }, + cover: { type: "string", required: true } + }, + computedFields: { + slug: { + type: "string", + resolve: (doc) => doc._raw.sourceFileName.replace(/\.mdx$/, "") + } + } +})); +var contentlayer_config_default = makeSource({ + contentDirPath: "content", + documentTypes: [Article, Project, Book], + mdx: { + remarkPlugins: [remarkGfm], + rehypePlugins: [rehypeSlug] + } +}); +export { + contentlayer_config_default as default +}; +//# sourceMappingURL=compiled-contentlayer-config-H3R7XACO.mjs.map diff --git a/.contentlayer/.cache/v0.3.4/compiled-contentlayer-config-H3R7XACO.mjs.map b/.contentlayer/.cache/v0.3.4/compiled-contentlayer-config-H3R7XACO.mjs.map new file mode 100644 index 0000000..bfa9b19 --- /dev/null +++ b/.contentlayer/.cache/v0.3.4/compiled-contentlayer-config-H3R7XACO.mjs.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../contentlayer.config.ts"], + "sourcesContent": ["import { defineDocumentType, makeSource } from \"contentlayer/source-files\";\nimport rehypeSlug from \"rehype-slug\";\nimport remarkGfm from \"remark-gfm\";\n\nconst Article = defineDocumentType(() => ({\n name: \"Article\",\n filePathPattern: \"articles/**/*.mdx\",\n contentType: \"mdx\",\n fields: {\n title: { type: \"string\", required: true },\n description: { type: \"string\", required: true },\n date: { type: \"date\", required: true },\n tags: { type: \"list\", of: { type: \"string\" }, required: true },\n },\n computedFields: {\n slug: {\n type: \"string\",\n resolve: (doc) => doc._raw.sourceFileName.replace(/\\.mdx$/, \"\"),\n },\n },\n}));\n\nconst Project = defineDocumentType(() => ({\n name: \"Project\",\n filePathPattern: \"projects/**/*.mdx\",\n contentType: \"mdx\",\n fields: {\n title: { type: \"string\", required: true },\n description: { type: \"string\", required: true },\n date: { type: \"date\", required: true },\n tags: { type: \"list\", of: { type: \"string\" }, required: true },\n url: { type: \"string\", required: false },\n },\n computedFields: {\n slug: {\n type: \"string\",\n resolve: (doc) => doc._raw.sourceFileName.replace(/\\.mdx$/, \"\"),\n },\n },\n}));\n\nconst Book = defineDocumentType(() => ({\n name: \"Book\",\n filePathPattern: \"books/**/*.mdx\",\n contentType: \"mdx\",\n fields: {\n title: { type: \"string\", required: true },\n description: { type: \"string\", required: true },\n author: { type: \"string\", required: true },\n rating: { type: \"number\", required: true },\n date: { type: \"date\", required: true },\n tags: { type: \"list\", of: { type: \"string\" }, required: true },\n cover: { type: \"string\", required: true },\n },\n computedFields: {\n slug: {\n type: \"string\",\n resolve: (doc) => doc._raw.sourceFileName.replace(/\\.mdx$/, \"\"),\n },\n },\n}));\n\nexport default makeSource({\n contentDirPath: \"content\",\n documentTypes: [Article, Project, Book],\n mdx: {\n remarkPlugins: [remarkGfm],\n rehypePlugins: [rehypeSlug],\n },\n});\n"], + "mappings": ";AAAA,SAAS,oBAAoB,kBAAkB;AAC/C,OAAO,gBAAgB;AACvB,OAAO,eAAe;AAEtB,IAAM,UAAU,mBAAmB,OAAO;AAAA,EACxC,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,QAAQ;AAAA,IACN,OAAO,EAAE,MAAM,UAAU,UAAU,KAAK;AAAA,IACxC,aAAa,EAAE,MAAM,UAAU,UAAU,KAAK;AAAA,IAC9C,MAAM,EAAE,MAAM,QAAQ,UAAU,KAAK;AAAA,IACrC,MAAM,EAAE,MAAM,QAAQ,IAAI,EAAE,MAAM,SAAS,GAAG,UAAU,KAAK;AAAA,EAC/D;AAAA,EACA,gBAAgB;AAAA,IACd,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,SAAS,CAAC,QAAQ,IAAI,KAAK,eAAe,QAAQ,UAAU,EAAE;AAAA,IAChE;AAAA,EACF;AACF,EAAE;AAEF,IAAM,UAAU,mBAAmB,OAAO;AAAA,EACxC,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,QAAQ;AAAA,IACN,OAAO,EAAE,MAAM,UAAU,UAAU,KAAK;AAAA,IACxC,aAAa,EAAE,MAAM,UAAU,UAAU,KAAK;AAAA,IAC9C,MAAM,EAAE,MAAM,QAAQ,UAAU,KAAK;AAAA,IACrC,MAAM,EAAE,MAAM,QAAQ,IAAI,EAAE,MAAM,SAAS,GAAG,UAAU,KAAK;AAAA,IAC7D,KAAK,EAAE,MAAM,UAAU,UAAU,MAAM;AAAA,EACzC;AAAA,EACA,gBAAgB;AAAA,IACd,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,SAAS,CAAC,QAAQ,IAAI,KAAK,eAAe,QAAQ,UAAU,EAAE;AAAA,IAChE;AAAA,EACF;AACF,EAAE;AAEF,IAAM,OAAO,mBAAmB,OAAO;AAAA,EACrC,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,QAAQ;AAAA,IACN,OAAO,EAAE,MAAM,UAAU,UAAU,KAAK;AAAA,IACxC,aAAa,EAAE,MAAM,UAAU,UAAU,KAAK;AAAA,IAC9C,QAAQ,EAAE,MAAM,UAAU,UAAU,KAAK;AAAA,IACzC,QAAQ,EAAE,MAAM,UAAU,UAAU,KAAK;AAAA,IACzC,MAAM,EAAE,MAAM,QAAQ,UAAU,KAAK;AAAA,IACrC,MAAM,EAAE,MAAM,QAAQ,IAAI,EAAE,MAAM,SAAS,GAAG,UAAU,KAAK;AAAA,IAC7D,OAAO,EAAE,MAAM,UAAU,UAAU,KAAK;AAAA,EAC1C;AAAA,EACA,gBAAgB;AAAA,IACd,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,SAAS,CAAC,QAAQ,IAAI,KAAK,eAAe,QAAQ,UAAU,EAAE;AAAA,IAChE;AAAA,EACF;AACF,EAAE;AAEF,IAAO,8BAAQ,WAAW;AAAA,EACxB,gBAAgB;AAAA,EAChB,eAAe,CAAC,SAAS,SAAS,IAAI;AAAA,EACtC,KAAK;AAAA,IACH,eAAe,CAAC,SAAS;AAAA,IACzB,eAAe,CAAC,UAAU;AAAA,EAC5B;AACF,CAAC;", + "names": [] +} diff --git a/.contentlayer/.cache/v0.3.4/data-H3R7XACO.json b/.contentlayer/.cache/v0.3.4/data-H3R7XACO.json new file mode 100644 index 0000000..08b884d --- /dev/null +++ b/.contentlayer/.cache/v0.3.4/data-H3R7XACO.json @@ -0,0 +1,32 @@ +{ + "cacheItemsMap": { + "articles/hello-world.mdx": { + "document": { + "title": "Hello World", + "description": "My first article in the new Remix site", + "date": "2024-01-01T00:00:00.000Z", + "tags": [ + "remix", + "react" + ], + "body": { + "raw": "\n# Hello World\n\nThis is my first article in the new Remix site. I'm excited to share my thoughts and experiences with you. ", + "code": "var Component=(()=>{var dr=Object.create;var I=Object.defineProperty;var vr=Object.getOwnPropertyDescriptor;var pr=Object.getOwnPropertyNames;var br=Object.getPrototypeOf,hr=Object.prototype.hasOwnProperty;var q=(l,s)=>()=>(s||l((s={exports:{}}).exports,s),s.exports),mr=(l,s)=>{for(var h in s)I(l,h,{get:s[h],enumerable:!0})},Te=(l,s,h,_)=>{if(s&&typeof s==\"object\"||typeof s==\"function\")for(let g of pr(s))!hr.call(l,g)&&g!==h&&I(l,g,{get:()=>s[g],enumerable:!(_=vr(s,g))||_.enumerable});return l};var gr=(l,s,h)=>(h=l!=null?dr(br(l)):{},Te(s||!l||!l.__esModule?I(h,\"default\",{value:l,enumerable:!0}):h,l)),yr=l=>Te(I({},\"__esModule\",{value:!0}),l);var Ce=q((Cr,we)=>{we.exports=React});var Oe=q(z=>{\"use strict\";(function(){\"use strict\";var l=Ce(),s=Symbol.for(\"react.element\"),h=Symbol.for(\"react.portal\"),_=Symbol.for(\"react.fragment\"),g=Symbol.for(\"react.strict_mode\"),H=Symbol.for(\"react.profiler\"),J=Symbol.for(\"react.provider\"),Z=Symbol.for(\"react.context\"),x=Symbol.for(\"react.forward_ref\"),W=Symbol.for(\"react.suspense\"),N=Symbol.for(\"react.suspense_list\"),j=Symbol.for(\"react.memo\"),Y=Symbol.for(\"react.lazy\"),je=Symbol.for(\"react.offscreen\"),Q=Symbol.iterator,De=\"@@iterator\";function ke(e){if(e===null||typeof e!=\"object\")return null;var r=Q&&e[Q]||e[De];return typeof r==\"function\"?r:null}var T=l.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;function d(e){{for(var r=arguments.length,t=new Array(r>1?r-1:0),n=1;n=1&&f>=0&&a[c]!==v[f];)f--;for(;c>=1&&f>=0;c--,f--)if(a[c]!==v[f]){if(c!==1||f!==1)do if(c--,f--,f<0||a[c]!==v[f]){var b=`\n`+a[c].replace(\" at new \",\" at \");return e.displayName&&b.includes(\"\")&&(b=b.replace(\"\",e.displayName)),typeof e==\"function\"&&k.set(e,b),b}while(c>=1&&f>=0);break}}}finally{U=!1,$.current=u,Ve(),Error.prepareStackTrace=o}var C=e?e.displayName||e.name:\"\",R=C?D(C):\"\";return typeof e==\"function\"&&k.set(e,R),R}function Be(e,r,t){return ce(e,!1)}function Ke(e){var r=e.prototype;return!!(r&&r.isReactComponent)}function F(e,r,t){if(e==null)return\"\";if(typeof e==\"function\")return ce(e,Ke(e));if(typeof e==\"string\")return D(e);switch(e){case W:return D(\"Suspense\");case N:return D(\"SuspenseList\")}if(typeof e==\"object\")switch(e.$$typeof){case x:return Be(e.render);case j:return F(e.type,r,t);case Y:{var n=e,o=n._payload,u=n._init;try{return F(u(o),r,t)}catch{}}}return\"\"}var S=Object.prototype.hasOwnProperty,fe={},de=T.ReactDebugCurrentFrame;function A(e){if(e){var r=e._owner,t=F(e.type,e._source,r?r.type:null);de.setExtraStackFrame(t)}else de.setExtraStackFrame(null)}function Xe(e,r,t,n,o){{var u=Function.call.bind(S);for(var i in e)if(u(e,i)){var a=void 0;try{if(typeof e[i]!=\"function\"){var v=Error((n||\"React class\")+\": \"+t+\" type `\"+i+\"` is invalid; it must be a function, usually from the `prop-types` package, but received `\"+typeof e[i]+\"`.This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.\");throw v.name=\"Invariant Violation\",v}a=e[i](r,i,n,t,null,\"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED\")}catch(c){a=c}a&&!(a instanceof Error)&&(A(o),d(\"%s: type specification of %s `%s` is invalid; the type checker function must return `null` or an `Error` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).\",n||\"React class\",t,i,typeof a),A(null)),a instanceof Error&&!(a.message in fe)&&(fe[a.message]=!0,A(o),d(\"Failed %s type: %s\",t,a.message),A(null))}}}var Ge=Array.isArray;function V(e){return Ge(e)}function qe(e){{var r=typeof Symbol==\"function\"&&Symbol.toStringTag,t=r&&e[Symbol.toStringTag]||e.constructor.name||\"Object\";return t}}function ze(e){try{return ve(e),!1}catch{return!0}}function ve(e){return\"\"+e}function pe(e){if(ze(e))return d(\"The provided key is an unsupported type %s. This value must be coerced to a string before before using it here.\",qe(e)),ve(e)}var P=T.ReactCurrentOwner,He={key:!0,ref:!0,__self:!0,__source:!0},be,he,L;L={};function Je(e){if(S.call(e,\"ref\")){var r=Object.getOwnPropertyDescriptor(e,\"ref\").get;if(r&&r.isReactWarning)return!1}return e.ref!==void 0}function Ze(e){if(S.call(e,\"key\")){var r=Object.getOwnPropertyDescriptor(e,\"key\").get;if(r&&r.isReactWarning)return!1}return e.key!==void 0}function Qe(e,r){if(typeof e.ref==\"string\"&&P.current&&r&&P.current.stateNode!==r){var t=m(P.current.type);L[t]||(d('Component \"%s\" contains the string ref \"%s\". Support for string refs will be removed in a future major release. This case cannot be automatically converted to an arrow function. We ask you to manually fix this case by using useRef() or createRef() instead. Learn more about using refs safely here: https://reactjs.org/link/strict-mode-string-ref',m(P.current.type),e.ref),L[t]=!0)}}function er(e,r){{var t=function(){be||(be=!0,d(\"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)\",r))};t.isReactWarning=!0,Object.defineProperty(e,\"key\",{get:t,configurable:!0})}}function rr(e,r){{var t=function(){he||(he=!0,d(\"%s: `ref` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)\",r))};t.isReactWarning=!0,Object.defineProperty(e,\"ref\",{get:t,configurable:!0})}}var tr=function(e,r,t,n,o,u,i){var a={$$typeof:s,type:e,key:r,ref:t,props:i,_owner:u};return a._store={},Object.defineProperty(a._store,\"validated\",{configurable:!1,enumerable:!1,writable:!0,value:!1}),Object.defineProperty(a,\"_self\",{configurable:!1,enumerable:!1,writable:!1,value:n}),Object.defineProperty(a,\"_source\",{configurable:!1,enumerable:!1,writable:!1,value:o}),Object.freeze&&(Object.freeze(a.props),Object.freeze(a)),a};function nr(e,r,t,n,o){{var u,i={},a=null,v=null;t!==void 0&&(pe(t),a=\"\"+t),Ze(r)&&(pe(r.key),a=\"\"+r.key),Je(r)&&(v=r.ref,Qe(r,o));for(u in r)S.call(r,u)&&!He.hasOwnProperty(u)&&(i[u]=r[u]);if(e&&e.defaultProps){var c=e.defaultProps;for(u in c)i[u]===void 0&&(i[u]=c[u])}if(a||v){var f=typeof e==\"function\"?e.displayName||e.name||\"Unknown\":e;a&&er(i,f),v&&rr(i,f)}return tr(e,a,v,o,n,P.current,i)}}var B=T.ReactCurrentOwner,me=T.ReactDebugCurrentFrame;function w(e){if(e){var r=e._owner,t=F(e.type,e._source,r?r.type:null);me.setExtraStackFrame(t)}else me.setExtraStackFrame(null)}var K;K=!1;function X(e){return typeof e==\"object\"&&e!==null&&e.$$typeof===s}function ge(){{if(B.current){var e=m(B.current.type);if(e)return`\n\nCheck the render method of \\``+e+\"`.\"}return\"\"}}function ar(e){{if(e!==void 0){var r=e.fileName.replace(/^.*[\\\\\\/]/,\"\"),t=e.lineNumber;return`\n\nCheck your code at `+r+\":\"+t+\".\"}return\"\"}}var ye={};function ir(e){{var r=ge();if(!r){var t=typeof e==\"string\"?e:e.displayName||e.name;t&&(r=`\n\nCheck the top-level render call using <`+t+\">.\")}return r}}function _e(e,r){{if(!e._store||e._store.validated||e.key!=null)return;e._store.validated=!0;var t=ir(r);if(ye[t])return;ye[t]=!0;var n=\"\";e&&e._owner&&e._owner!==B.current&&(n=\" It was passed a child from \"+m(e._owner.type)+\".\"),w(e),d('Each child in a list should have a unique \"key\" prop.%s%s See https://reactjs.org/link/warning-keys for more information.',t,n),w(null)}}function Ee(e,r){{if(typeof e!=\"object\")return;if(V(e))for(var t=0;t\",a=\" Did you accidentally export a JSX literal instead of a component?\"):c=typeof e,d(\"React.jsx: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s\",c,a)}var f=nr(e,r,t,o,u);if(f==null)return f;if(i){var b=r.children;if(b!==void 0)if(n)if(V(b)){for(var C=0;C0?\"{key: someKey, \"+p.join(\": ..., \")+\": ...}\":\"{key: someKey}\";if(!Re[R+G]){var cr=p.length>0?\"{\"+p.join(\": ..., \")+\": ...}\":\"{}\";d(`A props object containing a \"key\" prop is being spread into JSX:\n let props = %s;\n <%s {...props} />\nReact keys must be passed directly to JSX without using spread:\n let props = %s;\n <%s key={someKey} {...props} />`,G,R,cr,R),Re[R+G]=!0}}return e===_?ur(f):or(f),f}}var lr=sr;z.Fragment=_,z.jsxDEV=lr})()});var Pe=q((Sr,Se)=>{\"use strict\";Se.exports=Oe()});var Tr={};mr(Tr,{default:()=>Rr,frontmatter:()=>_r});var y=gr(Pe()),_r={title:\"Hello World\",description:\"My first article in the new Remix site\",date:new Date(17040672e5),tags:[\"remix\",\"react\"]};function xe(l){let s=Object.assign({h1:\"h1\",p:\"p\"},l.components);return(0,y.jsxDEV)(y.Fragment,{children:[(0,y.jsxDEV)(s.h1,{id:\"hello-world\",children:\"Hello World\"},void 0,!1,{fileName:\"/Users/chrcit/Developer/chrcit.com/content/articles/_mdx_bundler_entry_point-d544e69e-1995-4bb7-b60e-96765d6a0092.mdx\",lineNumber:8,columnNumber:1},this),`\n`,(0,y.jsxDEV)(s.p,{children:\"This is my first article in the new Remix site. I'm excited to share my thoughts and experiences with you.\"},void 0,!1,{fileName:\"/Users/chrcit/Developer/chrcit.com/content/articles/_mdx_bundler_entry_point-d544e69e-1995-4bb7-b60e-96765d6a0092.mdx\",lineNumber:10,columnNumber:1},this)]},void 0,!0,{fileName:\"/Users/chrcit/Developer/chrcit.com/content/articles/_mdx_bundler_entry_point-d544e69e-1995-4bb7-b60e-96765d6a0092.mdx\",lineNumber:1,columnNumber:1},this)}function Er(l={}){let{wrapper:s}=l.components||{};return s?(0,y.jsxDEV)(s,Object.assign({},l,{children:(0,y.jsxDEV)(xe,l,void 0,!1,{fileName:\"/Users/chrcit/Developer/chrcit.com/content/articles/_mdx_bundler_entry_point-d544e69e-1995-4bb7-b60e-96765d6a0092.mdx\"},this)}),void 0,!1,{fileName:\"/Users/chrcit/Developer/chrcit.com/content/articles/_mdx_bundler_entry_point-d544e69e-1995-4bb7-b60e-96765d6a0092.mdx\"},this):xe(l)}var Rr=Er;return yr(Tr);})();\n/*! Bundled license information:\n\nreact/cjs/react-jsx-dev-runtime.development.js:\n (**\n * @license React\n * react-jsx-dev-runtime.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *)\n*/\n;return Component;" + }, + "_id": "articles/hello-world.mdx", + "_raw": { + "sourceFilePath": "articles/hello-world.mdx", + "sourceFileName": "hello-world.mdx", + "sourceFileDir": "articles", + "contentType": "mdx", + "flattenedPath": "articles/hello-world" + }, + "type": "Article", + "slug": "hello-world" + }, + "documentHash": "1734957935013", + "hasWarnings": false, + "documentTypeName": "Article" + } + } +} diff --git a/.contentlayer/generated/Article/_index.json b/.contentlayer/generated/Article/_index.json new file mode 100644 index 0000000..6992fbd --- /dev/null +++ b/.contentlayer/generated/Article/_index.json @@ -0,0 +1,25 @@ +[ + { + "title": "Hello World", + "description": "My first article in the new Remix site", + "date": "2024-01-01T00:00:00.000Z", + "tags": [ + "remix", + "react" + ], + "body": { + "raw": "\n# Hello World\n\nThis is my first article in the new Remix site. I'm excited to share my thoughts and experiences with you. ", + "code": "var Component=(()=>{var dr=Object.create;var I=Object.defineProperty;var vr=Object.getOwnPropertyDescriptor;var pr=Object.getOwnPropertyNames;var br=Object.getPrototypeOf,hr=Object.prototype.hasOwnProperty;var q=(l,s)=>()=>(s||l((s={exports:{}}).exports,s),s.exports),mr=(l,s)=>{for(var h in s)I(l,h,{get:s[h],enumerable:!0})},Te=(l,s,h,_)=>{if(s&&typeof s==\"object\"||typeof s==\"function\")for(let g of pr(s))!hr.call(l,g)&&g!==h&&I(l,g,{get:()=>s[g],enumerable:!(_=vr(s,g))||_.enumerable});return l};var gr=(l,s,h)=>(h=l!=null?dr(br(l)):{},Te(s||!l||!l.__esModule?I(h,\"default\",{value:l,enumerable:!0}):h,l)),yr=l=>Te(I({},\"__esModule\",{value:!0}),l);var Ce=q((Cr,we)=>{we.exports=React});var Oe=q(z=>{\"use strict\";(function(){\"use strict\";var l=Ce(),s=Symbol.for(\"react.element\"),h=Symbol.for(\"react.portal\"),_=Symbol.for(\"react.fragment\"),g=Symbol.for(\"react.strict_mode\"),H=Symbol.for(\"react.profiler\"),J=Symbol.for(\"react.provider\"),Z=Symbol.for(\"react.context\"),x=Symbol.for(\"react.forward_ref\"),W=Symbol.for(\"react.suspense\"),N=Symbol.for(\"react.suspense_list\"),j=Symbol.for(\"react.memo\"),Y=Symbol.for(\"react.lazy\"),je=Symbol.for(\"react.offscreen\"),Q=Symbol.iterator,De=\"@@iterator\";function ke(e){if(e===null||typeof e!=\"object\")return null;var r=Q&&e[Q]||e[De];return typeof r==\"function\"?r:null}var T=l.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;function d(e){{for(var r=arguments.length,t=new Array(r>1?r-1:0),n=1;n=1&&f>=0&&a[c]!==v[f];)f--;for(;c>=1&&f>=0;c--,f--)if(a[c]!==v[f]){if(c!==1||f!==1)do if(c--,f--,f<0||a[c]!==v[f]){var b=`\n`+a[c].replace(\" at new \",\" at \");return e.displayName&&b.includes(\"\")&&(b=b.replace(\"\",e.displayName)),typeof e==\"function\"&&k.set(e,b),b}while(c>=1&&f>=0);break}}}finally{U=!1,$.current=u,Ve(),Error.prepareStackTrace=o}var C=e?e.displayName||e.name:\"\",R=C?D(C):\"\";return typeof e==\"function\"&&k.set(e,R),R}function Be(e,r,t){return ce(e,!1)}function Ke(e){var r=e.prototype;return!!(r&&r.isReactComponent)}function F(e,r,t){if(e==null)return\"\";if(typeof e==\"function\")return ce(e,Ke(e));if(typeof e==\"string\")return D(e);switch(e){case W:return D(\"Suspense\");case N:return D(\"SuspenseList\")}if(typeof e==\"object\")switch(e.$$typeof){case x:return Be(e.render);case j:return F(e.type,r,t);case Y:{var n=e,o=n._payload,u=n._init;try{return F(u(o),r,t)}catch{}}}return\"\"}var S=Object.prototype.hasOwnProperty,fe={},de=T.ReactDebugCurrentFrame;function A(e){if(e){var r=e._owner,t=F(e.type,e._source,r?r.type:null);de.setExtraStackFrame(t)}else de.setExtraStackFrame(null)}function Xe(e,r,t,n,o){{var u=Function.call.bind(S);for(var i in e)if(u(e,i)){var a=void 0;try{if(typeof e[i]!=\"function\"){var v=Error((n||\"React class\")+\": \"+t+\" type `\"+i+\"` is invalid; it must be a function, usually from the `prop-types` package, but received `\"+typeof e[i]+\"`.This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.\");throw v.name=\"Invariant Violation\",v}a=e[i](r,i,n,t,null,\"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED\")}catch(c){a=c}a&&!(a instanceof Error)&&(A(o),d(\"%s: type specification of %s `%s` is invalid; the type checker function must return `null` or an `Error` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).\",n||\"React class\",t,i,typeof a),A(null)),a instanceof Error&&!(a.message in fe)&&(fe[a.message]=!0,A(o),d(\"Failed %s type: %s\",t,a.message),A(null))}}}var Ge=Array.isArray;function V(e){return Ge(e)}function qe(e){{var r=typeof Symbol==\"function\"&&Symbol.toStringTag,t=r&&e[Symbol.toStringTag]||e.constructor.name||\"Object\";return t}}function ze(e){try{return ve(e),!1}catch{return!0}}function ve(e){return\"\"+e}function pe(e){if(ze(e))return d(\"The provided key is an unsupported type %s. This value must be coerced to a string before before using it here.\",qe(e)),ve(e)}var P=T.ReactCurrentOwner,He={key:!0,ref:!0,__self:!0,__source:!0},be,he,L;L={};function Je(e){if(S.call(e,\"ref\")){var r=Object.getOwnPropertyDescriptor(e,\"ref\").get;if(r&&r.isReactWarning)return!1}return e.ref!==void 0}function Ze(e){if(S.call(e,\"key\")){var r=Object.getOwnPropertyDescriptor(e,\"key\").get;if(r&&r.isReactWarning)return!1}return e.key!==void 0}function Qe(e,r){if(typeof e.ref==\"string\"&&P.current&&r&&P.current.stateNode!==r){var t=m(P.current.type);L[t]||(d('Component \"%s\" contains the string ref \"%s\". Support for string refs will be removed in a future major release. This case cannot be automatically converted to an arrow function. We ask you to manually fix this case by using useRef() or createRef() instead. Learn more about using refs safely here: https://reactjs.org/link/strict-mode-string-ref',m(P.current.type),e.ref),L[t]=!0)}}function er(e,r){{var t=function(){be||(be=!0,d(\"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)\",r))};t.isReactWarning=!0,Object.defineProperty(e,\"key\",{get:t,configurable:!0})}}function rr(e,r){{var t=function(){he||(he=!0,d(\"%s: `ref` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)\",r))};t.isReactWarning=!0,Object.defineProperty(e,\"ref\",{get:t,configurable:!0})}}var tr=function(e,r,t,n,o,u,i){var a={$$typeof:s,type:e,key:r,ref:t,props:i,_owner:u};return a._store={},Object.defineProperty(a._store,\"validated\",{configurable:!1,enumerable:!1,writable:!0,value:!1}),Object.defineProperty(a,\"_self\",{configurable:!1,enumerable:!1,writable:!1,value:n}),Object.defineProperty(a,\"_source\",{configurable:!1,enumerable:!1,writable:!1,value:o}),Object.freeze&&(Object.freeze(a.props),Object.freeze(a)),a};function nr(e,r,t,n,o){{var u,i={},a=null,v=null;t!==void 0&&(pe(t),a=\"\"+t),Ze(r)&&(pe(r.key),a=\"\"+r.key),Je(r)&&(v=r.ref,Qe(r,o));for(u in r)S.call(r,u)&&!He.hasOwnProperty(u)&&(i[u]=r[u]);if(e&&e.defaultProps){var c=e.defaultProps;for(u in c)i[u]===void 0&&(i[u]=c[u])}if(a||v){var f=typeof e==\"function\"?e.displayName||e.name||\"Unknown\":e;a&&er(i,f),v&&rr(i,f)}return tr(e,a,v,o,n,P.current,i)}}var B=T.ReactCurrentOwner,me=T.ReactDebugCurrentFrame;function w(e){if(e){var r=e._owner,t=F(e.type,e._source,r?r.type:null);me.setExtraStackFrame(t)}else me.setExtraStackFrame(null)}var K;K=!1;function X(e){return typeof e==\"object\"&&e!==null&&e.$$typeof===s}function ge(){{if(B.current){var e=m(B.current.type);if(e)return`\n\nCheck the render method of \\``+e+\"`.\"}return\"\"}}function ar(e){{if(e!==void 0){var r=e.fileName.replace(/^.*[\\\\\\/]/,\"\"),t=e.lineNumber;return`\n\nCheck your code at `+r+\":\"+t+\".\"}return\"\"}}var ye={};function ir(e){{var r=ge();if(!r){var t=typeof e==\"string\"?e:e.displayName||e.name;t&&(r=`\n\nCheck the top-level render call using <`+t+\">.\")}return r}}function _e(e,r){{if(!e._store||e._store.validated||e.key!=null)return;e._store.validated=!0;var t=ir(r);if(ye[t])return;ye[t]=!0;var n=\"\";e&&e._owner&&e._owner!==B.current&&(n=\" It was passed a child from \"+m(e._owner.type)+\".\"),w(e),d('Each child in a list should have a unique \"key\" prop.%s%s See https://reactjs.org/link/warning-keys for more information.',t,n),w(null)}}function Ee(e,r){{if(typeof e!=\"object\")return;if(V(e))for(var t=0;t\",a=\" Did you accidentally export a JSX literal instead of a component?\"):c=typeof e,d(\"React.jsx: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s\",c,a)}var f=nr(e,r,t,o,u);if(f==null)return f;if(i){var b=r.children;if(b!==void 0)if(n)if(V(b)){for(var C=0;C0?\"{key: someKey, \"+p.join(\": ..., \")+\": ...}\":\"{key: someKey}\";if(!Re[R+G]){var cr=p.length>0?\"{\"+p.join(\": ..., \")+\": ...}\":\"{}\";d(`A props object containing a \"key\" prop is being spread into JSX:\n let props = %s;\n <%s {...props} />\nReact keys must be passed directly to JSX without using spread:\n let props = %s;\n <%s key={someKey} {...props} />`,G,R,cr,R),Re[R+G]=!0}}return e===_?ur(f):or(f),f}}var lr=sr;z.Fragment=_,z.jsxDEV=lr})()});var Pe=q((Sr,Se)=>{\"use strict\";Se.exports=Oe()});var Tr={};mr(Tr,{default:()=>Rr,frontmatter:()=>_r});var y=gr(Pe()),_r={title:\"Hello World\",description:\"My first article in the new Remix site\",date:new Date(17040672e5),tags:[\"remix\",\"react\"]};function xe(l){let s=Object.assign({h1:\"h1\",p:\"p\"},l.components);return(0,y.jsxDEV)(y.Fragment,{children:[(0,y.jsxDEV)(s.h1,{id:\"hello-world\",children:\"Hello World\"},void 0,!1,{fileName:\"/Users/chrcit/Developer/chrcit.com/content/articles/_mdx_bundler_entry_point-d544e69e-1995-4bb7-b60e-96765d6a0092.mdx\",lineNumber:8,columnNumber:1},this),`\n`,(0,y.jsxDEV)(s.p,{children:\"This is my first article in the new Remix site. I'm excited to share my thoughts and experiences with you.\"},void 0,!1,{fileName:\"/Users/chrcit/Developer/chrcit.com/content/articles/_mdx_bundler_entry_point-d544e69e-1995-4bb7-b60e-96765d6a0092.mdx\",lineNumber:10,columnNumber:1},this)]},void 0,!0,{fileName:\"/Users/chrcit/Developer/chrcit.com/content/articles/_mdx_bundler_entry_point-d544e69e-1995-4bb7-b60e-96765d6a0092.mdx\",lineNumber:1,columnNumber:1},this)}function Er(l={}){let{wrapper:s}=l.components||{};return s?(0,y.jsxDEV)(s,Object.assign({},l,{children:(0,y.jsxDEV)(xe,l,void 0,!1,{fileName:\"/Users/chrcit/Developer/chrcit.com/content/articles/_mdx_bundler_entry_point-d544e69e-1995-4bb7-b60e-96765d6a0092.mdx\"},this)}),void 0,!1,{fileName:\"/Users/chrcit/Developer/chrcit.com/content/articles/_mdx_bundler_entry_point-d544e69e-1995-4bb7-b60e-96765d6a0092.mdx\"},this):xe(l)}var Rr=Er;return yr(Tr);})();\n/*! Bundled license information:\n\nreact/cjs/react-jsx-dev-runtime.development.js:\n (**\n * @license React\n * react-jsx-dev-runtime.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *)\n*/\n;return Component;" + }, + "_id": "articles/hello-world.mdx", + "_raw": { + "sourceFilePath": "articles/hello-world.mdx", + "sourceFileName": "hello-world.mdx", + "sourceFileDir": "articles", + "contentType": "mdx", + "flattenedPath": "articles/hello-world" + }, + "type": "Article", + "slug": "hello-world" + } +] \ No newline at end of file diff --git a/.contentlayer/generated/Article/_index.mjs b/.contentlayer/generated/Article/_index.mjs new file mode 100644 index 0000000..589c2a3 --- /dev/null +++ b/.contentlayer/generated/Article/_index.mjs @@ -0,0 +1,5 @@ +// NOTE This file is auto-generated by Contentlayer + +import articles__helloWorldMdx from './articles__hello-world.mdx.json' assert { type: 'json' } + +export const allArticles = [articles__helloWorldMdx] diff --git a/.contentlayer/generated/Article/articles__hello-world.mdx.json b/.contentlayer/generated/Article/articles__hello-world.mdx.json new file mode 100644 index 0000000..849b257 --- /dev/null +++ b/.contentlayer/generated/Article/articles__hello-world.mdx.json @@ -0,0 +1,23 @@ +{ + "title": "Hello World", + "description": "My first article in the new Remix site", + "date": "2024-01-01T00:00:00.000Z", + "tags": [ + "remix", + "react" + ], + "body": { + "raw": "\n# Hello World\n\nThis is my first article in the new Remix site. I'm excited to share my thoughts and experiences with you. ", + "code": "var Component=(()=>{var dr=Object.create;var I=Object.defineProperty;var vr=Object.getOwnPropertyDescriptor;var pr=Object.getOwnPropertyNames;var br=Object.getPrototypeOf,hr=Object.prototype.hasOwnProperty;var q=(l,s)=>()=>(s||l((s={exports:{}}).exports,s),s.exports),mr=(l,s)=>{for(var h in s)I(l,h,{get:s[h],enumerable:!0})},Te=(l,s,h,_)=>{if(s&&typeof s==\"object\"||typeof s==\"function\")for(let g of pr(s))!hr.call(l,g)&&g!==h&&I(l,g,{get:()=>s[g],enumerable:!(_=vr(s,g))||_.enumerable});return l};var gr=(l,s,h)=>(h=l!=null?dr(br(l)):{},Te(s||!l||!l.__esModule?I(h,\"default\",{value:l,enumerable:!0}):h,l)),yr=l=>Te(I({},\"__esModule\",{value:!0}),l);var Ce=q((Cr,we)=>{we.exports=React});var Oe=q(z=>{\"use strict\";(function(){\"use strict\";var l=Ce(),s=Symbol.for(\"react.element\"),h=Symbol.for(\"react.portal\"),_=Symbol.for(\"react.fragment\"),g=Symbol.for(\"react.strict_mode\"),H=Symbol.for(\"react.profiler\"),J=Symbol.for(\"react.provider\"),Z=Symbol.for(\"react.context\"),x=Symbol.for(\"react.forward_ref\"),W=Symbol.for(\"react.suspense\"),N=Symbol.for(\"react.suspense_list\"),j=Symbol.for(\"react.memo\"),Y=Symbol.for(\"react.lazy\"),je=Symbol.for(\"react.offscreen\"),Q=Symbol.iterator,De=\"@@iterator\";function ke(e){if(e===null||typeof e!=\"object\")return null;var r=Q&&e[Q]||e[De];return typeof r==\"function\"?r:null}var T=l.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;function d(e){{for(var r=arguments.length,t=new Array(r>1?r-1:0),n=1;n=1&&f>=0&&a[c]!==v[f];)f--;for(;c>=1&&f>=0;c--,f--)if(a[c]!==v[f]){if(c!==1||f!==1)do if(c--,f--,f<0||a[c]!==v[f]){var b=`\n`+a[c].replace(\" at new \",\" at \");return e.displayName&&b.includes(\"\")&&(b=b.replace(\"\",e.displayName)),typeof e==\"function\"&&k.set(e,b),b}while(c>=1&&f>=0);break}}}finally{U=!1,$.current=u,Ve(),Error.prepareStackTrace=o}var C=e?e.displayName||e.name:\"\",R=C?D(C):\"\";return typeof e==\"function\"&&k.set(e,R),R}function Be(e,r,t){return ce(e,!1)}function Ke(e){var r=e.prototype;return!!(r&&r.isReactComponent)}function F(e,r,t){if(e==null)return\"\";if(typeof e==\"function\")return ce(e,Ke(e));if(typeof e==\"string\")return D(e);switch(e){case W:return D(\"Suspense\");case N:return D(\"SuspenseList\")}if(typeof e==\"object\")switch(e.$$typeof){case x:return Be(e.render);case j:return F(e.type,r,t);case Y:{var n=e,o=n._payload,u=n._init;try{return F(u(o),r,t)}catch{}}}return\"\"}var S=Object.prototype.hasOwnProperty,fe={},de=T.ReactDebugCurrentFrame;function A(e){if(e){var r=e._owner,t=F(e.type,e._source,r?r.type:null);de.setExtraStackFrame(t)}else de.setExtraStackFrame(null)}function Xe(e,r,t,n,o){{var u=Function.call.bind(S);for(var i in e)if(u(e,i)){var a=void 0;try{if(typeof e[i]!=\"function\"){var v=Error((n||\"React class\")+\": \"+t+\" type `\"+i+\"` is invalid; it must be a function, usually from the `prop-types` package, but received `\"+typeof e[i]+\"`.This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.\");throw v.name=\"Invariant Violation\",v}a=e[i](r,i,n,t,null,\"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED\")}catch(c){a=c}a&&!(a instanceof Error)&&(A(o),d(\"%s: type specification of %s `%s` is invalid; the type checker function must return `null` or an `Error` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).\",n||\"React class\",t,i,typeof a),A(null)),a instanceof Error&&!(a.message in fe)&&(fe[a.message]=!0,A(o),d(\"Failed %s type: %s\",t,a.message),A(null))}}}var Ge=Array.isArray;function V(e){return Ge(e)}function qe(e){{var r=typeof Symbol==\"function\"&&Symbol.toStringTag,t=r&&e[Symbol.toStringTag]||e.constructor.name||\"Object\";return t}}function ze(e){try{return ve(e),!1}catch{return!0}}function ve(e){return\"\"+e}function pe(e){if(ze(e))return d(\"The provided key is an unsupported type %s. This value must be coerced to a string before before using it here.\",qe(e)),ve(e)}var P=T.ReactCurrentOwner,He={key:!0,ref:!0,__self:!0,__source:!0},be,he,L;L={};function Je(e){if(S.call(e,\"ref\")){var r=Object.getOwnPropertyDescriptor(e,\"ref\").get;if(r&&r.isReactWarning)return!1}return e.ref!==void 0}function Ze(e){if(S.call(e,\"key\")){var r=Object.getOwnPropertyDescriptor(e,\"key\").get;if(r&&r.isReactWarning)return!1}return e.key!==void 0}function Qe(e,r){if(typeof e.ref==\"string\"&&P.current&&r&&P.current.stateNode!==r){var t=m(P.current.type);L[t]||(d('Component \"%s\" contains the string ref \"%s\". Support for string refs will be removed in a future major release. This case cannot be automatically converted to an arrow function. We ask you to manually fix this case by using useRef() or createRef() instead. Learn more about using refs safely here: https://reactjs.org/link/strict-mode-string-ref',m(P.current.type),e.ref),L[t]=!0)}}function er(e,r){{var t=function(){be||(be=!0,d(\"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)\",r))};t.isReactWarning=!0,Object.defineProperty(e,\"key\",{get:t,configurable:!0})}}function rr(e,r){{var t=function(){he||(he=!0,d(\"%s: `ref` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)\",r))};t.isReactWarning=!0,Object.defineProperty(e,\"ref\",{get:t,configurable:!0})}}var tr=function(e,r,t,n,o,u,i){var a={$$typeof:s,type:e,key:r,ref:t,props:i,_owner:u};return a._store={},Object.defineProperty(a._store,\"validated\",{configurable:!1,enumerable:!1,writable:!0,value:!1}),Object.defineProperty(a,\"_self\",{configurable:!1,enumerable:!1,writable:!1,value:n}),Object.defineProperty(a,\"_source\",{configurable:!1,enumerable:!1,writable:!1,value:o}),Object.freeze&&(Object.freeze(a.props),Object.freeze(a)),a};function nr(e,r,t,n,o){{var u,i={},a=null,v=null;t!==void 0&&(pe(t),a=\"\"+t),Ze(r)&&(pe(r.key),a=\"\"+r.key),Je(r)&&(v=r.ref,Qe(r,o));for(u in r)S.call(r,u)&&!He.hasOwnProperty(u)&&(i[u]=r[u]);if(e&&e.defaultProps){var c=e.defaultProps;for(u in c)i[u]===void 0&&(i[u]=c[u])}if(a||v){var f=typeof e==\"function\"?e.displayName||e.name||\"Unknown\":e;a&&er(i,f),v&&rr(i,f)}return tr(e,a,v,o,n,P.current,i)}}var B=T.ReactCurrentOwner,me=T.ReactDebugCurrentFrame;function w(e){if(e){var r=e._owner,t=F(e.type,e._source,r?r.type:null);me.setExtraStackFrame(t)}else me.setExtraStackFrame(null)}var K;K=!1;function X(e){return typeof e==\"object\"&&e!==null&&e.$$typeof===s}function ge(){{if(B.current){var e=m(B.current.type);if(e)return`\n\nCheck the render method of \\``+e+\"`.\"}return\"\"}}function ar(e){{if(e!==void 0){var r=e.fileName.replace(/^.*[\\\\\\/]/,\"\"),t=e.lineNumber;return`\n\nCheck your code at `+r+\":\"+t+\".\"}return\"\"}}var ye={};function ir(e){{var r=ge();if(!r){var t=typeof e==\"string\"?e:e.displayName||e.name;t&&(r=`\n\nCheck the top-level render call using <`+t+\">.\")}return r}}function _e(e,r){{if(!e._store||e._store.validated||e.key!=null)return;e._store.validated=!0;var t=ir(r);if(ye[t])return;ye[t]=!0;var n=\"\";e&&e._owner&&e._owner!==B.current&&(n=\" It was passed a child from \"+m(e._owner.type)+\".\"),w(e),d('Each child in a list should have a unique \"key\" prop.%s%s See https://reactjs.org/link/warning-keys for more information.',t,n),w(null)}}function Ee(e,r){{if(typeof e!=\"object\")return;if(V(e))for(var t=0;t\",a=\" Did you accidentally export a JSX literal instead of a component?\"):c=typeof e,d(\"React.jsx: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s\",c,a)}var f=nr(e,r,t,o,u);if(f==null)return f;if(i){var b=r.children;if(b!==void 0)if(n)if(V(b)){for(var C=0;C0?\"{key: someKey, \"+p.join(\": ..., \")+\": ...}\":\"{key: someKey}\";if(!Re[R+G]){var cr=p.length>0?\"{\"+p.join(\": ..., \")+\": ...}\":\"{}\";d(`A props object containing a \"key\" prop is being spread into JSX:\n let props = %s;\n <%s {...props} />\nReact keys must be passed directly to JSX without using spread:\n let props = %s;\n <%s key={someKey} {...props} />`,G,R,cr,R),Re[R+G]=!0}}return e===_?ur(f):or(f),f}}var lr=sr;z.Fragment=_,z.jsxDEV=lr})()});var Pe=q((Sr,Se)=>{\"use strict\";Se.exports=Oe()});var Tr={};mr(Tr,{default:()=>Rr,frontmatter:()=>_r});var y=gr(Pe()),_r={title:\"Hello World\",description:\"My first article in the new Remix site\",date:new Date(17040672e5),tags:[\"remix\",\"react\"]};function xe(l){let s=Object.assign({h1:\"h1\",p:\"p\"},l.components);return(0,y.jsxDEV)(y.Fragment,{children:[(0,y.jsxDEV)(s.h1,{id:\"hello-world\",children:\"Hello World\"},void 0,!1,{fileName:\"/Users/chrcit/Developer/chrcit.com/content/articles/_mdx_bundler_entry_point-d544e69e-1995-4bb7-b60e-96765d6a0092.mdx\",lineNumber:8,columnNumber:1},this),`\n`,(0,y.jsxDEV)(s.p,{children:\"This is my first article in the new Remix site. I'm excited to share my thoughts and experiences with you.\"},void 0,!1,{fileName:\"/Users/chrcit/Developer/chrcit.com/content/articles/_mdx_bundler_entry_point-d544e69e-1995-4bb7-b60e-96765d6a0092.mdx\",lineNumber:10,columnNumber:1},this)]},void 0,!0,{fileName:\"/Users/chrcit/Developer/chrcit.com/content/articles/_mdx_bundler_entry_point-d544e69e-1995-4bb7-b60e-96765d6a0092.mdx\",lineNumber:1,columnNumber:1},this)}function Er(l={}){let{wrapper:s}=l.components||{};return s?(0,y.jsxDEV)(s,Object.assign({},l,{children:(0,y.jsxDEV)(xe,l,void 0,!1,{fileName:\"/Users/chrcit/Developer/chrcit.com/content/articles/_mdx_bundler_entry_point-d544e69e-1995-4bb7-b60e-96765d6a0092.mdx\"},this)}),void 0,!1,{fileName:\"/Users/chrcit/Developer/chrcit.com/content/articles/_mdx_bundler_entry_point-d544e69e-1995-4bb7-b60e-96765d6a0092.mdx\"},this):xe(l)}var Rr=Er;return yr(Tr);})();\n/*! Bundled license information:\n\nreact/cjs/react-jsx-dev-runtime.development.js:\n (**\n * @license React\n * react-jsx-dev-runtime.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *)\n*/\n;return Component;" + }, + "_id": "articles/hello-world.mdx", + "_raw": { + "sourceFilePath": "articles/hello-world.mdx", + "sourceFileName": "hello-world.mdx", + "sourceFileDir": "articles", + "contentType": "mdx", + "flattenedPath": "articles/hello-world" + }, + "type": "Article", + "slug": "hello-world" +} \ No newline at end of file diff --git a/.contentlayer/generated/Book/_index.json b/.contentlayer/generated/Book/_index.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/.contentlayer/generated/Book/_index.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/.contentlayer/generated/Book/_index.mjs b/.contentlayer/generated/Book/_index.mjs new file mode 100644 index 0000000..148add0 --- /dev/null +++ b/.contentlayer/generated/Book/_index.mjs @@ -0,0 +1,5 @@ +// NOTE This file is auto-generated by Contentlayer + + + +export const allBooks = [] diff --git a/.contentlayer/generated/Project/_index.json b/.contentlayer/generated/Project/_index.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/.contentlayer/generated/Project/_index.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/.contentlayer/generated/Project/_index.mjs b/.contentlayer/generated/Project/_index.mjs new file mode 100644 index 0000000..5cab7a5 --- /dev/null +++ b/.contentlayer/generated/Project/_index.mjs @@ -0,0 +1,5 @@ +// NOTE This file is auto-generated by Contentlayer + + + +export const allProjects = [] diff --git a/.contentlayer/generated/index.d.ts b/.contentlayer/generated/index.d.ts new file mode 100644 index 0000000..f3695ad --- /dev/null +++ b/.contentlayer/generated/index.d.ts @@ -0,0 +1,14 @@ +// NOTE This file is auto-generated by Contentlayer + +import { Article, Project, Book, DocumentTypes, DataExports } from './types' +import { SourceProvideSchemaErrorJSON, SourceFetchDataErrorJSON } from 'contentlayer/core' + +export * from './types' + +export declare const allArticles: Article[] +export declare const allProjects: Project[] +export declare const allBooks: Book[] + +export declare const allDocuments: DocumentTypes[] + + diff --git a/.contentlayer/generated/index.mjs b/.contentlayer/generated/index.mjs new file mode 100644 index 0000000..ae41766 --- /dev/null +++ b/.contentlayer/generated/index.mjs @@ -0,0 +1,15 @@ +// NOTE This file is auto-generated by Contentlayer + +export { isType } from 'contentlayer/client' + +// NOTE During development Contentlayer imports from `.mjs` files to improve HMR speeds. +// During (production) builds Contentlayer it imports from `.json` files to improve build performance. +import allArticles from './Article/_index.json' assert { type: 'json' } +import allProjects from './Project/_index.json' assert { type: 'json' } +import allBooks from './Book/_index.json' assert { type: 'json' } + +export { allArticles, allProjects, allBooks } + +export const allDocuments = [...allArticles, ...allProjects, ...allBooks] + + diff --git a/.contentlayer/generated/types.d.ts b/.contentlayer/generated/types.d.ts new file mode 100644 index 0000000..79dc0b3 --- /dev/null +++ b/.contentlayer/generated/types.d.ts @@ -0,0 +1,104 @@ +// NOTE This file is auto-generated by Contentlayer + +import type { Markdown, MDX, ImageFieldData, IsoDateTimeString } from 'contentlayer/core' +import * as Local from 'contentlayer/source-files' + +export { isType } from 'contentlayer/client' + +export type { Markdown, MDX, ImageFieldData, IsoDateTimeString } + +/** Document types */ +export type Article = { + /** File path relative to `contentDirPath` */ + _id: string + _raw: Local.RawDocumentData + type: 'Article' + title: string + description: string + date: IsoDateTimeString + tags: string[] + /** MDX file body */ + body: MDX + slug: string +} + +export type Book = { + /** File path relative to `contentDirPath` */ + _id: string + _raw: Local.RawDocumentData + type: 'Book' + title: string + description: string + author: string + rating: number + date: IsoDateTimeString + tags: string[] + cover: string + /** MDX file body */ + body: MDX + slug: string +} + +export type Project = { + /** File path relative to `contentDirPath` */ + _id: string + _raw: Local.RawDocumentData + type: 'Project' + title: string + description: string + date: IsoDateTimeString + tags: string[] + url?: string | undefined + /** MDX file body */ + body: MDX + slug: string +} + +/** Nested types */ + + +/** Helper types */ + +export type AllTypes = DocumentTypes | NestedTypes +export type AllTypeNames = DocumentTypeNames | NestedTypeNames + +export type DocumentTypes = Article | Book | Project +export type DocumentTypeNames = 'Article' | 'Book' | 'Project' + +export type NestedTypes = never +export type NestedTypeNames = never + +export type DataExports = { + allDocuments: DocumentTypes[] + allArticles: Article[] + allProjects: Project[] + allBooks: Book[] +} + + +export interface ContentlayerGenTypes { + documentTypes: DocumentTypes + documentTypeMap: DocumentTypeMap + documentTypeNames: DocumentTypeNames + nestedTypes: NestedTypes + nestedTypeMap: NestedTypeMap + nestedTypeNames: NestedTypeNames + allTypeNames: AllTypeNames + dataExports: DataExports +} + +declare global { + interface ContentlayerGen extends ContentlayerGenTypes {} +} + +export type DocumentTypeMap = { + Article: Article + Book: Book + Project: Project +} + +export type NestedTypeMap = { + +} + + \ No newline at end of file diff --git a/.contentlayer/package.json b/.contentlayer/package.json new file mode 100644 index 0000000..a94c714 --- /dev/null +++ b/.contentlayer/package.json @@ -0,0 +1,17 @@ +{ + "name": "dot-contentlayer", + "description": "This package is auto-generated by Contentlayer", + "version": "0.0.0-H3R7XACO", + "exports": { + "./generated": { + "import": "./generated/index.mjs" + } + }, + "typesVersions": { + "*": { + "generated": [ + "./generated" + ] + } + } +} \ No newline at end of file diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..9b8d514 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,4 @@ +.react-router +build +node_modules +README.md \ No newline at end of file diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..324a37d --- /dev/null +++ b/.env.example @@ -0,0 +1,3 @@ +SPOTIFY_CLIENT_ID= +SPOTIFY_CLIENT_SECRET= +SPOTIFY_REFRESH_TOKEN= \ No newline at end of file diff --git a/.gitignore b/.gitignore index 6d4c0aa..25410e6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,21 +1,10 @@ -# build output -dist/ - -# generated types -.astro/ - -# dependencies -node_modules/ - -# logs -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* - -# environment variables +.DS_Store .env -.env.production +node_modules/ +**/node_modules/ +.astro/ +astro-legacy/dist/ -# macOS-specific files -.DS_Store +# React Router +/.react-router/ +/build/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..207bf93 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,22 @@ +FROM node:20-alpine AS development-dependencies-env +COPY . /app +WORKDIR /app +RUN npm ci + +FROM node:20-alpine AS production-dependencies-env +COPY ./package.json package-lock.json /app/ +WORKDIR /app +RUN npm ci --omit=dev + +FROM node:20-alpine AS build-env +COPY . /app/ +COPY --from=development-dependencies-env /app/node_modules /app/node_modules +WORKDIR /app +RUN npm run build + +FROM node:20-alpine +COPY ./package.json package-lock.json /app/ +COPY --from=production-dependencies-env /app/node_modules /app/node_modules +COPY --from=build-env /app/build /app/build +WORKDIR /app +CMD ["npm", "run", "start"] \ No newline at end of file diff --git a/README.md b/README.md index b78c97b..5c4780a 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,87 @@ -# chrcit.com +# Welcome to React Router! -This is the repository for my personal website. +A modern, production-ready template for building full-stack React applications using React Router. -It's still a work in progress, so please excuse the mess. In the future I want to replace the Twitter, Reddit, Youtube, and Instagram embeds with custom components that don't require JavaScript. +[![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/remix-run/react-router-templates/tree/main/default) -## Stack +## Features -- [Astro](https://astro.build/) -- [Tailwind CSS](https://tailwindcss.com/) -- [MDX](https://mdxjs.com/) -- [Font Source](https://fontsource.org/) -- [TS Particles](https://particles.js.org/) +- 🚀 Server-side rendering +- ⚡️ Hot Module Replacement (HMR) +- 📦 Asset bundling and optimization +- 🔄 Data loading and mutations +- 🔒 TypeScript by default +- 🎉 TailwindCSS for styling +- 📖 [React Router docs](https://reactrouter.com/) + +## Getting Started + +### Installation + +Install the dependencies: + +```bash +npm install +``` + +### Development + +Start the development server with HMR: + +```bash +npm run dev +``` + +Your application will be available at `http://localhost:5173`. + +## Building for Production + +Create a production build: + +```bash +npm run build +``` + +## Deployment + +### Docker Deployment + +To build and run using Docker: + +```bash +docker build -t my-app . + +# Run the container +docker run -p 3000:3000 my-app +``` + +The containerized application can be deployed to any platform that supports Docker, including: + +- AWS ECS +- Google Cloud Run +- Azure Container Apps +- Digital Ocean App Platform +- Fly.io +- Railway + +### DIY Deployment + +If you're familiar with deploying Node applications, the built-in app server is production-ready. + +Make sure to deploy the output of `npm run build` + +``` +├── package.json +├── package-lock.json (or pnpm-lock.yaml, or bun.lockb) +├── build/ +│ ├── client/ # Static assets +│ └── server/ # Server-side code +``` + +## Styling + +This template comes with [Tailwind CSS](https://tailwindcss.com/) already configured for a simple default starting experience. You can use whatever CSS framework you prefer. + +--- + +Built with ❤️ using React Router. diff --git a/app/app.css b/app/app.css new file mode 100644 index 0000000..2436fef --- /dev/null +++ b/app/app.css @@ -0,0 +1,267 @@ +@import "@fontsource/syne"; +@import "@fontsource/ibm-plex-sans"; +@import "@fontsource/ibm-plex-mono"; +@import "tailwindcss"; +@plugin "@tailwindcss/typography"; +@plugin "@tailwindcss/forms"; + +@theme { + --font-display: "Syne", "Helvetica Neue", sans-serif; + --font-sans: "IBM Plex Sans", "Helvetica Neue", sans-serif; + --font-mono: "IBM Plex Mono", ui-monospace, "SFMono-Regular", monospace; + + --color-ink: oklch(0.95 0.01 90); + --color-paper: oklch(0.08 0.03 320); + --color-brand: oklch(0.72 0.25 8); + --color-brand-strong: oklch(0.68 0.27 8); + --color-mist: oklch(0.3 0.04 320); + --color-clay: oklch(0.8 0.12 18); + --color-shadow: oklch(0.02 0.02 310 / 0.7); + + --radius-xl: 1.25rem; + --shadow-glow: 0 30px 80px -50px oklch(0.52 0.18 29 / 0.45); + --shadow-soft: 0 20px 60px -30px oklch(0.2 0.02 15 / 0.2); +} + +@layer base { + :root { + --player-offset: 0px; + } +} + +html, +body { + height: 100%; +} + +* { + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; +} + +body { + @apply bg-[color:var(--color-paper)] text-[color:var(--color-ink)] font-sans; + min-height: 100dvh; + overflow: hidden; + background-image: + radial-gradient(circle at 14% 12%, oklch(0.58 0.26 12 / 0.45), transparent 48%), + radial-gradient(circle at 82% 8%, oklch(0.46 0.2 330 / 0.35), transparent 44%), + radial-gradient(circle at 50% 88%, oklch(0.42 0.18 12 / 0.35), transparent 55%), + linear-gradient(160deg, oklch(0.14 0.06 335), oklch(0.07 0.04 310)); + -webkit-tap-highlight-color: transparent; +} + +body::before { + content: ""; + position: fixed; + inset: 0; + pointer-events: none; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='240' height='240' viewBox='0 0 240 240'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.8' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='240' height='240' filter='url(%23n)' opacity='0.08'/%3E%3C/svg%3E"); + mix-blend-mode: multiply; + z-index: 0; +} + +::selection { + background-color: color-mix(in oklch, var(--color-brand) 90%, black 10%); + color: black; +} + +a { + color: inherit; +} + +a:hover { + color: var(--color-brand-strong); +} + +img { + max-width: 100%; +} + +:focus-visible { + outline: none; + box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-brand) 60%, black 40%); +} + +@keyframes rise { + from { + opacity: 0; + transform: translateY(24px) scale(0.98); + } + to { + opacity: 1; + transform: translateY(0) scale(1); + } +} + +.reveal { + animation: rise 600ms ease-out both; +} + +@starting-style { + .reveal { + opacity: 0; + transform: translateY(24px) scale(0.98); + } +} + +@media (prefers-reduced-motion: reduce) { + .reveal { + animation: none; + } +} + +@media (hover: hover) { + .pressable:active { + transform: scale(0.98); + } +} + +[data-noise] { + position: relative; +} + +[data-noise]::after { + content: ""; + position: absolute; + inset: 0; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='200' height='200' filter='url(%23n)' opacity='0.12'/%3E%3C/svg%3E"); + opacity: 0.2; + pointer-events: none; + mix-blend-mode: multiply; +} + +@keyframes note-float { + 0% { + opacity: 0; + transform: translate(0, 6px) scale(0.7) rotate(0deg); + } + 15% { + opacity: 1; + } + 100% { + opacity: 0; + transform: translate(var(--note-x, 20px), -48px) scale(1.2) + rotate(var(--note-rot, 12deg)); + } +} + +@keyframes player-glow { + 0%, + 100% { + box-shadow: + 0 0 0 1px color-mix(in oklch, var(--color-brand) 28%, transparent), + 0 20px 70px -30px color-mix(in oklch, var(--color-brand) 38%, black); + } + 50% { + box-shadow: + 0 0 0 1px color-mix(in oklch, var(--color-brand) 45%, transparent), + 0 26px 90px -32px color-mix(in oklch, var(--color-brand) 55%, black); + } +} + +.music-player { + position: relative; + animation: player-glow 10s ease-in-out infinite; +} + +.music-player::before { + content: ""; + position: absolute; + inset: -20%; + background: radial-gradient( + circle at 20% 30%, + color-mix(in oklch, var(--color-brand) 35%, transparent), + transparent 60% + ); + opacity: 0.5; + filter: blur(32px); + z-index: -1; + animation: player-breathe 12s ease-in-out infinite; + pointer-events: none; +} + +.music-note-burst { + position: absolute; + right: 1.5rem; + top: -0.5rem; + height: 2.5rem; + width: 6rem; + pointer-events: none; +} + +@keyframes player-breathe { + 0%, + 100% { + transform: translate3d(0, 0, 0) scale(1); + opacity: 0.45; + } + 50% { + transform: translate3d(10px, -8px, 0) scale(1.05); + opacity: 0.7; + } +} + +.music-note { + position: absolute; + font-size: 1rem; + color: color-mix(in oklch, var(--color-brand) 70%, white 30%); + text-shadow: 0 0 16px color-mix(in oklch, var(--color-brand) 55%, black); + animation: note-float 1.6s ease-out both; +} + +.music-note:nth-child(1) { + --note-x: -16px; + --note-rot: -8deg; + animation-delay: 0ms; +} + +.music-note:nth-child(2) { + --note-x: 8px; + --note-rot: 12deg; + animation-delay: 120ms; +} + +.music-note:nth-child(3) { + --note-x: 24px; + --note-rot: -16deg; + animation-delay: 220ms; +} + +.music-note:nth-child(4) { + --note-x: 38px; + --note-rot: 18deg; + animation-delay: 320ms; +} + +.music-tile { + content-visibility: auto; + contain-intrinsic-size: 340px 420px; + contain: layout paint style; +} + +.scroll-minimal { + scrollbar-width: thin; + scrollbar-color: color-mix(in oklch, var(--color-ink) 30%, transparent) transparent; +} + +.scroll-minimal::-webkit-scrollbar { + width: 6px; + height: 6px; +} + +.scroll-minimal::-webkit-scrollbar-thumb { + background: color-mix(in oklch, var(--color-ink) 30%, transparent); + border-radius: 999px; +} + +@media (prefers-reduced-motion: reduce) { + .music-player { + animation: none; + } + + .music-note { + animation: none; + opacity: 0; + } +} diff --git a/app/components/ContentCard.tsx b/app/components/ContentCard.tsx new file mode 100644 index 0000000..32d63a8 --- /dev/null +++ b/app/components/ContentCard.tsx @@ -0,0 +1,52 @@ +import { Link } from "react-router"; + +export type ContentCardProps = { + to: string; + title: string; + description: string; + eyebrow?: string; + image?: string; + index?: number; +}; + +export function ContentCard({ + to, + title, + description, + eyebrow, + image, + index = 0, +}: ContentCardProps) { + return ( + + {image ? ( +
+ {title} +
+ ) : null} +
+ {eyebrow ? ( +

+ {eyebrow} +

+ ) : null} +

+ {title} +

+

{description}

+
+ + Explore / + + + ); +} diff --git a/app/components/PageIntro.tsx b/app/components/PageIntro.tsx new file mode 100644 index 0000000..c818076 --- /dev/null +++ b/app/components/PageIntro.tsx @@ -0,0 +1,21 @@ +export function PageIntro({ + eyebrow, + title, + description, +}: { + eyebrow: string; + title: string; + description: string; +}) { + return ( +
+

+ {eyebrow} +

+

+ {title} +

+

{description}

+
+ ); +} diff --git a/app/components/SocialLinks.tsx b/app/components/SocialLinks.tsx new file mode 100644 index 0000000..0bf3046 --- /dev/null +++ b/app/components/SocialLinks.tsx @@ -0,0 +1,62 @@ +import { + Github, + Instagram, + Linkedin, + Mail, + Twitch, + Twitter, + Youtube, +} from "lucide-react"; +import { socials, type SocialKey } from "~/data/socials"; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "~/components/ui/tooltip"; + +const labels: Record = { + email: "Email", + github: "GitHub", + instagram: "Instagram", + linkedin: "LinkedIn", + twitter: "Twitter", + twitch: "Twitch", + youtube: "YouTube", +}; + +const icons: Record = { + email: