1
mirror of https://github.com/jakejarvis/jarv.is.git synced 2025-04-26 09:25:22 -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>
links
</Link>
](https://jarv.is), and <code>`code`</code>.
](https://jarv.is), and <code style={{ fontFamily: "var(--fonts-mono)" }}>`code`</code>.
</div>
<div style={{ margin: "1em 0" }}>

View File

@ -29,7 +29,14 @@ const Page = () => {
<p>
🔐 You can grab my public key here:{" "}
<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
</code>
</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;
flex-direction: column;
min-height: 100vh;

View File

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

View File

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

View File

@ -1,8 +1,7 @@
import { Comic_Neue as ComicNeueLoader } from "next/font/google";
import PageTitle from "../../components/PageTitle";
import { addMetadata } from "../../lib/helpers/metadata";
import { ComicNeue } from "../../lib/styles/fonts";
export const metadata = addMetadata({
title: "Previously on...",
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 = () => (
<style
// this is really, really dumb idea but f*ck it we'll do it live
dangerouslySetInnerHTML={{
__html: `
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 {
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 {
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)

View File

@ -32,6 +32,7 @@ const Page = () => {
overflowX: "auto",
padding: "1em",
fontSize: "0.9em",
fontFamily: "var(--fonts-mono)",
tabSize: 2,
border: "1px solid var(--colors-kinda-light)",
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) {
margin: 1em auto;
position: relative;
@ -15,14 +30,14 @@ figure:has(.highlighted) {
border-radius: 0.6em;
}
.highlighted span {
.highlighted [style*="--shiki"] {
color: var(--shiki-light);
font-style: var(--shiki-light-font-style);
font-weight: var(--shiki-light-font-weight);
text-decoration: var(--shiki-light-text-decoration);
}
[data-theme="dark"] .highlighted span {
[data-theme="dark"] .highlighted [style*="--shiki"] {
color: var(--shiki-dark);
font-style: var(--shiki-dark-font-style);
font-weight: var(--shiki-dark-font-weight);
@ -58,15 +73,6 @@ figure:has(.highlighted) {
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 {
position: absolute;
top: 0;

View File

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

View File

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

View File

@ -29,9 +29,9 @@ const Tweet = async ({ id, className, ...rest }: TweetProps) => {
components={{
// https://react-tweet.vercel.app/twitter-theme/api-reference#custom-tweet-components
// 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
MediaImg: (props) => <Image {...props} fill sizes="640w" />,
MediaImg: (props) => <Image {...props} fill unoptimized />,
}}
{...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(),
},
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: {
"/notes/[slug]/opengraph-image": [
"./notes/**/*",
@ -66,6 +59,7 @@ const nextConfig: NextConfig = {
value: "max-age=63072000; includeSubDomains; preload",
},
{
// 🥛 debugging
key: "x-got-milk",
value: "2%",
},

View File

@ -37,7 +37,7 @@
"feed": "^4.2.2",
"geist": "^1.3.1",
"html-entities": "^2.6.0",
"lucide-react": "0.486.0",
"lucide-react": "0.487.0",
"modern-normalize": "^3.0.1",
"next": "15.3.0-canary.29",
"obj-str": "^1.1.0",
@ -78,10 +78,10 @@
"@sentry/cli": "^2.43.0",
"@types/comma-number": "^2.1.2",
"@types/mdx": "^2.0.13",
"@types/node": "^22.13.16",
"@types/node": "^22.13.17",
"@types/prop-types": "^15.7.14",
"@types/react": "^19.0.12",
"@types/react-dom": "^19.0.4",
"@types/react": "^19.1.0",
"@types/react-dom": "^19.1.1",
"@types/react-is": "^19.0.0",
"babel-plugin-react-compiler": "19.0.0-beta-e993439-20250328",
"cross-env": "^7.0.3",
@ -92,7 +92,7 @@
"eslint-plugin-import": "^2.31.0",
"eslint-plugin-jsx-a11y": "^6.10.2",
"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-compiler": "19.0.0-beta-e993439-20250328",
"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)
'@mdx-js/react':
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':
specifier: 15.3.0-canary.29
version: 15.3.0-canary.29
'@next/mdx':
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':
specifier: ^8.2.1
version: 8.2.1
@ -69,8 +69,8 @@ importers:
specifier: ^2.6.0
version: 2.6.0
lucide-react:
specifier: 0.486.0
version: 0.486.0(react@19.1.0)
specifier: 0.487.0
version: 0.487.0(react@19.1.0)
modern-normalize:
specifier: ^3.0.1
version: 3.0.1
@ -97,7 +97,7 @@ importers:
version: 19.1.0(react@19.1.0)
react-innertext:
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:
specifier: 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)
react-textarea-autosize:
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:
specifier: ^8.0.0
version: 8.0.0(react@19.1.0)
@ -187,17 +187,17 @@ importers:
specifier: ^2.0.13
version: 2.0.13
'@types/node':
specifier: ^22.13.16
version: 22.13.16
specifier: ^22.13.17
version: 22.13.17
'@types/prop-types':
specifier: ^15.7.14
version: 15.7.14
'@types/react':
specifier: ^19.0.12
version: 19.0.12
specifier: ^19.1.0
version: 19.1.0
'@types/react-dom':
specifier: ^19.0.4
version: 19.0.4(@types/react@19.0.12)
specifier: ^19.1.1
version: 19.1.1(@types/react@19.1.0)
'@types/react-is':
specifier: ^19.0.0
version: 19.0.0
@ -229,8 +229,8 @@ importers:
specifier: ^3.3.1
version: 3.3.1(eslint@9.23.0)
eslint-plugin-prettier:
specifier: ^5.2.5
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)
specifier: ^5.2.6
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:
specifier: ^7.37.4
version: 7.37.4(eslint@9.23.0)
@ -1383,9 +1383,6 @@ packages:
'@types/nlcst@2.0.3':
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':
resolution: {integrity: sha512-nAJuQXoyPj04uLgu+obZcSmsfOenUg6DxPKogeUy6yNCFwWaj5sBF8/G/pNo8EtBJjAfSVgfIlugR/BCOleO+g==}
@ -1398,16 +1395,16 @@ packages:
'@types/prop-types@15.7.14':
resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==}
'@types/react-dom@19.0.4':
resolution: {integrity: sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==}
'@types/react-dom@19.1.1':
resolution: {integrity: sha512-jFf/woGTVTjUJsl2O7hcopJ1r0upqoq/vIOoCj0yLh3RIXxWcljlpuZ+vEBRXsymD1jhfeJrlyTy/S1UW+4y1w==}
peerDependencies:
'@types/react': ^19.0.0
'@types/react-is@19.0.0':
resolution: {integrity: sha512-71dSZeeJ0t3aoPyY9x6i+JNSvg5m9EF2i2OlSZI5QoJuI8Ocgor610i+4A10TQmURR+0vLwcVCEYFpXdzM1Biw==}
'@types/react@19.0.12':
resolution: {integrity: sha512-V6Ar115dBDrjbtXSrS+/Oruobc+qVbbUxDFC1RSbRqLt5SYvxxyIDrSC85RWml54g+jfNeEMZhEj7wW07ONQhA==}
'@types/react@19.1.0':
resolution: {integrity: sha512-UaicktuQI+9UKyA4njtDOGBD/67t8YEBt2xdfqu8+gP9hqPUPsiXlNPcpS2gVdjmis5GKPG3fCxbQLVgxsQZ8w==}
'@types/shimmer@1.2.0':
resolution: {integrity: sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==}
@ -2254,8 +2251,8 @@ packages:
peerDependencies:
eslint: '>=8.0.0'
eslint-plugin-prettier@5.2.5:
resolution: {integrity: sha512-IKKP8R87pJyMl7WWamLgPkloB16dagPIdd2FjBDbyRYPKo93wS/NbCOPh6gH+ieNLC+XZrhJt/kWj0PS/DFdmg==}
eslint-plugin-prettier@5.2.6:
resolution: {integrity: sha512-mUcf7QG2Tjk7H055Jk0lGBjbgDnfrvqjhXh9t2xLMSCjZVcw9Rb1V6sVNXO0th3jgeO7zllWPTNRil3JW94TnQ==}
engines: {node: ^14.18.0 || >=16.0.0}
peerDependencies:
'@types/eslint': '>=8.0.0'
@ -3071,8 +3068,8 @@ packages:
lru-cache@5.1.1:
resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
lucide-react@0.486.0:
resolution: {integrity: sha512-xWop/wMsC1ikiEVLZrxXjPKw4vU/eAip33G2mZHgbWnr4Nr5Rt4Vx4s/q1D3B/rQVbxjOuqASkEZcUxDEKzecw==}
lucide-react@0.487.0:
resolution: {integrity: sha512-aKqhOQ+YmFnwq8dWgGjOuLc8V1R9/c/yOd+zDY4+ohsR2Jo05lSGc3WsstYPIzcTpeosN7LoCkLReUUITvaIvw==}
peerDependencies:
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==}
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:
resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==}
engines: {node: '>=10.0.0'}
@ -5024,10 +5025,10 @@ snapshots:
- acorn
- 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:
'@types/mdx': 2.0.13
'@types/react': 19.0.12
'@types/react': 19.1.0
react: 19.1.0
'@napi-rs/wasm-runtime@0.2.8':
@ -5050,12 +5051,12 @@ snapshots:
dependencies:
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:
source-map: 0.7.4
optionalDependencies:
'@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':
optional: true
@ -5814,11 +5815,11 @@ snapshots:
'@types/concat-stream@2.0.3':
dependencies:
'@types/node': 22.13.16
'@types/node': 22.13.17
'@types/connect@3.4.38':
dependencies:
'@types/node': 22.13.16
'@types/node': 22.13.17
'@types/debug@4.1.12':
dependencies:
@ -5862,16 +5863,12 @@ snapshots:
'@types/mysql@2.15.26':
dependencies:
'@types/node': 22.13.16
'@types/node': 22.13.17
'@types/nlcst@2.0.3':
dependencies:
'@types/unist': 3.0.3
'@types/node@22.13.16':
dependencies:
undici-types: 6.20.0
'@types/node@22.13.17':
dependencies:
undici-types: 6.20.0
@ -5882,21 +5879,21 @@ snapshots:
'@types/pg@8.6.1':
dependencies:
'@types/node': 22.13.16
'@types/node': 22.13.17
pg-protocol: 1.8.0
pg-types: 2.2.0
'@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:
'@types/react': 19.0.12
'@types/react': 19.1.0
'@types/react-is@19.0.0':
dependencies:
'@types/react': 19.0.12
'@types/react': 19.1.0
'@types/react@19.0.12':
'@types/react@19.1.0':
dependencies:
csstype: 3.1.3
@ -5906,7 +5903,7 @@ snapshots:
'@types/tedious@4.0.14':
dependencies:
'@types/node': 22.13.16
'@types/node': 22.13.17
'@types/trusted-types@2.0.7': {}
@ -6884,12 +6881,12 @@ snapshots:
- remark-lint-file-extension
- 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:
eslint: 9.23.0
prettier: 3.5.3
prettier-linter-helpers: 1.0.0
synckit: 0.10.3
synckit: 0.11.1
optionalDependencies:
'@types/eslint': 9.6.1
eslint-config-prettier: 10.1.1(eslint@9.23.0)
@ -7849,7 +7846,7 @@ snapshots:
dependencies:
yallist: 3.1.1
lucide-react@0.486.0(react@19.1.0):
lucide-react@0.487.0(react@19.1.0):
dependencies:
react: 19.1.0
@ -8716,9 +8713,9 @@ snapshots:
react: 19.1.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:
'@types/react': 19.0.12
'@types/react': 19.1.0
react: 19.1.0
react-is@16.13.1: {}
@ -8740,12 +8737,12 @@ snapshots:
schema-dts: 1.1.5
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:
'@babel/runtime': 7.27.0
react: 19.1.0
use-composed-ref: 1.4.0(@types/react@19.0.12)(react@19.1.0)
use-latest: 1.3.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.1.0)(react@19.1.0)
transitivePeerDependencies:
- '@types/react'
@ -9504,6 +9501,11 @@ snapshots:
'@pkgr/core': 0.2.0
tslib: 2.8.1
synckit@0.11.1:
dependencies:
'@pkgr/core': 0.2.0
tslib: 2.8.1
table@6.9.0:
dependencies:
ajv: 8.17.1
@ -9627,7 +9629,7 @@ snapshots:
'@types/concat-stream': 2.0.3
'@types/debug': 4.1.12
'@types/is-empty': 1.2.3
'@types/node': 22.13.16
'@types/node': 22.13.17
'@types/unist': 3.0.3
concat-stream: 2.0.0
debug: 4.4.0
@ -9746,24 +9748,24 @@ snapshots:
dependencies:
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:
react: 19.1.0
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:
react: 19.1.0
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:
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:
'@types/react': 19.0.12
'@types/react': 19.1.0
use-sync-external-store@1.5.0(react@19.1.0):
dependencies: