]> git.otsuka.systems Git - cotsuka.github.io/commitdiff
remove tailwind, improve content collection types
authorCameron Otsuka <cameron@otsuka.haus>
Thu, 19 Jun 2025 19:29:58 +0000 (12:29 -0700)
committerCameron Otsuka <cameron@otsuka.haus>
Thu, 19 Jun 2025 19:29:58 +0000 (12:29 -0700)
31 files changed:
astro.config.mjs
bun.lock
data/contributions.json [deleted file]
data/metadata.json
data/socials.json [deleted file]
package.json
src/components/footer.astro
src/components/head/article.astro
src/components/head/base.astro
src/components/heading.astro
src/components/metadata.astro [new file with mode: 0644]
src/components/navigation.astro
src/components/posse.astro [deleted file]
src/components/ui/callout.astro
src/components/ui/figure.astro
src/components/youtube.astro
src/content.config.ts
src/layouts/base.astro
src/pages/articles/[date]-[id].astro
src/pages/articles/index.astro
src/pages/bitcoin.astro
src/pages/feed.xml.ts
src/pages/index.astro
src/pages/links/[date]-[id].astro
src/pages/links/index.astro
src/pages/reviews/[date]-[id].astro
src/pages/reviews/index.astro
src/styles/global.css [deleted file]
src/styles/reset.css [new file with mode: 0644]
src/styles/style.css [new file with mode: 0644]
tsconfig.json

index 749d29bf3b14a77168dc75de622dc149decdfd37..1bb8d8efd257fc4225a9137e6ed02083d54258b6 100644 (file)
@@ -3,13 +3,9 @@ import { defineConfig } from 'astro/config';
 
 import mdx from '@astrojs/mdx';
 import sitemap from '@astrojs/sitemap';
-import tailwindcss from '@tailwindcss/vite';
 
 export default defineConfig({
   site: 'https://otsuka.haus',
   trailingSlash: 'always',
   integrations: [mdx(), sitemap()],
-  vite: {
-    plugins: [tailwindcss()],
-  },
 });
\ No newline at end of file
index 06bf36f878b854a538fba7708192e153fbeec2b4..ac187557f8a2f745f050c89d099ada1f3ec21f6a 100644 (file)
--- a/bun.lock
+++ b/bun.lock
@@ -9,10 +9,7 @@
         "@astrojs/sitemap": "^3.4.1",
         "@fontsource-variable/public-sans": "^5.2.6",
         "@fontsource-variable/source-code-pro": "^5.2.6",
-        "@tailwindcss/typography": "^0.5.16",
-        "@tailwindcss/vite": "^4.1.10",
-        "astro": "^5.9.3",
-        "tailwindcss": "^4.1.10",
+        "astro": "^5.10.0",
       },
       "devDependencies": {
         "@types/bun": "^1.2.16",
@@ -20,8 +17,6 @@
     },
   },
   "packages": {
-    "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="],
-
     "@astrojs/compiler": ["@astrojs/compiler@2.12.2", "", {}, "sha512-w2zfvhjNCkNMmMMOn5b0J8+OmUaBL1o40ipMvqcG6NRpdC+lKxmTi48DT8Xw0SzJ3AfmeFLB45zXZXtmbsjcgw=="],
 
     "@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.6.1", "", {}, "sha512-l5Pqf6uZu31aG+3Lv8nl/3s4DbUzdlxTWDof4pEpto6GUJNhhCbelVi9dEyurOVyqaelwmS9oSyOWOENSfgo9A=="],
 
     "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.33.5", "", { "os": "win32", "cpu": "x64" }, "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg=="],
 
-    "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="],
-
-    "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="],
-
-    "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
-
-    "@jridgewell/set-array": ["@jridgewell/set-array@1.2.1", "", {}, "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="],
-
     "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="],
 
