{"version":3,"file":"heatmap.mjs","sources":["../../../../../../packages/components/heatmap/src/heatmap.ts"],"sourcesContent":["import { buildProps, definePropType } from '@ll-plus/utils'\r\n\r\nimport type { ExtractPropTypes, VNode } from 'vue'\r\nimport type Heatmap from './heatmap.vue'\r\n\r\nimport type { TooltipProps } from '../../tooltip/src/tooltip'\r\n\r\nexport interface HeatmapDataItem {\r\n  timestamp: number\r\n  value?: number | null\r\n}\r\n\r\nexport type HeatmapData = HeatmapDataItem[]\r\n\r\nexport interface HeatmapTooltipSlotProps extends HeatmapDataItem {}\r\n\r\nexport interface HeatmapTooltipOptions extends Partial<TooltipProps> {\r\n  show?: boolean\r\n}\r\n\r\nexport interface HeatmapSlots {\r\n  footer?: () => VNode[]\r\n  indicator?: () => VNode[]\r\n  'indicator-leading-text'?: () => VNode[]\r\n  'indicator-trailing-text'?: () => VNode[]\r\n  tooltip?: (props: HeatmapTooltipSlotProps) => VNode[]\r\n}\r\n\r\nexport type HeatmapIndicatorVerticalPosition = 'top' | 'bottom'\r\nexport type HeatmapIndicatorHorizontalAlign = 'left' | 'center' | 'right'\r\n\r\nexport const heatmapColorThemes = {\r\n  green: ['#9be9a8', '#40c463', '#30a14e', '#216e39'],\r\n  blue: ['#b6e3ff', '#66b7ff', '#2f7ef7', '#1d4ed8'],\r\n  orange: ['#fed7aa', '#fb923c', '#ea580c', '#c2410c'],\r\n  purple: ['#e9d5ff', '#c084fc', '#9333ea', '#7c3aed'],\r\n  red: ['#fecaca', '#f87171', '#dc2626', '#b91c1c'],\r\n} as const\r\n\r\nexport type HeatmapColorTheme = keyof typeof heatmapColorThemes\r\n\r\nconst FIRST_DAY_OF_WEEK = [0, 1, 2, 3, 4, 5, 6] as const\r\n\r\nexport const heatmapProps = buildProps({\r\n  activeColors: {\r\n    type: definePropType<string[]>(Array),\r\n    default: undefined,\r\n  },\r\n  colorTheme: {\r\n    type: definePropType<HeatmapColorTheme>(String),\r\n    default: 'green',\r\n  },\r\n  data: {\r\n    type: definePropType<HeatmapData>(Array),\r\n    default: () => [],\r\n  },\r\n  loading: {\r\n    type: Boolean,\r\n    default: false,\r\n  },\r\n  loadingData: {\r\n    type: definePropType<HeatmapData>(Array),\r\n    default: undefined,\r\n  },\r\n  minimumColor: {\r\n    type: String,\r\n    default: '',\r\n  },\r\n  fillCalendarLeading: {\r\n    type: Boolean,\r\n    default: false,\r\n  },\r\n  firstDayOfWeek: {\r\n    type: Number,\r\n    values: FIRST_DAY_OF_WEEK,\r\n    default: 0,\r\n  },\r\n  showColorIndicator: {\r\n    type: Boolean,\r\n    default: true,\r\n  },\r\n  indicatorVerticalPosition: {\r\n    type: definePropType<HeatmapIndicatorVerticalPosition>(String),\r\n    default: 'bottom',\r\n  },\r\n  indicatorHorizontalAlign: {\r\n    type: definePropType<HeatmapIndicatorHorizontalAlign>(String),\r\n    default: 'right',\r\n  },\r\n  showMonthLabels: {\r\n    type: Boolean,\r\n    default: true,\r\n  },\r\n  showWeekLabels: {\r\n    type: Boolean,\r\n    default: true,\r\n  },\r\n  size: {\r\n    type: definePropType<'small' | 'medium' | 'large'>(String),\r\n    default: 'medium',\r\n  },\r\n  tooltip: {\r\n    type: definePropType<HeatmapTooltipOptions>(Object),\r\n    default: () => ({\r\n      show: false,\r\n      placement: 'top',\r\n      arrow: true,\r\n      bgColor: undefined,\r\n      textColor: undefined,\r\n      isWhiteBg: false,\r\n      maxWidth: '240px',\r\n      tipEllipsis: false,\r\n      tipEllipsisLine: 1,\r\n      overlayClassName: '',\r\n      overlayStyle: {},\r\n      ellipsis: false,\r\n      width: '',\r\n      containerStyle: {},\r\n      showContainer: false,\r\n    }),\r\n  },\r\n  unit: {\r\n    type: String,\r\n    default: '',\r\n  },\r\n  xGap: {\r\n    type: definePropType<number | string>([Number, String]),\r\n    default: undefined,\r\n  },\r\n  yGap: {\r\n    type: definePropType<number | string>([Number, String]),\r\n    default: undefined,\r\n  },\r\n} as const)\r\n\r\nexport type HeatmapProps = ExtractPropTypes<typeof heatmapProps>\r\n\r\nexport const heatmapMockData = (year: 'recent' | number = 'recent'): HeatmapData => {\r\n  const result: HeatmapData = []\r\n  const today = new Date()\r\n  const endDate = new Date(today.getFullYear(), today.getMonth(), today.getDate())\r\n\r\n  const startDate =\r\n    year === 'recent'\r\n      ? new Date(endDate.getFullYear(), endDate.getMonth(), endDate.getDate() - 364)\r\n      : new Date(year, 0, 1)\r\n\r\n  const finalDate = year === 'recent' ? endDate : new Date(year, 11, 31)\r\n\r\n  for (\r\n    let current = new Date(startDate);\r\n    current <= finalDate;\r\n    current.setDate(current.getDate() + 1)\r\n  ) {\r\n    const seed = current.getDate() + current.getMonth() * 3\r\n    const random = Math.random()\r\n    let value = 0\r\n\r\n    if (random > 0.65) {\r\n      value = Math.floor(((random + seed / 31) % 1) * 12) + 1\r\n    }\r\n\r\n    result.push({\r\n      timestamp: current.getTime(),\r\n      value,\r\n    })\r\n  }\r\n\r\n  return result\r\n}\r\n\r\nexport type HeatmapInstance = InstanceType<typeof Heatmap>"],"names":[],"mappings":"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"}