From 33d8619a4e984ec10d3b7d0714ce4fd169fa68f2 Mon Sep 17 00:00:00 2001 From: iCrawl Date: Fri, 16 May 2025 00:19:17 +0200 Subject: [PATCH] feat(website): include loading indicators when data is fetching --- apps/website/src/app/docs/packages/layout.tsx | 2 +- .../src/components/EntrypointSelect.tsx | 28 ++++++++++++++++--- apps/website/src/components/Navigation.tsx | 12 ++++++-- apps/website/src/components/Sidebar.tsx | 8 +++--- apps/website/src/components/VersionSelect.tsx | 26 +++++++++++++++-- apps/website/src/components/ui/Select.tsx | 2 ++ 6 files changed, 64 insertions(+), 14 deletions(-) diff --git a/apps/website/src/app/docs/packages/layout.tsx b/apps/website/src/app/docs/packages/layout.tsx index f71e760b6..5d3613d02 100644 --- a/apps/website/src/app/docs/packages/layout.tsx +++ b/apps/website/src/app/docs/packages/layout.tsx @@ -12,7 +12,7 @@ export default async function Layout({ children }: PropsWithChildren) { <> - + diff --git a/apps/website/src/components/EntrypointSelect.tsx b/apps/website/src/components/EntrypointSelect.tsx index b99364352..0008518b1 100644 --- a/apps/website/src/components/EntrypointSelect.tsx +++ b/apps/website/src/components/EntrypointSelect.tsx @@ -1,10 +1,17 @@ 'use client'; +import { Loader2Icon } from 'lucide-react'; import { useParams, useRouter } from 'next/navigation'; +import { Select, SelectList, SelectOption, SelectTrigger } from '@/components/ui/Select'; import { parseDocsPathParams } from '@/util/parseDocsPathParams'; -import { Select, SelectList, SelectOption, SelectTrigger } from './ui/Select'; -export function EntryPointSelect({ entryPoints }: { readonly entryPoints: { readonly entryPoint: string }[] }) { +export function EntryPointSelect({ + entryPoints, + isLoading, +}: { + readonly entryPoints: { readonly entryPoint: string }[]; + readonly isLoading: boolean; +}) { const router = useRouter(); const params = useParams<{ item?: string[] | undefined; @@ -16,11 +23,24 @@ export function EntryPointSelect({ entryPoints }: { readonly entryPoints: { read return ( - + + ) : null + } + /> {(item) => ( (props: SelectListProps) { export type SelectTriggerProps = ComponentProps & { readonly className?: string; readonly prefix?: ReactNode; + readonly suffix?: ReactNode; }; export function SelectTrigger(props: SelectTriggerProps) { @@ -113,6 +114,7 @@ export function SelectTrigger(props: SelectTriggerProps) { className="text-base-neutral-900 group-disabled:data-placeholder:text-base-neutral-900 dark:group-disabled:data-placeholder:text-base-neutral-40 dark:data-placeholder:text-base-neutral-500 dark:text-base-neutral-40 data-placeholder:text-base-neutral-400 text-base-lg sm:text-base-md grid flex-1 grid-cols-[auto_1fr] place-items-start items-center px-3 py-2.5 *:data-[slot=avatar]:*:-mx-0.5 *:data-[slot=avatar]:-mx-0.5 *:data-[slot=avatar]:*:mr-2 *:data-[slot=avatar]:mr-2 *:data-[slot=icon]:-mx-0.5 *:data-[slot=icon]:mr-1 *:data-[slot=icon]:size-5.5 [&_[slot=description]]:hidden *:[span]:col-start-2" data-slot="select-value" /> + {props.suffix && {props.suffix}}