{"sha":"4b2613c90b8a156fd557a6569138a5416a1876cd","node_id":"C_kwDORD3Y59oAKDRiMjYxM2M5MGI4YTE1NmZkNTU3YTY1NjkxMzhhNTQxNmExODc2Y2Q","commit":{"author":{"name":"gizzy","email":"nerop455@gmail.com","date":"2026-01-31T09:58:07Z"},"committer":{"name":"gizzy","email":"nerop455@gmail.com","date":"2026-01-31T09:58:07Z"},"message":"feat: basic ahh blog i ripped off from someones site but trying to make fit this design","tree":{"sha":"261e9ac50ca20f2795894a942f7e0b6afcb909e1","url":"https://api.github.com/repos/GizzyUwU/govgiz/git/trees/261e9ac50ca20f2795894a942f7e0b6afcb909e1"},"url":"https://api.github.com/repos/GizzyUwU/govgiz/git/commits/4b2613c90b8a156fd557a6569138a5416a1876cd","comment_count":0,"verification":{"verified":false,"reason":"unsigned","signature":null,"payload":null,"verified_at":null}},"url":"https://api.github.com/repos/GizzyUwU/govgiz/commits/4b2613c90b8a156fd557a6569138a5416a1876cd","html_url":"https://github.com/GizzyUwU/govgiz/commit/4b2613c90b8a156fd557a6569138a5416a1876cd","comments_url":"https://api.github.com/repos/GizzyUwU/govgiz/commits/4b2613c90b8a156fd557a6569138a5416a1876cd/comments","author":{"login":"GizzyUwU","id":61115942,"node_id":"MDQ6VXNlcjYxMTE1OTQy","avatar_url":"https://avatars.githubusercontent.com/u/61115942?v=4","gravatar_id":"","url":"https://api.github.com/users/GizzyUwU","html_url":"https://github.com/GizzyUwU","followers_url":"https://api.github.com/users/GizzyUwU/followers","following_url":"https://api.github.com/users/GizzyUwU/following{/other_user}","gists_url":"https://api.github.com/users/GizzyUwU/gists{/gist_id}","starred_url":"https://api.github.com/users/GizzyUwU/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GizzyUwU/subscriptions","organizations_url":"https://api.github.com/users/GizzyUwU/orgs","repos_url":"https://api.github.com/users/GizzyUwU/repos","events_url":"https://api.github.com/users/GizzyUwU/events{/privacy}","received_events_url":"https://api.github.com/users/GizzyUwU/received_events","type":"User","user_view_type":"public","site_admin":false},"committer":{"login":"GizzyUwU","id":61115942,"node_id":"MDQ6VXNlcjYxMTE1OTQy","avatar_url":"https://avatars.githubusercontent.com/u/61115942?v=4","gravatar_id":"","url":"https://api.github.com/users/GizzyUwU","html_url":"https://github.com/GizzyUwU","followers_url":"https://api.github.com/users/GizzyUwU/followers","following_url":"https://api.github.com/users/GizzyUwU/following{/other_user}","gists_url":"https://api.github.com/users/GizzyUwU/gists{/gist_id}","starred_url":"https://api.github.com/users/GizzyUwU/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GizzyUwU/subscriptions","organizations_url":"https://api.github.com/users/GizzyUwU/orgs","repos_url":"https://api.github.com/users/GizzyUwU/repos","events_url":"https://api.github.com/users/GizzyUwU/events{/privacy}","received_events_url":"https://api.github.com/users/GizzyUwU/received_events","type":"User","user_view_type":"public","site_admin":false},"parents":[{"sha":"77158e7817cf96613b74eea6e5416dd311f81240","url":"https://api.github.com/repos/GizzyUwU/govgiz/commits/77158e7817cf96613b74eea6e5416dd311f81240","html_url":"https://github.com/GizzyUwU/govgiz/commit/77158e7817cf96613b74eea6e5416dd311f81240"}],"stats":{"total":1413,"additions":1329,"deletions":84},"files":[{"sha":"e0717bbbea6ef800c29651d8c728d9dcc061e0e7","filename":".wakatime-project","status":"added","additions":1,"deletions":0,"changes":1,"blob_url":"https://github.com/GizzyUwU/govgiz/blob/4b2613c90b8a156fd557a6569138a5416a1876cd/.wakatime-project","raw_url":"https://github.com/GizzyUwU/govgiz/raw/4b2613c90b8a156fd557a6569138a5416a1876cd/.wakatime-project","contents_url":"https://api.github.com/repos/GizzyUwU/govgiz/contents/.wakatime-project?ref=4b2613c90b8a156fd557a6569138a5416a1876cd","patch":"@@ -0,0 +1 @@\n+govgiz\n\\ No newline at end of file"},{"sha":"a0aa8c393c6cb1650f378fd7f8c64cd7bd703329","filename":"app.config.ts","status":"modified","additions":29,"deletions":4,"changes":33,"blob_url":"https://github.com/GizzyUwU/govgiz/blob/4b2613c90b8a156fd557a6569138a5416a1876cd/app.config.ts","raw_url":"https://github.com/GizzyUwU/govgiz/raw/4b2613c90b8a156fd557a6569138a5416a1876cd/app.config.ts","contents_url":"https://api.github.com/repos/GizzyUwU/govgiz/contents/app.config.ts?ref=4b2613c90b8a156fd557a6569138a5416a1876cd","patch":"@@ -1,15 +1,35 @@\n+import type { UserConfig as ViteConfig } from \"vite\";\n import { defineConfig } from \"@solidjs/start/config\";\n import { viteStaticCopy } from \"vite-plugin-static-copy\";\n-import type { UserConfig as ViteConfig } from \"vite\";\n-import path from \"path\";\n import { fileURLToPath } from \"url\";\n+import path from \"path\";\n+//@ts-expect-error\n+import pkg from \"@vinxi/plugin-mdx\";\n+import remarkFrontmatter from \"remark-frontmatter\";\n+import rehypeMdxCodeProps from \"rehype-mdx-code-props\";\n+import { mdxPrism } from \"./plugins/mdxPrism\";\n+import remarkToc from \"remark-toc\";\n+import { postsPlugin } from \"./plugins/postsPlugin\";\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = path.dirname(__filename);\n \n+const { default: mdx } = pkg;\n export default defineConfig({\n-ssr: false,\n+  ssr: false,\n+  extensions: [\"mdx\", \"md\"],\n   vite: {\n+    build: {\n+      target: 'esnext'\n+    },\n     plugins: [\n+      mdx.withImports({})({\n+        remarkPlugins: [remarkFrontmatter, remarkToc],\n+        rehypePlugins: [rehypeMdxCodeProps, mdxPrism],\n+        jsx: true,\n+        jsxImportSource: \"solid-js\",\n+        providerImportSource: \"solid-mdx\",\n+      }),\n+      postsPlugin(),\n       viteStaticCopy({\n         targets: [\n           {\n@@ -29,5 +49,10 @@ ssr: false,\n         ],\n       }),\n     ],\n-  } satisfies ViteConfig\n+  } satisfies ViteConfig,\n+  server: {\n+    prerender: {\n+      crawlLinks: true,\n+    },\n+  },\n });"},{"sha":"da07937dc8f34c1096e8181fbb29bb70838571fe","filename":"biome.json","status":"added","additions":12,"deletions":0,"changes":12,"blob_url":"https://github.com/GizzyUwU/govgiz/blob/4b2613c90b8a156fd557a6569138a5416a1876cd/biome.json","raw_url":"https://github.com/GizzyUwU/govgiz/raw/4b2613c90b8a156fd557a6569138a5416a1876cd/biome.json","contents_url":"https://api.github.com/repos/GizzyUwU/govgiz/contents/biome.json?ref=4b2613c90b8a156fd557a6569138a5416a1876cd","patch":"@@ -0,0 +1,12 @@\n+{\n+\t\"$schema\": \"https://biomejs.dev/schemas/1.6.4/schema.json\",\n+\t\"organizeImports\": {\n+\t\t\"enabled\": true\n+\t},\n+\t\"linter\": {\n+\t\t\"enabled\": true,\n+\t\t\"rules\": {\n+\t\t\t\"recommended\": true\n+\t\t}\n+\t}\n+}\n\\ No newline at end of file"},{"sha":"23b11ac706b8fabcd2b9aeb90332838be39119c2","filename":"bun.lock","status":"modified","additions":709,"deletions":75,"changes":784,"blob_url":"https://github.com/GizzyUwU/govgiz/blob/4b2613c90b8a156fd557a6569138a5416a1876cd/bun.lock","raw_url":"https://github.com/GizzyUwU/govgiz/raw/4b2613c90b8a156fd557a6569138a5416a1876cd/bun.lock","contents_url":"https://api.github.com/repos/GizzyUwU/govgiz/contents/bun.lock?ref=4b2613c90b8a156fd557a6569138a5416a1876cd"},{"sha":"1f5df36e904fc069b7ebb5616828af365d4457c8","filename":"package.json","status":"modified","additions":21,"deletions":2,"changes":23,"blob_url":"https://github.com/GizzyUwU/govgiz/blob/4b2613c90b8a156fd557a6569138a5416a1876cd/package.json","raw_url":"https://github.com/GizzyUwU/govgiz/raw/4b2613c90b8a156fd557a6569138a5416a1876cd/package.json","contents_url":"https://api.github.com/repos/GizzyUwU/govgiz/contents/package.json?ref=4b2613c90b8a156fd557a6569138a5416a1876cd","patch":"@@ -2,19 +2,38 @@\n   \"name\": \"example-basic\",\n   \"type\": \"module\",\n   \"scripts\": {\n-    \"dev\": \"SASS_QUIET_DEPS=true vinxi dev --host\",\n+    \"dev\": \"vinxi dev --host\",\n     \"build\": \"vinxi build\",\n     \"start\": \"vinxi start\",\n     \"version\": \"vinxi version\"\n   },\n   \"dependencies\": {\n+    \"@biomejs/biome\": \"^2.3.13\",\n+    \"@mapbox/rehype-prism\": \"^0.9.0\",\n+    \"@mdx-js/rollup\": \"^3.1.1\",\n     \"@solidjs/meta\": \"^0.29.4\",\n     \"@solidjs/router\": \"^0.15.0\",\n     \"@solidjs/start\": \"^1.1.0\",\n+    \"@types/refractor\": \"^4.0.0\",\n+    \"@vinxi/plugin-mdx\": \"^3.7.2\",\n+    \"dayjs\": \"^1.11.19\",\n     \"govuk-frontend\": \"^5.14.0\",\n-    \"sass\": \"^1.97.3\",\n+    \"hast-util-to-string\": \"^3.0.1\",\n+    \"prismjs\": \"^1.30.0\",\n+    \"refactor\": \"^0.0.3\",\n+    \"refractor\": \"^5.0.0\",\n+    \"rehype-mdx-code-props\": \"^3.0.1\",\n+    \"remark-frontmatter\": \"^5.0.0\",\n+    \"remark-gfm\": \"^4.0.1\",\n+    \"remark-toc\": \"^9.0.0\",\n     \"solid-js\": \"^1.9.5\",\n+    \"solid-jsx\": \"^1.1.4\",\n+    \"solid-mdx\": \"^0.0.7\",\n+    \"to-vfile\": \"^8.0.0\",\n+    \"typed-css-modules\": \"^0.9.1\",\n     \"typed.js\": \"^3.0.0\",\n+    \"unist-util-visit\": \"^5.1.0\",\n+    \"vfile-matter\": \"^5.0.1\",\n     \"vinxi\": \"^0.5.7\"\n   },\n   \"engines\": {"},{"sha":"e8828416748974ffdd69ee7688df9f6e4a6895d6","filename":"plugins/mdxPrism.ts","status":"added","additions":38,"deletions":0,"changes":38,"blob_url":"https://github.com/GizzyUwU/govgiz/blob/4b2613c90b8a156fd557a6569138a5416a1876cd/plugins%2FmdxPrism.ts","raw_url":"https://github.com/GizzyUwU/govgiz/raw/4b2613c90b8a156fd557a6569138a5416a1876cd/plugins%2FmdxPrism.ts","contents_url":"https://api.github.com/repos/GizzyUwU/govgiz/contents/plugins%2FmdxPrism.ts?ref=4b2613c90b8a156fd557a6569138a5416a1876cd","patch":"@@ -0,0 +1,38 @@\n+import { visit } from \"unist-util-visit\";\n+import { toString as nodeToString } from \"hast-util-to-string\";\n+import { refractor } from \"refractor\";\n+import tsx from \"refractor/tsx\";\n+\n+refractor.register(tsx);\n+\n+export const mdxPrism = () => {\n+\t// biome-ignore lint/suspicious/noExplicitAny: <explanation>\n+\treturn (tree: any) => {\n+\t\t// biome-ignore lint/suspicious/noExplicitAny: <explanation>\n+\t\tvisit(tree, \"element\" as any, visitor);\n+\t};\n+\n+\t// biome-ignore lint/suspicious/noExplicitAny: <explanation>\n+\tfunction visitor(node: any, index: number | undefined, parent: any) {\n+\t\tif (parent.type !== \"mdxJsxFlowElement\") {\n+\t\t\treturn;\n+\t\t}\n+\n+\t\t// biome-ignore lint/suspicious/noExplicitAny: <explanation>\n+\t\tconst attrs = parent.attributes.reduce((a: any, c: any) => {\n+\t\t\tif (c.type === \"mdxJsxAttribute\") {\n+\t\t\t\ta[c.name] = c.value;\n+\t\t\t}\n+\t\t\treturn a;\n+\t\t}, {});\n+\n+\t\tconst lang = attrs.lang;\n+\t\tif (!lang) {\n+\t\t\treturn;\n+\t\t}\n+\n+\t\tconst result = refractor.highlight(nodeToString(node), lang);\n+\n+\t\tnode.children = result.children;\n+\t}\n+};\n\\ No newline at end of file"},{"sha":"1678967820179f25a8a8d179d49edb64589f8254","filename":"plugins/postsPlugin.ts","status":"added","additions":48,"deletions":0,"changes":48,"blob_url":"https://github.com/GizzyUwU/govgiz/blob/4b2613c90b8a156fd557a6569138a5416a1876cd/plugins%2FpostsPlugin.ts","raw_url":"https://github.com/GizzyUwU/govgiz/raw/4b2613c90b8a156fd557a6569138a5416a1876cd/plugins%2FpostsPlugin.ts","contents_url":"https://api.github.com/repos/GizzyUwU/govgiz/contents/plugins%2FpostsPlugin.ts?ref=4b2613c90b8a156fd557a6569138a5416a1876cd","patch":"@@ -0,0 +1,48 @@\n+import type { Plugin } from \"vite\";\n+import { readSync } from \"to-vfile\";\n+import { matter } from \"vfile-matter\";\n+import { resolve, join } from \"node:path\";\n+import { readdirSync, statSync, writeFileSync } from \"node:fs\";\n+import { exec } from \"node:child_process\";\n+\n+const processFiles = () => {\n+\tconst outputFile = resolve(\"src/data/posts.json\");\n+\tconst blogDir = resolve(\"src/routes/blog\");\n+\tconst files = readdirSync(blogDir);\n+\tconst blogPosts = files\n+\t\t.filter(\n+\t\t\t(file) => statSync(join(blogDir, file)).isFile() && file.endsWith(\".mdx\"),\n+\t\t)\n+\t\t.map((file) => {\n+\t\t\tconst f = readSync(resolve(\"src/routes/blog\", file));\n+\t\t\tmatter(f);\n+\t\t\treturn {\n+\t\t\t\t...(f.data.matter as object),\n+\t\t\t\tslug: file.replace(\".mdx\", \"\"),\n+\t\t\t} as { date: string; slug: string };\n+\t\t})\n+\t\t.sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime());\n+\n+\twriteFileSync(outputFile, JSON.stringify(blogPosts, null, 2), \"utf-8\");\n+\n+\texec(\"bunx @biomejs/biome format --write ./src/data/posts.json\");\n+};\n+\n+export const postsPlugin = (): Plugin => {\n+\treturn {\n+\t\tname: \"posts-gen\",\n+\t\tbuildEnd() {\n+\t\t\tprocessFiles();\n+\t\t},\n+\t\tconfigureServer(server) {\n+\t\t\tserver.watcher.on(\"change\", (filePath) => {\n+\t\t\t\tif (\n+\t\t\t\t\t!filePath.includes(\"/src/routes/blog\")\n+\t\t\t\t)\n+\t\t\t\t\treturn;\n+\n+\t\t\t\tprocessFiles();\n+\t\t\t});\n+\t\t},\n+\t};\n+};\n\\ No newline at end of file"},{"sha":"f02c7791470034b47bc7b643298a6631c682b527","filename":"public/prism.css","status":"added","additions":7,"deletions":0,"changes":7,"blob_url":"https://github.com/GizzyUwU/govgiz/blob/4b2613c90b8a156fd557a6569138a5416a1876cd/public%2Fprism.css","raw_url":"https://github.com/GizzyUwU/govgiz/raw/4b2613c90b8a156fd557a6569138a5416a1876cd/public%2Fprism.css","contents_url":"https://api.github.com/repos/GizzyUwU/govgiz/contents/public%2Fprism.css?ref=4b2613c90b8a156fd557a6569138a5416a1876cd","patch":"@@ -0,0 +1,7 @@\n+/* PrismJS 1.30.0\n+https://prismjs.com/download#themes=prism&languages=markup+css+clike+javascript+docker+http+javadoclike+json+python+sql+toml+typescript+typoscript+yaml&plugins=line-numbers+show-language+normalize-whitespace+toolbar+copy-to-clipboard+download-button+diff-highlight+treeview */\n+code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}\n+pre[class*=language-].line-numbers{position:relative;padding-left:3.8em;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:-3.8em;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;padding-right:.8em;text-align:right}\n+div.code-toolbar{position:relative}div.code-toolbar>.toolbar{position:absolute;z-index:10;top:.3em;right:.2em;transition:opacity .3s ease-in-out;opacity:0}div.code-toolbar:hover>.toolbar{opacity:1}div.code-toolbar:focus-within>.toolbar{opacity:1}div.code-toolbar>.toolbar>.toolbar-item{display:inline-block}div.code-toolbar>.toolbar>.toolbar-item>a{cursor:pointer}div.code-toolbar>.toolbar>.toolbar-item>button{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}div.code-toolbar>.toolbar>.toolbar-item>a,div.code-toolbar>.toolbar>.toolbar-item>button,div.code-toolbar>.toolbar>.toolbar-item>span{color:#bbb;font-size:.8em;padding:0 .5em;background:#f5f2f0;background:rgba(224,224,224,.2);box-shadow:0 2px 0 0 rgba(0,0,0,.2);border-radius:.5em}div.code-toolbar>.toolbar>.toolbar-item>a:focus,div.code-toolbar>.toolbar>.toolbar-item>a:hover,div.code-toolbar>.toolbar>.toolbar-item>button:focus,div.code-toolbar>.toolbar>.toolbar-item>button:hover,div.code-toolbar>.toolbar>.toolbar-item>span:focus,div.code-toolbar>.toolbar>.toolbar-item>span:hover{color:inherit;text-decoration:none}\n+pre.diff-highlight>code .token.deleted:not(.prefix),pre>code.diff-highlight .token.deleted:not(.prefix){background-color:rgba(255,0,0,.1);color:inherit;display:block}pre.diff-highlight>code .token.inserted:not(.prefix),pre>code.diff-highlight .token.inserted:not(.prefix){background-color:rgba(0,255,128,.1);color:inherit;display:block}\n+.token.treeview-part .entry-line{position:relative;text-indent:-99em;display:inline-block;vertical-align:top;width:1.2em}.token.treeview-part .entry-line:before,.token.treeview-part .line-h:after{content:\"\";position:absolute;top:0;left:50%;width:50%;height:100%}.token.treeview-part .line-h:before,.token.treeview-part .line-v:before{border-left:1px solid #ccc}.token.treeview-part .line-v-last:before{height:50%;border-left:1px solid #ccc;border-bottom:1px solid #ccc}.token.treeview-part .line-h:after{height:50%;border-bottom:1px solid #ccc}.token.treeview-part .entry-name{position:relative;display:inline-block;vertical-align:top}.token.treeview-part .entry-name.dotfile{opacity:.5}@font-face{font-family:PrismTreeview;src:url(data:application/font-woff;base64,d09GRgABAAAAAAgYAAsAAAAAEGAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADsAAABUIIslek9TLzIAAAFEAAAAPwAAAFY1UkH9Y21hcAAAAYQAAAB/AAACCtvO7yxnbHlmAAACBAAAA+MAAAlACm1VqmhlYWQAAAXoAAAAKgAAADZfxj5jaGhlYQAABhQAAAAYAAAAJAFbAMFobXR4AAAGLAAAAA4AAAA0CGQAAGxvY2EAAAY8AAAAHAAAABwM9A9CbWF4cAAABlgAAAAfAAAAIAEgAHZuYW1lAAAGeAAAATcAAAJSfUrk+HBvc3QAAAewAAAAZgAAAIka0DSfeJxjYGRgYOBiMGCwY2BycfMJYeDLSSzJY5BiYGGAAJA8MpsxJzM9kYEDxgPKsYBpDiBmg4gCACY7BUgAeJxjYGRYyjiBgZWBgaGQoRZISkLpUAYOBj0GBiYGVmYGrCAgzTWFweEV4ysehs1ArgDDFgZGIA3CDAB2tQjAAHic7ZHLEcMwCESfLCz/VEoKSEE5parURxMOC4c0Ec283WGFdABgBXrwCAzam4bOK9KWeefM3Hhmjyn3ed+hTRq1pS7Ra/HjYGPniHcXMy4G/zNTP7/KW5HTXArkvdBW3ArN19dCG/NRIN8K5HuB/CiQn4U26VeBfBbML9NEH78AeJyVVc1u20YQ3pn905JcSgr/YsuSDTEg3cR1bFEkYyS1HQcQ2jQF2hot6vYSoECKnnPLA/SWUy9NTr31Bfp+6azsNI0SGiolzu7ODnfn+2Z2lnHG3rxhr9nfLGKbLGesncAYYnUHpsVnMG/uwyzNdFIVd6HI6twp8+R3LpT4TSglLoTHwwJgG2/dFvKrl9yI507/p5CCq4LTxB/PlPjkFaMHnWB/0S9je7RTPS+utnGtom1T2q5pk/e3H0M1S18rsXAL7wgpxQuhAmteGGvNjmcfGXuwnFNOPCXxeOGmnjrBLWNyBeNtVq2Hs03yus1aPS3mzSyNVSfu588iW1Q93x/4fjcHn+5EkS2tMxr4xIRa8ese+4L9uKZnxEqs8+ldyN9atU02a5t5uQ8hZGms1QTKpaKYqnipiNNOAIeIADC0JNEOYY+jtSgFoOchiAjRGFACpUTRje8bwIYWGCDEgENY8MEu9bnCYCdAxftoNg0KiSpUtPaHcanYwzXRu6T4r40b5npal3V7UHWCPJW9niyl1vIHgoujEXZjudBkeWkOeMQBRmbEPhKzij1i52t6/TadL+3q7H0U1eq4E8cG4gIIwQLx8VX7ToPXgPrehVc5QXHR7gMSmwjKfaYAP4KvZV+yn9bE18y2IY37LvtyrSg3i7ZK++B603ndlg/gBJpZRsfpBI6hyiaQ6FjlnThz8lAC3LgBIMnXDOAXxBQ4SIgiEhx2AcGCAwAhwjXRpCQms42bwAUt75BvAwgONzdgOfWEwzk4Ylzj4mz+5YEzzXzWX9aNlk7ot65y5QnBHsNlm6zDTu7sspRqG4V+fgJ1lVBZ07Nm7s5nemo3Lf3PO7iwtnroQ5/YDGwPRUip6fV6L+27p+wCHwSvPs85UnHqId8NAn5IBsKdv95KrL9m31Gsf2a/rluDslk1y1J9GE+LUmmVT/OyOHaFKGnapt2H5XeJTmKd6qYNoVVZOy+pWzr7rMip3ndG/4mQSoUcMbAqG/YNIAdXhkAqTVruXhocSKN0iS4Rwj7vSS4fcF/La07BfeQSuRAcFeW+9igjwPhhYPpGCBCBHhxiKMyFMFT7ziRH7RtfIWdiha+TdW+Rqs7bLHdN2ZJIKl0um0x3op9saYr0REeRdj09pl43pMzz4tjztrY8L4o8bzT+oLY27PR/eFtXs/YY5vtwB5Iqad14eYN0ujveMaGWqkdU3TKbQSC5Uvxaf4fA7SAQ3r2tEfIhd4duld91bwMisjqBw22orthNcroXl7KqO1329HBgAexgoCfGAwiDPoBnriki3lmNojrzvD0tjo6E3vPYP6E2BMIAeJxjYGRgYADiY8t3FsTz23xl4GbYzIAB/v9nWM6wBcjgYGAC8QH+QQhZAAB4nGNgZGBg2MzAACeXMzAyoAJeADPyAh14nGNgAILNpGEA0fgIZQAAAAAAAAA2AHIAvgE+AZgCCAKMAv4DlgPsBEYEoHicY2BkYGDgZchi4GQAASYg5gJCBob/YD4DABTSAZcAeJx9kU1uwjAQhV/4qwpqhdSqi67cTTeVEmBXDgBbhBD7AHYISuLUMSD2PUdP0HNwjp6i676k3qQS9Ujjb968mYUNoI8zPJTHw02Vy9PAFatfbpLuHbfIT47b6MF33KH+6riLF0wc93CHN27wWtdUHvHuuIFbfDhuUv903CKfHbfxgC/HHerfjrtYen3HPTx7ambiIl0YKQ+xPM5ltE9CU9NqxVKaItaZGPqDmj6VmTShlRuxOoniEI2sVUIZnYqJzqxMEi1yo3dybf2ttfk4CJTT/bVOMYNBjAIpFiTJOLCWOGLOHGGPBCE7l32XO0tmw04MjQwCQ7774B//lDmrZkJY3hvOrHBiLuiJMKJqoVgrejQ3CP5Yubt0JwxNJa96Oypr6j621VSOMQKG+uP36eKmHylcb0MAeJxtwdEOgjAMBdBeWEFR/Mdl7bTJtMsygc/nwVfPoYF+QP+tGDAigDFhxgVXLLjhjhUPCtmKTtmLaGN7x6dy/Io5bybqoevRQ3LRObb0sk3HKpn1SFqW6ru26vbpYfcmRCccJhqsAAA=) format(\"woff\")}.token.treeview-part .entry-name:before{content:\"\\ea01\";font-family:PrismTreeview;font-size:inherit;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:2.5ex;display:inline-block}.token.treeview-part .entry-name.dir:before{content:\"\\ea02\"}.token.treeview-part .entry-name.ext-bmp:before,.token.treeview-part .entry-name.ext-eps:before,.token.treeview-part .entry-name.ext-gif:before,.token.treeview-part .entry-name.ext-jpe:before,.token.treeview-part .entry-name.ext-jpeg:before,.token.treeview-part .entry-name.ext-jpg:before,.token.treeview-part .entry-name.ext-png:before,.token.treeview-part .entry-name.ext-svg:before,.token.treeview-part .entry-name.ext-tiff:before{content:\"\\ea03\"}.token.treeview-part .entry-name.ext-cfg:before,.token.treeview-part .entry-name.ext-conf:before,.token.treeview-part .entry-name.ext-config:before,.token.treeview-part .entry-name.ext-csv:before,.token.treeview-part .entry-name.ext-ini:before,.token.treeview-part .entry-name.ext-log:before,.token.treeview-part .entry-name.ext-md:before,.token.treeview-part .entry-name.ext-nfo:before,.token.treeview-part .entry-name.ext-txt:before{content:\"\\ea06\"}.token.treeview-part .entry-name.ext-asp:before,.token.treeview-part .entry-name.ext-aspx:before,.token.treeview-part .entry-name.ext-c:before,.token.treeview-part .entry-name.ext-cc:before,.token.treeview-part .entry-name.ext-cpp:before,.token.treeview-part .entry-name.ext-cs:before,.token.treeview-part .entry-name.ext-css:before,.token.treeview-part .entry-name.ext-h:before,.token.treeview-part .entry-name.ext-hh:before,.token.treeview-part .entry-name.ext-htm:before,.token.treeview-part .entry-name.ext-html:before,.token.treeview-part .entry-name.ext-jav:before,.token.treeview-part .entry-name.ext-java:before,.token.treeview-part .entry-name.ext-js:before,.token.treeview-part .entry-name.ext-php:before,.token.treeview-part .entry-name.ext-rb:before,.token.treeview-part .entry-name.ext-xml:before{content:\"\\ea07\"}.token.treeview-part .entry-name.ext-7z:before,.token.treeview-part .entry-name.ext-bz2:before,.token.treeview-part .entry-name.ext-bz:before,.token.treeview-part .entry-name.ext-gz:before,.token.treeview-part .entry-name.ext-rar:before,.token.treeview-part .entry-name.ext-tar:before,.token.treeview-part .entry-name.ext-tgz:before,.token.treeview-part .entry-name.ext-zip:before{content:\"\\ea08\"}.token.treeview-part .entry-name.ext-aac:before,.token.treeview-part .entry-name.ext-au:before,.token.treeview-part .entry-name.ext-cda:before,.token.treeview-part .entry-name.ext-flac:before,.token.treeview-part .entry-name.ext-mp3:before,.token.treeview-part .entry-name.ext-oga:before,.token.treeview-part .entry-name.ext-ogg:before,.token.treeview-part .entry-name.ext-wav:before,.token.treeview-part .entry-name.ext-wma:before{content:\"\\ea04\"}.token.treeview-part .entry-name.ext-avi:before,.token.treeview-part .entry-name.ext-flv:before,.token.treeview-part .entry-name.ext-mkv:before,.token.treeview-part .entry-name.ext-mov:before,.token.treeview-part .entry-name.ext-mp4:before,.token.treeview-part .entry-name.ext-mpeg:before,.token.treeview-part .entry-name.ext-mpg:before,.token.treeview-part .entry-name.ext-ogv:before,.token.treeview-part .entry-name.ext-webm:before{content:\"\\ea05\"}.token.treeview-part .entry-name.ext-pdf:before{content:\"\\ea09\"}.token.treeview-part .entry-name.ext-xls:before,.token.treeview-part .entry-name.ext-xlsx:before{content:\"\\ea0a\"}.token.treeview-part .entry-name.ext-doc:before,.token.treeview-part .entry-name.ext-docm:before,.token.treeview-part .entry-name.ext-docx:before{content:\"\\ea0c\"}.token.treeview-part .entry-name.ext-pps:before,.token.treeview-part .entry-name.ext-ppt:before,.token.treeview-part .entry-name.ext-pptx:before{content:\"\\ea0b\"}\n\\ No newline at end of file"},{"sha":"485a0e5d9ce168af89d4072dc79e794603054eb8","filename":"src/app.tsx","status":"modified","additions":1,"deletions":1,"changes":2,"blob_url":"https://github.com/GizzyUwU/govgiz/blob/4b2613c90b8a156fd557a6569138a5416a1876cd/src%2Fapp.tsx","raw_url":"https://github.com/GizzyUwU/govgiz/raw/4b2613c90b8a156fd557a6569138a5416a1876cd/src%2Fapp.tsx","contents_url":"https://api.github.com/repos/GizzyUwU/govgiz/contents/src%2Fapp.tsx?ref=4b2613c90b8a156fd557a6569138a5416a1876cd","patch":"@@ -20,7 +20,7 @@ export default function App() {\n     <Router\n       root={(props) => (\n         <MetaProvider>\n-          <Title>Gov Giz</Title>\n+          <Title>Gizzy</Title>\n           <Link rel=\"icon\" href=\"/haj.svg\" />\n           <Link rel=\"stylesheet\" href=\"/assets/govuk-frontend.min.css\" />\n           <header class=\"govuk-header\" data-module=\"govuk-header\">"},{"sha":"27fe36d02cf7f68465f61267c8ce8d6e6bc071e3","filename":"src/components/Markdown.tsx","status":"added","additions":214,"deletions":0,"changes":214,"blob_url":"https://github.com/GizzyUwU/govgiz/blob/4b2613c90b8a156fd557a6569138a5416a1876cd/src%2Fcomponents%2FMarkdown.tsx","raw_url":"https://github.com/GizzyUwU/govgiz/raw/4b2613c90b8a156fd557a6569138a5416a1876cd/src%2Fcomponents%2FMarkdown.tsx","contents_url":"https://api.github.com/repos/GizzyUwU/govgiz/contents/src%2Fcomponents%2FMarkdown.tsx?ref=4b2613c90b8a156fd557a6569138a5416a1876cd","patch":"@@ -0,0 +1,214 @@\n+import {\n+\ttype Component,\n+\tcreateMemo,\n+\ttype ParentComponent,\n+\ttype JSXElement,\n+\tcreateSignal,\n+\tShow,\n+\tonMount,\n+} from \"solid-js\";\n+\n+const P: ParentComponent = (props) => <p class=\"govuk-body\">{props.children}</p>;\n+\n+const Ol: ParentComponent = (props) => (\n+\t<ol class=\"list-decimal [&>li]:ml-3h\">{props.children}</ol>\n+);\n+const Ul: ParentComponent = (props) => (\n+\t<ul class=\"list-square [&>li]:ml-2h\">{props.children}</ul>\n+);\n+\n+const Li: ParentComponent = (props) => <li class=\"\">{props.children}</li>;\n+\n+export const Blockquote: ParentComponent = (props) => {\n+\tlet ref!: HTMLDivElement;\n+\n+\tonMount(() => {\n+\t\tref.querySelectorAll(\"p.govuk-body\").forEach((p) => {\n+\t\t\tp.classList.remove(\"govuk-body\");\n+\t\t\tp.classList.add(\"govuk-body-s\");\n+\t\t\tp.classList.add(\n+\t\t\t\t\"govuk-body-s\",\n+\t\t\t\t\"govuk-!-margin-0\",\n+\t\t\t\t\"govuk-!-font-style-italic\"\n+\t\t\t);\n+\t\t});\n+\t});\n+\n+\treturn (\n+\t\t<div ref={ref}>\n+\t\t\t {props.children}\n+\t\t</div>\n+\t)\n+}\n+\n+const Pre: ParentComponent<{ lang: string; lines?: string; file?: string }> = (\n+\tprops,\n+) => {\n+\tconst [copied, setCopied] = createSignal(false);\n+\tlet ref!: HTMLPreElement;\n+\n+\tconst onCopy = () => {\n+\t\tsetCopied(true);\n+\t\tnavigator.clipboard.writeText(ref.innerText);\n+\t\tsetTimeout(() => {\n+\t\t\tsetCopied(false);\n+\t\t}, 1500);\n+\t};\n+\n+\treturn (\n+\t\t<div class=\"my-1v\">\n+\t\t\t<div class=\"bg-black text-white dark:bg-white dark:text-black flex justify-between px-1h text-sm leading-1\">\n+\t\t\t\t<Show when={props.file} fallback={<span aria-hidden />}>\n+\t\t\t\t\t<span>{props.file}</span>\n+\t\t\t\t</Show>\n+\t\t\t\t<button type=\"button\" onClick={onCopy}>\n+\t\t\t\t\t{copied() ? \"Copied!\" : \"Copy code\"}\n+\t\t\t\t</button>\n+\t\t\t</div>\n+\t\t\t<pre ref={ref} class={`language-${props.lang}`} data-line={props.lines}>\n+\t\t\t\t{props.children}\n+\t\t\t</pre>\n+\t\t</div>\n+\t);\n+};\n+\n+const headingLink = (children: JSXElement) =>\n+\tchildren?.toString().toLowerCase().replaceAll(\" \", \"-\").replaceAll(\",\", \"\");\n+\n+const HeadlineLink: Component<{ link: string; class: string }> = (props) => {\n+\treturn (\n+\t\t<a href={props.link} class=\"relative top-[1px]\">\n+\n+\t\t</a>\n+\t);\n+};\n+\n+const H2: ParentComponent = (props) => (\n+\t<h2\n+\t\tid={headingLink(props.children)}\n+\t\tclass=\"text-2xl leading-2 font-bold mt-2v mb-1v flex items-center gap-1h scroll-mt-2v\"\n+\t>\n+\t\t{props.children}\n+\t\t<HeadlineLink class=\"w-5 h-5\" link={`#${headingLink(props.children)}`} />\n+\t</h2>\n+);\n+\n+const H3: ParentComponent = (props) => (\n+\t<h3\n+\t\tid={headingLink(props.children)}\n+\t\tclass=\"text-xl leading-2 font-bold mt-2v mb-1v flex items-center gap-1h scroll-mt-2v\"\n+\t>\n+\t\t{props.children}\n+\t\t<HeadlineLink class=\"w-4 h-4\" link={`#${headingLink(props.children)}`} />\n+\t</h3>\n+);\n+\n+const H4: ParentComponent = (props) => (\n+\t<h4\n+\t\tid={headingLink(props.children)}\n+\t\tclass=\"text-lg leading-1 font-bold mt-2v mb-1v flex items-center gap-1h scroll-mt-2v\"\n+\t>\n+\t\t{props.children}\n+\t\t<HeadlineLink class=\"w-3 h-3\" link={`#${headingLink(props.children)}`} />\n+\t</h4>\n+);\n+\n+const A: ParentComponent<{ href: string }> = (props) => {\n+\tconst isLocal = createMemo(() =>\n+\t\t[\"/\", \"./\", \"#\"].some((s) => props.href.startsWith(s)),\n+\t);\n+\n+\treturn (\n+\t\t<a\n+\t\t\thref={props.href}\n+\t\t\ttarget={isLocal() ? \"\" : \"_blank\"}\n+\t\t\tclass=\"underline underline-offset-2\"\n+\t\t>\n+\t\t\t{props.children}\n+\t\t</a>\n+\t);\n+};\n+\n+function gridCellDimensions() {\n+\tconst element = document.createElement(\"div\");\n+\telement.style.position = \"fixed\";\n+\telement.style.height = \"var(--line-height)\";\n+\telement.style.width = \"1ch\";\n+\tdocument.body.appendChild(element);\n+\tconst rect = element.getBoundingClientRect();\n+\tdocument.body.removeChild(element);\n+\treturn { width: rect.width, height: rect.height };\n+}\n+\n+export const PostImage: Component<{\n+\tsrc: string;\n+\talt: string;\n+\tattr?: JSXElement;\n+\tclass?: string;\n+}> = (props) => {\n+\tlet ref!: HTMLImageElement;\n+\n+\tonMount(() => {\n+\t\tconst cell = gridCellDimensions();\n+\t\tfunction setHeightFromRatio() {\n+\t\t\tconst ratio = ref.naturalWidth / ref.naturalHeight;\n+\t\t\tconst rect = ref.getBoundingClientRect();\n+\t\t\tconst realHeight = rect.width / ratio;\n+\t\t\tconst diff = cell.height - (realHeight % cell.height);\n+\t\t\tref.style.setProperty(\"padding-bottom\", `${diff}px`);\n+\t\t}\n+\n+\t\tif (ref.complete) {\n+\t\t\tsetHeightFromRatio();\n+\t\t} else {\n+\t\t\tref.addEventListener(\"load\", () => {\n+\t\t\t\tsetHeightFromRatio();\n+\t\t\t});\n+\t\t}\n+\t});\n+\n+\treturn (\n+\t\t<div>\n+\t\t\t<img\n+\t\t\t\tref={ref}\n+\t\t\t\tsrc={props.src}\n+\t\t\t\talt={props.alt}\n+\t\t\t\tclass=\"w-full\"\n+\t\t\t\tclassList={{ [props.class || \"\"]: !!props.class }}\n+\t\t\t/>\n+\t\t\t{props.attr}\n+\t\t</div>\n+\t);\n+};\n+\n+\n+export const Aside: ParentComponent = (props) => {\n+\tlet ref!: HTMLDivElement;\n+\n+\tonMount(() => {\n+\t\tref.querySelectorAll(\"p.govuk-body\").forEach((p) => {\n+\t\t\tp.classList.remove(\"govuk-body\");\n+\t\t\tp.classList.add(\"govuk-body-s\");\n+\t\t\tp.classList.add(\"govuk-!-margin-bottom-0\");\n+\t\t});\n+\t});\n+\n+\treturn (\n+\t\t<div ref={ref} class=\"govuk-inset-text\">\n+\t\t\t{props.children}\n+\t\t</div>\n+\t);\n+};\n+\n+export const markdownComponents = {\n+\ta: A,\n+\tp: P,\n+\tli: Li,\n+\tol: Ol,\n+\tul: Ul,\n+\tblockquote: Blockquote,\n+\tpre: Pre,\n+\th2: H2,\n+\th3: H3,\n+\th4: H4,\n+};\n\\ No newline at end of file"},{"sha":"e69de29bb2d1d6434b8b29ae775ad8c2e48c5391","filename":"src/components/Projects.tsx","status":"added","additions":0,"deletions":0,"changes":0,"blob_url":"https://github.com/GizzyUwU/govgiz/blob/4b2613c90b8a156fd557a6569138a5416a1876cd/src%2Fcomponents%2FProjects.tsx","raw_url":"https://github.com/GizzyUwU/govgiz/raw/4b2613c90b8a156fd557a6569138a5416a1876cd/src%2Fcomponents%2FProjects.tsx","contents_url":"https://api.github.com/repos/GizzyUwU/govgiz/contents/src%2Fcomponents%2FProjects.tsx?ref=4b2613c90b8a156fd557a6569138a5416a1876cd"},{"sha":"92991864697ccf5941de2a94bdbe8e0faf36f034","filename":"src/data/posts.json","status":"added","additions":16,"deletions":0,"changes":16,"blob_url":"https://github.com/GizzyUwU/govgiz/blob/4b2613c90b8a156fd557a6569138a5416a1876cd/src%2Fdata%2Fposts.json","raw_url":"https://github.com/GizzyUwU/govgiz/raw/4b2613c90b8a156fd557a6569138a5416a1876cd/src%2Fdata%2Fposts.json","contents_url":"https://api.github.com/repos/GizzyUwU/govgiz/contents/src%2Fdata%2Fposts.json?ref=4b2613c90b8a156fd557a6569138a5416a1876cd","patch":"@@ -0,0 +1,16 @@\n+[\n+  {\n+    \"title\": \"Test\",\n+    \"description\": \"Bleh\",\n+    \"date\": \"2025-30-01\",\n+    \"featuredImage\": \"https://assets.solidjs.com/banner?type=SSG%20%2b%20MDX%20blog%20setup&background=tiles&project=%20\",\n+    \"featuredImageDesc\": \"SolidJS banner\",\n+    \"tags\": [\n+      \"solidjs\",\n+      \"solid-start\",\n+      \"mdx\",\n+      \"markdown\"\n+    ],\n+    \"slug\": \"test\"\n+  }\n+]\n\\ No newline at end of file"},{"sha":"390b7289ba4ec84300efdda35fb22415a2b033f8","filename":"src/data/posts.ts","status":"added","additions":8,"deletions":0,"changes":8,"blob_url":"https://github.com/GizzyUwU/govgiz/blob/4b2613c90b8a156fd557a6569138a5416a1876cd/src%2Fdata%2Fposts.ts","raw_url":"https://github.com/GizzyUwU/govgiz/raw/4b2613c90b8a156fd557a6569138a5416a1876cd/src%2Fdata%2Fposts.ts","contents_url":"https://api.github.com/repos/GizzyUwU/govgiz/contents/src%2Fdata%2Fposts.ts?ref=4b2613c90b8a156fd557a6569138a5416a1876cd","patch":"@@ -0,0 +1,8 @@\n+// @ts-ignore\n+import rawPosts from \"./posts.json\";\n+import type { Post } from \"~/types\";\n+const Posts = rawPosts as unknown as Post[];\n+export const posts: Post[] = Posts.map((p: Post) => ({\n+\t...p,\n+\tdate: new Date(p.date),\n+}));\n\\ No newline at end of file"},{"sha":"2a2b89f2c0434d23261a33d37d6076a1e503631d","filename":"src/data/series.ts","status":"added","additions":19,"deletions":0,"changes":19,"blob_url":"https://github.com/GizzyUwU/govgiz/blob/4b2613c90b8a156fd557a6569138a5416a1876cd/src%2Fdata%2Fseries.ts","raw_url":"https://github.com/GizzyUwU/govgiz/raw/4b2613c90b8a156fd557a6569138a5416a1876cd/src%2Fdata%2Fseries.ts","contents_url":"https://api.github.com/repos/GizzyUwU/govgiz/contents/src%2Fdata%2Fseries.ts?ref=4b2613c90b8a156fd557a6569138a5416a1876cd","patch":"@@ -0,0 +1,19 @@\n+import { posts } from \"~/data/posts\";\n+import type { Series } from \"~/types\";\n+\n+export const series: Record<string, Series> = posts.reduce(\n+\t(all, post, index) => {\n+\t\tconst { series } = post;\n+\t\tif (series) {\n+\t\t\tif (!all[series]) {\n+\t\t\t\tall[series] = {\n+\t\t\t\t\tid: series,\n+\t\t\t\t\tposts: [],\n+\t\t\t\t};\n+\t\t\t}\n+\t\t\tall[series].posts.push(index);\n+\t\t}\n+\t\treturn all;\n+\t},\n+\t{} as Record<string, Series>,\n+);\n\\ No newline at end of file"},{"sha":"075d461009fecc0811f3e6dca8f2745b33207dae","filename":"src/data/tags.ts","status":"added","additions":21,"deletions":0,"changes":21,"blob_url":"https://github.com/GizzyUwU/govgiz/blob/4b2613c90b8a156fd557a6569138a5416a1876cd/src%2Fdata%2Ftags.ts","raw_url":"https://github.com/GizzyUwU/govgiz/raw/4b2613c90b8a156fd557a6569138a5416a1876cd/src%2Fdata%2Ftags.ts","contents_url":"https://api.github.com/repos/GizzyUwU/govgiz/contents/src%2Fdata%2Ftags.ts?ref=4b2613c90b8a156fd557a6569138a5416a1876cd","patch":"@@ -0,0 +1,21 @@\n+import { posts } from \"~/data/posts\";\n+import type { Tag } from \"~/types\";\n+\n+export const tags: Record<string, Tag> = posts.reduce(\n+\t(a, p, i) => {\n+\t\tif (Array.isArray(p.tags)) {\n+\t\t\tfor (const t of p.tags) {\n+\t\t\t\tif (!a[t]) {\n+\t\t\t\t\ta[t] = {\n+\t\t\t\t\t\tid: t,\n+\t\t\t\t\t\tposts: [],\n+\t\t\t\t\t};\n+\t\t\t\t}\n+\t\t\t\ta[t].posts.push(i);\n+\t\t\t}\n+\t\t}\n+\n+\t\treturn a;\n+\t},\n+\t{} as Record<string, Tag>,\n+);\n\\ No newline at end of file"},{"sha":"0d7b229f7575a549454f98fe4ef1d12c2f696ba0","filename":"src/routes/blog.tsx","status":"added","additions":92,"deletions":0,"changes":92,"blob_url":"https://github.com/GizzyUwU/govgiz/blob/4b2613c90b8a156fd557a6569138a5416a1876cd/src%2Froutes%2Fblog.tsx","raw_url":"https://github.com/GizzyUwU/govgiz/raw/4b2613c90b8a156fd557a6569138a5416a1876cd/src%2Froutes%2Fblog.tsx","contents_url":"https://api.github.com/repos/GizzyUwU/govgiz/contents/src%2Froutes%2Fblog.tsx?ref=4b2613c90b8a156fd557a6569138a5416a1876cd","patch":"@@ -0,0 +1,92 @@\n+import type { RouteSectionProps } from \"@solidjs/router\";\n+import { For, Show } from \"solid-js\";\n+import { Meta, Title } from \"@solidjs/meta\";\n+// @ts-expect-error\n+import { MDXProvider } from \"solid-mdx\";\n+import { posts } from \"~/data/posts\";\n+import { markdownComponents, PostImage } from \"~/components/Markdown\";\n+import type { Post } from \"~/types\";\n+import dayjs from \"dayjs\";\n+import \"../../public/prism.css\"\n+\n+const Blog = (props: RouteSectionProps<unknown>) => {\n+\tconst meta = () =>\n+\t\tposts.find((p) => props.location.pathname.endsWith(p.slug)) as Post;\n+\tconsole.log(meta())\n+\tconst index = () => posts.indexOf(meta());\n+\n+\tconst prevMeta = () =>\n+\t\tindex() === posts.length - 1 ? undefined : posts[index() + 1];\n+\tconst nextMeta = () => (index() === 0 ? undefined : posts[index() - 1]);\n+\n+\treturn (\n+\t\t<>\n+\t\t\t<div class=\"govuk-width-container\">\n+\t\t\t\t<a onClick={() => {\n+\t\t\t\t\thistory.back()\n+\t\t\t\t}} class=\"govuk-back-link\">Back</a>\n+\t\t\t\t<Title>Gizzy - {meta()?.title}</Title>\n+\t\t\t\t<Meta name=\"og:title\" content={meta().title} />\n+\t\t\t\t<Meta name=\"description\" content={meta().description} />\n+\t\t\t\t<Meta name=\"og:description\" content={meta().description} />\n+\n+\t\t\t\t<Show when={meta().featuredImage}>\n+\t\t\t\t\t<PostImage\n+\t\t\t\t\t\tclass=\"mb-3v saturate-0\"\n+\t\t\t\t\t\tsrc={meta().featuredImage || \"\"}\n+\t\t\t\t\t\talt={meta().featuredImageDesc || \"\"}\n+\t\t\t\t\t/>\n+\t\t\t\t</Show>\n+\t\t\t\t<br />\n+\t\t\t\t<h1 class=\"govuk-heading-l\">{meta().title}</h1>\n+\t\t\t\t\t<div class=\"govuk-inset-text\"><p class=\"govuk-body-s govuk-!-margin-bottom-0\">{dayjs(meta().date).format(\"D MM YYYY\")}</p>\n+\t\t\t\t\t\t<p class=\"govuk-body-s govuk-!-margin-bottom-0\">\n+\t\t\t\t\t\t\t<For each={meta().tags}>\n+\t\t\t\t\t\t\t\t{(tag, index) => (\n+\t\t\t\t\t\t\t\t\t<>\n+\t\t\t\t\t\t\t\t\t\t<a\n+\t\t\t\t\t\t\t\t\t\t\thref={`/tags/${tag}`}\n+\t\t\t\t\t\t\t\t\t\t\tclass=\"font-medium underline underline-offset-2 italic\"\n+\t\t\t\t\t\t\t\t\t\t>\n+\t\t\t\t\t\t\t\t\t\t\t{tag}\n+\t\t\t\t\t\t\t\t\t\t</a>\n+\t\t\t\t\t\t\t\t\t\t{index() === meta().tags.length - 1 ? \"\" : \", \"}\n+\t\t\t\t\t\t\t\t\t</>\n+\t\t\t\t\t\t\t\t)}\n+\t\t\t\t\t\t\t</For>\n+\t\t\t\t\t\t</p>\n+\t\t\t\t\t</div>\n+\n+\t\t\t\t<MDXProvider components={markdownComponents}>\n+\t\t\t\t\t{props.children}\n+\t\t\t\t</MDXProvider>\n+\n+\t\t\t\t<div class=\"mt-3v flex flex-col gap-1v\">\n+\t\t\t\t\t<Show when={prevMeta()} fallback={<div />}>\n+\t\t\t\t\t\t<div class=\"flex gap-1h\">\n+\t\t\t\t\t\t\t<span>Previous:</span>\n+\t\t\t\t\t\t\t<a\n+\t\t\t\t\t\t\t\tclass=\"underline underline-offset-2\"\n+\t\t\t\t\t\t\t\thref={`/blog/${prevMeta()?.slug}`}\n+\t\t\t\t\t\t\t>\n+\t\t\t\t\t\t\t\t{prevMeta()?.title}\n+\t\t\t\t\t\t\t</a>\n+\t\t\t\t\t\t</div>\n+\t\t\t\t\t</Show>\n+\t\t\t\t\t<Show when={nextMeta()} fallback={<div />}>\n+\t\t\t\t\t\t<div class=\"flex gap-1h\">\n+\t\t\t\t\t\t\t<span>Next:</span>\n+\t\t\t\t\t\t\t<a\n+\t\t\t\t\t\t\t\tclass=\"underline underline-offset-2\"\n+\t\t\t\t\t\t\t\thref={`/blog/${nextMeta()?.slug}`}\n+\t\t\t\t\t\t\t>\n+\t\t\t\t\t\t\t\t{nextMeta()?.title}\n+\t\t\t\t\t\t\t</a>\n+\t\t\t\t\t\t</div>\n+\t\t\t\t\t</Show>\n+\t\t\t\t</div>\n+\t\t\t</div>\n+\t\t</>\n+\t);\n+};\n+export default Blog;\n\\ No newline at end of file"},{"sha":"4030ee77e34f7d57903543b8eca6fcb52f8441ce","filename":"src/routes/blog/test.mdx","status":"added","additions":71,"deletions":0,"changes":71,"blob_url":"https://github.com/GizzyUwU/govgiz/blob/4b2613c90b8a156fd557a6569138a5416a1876cd/src%2Froutes%2Fblog%2Ftest.mdx","raw_url":"https://github.com/GizzyUwU/govgiz/raw/4b2613c90b8a156fd557a6569138a5416a1876cd/src%2Froutes%2Fblog%2Ftest.mdx","contents_url":"https://api.github.com/repos/GizzyUwU/govgiz/contents/src%2Froutes%2Fblog%2Ftest.mdx?ref=4b2613c90b8a156fd557a6569138a5416a1876cd","patch":"@@ -0,0 +1,71 @@\n+---\n+title: Test\n+description: Bleh\n+date: 2025-30-01\n+featuredImage: https://assets.solidjs.com/banner?type=SSG%20%2b%20MDX%20blog%20setup&background=tiles&project=%20\n+featuredImageDesc: SolidJS banner\n+tags:\n+  - solidjs\n+  - solid-start\n+  - mdx\n+  - markdown\n+---\n+\n+import { Aside, PostImage } from \"~/components/Markdown\";\n+\n+Bleh i need to test posts system\n+\n+<Aside>\n+\n+I assume you're already familiar with how SolidStart works, especially the file-based router.\n+\n+If you're not, [the official docs](https://docs.solidjs.com/solid-start/building-your-application/routing) do a better job at explaining it than I could.\n+\n+</Aside>\n+\n+\n+> I'm not good at keeping things short so look through the contents if you're only interested in one particular thing\n+\n+## Contents\n+\n+<hr />\n+\n+## AAAA\n+\n+AAAA\n+\n+### bLH\n+\n+BLEHHH \n+```ts\n+\n+console.log(\"a\")\n+```\n+\n+{/* <Tree tree={{\n+  l: \"/andi.dev\",\n+  c: [\n+    {\n+    l: \"src\",\n+    c: [{\n+      l: \"routes\", \n+      c: [\n+        {\n+          l: \"blog\",\n+          c: [\n+            \"post-1.mdx\",\n+            \"post-2.mdx\",\n+            \"post-3.mdx\",\n+          ]\n+        }\n+      ]},\n+      \"(home).tsx\"\n+    ]\n+  }]\n+}} /> */}\n+\n+## Kladsgj\n+\n+- a\n+- b\n+- c"},{"sha":"0edb4e571d44f09e848580e9392561564f7fe39a","filename":"src/routes/index.tsx","status":"modified","additions":2,"deletions":2,"changes":4,"blob_url":"https://github.com/GizzyUwU/govgiz/blob/4b2613c90b8a156fd557a6569138a5416a1876cd/src%2Froutes%2Findex.tsx","raw_url":"https://github.com/GizzyUwU/govgiz/raw/4b2613c90b8a156fd557a6569138a5416a1876cd/src%2Froutes%2Findex.tsx","contents_url":"https://api.github.com/repos/GizzyUwU/govgiz/contents/src%2Froutes%2Findex.tsx?ref=4b2613c90b8a156fd557a6569138a5416a1876cd","patch":"@@ -21,7 +21,7 @@ export default function Home() {\n     new Typed(\"#typed-list\", {\n       strings: [\"programmer\", \"developer\", \"nerd\", \"maker\"],\n       typeSpeed: 50,\n-      backSpeed: 50,\n+      backSpeed: 70,\n       loop: true,\n     });\n \n@@ -105,7 +105,7 @@ export default function Home() {\n                   })()}{\" \"}\n                   years old\n                 </span>{\" \"}\n-                and a <span id=\"typed-list\"></span> based in the United Kingdom!\n+                and a <span id=\"typed-list\"></span>based in the United Kingdom!\n               </p>\n               <Show when={stats()}>\n                 <div class=\"govuk-inset-text\">"},{"sha":"c7ae507b63f7fecd7186070cec38a34452311d51","filename":"src/types.ts","status":"added","additions":20,"deletions":0,"changes":20,"blob_url":"https://github.com/GizzyUwU/govgiz/blob/4b2613c90b8a156fd557a6569138a5416a1876cd/src%2Ftypes.ts","raw_url":"https://github.com/GizzyUwU/govgiz/raw/4b2613c90b8a156fd557a6569138a5416a1876cd/src%2Ftypes.ts","contents_url":"https://api.github.com/repos/GizzyUwU/govgiz/contents/src%2Ftypes.ts?ref=4b2613c90b8a156fd557a6569138a5416a1876cd","patch":"@@ -0,0 +1,20 @@\n+export type Post = {\n+\ttitle: string;\n+\tdate: Date;\n+\tslug: string;\n+\ttags: string[];\n+\tseries?: string;\n+\tfeaturedImage?: string;\n+\tfeaturedImageDesc?: string;\n+\tdescription: string;\n+};\n+\n+export type Tag = {\n+\tid: string;\n+\tposts: number[];\n+};\n+\n+export type Series = {\n+\tid: string;\n+\tposts: number[];\n+};\n\\ No newline at end of file"}]}