-    "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="],
-
     "@mdx-js/mdx": ["@mdx-js/mdx@3.1.0", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdx": "^2.0.0", "collapse-white-space": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-util-scope": "^1.0.0", "estree-walker": "^3.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "markdown-extensions": "^2.0.0", "recma-build-jsx": "^1.0.0", "recma-jsx": "^1.0.0", "recma-stringify": "^1.0.0", "rehype-recma": "^1.0.0", "remark-mdx": "^3.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", "source-map": "^0.7.0", "unified": "^11.0.0", "unist-util-position-from-estree": "^2.0.0", "unist-util-stringify-position": "^4.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw=="],
 
     "@oslojs/encoding": ["@oslojs/encoding@1.1.0", "", {}, "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ=="],
 
     "@swc/helpers": ["@swc/helpers@0.5.17", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A=="],
 
-    "@tailwindcss/node": ["@tailwindcss/node@4.1.10", "", { "dependencies": { "@ampproject/remapping": "^2.3.0", "enhanced-resolve": "^5.18.1", "jiti": "^2.4.2", "lightningcss": "1.30.1", "magic-string": "^0.30.17", "source-map-js": "^1.2.1", "tailwindcss": "4.1.10" } }, "sha512-2ACf1znY5fpRBwRhMgj9ZXvb2XZW8qs+oTfotJ2C5xR0/WNL7UHZ7zXl6s+rUqedL1mNi+0O+WQr5awGowS3PQ=="],
-
-    "@tailwindcss/oxide": ["@tailwindcss/oxide@4.1.10", "", { "dependencies": { "detect-libc": "^2.0.4", "tar": "^7.4.3" }, "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.1.10", "@tailwindcss/oxide-darwin-arm64": "4.1.10", "@tailwindcss/oxide-darwin-x64": "4.1.10", "@tailwindcss/oxide-freebsd-x64": "4.1.10", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.10", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.10", "@tailwindcss/oxide-linux-arm64-musl": "4.1.10", "@tailwindcss/oxide-linux-x64-gnu": "4.1.10", "@tailwindcss/oxide-linux-x64-musl": "4.1.10", "@tailwindcss/oxide-wasm32-wasi": "4.1.10", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.10", "@tailwindcss/oxide-win32-x64-msvc": "4.1.10" } }, "sha512-v0C43s7Pjw+B9w21htrQwuFObSkio2aV/qPx/mhrRldbqxbWJK6KizM+q7BF1/1CmuLqZqX3CeYF7s7P9fbA8Q=="],
-
-    "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.1.10", "", { "os": "android", "cpu": "arm64" }, "sha512-VGLazCoRQ7rtsCzThaI1UyDu/XRYVyH4/EWiaSX6tFglE+xZB5cvtC5Omt0OQ+FfiIVP98su16jDVHDEIuH4iQ=="],
-
-    "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.1.10", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ZIFqvR1irX2yNjWJzKCqTCcHZbgkSkSkZKbRM3BPzhDL/18idA8uWCoopYA2CSDdSGFlDAxYdU2yBHwAwx8euQ=="],
-
-    "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.1.10", "", { "os": "darwin", "cpu": "x64" }, "sha512-eCA4zbIhWUFDXoamNztmS0MjXHSEJYlvATzWnRiTqJkcUteSjO94PoRHJy1Xbwp9bptjeIxxBHh+zBWFhttbrQ=="],
-
-    "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.1.10", "", { "os": "freebsd", "cpu": "x64" }, "sha512-8/392Xu12R0cc93DpiJvNpJ4wYVSiciUlkiOHOSOQNH3adq9Gi/dtySK7dVQjXIOzlpSHjeCL89RUUI8/GTI6g=="],
-
-    "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.1.10", "", { "os": "linux", "cpu": "arm" }, "sha512-t9rhmLT6EqeuPT+MXhWhlRYIMSfh5LZ6kBrC4FS6/+M1yXwfCtp24UumgCWOAJVyjQwG+lYva6wWZxrfvB+NhQ=="],
-
-    "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.1.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-3oWrlNlxLRxXejQ8zImzrVLuZ/9Z2SeKoLhtCu0hpo38hTO2iL86eFOu4sVR8cZc6n3z7eRXXqtHJECa6mFOvA=="],
-
-    "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.1.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-saScU0cmWvg/Ez4gUmQWr9pvY9Kssxt+Xenfx1LG7LmqjcrvBnw4r9VjkFcqmbBb7GCBwYNcZi9X3/oMda9sqQ=="],
-
-    "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.1.10", "", { "os": "linux", "cpu": "x64" }, "sha512-/G3ao/ybV9YEEgAXeEg28dyH6gs1QG8tvdN9c2MNZdUXYBaIY/Gx0N6RlJzfLy/7Nkdok4kaxKPHKJUlAaoTdA=="],
-
-    "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.1.10", "", { "os": "linux", "cpu": "x64" }, "sha512-LNr7X8fTiKGRtQGOerSayc2pWJp/9ptRYAa4G+U+cjw9kJZvkopav1AQc5HHD+U364f71tZv6XamaHKgrIoVzA=="],
-
-    "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.1.10", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@emnapi/wasi-threads": "^1.0.2", "@napi-rs/wasm-runtime": "^0.2.10", "@tybys/wasm-util": "^0.9.0", "tslib": "^2.8.0" }, "cpu": "none" }, "sha512-d6ekQpopFQJAcIK2i7ZzWOYGZ+A6NzzvQ3ozBvWFdeyqfOZdYHU66g5yr+/HC4ipP1ZgWsqa80+ISNILk+ae/Q=="],
-
-    "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.1.10", "", { "os": "win32", "cpu": "arm64" }, "sha512-i1Iwg9gRbwNVOCYmnigWCCgow8nDWSFmeTUU5nbNx3rqbe4p0kRbEqLwLJbYZKmSSp23g4N6rCDmm7OuPBXhDA=="],
-
-    "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.1.10", "", { "os": "win32", "cpu": "x64" }, "sha512-sGiJTjcBSfGq2DVRtaSljq5ZgZS2SDHSIfhOylkBvHVjwOsodBhnb3HdmiKkVuUGKD0I7G63abMOVaskj1KpOA=="],
-
-    "@tailwindcss/typography": ["@tailwindcss/typography@0.5.16", "", { "dependencies": { "lodash.castarray": "^4.4.0", "lodash.isplainobject": "^4.0.6", "lodash.merge": "^4.6.2", "postcss-selector-parser": "6.0.10" }, "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" } }, "sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA=="],
-
-    "@tailwindcss/vite": ["@tailwindcss/vite@4.1.10", "", { "dependencies": { "@tailwindcss/node": "4.1.10", "@tailwindcss/oxide": "4.1.10", "tailwindcss": "4.1.10" }, "peerDependencies": { "vite": "^5.2.0 || ^6" } }, "sha512-QWnD5HDY2IADv+vYR82lOhqOlS1jSCUUAmfem52cXAhRTKxpDh3ARX8TTXJTCCO7Rv7cD2Nlekabv02bwP3a2A=="],
-
     "@types/bun": ["@types/bun@1.2.16", "", { "dependencies": { "bun-types": "1.2.16" } }, "sha512-1aCZJ/6nSiViw339RsaNhkNoEloLaPzZhxMOYEa7OzRzO41IGg5n/7I43/ZIAW/c+Q6cT12Vf7fOZOoVIzb5BQ=="],
 
     "@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="],
 
     "astring": ["astring@1.9.0", "", { "bin": { "astring": "bin/astring" } }, "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg=="],
 
