{"version":3,"file":"ChartLabels.mjs","names":[],"sources":["../../src/Heatmaps/ChartLabels.tsx"],"sourcesContent":["import { cx } from 'antd-style';\nimport isEqual from 'fast-deep-equal';\nimport { memo, useMemo } from 'react';\n\nimport type { Labels, Week } from '@/types/charts';\nimport { getMonthLabels } from '@/utils/calendar';\n\ninterface WeekdayLabelItem {\n  dayIndex: number;\n  index: number;\n  label: string;\n  y: number;\n}\n\ninterface WeekdayLabelsProps {\n  blockMargin: number;\n  blockSize: number;\n  firstWeek: Week;\n  labelHeight: number;\n  labelMargin: number;\n  weekStart: number;\n  weekdays?: string[];\n}\n\n// Simple component - ChartLabels already memoized, so this doesn't need memo\nconst WeekdayLabels = ({\n  blockMargin,\n  blockSize,\n  firstWeek,\n  labelHeight,\n  labelMargin,\n  weekStart,\n  weekdays,\n}: WeekdayLabelsProps) => {\n  const labels = useMemo(() => {\n    const maxLength = Math.floor((blockSize * 7 + blockMargin * 6) / 12);\n\n    return firstWeek\n      .map((_, index) => {\n        if (index % 2 === 0) return null;\n        const dayIndex = (index + weekStart) % 7;\n        const label = weekdays?.[dayIndex] || '';\n        const truncatedLabel = label.length > maxLength ? label.slice(0, maxLength) + '...' : label;\n        return {\n          dayIndex,\n          index,\n          label: truncatedLabel,\n          y: labelHeight + (blockSize + blockMargin) * index + blockSize / 2,\n        };\n      })\n      .filter((item): item is WeekdayLabelItem => item !== null);\n  }, [firstWeek, weekStart, blockSize, blockMargin, labelHeight, weekdays]);\n\n  if (labels.length === 0) return null;\n\n  return (\n    <g className={cx('legend-weekday')}>\n      {labels.map((item) => (\n        <text\n          dominantBaseline=\"middle\"\n          key={item.index}\n          textAnchor=\"end\"\n          x={-labelMargin}\n          y={item.y}\n        >\n          {item.label}\n        </text>\n      ))}\n    </g>\n  );\n};\n\nWeekdayLabels.displayName = 'WeekdayLabels';\n\ninterface MonthLabelsProps {\n  blockMargin: number;\n  blockSize: number;\n  monthNames?: string[];\n  weeks: Week[];\n}\n\n// Simple component - ChartLabels already memoized, so this doesn't need memo\nconst MonthLabels = ({ blockMargin, blockSize, monthNames, weeks }: MonthLabelsProps) => {\n  const labels = useMemo(() => {\n    if (weeks.length === 0) return [];\n    return getMonthLabels(weeks, monthNames);\n  }, [weeks, monthNames]);\n\n  const maxLength = useMemo(() => {\n    return Math.floor((blockSize * 4 + blockMargin * 3) / 12);\n  }, [blockSize, blockMargin]);\n\n  if (labels.length === 0) return null;\n\n  return (\n    <g className={cx('legend-month')}>\n      {labels.map(({ label, weekIndex }) => {\n        const truncatedLabel = label.length > maxLength ? label.slice(0, maxLength) + '...' : label;\n        return (\n          <text\n            dominantBaseline=\"hanging\"\n            key={weekIndex}\n            x={(blockSize + blockMargin) * weekIndex}\n          >\n            {truncatedLabel}\n          </text>\n        );\n      })}\n    </g>\n  );\n};\n\nMonthLabels.displayName = 'MonthLabels';\n\ninterface ChartLabelsProps {\n  blockMargin: number;\n  blockSize: number;\n  hideMonthLabels: boolean;\n  labelHeight: number;\n  labelMargin: number;\n  labels: Labels;\n  showWeekdayLabels: boolean;\n  weekStart: number;\n  weeks: Week[];\n}\n\nconst ChartLabels = memo<ChartLabelsProps>(\n  ({\n    labels,\n    blockSize,\n    labelHeight,\n    blockMargin,\n    labelMargin,\n    showWeekdayLabels,\n    hideMonthLabels,\n    weeks,\n    weekStart,\n  }) => {\n    return (\n      <>\n        {showWeekdayLabels && weeks[0] && (\n          <WeekdayLabels\n            blockMargin={blockMargin}\n            blockSize={blockSize}\n            firstWeek={weeks[0]}\n            labelHeight={labelHeight}\n            labelMargin={labelMargin}\n            weekStart={weekStart}\n            weekdays={labels.weekdays}\n          />\n        )}\n        {!hideMonthLabels && (\n          <MonthLabels\n            blockMargin={blockMargin}\n            blockSize={blockSize}\n            monthNames={labels.months}\n            weeks={weeks}\n          />\n        )}\n      </>\n    );\n  },\n  isEqual,\n);\n\nChartLabels.displayName = 'ChartLabels';\n\nexport default ChartLabels;\n"],"mappings":";;;;;;AAyBA,MAAM,iBAAiB,EACrB,aACA,WACA,WACA,aACA,aACA,WACA,eACwB;CACxB,MAAM,SAAS,cAAc;EAC3B,MAAM,YAAY,KAAK,OAAO,YAAY,IAAI,cAAc,KAAK,EAAE;EAEnE,OAAO,UACJ,KAAK,GAAG,UAAU;GACjB,IAAI,QAAQ,MAAM,GAAG,OAAO;GAC5B,MAAM,YAAY,QAAQ,aAAa;GACvC,MAAM,QAAQ,WAAW,aAAa;GAEtC,OAAO;IACL;IACA;IACA,OAJqB,MAAM,SAAS,YAAY,MAAM,MAAM,GAAG,SAAS,IAAI,QAAQ;IAKpF,GAAG,eAAe,YAAY,eAAe,QAAQ,YAAY;GACnE;EACF,CAAC,CAAC,CACD,QAAQ,SAAmC,SAAS,IAAI;CAC7D,GAAG;EAAC;EAAW;EAAW;EAAW;EAAa;EAAa;CAAQ,CAAC;CAExE,IAAI,OAAO,WAAW,GAAG,OAAO;CAEhC,OACE,oBAAC,KAAD;EAAG,WAAW,GAAG,gBAAgB;EAC9B,UAAA,OAAO,KAAK,SACX,oBAAC,QAAD;GACE,kBAAiB;GAEjB,YAAW;GACX,GAAG,CAAC;GACJ,GAAG,KAAK;GAEP,UAAA,KAAK;EACF,GANC,KAAK,KAMN,CACP;CACA,CAAA;AAEP;AAEA,cAAc,cAAc;AAU5B,MAAM,eAAe,EAAE,aAAa,WAAW,YAAY,YAA8B;CACvF,MAAM,SAAS,cAAc;EAC3B,IAAI,MAAM,WAAW,GAAG,OAAO,CAAC;EAChC,OAAO,eAAe,OAAO,UAAU;CACzC,GAAG,CAAC,OAAO,UAAU,CAAC;CAEtB,MAAM,YAAY,cAAc;EAC9B,OAAO,KAAK,OAAO,YAAY,IAAI,cAAc,KAAK,EAAE;CAC1D,GAAG,CAAC,WAAW,WAAW,CAAC;CAE3B,IAAI,OAAO,WAAW,GAAG,OAAO;CAEhC,OACE,oBAAC,KAAD;EAAG,WAAW,GAAG,cAAc;EAC5B,UAAA,OAAO,KAAK,EAAE,OAAO,gBAAgB;GACpC,MAAM,iBAAiB,MAAM,SAAS,YAAY,MAAM,MAAM,GAAG,SAAS,IAAI,QAAQ;GACtF,OACE,oBAAC,QAAD;IACE,kBAAiB;IAEjB,IAAI,YAAY,eAAe;IAE9B,UAAA;GACG,GAJC,SAID;EAEV,CAAC;CACA,CAAA;AAEP;AAEA,YAAY,cAAc;AAc1B,MAAM,cAAc,MACjB,EACC,QACA,WACA,aACA,aACA,aACA,mBACA,iBACA,OACA,gBACI;CACJ,OACE,qBAAA,YAAA,EAAA,UAAA,CACG,qBAAqB,MAAM,MAC1B,oBAAC,eAAD;EACe;EACF;EACX,WAAW,MAAM;EACJ;EACA;EACF;EACX,UAAU,OAAO;CAClB,CAAA,GAEF,CAAC,mBACA,oBAAC,aAAD;EACe;EACF;EACX,YAAY,OAAO;EACZ;CACR,CAAA,CAEH,EAAA,CAAA;AAEN,GACA,OACF;AAEA,YAAY,cAAc"}