{"version":3,"file":"date.utils.mjs","sources":["../../../src/lib/nextGenComponents/utils/date.utils.ts"],"sourcesContent":["import { format, parse } from 'date-fns'\n\nconst DEFAULT_LOCALE = 'en-US'\n\nexport const getSupportedLocale = (): string => {\n  if (typeof navigator === 'undefined') return DEFAULT_LOCALE\n  const SUPPORTED_LOCALES = new Set(['en-GB', 'en-US'])\n  const userLocales = navigator.languages ?? [navigator.language]\n  const match = userLocales.find(locale => SUPPORTED_LOCALES.has(locale))\n  return match ?? DEFAULT_LOCALE\n}\n\nexport const is12HourFormat = (): boolean =>\n  !!new Intl.DateTimeFormat(getSupportedLocale(), { hour: 'numeric' }).resolvedOptions().hour12\n\nconst getTimeFormat = (): string => (is12HourFormat() ? 'hh:mm a' : 'HH:mm')\n\nexport const formatLocalDate = (d: Date): string =>\n  new Intl.DateTimeFormat(getSupportedLocale(), {\n    day: '2-digit',\n    month: '2-digit',\n    year: 'numeric',\n    numberingSystem: 'latn',\n    calendar: 'gregory'\n  }).format(d)\n\nexport const parseLocalDate = (text: string): Date | null => {\n  const match = text.trim().match(/^(\\d{2})\\/(\\d{2})\\/(\\d{4})$/)\n  if (!match) return null\n\n  const [, first, second, yearStr] = match\n  const isUS = getSupportedLocale() === 'en-US'\n  const month = (isUS ? parseInt(first, 10) : parseInt(second, 10)) - 1\n  const day = isUS ? parseInt(second, 10) : parseInt(first, 10)\n  const year = parseInt(yearStr, 10)\n\n  const date = new Date(year, month, day)\n  if (date.getFullYear() !== year || date.getMonth() !== month || date.getDate() !== day) {\n    return null\n  }\n  return date\n}\n\n/** @deprecated Use formatLocalDate */\nexport const formatDateDDMMYYYY = formatLocalDate\n\n/** @deprecated Use parseLocalDate */\nexport const parseDateDDMMYYYY = parseLocalDate\n\nexport const getDatePlaceholder = (): string =>\n  getSupportedLocale() === 'en-US' ? 'mm/dd/yyyy' : 'dd/mm/yyyy'\n\nexport const getTimePlaceholder = (): string => (is12HourFormat() ? 'hh:mm AM' : 'HH:mm')\n\nexport const getDefaultSinceHour = (): string => (is12HourFormat() ? '12:00 AM' : '00:00')\n\nexport const getDefaultUntilHour = (): string => (is12HourFormat() ? '11:30 PM' : '23:30')\n\nconst HALF_HOUR_SLOTS_PER_DAY = 24 * 2\n\nexport const buildHalfHourOptions = (): string[] => {\n  const fmt = getTimeFormat()\n  return Array.from({ length: HALF_HOUR_SLOTS_PER_DAY }, (_, i) =>\n    format(new Date(2000, 0, 1, Math.floor(i / 2), (i % 2) * 30), fmt)\n  )\n}\n\n/** @deprecated Use buildHalfHourOptions */\nexport const buildHalfHourOptions12h = buildHalfHourOptions\n\nexport const toUTCISO = (d: Date): string => d.toISOString()\n\n/** @deprecated Use toUTCISO */\nexport const toLocalISO = toUTCISO\n\nconst TIME_PARSE_FORMATS = ['hh:mm a', 'h:mm a', 'HH:mm', 'H:mm'] as const\n\nexport const applyHourToDate = (date: Date, hour: string, defaultHour?: string): Date => {\n  const effectiveHour = hour || defaultHour\n  if (!effectiveHour) return date\n  for (const fmt of TIME_PARSE_FORMATS) {\n    const parsed = parse(effectiveHour, fmt, date)\n    if (!Number.isNaN(parsed.getTime())) return parsed\n  }\n  return date\n}\n\nexport const isoToLocalDate = (iso: string): Date | undefined => {\n  if (!iso) return undefined\n  const d = new Date(iso)\n  if (Number.isNaN(d.getTime())) return undefined\n  return new Date(d.getFullYear(), d.getMonth(), d.getDate())\n}\n\nexport const isoToHour = (iso: string): string => {\n  if (!iso) return ''\n  const d = new Date(iso)\n  if (Number.isNaN(d.getTime())) return ''\n  return format(new Date(2000, 0, 1, d.getHours(), d.getMinutes()), getTimeFormat())\n}\n\nexport const parseTimeInput = (text: string): string => {\n  const trimmed = text\n    .trim()\n    .replace(/\\s+/g, ' ')\n    .replace(/(\\d)([AaPp][Mm])/, '$1 $2')\n  if (!trimmed) return ''\n\n  const ref = new Date(2000, 0, 1)\n\n  for (const fmt of TIME_PARSE_FORMATS) {\n    const parsed = parse(trimmed, fmt, ref)\n    if (!Number.isNaN(parsed.getTime()) && parsed.getFullYear() === 2000) {\n      return format(parsed, getTimeFormat())\n    }\n  }\n\n  return ''\n}\n\nconst SHORT_DATE_FORMAT: Intl.DateTimeFormatOptions = { month: 'short', day: 'numeric' }\n\nexport const formatCustomRangeLabel = (since: string, until?: string): string => {\n  const from = isoToLocalDate(since)\n  if (!from) return ''\n\n  const locale = getSupportedLocale()\n  const fromStr = from.toLocaleDateString(locale, SHORT_DATE_FORMAT)\n\n  if (!until) return fromStr\n\n  const to = isoToLocalDate(until)\n  if (!to) return fromStr\n\n  return `${fromStr} - ${to.toLocaleDateString(locale, SHORT_DATE_FORMAT)}`\n}\n"],"names":["DEFAULT_LOCALE","getSupportedLocale","SUPPORTED_LOCALES","locale","is12HourFormat","getTimeFormat","formatLocalDate","d","parseLocalDate","text","match","first","second","yearStr","isUS","month","day","year","date","formatDateDDMMYYYY","parseDateDDMMYYYY","getDatePlaceholder","getTimePlaceholder","getDefaultSinceHour","getDefaultUntilHour","HALF_HOUR_SLOTS_PER_DAY","buildHalfHourOptions","fmt","_","i","format","buildHalfHourOptions12h","toUTCISO","toLocalISO","TIME_PARSE_FORMATS","applyHourToDate","hour","defaultHour","effectiveHour","parsed","parse","isoToLocalDate","iso","isoToHour","parseTimeInput","trimmed","ref","SHORT_DATE_FORMAT","formatCustomRangeLabel","since","until","from","fromStr","to"],"mappings":";AAEA,MAAMA,IAAiB,SAEVC,IAAqB,MAAc;AAC9C,MAAI,OAAO,YAAc,IAAa,QAAOD;AAC7C,QAAME,IAAoB,oBAAI,IAAI,CAAC,SAAS,OAAO,CAAC;AAGpD,UAFoB,UAAU,aAAa,CAAC,UAAU,QAAQ,GACpC,KAAK,OAAUA,EAAkB,IAAIC,CAAM,CAAC,KACtDH;AAClB,GAEaI,IAAiB,MAC5B,CAAC,CAAC,IAAI,KAAK,eAAeH,KAAsB,EAAE,MAAM,WAAW,EAAE,kBAAkB,QAEnFI,IAAgB,MAAeD,MAAmB,YAAY,SAEvDE,IAAkB,CAACC,MAC9B,IAAI,KAAK,eAAeN,KAAsB;AAAA,EAC5C,KAAK;AAAA,EACL,OAAO;AAAA,EACP,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,UAAU;AACZ,CAAC,EAAE,OAAOM,CAAC,GAEAC,IAAiB,CAACC,MAA8B;AAC3D,QAAMC,IAAQD,EAAK,KAAA,EAAO,MAAM,6BAA6B;AAC7D,MAAI,CAACC,EAAO,QAAO;AAEnB,QAAM,GAAGC,GAAOC,GAAQC,CAAO,IAAIH,GAC7BI,IAAOb,QAAyB,SAChCc,IAAgB,SAAPD,IAAgBH,IAAsBC,GAAf,EAAE,IAA4B,GAC9DI,IAAa,SAAPF,IAAgBF,IAAuBD,GAAf,EAAE,GAChCM,IAAO,SAASJ,GAAS,EAAE,GAE3BK,IAAO,IAAI,KAAKD,GAAMF,GAAOC,CAAG;AACtC,SAAIE,EAAK,kBAAkBD,KAAQC,EAAK,SAAA,MAAeH,KAASG,EAAK,QAAA,MAAcF,IAC1E,OAEFE;AACT,GAGaC,IAAqBb,GAGrBc,IAAoBZ,GAEpBa,IAAqB,MAChCpB,QAAyB,UAAU,eAAe,cAEvCqB,IAAqB,MAAelB,EAAA,IAAmB,aAAa,SAEpEmB,IAAsB,MAAenB,EAAA,IAAmB,aAAa,SAErEoB,IAAsB,MAAepB,EAAA,IAAmB,aAAa,SAE5EqB,IAA0B,IAEnBC,IAAuB,MAAgB;AAClD,QAAMC,IAAMtB,EAAA;AACZ,SAAO,MAAM;AAAA,IAAK,EAAE,QAAQoB,EAAA;AAAA,IAA2B,CAACG,GAAGC,MACzDC,EAAO,IAAI,KAAK,KAAM,GAAG,GAAG,KAAK,MAAMD,IAAI,CAAC,GAAIA,IAAI,IAAK,EAAE,GAAGF,CAAG;AAAA,EAAA;AAErE,GAGaI,IAA0BL,GAE1BM,IAAW,CAACzB,MAAoBA,EAAE,YAAA,GAGlC0B,IAAaD,GAEpBE,IAAqB,CAAC,WAAW,UAAU,SAAS,MAAM,GAEnDC,IAAkB,CAACjB,GAAYkB,GAAcC,MAA+B;AACvF,QAAMC,IAAgBF,KAAQC;AAC9B,MAAI,CAACC,EAAe,QAAOpB;AAC3B,aAAWS,KAAOO,GAAoB;AACpC,UAAMK,IAASC,EAAMF,GAAeX,GAAKT,CAAI;AAC7C,QAAI,CAAC,OAAO,MAAMqB,EAAO,QAAA,CAAS,EAAG,QAAOA;AAAA,EAC9C;AACA,SAAOrB;AACT,GAEauB,IAAiB,CAACC,MAAkC;AAC/D,MAAI,CAACA,EAAK;AACV,QAAMnC,IAAI,IAAI,KAAKmC,CAAG;AACtB,MAAI,QAAO,MAAMnC,EAAE,QAAA,CAAS;AAC5B,WAAO,IAAI,KAAKA,EAAE,YAAA,GAAeA,EAAE,SAAA,GAAYA,EAAE,SAAS;AAC5D,GAEaoC,IAAY,CAACD,MAAwB;AAChD,MAAI,CAACA,EAAK,QAAO;AACjB,QAAMnC,IAAI,IAAI,KAAKmC,CAAG;AACtB,SAAI,OAAO,MAAMnC,EAAE,QAAA,CAAS,IAAU,KAC/BuB,EAAO,IAAI,KAAK,KAAM,GAAG,GAAGvB,EAAE,SAAA,GAAYA,EAAE,WAAA,CAAY,GAAGF,GAAe;AACnF,GAEauC,IAAiB,CAACnC,MAAyB;AACtD,QAAMoC,IAAUpC,EACb,KAAA,EACA,QAAQ,QAAQ,GAAG,EACnB,QAAQ,oBAAoB,OAAO;AACtC,MAAI,CAACoC,EAAS,QAAO;AAErB,QAAMC,IAAM,IAAI,KAAK,KAAM,GAAG,CAAC;AAE/B,aAAWnB,KAAOO,GAAoB;AACpC,UAAMK,IAASC,EAAMK,GAASlB,GAAKmB,CAAG;AACtC,QAAI,CAAC,OAAO,MAAMP,EAAO,QAAA,CAAS,KAAKA,EAAO,YAAA,MAAkB;AAC9D,aAAOT,EAAOS,GAAQlC,GAAe;AAAA,EAEzC;AAEA,SAAO;AACT,GAEM0C,IAAgD,EAAE,OAAO,SAAS,KAAK,UAAA,GAEhEC,IAAyB,CAACC,GAAeC,MAA2B;AAC/E,QAAMC,IAAOV,EAAeQ,CAAK;AACjC,MAAI,CAACE,EAAM,QAAO;AAElB,QAAMhD,IAASF,EAAA,GACTmD,IAAUD,EAAK,mBAAmBhD,GAAQ4C,CAAiB;AAEjE,MAAI,CAACG,EAAO,QAAOE;AAEnB,QAAMC,IAAKZ,EAAeS,CAAK;AAC/B,SAAKG,IAEE,GAAGD,CAAO,MAAMC,EAAG,mBAAmBlD,GAAQ4C,CAAiB,CAAC,KAFvDK;AAGlB;"}