-    "astro": ["astro@5.9.3", "", { "dependencies": { "@astrojs/compiler": "^2.12.2", "@astrojs/internal-helpers": "0.6.1", "@astrojs/markdown-remark": "6.3.2", "@astrojs/telemetry": "3.3.0", "@capsizecss/unpack": "^2.4.0", "@oslojs/encoding": "^1.1.0", "@rollup/pluginutils": "^5.1.4", "acorn": "^8.14.1", "aria-query": "^5.3.2", "axobject-query": "^4.1.0", "boxen": "8.0.1", "ci-info": "^4.2.0", "clsx": "^2.1.1", "common-ancestor-path": "^1.0.1", "cookie": "^1.0.2", "cssesc": "^3.0.0", "debug": "^4.4.0", "deterministic-object-hash": "^2.0.2", "devalue": "^5.1.1", "diff": "^5.2.0", "dlv": "^1.1.3", "dset": "^3.1.4", "es-module-lexer": "^1.6.0", "esbuild": "^0.25.0", "estree-walker": "^3.0.3", "flattie": "^1.1.1", "fontace": "~0.3.0", "github-slugger": "^2.0.0", "html-escaper": "3.0.3", "http-cache-semantics": "^4.1.1", "import-meta-resolve": "^4.1.0", "js-yaml": "^4.1.0", "kleur": "^4.1.5", "magic-string": "^0.30.17", "magicast": "^0.3.5", "mrmime": "^2.0.1", "neotraverse": "^0.6.18", "p-limit": "^6.2.0", "p-queue": "^8.1.0", "package-manager-detector": "^1.1.0", "picomatch": "^4.0.2", "prompts": "^2.4.2", "rehype": "^13.0.2", "semver": "^7.7.1", "shiki": "^3.2.1", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.12", "tsconfck": "^3.1.5", "ultrahtml": "^1.6.0", "unifont": "~0.5.0", "unist-util-visit": "^5.0.0", "unstorage": "^1.15.0", "vfile": "^6.0.3", "vite": "^6.3.4", "vitefu": "^1.0.6", "xxhash-wasm": "^1.1.0", "yargs-parser": "^21.1.1", "yocto-spinner": "^0.2.1", "zod": "^3.24.2", "zod-to-json-schema": "^3.24.5", "zod-to-ts": "^1.2.0" }, "optionalDependencies": { "sharp": "^0.33.3" }, "bin": { "astro": "astro.js" } }, "sha512-VReZrpUa/3rfeiVvsQ1A2M3ujDPI+pDGIYOMtXPEZwut8tZoEyealXXLjitgCsJ+3dunKGZbg4Eak6i+r0vniw=="],
+    "astro": ["astro@5.10.0", "", { "dependencies": { "@astrojs/compiler": "^2.12.2", "@astrojs/internal-helpers": "0.6.1", "@astrojs/markdown-remark": "6.3.2", "@astrojs/telemetry": "3.3.0", "@capsizecss/unpack": "^2.4.0", "@oslojs/encoding": "^1.1.0", "@rollup/pluginutils": "^5.1.4", "acorn": "^8.14.1", "aria-query": "^5.3.2", "axobject-query": "^4.1.0", "boxen": "8.0.1", "ci-info": "^4.2.0", "clsx": "^2.1.1", "common-ancestor-path": "^1.0.1", "cookie": "^1.0.2", "cssesc": "^3.0.0", "debug": "^4.4.0", "deterministic-object-hash": "^2.0.2", "devalue": "^5.1.1", "diff": "^5.2.0", "dlv": "^1.1.3", "dset": "^3.1.4", "es-module-lexer": "^1.6.0", "esbuild": "^0.25.0", "estree-walker": "^3.0.3", "flattie": "^1.1.1", "fontace": "~0.3.0", "github-slugger": "^2.0.0", "html-escaper": "3.0.3", "http-cache-semantics": "^4.1.1", "import-meta-resolve": "^4.1.0", "js-yaml": "^4.1.0", "kleur": "^4.1.5", "magic-string": "^0.30.17", "magicast": "^0.3.5", "mrmime": "^2.0.1", "neotraverse": "^0.6.18", "p-limit": "^6.2.0", "p-queue": "^8.1.0", "package-manager-detector": "^1.1.0", "picomatch": "^4.0.2", "prompts": "^2.4.2", "rehype": "^13.0.2", "semver": "^7.7.1", "shiki": "^3.2.1", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.12", "tsconfck": "^3.1.5", "ultrahtml": "^1.6.0", "unifont": "~0.5.0", "unist-util-visit": "^5.0.0", "unstorage": "^1.15.0", "vfile": "^6.0.3", "vite": "^6.3.4", "vitefu": "^1.0.6", "xxhash-wasm": "^1.1.0", "yargs-parser": "^21.1.1", "yocto-spinner": "^0.2.1", "zod": "^3.24.2", "zod-to-json-schema": "^3.24.5", "zod-to-ts": "^1.2.0" }, "optionalDependencies": { "sharp": "^0.33.3" }, "bin": { "astro": "astro.js" } }, "sha512-g/t54kVzQnFVijs+GbbbX/NBAFTl/3yNAEA/AQYq4FumLLVv7n4BIF+jKhcPGn9iFGyT1Cjvr7KB/qYyNvHEIg=="],
 
     "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="],
 
 
     "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="],
 
-    "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="],
-
     "ci-info": ["ci-info@4.2.0", "", {}, "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg=="],
 
     "cli-boxes": ["cli-boxes@3.0.0", "", {}, "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g=="],
 
     "emoji-regex": ["emoji-regex@10.4.0", "", {}, "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw=="],
 
-    "enhanced-resolve": ["enhanced-resolve@5.18.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg=="],
-
     "entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="],
 
     "es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="],
 
     "github-slugger": ["github-slugger@2.0.0", "", {}, "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="],
 
-    "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
-
     "h3": ["h3@1.15.3", "", { "dependencies": { "cookie-es": "^1.2.2", "crossws": "^0.3.4", "defu": "^6.1.4", "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", "node-mock-http": "^1.0.0", "radix3": "^1.1.2", "ufo": "^1.6.1", "uncrypto": "^0.1.3" } }, "sha512-z6GknHqyX0h9aQaTx22VZDf6QyZn+0Nh+Ym8O/u0SGSkyF5cuTJYKlc8MkzW3Nzf9LE1ivcpmYC3FUGpywhuUQ=="],
 
     "hast-util-from-html": ["hast-util-from-html@2.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "devlop": "^1.1.0", "hast-util-from-parse5": "^8.0.0", "parse5": "^7.0.0", "vfile": "^6.0.0", "vfile-message": "^4.0.0" } }, "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw=="],
 
     "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.30.1", "", { "os": "win32", "cpu": "x64" }, "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg=="],
 
-    "lodash.castarray": ["lodash.castarray@4.4.0", "", {}, "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q=="],
-
-    "lodash.isplainobject": ["lodash.isplainobject@4.0.6", "", {}, "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="],
-
-    "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="],
-
     "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="],
 
     "lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
 
     "micromark-util-types": ["micromark-util-types@2.0.2", "", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="],
 
-    "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="],
-
-    "minizlib": ["minizlib@3.0.2", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA=="],
-
-    "mkdirp": ["mkdirp@3.0.1", "", { "bin": { "mkdirp": "dist/cjs/src/bin.js" } }, "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg=="],
-
     "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="],
 
     "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
 
     "postcss": ["postcss@8.5.5", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-d/jtm+rdNT8tpXuHY5MMtcbJFBkhXE6593XVR9UoGCH8jSFGci7jGvMGH5RYd5PBJW+00NZQt6gf7CbagJCrhg=="],
 
-    "postcss-selector-parser": ["postcss-selector-parser@6.0.10", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w=="],
-
     "prismjs": ["prismjs@1.30.0", "", {}, "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw=="],
 
     "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="],
 
     "style-to-object": ["style-to-object@1.0.8", "", { "dependencies": { "inline-style-parser": "0.2.4" } }, "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g=="],
 
-    "tailwindcss": ["tailwindcss@4.1.10", "", {}, "sha512-P3nr6WkvKV/ONsTzj6Gb57sWPMX29EPNPopo7+FcpkQaNsrNpZ1pv8QmrYI2RqEKD7mlGqLnGovlcYnBK0IqUA=="],
-
-    "tapable": ["tapable@2.2.2", "", {}, "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg=="],
-
-    "tar": ["tar@7.4.3", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.0.1", "mkdirp": "^3.0.1", "yallist": "^5.0.0" } }, "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw=="],
-
     "tiny-inflate": ["tiny-inflate@1.0.3", "", {}, "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="],
 
     "tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="],
 
     "unstorage": ["unstorage@1.16.0", "", { "dependencies": { "anymatch": "^3.1.3", "chokidar": "^4.0.3", "destr": "^2.0.5", "h3": "^1.15.2", "lru-cache": "^10.4.3", "node-fetch-native": "^1.6.6", "ofetch": "^1.4.1", "ufo": "^1.6.1" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", "@azure/cosmos": "^4.2.0", "@azure/data-tables": "^13.3.0", "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", "@capacitor/preferences": "^6.0.3 || ^7.0.0", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.1", "@vercel/kv": "^1.0.1", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", "ioredis": "^5.4.2", "uploadthing": "^7.4.4" }, "optionalPeers": ["@azure/app-configuration", "@azure/cosmos", "@azure/data-tables", "@azure/identity", "@azure/keyvault-secrets", "@azure/storage-blob", "@capacitor/preferences", "@deno/kv", "@netlify/blobs", "@planetscale/database", "@upstash/redis", "@vercel/blob", "@vercel/kv", "aws4fetch", "db0", "idb-keyval", "ioredis", "uploadthing"] }, "sha512-WQ37/H5A7LcRPWfYOrDa1Ys02xAbpPJq6q5GkO88FBXVSQzHd7+BjEwfRqyaSWCv9MbsJy058GWjjPjcJ16GGA=="],
 
-    "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],
-
     "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="],
 
     "vfile-location": ["vfile-location@5.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg=="],
 
     "xxhash-wasm": ["xxhash-wasm@1.1.0", "", {}, "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA=="],
 
-    "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="],
-
     "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="],
 
     "yocto-queue": ["yocto-queue@1.2.1", "", {}, "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg=="],
 
     "@rollup/pluginutils/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="],
 
