+
{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 (
+
+
+
+
+ Option
+ Type
+ Description
+
+
+
+ {options.map(([option, type, description]) => (
+
+
+ {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
+
+
+}
+
+# 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"
+
+
+
+ left
+ center
+ right
+
+
+
+
+ foo
+ bar
+ baz
+
+
+ banana
+ apple
+ kiwi
+
+
+
+```
+
+you'll get the following result:
+
+
+
+
+ left
+ center
+ right
+
+
+
+
+ foo
+ bar
+ baz
+
+
+ banana
+ apple
+ kiwi
+
+
+
+
+
+ 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
+ Flag
+
+
+
+ {[
+ { country: 'France', flag: '🇫🇷' },
+ { country: 'Ukraine', flag: '🇺🇦' }
+ ].map(item => (
+
+ {item.country}
+ {item.flag}
+
+ ))}
+
+
+```
+
+will be rendered as:
+
+
+
+
+ Country
+ Flag
+
+
+
+ {[
+ { country: 'France', flag: '🇫🇷' },
+ { country: 'Ukraine', flag: '🇺🇦' }
+ ].map(item => (
+
+ {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 = {