diff --git a/packages/docusaurus-theme-classic/src/theme/Navbar/index.tsx b/packages/docusaurus-theme-classic/src/theme/Navbar/index.tsx index 9c43d204e6..7b85bb9964 100644 --- a/packages/docusaurus-theme-classic/src/theme/Navbar/index.tsx +++ b/packages/docusaurus-theme-classic/src/theme/Navbar/index.tsx @@ -44,10 +44,7 @@ function Navbar(): JSX.Element { navbar: {items, hideOnScroll, style}, colorMode: {disableSwitch: disableColorModeSwitch}, } = useThemeConfig(); - const [sidebarShown, setSidebarShown] = useState(false); - const [isSearchBarExpanded, setIsSearchBarExpanded] = useState(false); - const {isDarkTheme, setLightTheme, setDarkTheme} = useThemeContext(); const {navbarRef, isNavbarVisible} = useHideableNavbar(hideOnScroll); @@ -73,6 +70,7 @@ function Navbar(): JSX.Element { } }, [windowSize]); + const hasSearchNavbarItem = items.some((item) => item.type === 'search'); const {leftItems, rightItems} = splitNavItemsByPosition(items); return ( @@ -101,9 +99,7 @@ function Navbar(): JSX.Element { {leftItems.map((item, i) => ( @@ -121,10 +117,7 @@ function Navbar(): JSX.Element { onChange={onToggleChange} /> )} - + {!hasSearchNavbarItem && }
    {items.map((item, i) => ( - + ))}
diff --git a/packages/docusaurus-theme-classic/src/theme/Navbar/styles.module.css b/packages/docusaurus-theme-classic/src/theme/Navbar/styles.module.css index 3b564fb80d..760d9b46fd 100644 --- a/packages/docusaurus-theme-classic/src/theme/Navbar/styles.module.css +++ b/packages/docusaurus-theme-classic/src/theme/Navbar/styles.module.css @@ -11,12 +11,6 @@ } } -@media (max-width: 768px) { - .hideLogoText { - display: none; - } -} - .navbarHideable { transition: transform var(--ifm-transition-fast) ease; } diff --git a/packages/docusaurus-theme-classic/src/theme/NavbarItem/SearchNavbarItem.tsx b/packages/docusaurus-theme-classic/src/theme/NavbarItem/SearchNavbarItem.tsx new file mode 100644 index 0000000000..122cea489e --- /dev/null +++ b/packages/docusaurus-theme-classic/src/theme/NavbarItem/SearchNavbarItem.tsx @@ -0,0 +1,23 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import React from 'react'; +import type {Props} from '@theme/NavbarItem/SearchNavbarItem'; +import SearchBar from '@theme/SearchBar'; +import styles from './styles.module.css'; + +export default function SearchNavbarItem({mobile}: Props): JSX.Element | null { + if (mobile) { + return null; + } + + return ( +
+ +
+ ); +} diff --git a/packages/docusaurus-theme-classic/src/theme/NavbarItem/index.tsx b/packages/docusaurus-theme-classic/src/theme/NavbarItem/index.tsx index 802ee0f7a9..70451c855c 100644 --- a/packages/docusaurus-theme-classic/src/theme/NavbarItem/index.tsx +++ b/packages/docusaurus-theme-classic/src/theme/NavbarItem/index.tsx @@ -8,11 +8,13 @@ import React from 'react'; import DefaultNavbarItem from '@theme/NavbarItem/DefaultNavbarItem'; import LocaleDropdownNavbarItem from '@theme/NavbarItem/LocaleDropdownNavbarItem'; +import SearchNavbarItem from '@theme/NavbarItem/SearchNavbarItem'; import type {Props} from '@theme/NavbarItem'; const NavbarItemComponents = { default: () => DefaultNavbarItem, localeDropdown: () => LocaleDropdownNavbarItem, + search: () => SearchNavbarItem, // Need to lazy load these items as we don't know for sure the docs plugin is loaded // See https://github.com/facebook/docusaurus/issues/3360 diff --git a/packages/docusaurus-theme-classic/src/theme/NavbarItem/styles.module.css b/packages/docusaurus-theme-classic/src/theme/NavbarItem/styles.module.css new file mode 100644 index 0000000000..361a1b239f --- /dev/null +++ b/packages/docusaurus-theme-classic/src/theme/NavbarItem/styles.module.css @@ -0,0 +1,13 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +@media (max-width: 996px) { + .searchWrapper { + position: absolute; + right: var(--ifm-navbar-padding-horizontal); + } +} diff --git a/packages/docusaurus-theme-classic/src/theme/SearchBar.tsx b/packages/docusaurus-theme-classic/src/theme/SearchBar.tsx index 5ce87930a5..2c59cbfea8 100644 --- a/packages/docusaurus-theme-classic/src/theme/SearchBar.tsx +++ b/packages/docusaurus-theme-classic/src/theme/SearchBar.tsx @@ -5,4 +5,8 @@ * LICENSE file in the root directory of this source tree. */ +// By default, the classic theme does not provide any SearchBar implementation +// If you swizzled this file, it is your responsibility to provide an implementation +// Tip: swizzle the SearchBar from the Algolia theme for inspiration: +// npm run swizzle @docusaurus/theme-search-algolia SearchBar export {default} from '@docusaurus/Noop'; diff --git a/packages/docusaurus-theme-classic/src/types.d.ts b/packages/docusaurus-theme-classic/src/types.d.ts index 84b7c53a9e..b4d5866db1 100644 --- a/packages/docusaurus-theme-classic/src/types.d.ts +++ b/packages/docusaurus-theme-classic/src/types.d.ts @@ -312,6 +312,13 @@ declare module '@theme/NavbarItem/DefaultNavbarItem' { export default DefaultNavbarItem; } +declare module '@theme/NavbarItem/SearchNavbarItem' { + export type Props = {readonly mobile?: boolean}; + + const SearchNavbarItem: (props: Props) => JSX.Element; + export default SearchNavbarItem; +} + declare module '@theme/NavbarItem/LocaleDropdownNavbarItem' { import type {Props as DefaultNavbarItemProps} from '@theme/NavbarItem/DefaultNavbarItem'; import type {NavLinkProps} from '@theme/NavbarItem/DefaultNavbarItem'; @@ -366,13 +373,15 @@ declare module '@theme/NavbarItem' { import type {Props as DefaultNavbarItemProps} from '@theme/NavbarItem/DefaultNavbarItem'; import type {Props as DocsVersionDropdownNavbarItemProps} from '@theme/NavbarItem/DocsVersionDropdownNavbarItem'; import type {Props as DocsVersionNavbarItemProps} from '@theme/NavbarItem/DocsVersionNavbarItem'; + import type {Props as SearchNavbarItemProps} from '@theme/NavbarItem/SearchNavbarItem'; export type Props = | ({readonly type?: 'default' | undefined} & DefaultNavbarItemProps) | ({ readonly type: 'docsVersionDropdown'; } & DocsVersionDropdownNavbarItemProps) - | ({readonly type: 'docsVersion'} & DocsVersionNavbarItemProps); + | ({readonly type: 'docsVersion'} & DocsVersionNavbarItemProps) + | ({readonly type: 'search'} & SearchNavbarItemProps); const NavbarItem: (props: Props) => JSX.Element; export default NavbarItem; diff --git a/packages/docusaurus-theme-classic/src/validateThemeConfig.js b/packages/docusaurus-theme-classic/src/validateThemeConfig.js index 0c6a4b2907..a89fc6022c 100644 --- a/packages/docusaurus-theme-classic/src/validateThemeConfig.js +++ b/packages/docusaurus-theme-classic/src/validateThemeConfig.js @@ -107,6 +107,11 @@ const LocaleDropdownNavbarItemSchema = Joi.object({ className: Joi.string(), }); +const SearchItemSchema = Joi.object({ + type: Joi.string().equal('search').required(), + position: NavbarItemPosition, +}); + // Can this be made easier? :/ const isOfType = (type) => { let typeSchema = Joi.string().required(); @@ -139,6 +144,10 @@ const NavbarItemSchema = Joi.object().when({ is: isOfType('localeDropdown'), then: LocaleDropdownNavbarItemSchema, }, + { + is: isOfType('search'), + then: SearchItemSchema, + }, { is: isOfType(undefined), then: Joi.forbidden().messages({ diff --git a/packages/docusaurus-theme-common/src/utils/useThemeConfig.ts b/packages/docusaurus-theme-common/src/utils/useThemeConfig.ts index 52e2fddb5f..84e2895b44 100644 --- a/packages/docusaurus-theme-common/src/utils/useThemeConfig.ts +++ b/packages/docusaurus-theme-common/src/utils/useThemeConfig.ts @@ -8,8 +8,9 @@ import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; export type DocsVersionPersistence = 'localStorage' | 'none'; -// TODO improve +// TODO improve types, use unions export type NavbarItem = { + type?: string | undefined; items?: NavbarItem[]; label?: string; }; diff --git a/website/docs/api/themes/theme-configuration.md b/website/docs/api/themes/theme-configuration.md index fcc888f2e0..f64dc799fb 100644 --- a/website/docs/api/themes/theme-configuration.md +++ b/website/docs/api/themes/theme-configuration.md @@ -395,12 +395,26 @@ module.exports = { }; ``` -```` +### Navbar search + +If you use the [search](../../search.md), the search bar will be the rightmost element in the navbar. + +However, with this special navbar item type, you can change the default location. + +```js {5-8} title="docusaurus.config.js" +module.exports = { + themeConfig: { + navbar: { + items: [ { - type: 'localeDropdown', - position: 'left', + type: 'search', + position: 'right', }, - ``` + ], + }, + }, +}; +``` ### Auto-hide sticky navbar @@ -416,7 +430,7 @@ module.exports = { // ... }, }; -```` +``` ### Navbar style