diff --git a/src/components/tess-listings.tsx b/src/components/tess-listings.tsx new file mode 100644 index 0000000..32ffdd6 --- /dev/null +++ b/src/components/tess-listings.tsx @@ -0,0 +1,136 @@ +import { useEffect, useState, type ComponentType, type ReactNode, type SVGProps } from 'react'; +import { BookOpenIcon, CalendarIcon, ExclamationTriangleIcon, MagnifyingGlassIcon } from '@heroicons/react/24/outline'; +import { + browseLinks, + eventDates, + eventLink, + eventPlace, + materialLink, + materials, + pastEvents, + upcomingEvents, + type TessResult, +} from '../lib/tess'; + +const ITEM = 'py-4 first:pt-0 last:pb-0'; +const ITEM_LINK = 'group -m-2 block rounded-lg p-2 transition-colors hover:bg-gray-50 dark:hover:bg-white/[0.04] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent'; +const ITEM_TITLE = 'font-semibold text-brand-primary dark:text-white transition-colors group-hover:text-accent'; +const LIST = 'divide-y divide-gray-200/60 dark:divide-gray-700/30'; + +/** Null while TESS is still being asked. */ +function useTess(load: () => Promise>): TessResult | null { + const [result, setResult] = useState | null>(null); + useEffect(() => { + load().then(setResult); + }, [load]); + return result; +} + +function Loading({ label }: { label: string }) { + return ( +
+ {label} +