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

do not double import site-wide opengraph-image.jpg

This commit is contained in:
Jake Jarvis 2025-04-11 14:22:06 -04:00
parent 4cb6ed82ee
commit 0ade75716e
Signed by: jake
SSH Key Fingerprint: SHA256:nCkvAjYA6XaSPUqc4TfbBQTpzr8Xj7ritg/sGInCdkc
9 changed files with 108 additions and 239 deletions

View File

@ -1,125 +0,0 @@
You are an expert full-stack TypeScript developer specializing in modern React applications.
CORE EXPERTISE:
- TypeScript
- Next.js 15 with App Router
- React 19
- Server Components
- Server Actions
- Parallel and Intercepting Routes
- CSS Modules
- Redis for KV storage
- MDX for blog content
- Zod for runtime type validation
CODE ARCHITECTURE:
1. Directory Structure:
/
├── app/ # Next.js App Router pages
├── components/ # Reusable React components
├── contexts/ # React contexts
├── hooks/ # React hooks
├── lib/ # Utility functions
│ ├── config/ # Configuration constants
│ ├── helpers/ # Utility functions
├── notes/ # Blog posts in markdown/MDX format
└── public/ # Static files
2. Component Organization:
- Keep reusable components in ./components/.
- Each component should have its own folder containing a `.tsx` file of the same name (e.g. `ComponentName/ComponentName.tsx`)
- Each of these folders should also have an index.ts file which exports the component for convenience (e.g. `ComponentName/index.tsx` contains `export * from "./ComponentName"` and `export { default } from "./ComponentName"`)
- Implement atomic design principles
CODING STANDARDS:
1. TypeScript:
- Use strict type checking
- Use const assertions for literals
- Implement proper error handling
- Use discriminated unions for complex states
2. React Patterns:
- Follow Next.js App Router conventions
- Default to Server Components
- Use `"use client"` only when necessary
- Implement proper error boundaries
- Use React.Suspense for loading states
3. State Management:
- Use React Server Components for server state
- Implement local state with useState
- Use context sparingly and strategically
4. Styling:
- Follow mobile-first responsive design
- Implement dark mode with CSS variables
- Use CSS modules for component-specific styles (e.g. `import styles from ./ComponentName.module.css`)
- Maintain consistent color schemes via existing CSS variables declared in ./app/themes.css
5. Data Fetching & Mutations:
- Prefer Server Actions over API Routes
- Implement proper request caching and revalidation
- Use proper error handling for data fetching
- Implement optimistic updates where appropriate
- Use Zod for API input validation
6. Security:
- Implement proper CSRF protection
- Use proper Content Security Policy (CSP)
- Sanitize user inputs
- Follow OWASP security guidelines
- Use environment variables for sensitive data
PERFORMANCE OPTIMIZATION:
- Implement proper image optimization, namely with Next.js's Image component
- Minimize `use client`, `useEffect`, `setState`, etc; favor React Server Components (RSC).
- Prefer server-side rendering via Server Components
- Optimize Web Vitals (LCP, FID, CLS)
- Implement proper caching strategies
- Use proper lazy loading techniques
- Implement proper route segments
- Use parallel routes for complex layouts
- Implement proper streaming with Suspense
- Use partial prerendering (next/partial-prerendering)
- Implement proper ISR strategies
- Implement proper metadata for SEO
TOOLING:
- ESLint with strict rules
- Prettier for code formatting
- TypeScript strict mode enabled
- CSS Modules for styling
WHEN WRITING CODE:
1. Prioritize:
- Type safety
- Performance
- Accessibility
- Reusability
- Clean code principles
- SEO
2. Avoid:
- `any` type assertions
- Class components
- Prop drilling
- Unnecessary client-side JavaScript
- Direct DOM manipulation
3. Prefer:
- Arrow function expressions
- Server Components where possible
- CSS variables for theming
- Composition over inheritance
- Early returns for conditionals
- Environment variables for configuration
DOCUMENTATION:
- Document any workarounds or gotchas
ERROR HANDLING:
- Implement proper error boundaries
- Use typed error handling
- Provide meaningful error messages
- Log errors appropriately
- Implement fallback UI states

BIN
app/avatar.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

View File

