diff --git a/packages/website/src/components/ItemSidebar.tsx b/packages/website/src/components/ItemSidebar.tsx index fe704499a..72f55b62a 100644 --- a/packages/website/src/components/ItemSidebar.tsx +++ b/packages/website/src/components/ItemSidebar.tsx @@ -1,6 +1,6 @@ -import Link from 'next/link'; import { FiMenu } from 'react-icons/fi'; import { VscPackage } from 'react-icons/vsc'; +import { ListSidebar } from './ListSidebar'; import type { getMembers } from '~/util/parse.server'; export interface ItemListProps { @@ -19,7 +19,7 @@ function onMenuClick() { export function ItemSidebar({ packageName, data, selectedMember }: ItemListProps) { return ( -
+

@@ -30,21 +30,7 @@ export function ItemSidebar({ packageName, data, selectedMember }: ItemListProps

- {data.members.map((member, i) => ( -
- - - {member.name} - - -
- ))} +
); diff --git a/packages/website/src/components/ListSidebar.tsx b/packages/website/src/components/ListSidebar.tsx new file mode 100644 index 000000000..514359f2a --- /dev/null +++ b/packages/website/src/components/ListSidebar.tsx @@ -0,0 +1,132 @@ +import { AnimatePresence, motion } from 'framer-motion'; +import Link from 'next/link'; +import { useState } from 'react'; +import { VscChevronDown, VscChevronRight } from 'react-icons/vsc'; +import type { ItemListProps } from './ItemSidebar'; + +export type Members = ItemListProps['data']['members']; + +export interface ListSidebarSectionProps { + members: Members; + selectedMember?: string | undefined; + title: string; +} + +interface GroupedMembers { + Classes: Members; + Functions: Members; + Enums: Members; + Interfaces: Members; + Types: Members; + Variables: Members; +} + +function groupMembers(members: Members): GroupedMembers { + const Classes: Members = []; + const Enums: Members = []; + const Interfaces: Members = []; + const Types: Members = []; + const Variables: Members = []; + const Functions: Members = []; + + for (const member of members) { + switch (member.kind) { + case 'Class': + Classes.push(member); + break; + case 'Enum': + Enums.push(member); + break; + case 'Interface': + Interfaces.push(member); + break; + case 'TypeAlias': + Types.push(member); + break; + case 'Variable': + Variables.push(member); + break; + case 'Function': + Functions.push(member); + break; + default: + break; + } + } + + return { Classes, Functions, Enums, Interfaces, Types, Variables }; +} + +export function ListSidebarSection({ members, selectedMember, title }: ListSidebarSectionProps) { + const [showList, setShowList] = useState(true); + + return ( +
+

setShowList(!showList)} + > + {showList ? : } + {title} +

+ + {showList ? ( + + {members.map((member, i) => ( +
+ + + {member.name} + + +
+ ))} +
+ ) : null} +
+
+ ); +} + +export function ListSidebar({ members, selectedMember }: ListSidebarSectionProps) { + const groupItems = groupMembers(members); + + return ( +
+ {Object.keys(groupItems).map((group, i) => ( + + ))} +
+ ); +} diff --git a/packages/website/src/components/SidebarLayout.tsx b/packages/website/src/components/SidebarLayout.tsx index fd500cb7c..4142a5465 100644 --- a/packages/website/src/components/SidebarLayout.tsx +++ b/packages/website/src/components/SidebarLayout.tsx @@ -9,7 +9,7 @@ export function SidebarLayout({ }: PropsWithChildren } }>>) { return (
-
+
{packageName && data ? ( ) : null} diff --git a/packages/website/src/util/icon.tsx b/packages/website/src/util/icon.tsx index f317c21e1..26a614e61 100644 --- a/packages/website/src/util/icon.tsx +++ b/packages/website/src/util/icon.tsx @@ -4,7 +4,7 @@ export function generateIcon(kind: string, className?: string) { const icons = { Class: , Method: , - Function: , + Function: , Enum: , Interface: , TypeAlias: ,