{"version":3,"file":"index.mjs","names":["pixiPath"],"sources":["../src/parser/decodeData.ts","../src/types/index.ts","../src/parser/decodeGid.ts","../src/parser/tilesetHelpers.ts","../src/parser/parseTmx.ts","../src/parser/resolveMap.ts","../src/renderer/parseColor.ts","../src/renderer/GroupLayerRenderer.ts","../src/renderer/ImageLayerRenderer.ts","../src/renderer/ObjectLayerRenderer.ts","../src/renderer/tilePlacement.ts","../src/renderer/TileLayerRenderer.ts","../src/renderer/createLayerRenderer.ts","../src/renderer/mapSize.ts","../src/renderer/TileSetRenderer.ts","../src/renderer/TiledMap.ts","../src/renderer/tiledAssetLoader.ts"],"sourcesContent":["import type { TiledCompression, TiledEncoding } from '../types'\n\nexport function csvToGids(csv: string): number[] {\n  const out: number[] = []\n  let cur = 0\n  let hasDigit = false\n  for (let i = 0; i < csv.length; i++) {\n    const code = csv.charCodeAt(i)\n    if (code >= 48 && code <= 57) {\n      cur = cur * 10 + (code - 48)\n      hasDigit = true\n    } else if (code === 44) {\n      // ','\n      if (hasDigit) out.push(cur)\n      cur = 0\n      hasDigit = false\n    }\n    // whitespace / newlines: ignore\n  }\n  if (hasDigit) out.push(cur)\n  return out\n}\n\nfunction base64ToBytes(base64: string): Uint8Array {\n  const binary = globalThis.atob(base64.trim())\n  const bytes = new Uint8Array(binary.length)\n  for (let i = 0; i < binary.length; i++) {\n    bytes[i] = binary.charCodeAt(i)\n  }\n  return bytes\n}\n\nfunction bytesToGids(bytes: Uint8Array): number[] {\n  const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength)\n  const count = bytes.byteLength / 4\n  const gids: number[] = new Array(count)\n\n  for (let i = 0; i < count; i++) {\n    gids[i] = view.getUint32(i * 4, true)\n  }\n\n  return gids\n}\n\nasync function decompressBytesAsync(\n  bytes: Uint8Array,\n  compression: 'gzip' | 'zlib'\n): Promise<Uint8Array> {\n  const format = compression === 'gzip' ? 'gzip' : 'deflate'\n  const ds = new DecompressionStream(format)\n  const writer = ds.writable.getWriter()\n  writer.write(bytes as Uint8Array<ArrayBuffer>)\n  writer.close()\n\n  const reader = ds.readable.getReader()\n  const chunks: Uint8Array[] = []\n  let totalLength = 0\n\n  for (;;) {\n    const { done, value } = await reader.read()\n    if (done) break\n    chunks.push(value)\n    totalLength += value.byteLength\n  }\n\n  const result = new Uint8Array(totalLength)\n  let offset = 0\n  for (const chunk of chunks) {\n    result.set(chunk, offset)\n    offset += chunk.byteLength\n  }\n  return result\n}\n\nfunction decodeBase64Sync(data: string, compression?: TiledCompression): number[] {\n  const bytes = base64ToBytes(data)\n\n  if (compression === 'gzip' || compression === 'zlib') {\n    throw new Error(\n      `Compressed tile data (${compression}) requires the async parser. ` +\n        'Use parseMapAsync() instead of parseMap() for compressed maps.'\n    )\n  }\n\n  if (compression === 'zstd') {\n    throw new Error('zstd compression is not supported in the browser')\n  }\n\n  return bytesToGids(bytes)\n}\n\nasync function decodeBase64Async(data: string, compression?: TiledCompression): Promise<number[]> {\n  const bytes = base64ToBytes(data)\n\n  if (compression === 'gzip' || compression === 'zlib') {\n    const decompressed = await decompressBytesAsync(bytes, compression)\n    return bytesToGids(decompressed)\n  }\n\n  if (compression === 'zstd') {\n    throw new Error('zstd compression is not supported in the browser')\n  }\n\n  return bytesToGids(bytes)\n}\n\nexport function decodeLayerData(\n  data: number[] | string,\n  encoding?: TiledEncoding,\n  compression?: TiledCompression\n): number[] {\n  if (Array.isArray(data)) return data\n  if (encoding === 'csv') return csvToGids(data)\n  if (encoding === 'base64') return decodeBase64Sync(data, compression)\n  throw new Error(`Unsupported encoding: ${encoding ?? 'unknown'}`)\n}\n\nexport async function decodeLayerDataAsync(\n  data: number[] | string,\n  encoding?: TiledEncoding,\n  compression?: TiledCompression\n): Promise<number[]> {\n  if (Array.isArray(data)) return data\n  if (encoding === 'csv') return csvToGids(data)\n  if (encoding === 'base64') return decodeBase64Async(data, compression)\n  throw new Error(`Unsupported encoding: ${encoding ?? 'unknown'}`)\n}\n","// ─── Tiled JSON Map Format Types ─────────────────────────────────────────────\n// Based on Tiled 1.11 JSON Map Format specification\n// https://doc.mapeditor.org/en/stable/reference/json-map-format/\n\nimport type { Container, Texture } from 'pixi.js'\nimport type { GifSource } from 'pixi.js/gif'\n\n// ─── Enums / String Unions ───────────────────────────────────────────────────\n\nexport type TiledOrientation = 'orthogonal' | 'isometric' | 'staggered' | 'hexagonal'\n\nexport type TiledRenderOrder = 'right-down' | 'right-up' | 'left-down' | 'left-up'\n\nexport type TiledStaggerAxis = 'x' | 'y'\n\nexport type TiledStaggerIndex = 'odd' | 'even'\n\nexport type TiledLayerType = 'tilelayer' | 'objectgroup' | 'imagelayer' | 'group'\n\nexport type TiledDrawOrder = 'topdown' | 'index'\n\nexport type TiledEncoding = 'csv' | 'base64'\n\nexport type TiledCompression = 'zlib' | 'gzip' | 'zstd' | ''\n\nexport type TiledPropertyType =\n  | 'string'\n  | 'int'\n  | 'float'\n  | 'bool'\n  | 'color'\n  | 'file'\n  | 'object'\n  | 'class'\n\nexport type TiledObjectAlignment =\n  | 'unspecified'\n  | 'topleft'\n  | 'top'\n  | 'topright'\n  | 'left'\n  | 'center'\n  | 'right'\n  | 'bottomleft'\n  | 'bottom'\n  | 'bottomright'\n\nexport type TiledTileRenderSize = 'tile' | 'grid'\n\nexport type TiledFillMode = 'stretch' | 'preserve-aspect-fit'\n\nexport type TiledGridOrientation = 'orthogonal' | 'isometric'\n\nexport type TiledWangSetType = 'corner' | 'edge' | 'mixed'\n\nexport type TiledHAlign = 'center' | 'right' | 'justify' | 'left'\n\nexport type TiledVAlign = 'center' | 'bottom' | 'top'\n\n// ─── Property ────────────────────────────────────────────────────────────────\n\nexport interface TiledProperty {\n  name: string\n  type: TiledPropertyType\n  propertytype?: string\n  value: string | number | boolean\n}\n\n// ─── Point ───────────────────────────────────────────────────────────────────\n\nexport interface TiledPoint {\n  x: number\n  y: number\n}\n\n// ─── Text ────────────────────────────────────────────────────────────────────\n\nexport interface TiledText {\n  bold?: boolean\n  color?: string\n  fontfamily?: string\n  halign?: TiledHAlign\n  italic?: boolean\n  kerning?: boolean\n  pixelsize?: number\n  strikeout?: boolean\n  text: string\n  underline?: boolean\n  valign?: TiledVAlign\n  wrap?: boolean\n}\n\n// ─── Object ──────────────────────────────────────────────────────────────────\n\nexport interface TiledObject {\n  ellipse?: boolean\n  gid?: number\n  height: number\n  id: number\n  name: string\n  point?: boolean\n  polygon?: TiledPoint[]\n  polyline?: TiledPoint[]\n  properties?: TiledProperty[]\n  rotation: number\n  template?: string\n  text?: TiledText\n  type: string\n  visible: boolean\n  width: number\n  x: number\n  y: number\n}\n\n// ─── Chunk (infinite maps) ───────────────────────────────────────────────────\n\nexport interface TiledChunk {\n  data: number[] | string\n  height: number\n  width: number\n  x: number\n  y: number\n}\n\n// ─── Layer ───────────────────────────────────────────────────────────────────\n\nexport interface TiledLayer {\n  chunks?: TiledChunk[]\n  class?: string\n  compression?: TiledCompression\n  data?: number[] | string\n  draworder?: TiledDrawOrder\n  encoding?: TiledEncoding\n  height?: number\n  id: number\n  image?: string\n  imageheight?: number\n  imagewidth?: number\n  layers?: TiledLayer[]\n  locked?: boolean\n  name: string\n  objects?: TiledObject[]\n  offsetx?: number\n  offsety?: number\n  opacity: number\n  parallaxx?: number\n  parallaxy?: number\n  properties?: TiledProperty[]\n  repeatx?: boolean\n  repeaty?: boolean\n  startx?: number\n  starty?: number\n  tintcolor?: string\n  transparentcolor?: string\n  type: TiledLayerType\n  visible: boolean\n  width?: number\n  x: number\n  y: number\n}\n\n// ─── Frame (tile animation) ──────────────────────────────────────────────────\n\nexport interface TiledFrame {\n  duration: number\n  tileid: number\n}\n\n// ─── Tile Offset ─────────────────────────────────────────────────────────────\n\nexport interface TiledTileOffset {\n  x: number\n  y: number\n}\n\n// ─── Grid ────────────────────────────────────────────────────────────────────\n\nexport interface TiledGrid {\n  height: number\n  orientation: TiledGridOrientation\n  width: number\n}\n\n// ─── Transformations ─────────────────────────────────────────────────────────\n\nexport interface TiledTransformations {\n  hflip: boolean\n  vflip: boolean\n  rotate: boolean\n  preferuntransformed: boolean\n}\n\n// ─── Terrain ─────────────────────────────────────────────────────────────────\n\nexport interface TiledTerrain {\n  name: string\n  properties?: TiledProperty[]\n  tile: number\n}\n\n// ─── Wang Color ──────────────────────────────────────────────────────────────\n\nexport interface TiledWangColor {\n  class?: string\n  color: string\n  name: string\n  probability: number\n  properties?: TiledProperty[]\n  tile: number\n}\n\n// ─── Wang Tile ───────────────────────────────────────────────────────────────\n\nexport interface TiledWangTile {\n  tileid: number\n  wangid: number[]\n}\n\n// ─── Wang Set ────────────────────────────────────────────────────────────────\n\nexport interface TiledWangSet {\n  class?: string\n  colors: TiledWangColor[]\n  name: string\n  properties?: TiledProperty[]\n  tile: number\n  type: TiledWangSetType\n  wangtiles: TiledWangTile[]\n}\n\n// ─── Tile Definition ─────────────────────────────────────────────────────────\n\nexport interface TiledTileDefinition {\n  animation?: TiledFrame[]\n  id: number\n  image?: string\n  imageheight?: number\n  imagewidth?: number\n  x?: number\n  y?: number\n  width?: number\n  height?: number\n  objectgroup?: TiledLayer\n  probability?: number\n  properties?: TiledProperty[]\n  terrain?: number[]\n  type?: string\n}\n\n// ─── Tileset ─────────────────────────────────────────────────────────────────\n\nexport interface TiledTileset {\n  backgroundcolor?: string\n  class?: string\n  columns: number\n  fillmode?: TiledFillMode\n  firstgid: number\n  grid?: TiledGrid\n  image?: string\n  imageheight?: number\n  imagewidth?: number\n  margin: number\n  name: string\n  objectalignment?: TiledObjectAlignment\n  properties?: TiledProperty[]\n  source?: string\n  spacing: number\n  terrains?: TiledTerrain[]\n  tilecount: number\n  tiledversion?: string\n  tileheight: number\n  tileoffset?: TiledTileOffset\n  tilerendersize?: TiledTileRenderSize\n  tiles?: TiledTileDefinition[]\n  tilewidth: number\n  transformations?: TiledTransformations\n  transparentcolor?: string\n  type?: string\n  version?: string\n  wangsets?: TiledWangSet[]\n}\n\n// ─── External tileset reference (before resolution) ──────────────────────────\n\nexport interface TiledTilesetRef {\n  firstgid: number\n  source: string\n}\n\n// ─── Map ─────────────────────────────────────────────────────────────────────\n\nexport interface TiledMap {\n  backgroundcolor?: string\n  class?: string\n  compressionlevel?: number\n  height: number\n  hexsidelength?: number\n  infinite: boolean\n  layers: TiledLayer[]\n  nextlayerid: number\n  nextobjectid: number\n  orientation: TiledOrientation\n  parallaxoriginx?: number\n  parallaxoriginy?: number\n  properties?: TiledProperty[]\n  renderorder?: TiledRenderOrder\n  staggeraxis?: TiledStaggerAxis\n  staggerindex?: TiledStaggerIndex\n  tiledversion?: string\n  tileheight: number\n  tilesets: (TiledTileset | TiledTilesetRef)[]\n  tilewidth: number\n  type: 'map'\n  version: string\n  width: number\n}\n\n// ─── Object Template ─────────────────────────────────────────────────────────\n\nexport interface TiledObjectTemplate {\n  type: 'template'\n  tileset?: TiledTileset | TiledTilesetRef\n  object: TiledObject\n}\n\n// ─── GID Bit Flags ───────────────────────────────────────────────────────────\n\nexport const FLIPPED_HORIZONTALLY_FLAG = 0x80000000\nexport const FLIPPED_VERTICALLY_FLAG = 0x40000000\nexport const FLIPPED_DIAGONALLY_FLAG = 0x20000000\nexport const ROTATED_HEXAGONAL_120_FLAG = 0x10000000\nexport const GID_MASK = 0x0fffffff\n\n// ─── Resolved types (post-parse, used by renderer) ──────────────────────────\n\nexport interface ResolvedTile {\n  gid: number\n  localId: number\n  tilesetIndex: number\n  horizontalFlip: boolean\n  verticalFlip: boolean\n  diagonalFlip: boolean\n}\n\nexport interface ResolvedChunk {\n  x: number\n  y: number\n  width: number\n  height: number\n  tiles: (ResolvedTile | null)[]\n}\n\nexport interface ResolvedTileLayer {\n  type: 'tilelayer'\n  id: number\n  name: string\n  opacity: number\n  visible: boolean\n  offsetx: number\n  offsety: number\n  parallaxx: number\n  parallaxy: number\n  tintcolor?: string\n  properties: TiledProperty[]\n  width: number\n  height: number\n  infinite: boolean\n  tiles: (ResolvedTile | null)[]\n  chunks?: ResolvedChunk[]\n}\n\nexport interface ResolvedImageLayer {\n  type: 'imagelayer'\n  id: number\n  name: string\n  opacity: number\n  visible: boolean\n  offsetx: number\n  offsety: number\n  parallaxx: number\n  parallaxy: number\n  tintcolor?: string\n  properties: TiledProperty[]\n  image: string\n  imagewidth?: number\n  imageheight?: number\n  repeatx: boolean\n  repeaty: boolean\n  transparentcolor?: string\n}\n\nexport interface ResolvedObjectLayer {\n  type: 'objectgroup'\n  id: number\n  name: string\n  opacity: number\n  visible: boolean\n  offsetx: number\n  offsety: number\n  parallaxx: number\n  parallaxy: number\n  tintcolor?: string\n  properties: TiledProperty[]\n  draworder: TiledDrawOrder\n  objects: TiledObject[]\n}\n\nexport interface ResolvedGroupLayer {\n  type: 'group'\n  id: number\n  name: string\n  opacity: number\n  visible: boolean\n  offsetx: number\n  offsety: number\n  parallaxx: number\n  parallaxy: number\n  tintcolor?: string\n  properties: TiledProperty[]\n  layers: ResolvedLayer[]\n}\n\nexport type ResolvedLayer =\n  | ResolvedTileLayer\n  | ResolvedImageLayer\n  | ResolvedObjectLayer\n  | ResolvedGroupLayer\n\nexport interface ResolvedTileset {\n  firstgid: number\n  name: string\n  source?: string\n  tilewidth: number\n  tileheight: number\n  columns: number\n  tilecount: number\n  margin: number\n  spacing: number\n  image?: string\n  imagewidth?: number\n  imageheight?: number\n  tileoffset: TiledTileOffset\n  objectalignment: TiledObjectAlignment\n  tilerendersize: TiledTileRenderSize\n  fillmode: TiledFillMode\n  tiles: Map<number, TiledTileDefinition>\n  properties: TiledProperty[]\n  transformations?: TiledTransformations\n  grid?: TiledGrid\n  wangsets?: TiledWangSet[]\n  terrains?: TiledTerrain[]\n}\n\nexport interface ResolvedMap {\n  orientation: TiledOrientation\n  renderorder: TiledRenderOrder\n  width: number\n  height: number\n  tilewidth: number\n  tileheight: number\n  infinite: boolean\n  backgroundcolor?: string\n  hexsidelength?: number\n  staggeraxis?: TiledStaggerAxis\n  staggerindex?: TiledStaggerIndex\n  parallaxoriginx: number\n  parallaxoriginy: number\n  properties: TiledProperty[]\n  tilesets: ResolvedTileset[]\n  layers: ResolvedLayer[]\n  version: string\n  tiledversion?: string\n}\n\n// ─── Parser options ──────────────────────────────────────────────────────────\n\nexport interface ParseOptions {\n  externalTilesets?: Map<string, TiledTileset>\n  templates?: Map<string, TiledObjectTemplate>\n}\n\n// ─── Renderer options ────────────────────────────────────────────────────────\n\nexport interface TiledMapOptions {\n  tilesetTextures?: Map<string, Texture>\n  imageLayerTextures?: Map<string, Texture>\n  tileImageTextures?: Map<string, Texture>\n  tileImageGifSources?: Map<string, GifSource>\n  imageLayerGifSources?: Map<string, GifSource>\n}\n\nexport interface TiledMapAsset {\n  mapData: ResolvedMap\n  container: Container\n}\n\n// ─── Tile placement ──────────────────────────────────────────────────────────\n\nexport interface MapContext {\n  orientation: TiledOrientation\n  renderorder: TiledRenderOrder\n  tilewidth: number\n  tileheight: number\n  hexsidelength?: number\n  staggeraxis?: TiledStaggerAxis\n  staggerindex?: TiledStaggerIndex\n  /** Map width in pixels; used by image layers when tiling (repeatx/repeaty). */\n  mapPixelWidth?: number\n  /** Map height in pixels; used by image layers when tiling (repeatx/repeaty). */\n  mapPixelHeight?: number\n}\n\nexport interface TilePosition {\n  x: number\n  y: number\n}\n","import type { ResolvedTile } from '../types'\nimport {\n  FLIPPED_DIAGONALLY_FLAG,\n  FLIPPED_HORIZONTALLY_FLAG,\n  FLIPPED_VERTICALLY_FLAG,\n  GID_MASK\n} from '../types'\n\nexport function decodeGid(raw: number): ResolvedTile | null {\n  const gid = raw & GID_MASK\n  if (gid === 0) return null\n\n  return {\n    gid,\n    localId: 0,\n    tilesetIndex: 0,\n    horizontalFlip: (raw & FLIPPED_HORIZONTALLY_FLAG) !== 0,\n    verticalFlip: (raw & FLIPPED_VERTICALLY_FLAG) !== 0,\n    diagonalFlip: (raw & FLIPPED_DIAGONALLY_FLAG) !== 0\n  }\n}\n","import type { TiledTileset, TiledTilesetRef } from '../types'\n\nexport function isTilesetRef(ts: TiledTileset | TiledTilesetRef): ts is TiledTilesetRef {\n  return 'source' in ts && !('name' in ts)\n}\n\ninterface ColumnsSource {\n  columns?: number\n  imagewidth?: number\n  tilewidth: number\n  margin: number\n  spacing: number\n}\n\nexport function computeTilesetColumns(ts: ColumnsSource): number {\n  if (ts.columns && ts.columns > 0) return ts.columns\n  if (!ts.imagewidth || ts.tilewidth <= 0) return 0\n  return Math.floor((ts.imagewidth - 2 * ts.margin + ts.spacing) / (ts.tilewidth + ts.spacing))\n}\n\n/**\n * Finds the index of the tileset whose firstgid range contains `gid`.\n * Works with any array where each element exposes `firstgid`.\n * Returns -1 when no tileset matches.\n */\nexport function findTilesetIndexForGid(gid: number, tilesets: { firstgid: number }[]): number {\n  for (let i = tilesets.length - 1; i >= 0; i--) {\n    const ts = tilesets[i]\n    if (ts && ts.firstgid <= gid) return i\n  }\n  return -1\n}\n\n/**\n * Finds the tileset entry whose firstgid range contains `gid`.\n * Accepts a key function to extract firstgid from arbitrary element types.\n * Returns undefined when no tileset matches.\n */\nexport function findTilesetForGid<T>(\n  gid: number,\n  tilesets: T[],\n  getFirstGid: (t: T) => number\n): T | undefined {\n  for (let i = tilesets.length - 1; i >= 0; i--) {\n    const ts = tilesets[i]\n    if (ts && getFirstGid(ts) <= gid) return ts\n  }\n  return undefined\n}\n","import type {\n  TiledChunk,\n  TiledCompression,\n  TiledDrawOrder,\n  TiledEncoding,\n  TiledFillMode,\n  TiledFrame,\n  TiledGrid,\n  TiledGridOrientation,\n  TiledHAlign,\n  TiledLayer,\n  TiledLayerType,\n  TiledMap,\n  TiledObject,\n  TiledObjectAlignment,\n  TiledObjectTemplate,\n  TiledOrientation,\n  TiledPoint,\n  TiledProperty,\n  TiledPropertyType,\n  TiledRenderOrder,\n  TiledStaggerAxis,\n  TiledStaggerIndex,\n  TiledTerrain,\n  TiledText,\n  TiledTileDefinition,\n  TiledTileOffset,\n  TiledTileRenderSize,\n  TiledTileset,\n  TiledTilesetRef,\n  TiledTransformations,\n  TiledVAlign,\n  TiledWangColor,\n  TiledWangSet,\n  TiledWangSetType,\n  TiledWangTile\n} from '../types'\nimport { csvToGids } from './decodeData.js'\nimport { computeTilesetColumns } from './tilesetHelpers.js'\n\n// ─── Attribute helpers ──────────────────────────────────────────────────────\n\nfunction str(el: Element, name: string, fallback = ''): string {\n  return el.getAttribute(name) ?? fallback\n}\n\nfunction int(el: Element, name: string, fallback = 0): number {\n  const v = el.getAttribute(name)\n  return v != null ? parseInt(v, 10) : fallback\n}\n\nfunction float(el: Element, name: string, fallback = 0): number {\n  const v = el.getAttribute(name)\n  return v != null ? parseFloat(v) : fallback\n}\n\nfunction bool(el: Element, name: string, fallback = false): boolean {\n  const v = el.getAttribute(name)\n  if (v == null) return fallback\n  return v === '1' || v === 'true'\n}\n\nfunction optStr(el: Element, name: string): string | undefined {\n  const v = el.getAttribute(name)\n  return v != null ? v : undefined\n}\n\nfunction optInt(el: Element, name: string): number | undefined {\n  const v = el.getAttribute(name)\n  return v != null ? parseInt(v, 10) : undefined\n}\n\nfunction optFloat(el: Element, name: string): number | undefined {\n  const v = el.getAttribute(name)\n  return v != null ? parseFloat(v) : undefined\n}\n\nfunction children(el: Element, tag: string): Element[] {\n  const result: Element[] = []\n  for (let i = 0; i < el.children.length; i++) {\n    const child = el.children[i]!\n    if (child.tagName === tag) result.push(child)\n  }\n  return result\n}\n\nfunction child(el: Element, tag: string): Element | null {\n  for (let i = 0; i < el.children.length; i++) {\n    const c = el.children[i]!\n    if (c.tagName === tag) return c\n  }\n  return null\n}\n\n// ─── Properties ─────────────────────────────────────────────────────────────\n\nfunction parseProperties(el: Element): TiledProperty[] | undefined {\n  const propsEl = child(el, 'properties')\n  if (!propsEl) return undefined\n\n  const props: TiledProperty[] = []\n  for (const pEl of children(propsEl, 'property')) {\n    const type = str(pEl, 'type', 'string') as TiledPropertyType\n    let value: string | number | boolean = str(pEl, 'value', '')\n    // If value not in attribute, check text content (multiline strings)\n    if (!pEl.hasAttribute('value')) {\n      value = pEl.textContent ?? ''\n    }\n    if (type === 'int') value = parseInt(value as string, 10)\n    else if (type === 'float') value = parseFloat(value as string)\n    else if (type === 'bool') value = value === 'true'\n\n    props.push({\n      name: str(pEl, 'name'),\n      type,\n      propertytype: optStr(pEl, 'propertytype'),\n      value\n    })\n  }\n  return props.length > 0 ? props : undefined\n}\n\n// ─── Image ──────────────────────────────────────────────────────────────────\n\ninterface ImageInfo {\n  image?: string\n  imagewidth?: number\n  imageheight?: number\n  transparentcolor?: string\n}\n\nfunction parseImage(el: Element): ImageInfo {\n  const imgEl = child(el, 'image')\n  if (!imgEl) return {}\n  return {\n    image: optStr(imgEl, 'source'),\n    imagewidth: optInt(imgEl, 'width'),\n    imageheight: optInt(imgEl, 'height'),\n    transparentcolor: optStr(imgEl, 'trans')\n  }\n}\n\n// ─── Tile offset ────────────────────────────────────────────────────────────\n\nfunction parseTileOffset(el: Element): TiledTileOffset | undefined {\n  const to = child(el, 'tileoffset')\n  if (!to) return undefined\n  return { x: int(to, 'x'), y: int(to, 'y') }\n}\n\n// ─── Grid ───────────────────────────────────────────────────────────────────\n\nfunction parseGrid(el: Element): TiledGrid | undefined {\n  const g = child(el, 'grid')\n  if (!g) return undefined\n  return {\n    orientation: str(g, 'orientation', 'orthogonal') as TiledGridOrientation,\n    width: int(g, 'width'),\n    height: int(g, 'height')\n  }\n}\n\n// ─── Transformations ────────────────────────────────────────────────────────\n\nfunction parseTransformations(el: Element): TiledTransformations | undefined {\n  const t = child(el, 'transformations')\n  if (!t) return undefined\n  return {\n    hflip: bool(t, 'hflip'),\n    vflip: bool(t, 'vflip'),\n    rotate: bool(t, 'rotate'),\n    preferuntransformed: bool(t, 'preferuntransformed')\n  }\n}\n\n// ─── Terrain ────────────────────────────────────────────────────────────────\n\nfunction parseTerrains(el: Element): TiledTerrain[] | undefined {\n  const ttEl = child(el, 'terraintypes')\n  if (!ttEl) return undefined\n  return children(ttEl, 'terrain').map((t) => ({\n    name: str(t, 'name'),\n    tile: int(t, 'tile'),\n    properties: parseProperties(t)\n  }))\n}\n\n// ─── Wang sets ──────────────────────────────────────────────────────────────\n\nfunction parseWangSets(el: Element): TiledWangSet[] | undefined {\n  const wsEl = child(el, 'wangsets')\n  if (!wsEl) return undefined\n\n  return children(wsEl, 'wangset').map((ws) => {\n    const colors: TiledWangColor[] = children(ws, 'wangcolor').map((wc) => ({\n      class: optStr(wc, 'class'),\n      color: str(wc, 'color'),\n      name: str(wc, 'name'),\n      probability: float(wc, 'probability'),\n      tile: int(wc, 'tile'),\n      properties: parseProperties(wc)\n    }))\n\n    const tiles: TiledWangTile[] = children(ws, 'wangtile').map((wt) => ({\n      tileid: int(wt, 'tileid'),\n      wangid: str(wt, 'wangid').split(',').map(Number)\n    }))\n\n    return {\n      class: optStr(ws, 'class'),\n      colors,\n      name: str(ws, 'name'),\n      properties: parseProperties(ws),\n      tile: int(ws, 'tile'),\n      type: str(ws, 'type', 'corner') as TiledWangSetType,\n      wangtiles: tiles\n    } satisfies TiledWangSet\n  })\n}\n\n// ─── Animation ──────────────────────────────────────────────────────────────\n\nfunction parseAnimation(el: Element): TiledFrame[] | undefined {\n  const animEl = child(el, 'animation')\n  if (!animEl) return undefined\n  return children(animEl, 'frame').map((f) => ({\n    tileid: int(f, 'tileid'),\n    duration: int(f, 'duration')\n  }))\n}\n\n// ─── Tile definitions ───────────────────────────────────────────────────────\n\nfunction parseTileDefinitions(el: Element): TiledTileDefinition[] | undefined {\n  const tileEls = children(el, 'tile')\n  if (tileEls.length === 0) return undefined\n\n  return tileEls.map((t) => {\n    const img = parseImage(t)\n    const terrainAttr = optStr(t, 'terrain')\n    const terrain = terrainAttr\n      ? terrainAttr.split(',').map((v) => (v === '' ? -1 : parseInt(v, 10)))\n      : undefined\n\n    // Object group (collision shapes)\n    const ogEl = child(t, 'objectgroup')\n    const objectgroup = ogEl ? parseObjectGroup(ogEl) : undefined\n\n    const def: TiledTileDefinition = {\n      id: int(t, 'id'),\n      type: optStr(t, 'type') ?? optStr(t, 'class'),\n      probability: optFloat(t, 'probability'),\n      x: optInt(t, 'x'),\n      y: optInt(t, 'y'),\n      width: optInt(t, 'width'),\n      height: optInt(t, 'height'),\n      properties: parseProperties(t),\n      animation: parseAnimation(t),\n      terrain,\n      objectgroup,\n      ...img\n    }\n\n    return def\n  })\n}\n\n// ─── Tileset ────────────────────────────────────────────────────────────────\n\nfunction parseTileset(el: Element): TiledTileset | TiledTilesetRef {\n  const source = optStr(el, 'source')\n  if (source) {\n    return {\n      firstgid: int(el, 'firstgid'),\n      source\n    } satisfies TiledTilesetRef\n  }\n\n  const img = parseImage(el)\n  const tiles = parseTileDefinitions(el)\n\n  const tilewidth = int(el, 'tilewidth')\n  const spacing = int(el, 'spacing')\n  const margin = int(el, 'margin')\n  const columns = computeTilesetColumns({\n    columns: int(el, 'columns'),\n    imagewidth: img.imagewidth,\n    tilewidth,\n    margin,\n    spacing\n  })\n\n  return {\n    backgroundcolor: optStr(el, 'backgroundcolor'),\n    class: optStr(el, 'class'),\n    columns,\n    fillmode: optStr(el, 'fillmode') as TiledFillMode | undefined,\n    firstgid: int(el, 'firstgid'),\n    grid: parseGrid(el),\n    margin,\n    name: str(el, 'name'),\n    objectalignment: optStr(el, 'objectalignment') as TiledObjectAlignment | undefined,\n    properties: parseProperties(el),\n    spacing,\n    terrains: parseTerrains(el),\n    tilecount: int(el, 'tilecount'),\n    tileheight: int(el, 'tileheight'),\n    tileoffset: parseTileOffset(el),\n    tilerendersize: optStr(el, 'tilerendersize') as TiledTileRenderSize | undefined,\n    tiles: tiles,\n    tilewidth,\n    transformations: parseTransformations(el),\n    wangsets: parseWangSets(el),\n    ...img\n  } satisfies TiledTileset\n}\n\n// ─── Data / Chunks ──────────────────────────────────────────────────────────\n\nfunction parseData(dataEl: Element): {\n  data?: number[] | string\n  encoding?: TiledEncoding\n  compression?: TiledCompression\n  chunks?: TiledChunk[]\n} {\n  const encoding = optStr(dataEl, 'encoding') as TiledEncoding | undefined\n  const compression = optStr(dataEl, 'compression') as TiledCompression | undefined\n\n  // Check for chunks (infinite maps)\n  const chunkEls = children(dataEl, 'chunk')\n  if (chunkEls.length > 0) {\n    const chunks: TiledChunk[] = chunkEls.map((c) => ({\n      x: int(c, 'x'),\n      y: int(c, 'y'),\n      width: int(c, 'width'),\n      height: int(c, 'height'),\n      data: parseDataContent(c, encoding)\n    }))\n    return { encoding, compression, chunks }\n  }\n\n  return {\n    data: parseDataContent(dataEl, encoding),\n    encoding,\n    compression\n  }\n}\n\nfunction parseDataContent(el: Element, encoding: TiledEncoding | undefined): number[] | string {\n  if (encoding === 'base64') {\n    return (el.textContent ?? '').trim()\n  }\n\n  if (encoding === 'csv') {\n    return csvToGids(el.textContent ?? '')\n  }\n\n  // XML tile elements (no encoding)\n  const tileEls = children(el, 'tile')\n  return tileEls.map((t) => int(t, 'gid'))\n}\n\n// ─── Objects ────────────────────────────────────────────────────────────────\n\nfunction parsePoints(pointStr: string): TiledPoint[] {\n  return pointStr\n    .trim()\n    .split(/\\s+/)\n    .map((pair) => {\n      const [x, y] = pair.split(',').map(Number)\n      return { x: x!, y: y! }\n    })\n}\n\nfunction parseTextObject(el: Element): TiledText {\n  return {\n    text: el.textContent ?? '',\n    fontfamily: optStr(el, 'fontfamily'),\n    pixelsize: optInt(el, 'pixelsize'),\n    wrap: bool(el, 'wrap') ? true : undefined,\n    color: optStr(el, 'color'),\n    bold: bool(el, 'bold') ? true : undefined,\n    italic: bool(el, 'italic') ? true : undefined,\n    underline: bool(el, 'underline') ? true : undefined,\n    strikeout: bool(el, 'strikeout') ? true : undefined,\n    kerning: el.hasAttribute('kerning') ? bool(el, 'kerning', true) : undefined,\n    halign: optStr(el, 'halign') as TiledHAlign | undefined,\n    valign: optStr(el, 'valign') as TiledVAlign | undefined\n  }\n}\n\nfunction parseObject(el: Element): TiledObject {\n  const obj: TiledObject = {\n    id: int(el, 'id'),\n    name: str(el, 'name'),\n    type: str(el, 'type') || str(el, 'class'),\n    x: float(el, 'x'),\n    y: float(el, 'y'),\n    width: float(el, 'width'),\n    height: float(el, 'height'),\n    rotation: float(el, 'rotation'),\n    visible: el.hasAttribute('visible') ? bool(el, 'visible', true) : true,\n    properties: parseProperties(el)\n  }\n\n  const gid = optInt(el, 'gid')\n  if (gid != null) obj.gid = gid\n\n  const template = optStr(el, 'template')\n  if (template) obj.template = template\n\n  if (child(el, 'ellipse')) obj.ellipse = true\n  if (child(el, 'point')) obj.point = true\n\n  const polygonEl = child(el, 'polygon')\n  if (polygonEl) {\n    obj.polygon = parsePoints(str(polygonEl, 'points'))\n  }\n\n  const polylineEl = child(el, 'polyline')\n  if (polylineEl) {\n    obj.polyline = parsePoints(str(polylineEl, 'points'))\n  }\n\n  const textEl = child(el, 'text')\n  if (textEl) {\n    obj.text = parseTextObject(textEl)\n  }\n\n  return obj\n}\n\n// ─── Layers ─────────────────────────────────────────────────────────────────\n\nfunction parseLayerCommon(el: Element): Partial<TiledLayer> {\n  return {\n    id: int(el, 'id'),\n    name: str(el, 'name'),\n    class: optStr(el, 'class'),\n    opacity: float(el, 'opacity', 1),\n    visible: el.hasAttribute('visible') ? bool(el, 'visible', true) : true,\n    tintcolor: optStr(el, 'tintcolor'),\n    offsetx: optFloat(el, 'offsetx'),\n    offsety: optFloat(el, 'offsety'),\n    parallaxx: optFloat(el, 'parallaxx'),\n    parallaxy: optFloat(el, 'parallaxy'),\n    locked: el.hasAttribute('locked') ? bool(el, 'locked') : undefined,\n    properties: parseProperties(el),\n    x: int(el, 'x'),\n    y: int(el, 'y')\n  }\n}\n\nfunction parseTileLayer(el: Element): TiledLayer {\n  const dataEl = child(el, 'data')\n  const dataInfo = dataEl ? parseData(dataEl) : {}\n\n  return {\n    ...parseLayerCommon(el),\n    type: 'tilelayer' as TiledLayerType,\n    width: optInt(el, 'width'),\n    height: optInt(el, 'height'),\n    startx: optInt(el, 'startx'),\n    starty: optInt(el, 'starty'),\n    ...dataInfo\n  } as TiledLayer\n}\n\nfunction parseObjectGroup(el: Element): TiledLayer {\n  return {\n    ...parseLayerCommon(el),\n    type: 'objectgroup' as TiledLayerType,\n    draworder: optStr(el, 'draworder') as TiledDrawOrder | undefined,\n    objects: children(el, 'object').map(parseObject)\n  } as TiledLayer\n}\n\nfunction parseImageLayer(el: Element): TiledLayer {\n  const img = parseImage(el)\n  return {\n    ...parseLayerCommon(el),\n    type: 'imagelayer' as TiledLayerType,\n    repeatx: el.hasAttribute('repeatx') ? bool(el, 'repeatx') : undefined,\n    repeaty: el.hasAttribute('repeaty') ? bool(el, 'repeaty') : undefined,\n    transparentcolor: img.transparentcolor,\n    image: img.image,\n    imagewidth: img.imagewidth,\n    imageheight: img.imageheight\n  } as TiledLayer\n}\n\nfunction parseGroupLayer(el: Element): TiledLayer {\n  return {\n    ...parseLayerCommon(el),\n    type: 'group' as TiledLayerType,\n    layers: parseLayers(el)\n  } as TiledLayer\n}\n\nfunction parseLayers(parentEl: Element): TiledLayer[] {\n  const layers: TiledLayer[] = []\n  for (let i = 0; i < parentEl.children.length; i++) {\n    const el = parentEl.children[i]!\n    switch (el.tagName) {\n      case 'layer':\n        layers.push(parseTileLayer(el))\n        break\n      case 'objectgroup':\n        layers.push(parseObjectGroup(el))\n        break\n      case 'imagelayer':\n        layers.push(parseImageLayer(el))\n        break\n      case 'group':\n        layers.push(parseGroupLayer(el))\n        break\n    }\n  }\n  return layers\n}\n\n// ─── Map ────────────────────────────────────────────────────────────────────\n\nexport function parseTmx(xml: string): TiledMap {\n  const parser = new DOMParser()\n  const doc = parser.parseFromString(xml, 'text/xml')\n\n  const errorNode = doc.querySelector('parsererror')\n  if (errorNode) {\n    throw new Error(`TMX XML parse error: ${errorNode.textContent}`)\n  }\n\n  const mapEl = doc.documentElement\n  if (mapEl.tagName !== 'map') {\n    throw new Error(`Expected root <map> element, got <${mapEl.tagName}>`)\n  }\n\n  const tilesets: (TiledTileset | TiledTilesetRef)[] = children(mapEl, 'tileset').map(parseTileset)\n\n  const layers = parseLayers(mapEl)\n\n  return {\n    backgroundcolor: optStr(mapEl, 'backgroundcolor'),\n    class: optStr(mapEl, 'class'),\n    compressionlevel: optInt(mapEl, 'compressionlevel'),\n    height: int(mapEl, 'height'),\n    hexsidelength: optInt(mapEl, 'hexsidelength'),\n    infinite: bool(mapEl, 'infinite'),\n    layers,\n    nextlayerid: int(mapEl, 'nextlayerid'),\n    nextobjectid: int(mapEl, 'nextobjectid'),\n    orientation: str(mapEl, 'orientation', 'orthogonal') as TiledOrientation,\n    parallaxoriginx: optFloat(mapEl, 'parallaxoriginx'),\n    parallaxoriginy: optFloat(mapEl, 'parallaxoriginy'),\n    properties: parseProperties(mapEl),\n    renderorder: optStr(mapEl, 'renderorder') as TiledRenderOrder | undefined,\n    staggeraxis: optStr(mapEl, 'staggeraxis') as TiledStaggerAxis | undefined,\n    staggerindex: optStr(mapEl, 'staggerindex') as TiledStaggerIndex | undefined,\n    tiledversion: optStr(mapEl, 'tiledversion'),\n    tileheight: int(mapEl, 'tileheight'),\n    tilesets,\n    tilewidth: int(mapEl, 'tilewidth'),\n    type: 'map',\n    version: str(mapEl, 'version', '1.0'),\n    width: int(mapEl, 'width')\n  }\n}\n\nexport function parseTsx(xml: string): TiledTileset {\n  const parser = new DOMParser()\n  const doc = parser.parseFromString(xml, 'text/xml')\n\n  const errorNode = doc.querySelector('parsererror')\n  if (errorNode) {\n    throw new Error(`TSX XML parse error: ${errorNode.textContent}`)\n  }\n\n  const tsEl = doc.documentElement\n  if (tsEl.tagName !== 'tileset') {\n    throw new Error(`Expected root <tileset> element, got <${tsEl.tagName}>`)\n  }\n\n  const result = parseTileset(tsEl)\n  if ('source' in result) {\n    throw new Error('TSX file should not contain a source reference')\n  }\n  return result\n}\n\n// ─── Template (TX) ──────────────────────────────────────────────────────────\n\nexport function parseTx(xml: string): TiledObjectTemplate {\n  const parser = new DOMParser()\n  const doc = parser.parseFromString(xml, 'text/xml')\n\n  const errorNode = doc.querySelector('parsererror')\n  if (errorNode) {\n    throw new Error(`TX XML parse error: ${errorNode.textContent}`)\n  }\n\n  const tplEl = doc.documentElement\n  if (tplEl.tagName !== 'template') {\n    throw new Error(`Expected root <template> element, got <${tplEl.tagName}>`)\n  }\n\n  const tilesetEl = child(tplEl, 'tileset')\n  const objectEl = child(tplEl, 'object')\n  if (!objectEl) {\n    throw new Error('Template is missing <object>')\n  }\n\n  return {\n    type: 'template',\n    tileset: tilesetEl ? parseTileset(tilesetEl) : undefined,\n    object: parseObject(objectEl)\n  }\n}\n","import type {\n  ParseOptions,\n  ResolvedChunk,\n  ResolvedGroupLayer,\n  ResolvedImageLayer,\n  ResolvedLayer,\n  ResolvedMap,\n  ResolvedObjectLayer,\n  ResolvedTile,\n  ResolvedTileLayer,\n  ResolvedTileset,\n  TiledChunk,\n  TiledDrawOrder,\n  TiledLayer,\n  TiledMap,\n  TiledObject,\n  TiledObjectTemplate,\n  TiledRenderOrder,\n  TiledTileDefinition,\n  TiledTileset,\n  TiledTilesetRef\n} from '../types'\nimport { GID_MASK } from '../types'\nimport { decodeLayerData, decodeLayerDataAsync } from './decodeData.js'\nimport { decodeGid } from './decodeGid.js'\nimport { computeTilesetColumns, findTilesetIndexForGid, isTilesetRef } from './tilesetHelpers.js'\n\n// ─── Resolve tileset ─────────────────────────────────────────────────────────\n\nfunction resolveTileset(raw: TiledTileset, source?: string): ResolvedTileset {\n  const tiles = new Map<number, TiledTileDefinition>()\n  if (raw.tiles) {\n    for (const tile of raw.tiles) {\n      tiles.set(tile.id, tile)\n    }\n  }\n\n  return {\n    firstgid: raw.firstgid,\n    name: raw.name,\n    source,\n    tilewidth: raw.tilewidth,\n    tileheight: raw.tileheight,\n    columns: computeTilesetColumns(raw),\n    tilecount: raw.tilecount,\n    margin: raw.margin,\n    spacing: raw.spacing,\n    image: raw.image,\n    imagewidth: raw.imagewidth,\n    imageheight: raw.imageheight,\n    tileoffset: raw.tileoffset ?? { x: 0, y: 0 },\n    objectalignment: raw.objectalignment ?? 'unspecified',\n    tilerendersize: raw.tilerendersize ?? 'tile',\n    fillmode: raw.fillmode ?? 'stretch',\n    tiles,\n    properties: raw.properties ?? [],\n    transformations: raw.transformations,\n    grid: raw.grid,\n    wangsets: raw.wangsets,\n    terrains: raw.terrains\n  }\n}\n\n// ─── Resolve tile data ───────────────────────────────────────────────────────\n\nfunction resolveGids(rawGids: number[], tilesets: ResolvedTileset[]): (ResolvedTile | null)[] {\n  const result: (ResolvedTile | null)[] = new Array(rawGids.length)\n\n  for (let i = 0; i < rawGids.length; i++) {\n    const rawGid = rawGids[i]\n    if (rawGid === undefined || rawGid === 0) {\n      result[i] = null\n      continue\n    }\n\n    const decoded = decodeGid(rawGid)\n    if (!decoded) {\n      result[i] = null\n      continue\n    }\n\n    const tsIdx = findTilesetIndexForGid(decoded.gid, tilesets)\n    const ts = tsIdx >= 0 ? tilesets[tsIdx] : undefined\n    if (ts) {\n      decoded.tilesetIndex = tsIdx\n      decoded.localId = decoded.gid - ts.firstgid\n    }\n    result[i] = decoded\n  }\n\n  return result\n}\n\n// ─── Layer defaults ──────────────────────────────────────────────────────────\n\nfunction layerDefaults(layer: TiledLayer) {\n  return {\n    id: layer.id,\n    name: layer.name,\n    opacity: layer.opacity,\n    visible: layer.visible,\n    offsetx: layer.offsetx ?? 0,\n    offsety: layer.offsety ?? 0,\n    parallaxx: layer.parallaxx ?? 1,\n    parallaxy: layer.parallaxy ?? 1,\n    tintcolor: layer.tintcolor,\n    properties: layer.properties ?? []\n  }\n}\n\n// ─── Template merging ────────────────────────────────────────────────────────\n\nfunction mergeTemplate(\n  obj: TiledObject,\n  template: TiledObjectTemplate,\n  tilesets: ResolvedTileset[]\n): TiledObject {\n  // Start from the template's object, then override with the instance's\n  // own fields (only the ones explicitly set — Tiled stores only deltas).\n  const base: TiledObject = {\n    ...template.object,\n    id: obj.id,\n    // Non-optional fields on the instance always win when present in TiledObject.\n    x: obj.x,\n    y: obj.y,\n    rotation: obj.rotation,\n    visible: obj.visible\n  }\n\n  // name / type are strings on TiledObject with no explicit \"unset\" sentinel.\n  // Prefer the instance only when it provided a non-empty value.\n  if (obj.name) base.name = obj.name\n  if (obj.type) base.type = obj.type\n  if (obj.width) base.width = obj.width\n  if (obj.height) base.height = obj.height\n  if (obj.properties) base.properties = obj.properties\n  if (obj.text) base.text = obj.text\n  if (obj.gid !== undefined) base.gid = obj.gid\n  if (obj.polygon) base.polygon = obj.polygon\n  if (obj.polyline) base.polyline = obj.polyline\n  if (obj.ellipse) base.ellipse = obj.ellipse\n  if (obj.point) base.point = obj.point\n\n  // GID remapping: the template's gid is relative to the template's own\n  // embedded tileset firstgid. If the template carried a tileset ref and\n  // the map has the same tileset (matched by source), translate the gid\n  // into the map's firstgid space so it points at the right tile.\n  if (\n    base.gid !== undefined &&\n    template.tileset &&\n    'source' in template.tileset &&\n    template.tileset.source\n  ) {\n    const src = template.tileset.source\n    const mapTs = tilesets.find((t) => t.source === src)\n    if (mapTs) {\n      const templateFirstGid = template.tileset.firstgid ?? 1\n      // Preserve flip flags in the high bits.\n      const flipBits = base.gid & ~GID_MASK\n      const localId = (base.gid & GID_MASK) - templateFirstGid\n      if (localId >= 0) {\n        base.gid = (mapTs.firstgid + localId) | flipBits\n      }\n    }\n  }\n\n  return base\n}\n\nfunction resolveObjects(\n  objects: TiledObject[],\n  tilesets: ResolvedTileset[],\n  templates?: Map<string, TiledObjectTemplate>\n): TiledObject[] {\n  if (!templates || templates.size === 0) return objects\n  return objects.map((obj) => {\n    if (!obj.template) return obj\n    const tpl = templates.get(obj.template)\n    if (!tpl) return obj\n    return mergeTemplate(obj, tpl, tilesets)\n  })\n}\n\n// ─── Shared non-tilelayer resolution (sync — no data decoding needed) ───────\n\nfunction resolveImageLayer(layer: TiledLayer): ResolvedImageLayer {\n  return {\n    type: 'imagelayer',\n    ...layerDefaults(layer),\n    image: layer.image ?? '',\n    imagewidth: layer.imagewidth,\n    imageheight: layer.imageheight,\n    repeatx: layer.repeatx ?? false,\n    repeaty: layer.repeaty ?? false,\n    transparentcolor: layer.transparentcolor\n  }\n}\n\nfunction resolveObjectLayer(\n  layer: TiledLayer,\n  tilesets: ResolvedTileset[],\n  templates?: Map<string, TiledObjectTemplate>\n): ResolvedObjectLayer {\n  return {\n    type: 'objectgroup',\n    ...layerDefaults(layer),\n    draworder: (layer.draworder ?? 'topdown') as TiledDrawOrder,\n    objects: resolveObjects(layer.objects ?? [], tilesets, templates)\n  }\n}\n\nfunction resolveTileLayerBase(layer: TiledLayer) {\n  return {\n    type: 'tilelayer' as const,\n    ...layerDefaults(layer),\n    width: layer.width ?? 0,\n    height: layer.height ?? 0\n  }\n}\n\n// ─── Resolve layers (sync) ──────────────────────────────────────────────────\n\nfunction resolveLayer(\n  layer: TiledLayer,\n  tilesets: ResolvedTileset[],\n  templates?: Map<string, TiledObjectTemplate>\n): ResolvedLayer {\n  switch (layer.type) {\n    case 'tilelayer': {\n      if (layer.chunks && layer.chunks.length > 0) {\n        const resolvedChunks = resolveChunksSync(\n          layer.chunks,\n          layer.encoding,\n          layer.compression,\n          tilesets\n        )\n        return {\n          ...resolveTileLayerBase(layer),\n          infinite: true,\n          tiles: [],\n          chunks: resolvedChunks\n        } satisfies ResolvedTileLayer\n      }\n\n      const rawGids = decodeLayerData(layer.data ?? [], layer.encoding, layer.compression)\n      return {\n        ...resolveTileLayerBase(layer),\n        infinite: false,\n        tiles: resolveGids(rawGids, tilesets)\n      } satisfies ResolvedTileLayer\n    }\n\n    case 'imagelayer':\n      return resolveImageLayer(layer)\n\n    case 'objectgroup':\n      return resolveObjectLayer(layer, tilesets, templates)\n\n    case 'group':\n      return {\n        type: 'group',\n        ...layerDefaults(layer),\n        layers: (layer.layers ?? []).map((l) => resolveLayer(l, tilesets, templates))\n      } satisfies ResolvedGroupLayer\n  }\n}\n\n// ─── Resolve layers (async — needed for compressed data) ─────────────────────\n\nasync function resolveLayerAsync(\n  layer: TiledLayer,\n  tilesets: ResolvedTileset[],\n  templates?: Map<string, TiledObjectTemplate>\n): Promise<ResolvedLayer> {\n  switch (layer.type) {\n    case 'tilelayer': {\n      if (layer.chunks && layer.chunks.length > 0) {\n        const resolvedChunks = await resolveChunksAsync(\n          layer.chunks,\n          layer.encoding,\n          layer.compression,\n          tilesets\n        )\n        return {\n          ...resolveTileLayerBase(layer),\n          infinite: true,\n          tiles: [],\n          chunks: resolvedChunks\n        } satisfies ResolvedTileLayer\n      }\n\n      const rawGids = await decodeLayerDataAsync(\n        layer.data ?? [],\n        layer.encoding,\n        layer.compression\n      )\n      return {\n        ...resolveTileLayerBase(layer),\n        infinite: false,\n        tiles: resolveGids(rawGids, tilesets)\n      } satisfies ResolvedTileLayer\n    }\n\n    case 'imagelayer':\n      return resolveImageLayer(layer)\n\n    case 'objectgroup':\n      return resolveObjectLayer(layer, tilesets, templates)\n\n    case 'group': {\n      const resolvedChildren = await Promise.all(\n        (layer.layers ?? []).map((l) => resolveLayerAsync(l, tilesets, templates))\n      )\n      return {\n        type: 'group',\n        ...layerDefaults(layer),\n        layers: resolvedChildren\n      } satisfies ResolvedGroupLayer\n    }\n  }\n}\n\n// ─── Public API ──────────────────────────────────────────────────────────────\n\nexport function parseMap(data: TiledMap, options?: ParseOptions): ResolvedMap {\n  const resolvedTilesets = resolveTilesets(data.tilesets, options)\n  const layers = data.layers.map((l) => resolveLayer(l, resolvedTilesets, options?.templates))\n\n  return buildResolvedMap(data, resolvedTilesets, layers)\n}\n\nexport async function parseMapAsync(data: TiledMap, options?: ParseOptions): Promise<ResolvedMap> {\n  const resolvedTilesets = resolveTilesets(data.tilesets, options)\n  const layers = await Promise.all(\n    data.layers.map((l) => resolveLayerAsync(l, resolvedTilesets, options?.templates))\n  )\n\n  return buildResolvedMap(data, resolvedTilesets, layers)\n}\n\n// ─── Chunk resolution ────────────────────────────────────────────────────────\n\nfunction resolveChunksSync(\n  chunks: TiledChunk[],\n  encoding: TiledLayer['encoding'],\n  compression: TiledLayer['compression'],\n  tilesets: ResolvedTileset[]\n): ResolvedChunk[] {\n  return chunks.map((chunk) => {\n    const rawGids = decodeLayerData(chunk.data, encoding, compression)\n    return {\n      x: chunk.x,\n      y: chunk.y,\n      width: chunk.width,\n      height: chunk.height,\n      tiles: resolveGids(rawGids, tilesets)\n    }\n  })\n}\n\nasync function resolveChunksAsync(\n  chunks: TiledChunk[],\n  encoding: TiledLayer['encoding'],\n  compression: TiledLayer['compression'],\n  tilesets: ResolvedTileset[]\n): Promise<ResolvedChunk[]> {\n  return Promise.all(\n    chunks.map(async (chunk) => {\n      const rawGids = await decodeLayerDataAsync(chunk.data, encoding, compression)\n      return {\n        x: chunk.x,\n        y: chunk.y,\n        width: chunk.width,\n        height: chunk.height,\n        tiles: resolveGids(rawGids, tilesets)\n      }\n    })\n  )\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction resolveTilesets(\n  raw: (TiledTileset | TiledTilesetRef)[],\n  options?: ParseOptions\n): ResolvedTileset[] {\n  return raw.map((ts) => {\n    if (isTilesetRef(ts)) {\n      const external = options?.externalTilesets?.get(ts.source)\n      if (!external) {\n        throw new Error(\n          `External tileset \"${ts.source}\" not provided. Pass it via options.externalTilesets.`\n        )\n      }\n      return resolveTileset({ ...external, firstgid: ts.firstgid }, ts.source)\n    }\n    return resolveTileset(ts)\n  })\n}\n\nfunction buildResolvedMap(\n  data: TiledMap,\n  tilesets: ResolvedTileset[],\n  layers: ResolvedLayer[]\n): ResolvedMap {\n  return {\n    orientation: data.orientation,\n    renderorder: (data.renderorder ?? 'right-down') as TiledRenderOrder,\n    width: data.width,\n    height: data.height,\n    tilewidth: data.tilewidth,\n    tileheight: data.tileheight,\n    infinite: data.infinite,\n    backgroundcolor: data.backgroundcolor,\n    hexsidelength: data.hexsidelength,\n    staggeraxis: data.staggeraxis,\n    staggerindex: data.staggerindex,\n    parallaxoriginx: data.parallaxoriginx ?? 0,\n    parallaxoriginy: data.parallaxoriginy ?? 0,\n    properties: data.properties ?? [],\n    tilesets,\n    layers,\n    version: data.version,\n    tiledversion: data.tiledversion\n  }\n}\n","export function parseTintColor(hex: string): number {\n  const clean = hex.replace('#', '')\n  // #AARRGGBB → strip alpha, use RRGGBB\n  if (clean.length === 8) {\n    return parseInt(clean.slice(2), 16)\n  }\n  // #RRGGBB\n  return parseInt(clean, 16)\n}\n","import { Container, type Texture } from 'pixi.js'\nimport type { GifSource } from 'pixi.js/gif'\nimport type { MapContext, ResolvedGroupLayer } from '../types'\nimport { createLayerRenderer } from './createLayerRenderer.js'\nimport { parseTintColor } from './parseColor.js'\nimport type { TileSetRenderer } from './TileSetRenderer.js'\n\nexport class GroupLayerRenderer extends Container {\n  readonly layerData: ResolvedGroupLayer\n  readonly layerBaseOffsetX: number\n  readonly layerBaseOffsetY: number\n  readonly layerParallaxX: number\n  readonly layerParallaxY: number\n\n  constructor(\n    layerData: ResolvedGroupLayer,\n    tilesets: TileSetRenderer[],\n    ctx: MapContext,\n    imageTextures: Map<string, Texture>,\n    imageGifSources?: Map<string, GifSource>\n  ) {\n    super()\n\n    this.layerData = layerData\n    this.label = layerData.name\n    this.alpha = layerData.opacity\n    this.visible = layerData.visible\n    this.layerBaseOffsetX = layerData.offsetx\n    this.layerBaseOffsetY = layerData.offsety\n    this.layerParallaxX = layerData.parallaxx\n    this.layerParallaxY = layerData.parallaxy\n    this.position.set(layerData.offsetx, layerData.offsety)\n    if (layerData.tintcolor) {\n      this.tint = parseTintColor(layerData.tintcolor)\n    }\n\n    for (const child of layerData.layers) {\n      const renderer = createLayerRenderer(child, tilesets, ctx, imageTextures, imageGifSources)\n      if (renderer) this.addChild(renderer)\n    }\n  }\n}\n","import { Container, Sprite, type Texture, TilingSprite } from 'pixi.js'\nimport { type GifSource, GifSprite } from 'pixi.js/gif'\nimport type { MapContext, ResolvedImageLayer } from '../types'\nimport { parseTintColor } from './parseColor.js'\n\nexport class ImageLayerRenderer extends Container {\n  readonly layerData: ResolvedImageLayer\n  readonly layerBaseOffsetX: number\n  readonly layerBaseOffsetY: number\n  readonly layerParallaxX: number\n  readonly layerParallaxY: number\n\n  constructor(\n    layerData: ResolvedImageLayer,\n    texture: Texture | null,\n    ctx?: MapContext,\n    gifSource?: GifSource | null\n  ) {\n    super()\n\n    this.layerData = layerData\n    this.label = layerData.name\n    this.alpha = layerData.opacity\n    this.visible = layerData.visible\n    this.layerBaseOffsetX = layerData.offsetx\n    this.layerBaseOffsetY = layerData.offsety\n    this.layerParallaxX = layerData.parallaxx\n    this.layerParallaxY = layerData.parallaxy\n    this.position.set(layerData.offsetx, layerData.offsety)\n    if (layerData.tintcolor) {\n      this.tint = parseTintColor(layerData.tintcolor)\n    }\n\n    if (texture) {\n      this._buildImage(texture, ctx, gifSource ?? null)\n    }\n  }\n\n  private _buildImage(texture: Texture, ctx?: MapContext, gifSource?: GifSource | null): void {\n    const { repeatx, repeaty } = this.layerData\n\n    if (!repeatx && !repeaty) {\n      if (gifSource) {\n        this.addChild(new GifSprite({ source: gifSource }))\n      } else {\n        this.addChild(new Sprite(texture))\n      }\n      return\n    }\n\n    // Repeating layers use TilingSprite which requires a static texture.\n    // Animated GIFs fall back to the first frame for tiling.\n    const spanW = ctx?.mapPixelWidth && ctx.mapPixelWidth > 0 ? ctx.mapPixelWidth : texture.width\n    const spanH =\n      ctx?.mapPixelHeight && ctx.mapPixelHeight > 0 ? ctx.mapPixelHeight : texture.height\n\n    this.addChild(\n      new TilingSprite({\n        texture,\n        width: repeatx ? spanW : texture.width,\n        height: repeaty ? spanH : texture.height\n      })\n    )\n  }\n}\n","import { Container, Graphics, Sprite, Text } from 'pixi.js'\nimport { GifSprite } from 'pixi.js/gif'\nimport { decodeGid } from '../parser'\nimport { findTilesetForGid } from '../parser/tilesetHelpers.js'\nimport type { ResolvedObjectLayer, TiledObject, TiledPoint, TiledText } from '../types'\nimport { parseTintColor } from './parseColor.js'\nimport type { TileSetRenderer } from './TileSetRenderer.js'\n\nexport class ObjectLayerRenderer extends Container {\n  readonly layerData: ResolvedObjectLayer\n  readonly layerBaseOffsetX: number\n  readonly layerBaseOffsetY: number\n  readonly layerParallaxX: number\n  readonly layerParallaxY: number\n\n  constructor(layerData: ResolvedObjectLayer, tilesets: TileSetRenderer[]) {\n    super()\n\n    this.layerData = layerData\n    this.label = layerData.name\n    this.alpha = layerData.opacity\n    this.visible = layerData.visible\n    this.layerBaseOffsetX = layerData.offsetx\n    this.layerBaseOffsetY = layerData.offsety\n    this.layerParallaxX = layerData.parallaxx\n    this.layerParallaxY = layerData.parallaxy\n    this.position.set(layerData.offsetx, layerData.offsety)\n    if (layerData.tintcolor) {\n      this.tint = parseTintColor(layerData.tintcolor)\n    }\n\n    this._buildObjects(tilesets)\n  }\n\n  private _buildObjects(tilesets: TileSetRenderer[]): void {\n    for (const obj of this.layerData.objects) {\n      const child = this._createObject(obj, tilesets)\n      if (child) {\n        child.label = obj.name || `object_${obj.id}`\n        this.addChild(child)\n      }\n    }\n  }\n\n  private _createObject(obj: TiledObject, tilesets: TileSetRenderer[]): Container | null {\n    // Tile object (has gid)\n    if (obj.gid !== undefined) {\n      return this._createTileObject(obj, tilesets)\n    }\n\n    // Text object\n    if (obj.text) {\n      return this._createTextObject(obj)\n    }\n\n    // Shape objects\n    if (obj.ellipse) {\n      return this._createEllipse(obj)\n    }\n\n    if (obj.point) {\n      return this._createPoint(obj)\n    }\n\n    if (obj.polygon) {\n      return this._createPolygon(obj, obj.polygon, true)\n    }\n\n    if (obj.polyline) {\n      return this._createPolygon(obj, obj.polyline, false)\n    }\n\n    // Rectangle (default)\n    if (obj.width > 0 && obj.height > 0) {\n      return this._createRectangle(obj)\n    }\n\n    return null\n  }\n\n  private _createTileObject(obj: TiledObject, tilesets: TileSetRenderer[]): Sprite | null {\n    if (obj.gid === undefined) return null\n\n    const decoded = decodeGid(obj.gid)\n    if (!decoded) return null\n\n    const ts = findTilesetForGid(decoded.gid, tilesets, (r) => r.tileset.firstgid)\n    if (!ts) return null\n\n    const localId = decoded.gid - ts.tileset.firstgid\n    const texture = ts.getTexture(localId)\n    if (!texture) return null\n\n    const gifSource = ts.getGifSource(localId)\n    const sprite = gifSource ? new GifSprite({ source: gifSource }) : new Sprite(texture)\n    const offset = ts.tileset.tileoffset\n    // Tile objects are positioned by their bottom-left corner in Tiled,\n    // then the tileset tileoffset is applied on top. If obj.width/height\n    // are set, the tile is resized (fillmode applies to aspect-fit).\n    const sized = this._fitTileSize(ts, localId, obj.width, obj.height)\n    sprite.width = sized.width\n    sprite.height = sized.height\n    sprite.position.set(obj.x + offset.x, obj.y - sized.height + offset.y)\n    sprite.angle = obj.rotation\n    sprite.visible = obj.visible\n\n    if (decoded.horizontalFlip) {\n      sprite.scale.x *= -1\n      sprite.anchor.x = 1\n    }\n    if (decoded.verticalFlip) {\n      sprite.scale.y *= -1\n      sprite.anchor.y = 1\n    }\n\n    return sprite\n  }\n\n  private _fitTileSize(\n    ts: TileSetRenderer,\n    localId: number,\n    objWidth: number,\n    objHeight: number\n  ): { width: number; height: number } {\n    if (objWidth <= 0 || objHeight <= 0) {\n      return ts.getTileSize(localId)\n    }\n    if (ts.tileset.fillmode !== 'preserve-aspect-fit') {\n      return { width: objWidth, height: objHeight }\n    }\n    const intrinsic = ts.getTileSize(localId)\n    if (intrinsic.width === 0 || intrinsic.height === 0) {\n      return { width: objWidth, height: objHeight }\n    }\n    const scale = Math.min(objWidth / intrinsic.width, objHeight / intrinsic.height)\n    return { width: intrinsic.width * scale, height: intrinsic.height * scale }\n  }\n\n  private _createTextObject(obj: TiledObject): Container {\n    const td = obj.text as TiledText\n    const color = td.color ?? '#000000'\n    const text = new Text({\n      text: td.text,\n      style: {\n        fontFamily: td.fontfamily ?? 'sans-serif',\n        fontSize: td.pixelsize ?? 16,\n        fill: color,\n        fontWeight: td.bold ? 'bold' : 'normal',\n        fontStyle: td.italic ? 'italic' : 'normal',\n        wordWrap: td.wrap ?? false,\n        wordWrapWidth: obj.width,\n        align: td.halign ?? 'left'\n      }\n    })\n\n    // PixiJS Text has no built-in underline/strikeout — draw them manually.\n    // Wrap in a Container only when decorations are present so simple text\n    // stays a single Text node.\n    if (!td.underline && !td.strikeout) {\n      text.position.set(obj.x, obj.y)\n      text.angle = obj.rotation\n      text.visible = obj.visible\n      return text\n    }\n\n    const container = new Container()\n    container.addChild(text)\n\n    const metrics = text.getSize()\n    const lineThickness = Math.max(1, (td.pixelsize ?? 16) / 16)\n    if (td.underline) {\n      const ul = new Graphics()\n        .moveTo(0, metrics.height - lineThickness)\n        .lineTo(metrics.width, metrics.height - lineThickness)\n        .stroke({ color, width: lineThickness })\n      container.addChild(ul)\n    }\n    if (td.strikeout) {\n      const y = metrics.height / 2\n      const so = new Graphics()\n        .moveTo(0, y)\n        .lineTo(metrics.width, y)\n        .stroke({ color, width: lineThickness })\n      container.addChild(so)\n    }\n\n    container.position.set(obj.x, obj.y)\n    container.angle = obj.rotation\n    container.visible = obj.visible\n    return container\n  }\n\n  private _createRectangle(obj: TiledObject): Container {\n    const g = new Graphics().rect(0, 0, obj.width, obj.height).stroke({ color: 0xffffff, width: 1 })\n    g.position.set(obj.x, obj.y)\n    g.angle = obj.rotation\n    g.visible = obj.visible\n    return g\n  }\n\n  private _createEllipse(obj: TiledObject): Container {\n    const rx = obj.width / 2\n    const ry = obj.height / 2\n    const g = new Graphics().ellipse(rx, ry, rx, ry).stroke({ color: 0xffffff, width: 1 })\n    g.position.set(obj.x, obj.y)\n    g.angle = obj.rotation\n    g.visible = obj.visible\n    return g\n  }\n\n  private _createPoint(obj: TiledObject): Container {\n    const g = new Graphics().circle(0, 0, 3).fill(0xffffff)\n    g.position.set(obj.x, obj.y)\n    g.visible = obj.visible\n    return g\n  }\n\n  private _createPolygon(obj: TiledObject, points: TiledPoint[], closed: boolean): Container {\n    const g = new Graphics()\n\n    if (points.length > 0) {\n      const first = points[0]!\n      g.moveTo(first.x, first.y)\n      for (let i = 1; i < points.length; i++) {\n        const pt = points[i]!\n        g.lineTo(pt.x, pt.y)\n      }\n      if (closed) {\n        g.closePath()\n      }\n      g.stroke({ color: 0xffffff, width: 1 })\n    }\n\n    g.position.set(obj.x, obj.y)\n    g.angle = obj.rotation\n    g.visible = obj.visible\n    return g\n  }\n}\n","import type { MapContext, TilePosition } from '../types'\n\n// Reusable output object — avoids allocating a { x, y } per tile.\n// Safe because callers consume the values before the next call.\nconst _pos: TilePosition = { x: 0, y: 0 }\n\nexport function tileToPixel(col: number, row: number, ctx: MapContext): TilePosition {\n  switch (ctx.orientation) {\n    case 'orthogonal':\n      _pos.x = col * ctx.tilewidth\n      _pos.y = row * ctx.tileheight\n      return _pos\n    case 'isometric': {\n      const halfW = ctx.tilewidth / 2\n      const halfH = ctx.tileheight / 2\n      _pos.x = (col - row) * halfW\n      _pos.y = (col + row) * halfH\n      return _pos\n    }\n    case 'staggered':\n      return staggeredToPixel(col, row, ctx)\n    case 'hexagonal':\n      return hexagonalToPixel(col, row, ctx)\n  }\n}\n\n// ─── Staggered (isometric staggered) ─────────────────────────────────────────\n\nfunction staggeredToPixel(col: number, row: number, ctx: MapContext): TilePosition {\n  const staggerX = ctx.staggeraxis === 'x'\n  const staggerEven = ctx.staggerindex === 'even'\n\n  if (staggerX) {\n    const isStaggered = staggerEven ? col % 2 === 0 : col % 2 !== 0\n    _pos.x = col * (ctx.tilewidth / 2)\n    _pos.y = row * ctx.tileheight + (isStaggered ? ctx.tileheight / 2 : 0)\n  } else {\n    const isStaggered = staggerEven ? row % 2 === 0 : row % 2 !== 0\n    _pos.x = col * ctx.tilewidth + (isStaggered ? ctx.tilewidth / 2 : 0)\n    _pos.y = row * (ctx.tileheight / 2)\n  }\n  return _pos\n}\n\n// ─── Hexagonal ───────────────────────────────────────────────────────────────\n\nfunction hexagonalToPixel(col: number, row: number, ctx: MapContext): TilePosition {\n  const hexSide = ctx.hexsidelength ?? 0\n  const staggerX = ctx.staggeraxis === 'x'\n  const staggerEven = ctx.staggerindex === 'even'\n\n  if (staggerX) {\n    const colWidth = (ctx.tilewidth + hexSide) / 2\n    const isStaggered = staggerEven ? col % 2 === 0 : col % 2 !== 0\n    _pos.x = col * colWidth\n    _pos.y = row * ctx.tileheight + (isStaggered ? ctx.tileheight / 2 : 0)\n  } else {\n    const rowHeight = (ctx.tileheight + hexSide) / 2\n    const isStaggered = staggerEven ? row % 2 === 0 : row % 2 !== 0\n    _pos.x = col * ctx.tilewidth + (isStaggered ? ctx.tilewidth / 2 : 0)\n    _pos.y = row * rowHeight\n  }\n  return _pos\n}\n","import { AnimatedSprite, Container, Sprite, type Texture } from 'pixi.js'\nimport { GifSprite } from 'pixi.js/gif'\nimport type {\n  MapContext,\n  ResolvedChunk,\n  ResolvedTile,\n  ResolvedTileLayer,\n  TiledFrame\n} from '../types'\nimport { parseTintColor } from './parseColor.js'\nimport type { TileSetRenderer } from './TileSetRenderer.js'\nimport { tileToPixel } from './tilePlacement.js'\n\nexport class TileLayerRenderer extends Container {\n  readonly layerData: ResolvedTileLayer\n  readonly layerBaseOffsetX: number\n  readonly layerBaseOffsetY: number\n  readonly layerParallaxX: number\n  readonly layerParallaxY: number\n\n  constructor(layerData: ResolvedTileLayer, tilesets: TileSetRenderer[], ctx: MapContext) {\n    super()\n\n    this.layerData = layerData\n    this.label = layerData.name\n    this.alpha = layerData.opacity\n    this.visible = layerData.visible\n    this.layerBaseOffsetX = layerData.offsetx\n    this.layerBaseOffsetY = layerData.offsety\n    this.layerParallaxX = layerData.parallaxx\n    this.layerParallaxY = layerData.parallaxy\n    this.position.set(layerData.offsetx, layerData.offsety)\n    if (layerData.tintcolor) {\n      this.tint = parseTintColor(layerData.tintcolor)\n    }\n\n    if (layerData.infinite && layerData.chunks) {\n      this._buildChunks(layerData.chunks, tilesets, ctx)\n    } else {\n      this._buildTiles(\n        layerData.tiles,\n        layerData.width,\n        Math.floor(layerData.tiles.length / (layerData.width || 1)),\n        0,\n        0,\n        tilesets,\n        ctx\n      )\n    }\n  }\n\n  private _buildChunks(\n    chunks: ResolvedChunk[],\n    tilesets: TileSetRenderer[],\n    ctx: MapContext\n  ): void {\n    for (const chunk of chunks) {\n      this._buildTiles(chunk.tiles, chunk.width, chunk.height, chunk.x, chunk.y, tilesets, ctx)\n    }\n  }\n\n  private _buildTiles(\n    tiles: (ResolvedTile | null)[],\n    layerWidth: number,\n    layerHeight: number,\n    originCol: number,\n    originRow: number,\n    tilesets: TileSetRenderer[],\n    ctx: MapContext\n  ): void {\n    const order = ctx.renderorder\n    const rightToLeft = order === 'left-down' || order === 'left-up'\n    const bottomToTop = order === 'right-up' || order === 'left-up'\n\n    const rowStart = bottomToTop ? layerHeight - 1 : 0\n    const rowEnd = bottomToTop ? -1 : layerHeight\n    const rowStep = bottomToTop ? -1 : 1\n\n    const colStart = rightToLeft ? layerWidth - 1 : 0\n    const colEnd = rightToLeft ? -1 : layerWidth\n    const colStep = rightToLeft ? -1 : 1\n\n    const tileH = ctx.tileheight\n\n    for (let row = rowStart; row !== rowEnd; row += rowStep) {\n      const rowOffset = row * layerWidth\n      for (let col = colStart; col !== colEnd; col += colStep) {\n        const tile = tiles[rowOffset + col]\n        if (!tile) continue\n\n        const tsRenderer = tilesets[tile.tilesetIndex]\n        if (!tsRenderer) continue\n\n        const pos = tileToPixel(originCol + col, originRow + row, ctx)\n        // Read x/y immediately — pos is a reusable object overwritten on next call.\n        const px = pos.x\n        const py = pos.y\n        const animFrames = tsRenderer.getAnimationFrames(tile.localId)\n\n        const offset = tsRenderer.tileset.tileoffset\n\n        if (animFrames && animFrames.length > 1) {\n          const sprite = this._createAnimatedTile(tsRenderer, animFrames, tile, px, py, ctx)\n          if (sprite) {\n            sprite.position.x += offset.x\n            sprite.position.y += offset.y\n            this.addChild(sprite)\n          }\n        } else {\n          const texture = tsRenderer.getTexture(tile.localId)\n          if (!texture) continue\n\n          const gifSource = tsRenderer.getGifSource(tile.localId)\n          const renderW = tsRenderer.getRenderWidth(tile.localId, ctx)\n          const renderH = tsRenderer.getRenderHeight(tile.localId, ctx)\n\n          let sprite: Sprite\n          if (gifSource) {\n            sprite = new GifSprite({ source: gifSource })\n          } else {\n            sprite = new Sprite(texture)\n          }\n          sprite.width = renderW\n          sprite.height = renderH\n          sprite.position.set(px + offset.x, py + offset.y + tileH - renderH)\n          applyFlip(sprite, tile, renderW)\n          this.addChild(sprite)\n        }\n      }\n    }\n  }\n\n  private _createAnimatedTile(\n    tsRenderer: TileSetRenderer,\n    frames: TiledFrame[],\n    tile: ResolvedTile,\n    x: number,\n    y: number,\n    ctx: MapContext\n  ): AnimatedSprite | null {\n    const textures: { texture: Texture; time: number }[] = []\n\n    for (const frame of frames) {\n      const tex = tsRenderer.getTexture(frame.tileid)\n      if (!tex) return null\n      textures.push({ texture: tex, time: frame.duration })\n    }\n\n    const sprite = new AnimatedSprite(textures)\n    const renderW = tsRenderer.getRenderWidth(tile.localId, ctx)\n    const renderH = tsRenderer.getRenderHeight(tile.localId, ctx)\n    sprite.width = renderW\n    sprite.height = renderH\n    sprite.position.set(x, y + ctx.tileheight - renderH)\n    sprite.play()\n    applyFlip(sprite, tile, renderW)\n    return sprite\n  }\n}\n\nfunction applyFlip(sprite: Sprite, tile: ResolvedTile, tileWidth: number): void {\n  if (tile.diagonalFlip) {\n    sprite.rotation = Math.PI / 2\n    sprite.scale.x = tile.horizontalFlip ? -1 : 1\n    sprite.scale.y = tile.verticalFlip ? -1 : 1\n    sprite.anchor.set(0, 1)\n    sprite.position.x += tileWidth\n  } else {\n    if (tile.horizontalFlip) {\n      sprite.scale.x = -1\n      sprite.anchor.x = 1\n    }\n    if (tile.verticalFlip) {\n      sprite.scale.y = -1\n      sprite.anchor.y = 1\n    }\n  }\n}\n","import type { Container, Texture } from 'pixi.js'\nimport type { GifSource } from 'pixi.js/gif'\nimport type { MapContext, ResolvedLayer } from '../types'\nimport { GroupLayerRenderer } from './GroupLayerRenderer.js'\nimport { ImageLayerRenderer } from './ImageLayerRenderer.js'\nimport { ObjectLayerRenderer } from './ObjectLayerRenderer.js'\nimport { TileLayerRenderer } from './TileLayerRenderer.js'\nimport type { TileSetRenderer } from './TileSetRenderer.js'\n\nexport function createLayerRenderer(\n  layer: ResolvedLayer,\n  tilesets: TileSetRenderer[],\n  ctx: MapContext,\n  imageTextures: Map<string, Texture>,\n  imageGifSources?: Map<string, GifSource>\n): Container | null {\n  switch (layer.type) {\n    case 'tilelayer':\n      return new TileLayerRenderer(layer, tilesets, ctx)\n\n    case 'imagelayer': {\n      const tex = layer.image ? (imageTextures.get(layer.image) ?? null) : null\n      const gifSource = layer.image ? (imageGifSources?.get(layer.image) ?? null) : null\n      return new ImageLayerRenderer(layer, tex, ctx, gifSource)\n    }\n\n    case 'objectgroup':\n      return new ObjectLayerRenderer(layer, tilesets)\n\n    case 'group':\n      return new GroupLayerRenderer(layer, tilesets, ctx, imageTextures, imageGifSources)\n  }\n}\n","import type { ResolvedMap } from '../types'\n\nexport function computeMapPixelSize(mapData: ResolvedMap): { width: number; height: number } {\n  const { orientation, width, height, tilewidth, tileheight, staggeraxis } = mapData\n\n  switch (orientation) {\n    case 'isometric':\n      return {\n        width: (width + height) * (tilewidth / 2),\n        height: (width + height) * (tileheight / 2)\n      }\n    case 'staggered':\n    case 'hexagonal':\n      return staggeraxis === 'x'\n        ? {\n            width: (width + 1) * (tilewidth / 2),\n            height: height * tileheight + tileheight / 2\n          }\n        : {\n            width: width * tilewidth + tilewidth / 2,\n            height: (height + 1) * (tileheight / 2)\n          }\n    default:\n      return { width: width * tilewidth, height: height * tileheight }\n  }\n}\n","import { Rectangle, Texture } from 'pixi.js'\nimport type { GifSource } from 'pixi.js/gif'\nimport type { MapContext, ResolvedTileset, TiledTileDefinition } from '../types'\n\nexport class TileSetRenderer {\n  readonly tileset: ResolvedTileset\n  readonly baseTexture: Texture | null\n  private readonly _ownedTextures = new Map<number, Texture>()\n  private readonly _externalTextures = new Map<number, Texture>()\n  private readonly _gifSources = new Map<number, GifSource>()\n  // Per-localId cached render dimensions (keyed by localId, value = width | height<<32\n  // is not feasible for floats, so we use two parallel maps).\n  private _renderWidthCache: Map<number, number> | null = null\n  private _renderHeightCache: Map<number, number> | null = null\n  private _cachedCtxTileWidth = 0\n  private _cachedCtxTileHeight = 0\n\n  constructor(tileset: ResolvedTileset, baseTexture: Texture | null) {\n    this.tileset = tileset\n    this.baseTexture = baseTexture\n  }\n\n  getTexture(localId: number): Texture | null {\n    const external = this._externalTextures.get(localId)\n    if (external) return external\n\n    const owned = this._ownedTextures.get(localId)\n    if (owned) return owned\n\n    const tileDef = this.tileset.tiles.get(localId)\n\n    // Image-collection tile with no externally supplied texture yet.\n    if (tileDef?.image) return null\n\n    // Single-image tileset: cut sub-rectangle from baseTexture\n    if (!this.baseTexture) return null\n\n    const { tilewidth, tileheight, columns, margin, spacing } = this.tileset\n    if (columns <= 0) return null\n\n    const col = localId % columns\n    const row = Math.floor(localId / columns)\n    const x = margin + col * (tilewidth + spacing)\n    const y = margin + row * (tileheight + spacing)\n\n    const frame = new Rectangle(x, y, tilewidth, tileheight)\n    const texture = new Texture({ source: this.baseTexture.source, frame })\n\n    this._ownedTextures.set(localId, texture)\n    return texture\n  }\n\n  setTileTexture(localId: number, texture: Texture): void {\n    this._externalTextures.set(localId, texture)\n  }\n\n  setGifSource(localId: number, source: GifSource): void {\n    this._gifSources.set(localId, source)\n  }\n\n  getGifSource(localId: number): GifSource | null {\n    return this._gifSources.get(localId) ?? null\n  }\n\n  getAnimationFrames(localId: number): TiledTileDefinition['animation'] | undefined {\n    return this.tileset.tiles.get(localId)?.animation\n  }\n\n  /**\n   * Returns the intrinsic pixel size of a tile based on tileset metadata.\n   * For image-collection tilesets, each tile has its own image dimensions.\n   * For regular tilesets, all tiles share the tileset's tilewidth/tileheight.\n   */\n  getTileSize(localId: number): { width: number; height: number } {\n    const tileDef = this.tileset.tiles.get(localId)\n    if (tileDef?.image) {\n      return {\n        width: tileDef.imagewidth ?? this.tileset.tilewidth,\n        height: tileDef.imageheight ?? this.tileset.tileheight\n      }\n    }\n    return { width: this.tileset.tilewidth, height: this.tileset.tileheight }\n  }\n\n  /**\n   * Returns the pixel size a tile should be drawn at on the map grid.\n   * Allocates a new object — prefer `getRenderWidth`/`getRenderHeight`\n   * in hot loops to avoid GC pressure.\n   */\n  getRenderSize(localId: number, ctx: MapContext): { width: number; height: number } {\n    return {\n      width: this.getRenderWidth(localId, ctx),\n      height: this.getRenderHeight(localId, ctx)\n    }\n  }\n\n  /**\n   * Returns the rendered width of a tile (scalar, no allocation).\n   * Results are cached per localId for the lifetime of a single map context.\n   */\n  getRenderWidth(localId: number, ctx: MapContext): number {\n    this._ensureRenderCache(ctx)\n    const cached = this._renderWidthCache!.get(localId)\n    if (cached !== undefined) return cached\n    const size = this._computeRenderSize(localId, ctx)\n    this._renderWidthCache!.set(localId, size.width)\n    this._renderHeightCache!.set(localId, size.height)\n    return size.width\n  }\n\n  /**\n   * Returns the rendered height of a tile (scalar, no allocation).\n   */\n  getRenderHeight(localId: number, ctx: MapContext): number {\n    this._ensureRenderCache(ctx)\n    const cached = this._renderHeightCache!.get(localId)\n    if (cached !== undefined) return cached\n    const size = this._computeRenderSize(localId, ctx)\n    this._renderWidthCache!.set(localId, size.width)\n    this._renderHeightCache!.set(localId, size.height)\n    return size.height\n  }\n\n  private _ensureRenderCache(ctx: MapContext): void {\n    if (\n      this._renderWidthCache &&\n      this._cachedCtxTileWidth === ctx.tilewidth &&\n      this._cachedCtxTileHeight === ctx.tileheight\n    ) {\n      return\n    }\n    this._renderWidthCache = new Map()\n    this._renderHeightCache = new Map()\n    this._cachedCtxTileWidth = ctx.tilewidth\n    this._cachedCtxTileHeight = ctx.tileheight\n  }\n\n  private _computeRenderSize(localId: number, ctx: MapContext): { width: number; height: number } {\n    const intrinsic = this.getTileSize(localId)\n    if (this.tileset.tilerendersize !== 'grid') return intrinsic\n\n    const gridW = ctx.tilewidth\n    const gridH = ctx.tileheight\n\n    if (this.tileset.fillmode === 'preserve-aspect-fit') {\n      if (intrinsic.width === 0 || intrinsic.height === 0) {\n        return { width: gridW, height: gridH }\n      }\n      const scale = Math.min(gridW / intrinsic.width, gridH / intrinsic.height)\n      return { width: intrinsic.width * scale, height: intrinsic.height * scale }\n    }\n\n    return { width: gridW, height: gridH }\n  }\n\n  destroy(): void {\n    for (const tex of this._ownedTextures.values()) {\n      tex.destroy()\n    }\n    this._ownedTextures.clear()\n    this._externalTextures.clear()\n    this._gifSources.clear()\n    this._renderWidthCache = null\n    this._renderHeightCache = null\n  }\n}\n","import { Container, Graphics, Rectangle } from 'pixi.js'\nimport type { GifSource } from 'pixi.js/gif'\nimport type { MapContext, ResolvedMap, TiledMapOptions } from '../types'\nimport { createLayerRenderer } from './createLayerRenderer.js'\nimport { GroupLayerRenderer } from './GroupLayerRenderer.js'\nimport { ImageLayerRenderer } from './ImageLayerRenderer.js'\nimport { computeMapPixelSize } from './mapSize.js'\nimport { ObjectLayerRenderer } from './ObjectLayerRenderer.js'\nimport { parseTintColor } from './parseColor.js'\nimport { TileLayerRenderer } from './TileLayerRenderer.js'\nimport { TileSetRenderer } from './TileSetRenderer.js'\n\ntype ParallaxLayer =\n  | TileLayerRenderer\n  | ImageLayerRenderer\n  | ObjectLayerRenderer\n  | GroupLayerRenderer\n\nfunction isParallaxLayer(c: Container): c is ParallaxLayer {\n  return (\n    c instanceof TileLayerRenderer ||\n    c instanceof ImageLayerRenderer ||\n    c instanceof ObjectLayerRenderer ||\n    c instanceof GroupLayerRenderer\n  )\n}\n\nexport class TiledMap extends Container {\n  readonly mapData: ResolvedMap\n  readonly tileSetRenderers: TileSetRenderer[]\n\n  private _background: Graphics | null = null\n\n  constructor(mapData: ResolvedMap, options?: TiledMapOptions) {\n    super()\n\n    this.mapData = mapData\n    this.label = 'TiledMap'\n\n    const pixelSize = computeMapPixelSize(mapData)\n\n    // Force local bounds to the logical map size. Without this, pixi's\n    // .width/.height setters (and getLocalBounds) would use the extent of\n    // the rendered children — which misbehaves when the map has empty\n    // top/left rows (bounds.minY > 0, causing content to overflow the\n    // canvas when scaling via `.height = ...`) or when tall decoration\n    // tiles extend beyond the grid.\n    this.boundsArea = new Rectangle(0, 0, pixelSize.width, pixelSize.height)\n\n    // Build tileset renderers\n    const tilesetTextures = options?.tilesetTextures ?? new Map()\n    const imageLayerTextures = options?.imageLayerTextures ?? new Map()\n    const tileImageTextures = options?.tileImageTextures ?? new Map()\n    const tileImageGifSources = options?.tileImageGifSources ?? new Map<string, GifSource>()\n    const imageLayerGifSources = options?.imageLayerGifSources ?? new Map<string, GifSource>()\n\n    this.tileSetRenderers = mapData.tilesets.map((ts) => {\n      const baseTex = ts.image ? (tilesetTextures.get(ts.image) ?? null) : null\n      const renderer = new TileSetRenderer(ts, baseTex)\n\n      // Supply individual tile images for image-collection tilesets\n      for (const [localId, tileDef] of ts.tiles) {\n        if (tileDef.image) {\n          const tex = tileImageTextures.get(tileDef.image)\n          if (tex) renderer.setTileTexture(localId, tex)\n          const gifSource = tileImageGifSources.get(tileDef.image)\n          if (gifSource) renderer.setGifSource(localId, gifSource)\n        }\n      }\n\n      return renderer\n    })\n\n    // Build map context for orientation-aware tile placement\n    const ctx: MapContext = {\n      orientation: mapData.orientation,\n      renderorder: mapData.renderorder,\n      tilewidth: mapData.tilewidth,\n      tileheight: mapData.tileheight,\n      hexsidelength: mapData.hexsidelength,\n      staggeraxis: mapData.staggeraxis,\n      staggerindex: mapData.staggerindex,\n      mapPixelWidth: pixelSize.width,\n      mapPixelHeight: pixelSize.height\n    }\n\n    // Render background\n    if (mapData.backgroundcolor) {\n      this._buildBackground(pixelSize.width, pixelSize.height, mapData.backgroundcolor)\n    }\n\n    // Render layers\n    for (const layer of mapData.layers) {\n      const child = createLayerRenderer(\n        layer,\n        this.tileSetRenderers,\n        ctx,\n        imageLayerTextures,\n        imageLayerGifSources\n      )\n      if (child) this.addChild(child)\n    }\n  }\n\n  get orientation() {\n    return this.mapData.orientation\n  }\n  get mapWidth() {\n    return this.mapData.width\n  }\n  get mapHeight() {\n    return this.mapData.height\n  }\n  get tileWidth() {\n    return this.mapData.tilewidth\n  }\n  get tileHeight() {\n    return this.mapData.tileheight\n  }\n\n  getLayer(name: string): Container | undefined {\n    return this.children.find((c) => c.label === name) as Container | undefined\n  }\n\n  /**\n   * Reposition layers to reflect the camera's current position through the\n   * map's parallax factors. Call after moving the camera.\n   *\n   * Effective layer screen position (after your camera transform) is:\n   *   base_offset - parallax_origin * (1 - parallax) - camera * parallax\n   *\n   * so a layer with parallax 1 moves normally with the camera and a layer\n   * with parallax 0 is pinned in screen space. Nested group layers compose\n   * parallax multiplicatively per the Tiled spec.\n   */\n  applyParallax(cameraX: number, cameraY: number): void {\n    const ox = this.mapData.parallaxoriginx\n    const oy = this.mapData.parallaxoriginy\n    for (const child of this.children) {\n      if (isParallaxLayer(child)) {\n        applyParallaxRecursive(child, cameraX, cameraY, ox, oy, 1, 1)\n      }\n    }\n  }\n\n  private _buildBackground(pixelWidth: number, pixelHeight: number, colorHex: string): void {\n    const color = parseTintColor(colorHex)\n    this._background = new Graphics().rect(0, 0, pixelWidth, pixelHeight).fill(color)\n    this._background.label = 'background'\n    this.addChild(this._background)\n  }\n\n  override destroy(options?: Parameters<Container['destroy']>[0]): void {\n    for (const ts of this.tileSetRenderers) {\n      ts.destroy()\n    }\n    super.destroy(options)\n  }\n}\n\nfunction applyParallaxRecursive(\n  layer: ParallaxLayer,\n  cameraX: number,\n  cameraY: number,\n  originX: number,\n  originY: number,\n  parentParallaxX: number,\n  parentParallaxY: number\n): void {\n  const px = layer.layerParallaxX * parentParallaxX\n  const py = layer.layerParallaxY * parentParallaxY\n\n  layer.position.set(\n    layer.layerBaseOffsetX + (cameraX - originX) * (1 - px),\n    layer.layerBaseOffsetY + (cameraY - originY) * (1 - py)\n  )\n\n  if (layer instanceof GroupLayerRenderer) {\n    for (const child of layer.children) {\n      if (isParallaxLayer(child)) {\n        applyParallaxRecursive(child, cameraX, cameraY, originX, originY, px, py)\n      }\n    }\n  }\n}\n","import {\n  Assets,\n  ExtensionType,\n  extensions,\n  type LoaderParser,\n  path as pixiPath,\n  type Texture\n} from 'pixi.js'\nimport type { GifSource } from 'pixi.js/gif'\nimport { GifAsset } from 'pixi.js/gif'\nimport { parseMapAsync, parseTmx, parseTsx, parseTx } from '../parser'\nimport { isTilesetRef } from '../parser/tilesetHelpers.js'\nimport type {\n  TiledLayer,\n  TiledMapAsset,\n  TiledMap as TiledMapData,\n  TiledObject,\n  TiledObjectTemplate,\n  TiledTileset\n} from '../types'\nimport { TiledMap } from './TiledMap.js'\n\nextensions.add(GifAsset)\n\nexport const tiledMapLoader: LoaderParser<TiledMapAsset> = {\n  extension: {\n    type: ExtensionType.LoadParser,\n    name: 'tiledmap-loader'\n  },\n\n  id: 'tiledmap-loader',\n  name: 'tiledmap-loader',\n\n  test(url: string): boolean {\n    const ext = pixiPath.extname(url).toLowerCase()\n    return ext === '.tmx' || ext === '.tmj'\n  },\n\n  async load(url: string): Promise<TiledMapAsset> {\n    const ext = pixiPath.extname(url).toLowerCase()\n    const response = await fetch(url)\n\n    let data: TiledMapData\n    if (ext === '.tmx') {\n      const xml = await response.text()\n      data = parseTmx(xml)\n    } else {\n      data = (await response.json()) as TiledMapData\n    }\n\n    const basePath = pixiPath.dirname(url)\n\n    // Resolve external tilesets\n    const externalTilesets = new Map<string, TiledTileset>()\n    for (const ts of data.tilesets) {\n      if (!isTilesetRef(ts)) continue\n      const tsUrl = pixiPath.join(basePath, ts.source)\n      const tsResponse = await fetch(tsUrl)\n      const tsExt = pixiPath.extname(ts.source).toLowerCase()\n      let tsData: TiledTileset\n      if (tsExt === '.tsx') {\n        const tsXml = await tsResponse.text()\n        tsData = parseTsx(tsXml)\n      } else {\n        tsData = (await tsResponse.json()) as TiledTileset\n      }\n      externalTilesets.set(ts.source, tsData)\n    }\n\n    // Resolve object templates — walk every object layer (including nested\n    // group layers) to find unique template references, then fetch each one\n    // in parallel. Templates may be either .tx (XML) or .tj (JSON).\n    const templates = new Map<string, TiledObjectTemplate>()\n    const templateSources = new Set<string>()\n    for (const obj of walkObjects(data.layers)) {\n      if (obj.template) templateSources.add(obj.template)\n    }\n    await Promise.all(\n      Array.from(templateSources).map(async (src) => {\n        const tplUrl = pixiPath.join(basePath, src)\n        const tplResponse = await fetch(tplUrl)\n        const tplExt = pixiPath.extname(src).toLowerCase()\n        let tpl: TiledObjectTemplate\n        if (tplExt === '.tx') {\n          const tplXml = await tplResponse.text()\n          tpl = parseTx(tplXml)\n        } else {\n          tpl = (await tplResponse.json()) as TiledObjectTemplate\n        }\n        templates.set(src, tpl)\n      })\n    )\n\n    // Parse the map to resolved IR\n    const mapData = await parseMapAsync(data, { externalTilesets, templates })\n\n    // Load tileset textures\n    const tilesetTextures = new Map<string, Texture>()\n    const imageLayerTextures = new Map<string, Texture>()\n    const tileImageTextures = new Map<string, Texture>()\n    const tileImageGifSources = new Map<string, GifSource>()\n    const imageLayerGifSources = new Map<string, GifSource>()\n\n    const textureLoads: Promise<void>[] = []\n\n    for (const ts of mapData.tilesets) {\n      if (ts.image) {\n        const imageUrl = pixiPath.join(basePath, ts.image)\n        textureLoads.push(\n          Assets.load<Texture | GifSource>(imageUrl).then((tex) => {\n            tilesetTextures.set(\n              ts.image!,\n              imageUrl.toLowerCase().endsWith('.gif')\n                ? ((tex as GifSource).textures[0] as Texture)\n                : (tex as Texture)\n            )\n          })\n        )\n      }\n\n      // Image-collection tilesets: each tile has its own image\n      for (const [_localId, tileDef] of ts.tiles) {\n        if (tileDef.image) {\n          const tileImgUrl = pixiPath.join(basePath, tileDef.image)\n          textureLoads.push(\n            Assets.load<Texture | GifSource>(tileImgUrl).then((tex) => {\n              if (tileImgUrl.toLowerCase().endsWith('.gif')) {\n                const gifSource = tex as GifSource\n                tileImageTextures.set(tileDef.image!, gifSource.textures[0] as Texture)\n                tileImageGifSources.set(tileDef.image!, gifSource)\n              } else {\n                tileImageTextures.set(tileDef.image!, tex as Texture)\n              }\n            })\n          )\n        }\n      }\n    }\n\n    // Load image layer textures\n    for (const layer of flattenLayers(mapData.layers)) {\n      if (layer.type === 'imagelayer' && layer.image) {\n        const imgUrl = pixiPath.join(basePath, layer.image)\n        textureLoads.push(\n          Assets.load<Texture | GifSource>(imgUrl).then((tex) => {\n            if (imgUrl.toLowerCase().endsWith('.gif')) {\n              const gifSource = tex as GifSource\n              imageLayerTextures.set(layer.image, gifSource.textures[0] as Texture)\n              imageLayerGifSources.set(layer.image, gifSource)\n            } else {\n              imageLayerTextures.set(layer.image, tex as Texture)\n            }\n          })\n        )\n      }\n    }\n\n    await Promise.all(textureLoads)\n\n    // Build the display tree\n    const container = new TiledMap(mapData, {\n      tilesetTextures,\n      imageLayerTextures,\n      tileImageTextures,\n      tileImageGifSources,\n      imageLayerGifSources\n    })\n\n    return { mapData, container }\n  }\n}\n\nfunction flattenLayers<L extends { type: string; layers?: L[] }>(layers: L[]): L[] {\n  const result: L[] = []\n  for (const layer of layers) {\n    result.push(layer)\n    if (layer.type === 'group' && layer.layers) {\n      result.push(...flattenLayers(layer.layers))\n    }\n  }\n  return result\n}\n\nfunction* walkObjects(layers: TiledLayer[]): Generator<TiledObject> {\n  for (const layer of flattenLayers(layers)) {\n    if (layer.type === 'objectgroup' && layer.objects) {\n      for (const obj of layer.objects) yield obj\n    }\n  }\n}\n"],"mappings":"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"}