diff --git a/src/components/messageStream/FilterChips.tsx b/src/components/messageStream/FilterChips.tsx index 819a816..67e4f44 100644 --- a/src/components/messageStream/FilterChips.tsx +++ b/src/components/messageStream/FilterChips.tsx @@ -1,3 +1,5 @@ +import { SlidersHorizontal } from "lucide-react"; +import { useEffect, useMemo, useRef, useState } from "react"; import { useI18n } from "../../i18n"; import { typeFilterLabel } from "../../resourceTypeLabels"; @@ -20,26 +22,95 @@ export type FilterChipsProps = { export function FilterChips({ type, onTypeChange }: FilterChipsProps) { const { t } = useI18n(); + const containerRef = useRef(null); + const measureRef = useRef(null); + const [expanded, setExpanded] = useState(false); + const [hasOverflow, setHasOverflow] = useState(false); + + const labelsKey = useMemo( + () => TYPE_FILTERS.map((tp) => typeFilterLabel(t, tp)).join("|"), + [t], + ); + + useEffect(() => { + const checkOverflow = () => { + const container = containerRef.current; + const measure = measureRef.current; + if (!container || !measure) return; + + const nextHasOverflow = measure.scrollWidth > container.clientWidth + 1; + setHasOverflow(nextHasOverflow); + if (!nextHasOverflow) setExpanded(false); + }; + + checkOverflow(); + const resizeObserver = new ResizeObserver(checkOverflow); + if (containerRef.current) resizeObserver.observe(containerRef.current); + if (measureRef.current) resizeObserver.observe(measureRef.current); + return () => resizeObserver.disconnect(); + }, [labelsKey]); + + const chipClass = (active: boolean) => + `inline-flex h-8 min-w-[72px] shrink-0 items-center justify-center rounded-full border px-3 text-xs leading-none transition ${ + active + ? "border-ark-gold bg-ark-gold/10 text-ark-gold2" + : "border-ark-line text-neutral-300 hover:border-ark-gold/50" + }`; + return ( -
-
- {TYPE_FILTERS.map((tp) => { - const active = type === tp; - return ( - - ); - })} +
+
+
+ {TYPE_FILTERS.map((tp) => { + const active = type === tp; + return ( + + ); + })} +
+ + {hasOverflow ? ( + + ) : null} +
+ +
);