-    "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.4.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.2", "tslib": "^2.4.0" }, "bundled": true }, "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g=="],
-
-    "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.4.3", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ=="],
-
-    "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.0.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA=="],
-
-    "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.11", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.9.0" }, "bundled": true }, "sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA=="],
-
-    "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.9.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw=="],
-
-    "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
-
     "ansi-align/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
 
     "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
diff --git a/data/contributions.json b/data/contributions.json
deleted file mode 100644 (file)
index 045808e..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-[
-    {
-        "title": "Arch User Repository",
-        "url": "https://aur.archlinux.org/packages?O=0&SeB=M&K=cotsuka&outdated=&SB=p&SO=d&PP=50&submit=Go"
-    },
-    {
-        "title": "ArchWiki",
-        "url": "https://wiki.archlinux.org/title/Special:Contributions/Cotsuka"
-    },
-    {
-        "title": "GitHub",
-        "url": "https://github.com/search?q=author%3Acotsuka&type=pullrequests"
-    },
-    {
-        "title": "Wikipedia",
-        "url": "https://en.wikipedia.org/wiki/Special:Contributions/Cotsuka"
-    }
-]
\ No newline at end of file
index 9103a410968b7dec9cae00a9a7c6f61cd75a4e5c..d1ff461808b97c4425a613680533f104b286c4c9 100644 (file)
         { "title": "Articles", "url": "/articles/" },
         { "title": "Links", "url": "/links/" },
         { "title": "Reviews", "url": "/reviews/" }
-    ]
+    ],
+    "contributions": [
+        {
+            "title": "Arch User Repository",
+            "url": "https://aur.archlinux.org/packages?O=0&SeB=M&K=cotsuka&outdated=&SB=p&SO=d&PP=50&submit=Go"
+        },
+        {
+            "title": "ArchWiki",
+            "url": "https://wiki.archlinux.org/title/Special:Contributions/Cotsuka"
+        },
+        {
+            "title": "GitHub",
+            "url": "https://github.com/search?q=author%3Acotsuka&type=pullrequests"
+        },
+        {
+            "title": "Wikipedia",
+            "url": "https://en.wikipedia.org/wiki/Special:Contributions/Cotsuka"
+        }
+    ],
+    "socials": {
+        "x": {
+            "title": "𝕏",
+            "url": "https://x.com/CameronOtsuka",
+            "username": "@CameronOtsuka"
+        },
+        "linkedin": {
+            "title": "LinkedIn",
+            "url": "https://www.linkedin.com/in/cotsuka",
+            "username": "cotsuka"
+        },
+        "github": {
+            "title": "GitHub",
+            "url": "https://github.com/cotsuka",
+            "username": "cotsuka"
+        },
+        "activitypub": {
+            "title": "ActivityPub",
+            "url": "https://otsuka.social/@cameron",
+            "username": "@cameron@otsuka.social"
+        },
+        "bluesky": {
+            "title": "Bluesky",
+            "url": "https://bsky.app/profile/otsuka.haus",
+            "username": "@otsuka.haus"
+        },
+        "nostr": {
+            "title": "Nostr",
+            "url": "https://primal.net/profile/npub1hzssq7wewjztvglpdvku92htx3sv2x5r9ycvqhvl9xrtt5fn629s3np693",
+            "username": "cameron@otsuka.haus"
+        }
+    }
 }
\ No newline at end of file
diff --git a/data/socials.json b/data/socials.json
deleted file mode 100644 (file)
index 21d0726..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-{
-    "x": {
-        "title": "𝕏",
-        "url": "https://x.com/CameronOtsuka",
-        "username": "@CameronOtsuka"
-    },
-    "linkedin": {
-        "title": "LinkedIn",
-        "url": "https://www.linkedin.com/in/cotsuka",
-        "username": "cotsuka"
-    },
-    "github": {
-        "title": "GitHub",
-        "url": "https://github.com/cotsuka",
-        "username": "cotsuka"
-    },
-    "activitypub": {
-        "title": "ActivityPub",
-        "url": "https://otsuka.social/@cameron",
-        "username": "@cameron@otsuka.social"
-    },
-    "bluesky": {
-        "title": "Bluesky",
-        "url": "https://bsky.app/profile/otsuka.haus",
-        "username": "@otsuka.haus"
-    },
-    "nostr": {
-        "title": "Nostr",
-        "url": "https://primal.net/profile/npub1hzssq7wewjztvglpdvku92htx3sv2x5r9ycvqhvl9xrtt5fn629s3np693",
-        "username": "cameron@otsuka.haus"
-    }
-}
\ No newline at end of file
index 5509db7bc2e66b2beea52813b698651189fefb0d..8dff81adcfd6b21fbdfa1b43f122e393a78ff252 100644 (file)
     "@astrojs/sitemap": "^3.4.1",
     "@fontsource-variable/public-sans": "^5.2.6",
     "@fontsource-variable/source-code-pro": "^5.2.6",
