{"version":3,"file":"get-columns.mjs","names":[],"sources":["../../../src/Heatmap/get-columns/get-columns.ts"],"sourcesContent":["export type HeatmapColumn =\n  | { type: 'spacer' }\n  | { type: 'column'; month: number; weekIndex: number };\n\n/**\n * Builds a list of visual columns for the heatmap. When `splitMonths` is false,\n * there is exactly one column per week. When `splitMonths` is true, weeks that\n * span two months are split into two columns and a spacer column is inserted\n * between different months.\n */\nexport function getColumns(\n  datesRange: (string | null)[][],\n  splitMonths?: boolean\n): HeatmapColumn[] {\n  if (!splitMonths) {\n    return datesRange.map((week, weekIndex) => {\n      // Determine month for labeling purposes: pick first non-null day\n      const firstDay = week.find((d) => d !== null)! as string;\n      const month = new Date(firstDay).getUTCMonth();\n      return { type: 'column', month, weekIndex } as HeatmapColumn;\n    });\n  }\n\n  const tmp: HeatmapColumn[] = [];\n  datesRange.forEach((week, weekIndex) => {\n    const months = week.map((d) => (d ? new Date(d).getUTCMonth() : null));\n    let firstMonth: number | null = null;\n    let boundaryIndex: number | null = null;\n    for (let i = 0; i < months.length; i += 1) {\n      if (months[i] === null) {\n        continue;\n      }\n      if (firstMonth === null) {\n        firstMonth = months[i]!;\n      } else if (months[i] !== firstMonth) {\n        boundaryIndex = i;\n        break;\n      }\n    }\n\n    if (firstMonth === null) {\n      return; // should not happen\n    }\n\n    if (boundaryIndex === null) {\n      tmp.push({ type: 'column', month: firstMonth, weekIndex });\n    } else {\n      // Find nextMonth as first non-null month from boundaryIndex\n      let nextMonth: number | null = null;\n      for (let i = boundaryIndex; i < months.length; i += 1) {\n        if (months[i] !== null) {\n          nextMonth = months[i]!;\n          break;\n        }\n      }\n      if (nextMonth === null) {\n        tmp.push({ type: 'column', month: firstMonth, weekIndex });\n      } else {\n        tmp.push({ type: 'column', month: firstMonth, weekIndex });\n        tmp.push({ type: 'column', month: nextMonth, weekIndex });\n      }\n    }\n  });\n\n  // Insert spacer between adjacent columns when month changes\n  const columns: HeatmapColumn[] = [];\n  for (let i = 0; i < tmp.length; i += 1) {\n    if (i > 0 && (tmp[i] as any).month !== (tmp[i - 1] as any).month) {\n      columns.push({ type: 'spacer' });\n    }\n    columns.push(tmp[i]);\n  }\n\n  return columns;\n}\n\nexport function getFirstMonthColumnIndex(columns: HeatmapColumn[], month: number): number {\n  for (let i = 0; i < columns.length; i += 1) {\n    const c = columns[i];\n    if (c.type === 'column' && c.month === month) {\n      return i;\n    }\n  }\n\n  return -1;\n}\n"],"mappings":";;;;;;;;AAUA,SAAgB,WACd,YACA,aACiB;AACjB,KAAI,CAAC,YACH,QAAO,WAAW,KAAK,MAAM,cAAc;EAEzC,MAAM,WAAW,KAAK,MAAM,MAAM,MAAM,KAAK;AAE7C,SAAO;GAAE,MAAM;GAAU,OADX,IAAI,KAAK,SAAS,CAAC,aAAa;GACd;GAAW;GAC3C;CAGJ,MAAM,MAAuB,EAAE;AAC/B,YAAW,SAAS,MAAM,cAAc;EACtC,MAAM,SAAS,KAAK,KAAK,MAAO,IAAI,IAAI,KAAK,EAAE,CAAC,aAAa,GAAG,KAAM;EACtE,IAAI,aAA4B;EAChC,IAAI,gBAA+B;AACnC,OAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK,GAAG;AACzC,OAAI,OAAO,OAAO,KAChB;AAEF,OAAI,eAAe,KACjB,cAAa,OAAO;YACX,OAAO,OAAO,YAAY;AACnC,oBAAgB;AAChB;;;AAIJ,MAAI,eAAe,KACjB;AAGF,MAAI,kBAAkB,KACpB,KAAI,KAAK;GAAE,MAAM;GAAU,OAAO;GAAY;GAAW,CAAC;OACrD;GAEL,IAAI,YAA2B;AAC/B,QAAK,IAAI,IAAI,eAAe,IAAI,OAAO,QAAQ,KAAK,EAClD,KAAI,OAAO,OAAO,MAAM;AACtB,gBAAY,OAAO;AACnB;;AAGJ,OAAI,cAAc,KAChB,KAAI,KAAK;IAAE,MAAM;IAAU,OAAO;IAAY;IAAW,CAAC;QACrD;AACL,QAAI,KAAK;KAAE,MAAM;KAAU,OAAO;KAAY;KAAW,CAAC;AAC1D,QAAI,KAAK;KAAE,MAAM;KAAU,OAAO;KAAW;KAAW,CAAC;;;GAG7D;CAGF,MAAM,UAA2B,EAAE;AACnC,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK,GAAG;AACtC,MAAI,IAAI,KAAM,IAAI,GAAW,UAAW,IAAI,IAAI,GAAW,MACzD,SAAQ,KAAK,EAAE,MAAM,UAAU,CAAC;AAElC,UAAQ,KAAK,IAAI,GAAG;;AAGtB,QAAO;;AAGT,SAAgB,yBAAyB,SAA0B,OAAuB;AACxF,MAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK,GAAG;EAC1C,MAAM,IAAI,QAAQ;AAClB,MAAI,EAAE,SAAS,YAAY,EAAE,UAAU,MACrC,QAAO;;AAIX,QAAO"}