Segment Interaction
retab-ui/segment-interactionFreeUtility
React-free hover, focus, selection, and current-page helpers for Segment[] surfaces.
Install it
npx shadcn@latest add https://ui.retab.com/r/segment-interaction.jsonSource
1import { type Segment } from "@/lib/segments";23export interface SegmentInteraction {4 previewSegmentId: string | null;5 previewSegment: (segmentId: string) => void;6 clearPreview: () => void;7}89export interface SegmentInteractionState {10 currentPage: number | null;11 currentSegmentId: string | null;12 currentSegmentIds: readonly string[];13 previewSegmentId: string | null;14 highlightedSegmentId: string | null;15 highlightedSegmentIds: readonly string[];16}1718export interface SegmentViewState {19 isPreviewed: boolean;20 isCurrent: boolean;21 isHighlighted: boolean;22 isDimmed: boolean;23}2425export interface SegmentSurfaceProps {26 state: SegmentViewState;27 eventHandlers: {28 onPointerEnter: () => void;29 onPointerLeave: () => void;30 onClick: () => void;31 };32 dataProps: {33 "data-previewed": boolean;34 "data-current": boolean;35 "data-highlighted": boolean;36 };37}3839export function resolvePreviewedSegmentId(40 interaction?: Partial<Pick<SegmentInteraction, "previewSegmentId">> | null,41): string | null {42 return interaction?.previewSegmentId ?? null;43}4445export function getSegmentInteractionState({46 segments,47 currentPage,48 interaction,49}: {50 segments: Segment[];51 currentPage?: number | null;52 interaction?: SegmentInteraction | null;53}): SegmentInteractionState {54 const segmentIds = new Set(segments.map((segment) => segment.id));55 const previewSegmentId = knownSegmentId(56 resolvePreviewedSegmentId(interaction),57 segmentIds,58 );59 const resolvedCurrentPage = normalizeCurrentPage(currentPage);60 const currentSegmentIds =61 resolvedCurrentPage == null62 ? []63 : resolveCurrentSegmentIds(segments, resolvedCurrentPage);64 const highlightedSegmentIds =65 previewSegmentId != null ? [previewSegmentId] : currentSegmentIds;6667 return {68 currentPage: resolvedCurrentPage,69 currentSegmentId: currentSegmentIds[0] ?? null,70 currentSegmentIds,71 previewSegmentId,72 highlightedSegmentId: highlightedSegmentIds[0] ?? null,73 highlightedSegmentIds,74 };75}7677export function scopeSegmentInteraction(78 interaction: SegmentInteraction | null | undefined,79 segmentIds: Iterable<string>,80): SegmentInteraction | null | undefined {81 if (!interaction) return interaction;8283 const knownIds = new Set(segmentIds);84 const previewSegmentId = knownSegmentId(85 interaction.previewSegmentId,86 knownIds,87 );8889 if (previewSegmentId === interaction.previewSegmentId) {90 return interaction;91 }9293 return {94 ...interaction,95// … truncated
What it pulls in
Other registry items
Files it writes
More from retab-ui
All 130 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| CSV parsercsv | retab-ui | Utilities | Free | no deps · 4 files | |
| Document source modeldocument-source | retab-ui | Utilities | Free | no deps | |
| DOCX Document Resourcedocx-document-resource | retab-ui | Utilities | Free | no deps · 5 files | |
| Effect Keyeffect-key | retab-ui | Utilities | Free | no deps | |
| PDF Document Resourcepdf-document-resource | retab-ui | Utilities | Free | 1 dep · 6 files | |
| Segments modelsegments | retab-ui | Utilities | Free | no deps | |
| Utilsutils | retab-ui | Utilities | Free | 2 deps | |
| XLSX SheetJS flattenerxlsx-sheetjs-flattener | retab-ui | Utilities | Free | 1 dep |
