diff --git a/examples/vercel-blog-starter/.gitignore b/examples/vercel-blog-starter/.gitignore
new file mode 100644
index 0000000..fd3dbb5
--- /dev/null
+++ b/examples/vercel-blog-starter/.gitignore
@@ -0,0 +1,36 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+/node_modules
+/.pnp
+.pnp.js
+.yarn/install-state.gz
+
+# testing
+/coverage
+
+# next.js
+/.next/
+/out/
+
+# production
+/build
+
+# misc
+.DS_Store
+*.pem
+
+# debug
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# local env files
+.env*.local
+
+# vercel
+.vercel
+
+# typescript
+*.tsbuildinfo
+next-env.d.ts
diff --git a/examples/vercel-blog-starter/README.md b/examples/vercel-blog-starter/README.md
new file mode 100644
index 0000000..0d8003c
--- /dev/null
+++ b/examples/vercel-blog-starter/README.md
@@ -0,0 +1,63 @@
+# A statically generated blog example using Next.js, Markdown, and TypeScript
+
+This is the existing [blog-starter](https://github.com/vercel/next.js/tree/canary/examples/blog-starter) plus TypeScript.
+
+This example showcases Next.js's [Static Generation](https://nextjs.org/docs/app/building-your-application/routing/layouts-and-templates) feature using Markdown files as the data source.
+
+The blog posts are stored in `/_posts` as Markdown files with front matter support. Adding a new Markdown file in there will create a new blog post.
+
+To create the blog posts we use [`remark`](https://github.com/remarkjs/remark) and [`remark-html`](https://github.com/remarkjs/remark-html) to convert the Markdown files into an HTML string, and then send it down as a prop to the page. The metadata of every post is handled by [`gray-matter`](https://github.com/jonschlinkert/gray-matter) and also sent in props to the page.
+
+## Demo
+
+[https://next-blog-starter.vercel.app/](https://next-blog-starter.vercel.app/)
+
+## Deploy your own
+
+Deploy the example using [Vercel](https://vercel.com?utm_source=github&utm_medium=readme&utm_campaign=next-example) or preview live with [StackBlitz](https://stackblitz.com/github/vercel/next.js/tree/canary/examples/blog-starter)
+
+[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/vercel/next.js/tree/canary/examples/blog-starter&project-name=blog-starter&repository-name=blog-starter)
+
+### Related examples
+
+- [WordPress](/examples/cms-wordpress)
+- [DatoCMS](/examples/cms-datocms)
+- [Sanity](/examples/cms-sanity)
+- [TakeShape](/examples/cms-takeshape)
+- [Prismic](/examples/cms-prismic)
+- [Contentful](/examples/cms-contentful)
+- [Strapi](/examples/cms-strapi)
+- [Agility CMS](/examples/cms-agilitycms)
+- [Cosmic](/examples/cms-cosmic)
+- [ButterCMS](/examples/cms-buttercms)
+- [Storyblok](/examples/cms-storyblok)
+- [GraphCMS](/examples/cms-graphcms)
+- [Kontent](/examples/cms-kontent)
+- [Umbraco Heartcore](/examples/cms-umbraco-heartcore)
+- [Builder.io](/examples/cms-builder-io)
+- [TinaCMS](/examples/cms-tina/)
+- [Enterspeed](/examples/cms-enterspeed)
+
+## How to use
+
+Execute [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app) with [npm](https://docs.npmjs.com/cli/init), [Yarn](https://yarnpkg.com/lang/en/docs/cli/create/), or [pnpm](https://pnpm.io) to bootstrap the example:
+
+```bash
+npx create-next-app --example blog-starter blog-starter-app
+```
+
+```bash
+yarn create next-app --example blog-starter blog-starter-app
+```
+
+```bash
+pnpm create next-app --example blog-starter blog-starter-app
+```
+
+Your blog should be up and running on [http://localhost:3000](http://localhost:3000)! If it doesn't work, post on [GitHub discussions](https://github.com/vercel/next.js/discussions).
+
+Deploy it to the cloud with [Vercel](https://vercel.com/new?utm_source=github&utm_medium=readme&utm_campaign=next-example) ([Documentation](https://nextjs.org/docs/deployment)).
+
+# Notes
+
+`blog-starter` uses [Tailwind CSS](https://tailwindcss.com) [(v3.0)](https://tailwindcss.com/blog/tailwindcss-v3).
diff --git a/examples/vercel-blog-starter/_posts/dynamic-routing.md b/examples/vercel-blog-starter/_posts/dynamic-routing.md
new file mode 100644
index 0000000..44b0b31
--- /dev/null
+++ b/examples/vercel-blog-starter/_posts/dynamic-routing.md
@@ -0,0 +1,19 @@
+---
+title: "Dynamic Routing and Static Generation"
+excerpt: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Praesent elementum facilisis leo vel fringilla est ullamcorper eget. At imperdiet dui accumsan sit amet nulla facilities morbi tempus."
+coverImage: "/assets/blog/dynamic-routing/cover.jpg"
+date: "2020-03-16T05:35:07.322Z"
+author:
+ name: JJ Kasper
+ picture: "/assets/blog/authors/jj.jpeg"
+ogImage:
+ url: "/assets/blog/dynamic-routing/cover.jpg"
+---
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Praesent elementum facilisis leo vel fringilla est ullamcorper eget. At imperdiet dui accumsan sit amet nulla facilities morbi tempus. Praesent elementum facilisis leo vel fringilla. Congue mauris rhoncus aenean vel. Egestas sed tempus urna et pharetra pharetra massa massa ultricies.
+
+Venenatis cras sed felis eget velit. Consectetur libero id faucibus nisl tincidunt. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Volutpat consequat mauris nunc congue nisi vitae. Id aliquet risus feugiat in ante metus dictum at tempor. Sed blandit libero volutpat sed cras. Sed odio morbi quis commodo odio aenean sed adipiscing. Velit euismod in pellentesque massa placerat. Mi bibendum neque egestas congue quisque egestas diam in arcu. Nisi lacus sed viverra tellus in. Nibh cras pulvinar mattis nunc sed. Luctus accumsan tortor posuere ac ut consequat semper viverra. Fringilla ut morbi tincidunt augue interdum velit euismod.
+
+## Lorem Ipsum
+
+Tristique senectus et netus et malesuada fames ac turpis. Ridiculous mus mauris vitae ultricies leo integer malesuada nunc vel. In mollis nunc sed id semper. Egestas tellus rutrum tellus pellentesque. Phasellus vestibulum lorem sed risus ultricies tristique nulla. Quis blandit turpis cursus in hac habitasse platea dictumst quisque. Eros donec ac odio tempor orci dapibus ultrices. Aliquam sem et tortor consequat id porta nibh. Adipiscing elit duis tristique sollicitudin nibh sit amet commodo nulla. Diam vulputate ut pharetra sit amet. Ut tellus elementum sagittis vitae et leo. Arcu non odio euismod lacinia at quis risus sed vulputate.
diff --git a/examples/vercel-blog-starter/_posts/hello-world.md b/examples/vercel-blog-starter/_posts/hello-world.md
new file mode 100644
index 0000000..e3fe9fe
--- /dev/null
+++ b/examples/vercel-blog-starter/_posts/hello-world.md
@@ -0,0 +1,19 @@
+---
+title: "Learn How to Pre-render Pages Using Static Generation with Next.js"
+excerpt: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Praesent elementum facilisis leo vel fringilla est ullamcorper eget. At imperdiet dui accumsan sit amet nulla facilities morbi tempus."
+coverImage: "/assets/blog/hello-world/cover.jpg"
+date: "2020-03-16T05:35:07.322Z"
+author:
+ name: Tim Neutkens
+ picture: "/assets/blog/authors/tim.jpeg"
+ogImage:
+ url: "/assets/blog/hello-world/cover.jpg"
+---
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Praesent elementum facilisis leo vel fringilla est ullamcorper eget. At imperdiet dui accumsan sit amet nulla facilities morbi tempus. Praesent elementum facilisis leo vel fringilla. Congue mauris rhoncus aenean vel. Egestas sed tempus urna et pharetra pharetra massa massa ultricies.
+
+Venenatis cras sed felis eget velit. Consectetur libero id faucibus nisl tincidunt. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Volutpat consequat mauris nunc congue nisi vitae. Id aliquet risus feugiat in ante metus dictum at tempor. Sed blandit libero volutpat sed cras. Sed odio morbi quis commodo odio aenean sed adipiscing. Velit euismod in pellentesque massa placerat. Mi bibendum neque egestas congue quisque egestas diam in arcu. Nisi lacus sed viverra tellus in. Nibh cras pulvinar mattis nunc sed. Luctus accumsan tortor posuere ac ut consequat semper viverra. Fringilla ut morbi tincidunt augue interdum velit euismod.
+
+## Lorem Ipsum
+
+Tristique senectus et netus et malesuada fames ac turpis. Ridiculous mus mauris vitae ultricies leo integer malesuada nunc vel. In mollis nunc sed id semper. Egestas tellus rutrum tellus pellentesque. Phasellus vestibulum lorem sed risus ultricies tristique nulla. Quis blandit turpis cursus in hac habitasse platea dictumst quisque. Eros donec ac odio tempor orci dapibus ultrices. Aliquam sem et tortor consequat id porta nibh. Adipiscing elit duis tristique sollicitudin nibh sit amet commodo nulla. Diam vulputate ut pharetra sit amet. Ut tellus elementum sagittis vitae et leo. Arcu non odio euismod lacinia at quis risus sed vulputate.
diff --git a/examples/vercel-blog-starter/_posts/preview.md b/examples/vercel-blog-starter/_posts/preview.md
new file mode 100644
index 0000000..588bf9d
--- /dev/null
+++ b/examples/vercel-blog-starter/_posts/preview.md
@@ -0,0 +1,19 @@
+---
+title: "Preview Mode for Static Generation"
+excerpt: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Praesent elementum facilisis leo vel fringilla est ullamcorper eget. At imperdiet dui accumsan sit amet nulla facilities morbi tempus."
+coverImage: "/assets/blog/preview/cover.jpg"
+date: "2020-03-16T05:35:07.322Z"
+author:
+ name: Joe Haddad
+ picture: "/assets/blog/authors/joe.jpeg"
+ogImage:
+ url: "/assets/blog/preview/cover.jpg"
+---
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Praesent elementum facilisis leo vel fringilla est ullamcorper eget. At imperdiet dui accumsan sit amet nulla facilities morbi tempus. Praesent elementum facilisis leo vel fringilla. Congue mauris rhoncus aenean vel. Egestas sed tempus urna et pharetra pharetra massa massa ultricies.
+
+Venenatis cras sed felis eget velit. Consectetur libero id faucibus nisl tincidunt. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Volutpat consequat mauris nunc congue nisi vitae. Id aliquet risus feugiat in ante metus dictum at tempor. Sed blandit libero volutpat sed cras. Sed odio morbi quis commodo odio aenean sed adipiscing. Velit euismod in pellentesque massa placerat. Mi bibendum neque egestas congue quisque egestas diam in arcu. Nisi lacus sed viverra tellus in. Nibh cras pulvinar mattis nunc sed. Luctus accumsan tortor posuere ac ut consequat semper viverra. Fringilla ut morbi tincidunt augue interdum velit euismod.
+
+## Lorem Ipsum
+
+Tristique senectus et netus et malesuada fames ac turpis. Ridiculous mus mauris vitae ultricies leo integer malesuada nunc vel. In mollis nunc sed id semper. Egestas tellus rutrum tellus pellentesque. Phasellus vestibulum lorem sed risus ultricies tristique nulla. Quis blandit turpis cursus in hac habitasse platea dictumst quisque. Eros donec ac odio tempor orci dapibus ultrices. Aliquam sem et tortor consequat id porta nibh. Adipiscing elit duis tristique sollicitudin nibh sit amet commodo nulla. Diam vulputate ut pharetra sit amet. Ut tellus elementum sagittis vitae et leo. Arcu non odio euismod lacinia at quis risus sed vulputate.
diff --git a/examples/vercel-blog-starter/package.json b/examples/vercel-blog-starter/package.json
new file mode 100644
index 0000000..8293f65
--- /dev/null
+++ b/examples/vercel-blog-starter/package.json
@@ -0,0 +1,27 @@
+{
+ "private": true,
+ "scripts": {
+ "dev": "next",
+ "build": "next build",
+ "start": "next start"
+ },
+ "dependencies": {
+ "classnames": "^2.5.1",
+ "date-fns": "^3.6.0",
+ "gray-matter": "^4.0.3",
+ "next": "latest",
+ "react": "^18.3.1",
+ "react-dom": "^18.3.1",
+ "remark": "^15.0.1",
+ "remark-html": "^16.0.1"
+ },
+ "devDependencies": {
+ "@types/node": "^20.14.8",
+ "@types/react": "^18.3.3",
+ "@types/react-dom": "^18.3.0",
+ "autoprefixer": "^10.4.19",
+ "postcss": "^8.4.38",
+ "tailwindcss": "^3.4.4",
+ "typescript": "^5.5.2"
+ }
+}
diff --git a/examples/vercel-blog-starter/postcss.config.js b/examples/vercel-blog-starter/postcss.config.js
new file mode 100644
index 0000000..12a703d
--- /dev/null
+++ b/examples/vercel-blog-starter/postcss.config.js
@@ -0,0 +1,6 @@
+module.exports = {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+};
diff --git a/examples/vercel-blog-starter/public/assets/blog/authors/jj.jpeg b/examples/vercel-blog-starter/public/assets/blog/authors/jj.jpeg
new file mode 100644
index 0000000..e3d5214
Binary files /dev/null and b/examples/vercel-blog-starter/public/assets/blog/authors/jj.jpeg differ
diff --git a/examples/vercel-blog-starter/public/assets/blog/authors/joe.jpeg b/examples/vercel-blog-starter/public/assets/blog/authors/joe.jpeg
new file mode 100644
index 0000000..d9677ad
Binary files /dev/null and b/examples/vercel-blog-starter/public/assets/blog/authors/joe.jpeg differ
diff --git a/examples/vercel-blog-starter/public/assets/blog/authors/tim.jpeg b/examples/vercel-blog-starter/public/assets/blog/authors/tim.jpeg
new file mode 100644
index 0000000..cc49257
Binary files /dev/null and b/examples/vercel-blog-starter/public/assets/blog/authors/tim.jpeg differ
diff --git a/examples/vercel-blog-starter/public/assets/blog/dynamic-routing/cover.jpg b/examples/vercel-blog-starter/public/assets/blog/dynamic-routing/cover.jpg
new file mode 100644
index 0000000..c660c92
Binary files /dev/null and b/examples/vercel-blog-starter/public/assets/blog/dynamic-routing/cover.jpg differ
diff --git a/examples/vercel-blog-starter/public/assets/blog/hello-world/cover.jpg b/examples/vercel-blog-starter/public/assets/blog/hello-world/cover.jpg
new file mode 100644
index 0000000..33b7dc4
Binary files /dev/null and b/examples/vercel-blog-starter/public/assets/blog/hello-world/cover.jpg differ
diff --git a/examples/vercel-blog-starter/public/assets/blog/preview/cover.jpg b/examples/vercel-blog-starter/public/assets/blog/preview/cover.jpg
new file mode 100644
index 0000000..6a975fb
Binary files /dev/null and b/examples/vercel-blog-starter/public/assets/blog/preview/cover.jpg differ
diff --git a/examples/vercel-blog-starter/public/favicon/android-chrome-192x192.png b/examples/vercel-blog-starter/public/favicon/android-chrome-192x192.png
new file mode 100644
index 0000000..2f07282
Binary files /dev/null and b/examples/vercel-blog-starter/public/favicon/android-chrome-192x192.png differ
diff --git a/examples/vercel-blog-starter/public/favicon/android-chrome-512x512.png b/examples/vercel-blog-starter/public/favicon/android-chrome-512x512.png
new file mode 100644
index 0000000..dbb0fae
Binary files /dev/null and b/examples/vercel-blog-starter/public/favicon/android-chrome-512x512.png differ
diff --git a/examples/vercel-blog-starter/public/favicon/apple-touch-icon.png b/examples/vercel-blog-starter/public/favicon/apple-touch-icon.png
new file mode 100644
index 0000000..8f4033b
Binary files /dev/null and b/examples/vercel-blog-starter/public/favicon/apple-touch-icon.png differ
diff --git a/examples/vercel-blog-starter/public/favicon/browserconfig.xml b/examples/vercel-blog-starter/public/favicon/browserconfig.xml
new file mode 100644
index 0000000..9824d87
--- /dev/null
+++ b/examples/vercel-blog-starter/public/favicon/browserconfig.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+ #000000
+
+
+
diff --git a/examples/vercel-blog-starter/public/favicon/favicon-16x16.png b/examples/vercel-blog-starter/public/favicon/favicon-16x16.png
new file mode 100644
index 0000000..29deaf6
Binary files /dev/null and b/examples/vercel-blog-starter/public/favicon/favicon-16x16.png differ
diff --git a/examples/vercel-blog-starter/public/favicon/favicon-32x32.png b/examples/vercel-blog-starter/public/favicon/favicon-32x32.png
new file mode 100644
index 0000000..e3b4277
Binary files /dev/null and b/examples/vercel-blog-starter/public/favicon/favicon-32x32.png differ
diff --git a/examples/vercel-blog-starter/public/favicon/favicon.ico b/examples/vercel-blog-starter/public/favicon/favicon.ico
new file mode 100644
index 0000000..ea2f437
Binary files /dev/null and b/examples/vercel-blog-starter/public/favicon/favicon.ico differ
diff --git a/examples/vercel-blog-starter/public/favicon/mstile-150x150.png b/examples/vercel-blog-starter/public/favicon/mstile-150x150.png
new file mode 100644
index 0000000..f2dfd90
Binary files /dev/null and b/examples/vercel-blog-starter/public/favicon/mstile-150x150.png differ
diff --git a/examples/vercel-blog-starter/public/favicon/safari-pinned-tab.svg b/examples/vercel-blog-starter/public/favicon/safari-pinned-tab.svg
new file mode 100644
index 0000000..72ab6e0
--- /dev/null
+++ b/examples/vercel-blog-starter/public/favicon/safari-pinned-tab.svg
@@ -0,0 +1,33 @@
+
+
+
+
+Created by potrace 1.11, written by Peter Selinger 2001-2013
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/vercel-blog-starter/public/favicon/site.webmanifest b/examples/vercel-blog-starter/public/favicon/site.webmanifest
new file mode 100644
index 0000000..a672d9a
--- /dev/null
+++ b/examples/vercel-blog-starter/public/favicon/site.webmanifest
@@ -0,0 +1,19 @@
+{
+ "name": "Next.js",
+ "short_name": "Next.js",
+ "icons": [
+ {
+ "src": "/favicons/android-chrome-192x192.png",
+ "sizes": "192x192",
+ "type": "image/png"
+ },
+ {
+ "src": "/favicons/android-chrome-512x512.png",
+ "sizes": "512x512",
+ "type": "image/png"
+ }
+ ],
+ "theme_color": "#000000",
+ "background_color": "#000000",
+ "display": "standalone"
+}
diff --git a/examples/vercel-blog-starter/src/app/_components/alert.tsx b/examples/vercel-blog-starter/src/app/_components/alert.tsx
new file mode 100644
index 0000000..d758ba0
--- /dev/null
+++ b/examples/vercel-blog-starter/src/app/_components/alert.tsx
@@ -0,0 +1,48 @@
+import Container from "@/app/_components/container";
+import { EXAMPLE_PATH } from "@/lib/constants";
+import cn from "classnames";
+
+type Props = {
+ preview?: boolean;
+};
+
+const Alert = ({ preview }: Props) => {
+ return (
+
+
+
+ {preview ? (
+ <>
+ This page is a preview.{" "}
+
+ Click here
+ {" "}
+ to exit preview mode.
+ >
+ ) : (
+ <>
+ The source code for this blog is{" "}
+
+ available on GitHub
+
+ .
+ >
+ )}
+
+
+
+ );
+};
+
+export default Alert;
diff --git a/examples/vercel-blog-starter/src/app/_components/avatar.tsx b/examples/vercel-blog-starter/src/app/_components/avatar.tsx
new file mode 100644
index 0000000..9c2ea4d
--- /dev/null
+++ b/examples/vercel-blog-starter/src/app/_components/avatar.tsx
@@ -0,0 +1,15 @@
+type Props = {
+ name: string;
+ picture: string;
+};
+
+const Avatar = ({ name, picture }: Props) => {
+ return (
+
+
+
{name}
+
+ );
+};
+
+export default Avatar;
diff --git a/examples/vercel-blog-starter/src/app/_components/container.tsx b/examples/vercel-blog-starter/src/app/_components/container.tsx
new file mode 100644
index 0000000..17458eb
--- /dev/null
+++ b/examples/vercel-blog-starter/src/app/_components/container.tsx
@@ -0,0 +1,9 @@
+type Props = {
+ children?: React.ReactNode;
+};
+
+const Container = ({ children }: Props) => {
+ return {children}
;
+};
+
+export default Container;
diff --git a/examples/vercel-blog-starter/src/app/_components/cover-image.tsx b/examples/vercel-blog-starter/src/app/_components/cover-image.tsx
new file mode 100644
index 0000000..dc1c092
--- /dev/null
+++ b/examples/vercel-blog-starter/src/app/_components/cover-image.tsx
@@ -0,0 +1,36 @@
+import cn from "classnames";
+import Link from "next/link";
+import Image from "next/image";
+
+type Props = {
+ title: string;
+ src: string;
+ slug?: string;
+};
+
+const CoverImage = ({ title, src, slug }: Props) => {
+ const image = (
+
+ );
+ return (
+
+ {slug ? (
+
+ {image}
+
+ ) : (
+ image
+ )}
+
+ );
+};
+
+export default CoverImage;
diff --git a/examples/vercel-blog-starter/src/app/_components/date-formatter.tsx b/examples/vercel-blog-starter/src/app/_components/date-formatter.tsx
new file mode 100644
index 0000000..b092f5e
--- /dev/null
+++ b/examples/vercel-blog-starter/src/app/_components/date-formatter.tsx
@@ -0,0 +1,12 @@
+import { parseISO, format } from "date-fns";
+
+type Props = {
+ dateString: string;
+};
+
+const DateFormatter = ({ dateString }: Props) => {
+ const date = parseISO(dateString);
+ return {format(date, "LLLL d, yyyy")} ;
+};
+
+export default DateFormatter;
diff --git a/examples/vercel-blog-starter/src/app/_components/footer.tsx b/examples/vercel-blog-starter/src/app/_components/footer.tsx
new file mode 100644
index 0000000..c764a82
--- /dev/null
+++ b/examples/vercel-blog-starter/src/app/_components/footer.tsx
@@ -0,0 +1,32 @@
+import Container from "@/app/_components/container";
+import { EXAMPLE_PATH } from "@/lib/constants";
+
+export function Footer() {
+ return (
+
+
+
+
+ Statically Generated with Next.js.
+
+
+
+
+
+ );
+}
+
+export default Footer;
diff --git a/examples/vercel-blog-starter/src/app/_components/header.tsx b/examples/vercel-blog-starter/src/app/_components/header.tsx
new file mode 100644
index 0000000..0aa782e
--- /dev/null
+++ b/examples/vercel-blog-starter/src/app/_components/header.tsx
@@ -0,0 +1,14 @@
+import Link from "next/link";
+
+const Header = () => {
+ return (
+
+
+ Blog
+
+ .
+
+ );
+};
+
+export default Header;
diff --git a/examples/vercel-blog-starter/src/app/_components/hero-post.tsx b/examples/vercel-blog-starter/src/app/_components/hero-post.tsx
new file mode 100644
index 0000000..0eef0d0
--- /dev/null
+++ b/examples/vercel-blog-starter/src/app/_components/hero-post.tsx
@@ -0,0 +1,47 @@
+import Avatar from "@/app/_components/avatar";
+import CoverImage from "@/app/_components/cover-image";
+import { type Author } from "@/interfaces/author";
+import Link from "next/link";
+import DateFormatter from "./date-formatter";
+
+type Props = {
+ title: string;
+ coverImage: string;
+ date: string;
+ excerpt: string;
+ author: Author;
+ slug: string;
+};
+
+export function HeroPost({
+ title,
+ coverImage,
+ date,
+ excerpt,
+ author,
+ slug,
+}: Props) {
+ return (
+
+
+
+
+
+
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/examples/vercel-blog-starter/src/app/_components/intro.tsx b/examples/vercel-blog-starter/src/app/_components/intro.tsx
new file mode 100644
index 0000000..1364d14
--- /dev/null
+++ b/examples/vercel-blog-starter/src/app/_components/intro.tsx
@@ -0,0 +1,21 @@
+import { CMS_NAME } from "@/lib/constants";
+
+export function Intro() {
+ return (
+
+
+ Blog.
+
+
+ A statically generated blog example using{" "}
+
+ Next.js
+ {" "}
+ and {CMS_NAME}.
+
+
+ );
+}
diff --git a/examples/vercel-blog-starter/src/app/_components/markdown-styles.module.css b/examples/vercel-blog-starter/src/app/_components/markdown-styles.module.css
new file mode 100644
index 0000000..95d4f8b
--- /dev/null
+++ b/examples/vercel-blog-starter/src/app/_components/markdown-styles.module.css
@@ -0,0 +1,18 @@
+.markdown {
+ @apply text-lg leading-relaxed;
+}
+
+.markdown p,
+.markdown ul,
+.markdown ol,
+.markdown blockquote {
+ @apply my-6;
+}
+
+.markdown h2 {
+ @apply text-3xl mt-12 mb-4 leading-snug;
+}
+
+.markdown h3 {
+ @apply text-2xl mt-8 mb-4 leading-snug;
+}
diff --git a/examples/vercel-blog-starter/src/app/_components/more-stories.tsx b/examples/vercel-blog-starter/src/app/_components/more-stories.tsx
new file mode 100644
index 0000000..17191da
--- /dev/null
+++ b/examples/vercel-blog-starter/src/app/_components/more-stories.tsx
@@ -0,0 +1,29 @@
+import { Post } from "@/interfaces/post";
+import { PostPreview } from "./post-preview";
+
+type Props = {
+ posts: Post[];
+};
+
+export function MoreStories({ posts }: Props) {
+ return (
+
+
+ More Stories
+
+
+ {posts.map((post) => (
+
+ ))}
+
+
+ );
+}
diff --git a/examples/vercel-blog-starter/src/app/_components/post-body.tsx b/examples/vercel-blog-starter/src/app/_components/post-body.tsx
new file mode 100644
index 0000000..065883c
--- /dev/null
+++ b/examples/vercel-blog-starter/src/app/_components/post-body.tsx
@@ -0,0 +1,16 @@
+import markdownStyles from "./markdown-styles.module.css";
+
+type Props = {
+ content: string;
+};
+
+export function PostBody({ content }: Props) {
+ return (
+
+ );
+}
diff --git a/examples/vercel-blog-starter/src/app/_components/post-header.tsx b/examples/vercel-blog-starter/src/app/_components/post-header.tsx
new file mode 100644
index 0000000..f377766
--- /dev/null
+++ b/examples/vercel-blog-starter/src/app/_components/post-header.tsx
@@ -0,0 +1,34 @@
+import Avatar from "./avatar";
+import CoverImage from "./cover-image";
+import DateFormatter from "./date-formatter";
+import { PostTitle } from "@/app/_components/post-title";
+import { type Author } from "@/interfaces/author";
+
+type Props = {
+ title: string;
+ coverImage: string;
+ date: string;
+ author: Author;
+};
+
+export function PostHeader({ title, coverImage, date, author }: Props) {
+ return (
+ <>
+ {title}
+
+
+
+
+
+ >
+ );
+}
diff --git a/examples/vercel-blog-starter/src/app/_components/post-preview.tsx b/examples/vercel-blog-starter/src/app/_components/post-preview.tsx
new file mode 100644
index 0000000..07415d1
--- /dev/null
+++ b/examples/vercel-blog-starter/src/app/_components/post-preview.tsx
@@ -0,0 +1,41 @@
+import { type Author } from "@/interfaces/author";
+import Link from "next/link";
+import Avatar from "./avatar";
+import CoverImage from "./cover-image";
+import DateFormatter from "./date-formatter";
+
+type Props = {
+ title: string;
+ coverImage: string;
+ date: string;
+ excerpt: string;
+ author: Author;
+ slug: string;
+};
+
+export function PostPreview({
+ title,
+ coverImage,
+ date,
+ excerpt,
+ author,
+ slug,
+}: Props) {
+ return (
+
+
+
+
+
+
+ {title}
+
+
+
+
+
+
{excerpt}
+
+
+ );
+}
diff --git a/examples/vercel-blog-starter/src/app/_components/post-title.tsx b/examples/vercel-blog-starter/src/app/_components/post-title.tsx
new file mode 100644
index 0000000..5d2dc0b
--- /dev/null
+++ b/examples/vercel-blog-starter/src/app/_components/post-title.tsx
@@ -0,0 +1,13 @@
+import { ReactNode } from "react";
+
+type Props = {
+ children?: ReactNode;
+};
+
+export function PostTitle({ children }: Props) {
+ return (
+
+ {children}
+
+ );
+}
diff --git a/examples/vercel-blog-starter/src/app/_components/section-separator.tsx b/examples/vercel-blog-starter/src/app/_components/section-separator.tsx
new file mode 100644
index 0000000..62412c0
--- /dev/null
+++ b/examples/vercel-blog-starter/src/app/_components/section-separator.tsx
@@ -0,0 +1,3 @@
+export function SectionSeparator() {
+ return ;
+}
diff --git a/examples/vercel-blog-starter/src/app/_components/switch.module.css b/examples/vercel-blog-starter/src/app/_components/switch.module.css
new file mode 100644
index 0000000..9ab3692
--- /dev/null
+++ b/examples/vercel-blog-starter/src/app/_components/switch.module.css
@@ -0,0 +1,56 @@
+.switch {
+ all: unset;
+ position: absolute;
+ right: 20px;
+ top: 70px;
+ display: inline-block;
+ color: currentColor;
+ border-radius: 50%;
+ border: 1px dashed currentColor;
+ cursor: pointer;
+ --size: 24px;
+ height: var(--size);
+ width: var(--size);
+ transition: all 0.3s ease-in-out 0s !important;
+}
+
+[data-mode="system"] .switch::after {
+ position: absolute;
+ height: 100%;
+ width: 100%;
+ top: 0;
+ left: 0;
+ font-weight: 600;
+ font-size: calc(var(--size) / 2);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ content: "A";
+}
+
+[data-mode="light"] .switch {
+ box-shadow: 0 0 50px 10px yellow;
+ background-color: yellow;
+ border: 1px solid orangered;
+}
+
+[data-mode="dark"] .switch {
+ box-shadow: calc(var(--size) / 4) calc(var(--size) / -4) calc(var(--size) / 8)
+ inset #fff;
+ border: none;
+ background: transparent;
+ animation: n linear 0.5s;
+}
+
+@keyframes n {
+ 40% {
+ transform: rotate(-15deg);
+ }
+ 80% {
+ transform: rotate(10deg);
+ }
+ 0%,
+ 100% {
+ transform: rotate(0deg);
+ }
+}
diff --git a/examples/vercel-blog-starter/src/app/_components/theme-switcher.tsx b/examples/vercel-blog-starter/src/app/_components/theme-switcher.tsx
new file mode 100644
index 0000000..2b5ee30
--- /dev/null
+++ b/examples/vercel-blog-starter/src/app/_components/theme-switcher.tsx
@@ -0,0 +1,113 @@
+"use client";
+
+import styles from "./switch.module.css";
+import { memo, useEffect, useState } from "react";
+
+declare global {
+ var updateDOM: () => void;
+}
+
+type ColorSchemePreference = "system" | "dark" | "light";
+
+const STORAGE_KEY = "nextjs-blog-starter-theme";
+const modes: ColorSchemePreference[] = ["system", "dark", "light"];
+
+/** to reuse updateDOM function defined inside injected script */
+
+/** function to be injected in script tag for avoiding FOUC (Flash of Unstyled Content) */
+export const NoFOUCScript = (storageKey: string) => {
+ /* can not use outside constants or function as this script will be injected in a different context */
+ const [SYSTEM, DARK, LIGHT] = ["system", "dark", "light"];
+
+ /** Modify transition globally to avoid patched transitions */
+ const modifyTransition = () => {
+ const css = document.createElement("style");
+ css.textContent = "*,*:after,*:before{transition:none !important;}";
+ document.head.appendChild(css);
+
+ return () => {
+ /* Force restyle */
+ getComputedStyle(document.body);
+ /* Wait for next tick before removing */
+ setTimeout(() => document.head.removeChild(css), 1);
+ };
+ };
+
+ const media = matchMedia(`(prefers-color-scheme: ${DARK})`);
+
+ /** function to add remove dark class */
+ window.updateDOM = () => {
+ const restoreTransitions = modifyTransition();
+ const mode = localStorage.getItem(storageKey) ?? SYSTEM;
+ const systemMode = media.matches ? DARK : LIGHT;
+ const resolvedMode = mode === SYSTEM ? systemMode : mode;
+ const classList = document.documentElement.classList;
+ if (resolvedMode === DARK) classList.add(DARK);
+ else classList.remove(DARK);
+ document.documentElement.setAttribute("data-mode", mode);
+ restoreTransitions();
+ };
+ window.updateDOM();
+ media.addEventListener("change", window.updateDOM);
+};
+
+let updateDOM: () => void;
+
+/**
+ * Switch button to quickly toggle user preference.
+ */
+const Switch = () => {
+ const [mode, setMode] = useState(
+ () =>
+ ((typeof localStorage !== "undefined" &&
+ localStorage.getItem(STORAGE_KEY)) ??
+ "system") as ColorSchemePreference,
+ );
+
+ useEffect(() => {
+ // store global functions to local variables to avoid any interference
+ updateDOM = window.updateDOM;
+ /** Sync the tabs */
+ addEventListener("storage", (e: StorageEvent): void => {
+ e.key === STORAGE_KEY && setMode(e.newValue as ColorSchemePreference);
+ });
+ }, []);
+
+ useEffect(() => {
+ localStorage.setItem(STORAGE_KEY, mode);
+ updateDOM();
+ }, [mode]);
+
+ /** toggle mode */
+ const handleModeSwitch = () => {
+ const index = modes.indexOf(mode);
+ setMode(modes[(index + 1) % modes.length]);
+ };
+ return (
+
+ );
+};
+
+const Script = memo(() => (
+
+));
+
+/**
+ * This component wich applies classes and transitions.
+ */
+export const ThemeSwitcher = () => {
+ return (
+ <>
+
+
+ >
+ );
+};
diff --git a/examples/vercel-blog-starter/src/app/globals.css b/examples/vercel-blog-starter/src/app/globals.css
new file mode 100644
index 0000000..b5c61c9
--- /dev/null
+++ b/examples/vercel-blog-starter/src/app/globals.css
@@ -0,0 +1,3 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
diff --git a/examples/vercel-blog-starter/src/app/layout.tsx b/examples/vercel-blog-starter/src/app/layout.tsx
new file mode 100644
index 0000000..4cc72a3
--- /dev/null
+++ b/examples/vercel-blog-starter/src/app/layout.tsx
@@ -0,0 +1,69 @@
+import Footer from "@/app/_components/footer";
+import { CMS_NAME, HOME_OG_IMAGE_URL } from "@/lib/constants";
+import type { Metadata } from "next";
+import { Inter } from "next/font/google";
+import cn from "classnames";
+import { ThemeSwitcher } from "./_components/theme-switcher";
+
+import "./globals.css";
+
+const inter = Inter({ subsets: ["latin"] });
+
+export const metadata: Metadata = {
+ title: `Next.js Blog Example with ${CMS_NAME}`,
+ description: `A statically generated blog example using Next.js and ${CMS_NAME}.`,
+ openGraph: {
+ images: [HOME_OG_IMAGE_URL],
+ },
+};
+
+export default function RootLayout({
+ children,
+}: Readonly<{
+ children: React.ReactNode;
+}>) {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {children}
+
+
+
+ );
+}
diff --git a/examples/vercel-blog-starter/src/app/page.tsx b/examples/vercel-blog-starter/src/app/page.tsx
new file mode 100644
index 0000000..c9cc301
--- /dev/null
+++ b/examples/vercel-blog-starter/src/app/page.tsx
@@ -0,0 +1,30 @@
+import Container from "@/app/_components/container";
+import { HeroPost } from "@/app/_components/hero-post";
+import { Intro } from "@/app/_components/intro";
+import { MoreStories } from "@/app/_components/more-stories";
+import { getAllPosts } from "@/lib/api";
+
+export default function Index() {
+ const allPosts = getAllPosts();
+
+ const heroPost = allPosts[0];
+
+ const morePosts = allPosts.slice(1);
+
+ return (
+
+
+
+
+ {morePosts.length > 0 && }
+
+
+ );
+}
diff --git a/examples/vercel-blog-starter/src/app/posts/[slug]/page.tsx b/examples/vercel-blog-starter/src/app/posts/[slug]/page.tsx
new file mode 100644
index 0000000..8159fda
--- /dev/null
+++ b/examples/vercel-blog-starter/src/app/posts/[slug]/page.tsx
@@ -0,0 +1,70 @@
+import { Metadata } from "next";
+import { notFound } from "next/navigation";
+import { getAllPosts, getPostBySlug } from "@/lib/api";
+import { CMS_NAME } from "@/lib/constants";
+import markdownToHtml from "@/lib/markdownToHtml";
+import Alert from "@/app/_components/alert";
+import Container from "@/app/_components/container";
+import Header from "@/app/_components/header";
+import { PostBody } from "@/app/_components/post-body";
+import { PostHeader } from "@/app/_components/post-header";
+
+export default async function Post({ params }: Params) {
+ const post = getPostBySlug(params.slug);
+
+ if (!post) {
+ return notFound();
+ }
+
+ const content = await markdownToHtml(post.content || "");
+
+ return (
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+type Params = {
+ params: {
+ slug: string;
+ };
+};
+
+export function generateMetadata({ params }: Params): Metadata {
+ const post = getPostBySlug(params.slug);
+
+ if (!post) {
+ return notFound();
+ }
+
+ const title = `${post.title} | Next.js Blog Example with ${CMS_NAME}`;
+
+ return {
+ title,
+ openGraph: {
+ title,
+ images: [post.ogImage.url],
+ },
+ };
+}
+
+export async function generateStaticParams() {
+ const posts = getAllPosts();
+
+ return posts.map((post) => ({
+ slug: post.slug,
+ }));
+}
diff --git a/examples/vercel-blog-starter/src/interfaces/author.ts b/examples/vercel-blog-starter/src/interfaces/author.ts
new file mode 100644
index 0000000..352ff4c
--- /dev/null
+++ b/examples/vercel-blog-starter/src/interfaces/author.ts
@@ -0,0 +1,4 @@
+export type Author = {
+ name: string;
+ picture: string;
+};
diff --git a/examples/vercel-blog-starter/src/interfaces/post.ts b/examples/vercel-blog-starter/src/interfaces/post.ts
new file mode 100644
index 0000000..e2da990
--- /dev/null
+++ b/examples/vercel-blog-starter/src/interfaces/post.ts
@@ -0,0 +1,15 @@
+import { type Author } from "./author";
+
+export type Post = {
+ slug: string;
+ title: string;
+ date: string;
+ coverImage: string;
+ author: Author;
+ excerpt: string;
+ ogImage: {
+ url: string;
+ };
+ content: string;
+ preview?: boolean;
+};
diff --git a/examples/vercel-blog-starter/src/lib/api.ts b/examples/vercel-blog-starter/src/lib/api.ts
new file mode 100644
index 0000000..c4a8183
--- /dev/null
+++ b/examples/vercel-blog-starter/src/lib/api.ts
@@ -0,0 +1,28 @@
+import { Post } from "@/interfaces/post";
+import fs from "fs";
+import matter from "gray-matter";
+import { join } from "path";
+
+const postsDirectory = join(process.cwd(), "_posts");
+
+export function getPostSlugs() {
+ return fs.readdirSync(postsDirectory);
+}
+
+export function getPostBySlug(slug: string) {
+ const realSlug = slug.replace(/\.md$/, "");
+ const fullPath = join(postsDirectory, `${realSlug}.md`);
+ const fileContents = fs.readFileSync(fullPath, "utf8");
+ const { data, content } = matter(fileContents);
+
+ return { ...data, slug: realSlug, content } as Post;
+}
+
+export function getAllPosts(): Post[] {
+ const slugs = getPostSlugs();
+ const posts = slugs
+ .map((slug) => getPostBySlug(slug))
+ // sort posts by date in descending order
+ .sort((post1, post2) => (post1.date > post2.date ? -1 : 1));
+ return posts;
+}
diff --git a/examples/vercel-blog-starter/src/lib/constants.ts b/examples/vercel-blog-starter/src/lib/constants.ts
new file mode 100644
index 0000000..8f89c20
--- /dev/null
+++ b/examples/vercel-blog-starter/src/lib/constants.ts
@@ -0,0 +1,4 @@
+export const EXAMPLE_PATH = "blog-starter";
+export const CMS_NAME = "Markdown";
+export const HOME_OG_IMAGE_URL =
+ "https://og-image.vercel.app/Next.js%20Blog%20Starter%20Example.png?theme=light&md=1&fontSize=100px&images=https%3A%2F%2Fassets.vercel.com%2Fimage%2Fupload%2Ffront%2Fassets%2Fdesign%2Fnextjs-black-logo.svg";
diff --git a/examples/vercel-blog-starter/src/lib/markdownToHtml.ts b/examples/vercel-blog-starter/src/lib/markdownToHtml.ts
new file mode 100644
index 0000000..51e3169
--- /dev/null
+++ b/examples/vercel-blog-starter/src/lib/markdownToHtml.ts
@@ -0,0 +1,7 @@
+import { remark } from "remark";
+import html from "remark-html";
+
+export default async function markdownToHtml(markdown: string) {
+ const result = await remark().use(html).process(markdown);
+ return result.toString();
+}
diff --git a/examples/vercel-blog-starter/tailwind.config.ts b/examples/vercel-blog-starter/tailwind.config.ts
new file mode 100644
index 0000000..9ce8a94
--- /dev/null
+++ b/examples/vercel-blog-starter/tailwind.config.ts
@@ -0,0 +1,44 @@
+import type { Config } from "tailwindcss";
+
+const config: Config = {
+ darkMode: "class",
+ content: [
+ "./src/pages/**/*.{js,ts,jsx,tsx,mdx}",
+ "./src/components/**/*.{js,ts,jsx,tsx,mdx}",
+ "./src/app/**/*.{js,ts,jsx,tsx,mdx}",
+ ],
+ theme: {
+ extend: {
+ backgroundImage: {
+ "gradient-radial": "radial-gradient(var(--tw-gradient-stops))",
+ "gradient-conic":
+ "conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))",
+ },
+ colors: {
+ "accent-1": "#FAFAFA",
+ "accent-2": "#EAEAEA",
+ "accent-7": "#333",
+ success: "#0070f3",
+ cyan: "#79FFE1",
+ },
+ spacing: {
+ 28: "7rem",
+ },
+ letterSpacing: {
+ tighter: "-.04em",
+ },
+ fontSize: {
+ "5xl": "2.5rem",
+ "6xl": "2.75rem",
+ "7xl": "4.5rem",
+ "8xl": "6.25rem",
+ },
+ boxShadow: {
+ sm: "0 5px 10px rgba(0, 0, 0, 0.12)",
+ md: "0 8px 30px rgba(0, 0, 0, 0.12)",
+ },
+ },
+ },
+ plugins: [],
+};
+export default config;
diff --git a/examples/vercel-blog-starter/tsconfig.json b/examples/vercel-blog-starter/tsconfig.json
new file mode 100644
index 0000000..7b28589
--- /dev/null
+++ b/examples/vercel-blog-starter/tsconfig.json
@@ -0,0 +1,26 @@
+{
+ "compilerOptions": {
+ "lib": ["dom", "dom.iterable", "esnext"],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "strict": true,
+ "noEmit": true,
+ "esModuleInterop": true,
+ "module": "esnext",
+ "moduleResolution": "bundler",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "jsx": "preserve",
+ "incremental": true,
+ "plugins": [
+ {
+ "name": "next"
+ }
+ ],
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ },
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
+ "exclude": ["node_modules"]
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index de23c79..645897c 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -161,6 +161,55 @@ importers:
specifier: 'catalog:'
version: 3.78.10(@cloudflare/workers-types@4.20240925.0)
+ examples/vercel-blog-starter:
+ dependencies:
+ classnames:
+ specifier: ^2.5.1
+ version: 2.5.1
+ date-fns:
+ specifier: ^3.6.0
+ version: 3.6.0
+ gray-matter:
+ specifier: ^4.0.3
+ version: 4.0.3
+ next:
+ specifier: latest
+ version: 14.2.15(@playwright/test@1.47.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react:
+ specifier: ^18.3.1
+ version: 18.3.1
+ react-dom:
+ specifier: ^18.3.1
+ version: 18.3.1(react@18.3.1)
+ remark:
+ specifier: ^15.0.1
+ version: 15.0.1
+ remark-html:
+ specifier: ^16.0.1
+ version: 16.0.1
+ devDependencies:
+ '@types/node':
+ specifier: ^20.14.8
+ version: 20.14.12
+ '@types/react':
+ specifier: ^18.3.3
+ version: 18.3.3
+ '@types/react-dom':
+ specifier: ^18.3.0
+ version: 18.3.0
+ autoprefixer:
+ specifier: ^10.4.19
+ version: 10.4.20(postcss@8.4.47)
+ postcss:
+ specifier: ^8.4.38
+ version: 8.4.47
+ tailwindcss:
+ specifier: ^3.4.4
+ version: 3.4.11
+ typescript:
+ specifier: ^5.5.2
+ version: 5.5.4
+
examples/vercel-commerce:
dependencies:
'@headlessui/react':
@@ -1071,6 +1120,9 @@ packages:
'@next/env@14.2.11':
resolution: {integrity: sha512-HYsQRSIXwiNqvzzYThrBwq6RhXo3E0n8j8nQnAs8i4fCEo2Zf/3eS0IiRA8XnRg9Ha0YnpkyJZIZg1qEwemrHw==}
+ '@next/env@14.2.15':
+ resolution: {integrity: sha512-S1qaj25Wru2dUpcIZMjxeMVSwkt8BK4dmWHHiBuRstcIyOsMapqT4A4jSB6onvqeygkSSmOkyny9VVx8JIGamQ==}
+
'@next/env@15.0.0-canary.113':
resolution: {integrity: sha512-hiD7ux+YPCUJi3up0dHnROYBYg/AuPErOcBBzjCkKQ1q4ufuUNBQms4oDeOiHG9+Qga8mN5+k2L5qm7rNhzU4g==}
@@ -1083,6 +1135,12 @@ packages:
cpu: [arm64]
os: [darwin]
+ '@next/swc-darwin-arm64@14.2.15':
+ resolution: {integrity: sha512-Rvh7KU9hOUBnZ9TJ28n2Oa7dD9cvDBKua9IKx7cfQQ0GoYUwg9ig31O2oMwH3wm+pE3IkAQ67ZobPfEgurPZIA==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [darwin]
+
'@next/swc-darwin-arm64@15.0.0-canary.113':
resolution: {integrity: sha512-F1/UV3uubIn+g8blrMr5cYvGmYR8C54jySjHGDL3NvMfLKnakhSTWsoNT/WcGOtaWd4XihxQ5QpkFckL8zfyfw==}
engines: {node: '>= 10'}
@@ -1095,6 +1153,12 @@ packages:
cpu: [x64]
os: [darwin]
+ '@next/swc-darwin-x64@14.2.15':
+ resolution: {integrity: sha512-5TGyjFcf8ampZP3e+FyCax5zFVHi+Oe7sZyaKOngsqyaNEpOgkKB3sqmymkZfowy3ufGA/tUgDPPxpQx931lHg==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [darwin]
+
'@next/swc-darwin-x64@15.0.0-canary.113':
resolution: {integrity: sha512-8DPhB8y/+F9aoFl59b8OJs0K516mzDaCXzQ0Oc3iFMmcljeWh5KpVLGZUwtxLcQs5fYOEKiU5kO0LvQwuTC/Mg==}
engines: {node: '>= 10'}
@@ -1107,6 +1171,12 @@ packages:
cpu: [arm64]
os: [linux]
+ '@next/swc-linux-arm64-gnu@14.2.15':
+ resolution: {integrity: sha512-3Bwv4oc08ONiQ3FiOLKT72Q+ndEMyLNsc/D3qnLMbtUYTQAmkx9E/JRu0DBpHxNddBmNT5hxz1mYBphJ3mfrrw==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+
'@next/swc-linux-arm64-gnu@15.0.0-canary.113':
resolution: {integrity: sha512-WQJMkp9YhzjF5qEQVcHovqyeumOoQhyj6KUrAg9iOjTHqY/w5F1et6+n0A7c/PqQC+pZLvOkN+8c0bpnCk8enw==}
engines: {node: '>= 10'}
@@ -1119,6 +1189,12 @@ packages:
cpu: [arm64]
os: [linux]
+ '@next/swc-linux-arm64-musl@14.2.15':
+ resolution: {integrity: sha512-k5xf/tg1FBv/M4CMd8S+JL3uV9BnnRmoe7F+GWC3DxkTCD9aewFRH1s5rJ1zkzDa+Do4zyN8qD0N8c84Hu96FQ==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+
'@next/swc-linux-arm64-musl@15.0.0-canary.113':
resolution: {integrity: sha512-qp9fCL3Nd05yE/HJuMBQxAXrUwfQXSIBql7/tuTUhNJOaOPXloifZJRAY6FoAkezrNUkkekAoU10E65KnvoQaQ==}
engines: {node: '>= 10'}
@@ -1131,6 +1207,12 @@ packages:
cpu: [x64]
os: [linux]
+ '@next/swc-linux-x64-gnu@14.2.15':
+ resolution: {integrity: sha512-kE6q38hbrRbKEkkVn62reLXhThLRh6/TvgSP56GkFNhU22TbIrQDEMrO7j0IcQHcew2wfykq8lZyHFabz0oBrA==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+
'@next/swc-linux-x64-gnu@15.0.0-canary.113':
resolution: {integrity: sha512-y56R96ddu3Gf8qfDJCDnctFgjlvAt1CMg3nKTg4tw6yn9N4OnynoWtAtkUtgpjOpV/BJ41tCPAgtTX021oDayQ==}
engines: {node: '>= 10'}
@@ -1143,6 +1225,12 @@ packages:
cpu: [x64]
os: [linux]
+ '@next/swc-linux-x64-musl@14.2.15':
+ resolution: {integrity: sha512-PZ5YE9ouy/IdO7QVJeIcyLn/Rc4ml9M2G4y3kCM9MNf1YKvFY4heg3pVa/jQbMro+tP6yc4G2o9LjAz1zxD7tQ==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+
'@next/swc-linux-x64-musl@15.0.0-canary.113':
resolution: {integrity: sha512-nXsK4PYNHGSz4U6W6Ux062GlYCkAo5dQn1I1+nrvEMdwHHxP03/OmBk0QqFIVY4K5C+/NnsNsRuGiRf5t9F23Q==}
engines: {node: '>= 10'}
@@ -1155,6 +1243,12 @@ packages:
cpu: [arm64]
os: [win32]
+ '@next/swc-win32-arm64-msvc@14.2.15':
+ resolution: {integrity: sha512-2raR16703kBvYEQD9HNLyb0/394yfqzmIeyp2nDzcPV4yPjqNUG3ohX6jX00WryXz6s1FXpVhsCo3i+g4RUX+g==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [win32]
+
'@next/swc-win32-arm64-msvc@15.0.0-canary.113':
resolution: {integrity: sha512-VUGwcPda1WYpDfPPALntC31oJe5NJKyPLlQ7IIG5kFQQQeM37IxSA150r0TyaEXAI3Ug0xFsUuXvtZcKXKBs+g==}
engines: {node: '>= 10'}
@@ -1167,6 +1261,12 @@ packages:
cpu: [ia32]
os: [win32]
+ '@next/swc-win32-ia32-msvc@14.2.15':
+ resolution: {integrity: sha512-fyTE8cklgkyR1p03kJa5zXEaZ9El+kDNM5A+66+8evQS5e/6v0Gk28LqA0Jet8gKSOyP+OTm/tJHzMlGdQerdQ==}
+ engines: {node: '>= 10'}
+ cpu: [ia32]
+ os: [win32]
+
'@next/swc-win32-ia32-msvc@15.0.0-canary.113':
resolution: {integrity: sha512-JFr1jNSMDlx4V0jBmECAnr0abGUqbDdA3Im5+YDplT+QK5+xeFibblrw7kh0jt7HjCHvbdSOcKCQ4qW9RmcjwQ==}
engines: {node: '>= 10'}
@@ -1179,6 +1279,12 @@ packages:
cpu: [x64]
os: [win32]
+ '@next/swc-win32-x64-msvc@14.2.15':
+ resolution: {integrity: sha512-SzqGbsLsP9OwKNUG9nekShTwhj6JSB9ZLMWQ8g1gG6hdE5gQLncbnbymrwy2yVmH9nikSLYRYxYMFu78Ggp7/g==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [win32]
+
'@next/swc-win32-x64-msvc@15.0.0-canary.113':
resolution: {integrity: sha512-AAw87x6Td3tuE5t0CgkGM+IrCz/K8p1ZKMaRlH2f6XcQq/c86rZvkVnjpeS5Q5IPBSLMXSSaALeoizR7ZtqLtQ==}
engines: {node: '>= 10'}
@@ -1417,18 +1523,30 @@ packages:
'@tsconfig/strictest@2.0.5':
resolution: {integrity: sha512-ec4tjL2Rr0pkZ5hww65c+EEPYwxOi4Ryv+0MtjeaSQRJyq322Q27eOQiFbuNgw2hpL4hB1/W/HBGk3VKS43osg==}
+ '@types/debug@4.1.12':
+ resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
+
'@types/estree@1.0.5':
resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
'@types/estree@1.0.6':
resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
+ '@types/hast@3.0.4':
+ resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
+
'@types/json-schema@7.0.15':
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
'@types/json5@0.0.29':
resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
+ '@types/mdast@4.0.4':
+ resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
+
+ '@types/ms@0.7.34':
+ resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==}
+
'@types/node-forge@1.3.11':
resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==}
@@ -1453,6 +1571,9 @@ packages:
'@types/react@18.3.3':
resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==}
+ '@types/unist@3.0.3':
+ resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
+
'@typescript-eslint/eslint-plugin@8.7.0':
resolution: {integrity: sha512-RIHOoznhA3CCfSTFiB6kBGLQtB/sox+pJ6jeFu6FxJvqL8qRxq/FfGO/UhsGgQM9oGdXkV4xUgli+dt26biB6A==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -1668,6 +1789,9 @@ packages:
resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==}
engines: {node: '>= 0.4'}
+ bail@2.0.2:
+ resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
+
balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
@@ -1739,6 +1863,9 @@ packages:
capnp-ts@0.7.0:
resolution: {integrity: sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==}
+ ccount@2.0.1:
+ resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
+
chai@5.1.1:
resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==}
engines: {node: '>=12'}
@@ -1751,6 +1878,15 @@ packages:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
engines: {node: '>=10'}
+ character-entities-html4@2.1.0:
+ resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==}
+
+ character-entities-legacy@3.0.0:
+ resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==}
+
+ character-entities@2.0.2:
+ resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
+
chardet@0.7.0:
resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
@@ -1770,6 +1906,9 @@ packages:
resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==}
engines: {node: '>=8'}
+ classnames@2.5.1:
+ resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==}
+
clean-regexp@1.0.0:
resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==}
engines: {node: '>=4'}
@@ -1804,6 +1943,9 @@ packages:
resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==}
engines: {node: '>=12.5.0'}
+ comma-separated-tokens@2.0.3:
+ resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
+
commander@4.1.1:
resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
engines: {node: '>= 6'}
@@ -1858,6 +2000,9 @@ packages:
resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==}
engines: {node: '>= 0.4'}
+ date-fns@3.6.0:
+ resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==}
+
debug@3.2.7:
resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
peerDependencies:
@@ -1875,6 +2020,9 @@ packages:
supports-color:
optional: true
+ decode-named-character-reference@1.0.2:
+ resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==}
+
decode-uri-component@0.4.1:
resolution: {integrity: sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==}
engines: {node: '>=14.16'}
@@ -1904,6 +2052,10 @@ packages:
deprecation@2.3.1:
resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==}
+ dequal@2.0.3:
+ resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+ engines: {node: '>=6'}
+
detect-indent@6.1.0:
resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==}
engines: {node: '>=8'}
@@ -1912,6 +2064,9 @@ packages:
resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==}
engines: {node: '>=8'}
+ devlop@1.1.0:
+ resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
+
didyoumean@1.2.2:
resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
@@ -2169,6 +2324,13 @@ packages:
resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==}
engines: {node: '>=6'}
+ extend-shallow@2.0.1:
+ resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==}
+ engines: {node: '>=0.10.0'}
+
+ extend@3.0.2:
+ resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
+
extendable-error@0.1.7:
resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==}
@@ -2360,6 +2522,10 @@ packages:
graphemer@1.4.0:
resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
+ gray-matter@4.0.3:
+ resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==}
+ engines: {node: '>=6.0'}
+
has-bigints@1.0.2:
resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
@@ -2390,9 +2556,21 @@ packages:
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
engines: {node: '>= 0.4'}
+ hast-util-sanitize@5.0.1:
+ resolution: {integrity: sha512-IGrgWLuip4O2nq5CugXy4GI2V8kx4sFVy5Hd4vF7AR2gxS0N9s7nEAVUyeMtZKZvzrxVsHt73XdTsno1tClIkQ==}
+
+ hast-util-to-html@9.0.3:
+ resolution: {integrity: sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==}
+
+ hast-util-whitespace@3.0.0:
+ resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==}
+
hosted-git-info@2.8.9:
resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==}
+ html-void-elements@3.0.0:
+ resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==}
+
human-id@1.0.2:
resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==}
@@ -2483,6 +2661,10 @@ packages:
resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
engines: {node: '>= 0.4'}
+ is-extendable@0.1.1:
+ resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==}
+ engines: {node: '>=0.10.0'}
+
is-extglob@2.1.1:
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
engines: {node: '>=0.10.0'}
@@ -2522,6 +2704,10 @@ packages:
resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
engines: {node: '>=8'}
+ is-plain-obj@4.1.0:
+ resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
+ engines: {node: '>=12'}
+
is-regex@1.1.4:
resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
engines: {node: '>= 0.4'}
@@ -2647,6 +2833,10 @@ packages:
keyv@4.5.4:
resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+ kind-of@6.0.3:
+ resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
+ engines: {node: '>=0.10.0'}
+
language-subtag-registry@0.3.23:
resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==}
@@ -2696,6 +2886,9 @@ packages:
lodash.startcase@4.4.0:
resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==}
+ longest-streak@3.1.0:
+ resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==}
+
loose-envify@1.4.0:
resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
hasBin: true
@@ -2719,6 +2912,21 @@ packages:
magic-string@0.30.11:
resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==}
+ mdast-util-from-markdown@2.0.1:
+ resolution: {integrity: sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==}
+
+ mdast-util-phrasing@4.1.0:
+ resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==}
+
+ mdast-util-to-hast@13.2.0:
+ resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==}
+
+ mdast-util-to-markdown@2.1.0:
+ resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==}
+
+ mdast-util-to-string@4.0.0:
+ resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==}
+
merge-stream@2.0.0:
resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
@@ -2726,6 +2934,69 @@ packages:
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
engines: {node: '>= 8'}
+ micromark-core-commonmark@2.0.1:
+ resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==}
+
+ micromark-factory-destination@2.0.0:
+ resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==}
+
+ micromark-factory-label@2.0.0:
+ resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==}
+
+ micromark-factory-space@2.0.0:
+ resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==}
+
+ micromark-factory-title@2.0.0:
+ resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==}
+
+ micromark-factory-whitespace@2.0.0:
+ resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==}
+
+ micromark-util-character@2.1.0:
+ resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==}
+
+ micromark-util-chunked@2.0.0:
+ resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==}
+
+ micromark-util-classify-character@2.0.0:
+ resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==}
+
+ micromark-util-combine-extensions@2.0.0:
+ resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==}
+
+ micromark-util-decode-numeric-character-reference@2.0.1:
+ resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==}
+
+ micromark-util-decode-string@2.0.0:
+ resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==}
+
+ micromark-util-encode@2.0.0:
+ resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==}
+
+ micromark-util-html-tag-name@2.0.0:
+ resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==}
+
+ micromark-util-normalize-identifier@2.0.0:
+ resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==}
+
+ micromark-util-resolve-all@2.0.0:
+ resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==}
+
+ micromark-util-sanitize-uri@2.0.0:
+ resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==}
+
+ micromark-util-subtokenize@2.0.1:
+ resolution: {integrity: sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==}
+
+ micromark-util-symbol@2.0.0:
+ resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==}
+
+ micromark-util-types@2.0.0:
+ resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==}
+
+ micromark@4.0.0:
+ resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==}
+
micromatch@4.0.7:
resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==}
engines: {node: '>=8.6'}
@@ -2814,6 +3085,24 @@ packages:
sass:
optional: true
+ next@14.2.15:
+ resolution: {integrity: sha512-h9ctmOokpoDphRvMGnwOJAedT6zKhwqyZML9mDtspgf4Rh3Pn7UTYKqePNoDvhsWBAO5GoPNYshnAUGIazVGmw==}
+ engines: {node: '>=18.17.0'}
+ hasBin: true
+ peerDependencies:
+ '@opentelemetry/api': ^1.1.0
+ '@playwright/test': ^1.41.2
+ react: ^18.2.0
+ react-dom: ^18.2.0
+ sass: ^1.3.0
+ peerDependenciesMeta:
+ '@opentelemetry/api':
+ optional: true
+ '@playwright/test':
+ optional: true
+ sass:
+ optional: true
+
next@15.0.0-canary.113:
resolution: {integrity: sha512-+2ghJB59/YRpaGrUN3ebff9HZkWmvX6D4YOV4HY2TOWCKRtWQ+QCY4iC3Y4cyjh5SRteVmo0mEU7qxG7dCLqAw==}
engines: {node: '>=18.18.0'}
@@ -3196,6 +3485,9 @@ packages:
prop-types@15.8.1:
resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
+ property-information@6.5.0:
+ resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==}
+
pseudomap@1.0.2:
resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==}
@@ -3277,6 +3569,18 @@ packages:
resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==}
hasBin: true
+ remark-html@16.0.1:
+ resolution: {integrity: sha512-B9JqA5i0qZe0Nsf49q3OXyGvyXuZFDzAP2iOFLEumymuYJITVpiH1IgsTEwTpdptDmZlMDMWeDmSawdaJIGCXQ==}
+
+ remark-parse@11.0.0:
+ resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==}
+
+ remark-stringify@11.0.0:
+ resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==}
+
+ remark@15.0.1:
+ resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==}
+
resolve-from@4.0.0:
resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
engines: {node: '>=4'}
@@ -3344,6 +3648,10 @@ packages:
scheduler@0.25.0-rc-3208e73e-20240730:
resolution: {integrity: sha512-eCGy6Bm6PX2JB7dLumQuEYwmXku9HweMfdXCQQ2ZaRG3kwxK76RWFr7CsW/LHju8fiDSiJajl0Iq62uoaH9VLQ==}
+ section-matter@1.0.0:
+ resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==}
+ engines: {node: '>=4'}
+
selfsigned@2.4.1:
resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==}
engines: {node: '>=10'}
@@ -3436,6 +3744,9 @@ packages:
resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
deprecated: Please use @jridgewell/sourcemap-codec instead
+ space-separated-tokens@2.0.2:
+ resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
+
spawndamnit@2.0.0:
resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==}
@@ -3512,6 +3823,9 @@ packages:
resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
engines: {node: '>= 0.4'}
+ stringify-entities@4.0.4:
+ resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==}
+
strip-ansi@6.0.1:
resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
engines: {node: '>=8'}
@@ -3520,6 +3834,10 @@ packages:
resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
engines: {node: '>=12'}
+ strip-bom-string@1.0.0:
+ resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==}
+ engines: {node: '>=0.10.0'}
+
strip-bom@3.0.0:
resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
engines: {node: '>=4'}
@@ -3642,6 +3960,12 @@ packages:
resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==}
hasBin: true
+ trim-lines@3.0.1:
+ resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
+
+ trough@2.2.0:
+ resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
+
ts-api-utils@1.3.0:
resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==}
engines: {node: '>=16'}
@@ -3757,6 +4081,24 @@ packages:
unenv-nightly@2.0.0-20240919-125358-9a64854:
resolution: {integrity: sha512-XjsgUTrTHR7iw+k/SRTNjh6EQgwpC9voygnoCJo5kh4hKqsSDHUW84MhL9EsHTNfLctvVBHaSw8e2k3R2fKXsQ==}
+ unified@11.0.5:
+ resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==}
+
+ unist-util-is@6.0.0:
+ resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==}
+
+ unist-util-position@5.0.0:
+ resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==}
+
+ unist-util-stringify-position@4.0.0:
+ resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==}
+
+ unist-util-visit-parents@6.0.1:
+ resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==}
+
+ unist-util-visit@5.0.0:
+ resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==}
+
universal-user-agent@6.0.1:
resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==}
@@ -3787,6 +4129,12 @@ packages:
resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+ vfile-message@4.0.2:
+ resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==}
+
+ vfile@6.0.3:
+ resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
+
vite-node@2.1.1:
resolution: {integrity: sha512-N/mGckI1suG/5wQI35XeR9rsMsPqKXzq1CdUndzVstBj/HvyxxGctwnK6WX43NGt5L3Z5tcRf83g4TITKJhPrA==}
engines: {node: ^18.0.0 || >=20.0.0}
@@ -3950,6 +4298,9 @@ packages:
zod@3.23.8:
resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==}
+ zwitch@2.0.4:
+ resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
+
snapshots:
'@alloc/quick-lru@5.2.0': {}
@@ -4611,6 +4962,8 @@ snapshots:
'@next/env@14.2.11': {}
+ '@next/env@14.2.15': {}
+
'@next/env@15.0.0-canary.113': {}
'@next/eslint-plugin-next@14.2.14':
@@ -4620,54 +4973,81 @@ snapshots:
'@next/swc-darwin-arm64@14.2.11':
optional: true
+ '@next/swc-darwin-arm64@14.2.15':
+ optional: true
+
'@next/swc-darwin-arm64@15.0.0-canary.113':
optional: true
'@next/swc-darwin-x64@14.2.11':
optional: true
+ '@next/swc-darwin-x64@14.2.15':
+ optional: true
+
'@next/swc-darwin-x64@15.0.0-canary.113':
optional: true
'@next/swc-linux-arm64-gnu@14.2.11':
optional: true
+ '@next/swc-linux-arm64-gnu@14.2.15':
+ optional: true
+
'@next/swc-linux-arm64-gnu@15.0.0-canary.113':
optional: true
'@next/swc-linux-arm64-musl@14.2.11':
optional: true
+ '@next/swc-linux-arm64-musl@14.2.15':
+ optional: true
+
'@next/swc-linux-arm64-musl@15.0.0-canary.113':
optional: true
'@next/swc-linux-x64-gnu@14.2.11':
optional: true
+ '@next/swc-linux-x64-gnu@14.2.15':
+ optional: true
+
'@next/swc-linux-x64-gnu@15.0.0-canary.113':
optional: true
'@next/swc-linux-x64-musl@14.2.11':
optional: true
+ '@next/swc-linux-x64-musl@14.2.15':
+ optional: true
+
'@next/swc-linux-x64-musl@15.0.0-canary.113':
optional: true
'@next/swc-win32-arm64-msvc@14.2.11':
optional: true
+ '@next/swc-win32-arm64-msvc@14.2.15':
+ optional: true
+
'@next/swc-win32-arm64-msvc@15.0.0-canary.113':
optional: true
'@next/swc-win32-ia32-msvc@14.2.11':
optional: true
+ '@next/swc-win32-ia32-msvc@14.2.15':
+ optional: true
+
'@next/swc-win32-ia32-msvc@15.0.0-canary.113':
optional: true
'@next/swc-win32-x64-msvc@14.2.11':
optional: true
+ '@next/swc-win32-x64-msvc@14.2.15':
+ optional: true
+
'@next/swc-win32-x64-msvc@15.0.0-canary.113':
optional: true
@@ -4896,14 +5276,28 @@ snapshots:
'@tsconfig/strictest@2.0.5': {}
+ '@types/debug@4.1.12':
+ dependencies:
+ '@types/ms': 0.7.34
+
'@types/estree@1.0.5': {}
'@types/estree@1.0.6': {}
+ '@types/hast@3.0.4':
+ dependencies:
+ '@types/unist': 3.0.3
+
'@types/json-schema@7.0.15': {}
'@types/json5@0.0.29': {}
+ '@types/mdast@4.0.4':
+ dependencies:
+ '@types/unist': 3.0.3
+
+ '@types/ms@0.7.34': {}
+
'@types/node-forge@1.3.11':
dependencies:
'@types/node': 20.14.12
@@ -4931,6 +5325,8 @@ snapshots:
'@types/prop-types': 15.7.12
csstype: 3.1.3
+ '@types/unist@3.0.3': {}
+
'@typescript-eslint/eslint-plugin@8.7.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4)':
dependencies:
'@eslint-community/regexpp': 4.11.0
@@ -5253,6 +5649,8 @@ snapshots:
axobject-query@4.1.0: {}
+ bail@2.0.2: {}
+
balanced-match@1.0.2: {}
before-after-hook@2.2.3: {}
@@ -5321,6 +5719,8 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ ccount@2.0.1: {}
+
chai@5.1.1:
dependencies:
assertion-error: 2.0.1
@@ -5340,6 +5740,12 @@ snapshots:
ansi-styles: 4.3.0
supports-color: 7.2.0
+ character-entities-html4@2.1.0: {}
+
+ character-entities-legacy@3.0.0: {}
+
+ character-entities@2.0.2: {}
+
chardet@0.7.0: {}
check-error@2.1.1: {}
@@ -5360,6 +5766,8 @@ snapshots:
ci-info@4.0.0: {}
+ classnames@2.5.1: {}
+
clean-regexp@1.0.0:
dependencies:
escape-string-regexp: 1.0.5
@@ -5394,6 +5802,8 @@ snapshots:
color-string: 1.9.1
optional: true
+ comma-separated-tokens@2.0.3: {}
+
commander@4.1.1: {}
concat-map@0.0.1: {}
@@ -5446,6 +5856,8 @@ snapshots:
es-errors: 1.3.0
is-data-view: 1.0.1
+ date-fns@3.6.0: {}
+
debug@3.2.7:
dependencies:
ms: 2.1.2
@@ -5454,6 +5866,10 @@ snapshots:
dependencies:
ms: 2.1.2
+ decode-named-character-reference@1.0.2:
+ dependencies:
+ character-entities: 2.0.2
+
decode-uri-component@0.4.1: {}
deep-eql@5.0.2: {}
@@ -5497,11 +5913,17 @@ snapshots:
deprecation@2.3.1: {}
+ dequal@2.0.3: {}
+
detect-indent@6.1.0: {}
detect-libc@2.0.3:
optional: true
+ devlop@1.1.0:
+ dependencies:
+ dequal: 2.0.3
+
didyoumean@1.2.2: {}
dir-glob@3.0.1:
@@ -6027,6 +6449,12 @@ snapshots:
exit-hook@2.2.1: {}
+ extend-shallow@2.0.1:
+ dependencies:
+ is-extendable: 0.1.1
+
+ extend@3.0.2: {}
+
extendable-error@0.1.7: {}
external-editor@3.1.0:
@@ -6242,6 +6670,13 @@ snapshots:
graphemer@1.4.0: {}
+ gray-matter@4.0.3:
+ dependencies:
+ js-yaml: 3.14.1
+ kind-of: 6.0.3
+ section-matter: 1.0.0
+ strip-bom-string: 1.0.0
+
has-bigints@1.0.2: {}
has-flag@3.0.0: {}
@@ -6264,8 +6699,34 @@ snapshots:
dependencies:
function-bind: 1.1.2
+ hast-util-sanitize@5.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@ungap/structured-clone': 1.2.0
+ unist-util-position: 5.0.0
+
+ hast-util-to-html@9.0.3:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ ccount: 2.0.1
+ comma-separated-tokens: 2.0.3
+ hast-util-whitespace: 3.0.0
+ html-void-elements: 3.0.0
+ mdast-util-to-hast: 13.2.0
+ property-information: 6.5.0
+ space-separated-tokens: 2.0.2
+ stringify-entities: 4.0.4
+ zwitch: 2.0.4
+
+ hast-util-whitespace@3.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+
hosted-git-info@2.8.9: {}
+ html-void-elements@3.0.0: {}
+
human-id@1.0.2: {}
human-signals@2.1.0: {}
@@ -6352,6 +6813,8 @@ snapshots:
dependencies:
has-tostringtag: 1.0.2
+ is-extendable@0.1.1: {}
+
is-extglob@2.1.1: {}
is-finalizationregistry@1.0.2:
@@ -6380,6 +6843,8 @@ snapshots:
is-path-inside@3.0.3: {}
+ is-plain-obj@4.1.0: {}
+
is-regex@1.1.4:
dependencies:
call-bind: 1.0.7
@@ -6500,6 +6965,8 @@ snapshots:
dependencies:
json-buffer: 3.0.1
+ kind-of@6.0.3: {}
+
language-subtag-registry@0.3.23: {}
language-tags@1.0.9:
@@ -6537,6 +7004,8 @@ snapshots:
lodash.startcase@4.4.0: {}
+ longest-streak@3.1.0: {}
+
loose-envify@1.4.0:
dependencies:
js-tokens: 4.0.0
@@ -6562,10 +7031,192 @@ snapshots:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.0
+ mdast-util-from-markdown@2.0.1:
+ dependencies:
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ decode-named-character-reference: 1.0.2
+ devlop: 1.1.0
+ mdast-util-to-string: 4.0.0
+ micromark: 4.0.0
+ micromark-util-decode-numeric-character-reference: 2.0.1
+ micromark-util-decode-string: 2.0.0
+ micromark-util-normalize-identifier: 2.0.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+ unist-util-stringify-position: 4.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-phrasing@4.1.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ unist-util-is: 6.0.0
+
+ mdast-util-to-hast@13.2.0:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ '@ungap/structured-clone': 1.2.0
+ devlop: 1.1.0
+ micromark-util-sanitize-uri: 2.0.0
+ trim-lines: 3.0.1
+ unist-util-position: 5.0.0
+ unist-util-visit: 5.0.0
+ vfile: 6.0.3
+
+ mdast-util-to-markdown@2.1.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ longest-streak: 3.1.0
+ mdast-util-phrasing: 4.1.0
+ mdast-util-to-string: 4.0.0
+ micromark-util-decode-string: 2.0.0
+ unist-util-visit: 5.0.0
+ zwitch: 2.0.4
+
+ mdast-util-to-string@4.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+
merge-stream@2.0.0: {}
merge2@1.4.1: {}
+ micromark-core-commonmark@2.0.1:
+ dependencies:
+ decode-named-character-reference: 1.0.2
+ devlop: 1.1.0
+ micromark-factory-destination: 2.0.0
+ micromark-factory-label: 2.0.0
+ micromark-factory-space: 2.0.0
+ micromark-factory-title: 2.0.0
+ micromark-factory-whitespace: 2.0.0
+ micromark-util-character: 2.1.0
+ micromark-util-chunked: 2.0.0
+ micromark-util-classify-character: 2.0.0
+ micromark-util-html-tag-name: 2.0.0
+ micromark-util-normalize-identifier: 2.0.0
+ micromark-util-resolve-all: 2.0.0
+ micromark-util-subtokenize: 2.0.1
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-factory-destination@2.0.0:
+ dependencies:
+ micromark-util-character: 2.1.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-factory-label@2.0.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-util-character: 2.1.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-factory-space@2.0.0:
+ dependencies:
+ micromark-util-character: 2.1.0
+ micromark-util-types: 2.0.0
+
+ micromark-factory-title@2.0.0:
+ dependencies:
+ micromark-factory-space: 2.0.0
+ micromark-util-character: 2.1.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-factory-whitespace@2.0.0:
+ dependencies:
+ micromark-factory-space: 2.0.0
+ micromark-util-character: 2.1.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-util-character@2.1.0:
+ dependencies:
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-util-chunked@2.0.0:
+ dependencies:
+ micromark-util-symbol: 2.0.0
+
+ micromark-util-classify-character@2.0.0:
+ dependencies:
+ micromark-util-character: 2.1.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-util-combine-extensions@2.0.0:
+ dependencies:
+ micromark-util-chunked: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-util-decode-numeric-character-reference@2.0.1:
+ dependencies:
+ micromark-util-symbol: 2.0.0
+
+ micromark-util-decode-string@2.0.0:
+ dependencies:
+ decode-named-character-reference: 1.0.2
+ micromark-util-character: 2.1.0
+ micromark-util-decode-numeric-character-reference: 2.0.1
+ micromark-util-symbol: 2.0.0
+
+ micromark-util-encode@2.0.0: {}
+
+ micromark-util-html-tag-name@2.0.0: {}
+
+ micromark-util-normalize-identifier@2.0.0:
+ dependencies:
+ micromark-util-symbol: 2.0.0
+
+ micromark-util-resolve-all@2.0.0:
+ dependencies:
+ micromark-util-types: 2.0.0
+
+ micromark-util-sanitize-uri@2.0.0:
+ dependencies:
+ micromark-util-character: 2.1.0
+ micromark-util-encode: 2.0.0
+ micromark-util-symbol: 2.0.0
+
+ micromark-util-subtokenize@2.0.1:
+ dependencies:
+ devlop: 1.1.0
+ micromark-util-chunked: 2.0.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-util-symbol@2.0.0: {}
+
+ micromark-util-types@2.0.0: {}
+
+ micromark@4.0.0:
+ dependencies:
+ '@types/debug': 4.1.12
+ debug: 4.3.6
+ decode-named-character-reference: 1.0.2
+ devlop: 1.1.0
+ micromark-core-commonmark: 2.0.1
+ micromark-factory-space: 2.0.0
+ micromark-util-character: 2.1.0
+ micromark-util-chunked: 2.0.0
+ micromark-util-combine-extensions: 2.0.0
+ micromark-util-decode-numeric-character-reference: 2.0.1
+ micromark-util-encode: 2.0.0
+ micromark-util-normalize-identifier: 2.0.0
+ micromark-util-resolve-all: 2.0.0
+ micromark-util-sanitize-uri: 2.0.0
+ micromark-util-subtokenize: 2.0.1
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+ transitivePeerDependencies:
+ - supports-color
+
micromatch@4.0.7:
dependencies:
braces: 3.0.3
@@ -6689,6 +7340,32 @@ snapshots:
- '@babel/core'
- babel-plugin-macros
+ next@14.2.15(@playwright/test@1.47.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@next/env': 14.2.15
+ '@swc/helpers': 0.5.5
+ busboy: 1.6.0
+ caniuse-lite: 1.0.30001664
+ graceful-fs: 4.2.11
+ postcss: 8.4.31
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ styled-jsx: 5.1.1(react@18.3.1)
+ optionalDependencies:
+ '@next/swc-darwin-arm64': 14.2.15
+ '@next/swc-darwin-x64': 14.2.15
+ '@next/swc-linux-arm64-gnu': 14.2.15
+ '@next/swc-linux-arm64-musl': 14.2.15
+ '@next/swc-linux-x64-gnu': 14.2.15
+ '@next/swc-linux-x64-musl': 14.2.15
+ '@next/swc-win32-arm64-msvc': 14.2.15
+ '@next/swc-win32-ia32-msvc': 14.2.15
+ '@next/swc-win32-x64-msvc': 14.2.15
+ '@playwright/test': 1.47.0
+ transitivePeerDependencies:
+ - '@babel/core'
+ - babel-plugin-macros
+
next@15.0.0-canary.113(@playwright/test@1.47.0)(react-dom@19.0.0-rc-3208e73e-20240730(react@19.0.0-rc-3208e73e-20240730))(react@19.0.0-rc-3208e73e-20240730):
dependencies:
'@next/env': 15.0.0-canary.113
@@ -6991,6 +7668,8 @@ snapshots:
object-assign: 4.1.1
react-is: 16.13.1
+ property-information@6.5.0: {}
+
pseudomap@1.0.2: {}
punycode@2.3.1: {}
@@ -7086,6 +7765,38 @@ snapshots:
dependencies:
jsesc: 0.5.0
+ remark-html@16.0.1:
+ dependencies:
+ '@types/mdast': 4.0.4
+ hast-util-sanitize: 5.0.1
+ hast-util-to-html: 9.0.3
+ mdast-util-to-hast: 13.2.0
+ unified: 11.0.5
+
+ remark-parse@11.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-from-markdown: 2.0.1
+ micromark-util-types: 2.0.0
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - supports-color
+
+ remark-stringify@11.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-to-markdown: 2.1.0
+ unified: 11.0.5
+
+ remark@15.0.1:
+ dependencies:
+ '@types/mdast': 4.0.4
+ remark-parse: 11.0.0
+ remark-stringify: 11.0.0
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - supports-color
+
resolve-from@4.0.0: {}
resolve-from@5.0.0: {}
@@ -7173,6 +7884,11 @@ snapshots:
scheduler@0.25.0-rc-3208e73e-20240730: {}
+ section-matter@1.0.0:
+ dependencies:
+ extend-shallow: 2.0.1
+ kind-of: 6.0.3
+
selfsigned@2.4.1:
dependencies:
'@types/node-forge': 1.3.11
@@ -7276,6 +7992,8 @@ snapshots:
sourcemap-codec@1.4.8: {}
+ space-separated-tokens@2.0.2: {}
+
spawndamnit@2.0.0:
dependencies:
cross-spawn: 5.1.0
@@ -7374,6 +8092,11 @@ snapshots:
define-properties: 1.2.1
es-object-atoms: 1.0.0
+ stringify-entities@4.0.4:
+ dependencies:
+ character-entities-html4: 2.1.0
+ character-entities-legacy: 3.0.0
+
strip-ansi@6.0.1:
dependencies:
ansi-regex: 5.0.1
@@ -7382,6 +8105,8 @@ snapshots:
dependencies:
ansi-regex: 6.0.1
+ strip-bom-string@1.0.0: {}
+
strip-bom@3.0.0: {}
strip-final-newline@2.0.0: {}
@@ -7499,6 +8224,10 @@ snapshots:
tree-kill@1.2.2: {}
+ trim-lines@3.0.1: {}
+
+ trough@2.2.0: {}
+
ts-api-utils@1.3.0(typescript@5.5.4):
dependencies:
typescript: 5.5.4
@@ -7637,6 +8366,39 @@ snapshots:
pathe: 1.1.2
ufo: 1.5.4
+ unified@11.0.5:
+ dependencies:
+ '@types/unist': 3.0.3
+ bail: 2.0.2
+ devlop: 1.1.0
+ extend: 3.0.2
+ is-plain-obj: 4.1.0
+ trough: 2.2.0
+ vfile: 6.0.3
+
+ unist-util-is@6.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-position@5.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-stringify-position@4.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-visit-parents@6.0.1:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.0
+
+ unist-util-visit@5.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.0
+ unist-util-visit-parents: 6.0.1
+
universal-user-agent@6.0.1: {}
universalify@0.1.2: {}
@@ -7662,6 +8424,16 @@ snapshots:
validate-npm-package-name@5.0.1: {}
+ vfile-message@4.0.2:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-stringify-position: 4.0.0
+
+ vfile@6.0.3:
+ dependencies:
+ '@types/unist': 3.0.3
+ vfile-message: 4.0.2
+
vite-node@2.1.1(@types/node@22.2.0):
dependencies:
cac: 6.7.14
@@ -7853,3 +8625,5 @@ snapshots:
zod: 3.23.8
zod@3.23.8: {}
+
+ zwitch@2.0.4: {}