-    "@tailwindcss/typography": "^0.5.16",
-    "@tailwindcss/vite": "^4.1.10",
-    "astro": "^5.9.3",
-    "tailwindcss": "^4.1.10"
+    "astro": "^5.10.0"
   },
   "devDependencies": {
     "@types/bun": "^1.2.16"
index cf54646dee424ef387d9d668fc77a49c3f3e9b20..5b9c004141567f5a4d2f308364da61517d61a6a9 100644 (file)
@@ -1,21 +1,37 @@
 ---
-import { getCollection } from 'astro:content';
-import Metadata from '@data/metadata.json';
+import SiteMetadata from '@data/metadata.json';
 
-const socials = await getCollection('socials');
 const currentYear = new Date().getFullYear();
 ---
-<div class="text-center">
-    <hr class="w-48 h-1 mx-auto bg-black dark:bg-white border-0" />
+<footer>
+    <hr />
     <address>
         <menu>
-            {socials.map((social) => (
-                <li class="inline-block mx-1"><a href={social.data.url} rel="me">{social.data.title}</a></li>
+            {Object.keys(SiteMetadata.socials).map((social) => (
+                <li><a href={SiteMetadata.socials[social].url} rel="me">{SiteMetadata.socials[social].title}</a></li>
             ))}
         </menu>
     </address>
     <p>
-        &copy; {currentYear} {Metadata.author.name}.<br>
+        &copy; {currentYear} {SiteMetadata.author.name}.<br>
         All views my own. Not financial advice. Links, citations, and other references are not endorsements. Content is licensed under <a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a>.
     </p>
-</div>
\ No newline at end of file
+</footer>
+
+<style>
+    footer {
+        text-align: center;
+    }
+    menu {
+        margin-inline-start: 0;
+        padding-inline-start: 0;
+    }
+    li {
+        display: inline;
+        padding-right: 0.5rem;
+    }
+    hr {
+        margin-bottom: 1rem;
+        margin-top: 1rem;
+    }
+</style>
\ No newline at end of file
index 60737de56029b03ef19b90dbb1488e6ea08e8ee7..a7eaec6a4760373725ed54bc995b4986f00c2315 100644 (file)
@@ -1,5 +1,5 @@
 ---
-import Metadata from '@data/metadata.json';
+import SiteMetadata from '@data/metadata.json';
 
 interface Props {
     publishedTime: string
@@ -13,7 +13,7 @@ const { publishedTime, modifiedTime, tags = [] } = Astro.props;
 <meta property="og:type" content="article" />
 <meta property="article:published_time" content={publishedTime} />
 <meta property="article:modified_time" content={modifiedTime} />
-<meta property="article:author" content={Metadata.author.name} />
+<meta property="article:author" content={SiteMetadata.author.name} />
 {tags.map((tag) => (
     <meta property="article:tag" content={tag} />
 ))}
index e2166698853aaf016314e07e271063ed49a328e2..93e39189c61f88d0a5f55ca6cc4f255ab470bf6c 100644 (file)
@@ -1,8 +1,7 @@
 ---
 import { getImage } from 'astro:assets';
 import FavIcon from '@assets/favicon.ico';
-import Metadata from '@data/metadata.json';
-import Socials from '@data/socials.json'
+import SiteMetadata from '@data/metadata.json';
 
 interface Props {
     title: string
@@ -23,14 +22,14 @@ const { title, description } = Astro.props;
 <link rel="icon" type="image/x-icon" href={favIcon.src} />
 <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 <!-- <meta http-equiv="Content-Security-Policy" content="default-src 'self'; style-src 'self' 'unsafe-inline'; frame-src youtube.com www.youtube.com youtube-noocookie.com www.youtube-nocookie.com" /> -->
-<meta name="title" property="og:title" content={`${title} | ${Metadata.title}`} />
+<meta name="title" property="og:title" content={`${title} | ${SiteMetadata.title}`} />
 <meta name="description" property="og:description" content={description} />
-<meta name="author" content={Metadata.author.name} />
+<meta name="author" content={SiteMetadata.author.name} />
 <meta name="generator" content={Astro.generator} />
-<meta name="fediverse:creator" content={Socials.activitypub.username} />
+<meta name="fediverse:creator" content={SiteMetadata.socials.activitypub.username} />
 <meta name="twitter:card" content="summary" />
-<meta name="twitter:creator" content={Socials.x.username} />
-<meta name="twitter:title" content={`${title} | ${Metadata.title}`} />
+<meta name="twitter:creator" content={SiteMetadata.socials.x.username} />
+<meta name="twitter:title" content={`${title} | ${SiteMetadata.title}`} />
 <meta name="twitter:description" content={description} />
 <meta name="twitter:image" property="og:image" content={`https://v1.screenshot.11ty.dev/${canonicalURL}opengraph/9:16/`} />
 <meta property="og:image:type" content="image/jpeg" />
@@ -38,9 +37,9 @@ const { title, description } = Astro.props;
 <meta property="og:image:height" content="630" />
 <meta property="og:locale" content="en_US" />
 <meta property="og:url" content={canonicalURL} />
-<meta property="og:site_name" content={`${title} | ${Metadata.title}`} />
+<meta property="og:site_name" content={`${title} | ${SiteMetadata.title}`} />
 <meta property="og:updated_time" content={new Date().toISOString()} />
-<title>{`${title} | ${Metadata.title}`}</title>
+<title>{`${title} | ${SiteMetadata.title}`}</title>
 <link rel="canonical" href={canonicalURL} />
 <link rel="sitemap" href="/sitemap-index.xml" />
-<link rel="alternate" type="application/rss+xml" title={Metadata.title} href={new URL("feed.xml", Astro.site)} />
\ No newline at end of file
+<link rel="alternate" type="application/rss+xml" title={SiteMetadata.title} href={new URL("feed.xml", Astro.site)} />
\ No newline at end of file
index 4742c0bc6168aba00154bb7887ccbfe7cfb096dc..a4e9fed0cf7d836a69a74fa20a1306dc1716bd13 100644 (file)
@@ -1,5 +1,14 @@
 ---
 import Navigation from '@components/navigation.astro';
 ---
-<a href="/" class="no-underline"><h1>Cameron Otsuka</h1></a>
-<Navigation />
\ No newline at end of file
+<a href="/"><h1>Cameron Otsuka</h1></a>
+<Navigation />
+
+<style>
+    a {
+        color: #000000;
+    }
+    a:hover {
+        text-decoration: none;
+    }
+</style>
\ No newline at end of file
diff --git a/src/components/metadata.astro b/src/components/metadata.astro
new file mode 100644 (file)
index 0000000..29e2316
--- /dev/null
@@ -0,0 +1,32 @@
+---
+import { type CollectionEntry } from 'astro:content';
+import { formatDate } from '@utils/format.ts';
+
+interface Props {
+    entry: CollectionEntry<'articles'> | CollectionEntry<'links'> | CollectionEntry<'reviews'>
+}
+
+const { entry } = Astro.props;
+const date = formatDate(entry.data.date);
+---
+<details>
+    <summary>Metadata</summary>
+    <ul>
+        <li>{entry.collection == 'reviews' ? `Rating` : `Description`}: {entry.data.description}</li>
+        <li>Published: <time datetime="">{date}</time></li>
+        <li>Last Modified: <time datetime="">{entry.data.modified ? formatDate(entry.data.modified) : date}</time></li>
+        <li>Tags: {entry.data.tags.join(', ')}</li>
+        {entry.data.posse && <li>POSSE: {Object.entries(entry.data.posse).map((site) => (
+            <Fragment>
+                <a href={site[1]}>{site[0]}</a>&nbsp;
+            </Fragment>
+        ))}</li>}
+    </ul>
+</details>
+
+<style>
+    details {
+        margin-bottom: 1rem;
+        font-size: 0.8rem;
+    }
+</style>
\ No newline at end of file
index 2baa2f8a73f7c50b95081558d4ecb33be7d56f75..d095d1895e11b75e255c79c3862175cba130c4c1 100644 (file)
@@ -1,12 +1,26 @@
 ---
-import Metadata from '@data/metadata.json';
+import SiteMetadata from '@data/metadata.json';
 ---
-<nav class="text-center">
+<nav>
     <menu>
-        {Metadata.navMenu.map((menuItem) => {
+        {SiteMetadata.navMenu.map((menuItem) => {
             return (
-                <li class="inline-block mx-4"><a href={menuItem.url}>{menuItem.title}</a></li>
+                <li><a href={menuItem.url}>{menuItem.title}</a></li>
             )
         })}
     </menu>
-</nav>
\ No newline at end of file
+</nav>
+
+<style>
+    nav {
+        margin-bottom: 1rem;
+    }
+    menu {
+        margin-inline-start: 0;
+        padding-inline-start: 0;
+    }
+    li {
+        display: inline;
+        padding-right: 1rem;
+    }
+</style>
\ No newline at end of file
diff --git a/src/components/posse.astro b/src/components/posse.astro
deleted file mode 100644 (file)
index 0bfd584..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
----
-interface Props {
-    posse: Record<string, string>
-}
-
-const { posse } = Astro.props;
----
-{Object.entries(posse).map((site) => {
-    const url = site[1];
-    const label = site[0]
-    return (
-        <Fragment>
-            <a href={url}>{label}</a>&nbsp;
-        </Fragment>
-    )
-})}
\ No newline at end of file
index 0bf1704f13689a76ede9b5e22b3f12ff7c8638dc..cfaf2fb9f53f5a4af70ec386df0b927a0b53a398 100644 (file)
@@ -9,29 +9,50 @@ interface Props {
 const { level, label } = Astro.props;
 
 let calloutLabel = label;
-let textColor = ''
-let calloutColor = '';
 if (label == null) {
     switch(level) {
         case 'info':
             calloutLabel = 'ⓘ Info';
-            textColor = 'text-blue-500';
-            calloutColor = 'border-blue-500';
             break;
         case 'warn':
             calloutLabel = '⚠ Warning';
-            textColor = 'text-orange-500';
-            calloutColor = 'border-orange-500';
             break;
         case 'error':
             calloutLabel = '! Error';
-            textColor = 'text-red-500';
-            calloutColor = 'border-red-500';
             break;
     }
 };
 ---
-<div class={`callout callout-${level} pl-[0.5rem] border-l-[0.2rem] border-solid ${calloutColor}`}>
-    <div class={`callout-label font-bold ${textColor}`}>{calloutLabel}</div>
+<div class={`callout callout-${level}`}>
+    <div class={`callout-label`}>{calloutLabel}</div>
     <div class="callout-content"><slot /></div>
-</div>
\ No newline at end of file
+</div>
+
+<style>
+    .callout {
+        margin-bottom: 1rem;
+        padding-left: 0.5rem;
+        border-left: 0.2rem solid;
+    }
+    .callout-info {
+        border-left: 0.2rem solid #086ddd;
+    }
+    .callout-info > .callout-label {
+        color: #086ddd;
+        font-weight: 700;
+    }
+    .callout-warn {
+        border-left: 0.2rem solid #ec7500;
+    }
+    .callout-warn > .callout-label {
+        color: #ec7500;
+        font-weight: 700;
+    }
+    .callout-error {
+        border-left: 0.2rem solid #e93147;
+    }
+    .callout-error > .callout-label {
+        color: #e93147;
+        font-weight: 700;
+    }
+</style>
\ No newline at end of file
index 3742b1eb6bd7041baed57c3b4c5a4614d7725c66..06c2ff09649d47db3217171578ff9b3114d2b27e 100644 (file)
@@ -11,5 +11,20 @@ const { image, alt, formats = ['avif', 'webp'] } = Astro.props;
 ---
 <figure>
     <Picture src={image} alt={alt} formats={formats} />
-    <figcaption class="mt-0"><slot /></figcaption>
-</figure>
\ No newline at end of file
+    <figcaption><slot /></figcaption>
+</figure>
+
+<style>
+    figure {
+        margin-bottom: 1rem;
+    }
+    figcaption {
+        font-size: 0.8rem;
+    }
+    img {
+        height: auto;
+    }
+    figcaption {
+        font-style: italic;
+    }
+</style>
\ No newline at end of file
index 07426dca6565566542b06dace679ff1d1fa832e1..0bc9eb65cde24a8105ce1ded894ac29fc406be04 100644 (file)
@@ -11,9 +11,17 @@ const videoID = url.searchParams.get("v");
 ---
 
 <iframe
-    class="w-full aspect-video"
+    class="youtube-embed"
     src={`https://www.youtube-nocookie.com/embed/${videoID}`}
     title={title}
     loading="lazy"
     allow="fullscreen"
-></iframe>
\ No newline at end of file
+></iframe>
+
+<style>
+    iframe.youtube-embed {
+        aspect-ratio: 16 / 9;
+        width: 100%;
+        display: block;
+    }
+</style>
\ No newline at end of file
index dfc711ed77a55e0b10eba8e9359d5838b1dda4da..8eabb55a9356ac2290006ef206d7af20873d7f54 100644 (file)
@@ -1,14 +1,5 @@
 import { defineCollection, z } from 'astro:content';
-import { glob, file } from 'astro/loaders';
-
-const socials = defineCollection({
-    loader: file('data/socials.json'),
-    schema: z.object({
-        title: z.string(),
-        url: z.string(),
-        username: z.string()
-    })
-});
+import { glob } from 'astro/loaders';
 
 const articles = defineCollection({
     loader: glob({ pattern: '**/*.{md,mdx}', base: 'content/articles' }),
@@ -18,7 +9,7 @@ const articles = defineCollection({
         date: z.coerce.date(),
         modified: z.coerce.date().optional(),
         tags: z.array(z.string()).optional(),
-        posse: z.record(z.string(), z.string()).optional()
+        posse: z.record(z.string(), z.string().url()).optional()
     })
 });
 
@@ -26,12 +17,12 @@ const links = defineCollection({
     loader: glob({ pattern: '**/*.{md,mdx}', base: 'content/links' }),
     schema: z.object({
         title: z.string(),
-        href: z.string(),
+        href: z.string().url(),
         description: z.string(),
         date: z.coerce.date(),
         modified: z.coerce.date().optional(),
         tags: z.array(z.string()).optional(),
-        posse: z.record(z.string(), z.string()).optional()
+        posse: z.record(z.string(), z.string().url()).optional()
     })
 });
 
@@ -43,8 +34,8 @@ const reviews = defineCollection({
         date: z.coerce.date(),
         modified: z.coerce.date().optional(),
         tags: z.array(z.string()).optional(),
-        posse: z.record(z.string(), z.string()).optional()
+        posse: z.record(z.string(), z.string().url()).optional()
     })
 });
 
-export const collections = { socials, articles, links, reviews };
\ No newline at end of file
+export const collections = { articles, links, reviews };
\ No newline at end of file
index d9387cdb63d676d69498f1c87c643384f44ba134..421759bdfbdc761c5493bd426ed9ddb34a7917b7 100644 (file)
@@ -1,7 +1,8 @@
 ---
-import '@styles/global.css';
+import '@styles/reset.css';
 import '@fontsource-variable/public-sans';
 import '@fontsource-variable/source-code-pro';
+import '@styles/style.css';
 import HeadBase from '@components/head/base.astro';
 import HeadPage from '@components/head/page.astro';
 import Heading from '@components/heading.astro';
@@ -18,23 +19,16 @@ const { title, description } = Astro.props;
 <!doctype html>
 <html lang="en">
        <head>
-               <slot name="pre-head" />
                <HeadBase title={title} description={description} />
                <slot name="post-head">
                        <HeadPage />
                </slot>
        </head>
-       <body class="antialiased md:subpixel-antialiased w-screen p-4 bg-white dark:bg-gray-900">
-               <div id="container" class="max-w-3xl mx-auto prose dark:prose-invert prose-headings:mb-0">
-                       <Heading />
-                       <main>
-                               <slot />
-                       </main>
-                       <footer>
-                               <slot name="pre-footer" />
-                               <Footer />
-                               <slot name="post-footer" />
-                       </footer>
-               </div>
+       <body>
+               <Heading />
+               <main>
+                       <slot />
+               </main>
+               <Footer />
        </body>
 </html>
index 925930a990c1d566b448c0823d55fd51db6b8ee2..88104dcb75e422b105c2003df4deadb8b2196523 100644 (file)
@@ -2,7 +2,7 @@
 import { type CollectionEntry, getCollection, render } from 'astro:content';
 import { formatDate } from '@utils/format.ts';
 import Article from '@layouts/article.astro';
-import POSSE from '@components/posse.astro';
+import Metadata from '@components/metadata.astro';
 
 interface Props {
     article: CollectionEntry<'articles'>
@@ -17,7 +17,6 @@ export async function getStaticPaths() {
 }
 
 const { article } = Astro.props;
-const date = formatDate(article.data.date);
 const { Content } = await render(article);
 ---
 <Article
@@ -28,15 +27,6 @@ const { Content } = await render(article);
      tags={article.data.tags}
 >
     <h2>{article.data.title}</h2>
-    <details class="mb-4">
-        <summary>Metadata</summary>
-        <ul class="mt-0">
-            <li class="mt-0 mb-0">Description: {article.data.description}</li>
-            <li class="mt-0 mb-0">Published: <time datetime="">{date}</time></li>
-            <li class="mt-0 mb-0">Last Modified: <time datetime="">{article.data.modified ? formatDate(article.data.modified) : date}</time></li>
-            <li class="mt-0 mb-0">Tags: {article.data.tags.join(', ')}</li>
-            {article.data.posse && <li class="mt-0 mb-0">POSSE: <POSSE posse={article.data.posse} /></li>}
-        </ul>
-    </details>
+    <Metadata entry={article} />
     <Content />
 </Article>
\ No newline at end of file
index 05403179b04a95312f607beadec835bb5c116854..78b1fdd35672dc59033452a45471ec8991075be6 100644 (file)
@@ -14,7 +14,7 @@ const sortedArticles = articles.sort((a, b) => b.data.date - a.data.date);
             const date = formatDate(article.data.date);
             return (
                 <dt><a href={`/articles/${date}-${article.id}/`}>{article.data.title}</a></dt>
-                <dd class="mt-0">
+                <dd>
                     {article.data.description}
                 </dd>
             )
index 4312d6730bd216911a9f2c0d91f61c5920f71838..e7b30ea0070a25e98786c4f73334f6202e887c9d 100644 (file)
@@ -4,5 +4,11 @@ import Base from '@layouts/base.astro';
 
 <Base title="Bitcoin" description="Description">
     <h2>Bitcoin</h2>
-    <object class="w-full" data="/public/bitcoin.pdf" type="application/pdf" height="890" />
-</Base>
\ No newline at end of file
+    <object data="/public/bitcoin.pdf" type="application/pdf" height="890" />
+</Base>
+
+<style>
+    object {
+        width: 100%;
+    }
+</style>
\ No newline at end of file
index 96c6e185144a0b206da85b09e4cf507fe05a22bc..2c82c1a6fa2a685d5618f011eede0c18d75f700c 100644 (file)
@@ -1,7 +1,7 @@
 import rss from '@astrojs/rss';
 import { getCollection } from 'astro:content';
 import { formatDate } from '@utils/format.ts';
-import Metadata from '@data/metadata.json';
+import SiteMetadata from '@data/metadata.json';
 
 export async function GET(context: any) {
   const articles = await getCollection('articles');
@@ -28,8 +28,8 @@ export async function GET(context: any) {
   const feedItems = [ ...articleItems, ...linkItems, ...reviewItems ];
   const sortedFeedItems = feedItems.sort((a, b) => b.pubDate - a.pubDate);
   return rss({
-    title: Metadata.title,
-    description: Metadata.subtitle,
+    title: SiteMetadata.title,
+    description: SiteMetadata.subtitle,
     site: context.site,
     items: sortedFeedItems
   });
index 6fcb360a300a5e965985bccf84c0c2eabfea62a5..02d551f9fbbf283eed3d336a7c5be0120f3ffc18 100644 (file)
@@ -1,7 +1,7 @@
 ---
+import SiteMetadata from '@data/metadata.json';
 import Base from '@layouts/base.astro';
 import Callout from '@components/ui/callout.astro';
-import Contributions from '@data/contributions.json';
 ---
 
 <Base title="Home" description="Description">
@@ -15,7 +15,7 @@ import Contributions from '@data/contributions.json';
     <section>
                <h2>Contributions</h2>
                <ul>
-                       {Contributions.map((contribution) => {
+                       {SiteMetadata.contributions.map((contribution) => {
                                return (
                                        <li><a href={contribution.url}>{contribution.title}</a></li>
                                )
index 05ed379088f52163293a64638e60d0e30fc60256..17079815a6adf99ac1dfae35297385a5b31da5c8 100644 (file)
@@ -2,7 +2,7 @@
 import { type CollectionEntry, getCollection, render } from 'astro:content';
 import { formatDate } from '@utils/format.ts';
 import Article from '@layouts/article.astro';
-import POSSE from '@components/posse.astro';
+import Metadata from '@components/metadata.astro';
 
 interface Props {
     link: CollectionEntry<'links'>
@@ -28,15 +28,6 @@ const { Content } = await render(link);
      tags={link.data.tags}
 >
     <a href={link.data.href}><h2>{link.data.title}</h2></a>
-    <details class="mb-4">
-        <summary>Metadata</summary>
-        <ul class="mt-0">
-            <li class="mt-0 mb-0">Description: {link.data.description}</li>
-            <li class="mt-0 mb-0">Published: <time datetime="">{date}</time></li>
-            <li class="mt-0 mb-0">Last Modified: <time datetime="">{link.data.modified ? formatDate(link.data.modified) : date}</time></li>
-            <li class="mt-0 mb-0">Tags: {link.data.tags.join(', ')}</li>
-            {link.data.posse && <li class="mt-0 mb-0">POSSE: <POSSE posse={link.data.posse} /></li>}
-        </ul>
-    </details>
+    <Metadata entry={link} />
     <Content />
 </Article>
\ No newline at end of file
index 086d3143a1edfb916e6496cd3c89fca7e58d899a..befffaca6ead05e04a071023f291dfe2e49debe9 100644 (file)
@@ -14,7 +14,7 @@ const sortedLinks = links.sort((a, b) => b.data.date - a.data.date);
             const date = formatDate(link.data.date);
             return (
                 <dt><a href={`/links/${date}-${link.id}/`}>{link.data.title}</a></dt>
-                <dd class="mt-0">
+                <dd>
                     {link.data.description}
                 </dd>
             )
index 6a36561cd3c68d086de4a50aa49e9d85cbe0aa56..4afb671a7ce0770ec1e41721e16f97495a84f537 100644 (file)
@@ -2,7 +2,7 @@
 import { type CollectionEntry, getCollection, render } from 'astro:content';
 import { formatDate } from '@utils/format.ts';
 import Article from '@layouts/article.astro';
-import POSSE from '@components/posse.astro';
+import Metadata from '@components/metadata.astro';
 
 interface Props {
     review: CollectionEntry<'reviews'>
@@ -28,15 +28,6 @@ const { Content } = await render(review);
      tags={review.data.tags}
 >
     <h2>{review.data.title}</h2>
-    <details class="mb-4">
-        <summary>Metadata</summary>
-        <ul class="mt-0">
-            <li class="mt-0 mb-0">Description: {review.data.description}</li>
-            <li class="mt-0 mb-0">Published: <time datetime="">{date}</time></li>
-            <li class="mt-0 mb-0">Last Modified: <time datetime="">{review.data.modified ? formatDate(review.data.modified) : date}</time></li>
-            <li class="mt-0 mb-0">Tags: {review.data.tags.join(', ')}</li>
-            {review.data.posse && <li class="mt-0 mb-0">POSSE: <POSSE posse={review.data.posse} /></li>}
-        </ul>
-    </details>
+    <Metadata entry={review} />
     <Content />
 </Article>
\ No newline at end of file
index 32095355f05ca92956a2ab603b14c43e6d3869f0..c214a5a877dd17946002dc8d3b83143ec138558c 100644 (file)
@@ -14,7 +14,7 @@ const sortedReviews = reviews.sort((a, b) => b.data.date - a.data.date);
             const date = formatDate(review.data.date);
             return (
                 <dt><a href={`/reviews/${date}-${review.id}/`}>{review.data.title}</a></dt>
-                <dd class="mt-0">
+                <dd>
                     {review.data.description}
                 </dd>
             )
diff --git a/src/styles/global.css b/src/styles/global.css
deleted file mode 100644 (file)
index f65dc5e..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-@import "tailwindcss";
-@plugin "@tailwindcss/typography";
-
-@theme {
-    --font-sans: 'Public Sans Variable', sans-serif;
-    --font-mono: 'Source Code Pro Variable', monospace;
-}
-
-@utility prose {
-    blockquote {
-        p {
-            &:first-of-type::before,
-            &:last-of-type::after {
-                content: none;
-            }
-        }
-    }
-    code {
-        &::before,
-        &::after {
-            content: none;
-        }
-    }
-}
\ No newline at end of file
diff --git a/src/styles/reset.css b/src/styles/reset.css
new file mode 100644 (file)
index 0000000..7c22795
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+  Josh's Custom CSS Reset
+  https://www.joshwcomeau.com/css/custom-css-reset/
+*/
+
+*, *::before, *::after {
+  box-sizing: border-box;
+}
+
+* {
+  margin: 0;
+}
+
+body {
+  line-height: 1.5;
+  -webkit-font-smoothing: antialiased;
+}
+
+img, picture, video, canvas, svg {
+  display: block;
+  max-width: 100%;
+}
+
+input, button, textarea, select {
+  font: inherit;
+}
+
+p, h1, h2, h3, h4, h5, h6 {
+  overflow-wrap: break-word;
+}
+
+p {
+  text-wrap: pretty;
+}
+h1, h2, h3, h4, h5, h6 {
+  text-wrap: balance;
+}
+
+#root, #__next {
+  isolation: isolate;
+}
\ No newline at end of file
diff --git a/src/styles/style.css b/src/styles/style.css
new file mode 100644 (file)
index 0000000..cc8058f
--- /dev/null
@@ -0,0 +1,61 @@
+html {
+  background-color: #ffffff;
+  color: #000000;
+  font-family: "Public Sans", sans-serif;
+  font-weight: 400;
+  font-size: 100%;
+  line-height: 1.1rem;
+}
+body {
+  max-width: 45rem;
+  margin-left: auto;
+  margin-right: auto;
+  padding: 0.5rem 1rem;
+  font-size: 1rem;
+}
+h1, h2, h3, h4, h5, h6 {
+  font-weight: 700;
+}
+strong {
+  font-weight: 700;
+}
+p {
+  margin-bottom: 1rem;
+}
+a {
+  text-decoration: none;
+  color: #086ddd;
+}
+a:hover {
+  text-decoration: underline;
+}
+dl, menu, ol, ul {
+  margin-bottom: 1rem;
+}
+ul ul, ul ol, ul dl, ul menu,
+ol ul, ol ol, ol dl, ol menu,
+dl ul, dl ol, dl dl, dl menu,
+menu ul, menu ol, menu dl, menu menu {
+  /* nested lists won't have margins*/
+  margin-bottom: 0;
+}
+dd {
+  margin-bottom: 0.2rem;
+  padding-left: 1.5rem;
+}
+blockquote {
+  margin-bottom: 1rem;
+  padding-left: 0.5rem;
+  border-left: 0.2rem solid;
+}
+table {
+  margin-bottom: 1rem;
+  border: 0.1rem solid;
+  border-collapse: collapse;
+}
+th, td {
+  border: 0.1rem solid;
+  text-align: center;
+  vertical-align: middle;
+  padding: 0.5rem;
+}
\ No newline at end of file
index 7db74d626bad2213e84f06391fab802db3d3e535..1c3ec2d66f471ef3298135967c571a1302bfe8b9 100644 (file)
@@ -24,5 +24,7 @@
         "src/utils/*"
       ]
     },
-  }
+    "allowSyntheticDefaultImports": true,
+    "allowImportingTsExtensions": true,
+  },
 }