UNPKG

@yamada-ui/calendar

Version:

Yamada UI calendar component

1 lines • 19.1 kB
{"version":3,"sources":["../src/use-calendar.ts"],"sourcesContent":["import type { CSSUIObject, PropGetter } from \"@yamada-ui/core\"\nimport type { Dayjs } from \"dayjs\"\nimport type {\n Dispatch,\n ForwardedRef,\n MutableRefObject,\n RefObject,\n SetStateAction,\n} from \"react\"\nimport { useI18n, useTheme } from \"@yamada-ui/core\"\nimport { useControllableState } from \"@yamada-ui/use-controllable-state\"\nimport {\n createContext,\n isArray,\n useCallbackRef,\n useUpdateEffect,\n} from \"@yamada-ui/utils\"\nimport dayjs from \"dayjs\"\nimport { useCallback, useRef, useState } from \"react\"\nimport { getRangeYears, isSameDate, onShouldFocus } from \"./calendar-utils\"\n\nexport type MaybeValue = [Date?, Date?] | Date | Date[] | undefined\n\nexport type MaybeDate = Date | Dayjs\n\nexport interface CalendarContext\n extends Pick<\n Required<UseCalendarProps>,\n | \"__selectType\"\n | \"amountOfMonths\"\n | \"dateFormat\"\n | \"disableOutsideDays\"\n | \"enableRange\"\n | \"firstDayOfWeek\"\n | \"hiddenOutsideDays\"\n | \"holidays\"\n | \"locale\"\n | \"month\"\n | \"monthFormat\"\n | \"paginateBy\"\n | \"today\"\n | \"type\"\n | \"weekdayFormat\"\n | \"weekendDays\"\n | \"withControls\"\n | \"withHeader\"\n | \"withLabel\"\n | \"withWeekdays\"\n | \"yearFormat\"\n >,\n Pick<\n UseCalendarProps,\n | \"excludeDate\"\n | \"maxDate\"\n | \"maxSelectValues\"\n | \"minDate\"\n | \"minSelectValues\"\n | \"nextRef\"\n | \"prevRef\"\n | \"typeRef\"\n > {\n dayRefs: MutableRefObject<Map<string, RefObject<HTMLButtonElement>>>\n hoveredValue: Date\n internalYear: number\n maxYear: number\n minYear: number\n monthRefs: MutableRefObject<Map<number, RefObject<HTMLButtonElement>>>\n nextMonth: Date\n prevMonth: Date\n rangeYears: number[]\n setHoveredValue: Dispatch<SetStateAction<Date | undefined>>\n setInternalYear: Dispatch<SetStateAction<number>>\n setMonth: Dispatch<SetStateAction<Date>>\n setType: (\n type: \"date\" | \"month\" | \"year\",\n year?: number,\n month?: number,\n ) => void\n setValue: Dispatch<SetStateAction<MaybeValue>>\n setYear: Dispatch<SetStateAction<number>>\n styles: { [key: string]: CSSUIObject | undefined }\n value: MaybeValue\n year: number\n yearRefs: MutableRefObject<Map<number, RefObject<HTMLButtonElement>>>\n}\n\nexport const [CalendarProvider, useCalendarContext] =\n createContext<CalendarContext>({\n name: \"CalendarContext\",\n errorMessage: `useCalendarContext returned is 'undefined'. Seems you forgot to wrap the components in \"<Calendar />\"`,\n })\n\nexport interface UseCalendarProps<Y extends MaybeValue = Date> {\n /**\n * The type of the calendar.\n */\n type?: \"date\" | \"month\" | \"year\"\n /**\n * The number of months to display.\n *\n * @default 1\n */\n amountOfMonths?: number\n /**\n * The format used for conversion.\n * Check the docs to see the format of possible modifiers you can pass.\n *\n * @see Docs https://day.js.org/docs/en/display/format#list-of-localized-formats\n * @default 'MMMM YYYY'\n */\n dateFormat?: string\n /**\n * The initial month of the calendar.\n *\n * @default 'new Date()'\n */\n defaultMonth?: Date\n /**\n * The initial type of the calendar.\n */\n defaultType?: \"date\" | \"month\" | \"year\"\n /**\n * The initial value of the calendar.\n */\n defaultValue?: Y\n /**\n * If `true`, outside days will be disabled.\n *\n * @default false\n */\n disableOutsideDays?: boolean\n /**\n * If `true`, enables date multiple selection.\n *\n * @default false\n */\n enableMultiple?: boolean\n /**\n * If `true`, enables date range selection.\n *\n * @default false\n */\n enableRange?: boolean\n /**\n * Callback function to determine whether the day should be disabled.\n */\n excludeDate?: (date: Date) => boolean\n /**\n * Define the first day of the week.\n *\n * @default 'monday'\n */\n firstDayOfWeek?: \"monday\" | \"sunday\"\n /**\n * If `true`, outside days will be hidden.\n */\n hiddenOutsideDays?: boolean\n /**\n * Define holidays.\n */\n holidays?: Date[]\n /**\n * The locale of the calendar.\n * Check the docs to see the locale of possible modifiers you can pass.\n *\n * @see Docs https://day.js.org/docs/en/i18n/instance-locale\n * @default 'en-US'\n */\n locale?: string\n /**\n * The maximum possible date.\n */\n maxDate?: Date\n /**\n * The maximum selectable value.\n */\n maxSelectValues?: number\n /**\n * The minimum possible date.\n */\n minDate?: Date\n /**\n * The minimum selectable value.\n */\n minSelectValues?: number\n /**\n * The month of the calendar.\n */\n month?: Date\n /**\n * The format used for conversion.\n * Check the docs to see the format of possible modifiers you can pass.\n *\n * @see Docs https://day.js.org/docs/en/display/format#list-of-localized-formats\n * @default 'MM'\n */\n monthFormat?: string\n /**\n * Ref to a next function.\n */\n nextRef?: ForwardedRef<() => undefined | void>\n /**\n * The number of months to paginate.\n *\n * @default 1\n */\n paginateBy?: number\n /**\n * Ref to a previous function.\n */\n prevRef?: ForwardedRef<() => undefined | void>\n /**\n * If `true`, highlight today.\n *\n * @default false\n */\n today?: boolean\n /**\n * Ref to a type function.\n */\n typeRef?: ForwardedRef<() => undefined | void>\n /**\n * The value of the calendar.\n */\n value?: Y\n /**\n * The format used for conversion.\n * Check the docs to see the format of possible modifiers you can pass.\n *\n * @see Docs https://day.js.org/docs/en/display/format#list-of-localized-formats\n * @default 'dd'\n */\n weekdayFormat?: string\n /**\n * Define weekend days.\n *\n * @default '[0, 6]'\n */\n weekendDays?: number[]\n /**\n * If `true`, display the calendar control buttons.\n *\n * @default true\n */\n withControls?: boolean\n /**\n * If `true`, display the calendar header.\n *\n * @default true\n */\n withHeader?: boolean\n /**\n * If `true`, display the calendar label button.\n *\n * @default true\n */\n withLabel?: boolean\n /**\n * If `true`, display the calendar weekdays.\n *\n * @default true\n */\n withWeekdays?: boolean\n /**\n * The format used for conversion.\n * Check the docs to see the format of possible modifiers you can pass.\n *\n * @see Docs https://day.js.org/docs/en/display/format#list-of-localized-formats\n * @default 'YYYY'\n */\n yearFormat?: string\n /**\n * The callback invoked when value state changes.\n */\n onChange?: (value: Y) => void\n /**\n * The callback invoked when month state changes.\n */\n onChangeMonth?: (value: Date) => void\n /**\n * The callback invoked when type state changes.\n */\n onChangeType?: (\n type: \"date\" | \"month\" | \"year\",\n year?: number,\n month?: number,\n ) => void\n /**\n * Changes the judgment of the currently selected year and month.\n * This is an internal utility primarily used by `MonthPicker` and `YearPicker`.\n *\n * @private\n */\n __selectType?: \"date\" | \"month\" | \"year\"\n}\n\nexport const useCalendar = <Y extends MaybeValue = Date>({\n type: typeProp,\n amountOfMonths = 1,\n dateFormat = \"MMMM YYYY\",\n defaultMonth,\n defaultType,\n defaultValue,\n disableOutsideDays = false,\n enableMultiple = false,\n enableRange = false,\n excludeDate,\n firstDayOfWeek = \"monday\",\n hiddenOutsideDays = false,\n holidays = [],\n locale,\n maxDate,\n maxSelectValues,\n minDate,\n minSelectValues,\n month: monthProp,\n monthFormat = \"MMM\",\n nextRef,\n paginateBy = amountOfMonths,\n prevRef,\n today = false,\n typeRef,\n value: valueProp,\n weekdayFormat = \"dd\",\n weekendDays = [0, 6],\n withControls = true,\n withHeader = true,\n withLabel = true,\n withWeekdays = true,\n yearFormat = \"YYYY\",\n onChange: onChangeProp,\n onChangeMonth: onChangeMonthProp,\n onChangeType: onChangeTypeProp,\n __selectType = \"date\",\n ...rest\n}: UseCalendarProps<Y>) => {\n const { locale: defaultLocale } = useI18n()\n const { theme } = useTheme()\n\n locale ??= theme.__config?.date?.locale ?? defaultLocale\n\n const [type, onChangeType] = useControllableState({\n defaultValue: defaultType ?? \"date\",\n value: typeProp,\n })\n\n const setType = useCallbackRef(\n (type: \"date\" | \"month\" | \"year\", year?: number, month?: number) => {\n onChangeType(type)\n onChangeTypeProp?.(type, year, month)\n },\n [],\n )\n\n const prevValueRef = useRef<undefined | Y>(undefined)\n const [value, setValue] = useControllableState({\n defaultValue:\n defaultValue ??\n (enableMultiple || enableRange ? ([] as Date[] as Y) : undefined),\n value: valueProp,\n onChange: onChangeProp,\n })\n\n const [hoveredValue, setHoveredValue] = useState<Date | undefined>(undefined)\n\n const multi = isArray(value)\n const range = enableRange && multi\n const resolvedValue = multi || range ? (value.filter(Boolean) as Date[]) : []\n\n if (range) disableOutsideDays = false\n\n const [month, setMonth] = useControllableState({\n defaultValue: () => {\n if (!multi && value) {\n defaultMonth ??= new Date(new Date(value).setDate(1))\n } else if ((multi || range) && resolvedValue.length) {\n defaultMonth ??= new Date(new Date(resolvedValue.at(-1)!).setDate(1))\n } else {\n defaultMonth ??= new Date(new Date().setDate(1))\n }\n\n return defaultMonth\n },\n value: monthProp,\n onChange: onChangeMonthProp,\n onUpdate: (prev, next) => !isSameDate(prev, next),\n })\n\n const defaultYear = month.getFullYear()\n const [year, setYear] = useState<number>(defaultYear)\n const [internalYear, setInternalYear] = useState<number>(year)\n const minYear = minDate instanceof Date ? minDate.getFullYear() : 1\n const maxYear = maxDate instanceof Date ? maxDate.getFullYear() : 10000\n const rangeYears = getRangeYears(internalYear)\n const nextMonth = dayjs(month).add(amountOfMonths, \"months\").toDate()\n const prevMonth = dayjs(month).subtract(1, \"months\").toDate()\n\n const yearRefs = useRef(new Map<number, RefObject<HTMLButtonElement>>())\n const monthRefs = useRef(new Map<number, RefObject<HTMLButtonElement>>())\n const dayRefs = useRef(new Map<string, RefObject<HTMLButtonElement>>())\n\n useUpdateEffect(() => {\n if (!defaultMonth) return\n\n if (range && isArray(prevValueRef.current) && isArray(valueProp)) {\n const prevValue = prevValueRef.current.filter(Boolean)\n const nextValue = valueProp.filter(Boolean)\n\n if (prevValue.length === 1) {\n const reverse = !isSameDate(prevValue[0], nextValue[0])\n\n if (!reverse) {\n if (nextValue[1])\n defaultMonth = new Date(new Date(nextValue[1]).setDate(1))\n } else {\n if (nextValue[0])\n defaultMonth = new Date(new Date(nextValue[0]).setDate(1))\n }\n }\n }\n\n setMonth(defaultMonth)\n setYear(defaultMonth.getFullYear())\n setInternalYear(defaultMonth.getFullYear())\n\n prevValueRef.current = valueProp\n }, [valueProp])\n\n useUpdateEffect(() => {\n if (!value || amountOfMonths > 1) return\n\n if (multi || range) return\n\n const year = value.getFullYear()\n\n if (type === \"year\") {\n setYear(year)\n setInternalYear((prev) => {\n const contain = rangeYears.includes(year)\n\n if (contain) {\n return prev\n } else {\n return year\n }\n })\n } else {\n setMonth(value)\n }\n }, [value, amountOfMonths])\n\n useUpdateEffect(() => {\n if (!range) return\n\n if (value.length !== 1) setHoveredValue(undefined)\n }, [range, value])\n\n useUpdateEffect(() => {\n if (__selectType === \"year\") return\n\n setYear(month.getFullYear())\n setInternalYear(month.getFullYear())\n }, [month.getFullYear()])\n\n useUpdateEffect(() => {\n switch (type) {\n case \"year\":\n onShouldFocus(yearRefs, (i) => year === rangeYears[i])\n\n break\n\n case \"month\":\n onShouldFocus(\n monthRefs,\n (value) => month.getFullYear() === year && month.getMonth() === value,\n )\n\n break\n\n default:\n onShouldFocus(dayRefs, (key) => {\n const [, month, date] = key.split(\"-\").map(Number)\n\n if (!multi) {\n return value?.getMonth() === month && value?.getDate() === date\n } else {\n return value.some(\n (value) =>\n value?.getMonth() === month && value?.getDate() === date,\n )\n }\n })\n\n break\n }\n }, [type])\n\n useUpdateEffect(() => {\n setValue(valueProp as Y)\n }, [valueProp])\n\n const getContainerProps: PropGetter = useCallback(\n (props = {}, ref = null) => ({\n ...rest,\n ...props,\n ref,\n }),\n [rest],\n )\n\n return {\n type,\n amountOfMonths,\n dateFormat,\n dayRefs,\n disableOutsideDays,\n enableRange,\n excludeDate,\n firstDayOfWeek,\n hiddenOutsideDays,\n holidays,\n hoveredValue,\n internalYear,\n locale,\n maxDate,\n maxSelectValues,\n maxYear,\n minDate,\n minSelectValues,\n minYear,\n month,\n monthFormat,\n monthRefs,\n nextMonth,\n nextRef,\n paginateBy,\n prevMonth,\n prevRef,\n rangeYears,\n setHoveredValue,\n setInternalYear,\n setMonth,\n setType,\n setValue,\n setYear,\n today,\n typeRef,\n value,\n weekdayFormat,\n weekendDays,\n withControls,\n withHeader,\n withLabel,\n withWeekdays,\n year,\n yearFormat,\n yearRefs,\n getContainerProps,\n __selectType,\n }\n}\n\nexport type UseCalendarReturn = ReturnType<typeof useCalendar>\n"],"mappings":";;;;;;;;AASA,SAAS,SAAS,gBAAgB;AAClC,SAAS,4BAA4B;AACrC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,OAAO,WAAW;AAClB,SAAS,aAAa,QAAQ,gBAAgB;AAoEvC,IAAM,CAAC,kBAAkB,kBAAkB,IAChD,cAA+B;AAAA,EAC7B,MAAM;AAAA,EACN,cAAc;AAChB,CAAC;AA8MI,IAAM,cAAc,CAA8B;AAAA,EACvD,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA,qBAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd;AAAA,EACA,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,WAAW,CAAC;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,cAAc;AAAA,EACd;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB,cAAc,CAAC,GAAG,CAAC;AAAA,EACnB,eAAe;AAAA,EACf,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,aAAa;AAAA,EACb,UAAU;AAAA,EACV,eAAe;AAAA,EACf,cAAc;AAAA,EACd,eAAe;AAAA,EACf,GAAG;AACL,MAA2B;AA/U3B;AAgVE,QAAM,EAAE,QAAQ,cAAc,IAAI,QAAQ;AAC1C,QAAM,EAAE,MAAM,IAAI,SAAS;AAE3B,sCAAW,uBAAM,aAAN,mBAAgB,SAAhB,mBAAsB,WAAtB,YAAgC;AAE3C,QAAM,CAAC,MAAM,YAAY,IAAI,qBAAqB;AAAA,IAChD,cAAc,oCAAe;AAAA,IAC7B,OAAO;AAAA,EACT,CAAC;AAED,QAAM,UAAU;AAAA,IACd,CAACA,OAAiCC,OAAeC,WAAmB;AAClE,mBAAaF,KAAI;AACjB,2DAAmBA,OAAMC,OAAMC;AAAA,IACjC;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,eAAe,OAAsB,MAAS;AACpD,QAAM,CAAC,OAAO,QAAQ,IAAI,qBAAqB;AAAA,IAC7C,cACE,sCACC,kBAAkB,cAAe,CAAC,IAAoB;AAAA,IACzD,OAAO;AAAA,IACP,UAAU;AAAA,EACZ,CAAC;AAED,QAAM,CAAC,cAAc,eAAe,IAAI,SAA2B,MAAS;AAE5E,QAAM,QAAQ,QAAQ,KAAK;AAC3B,QAAM,QAAQ,eAAe;AAC7B,QAAM,gBAAgB,SAAS,QAAS,MAAM,OAAO,OAAO,IAAe,CAAC;AAE5E,MAAI,MAAO,sBAAqB;AAEhC,QAAM,CAAC,OAAO,QAAQ,IAAI,qBAAqB;AAAA,IAC7C,cAAc,MAAM;AAClB,UAAI,CAAC,SAAS,OAAO;AACnB,6DAAiB,IAAI,KAAK,IAAI,KAAK,KAAK,EAAE,QAAQ,CAAC,CAAC;AAAA,MACtD,YAAY,SAAS,UAAU,cAAc,QAAQ;AACnD,6DAAiB,IAAI,KAAK,IAAI,KAAK,cAAc,GAAG,EAAE,CAAE,EAAE,QAAQ,CAAC,CAAC;AAAA,MACtE,OAAO;AACL,6DAAiB,IAAI,MAAK,oBAAI,KAAK,GAAE,QAAQ,CAAC,CAAC;AAAA,MACjD;AAEA,aAAO;AAAA,IACT;AAAA,IACA,OAAO;AAAA,IACP,UAAU;AAAA,IACV,UAAU,CAAC,MAAM,SAAS,CAAC,WAAW,MAAM,IAAI;AAAA,EAClD,CAAC;AAED,QAAM,cAAc,MAAM,YAAY;AACtC,QAAM,CAAC,MAAM,OAAO,IAAI,SAAiB,WAAW;AACpD,QAAM,CAAC,cAAc,eAAe,IAAI,SAAiB,IAAI;AAC7D,QAAM,UAAU,mBAAmB,OAAO,QAAQ,YAAY,IAAI;AAClE,QAAM,UAAU,mBAAmB,OAAO,QAAQ,YAAY,IAAI;AAClE,QAAM,aAAa,cAAc,YAAY;AAC7C,QAAM,YAAY,MAAM,KAAK,EAAE,IAAI,gBAAgB,QAAQ,EAAE,OAAO;AACpE,QAAM,YAAY,MAAM,KAAK,EAAE,SAAS,GAAG,QAAQ,EAAE,OAAO;AAE5D,QAAM,WAAW,OAAO,oBAAI,IAA0C,CAAC;AACvE,QAAM,YAAY,OAAO,oBAAI,IAA0C,CAAC;AACxE,QAAM,UAAU,OAAO,oBAAI,IAA0C,CAAC;AAEtE,kBAAgB,MAAM;AACpB,QAAI,CAAC,aAAc;AAEnB,QAAI,SAAS,QAAQ,aAAa,OAAO,KAAK,QAAQ,SAAS,GAAG;AAChE,YAAM,YAAY,aAAa,QAAQ,OAAO,OAAO;AACrD,YAAM,YAAY,UAAU,OAAO,OAAO;AAE1C,UAAI,UAAU,WAAW,GAAG;AAC1B,cAAM,UAAU,CAAC,WAAW,UAAU,CAAC,GAAG,UAAU,CAAC,CAAC;AAEtD,YAAI,CAAC,SAAS;AACZ,cAAI,UAAU,CAAC;AACb,2BAAe,IAAI,KAAK,IAAI,KAAK,UAAU,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,QAC7D,OAAO;AACL,cAAI,UAAU,CAAC;AACb,2BAAe,IAAI,KAAK,IAAI,KAAK,UAAU,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,QAC7D;AAAA,MACF;AAAA,IACF;AAEA,aAAS,YAAY;AACrB,YAAQ,aAAa,YAAY,CAAC;AAClC,oBAAgB,aAAa,YAAY,CAAC;AAE1C,iBAAa,UAAU;AAAA,EACzB,GAAG,CAAC,SAAS,CAAC;AAEd,kBAAgB,MAAM;AACpB,QAAI,CAAC,SAAS,iBAAiB,EAAG;AAElC,QAAI,SAAS,MAAO;AAEpB,UAAMD,QAAO,MAAM,YAAY;AAE/B,QAAI,SAAS,QAAQ;AACnB,cAAQA,KAAI;AACZ,sBAAgB,CAAC,SAAS;AACxB,cAAM,UAAU,WAAW,SAASA,KAAI;AAExC,YAAI,SAAS;AACX,iBAAO;AAAA,QACT,OAAO;AACL,iBAAOA;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH,OAAO;AACL,eAAS,KAAK;AAAA,IAChB;AAAA,EACF,GAAG,CAAC,OAAO,cAAc,CAAC;AAE1B,kBAAgB,MAAM;AACpB,QAAI,CAAC,MAAO;AAEZ,QAAI,MAAM,WAAW,EAAG,iBAAgB,MAAS;AAAA,EACnD,GAAG,CAAC,OAAO,KAAK,CAAC;AAEjB,kBAAgB,MAAM;AACpB,QAAI,iBAAiB,OAAQ;AAE7B,YAAQ,MAAM,YAAY,CAAC;AAC3B,oBAAgB,MAAM,YAAY,CAAC;AAAA,EACrC,GAAG,CAAC,MAAM,YAAY,CAAC,CAAC;AAExB,kBAAgB,MAAM;AACpB,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,sBAAc,UAAU,CAAC,MAAM,SAAS,WAAW,CAAC,CAAC;AAErD;AAAA,MAEF,KAAK;AACH;AAAA,UACE;AAAA,UACA,CAACE,WAAU,MAAM,YAAY,MAAM,QAAQ,MAAM,SAAS,MAAMA;AAAA,QAClE;AAEA;AAAA,MAEF;AACE,sBAAc,SAAS,CAAC,QAAQ;AAC9B,gBAAM,CAAC,EAAED,QAAO,IAAI,IAAI,IAAI,MAAM,GAAG,EAAE,IAAI,MAAM;AAEjD,cAAI,CAAC,OAAO;AACV,oBAAO,+BAAO,gBAAeA,WAAS,+BAAO,eAAc;AAAA,UAC7D,OAAO;AACL,mBAAO,MAAM;AAAA,cACX,CAACC,YACCA,UAAA,gBAAAA,OAAO,gBAAeD,WAASC,UAAA,gBAAAA,OAAO,eAAc;AAAA,YACxD;AAAA,UACF;AAAA,QACF,CAAC;AAED;AAAA,IACJ;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AAET,kBAAgB,MAAM;AACpB,aAAS,SAAc;AAAA,EACzB,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,oBAAgC;AAAA,IACpC,CAAC,QAAQ,CAAC,GAAG,MAAM,UAAU;AAAA,MAC3B,GAAG;AAAA,MACH,GAAG;AAAA,MACH;AAAA,IACF;AAAA,IACA,CAAC,IAAI;AAAA,EACP;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":["type","year","month","value"]}