diff --git a/.changeset/loud-baboons-wash.md b/.changeset/loud-baboons-wash.md new file mode 100644 index 0000000000..6cd71b5402 --- /dev/null +++ b/.changeset/loud-baboons-wash.md @@ -0,0 +1,6 @@ +--- +'nextra': patch +'nextra-theme-docs': patch +--- + +Rename some docs theme configurations diff --git a/docs/components/card/index.tsx b/docs/components/card/index.tsx index 37ede98b31..430238bbd1 100644 --- a/docs/components/card/index.tsx +++ b/docs/components/card/index.tsx @@ -3,15 +3,67 @@ import Link from 'next/link' import styles from './style.module.css' -export function Card({ children, title, icon, href, ...props }) { +export function Card({ children, title, icon, image, arrow, href, ...props }) { + const animatedArrow = arrow ? ( + + → + + ) : null + + if (image) { + return ( + + + {children} + + {icon} + {title} + {animatedArrow} + + + + ) + } + return ( - - + + {icon} {title} + {animatedArrow} - {children} ) @@ -19,7 +71,7 @@ export function Card({ children, title, icon, href, ...props }) { export function Cards({ children, ...props }) { return ( -
+
{children}
) diff --git a/docs/components/card/style.module.css b/docs/components/card/style.module.css index de06b4a66e..b0a86f9a35 100644 --- a/docs/components/card/style.module.css +++ b/docs/components/card/style.module.css @@ -1,26 +1,11 @@ .cards { display: grid; - grid-gap: 1rem; - grid-template-columns: repeat(3, 1fr); - margin-top: 1rem; + grid-template-columns: repeat( + auto-fill, + minmax(max(250px, calc((100% - 1rem * 2) / 3)), 1fr) + ); } -.card { - display: flex; - flex-direction: column; - justify-content: flex-start; - padding: 1rem; - color: currentColor; - text-decoration: none; - background-color: hsl(var(--nextra-primary-hue) 10% 96%/0.9); - border-radius: 0.25rem; - cursor: pointer; - transition: box-shadow 0.1s ease; -} - -.card:hover { - box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1); -} .card:hover svg { color: currentColor; } @@ -37,7 +22,19 @@ .card .title { display: flex; - gap: 0.5rem; font-weight: 600; align-items: flex-start; } + +:global(.dark) .card { + background-color: hsl(var(--nextra-primary-hue) 10% 12%/0.9); +} +:global(.dark) .card:hover { + box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.1); +} +:global(.dark) .card svg { + color: #ffffff66; +} +:global(.dark) .card:hover svg { + color: currentColor; +} diff --git a/docs/components/features/index.tsx b/docs/components/features/index.tsx index 847b8611fd..bddb42d0d6 100644 --- a/docs/components/features/index.tsx +++ b/docs/components/features/index.tsx @@ -1,4 +1,6 @@ import cn from 'clsx' +import { motion } from 'framer-motion' + import styles from './style.module.css' export function Feature({ @@ -10,7 +12,11 @@ export function Feature({ ...props }) { return ( -
{children} -
+ ) } diff --git a/docs/components/features/style.module.css b/docs/components/features/style.module.css index 88ac05fad8..e9ae1d7d6b 100644 --- a/docs/components/features/style.module.css +++ b/docs/components/features/style.module.css @@ -15,6 +15,7 @@ .feature h3 { position: relative; font-size: 34px; + font-size: min(34px, max(4vw, 24px)); font-weight: 600; line-height: 1.25; letter-spacing: -0.02rem; diff --git a/docs/components/icons/globe.tsx b/docs/components/icons/globe.tsx new file mode 100644 index 0000000000..e9ebe68cdf --- /dev/null +++ b/docs/components/icons/globe.tsx @@ -0,0 +1,12 @@ +export default ( + + + +) diff --git a/docs/components/icons/markdown.tsx b/docs/components/icons/markdown.tsx new file mode 100644 index 0000000000..01a574a510 --- /dev/null +++ b/docs/components/icons/markdown.tsx @@ -0,0 +1,8 @@ +export default ( + + + +) diff --git a/docs/components/icons/switch.tsx b/docs/components/icons/switch.tsx new file mode 100644 index 0000000000..e20cf784b3 --- /dev/null +++ b/docs/components/icons/switch.tsx @@ -0,0 +1,8 @@ +export default ( + + + +) diff --git a/docs/components/table/index.tsx b/docs/components/table/index.tsx new file mode 100644 index 0000000000..922c483cf6 --- /dev/null +++ b/docs/components/table/index.tsx @@ -0,0 +1,31 @@ +export function OptionTable({ options }: { options: [string, string, any] }) { + return ( +
+ + + + + + + + + + {options.map(([option, type, description]) => ( + + + + + + ))} + +
OptionTypeDescription
+ {option} + + {type} + {description}
+
+ ) +} diff --git a/docs/components/utils/shadow.jsx b/docs/components/utils/shadow.jsx index 77011f1940..e3acc56abe 100644 --- a/docs/components/utils/shadow.jsx +++ b/docs/components/utils/shadow.jsx @@ -5,6 +5,8 @@ import { createPortal } from 'react-dom' export class Shadow extends Component { componentDidMount() { + if (this.shadowAttached) return + this.shadowAttached = true this.shadowRoot = this.node.attachShadow({ mode: this.props.mode }) this.forceUpdate() } diff --git a/docs/next.config.mjs b/docs/next.config.mjs index 495a21bebd..3739ba18f6 100644 --- a/docs/next.config.mjs +++ b/docs/next.config.mjs @@ -6,9 +6,11 @@ const withNextra = nextra({ unstable_staticImage: true, unstable_flexsearch: { codeblocks: true - } + }, + unstable_defaultShowCopyCode: true }) export default withNextra({ - reactStrictMode: true + reactStrictMode: true, + experimental: { images: { allowFutureImage: true } } }) diff --git a/docs/package.json b/docs/package.json index bd8165b794..b26fe41899 100644 --- a/docs/package.json +++ b/docs/package.json @@ -9,15 +9,19 @@ "license": "MIT", "dependencies": { "clsx": "^1.2.1", + "framer-motion": "^7.3.2", "next": "^12.2.3", - "nextra": "2.0.0-beta.18", - "nextra-theme-docs": "2.0.0-beta.18", - "react": "^17.0.2", - "react-dom": "^17.0.2" + "nextra": "2.0.0-beta.25", + "nextra-theme-docs": "2.0.0-beta.25", + "react": "^18.2.0", + "react-dom": "^18.2.0" }, "devDependencies": { "@types/node": "^18.7.8", + "autoprefixer": "^10.4.8", + "postcss": "^8.4.16", "prettier": "^2.7.1", + "tailwindcss": "^3.1.8", "typescript": "^4.7.4" }, "prettier": { diff --git a/docs/pages/_app.tsx b/docs/pages/_app.tsx index a55278f2a1..9c9713f2fd 100644 --- a/docs/pages/_app.tsx +++ b/docs/pages/_app.tsx @@ -1,14 +1,11 @@ -import { ReactElement } from 'react' -import { AppProps } from 'next/app' -import 'nextra-theme-docs/style.css' +import type { ReactElement } from 'react' +import type { AppProps } from 'next/app' + import '../style.css' export default function Nextra({ Component, pageProps }: AppProps): ReactElement { - // Use the layout defined at the page level, if available - const getLayout = (Component as any).getLayout || (page => page) - - return getLayout() + return } diff --git a/docs/pages/meta.json b/docs/pages/_meta.json similarity index 54% rename from docs/pages/meta.json rename to docs/pages/_meta.json index 7701c721ea..5e8037a5ad 100644 --- a/docs/pages/meta.json +++ b/docs/pages/_meta.json @@ -15,9 +15,17 @@ "title": "Showcase", "type": "page" }, - "about": { - "title": "About", - "type": "page", - "href": "/docs/about" + "faq": { + "title": "FAQ", + "type": "menu", + "items": { + "about": { + "title": "About Nextra", + "href": "/docs/about" + }, + "community": { + "title": "Community" + } + } } } diff --git a/docs/pages/docs/meta.json b/docs/pages/docs/_meta.json similarity index 90% rename from docs/pages/docs/meta.json rename to docs/pages/docs/_meta.json index 28ef511c29..e0208da1bc 100644 --- a/docs/pages/docs/meta.json +++ b/docs/pages/docs/_meta.json @@ -6,7 +6,7 @@ "title": "Themes" }, "docs-theme": "Docs Theme", - "blog": "Blog Theme", + "blog-theme": "Blog Theme", "your-own-theme": "Your Own Theme", "-- About --": { "type": "separator", diff --git a/docs/pages/docs/about.mdx b/docs/pages/docs/about.mdx index 9e7a22b60f..68475d194b 100644 --- a/docs/pages/docs/about.mdx +++ b/docs/pages/docs/about.mdx @@ -6,9 +6,9 @@ Nextra was created by [Shu Ding](https://twitter.com/shuding_) and [Paco Coursey // Maintainers and contributors -## Acknowledgements +## Credits -On top of React, Nextra is based on these incredible open source projects: +On top of React, Nextra is inspired and/or built on top of these incredible open source projects: - https://nextjs.org - https://pnpm.io @@ -20,3 +20,5 @@ On top of React, Nextra is based on these incredible open source projects: - https://github.com/nextapps-de/flexsearch - https://github.com/atomiks/rehype-pretty-code - https://github.com/Brooooooklyn/simple-git +- https://docusaurus.io +- https://vitepress.vuejs.org diff --git a/docs/pages/docs/blog-theme.mdx b/docs/pages/docs/blog-theme.mdx new file mode 100644 index 0000000000..d17eb27aa7 --- /dev/null +++ b/docs/pages/docs/blog-theme.mdx @@ -0,0 +1,6 @@ +# Nextra Blog Theme + +import { Card, Cards } from '@components/card' + + + diff --git a/docs/pages/docs/blog-theme/_meta.json b/docs/pages/docs/blog-theme/_meta.json new file mode 100644 index 0000000000..1aee13bafb --- /dev/null +++ b/docs/pages/docs/blog-theme/_meta.json @@ -0,0 +1,3 @@ +{ + "start": "Get Started" +} diff --git a/docs/pages/docs/blog/index.mdx b/docs/pages/docs/blog-theme/start.mdx similarity index 100% rename from docs/pages/docs/blog/index.mdx rename to docs/pages/docs/blog-theme/start.mdx diff --git a/docs/pages/docs/blog/meta.json b/docs/pages/docs/blog/meta.json deleted file mode 100644 index 4d1b54d062..0000000000 --- a/docs/pages/docs/blog/meta.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "index": "Installation" -} diff --git a/docs/pages/docs/docs-theme.mdx b/docs/pages/docs/docs-theme.mdx index ccf2808d17..af469220b9 100644 --- a/docs/pages/docs/docs-theme.mdx +++ b/docs/pages/docs/docs-theme.mdx @@ -13,13 +13,13 @@ import { Card, Cards } from '@components/card' - } title="Structure" href="/docs/docs-theme/structure"> + } title="Page Configuration" href="/docs/docs-theme/page-configuration"> - } title="Configuration" href="/docs/docs-theme/configuration"> + } title="Theme Configuration" href="/docs/docs-theme/theme-configuration"> diff --git a/docs/pages/docs/docs-theme/_meta.json b/docs/pages/docs/docs-theme/_meta.json new file mode 100644 index 0000000000..acd306a69e --- /dev/null +++ b/docs/pages/docs/docs-theme/_meta.json @@ -0,0 +1,6 @@ +{ + "start": "Get Started", + "page-configuration": "Page Configuration", + "theme-configuration": "Theme Configuration", + "components": "Components" +} diff --git a/docs/pages/docs/docs-theme/configuration.mdx b/docs/pages/docs/docs-theme/configuration.mdx deleted file mode 100644 index 3d9f55b808..0000000000 --- a/docs/pages/docs/docs-theme/configuration.mdx +++ /dev/null @@ -1,239 +0,0 @@ -# Configuration - -To configure the theme, edit or create -the `theme.config.jsx` file in the root -directory and [configure it in `next.config.js`](/docs/docs-theme-start). An example of the configuration is shown below: - -```jsx filename="theme.config.jsx" -export default { - logo: ( - <> - Nextra– The Next Docs Builder - - ), - github: "https://github.com/vercel/swr", - docsRepositoryBase: "https://github.com/vercel/swr-site/blob/master/pages", - titleSuffix: ` – SWR`, - search: true, - toc: true, - darkMode: true, - defaultMenuCollapsed: true, - nextThemes: { - defaultTheme: 'system', - storageKey: 'theme' - }, - navigation: { - next: true, - prev: true - }, - editLinkText: "Edit this page on GitHub", - gitTimestamp: "Last updated on", - feedback: { - link: "Question? Give us feedback →", - labels: "feedback", - }, - serverSideError: { - labels: 'bug', - link: 'Submit an issue about this error →' - }, - sidebar: { - defaultMenuCollapsed: false, - subtitle: null - }, - titleSuffix: ' – Nextra', - toc: { - component: TOC, - extraContent: null, - float: true, - title: 'On This Page' - }, - unstable_faviconGlyph: '' -} -``` - -Detailed information for each configuration option is shown below. - -## `projectLink` - -The URL of the project homepage, used by the icon in the navbar. Usually the GitHub repository. - -**Type:** `string`\ -**Default:** `https://github.com/shuding/nextra` - -## `projectLinkIcon` - -The icon of the project link button, shown in the navbar. - -**Type:** `ReactNode`\ -**Default:** GitHub icon - -**Example:** - -```jsx filename="theme.config.jsx" -import Gitlab from '@geist-ui/react-icons/gitlab' - -export default { - projectLinkIcon: -} -``` - -## `docsRepositoryBase` - -The base URL of the GitHub repository the docs are located in. This will be used by the “Edit this Page” link. - -**Type:** `string`\ -**Default:** `https://github.com/shuding/nextra` - -## `titleSuffix` - -String that will be added to site title as the suffix. - -**Type:** `string | (() => string){:ts}`\ -**Default:** `– Nextra` - -## `navigation` - -Specifies if navigation links (previous page and next page) are being shown at the bottom of a page. - -**Type:** `boolean | { prev?: boolean; next?: boolean }{:ts}`\ -**Default:** `true` - -## `search` - -(todo) - -## `darkMode` - -Specifies if the user can select a dark mode. - -**Type:** `boolean`\ -**Default:** `true` - -## `defaultMenuCollapsed` - -Specifies if folders in the sidebar should be collapsed by default or not. - -**Type:** `boolean`\ -**Default:** `false` - -## `font` - -Specifies if nextra should load its own fonts. Disable this if you want to use a custom font. - -**Type:** `boolean`\ -**Default:** `true` - -## `footer` - -Specifies if the footer should be shown. - -**Type:** `boolean`\ -**Default:** `true` - -## `footerText` - -The text that is shown on the left of the footer. - -**Type:** `ReactNode` - -**Example:** - -```js -export default { - footerText: `MIT ${new Date().getFullYear()} © Nextra.` -} -``` - -## `footerEditLink` - -The text that should be shown on the link that leads to the editable page on the repository. - -**Type:** `boolean`\ -**Default:** `Edit this page` - -**Example:** `Edit this page on GitHub` - -## `logo` - -The logo in the top left. - -**Type:** `ReactNode`\ - -**Example:** - -```jsx -export default { - logo: ( - <> - Nextra - - The Next Docs Builder - - - ) -} -``` - -## `head` - -The head that should be inserted into the html document. - -**Type:** `ReactNode` - -**Example:** - -```jsx -export default { - head: ( - <> - - - - - - - - - - - - ) -} -``` - -## `direction` - -The direction of the text on the page - -**Type:** `ltr` || `rtl` - -## `i18n` - -The internationalization (i18n) config. See more [here](/features/i18n). - -## `floatTOC` - -Specifies if the table of contents of a page -(the headings) should be displayed floating -on the right instead of being integrated in -the menu on the left. - -**Type:** `boolean`\ -**Default:** `false` - -import { Callout } from 'nextra-theme-docs' - -export const Unstable = () => ( - - This is an unstable and experimental feature and not recommended for general - use. - -) - -## `unstable_faviconGlyph` - -A glyph that should be used as a favicon. - -**Type:** `char` - - diff --git a/docs/pages/docs/docs-theme/meta.json b/docs/pages/docs/docs-theme/meta.json deleted file mode 100644 index aeaa380fe2..0000000000 --- a/docs/pages/docs/docs-theme/meta.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "start": "Get Started", - "structure": "Structure", - "configuration": "Configuration", - "components": "Components" -} diff --git a/docs/pages/docs/docs-theme/page-configuration.mdx b/docs/pages/docs/docs-theme/page-configuration.mdx new file mode 100644 index 0000000000..c96ea270c2 --- /dev/null +++ b/docs/pages/docs/docs-theme/page-configuration.mdx @@ -0,0 +1,3 @@ +# Page Configuration + +(todo) \ No newline at end of file diff --git a/docs/pages/docs/docs-theme/start.mdx b/docs/pages/docs/docs-theme/start.mdx index 97b745fd28..1285b9e9da 100644 --- a/docs/pages/docs/docs-theme/start.mdx +++ b/docs/pages/docs/docs-theme/start.mdx @@ -2,10 +2,6 @@ import { Callout, Tab, Tabs } from 'nextra-theme-docs' - - If you need an example, this website itself is built with the docs theme. - - ## Quick Start from Template {/* You can start by creating your own Nextra site and deploying to Vercel by clicking the link: */} @@ -22,23 +18,55 @@ import { Callout, Tab, Tabs } from 'nextra-theme-docs' ## Start from Empty Project -### 1. Install +
+ + +### Install To create a Nextra Docs site manually, you have to install **Next.js**, **React**, **Nextra**, and **Nextra Docs Theme**. In your project directory, run the following command to install the dependencies: - ```bash + ```bash copy pnpm i next react react-dom nextra nextra-theme-docs ``` - ```bash + ```bash copy npm i next react react-dom nextra nextra-theme-docs ``` - ```bash + ```bash copy yarn add next react react-dom nextra nextra-theme-docs ``` @@ -46,7 +74,7 @@ To create a Nextra Docs site manually, you have to install **Next.js**, **React* Like any Next.js projects, you need to also add `scripts` to your `package.json`: -```json filename="package.json" +```json filename="package.json" copy { "scripts": { "dev": "next", @@ -58,11 +86,11 @@ Like any Next.js projects, you need to also add `scripts` to your `package.json` If you already have Next.js running, you only need to install `nextra` and `nextra-theme-docs` as the add-ons. -### 2. Create Next.js Config +### Create Nextra Config Create the following `next.config.js` file in your project’s root directory: -```js filename="next.config.js" +```js filename="next.config.js" copy const withNextra = require('nextra')({ theme: 'nextra-theme-docs', themeConfig: './theme.config.jsx', @@ -78,18 +106,17 @@ import { Card, Cards } from '@components/card' Full Nextra configurations can be found here: +import switchIcon from '@components/icons/switch' + - - } title="Configure Nextra" href="/docs/docs-theme/configuration"> - + -### 3. Create Docs Theme Config +### Create Docs Theme Config Lastly, create the corresponding `theme.config.jsx` file in your project’s root directory: -```jsx filename="theme.config.jsx" +```jsx filename="theme.config.jsx" copy export default { logo: My Nextra Documentation, // ... @@ -99,24 +126,23 @@ export default { More configuration options for the docs theme can be found here: - - } title="Configure Docs Theme" href="/docs/docs-theme/configuration"> - + -### 4. Start Project +### Ready to Go! -Now, you can create an initial Markdown page (`pages/index.mdx`) in your project’s root directory: +Now, you can create an initial MDX page: -```mdx filename="pages/index.mdx" +```mdx filename="pages/index.mdx" copy # Welcome to Nextra Hello, world! ``` -And run the following command to start the project: +And run the `dev` command to start developing the project: -```bash +```bash copy pnpm dev ``` + +
\ No newline at end of file diff --git a/docs/pages/docs/docs-theme/structure.mdx b/docs/pages/docs/docs-theme/structure.mdx deleted file mode 100644 index 604e1471bd..0000000000 --- a/docs/pages/docs/docs-theme/structure.mdx +++ /dev/null @@ -1 +0,0 @@ -(todo) \ No newline at end of file diff --git a/docs/pages/docs/docs-theme/theme-configuration.mdx b/docs/pages/docs/docs-theme/theme-configuration.mdx new file mode 100644 index 0000000000..66a5fb9a1a --- /dev/null +++ b/docs/pages/docs/docs-theme/theme-configuration.mdx @@ -0,0 +1,355 @@ +import cn from 'clsx' +import Image from 'next/future/image' + +export function Screenshot({ src, alt, full }) { + return
+ {alt} +
+} + +# Theme Configuration + +The theme is configured with the [theme.config.jsx](/docs/docs-theme/start#create-docs-theme-config) file. It should export an object that contains your configurations, for example: + +```jsx filename="theme.config.jsx" +export default { + project: { + link: 'https://github.com/shuding/nextra', + }, + logo: Project, + titleSuffix: ' – Project', +} +``` + +Detailed information for each option is listed below. + +import { OptionTable } from 'components/table' + +## Project Link + +Show a button that links to your project’s homepage on the navbar. By default, it links to Nextra’s GitHub repository. + + + +### Use a custom icon + +You can configure `project.link` and `project.icon` to customize the project link, for example make it link to your GitLab repository: + +import projectLinkImage from '../../../public/assets/docs/project-link.png' + + + +```jsx +export default { + project: { + link: 'https://gitlab.com/inkscape/inkscape', + icon: , + }, +} +``` + +If `icon` is missing, it will be a [GitHub icon](https://primer.style/octicons/mark-github-16) by default. + +## Chat Link + +Show a button that links to your project’s forum or other social media on the navbar. + + + +### Customize chat link + +You can configure `chat.link` and `chat.icon` to customize the chat link, for example make it link to your Twitter account: + +```jsx +export default { + chat: { + link: 'https://twitter.com/shuding', + icon: , + }, +} +``` + +If `icon` is missing, it will be a Discord icon by default. + +## Banner + +Show a dismissable banner on the top of the website. It can be used to show a warning or a notice. + + + +### Banner key + +A banner can be dismissed. By default `banner.key` will be `"nextra-banner"` and it’s used by [localStorage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage) to keep the banner state (dismissed or not) on the client. + +If you have updated your banner content, you should change the key to make sure the banner is shown again. The best practice is to always use a descriptive key for the current content, for example: + +import bannerImage from '../../../public/assets/docs/banner.png' + + + +```jsx +export default { + banner: { + key: '2.0-release', + content: + 🎉 Nextra 2.0 is released. Read more → + , + }, +} +``` + +## Navigation + +Show previous and next page links on the bottom of the content. It’s useful for navigating between pages. + + + +import navigationImage from '../../../public/assets/docs/navigation.png' + + + +```jsx +export default { + navigation: { + prev: true, + next: true, + }, +} +``` + +The above is also equivalent to `navigation: true`. + +## Head + +Configure the `` tags of the website. You can add meta tags, title, favicon, etc. + +Component that renders the {''} content.], +]}/> + +### Static head tags + +If you have only static head tags, it’s easy to directly put them in `head`. For example: + +```jsx +export default { + head: ( + <> + + + + + + + + + + ) +} +``` + +### Render Open Graph tags + +## Sidebar + +', 'Custom renderer for sidebar titles.'], +]}/> + +## Title + +In Nextra, the website title will be the content of `

` of each page. If `

` is missing, it will use the page title specified in the [page configuration](/docs/docs-theme/page-configuration). You can also provide a global suffix via the `titleSuffix` option. + + string)', 'The title suffix.'], +]}/> + +import titleSuffixImage from '../../../public/assets/docs/title-suffix.png' + + + +```jsx +export default { + titleSuffix: ' – SWR', +} +``` + +## Footer + +The footer area of the website. You can either specify some content for the default footer, or fully customize it with a custom component. + +', 'Customized footer component.'], +]}/> + +### Copyright information + +You can add some simple content, such as copyright information to the default footer: + +```jsx +export default { + footer: { + content: + MIT ${new Date().getFullYear()} © Nextra. + , + } +} +``` + +## Edit Link + +Show an “Edit this page” link on the page that points to the file URL on GitHub (or other places). + +`, 'Customized edit link component.'], +]}/> + +## Feedback Link + +The built-in feedback link provides a way for users to submit feedback about the documentation. By default, it’s a link that points to the issue creation form of the docs repository, with the current website title prefilled. + + + +## Logo + +The logo of the website rendered on the navbar. It can be any React node. + + + +## Table of Contents + +Show a table of contents on the right side of the page. It’s useful for navigating between headings. + + + +### Floating TOC + +## Extra Content + +Render extra content at the end of the main area of the page. It can be used to render a comment section, a newsletter form, or any other type of content. + + + +## MDX Components + +Provide custom [MDX components](https://mdxjs.com/table-of-components/) to render the content. For example, you can use a custom `pre` component to render code blocks. + +', 'Custom MDX components.'], +]}/> + +## Writing Direction + +The default writing direction of the website. + + + +## Docs Repository + +Set the repository URL of the documentation. It’s used to generate the “[Edit this page](#edit-link)” link and the “[Feedback](#feedback-link)” link. + + + +### Specify path + +If the documentation is inside a monorepo, a subfolder, or a different branch of the repository, you can simply set the `docsRepositoryBase` to the root path of the `pages/` folder of your docs. For example: + +```jsx +export default { + docsRepositoryBase: 'https://github.com/shuding/nextra/blob/core/docs/pages', +} +``` + +Then Nextra will automatically generate the correct file path for all pages. + +## Last Updated Date + +Show the last updated date of each page. It’s useful for showing the freshness of the content. + +', 'Component to render the last updated info.'], +]}/> + +## I18n + +## Navbar + +Customize the navbar of the website. + +', 'Navbar component.'], +]}/> + +## Dark Mode and Themes + +Customize the theme behavior of the website. + + + +## Theme Color + +You can adjust the theme color of the website. + + + +## Error Pages + +### 404 - Not Found + +### 500 - Internal Server Error + +## Search + +`, ''], + ['emptyResult', 'React.ReactNode | React.FC', ''], + ['placeholder', 'string | (() => string)', ''], +]}/> + +## Favicon Glyph (Experimental) + +This isn’t supported by all browsers, but it’s a nice way to customize the favicon of the website. diff --git a/docs/pages/docs/_get-started.mdx b/docs/pages/docs/get-started.mdx.backup similarity index 100% rename from docs/pages/docs/_get-started.mdx rename to docs/pages/docs/get-started.mdx.backup diff --git a/docs/pages/docs/guide.mdx b/docs/pages/docs/guide.mdx index b5aaad7d6d..3a2bd6c6c0 100644 --- a/docs/pages/docs/guide.mdx +++ b/docs/pages/docs/guide.mdx @@ -1 +1,11 @@ -# Guide \ No newline at end of file +# Guide + +import { Card, Cards } from '@components/card' + +import markdownIcon from '@components/icons/markdown' +import globeIcon from '@components/icons/globe' + + + + + diff --git a/docs/pages/docs/guide/meta.json b/docs/pages/docs/guide/_meta.json similarity index 91% rename from docs/pages/docs/guide/meta.json rename to docs/pages/docs/guide/_meta.json index 6f888df05a..f47405413c 100644 --- a/docs/pages/docs/guide/meta.json +++ b/docs/pages/docs/guide/_meta.json @@ -5,7 +5,6 @@ "i18n": "Next.js I18n", "image": "Next.js Image", "link": "Next.js Link", - "themes": "Themes", "typescript": "TypeScript", "cms": "CMS", "advanced": "Advanced" diff --git a/docs/pages/docs/guide/advanced/_meta.json b/docs/pages/docs/guide/advanced/_meta.json new file mode 100644 index 0000000000..26238e0e12 --- /dev/null +++ b/docs/pages/docs/guide/advanced/_meta.json @@ -0,0 +1,4 @@ +{ + "code-highlighting": "Code Highlighting", + "table": "Rendering Tables" +} diff --git a/docs/pages/docs/guide/advanced/code-highlighting.mdx b/docs/pages/docs/guide/advanced/code-highlighting.mdx index 1c21afd84a..b6b94adc7e 100644 --- a/docs/pages/docs/guide/advanced/code-highlighting.mdx +++ b/docs/pages/docs/guide/advanced/code-highlighting.mdx @@ -1,25 +1,11 @@ # Code Highlighting -`nextra-theme-docs` uses [Prism](https://prismjs.com) and [prism-react-renderer](https://github.com/FormidableLabs/prism-react-renderer) -to highlight the code blocks. This section covers how you can customize it. +Nextra uses [Shiki](https://shiki.matsu.io) to do syntax highlighting at build time. It’s very reliable and performant. -## More Languages +## Languages -To keep the bundle small, only a [subset of languages](https://github.com/FormidableLabs/prism-react-renderer/blob/master/src/vendor/prism/includeLangs.js) -are included in the syntax highlighter. If you want to add more languages, you can do the following: +(todo) -1. Run `yarn add prismjs prism-react-renderer` to add dependencies to your Nextra project. -2. Add the following code to your `pages/_app.jsx`: +## Customize The Theme -```jsx filename="_app.jsx" -import Prism from 'prism-react-renderer/prism' -;(typeof global !== 'undefined' ? global : window).Prism = Prism - -require('prismjs/components/prism-kotlin') -require('prismjs/components/prism-csharp') -``` - -Restart your app and you will have Kotlin and C# code highlighting supported. -You can find the full list of available languages [here](https://github.com/PrismJS/prism/tree/master/components). - -{/* ## Custom Themes */} +(todo) diff --git a/docs/pages/docs/guide/advanced/meta.json b/docs/pages/docs/guide/advanced/meta.json deleted file mode 100644 index 92b138d580..0000000000 --- a/docs/pages/docs/guide/advanced/meta.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "code-highlighting": "Code Highlighting" -} diff --git a/docs/pages/docs/guide/advanced/table.mdx b/docs/pages/docs/guide/advanced/table.mdx new file mode 100644 index 0000000000..c1c8a08b22 --- /dev/null +++ b/docs/pages/docs/guide/advanced/table.mdx @@ -0,0 +1,196 @@ +import { Callout } from 'nextra-theme-docs' + +# Rendering Table + +## GFM syntax + +In markdown is preferable write table via [GFM syntax](https://github.github.com/gfm/#tables-extension-). + +```mdx filename="Markdown" +| left | center | right | +| :----- | :----: | ----: | +| foo | bar | baz | +| banana | apple | kiwi | +``` + +will be rendered as: + +| left | center | right | +| :----- | :----: | ----: | +| foo | bar | baz | +| banana | apple | kiwi | + +## HTML Literal Tables + +If you'll try render the following literal `{:jsx}` element: + +```mdx filename="Markdown" +
+ + + + + + + + + + + + + + + + + + + +
leftcenterright
foobarbaz
bananaapplekiwi
+``` + +you'll get the following result: + + + + + + + + + + + + + + + + + + + + + +
leftcenterright
foobarbaz
bananaapplekiwi
+ + + Confused by unstyled elements? We explained [here](#why-this-happens), why it's happens. + + +## Dynamic Tables + +### How to Write + +Want to render dynamic table? You can use embeded JavaScript expressions into your table for it: + +```mdx filename="Markdown" + + + + + + + + + {[ + { country: 'France', flag: '🇫🇷' }, + { country: 'Ukraine', flag: '🇺🇦' } + ].map(item => ( + + + + + ))} + +
CountryFlag
{item.country}{item.flag}
+``` + +will be rendered as: + + + + + + + + + + {[ + { country: 'France', flag: '🇫🇷' }, + { country: 'Ukraine', flag: '🇺🇦' } + ].map(item => ( + + + + + ))} + +
CountryFlag
{item.country}{item.flag}
+ + + Confused by unstyled elements? We explain below 👇, why it's happens. + + +### Unexpected Result + +Table looks different compared to [GFM syntax table](#gfm-syntax): + +1. only children of table body `{:jsx}` is styled + +2. table header is unstyled + +3. table doesn't have margin top + +### Why This Happens + +MDX2 doesn't replace literal HTML elements with `{:jsx}`. + +Adam Wathan, creator of Tailwind CSS submitted [an issue](https://github.com/mdx-js/mdx/issues/821) in MDX2 to have some +_an escape hatch_ that we can name like: + +> please only transform markdown tags, not literal HTML tags + +Table header looks unstyled since not replaced with Nextra's MDX components `{:jsx}`, `{:jsx}` and `{:jsx}`, +for the same reason `{:jsx}` literal is not replaced and doesn't have default margin-top aka `mt-6`. + +### Ways to Fix It + +#### One-Time Fix + +Just wrap your table with curly braces `{` and `}`, e.g. + +```mdx filename="Markdown" +{
+ ... +
} +``` + +#### Changing Default Behaviour + +If this thing is still confusing for you, and you want to use regular literal HTML elements for your tables, do the following: + +1. Install `remark-mdx-disable-explicit-jsx` package + +```sh +pnpm add remark-mdx-disable-explicit-jsx +``` + +2. Setup plugin in `nextra` function inside `next.config.mjs` file + +```js filename="next.config.mjs" {2,7-12} +import nextra from 'nextra' +import remarkMdxDisableExplicitJsx from 'remark-mdx-disable-explicit-jsx' + +const withNextra = nextra({ + theme: 'nextra-theme-docs', + themeConfig: './theme.config.tsx', + remarkPlugins: [ + [ + remarkMdxDisableExplicitJsx, + { whiteList: ['table', 'thead', 'tbody', 'tr', 'th', 'td'] } + ] + ] +}) + +export default withNextra() +``` + diff --git a/docs/pages/docs/guide/i18n.mdx b/docs/pages/docs/guide/i18n.mdx index af821f64e3..0a567b137d 100644 --- a/docs/pages/docs/guide/i18n.mdx +++ b/docs/pages/docs/guide/i18n.mdx @@ -6,7 +6,7 @@ import { Callout } from 'nextra-theme-docs' Nextra supports [Next.js Internationalized Routing](https://nextjs.org/docs/advanced-features/i18n-routing) out of the box. -To add multi-language pages to your Nextra application, just need to config `i18n` in `next.config.js`: +To add multi-language pages to your Nextra application, you need to config `i18n` in `next.config.js` first: ```js filename="next.config.js" const withNextra = require('nextra')('nextra-theme-docs', './theme.config.jsx') @@ -22,12 +22,12 @@ Then, add the locale codes to your file extensions (required for the default loc ```plaintext /pages + _meta.en.json + _meta.zh.json + _meta.de.json index.en.md index.zh.md index.de.md - meta.en.json - meta.zh.json - meta.de.json ... ``` diff --git a/docs/pages/docs/guide/image.mdx b/docs/pages/docs/guide/image.mdx index 8292685d25..c801d5bb8e 100644 --- a/docs/pages/docs/guide/image.mdx +++ b/docs/pages/docs/guide/image.mdx @@ -1,8 +1,6 @@ # Next.js Image -You can use [Next.js Image](https://nextjs.org/docs/basic-features/image-optimization) directly in MDX. - -If the `demo.png` file is located at `/public/demo.png`, you can use the code below to display it: +The standard way to use [Next.js Image](https://nextjs.org/docs/basic-features/image-optimization) inside MDX is to directly import the component: ```mdx import Image from 'next/image' @@ -19,15 +17,13 @@ import { Callout } from 'nextra-theme-docs' true`](/get-started#create-manually). -Nextra also supports automatic static image imports, you no longer need to specify the width and height of the image manually, -and you can directly use the Markdown syntax to display the same image: +Nextra supports automatically optimize your static image imports with the Markdown syntax. You no longer need to specify the width and height of the image manually, +but directly use the `![]()` syntax to display the same image: -```md +```md filename="index.mdx" copy ![Hello](../../../public/demo.png) ``` With Next.js Image, there will be no layout shift, and a beautiful blury placeholder will be shown by default when loading the images: -
- ![Nextra](../../../public/og.png) diff --git a/docs/pages/docs/guide/link.mdx b/docs/pages/docs/guide/link.mdx index e69de29bb2..604e1471bd 100644 --- a/docs/pages/docs/guide/link.mdx +++ b/docs/pages/docs/guide/link.mdx @@ -0,0 +1 @@ +(todo) \ No newline at end of file diff --git a/docs/pages/docs/guide/markdown.mdx b/docs/pages/docs/guide/markdown.mdx index cd5dd1906c..8feb28b418 100644 --- a/docs/pages/docs/guide/markdown.mdx +++ b/docs/pages/docs/guide/markdown.mdx @@ -111,5 +111,6 @@ Inlined syntax highlighting is also supported `let x = 1{:jsx}` via: Inlined syntax highlighting is also supported `let x = 1{:jsx}` via: ```` +(todo: line number and copy) Read more about the syntax highlighting in the next section: diff --git a/docs/pages/docs/guide/organize-files.mdx b/docs/pages/docs/guide/organize-files.mdx index 8032991b80..84553ceab8 100644 --- a/docs/pages/docs/guide/organize-files.mdx +++ b/docs/pages/docs/guide/organize-files.mdx @@ -1 +1,104 @@ -# Organize Files \ No newline at end of file +# Organize Files + +Nextra first collects all your Markdown files and configurations from the `pages` directory, and then generates the “page map information” of your entire site, to render things such as the _navigation bar_ and _sidebar_ below: + +
+ +
+ ![](../../../public/assets/routing@1x.png) + + Example: [Nextra Docs Theme](/docs/docs-theme) has sidebar and navbar + generated automatically from Markdown files. + +
+ +## Default Behavior + +By default, the page map contains all `.md` and `.mdx` filenames and the directory structure, sorted alphabetically. +Then, Nextra will use the [title](https://github.com/vercel/title) package to get formatted page names from filenames. + +For example if you have the following structure: + +``` +pages/ + contact.md + index.mdx + about/ + legal.md + index.mdx +``` + +The resolved page map will be (note that all names were sorted alphabetically): + +```js +[ + { + name: 'About', + children: [ + { name: 'Index' }, + { name: 'Legal' } + ] + }, + { name: 'Contact' }, + { name: 'Index' } +] +``` + +And the global page map will be bundled to each page by Nextra. Then, configured theme will render the actual UI with that page map. + +## \_meta.json + +It’s very common to customize each page’s title, rather than just using the filename. For example it doesn’t make sense to have a page titled “Index”, but instead have a page titled “Home”. + +That’s where `_meta.json` comes in. You can have an `_meta.json` file in each directory, and it will be used to override the default configuration of each page: + +``` +pages/ + _meta.json + contact.md + index.mdx + about/ + _meta.json + legal.md + index.mdx +``` + +And you can put this in your `pages/_meta.json` file: + +```json filename="pages/_meta.json" +{ + "index": "My Homepage", + "contact": "Contact Us", + "about": "About Us" +} +``` + +It tells Nextra the order of each page, and the correct title. Alternatively, you can do it with `title` and have other configurations in there as well: + +```json filename="pages/_meta.json" +{ + "index": "My Homepage", + "contact": "Contact Us", + "about": { + "title": "About Us", + "...extra configurations...": "..." + } +} +``` + +The extra configurations are passed to the **theme** as additional information. Check the corresponding pages for more information: + +import { Card, Cards } from '@components/card' + + + + + + } title="Docs Theme →" href="/docs/docs-theme/page-configuration"/> + + + + } title="Blog Theme →" href="/docs/blog-theme/page-configuration"/> + diff --git a/docs/pages/docs/guide/themes.mdx b/docs/pages/docs/guide/themes.mdx deleted file mode 100644 index 6a2e8cda4f..0000000000 --- a/docs/pages/docs/guide/themes.mdx +++ /dev/null @@ -1,12 +0,0 @@ -# Themes - -Nextra itself is basically a plugin that normalizes your Markdown routes in Next.js into structural data, and it doesn't handle any styling related thing. A **theme** is what renders your actual pages, it works like a layout component in React. - -Nextra has 2 official themes that you can use: - -- [Docs Theme](/themes/docs) -- [Blog Theme](/themes/blog) - -You can also extend your own themes. Here's a great starter example by [@jaredpalmer](https://github.com/jaredpalmer): - -- [Nextra Blank Custom Theme/Boilerplate Example](https://github.com/jaredpalmer/nextra-blank-custom-theme) diff --git a/docs/pages/docs/index.mdx b/docs/pages/docs/index.mdx index d94d477538..c7e99f90a0 100644 --- a/docs/pages/docs/index.mdx +++ b/docs/pages/docs/index.mdx @@ -1,23 +1,31 @@ # Nextra -**Nextra** is a [Next.js](https://nextjs.org) plugin that lets you focus on the actual content. Besides all the great features of Next.js, Nextra gives you extra power to create Markdown-based websites with ease. +**Nextra** is a Next.js plugin that lets you focus on your _content_. You’ll have all the great features from Next.js, plus extra power to create Markdown-based websites with ease. ## Quick Start import { Card, Cards } from '@components/card' +To start using Nextra, you need to select a theme first: + - - } title="Start with docs theme" href="/docs/docs-theme/start"> + + <>![](../../public/assets/docs-theme.png) - - } title="Start with blog theme" href="/docs-theme/installation"> + + <>![](../../public/assets/blog-theme.png) - - } title="Start with empty theme" href="/docs-theme/installation"> + @@ -25,48 +33,51 @@ import { Card, Cards } from '@components/card'
What’s the relationship between Next.js, Nextra and Nextra Themes? - **Next.js** is a general purpose framework for building all kinds of web applications with React. **Nextra** is a Next.js plugin, which provides a complete solution around Markdown (MDX) on top of Next.js. A **Nextra Theme** is basically a “layout component” that determines how a Nextra page is rendered. - - + **Next.js** is a general purpose framework for building all kinds of web applications + with React. **Nextra** is a Next.js plugin, which provides a complete solution + around Markdown (MDX) on top of Next.js. A **Nextra Theme** is basically a “layout + component” that determines how a Nextra page is rendered. + +
diff --git a/docs/pages/docs/installation.mdx b/docs/pages/docs/installation.mdx deleted file mode 100644 index 4026317a86..0000000000 --- a/docs/pages/docs/installation.mdx +++ /dev/null @@ -1,2 +0,0 @@ -# Installation - diff --git a/docs/pages/index.mdx b/docs/pages/index.mdx index 8c952690ad..3dd639712f 100644 --- a/docs/pages/index.mdx +++ b/docs/pages/index.mdx @@ -5,6 +5,7 @@ title: 'Nextra – Next.js Static Site Generator' import Link from 'next/link' import cn from 'clsx' import { useState } from 'react' +import { motion } from "framer-motion" import { Features, Feature } from '@components/features' import { ThemesAnimation } from '@components/features/themes-animation' @@ -17,8 +18,8 @@ export function File({ name, className, ...props }) { } -export function Comparison({ a, b, invert }) { - return
+export function Comparison({ a, b, invert, ...props }) { + return
{a}
@@ -39,9 +40,9 @@ export function I18n() {
- setActive('en')}>English - setActive('de')}>Deutsch - setActive('ja')}>日本語 + setActive('en')}>English + setActive('de')}>Deutsch + setActive('ja')}>日本語
}/> } @@ -49,7 +50,7 @@ export function I18n() {

Make beautiful websites
with Next.js & MDX.

-

Zero-code. Powerful and flexible site generation framework
with everything you love from Next.js.

+

Simple, powerful and flexible site generation framework
with everything you love from Next.js.

Start →

@@ -72,16 +73,18 @@ export function I18n() {
- +

Full-power documentation in minutes.

@@ -124,12 +152,7 @@ export function I18n() { width: '100%', }}/> - +

Advanced syntax highlighting solution.

Performant and reliable build-time syntax highlighting powered by [Shiki](https://shiki.matsu.io).

@@ -149,25 +172,70 @@ export function I18n() { backgroundPosition: 'center', color: '#fff' }}> - + -

MDX 2 lets you use Components in Markdown,
with huge performance boost since v1.

+

MDX 2 lets you use Components inside Markdown,
with huge performance boost since MDX v1.

- -

Dark
mode
included.

+ + Dark
mode
included.
- -

Organize pages intuitively,
with file-system routing from Next.js.

-
- -

MDX from anywhere.

+

Organize pages intuitively,
with file-system routing from Next.js.

+

Links and images are always optimized.

Nextra converts Markdown links and images to [next/link](https://nextjs.org/docs/routing/introduction#linking-between-pages) and [next/image](https://nextjs.org/docs/basic-features/image-optimization#local-images), keeping your website the best experience.

-
{`[Learn more](/more)`}
{`![Hero](../public/hero.png)`}
- } b={ +
+
{``}
{``}
- }/> +
- +

Hybrid rendering,
next generation.

-

[SSG](https://nextjs.org/docs/basic-features/pages#static-generation-recommended), [SSR](https://nextjs.org/docs/basic-features/pages#server-side-rendering), and [ISR](https://nextjs.org/docs/basic-features/data-fetching/incremental-static-regeneration) are all supported. With Nextra,
you can leverage the hybrid rendering power from Next.js
with your Markdown content, in the page level.

+

With Nextra, you can leverage the hybrid rendering power from Next.js with your Markdown content including [SSG](https://nextjs.org/docs/basic-features/pages#static-generation-recommended), [SSR](https://nextjs.org/docs/basic-features/pages#server-side-rendering), and [ISR](https://nextjs.org/docs/basic-features/data-fetching/incremental-static-regeneration).

+
+ +

And more...

- diff --git a/docs/pages/index.module.css b/docs/pages/index.module.css index 0b8721035e..cb2423e3f0 100644 --- a/docs/pages/index.module.css +++ b/docs/pages/index.module.css @@ -22,9 +22,13 @@ .comparison > svg { opacity: 0.3; } -.comparison.invert { - margin: 1.5rem -1.75rem -1.5rem; - padding: 1.5rem 1.75rem; - color: #fff; - background: #111; + +.optimization { + display: flex; + margin: 1rem 0; + padding: 1rem; + background: #0e1116; + color: white; + border-radius: 0.375rem; + font-weight: 300; } diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml index 3b469095f9..00b94d1a33 100644 --- a/docs/pnpm-lock.yaml +++ b/docs/pnpm-lock.yaml @@ -1,28 +1,37 @@ lockfileVersion: 5.4 -specifiers: - '@types/node': ^18.7.8 - clsx: ^1.2.1 - next: ^12.2.3 - nextra: 2.0.0-beta.18 - nextra-theme-docs: 2.0.0-beta.18 - prettier: ^2.7.1 - react: ^17.0.2 - react-dom: ^17.0.2 - typescript: ^4.7.4 - -dependencies: - clsx: 1.2.1 - next: 12.2.5_sfoxds7t5ydpegc3knd667wn6m - nextra: 2.0.0-beta.18_pzmtmsmkyiq4foirxc7gldcjme - nextra-theme-docs: 2.0.0-beta.18_pzmtmsmkyiq4foirxc7gldcjme - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - -devDependencies: - '@types/node': 18.7.8 - prettier: 2.7.1 - typescript: 4.7.4 +importers: + + .: + specifiers: + '@types/node': ^18.7.8 + autoprefixer: ^10.4.8 + clsx: ^1.2.1 + framer-motion: ^7.3.2 + next: ^12.2.3 + nextra: 2.0.0-beta.25 + nextra-theme-docs: 2.0.0-beta.25 + postcss: ^8.4.16 + prettier: ^2.7.1 + react: ^18.2.0 + react-dom: ^18.2.0 + tailwindcss: ^3.1.8 + typescript: ^4.7.4 + dependencies: + clsx: 1.2.1 + framer-motion: 7.3.2_biqbaboplfbrettd7655fr4n2y + next: 12.2.5_biqbaboplfbrettd7655fr4n2y + nextra: 2.0.0-beta.25_3xcjr4wz26biff45sz3jtokgje + nextra-theme-docs: 2.0.0-beta.25_3xcjr4wz26biff45sz3jtokgje + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + devDependencies: + '@types/node': 18.7.8 + autoprefixer: 10.4.8_postcss@8.4.16 + postcss: 8.4.16 + prettier: 2.7.1 + tailwindcss: 3.1.8 + typescript: 4.7.4 packages: @@ -33,15 +42,28 @@ packages: regenerator-runtime: 0.13.9 dev: false - /@headlessui/react/1.6.6_sfoxds7t5ydpegc3knd667wn6m: + /@emotion/is-prop-valid/0.8.8: + resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} + requiresBuild: true + dependencies: + '@emotion/memoize': 0.7.4 + dev: false + optional: true + + /@emotion/memoize/0.7.4: + resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} + dev: false + optional: true + + /@headlessui/react/1.6.6_biqbaboplfbrettd7655fr4n2y: resolution: {integrity: sha512-MFJtmj9Xh/hhBMhLccGbBoSk+sk61BlP6sJe4uQcVMtXZhCgGqd2GyIQzzmsdPdTEWGSF434CBi8mnhR6um46Q==} engines: {node: '>=10'} peerDependencies: react: ^16 || ^17 || ^18 react-dom: ^16 || ^17 || ^18 dependencies: - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 dev: false /@mdx-js/mdx/2.1.3: @@ -68,14 +90,61 @@ packages: - supports-color dev: false - /@mdx-js/react/2.1.3_react@17.0.2: + /@mdx-js/react/2.1.3_react@18.2.0: resolution: {integrity: sha512-11n4lTvvRyxq3OYbWJwEYM+7q6PE0GxKbk0AwYIIQmrRkxDeljIsjDQkKOgdr/orgRRbYy5zi+iERdnwe01CHQ==} peerDependencies: react: '>=16' dependencies: '@types/mdx': 2.0.2 '@types/react': 18.0.17 - react: 17.0.2 + react: 18.2.0 + dev: false + + /@motionone/animation/10.14.0: + resolution: {integrity: sha512-h+1sdyBP8vbxEBW5gPFDnj+m2DCqdlAuf2g6Iafb1lcMnqjsRXWlPw1AXgvUMXmreyhqmPbJqoNfIKdytampRQ==} + dependencies: + '@motionone/easing': 10.14.0 + '@motionone/types': 10.14.0 + '@motionone/utils': 10.14.0 + tslib: 2.4.0 + dev: false + + /@motionone/dom/10.13.1: + resolution: {integrity: sha512-zjfX+AGMIt/fIqd/SL1Lj93S6AiJsEA3oc5M9VkUr+Gz+juRmYN1vfvZd6MvEkSqEjwPQgcjN7rGZHrDB9APfQ==} + dependencies: + '@motionone/animation': 10.14.0 + '@motionone/generators': 10.14.0 + '@motionone/types': 10.14.0 + '@motionone/utils': 10.14.0 + hey-listen: 1.0.8 + tslib: 2.4.0 + dev: false + + /@motionone/easing/10.14.0: + resolution: {integrity: sha512-2vUBdH9uWTlRbuErhcsMmt1jvMTTqvGmn9fHq8FleFDXBlHFs5jZzHJT9iw+4kR1h6a4SZQuCf72b9ji92qNYA==} + dependencies: + '@motionone/utils': 10.14.0 + tslib: 2.4.0 + dev: false + + /@motionone/generators/10.14.0: + resolution: {integrity: sha512-6kRHezoFfIjFN7pPpaxmkdZXD36tQNcyJe3nwVqwJ+ZfC0e3rFmszR8kp9DEVFs9QL/akWjuGPSLBI1tvz+Vjg==} + dependencies: + '@motionone/types': 10.14.0 + '@motionone/utils': 10.14.0 + tslib: 2.4.0 + dev: false + + /@motionone/types/10.14.0: + resolution: {integrity: sha512-3bNWyYBHtVd27KncnJLhksMFQ5o2MSdk1cA/IZqsHtA9DnRM1SYgN01CTcJ8Iw8pCXF5Ocp34tyAjY7WRpOJJQ==} + dev: false + + /@motionone/utils/10.14.0: + resolution: {integrity: sha512-sLWBLPzRqkxmOTRzSaD3LFQXCPHvDzyHJ1a3VP9PRzBxyVd2pv51/gMOsdAcxQ9n+MIeGJnxzXBYplUHKj4jkw==} + dependencies: + '@motionone/types': 10.14.0 + hey-listen: 1.0.8 + tslib: 2.4.0 dev: false /@napi-rs/simple-git-android-arm-eabi/0.1.8: @@ -315,26 +384,47 @@ packages: dev: false optional: true - /@reach/skip-nav/0.17.0_sfoxds7t5ydpegc3knd667wn6m: + /@nodelib/fs.scandir/2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat/2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk/1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.13.0 + dev: true + + /@reach/skip-nav/0.17.0_biqbaboplfbrettd7655fr4n2y: resolution: {integrity: sha512-wkkpQK3ffczzGHis6TaUvpOabuAL9n9Kh5vr4h56XPIJP3X77VcHUDk7MK3HbV1mTgamGxc9Hbd1sXKSWLu3yA==} peerDependencies: react: ^16.8.0 || 17.x react-dom: ^16.8.0 || 17.x dependencies: - '@reach/utils': 0.17.0_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@reach/utils': 0.17.0_biqbaboplfbrettd7655fr4n2y + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 tslib: 2.4.0 dev: false - /@reach/utils/0.17.0_sfoxds7t5ydpegc3knd667wn6m: + /@reach/utils/0.17.0_biqbaboplfbrettd7655fr4n2y: resolution: {integrity: sha512-M5y8fCBbrWeIsxedgcSw6oDlAMQDkl5uv3VnMVJ7guwpf4E48Xlh1v66z/1BgN/WYe2y8mB/ilFD2nysEfdGeA==} peerDependencies: react: ^16.8.0 || 17.x react-dom: ^16.8.0 || 17.x dependencies: - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 tiny-warning: 1.0.3 tslib: 2.4.0 dev: false @@ -423,6 +513,25 @@ packages: acorn: 8.8.0 dev: false + /acorn-node/1.8.2: + resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==} + dependencies: + acorn: 7.4.1 + acorn-walk: 7.2.0 + xtend: 4.0.2 + dev: true + + /acorn-walk/7.2.0: + resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn/7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + /acorn/8.8.0: resolution: {integrity: sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==} engines: {node: '>=0.4.0'} @@ -436,6 +545,14 @@ packages: color-convert: 1.9.3 dev: false + /anymatch/3.1.2: + resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + /arch/2.2.0: resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} dev: false @@ -444,6 +561,10 @@ packages: resolution: {integrity: sha512-Wk7TEzl1KqvTGs/uyhmHO/3XLd3t1UeU4IstvPXVzGPM522cTjqjNZ99esCkcL52sjqjo8e8CTBcWhkxvGzoAw==} dev: false + /arg/5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + dev: true + /argparse/1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: @@ -455,13 +576,56 @@ packages: hasBin: true dev: false + /autoprefixer/10.4.8_postcss@8.4.16: + resolution: {integrity: sha512-75Jr6Q/XpTqEf6D2ltS5uMewJIx5irCU1oBYJrWjFenq/m12WRRrz6g15L1EIoYvPLXTbEry7rDOwrcYNj77xw==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.21.3 + caniuse-lite: 1.0.30001380 + fraction.js: 4.2.0 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.16 + postcss-value-parser: 4.2.0 + dev: true + /bail/2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} dev: false + /binary-extensions/2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /browserslist/4.21.3: + resolution: {integrity: sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001380 + electron-to-chromium: 1.4.246 + node-releases: 2.0.6 + update-browserslist-db: 1.0.7_browserslist@4.21.3 + dev: true + + /camelcase-css/2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + dev: true + /caniuse-lite/1.0.30001380: resolution: {integrity: sha512-OO+pPubxx16lkI7TVrbFpde8XHz66SMwstl1YWpg6uMGw56XnhYVwtPIjvX4kYpzwMwQKr4DDce394E03dQPGg==} - dev: false /ccount/2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -492,6 +656,21 @@ packages: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} dev: false + /chokidar/3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.2 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + /clipboardy/1.2.2: resolution: {integrity: sha512-16KrBOV7bHmHdxcQiCvfUFYVFyEah4FI8vYT1Fr7CGSA4G+xBWMEfUEQJS1hxeHGtI9ju1Bzs9uXSbj5HZKArw==} engines: {node: '>=4'} @@ -515,6 +694,10 @@ packages: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} dev: false + /color-name/1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + /comma-separated-tokens/2.0.2: resolution: {integrity: sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg==} dev: false @@ -531,6 +714,12 @@ packages: which: 1.3.1 dev: false + /cssesc/3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: true + /csstype/3.1.0: resolution: {integrity: sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==} dev: false @@ -553,16 +742,47 @@ packages: character-entities: 2.0.2 dev: false + /defined/1.0.0: + resolution: {integrity: sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==} + dev: true + /dequal/2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} dev: false + /detective/5.2.1: + resolution: {integrity: sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==} + engines: {node: '>=0.8.0'} + hasBin: true + dependencies: + acorn-node: 1.8.2 + defined: 1.0.0 + minimist: 1.2.6 + dev: true + + /didyoumean/1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + dev: true + /diff/5.1.0: resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} engines: {node: '>=0.3.1'} dev: false + /dlv/1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dev: true + + /electron-to-chromium/1.4.246: + resolution: {integrity: sha512-/wFCHUE+Hocqr/LlVGsuKLIw4P2lBWwFIDcNMDpJGzyIysQV4aycpoOitAs32FT94EHKnNqDR/CVZJFbXEufJA==} + dev: true + + /escalade/3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + /escape-string-regexp/1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -609,6 +829,13 @@ packages: source-map: 0.7.4 dev: false + /estree-util-value-to-estree/1.3.0: + resolution: {integrity: sha512-Y+ughcF9jSUJvncXwqRageavjrNPAI+1M/L3BI3PyLp1nmgYTGUXU6t5z1Y7OWuThoDdhPME07bQU+d5LxdJqw==} + engines: {node: '>=12.0.0'} + dependencies: + is-plain-obj: 3.0.0 + dev: false + /estree-util-visit/1.2.0: resolution: {integrity: sha512-wdsoqhWueuJKsh5hqLw3j8lwFqNStm92VcwtAOAny8g/KS/l5Y8RISjR4k5W6skCj3Nirag/WUCMS0Nfy3sgsg==} dependencies: @@ -644,6 +871,30 @@ packages: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} dev: false + /fast-glob/3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fastq/1.13.0: + resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fill-range/7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + /flexsearch/0.7.21: resolution: {integrity: sha512-W7cHV7Hrwjid6lWmy0IhsWDFQboWSng25U3VVywpHOTJnnAZNPScog67G+cVpeX9f7yDD21ih0WDrMMT+JoaYg==} dev: false @@ -652,6 +903,46 @@ packages: resolution: {integrity: sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ==} dev: false + /fraction.js/4.2.0: + resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} + dev: true + + /framer-motion/7.3.2_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-BTG0BqJSwxoFBWpwaaxS/954DGZFsluF+dUv9Hfq53VNkwUt5g+wYTEM66oTUhiH/+6R/y0Rq+BmkUBcmzbyMQ==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@motionone/dom': 10.13.1 + framesync: 6.1.2 + hey-listen: 1.0.8 + popmotion: 11.0.5 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + style-value-types: 5.1.2 + tslib: 2.4.0 + optionalDependencies: + '@emotion/is-prop-valid': 0.8.8 + dev: false + + /framesync/6.1.2: + resolution: {integrity: sha512-jBTqhX6KaQVDyus8muwZbBeGGP0XgujBRbQ7gM7BRdS3CadCZIHiawyzYLnafYcvZIh5j8WE7cxZKFn7dXhu9g==} + dependencies: + tslib: 2.4.0 + dev: false + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind/1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + /get-stream/3.0.0: resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} engines: {node: '>=4'} @@ -661,6 +952,20 @@ packages: resolution: {integrity: sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==} dev: false + /glob-parent/5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent/6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + /graceful-fs/4.2.10: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} dev: false @@ -680,6 +985,13 @@ packages: engines: {node: '>=0.10.0'} dev: false + /has/1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + /hast-util-to-estree/2.1.0: resolution: {integrity: sha512-Vwch1etMRmm89xGgz+voWXvVHba2iiMdGMKmaMfYt35rbVtFDq8JNwwAIvi8zHMkO6Gvqo9oTMwJTmzVRfXh4g==} dependencies: @@ -710,6 +1022,10 @@ packages: resolution: {integrity: sha512-Pkw+xBHuV6xFeJprJe2BBEoDV+AvQySaz3pPDRUs5PNZEMQjpXJJueqrpcHIXxnWTcAGi/UOCgVShlkY6kLoqg==} dev: false + /hey-listen/1.0.8: + resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} + dev: false + /inline-style-parser/0.1.1: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} dev: false @@ -729,11 +1045,24 @@ packages: is-decimal: 2.0.1 dev: false + /is-binary-path/2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + /is-buffer/2.0.5: resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} engines: {node: '>=4'} dev: false + /is-core-module/2.10.0: + resolution: {integrity: sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==} + dependencies: + has: 1.0.3 + dev: true + /is-decimal/2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} dev: false @@ -743,10 +1072,32 @@ packages: engines: {node: '>=0.10.0'} dev: false + /is-extglob/2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-glob/4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + /is-hexadecimal/2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} dev: false + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-plain-obj/3.0.0: + resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} + engines: {node: '>=10'} + dev: false + /is-plain-obj/4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} @@ -793,6 +1144,11 @@ packages: engines: {node: '>=6'} dev: false + /lilconfig/2.0.6: + resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==} + engines: {node: '>=10'} + dev: true + /longest-streak/3.0.1: resolution: {integrity: sha512-cHlYSUpL2s7Fb3394mYxwTYj8niTaNHUCLr0qdiCXQfSjfuA7CKofpX2uSwEfFDQ0EB7JcnMnm+GjbqqoinYYg==} dev: false @@ -1002,6 +1358,11 @@ packages: resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} dev: false + /merge2/1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + /micromark-core-commonmark/1.0.6: resolution: {integrity: sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==} dependencies: @@ -1334,6 +1695,18 @@ packages: - supports-color dev: false + /micromatch/4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /minimist/1.2.6: + resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} + dev: true + /mri/1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -1347,21 +1720,20 @@ packages: resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - dev: false - /next-themes/0.2.0_pzmtmsmkyiq4foirxc7gldcjme: + /next-themes/0.2.0_3xcjr4wz26biff45sz3jtokgje: resolution: {integrity: sha512-myhpDL4vadBD9YDSHiewqvzorGzB03N84e+3LxCwHRlM/hiBOaW+UsKsQojQAzC7fdcJA0l2ppveXcYaVV+hxQ==} peerDependencies: next: '*' react: '*' react-dom: '*' dependencies: - next: 12.2.5_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + next: 12.2.5_biqbaboplfbrettd7655fr4n2y + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 dev: false - /next/12.2.5_sfoxds7t5ydpegc3knd667wn6m: + /next/12.2.5_biqbaboplfbrettd7655fr4n2y: resolution: {integrity: sha512-tBdjqX5XC/oFs/6gxrZhjmiq90YWizUYU6qOWAfat7zJwrwapJ+BYgX2PmiacunXMaRpeVT4vz5MSPSLgNkrpA==} engines: {node: '>=12.22.0'} hasBin: true @@ -1383,10 +1755,10 @@ packages: '@swc/helpers': 0.4.3 caniuse-lite: 1.0.30001380 postcss: 8.4.14 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - styled-jsx: 5.0.4_react@17.0.2 - use-sync-external-store: 1.2.0_react@17.0.2 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + styled-jsx: 5.0.4_react@18.2.0 + use-sync-external-store: 1.2.0_react@18.2.0 optionalDependencies: '@next/swc-android-arm-eabi': 12.2.5 '@next/swc-android-arm64': 12.2.5 @@ -1406,55 +1778,71 @@ packages: - babel-plugin-macros dev: false - /nextra-theme-docs/2.0.0-beta.18_pzmtmsmkyiq4foirxc7gldcjme: - resolution: {integrity: sha512-lvJ39ICR3R9/w1JjLTBVsP+1zxyC0DMz5DIWcLpGfwapZAqxj8fXFinA3XCRC5QCdzAbP6O+p4Miswl32wa1/w==} + /nextra-theme-docs/2.0.0-beta.25_3xcjr4wz26biff45sz3jtokgje: + resolution: {integrity: sha512-fvvSuH3IGUKofE0KN94Kh7JxmbkMFh+tnPC4cyZZQCU8U1QYB4EU5WcPTVTFsRg2nw9qTqy5AUQm5aMXUfyaRw==} peerDependencies: next: '>=9.5.3' react: '>=16.13.1' react-dom: '>=16.13.1' dependencies: - '@headlessui/react': 1.6.6_sfoxds7t5ydpegc3knd667wn6m - '@mdx-js/react': 2.1.3_react@17.0.2 - '@reach/skip-nav': 0.17.0_sfoxds7t5ydpegc3knd667wn6m + '@headlessui/react': 1.6.6_biqbaboplfbrettd7655fr4n2y + '@mdx-js/react': 2.1.3_react@18.2.0 + '@reach/skip-nav': 0.17.0_biqbaboplfbrettd7655fr4n2y clsx: 1.2.1 flexsearch: 0.7.21 focus-visible: 5.2.0 github-slugger: 1.4.0 intersection-observer: 0.12.2 match-sorter: 6.3.1 - next: 12.2.5_sfoxds7t5ydpegc3knd667wn6m - next-themes: 0.2.0_pzmtmsmkyiq4foirxc7gldcjme + next: 12.2.5_biqbaboplfbrettd7655fr4n2y + next-themes: 0.2.0_3xcjr4wz26biff45sz3jtokgje parse-git-url: 1.0.1 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 scroll-into-view-if-needed: 2.2.29 - title: 3.5.2 dev: false - /nextra/2.0.0-beta.18_pzmtmsmkyiq4foirxc7gldcjme: - resolution: {integrity: sha512-MmAQ4FAquEzIsEz0HDaGeuEHBXv6sHW3MCylZZ9OgIV/me+fOCX8zqsmKWOqW32CYGzK/B2mJOPkZ0PcD8gK7Q==} + /nextra/2.0.0-beta.25_3xcjr4wz26biff45sz3jtokgje: + resolution: {integrity: sha512-fNAlD7+M/o5ZdvoH5YuF+Znv7n4K5kpl3tLoEQl2dkpjLZDuptKtyVV95F2//kraVqthEg5uji8ZWThbwCPkpA==} peerDependencies: next: '>=9.5.3' react: '>=16.13.1' - react-dom: '>=18.2.0' + react-dom: '>=16.13.1' dependencies: '@mdx-js/mdx': 2.1.3 '@napi-rs/simple-git': 0.1.8 github-slugger: 1.4.0 graceful-fs: 4.2.10 gray-matter: 4.0.3 - next: 12.2.5_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + next: 12.2.5_biqbaboplfbrettd7655fr4n2y + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 rehype-mdx-title: 1.0.0 rehype-pretty-code: 0.2.4_shiki@0.10.1 remark-gfm: 3.0.1 + remark-reading-time: 2.0.1 shiki: 0.10.1 slash: 3.0.0 + title: 3.5.3 + unist-util-visit: 4.1.1 transitivePeerDependencies: - supports-color dev: false + /node-releases/2.0.6: + resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==} + dev: true + + /normalize-path/3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /normalize-range/0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: true + /npm-run-path/2.0.2: resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} engines: {node: '>=4'} @@ -1462,10 +1850,10 @@ packages: path-key: 2.0.1 dev: false - /object-assign/4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: false + /object-hash/3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + dev: true /p-finally/1.0.0: resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} @@ -1498,6 +1886,10 @@ packages: engines: {node: '>=4'} dev: false + /path-parse/1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + /periscopic/3.0.4: resolution: {integrity: sha512-SFx68DxCv0Iyo6APZuw/AKewkkThGwssmU0QWtTlvov3VAtPX+QJ4CadwSaz8nrT5jPIuxdvJWB4PnD2KNDxQg==} dependencies: @@ -1507,8 +1899,87 @@ packages: /picocolors/1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pify/2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: true + + /popmotion/11.0.5: + resolution: {integrity: sha512-la8gPM1WYeFznb/JqF4GiTkRRPZsfaj2+kCxqQgr2MJylMmIKUwBfWW8Wa5fml/8gmtlD5yI01MP1QCZPWmppA==} + dependencies: + framesync: 6.1.2 + hey-listen: 1.0.8 + style-value-types: 5.1.2 + tslib: 2.4.0 dev: false + /postcss-import/14.1.0_postcss@8.4.16: + resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==} + engines: {node: '>=10.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.16 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.1 + dev: true + + /postcss-js/4.0.0_postcss@8.4.16: + resolution: {integrity: sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.3.3 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.16 + dev: true + + /postcss-load-config/3.1.4_postcss@8.4.16: + resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} + engines: {node: '>= 10'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 2.0.6 + postcss: 8.4.16 + yaml: 1.10.2 + dev: true + + /postcss-nested/5.0.6_postcss@8.4.16: + resolution: {integrity: sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.16 + postcss-selector-parser: 6.0.10 + dev: true + + /postcss-selector-parser/6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /postcss-value-parser/4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: true + /postcss/8.4.14: resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} engines: {node: ^10 || ^12 || >=14} @@ -1518,6 +1989,15 @@ packages: source-map-js: 1.0.2 dev: false + /postcss/8.4.16: + resolution: {integrity: sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.4 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + /prettier/2.7.1: resolution: {integrity: sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==} engines: {node: '>=10.13.0'} @@ -1532,23 +2012,47 @@ packages: resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} dev: false - /react-dom/17.0.2_react@17.0.2: - resolution: {integrity: sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==} + /queue-microtask/1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /quick-lru/5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + dev: true + + /react-dom/18.2.0_react@18.2.0: + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} peerDependencies: - react: 17.0.2 + react: ^18.2.0 dependencies: loose-envify: 1.4.0 - object-assign: 4.1.1 - react: 17.0.2 - scheduler: 0.20.2 + react: 18.2.0 + scheduler: 0.23.0 dev: false - /react/17.0.2: - resolution: {integrity: sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==} + /react/18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} engines: {node: '>=0.10.0'} dependencies: loose-envify: 1.4.0 - object-assign: 4.1.1 + dev: false + + /read-cache/1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + dependencies: + pify: 2.3.0 + dev: true + + /readdirp/3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /reading-time/1.5.0: + resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==} dev: false /regenerator-runtime/0.13.9: @@ -1604,6 +2108,15 @@ packages: - supports-color dev: false + /remark-reading-time/2.0.1: + resolution: {integrity: sha512-fy4BKy9SRhtYbEHvp6AItbRTnrhiDGbqLQTSYVbQPGuRCncU1ubSsh9p/W5QZSxtYcUXv8KGL0xBgPLyNJA1xw==} + dependencies: + estree-util-is-identifier-name: 2.0.1 + estree-util-value-to-estree: 1.3.0 + reading-time: 1.5.0 + unist-util-visit: 3.1.0 + dev: false + /remark-rehype/10.1.0: resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} dependencies: @@ -1617,6 +2130,26 @@ packages: resolution: {integrity: sha1-CkPTqq4egNuRngeuJUsoXZ4ce7U=} dev: false + /resolve/1.22.1: + resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} + hasBin: true + dependencies: + is-core-module: 2.10.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /reusify/1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /run-parallel/1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + /sade/1.8.1: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} @@ -1624,11 +2157,10 @@ packages: mri: 1.2.0 dev: false - /scheduler/0.20.2: - resolution: {integrity: sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==} + /scheduler/0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} dependencies: loose-envify: 1.4.0 - object-assign: 4.1.1 dev: false /scroll-into-view-if-needed/2.2.29: @@ -1677,7 +2209,6 @@ packages: /source-map-js/1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} - dev: false /source-map/0.7.4: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} @@ -1715,7 +2246,14 @@ packages: inline-style-parser: 0.1.1 dev: false - /styled-jsx/5.0.4_react@17.0.2: + /style-value-types/5.1.2: + resolution: {integrity: sha512-Vs9fNreYF9j6W2VvuDTP7kepALi7sk0xtk2Tu8Yxi9UoajJdEVpNpCov0HsLTqXvNGKX+Uv09pkozVITi1jf3Q==} + dependencies: + hey-listen: 1.0.8 + tslib: 2.4.0 + dev: false + + /styled-jsx/5.0.4_react@18.2.0: resolution: {integrity: sha512-sDFWLbg4zR+UkNzfk5lPilyIgtpddfxXEULxhujorr5jtePTUqiPDc5BC0v1NRqTr/WaFBGQQUoYToGlF4B2KQ==} engines: {node: '>= 12.0.0'} peerDependencies: @@ -1728,7 +2266,7 @@ packages: babel-plugin-macros: optional: true dependencies: - react: 17.0.2 + react: 18.2.0 dev: false /supports-color/4.5.0: @@ -1738,12 +2276,48 @@ packages: has-flag: 2.0.0 dev: false + /supports-preserve-symlinks-flag/1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /tailwindcss/3.1.8: + resolution: {integrity: sha512-YSneUCZSFDYMwk+TGq8qYFdCA3yfBRdBlS7txSq0LUmzyeqRe3a8fBQzbz9M3WS/iFT4BNf/nmw9mEzrnSaC0g==} + engines: {node: '>=12.13.0'} + hasBin: true + dependencies: + arg: 5.0.2 + chokidar: 3.5.3 + color-name: 1.1.4 + detective: 5.2.1 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.2.12 + glob-parent: 6.0.2 + is-glob: 4.0.3 + lilconfig: 2.0.6 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.16 + postcss-import: 14.1.0_postcss@8.4.16 + postcss-js: 4.0.0_postcss@8.4.16 + postcss-load-config: 3.1.4_postcss@8.4.16 + postcss-nested: 5.0.6_postcss@8.4.16 + postcss-selector-parser: 6.0.10 + postcss-value-parser: 4.2.0 + quick-lru: 5.1.1 + resolve: 1.22.1 + transitivePeerDependencies: + - ts-node + dev: true + /tiny-warning/1.0.3: resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} dev: false - /title/3.5.2: - resolution: {integrity: sha512-PD9x2repsKvhDr/aE8mz9JlcyGKbTPOhIRraioVi9gc8AZEVok875UPFnWHFs97ddIomPC/oThpENPx3HhV5kg==} + /title/3.5.3: + resolution: {integrity: sha512-20JyowYglSEeCvZv3EZ0nZ046vLarO37prvV0mbtQV7C8DJPGgN967r8SJkqd3XK3K3lD3/Iyfp3avjfil8Q2Q==} hasBin: true dependencies: arg: 1.0.0 @@ -1757,6 +2331,13 @@ packages: engines: {node: '>=0.10.0'} dev: false + /to-regex-range/5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + /trim-lines/3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} dev: false @@ -1837,6 +2418,13 @@ packages: unist-util-is: 4.1.0 dev: false + /unist-util-visit-parents/4.1.1: + resolution: {integrity: sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==} + dependencies: + '@types/unist': 2.0.6 + unist-util-is: 5.1.1 + dev: false + /unist-util-visit-parents/5.1.1: resolution: {integrity: sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==} dependencies: @@ -1852,6 +2440,14 @@ packages: unist-util-visit-parents: 3.1.1 dev: false + /unist-util-visit/3.1.0: + resolution: {integrity: sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==} + dependencies: + '@types/unist': 2.0.6 + unist-util-is: 5.1.1 + unist-util-visit-parents: 4.1.1 + dev: false + /unist-util-visit/4.1.1: resolution: {integrity: sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg==} dependencies: @@ -1860,14 +2456,29 @@ packages: unist-util-visit-parents: 5.1.1 dev: false - /use-sync-external-store/1.2.0_react@17.0.2: + /update-browserslist-db/1.0.7_browserslist@4.21.3: + resolution: {integrity: sha512-iN/XYesmZ2RmmWAiI4Z5rq0YqSiv0brj9Ce9CfhNE4xIW2h+MFxcgkxIzZ+ShkFPUkjU3gQ+3oypadD3RAMtrg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.3 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /use-sync-external-store/1.2.0_react@18.2.0: resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - react: 17.0.2 + react: 18.2.0 dev: false + /util-deprecate/1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + /uvu/0.5.6: resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} engines: {node: '>=8'} @@ -1917,10 +2528,20 @@ packages: isexe: 2.0.0 dev: false + /xtend/4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + dev: true + /yallist/2.1.2: resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} dev: false + /yaml/1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: true + /zwitch/2.0.2: resolution: {integrity: sha512-JZxotl7SxAJH0j7dN4pxsTV6ZLXoLdGME+PsjkL/DaBrVryK9kTGq06GfKrwcSOqypP+fdXGoCHE36b99fWVoA==} dev: false diff --git a/docs/pnpm-workspace.yaml b/docs/pnpm-workspace.yaml new file mode 100644 index 0000000000..56124949fb --- /dev/null +++ b/docs/pnpm-workspace.yaml @@ -0,0 +1 @@ +packages: \ No newline at end of file diff --git a/docs/postcss.config.js b/docs/postcss.config.js new file mode 100644 index 0000000000..ed947f440f --- /dev/null +++ b/docs/postcss.config.js @@ -0,0 +1,8 @@ +// If you want to use other PostCSS plugins, see the following: +// https://tailwindcss.com/docs/using-with-preprocessors +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {} + } +} diff --git a/docs/public/assets/blog-theme.png b/docs/public/assets/blog-theme.png new file mode 100644 index 0000000000..7403aa8ffb Binary files /dev/null and b/docs/public/assets/blog-theme.png differ diff --git a/docs/public/assets/docs-theme.png b/docs/public/assets/docs-theme.png new file mode 100644 index 0000000000..da3e5f1d88 Binary files /dev/null and b/docs/public/assets/docs-theme.png differ diff --git a/docs/public/assets/docs/banner.png b/docs/public/assets/docs/banner.png new file mode 100644 index 0000000000..64b902d788 Binary files /dev/null and b/docs/public/assets/docs/banner.png differ diff --git a/docs/public/assets/docs/navigation.png b/docs/public/assets/docs/navigation.png new file mode 100644 index 0000000000..be23ccbca5 Binary files /dev/null and b/docs/public/assets/docs/navigation.png differ diff --git a/docs/public/assets/docs/project-link.png b/docs/public/assets/docs/project-link.png new file mode 100644 index 0000000000..bcf301df39 Binary files /dev/null and b/docs/public/assets/docs/project-link.png differ diff --git a/docs/public/assets/docs/title-suffix.png b/docs/public/assets/docs/title-suffix.png new file mode 100644 index 0000000000..4a3f64c739 Binary files /dev/null and b/docs/public/assets/docs/title-suffix.png differ diff --git a/docs/style.css b/docs/style.css index 1f9d24f094..0fb5f987c1 100644 --- a/docs/style.css +++ b/docs/style.css @@ -1,6 +1,10 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + .home-content p { - margin-top: 1.5rem; - line-height: 1.75rem; + margin-top: 1.5em; + line-height: 1.75em; } .home-content a { @@ -11,3 +15,29 @@ text-decoration-thickness: from-font; color: hsl(var(--nextra-primary-hue) 100% 50% / var(--tw-text-opacity)); } + +figurecaption { + font-size: 0.85rem; + line-height: 1.5rem; + display: block; + text-align: center; +} + +code.text-\[\.9em\] { + font-size: 14px; +} + +@media screen and (max-width: 1200px) { + .home-content .hide-medium { + display: none; + } +} + +@media screen and (max-width: 720px) { + .home-content p { + font-size: 0.9rem; + } + .home-content .hide-small { + display: none; + } +} diff --git a/docs/tailwind.config.js b/docs/tailwind.config.js new file mode 100644 index 0000000000..a2488ed014 --- /dev/null +++ b/docs/tailwind.config.js @@ -0,0 +1,12 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: [ + './pages/**/*.{js,ts,jsx,tsx,mdx}', + './components/**/*.{js,ts,jsx,tsx}' + ], + theme: { + extend: {} + }, + plugins: [], + darkMode: 'class' +} diff --git a/docs/theme.config.tsx b/docs/theme.config.tsx index 1b12625e06..bfd14e7388 100644 --- a/docs/theme.config.tsx +++ b/docs/theme.config.tsx @@ -1,7 +1,8 @@ +import type { DocsThemeConfig } from 'nextra-theme-docs' import { useRouter } from 'next/router' const logo = ( - <> + - + ) export default { - github: 'https://github.com/shuding/nextra', + project: { + link: 'https://github.com/shuding/nextra' + }, docsRepositoryBase: 'https://github.com/shuding/nextra/blob/master', titleSuffix: () => { const { route } = useRouter() @@ -78,14 +82,29 @@ export default { /> ), - banner: - '🚧 This is a work-in-progress docs for Nextra 2.0, content may be incomplete or inaccurate.', - search: true, - prevLinks: true, - nextLinks: true, - footer: true, - footerEditLink: 'Edit this page on GitHub', - footerText: `MIT ${new Date().getFullYear()} © Nextra.`, - floatTOC: true, - defaultMenuCollapsed: true -} + banner: { + key: '2.0-release', + text: ( + + 🎉 Nextra 2.0 is released. Read more → + + ) + }, + navigation: { + prev: true, + next: true + }, + editLink: { + text: 'Edit this page on GitHub' + }, + footer: { + text: `MIT ${new Date().getFullYear()} © Nextra.` + }, + toc: { + float: true + }, + sidebar: { + defaultMenuCollapsed: true, + subtitle: ({ title }) => <>{title} + } +} as DocsThemeConfig diff --git a/examples/swr-site/theme.config.tsx b/examples/swr-site/theme.config.tsx index 56caf047b1..a0b1cb180d 100644 --- a/examples/swr-site/theme.config.tsx +++ b/examples/swr-site/theme.config.tsx @@ -103,7 +103,7 @@ const config: DocsThemeConfig = { }, feedback: { labels: "feedback", - link: "Question? Give us feedback →", + content: "Question? Give us feedback →", }, footer: { text() { @@ -120,7 +120,10 @@ const config: DocsThemeConfig = { ); }, }, - github: "https://github.com/vercel/swr", + gitTimestamp: "Last updated on", + project: { + link: "https://github.com/vercel/swr", + }, head() { const config = useConfig(); const description = @@ -195,7 +198,7 @@ const config: DocsThemeConfig = { }, sidebar: { defaultMenuCollapsed: true, - subtitle: ({ title }) => ( + titleComponent: ({ title }) => (
{title} diff --git a/packages/nextra-theme-docs/src/components/head.tsx b/packages/nextra-theme-docs/src/components/head.tsx index bf8b52c58c..38722ac284 100644 --- a/packages/nextra-theme-docs/src/components/head.tsx +++ b/packages/nextra-theme-docs/src/components/head.tsx @@ -21,10 +21,10 @@ export function Head(): ReactElement { return ( {config.title + renderString(config.titleSuffix)} - {config.unstable_faviconGlyph ? ( + {config.faviconGlyph ? ( ${config.unstable_faviconGlyph}`} + href={`data:image/svg+xml;utf8,${config.faviconGlyph}`} /> ) : null} {mounted ? ( diff --git a/packages/nextra-theme-docs/src/components/nav-links.tsx b/packages/nextra-theme-docs/src/components/nav-links.tsx index 9e4fb0bdc2..d62fdf03ca 100644 --- a/packages/nextra-theme-docs/src/components/nav-links.tsx +++ b/packages/nextra-theme-docs/src/components/nav-links.tsx @@ -20,8 +20,16 @@ export const NavLinks = ({ currentIndex }: NavLinkProps): ReactElement | null => { const config = useConfig() - const prev = config.navigation.prev ? flatDirectories[currentIndex - 1] : null - const next = config.navigation.next ? flatDirectories[currentIndex + 1] : null + const navigation: { prev?: boolean; next?: boolean } = + typeof config.navigation === 'boolean' + ? config.navigation === false + ? { prev: false, next: false } + : {} + : config.navigation + const prev = + navigation.prev === false ? null : flatDirectories[currentIndex - 1] + const next = + navigation.next === false ? null : flatDirectories[currentIndex + 1] if (!prev && !next) return null diff --git a/packages/nextra-theme-docs/src/components/navbar.tsx b/packages/nextra-theme-docs/src/components/navbar.tsx index a1df514395..f2b47d5a36 100644 --- a/packages/nextra-theme-docs/src/components/navbar.tsx +++ b/packages/nextra-theme-docs/src/components/navbar.tsx @@ -155,23 +155,23 @@ export function Navbar({ flatDirectories, items }: NavBarProps): ReactElement { className: 'hidden md:inline-block min-w-[200px]' })} - {config.project.link || config.github ? ( + {config.project.link ? ( {renderComponent(config.project.icon)} ) : null} - {config.projectChat.link ? ( + {config.chat.link ? ( - {renderComponent(config.projectChat.icon)} + {renderComponent(config.chat.icon)} ) : null} diff --git a/packages/nextra-theme-docs/src/components/not-found.tsx b/packages/nextra-theme-docs/src/components/not-found.tsx index 0cd41ac263..2e91284a39 100644 --- a/packages/nextra-theme-docs/src/components/not-found.tsx +++ b/packages/nextra-theme-docs/src/components/not-found.tsx @@ -9,8 +9,8 @@ export function NotFoundPage(): ReactElement | null { const config = useConfig() const mounted = useMounted() const { asPath } = useRouter() - const { link, labels } = config.notFound - if (!link) { + const { content, labels } = config.notFound + if (!content) { return null } @@ -25,7 +25,7 @@ export function NotFoundPage(): ReactElement | null { newWindow className="ring-primary-500/30 focus:outline-none focus-visible:ring text-primary-500 underline decoration-from-font [text-underline-position:under]" > - {renderComponent(link)} + {renderComponent(content)}

) diff --git a/packages/nextra-theme-docs/src/components/server-side-error.tsx b/packages/nextra-theme-docs/src/components/server-side-error.tsx index fef8058b46..eea6f09f7a 100644 --- a/packages/nextra-theme-docs/src/components/server-side-error.tsx +++ b/packages/nextra-theme-docs/src/components/server-side-error.tsx @@ -9,8 +9,8 @@ export function ServerSideErrorPage(): ReactElement | null { const config = useConfig() const mounted = useMounted() const { asPath } = useRouter() - const { link, labels } = config.serverSideError - if (!link) { + const { content, labels } = config.serverSideError + if (!content) { return null } @@ -27,7 +27,7 @@ export function ServerSideErrorPage(): ReactElement | null { newWindow className="ring-primary-500/30 focus:outline-none focus-visible:ring text-primary-500 underline decoration-from-font [text-underline-position:under]" > - {renderComponent(link)} + {renderComponent(content)}

) diff --git a/packages/nextra-theme-docs/src/components/sidebar.tsx b/packages/nextra-theme-docs/src/components/sidebar.tsx index d4df3ff5b9..34b9034669 100644 --- a/packages/nextra-theme-docs/src/components/sidebar.tsx +++ b/packages/nextra-theme-docs/src/components/sidebar.tsx @@ -104,7 +104,10 @@ function FolderImpl({ item, anchors }: FolderProps) { rerender({}) }} > - {item.title} + {renderComponent(config.sidebar.titleComponent, { + title: item.title, + type: item.type + })} {hasTitle ? (
- {renderComponent(config.sidebar.subtitle, { title })} + {renderComponent(config.sidebar.titleComponent, { + title, + type: 'separator' + })}
) : (
@@ -168,6 +174,7 @@ function File({ item, anchors, topLevel }: FileProps): ReactElement { const slugger = new Slugger() const activeAnchor = useActiveAnchor() const { setMenu } = useMenu() + const config = useConfig() if (item.type === 'separator') { return @@ -183,7 +190,10 @@ function File({ item, anchors, topLevel }: FileProps): ReactElement { setMenu(false) }} > - {item.title} + {renderComponent(config.sidebar.titleComponent, { + title: item.title, + type: item.type + })} {active && anchors.length > 0 && (
    diff --git a/packages/nextra-theme-docs/src/components/toc.tsx b/packages/nextra-theme-docs/src/components/toc.tsx index ec3c803665..8029b2d811 100644 --- a/packages/nextra-theme-docs/src/components/toc.tsx +++ b/packages/nextra-theme-docs/src/components/toc.tsx @@ -38,7 +38,9 @@ export function TOC({ headings, filePath }: TOCProps): ReactElement { const hasHeadings = items.length > 0 const hasMetaInfo = Boolean( - config.feedback.link || config.editLink.component || config.toc.extraContent + config.feedback.content || + config.editLink.component || + config.toc.extraContent ) const activeSlug = Object.entries(activeAnchor).find( @@ -114,7 +116,7 @@ export function TOC({ headings, filePath }: TOCProps): ReactElement { 'contrast-more:shadow-none contrast-more:border-t contrast-more:border-neutral-400 contrast-more:dark:border-neutral-400' )} > - {config.feedback.link ? ( + {config.feedback.content ? ( - {renderComponent(config.feedback.link)} + {renderComponent(config.feedback.content)} ) : null} diff --git a/packages/nextra-theme-docs/src/constants.tsx b/packages/nextra-theme-docs/src/constants.tsx index c8e94ef1c6..e2863c6bec 100644 --- a/packages/nextra-theme-docs/src/constants.tsx +++ b/packages/nextra-theme-docs/src/constants.tsx @@ -17,7 +17,15 @@ export const DEFAULT_THEME: DocsThemeConfig = { key: 'nextra-banner', text: '' }, - bodyExtraContent: null, + chat: { + icon: ( + <> + + Discord + + ), + link: '' + }, components: {}, darkMode: true, direction: 'ltr', @@ -36,12 +44,11 @@ export const DEFAULT_THEME: DocsThemeConfig = { }, text: 'Edit this page' }, + faviconGlyph: '', feedback: { - labels: '', - link: null + content: null, + labels: '' }, - // @TODO: Can probably introduce a set of options to use Google Fonts directly - font: false, footer: { component: Footer, text: `MIT ${new Date().getFullYear()} © Nextra.` @@ -59,7 +66,6 @@ export const DEFAULT_THEME: DocsThemeConfig = { ) }, - github: '', head: ( <> @@ -81,6 +87,9 @@ export const DEFAULT_THEME: DocsThemeConfig = { ), + main: { + extraContent: null + }, navbar: Navbar, navigation: { next: true, @@ -91,8 +100,8 @@ export const DEFAULT_THEME: DocsThemeConfig = { storageKey: 'theme' }, notFound: { - labels: 'bug', - link: 'Submit an issue about broken link →' + content: 'Submit an issue about broken link →', + labels: 'bug' }, primaryHue: { dark: 204, @@ -108,15 +117,6 @@ export const DEFAULT_THEME: DocsThemeConfig = { // by default should be empty so clicking on project link will go to the github link link: '' }, - projectChat: { - icon: ( - <> - - Discord - - ), - link: '' - }, search: { component({ className, directories }) { const config = useConfig() @@ -138,12 +138,12 @@ export const DEFAULT_THEME: DocsThemeConfig = { } }, serverSideError: { - labels: 'bug', - link: 'Submit an issue about error in url →' + content: 'Submit an issue about error in url →', + labels: 'bug' }, sidebar: { defaultMenuCollapsed: false, - subtitle: null + titleComponent: ({ title }) => <>{title} }, titleSuffix: ' – Nextra', toc: { @@ -151,8 +151,7 @@ export const DEFAULT_THEME: DocsThemeConfig = { extraContent: null, float: true, title: 'On This Page' - }, - unstable_faviconGlyph: '' + } } export const DEEP_OBJECT_KEYS = Object.entries(DEFAULT_THEME) @@ -170,25 +169,28 @@ export const DEEP_OBJECT_KEYS = Object.entries(DEFAULT_THEME) export const LEGACY_CONFIG_OPTIONS: Record = { bannerKey: 'banner.key', + bodyExtraContent: 'main.extraContent', customSearch: 'search.component', defaultMenuCollapsed: 'sidebar.defaultMenuCollapsed', feedbackLabels: 'feedback.labels', - feedbackLink: 'feedback.link', + feedbackLink: 'feedback.content', floatTOC: 'toc.float', footerEditLink: 'editLink.text', footerText: 'footer.text', + github: 'project.link', nextLinks: 'navigation.next', notFoundLabels: 'notFound.labels', - notFoundLink: 'notFound.link', + notFoundLink: 'notFound.content', prevLinks: 'navigation.prev', - projectChatLink: 'projectChat.link', - projectChatLinkIcon: 'projectChat.icon', + projectChat: 'chat', + projectChatLink: 'chat.link', + projectChatLinkIcon: 'chat.icon', projectLink: 'project.link', projectLinkIcon: 'project.icon', searchPlaceholder: 'search.placeholder', serverSideErrorLabels: 'serverSideError.labels', - serverSideErrorLink: 'serverSideError.link', - sidebarSubtitle: 'sidebar.subtitle', + serverSideErrorLink: 'serverSideError.content', + sidebarSubtitle: 'sidebar.titleComponent', tocExtraContent: 'toc.extraContent', unstable_searchResultEmpty: 'search.emptyResult' } diff --git a/packages/nextra-theme-docs/src/contexts/config.tsx b/packages/nextra-theme-docs/src/contexts/config.tsx index fb73053e03..de35db850a 100644 --- a/packages/nextra-theme-docs/src/contexts/config.tsx +++ b/packages/nextra-theme-docs/src/contexts/config.tsx @@ -46,7 +46,7 @@ export const ConfigProvider = ({ title: pageOpts.title, frontMatter: pageOpts.frontMatter, ...Object.fromEntries( - (DEEP_OBJECT_KEYS).map(key => + DEEP_OBJECT_KEYS.map(key => typeof themeConfig[key] === 'object' ? [ key, @@ -61,8 +61,7 @@ export const ConfigProvider = ({ const { nextThemes } = extendedConfig if (process.env.NODE_ENV === 'development') { - const notice = - '[nextra-theme-docs] ⚠️ You are using legacy theme config option' + const notice = '[nextra-theme-docs] ⚠️ You are using a legacy theme config' for (const [legacyOption, newPath] of Object.entries( LEGACY_CONFIG_OPTIONS @@ -70,7 +69,9 @@ export const ConfigProvider = ({ if (legacyOption in themeConfig) { const [obj, key] = newPath.split('.') const renameTo = key ? `${obj}: { ${key}: ... }` : obj - console.warn(`${notice} "${legacyOption}". Rename it to ${renameTo}`) + console.warn( + `${notice} \`${legacyOption}\`. Rename it to \`${renameTo}\` for future compatibility.` + ) } } @@ -79,14 +80,19 @@ export const ConfigProvider = ({ const option = themeConfig[key] if (typeof option === 'boolean' || option == null) { console.warn( - `${notice} "${key}".`, - option ? 'Remove it' : `Rename it to ${key}: { component: null }` + `${notice} \`${key}\`.`, + option + ? 'Remove it' + : `Rename it to \`${key}: { component: null }\` for future compatibility.` ) } } } if (typeof themeConfig.banner === 'string') { - console.warn(notice, '"banner". Rename it to banner: { text: ... }') + console.warn( + notice, + '`banner`. Rename it to `banner: { content: ... }` for future compatibility.' + ) } } diff --git a/packages/nextra-theme-docs/src/index.tsx b/packages/nextra-theme-docs/src/index.tsx index 440a2785d3..8a2ef4a49f 100644 --- a/packages/nextra-theme-docs/src/index.tsx +++ b/packages/nextra-theme-docs/src/index.tsx @@ -106,7 +106,7 @@ const Body = ({ {children} {gitTimestampEl} {navigation} - {renderComponent(config.bodyExtraContent)} + {renderComponent(config.main.extraContent)} ) diff --git a/packages/nextra-theme-docs/src/types.ts b/packages/nextra-theme-docs/src/types.ts index 50f73be58f..a08d234aa7 100644 --- a/packages/nextra-theme-docs/src/types.ts +++ b/packages/nextra-theme-docs/src/types.ts @@ -21,7 +21,10 @@ export interface DocsThemeConfig { key: string text: ReactNode | FC } - bodyExtraContent: ReactNode | FC + chat: { + icon: ReactNode | FC + link: string + } components: Record darkMode: boolean direction: 'ltr' | 'rtl' @@ -34,45 +37,47 @@ export interface DocsThemeConfig { }> text: ReactNode | FC } + faviconGlyph: string feedback: { + content: ReactNode | FC labels: string - link: ReactNode | FC } - font: boolean footer: { component: ReactNode | FC<{ menu: boolean }> text: ReactNode | FC } gitTimestamp: ReactNode | FC<{ timestamp: Date }> - github: string head: ReactNode | FC i18n: { direction?: string; locale: string; text: string }[] logo: ReactNode | FC - navbar: ReactNode | FC - navigation: { - next: boolean - prev: boolean + main: { + extraContent: ReactNode | FC } + navbar: ReactNode | FC + navigation: + | boolean + | { + next: boolean + prev: boolean + } nextThemes: Pick< ThemeProviderProps, 'defaultTheme' | 'storageKey' | 'forcedTheme' > notFound: { + content: ReactNode | FC, labels: string - link: ReactNode | FC } - primaryHue: number | { - dark: number - light: number - }, + primaryHue: + | number + | { + dark: number + light: number + } project: { icon: ReactNode | FC link: string } - projectChat: { - icon: ReactNode | FC - link: string - } search: { component: | ReactNode @@ -85,12 +90,12 @@ export interface DocsThemeConfig { placeholder: string | (() => string) } serverSideError: { + content: ReactNode | FC, labels: string - link: ReactNode | FC } sidebar: { defaultMenuCollapsed: boolean - subtitle: ReactNode | FC<{ title: string }> + titleComponent: ReactNode | FC<{ title: string; type: string }> } // Can't be React component, otherwise will get Warning: A title element received an array with more than 1 element as children. titleSuffix: string | (() => string) @@ -100,7 +105,6 @@ export interface DocsThemeConfig { float: boolean title: ReactNode | FC } - unstable_faviconGlyph: string } export type PageTheme = {