@ -17,8 +17,6 @@ import "./themes.css";
import styles from "./layout.module.css"; import styles from "./layout.module.css";
import ogImage from "./opengraph-image.jpg";
export const metadata: Metadata = defaultMetadata; export const metadata: Metadata = defaultMetadata;
const RootLayout = ({ children }: Readonly<{ children: React.ReactNode }>) => { const RootLayout = ({ children }: Readonly<{ children: React.ReactNode }>) => {
@ -34,12 +32,7 @@ const RootLayout = ({ children }: Readonly<{ children: React.ReactNode }>) => {
"@id": `${BASE_URL}/#person`, "@id": `${BASE_URL}/#person`,
name: config.authorName, name: config.authorName,
url: BASE_URL, url: BASE_URL,
image: { image: [`${BASE_URL}/opengraph-image.jpg`],
"@type": "ImageObject",
contentUrl: `${BASE_URL}${ogImage.src}`,
width: `${ogImage.width}`,
height: `${ogImage.height}`,
},
sameAs: [ sameAs: [
`${BASE_URL}`, `${BASE_URL}`,
`https://${config.authorSocial?.mastodon}`, `https://${config.authorSocial?.mastodon}`,

View File

@ -42,13 +42,14 @@ const getLocalImage = async (src: string): Promise<ArrayBuffer | string> => {
// return the raw image data as a buffer // return the raw image data as a buffer
return Uint8Array.from(await readFile(imagePath)).buffer; return Uint8Array.from(await readFile(imagePath)).buffer;
} catch (error) { } catch (error) {
// fail silently and return a 1x1 transparent gif instead of crashing
console.error(`[og-image] found "${imagePath}" but couldn't read it:`, error); console.error(`[og-image] found "${imagePath}" but couldn't read it:`, error);
// fail silently and return a 1x1 transparent gif instead of crashing
return NO_IMAGE; return NO_IMAGE;
} }
}; };
const Image = async ({ params }: { params: Promise<{ slug: string }> }) => { const OpenGraphImage = async ({ params }: { params: Promise<{ slug: string }> }) => {
try { try {
const { slug } = await params; const { slug } = await params;
@ -233,4 +234,4 @@ const Image = async ({ params }: { params: Promise<{ slug: string }> }) => {
} }
}; };
export default Image; export default OpenGraphImage;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

View File

@ -7,7 +7,7 @@ import type { ComponentPropsWithoutRef } from "react";
import styles from "./Header.module.css"; import styles from "./Header.module.css";
import avatarImg from "../../app/selfie.jpg"; import avatarImg from "../../app/avatar.jpg";
export type HeaderProps = ComponentPropsWithoutRef<"header">; export type HeaderProps = ComponentPropsWithoutRef<"header">;

View File

@ -3,7 +3,7 @@ export const POSTS_DIR = "notes";
// path to an image used in various places to represent the site, relative to project root // path to an image used in various places to represent the site, relative to project root
// IMPORTANT: must be included in next.config.ts under "outputFileTracingIncludes" // IMPORTANT: must be included in next.config.ts under "outputFileTracingIncludes"
export const AVATAR_PATH = "app/selfie.jpg"; export const AVATAR_PATH = "app/avatar.jpg";
// maximum width of content wrapper (e.g. for images) in pixels // maximum width of content wrapper (e.g. for images) in pixels
export const MAX_WIDTH = 865; export const MAX_WIDTH = 865;

View File

@ -23,8 +23,8 @@
"@giscus/react": "^3.1.0", "@giscus/react": "^3.1.0",
"@mdx-js/loader": "^3.1.0", "@mdx-js/loader": "^3.1.0",
"@mdx-js/react": "^3.1.0", "@mdx-js/react": "^3.1.0",
"@next/bundle-analyzer": "15.3.1-canary.4", "@next/bundle-analyzer": "15.3.1-canary.5",
"@next/mdx": "15.3.1-canary.4", "@next/mdx": "15.3.1-canary.5",
"@octokit/graphql": "^8.2.2", "@octokit/graphql": "^8.2.2",
"@octokit/graphql-schema": "^15.26.0", "@octokit/graphql-schema": "^15.26.0",
"@t3-oss/env-nextjs": "^0.12.0", "@t3-oss/env-nextjs": "^0.12.0",
@ -37,7 +37,7 @@
"geist": "^1.3.1", "geist": "^1.3.1",
"html-entities": "^2.6.0", "html-entities": "^2.6.0",
"lucide-react": "0.487.0", "lucide-react": "0.487.0",
"next": "15.3.1-canary.4", "next": "15.3.1-canary.5",
"polished": "^4.3.1", "polished": "^4.3.1",
"prop-types": "^15.8.1", "prop-types": "^15.8.1",
"react": "19.1.0", "react": "19.1.0",
@ -74,13 +74,13 @@
"@types/mdx": "^2.0.13", "@types/mdx": "^2.0.13",
"@types/node": "^22.14.0", "@types/node": "^22.14.0",
"@types/prop-types": "^15.7.14", "@types/prop-types": "^15.7.14",
"@types/react": "^19.1.0", "@types/react": "^19.1.1",
"@types/react-dom": "^19.1.2", "@types/react-dom": "^19.1.2",
"@types/react-is": "^19.0.0", "@types/react-is": "^19.0.0",
"babel-plugin-react-compiler": "19.0.0-beta-e993439-20250405", "babel-plugin-react-compiler": "19.0.0-beta-e993439-20250405",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"eslint": "^9.24.0", "eslint": "^9.24.0",
"eslint-config-next": "15.3.1-canary.4", "eslint-config-next": "15.3.1-canary.5",
"eslint-config-prettier": "^10.1.2", "eslint-config-prettier": "^10.1.2",
"eslint-plugin-css-modules": "^2.12.0", "eslint-plugin-css-modules": "^2.12.0",
"eslint-plugin-import": "^2.31.0", "eslint-plugin-import": "^2.31.0",
@ -91,7 +91,7 @@
"eslint-plugin-react-compiler": "19.0.0-beta-e993439-20250405", "eslint-plugin-react-compiler": "19.0.0-beta-e993439-20250405",
"eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-hooks": "^5.2.0",
"husky": "^9.1.7", "husky": "^9.1.7",
"lint-staged": "^15.5.0", "lint-staged": "^15.5.1",
"prettier": "^3.5.3", "prettier": "^3.5.3",
"schema-dts": "^1.1.5", "schema-dts": "^1.1.5",
"stylelint": "^16.18.0", "stylelint": "^16.18.0",

190
pnpm-lock.yaml generated
View File

@ -25,13 +25,13 @@ importers:
version: 3.1.0(acorn@8.14.1) version: 3.1.0(acorn@8.14.1)
'@mdx-js/react': '@mdx-js/react':
specifier: ^3.1.0 specifier: ^3.1.0
version: 3.1.0(@types/react@19.1.0)(react@19.1.0) version: 3.1.0(@types/react@19.1.1)(react@19.1.0)
'@next/bundle-analyzer': '@next/bundle-analyzer':
specifier: 15.3.1-canary.4 specifier: 15.3.1-canary.5
version: 15.3.1-canary.4 version: 15.3.1-canary.5
'@next/mdx': '@next/mdx':
specifier: 15.3.1-canary.4 specifier: 15.3.1-canary.5
version: 15.3.1-canary.4(@mdx-js/loader@3.1.0(acorn@8.14.1))(@mdx-js/react@3.1.0(@types/react@19.1.0)(react@19.1.0)) version: 15.3.1-canary.5(@mdx-js/loader@3.1.0(acorn@8.14.1))(@mdx-js/react@3.1.0(@types/react@19.1.1)(react@19.1.0))
'@octokit/graphql': '@octokit/graphql':
specifier: ^8.2.2 specifier: ^8.2.2
version: 8.2.2 version: 8.2.2
@ -61,7 +61,7 @@ importers:
version: 4.2.2 version: 4.2.2
geist: geist:
specifier: ^1.3.1 specifier: ^1.3.1
version: 1.3.1(next@15.3.1-canary.4(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-e993439-20250405)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)) version: 1.3.1(next@15.3.1-canary.5(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-e993439-20250405)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))
html-entities: html-entities:
specifier: ^2.6.0 specifier: ^2.6.0
version: 2.6.0 version: 2.6.0
@ -69,8 +69,8 @@ importers:
specifier: 0.487.0 specifier: 0.487.0
version: 0.487.0(react@19.1.0) version: 0.487.0(react@19.1.0)
next: next:
specifier: 15.3.1-canary.4 specifier: 15.3.1-canary.5
version: 15.3.1-canary.4(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-e993439-20250405)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) version: 15.3.1-canary.5(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-e993439-20250405)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
polished: polished:
specifier: ^4.3.1 specifier: ^4.3.1
version: 4.3.1 version: 4.3.1
@ -88,7 +88,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.1.0)(react@19.1.0) version: 1.1.5(@types/react@19.1.1)(react@19.1.0)
react-is: react-is:
specifier: 19.1.0 specifier: 19.1.0
version: 19.1.0 version: 19.1.0
@ -100,7 +100,7 @@ importers:
version: 2.0.0(react@19.1.0)(schema-dts@1.1.5)(typescript@5.8.3) version: 2.0.0(react@19.1.0)(schema-dts@1.1.5)(typescript@5.8.3)
react-textarea-autosize: react-textarea-autosize:
specifier: ^8.5.9 specifier: ^8.5.9
version: 8.5.9(@types/react@19.1.0)(react@19.1.0) version: 8.5.9(@types/react@19.1.1)(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)
@ -175,11 +175,11 @@ importers:
specifier: ^15.7.14 specifier: ^15.7.14
version: 15.7.14 version: 15.7.14
'@types/react': '@types/react':
specifier: ^19.1.0 specifier: ^19.1.1
version: 19.1.0 version: 19.1.1
'@types/react-dom': '@types/react-dom':
specifier: ^19.1.2 specifier: ^19.1.2
version: 19.1.2(@types/react@19.1.0) version: 19.1.2(@types/react@19.1.1)
'@types/react-is': '@types/react-is':
specifier: ^19.0.0 specifier: ^19.0.0
version: 19.0.0 version: 19.0.0
@ -193,8 +193,8 @@ importers:
specifier: ^9.24.0 specifier: ^9.24.0
version: 9.24.0 version: 9.24.0
eslint-config-next: eslint-config-next:
specifier: 15.3.1-canary.4 specifier: 15.3.1-canary.5
version: 15.3.1-canary.4(eslint@9.24.0)(typescript@5.8.3) version: 15.3.1-canary.5(eslint@9.24.0)(typescript@5.8.3)
eslint-config-prettier: eslint-config-prettier:
specifier: ^10.1.2 specifier: ^10.1.2
version: 10.1.2(eslint@9.24.0) version: 10.1.2(eslint@9.24.0)
@ -226,8 +226,8 @@ importers:
specifier: ^9.1.7 specifier: ^9.1.7
version: 9.1.7 version: 9.1.7
lint-staged: lint-staged:
specifier: ^15.5.0 specifier: ^15.5.1
version: 15.5.0 version: 15.5.1
prettier: prettier:
specifier: ^3.5.3 specifier: ^3.5.3
version: 3.5.3 version: 3.5.3
@ -648,17 +648,17 @@ packages:
'@napi-rs/wasm-runtime@0.2.8': '@napi-rs/wasm-runtime@0.2.8':
resolution: {integrity: sha512-OBlgKdX7gin7OIq4fadsjpg+cp2ZphvAIKucHsNfTdJiqdOmOEwQd/bHi0VwNrcw5xpBJyUw6cK/QilCqy1BSg==} resolution: {integrity: sha512-OBlgKdX7gin7OIq4fadsjpg+cp2ZphvAIKucHsNfTdJiqdOmOEwQd/bHi0VwNrcw5xpBJyUw6cK/QilCqy1BSg==}
'@next/bundle-analyzer@15.3.1-canary.4': '@next/bundle-analyzer@15.3.1-canary.5':
resolution: {integrity: sha512-q0iV+zSn8iyTWexikyO/Jwr/Of5Dc+MYFwJmCz201JcoL0hZsjSdF+Kk+KGf8XyzO7+KYGCPtmcQo7yb/P3EWw==} resolution: {integrity: sha512-zEw12HO8APi6FiBFk8PLIaiF15lWxZteo+fEB/uxHlW85VKV6pYjc8lnfzmZ8ErinozawwXXTGkfdywA4tEoGg==}
'@next/env@15.3.1-canary.4': '@next/env@15.3.1-canary.5':
resolution: {integrity: sha512-Bw464vR3fVUrhHQOh0o0ilXQ6wg6OvsNn3afUTjm1a0n0JmJJ+n9M1041xmBHSBGWUfTe74HepSmy79sF8EDlA==} resolution: {integrity: sha512-WpDbxklJSIcLoQIoA4IG+9SCkvf0utHigM4Wa2pwepwIORu1aTCSCFCXL5IVKLiA0yFmaBmMmwS4wiTRiy8j/g==}
'@next/eslint-plugin-next@15.3.1-canary.4': '@next/eslint-plugin-next@15.3.1-canary.5':
resolution: {integrity: sha512-tnFDX05E25frvKDW3YIQFM2HKjBmeR6jD6dEhc1EiQknVNSc42Qc7XD0ViisYeBMKDvJJksExSLY9NYl4wXamQ==} resolution: {integrity: sha512-nh0ouMASkbrIjAHt63BgOyldN+w0DTQKabr+WB+ZLfKePxWixVmtxPmAyYjeHeoQjPwDQiuf/cZZDMOVhXpstA==}
'@next/mdx@15.3.1-canary.4': '@next/mdx@15.3.1-canary.5':
resolution: {integrity: sha512-p6tASLmthIoxLCmkJwCMrSfFGxH4Yn46pNsSV6iOqSOCfMEdErB54Qiik+hkjONze01QoR+0dsXeP0bXQSjdZQ==} resolution: {integrity: sha512-VWK6Q6QtLzRq9D0qZSEIuY2KNalzh5xRuO4VZAVALHVTllAYU6Tl5h+6Rn0PqlWlMQdnpVyPVsK96vtejXGLJw==}
peerDependencies: peerDependencies:
'@mdx-js/loader': '>=0.15.0' '@mdx-js/loader': '>=0.15.0'
'@mdx-js/react': '>=0.15.0' '@mdx-js/react': '>=0.15.0'
@ -668,50 +668,50 @@ packages:
'@mdx-js/react': '@mdx-js/react':
optional: true optional: true
'@next/swc-darwin-arm64@15.3.1-canary.4': '@next/swc-darwin-arm64@15.3.1-canary.5':
resolution: {integrity: sha512-ZR497D00W62Tf566uakD+VvA/2Cmagix3suVlB7TxLSPxXFAU5DeGQvaT9jkP+x1lEKggcZ+chI1CB9CcjvlTQ==} resolution: {integrity: sha512-KrfaIYP5Hk9tfhTkbSiw5x2zgkf8AymXOEmsbTEES5SHJspBQILz2E3+CHcv/nOX1KNtcLIw7CsKQJcjtbMp8A==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
'@next/swc-darwin-x64@15.3.1-canary.4': '@next/swc-darwin-x64@15.3.1-canary.5':
resolution: {integrity: sha512-dX0X7NG6goshCgbKsSzn6wVzgkRlUqRXMjO9E46B6HqcV/L8l15rMVhWr8zBzDt/7gEmAylnlnML8Zqv9BiF1Q==} resolution: {integrity: sha512-55wC4hK6eETWDLy92z21FUupfZSiLgDpKUmjq3kBcvUVo6g3SBdv6zGuarB7q6zUbSj/uHyfFTJJ0oQDbf/0Qw==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
'@next/swc-linux-arm64-gnu@15.3.1-canary.4': '@next/swc-linux-arm64-gnu@15.3.1-canary.5':
resolution: {integrity: sha512-ehE8KbvyBa7grVzC+n+L9CHbainjg362coYObhak3Jktnvb0uPf/m2kqgfN3UBzGSAczvcAuEbsLulFifAnFrw==} resolution: {integrity: sha512-AbWLET944TulFe7gTx8f0bNiCQHm1is+830KtE30dhc1g6wkDVcW3VZUdbzXSlw3UqX9kHw+RWWLCqQ84753Eg==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
'@next/swc-linux-arm64-musl@15.3.1-canary.4': '@next/swc-linux-arm64-musl@15.3.1-canary.5':
resolution: {integrity: sha512-5NBstNVZeRP0OeRQGZqQGmrUdMVsMS556BekDeFqgwMqN/Ibq/EYwMMn1dkP26Dln9qIOj167Mde9CC2c3SQUg==} resolution: {integrity: sha512-STx1PweYLyRCbHr0SAkc1vFfPeWlkv+6oNPP2cqErLb1/XZxAoTbINod+a7mBo+YtsTWaXsOEkIg/+HdfnaZGg==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
'@next/swc-linux-x64-gnu@15.3.1-canary.4': '@next/swc-linux-x64-gnu@15.3.1-canary.5':
resolution: {integrity: sha512-6CVq5yFWj2uZ3VgSl0OcCVVfH+EZhOqDocvCeXRaEvpVWq0s9zXPA6GgZghNY7Z5YSZXkB6z7Qi3xG+hzNLQ0A==} resolution: {integrity: sha512-hebj8KYW/kV/VtVKrblBOY6pcYdSmzaP3PDwN7DZtHi4w0VXzYw+kHrrT8gS5Vdh/tOXVopmczCSzeOZ08fkaQ==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@next/swc-linux-x64-musl@15.3.1-canary.4': '@next/swc-linux-x64-musl@15.3.1-canary.5':
resolution: {integrity: sha512-3AiB/lUOa8QMsUM4KW0IYuMqvvMLQyANb13pGKihemtYUEjPS4/Jf5/vkz0qWF0AOP/1DNECdKpCIenU2C2pIA==} resolution: {integrity: sha512-n61Fo2hy/fb2deq8F57S3aBjw83A+d38aHXFAIkagGKrp2p66+8mLJsK4jkIIcdzUDxwcofE/zTpmAZO3gWB4A==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@next/swc-win32-arm64-msvc@15.3.1-canary.4': '@next/swc-win32-arm64-msvc@15.3.1-canary.5':
resolution: {integrity: sha512-WACNwz1q2DtYqZXj+IjGME3D6XxRkkyuynMyC6d4tH5IahnxiwkJtfaRE1DwWWbVUPQ6TtevSEgCOh3eFk5yFQ==} resolution: {integrity: sha512-TYoCAjSMgok2sKuewfujwWwETAOdcrKCMBym+06bXG2B4699V8YQAQSNyHgvNWznJn7/cjKa/SnVWcyrbVKfCg==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [win32] os: [win32]
'@next/swc-win32-x64-msvc@15.3.1-canary.4': '@next/swc-win32-x64-msvc@15.3.1-canary.5':
resolution: {integrity: sha512-qbmYHxGD3MaI3OJ0NLRcBhfDoSnkvqqrZNmPIuPSlkOUlj+eIuyGtWMRocaYCGTEvQstlspymIsVzSfiyI+6ng==} resolution: {integrity: sha512-lW6MVQ3kcklXbiN/gHyJXbgihwBI4z+o7clOEv6ghvuMYTB7pgQ4tBKALKadadP8z+klM471+gXnmLKA5L8ObA==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
@ -919,8 +919,8 @@ packages:
'@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.1.0': '@types/react@19.1.1':
resolution: {integrity: sha512-UaicktuQI+9UKyA4njtDOGBD/67t8YEBt2xdfqu8+gP9hqPUPsiXlNPcpS2gVdjmis5GKPG3fCxbQLVgxsQZ8w==} resolution: {integrity: sha512-ePapxDL7qrgqSF67s0h9m412d9DbXyC1n59O2st+9rjuuamWsZuD2w55rqY12CbzsZ7uVXb5Nw0gEp9Z8MMutQ==}
'@types/supports-color@8.1.3': '@types/supports-color@8.1.3':
resolution: {integrity: sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==} resolution: {integrity: sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==}
@ -1560,8 +1560,8 @@ packages:
resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
engines: {node: '>=12'} engines: {node: '>=12'}
eslint-config-next@15.3.1-canary.4: eslint-config-next@15.3.1-canary.5:
resolution: {integrity: sha512-p3T1P38jo07FCliTSl5AajjEN3MtXVwaK5wpAM63Ied3MYafGwL5S1COB8H73loIlW7yN9bVQM82VlHCswQUmg==} resolution: {integrity: sha512-1KKbmoCHauAka8zqRH4lvTMqkPMHP57XkwVnhYSv26yH6c5XjgLQn8IxaE/SB0+P1BzyUsVqi1OLwisk2E0kuw==}
peerDependencies: peerDependencies:
eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 eslint: ^7.23.0 || ^8.0.0 || ^9.0.0
typescript: '>=3.3.1' typescript: '>=3.3.1'
@ -2360,8 +2360,8 @@ packages:
resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
lint-staged@15.5.0: lint-staged@15.5.1:
resolution: {integrity: sha512-WyCzSbfYGhK7cU+UuDDkzUiytbfbi0ZdPy2orwtM75P3WTtQBzmG40cCxIa8Ii2+XjfxzLH6Be46tUfWS85Xfg==} resolution: {integrity: sha512-6m7u8mue4Xn6wK6gZvSCQwBvMBR36xfY24nF5bMTf2MHDYG6S3yhJuOgdYVw99hsjyDt2d4z168b3naI8+NWtQ==}
engines: {node: '>=18.12.0'} engines: {node: '>=18.12.0'}
hasBin: true hasBin: true
@ -2651,8 +2651,8 @@ packages:
natural-compare@1.4.0: natural-compare@1.4.0:
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
next@15.3.1-canary.4: next@15.3.1-canary.5:
resolution: {integrity: sha512-bVUdzmbfd3gEu30Riin463JNwTRbcOY/DlCY/+WhgwUR6Sfu1uJeyl3kGAjw58I+ZoNX2omJVpTd9AMluZ26qA==} resolution: {integrity: sha512-wOhTDbhH3T3tHabR190vbHAZ7D/cGs9TV99ebcNYd54AxYYO1F0Lw29ymPp3rQkCVU6ongfwpC4YHGRJm5fl4g==}
engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
@ -4169,10 +4169,10 @@ snapshots:
- acorn - acorn
- supports-color - supports-color
'@mdx-js/react@3.1.0(@types/react@19.1.0)(react@19.1.0)': '@mdx-js/react@3.1.0(@types/react@19.1.1)(react@19.1.0)':
dependencies: dependencies:
'@types/mdx': 2.0.13 '@types/mdx': 2.0.13
'@types/react': 19.1.0 '@types/react': 19.1.1
react: 19.1.0 react: 19.1.0
'@napi-rs/wasm-runtime@0.2.8': '@napi-rs/wasm-runtime@0.2.8':
@ -4182,48 +4182,48 @@ snapshots:
'@tybys/wasm-util': 0.9.0 '@tybys/wasm-util': 0.9.0
optional: true optional: true
'@next/bundle-analyzer@15.3.1-canary.4': '@next/bundle-analyzer@15.3.1-canary.5':
dependencies: dependencies:
webpack-bundle-analyzer: 4.10.1 webpack-bundle-analyzer: 4.10.1
transitivePeerDependencies: transitivePeerDependencies:
- bufferutil - bufferutil
- utf-8-validate - utf-8-validate
'@next/env@15.3.1-canary.4': {} '@next/env@15.3.1-canary.5': {}
'@next/eslint-plugin-next@15.3.1-canary.4': '@next/eslint-plugin-next@15.3.1-canary.5':
dependencies: dependencies:
fast-glob: 3.3.1 fast-glob: 3.3.1
'@next/mdx@15.3.1-canary.4(@mdx-js/loader@3.1.0(acorn@8.14.1))(@mdx-js/react@3.1.0(@types/react@19.1.0)(react@19.1.0))': '@next/mdx@15.3.1-canary.5(@mdx-js/loader@3.1.0(acorn@8.14.1))(@mdx-js/react@3.1.0(@types/react@19.1.1)(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) '@mdx-js/loader': 3.1.0(acorn@8.14.1)
'@mdx-js/react': 3.1.0(@types/react@19.1.0)(react@19.1.0) '@mdx-js/react': 3.1.0(@types/react@19.1.1)(react@19.1.0)
'@next/swc-darwin-arm64@15.3.1-canary.4': '@next/swc-darwin-arm64@15.3.1-canary.5':
optional: true optional: true
'@next/swc-darwin-x64@15.3.1-canary.4': '@next/swc-darwin-x64@15.3.1-canary.5':
optional: true optional: true
'@next/swc-linux-arm64-gnu@15.3.1-canary.4': '@next/swc-linux-arm64-gnu@15.3.1-canary.5':
optional: true optional: true
'@next/swc-linux-arm64-musl@15.3.1-canary.4': '@next/swc-linux-arm64-musl@15.3.1-canary.5':
optional: true optional: true
'@next/swc-linux-x64-gnu@15.3.1-canary.4': '@next/swc-linux-x64-gnu@15.3.1-canary.5':
optional: true optional: true
'@next/swc-linux-x64-musl@15.3.1-canary.4': '@next/swc-linux-x64-musl@15.3.1-canary.5':
optional: true optional: true
'@next/swc-win32-arm64-msvc@15.3.1-canary.4': '@next/swc-win32-arm64-msvc@15.3.1-canary.5':
optional: true optional: true
'@next/swc-win32-x64-msvc@15.3.1-canary.4': '@next/swc-win32-x64-msvc@15.3.1-canary.5':
optional: true optional: true
'@nodelib/fs.scandir@2.1.5': '@nodelib/fs.scandir@2.1.5':
@ -4454,15 +4454,15 @@ snapshots:
'@types/prop-types@15.7.14': {} '@types/prop-types@15.7.14': {}
'@types/react-dom@19.1.2(@types/react@19.1.0)': '@types/react-dom@19.1.2(@types/react@19.1.1)':
dependencies: dependencies:
'@types/react': 19.1.0 '@types/react': 19.1.1
'@types/react-is@19.0.0': '@types/react-is@19.0.0':
dependencies: dependencies:
'@types/react': 19.1.0 '@types/react': 19.1.1
'@types/react@19.1.0': '@types/react@19.1.1':
dependencies: dependencies:
csstype: 3.1.3 csstype: 3.1.3
@ -5155,9 +5155,9 @@ snapshots:
escape-string-regexp@5.0.0: {} escape-string-regexp@5.0.0: {}
eslint-config-next@15.3.1-canary.4(eslint@9.24.0)(typescript@5.8.3): eslint-config-next@15.3.1-canary.5(eslint@9.24.0)(typescript@5.8.3):
dependencies: dependencies:
'@next/eslint-plugin-next': 15.3.1-canary.4 '@next/eslint-plugin-next': 15.3.1-canary.5
'@rushstack/eslint-patch': 1.11.0 '@rushstack/eslint-patch': 1.11.0
'@typescript-eslint/eslint-plugin': 8.29.1(@typescript-eslint/parser@8.29.1(eslint@9.24.0)(typescript@5.8.3))(eslint@9.24.0)(typescript@5.8.3) '@typescript-eslint/eslint-plugin': 8.29.1(@typescript-eslint/parser@8.29.1(eslint@9.24.0)(typescript@5.8.3))(eslint@9.24.0)(typescript@5.8.3)
'@typescript-eslint/parser': 8.29.1(eslint@9.24.0)(typescript@5.8.3) '@typescript-eslint/parser': 8.29.1(eslint@9.24.0)(typescript@5.8.3)
@ -5576,9 +5576,9 @@ snapshots:
functions-have-names@1.2.3: {} functions-have-names@1.2.3: {}
geist@1.3.1(next@15.3.1-canary.4(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-e993439-20250405)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)): geist@1.3.1(next@15.3.1-canary.5(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-e993439-20250405)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)):
dependencies: dependencies:
next: 15.3.1-canary.4(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-e993439-20250405)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) next: 15.3.1-canary.5(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-e993439-20250405)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
gensync@1.0.0-beta.2: {} gensync@1.0.0-beta.2: {}
@ -6133,7 +6133,7 @@ snapshots:
lines-and-columns@2.0.4: {} lines-and-columns@2.0.4: {}
lint-staged@15.5.0: lint-staged@15.5.1:
dependencies: dependencies:
chalk: 5.4.1 chalk: 5.4.1
commander: 13.1.0 commander: 13.1.0
@ -6709,9 +6709,9 @@ snapshots:
natural-compare@1.4.0: {} natural-compare@1.4.0: {}
next@15.3.1-canary.4(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-e993439-20250405)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): next@15.3.1-canary.5(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-e993439-20250405)(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
dependencies: dependencies:
'@next/env': 15.3.1-canary.4 '@next/env': 15.3.1-canary.5
'@swc/counter': 0.1.3 '@swc/counter': 0.1.3
'@swc/helpers': 0.5.15 '@swc/helpers': 0.5.15
busboy: 1.6.0 busboy: 1.6.0
@ -6721,14 +6721,14 @@ snapshots:
react-dom: 19.1.0(react@19.1.0) react-dom: 19.1.0(react@19.1.0)
styled-jsx: 5.1.6(@babel/core@7.26.10)(react@19.1.0) styled-jsx: 5.1.6(@babel/core@7.26.10)(react@19.1.0)
optionalDependencies: optionalDependencies:
'@next/swc-darwin-arm64': 15.3.1-canary.4 '@next/swc-darwin-arm64': 15.3.1-canary.5
'@next/swc-darwin-x64': 15.3.1-canary.4 '@next/swc-darwin-x64': 15.3.1-canary.5
'@next/swc-linux-arm64-gnu': 15.3.1-canary.4 '@next/swc-linux-arm64-gnu': 15.3.1-canary.5
'@next/swc-linux-arm64-musl': 15.3.1-canary.4 '@next/swc-linux-arm64-musl': 15.3.1-canary.5
'@next/swc-linux-x64-gnu': 15.3.1-canary.4 '@next/swc-linux-x64-gnu': 15.3.1-canary.5
'@next/swc-linux-x64-musl': 15.3.1-canary.4 '@next/swc-linux-x64-musl': 15.3.1-canary.5
'@next/swc-win32-arm64-msvc': 15.3.1-canary.4 '@next/swc-win32-arm64-msvc': 15.3.1-canary.5
'@next/swc-win32-x64-msvc': 15.3.1-canary.4 '@next/swc-win32-x64-msvc': 15.3.1-canary.5
babel-plugin-react-compiler: 19.0.0-beta-e993439-20250405 babel-plugin-react-compiler: 19.0.0-beta-e993439-20250405
sharp: 0.34.1 sharp: 0.34.1
transitivePeerDependencies: transitivePeerDependencies:
@ -7014,9 +7014,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.1.0)(react@19.1.0): react-innertext@1.1.5(@types/react@19.1.1)(react@19.1.0):
dependencies: dependencies:
'@types/react': 19.1.0 '@types/react': 19.1.1
react: 19.1.0 react: 19.1.0
react-is@16.13.1: {} react-is@16.13.1: {}
@ -7038,12 +7038,12 @@ snapshots:
schema-dts: 1.1.5 schema-dts: 1.1.5
typescript: 5.8.3 typescript: 5.8.3
react-textarea-autosize@8.5.9(@types/react@19.1.0)(react@19.1.0): react-textarea-autosize@8.5.9(@types/react@19.1.1)(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.1.0)(react@19.1.0) use-composed-ref: 1.4.0(@types/react@19.1.1)(react@19.1.0)
use-latest: 1.3.0(@types/react@19.1.0)(react@19.1.0) use-latest: 1.3.0(@types/react@19.1.1)(react@19.1.0)
transitivePeerDependencies: transitivePeerDependencies:
- '@types/react' - '@types/react'
@ -7946,24 +7946,24 @@ snapshots:
dependencies: dependencies:
punycode: 2.3.1 punycode: 2.3.1
use-composed-ref@1.4.0(@types/react@19.1.0)(react@19.1.0): use-composed-ref@1.4.0(@types/react@19.1.1)(react@19.1.0):
dependencies: dependencies:
react: 19.1.0 react: 19.1.0
optionalDependencies: optionalDependencies:
'@types/react': 19.1.0 '@types/react': 19.1.1
use-isomorphic-layout-effect@1.2.0(@types/react@19.1.0)(react@19.1.0): use-isomorphic-layout-effect@1.2.0(@types/react@19.1.1)(react@19.1.0):
dependencies: dependencies:
react: 19.1.0 react: 19.1.0
optionalDependencies: optionalDependencies:
'@types/react': 19.1.0 '@types/react': 19.1.1
use-latest@1.3.0(@types/react@19.1.0)(react@19.1.0): use-latest@1.3.0(@types/react@19.1.1)(react@19.1.0):
dependencies: dependencies:
react: 19.1.0 react: 19.1.0
use-isomorphic-layout-effect: 1.2.0(@types/react@19.1.0)(react@19.1.0) use-isomorphic-layout-effect: 1.2.0(@types/react@19.1.1)(react@19.1.0)
optionalDependencies: optionalDependencies:
'@types/react': 19.1.0 '@types/react': 19.1.1
use-sync-external-store@1.5.0(react@19.1.0): use-sync-external-store@1.5.0(react@19.1.0):
dependencies: dependencies: