import { Dropdown as BootstrapDropdown } from "bootstrap"; import { ComponentChildren } from "preact"; import Icon from "./Icon"; import { useEffect, useMemo, useRef, type CSSProperties } from "preact/compat"; interface FormListOpts { children: ComponentChildren; onSelect?: (value: string) => void; style?: CSSProperties; fullHeight?: boolean; } export default function FormList({ children, onSelect, style, fullHeight }: FormListOpts) { const wrapperRef = useRef(null); const triggerRef = useRef(null); useEffect(() => { if (!triggerRef.current || !wrapperRef.current) { return; } const $wrapperRef = $(wrapperRef.current); const dropdown = BootstrapDropdown.getOrCreateInstance(triggerRef.current); $wrapperRef.on("hide.bs.dropdown", (e) => e.preventDefault()); return () => { $wrapperRef.off("hide.bs.dropdown"); dropdown.dispose(); } }, [ triggerRef, wrapperRef ]); const builtinStyles = useMemo(() => { const style: CSSProperties = {}; if (fullHeight) { style.height = "100%"; } return style; }, [ fullHeight ]); return (
); } export interface FormListBadge { className?: string; text: string; } interface FormListItemOpts { children: ComponentChildren; icon?: string; value?: string; title?: string; active?: boolean; badges?: FormListBadge[]; disabled?: boolean; } export function FormListItem({ children, icon, value, title, active, badges, disabled }: FormListItemOpts) { return (   {children} {badges && badges.map(({ className, text }) => ( {text} ))} ); } interface FormListHeaderOpts { text: string; } export function FormListHeader({ text }: FormListHeaderOpts) { return (
  • {text}
  • ) } export function FormDivider() { return
    ; }