diff --git a/.gitignore b/.gitignore index b1db1cd8..510c44c8 100644 --- a/.gitignore +++ b/.gitignore @@ -24,9 +24,9 @@ docs/ versioned_docs/ static/_headers static/_redirects -static/latest-swagger.json -static/19-swagger.json -static/20-swagger.json +static/swagger-latest.json +static/swagger-19.json +static/swagger-20.json i18n/zh-cn/docusaurus-plugin-content-docs/current i18n/zh-cn/docusaurus-plugin-content-docs/version-1.19 i18n/zh-cn/docusaurus-plugin-content-docs/version-1.20 diff --git a/docusaurus.config.js b/docusaurus.config.js index fafc11a9..00634dfa 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -13,13 +13,13 @@ function sortItemsByCategory(items) { return sortedItems; } -const includeAPI = process.env.INCLUDE_API !== 'false'; +const renderApiSSR = process.env.API_SSR !== 'false'; const apiConfig = [ 'redocusaurus', { // Plugin Options for loading OpenAPI files - specs: includeAPI ? [ + specs: renderApiSSR ? [ { spec: 'static/swagger-latest.json', route: '/api/next/', @@ -41,7 +41,7 @@ const apiConfig = [ }, ] -const pageConfig = includeAPI ? { +const pageConfig = renderApiSSR ? { exclude: [ 'api/**', ], @@ -167,15 +167,14 @@ const config = { activeBaseRegex: 'api/(1.19|1.20|next)/', }, { - type: 'dropdown', + type: 'custom-apiDropdown', label: 'API Version', position: 'right', items: [ {to: '/api/next/', label: '1.21-dev' }, - {to: '/api/1.20/', label: '1.20.0-rc0' }, + {to: '/api/1.20/', label: '1.20.0-rc2' }, {to: '/api/1.19/', label: '1.19.4' }, ], - className: 'api-dropdown', }, { href: 'https://github.com/go-gitea/gitea', diff --git a/package.json b/package.json index 5c1dec4a..c034dee2 100644 --- a/package.json +++ b/package.json @@ -5,9 +5,9 @@ "scripts": { "docusaurus": "docusaurus", "start": "docusaurus start", - "start-CSRApi": "cross-env INCLUDE_API='false' docusaurus start", + "start-CSRApi": "cross-env API_SSR='false' docusaurus start", "build": "docusaurus build", - "build-CSRApi": "cross-env INCLUDE_API='false' docusaurus build", + "build-CSRApi": "cross-env API_SSR='false' docusaurus build", "swizzle": "docusaurus swizzle", "deploy": "docusaurus deploy", "clear": "docusaurus clear", diff --git a/src/components/APIDropDown.js b/src/components/APIDropDown.js new file mode 100644 index 00000000..84881df2 --- /dev/null +++ b/src/components/APIDropDown.js @@ -0,0 +1,23 @@ +import React from 'react'; +import DropdownNavbarItem from '@theme/NavbarItem/DropdownNavbarItem'; +import {useLocation} from '@docusaurus/router'; + +export default function APIDropDown(props) { + const {pathname} = useLocation(); + let newLabel = props.label; + // isAPI indicates if the current page is a api page + let isAPI = false; + for (const item of props.items) { + // paths like /zh-cn/api/{version}/ are also api pages + if (pathname === item.to || pathname === `/zh-cn${item.to}`) { + if (!props.mobile) newLabel = item.label; + isAPI = true; + break; + } + } + const newProps = {...props, label: newLabel}; + // Hide api dropdown on non api pages + return ( + + ); +} diff --git a/src/css/custom.css b/src/css/custom.css index 91cec132..ce8a8acb 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -63,52 +63,52 @@ top: 70px !important; height: calc(100vh - 70px) !important; } -/* The following css is for toggling API version dropdown/menu, -selectors like :first-of-type are for browsers those do not support :has */ -/* Do not show doc search on api pages */ -body:has(.redocusaurus) [class*='searchBox'], -.plugin-redoc [class*='searchBox'], -.plugin-pages [class*='searchBox'] { + +.gt-hidden { display: none; } +/* The following css is for toggling API version dropdown/menu, + TODO: need to find a proper way to customize the classname +*/ +@supports selector(:has(*)) { + /* Do not show doc search on api pages */ + body:has(.redocusaurus) [class*='searchBox'] { + display: none; + } -@media (min-width: 996px) { - /* hide api-dropdown on other pages */ - .navbar__item.dropdown:not(:has(.api-dropdown)), - .navbar__item.dropdown:first-of-type { - display: none; + @media (min-width: 996px) { + /* hide other dropdowns except for api dropdown on api pages */ + body:has(.redocusaurus) .navbar__item.dropdown:not(:has(.api-dropdown)) { + display: none; + } } - /* show api-dropdown dropdown and hide other dropdowns on api pages */ - body:has(.redocusaurus) .navbar__item.dropdown:not(:has(.api-dropdown)), - .plugin-redoc .navbar__item.dropdown:not(:first-of-type), - .plugin-pages .navbar__item.dropdown:not(:first-of-type) { - display: none; - } - body:has(.redocusaurus) .navbar__item.dropdown:has(.api-dropdown), - .plugin-redoc .navbar__item.dropdown:first-of-type, - .plugin-pages .navbar__item.dropdown:first-of-type { - display: block; + + @media (max-width: 996px) { + /* on mobile, dropdown becomes menu list */ + /* Hide collapsible menus except for API menu on API pages */ + body:has(.redocusaurus) .menu__list-item.menu__list-item--collapsed:not(:has(.api-dropdown)) { + display: none; + } } } +/* selectors like :first-of-type are for browsers those do not support :has */ +@supports not (selector(:has(*))) { + .plugin-redoc [class*='searchBox'], + .plugin-pages [class*='searchBox'] { + display: none; + } -@media (max-width: 996px) { - /* need to find a way to customize the classname */ - /* on mobile, dropdown becomes menu list */ - /* Hide api version menu on other pages */ - .menu__list-item.menu__list-item--collapsed:has(.api-dropdown), - .menu__list-item.menu__list-item--collapsed:nth-of-type(3) { - display: none; + @media (min-width: 996px) { + .plugin-redoc .navbar__item.dropdown:not(:first-of-type), + .plugin-pages .navbar__item.dropdown:not(:first-of-type) { + display: none; + } } - /* Hide collapsible menus except for API menu on API pages */ - body:has(.redocusaurus) .menu__list-item.menu__list-item--collapsed:not(:has(.api-dropdown)), - .plugin-redoc .menu__list-item.menu__list-item--collapsed:not(:first-of-type), - .plugin-pages .menu__list-item.menu__list-item--collapsed:not(:first-of-type) { - display: none; - } - /* Show collapsible API menu on API pages */ - body:has(.redocusaurus) .menu__list-item:has(.api-dropdown), - .plugin-redoc .menu__list-item:nth-of-type(3), - .plugin-pages .menu__list-item:nth-of-type(3) { - display: list-item !important; + + @media (max-width: 996px) { + .plugin-redoc .menu__list-item.menu__list-item--collapsed:not(:nth-of-type(3)), + .plugin-pages .menu__list-item.menu__list-item--collapsed:not(:nth-of-type(3)) { + display: none; + } } } diff --git a/src/theme/NavbarItem/ComponentTypes.js b/src/theme/NavbarItem/ComponentTypes.js new file mode 100644 index 00000000..df00a1e2 --- /dev/null +++ b/src/theme/NavbarItem/ComponentTypes.js @@ -0,0 +1,24 @@ +import DefaultNavbarItem from '@theme/NavbarItem/DefaultNavbarItem'; +import DropdownNavbarItem from '@theme/NavbarItem/DropdownNavbarItem'; +import LocaleDropdownNavbarItem from '@theme/NavbarItem/LocaleDropdownNavbarItem'; +import SearchNavbarItem from '@theme/NavbarItem/SearchNavbarItem'; +import HtmlNavbarItem from '@theme/NavbarItem/HtmlNavbarItem'; +import DocNavbarItem from '@theme/NavbarItem/DocNavbarItem'; +import DocSidebarNavbarItem from '@theme/NavbarItem/DocSidebarNavbarItem'; +import DocsVersionNavbarItem from '@theme/NavbarItem/DocsVersionNavbarItem'; +import DocsVersionDropdownNavbarItem from '@theme/NavbarItem/DocsVersionDropdownNavbarItem'; +import APIDropDown from '@site/src/components/APIDropDown'; + +const ComponentTypes = { + default: DefaultNavbarItem, + localeDropdown: LocaleDropdownNavbarItem, + search: SearchNavbarItem, + dropdown: DropdownNavbarItem, + html: HtmlNavbarItem, + doc: DocNavbarItem, + docSidebar: DocSidebarNavbarItem, + docsVersion: DocsVersionNavbarItem, + docsVersionDropdown: DocsVersionDropdownNavbarItem, + 'custom-apiDropdown': APIDropDown, +}; +export default ComponentTypes;