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) => (
-
- ))}
+
);
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) => (
+
+ ))}
+
+ ) : 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: ,