{"sha":"9b9687cd0dd56d0b86eb97ec784ac01946e39ece","node_id":"C_kwDORD3Y59oAKDliOTY4N2NkMGRkNTZkMGI4NmViOTdlYzc4NGFjMDE5NDZlMzllY2U","commit":{"author":{"name":"gizzy","email":"me@gizzy.pro","date":"2026-01-31T14:33:08Z"},"committer":{"name":"gizzy","email":"me@gizzy.pro","date":"2026-01-31T14:33:08Z"},"message":"feat: tags","tree":{"sha":"07d8937b5a2afdc1398699aa163697cda28cee3a","url":"https://api.github.com/repos/GizzyUwU/govgiz/git/trees/07d8937b5a2afdc1398699aa163697cda28cee3a"},"url":"https://api.github.com/repos/GizzyUwU/govgiz/git/commits/9b9687cd0dd56d0b86eb97ec784ac01946e39ece","comment_count":0,"verification":{"verified":false,"reason":"unsigned","signature":null,"payload":null,"verified_at":null}},"url":"https://api.github.com/repos/GizzyUwU/govgiz/commits/9b9687cd0dd56d0b86eb97ec784ac01946e39ece","html_url":"https://github.com/GizzyUwU/govgiz/commit/9b9687cd0dd56d0b86eb97ec784ac01946e39ece","comments_url":"https://api.github.com/repos/GizzyUwU/govgiz/commits/9b9687cd0dd56d0b86eb97ec784ac01946e39ece/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":"ef7e40b4fd1f2690a1b582ae4f07e73f1b5253c5","url":"https://api.github.com/repos/GizzyUwU/govgiz/commits/ef7e40b4fd1f2690a1b582ae4f07e73f1b5253c5","html_url":"https://github.com/GizzyUwU/govgiz/commit/ef7e40b4fd1f2690a1b582ae4f07e73f1b5253c5"}],"stats":{"total":607,"additions":504,"deletions":103},"files":[{"sha":"d3cbaac55cfa5db7414b3406e0e5eb6987f3e964","filename":"plugins/postsPlugin.ts","status":"modified","additions":2,"deletions":1,"changes":3,"blob_url":"https://github.com/GizzyUwU/govgiz/blob/9b9687cd0dd56d0b86eb97ec784ac01946e39ece/plugins%2FpostsPlugin.ts","raw_url":"https://github.com/GizzyUwU/govgiz/raw/9b9687cd0dd56d0b86eb97ec784ac01946e39ece/plugins%2FpostsPlugin.ts","contents_url":"https://api.github.com/repos/GizzyUwU/govgiz/contents/plugins%2FpostsPlugin.ts?ref=9b9687cd0dd56d0b86eb97ec784ac01946e39ece","patch":"@@ -37,7 +37,8 @@ export const postsPlugin = (): Plugin => {\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\t!filePath.includes(\"/src/routes/blog\") &&\n+\t\t\t\t\t!filePath.includes(\"/src/plugins/postsPlugin.ts\")\n \t\t\t\t)\n \t\t\t\t\treturn;\n "},{"sha":"1c03d4323f71808f19a0cda4b9541030d8e23f1b","filename":"src/components/Markdown.tsx","status":"modified","additions":26,"deletions":20,"changes":46,"blob_url":"https://github.com/GizzyUwU/govgiz/blob/9b9687cd0dd56d0b86eb97ec784ac01946e39ece/src%2Fcomponents%2FMarkdown.tsx","raw_url":"https://github.com/GizzyUwU/govgiz/raw/9b9687cd0dd56d0b86eb97ec784ac01946e39ece/src%2Fcomponents%2FMarkdown.tsx","contents_url":"https://api.github.com/repos/GizzyUwU/govgiz/contents/src%2Fcomponents%2FMarkdown.tsx?ref=9b9687cd0dd56d0b86eb97ec784ac01946e39ece","patch":"@@ -13,22 +13,19 @@ const P: ParentComponent = (props) => (\n );\n \n const Ol: ParentComponent = (props) => (\n-  <ol class=\"list-decimal [&>li]:ml-3h\">{props.children}</ol>\n+  <ol class=\"govuk-list govuk-list--number\">{props.children}</ol>\n );\n const Ul: ParentComponent = (props) => (\n-  <ul class=\"list-square [&>li]:ml-2h\">{props.children}</ul>\n+  <ul class=\"govuk-list govuk-list--bullet\">{props.children}</ul>\n );\n \n-const Li: ParentComponent = (props) => <li class=\"\">{props.children}</li>;\n+const Li: ParentComponent = (props) => <li class=\"govuk-link\">{props.children}</li>;\n \n export const Blockquote: ParentComponent = (props) => {\n   let ref!: HTMLDivElement;\n \n   onMount(() => {\n     ref.querySelectorAll<HTMLParagraphElement>(\"p.govuk-body\").forEach((p) => {\n-      p.classList.remove(\"govuk-body\");\n-      p.classList.add(\"govuk-body-s\");\n-      p.classList.add(\"govuk-body-s\");\n       p.style.fontStyle = \"italic\";\n       p.style.paddingLeft = \"0.75rem\";\n       if (!p.textContent?.trim().startsWith(\">\")) {\n@@ -71,6 +68,14 @@ const Pre: ParentComponent<{\n       <ul class=\"govuk-tabs__list\">\n         <li\n           class={`govuk-tabs__list-item ${open() ? \"govuk-tabs__list-item--selected\" : \"\"}`}\n+          style={{\n+            ...(open()\n+              ? {}\n+              : {\n+                  border: \"1px solid #b1b4b6\",\n+                  \"border-bottom\": \"none\",\n+                }),\n+          }}\n         >\n           <a\n             class=\"govuk-tabs__tab\"\n@@ -84,7 +89,11 @@ const Pre: ParentComponent<{\n           </a>\n         </li>\n       </ul>\n-      <div class=\"govuk-tabs__panel \" ref={divRef} style={{ display: open() ? \"block\" : \"none\" }}>\n+      <div\n+        class=\"govuk-tabs__panel \"\n+        ref={divRef}\n+        style={{ display: open() ? \"block\" : \"none\" }}\n+      >\n         <pre\n           ref={ref}\n           class={`language-${props.lang}`}\n@@ -106,7 +115,7 @@ const Pre: ParentComponent<{\n               right: \"0.5rem\",\n               margin: 0,\n             }}\n-\t\t\tonClick={onCopy}\n+            onClick={onCopy}\n           >\n             {copied() ? \"Copied!\" : \"Copy code\"}\n           </button>\n@@ -121,13 +130,13 @@ const headingLink = (children: JSXElement) =>\n   children?.toString().toLowerCase().replaceAll(\" \", \"-\").replaceAll(\",\", \"\");\n \n const HeadlineLink: Component<{ link: string; class: string }> = (props) => {\n-  return <a href={props.link} class=\"relative top-[1px]\"></a>;\n+  return <a href={props.link} class=\"govuk-link\"></a>;\n };\n \n const H2: ParentComponent = (props) => (\n   <h2\n     id={headingLink(props.children)}\n-    class=\"text-2xl leading-2 font-bold mt-2v mb-1v flex items-center gap-1h scroll-mt-2v\"\n+    class=\"govuk-heading-m\"\n   >\n     {props.children}\n     <HeadlineLink class=\"w-5 h-5\" link={`#${headingLink(props.children)}`} />\n@@ -137,7 +146,7 @@ const H2: ParentComponent = (props) => (\n const H3: ParentComponent = (props) => (\n   <h3\n     id={headingLink(props.children)}\n-    class=\"text-xl leading-2 font-bold mt-2v mb-1v flex items-center gap-1h scroll-mt-2v\"\n+    class=\"govuk-heading-s\"\n   >\n     {props.children}\n     <HeadlineLink class=\"w-4 h-4\" link={`#${headingLink(props.children)}`} />\n@@ -147,7 +156,7 @@ const H3: ParentComponent = (props) => (\n const H4: ParentComponent = (props) => (\n   <h4\n     id={headingLink(props.children)}\n-    class=\"text-lg leading-1 font-bold mt-2v mb-1v flex items-center gap-1h scroll-mt-2v\"\n+    class=\"govuk-heading-s\"\n   >\n     {props.children}\n     <HeadlineLink class=\"w-3 h-3\" link={`#${headingLink(props.children)}`} />\n@@ -160,11 +169,7 @@ const A: ParentComponent<{ href: string }> = (props) => {\n   );\n \n   return (\n-    <a\n-      href={props.href}\n-      target={isLocal() ? \"\" : \"_blank\"}\n-      class=\"underline underline-offset-2\"\n-    >\n+    <a href={props.href} target={isLocal() ? \"\" : \"_blank\"} class=\"govuk-link\">\n       {props.children}\n     </a>\n   );\n@@ -214,7 +219,10 @@ export const PostImage: Component<{\n         ref={ref}\n         src={props.src}\n         alt={props.alt}\n-        class=\"w-full\"\n+        style={{\n+          \"max-width\": \"1020px\",\n+\t\t  \"width\": \"100%\"\n+        }}\n         classList={{ [props.class || \"\"]: !!props.class }}\n       />\n       {props.attr}\n@@ -227,8 +235,6 @@ export const Aside: ParentComponent = (props) => {\n \n   onMount(() => {\n     ref.querySelectorAll(\"p.govuk-body\").forEach((p) => {\n-      p.classList.remove(\"govuk-body\");\n-      p.classList.add(\"govuk-body-s\");\n       p.classList.add(\"govuk-!-margin-bottom-0\");\n     });\n   });"},{"sha":"c039cf2e6356d6560943f19027cf9b9691fb7e7e","filename":"src/components/Posts.tsx","status":"added","additions":22,"deletions":0,"changes":22,"blob_url":"https://github.com/GizzyUwU/govgiz/blob/9b9687cd0dd56d0b86eb97ec784ac01946e39ece/src%2Fcomponents%2FPosts.tsx","raw_url":"https://github.com/GizzyUwU/govgiz/raw/9b9687cd0dd56d0b86eb97ec784ac01946e39ece/src%2Fcomponents%2FPosts.tsx","contents_url":"https://api.github.com/repos/GizzyUwU/govgiz/contents/src%2Fcomponents%2FPosts.tsx?ref=9b9687cd0dd56d0b86eb97ec784ac01946e39ece","patch":"@@ -0,0 +1,22 @@\n+import dayjs from \"dayjs\";\n+import { type Component, For } from \"solid-js\";\n+import type { Post } from \"~/types\";\n+\n+export const Posts: Component<{ posts: Post[] }> = (props) => {\n+\treturn (\n+\t\t<ol class=\"\">\n+\t\t\t<For each={props.posts}>\n+\t\t\t\t{(post) => (\n+\t\t\t\t\t<li class=\"list-square ml-2h mb-1v\">\n+\t\t\t\t\t\t<a class=\"font-medium underline block\" href={`/blog/${post.slug}`}>\n+\t\t\t\t\t\t\t{post.title}\n+\t\t\t\t\t\t</a>\n+\t\t\t\t\t\t<span class=\"text-xs leading-1 text-slate-600 dark:text-slate-400\">\n+\t\t\t\t\t\t\t{dayjs(post.date).format(\"MMMM YYYY\")}\n+\t\t\t\t\t\t</span>\n+\t\t\t\t\t</li>\n+\t\t\t\t)}\n+\t\t\t</For>\n+\t\t</ol>\n+\t);\n+};\n\\ No newline at end of file"},{"sha":"8550d4f8fee5be35bb22f4cb3b4fac7849874ea7","filename":"src/data/posts.json","status":"modified","additions":15,"deletions":1,"changes":16,"blob_url":"https://github.com/GizzyUwU/govgiz/blob/9b9687cd0dd56d0b86eb97ec784ac01946e39ece/src%2Fdata%2Fposts.json","raw_url":"https://github.com/GizzyUwU/govgiz/raw/9b9687cd0dd56d0b86eb97ec784ac01946e39ece/src%2Fdata%2Fposts.json","contents_url":"https://api.github.com/repos/GizzyUwU/govgiz/contents/src%2Fdata%2Fposts.json?ref=9b9687cd0dd56d0b86eb97ec784ac01946e39ece","patch":"@@ -1,8 +1,22 @@\n [\n+  {\n+    \"title\": \"TAAAAAAAAA\",\n+    \"description\": \"Bleh\",\n+    \"date\": \"2025-01-31\",\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\": \"aaa\"\n+  },\n   {\n     \"title\": \"Test\",\n     \"description\": \"Bleh\",\n-    \"date\": \"2025-30-01\",\n+    \"date\": \"2025-01-30\",\n     \"featuredImage\": \"https://assets.solidjs.com/banner?type=SSG%20%2b%20MDX%20blog%20setup&background=tiles&project=%20\",\n     \"featuredImageDesc\": \"SolidJS banner\",\n     \"tags\": ["},{"sha":"a2c5f1e926af736389bfe33820ffd262757cc076","filename":"src/routes/blog.tsx","status":"modified","additions":57,"deletions":80,"changes":137,"blob_url":"https://github.com/GizzyUwU/govgiz/blob/9b9687cd0dd56d0b86eb97ec784ac01946e39ece/src%2Froutes%2Fblog.tsx","raw_url":"https://github.com/GizzyUwU/govgiz/raw/9b9687cd0dd56d0b86eb97ec784ac01946e39ece/src%2Froutes%2Fblog.tsx","contents_url":"https://api.github.com/repos/GizzyUwU/govgiz/contents/src%2Froutes%2Fblog.tsx?ref=9b9687cd0dd56d0b86eb97ec784ac01946e39ece","patch":"@@ -7,88 +7,65 @@ 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 'prismjs/themes/prism.css';\n-import 'prismjs/plugins/line-numbers/prism-line-numbers.css';\n-import 'prismjs';\n+import \"prismjs/themes/prism.css\";\n+import \"prismjs/plugins/line-numbers/prism-line-numbers.css\";\n+import \"prismjs\";\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+  const meta = () =>\n+    posts.find((p) => props.location.pathname.endsWith(p.slug)) as Post;\n+  console.log(meta());\n+  const 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+  const prevMeta = () =>\n+    index() === posts.length - 1 ? undefined : posts[index() + 1];\n+  const 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+  return (\n+    <div class=\"govuk-width-container govuk-!-text-break-word\">\n+      <Title>Gizzy - {meta()?.title}</Title>\n+      <Meta name=\"og:title\" content={meta().title} />\n+      <Meta name=\"description\" content={meta().description} />\n+      <Meta name=\"og:description\" content={meta().description} />\n+      <Show when={meta().featuredImage}>\n+        <PostImage\n+          class=\"govuk-!-margin-top-2\"\n+          src={meta().featuredImage || \"\"}\n+          alt={meta().featuredImageDesc || \"\"}\n+        />\n+      </Show>\n+      <br />\n+      <a\n+        onClick={() => {\n+          history.back();\n+        }}\n+        class=\"govuk-back-link\"\n+        style={{\n+          cursor: \"pointer\",\n+        }}\n+      >\n+        Back\n+      </a>\n+      <h1 class=\"govuk-heading-l govuk-!-margin-bottom-0\">{meta().title}</h1>\n+      <p class=\"govuk-body-s govuk-!-margin-top-2\">\n+        {dayjs(meta().date).format(\"D MM YYYY\")}\n+        {\" — \"}\n+        <For each={meta().tags}>\n+          {(tag, index) => (\n+            <>\n+              <a href={`/tags/${tag}`} class=\"govuk-link\">\n+                {tag}\n+              </a>\n+              {index() === meta().tags.length - 1 ? \"\" : \", \"}\n+            </>\n+          )}\n+        </For>\n+      </p>\n+      <div class=\"govuk-visibility-hidden govuk-!-margin-top-2\"></div>\n+      <MDXProvider components={markdownComponents}>\n+        {props.children}\n+      </MDXProvider>\n+    </div>\n+  );\n };\n-export default Blog;\n\\ No newline at end of file\n+export default Blog;"},{"sha":"67f9d918b0cfe731e0ab96f70d87aecf05dd968b","filename":"src/routes/blog/aaa.mdx","status":"added","additions":297,"deletions":0,"changes":297,"blob_url":"https://github.com/GizzyUwU/govgiz/blob/9b9687cd0dd56d0b86eb97ec784ac01946e39ece/src%2Froutes%2Fblog%2Faaa.mdx","raw_url":"https://github.com/GizzyUwU/govgiz/raw/9b9687cd0dd56d0b86eb97ec784ac01946e39ece/src%2Froutes%2Fblog%2Faaa.mdx","contents_url":"https://api.github.com/repos/GizzyUwU/govgiz/contents/src%2Froutes%2Fblog%2Faaa.mdx?ref=9b9687cd0dd56d0b86eb97ec784ac01946e39ece","patch":"@@ -0,0 +1,297 @@\n+---\n+title: TAAAAAAAAA\n+description: Bleh\n+date: 2025-01-31\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+```js lang=\"javascript\" displayLang=\"JavaScript\"\n+import {\n+  type Component,\n+  createMemo,\n+  type ParentComponent,\n+  type JSXElement,\n+  createSignal,\n+  Show,\n+  onMount,\n+} from \"solid-js\";\n+\n+const P: ParentComponent = (props) => (\n+  <p class=\"govuk-body\">{props.children}</p>\n+);\n+\n+const Ol: ParentComponent = (props) => (\n+  <ol class=\"list-decimal [&>li]:ml-3h\">{props.children}</ol>\n+);\n+const Ul: ParentComponent = (props) => (\n+  <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+  let ref!: HTMLDivElement;\n+\n+  onMount(() => {\n+    ref.querySelectorAll<HTMLParagraphElement>(\"p.govuk-body\").forEach((p) => {\n+      p.classList.remove(\"govuk-body\");\n+      p.classList.add(\"govuk-body-s\");\n+      p.classList.add(\"govuk-body-s\");\n+      p.style.fontStyle = \"italic\";\n+      p.style.paddingLeft = \"0.75rem\";\n+      if (!p.textContent?.trim().startsWith(\">\")) {\n+        p.textContent = `> ${p.textContent ?? \"\"}`;\n+      }\n+    });\n+  });\n+\n+  return <div ref={ref}>{props.children}</div>;\n+};\n+\n+const Pre: ParentComponent<{\n+  lang: string;\n+  lines?: string;\n+  file?: string;\n+  children: JSXElement;\n+}> = (props) => {\n+  const [copied, setCopied] = createSignal(false);\n+  let ref!: HTMLPreElement;\n+\n+  const onCopy = () => {\n+    setCopied(true);\n+    navigator.clipboard.writeText(ref.innerText);\n+    setTimeout(() => {\n+      setCopied(false);\n+    }, 1500);\n+  };\n+  console.log({ ...props });\n+\n+  return (\n+    <div class=\"govuk-tabs\" data-module=\"govuk-tabs\">\n+      <h2 class=\"govuk-tabs__title\">Contents</h2>\n+      <ul class=\"govuk-tabs__list\">\n+        <li class=\"govuk-tabs__list-item govuk-tabs__list-item--selected\">\n+          <a class=\"govuk-tabs__tab\" href=\"#past-day\">\n+            {props.lang}\n+          </a>\n+        </li>\n+      </ul>\n+      <div class=\"govuk-tabs__panel\" id=\"past-day\">\n+          <button type=\"button\" onClick={onCopy}>\n+            {copied() ? \"Copied!\" : \"Copy code\"}\n+          </button>\n+        <pre\n+          ref={ref}\n+\t\t         class={`language-${props.lang}`}\n+          data-line={props.lines}\n+          style={{\n+            display: \"block\",\n+            margin: 0,\n+            \"overflow-x\": \"auto\",\n+          }}\n+        >\n+\n+            {props.children}\n+        </pre>\n+      </div>\n+    </div>\n+  );\n+};\n+\n+const headingLink = (children: JSXElement) =>\n+  children?.toString().toLowerCase().replaceAll(\" \", \"-\").replaceAll(\",\", \"\");\n+\n+const HeadlineLink: Component<{ link: string; class: string }> = (props) => {\n+  return <a href={props.link} class=\"relative top-[1px]\"></a>;\n+};\n+\n+const H2: ParentComponent = (props) => (\n+  <h2\n+    id={headingLink(props.children)}\n+    class=\"text-2xl leading-2 font-bold mt-2v mb-1v flex items-center gap-1h scroll-mt-2v\"\n+  >\n+    {props.children}\n+    <HeadlineLink class=\"w-5 h-5\" link={`#${headingLink(props.children)}`} />\n+  </h2>\n+);\n+\n+const H3: ParentComponent = (props) => (\n+  <h3\n+    id={headingLink(props.children)}\n+    class=\"text-xl leading-2 font-bold mt-2v mb-1v flex items-center gap-1h scroll-mt-2v\"\n+  >\n+    {props.children}\n+    <HeadlineLink class=\"w-4 h-4\" link={`#${headingLink(props.children)}`} />\n+  </h3>\n+);\n+\n+const H4: ParentComponent = (props) => (\n+  <h4\n+    id={headingLink(props.children)}\n+    class=\"text-lg leading-1 font-bold mt-2v mb-1v flex items-center gap-1h scroll-mt-2v\"\n+  >\n+    {props.children}\n+    <HeadlineLink class=\"w-3 h-3\" link={`#${headingLink(props.children)}`} />\n+  </h4>\n+);\n+\n+const A: ParentComponent<{ href: string }> = (props) => {\n+  const isLocal = createMemo(() =>\n+    [\"/\", \"./\", \"#\"].some((s) => props.href.startsWith(s)),\n+  );\n+\n+  return (\n+    <a\n+      href={props.href}\n+      target={isLocal() ? \"\" : \"_blank\"}\n+      class=\"underline underline-offset-2\"\n+    >\n+      {props.children}\n+    </a>\n+  );\n+};\n+\n+function gridCellDimensions() {\n+  const element = document.createElement(\"div\");\n+  element.style.position = \"fixed\";\n+  element.style.height = \"var(--line-height)\";\n+  element.style.width = \"1ch\";\n+  document.body.appendChild(element);\n+  const rect = element.getBoundingClientRect();\n+  document.body.removeChild(element);\n+  return { width: rect.width, height: rect.height };\n+}\n+\n+export const PostImage: Component<{\n+  src: string;\n+  alt: string;\n+  attr?: JSXElement;\n+  class?: string;\n+}> = (props) => {\n+  let ref!: HTMLImageElement;\n+\n+  onMount(() => {\n+    const cell = gridCellDimensions();\n+    function setHeightFromRatio() {\n+      const ratio = ref.naturalWidth / ref.naturalHeight;\n+      const rect = ref.getBoundingClientRect();\n+      const realHeight = rect.width / ratio;\n+      const diff = cell.height - (realHeight % cell.height);\n+      ref.style.setProperty(\"padding-bottom\", `${diff}px`);\n+    }\n+\n+    if (ref.complete) {\n+      setHeightFromRatio();\n+    } else {\n+      ref.addEventListener(\"load\", () => {\n+        setHeightFromRatio();\n+      });\n+    }\n+  });\n+\n+  return (\n+    <div>\n+      <img\n+        ref={ref}\n+        src={props.src}\n+        alt={props.alt}\n+        class=\"w-full\"\n+        classList={{ [props.class || \"\"]: !!props.class }}\n+      />\n+      {props.attr}\n+    </div>\n+  );\n+};\n+\n+export const Aside: ParentComponent = (props) => {\n+  let ref!: HTMLDivElement;\n+\n+  onMount(() => {\n+    ref.querySelectorAll(\"p.govuk-body\").forEach((p) => {\n+      p.classList.remove(\"govuk-body\");\n+      p.classList.add(\"govuk-body-s\");\n+      p.classList.add(\"govuk-!-margin-bottom-0\");\n+    });\n+  });\n+\n+  return (\n+    <div ref={ref} class=\"govuk-inset-text\">\n+      {props.children}\n+    </div>\n+  );\n+};\n+\n+export const markdownComponents = {\n+  a: A,\n+  p: P,\n+  li: Li,\n+  ol: Ol,\n+  ul: Ul,\n+  blockquote: Blockquote,\n+  pre: Pre,\n+  h2: H2,\n+  h3: H3,\n+  h4: H4,\n+};\n+\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":"eac5c2f2ab8f5f6a035b074cf2adf269f417ac26","filename":"src/routes/blog/test.mdx","status":"modified","additions":1,"deletions":1,"changes":2,"blob_url":"https://github.com/GizzyUwU/govgiz/blob/9b9687cd0dd56d0b86eb97ec784ac01946e39ece/src%2Froutes%2Fblog%2Ftest.mdx","raw_url":"https://github.com/GizzyUwU/govgiz/raw/9b9687cd0dd56d0b86eb97ec784ac01946e39ece/src%2Froutes%2Fblog%2Ftest.mdx","contents_url":"https://api.github.com/repos/GizzyUwU/govgiz/contents/src%2Froutes%2Fblog%2Ftest.mdx?ref=9b9687cd0dd56d0b86eb97ec784ac01946e39ece","patch":"@@ -1,7 +1,7 @@\n ---\n title: Test\n description: Bleh\n-date: 2025-30-01\n+date: 2025-01-30\n featuredImage: https://assets.solidjs.com/banner?type=SSG%20%2b%20MDX%20blog%20setup&background=tiles&project=%20\n featuredImageDesc: SolidJS banner\n tags:"},{"sha":"27b262e3668827ee764e9693de1d354791f756b2","filename":"src/routes/tags/(tags).tsx","status":"added","additions":38,"deletions":0,"changes":38,"blob_url":"https://github.com/GizzyUwU/govgiz/blob/9b9687cd0dd56d0b86eb97ec784ac01946e39ece/src%2Froutes%2Ftags%2F(tags).tsx","raw_url":"https://github.com/GizzyUwU/govgiz/raw/9b9687cd0dd56d0b86eb97ec784ac01946e39ece/src%2Froutes%2Ftags%2F(tags).tsx","contents_url":"https://api.github.com/repos/GizzyUwU/govgiz/contents/src%2Froutes%2Ftags%2F(tags).tsx?ref=9b9687cd0dd56d0b86eb97ec784ac01946e39ece","patch":"@@ -0,0 +1,38 @@\n+import { For } from \"solid-js\";\n+import { tags } from \"~/data/tags\";\n+\n+const Tags = () => {\n+\treturn (\n+\t\t<div class=\"govuk-width-container govuk-!-text-break-word\">\n+                     <a\n+            onClick={() => {\n+              history.back();\n+            }}\n+            class=\"govuk-back-link\"\n+            style={{\n+              cursor: \"pointer\",\n+            }}\n+          >\n+            Back\n+          </a>\n+\t\t\t<h1 class=\"govuk-heading-m\">All tags:</h1>\n+\t\t\t<ul class=\"govuk-list govuk-list--bullet\">\n+\t\t\t\t<For each={Object.values(tags)}>\n+\t\t\t\t\t{(tag) => (\n+\t\t\t\t\t\t<li class=\"govuk-body\">\n+\t\t\t\t\t\t\t<a class=\"govuk-link\" href={`/tags/${tag.id}`}>\n+\t\t\t\t\t\t\t\t{tag.id}\n+\t\t\t\t\t\t\t</a>\n+\t\t\t\t\t\t\t<span>\n+\t\t\t\t\t\t\t\t{\" \"}\n+\t\t\t\t\t\t\t\t- {tag.posts.length} Post{tag.posts.length === 1 ? \"\" : \"s\"}\n+\t\t\t\t\t\t\t</span>\n+\t\t\t\t\t\t</li>\n+\t\t\t\t\t)}\n+\t\t\t\t</For>\n+\t\t\t</ul>\n+\t\t</div>\n+\t);\n+};\n+\n+export default Tags;\n\\ No newline at end of file"},{"sha":"cf22f31f39c65e34394b0fdd698ed1b4ada69ee9","filename":"src/routes/tags/[id].tsx","status":"added","additions":46,"deletions":0,"changes":46,"blob_url":"https://github.com/GizzyUwU/govgiz/blob/9b9687cd0dd56d0b86eb97ec784ac01946e39ece/src%2Froutes%2Ftags%2F%5Bid%5D.tsx","raw_url":"https://github.com/GizzyUwU/govgiz/raw/9b9687cd0dd56d0b86eb97ec784ac01946e39ece/src%2Froutes%2Ftags%2F%5Bid%5D.tsx","contents_url":"https://api.github.com/repos/GizzyUwU/govgiz/contents/src%2Froutes%2Ftags%2F%5Bid%5D.tsx?ref=9b9687cd0dd56d0b86eb97ec784ac01946e39ece","patch":"@@ -0,0 +1,46 @@\n+import type { RouteSectionProps } from \"@solidjs/router\";\n+import { type Component, Show, For } from \"solid-js\";\n+import { posts } from \"~/data/posts\";\n+import dayjs from \"dayjs\";\n+import { tags } from \"~/data/tags\";\n+\n+const TagId: Component<RouteSectionProps<{ params: { id: string } }>> = (\n+  props,\n+) => {\n+  const tag = () => (props.params.id ? tags[props.params.id] : undefined);\n+  return (\n+    <div class=\"govuk-width-container govuk-!-text-break-word\">\n+      <Show when={tag()} fallback={<div>No posts with that tag</div>}>\n+          <a\n+            onClick={() => {\n+              history.back();\n+            }}\n+            class=\"govuk-back-link\"\n+            style={{\n+              cursor: \"pointer\",\n+            }}\n+          >\n+            Back\n+          </a>\n+          <h2 class=\"govuk-heading-m\">Tag: {tag()?.id}</h2>\n+          <ul class=\"govuk-list govuk-list--bullet\">\n+            <For each={tag()?.posts.map((i) => posts[i]) ?? []}>\n+              {(post) => (\n+                <li class=\"govuk-body-s\">\n+                  <a class=\"govuk-link\" href={`/blog/${post.slug}`}>\n+                    {post.title}\n+                  </a>{\" \"}\n+                  -{\" \"}\n+                  <span class=\"text-xs leading-1 text-slate-600 dark:text-slate-400\">\n+                    {dayjs(post.date).format(\"MMMM YYYY\")}\n+                  </span>\n+                </li>\n+              )}\n+            </For>\n+          </ul>\n+      </Show>\n+    </div>\n+  );\n+};\n+\n+export default TagId;"}]}