{"version":3,"file":"useTimelineTrackCommands.mjs","names":[],"sources":["../../../src/hooks/tracks/useTimelineTrackCommands.ts"],"sourcesContent":["import { useTimelineEngine } from '#react/hooks/core/useTimelineEngine';\nimport type { TimelineCommandResult, Track } from '@techsquidtv/canvas-timeline-core';\nimport { useMemo } from 'react';\n\n/** Stable track commands; every operation validates current engine state. */\nexport interface UseTimelineTrackCommandsResult {\n  /** Selects a track or clears track selection. */\n  selectTrack: (trackId: string | null) => TimelineCommandResult;\n  /** Adds a track with owned, validated clip data. */\n  addTrack: (track: Track) => TimelineCommandResult;\n  /** Removes a track. */\n  removeTrack: (trackId: string) => TimelineCommandResult;\n  /** Renames a track, or clears its app-defined name. */\n  renameTrack: (trackId: string, name: string | undefined) => TimelineCommandResult;\n  /** Moves a track to its final zero-based row index. */\n  moveTrack: (trackId: string, toIndex: number) => TimelineCommandResult;\n  /** Sets row collapse while preserving expanded height and media visibility. */\n  setCollapsed: (trackId: string, collapsed: boolean) => TimelineCommandResult;\n  /** Toggles row collapse using the current track state. */\n  toggleCollapse: (trackId: string) => TimelineCommandResult;\n  /** Toggles track mute. */\n  toggleMute: (trackId: string) => TimelineCommandResult;\n  /** Sets track mute explicitly. */\n  setMuted: (trackId: string, muted: boolean) => TimelineCommandResult;\n  /** Toggles track output visibility. */\n  toggleVisibility: (trackId: string) => TimelineCommandResult;\n  /** Sets track output visibility explicitly. */\n  setVisible: (trackId: string, visible: boolean) => TimelineCommandResult;\n  /** Toggles the edit lock. */\n  toggleLock: (trackId: string) => TimelineCommandResult;\n  /** Sets the edit lock explicitly. */\n  setLocked: (trackId: string, locked: boolean) => TimelineCommandResult;\n  /** Sets expanded row height. */\n  setTrackHeight: (trackId: string, height: number) => TimelineCommandResult;\n  /** Toggles edit targeting. */\n  toggleTrackTarget: (trackId: string) => TimelineCommandResult;\n  /** Sets edit targeting explicitly. */\n  setTrackTarget: (trackId: string, targeted: boolean) => TimelineCommandResult;\n  /** Sets or clears a track's group. */\n  setTrackGroup: (trackId: string, groupId: string | undefined) => TimelineCommandResult;\n}\n\n/**\n * Provides stable track commands without subscribing to track or geometry updates.\n * Compose with `useTimelineTracks` for collection state or `useTimelineTrack`\n * for row state. All commands validate current engine state at invocation.\n * @returns Track selection, organization, and state commands.\n * @example\n * ```tsx\n * const { moveTrack } = useTimelineTrackCommands();\n * return <button onClick={() => moveTrack('audio', 0)}>Move audio to first row</button>;\n * ```\n */\nexport function useTimelineTrackCommands(): UseTimelineTrackCommandsResult {\n  const engine = useTimelineEngine();\n  return useMemo(\n    () => ({\n      selectTrack: engine.selectTrack.bind(engine),\n      addTrack: engine.addTrack.bind(engine),\n      removeTrack: engine.removeTrack.bind(engine),\n      renameTrack: engine.renameTrack.bind(engine),\n      moveTrack: engine.moveTrack.bind(engine),\n      setCollapsed: engine.setTrackCollapsed.bind(engine),\n      toggleCollapse: (trackId) =>\n        engine.setTrackCollapsed(\n          trackId,\n          engine.tracks.find((track) => track.id === trackId)?.collapsed !== true\n        ),\n      toggleMute: (trackId) => engine.toggleMuteTrack(trackId),\n      setMuted: (trackId, muted) => engine.toggleMuteTrack(trackId, muted),\n      toggleVisibility: (trackId) => engine.toggleTrackVisibility(trackId),\n      setVisible: (trackId, visible) => engine.toggleTrackVisibility(trackId, visible),\n      toggleLock: (trackId) => engine.toggleLockTrack(trackId),\n      setLocked: (trackId, locked) => engine.toggleLockTrack(trackId, locked),\n      setTrackHeight: engine.setTrackHeight.bind(engine),\n      toggleTrackTarget: (trackId) => engine.toggleTrackTarget(trackId),\n      setTrackTarget: (trackId, targeted) => engine.toggleTrackTarget(trackId, targeted),\n      setTrackGroup: engine.setTrackGroup.bind(engine),\n    }),\n    [engine]\n  );\n}\n"],"mappings":";;;;;;;;;;;;;;AAqDA,SAAgB,2BAA2D;CACzE,MAAM,SAAS,kBAAkB;CACjC,OAAO,eACE;EACL,aAAa,OAAO,YAAY,KAAK,MAAM;EAC3C,UAAU,OAAO,SAAS,KAAK,MAAM;EACrC,aAAa,OAAO,YAAY,KAAK,MAAM;EAC3C,aAAa,OAAO,YAAY,KAAK,MAAM;EAC3C,WAAW,OAAO,UAAU,KAAK,MAAM;EACvC,cAAc,OAAO,kBAAkB,KAAK,MAAM;EAClD,iBAAiB,YACf,OAAO,kBACL,SACA,OAAO,OAAO,MAAM,UAAU,MAAM,OAAO,OAAO,CAAC,EAAE,cAAc,IACrE;EACF,aAAa,YAAY,OAAO,gBAAgB,OAAO;EACvD,WAAW,SAAS,UAAU,OAAO,gBAAgB,SAAS,KAAK;EACnE,mBAAmB,YAAY,OAAO,sBAAsB,OAAO;EACnE,aAAa,SAAS,YAAY,OAAO,sBAAsB,SAAS,OAAO;EAC/E,aAAa,YAAY,OAAO,gBAAgB,OAAO;EACvD,YAAY,SAAS,WAAW,OAAO,gBAAgB,SAAS,MAAM;EACtE,gBAAgB,OAAO,eAAe,KAAK,MAAM;EACjD,oBAAoB,YAAY,OAAO,kBAAkB,OAAO;EAChE,iBAAiB,SAAS,aAAa,OAAO,kBAAkB,SAAS,QAAQ;EACjF,eAAe,OAAO,cAAc,KAAK,MAAM;CACjD,IACA,CAAC,MAAM,CACT;AACF"}