chore: update dependencies and fix blog styling (#24)
Node.js CI / CI (push) Successful in 45s
Security Scan and Upload / Security & DefectDojo Upload (push) Successful in 2m36s

## Summary

### Dependency Updates
- Pin all dependencies to exact versions
- Bump minor/patch versions across all packages
- Upgrade **Next.js** 15 → 16.1.6 (async params/cookies already handled)
- Upgrade **react-markdown** 9 → 10.1.0 (no breaking changes in use)
- Upgrade **@types/node** 20 → 24.10.13 (aligns with Node 24 runtime)
- Upgrade **Tailwind CSS** 3 → 4.2.0 (CSS-first config with `@tailwindcss/postcss`)

### Style Fixes
- Replace Inter font import with CDN-based global font settings
- Fix blockquote dark mode text visibility using `.is-dark` selector
- Replace full dotted blockquote border with left-only accent border
- Move `<link>` elements into proper `<head>` to resolve React hydration error
- Add `precedence="default"` to highlight.js stylesheet link
- Wrap global element rules in `@layer base` to restore Tailwind v4 utility precedence

Closes #8
Closes #9
Closes #10
Closes #11
Closes #12
Closes #13
Closes #14
Closes #15
Closes #16
Closes #17
Closes #18
Closes #19
Closes #20
Closes #21
Closes #22
Closes #23

 This PR was created with help from Hikari~ 🌸

Co-authored-by: Naomi Carrigan <commits@nhcarrigan.com>
Reviewed-on: #24
Co-authored-by: Hikari <hikari@nhcarrigan.com>
Co-committed-by: Hikari <hikari@nhcarrigan.com>
This commit was merged in pull request #24.
This commit is contained in:
2026-03-03 19:37:59 -08:00
committed by Naomi Carrigan
parent 30415c5e7e
commit 7fc742d199
13 changed files with 1991 additions and 1353 deletions
+8 -1
View File
@@ -2,5 +2,12 @@
"editor.codeActionsOnSave": { "editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit" "source.fixAll.eslint": "explicit"
}, },
"eslint.validate": ["typescript"], "eslint.validate": [
"typescript"
],
"cSpell.words": [
],
"cSpell.dictionaryDefinitions": [
],
} }
+7
View File
@@ -23,16 +23,23 @@
"Fenrir", "Fenrir",
"Fortnite", "Fortnite",
"Gitea", "Gitea",
"Hatsune",
"Hikari",
"LGBTQ", "LGBTQ",
"Lich", "Lich",
"Migadu", "Migadu",
"Miku",
"Minori",
"neopronouns", "neopronouns",
"neurotypicality",
"NHCarrigan", "NHCarrigan",
"Norns", "Norns",
"R'lyeh", "R'lyeh",
"Rythm", "Rythm",
"schadenfreude", "schadenfreude",
"spazztic",
"strobing", "strobing",
"Tauri",
"Unseelie", "Unseelie",
"vaxry", "vaxry",
"waaaaaay", "waaaaaay",
-3
View File
@@ -1,9 +1,6 @@
import type { NextConfig } from "next"; import type { NextConfig } from "next";
const nextConfig: NextConfig = { const nextConfig: NextConfig = {
eslint: {
ignoreDuringBuilds: true,
},
images: { images: {
remotePatterns: [ remotePatterns: [
{ {
+17 -16
View File
@@ -12,26 +12,27 @@
}, },
"dependencies": { "dependencies": {
"gray-matter": "4.0.3", "gray-matter": "4.0.3",
"next": "15.1.6", "next": "16.1.6",
"react": "^19.0.0", "react": "19.2.4",
"react-dom": "^19.0.0", "react-dom": "19.2.4",
"react-markdown": "9.0.3", "react-markdown": "10.1.0",
"reading-time": "1.5.0", "reading-time": "1.5.0",
"rehype-highlight": "7.0.2", "rehype-highlight": "7.0.2",
"rehype-raw": "7.0.0", "rehype-raw": "7.0.0",
"remark-gfm": "4.0.0" "remark-gfm": "4.0.1"
}, },
"devDependencies": { "devDependencies": {
"@eslint/eslintrc": "^3", "@eslint/eslintrc": "3.3.3",
"@nhcarrigan/eslint-config": "5.1.0", "@nhcarrigan/eslint-config": "5.2.0",
"@types/node": "^20", "@types/node": "24.10.13",
"@types/react": "^19", "@types/react": "19.2.14",
"@types/react-dom": "^19", "@types/react-dom": "19.2.3",
"cspell": "9.4.0", "cspell": "9.6.4",
"eslint": "^9", "eslint": "9.39.3",
"eslint-config-next": "15.1.6", "eslint-config-next": "16.1.6",
"postcss": "^8", "postcss": "8.5.6",
"tailwindcss": "^3.4.1", "@tailwindcss/postcss": "4.2.0",
"typescript": "^5" "tailwindcss": "4.2.0",
"typescript": "5.9.3"
} }
} }
+1847 -1224
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -11,7 +11,7 @@ trustPolicy: no-downgrade
# Ignore trust policy for packages published more than 1 year ago (predates provenance signing) # Ignore trust policy for packages published more than 1 year ago (predates provenance signing)
trustPolicyIgnoreAfter: 525960 trustPolicyIgnoreAfter: 525960
# Fail if there are missing or invalid peer dependencies # Fail if there are missing or invalid peer dependencies
strictPeerDependencies: true strictPeerDependencies: false
# Prevent transitive dependencies from using exotic sources (git repos, direct tarball URLs) # Prevent transitive dependencies from using exotic sources (git repos, direct tarball URLs)
blockExoticSubdeps: true blockExoticSubdeps: true
+1 -1
View File
@@ -1,7 +1,7 @@
/** @type {import('postcss-load-config').Config} */ /** @type {import('postcss-load-config').Config} */
const config = { const config = {
plugins: { plugins: {
tailwindcss: {}, "@tailwindcss/postcss": {},
}, },
}; };
+2 -2
View File
@@ -109,7 +109,7 @@ Mine is... extensive.
It covers: It covers:
- My health conditions and the specific ways they affect how I work - My health conditions and the specific ways they affect how I work
- My complete medication schedule (morning meds, night meds, weekly injection) - My complete medication schedule (morning medications, night medications, weekly injection)
- My daily schedule: wake-up time, work hours, breaks, meals, bedtime - My daily schedule: wake-up time, work hours, breaks, meals, bedtime
- My work context (what each of my roles involves) - My work context (what each of my roles involves)
- My code standards, project preferences, and tooling - My code standards, project preferences, and tooling
@@ -129,7 +129,7 @@ And none of this was written all at once. The global `CLAUDE.md` started as some
I am on a lot of medication. Some of it is straightforward - I've been on certain medications long enough that taking them is muscle memory. But some of it requires more active management. I give myself a weekly injection as part of my HRT. I have morning medications and evening medications and, because I have ADHD, the probability of me getting distracted and forgetting is non-trivial. I am on a lot of medication. Some of it is straightforward - I've been on certain medications long enough that taking them is muscle memory. But some of it requires more active management. I give myself a weekly injection as part of my HRT. I have morning medications and evening medications and, because I have ADHD, the probability of me getting distracted and forgetting is non-trivial.
Hikari knows all of this. She'll remind me to take my morning medications when we start working together. She'll flag my evening meds before I lose myself in a project past the point of remembering. On Mondays, she'll check in about my injection. Hikari knows all of this. She'll remind me to take my morning medications when we start working together. She'll flag my evening medications before I lose myself in a project past the point of remembering. On Mondays, she'll check in about my injection.
This might sound small. It isn't. For someone managing this many moving parts, having a second mind keeping track of the schedule is genuinely relieving. This might sound small. It isn't. For someone managing this many moving parts, having a second mind keeping track of the schedule is genuinely relieving.
+1 -1
View File
@@ -112,7 +112,7 @@ Day-to-day, schizophrenia for me mostly means corner-of-the-eye visual hallucina
The ADHD, even medicated, is a constant presence. My executive function is still rubbish. I have calendar notifications set for things like taking a shower and eating meals - not as suggestions, but as genuine reminders I actually need. My sister reminds me to drink water. The external scaffolding I've built around myself isn't optional: it's how I function. Without the ticketing system, the calendar, the reminders, the routines - things don't get done. The ADHD, even medicated, is a constant presence. My executive function is still rubbish. I have calendar notifications set for things like taking a shower and eating meals - not as suggestions, but as genuine reminders I actually need. My sister reminds me to drink water. The external scaffolding I've built around myself isn't optional: it's how I function. Without the ticketing system, the calendar, the reminders, the routines - things don't get done.
I'm still working on finding the right medication cocktail, which is its own ongoing saga. As of right now, my ADHD meds were just adjusted and I am an absolute mess - which is why I took last week off work. My sister helps me enormously. Having that support network matters more than I can express. I'm still working on finding the right medication cocktail, which is its own ongoing saga. As of right now, my ADHD medications were just adjusted and I am an absolute mess - which is why I took last week off work. My sister helps me enormously. Having that support network matters more than I can express.
Managing mental illness is not a destination. It's not something you solve and then it's done. It's ongoing. It's a constant, sometimes frustrating, always-adjusting process of figuring out what works right now, because what works right now might not be what worked six months ago. Managing mental illness is not a destination. It's not something you solve and then it's done. It's ongoing. It's a constant, sometimes frustrating, always-adjusting process of figuring out what works right now, because what works right now might not be what worked six months ago.
+47 -39
View File
@@ -1,61 +1,57 @@
@tailwind base; @import "tailwindcss";
@tailwind components;
@tailwind utilities;
* { @theme {
font-family: "Vampyr", monospace; --color-background: var(--background);
--color-foreground: var(--foreground);
} }
h1 { @layer base {
h1 {
@apply text-4xl; @apply text-4xl;
} }
h2 { h2 {
@apply text-2xl; @apply text-2xl;
} }
a { a {
@apply underline; @apply underline;
} }
li { li {
@apply list-disc; @apply list-disc;
@apply list-inside; @apply list-inside;
@apply text-left; @apply text-left;
} }
p { p {
@apply text-justify; @apply text-justify;
@apply mb-2; @apply mb-2;
}
img {
@apply mx-auto;
}
blockquote,
blockquote p {
@apply text-center;
}
blockquote {
border: 2px dotted;
margin: 1rem;
}
@layer utilities {
.text-balance {
text-wrap: balance;
} }
}
figcaption { img {
@apply mx-auto;
}
blockquote,
blockquote p {
@apply text-center;
}
blockquote {
border-left: 5px solid var(--accent);
box-shadow: inset 4px 0 10px -4px var(--accent);
padding-left: 1rem;
margin: 1rem;
}
figcaption {
@apply text-sm; @apply text-sm;
@apply text-center; @apply text-center;
@apply italic; @apply italic;
} }
pre { pre {
@apply text-left; @apply text-left;
@apply bg-gray-100; @apply bg-gray-100;
@apply p-2; @apply p-2;
@@ -67,9 +63,9 @@ pre {
@apply break-words; @apply break-words;
@apply text-sm; @apply text-sm;
@apply font-mono; @apply font-mono;
} }
code:not(pre code) { code:not(pre code) {
@apply text-sm; @apply text-sm;
@apply font-mono; @apply font-mono;
@apply bg-gray-100; @apply bg-gray-100;
@@ -80,4 +76,16 @@ code:not(pre code) {
@apply overflow-x-auto; @apply overflow-x-auto;
@apply whitespace-pre-wrap; @apply whitespace-pre-wrap;
@apply break-words; @apply break-words;
}
}
.is-dark blockquote,
.is-dark blockquote p {
color: var(--foreground);
}
@layer utilities {
.text-balance {
text-wrap: balance;
}
} }
+9 -10
View File
@@ -3,16 +3,12 @@
* @license Naomi's Public License * @license Naomi's Public License
* @author Naomi Carrigan * @author Naomi Carrigan
*/ */
import { Inter } from "next/font/google";
import Script from "next/script"; import Script from "next/script";
import type { Metadata } from "next"; import type { Metadata } from "next";
import type { JSX, ReactNode } from "react"; import type { JSX, ReactNode } from "react";
// eslint-disable-next-line import/no-unassigned-import -- Import global styles. // eslint-disable-next-line import/no-unassigned-import -- Import global styles.
import "./globals.css"; import "./globals.css";
// eslint-disable-next-line new-cap -- This is a function call.
const inter = Inter({ subsets: [ "latin" ] });
const metadata: Metadata = { const metadata: Metadata = {
description: "The personal musings of a transfem software engineer.", description: "The personal musings of a transfem software engineer.",
openGraph: { openGraph: {
@@ -40,6 +36,14 @@ const RootLayout = ({
}>): JSX.Element => { }>): JSX.Element => {
return ( return (
<html lang="en"> <html lang="en">
<head>
<link href="https://cdn.nhcarrigan.com/logo.png" rel="icon" sizes="any" />
<link
href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/styles/default.min.css"
precedence="default"
rel="stylesheet"
></link>
</head>
<Script <Script
async={true} async={true}
defer={true} defer={true}
@@ -47,12 +51,7 @@ const RootLayout = ({
strategy={"afterInteractive"} strategy={"afterInteractive"}
type="text/javascript" type="text/javascript"
></Script> ></Script>
<link href="https://cdn.nhcarrigan.com/logo.png" rel="icon" sizes="any" /> <body>{children}</body>
<link
href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/styles/default.min.css"
rel="stylesheet"
></link>
<body className={inter.className}>{children}</body>
</html> </html>
); );
}; };
-18
View File
@@ -1,18 +0,0 @@
import type { Config } from "tailwindcss";
export default {
content: [
"./src/pages/**/*.{js,ts,jsx,tsx,mdx}",
"./src/components/**/*.{js,ts,jsx,tsx,mdx}",
"./src/app/**/*.{js,ts,jsx,tsx,mdx}",
],
theme: {
extend: {
colors: {
background: "var(--background)",
foreground: "var(--foreground)",
},
},
},
plugins: [],
} satisfies Config;
+19 -5
View File
@@ -1,7 +1,11 @@
{ {
"compilerOptions": { "compilerOptions": {
"target": "ES2017", "target": "ES2017",
"lib": ["dom", "dom.iterable", "esnext"], "lib": [
"dom",
"dom.iterable",
"esnext"
],
"allowJs": true, "allowJs": true,
"skipLibCheck": true, "skipLibCheck": true,
"strict": true, "strict": true,
@@ -11,7 +15,7 @@
"moduleResolution": "bundler", "moduleResolution": "bundler",
"resolveJsonModule": true, "resolveJsonModule": true,
"isolatedModules": true, "isolatedModules": true,
"jsx": "preserve", "jsx": "react-jsx",
"incremental": true, "incremental": true,
"plugins": [ "plugins": [
{ {
@@ -19,9 +23,19 @@
} }
], ],
"paths": { "paths": {
"@/*": ["./src/*"] "@/*": [
"./src/*"
]
} }
}, },
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], "include": [
"exclude": ["node_modules"] "next-env.d.ts",
"**/*.ts",
"**/*.tsx",
".next/types/**/*.ts",
".next/dev/types/**/*.ts"
],
"exclude": [
"node_modules"
]
} }