diff --git a/.cursorrules b/.cursorrules deleted file mode 100644 index f56f6448..00000000 --- a/.cursorrules +++ /dev/null @@ -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 diff --git a/app/avatar.jpg b/app/avatar.jpg new file mode 100644 index 00000000..348c275a Binary files /dev/null and b/app/avatar.jpg differ diff --git a/app/layout.tsx b/app/layout.tsx index abe061e0..3cc098cc 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -17,8 +17,6 @@ import "./themes.css"; import styles from "./layout.module.css"; -import ogImage from "./opengraph-image.jpg"; - export const metadata: Metadata = defaultMetadata; const RootLayout = ({ children }: Readonly<{ children: React.ReactNode }>) => { @@ -34,12 +32,7 @@ const RootLayout = ({ children }: Readonly<{ children: React.ReactNode }>) => { "@id": `${BASE_URL}/#person`, name: config.authorName, url: BASE_URL, - image: { - "@type": "ImageObject", - contentUrl: `${BASE_URL}${ogImage.src}`, - width: `${ogImage.width}`, - height: `${ogImage.height}`, - }, + image: [`${BASE_URL}/opengraph-image.jpg`], sameAs: [ `${BASE_URL}`, `https://${config.authorSocial?.mastodon}`, diff --git a/app/notes/[slug]/opengraph-image.tsx b/app/notes/[slug]/opengraph-image.tsx index 07f8540e..bb1c6852 100644 --- a/app/notes/[slug]/opengraph-image.tsx +++ b/app/notes/[slug]/opengraph-image.tsx @@ -42,13 +42,14 @@ const getLocalImage = async (src: string): Promise => { // return the raw image data as a buffer return Uint8Array.from(await readFile(imagePath)).buffer; } 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); + + // fail silently and return a 1x1 transparent gif instead of crashing return NO_IMAGE; } }; -const Image = async ({ params }: { params: Promise<{ slug: string }> }) => { +const OpenGraphImage = async ({ params }: { params: Promise<{ slug: string }> }) => { try { const { slug } = await params; @@ -233,4 +234,4 @@ const Image = async ({ params }: { params: Promise<{ slug: string }> }) => { } }; -export default Image; +export default OpenGraphImage; diff --git a/app/selfie.jpg b/app/selfie.jpg deleted file mode 100644 index 4697bb36..00000000 Binary files a/app/selfie.jpg and /dev/null differ diff --git a/components/Header/Header.tsx b/components/Header/Header.tsx index 46ae5d3a..734a9f8d 100644 --- a/components/Header/Header.tsx +++ b/components/Header/Header.tsx @@ -7,7 +7,7 @@ import type { ComponentPropsWithoutRef } from "react"; import styles from "./Header.module.css"; -import avatarImg from "../../app/selfie.jpg"; +import avatarImg from "../../app/avatar.jpg"; export type HeaderProps = ComponentPropsWithoutRef<"header">; diff --git a/lib/config/constants.ts b/lib/config/constants.ts index c373cf18..65793fb1 100644 --- a/lib/config/constants.ts +++ b/lib/config/constants.ts @@ -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 // 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 export const MAX_WIDTH = 865; diff --git a/package.json b/package.json index 62d74e6f..ff2c67ba 100644 --- a/package.json +++ b/package.json @@ -23,8 +23,8 @@ "@giscus/react": "^3.1.0", "@mdx-js/loader": "^3.1.0", "@mdx-js/react": "^3.1.0", - "@next/bundle-analyzer": "15.3.1-canary.4", - "@next/mdx": "15.3.1-canary.4", + "@next/bundle-analyzer": "15.3.1-canary.5", + "@next/mdx": "15.3.1-canary.5", "@octokit/graphql": "^8.2.2", "@octokit/graphql-schema": "^15.26.0", "@t3-oss/env-nextjs": "^0.12.0", @@ -37,7 +37,7 @@ "geist": "^1.3.1", "html-entities": "^2.6.0", "lucide-react": "0.487.0", - "next": "15.3.1-canary.4", + "next": "15.3.1-canary.5", "polished": "^4.3.1", "prop-types": "^15.8.1", "react": "19.1.0", @@ -74,13 +74,13 @@ "@types/mdx": "^2.0.13", "@types/node": "^22.14.0", "@types/prop-types": "^15.7.14", - "@types/react": "^19.1.0", + "@types/react": "^19.1.1", "@types/react-dom": "^19.1.2", "@types/react-is": "^19.0.0", "babel-plugin-react-compiler": "19.0.0-beta-e993439-20250405", "cross-env": "^7.0.3", "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-plugin-css-modules": "^2.12.0", "eslint-plugin-import": "^2.31.0", @@ -91,7 +91,7 @@ "eslint-plugin-react-compiler": "19.0.0-beta-e993439-20250405", "eslint-plugin-react-hooks": "^5.2.0", "husky": "^9.1.7", - "lint-staged": "^15.5.0", + "lint-staged": "^15.5.1", "prettier": "^3.5.3", "schema-dts": "^1.1.5", "stylelint": "^16.18.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index afe8aade..90ea0dfc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,13 +25,13 @@ importers: version: 3.1.0(acorn@8.14.1) '@mdx-js/react': 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': - specifier: 15.3.1-canary.4 - version: 15.3.1-canary.4 + specifier: 15.3.1-canary.5 + version: 15.3.1-canary.5 '@next/mdx': - specifier: 15.3.1-canary.4 - 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)) + specifier: 15.3.1-canary.5 + 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': specifier: ^8.2.2 version: 8.2.2 @@ -61,7 +61,7 @@ importers: version: 4.2.2 geist: 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: specifier: ^2.6.0 version: 2.6.0 @@ -69,8 +69,8 @@ importers: specifier: 0.487.0 version: 0.487.0(react@19.1.0) next: - specifier: 15.3.1-canary.4 - 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) + specifier: 15.3.1-canary.5 + 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: specifier: ^4.3.1 version: 4.3.1 @@ -88,7 +88,7 @@ importers: version: 19.1.0(react@19.1.0) react-innertext: 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: specifier: 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) react-textarea-autosize: 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: specifier: ^8.0.0 version: 8.0.0(react@19.1.0) @@ -175,11 +175,11 @@ importers: specifier: ^15.7.14 version: 15.7.14 '@types/react': - specifier: ^19.1.0 - version: 19.1.0 + specifier: ^19.1.1 + version: 19.1.1 '@types/react-dom': 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': specifier: ^19.0.0 version: 19.0.0 @@ -193,8 +193,8 @@ importers: specifier: ^9.24.0 version: 9.24.0 eslint-config-next: - specifier: 15.3.1-canary.4 - version: 15.3.1-canary.4(eslint@9.24.0)(typescript@5.8.3) + specifier: 15.3.1-canary.5 + version: 15.3.1-canary.5(eslint@9.24.0)(typescript@5.8.3) eslint-config-prettier: specifier: ^10.1.2 version: 10.1.2(eslint@9.24.0) @@ -226,8 +226,8 @@ importers: specifier: ^9.1.7 version: 9.1.7 lint-staged: - specifier: ^15.5.0 - version: 15.5.0 + specifier: ^15.5.1 + version: 15.5.1 prettier: specifier: ^3.5.3 version: 3.5.3 @@ -648,17 +648,17 @@ packages: '@napi-rs/wasm-runtime@0.2.8': resolution: {integrity: sha512-OBlgKdX7gin7OIq4fadsjpg+cp2ZphvAIKucHsNfTdJiqdOmOEwQd/bHi0VwNrcw5xpBJyUw6cK/QilCqy1BSg==} - '@next/bundle-analyzer@15.3.1-canary.4': - resolution: {integrity: sha512-q0iV+zSn8iyTWexikyO/Jwr/Of5Dc+MYFwJmCz201JcoL0hZsjSdF+Kk+KGf8XyzO7+KYGCPtmcQo7yb/P3EWw==} + '@next/bundle-analyzer@15.3.1-canary.5': + resolution: {integrity: sha512-zEw12HO8APi6FiBFk8PLIaiF15lWxZteo+fEB/uxHlW85VKV6pYjc8lnfzmZ8ErinozawwXXTGkfdywA4tEoGg==} - '@next/env@15.3.1-canary.4': - resolution: {integrity: sha512-Bw464vR3fVUrhHQOh0o0ilXQ6wg6OvsNn3afUTjm1a0n0JmJJ+n9M1041xmBHSBGWUfTe74HepSmy79sF8EDlA==} + '@next/env@15.3.1-canary.5': + resolution: {integrity: sha512-WpDbxklJSIcLoQIoA4IG+9SCkvf0utHigM4Wa2pwepwIORu1aTCSCFCXL5IVKLiA0yFmaBmMmwS4wiTRiy8j/g==} - '@next/eslint-plugin-next@15.3.1-canary.4': - resolution: {integrity: sha512-tnFDX05E25frvKDW3YIQFM2HKjBmeR6jD6dEhc1EiQknVNSc42Qc7XD0ViisYeBMKDvJJksExSLY9NYl4wXamQ==} + '@next/eslint-plugin-next@15.3.1-canary.5': + resolution: {integrity: sha512-nh0ouMASkbrIjAHt63BgOyldN+w0DTQKabr+WB+ZLfKePxWixVmtxPmAyYjeHeoQjPwDQiuf/cZZDMOVhXpstA==} - '@next/mdx@15.3.1-canary.4': - resolution: {integrity: sha512-p6tASLmthIoxLCmkJwCMrSfFGxH4Yn46pNsSV6iOqSOCfMEdErB54Qiik+hkjONze01QoR+0dsXeP0bXQSjdZQ==} + '@next/mdx@15.3.1-canary.5': + resolution: {integrity: sha512-VWK6Q6QtLzRq9D0qZSEIuY2KNalzh5xRuO4VZAVALHVTllAYU6Tl5h+6Rn0PqlWlMQdnpVyPVsK96vtejXGLJw==} peerDependencies: '@mdx-js/loader': '>=0.15.0' '@mdx-js/react': '>=0.15.0' @@ -668,50 +668,50 @@ packages: '@mdx-js/react': optional: true - '@next/swc-darwin-arm64@15.3.1-canary.4': - resolution: {integrity: sha512-ZR497D00W62Tf566uakD+VvA/2Cmagix3suVlB7TxLSPxXFAU5DeGQvaT9jkP+x1lEKggcZ+chI1CB9CcjvlTQ==} + '@next/swc-darwin-arm64@15.3.1-canary.5': + resolution: {integrity: sha512-KrfaIYP5Hk9tfhTkbSiw5x2zgkf8AymXOEmsbTEES5SHJspBQILz2E3+CHcv/nOX1KNtcLIw7CsKQJcjtbMp8A==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.3.1-canary.4': - resolution: {integrity: sha512-dX0X7NG6goshCgbKsSzn6wVzgkRlUqRXMjO9E46B6HqcV/L8l15rMVhWr8zBzDt/7gEmAylnlnML8Zqv9BiF1Q==} + '@next/swc-darwin-x64@15.3.1-canary.5': + resolution: {integrity: sha512-55wC4hK6eETWDLy92z21FUupfZSiLgDpKUmjq3kBcvUVo6g3SBdv6zGuarB7q6zUbSj/uHyfFTJJ0oQDbf/0Qw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.3.1-canary.4': - resolution: {integrity: sha512-ehE8KbvyBa7grVzC+n+L9CHbainjg362coYObhak3Jktnvb0uPf/m2kqgfN3UBzGSAczvcAuEbsLulFifAnFrw==} + '@next/swc-linux-arm64-gnu@15.3.1-canary.5': + resolution: {integrity: sha512-AbWLET944TulFe7gTx8f0bNiCQHm1is+830KtE30dhc1g6wkDVcW3VZUdbzXSlw3UqX9kHw+RWWLCqQ84753Eg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.3.1-canary.4': - resolution: {integrity: sha512-5NBstNVZeRP0OeRQGZqQGmrUdMVsMS556BekDeFqgwMqN/Ibq/EYwMMn1dkP26Dln9qIOj167Mde9CC2c3SQUg==} + '@next/swc-linux-arm64-musl@15.3.1-canary.5': + resolution: {integrity: sha512-STx1PweYLyRCbHr0SAkc1vFfPeWlkv+6oNPP2cqErLb1/XZxAoTbINod+a7mBo+YtsTWaXsOEkIg/+HdfnaZGg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.3.1-canary.4': - resolution: {integrity: sha512-6CVq5yFWj2uZ3VgSl0OcCVVfH+EZhOqDocvCeXRaEvpVWq0s9zXPA6GgZghNY7Z5YSZXkB6z7Qi3xG+hzNLQ0A==} + '@next/swc-linux-x64-gnu@15.3.1-canary.5': + resolution: {integrity: sha512-hebj8KYW/kV/VtVKrblBOY6pcYdSmzaP3PDwN7DZtHi4w0VXzYw+kHrrT8gS5Vdh/tOXVopmczCSzeOZ08fkaQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.3.1-canary.4': - resolution: {integrity: sha512-3AiB/lUOa8QMsUM4KW0IYuMqvvMLQyANb13pGKihemtYUEjPS4/Jf5/vkz0qWF0AOP/1DNECdKpCIenU2C2pIA==} + '@next/swc-linux-x64-musl@15.3.1-canary.5': + resolution: {integrity: sha512-n61Fo2hy/fb2deq8F57S3aBjw83A+d38aHXFAIkagGKrp2p66+8mLJsK4jkIIcdzUDxwcofE/zTpmAZO3gWB4A==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.3.1-canary.4': - resolution: {integrity: sha512-WACNwz1q2DtYqZXj+IjGME3D6XxRkkyuynMyC6d4tH5IahnxiwkJtfaRE1DwWWbVUPQ6TtevSEgCOh3eFk5yFQ==} + '@next/swc-win32-arm64-msvc@15.3.1-canary.5': + resolution: {integrity: sha512-TYoCAjSMgok2sKuewfujwWwETAOdcrKCMBym+06bXG2B4699V8YQAQSNyHgvNWznJn7/cjKa/SnVWcyrbVKfCg==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.3.1-canary.4': - resolution: {integrity: sha512-qbmYHxGD3MaI3OJ0NLRcBhfDoSnkvqqrZNmPIuPSlkOUlj+eIuyGtWMRocaYCGTEvQstlspymIsVzSfiyI+6ng==} + '@next/swc-win32-x64-msvc@15.3.1-canary.5': + resolution: {integrity: sha512-lW6MVQ3kcklXbiN/gHyJXbgihwBI4z+o7clOEv6ghvuMYTB7pgQ4tBKALKadadP8z+klM471+gXnmLKA5L8ObA==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -919,8 +919,8 @@ packages: '@types/react-is@19.0.0': resolution: {integrity: sha512-71dSZeeJ0t3aoPyY9x6i+JNSvg5m9EF2i2OlSZI5QoJuI8Ocgor610i+4A10TQmURR+0vLwcVCEYFpXdzM1Biw==} - '@types/react@19.1.0': - resolution: {integrity: sha512-UaicktuQI+9UKyA4njtDOGBD/67t8YEBt2xdfqu8+gP9hqPUPsiXlNPcpS2gVdjmis5GKPG3fCxbQLVgxsQZ8w==} + '@types/react@19.1.1': + resolution: {integrity: sha512-ePapxDL7qrgqSF67s0h9m412d9DbXyC1n59O2st+9rjuuamWsZuD2w55rqY12CbzsZ7uVXb5Nw0gEp9Z8MMutQ==} '@types/supports-color@8.1.3': resolution: {integrity: sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==} @@ -1560,8 +1560,8 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} - eslint-config-next@15.3.1-canary.4: - resolution: {integrity: sha512-p3T1P38jo07FCliTSl5AajjEN3MtXVwaK5wpAM63Ied3MYafGwL5S1COB8H73loIlW7yN9bVQM82VlHCswQUmg==} + eslint-config-next@15.3.1-canary.5: + resolution: {integrity: sha512-1KKbmoCHauAka8zqRH4lvTMqkPMHP57XkwVnhYSv26yH6c5XjgLQn8IxaE/SB0+P1BzyUsVqi1OLwisk2E0kuw==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 typescript: '>=3.3.1' @@ -2360,8 +2360,8 @@ packages: resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - lint-staged@15.5.0: - resolution: {integrity: sha512-WyCzSbfYGhK7cU+UuDDkzUiytbfbi0ZdPy2orwtM75P3WTtQBzmG40cCxIa8Ii2+XjfxzLH6Be46tUfWS85Xfg==} + lint-staged@15.5.1: + resolution: {integrity: sha512-6m7u8mue4Xn6wK6gZvSCQwBvMBR36xfY24nF5bMTf2MHDYG6S3yhJuOgdYVw99hsjyDt2d4z168b3naI8+NWtQ==} engines: {node: '>=18.12.0'} hasBin: true @@ -2651,8 +2651,8 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - next@15.3.1-canary.4: - resolution: {integrity: sha512-bVUdzmbfd3gEu30Riin463JNwTRbcOY/DlCY/+WhgwUR6Sfu1uJeyl3kGAjw58I+ZoNX2omJVpTd9AMluZ26qA==} + next@15.3.1-canary.5: + resolution: {integrity: sha512-wOhTDbhH3T3tHabR190vbHAZ7D/cGs9TV99ebcNYd54AxYYO1F0Lw29ymPp3rQkCVU6ongfwpC4YHGRJm5fl4g==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -4169,10 +4169,10 @@ snapshots: - acorn - 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: '@types/mdx': 2.0.13 - '@types/react': 19.1.0 + '@types/react': 19.1.1 react: 19.1.0 '@napi-rs/wasm-runtime@0.2.8': @@ -4182,48 +4182,48 @@ snapshots: '@tybys/wasm-util': 0.9.0 optional: true - '@next/bundle-analyzer@15.3.1-canary.4': + '@next/bundle-analyzer@15.3.1-canary.5': dependencies: webpack-bundle-analyzer: 4.10.1 transitivePeerDependencies: - bufferutil - 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: 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: 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.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 - '@next/swc-darwin-x64@15.3.1-canary.4': + '@next/swc-darwin-x64@15.3.1-canary.5': optional: true - '@next/swc-linux-arm64-gnu@15.3.1-canary.4': + '@next/swc-linux-arm64-gnu@15.3.1-canary.5': optional: true - '@next/swc-linux-arm64-musl@15.3.1-canary.4': + '@next/swc-linux-arm64-musl@15.3.1-canary.5': optional: true - '@next/swc-linux-x64-gnu@15.3.1-canary.4': + '@next/swc-linux-x64-gnu@15.3.1-canary.5': optional: true - '@next/swc-linux-x64-musl@15.3.1-canary.4': + '@next/swc-linux-x64-musl@15.3.1-canary.5': optional: true - '@next/swc-win32-arm64-msvc@15.3.1-canary.4': + '@next/swc-win32-arm64-msvc@15.3.1-canary.5': optional: true - '@next/swc-win32-x64-msvc@15.3.1-canary.4': + '@next/swc-win32-x64-msvc@15.3.1-canary.5': optional: true '@nodelib/fs.scandir@2.1.5': @@ -4454,15 +4454,15 @@ snapshots: '@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: - '@types/react': 19.1.0 + '@types/react': 19.1.1 '@types/react-is@19.0.0': dependencies: - '@types/react': 19.1.0 + '@types/react': 19.1.1 - '@types/react@19.1.0': + '@types/react@19.1.1': dependencies: csstype: 3.1.3 @@ -5155,9 +5155,9 @@ snapshots: 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: - '@next/eslint-plugin-next': 15.3.1-canary.4 + '@next/eslint-plugin-next': 15.3.1-canary.5 '@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/parser': 8.29.1(eslint@9.24.0)(typescript@5.8.3) @@ -5576,9 +5576,9 @@ snapshots: 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: - 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: {} @@ -6133,7 +6133,7 @@ snapshots: lines-and-columns@2.0.4: {} - lint-staged@15.5.0: + lint-staged@15.5.1: dependencies: chalk: 5.4.1 commander: 13.1.0 @@ -6709,9 +6709,9 @@ snapshots: 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: - '@next/env': 15.3.1-canary.4 + '@next/env': 15.3.1-canary.5 '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 @@ -6721,14 +6721,14 @@ snapshots: react-dom: 19.1.0(react@19.1.0) styled-jsx: 5.1.6(@babel/core@7.26.10)(react@19.1.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.3.1-canary.4 - '@next/swc-darwin-x64': 15.3.1-canary.4 - '@next/swc-linux-arm64-gnu': 15.3.1-canary.4 - '@next/swc-linux-arm64-musl': 15.3.1-canary.4 - '@next/swc-linux-x64-gnu': 15.3.1-canary.4 - '@next/swc-linux-x64-musl': 15.3.1-canary.4 - '@next/swc-win32-arm64-msvc': 15.3.1-canary.4 - '@next/swc-win32-x64-msvc': 15.3.1-canary.4 + '@next/swc-darwin-arm64': 15.3.1-canary.5 + '@next/swc-darwin-x64': 15.3.1-canary.5 + '@next/swc-linux-arm64-gnu': 15.3.1-canary.5 + '@next/swc-linux-arm64-musl': 15.3.1-canary.5 + '@next/swc-linux-x64-gnu': 15.3.1-canary.5 + '@next/swc-linux-x64-musl': 15.3.1-canary.5 + '@next/swc-win32-arm64-msvc': 15.3.1-canary.5 + '@next/swc-win32-x64-msvc': 15.3.1-canary.5 babel-plugin-react-compiler: 19.0.0-beta-e993439-20250405 sharp: 0.34.1 transitivePeerDependencies: @@ -7014,9 +7014,9 @@ snapshots: react: 19.1.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: - '@types/react': 19.1.0 + '@types/react': 19.1.1 react: 19.1.0 react-is@16.13.1: {} @@ -7038,12 +7038,12 @@ snapshots: schema-dts: 1.1.5 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: '@babel/runtime': 7.27.0 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) + use-composed-ref: 1.4.0(@types/react@19.1.1)(react@19.1.0) + use-latest: 1.3.0(@types/react@19.1.1)(react@19.1.0) transitivePeerDependencies: - '@types/react' @@ -7946,24 +7946,24 @@ snapshots: dependencies: 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: react: 19.1.0 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: react: 19.1.0 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: 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: - '@types/react': 19.1.0 + '@types/react': 19.1.1 use-sync-external-store@1.5.0(react@19.1.0): dependencies: