{"version":3,"file":"useTimelineTracks.mjs","names":[],"sources":["../../../src/hooks/tracks/useTimelineTracks.ts"],"sourcesContent":["import {\n  useTimelineTrackCommands,\n  type UseTimelineTrackCommandsResult,\n} from '#react/hooks/tracks/useTimelineTrackCommands';\nimport type { Track, TimelineReadonly } from '@techsquidtv/canvas-timeline-core';\nimport { useTimelineSelector } from '#react/hooks/core/useTimelineSelector';\nimport { useMemo } from 'react';\n/**\n * Result returned by `useTimelineTracks`.\n *\n * @remarks\n *\n * Use this result for track lists, timeline sidebars, source-bin filters, and\n * command bars that need to inspect or mutate the ordered track collection. For\n * one row's DOM-ready state, use {@link useTimelineTrack} or\n * {@link useTimelineTrackHeader} instead.\n *\n * tracks, such as `\"visual\" | \"audio\"`.\n *\n * @see {@link https://canvastimeline.com/docs/tracks-and-clips | Tracks and clips}\n * @see {@link https://canvastimeline.com/docs/react-hooks | React editor hooks}\n */\nexport interface UseTimelineTracksResult extends UseTimelineTrackCommandsResult {\n  /** Current ordered track list. */\n  tracks: readonly TimelineReadonly<Track>[];\n  /** Currently selected track, or null when no track is selected. */\n  selectedTrack: TimelineReadonly<Track> | null;\n  /** Tracks currently participating in active layer and media lookup. */\n  visibleTracks: TimelineReadonly<Track>[];\n  /** Tracks currently hidden from active layer and media lookup. */\n  hiddenTracks: TimelineReadonly<Track>[];\n  /** Tracks currently targeted for edit operations. */\n  targetedTracks: TimelineReadonly<Track>[];\n  /** Tracks grouped by group id, with ungrouped tracks under \"ungrouped\". */\n  tracksByGroupId: Record<string, TimelineReadonly<Track>[]>;\n}\n\n/**\n * Accesses and manages the list of timeline tracks.\n *\n * @remarks\n *\n * `useTimelineTracks` is the broad track-domain hook. It is useful for\n * rendering track rows, building track header columns, grouping tracks, and\n * wiring mute/visibility/lock controls. It returns command helpers that fail\n * with {@link TimelineCommandResult} objects instead of throwing when a track is\n * missing.\n *\n * @returns Track collection state and commands for selecting and updating tracks.\n * tracks, such as `\"visual\" | \"audio\"`.\n *\n * @example\n * ```tsx\n * import { Timeline, useTimelineTracks } from '@techsquidtv/canvas-timeline-react';\n *\n * export function TrackRows() {\n *   const { tracks } = useTimelineTracks();\n *\n *   return (\n *     <Timeline.TrackList>\n *       {tracks.map((track) => (\n *         <Timeline.Track key={track.id} trackId={track.id} />\n *       ))}\n *     </Timeline.TrackList>\n *   );\n * }\n * ```\n *\n * @example\n * ```tsx\n * import { useTimelineTracks } from '@techsquidtv/canvas-timeline-react';\n *\n * export function TrackVisibilityMenu() {\n *   const { tracks, setVisible } = useTimelineTracks();\n *\n *   return tracks.map((track) => (\n *     <label key={track.id}>\n *       <input\n *         type=\"checkbox\"\n *         checked={track.visible}\n *         onChange={(event) => setVisible(track.id, event.currentTarget.checked)}\n *       />\n *       {track.name ?? track.id}\n *     </label>\n *   ));\n * }\n * ```\n *\n * @see {@link useTimelineTrack}\n * @see {@link useTimelineTrackHeader}\n * @see {@link https://canvastimeline.com/demos/timeline-editor-controls | Timeline editor controls demo}\n */\nexport function useTimelineTracks(): UseTimelineTracksResult {\n  const commands = useTimelineTrackCommands();\n  const state = useTimelineSelector((state) => ({ tracks: state.tracks }));\n  const tracks = state.tracks;\n  const selectedTrack = useMemo(() => tracks.find((track) => track.selected) || null, [tracks]);\n  const visibleTracks = useMemo(() => tracks.filter((track) => track.visible), [tracks]);\n  const hiddenTracks = useMemo(() => tracks.filter((track) => !track.visible), [tracks]);\n  const targetedTracks = useMemo(() => tracks.filter((track) => track.targeted), [tracks]);\n  const tracksByGroupId = useMemo(() => {\n    const groupedTracks: Record<string, TimelineReadonly<Track>[]> = {};\n    for (const track of tracks) {\n      const groupId = track.groupId || 'ungrouped';\n      groupedTracks[groupId] ??= [];\n      groupedTracks[groupId].push(track);\n    }\n    return groupedTracks;\n  }, [tracks]);\n\n  return useMemo(\n    () => ({\n      tracks,\n      selectedTrack,\n      visibleTracks,\n      hiddenTracks,\n      targetedTracks,\n      tracksByGroupId,\n      ...commands,\n    }),\n    [tracks, selectedTrack, visibleTracks, hiddenTracks, targetedTracks, tracksByGroupId, commands]\n  );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4FA,SAAgB,oBAA6C;CAC3D,MAAM,WAAW,yBAAyB;CAE1C,MAAM,SADQ,qBAAqB,WAAW,EAAE,QAAQ,MAAM,OAAO,EAClD,CAAC,CAAC;CACrB,MAAM,gBAAgB,cAAc,OAAO,MAAM,UAAU,MAAM,QAAQ,KAAK,MAAM,CAAC,MAAM,CAAC;CAC5F,MAAM,gBAAgB,cAAc,OAAO,QAAQ,UAAU,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC;CACrF,MAAM,eAAe,cAAc,OAAO,QAAQ,UAAU,CAAC,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC;CACrF,MAAM,iBAAiB,cAAc,OAAO,QAAQ,UAAU,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC;CACvF,MAAM,kBAAkB,cAAc;EACpC,MAAM,gBAA2D,CAAC;EAClE,KAAK,MAAM,SAAS,QAAQ;GAC1B,MAAM,UAAU,MAAM,WAAW;GACjC,cAAc,aAAa,CAAC;GAC5B,cAAc,QAAQ,CAAC,KAAK,KAAK;EACnC;EACA,OAAO;CACT,GAAG,CAAC,MAAM,CAAC;CAEX,OAAO,eACE;EACL;EACA;EACA;EACA;EACA;EACA;EACA,GAAG;CACL,IACA;EAAC;EAAQ;EAAe;EAAe;EAAc;EAAgB;EAAiB;CAAQ,CAChG;AACF"}