{"version":3,"file":"useTimelineEditCommands.mjs","names":[],"sources":["../../../src/hooks/editing/useTimelineEditCommands.ts"],"sourcesContent":["import { timelineCommandFail, timelineCommandOk } from '@techsquidtv/canvas-timeline-core';\nimport type {\n  TimelineCommandFailureReason,\n  TimelineCommandResult,\n  Clip,\n  TimelineDeleteRangeEditCommand,\n  TimelineEditCommand,\n  TimelineEditCommitResult,\n  TimelineEditPreview,\n  TimelineEditValidationResult,\n  TimelineInsertClipGroupEditCommand,\n  TimelineInsertEditCommand,\n  TimelineMoveEditCommand,\n  TimelineOverwriteClipGroupEditCommand,\n  TimelineOverwriteEditCommand,\n  TimelineRippleTrimEditCommand,\n  TimelineRollTrimEditCommand,\n  TimelineSlideEditCommand,\n  TimelineSplitEditCommand,\n  TimelineTrimEditCommand,\n} from '@techsquidtv/canvas-timeline-core';\nimport { useTimelineEngine } from '#react/hooks/core/useTimelineEngine';\nimport type { RationalTime } from '@techsquidtv/canvas-timeline-utils';\nimport { useCallback, useMemo } from 'react';\n/** Result returned by `useTimelineEditCommands`. */\nexport interface UseTimelineEditCommandsResult {\n  /** Validates a typed edit command without mutating timeline state. */\n  validateEdit: (command: TimelineEditCommand) => TimelineEditValidationResult;\n  /** Resolves and publishes a non-mutating command preview. */\n  previewEdit: (command: TimelineEditCommand) => TimelineEditPreview;\n  /** Commits a typed edit command as one history entry. */\n  commitEdit: (command: TimelineEditCommand) => TimelineCommandResult<TimelineEditCommitResult>;\n  /** Clears the active command preview. */\n  cancelEdit: () => void;\n  /** Commits a move command. */\n  moveClip: (\n    command: Omit<TimelineMoveEditCommand, 'type'>\n  ) => TimelineCommandResult<TimelineEditCommitResult>;\n  /** Commits a trim command. */\n  trimClip: (\n    command: Omit<TimelineTrimEditCommand, 'type'>\n  ) => TimelineCommandResult<TimelineEditCommitResult>;\n  /** Commits a ripple-trim command. */\n  rippleTrimClip: (\n    command: Omit<TimelineRippleTrimEditCommand, 'type'>\n  ) => TimelineCommandResult<TimelineEditCommitResult>;\n  /** Commits a roll-trim command. */\n  rollTrim: (\n    command: Omit<TimelineRollTrimEditCommand, 'type'>\n  ) => TimelineCommandResult<TimelineEditCommitResult>;\n  /** Commits a slip command. */\n  slipClip: (\n    clipId: string,\n    deltaTime: RationalTime\n  ) => TimelineCommandResult<TimelineEditCommitResult>;\n  /** Commits a slide command. */\n  slideClip: (\n    command: Omit<TimelineSlideEditCommand, 'type'>\n  ) => TimelineCommandResult<TimelineEditCommitResult>;\n  /** Commits a split command for one clip. */\n  splitClip: (\n    clipId: string,\n    time: RationalTime\n  ) => TimelineCommandResult<TimelineEditCommitResult>;\n  /** Commits a split command for multiple clips. */\n  splitClips: (\n    command: Omit<TimelineSplitEditCommand, 'type'>\n  ) => TimelineCommandResult<TimelineEditCommitResult>;\n  /** Splits the current selected clips at a timeline time. */\n  splitSelectedClipsAtTime: (time: RationalTime) => TimelineCommandResult<TimelineEditCommitResult>;\n  /** Commits a delete command for one clip and any linked group members. */\n  deleteClip: (clipId: string) => TimelineCommandResult<TimelineEditCommitResult>;\n  /** Deletes multiple clips and linked group members atomically as one history entry. */\n  deleteClips: (clipIds: readonly string[]) => TimelineCommandResult<TimelineEditCommitResult>;\n  /** Deletes the current selection, including linked group members. */\n  deleteSelectedClips: () => TimelineCommandResult<TimelineEditCommitResult>;\n  /** Commits an insert command. */\n  insertClip: (\n    command: Omit<TimelineInsertEditCommand, 'type'>\n  ) => TimelineCommandResult<TimelineEditCommitResult>;\n  /** Commits a grouped insert command. */\n  insertClipGroup: (\n    command: Omit<TimelineInsertClipGroupEditCommand, 'type'>\n  ) => TimelineCommandResult<TimelineEditCommitResult>;\n  /** Commits an overwrite command. */\n  overwriteClip: (\n    command: Omit<TimelineOverwriteEditCommand, 'type'>\n  ) => TimelineCommandResult<TimelineEditCommitResult>;\n  /** Commits a grouped overwrite command. */\n  overwriteClipGroup: (\n    command: Omit<TimelineOverwriteClipGroupEditCommand, 'type'>\n  ) => TimelineCommandResult<TimelineEditCommitResult>;\n  /** Commits a range delete command. */\n  deleteRange: (\n    command: Omit<TimelineDeleteRangeEditCommand, 'type'>\n  ) => TimelineCommandResult<TimelineEditCommitResult>;\n  /** Commits a lift-range command. */\n  liftRange: (command: {\n    startTime: RationalTime;\n    endTime: RationalTime;\n    trackIds?: readonly string[];\n  }) => TimelineCommandResult<TimelineEditCommitResult>;\n}\n\nfunction toTimelineCommandFailureReason(\n  reason: TimelineEditValidationResult['reason']\n): TimelineCommandFailureReason {\n  return reason ?? 'unsupported';\n}\n\n/**\n * Exposes command-layer edit APIs for React product chrome.\n *\n * The hook is a thin adapter over `TimelineEngine` command methods; it does not\n * implement edit math or range mutation rules in React.\n *\n * @returns Typed command builders and generic command-layer APIs.\n */\nexport function useTimelineEditCommands(): UseTimelineEditCommandsResult {\n  const engine = useTimelineEngine();\n\n  const validateEdit = useCallback(\n    (command: TimelineEditCommand) => engine.validateEdit(command),\n    [engine]\n  );\n\n  const previewEdit = useCallback(\n    (command: TimelineEditCommand) => engine.previewEdit(command),\n    [engine]\n  );\n\n  const commitEdit = useCallback(\n    (command: TimelineEditCommand) => {\n      const result = engine.commitEdit(command);\n      return result.committed\n        ? timelineCommandOk(result)\n        : timelineCommandFail<TimelineEditCommitResult>(\n            toTimelineCommandFailureReason(result.preview.reason),\n            result.preview.message\n          );\n    },\n    [engine]\n  );\n\n  const cancelEdit = useCallback(() => {\n    engine.cancelEdit();\n  }, [engine]);\n\n  return useMemo(\n    () => ({\n      validateEdit,\n      previewEdit,\n      commitEdit,\n      cancelEdit,\n      moveClip: (command) => commitEdit({ type: 'move', ...command }),\n      trimClip: (command) => commitEdit({ type: 'trim', ...command }),\n      rippleTrimClip: (command) => commitEdit({ type: 'ripple-trim', ...command }),\n      rollTrim: (command) => commitEdit({ type: 'roll-trim', ...command }),\n      slipClip: (clipId: string, deltaTime: RationalTime) =>\n        commitEdit({ type: 'slip', clipId, deltaTime }),\n      slideClip: (command) => commitEdit({ type: 'slide', ...command }),\n      splitClip: (clipId: string, time: RationalTime) =>\n        commitEdit({ type: 'split', clipIds: [clipId], time }),\n      splitClips: (command) => commitEdit({ type: 'split', ...command }),\n      splitSelectedClipsAtTime: (time: RationalTime) =>\n        commitEdit({ type: 'split', clipIds: engine.getSelectedClipIds(), time }),\n      deleteClip: (clipId: string) => commitEdit({ type: 'delete-clips', clipIds: [clipId] }),\n      deleteClips: (clipIds: readonly string[]) => commitEdit({ type: 'delete-clips', clipIds }),\n      deleteSelectedClips: () =>\n        commitEdit({ type: 'delete-clips', clipIds: engine.getSelectedClipIds() }),\n      insertClip: (command: {\n        clip: Clip;\n        targetTrackId: string;\n        startTime: RationalTime;\n        snap?: boolean;\n      }) => commitEdit({ type: 'insert', ...command }),\n      insertClipGroup: (command) => commitEdit({ type: 'insert-clip-group', ...command }),\n      overwriteClip: (command: {\n        clip: Clip;\n        targetTrackId: string;\n        startTime: RationalTime;\n        snap?: boolean;\n      }) => commitEdit({ type: 'overwrite', ...command }),\n      overwriteClipGroup: (command) => commitEdit({ type: 'overwrite-clip-group', ...command }),\n      deleteRange: (command) => commitEdit({ type: 'delete-range', ...command }),\n      liftRange: (command) => commitEdit({ type: 'lift-range', ...command }),\n    }),\n    [cancelEdit, commitEdit, previewEdit, engine, validateEdit]\n  );\n}\n"],"mappings":";;;;AAwGA,SAAS,+BACP,QAC8B;CAC9B,OAAO,UAAU;AACnB;;;;;;;;;AAUA,SAAgB,0BAAyD;CACvE,MAAM,SAAS,kBAAkB;CAEjC,MAAM,eAAe,aAClB,YAAiC,OAAO,aAAa,OAAO,GAC7D,CAAC,MAAM,CACT;CAEA,MAAM,cAAc,aACjB,YAAiC,OAAO,YAAY,OAAO,GAC5D,CAAC,MAAM,CACT;CAEA,MAAM,aAAa,aAChB,YAAiC;EAChC,MAAM,SAAS,OAAO,WAAW,OAAO;EACxC,OAAO,OAAO,YACV,kBAAkB,MAAM,IACxB,oBACE,+BAA+B,OAAO,QAAQ,MAAM,GACpD,OAAO,QAAQ,OACjB;CACN,GACA,CAAC,MAAM,CACT;CAEA,MAAM,aAAa,kBAAkB;EACnC,OAAO,WAAW;CACpB,GAAG,CAAC,MAAM,CAAC;CAEX,OAAO,eACE;EACL;EACA;EACA;EACA;EACA,WAAW,YAAY,WAAW;GAAE,MAAM;GAAQ,GAAG;EAAQ,CAAC;EAC9D,WAAW,YAAY,WAAW;GAAE,MAAM;GAAQ,GAAG;EAAQ,CAAC;EAC9D,iBAAiB,YAAY,WAAW;GAAE,MAAM;GAAe,GAAG;EAAQ,CAAC;EAC3E,WAAW,YAAY,WAAW;GAAE,MAAM;GAAa,GAAG;EAAQ,CAAC;EACnE,WAAW,QAAgB,cACzB,WAAW;GAAE,MAAM;GAAQ;GAAQ;EAAU,CAAC;EAChD,YAAY,YAAY,WAAW;GAAE,MAAM;GAAS,GAAG;EAAQ,CAAC;EAChE,YAAY,QAAgB,SAC1B,WAAW;GAAE,MAAM;GAAS,SAAS,CAAC,MAAM;GAAG;EAAK,CAAC;EACvD,aAAa,YAAY,WAAW;GAAE,MAAM;GAAS,GAAG;EAAQ,CAAC;EACjE,2BAA2B,SACzB,WAAW;GAAE,MAAM;GAAS,SAAS,OAAO,mBAAmB;GAAG;EAAK,CAAC;EAC1E,aAAa,WAAmB,WAAW;GAAE,MAAM;GAAgB,SAAS,CAAC,MAAM;EAAE,CAAC;EACtF,cAAc,YAA+B,WAAW;GAAE,MAAM;GAAgB;EAAQ,CAAC;EACzF,2BACE,WAAW;GAAE,MAAM;GAAgB,SAAS,OAAO,mBAAmB;EAAE,CAAC;EAC3E,aAAa,YAKP,WAAW;GAAE,MAAM;GAAU,GAAG;EAAQ,CAAC;EAC/C,kBAAkB,YAAY,WAAW;GAAE,MAAM;GAAqB,GAAG;EAAQ,CAAC;EAClF,gBAAgB,YAKV,WAAW;GAAE,MAAM;GAAa,GAAG;EAAQ,CAAC;EAClD,qBAAqB,YAAY,WAAW;GAAE,MAAM;GAAwB,GAAG;EAAQ,CAAC;EACxF,cAAc,YAAY,WAAW;GAAE,MAAM;GAAgB,GAAG;EAAQ,CAAC;EACzE,YAAY,YAAY,WAAW;GAAE,MAAM;GAAc,GAAG;EAAQ,CAAC;CACvE,IACA;EAAC;EAAY;EAAY;EAAa;EAAQ;CAAY,CAC5D;AACF"}