1
mirror of https://github.com/jakejarvis/jarv.is.git synced 2025-04-26 02:05:22 -04:00

json-ld improvements

This commit is contained in:
Jake Jarvis 2025-03-21 12:02:14 -04:00
parent b626955731
commit 9fd3de8569
Signed by: jake
SSH Key Fingerprint: SHA256:nCkvAjYA6XaSPUqc4TfbBQTpzr8Xj7ritg/sGInCdkc
20 changed files with 277 additions and 225 deletions

1
.npmrc
View File

@ -1,2 +1,3 @@
public-hoist-pattern[]=*eslint*
public-hoist-pattern[]=*prettier*
public-hoist-pattern[]=*stylelint*

View File

@ -1,6 +1,9 @@
import { JsonLd } from "react-schemaorg";
import PageTitle from "../../components/PageTitle";
import Video from "../../components/Video";
import { addMetadata } from "../../lib/helpers/metadata";
import { BASE_URL } from "../../lib/config/constants";
import type { VideoObject } from "schema-dts";
import thumbnail from "./thumbnail.png";
@ -15,6 +18,20 @@ export const metadata = addMetadata({
const Page = () => {
return (
<>
<JsonLd<VideoObject>
item={{
"@context": "https://schema.org",
"@type": "VideoObject",
name: metadata.title as string,
description: metadata.description as string,
thumbnailUrl: `${BASE_URL}${thumbnail.src}`,
contentUrl:
"https://bcm6wnmyyzj1p5ls.public.blob.vercel-storage.com/videos/birthday/birthday-8iayCEy1jfEHpNGZkdBPvxPFOuGz0g.mp4",
uploadDate: "1996-02-06T00:00:00Z",
duration: "PT6M10S",
}}
/>
<PageTitle canonical="/birthday">1996.mov</PageTitle>
<Video

View File

@ -1,7 +1,10 @@
import { JsonLd } from "react-schemaorg";
import PageTitle from "../../components/PageTitle";
import Link from "../../components/Link";
import Video from "../../components/Video";
import { addMetadata } from "../../lib/helpers/metadata";
import { BASE_URL } from "../../lib/config/constants";
import type { VideoObject } from "schema-dts";
import thumbnail from "./thumbnail.png";
@ -16,6 +19,20 @@ export const metadata = addMetadata({
const Page = () => {
return (
<>
<JsonLd<VideoObject>
item={{
"@context": "https://schema.org",
"@type": "VideoObject",
name: metadata.title as string,
description: metadata.description as string,
thumbnailUrl: `${BASE_URL}${thumbnail.src}`,
contentUrl:
"https://bcm6wnmyyzj1p5ls.public.blob.vercel-storage.com/videos/hillary/convention-720p-YLGreYE59PzmPo4epB21HQG6jXgYL5.mp4",
uploadDate: "2016-07-25T00:00:00Z",
duration: "PT1M51S",
}}
/>
<PageTitle canonical="/hillary">HRC.mov</PageTitle>
<Video

View File

@ -13,8 +13,10 @@
}
.container {
margin: 0 auto;
display: block;
width: 100%;
max-width: var(--max-width);
margin: 0 auto;
}
@media (max-width: 768px) {

View File

@ -1,4 +1,5 @@
import clsx from "clsx";
import { JsonLd } from "react-schemaorg";
import Analytics from "./analytics";
import { ThemeProvider } from "../contexts/ThemeContext";
import Header from "../components/Header";
@ -8,7 +9,7 @@ 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, WithContext } from "schema-dts";
import type { Person, WebSite } from "schema-dts";
import { GeistMono, GeistSans } from "../lib/styles/fonts";
import "modern-normalize/modern-normalize.css"; // https://github.com/sindresorhus/modern-normalize/blob/main/modern-normalize.css
@ -21,35 +22,52 @@ import ogImage from "./opengraph-image.jpg";
export const metadata: Metadata = defaultMetadata;
// https://nextjs.org/docs/app/building-your-application/optimizing/metadata#json-ld
const jsonLd: WithContext<Person> = {
"@context": "https://schema.org",
"@type": "Person",
name: config.authorName,
url: BASE_URL,
image: `${BASE_URL}${ogImage.src}`,
sameAs: [
BASE_URL,
`https://github.com/${config.authorSocial?.github}`,
`https://keybase.io/${config.authorSocial?.keybase}`,
`https://twitter.com/${config.authorSocial?.twitter}`,
`https://medium.com/@${config.authorSocial?.medium}`,
`https://www.linkedin.com/in/${config.authorSocial?.linkedin}/`,
`https://www.facebook.com/${config.authorSocial?.facebook}`,
`https://www.instagram.com/${config.authorSocial?.instagram}/`,
`https://${config.authorSocial?.mastodon}`,
`https://bsky.app/profile/${config.authorSocial?.bluesky}`,
],
};
const RootLayout = ({ children }: Readonly<{ children: React.ReactNode }>) => {
return (
<html lang={config.siteLocale} suppressHydrationWarning>
<head>
<script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }} />
<JsonLd<Person>
item={{
"@context": "https://schema.org",
"@type": "Person",
"@id": `${BASE_URL}/#person`,
name: config.authorName,
url: BASE_URL,
image: `${BASE_URL}${ogImage.src}`,
sameAs: [
BASE_URL,
`https://github.com/${config.authorSocial?.github}`,
`https://keybase.io/${config.authorSocial?.keybase}`,
`https://twitter.com/${config.authorSocial?.twitter}`,
`https://medium.com/@${config.authorSocial?.medium}`,
`https://www.linkedin.com/in/${config.authorSocial?.linkedin}/`,
`https://www.facebook.com/${config.authorSocial?.facebook}`,
`https://www.instagram.com/${config.authorSocial?.instagram}/`,
`https://${config.authorSocial?.mastodon}`,
`https://bsky.app/profile/${config.authorSocial?.bluesky}`,
],
}}
/>
<JsonLd<WebSite>
item={{
"@context": "https://schema.org",
"@type": "WebSite",
"@id": `${BASE_URL}/#website`,
name: config.siteName,
url: BASE_URL,
author: config.authorName,
description: config.longDescription,
inLanguage: config.siteLocale,
license: config.licenseUrl,
}}
/>
</head>
<body className={clsx(GeistMono.variable, GeistSans.variable)}>
<body
className={clsx(GeistMono.variable, GeistSans.variable)}
style={{ ["--max-width" as string]: `${MAX_WIDTH}px` }}
>
<ThemeProvider>
<SkipToContentLink />
@ -58,9 +76,7 @@ const RootLayout = ({ children }: Readonly<{ children: React.ReactNode }>) => {
<main className={styles.default}>
<SkipToContentTarget />
<div className={styles.container} style={{ maxWidth: MAX_WIDTH }}>
{children}
</div>
<div className={styles.container}>{children}</div>
</main>
<Footer />

View File

@ -1,7 +1,10 @@
import { JsonLd } from "react-schemaorg";
import PageTitle from "../../components/PageTitle";
import Link from "../../components/Link";
import Video from "../../components/Video";
import { addMetadata } from "../../lib/helpers/metadata";
import { BASE_URL } from "../../lib/config/constants";
import type { VideoObject } from "schema-dts";
import thumbnail from "./thumbnail.png";
@ -16,6 +19,20 @@ export const metadata = addMetadata({
const Page = () => {
return (
<>
<JsonLd<VideoObject>
item={{
"@context": "https://schema.org",
"@type": "VideoObject",
name: metadata.title as string,
description: metadata.description as string,
thumbnailUrl: `${BASE_URL}${thumbnail.src}`,
contentUrl:
"https://bcm6wnmyyzj1p5ls.public.blob.vercel-storage.com/videos/leo/leo-x4E4eG4YPo22KSTJuZwAk6fpNF1NgG.mp4",
uploadDate: "2007-05-10T00:00:00Z",
duration: "PT1M48S",
}}
/>
<PageTitle canonical="/leo">TheLab.mov</PageTitle>
<Video

View File

@ -1,5 +1,6 @@
import { Suspense } from "react";
import { ErrorBoundary } from "react-error-boundary";
import { JsonLd } from "react-schemaorg";
import { CalendarIcon, TagIcon, SquarePenIcon, EyeIcon } from "lucide-react";
import Link from "../../../components/Link";
import Time from "../../../components/Time";
@ -11,7 +12,7 @@ import { addMetadata } from "../../../lib/helpers/metadata";
import * as config from "../../../lib/config";
import { BASE_URL } from "../../../lib/config/constants";
import type { Metadata, Route } from "next";
import type { Article, WithContext } from "schema-dts";
import type { Article } from "schema-dts";
import styles from "./page.module.css";
@ -58,26 +59,29 @@ const Page = async ({ params }: { params: Promise<{ slug: string }> }) => {
const { slug } = await params;
const frontmatter = await getFrontMatter(slug);
const jsonLd: WithContext<Article> = {
"@context": "https://schema.org",
"@type": "Article",
name: frontmatter.title,
description: frontmatter.description || config.longDescription,
url: frontmatter.permalink,
datePublished: frontmatter.date,
dateModified: frontmatter.date,
author: {
"@type": "Person",
name: config.authorName,
url: BASE_URL,
},
};
const { default: MDXContent } = await import(`../../../notes/${slug}/index.mdx`);
return (
<>
<script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }} />
<JsonLd<Article>
item={{
"@context": "https://schema.org",
"@type": "Article",
headline: frontmatter.title,
description: frontmatter.description,
url: frontmatter.permalink,
image: [`${BASE_URL}/notes/${slug}/opengraph-image`],
keywords: frontmatter.tags,
datePublished: frontmatter.date,
dateModified: frontmatter.date,
inLanguage: config.siteLocale,
license: config.licenseUrl,
author: {
// defined in app/layout.tsx
"@id": `${BASE_URL}/#person`,
},
}}
/>
<div className={styles.meta}>
<div className={styles.metaItem}>

View File

@ -9,9 +9,10 @@
.row {
display: flex;
width: 100%;
margin: 0 auto;
justify-content: space-between;
width: 100%;
max-width: var(--max-width);
margin: 0 auto;
font-size: 0.8em;
line-height: 2.3;
}

View File

@ -2,7 +2,6 @@ import clsx from "clsx";
import { HeartIcon } from "lucide-react";
import Link from "../Link";
import * as config from "../../lib/config";
import { MAX_WIDTH } from "../../lib/config/constants";
import type { ComponentPropsWithoutRef } from "react";
import styles from "./Footer.module.css";
@ -12,7 +11,7 @@ export type FooterProps = ComponentPropsWithoutRef<"footer">;
const Footer = ({ className, ...rest }: FooterProps) => {
return (
<footer className={clsx(styles.footer, className)} {...rest}>
<div className={styles.row} style={{ maxWidth: MAX_WIDTH }}>
<div className={styles.row}>
<div>
Content{" "}
<Link href="/license" title={config.license} plain className={styles.link}>

View File

@ -46,6 +46,7 @@
align-items: center;
justify-content: space-between;
width: 100%;
max-width: var(--max-width);
margin: 0 auto;
}

View File

@ -3,7 +3,6 @@ import clsx from "clsx";
import Link from "../Link";
import Menu from "../Menu";
import * as config from "../../lib/config";
import { MAX_WIDTH } from "../../lib/config/constants";
import type { ComponentPropsWithoutRef } from "react";
import styles from "./Header.module.css";
@ -15,7 +14,7 @@ export type HeaderProps = ComponentPropsWithoutRef<"header">;
const Header = ({ className, ...rest }: HeaderProps) => {
return (
<header className={clsx(styles.header, className)} {...rest}>
<nav className={styles.nav} style={{ maxWidth: MAX_WIDTH }}>
<nav className={styles.nav}>
<Link href="/" rel="author" title={config.authorName} plain className={styles.homeLink}>
<Image
src={selfieJpg}

View File

@ -11,7 +11,7 @@ import styles from "./ThemeToggle.module.css";
export type ThemeToggleProps = ComponentPropsWithoutRef<LucideIcon>;
const ThemeToggle = ({ className, ...rest }: ThemeToggleProps) => {
const { theme, setTheme } = useTheme();
const [theme, setTheme] = useTheme();
return (
<button

View File

@ -2,20 +2,18 @@
import { createContext, useEffect, useState } from "react";
import { useLocalStorage, useMediaQuery } from "../hooks";
import type { Context, PropsWithChildren } from "react";
import type { PropsWithChildren } from "react";
type Themes = "light" | "dark";
export const ThemeContext: Context<{
export const ThemeContext = createContext<{
/**
* If the user's theme preference is unset, this returns whether the system preference resolved to "light" or "dark".
* If the user's theme preference is set, the preference is returned instead, regardless of their system's theme.
*/
theme: Themes;
theme: string;
/** Update the theme manually and save to local storage. */
setTheme: (theme: Themes) => void;
}> = createContext({
theme: "" as Themes,
setTheme: (theme: string) => void;
}>({
theme: "",
// eslint-disable-next-line @typescript-eslint/no-unused-vars
setTheme: (_) => {},
});
@ -23,9 +21,9 @@ export const ThemeContext: Context<{
// provider used once in _app.tsx to wrap entire app
export const ThemeProvider = ({ children }: PropsWithChildren) => {
// keep track of if/when the user has set their theme *on this site*
const [preferredTheme, setPreferredTheme] = useLocalStorage<Themes>("theme");
const [preferredTheme, setPreferredTheme] = useLocalStorage("theme");
// keep track of changes to the user's OS/browser dark mode setting
const [systemTheme, setSystemTheme] = useState<Themes>("" as Themes);
const [systemTheme, setSystemTheme] = useState("");
// hook into system `prefers-dark-mode` setting
// https://web.dev/prefers-color-scheme/#the-prefers-color-scheme-media-query
const isSystemDark = useMediaQuery("(prefers-color-scheme: dark)");
@ -41,7 +39,7 @@ export const ThemeProvider = ({ children }: PropsWithChildren) => {
const resolvedTheme = preferredTheme && ["light", "dark"].includes(preferredTheme) ? preferredTheme : systemTheme;
// this is what actually changes the CSS variables
document.documentElement.dataset.theme = preferredTheme ?? systemTheme;
document.documentElement.dataset.theme = resolvedTheme;
// less important, but tells the browser how to render built-in elements like forms, scrollbars, etc.
document.documentElement.style?.setProperty("color-scheme", resolvedTheme);

View File

@ -9,7 +9,7 @@ const useTheme = () => {
throw new Error("useTheme must be used inside of a ThemeProvider.");
}
return context;
return [context.theme, context.setTheme] as const;
};
export default useTheme;

View File

@ -2,7 +2,7 @@ import { cache } from "react";
import path from "path";
import glob from "fast-glob";
import { unified } from "unified";
import { remarkParse, remarkSmartypants, remarkRehype, rehypeSanitize, rehypeStringify } from "./remark-rehype-plugins";
import { remarkHtml, remarkParse, remarkSmartypants } from "./remark-rehype-plugins";
import { decode } from "html-entities";
import { formatDate } from "./format-date";
import { BASE_URL, POSTS_DIR } from "../config/constants";
@ -23,35 +23,22 @@ export type FrontMatter = {
export const getFrontMatter = async (slug: string): Promise<FrontMatter> => {
const { frontmatter } = await import(`../../${POSTS_DIR}/${slug}/index.mdx`);
// create a reusable processor for titles
const titleProcessor = unified()
// process markdown title to html...
const htmlTitle = await unified()
.use(remarkParse)
.use(remarkSmartypants, {
quotes: true,
dashes: "oldschool",
backticks: false,
ellipses: false,
})
.use(remarkRehype)
.use(rehypeStringify);
// process title as both plain and stylized
const [title, htmlTitle] = await Promise.all([
titleProcessor()
.use(rehypeSanitize, {
// strip all resulting html tags from the markdown title
tagNames: [],
})
.process(frontmatter.title)
.then((result) => decode(String(result))),
titleProcessor()
.use(rehypeSanitize, {
.use(remarkSmartypants)
.use(remarkHtml, {
sanitize: {
// allow *very* limited markdown to be used in post titles
tagNames: ["code", "em", "strong"],
})
.process(frontmatter.title)
.then((result) => String(result)),
]);
},
})
.process(frontmatter.title)
.then((result) => result.toString().trim());
// ...and then (sketchily) remove said html for a plaintext version:
// https://css-tricks.com/snippets/javascript/strip-html-tags-in-javascript/
const title = decode(htmlTitle.replace(/<[^>]*>/g, ""));
// return both the parsed YAML front matter (with a few amendments) and the raw, unparsed markdown content
return {

View File

@ -1,12 +1,10 @@
export { default as rehypeMdxImportMedia } from "rehype-mdx-import-media";
export { default as rehypePrettyCode } from "rehype-pretty-code";
export { default as rehypeSanitize } from "rehype-sanitize";
export { default as rehypeSlug } from "rehype-slug";
export { default as rehypeStringify } from "rehype-stringify";
export { default as rehypeUnwrapImages } from "rehype-unwrap-images";
export { default as remarkFrontmatter } from "remark-frontmatter";
export { default as remarkGfm } from "remark-gfm";
export { default as remarkHtml } from "remark-html";
export { default as remarkMdxFrontmatter } from "remark-mdx-frontmatter";
export { default as remarkParse } from "remark-parse";
export { default as remarkRehype } from "remark-rehype";
export { default as remarkSmartypants } from "remark-smartypants";

View File

@ -134,16 +134,8 @@ const nextPlugins = [
remarkPlugins: [
mdxPlugins.remarkFrontmatter,
mdxPlugins.remarkMdxFrontmatter,
[mdxPlugins.remarkGfm, { singleTilde: false }],
[
mdxPlugins.remarkSmartypants,
{
quotes: true,
dashes: "oldschool",
backticks: false,
ellipses: false,
},
],
mdxPlugins.remarkGfm,
mdxPlugins.remarkSmartypants,
],
rehypePlugins: [
mdxPlugins.rehypeUnwrapImages,

View File

@ -13,7 +13,7 @@
"dev": "next dev -H 0.0.0.0",
"build": "next build",
"start": "next start",
"lint": "next lint --no-cache",
"lint": "next lint",
"typecheck": "tsc",
"postinstall": "prisma generate --no-hints"
},
@ -22,9 +22,9 @@
"@giscus/react": "^3.1.0",
"@mdx-js/loader": "^3.1.0",
"@mdx-js/react": "^3.1.0",
"@next/bundle-analyzer": "15.3.0-canary.15",
"@next/mdx": "15.3.0-canary.15",
"@next/third-parties": "15.3.0-canary.15",
"@next/bundle-analyzer": "15.3.0-canary.17",
"@next/mdx": "15.3.0-canary.17",
"@next/third-parties": "15.3.0-canary.17",
"@octokit/graphql": "^8.2.1",
"@octokit/graphql-schema": "^15.26.0",
"@prisma/client": "^6.5.0",
@ -38,7 +38,7 @@
"html-entities": "^2.5.2",
"lucide-react": "0.483.0",
"modern-normalize": "^3.0.1",
"next": "15.3.0-canary.15",
"next": "15.3.0-canary.17",
"obj-str": "^1.1.0",
"polished": "^4.3.1",
"prop-types": "^15.8.1",
@ -47,20 +47,19 @@
"react-error-boundary": "^5.0.0",
"react-innertext": "^1.1.5",
"react-is": "19.0.0",
"react-schemaorg": "^2.0.0",
"react-textarea-autosize": "^8.5.8",
"react-turnstile": "^1.1.4",
"react-tweet": "^3.2.2",
"rehype-mdx-import-media": "^1.2.0",
"rehype-pretty-code": "^0.14.1",
"rehype-sanitize": "^6.0.0",
"rehype-slug": "^6.0.0",
"rehype-stringify": "^10.0.1",
"rehype-unwrap-images": "^1.0.0",
"remark-frontmatter": "^5.0.0",
"remark-gfm": "^4.0.1",
"remark-html": "^16.0.1",
"remark-mdx-frontmatter": "^5.0.0",
"remark-parse": "^11.0.0",
"remark-rehype": "^11.1.1",
"remark-smartypants": "^3.0.2",
"resend": "^4.1.2",
"shiki": "^3.2.1",
@ -73,7 +72,7 @@
"@jakejarvis/eslint-config": "^4.0.7",
"@types/comma-number": "^2.1.2",
"@types/mdx": "^2.0.13",
"@types/node": "^22.13.10",
"@types/node": "^22.13.11",
"@types/prop-types": "^15.7.14",
"@types/react": "^19.0.12",
"@types/react-dom": "^19.0.4",
@ -81,7 +80,7 @@
"babel-plugin-react-compiler": "19.0.0-beta-3229e95-20250315",
"cross-env": "^7.0.3",
"eslint": "^9.22.0",
"eslint-config-next": "15.3.0-canary.15",
"eslint-config-next": "15.3.0-canary.17",
"eslint-config-prettier": "^10.1.1",
"eslint-plugin-css-modules": "^2.12.0",
"eslint-plugin-import": "^2.31.0",
@ -95,7 +94,7 @@
"prettier": "^3.5.3",
"prisma": "^6.5.0",
"schema-dts": "^1.1.5",
"simple-git-hooks": "^2.11.1",
"simple-git-hooks": "^2.12.1",
"stylelint": "^16.16.0",
"stylelint-config-css-modules": "^4.4.0",
"stylelint-config-recommended": "^15.0.0",

219
pnpm-lock.yaml generated
View File

@ -21,14 +21,14 @@ importers:
specifier: ^3.1.0
version: 3.1.0(@types/react@19.0.12)(react@19.0.0)
'@next/bundle-analyzer':
specifier: 15.3.0-canary.15
version: 15.3.0-canary.15
specifier: 15.3.0-canary.17
version: 15.3.0-canary.17
'@next/mdx':
specifier: 15.3.0-canary.15
version: 15.3.0-canary.15(@mdx-js/loader@3.1.0(acorn@8.14.1))(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@19.0.0))
specifier: 15.3.0-canary.17
version: 15.3.0-canary.17(@mdx-js/loader@3.1.0(acorn@8.14.1))(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@19.0.0))
'@next/third-parties':
specifier: 15.3.0-canary.15
version: 15.3.0-canary.15(next@15.3.0-canary.15(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-3229e95-20250315)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)
specifier: 15.3.0-canary.17
version: 15.3.0-canary.17(next@15.3.0-canary.17(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-3229e95-20250315)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)
'@octokit/graphql':
specifier: ^8.2.1
version: 8.2.1
@ -58,7 +58,7 @@ importers:
version: 4.2.2
geist:
specifier: ^1.3.1
version: 1.3.1(next@15.3.0-canary.15(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-3229e95-20250315)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))
version: 1.3.1(next@15.3.0-canary.17(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-3229e95-20250315)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))
html-entities:
specifier: ^2.5.2
version: 2.5.2
@ -69,8 +69,8 @@ importers:
specifier: ^3.0.1
version: 3.0.1
next:
specifier: 15.3.0-canary.15
version: 15.3.0-canary.15(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-3229e95-20250315)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
specifier: 15.3.0-canary.17
version: 15.3.0-canary.17(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-3229e95-20250315)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
obj-str:
specifier: ^1.1.0
version: 1.1.0
@ -95,6 +95,9 @@ importers:
react-is:
specifier: 19.0.0
version: 19.0.0
react-schemaorg:
specifier: ^2.0.0
version: 2.0.0(react@19.0.0)(schema-dts@1.1.5)(typescript@5.8.2)
react-textarea-autosize:
specifier: ^8.5.8
version: 8.5.8(@types/react@19.0.12)(react@19.0.0)
@ -110,15 +113,9 @@ importers:
rehype-pretty-code:
specifier: ^0.14.1
version: 0.14.1(shiki@3.2.1)
rehype-sanitize:
specifier: ^6.0.0
version: 6.0.0
rehype-slug:
specifier: ^6.0.0
version: 6.0.0
rehype-stringify:
specifier: ^10.0.1
version: 10.0.1
rehype-unwrap-images:
specifier: ^1.0.0
version: 1.0.0
@ -128,15 +125,15 @@ importers:
remark-gfm:
specifier: ^4.0.1
version: 4.0.1
remark-html:
specifier: ^16.0.1
version: 16.0.1
remark-mdx-frontmatter:
specifier: ^5.0.0
version: 5.0.0
remark-parse:
specifier: ^11.0.0
version: 11.0.0
remark-rehype:
specifier: ^11.1.1
version: 11.1.1
remark-smartypants:
specifier: ^3.0.2
version: 3.0.2
@ -169,8 +166,8 @@ importers:
specifier: ^2.0.13
version: 2.0.13
'@types/node':
specifier: ^22.13.10
version: 22.13.10
specifier: ^22.13.11
version: 22.13.11
'@types/prop-types':
specifier: ^15.7.14
version: 15.7.14
@ -193,8 +190,8 @@ importers:
specifier: ^9.22.0
version: 9.22.0
eslint-config-next:
specifier: 15.3.0-canary.15
version: 15.3.0-canary.15(eslint@9.22.0)(typescript@5.8.2)
specifier: 15.3.0-canary.17
version: 15.3.0-canary.17(eslint@9.22.0)(typescript@5.8.2)
eslint-config-prettier:
specifier: ^10.1.1
version: 10.1.1(eslint@9.22.0)
@ -235,8 +232,8 @@ importers:
specifier: ^1.1.5
version: 1.1.5
simple-git-hooks:
specifier: ^2.11.1
version: 2.11.1
specifier: ^2.12.1
version: 2.12.1
stylelint:
specifier: ^16.16.0
version: 16.16.0(typescript@5.8.2)
@ -786,17 +783,17 @@ packages:
'@napi-rs/wasm-runtime@0.2.7':
resolution: {integrity: sha512-5yximcFK5FNompXfJFoWanu5l8v1hNGqNHh9du1xETp9HWk/B/PzvchX55WYOPaIeNglG8++68AAiauBAtbnzw==}
'@next/bundle-analyzer@15.3.0-canary.15':
resolution: {integrity: sha512-/4XswHLT9RHMeVVfvp/9uIlglQ/feUM/ySkkBax85NJ4I1EPqwWA940dEvdTeOkFh0MBrdKJwDFZ0bUdrypgRA==}
'@next/bundle-analyzer@15.3.0-canary.17':
resolution: {integrity: sha512-WyOWsIqFVthvkqgxRdli8OqnBz9xTDPhY0YUvBjjtH+52dOPoV6U2B/Cg9tyGe6KM3Nsy3iKZ4KNCCw2G8Bilg==}
'@next/env@15.3.0-canary.15':
resolution: {integrity: sha512-4++Yw9LviRI1jQwA64heWPnu6JZFXit+w4H6RhPO09eiXvGFvM3sQw0nGP3KK8sDe8HS7MnHXewu5VH4q5kq6Q==}
'@next/env@15.3.0-canary.17':
resolution: {integrity: sha512-i6ieFwiZAvPUR0O7ojiUOQzhnxMH1LAjP3bLe8d0DqFKjKLFm3S/WwhVT4bskyFY2oI9FHCp3T1lc+2Ae43j7w==}
'@next/eslint-plugin-next@15.3.0-canary.15':
resolution: {integrity: sha512-tHaX/opETDZtowfbeozhJ15ZQ4ZW2hmqziS1TpCTjlaoaRMV2O3BXa7xxfqPQXRXkSjeHvSQxteoAT6Ww+R1RQ==}
'@next/eslint-plugin-next@15.3.0-canary.17':
resolution: {integrity: sha512-x/1QkV8cYwqVqK715ahnVSkjT6EeBJNc3CSuKiPgG2ucnGfwVbMvSFF3WtqvpgLJW7Kz3xUlgWjakoTLxxUaWA==}
'@next/mdx@15.3.0-canary.15':
resolution: {integrity: sha512-8FnEWwPQKqeONbhGGofB7X0hUgiDXn3nqyp1CTghg6Q7AWRq77RqsSXKQZbzS/v+rmHKRRn34i/yIvetIqxsTA==}
'@next/mdx@15.3.0-canary.17':
resolution: {integrity: sha512-5+T4+9GAI3tUVVfpECGfXgCs8u1O29mx4/2px+Xr2m0qlZP3QG+oB9q7qpLAxIPfzSMkxYSIe62vjHjp1M5Feg==}
peerDependencies:
'@mdx-js/loader': '>=0.15.0'
'@mdx-js/react': '>=0.15.0'
@ -806,56 +803,56 @@ packages:
'@mdx-js/react':
optional: true
'@next/swc-darwin-arm64@15.3.0-canary.15':
resolution: {integrity: sha512-2XwY4L2KFE17AKUXZyyTBifxuqUWRtUhk2IUsjZ9XjLhS/oZ2QGoZid3Hp0CFxKD7/7QU7ent4cK5CuIcY7HYQ==}
'@next/swc-darwin-arm64@15.3.0-canary.17':
resolution: {integrity: sha512-VcnuH8pzj9vT9w700t+fCA4DkF0mEjQdjRfoWbxz5ZLjry4/CcIBhyrsQ0CIIRJ6KeEyX2SQM3enETknUP1y7w==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
'@next/swc-darwin-x64@15.3.0-canary.15':
resolution: {integrity: sha512-GIxcQTVlfql+yF+5y6VZJzHas7Kco/uVOgWvXj2+c0K8TLZndYgF8klg4sYX7bNj0vv7oEdrnCksNm4ijdkrvw==}
'@next/swc-darwin-x64@15.3.0-canary.17':
resolution: {integrity: sha512-K7J7kQOjki9zxaNAdx+lJlc9Ber5ltJGTD5Uvc8sOcOqT8jein+USyoOyBgy4zPqDjubYsytIDG2pJatijSYSg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
'@next/swc-linux-arm64-gnu@15.3.0-canary.15':
resolution: {integrity: sha512-B//o+BQt0riRo6VVRpWLKy8I+dCHIhopmNpUBi6VqHlDeLaLd+TSDbuiPIs0q804bvX+aFltARlRQsnQ8cUiIg==}
'@next/swc-linux-arm64-gnu@15.3.0-canary.17':
resolution: {integrity: sha512-Q3Er1XvvsUmPm5VH9W/59Zxg+HZrQuzDAYWyvKK4jgJBRqy2v2ywejvcPZsYUyJnfrls+DcX8oqR7V+L1i9fmg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
'@next/swc-linux-arm64-musl@15.3.0-canary.15':
resolution: {integrity: sha512-826hx95qA3JO84owyCjkGu+qBc2kqSqlxK3NxYHHwwbVlgBedN+jsW1u/5zKBiJ/W+sTbci2HQPF+F2Fk5JVGg==}
'@next/swc-linux-arm64-musl@15.3.0-canary.17':
resolution: {integrity: sha512-ewJuZxqF49l3qSRiDOZUmK3yw0tS3xZ9F4szEAPa5as1/SH+Mfog6Q9+5mjfBXRJEpP//jXmvLlfbJlnK8Sxpg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
'@next/swc-linux-x64-gnu@15.3.0-canary.15':
resolution: {integrity: sha512-iuprGTpx9ejqat7NywfTeBqX4ilyM1ZiChVFCUvtVXgXFl4npeVjdko28Cp4DqXsaid/AX+SUFwOSUaGmx0oFA==}
'@next/swc-linux-x64-gnu@15.3.0-canary.17':
resolution: {integrity: sha512-aGW3iyeaEUyF3oHZsq92QZ49PTmz7LA+HhkjEPjbGhQXyPRKljnMTjt9ORGvRpre1wDvhEBe+9NOdQvqQV6Qhg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
'@next/swc-linux-x64-musl@15.3.0-canary.15':
resolution: {integrity: sha512-bysxd/stxsk2zS/wNBpRyX9gsutXTKR+WYWJqO+SWedb6Fexn76pUuTgz/UM42Una3K9bUA4B8O5hQYqmAWJbQ==}
'@next/swc-linux-x64-musl@15.3.0-canary.17':
resolution: {integrity: sha512-MEF13N9vDvdZ513Aeecjk/09ewvQN5HaU7bKc4v1CjL+QTJLnr+LkVXWBatMO9hLVvL73VIGJFjXhfwa3YfdBQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
'@next/swc-win32-arm64-msvc@15.3.0-canary.15':
resolution: {integrity: sha512-5I7jL1aFTSwTnitdYn/dMTnrmnZSI41vvKcg4qcQwotRv/H4Ro9+qSISSqXAEimvGwTDUA9d0CN4RkvLsxJriA==}
'@next/swc-win32-arm64-msvc@15.3.0-canary.17':
resolution: {integrity: sha512-QVc6WKSaMO47Vpc7AnYTXGVq4d/OWlAtgzNVNjX0NVlpWKBUUKsQQCGOFJzx2fP4pZwRV9+HC+65FKc3/H+pwA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
'@next/swc-win32-x64-msvc@15.3.0-canary.15':
resolution: {integrity: sha512-t4gUHjefzDlevhPTk1/1s7fi4GiVXAgnF4/FhNQHND1eLLXoj5s8Uud2WLdifDprqSClRi6J3TASLf1fuwWXtA==}
'@next/swc-win32-x64-msvc@15.3.0-canary.17':
resolution: {integrity: sha512-ctmA1bWo/LuA0zP0luoIA1BUNPZmyWWn14nTgI/2Iv6B3CgFJZSWnU3RN8n9RNalX0Pqcfe7jlhBMCExjAOsFA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
'@next/third-parties@15.3.0-canary.15':
resolution: {integrity: sha512-uVfpOd58wKgsTRsEPnQnJflciSbNzBxn5Hr5WBnEs56fsBYQEUtx4hBVVfx9sSd+f2rzVeEXXfdXXDkxuBi3SA==}
'@next/third-parties@15.3.0-canary.17':
resolution: {integrity: sha512-aZhAZJ/tqVeetFI6B4oGy7BdGUJxLHawdxUnv6xqJaAa/dYHzFXSN/rWPxdxhpHLIVVirOg7Sl618TyUL+sWNg==}
peerDependencies:
next: ^13.0.0 || ^14.0.0 || ^15.0.0
react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
@ -1057,8 +1054,8 @@ packages:
'@types/nlcst@2.0.3':
resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==}
'@types/node@22.13.10':
resolution: {integrity: sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==}
'@types/node@22.13.11':
resolution: {integrity: sha512-iEUCUJoU0i3VnrCmgoWCXttklWcvoCIx4jzcP22fioIVSdTmjgoEvmAO/QPw6TcS9k5FrNgn4w7q5lGOd1CT5g==}
'@types/prop-types@15.7.14':
resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==}
@ -1703,8 +1700,8 @@ packages:
resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
engines: {node: '>=12'}
eslint-config-next@15.3.0-canary.15:
resolution: {integrity: sha512-nDZaWC8fCFp8mvVJStc4Ptdv2NotWLnONnn5FJr20razli4CgBH7gtjAdtwNCnqa1bBhz885ji8VMnSgA54yjA==}
eslint-config-next@15.3.0-canary.17:
resolution: {integrity: sha512-vA/gCvVCfGUg28MUfsPL3aMJ+wzK3OXW1zmFRHC7bFLkXjyPL3g6mSCLYAFYXRkXkbl13qmoDIknkL4rQsDzNQ==}
peerDependencies:
eslint: ^7.23.0 || ^8.0.0 || ^9.0.0
typescript: '>=3.3.1'
@ -2811,8 +2808,8 @@ packages:
natural-compare@1.4.0:
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
next@15.3.0-canary.15:
resolution: {integrity: sha512-3RZoMEmMw93FdUSQbfgiYyNKorUDMp6OhAt8HJT2PMA/60goljOlYfEbBUukIJslGadJn5lTGvyLuCFjNDNJYQ==}
next@15.3.0-canary.17:
resolution: {integrity: sha512-uTQPf+80W7n4ZZIStulH2NtXd7fvoWNNbBIXZrnhNXm0BYe9Vhuc2Ov8GS5NezRGZ7ifJdjND9Da+S1u8qdiAw==}
engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
hasBin: true
peerDependencies:
@ -3131,6 +3128,14 @@ packages:
react-promise-suspense@0.3.4:
resolution: {integrity: sha512-I42jl7L3Ze6kZaq+7zXWSunBa3b1on5yfvUW6Eo/3fFOj6dZ5Bqmcd264nJbTK/gn1HjjILAjSwnZbV4RpSaNQ==}
react-schemaorg@2.0.0:
resolution: {integrity: sha512-UqciFKA203ewNjn0zC09uYKuJSvMD8L75L1s/cW4rc7cS64w8l7vaI3SYkuoI/nwCBkJRmOkSJedWDUZBlYZwg==}
engines: {node: '>=12.0.0'}
peerDependencies:
react: '>=16.3.0'
schema-dts: '>=0.7.4'
typescript: '>=3.1.6'
react-textarea-autosize@8.5.8:
resolution: {integrity: sha512-iUiIj70JefrTuSJ4LbVFiSqWiHHss5L63L717bqaWHMgkm9sz6eEvro4vZ3uQfGJbevzwT6rHOszHKA8RkhRMg==}
engines: {node: '>=10'}
@ -3208,15 +3213,9 @@ packages:
rehype-recma@1.0.0:
resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==}
rehype-sanitize@6.0.0:
resolution: {integrity: sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==}
rehype-slug@6.0.0:
resolution: {integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==}
rehype-stringify@10.0.1:
resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==}
rehype-unwrap-images@1.0.0:
resolution: {integrity: sha512-wzW5Mk9IlVF2UwXC5NtIZsx1aHYbV8+bLWjJnlZaaamz5QU52RppWtq1uEZJqGo8d9Y4RuDqidB6r9RFpKugIg==}
@ -3226,6 +3225,9 @@ packages:
remark-gfm@4.0.1:
resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==}
remark-html@16.0.1:
resolution: {integrity: sha512-B9JqA5i0qZe0Nsf49q3OXyGvyXuZFDzAP2iOFLEumymuYJITVpiH1IgsTEwTpdptDmZlMDMWeDmSawdaJIGCXQ==}
remark-mdx-frontmatter@5.0.0:
resolution: {integrity: sha512-kI75pshe27TM71R+0iX7C3p4MbGMdygkvSbrk1WYSar88WAwR2JfQilofcDGgDNFAWUo5IwTPyq9XvGpifTwqQ==}
@ -3393,8 +3395,8 @@ packages:
resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
engines: {node: '>=14'}
simple-git-hooks@2.11.1:
resolution: {integrity: sha512-tgqwPUMDcNDhuf1Xf6KTUsyeqGdgKMhzaH4PAZZuzguOgTl5uuyeYe/8mWgAr6IBxB5V06uqEf6Dy37gIWDtDg==}
simple-git-hooks@2.12.1:
resolution: {integrity: sha512-NB3V4XyCOrWTIhjh85DyEoVlM3adHWwqQXKYHmuegy/108bJPP6YxuPGm4ZKBq1+GVKRbKJuzNY//09cMJYp+A==}
hasBin: true
simple-swizzle@0.2.2:
@ -4391,53 +4393,53 @@ snapshots:
'@tybys/wasm-util': 0.9.0
optional: true
'@next/bundle-analyzer@15.3.0-canary.15':
'@next/bundle-analyzer@15.3.0-canary.17':
dependencies:
webpack-bundle-analyzer: 4.10.1
transitivePeerDependencies:
- bufferutil
- utf-8-validate
'@next/env@15.3.0-canary.15': {}
'@next/env@15.3.0-canary.17': {}
'@next/eslint-plugin-next@15.3.0-canary.15':
'@next/eslint-plugin-next@15.3.0-canary.17':
dependencies:
fast-glob: 3.3.1
'@next/mdx@15.3.0-canary.15(@mdx-js/loader@3.1.0(acorn@8.14.1))(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@19.0.0))':
'@next/mdx@15.3.0-canary.17(@mdx-js/loader@3.1.0(acorn@8.14.1))(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@19.0.0))':
dependencies:
source-map: 0.7.4
optionalDependencies:
'@mdx-js/loader': 3.1.0(acorn@8.14.1)
'@mdx-js/react': 3.1.0(@types/react@19.0.12)(react@19.0.0)
'@next/swc-darwin-arm64@15.3.0-canary.15':
'@next/swc-darwin-arm64@15.3.0-canary.17':
optional: true
'@next/swc-darwin-x64@15.3.0-canary.15':
'@next/swc-darwin-x64@15.3.0-canary.17':
optional: true
'@next/swc-linux-arm64-gnu@15.3.0-canary.15':
'@next/swc-linux-arm64-gnu@15.3.0-canary.17':
optional: true
'@next/swc-linux-arm64-musl@15.3.0-canary.15':
'@next/swc-linux-arm64-musl@15.3.0-canary.17':
optional: true
'@next/swc-linux-x64-gnu@15.3.0-canary.15':
'@next/swc-linux-x64-gnu@15.3.0-canary.17':
optional: true
'@next/swc-linux-x64-musl@15.3.0-canary.15':
'@next/swc-linux-x64-musl@15.3.0-canary.17':
optional: true
'@next/swc-win32-arm64-msvc@15.3.0-canary.15':
'@next/swc-win32-arm64-msvc@15.3.0-canary.17':
optional: true
'@next/swc-win32-x64-msvc@15.3.0-canary.15':
'@next/swc-win32-x64-msvc@15.3.0-canary.17':
optional: true
'@next/third-parties@15.3.0-canary.15(next@15.3.0-canary.15(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-3229e95-20250315)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)':
'@next/third-parties@15.3.0-canary.17(next@15.3.0-canary.17(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-3229e95-20250315)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)':
dependencies:
next: 15.3.0-canary.15(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-3229e95-20250315)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
next: 15.3.0-canary.17(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-3229e95-20250315)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
react: 19.0.0
third-party-capital: 1.0.20
@ -4652,7 +4654,7 @@ snapshots:
'@types/concat-stream@2.0.3':
dependencies:
'@types/node': 22.13.10
'@types/node': 22.13.11
'@types/debug@4.1.12':
dependencies:
@ -4686,7 +4688,7 @@ snapshots:
dependencies:
'@types/unist': 3.0.3
'@types/node@22.13.10':
'@types/node@22.13.11':
dependencies:
undici-types: 6.20.0
@ -5421,9 +5423,9 @@ snapshots:
escape-string-regexp@5.0.0: {}
eslint-config-next@15.3.0-canary.15(eslint@9.22.0)(typescript@5.8.2):
eslint-config-next@15.3.0-canary.17(eslint@9.22.0)(typescript@5.8.2):
dependencies:
'@next/eslint-plugin-next': 15.3.0-canary.15
'@next/eslint-plugin-next': 15.3.0-canary.17
'@rushstack/eslint-patch': 1.11.0
'@typescript-eslint/eslint-plugin': 8.27.0(@typescript-eslint/parser@8.27.0(eslint@9.22.0)(typescript@5.8.2))(eslint@9.22.0)(typescript@5.8.2)
'@typescript-eslint/parser': 8.27.0(eslint@9.22.0)(typescript@5.8.2)
@ -5848,9 +5850,9 @@ snapshots:
functions-have-names@1.2.3: {}
geist@1.3.1(next@15.3.0-canary.15(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-3229e95-20250315)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)):
geist@1.3.1(next@15.3.0-canary.17(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-3229e95-20250315)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)):
dependencies:
next: 15.3.0-canary.15(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-3229e95-20250315)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
next: 15.3.0-canary.17(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-3229e95-20250315)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
gensync@1.0.0-beta.2: {}
@ -6997,9 +6999,9 @@ snapshots:
natural-compare@1.4.0: {}
next@15.3.0-canary.15(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-3229e95-20250315)(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
next@15.3.0-canary.17(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-3229e95-20250315)(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
dependencies:
'@next/env': 15.3.0-canary.15
'@next/env': 15.3.0-canary.17
'@swc/counter': 0.1.3
'@swc/helpers': 0.5.15
busboy: 1.6.0
@ -7009,14 +7011,14 @@ snapshots:
react-dom: 19.0.0(react@19.0.0)
styled-jsx: 5.1.6(@babel/core@7.26.10)(react@19.0.0)
optionalDependencies:
'@next/swc-darwin-arm64': 15.3.0-canary.15
'@next/swc-darwin-x64': 15.3.0-canary.15
'@next/swc-linux-arm64-gnu': 15.3.0-canary.15
'@next/swc-linux-arm64-musl': 15.3.0-canary.15
'@next/swc-linux-x64-gnu': 15.3.0-canary.15
'@next/swc-linux-x64-musl': 15.3.0-canary.15
'@next/swc-win32-arm64-msvc': 15.3.0-canary.15
'@next/swc-win32-x64-msvc': 15.3.0-canary.15
'@next/swc-darwin-arm64': 15.3.0-canary.17
'@next/swc-darwin-x64': 15.3.0-canary.17
'@next/swc-linux-arm64-gnu': 15.3.0-canary.17
'@next/swc-linux-arm64-musl': 15.3.0-canary.17
'@next/swc-linux-x64-gnu': 15.3.0-canary.17
'@next/swc-linux-x64-musl': 15.3.0-canary.17
'@next/swc-win32-arm64-msvc': 15.3.0-canary.17
'@next/swc-win32-x64-msvc': 15.3.0-canary.17
babel-plugin-react-compiler: 19.0.0-beta-3229e95-20250315
sharp: 0.33.5
transitivePeerDependencies:
@ -7327,6 +7329,12 @@ snapshots:
dependencies:
fast-deep-equal: 2.0.1
react-schemaorg@2.0.0(react@19.0.0)(schema-dts@1.1.5)(typescript@5.8.2):
dependencies:
react: 19.0.0
schema-dts: 1.1.5
typescript: 5.8.2
react-textarea-autosize@8.5.8(@types/react@19.0.12)(react@19.0.0):
dependencies:
'@babel/runtime': 7.26.10
@ -7458,11 +7466,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
rehype-sanitize@6.0.0:
dependencies:
'@types/hast': 3.0.4
hast-util-sanitize: 5.0.2
rehype-slug@6.0.0:
dependencies:
'@types/hast': 3.0.4
@ -7471,12 +7474,6 @@ snapshots:
hast-util-to-string: 3.0.1
unist-util-visit: 5.0.0
rehype-stringify@10.0.1:
dependencies:
'@types/hast': 3.0.4
hast-util-to-html: 9.0.5
unified: 11.0.5
rehype-unwrap-images@1.0.0:
dependencies:
'@types/hast': 3.0.4
@ -7504,6 +7501,14 @@ snapshots:
transitivePeerDependencies:
- supports-color
remark-html@16.0.1:
dependencies:
'@types/mdast': 4.0.4
hast-util-sanitize: 5.0.2
hast-util-to-html: 9.0.5
mdast-util-to-hast: 13.2.0
unified: 11.0.5
remark-mdx-frontmatter@5.0.0:
dependencies:
'@types/mdast': 4.0.4
@ -7766,7 +7771,7 @@ snapshots:
signal-exit@4.1.0: {}
simple-git-hooks@2.11.1: {}
simple-git-hooks@2.12.1: {}
simple-swizzle@0.2.2:
dependencies:
@ -8132,7 +8137,7 @@ snapshots:
'@types/concat-stream': 2.0.3
'@types/debug': 4.1.12
'@types/is-empty': 1.2.3
'@types/node': 22.13.10
'@types/node': 22.13.11
'@types/unist': 3.0.3
concat-stream: 2.0.0
debug: 4.4.0

View File

@ -1,19 +1,18 @@
{
"compilerOptions": {
"target": "es5",
"target": "ES2017",
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"noEmit": true,
"incremental": true,
"esModuleInterop": true,
"module": "esnext",
"moduleResolution": "bundler",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
"incremental": true,
"plugins": [
{
"name": "next"