{"version":3,"file":"index.mjs","sources":["../../../../src/components/DatePicker/index.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport RobustFloating from '../Floating/index.vue';\nimport RobustCalendar from '../Calendar/index.vue';\nimport RobustInputWrapper from '../InputWrapper/index.vue';\nimport { PhCaretDown, PhCalendar, PhArrowClockwise } from '@phosphor-icons/vue';\nimport { computed, ref, toRefs, PropType, inject } from 'vue';\nimport { MaybeRef, onClickOutside } from '@vueuse/core';\nimport { Preset } from '../Calendar/presets';\n\nconst props = defineProps({\n  title: {\n    type: String,\n    default: undefined,\n  },\n  hint: {\n    type: String,\n    default: undefined,\n  },\n  modelValue: {\n    type: Object as PropType<Date>,\n    default: undefined,\n  },\n  error: {\n    type: String,\n    default: undefined,\n  },\n  class: {\n    type: String,\n    default: undefined,\n  },\n  condensed: {\n    type: Boolean,\n    default: false,\n  },\n  placeholder: {\n    type: String,\n    default: 'Select date',\n  },\n  resetable: {\n    type: Boolean,\n    default: false,\n  },\n  readonly: {\n    type: Boolean,\n    default: false,\n  },\n  dark: {\n    type: Boolean,\n    default: false,\n  },\n  preset: {\n    type: String,\n    default: () => undefined,\n  },\n  presets: {\n    type: Array as PropType<Preset[]>,\n    default: () => [],\n  },\n  variant: {\n    type: String,\n    default: () => 'primary',\n  },\n  past: {\n    type: Boolean,\n    default: true,\n  },\n  future: {\n    type: Boolean,\n    default: true,\n  },\n});\n\nconst emit = defineEmits([\n  'update:modelValue',\n  'update:preset',\n  'change',\n  'blur',\n]);\n\nconst { modelValue, presets, variant } = toRefs(props);\n\nconst open = ref(false);\nconst elementRef = ref();\nconst inputWrapperRef = ref();\n\nconst computedValue = computed<Date>({\n  get() {\n    return modelValue?.value;\n  },\n  set(value) {\n    open.value = false;\n    if (Array.isArray(value)) {\n      emit('update:modelValue', value[0]);\n      emit('change', value[0]);\n    } else {\n      emit('update:modelValue', value);\n      emit('change', value);\n    }\n    emit('blur');\n  },\n});\n\nconst preset = computed({\n  get() {\n    return props.preset;\n  },\n  set(value) {\n    emit('update:preset', value);\n  },\n});\n\nconst displayDate = computed(() => {\n  if (!computedValue.value) {\n    return props.placeholder;\n  }\n\n  if (preset.value) {\n    return presets.value.find((p) => p.key === preset.value)?.title;\n  }\n\n  const realDate = computedValue.value;\n  const formatter = Intl.DateTimeFormat(navigator.language, {\n    day: '2-digit',\n    month: '2-digit',\n    year: 'numeric',\n  });\n  if (Array.isArray(realDate)) {\n    return formatter.format(realDate[0]);\n  } else {\n    return formatter.format(realDate);\n  }\n});\n\nonClickOutside(elementRef, (event) => {\n  if (!open.value) {\n    return;\n  }\n\n  if (inputWrapperRef.value?.wrapperRef.contains(event.target)) {\n    event.stopPropagation();\n  }\n\n  closeDropdown();\n});\n\nfunction closeDropdown() {\n  if (open.value === true) {\n    open.value = false;\n    emit('blur');\n  }\n}\nfunction resetValue() {\n  open.value = false;\n  computedValue.value = undefined;\n  preset.value = undefined;\n}\n</script>\n\n<template>\n  <RobustInputWrapper\n    ref=\"inputWrapperRef\"\n    :title=\"title\"\n    :hint=\"hint\"\n    :error=\"error\"\n    :class=\"$props.class\"\n    :readonly=\"readonly\"\n    :condensed=\"condensed\"\n    @click.stop=\"open = !open\"\n  >\n    <div\n      v-if=\"$slots.prefix\"\n      class=\"pointer-events-none flex h-full select-none items-center pr-2 text-gray-400\"\n      :class=\"[condensed ? 'pl-2' : 'pl-3']\"\n    >\n      <slot tag=\"div\" name=\"prefix\" />\n    </div>\n    <div\n      class=\"flex h-full items-center pr-2 text-gray-400\"\n      :class=\"[condensed ? 'pl-2' : 'pl-3']\"\n    >\n      <PhCalendar size=\"20\" />\n    </div>\n    <div\n      ref=\"select\"\n      class=\"flex h-full w-full select-none items-center bg-transparent pl-2 text-current outline-none\"\n      v-bind=\"$attrs\"\n    >\n      <div class=\"min-w-0 truncate tabular-nums\">{{ displayDate }}</div>\n    </div>\n\n    <div\n      class=\"flex h-full flex-shrink-0 items-center pr-3 text-gray-400 dark:text-gray-500\"\n      :class=\"[condensed ? 'pl-2' : 'pl-3']\"\n    >\n      <PhCaretDown\n        :size=\"14\"\n        weight=\"bold\"\n        class=\"transition-transform duration-200\"\n        :class=\"{ 'rotate-180 transform': open }\"\n      />\n    </div>\n    <div\n      v-if=\"resetable\"\n      class=\"flex h-full flex-shrink-0 items-center px-3 pr-3 text-gray-400 hover:bg-gray-100 dark:text-gray-500 dark:hover:bg-gray-700\"\n      @click.stop=\"resetValue\"\n    >\n      <PhArrowClockwise\n        :size=\"14\"\n        weight=\"bold\"\n        class=\"transition-transform duration-200\"\n      />\n    </div>\n  </RobustInputWrapper>\n  <RobustFloating\n    v-if=\"inputWrapperRef?.wrapperRef\"\n    ref=\"elementRef\"\n    v-model:open=\"open\"\n    class=\"z-[100] origin-top-left\"\n    :reference=\"inputWrapperRef?.wrapperRef\"\n    :options=\"{\n      placement: 'bottom-start',\n    }\"\n  >\n    <RobustCalendar\n      v-model=\"computedValue\"\n      v-model:preset=\"preset\"\n      :presets=\"presets\"\n      :variant=\"variant\"\n      :past=\"past\"\n      :future=\"future\"\n      :enable-preset=\"presets.length !== 0\"\n    />\n  </RobustFloating>\n</template>\n"],"names":["props","__props","emit","__emit","modelValue","presets","variant","toRefs","open","ref","elementRef","inputWrapperRef","computedValue","computed","value","preset","displayDate","_a","p","realDate","formatter","onClickOutside","event","closeDropdown","resetValue"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,UAAMA,IAAQC,GA+DRC,IAAOC,GAOP,EAAE,YAAAC,GAAY,SAAAC,GAAS,SAAAC,EAAQ,IAAIC,EAAOP,CAAK,GAE/CQ,IAAOC,EAAI,EAAK,GAChBC,IAAaD,KACbE,IAAkBF,KAElBG,IAAgBC,EAAe;AAAA,MACnC,MAAM;AACJ,eAAOT,KAAA,gBAAAA,EAAY;AAAA,MACrB;AAAA,MACA,IAAIU,GAAO;AACT,QAAAN,EAAK,QAAQ,IACT,MAAM,QAAQM,CAAK,KAChBZ,EAAA,qBAAqBY,EAAM,CAAC,CAAC,GAC7BZ,EAAA,UAAUY,EAAM,CAAC,CAAC,MAEvBZ,EAAK,qBAAqBY,CAAK,GAC/BZ,EAAK,UAAUY,CAAK,IAEtBZ,EAAK,MAAM;AAAA,MACb;AAAA,IAAA,CACD,GAEKa,IAASF,EAAS;AAAA,MACtB,MAAM;AACJ,eAAOb,EAAM;AAAA,MACf;AAAA,MACA,IAAIc,GAAO;AACT,QAAAZ,EAAK,iBAAiBY,CAAK;AAAA,MAC7B;AAAA,IAAA,CACD,GAEKE,IAAcH,EAAS,MAAM;;AAC7B,UAAA,CAACD,EAAc;AACjB,eAAOZ,EAAM;AAGf,UAAIe,EAAO;AACF,gBAAAE,IAAAZ,EAAQ,MAAM,KAAK,CAACa,MAAMA,EAAE,QAAQH,EAAO,KAAK,MAAhD,gBAAAE,EAAmD;AAG5D,YAAME,IAAWP,EAAc,OACzBQ,IAAY,KAAK,eAAe,UAAU,UAAU;AAAA,QACxD,KAAK;AAAA,QACL,OAAO;AAAA,QACP,MAAM;AAAA,MAAA,CACP;AACG,aAAA,MAAM,QAAQD,CAAQ,IACjBC,EAAU,OAAOD,EAAS,CAAC,CAAC,IAE5BC,EAAU,OAAOD,CAAQ;AAAA,IAClC,CACD;AAEc,IAAAE,EAAAX,GAAY,CAACY,MAAU;;AAChC,MAACd,EAAK,WAINS,IAAAN,EAAgB,UAAhB,QAAAM,EAAuB,WAAW,SAASK,EAAM,WACnDA,EAAM,gBAAgB,GAGVC;IAAA,CACf;AAED,aAASA,IAAgB;AACnB,MAAAf,EAAK,UAAU,OACjBA,EAAK,QAAQ,IACbN,EAAK,MAAM;AAAA,IAEf;AACA,aAASsB,IAAa;AACpB,MAAAhB,EAAK,QAAQ,IACbI,EAAc,QAAQ,QACtBG,EAAO,QAAQ;AAAA,IACjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}