chore: update dependencies and fix blog styling (#24)
All checks were successful
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

View File

@@ -2,5 +2,12 @@
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit"
},
"eslint.validate": ["typescript"],
"eslint.validate": [
"typescript"
],
"cSpell.words": [
],
"cSpell.dictionaryDefinitions": [
],
}

View File

@@ -23,16 +23,23 @@
"Fenrir",
"Fortnite",
"Gitea",
"Hatsune",
"Hikari",
"LGBTQ",
"Lich",
"Migadu",
"Miku",
"Minori",
"neopronouns",
"neurotypicality",
"NHCarrigan",
"Norns",
"R'lyeh",
"Rythm",
"schadenfreude",
"spazztic",
"strobing",
"Tauri",
"Unseelie",
"vaxry",
"waaaaaay",

View File

@@ -1,9 +1,6 @@
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
eslint: {
ignoreDuringBuilds: true,
},
images: {
remotePatterns: [
{

View File

@@ -12,26 +12,27 @@
},
"dependencies": {
"gray-matter": "4.0.3",
"next": "15.1.6",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"react-markdown": "9.0.3",
"next": "16.1.6",
"react": "19.2.4",
"react-dom": "19.2.4",
"react-markdown": "10.1.0",
"reading-time": "1.5.0",
"rehype-highlight": "7.0.2",
"rehype-raw": "7.0.0",
"remark-gfm": "4.0.0"
"remark-gfm": "4.0.1"
},
"devDependencies": {
"@eslint/eslintrc": "^3",
"@nhcarrigan/eslint-config": "5.1.0",
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",
"cspell": "9.4.0",
"eslint": "^9",
"eslint-config-next": "15.1.6",
"postcss": "^8",
"tailwindcss": "^3.4.1",
"typescript": "^5"
"@eslint/eslintrc": "3.3.3",
"@nhcarrigan/eslint-config": "5.2.0",
"@types/node": "24.10.13",
"@types/react": "19.2.14",
"@types/react-dom": "19.2.3",
"cspell": "9.6.4",
"eslint": "9.39.3",
"eslint-config-next": "16.1.6",
"postcss": "8.5.6",
"@tailwindcss/postcss": "4.2.0",
"tailwindcss": "4.2.0",
"typescript": "5.9.3"
}
}

3071
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -11,7 +11,7 @@ trustPolicy: no-downgrade
# Ignore trust policy for packages published more than 1 year ago (predates provenance signing)
trustPolicyIgnoreAfter: 525960
# 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)
blockExoticSubdeps: true

View File

@@ -1,7 +1,7 @@
/** @type {import('postcss-load-config').Config} */
const config = {
plugins: {
tailwindcss: {},
"@tailwindcss/postcss": {},
},
};

View File

@@ -109,7 +109,7 @@ Mine is... extensive.
It covers:
- 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 work context (what each of my roles involves)
- 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.
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.

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.
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.

View File

@@ -1,46 +1,87 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
@import "tailwindcss";
* {
font-family: "Vampyr", monospace;
@theme {
--color-background: var(--background);
--color-foreground: var(--foreground);
}
h1 {
@apply text-4xl;
@layer base {
h1 {
@apply text-4xl;
}
h2 {
@apply text-2xl;
}
a {
@apply underline;
}
li {
@apply list-disc;
@apply list-inside;
@apply text-left;
}
p {
@apply text-justify;
@apply mb-2;
}
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-center;
@apply italic;
}
pre {
@apply text-left;
@apply bg-gray-100;
@apply p-2;
@apply rounded-md;
@apply border;
@apply border-gray-300;
@apply overflow-x-auto;
@apply whitespace-pre-wrap;
@apply break-words;
@apply text-sm;
@apply font-mono;
}
code:not(pre code) {
@apply text-sm;
@apply font-mono;
@apply bg-gray-100;
@apply p-1;
@apply rounded-md;
@apply border;
@apply border-gray-300;
@apply overflow-x-auto;
@apply whitespace-pre-wrap;
@apply break-words;
}
}
h2 {
@apply text-2xl;
}
a {
@apply underline;
}
li {
@apply list-disc;
@apply list-inside;
@apply text-left;
}
p {
@apply text-justify;
@apply mb-2;
}
img {
@apply mx-auto;
}
blockquote,
blockquote p {
@apply text-center;
}
blockquote {
border: 2px dotted;
margin: 1rem;
.is-dark blockquote,
.is-dark blockquote p {
color: var(--foreground);
}
@layer utilities {
@@ -48,36 +89,3 @@ blockquote {
text-wrap: balance;
}
}
figcaption {
@apply text-sm;
@apply text-center;
@apply italic;
}
pre {
@apply text-left;
@apply bg-gray-100;
@apply p-2;
@apply rounded-md;
@apply border;
@apply border-gray-300;
@apply overflow-x-auto;
@apply whitespace-pre-wrap;
@apply break-words;
@apply text-sm;
@apply font-mono;
}
code:not(pre code) {
@apply text-sm;
@apply font-mono;
@apply bg-gray-100;
@apply p-1;
@apply rounded-md;
@apply border;
@apply border-gray-300;
@apply overflow-x-auto;
@apply whitespace-pre-wrap;
@apply break-words;
}

View File

@@ -3,16 +3,12 @@
* @license Naomi's Public License
* @author Naomi Carrigan
*/
import { Inter } from "next/font/google";
import Script from "next/script";
import type { Metadata } from "next";
import type { JSX, ReactNode } from "react";
// eslint-disable-next-line import/no-unassigned-import -- Import global styles.
import "./globals.css";
// eslint-disable-next-line new-cap -- This is a function call.
const inter = Inter({ subsets: [ "latin" ] });
const metadata: Metadata = {
description: "The personal musings of a transfem software engineer.",
openGraph: {
@@ -40,6 +36,14 @@ const RootLayout = ({
}>): JSX.Element => {
return (
<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
async={true}
defer={true}
@@ -47,12 +51,7 @@ const RootLayout = ({
strategy={"afterInteractive"}
type="text/javascript"
></Script>
<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"
rel="stylesheet"
></link>
<body className={inter.className}>{children}</body>
<body>{children}</body>
</html>
);
};

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;

View File

@@ -1,7 +1,11 @@
{
"compilerOptions": {
"target": "ES2017",
"lib": ["dom", "dom.iterable", "esnext"],
"lib": [
"dom",
"dom.iterable",
"esnext"
],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
@@ -11,7 +15,7 @@
"moduleResolution": "bundler",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
"jsx": "react-jsx",
"incremental": true,
"plugins": [
{
@@ -19,9 +23,19 @@
}
],
"paths": {
"@/*": ["./src/*"]
"@/*": [
"./src/*"
]
}
},
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
"exclude": ["node_modules"]
"include": [
"next-env.d.ts",
"**/*.ts",
"**/*.tsx",
".next/types/**/*.ts",
".next/dev/types/**/*.ts"
],
"exclude": [
"node_modules"
]
}