1
mirror of https://github.com/jakejarvis/jarv.is.git synced 2025-04-26 17:48:30 -04:00

refactor font loaders/declarations

This commit is contained in:
Jake Jarvis 2025-04-02 13:49:43 -04:00
parent 5c0e473bbe
commit 2b7f3c66a9
Signed by: jake
SSH Key Fingerprint: SHA256:nCkvAjYA6XaSPUqc4TfbBQTpzr8Xj7ritg/sGInCdkc
21 changed files with 237 additions and 227 deletions

View File

@ -99,7 +99,7 @@ const ContactForm = () => {
<Link href="https://jarv.is" plain openInNewTab> <Link href="https://jarv.is" plain openInNewTab>
links links
</Link> </Link>
](https://jarv.is), and <code>`code`</code>. ](https://jarv.is), and <code style={{ fontFamily: "var(--fonts-mono)" }}>`code`</code>.
</div> </div>
<div style={{ margin: "1em 0" }}> <div style={{ margin: "1em 0" }}>

View File

@ -29,7 +29,14 @@ const Page = () => {
<p> <p>
🔐 You can grab my public key here:{" "} 🔐 You can grab my public key here:{" "}
<Link href="https://jrvs.io/pgp" title="My Public Key"> <Link href="https://jrvs.io/pgp" title="My Public Key">
<code style={{ fontSize: "0.925em", letterSpacing: "0.075em", wordSpacing: "-0.3em" }}> <code
style={{
fontFamily: "var(--fonts-mono)",
fontSize: "0.925em",
letterSpacing: "0.075em",
wordSpacing: "-0.3em",
}}
>
6BF3 79D3 6F67 1480 2B0C 9CF2 51E6 9A39 6BF3 79D3 6F67 1480 2B0C 9CF2 51E6 9A39
</code> </code>
</Link> </Link>

32
app/fonts.ts Normal file
View File

@ -0,0 +1,32 @@
// a weird system but makes it impossible to accidentally end up with multiple imports of the same font. see:
// https://nextjs.org/docs/pages/building-your-application/optimizing/fonts#reusing-fonts
import { Geist as GeistSansLoader, Geist_Mono as GeistMonoLoader } from "next/font/google";
export const GeistSans = GeistSansLoader({
subsets: ["latin"],
display: "swap",
fallback: [
// https://github.com/system-fonts/modern-font-stacks#system-ui
"system-ui",
"sans-serif",
],
preload: true,
});
export const GeistMono = GeistMonoLoader({
subsets: ["latin"],
display: "swap",
fallback: [
// https://github.com/primer/css/blob/4113637b3bb60cad1e2dca82e70d92ad05694399/src/support/variables/typography.scss#L37
"ui-monospace",
"SFMono-Regular",
"'SF Mono'",
"Menlo",
"Consolas",
"'Liberation Mono'",
"monospace",
],
adjustFontFallback: false,
preload: true,
});

View File

@ -1,19 +0,0 @@
body {
font-family: var(--fonts-sans) !important;
background-color: var(--colors-background-inner);
}
code,
kbd,
samp,
pre {
font-family: var(--fonts-mono) !important;
}
/* https://css-tricks.com/almanac/rules/m/media/prefers-reduced-motion/ */
@media (prefers-reduced-motion: reduce) {
* {
animation: none !important;
transition: none !important;
}
}

View File

@ -1,4 +1,9 @@
.flex { .body {
font-family: var(--fonts-sans);
background-color: var(--colors-background-inner);
}
.layout {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
min-height: 100vh; min-height: 100vh;

View File

@ -1,20 +1,19 @@
import clsx from "clsx";
import { JsonLd } from "react-schemaorg"; import { JsonLd } from "react-schemaorg";
import Analytics from "./analytics"; import Analytics from "./analytics";
import { ThemeProvider, ThemeScript } from "../contexts/ThemeContext"; import { ThemeProvider, ThemeScript } from "../contexts/ThemeContext";
import Header from "../components/Header"; import Header from "../components/Header";
import Footer from "../components/Footer"; import Footer from "../components/Footer";
import { SkipToContentLink, SkipToContentTarget } from "../components/SkipToContent"; import { SkipToContentLink, SkipToContentTarget } from "../components/SkipToContent";
import { setRootCssVariables } from "../lib/helpers/styles";
import * as config from "../lib/config"; import * as config from "../lib/config";
import { BASE_URL, MAX_WIDTH } from "../lib/config/constants"; import { BASE_URL, MAX_WIDTH } from "../lib/config/constants";
import defaultMetadata from "../lib/config/metadata"; import defaultMetadata from "../lib/config/metadata";
import type { Metadata } from "next"; import type { Metadata } from "next";
import type { Person, WebSite } from "schema-dts"; import type { Person, WebSite } from "schema-dts";
import { GeistMono, GeistSans } from "../lib/styles/fonts"; import { GeistMono, GeistSans } from "./fonts";
import "modern-normalize/modern-normalize.css"; // https://github.com/sindresorhus/modern-normalize/blob/main/modern-normalize.css import "modern-normalize/modern-normalize.css"; // https://github.com/sindresorhus/modern-normalize/blob/main/modern-normalize.css
import "./themes.css"; import "./themes.css";
import "./global.css";
import styles from "./layout.module.css"; import styles from "./layout.module.css";
@ -70,14 +69,20 @@ const RootLayout = ({ children }: Readonly<{ children: React.ReactNode }>) => {
/> />
</head> </head>
<body <body className={styles.body}>
className={clsx(GeistMono.variable, GeistSans.variable)} <style
style={{ ["--max-width" as string]: `${MAX_WIDTH}px` }} precedence={styles.layout}
> {...setRootCssVariables({
"fonts-sans": GeistSans.style.fontFamily,
"fonts-mono": GeistMono.style.fontFamily,
"max-width": `${MAX_WIDTH}px`,
})}
/>
<ThemeProvider> <ThemeProvider>
<SkipToContentLink /> <SkipToContentLink />
<div className={styles.flex}> <div className={styles.layout}>
<Header /> <Header />
<main className={styles.default}> <main className={styles.default}>

View File

@ -3,7 +3,6 @@
font-size: 1.925em; font-size: 1.925em;
font-weight: 500; font-weight: 500;
line-height: 1.2; line-height: 1.2;
color: var(--colors-text);
} }
.page h2 { .page h2 {
@ -11,14 +10,12 @@
font-size: 1.3em; font-size: 1.3em;
font-weight: 400; font-weight: 400;
line-height: 1.5; line-height: 1.5;
color: var(--colors-text);
} }
.page p { .page p {
margin: 0.85em 0; margin: 0.85em 0;
font-size: 1.05em; font-size: 1.05em;
line-height: 1.7; line-height: 1.7;
color: var(--colors-text);
} }
.page p:last-of-type { .page p:last-of-type {
@ -34,6 +31,10 @@
display: inline-block; display: inline-block;
margin-left: 0.1em; margin-left: 0.1em;
font-size: 1.2em; font-size: 1.2em;
}
@media (prefers-reduced-motion: no-preference) {
.wave {
animation: wave 5s ease 1s infinite; animation: wave 5s ease 1s infinite;
transform-origin: 65% 80%; transform-origin: 65% 80%;
} }
@ -66,6 +67,7 @@
transform: rotate(0deg); transform: rotate(0deg);
} }
} }
}
@media (max-width: 768px) { @media (max-width: 768px) {
.page h1 { .page h1 {

View File

@ -1,8 +1,7 @@
import { Comic_Neue as ComicNeueLoader } from "next/font/google";
import PageTitle from "../../components/PageTitle"; import PageTitle from "../../components/PageTitle";
import { addMetadata } from "../../lib/helpers/metadata"; import { addMetadata } from "../../lib/helpers/metadata";
import { ComicNeue } from "../../lib/styles/fonts";
export const metadata = addMetadata({ export const metadata = addMetadata({
title: "Previously on...", title: "Previously on...",
description: "An incredibly embarrassing and somewhat painful trip down this site's memory lane...", description: "An incredibly embarrassing and somewhat painful trip down this site's memory lane...",
@ -11,16 +10,26 @@ export const metadata = addMetadata({
}, },
}); });
export const ComicNeue = ComicNeueLoader({
weight: ["400", "700"],
style: ["normal", "italic"],
subsets: ["latin"],
display: "swap",
fallback: ["'Comic Sans MS'", "'Comic Sans'"],
adjustFontFallback: false,
preload: false,
});
export const PageStyles = () => ( export const PageStyles = () => (
<style <style
// this is really, really dumb idea but f*ck it we'll do it live // this is really, really dumb idea but f*ck it we'll do it live
dangerouslySetInnerHTML={{ dangerouslySetInnerHTML={{
__html: ` __html: `
body { body {
cursor: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAZklEQVR4AWIAgn/uBT6A9uoAAwAQiIJo97/0Rgy0ANoJH8MPeEgtqwPQEACqCoQHAKECQKgAECoAhAoAoQJAqAAQxh1oPQfcW3kJpxHtL1AAHAwEwwdYiH8BIEgBTBRAAAEEEEAAG7mRt30hEhoLAAAAAElFTkSuQmCC") 2 1, auto !important; cursor: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAZklEQVR4AWIAgn/uBT6A9uoAAwAQiIJo97/0Rgy0ANoJH8MPeEgtqwPQEACqCoQHAKECQKgAECoAhAoAoQJAqAAQxh1oPQfcW3kJpxHtL1AAHAwEwwdYiH8BIEgBTBRAAAEEEEAAG7mRt30hEhoLAAAAAElFTkSuQmCC") 2 1, auto;
} }
a, button { a, button {
cursor: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgAgMAAAAOFJJnAAAACVBMVEVHcEwAAAD///8W1S+BAAAAAXRSTlMAQObYZgAAAEdJREFUeAFjoAVghTGkHIhghMAYmQEwxlIYYxlYlSiQMQEsELUKyli1ahWYwQZjMGIwGLKQGA4QA1EYEP0rGVAZrKGhSF4BAHw/HsVwshytAAAAAElFTkSuQmCC") 16 12, auto !important; cursor: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgAgMAAAAOFJJnAAAACVBMVEVHcEwAAAD///8W1S+BAAAAAXRSTlMAQObYZgAAAEdJREFUeAFjoAVghTGkHIhghMAYmQEwxlIYYxlYlSiQMQEsELUKyli1ahWYwQZjMGIwGLKQGA4QA1EYEP0rGVAZrKGhSF4BAHw/HsVwshytAAAAAElFTkSuQmCC") 16 12, auto;
} }
main { main {
font-family: ${ComicNeue.style.fontFamily}, var(--fonts-sans) !important; font-family: ${ComicNeue.style.fontFamily}, var(--fonts-sans) !important;
@ -72,7 +81,7 @@ _Previously on the [Cringey Chronicles&trade;](https://web.archive.org/web/20010
--- ---
🚨 Trigger warning: excessive marquees, animated GIFs, Comic Sans, popups, <code style={{ fontWeight: "normal", fontSize: "0.9em" }}>color: <span style={{ color: "#32cd32" }}>limegreen</span></code> ahead... 🚨 Trigger warning: excessive marquees, animated GIFs, Comic Sans, popups, <code style={{ fontFamily: "var(--fonts-mono)", fontWeight: "normal", fontSize: "0.9em" }}>color: <span style={{ color: "#32cd32" }}>limegreen</span></code> ahead...
[<WindowsLogo /> Click here for the _full_ experience anyway.](https://y2k.pages.dev) [<WindowsLogo /> Click here for the _full_ experience anyway.](https://y2k.pages.dev)

View File

@ -32,6 +32,7 @@ const Page = () => {
overflowX: "auto", overflowX: "auto",
padding: "1em", padding: "1em",
fontSize: "0.9em", fontSize: "0.9em",
fontFamily: "var(--fonts-mono)",
tabSize: 2, tabSize: 2,
border: "1px solid var(--colors-kinda-light)", border: "1px solid var(--colors-kinda-light)",
borderRadius: "0.6em", borderRadius: "0.6em",

View File

@ -1,3 +1,18 @@
.inline,
.highlighted {
font-family: var(--fonts-mono);
font-variant-ligatures: none; /* i hate them. fwiw. */
}
.inline {
padding: 0.2em 0.3em;
font-size: 0.925em;
page-break-inside: avoid;
background-color: var(--colors-background-outer);
border: 1px solid var(--colors-kinda-light);
border-radius: 0.6em;
}
figure:has(.highlighted) { figure:has(.highlighted) {
margin: 1em auto; margin: 1em auto;
position: relative; position: relative;
@ -15,14 +30,14 @@ figure:has(.highlighted) {
border-radius: 0.6em; border-radius: 0.6em;
} }
.highlighted span { .highlighted [style*="--shiki"] {
color: var(--shiki-light); color: var(--shiki-light);
font-style: var(--shiki-light-font-style); font-style: var(--shiki-light-font-style);
font-weight: var(--shiki-light-font-weight); font-weight: var(--shiki-light-font-weight);
text-decoration: var(--shiki-light-text-decoration); text-decoration: var(--shiki-light-text-decoration);
} }
[data-theme="dark"] .highlighted span { [data-theme="dark"] .highlighted [style*="--shiki"] {
color: var(--shiki-dark); color: var(--shiki-dark);
font-style: var(--shiki-dark-font-style); font-style: var(--shiki-dark-font-style);
font-weight: var(--shiki-dark-font-weight); font-weight: var(--shiki-dark-font-weight);
@ -58,15 +73,6 @@ figure:has(.highlighted) {
width: 1.75rem; width: 1.75rem;
} }
.inline {
padding: 0.2em 0.3em;
font-size: 0.925em;
page-break-inside: avoid;
background-color: var(--colors-background-outer);
border: 1px solid var(--colors-kinda-light);
border-radius: 0.6em;
}
.copyButton { .copyButton {
position: absolute; position: absolute;
top: 0; top: 0;

View File

@ -47,6 +47,10 @@
.heart { .heart {
display: inline-block; display: inline-block;
color: var(--colors-error); color: var(--colors-error);
}
@media (prefers-reduced-motion: no-preference) {
.heart {
animation: pulse 10s ease 7.5s infinite; animation: pulse 10s ease 7.5s infinite;
} }
@ -72,6 +76,7 @@
transform: scale(1); transform: scale(1);
} }
} }
}
@media (max-width: 768px) { @media (max-width: 768px) {
.footer { .footer {

View File

@ -17,6 +17,12 @@
} }
.link.plain { .link.plain {
background: none !important; background: none;
transition: none;
}
@media (prefers-reduced-motion: reduce) {
.link {
transition: none !important; transition: none !important;
} }
}

View File

@ -29,9 +29,9 @@ const Tweet = async ({ id, className, ...rest }: TweetProps) => {
components={{ components={{
// https://react-tweet.vercel.app/twitter-theme/api-reference#custom-tweet-components // https://react-tweet.vercel.app/twitter-theme/api-reference#custom-tweet-components
// eslint-disable-next-line jsx-a11y/alt-text // eslint-disable-next-line jsx-a11y/alt-text
AvatarImg: (props) => <Image {...props} />, AvatarImg: (props) => <Image {...props} unoptimized />,
// eslint-disable-next-line jsx-a11y/alt-text // eslint-disable-next-line jsx-a11y/alt-text
MediaImg: (props) => <Image {...props} fill sizes="640w" />, MediaImg: (props) => <Image {...props} fill unoptimized />,
}} }}
{...rest} {...rest}
/> />

14
lib/helpers/styles.ts Normal file
View File

@ -0,0 +1,14 @@
import hash from "@emotion/hash";
// a little hacky-hack to have react combine all of these css var declarations into a single <style> tag up top. see:
// https://react.dev/reference/react-dom/components/style#rendering-an-inline-css-stylesheet
export const setRootCssVariables = (vars: Record<string, string>) => {
const root = Object.entries(vars)
.map(([key, value]) => `--${key}:${value}`)
.join(";");
return {
href: hash(root),
dangerouslySetInnerHTML: { __html: `:root{${root}}` },
};
};

View File

@ -1,9 +0,0 @@
// a weird system but makes it impossible to accidentally end up with multiple imports of the same font. see:
// https://nextjs.org/docs/pages/building-your-application/optimizing/fonts#reusing-fonts
// main fonts
export { default as GeistSans } from "./loaders/GeistSans";
export { default as GeistMono } from "./loaders/GeistMono";
// one-off fonts
export { default as ComicNeue } from "./loaders/ComicNeue";

View File

@ -1,13 +0,0 @@
import { Comic_Neue as ComicNeueLoader } from "next/font/google";
const ComicNeue = ComicNeueLoader({
weight: ["400", "700"],
style: ["normal", "italic"],
subsets: ["latin"],
display: "swap",
fallback: ["'Comic Sans MS'", "'Comic Sans'"],
adjustFontFallback: false,
preload: false,
});
export default ComicNeue;

View File

@ -1,21 +0,0 @@
import { Geist_Mono as GeistMonoLoader } from "next/font/google";
const GeistMono = GeistMonoLoader({
subsets: ["latin"],
display: "swap",
fallback: [
// https://github.com/primer/css/blob/4113637b3bb60cad1e2dca82e70d92ad05694399/src/support/variables/typography.scss#L37
"ui-monospace",
"SFMono-Regular",
"'SF Mono'",
"Menlo",
"Consolas",
"'Liberation Mono'",
"monospace",
],
adjustFontFallback: false,
preload: true,
variable: "--fonts-mono",
});
export default GeistMono;

View File

@ -1,16 +0,0 @@
import { Geist as GeistSansLoader } from "next/font/google";
const GeistSans = GeistSansLoader({
subsets: ["latin"],
display: "swap",
fallback: [
// https://github.com/system-fonts/modern-font-stacks#system-ui
"system-ui",
"sans-serif",
],
adjustFontFallback: false,
preload: true,
variable: "--fonts-sans",
});
export default GeistSans;

View File

@ -14,13 +14,6 @@ const nextConfig: NextConfig = {
RELEASE_DATE: new Date().toISOString(), RELEASE_DATE: new Date().toISOString(),
}, },
pageExtensions: ["js", "jsx", "ts", "tsx", "md", "mdx"], pageExtensions: ["js", "jsx", "ts", "tsx", "md", "mdx"],
images: {
formats: ["image/avif", "image/webp"],
remotePatterns: [
{ protocol: "https", hostname: "abs.twimg.com" },
{ protocol: "https", hostname: "pbs.twimg.com" },
],
},
outputFileTracingIncludes: { outputFileTracingIncludes: {
"/notes/[slug]/opengraph-image": [ "/notes/[slug]/opengraph-image": [
"./notes/**/*", "./notes/**/*",
@ -66,6 +59,7 @@ const nextConfig: NextConfig = {
value: "max-age=63072000; includeSubDomains; preload", value: "max-age=63072000; includeSubDomains; preload",
}, },
{ {
// 🥛 debugging
key: "x-got-milk", key: "x-got-milk",
value: "2%", value: "2%",
}, },

View File

@ -37,7 +37,7 @@
"feed": "^4.2.2", "feed": "^4.2.2",
"geist": "^1.3.1", "geist": "^1.3.1",
"html-entities": "^2.6.0", "html-entities": "^2.6.0",
"lucide-react": "0.486.0", "lucide-react": "0.487.0",
"modern-normalize": "^3.0.1", "modern-normalize": "^3.0.1",
"next": "15.3.0-canary.29", "next": "15.3.0-canary.29",
"obj-str": "^1.1.0", "obj-str": "^1.1.0",
@ -78,10 +78,10 @@
"@sentry/cli": "^2.43.0", "@sentry/cli": "^2.43.0",
"@types/comma-number": "^2.1.2", "@types/comma-number": "^2.1.2",
"@types/mdx": "^2.0.13", "@types/mdx": "^2.0.13",
"@types/node": "^22.13.16", "@types/node": "^22.13.17",
"@types/prop-types": "^15.7.14", "@types/prop-types": "^15.7.14",
"@types/react": "^19.0.12", "@types/react": "^19.1.0",
"@types/react-dom": "^19.0.4", "@types/react-dom": "^19.1.1",
"@types/react-is": "^19.0.0", "@types/react-is": "^19.0.0",
"babel-plugin-react-compiler": "19.0.0-beta-e993439-20250328", "babel-plugin-react-compiler": "19.0.0-beta-e993439-20250328",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
@ -92,7 +92,7 @@
"eslint-plugin-import": "^2.31.0", "eslint-plugin-import": "^2.31.0",
"eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-jsx-a11y": "^6.10.2",
"eslint-plugin-mdx": "^3.3.1", "eslint-plugin-mdx": "^3.3.1",
"eslint-plugin-prettier": "^5.2.5", "eslint-plugin-prettier": "^5.2.6",
"eslint-plugin-react": "^7.37.4", "eslint-plugin-react": "^7.37.4",
"eslint-plugin-react-compiler": "19.0.0-beta-e993439-20250328", "eslint-plugin-react-compiler": "19.0.0-beta-e993439-20250328",
"eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-hooks": "^5.2.0",

118
pnpm-lock.yaml generated
View File

@ -25,13 +25,13 @@ importers:
version: 3.1.0(acorn@8.14.1)(webpack@5.98.0) version: 3.1.0(acorn@8.14.1)(webpack@5.98.0)
'@mdx-js/react': '@mdx-js/react':
specifier: ^3.1.0 specifier: ^3.1.0
version: 3.1.0(@types/react@19.0.12)(react@19.1.0) version: 3.1.0(@types/react@19.1.0)(react@19.1.0)
'@next/bundle-analyzer': '@next/bundle-analyzer':
specifier: 15.3.0-canary.29 specifier: 15.3.0-canary.29
version: 15.3.0-canary.29 version: 15.3.0-canary.29
'@next/mdx': '@next/mdx':
specifier: 15.3.0-canary.29 specifier: 15.3.0-canary.29
version: 15.3.0-canary.29(@mdx-js/loader@3.1.0(acorn@8.14.1)(webpack@5.98.0))(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@19.1.0)) version: 15.3.0-canary.29(@mdx-js/loader@3.1.0(acorn@8.14.1)(webpack@5.98.0))(@mdx-js/react@3.1.0(@types/react@19.1.0)(react@19.1.0))
'@octokit/graphql': '@octokit/graphql':
specifier: ^8.2.1 specifier: ^8.2.1
version: 8.2.1 version: 8.2.1
@ -69,8 +69,8 @@ importers:
specifier: ^2.6.0 specifier: ^2.6.0
version: 2.6.0 version: 2.6.0
lucide-react: lucide-react:
specifier: 0.486.0 specifier: 0.487.0
version: 0.486.0(react@19.1.0) version: 0.487.0(react@19.1.0)
modern-normalize: modern-normalize:
specifier: ^3.0.1 specifier: ^3.0.1
version: 3.0.1 version: 3.0.1
@ -97,7 +97,7 @@ importers:
version: 19.1.0(react@19.1.0) version: 19.1.0(react@19.1.0)
react-innertext: react-innertext:
specifier: ^1.1.5 specifier: ^1.1.5
version: 1.1.5(@types/react@19.0.12)(react@19.1.0) version: 1.1.5(@types/react@19.1.0)(react@19.1.0)
react-is: react-is:
specifier: 19.1.0 specifier: 19.1.0
version: 19.1.0 version: 19.1.0
@ -109,7 +109,7 @@ importers:
version: 2.0.0(react@19.1.0)(schema-dts@1.1.5)(typescript@5.8.2) version: 2.0.0(react@19.1.0)(schema-dts@1.1.5)(typescript@5.8.2)
react-textarea-autosize: react-textarea-autosize:
specifier: ^8.5.9 specifier: ^8.5.9
version: 8.5.9(@types/react@19.0.12)(react@19.1.0) version: 8.5.9(@types/react@19.1.0)(react@19.1.0)
react-timeago: react-timeago:
specifier: ^8.0.0 specifier: ^8.0.0
version: 8.0.0(react@19.1.0) version: 8.0.0(react@19.1.0)
@ -187,17 +187,17 @@ importers:
specifier: ^2.0.13 specifier: ^2.0.13
version: 2.0.13 version: 2.0.13
'@types/node': '@types/node':
specifier: ^22.13.16 specifier: ^22.13.17
version: 22.13.16 version: 22.13.17
'@types/prop-types': '@types/prop-types':
specifier: ^15.7.14 specifier: ^15.7.14
version: 15.7.14 version: 15.7.14
'@types/react': '@types/react':
specifier: ^19.0.12 specifier: ^19.1.0
version: 19.0.12 version: 19.1.0
'@types/react-dom': '@types/react-dom':
specifier: ^19.0.4 specifier: ^19.1.1
version: 19.0.4(@types/react@19.0.12) version: 19.1.1(@types/react@19.1.0)
'@types/react-is': '@types/react-is':
specifier: ^19.0.0 specifier: ^19.0.0
version: 19.0.0 version: 19.0.0
@ -229,8 +229,8 @@ importers:
specifier: ^3.3.1 specifier: ^3.3.1
version: 3.3.1(eslint@9.23.0) version: 3.3.1(eslint@9.23.0)
eslint-plugin-prettier: eslint-plugin-prettier:
specifier: ^5.2.5 specifier: ^5.2.6
version: 5.2.5(@types/eslint@9.6.1)(eslint-config-prettier@10.1.1(eslint@9.23.0))(eslint@9.23.0)(prettier@3.5.3) version: 5.2.6(@types/eslint@9.6.1)(eslint-config-prettier@10.1.1(eslint@9.23.0))(eslint@9.23.0)(prettier@3.5.3)
eslint-plugin-react: eslint-plugin-react:
specifier: ^7.37.4 specifier: ^7.37.4
version: 7.37.4(eslint@9.23.0) version: 7.37.4(eslint@9.23.0)
@ -1383,9 +1383,6 @@ packages:
'@types/nlcst@2.0.3': '@types/nlcst@2.0.3':
resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==}
'@types/node@22.13.16':
resolution: {integrity: sha512-15tM+qA4Ypml/N7kyRdvfRjBQT2RL461uF1Bldn06K0Nzn1lY3nAPgHlsVrJxdZ9WhZiW0Fmc1lOYMtDsAuB3w==}
'@types/node@22.13.17': '@types/node@22.13.17':
resolution: {integrity: sha512-nAJuQXoyPj04uLgu+obZcSmsfOenUg6DxPKogeUy6yNCFwWaj5sBF8/G/pNo8EtBJjAfSVgfIlugR/BCOleO+g==} resolution: {integrity: sha512-nAJuQXoyPj04uLgu+obZcSmsfOenUg6DxPKogeUy6yNCFwWaj5sBF8/G/pNo8EtBJjAfSVgfIlugR/BCOleO+g==}
@ -1398,16 +1395,16 @@ packages:
'@types/prop-types@15.7.14': '@types/prop-types@15.7.14':
resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==}
'@types/react-dom@19.0.4': '@types/react-dom@19.1.1':
resolution: {integrity: sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==} resolution: {integrity: sha512-jFf/woGTVTjUJsl2O7hcopJ1r0upqoq/vIOoCj0yLh3RIXxWcljlpuZ+vEBRXsymD1jhfeJrlyTy/S1UW+4y1w==}
peerDependencies: peerDependencies:
'@types/react': ^19.0.0 '@types/react': ^19.0.0
'@types/react-is@19.0.0': '@types/react-is@19.0.0':
resolution: {integrity: sha512-71dSZeeJ0t3aoPyY9x6i+JNSvg5m9EF2i2OlSZI5QoJuI8Ocgor610i+4A10TQmURR+0vLwcVCEYFpXdzM1Biw==} resolution: {integrity: sha512-71dSZeeJ0t3aoPyY9x6i+JNSvg5m9EF2i2OlSZI5QoJuI8Ocgor610i+4A10TQmURR+0vLwcVCEYFpXdzM1Biw==}
'@types/react@19.0.12': '@types/react@19.1.0':
resolution: {integrity: sha512-V6Ar115dBDrjbtXSrS+/Oruobc+qVbbUxDFC1RSbRqLt5SYvxxyIDrSC85RWml54g+jfNeEMZhEj7wW07ONQhA==} resolution: {integrity: sha512-UaicktuQI+9UKyA4njtDOGBD/67t8YEBt2xdfqu8+gP9hqPUPsiXlNPcpS2gVdjmis5GKPG3fCxbQLVgxsQZ8w==}
'@types/shimmer@1.2.0': '@types/shimmer@1.2.0':
resolution: {integrity: sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==} resolution: {integrity: sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==}
@ -2254,8 +2251,8 @@ packages:
peerDependencies: peerDependencies:
eslint: '>=8.0.0' eslint: '>=8.0.0'
eslint-plugin-prettier@5.2.5: eslint-plugin-prettier@5.2.6:
resolution: {integrity: sha512-IKKP8R87pJyMl7WWamLgPkloB16dagPIdd2FjBDbyRYPKo93wS/NbCOPh6gH+ieNLC+XZrhJt/kWj0PS/DFdmg==} resolution: {integrity: sha512-mUcf7QG2Tjk7H055Jk0lGBjbgDnfrvqjhXh9t2xLMSCjZVcw9Rb1V6sVNXO0th3jgeO7zllWPTNRil3JW94TnQ==}
engines: {node: ^14.18.0 || >=16.0.0} engines: {node: ^14.18.0 || >=16.0.0}
peerDependencies: peerDependencies:
'@types/eslint': '>=8.0.0' '@types/eslint': '>=8.0.0'
@ -3071,8 +3068,8 @@ packages:
lru-cache@5.1.1: lru-cache@5.1.1:
resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
lucide-react@0.486.0: lucide-react@0.487.0:
resolution: {integrity: sha512-xWop/wMsC1ikiEVLZrxXjPKw4vU/eAip33G2mZHgbWnr4Nr5Rt4Vx4s/q1D3B/rQVbxjOuqASkEZcUxDEKzecw==} resolution: {integrity: sha512-aKqhOQ+YmFnwq8dWgGjOuLc8V1R9/c/yOd+zDY4+ohsR2Jo05lSGc3WsstYPIzcTpeosN7LoCkLReUUITvaIvw==}
peerDependencies: peerDependencies:
react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
@ -4220,6 +4217,10 @@ packages:
resolution: {integrity: sha512-R1urvuyiTaWfeCggqEvpDJwAlDVdsT9NM+IP//Tk2x7qHCkSvBk/fwFgw/TLAHzZlrAnnazMcRw0ZD8HlYFTEQ==} resolution: {integrity: sha512-R1urvuyiTaWfeCggqEvpDJwAlDVdsT9NM+IP//Tk2x7qHCkSvBk/fwFgw/TLAHzZlrAnnazMcRw0ZD8HlYFTEQ==}
engines: {node: ^14.18.0 || >=16.0.0} engines: {node: ^14.18.0 || >=16.0.0}
synckit@0.11.1:
resolution: {integrity: sha512-fWZqNBZNNFp/7mTUy1fSsydhKsAKJ+u90Nk7kOK5Gcq9vObaqLBLjWFDBkyVU9Vvc6Y71VbOevMuGhqv02bT+Q==}
engines: {node: ^14.18.0 || >=16.0.0}
table@6.9.0: table@6.9.0:
resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==}
engines: {node: '>=10.0.0'} engines: {node: '>=10.0.0'}
@ -5024,10 +5025,10 @@ snapshots:
- acorn - acorn
- supports-color - supports-color
'@mdx-js/react@3.1.0(@types/react@19.0.12)(react@19.1.0)': '@mdx-js/react@3.1.0(@types/react@19.1.0)(react@19.1.0)':
dependencies: dependencies:
'@types/mdx': 2.0.13 '@types/mdx': 2.0.13
'@types/react': 19.0.12 '@types/react': 19.1.0
react: 19.1.0 react: 19.1.0
'@napi-rs/wasm-runtime@0.2.8': '@napi-rs/wasm-runtime@0.2.8':
@ -5050,12 +5051,12 @@ snapshots:
dependencies: dependencies:
fast-glob: 3.3.1 fast-glob: 3.3.1
'@next/mdx@15.3.0-canary.29(@mdx-js/loader@3.1.0(acorn@8.14.1)(webpack@5.98.0))(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@19.1.0))': '@next/mdx@15.3.0-canary.29(@mdx-js/loader@3.1.0(acorn@8.14.1)(webpack@5.98.0))(@mdx-js/react@3.1.0(@types/react@19.1.0)(react@19.1.0))':
dependencies: dependencies:
source-map: 0.7.4 source-map: 0.7.4
optionalDependencies: optionalDependencies:
'@mdx-js/loader': 3.1.0(acorn@8.14.1)(webpack@5.98.0) '@mdx-js/loader': 3.1.0(acorn@8.14.1)(webpack@5.98.0)
'@mdx-js/react': 3.1.0(@types/react@19.0.12)(react@19.1.0) '@mdx-js/react': 3.1.0(@types/react@19.1.0)(react@19.1.0)
'@next/swc-darwin-arm64@15.3.0-canary.29': '@next/swc-darwin-arm64@15.3.0-canary.29':
optional: true optional: true
@ -5814,11 +5815,11 @@ snapshots:
'@types/concat-stream@2.0.3': '@types/concat-stream@2.0.3':
dependencies: dependencies:
'@types/node': 22.13.16 '@types/node': 22.13.17
'@types/connect@3.4.38': '@types/connect@3.4.38':
dependencies: dependencies:
'@types/node': 22.13.16 '@types/node': 22.13.17
'@types/debug@4.1.12': '@types/debug@4.1.12':
dependencies: dependencies:
@ -5862,16 +5863,12 @@ snapshots:
'@types/mysql@2.15.26': '@types/mysql@2.15.26':
dependencies: dependencies:
'@types/node': 22.13.16 '@types/node': 22.13.17
'@types/nlcst@2.0.3': '@types/nlcst@2.0.3':
dependencies: dependencies:
'@types/unist': 3.0.3 '@types/unist': 3.0.3
'@types/node@22.13.16':
dependencies:
undici-types: 6.20.0
'@types/node@22.13.17': '@types/node@22.13.17':
dependencies: dependencies:
undici-types: 6.20.0 undici-types: 6.20.0
@ -5882,21 +5879,21 @@ snapshots:
'@types/pg@8.6.1': '@types/pg@8.6.1':
dependencies: dependencies:
'@types/node': 22.13.16 '@types/node': 22.13.17
pg-protocol: 1.8.0 pg-protocol: 1.8.0
pg-types: 2.2.0 pg-types: 2.2.0
'@types/prop-types@15.7.14': {} '@types/prop-types@15.7.14': {}
'@types/react-dom@19.0.4(@types/react@19.0.12)': '@types/react-dom@19.1.1(@types/react@19.1.0)':
dependencies: dependencies:
'@types/react': 19.0.12 '@types/react': 19.1.0
'@types/react-is@19.0.0': '@types/react-is@19.0.0':
dependencies: dependencies:
'@types/react': 19.0.12 '@types/react': 19.1.0
'@types/react@19.0.12': '@types/react@19.1.0':
dependencies: dependencies:
csstype: 3.1.3 csstype: 3.1.3
@ -5906,7 +5903,7 @@ snapshots:
'@types/tedious@4.0.14': '@types/tedious@4.0.14':
dependencies: dependencies:
'@types/node': 22.13.16 '@types/node': 22.13.17
'@types/trusted-types@2.0.7': {} '@types/trusted-types@2.0.7': {}
@ -6884,12 +6881,12 @@ snapshots:
- remark-lint-file-extension - remark-lint-file-extension
- supports-color - supports-color
eslint-plugin-prettier@5.2.5(@types/eslint@9.6.1)(eslint-config-prettier@10.1.1(eslint@9.23.0))(eslint@9.23.0)(prettier@3.5.3): eslint-plugin-prettier@5.2.6(@types/eslint@9.6.1)(eslint-config-prettier@10.1.1(eslint@9.23.0))(eslint@9.23.0)(prettier@3.5.3):
dependencies: dependencies:
eslint: 9.23.0 eslint: 9.23.0
prettier: 3.5.3 prettier: 3.5.3
prettier-linter-helpers: 1.0.0 prettier-linter-helpers: 1.0.0
synckit: 0.10.3 synckit: 0.11.1
optionalDependencies: optionalDependencies:
'@types/eslint': 9.6.1 '@types/eslint': 9.6.1
eslint-config-prettier: 10.1.1(eslint@9.23.0) eslint-config-prettier: 10.1.1(eslint@9.23.0)
@ -7849,7 +7846,7 @@ snapshots:
dependencies: dependencies:
yallist: 3.1.1 yallist: 3.1.1
lucide-react@0.486.0(react@19.1.0): lucide-react@0.487.0(react@19.1.0):
dependencies: dependencies:
react: 19.1.0 react: 19.1.0
@ -8716,9 +8713,9 @@ snapshots:
react: 19.1.0 react: 19.1.0
scheduler: 0.26.0 scheduler: 0.26.0
react-innertext@1.1.5(@types/react@19.0.12)(react@19.1.0): react-innertext@1.1.5(@types/react@19.1.0)(react@19.1.0):
dependencies: dependencies:
'@types/react': 19.0.12 '@types/react': 19.1.0
react: 19.1.0 react: 19.1.0
react-is@16.13.1: {} react-is@16.13.1: {}
@ -8740,12 +8737,12 @@ snapshots:
schema-dts: 1.1.5 schema-dts: 1.1.5
typescript: 5.8.2 typescript: 5.8.2
react-textarea-autosize@8.5.9(@types/react@19.0.12)(react@19.1.0): react-textarea-autosize@8.5.9(@types/react@19.1.0)(react@19.1.0):
dependencies: dependencies:
'@babel/runtime': 7.27.0 '@babel/runtime': 7.27.0
react: 19.1.0 react: 19.1.0
use-composed-ref: 1.4.0(@types/react@19.0.12)(react@19.1.0) use-composed-ref: 1.4.0(@types/react@19.1.0)(react@19.1.0)
use-latest: 1.3.0(@types/react@19.0.12)(react@19.1.0) use-latest: 1.3.0(@types/react@19.1.0)(react@19.1.0)
transitivePeerDependencies: transitivePeerDependencies:
- '@types/react' - '@types/react'
@ -9504,6 +9501,11 @@ snapshots:
'@pkgr/core': 0.2.0 '@pkgr/core': 0.2.0
tslib: 2.8.1 tslib: 2.8.1
synckit@0.11.1:
dependencies:
'@pkgr/core': 0.2.0
tslib: 2.8.1
table@6.9.0: table@6.9.0:
dependencies: dependencies:
ajv: 8.17.1 ajv: 8.17.1
@ -9627,7 +9629,7 @@ snapshots:
'@types/concat-stream': 2.0.3 '@types/concat-stream': 2.0.3
'@types/debug': 4.1.12 '@types/debug': 4.1.12
'@types/is-empty': 1.2.3 '@types/is-empty': 1.2.3
'@types/node': 22.13.16 '@types/node': 22.13.17
'@types/unist': 3.0.3 '@types/unist': 3.0.3
concat-stream: 2.0.0 concat-stream: 2.0.0
debug: 4.4.0 debug: 4.4.0
@ -9746,24 +9748,24 @@ snapshots:
dependencies: dependencies:
punycode: 2.3.1 punycode: 2.3.1
use-composed-ref@1.4.0(@types/react@19.0.12)(react@19.1.0): use-composed-ref@1.4.0(@types/react@19.1.0)(react@19.1.0):
dependencies: dependencies:
react: 19.1.0 react: 19.1.0
optionalDependencies: optionalDependencies:
'@types/react': 19.0.12 '@types/react': 19.1.0
use-isomorphic-layout-effect@1.2.0(@types/react@19.0.12)(react@19.1.0): use-isomorphic-layout-effect@1.2.0(@types/react@19.1.0)(react@19.1.0):
dependencies: dependencies:
react: 19.1.0 react: 19.1.0
optionalDependencies: optionalDependencies:
'@types/react': 19.0.12 '@types/react': 19.1.0
use-latest@1.3.0(@types/react@19.0.12)(react@19.1.0): use-latest@1.3.0(@types/react@19.1.0)(react@19.1.0):
dependencies: dependencies:
react: 19.1.0 react: 19.1.0
use-isomorphic-layout-effect: 1.2.0(@types/react@19.0.12)(react@19.1.0) use-isomorphic-layout-effect: 1.2.0(@types/react@19.1.0)(react@19.1.0)
optionalDependencies: optionalDependencies:
'@types/react': 19.0.12 '@types/react': 19.1.0
use-sync-external-store@1.5.0(react@19.1.0): use-sync-external-store@1.5.0(react@19.1.0):
dependencies: dependencies: