{
  "name": "media-utils",
  "type": "registry:lib",
  "description": "Media item timing and fit helpers",
  "dependencies": [],
  "registryDependencies": [],
  "files": [
    {
      "path": "registry/bases/default/lib/media-utils.ts",
      "type": "registry:lib",
      "content": "import type { CSSProperties } from \"react\";\n\nexport type MediaFit = \"cover\" | \"contain\";\n\nexport type MediaItem = {\n  src: string;\n  title?: string;\n  caption?: string;\n  durationInFrames?: number;\n  fit?: MediaFit;\n  backgroundColor?: string;\n};\n\nexport type MediaWindow = MediaItem & {\n  from: number;\n  durationInFrames: number;\n  index: number;\n};\n\nexport function getMediaObjectFitStyle(\n  fit: MediaFit = \"cover\",\n): CSSProperties {\n  return {\n    width: \"100%\",\n    height: \"100%\",\n    objectFit: fit,\n    display: \"block\",\n  };\n}\n\nexport function resolveMediaWindows(\n  items: MediaItem[],\n  defaultDurationInFrames = 90,\n): MediaWindow[] {\n  let cursor = 0;\n\n  return items.map((item, index) => {\n    const durationInFrames =\n      item.durationInFrames ?? defaultDurationInFrames;\n    const window = {\n      ...item,\n      from: cursor,\n      durationInFrames,\n      index,\n    };\n    cursor += durationInFrames;\n    return window;\n  });\n}\n\nexport function getTotalMediaDuration(\n  items: MediaItem[],\n  defaultDurationInFrames = 90,\n): number {\n  return resolveMediaWindows(items, defaultDurationInFrames).reduce(\n    (total, item) => total + item.durationInFrames,\n    0,\n  );\n}\n\nexport function isVideoSource(src: string): boolean {\n  return /\\.(mp4|mov|webm|m4v)(\\?|#|$)/i.test(src);\n}\n"
    }
  ]
}