{"version":3,"file":"get-day-position.cjs","names":["parseTimeString","clampIntervalMinutes"],"sources":["../../../src/utils/get-day-position/get-day-position.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { ScheduleEventData } from '../../types';\nimport { clampIntervalMinutes } from '../clamp-interval-minutes/clamp-interval-minutes';\nimport { parseTimeString } from '../parse-time-string/parse-time-string';\n\ninterface GetDayPositionInput {\n  /** Event data to calculate position for */\n  event: ScheduleEventData;\n\n  /** Start time boundary for the day in HH:mm:ss format, `00:00:00` by default */\n  startTime?: string;\n\n  /** End time boundary for the day in HH:mm:ss format, `23:59:59` by default */\n  endTime?: string;\n\n  /** Number of minutes per time slot, `60` by default. Used to align the canvas to whole slots when `endTime` does not divide evenly. */\n  intervalMinutes?: number;\n}\n\n/** Calculates day position within given start and end time boundaries. Returns top and height in percentages. */\nexport function getDayPosition({\n  event,\n  startTime = '00:00:00',\n  endTime = '23:59:59',\n  intervalMinutes = 60,\n}: GetDayPositionInput) {\n  const eventStart = dayjs(event.start);\n  const eventEnd = dayjs(event.end);\n\n  const parsedStartTime = parseTimeString(startTime);\n  const parsedEndTime = parseTimeString(endTime);\n\n  const startOfDay = eventStart.startOf('date');\n  const boundaryStart = startOfDay\n    .hour(parsedStartTime.hours)\n    .minute(parsedStartTime.minutes)\n    .second(parsedStartTime.seconds);\n  const literalEnd = startOfDay\n    .hour(parsedEndTime.hours)\n    .minute(parsedEndTime.minutes)\n    .second(parsedEndTime.seconds);\n\n  const intervalSeconds = clampIntervalMinutes(intervalMinutes) * 60;\n  const literalRangeSeconds = literalEnd.diff(boundaryStart, 'second');\n  const totalSeconds = Math.ceil(literalRangeSeconds / intervalSeconds) * intervalSeconds;\n\n  const clippedEventStart = eventStart.isBefore(boundaryStart) ? boundaryStart : eventStart;\n  const eventStartSeconds = clippedEventStart.diff(boundaryStart, 'second');\n\n  const clippedEventEnd = eventEnd.isAfter(literalEnd) ? literalEnd : eventEnd;\n  const eventEndSeconds = clippedEventEnd.diff(boundaryStart, 'second');\n\n  const startPercent = (eventStartSeconds / totalSeconds) * 100;\n  const endPercent = (eventEndSeconds / totalSeconds) * 100;\n\n  return {\n    top: startPercent,\n    height: endPercent - startPercent,\n  };\n}\n"],"mappings":";;;;;;;;AAoBA,SAAgB,eAAe,EAC7B,OACA,YAAY,YACZ,UAAU,YACV,kBAAkB,MACI;CACtB,MAAM,cAAA,GAAA,MAAA,QAAA,CAAmB,MAAM,KAAK;CACpC,MAAM,YAAA,GAAA,MAAA,QAAA,CAAiB,MAAM,GAAG;CAEhC,MAAM,kBAAkBA,0BAAAA,gBAAgB,SAAS;CACjD,MAAM,gBAAgBA,0BAAAA,gBAAgB,OAAO;CAE7C,MAAM,aAAa,WAAW,QAAQ,MAAM;CAC5C,MAAM,gBAAgB,WACnB,KAAK,gBAAgB,KAAK,CAAC,CAC3B,OAAO,gBAAgB,OAAO,CAAC,CAC/B,OAAO,gBAAgB,OAAO;CACjC,MAAM,aAAa,WAChB,KAAK,cAAc,KAAK,CAAC,CACzB,OAAO,cAAc,OAAO,CAAC,CAC7B,OAAO,cAAc,OAAO;CAE/B,MAAM,kBAAkBC,+BAAAA,qBAAqB,eAAe,IAAI;CAChE,MAAM,sBAAsB,WAAW,KAAK,eAAe,QAAQ;CACnE,MAAM,eAAe,KAAK,KAAK,sBAAsB,eAAe,IAAI;CAGxE,MAAM,qBADoB,WAAW,SAAS,aAAa,IAAI,gBAAgB,WAAA,CACnC,KAAK,eAAe,QAAQ;CAGxE,MAAM,mBADkB,SAAS,QAAQ,UAAU,IAAI,aAAa,SAAA,CAC5B,KAAK,eAAe,QAAQ;CAEpE,MAAM,eAAgB,oBAAoB,eAAgB;CAG1D,OAAO;EACL,KAAK;EACL,QAJkB,kBAAkB,eAAgB,MAI/B;CACvB;AACF"}