From dda43534edac3d4a5dcc2b338ea4ed5a959fe478 Mon Sep 17 00:00:00 2001 From: Hossein Mehrabi Date: Mon, 10 Oct 2022 12:29:45 +0330 Subject: [PATCH] fix: sidebar items typography, icons, and spacing. --- src/components/Icon/Icon.tsx | 7 + src/theme/DocSidebarItem/Category/index.tsx | 215 ++++++++++++++++++++ src/theme/Navbar/Content/styles.module.scss | 2 +- src/theme/Navbar/index.scss | 46 +++++ 4 files changed, 269 insertions(+), 1 deletion(-) create mode 100644 src/theme/DocSidebarItem/Category/index.tsx diff --git a/src/components/Icon/Icon.tsx b/src/components/Icon/Icon.tsx index f81ea21..703bc84 100644 --- a/src/components/Icon/Icon.tsx +++ b/src/components/Icon/Icon.tsx @@ -16,6 +16,7 @@ import DiscourseSvg from '@site/static/icons/discourse.svg' import TelegramSvg from '@site/static/icons/telegram.svg' import StatusSvg from '@site/static/icons/status.svg' import SearchSvg from '@site/static/icons/search.svg' +import DropdownSvg from '@site/static/icons/dropdown.svg' type TIconProps = { size?: 's' | 'm' | 'l' @@ -120,3 +121,9 @@ export const IconSearch = (props: TIconProps): JSX.Element => ( ) + +export const IconDropdown = (props: TIconProps): JSX.Element => ( + + + +) diff --git a/src/theme/DocSidebarItem/Category/index.tsx b/src/theme/DocSidebarItem/Category/index.tsx new file mode 100644 index 0000000..3486fae --- /dev/null +++ b/src/theme/DocSidebarItem/Category/index.tsx @@ -0,0 +1,215 @@ +import React, { type ComponentProps, useEffect, useMemo } from 'react' +import clsx from 'clsx' +import { + ThemeClassNames, + useThemeConfig, + usePrevious, + Collapsible, + useCollapsible, +} from '@docusaurus/theme-common' +import { + isActiveSidebarItem, + findFirstCategoryLink, + useDocSidebarItemsExpandedState, + isSamePath, +} from '@docusaurus/theme-common/internal' +import Link from '@docusaurus/Link' +import { translate } from '@docusaurus/Translate' +import useIsBrowser from '@docusaurus/useIsBrowser' +import DocSidebarItems from '@theme/DocSidebarItems' +import type { Props } from '@theme/DocSidebarItem/Category' +import { + IconArrowLeftCircle, + IconArrowRightCircle, + IconDropdown, +} from '@site/src/components/Icon' + +// If we navigate to a category and it becomes active, it should automatically +// expand itself +function useAutoExpandActiveCategory({ + isActive, + collapsed, + updateCollapsed, +}: { + isActive: boolean + collapsed: boolean + updateCollapsed: (b: boolean) => void +}) { + const wasActive = usePrevious(isActive) + useEffect(() => { + const justBecameActive = isActive && !wasActive + if (justBecameActive && collapsed) { + updateCollapsed(false) + } + }, [isActive, wasActive, collapsed, updateCollapsed]) +} + +/** + * When a collapsible category has no link, we still link it to its first child + * during SSR as a temporary fallback. This allows to be able to navigate inside + * the category even when JS fails to load, is delayed or simply disabled + * React hydration becomes an optional progressive enhancement + * see https://github.com/facebookincubator/infima/issues/36#issuecomment-772543188 + * see https://github.com/facebook/docusaurus/issues/3030 + */ +function useCategoryHrefWithSSRFallback( + item: Props['item'], +): string | undefined { + const isBrowser = useIsBrowser() + return useMemo(() => { + if (item.href) { + return item.href + } + // In these cases, it's not necessary to render a fallback + // We skip the "findFirstCategoryLink" computation + if (isBrowser || !item.collapsible) { + return undefined + } + return findFirstCategoryLink(item) + }, [item, isBrowser]) +} + +function CollapseButton({ + categoryLabel, + onClick, +}: { + categoryLabel: string + onClick: ComponentProps<'button'>['onClick'] +}) { + return ( +