@optimum-intelligence/opti-ui 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -7
- package/dist/components/app-shell/AppShell.d.ts +75 -6
- package/dist/components/app-shell/AppShell.js +670 -185
- package/dist/components/app-shell/AppShell.js.map +1 -1
- package/dist/components/badge/Badge.d.ts +2 -4
- package/dist/components/badge/Badge.js +12 -29
- package/dist/components/badge/Badge.js.map +1 -1
- package/dist/components/calendar/Calendar.d.ts +19 -8
- package/dist/components/calendar/Calendar.js +285 -212
- package/dist/components/calendar/Calendar.js.map +1 -1
- package/dist/components/calendar/DateConfig.d.ts +37 -0
- package/dist/components/calendar/DateConfig.js +75 -0
- package/dist/components/calendar/DateConfig.js.map +1 -0
- package/dist/components/calendar/date-utils.d.ts +41 -6
- package/dist/components/calendar/date-utils.js +119 -20
- package/dist/components/calendar/date-utils.js.map +1 -1
- package/dist/components/data-table/DataTableContent.js +3 -3
- package/dist/components/data-table/DataTableContent.js.map +1 -1
- package/dist/components/date-picker/DatePicker.d.ts +33 -10
- package/dist/components/date-picker/DatePicker.js +315 -279
- package/dist/components/date-picker/DatePicker.js.map +1 -1
- package/dist/components/date-picker/DateRangePicker.d.ts +11 -4
- package/dist/components/date-picker/DateRangePicker.js +240 -206
- package/dist/components/date-picker/DateRangePicker.js.map +1 -1
- package/dist/components/date-picker/PickerField.js +1 -1
- package/dist/components/date-picker/PickerField.js.map +1 -1
- package/dist/components/table/Table.d.ts +1 -1
- package/dist/components/table/Table.js +2 -2
- package/dist/components/table/Table.js.map +1 -1
- package/dist/components.json +2023 -1864
- package/dist/index.d.ts +1 -0
- package/dist/index.js +4 -3
- package/dist/llms-full.txt +869 -752
- package/dist/llms.txt +37 -35
- package/dist/opti-ui.css +171 -81
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Calendar.js","names":["React","cx","ChevronLeftIcon","ChevronRightIcon","addDays","addMonths","clampDate","datePart","formatDate","formatDateLong","monthGrid","pad","startOfMonth","toRange","toUtcDate","todayIso","weekday","DateRange","CalendarLabels","previousMonth","nextMonth","previousYear","nextYear","previousYears","nextYears","chooseMonth","chooseYear","defaultLabels","Chooser","index","mode","cursor","YEARS","yearOf","date","Number","slice","monthNumber","CalendarOptions","Omit","HTMLAttributes","HTMLDivElement","ref","Ref","min","max","isDateDisabled","defaultMonth","locale","weekStartsOn","numberOfMonths","autoFocus","labels","Partial","DayState","selected","inRange","rangeStart","rangeEnd","CalendarViewProps","target","dayState","onPick","onPreview","multiselectable","reveal","view","count","month","chooserItems","year","Array","from","length","_","start","Math","floor","offset","filter","item","map","CalendarView","t0","$","_c","className","props","t1","t2","undefined","t3","text","today","useState","t4","focused","setFocused","t5","setView","monthsRef","useRef","moveFocus","Boolean","titleId","useId","chooser","setChooser","seen","setSeen","t6","Symbol","for","current","months","querySelector","focus","t7","useEffect","t8","disabled","t10","t11","t12","t13","t14","t15","t9","formats","monthLong","Intl","DateTimeFormat","timeZone","weekdayShort","weekdayLong","yearText","_temp","go","date_1","next","page","amount","next_0","select","date_2","onKeyDown","event","next_1","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Home","End","PageUp","shiftKey","PageDown","move","key","preventDefault","day","earliest","latest","openChooser","closeChooser","moveChooser","amount_0","step","choose","current_0","date_3","next_2","onChooserKeyDown","current_1","event_0","stopPropagation","amount_1","months_0","index_0","previous","following","first","index_1","days","weeks","__0","week","choosing","choices","format","date_4","unit","unavailable","shown","date_5","week_0","date_6","outside","state","t16","t17","date_0","String","CalendarProps","value","defaultValue","onValueChange","Calendar","inner","setInner","RangeCalendarProps","rangeKey","range","end","RangeCalendar","anchor","setAnchor","preview","setPreview","setTarget","_c","_Fragment"],"sources":["../../../src/components/calendar/Calendar.tsx"],"sourcesContent":["import * as React from 'react';\nimport { cx } from '../../utils/cx';\nimport { ChevronLeftIcon, ChevronRightIcon } from '../../icons';\nimport {\n addDays,\n addMonths,\n clampDate,\n datePart,\n formatDate,\n formatDateLong,\n monthGrid,\n pad,\n startOfMonth,\n toRange,\n toUtcDate,\n todayIso,\n weekday,\n type DateRange,\n} from './date-utils';\n\nexport type { DateRange };\nexport { formatDate, formatDateLong };\n\nexport interface CalendarLabels {\n previousMonth: string;\n nextMonth: string;\n previousYear: string;\n nextYear: string;\n previousYears: string;\n nextYears: string;\n chooseMonth: string;\n chooseYear: string;\n}\n\nconst defaultLabels: CalendarLabels = {\n previousMonth: 'Previous month',\n nextMonth: 'Next month',\n previousYear: 'Previous year',\n nextYear: 'Next year',\n previousYears: 'Previous years',\n nextYears: 'Next years',\n chooseMonth: 'Choose month',\n chooseYear: 'Choose year',\n};\n\n/** The month or year list that replaces one month's day grid. */\ninterface Chooser {\n /** Which of the visible months it was opened from. */\n index: number;\n mode: 'months' | 'years';\n /** First day of the month that owns the list's tab stop. */\n cursor: string;\n}\n\n/** Years listed per page, in rows of three like the months. */\nconst YEARS = 12;\n\nconst yearOf = (date: string) => Number(date.slice(0, 4));\nconst monthNumber = (date: string) => yearOf(date) * 12 + Number(date.slice(5, 7));\n\ninterface CalendarOptions extends Omit<React.HTMLAttributes<HTMLDivElement>, 'defaultValue' | 'onChange'> {\n ref?: React.Ref<HTMLDivElement>;\n /** Earliest selectable day (ISO date). */\n min?: string;\n /** Latest selectable day (ISO date). */\n max?: string;\n /** Return true to make a day unselectable. */\n isDateDisabled?: (date: string) => boolean;\n /** Month shown first when there is no value (any ISO date in that month). */\n defaultMonth?: string;\n /** BCP 47 locale for month and weekday names. Defaults to the browser's. */\n locale?: string;\n /** First column: 0 = Sunday, 1 = Monday (default). */\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n /** Months shown side by side (default 1). */\n numberOfMonths?: number;\n /** Move focus to the selected day (or today) on mount, e.g. inside a popover. */\n autoFocus?: boolean;\n labels?: Partial<CalendarLabels>;\n}\n\ninterface DayState {\n selected?: boolean;\n inRange?: boolean;\n rangeStart?: boolean;\n rangeEnd?: boolean;\n}\n\ninterface CalendarViewProps extends CalendarOptions {\n /** Day the view opens on, and follows whenever it changes. */\n target: string | null;\n dayState: (date: string) => DayState;\n onPick: (date: string) => void;\n /** Reports the hovered or keyboard-focused day, and `null` when the pointer leaves. */\n onPreview?: (date: string | null) => void;\n multiselectable?: boolean;\n}\n\n/** The first visible month after moving `view` just enough to show `date`. */\nfunction reveal(view: string, date: string, count: number): string {\n const month = startOfMonth(date);\n if (month < view) return month;\n return month > addMonths(view, count - 1) ? addMonths(month, 1 - count) : view;\n}\n\n/** The months of the cursor's year, or the page of years around it. */\nfunction chooserItems({ mode, cursor }: Chooser): string[] {\n const year = yearOf(cursor);\n if (mode === 'months') return Array.from({ length: 12 }, (_, month) => `${cursor.slice(0, 5)}${pad(month + 1)}-01`);\n const start = Math.floor((year - 1) / YEARS) * YEARS + 1;\n return Array.from({ length: YEARS }, (_, offset) => start + offset)\n .filter((item) => item <= 9999)\n .map((item) => `${pad(item, 4)}${cursor.slice(4, 8)}01`);\n}\n\n/** Month grids, navigation and keyboard handling shared by Calendar and RangeCalendar. */\nfunction CalendarView({\n target,\n dayState,\n onPick,\n onPreview,\n multiselectable,\n min,\n max,\n isDateDisabled,\n defaultMonth,\n locale,\n weekStartsOn = 1,\n numberOfMonths = 1,\n autoFocus,\n labels,\n className,\n ref,\n ...props\n}: CalendarViewProps) {\n const text = { ...defaultLabels, ...labels };\n const count = Math.max(1, Math.floor(numberOfMonths));\n const [today] = React.useState(todayIso);\n\n // The day that owns the grid's tab stop.\n const [focused, setFocused] = React.useState(() => clampDate(target ?? datePart(defaultMonth) ?? today, min, max));\n // The first visible month; it moves just enough to keep the focused day on screen.\n const [view, setView] = React.useState(() => startOfMonth(focused));\n const monthsRef = React.useRef<HTMLDivElement>(null);\n const moveFocus = React.useRef(Boolean(autoFocus));\n const titleId = React.useId();\n const [chooser, setChooser] = React.useState<Chooser | null>(null);\n\n // Follow the target when it changes from outside.\n const [seen, setSeen] = React.useState(target);\n if (target !== seen) {\n setSeen(target);\n if (target) {\n setFocused(target);\n setView(reveal(view, target, count));\n }\n }\n\n React.useEffect(() => {\n if (!moveFocus.current) return;\n moveFocus.current = false;\n const months = monthsRef.current;\n (\n months?.querySelector<HTMLElement>('.oui-calendar__choice[tabindex=\"0\"]') ??\n months?.querySelector<HTMLElement>('[tabindex=\"0\"]')\n )?.focus();\n }, [focused, chooser]);\n\n const disabled = (date: string) =>\n Boolean((min && date < min) || (max && date > max) || isDateDisabled?.(date));\n\n const formats = {\n monthLong: new Intl.DateTimeFormat(locale, { month: 'long', timeZone: 'UTC' }),\n month: new Intl.DateTimeFormat(locale, { month: 'short', timeZone: 'UTC' }),\n weekdayShort: new Intl.DateTimeFormat(locale, { weekday: 'short', timeZone: 'UTC' }),\n weekdayLong: new Intl.DateTimeFormat(locale, { weekday: 'long', timeZone: 'UTC' }),\n };\n\n const yearText = (date: string) => String(yearOf(date));\n\n const go = (date: string) => {\n const next = clampDate(date, min, max);\n moveFocus.current = true;\n setFocused(next);\n setView(reveal(view, next, count));\n return next;\n };\n\n // The navigation buttons page the view and carry the tab stop along without moving focus.\n const page = (amount: number) => {\n const next = clampDate(addMonths(focused, amount), min, max);\n setFocused(next);\n setView(reveal(addMonths(view, amount), next, count));\n };\n\n const select = (date: string) => {\n if (disabled(date)) return;\n go(date);\n onPick(date);\n };\n\n const onKeyDown = (event: React.KeyboardEvent) => {\n const offset = (weekday(focused) - weekStartsOn + 7) % 7;\n const next: Record<string, () => string> = {\n ArrowLeft: () => addDays(focused, -1),\n ArrowRight: () => addDays(focused, 1),\n ArrowUp: () => addDays(focused, -7),\n ArrowDown: () => addDays(focused, 7),\n Home: () => addDays(focused, -offset),\n End: () => addDays(focused, 6 - offset),\n PageUp: () => addMonths(focused, event.shiftKey ? -12 : -1),\n PageDown: () => addMonths(focused, event.shiftKey ? 12 : 1),\n };\n const move = next[event.key];\n if (!move) return;\n event.preventDefault();\n // Not inline: an absent onPreview would skip evaluating its argument, and with it the move.\n const day = go(move());\n onPreview?.(day);\n };\n\n // The months the chooser can reach.\n const earliest = startOfMonth(min ?? '0001-01-01');\n const latest = startOfMonth(max ?? '9999-12-01');\n\n const openChooser = (index: number, mode: Chooser['mode'], cursor: string) => {\n moveFocus.current = true;\n setChooser({ index, mode, cursor: clampDate(cursor, earliest, latest) });\n };\n\n const closeChooser = () => {\n moveFocus.current = true;\n setChooser(null);\n };\n\n const moveChooser = (current: Chooser, amount: number, focus: boolean) => {\n const step = current.mode === 'months' ? amount : amount * 12;\n // Stay within the years an ISO date can spell.\n if (monthNumber(current.cursor) + step < 13 || monthNumber(current.cursor) + step > 9999 * 12 + 12) return;\n moveFocus.current = focus;\n setChooser({ ...current, cursor: clampDate(addMonths(current.cursor, step), earliest, latest) });\n };\n\n const choose = (current: Chooser, date: string) => {\n if (current.mode === 'years') {\n openChooser(current.index, 'months', date);\n return;\n }\n // Keep the day of the month, and put the chosen month where the chooser was opened.\n const next = clampDate(addMonths(focused, monthNumber(date) - monthNumber(focused)), min, max);\n moveFocus.current = true;\n setFocused(next);\n setView(reveal(addMonths(date, -current.index), next, count));\n setChooser(null);\n };\n\n const onChooserKeyDown = (current: Chooser) => (event: React.KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n closeChooser();\n return;\n }\n const amount = { ArrowLeft: -1, ArrowRight: 1, ArrowUp: -3, ArrowDown: 3, PageUp: -YEARS, PageDown: YEARS }[event.key];\n if (!amount) return;\n event.preventDefault();\n moveChooser(current, amount, true);\n };\n\n const months = Array.from({ length: count }, (_, index) => addMonths(view, index));\n const previous = addDays(view, -1);\n const following = addMonths(view, count);\n\n return (\n <div ref={ref} className={cx('oui-calendar', className)} {...props}>\n <div\n ref={monthsRef}\n className=\"oui-calendar__months\"\n onPointerLeave={onPreview ? () => onPreview(null) : undefined}\n >\n {months.map((first, index) => {\n const days = monthGrid(first, weekStartsOn);\n const month = first.slice(0, 7);\n const weeks = Array.from({ length: 6 }, (_, week) => days.slice(week * 7, week * 7 + 7));\n const choosing = chooser?.index === index ? chooser : null;\n const choices = choosing ? chooserItems(choosing) : [];\n return (\n <div key={month} className=\"oui-calendar__month\">\n <div className=\"oui-calendar__header\">\n {choosing ? (\n <button\n type=\"button\"\n className=\"oui-calendar__nav\"\n aria-label={choosing.mode === 'months' ? text.previousYear : text.previousYears}\n disabled={choices[0].slice(0, 4) <= earliest.slice(0, 4)}\n onClick={() => moveChooser(choosing, -YEARS, false)}\n >\n <ChevronLeftIcon />\n </button>\n ) : index === 0 ? (\n <button\n type=\"button\"\n className=\"oui-calendar__nav\"\n aria-label={text.previousMonth}\n disabled={Boolean(min && previous < min)}\n onClick={() => page(-1)}\n >\n <ChevronLeftIcon />\n </button>\n ) : (\n <span className=\"oui-calendar__nav-spacer\" />\n )}\n <div id={`${titleId}-${index}`} className=\"oui-calendar__title\" aria-live=\"polite\">\n {!choosing ? (\n // Year first, as in the written date format: \"2026. March\".\n <>\n <button\n type=\"button\"\n className=\"oui-calendar__title-button\"\n title={text.chooseYear}\n onClick={() => openChooser(index, 'years', first)}\n >\n {yearText(first)}\n </button>\n {'. '}\n <button\n type=\"button\"\n className=\"oui-calendar__title-button\"\n title={text.chooseMonth}\n onClick={() => openChooser(index, 'months', first)}\n >\n {formats.monthLong.format(toUtcDate(first))}\n </button>\n </>\n ) : choosing.mode === 'months' ? (\n <button\n type=\"button\"\n className=\"oui-calendar__title-button\"\n title={text.chooseYear}\n onClick={() => openChooser(index, 'years', choosing.cursor)}\n >\n {yearText(choosing.cursor)}\n </button>\n ) : (\n `${yearText(choices[0])} – ${yearText(choices[choices.length - 1])}`\n )}\n </div>\n {choosing ? (\n <button\n type=\"button\"\n className=\"oui-calendar__nav\"\n aria-label={choosing.mode === 'months' ? text.nextYear : text.nextYears}\n disabled={choices[choices.length - 1].slice(0, 4) >= latest.slice(0, 4)}\n onClick={() => moveChooser(choosing, YEARS, false)}\n >\n <ChevronRightIcon />\n </button>\n ) : index === count - 1 ? (\n <button\n type=\"button\"\n className=\"oui-calendar__nav\"\n aria-label={text.nextMonth}\n disabled={Boolean(max && following > max)}\n onClick={() => page(1)}\n >\n <ChevronRightIcon />\n </button>\n ) : (\n <span className=\"oui-calendar__nav-spacer\" />\n )}\n </div>\n {choosing ? (\n <div\n role=\"group\"\n aria-labelledby={`${titleId}-${index}`}\n className=\"oui-calendar__choices\"\n onKeyDown={onChooserKeyDown(choosing)}\n >\n {choices.map((date) => {\n const unit = choosing.mode === 'months' ? 7 : 4;\n const key = date.slice(0, unit);\n const unavailable = key < earliest.slice(0, unit) || key > latest.slice(0, unit);\n const shown = key === first.slice(0, unit);\n return (\n <button\n key={date}\n type=\"button\"\n className=\"oui-calendar__choice\"\n tabIndex={key === choosing.cursor.slice(0, unit) ? 0 : -1}\n aria-pressed={shown}\n aria-disabled={unavailable || undefined}\n data-selected={shown ? '' : undefined}\n data-today={key === today.slice(0, unit) ? '' : undefined}\n data-disabled={unavailable ? '' : undefined}\n onClick={unavailable ? undefined : () => choose(choosing, date)}\n >\n {choosing.mode === 'months' ? formats.month.format(toUtcDate(date)) : yearText(date)}\n </button>\n );\n })}\n </div>\n ) : (\n <div\n role=\"grid\"\n aria-labelledby={`${titleId}-${index}`}\n aria-multiselectable={multiselectable || undefined}\n className=\"oui-calendar__grid\"\n onKeyDown={onKeyDown}\n >\n <div role=\"row\" className=\"oui-calendar__row\">\n {days.slice(0, 7).map((date) => (\n <span\n key={date}\n role=\"columnheader\"\n className=\"oui-calendar__weekday\"\n aria-label={formats.weekdayLong.format(toUtcDate(date))}\n >\n {formats.weekdayShort.format(toUtcDate(date))}\n </span>\n ))}\n </div>\n {weeks.map((week) => (\n <div key={week[0]} role=\"row\" className=\"oui-calendar__row\">\n {week.map((date) => {\n const outside = date.slice(0, 7) !== month;\n // Side by side, each day appears once: in its own month.\n if (outside && count > 1) return <span key={date} role=\"gridcell\" className=\"oui-calendar__blank\" />;\n const state = dayState(date);\n return (\n <button\n key={date}\n type=\"button\"\n role=\"gridcell\"\n className=\"oui-calendar__day\"\n tabIndex={date === focused ? 0 : -1}\n aria-label={`${formatDateLong(date, locale)}, ${formats.weekdayLong.format(toUtcDate(date))}`}\n aria-selected={Boolean(state.selected || state.inRange)}\n aria-current={date === today ? 'date' : undefined}\n aria-disabled={disabled(date) || undefined}\n data-selected={state.selected ? '' : undefined}\n data-in-range={state.inRange ? '' : undefined}\n data-range-start={state.rangeStart ? '' : undefined}\n data-range-end={state.rangeEnd ? '' : undefined}\n data-today={date === today ? '' : undefined}\n data-outside={outside ? '' : undefined}\n data-disabled={disabled(date) ? '' : undefined}\n onClick={() => select(date)}\n onPointerEnter={onPreview ? () => onPreview(date) : undefined}\n >\n {Number(date.slice(8))}\n </button>\n );\n })}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nexport interface CalendarProps extends CalendarOptions {\n /** Selected day as an ISO date (`\"2026-03-09\"`). */\n value?: string | null;\n /** Initially selected day (ISO date) when uncontrolled. */\n defaultValue?: string | null;\n /** Called with the picked day as an ISO date. */\n onValueChange?: (value: string) => void;\n}\n\n/**\n * Month grid for picking one day. Keyboard: arrows move by day / week,\n * Home / End jump within the week, PageUp / PageDown change month (with Shift: year).\n * The month and year in the title open a list to jump straight to another one.\n */\nexport function Calendar({ value, defaultValue = null, onValueChange, ...props }: CalendarProps) {\n const [inner, setInner] = React.useState(() => datePart(defaultValue));\n const selected = value === undefined ? inner : datePart(value);\n return (\n <CalendarView\n target={selected}\n dayState={(date) => ({ selected: date === selected })}\n {...props}\n onPick={(date) => {\n setInner(date);\n onValueChange?.(date);\n }}\n />\n );\n}\n\nexport interface RangeCalendarProps extends CalendarOptions {\n /** Selected days as ISO dates; both ends are inclusive. */\n value?: DateRange | null;\n /** Initially selected range when uncontrolled. */\n defaultValue?: DateRange | null;\n /** Called once both ends are picked, with `start` on or before `end`. */\n onValueChange?: (value: DateRange) => void;\n}\n\nconst rangeKey = (range: DateRange | null) => (range ? `${range.start}/${range.end}` : '');\n\n/**\n * Month grid for picking a range of days: the first pick sets one end, the\n * second completes the range (in either order). Same keyboard as Calendar.\n * Disabled days cannot be picked as an end but may fall inside a range.\n */\nexport function RangeCalendar({ value, defaultValue = null, onValueChange, ...props }: RangeCalendarProps) {\n const [inner, setInner] = React.useState(() => toRange(defaultValue?.start, defaultValue?.end));\n const range = value === undefined ? inner : toRange(value?.start, value?.end);\n // While one end is picked, the range runs from it to the hovered or focused day.\n const [anchor, setAnchor] = React.useState<string | null>(null);\n const [preview, setPreview] = React.useState<string | null>(null);\n const shown = anchor ? toRange(anchor, preview ?? anchor) : range;\n\n // Bring the range into view when it changes from outside, but not after a pick made here.\n const [seen, setSeen] = React.useState(() => rangeKey(range));\n const [target, setTarget] = React.useState(range?.start ?? null);\n if (rangeKey(range) !== seen) {\n setSeen(rangeKey(range));\n setTarget(range?.start ?? null);\n }\n\n const select = (date: string) => {\n if (!anchor) {\n setAnchor(date);\n setPreview(date);\n return;\n }\n const next = toRange(anchor, date);\n setAnchor(null);\n setPreview(null);\n if (!next) return;\n setInner(next);\n setSeen(rangeKey(next));\n onValueChange?.(next);\n };\n\n return (\n <CalendarView\n multiselectable\n data-selecting={anchor ? '' : undefined}\n target={target}\n dayState={(date) =>\n shown\n ? {\n selected: date === shown.start || date === shown.end,\n inRange: date >= shown.start && date <= shown.end,\n rangeStart: date === shown.start,\n rangeEnd: date === shown.end,\n }\n : {}\n }\n {...props}\n onPick={select}\n onPreview={(date) => {\n if (anchor) setPreview(date);\n }}\n />\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Calendar.js","names":["React","cx","ChevronLeftIcon","ChevronRightIcon","addDays","addMonths","clampDate","datePart","formatDate","monthGrid","pad","startOfMonth","toRange","toUtcDate","todayIso","truncate","weekday","DateGranularity","DateRange","FormatDateOptions","useDateConfig","CalendarGranularity","CalendarLabels","previousMonth","nextMonth","previousYear","nextYear","previousYears","nextYears","chooseMonth","chooseYear","defaultLabels","Chooser","index","mode","cursor","YEARS","yearOf","date","Number","slice","monthNumber","CalendarOptions","Omit","HTMLAttributes","HTMLDivElement","ref","Ref","min","max","isDateDisabled","defaultMonth","locale","weekStartsOn","granularity","numberOfMonths","autoFocus","labels","Partial","DayState","selected","inRange","rangeStart","rangeEnd","CalendarViewProps","target","dayState","onPick","onPreview","multiselectable","reveal","view","count","month","chooserItems","year","Array","from","length","_","start","Math","floor","offset","filter","item","map","CalendarView","t0","$","_c","className","localeProp","props","t1","t2","weekStartsOnProp","undefined","config","t3","text","today","useState","t4","focused","setFocused","t5","setView","monthsRef","useRef","moveFocus","Boolean","titleId","useId","t6","t7","earliest","t8","t9","latest","t10","baseChooser","t11","chooser","setChooser","seen","setSeen","t12","Symbol","for","current","months","querySelector","focus","t13","useEffect","t14","disabled","t15","t16","t17","t18","t19","t20","t21","formats","monthLong","Intl","DateTimeFormat","timeZone","weekdayShort","weekdayLong","dayLong","dateStyle","yearText","_temp","go","date_1","next","page","amount","next_0","select","date_2","onKeyDown","event","next_1","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Home","End","PageUp","shiftKey","PageDown","move","key","preventDefault","day","openChooser","cursor_0","closeChooser","moveChooser","amount_0","step","choose","current_0","date_3","next_2","onChooserKeyDown","current_1","event_0","stopPropagation","amount_1","months_0","index_0","previous","following","first","index_1","days","weeks","__0","week","choosing","choices","format","date_4","unit","unavailable","picking","state","date_5","week_0","date_6","outside","state_0","t22","t23","date_0","String","CalendarProps","value","defaultValue","onValueChange","cut","Calendar","inner","setInner","RangeCalendarProps","rangeKey","range","end","cutRange","RangeCalendar","anchor","setAnchor","preview","setPreview","shown","setTarget","_c","_Fragment"],"sources":["../../../src/components/calendar/Calendar.tsx"],"sourcesContent":["import * as React from 'react';\nimport { cx } from '../../utils/cx';\nimport { ChevronLeftIcon, ChevronRightIcon } from '../../icons';\nimport {\n addDays,\n addMonths,\n clampDate,\n datePart,\n formatDate,\n monthGrid,\n pad,\n startOfMonth,\n toRange,\n toUtcDate,\n todayIso,\n truncate,\n weekday,\n type DateGranularity,\n type DateRange,\n type FormatDateOptions,\n} from './date-utils';\nimport { useDateConfig } from './DateConfig';\n\nexport type { DateRange, DateGranularity, FormatDateOptions };\nexport { formatDate };\n\n/** The units a calendar grid can pick: days, whole months or whole years. */\nexport type CalendarGranularity = 'year' | 'month' | 'day';\n\nexport interface CalendarLabels {\n previousMonth: string;\n nextMonth: string;\n previousYear: string;\n nextYear: string;\n previousYears: string;\n nextYears: string;\n chooseMonth: string;\n chooseYear: string;\n}\n\nconst defaultLabels: CalendarLabels = {\n previousMonth: 'Previous month',\n nextMonth: 'Next month',\n previousYear: 'Previous year',\n nextYear: 'Next year',\n previousYears: 'Previous years',\n nextYears: 'Next years',\n chooseMonth: 'Choose month',\n chooseYear: 'Choose year',\n};\n\n/** The month or year list that replaces one month's day grid. */\ninterface Chooser {\n /** Which of the visible months it was opened from. */\n index: number;\n mode: 'months' | 'years';\n /** First day of the month that owns the list's tab stop. */\n cursor: string;\n}\n\n/** Years listed per page, in rows of three like the months. */\nconst YEARS = 12;\n\nconst yearOf = (date: string) => Number(date.slice(0, 4));\nconst monthNumber = (date: string) => yearOf(date) * 12 + Number(date.slice(5, 7));\n\ninterface CalendarOptions extends Omit<React.HTMLAttributes<HTMLDivElement>, 'defaultValue' | 'onChange'> {\n ref?: React.Ref<HTMLDivElement>;\n /** Earliest selectable day (ISO date). */\n min?: string;\n /** Latest selectable day (ISO date). */\n max?: string;\n /** Return true to make a day unselectable. */\n isDateDisabled?: (date: string) => boolean;\n /** Month shown first when there is no value (any ISO date in that month). */\n defaultMonth?: string;\n /** BCP 47 locale for month and weekday names. Defaults to `DateConfigProvider`, then the browser's. */\n locale?: string;\n /**\n * First column: 0 = Sunday, 1 = Monday. Defaults to `DateConfigProvider`.\n * @default 1\n */\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n /** What a pick selects: a day from the month grid, a month (as its 1st day) from a month grid, or a year (as 1 January) from a year grid. */\n granularity?: CalendarGranularity;\n /** Months shown side by side (default 1). */\n numberOfMonths?: number;\n /** Move focus to the selected day (or today) on mount, e.g. inside a popover. */\n autoFocus?: boolean;\n labels?: Partial<CalendarLabels>;\n}\n\ninterface DayState {\n selected?: boolean;\n inRange?: boolean;\n rangeStart?: boolean;\n rangeEnd?: boolean;\n}\n\ninterface CalendarViewProps extends CalendarOptions {\n /** Day the view opens on, and follows whenever it changes. */\n target: string | null;\n dayState: (date: string) => DayState;\n onPick: (date: string) => void;\n /** Reports the hovered or keyboard-focused day, and `null` when the pointer leaves. */\n onPreview?: (date: string | null) => void;\n multiselectable?: boolean;\n}\n\n/** The first visible month after moving `view` just enough to show `date`. */\nfunction reveal(view: string, date: string, count: number): string {\n const month = startOfMonth(date);\n if (month < view) return month;\n return month > addMonths(view, count - 1) ? addMonths(month, 1 - count) : view;\n}\n\n/** The months of the cursor's year, or the page of years around it. */\nfunction chooserItems({ mode, cursor }: Chooser): string[] {\n const year = yearOf(cursor);\n if (mode === 'months') return Array.from({ length: 12 }, (_, month) => `${cursor.slice(0, 5)}${pad(month + 1)}-01`);\n const start = Math.floor((year - 1) / YEARS) * YEARS + 1;\n return Array.from({ length: YEARS }, (_, offset) => start + offset)\n .filter((item) => item <= 9999)\n .map((item) => `${pad(item, 4)}${cursor.slice(4, 8)}01`);\n}\n\n/** Month grids, navigation and keyboard handling shared by Calendar and RangeCalendar. */\nfunction CalendarView({\n target,\n dayState,\n onPick,\n onPreview,\n multiselectable,\n min,\n max,\n isDateDisabled,\n defaultMonth,\n locale: localeProp,\n weekStartsOn: weekStartsOnProp,\n granularity = 'day',\n numberOfMonths = 1,\n autoFocus,\n labels,\n className,\n ref,\n ...props\n}: CalendarViewProps) {\n const config = useDateConfig();\n const locale = localeProp ?? config.locale;\n const weekStartsOn = weekStartsOnProp ?? config.weekStartsOn ?? 1;\n const text = { ...defaultLabels, ...labels };\n // Month and year grids show one list at a time.\n const count = granularity === 'day' ? Math.max(1, Math.floor(numberOfMonths)) : 1;\n const [today] = React.useState(todayIso);\n\n // The day that owns the grid's tab stop.\n const [focused, setFocused] = React.useState(() => clampDate(target ?? datePart(defaultMonth) ?? today, min, max));\n // The first visible month; it moves just enough to keep the focused day on screen.\n const [view, setView] = React.useState(() => startOfMonth(focused));\n const monthsRef = React.useRef<HTMLDivElement>(null);\n const moveFocus = React.useRef(Boolean(autoFocus));\n const titleId = React.useId();\n // The months the chooser can reach.\n const earliest = startOfMonth(min ?? '0001-01-01');\n const latest = startOfMonth(max ?? '9999-12-01');\n // With a month or year granularity the list is the calendar itself, not a detour.\n const baseChooser = (cursor: string): Chooser | null =>\n granularity === 'day'\n ? null\n : { index: 0, mode: granularity === 'year' ? 'years' : 'months', cursor: clampDate(startOfMonth(cursor), earliest, latest) };\n const [chooser, setChooser] = React.useState<Chooser | null>(() => baseChooser(focused));\n\n // Follow the target when it changes from outside.\n const [seen, setSeen] = React.useState(target);\n if (target !== seen) {\n setSeen(target);\n if (target) {\n setFocused(target);\n setView(reveal(view, target, count));\n if (granularity !== 'day') setChooser(baseChooser(target));\n }\n }\n\n React.useEffect(() => {\n if (!moveFocus.current) return;\n moveFocus.current = false;\n const months = monthsRef.current;\n (\n months?.querySelector<HTMLElement>('.oui-calendar__choice[tabindex=\"0\"]') ??\n months?.querySelector<HTMLElement>('[tabindex=\"0\"]')\n )?.focus();\n }, [focused, chooser]);\n\n const disabled = (date: string) =>\n Boolean((min && date < min) || (max && date > max) || isDateDisabled?.(date));\n\n const formats = {\n monthLong: new Intl.DateTimeFormat(locale, { month: 'long', timeZone: 'UTC' }),\n month: new Intl.DateTimeFormat(locale, { month: 'short', timeZone: 'UTC' }),\n weekdayShort: new Intl.DateTimeFormat(locale, { weekday: 'short', timeZone: 'UTC' }),\n weekdayLong: new Intl.DateTimeFormat(locale, { weekday: 'long', timeZone: 'UTC' }),\n dayLong: new Intl.DateTimeFormat(locale, { dateStyle: 'full', timeZone: 'UTC' }),\n };\n\n const yearText = (date: string) => String(yearOf(date));\n\n const go = (date: string) => {\n const next = clampDate(date, min, max);\n moveFocus.current = true;\n setFocused(next);\n setView(reveal(view, next, count));\n return next;\n };\n\n // The navigation buttons page the view and carry the tab stop along without moving focus.\n const page = (amount: number) => {\n const next = clampDate(addMonths(focused, amount), min, max);\n setFocused(next);\n setView(reveal(addMonths(view, amount), next, count));\n };\n\n const select = (date: string) => {\n if (disabled(date)) return;\n go(date);\n onPick(date);\n };\n\n const onKeyDown = (event: React.KeyboardEvent) => {\n const offset = (weekday(focused) - weekStartsOn + 7) % 7;\n const next: Record<string, () => string> = {\n ArrowLeft: () => addDays(focused, -1),\n ArrowRight: () => addDays(focused, 1),\n ArrowUp: () => addDays(focused, -7),\n ArrowDown: () => addDays(focused, 7),\n Home: () => addDays(focused, -offset),\n End: () => addDays(focused, 6 - offset),\n PageUp: () => addMonths(focused, event.shiftKey ? -12 : -1),\n PageDown: () => addMonths(focused, event.shiftKey ? 12 : 1),\n };\n const move = next[event.key];\n if (!move) return;\n event.preventDefault();\n // Not inline: an absent onPreview would skip evaluating its argument, and with it the move.\n const day = go(move());\n onPreview?.(day);\n };\n\n const openChooser = (index: number, mode: Chooser['mode'], cursor: string) => {\n moveFocus.current = true;\n setChooser({ index, mode, cursor: clampDate(cursor, earliest, latest) });\n };\n\n const closeChooser = () => {\n moveFocus.current = true;\n setChooser(baseChooser(chooser?.cursor ?? focused));\n };\n\n const moveChooser = (current: Chooser, amount: number, focus: boolean) => {\n const step = current.mode === 'months' ? amount : amount * 12;\n // Stay within the years an ISO date can spell.\n if (monthNumber(current.cursor) + step < 13 || monthNumber(current.cursor) + step > 9999 * 12 + 12) return;\n moveFocus.current = focus;\n setChooser({ ...current, cursor: clampDate(addMonths(current.cursor, step), earliest, latest) });\n };\n\n const choose = (current: Chooser, date: string) => {\n if (granularity !== 'day' && current.mode === (granularity === 'year' ? 'years' : 'months')) {\n setFocused(date);\n onPick(date);\n return;\n }\n if (current.mode === 'years') {\n openChooser(current.index, 'months', date);\n return;\n }\n // Keep the day of the month, and put the chosen month where the chooser was opened.\n const next = clampDate(addMonths(focused, monthNumber(date) - monthNumber(focused)), min, max);\n moveFocus.current = true;\n setFocused(next);\n setView(reveal(addMonths(date, -current.index), next, count));\n setChooser(null);\n };\n\n const onChooserKeyDown = (current: Chooser) => (event: React.KeyboardEvent) => {\n // Escape steps back from the year list to the month list; from the base list it closes the popover.\n if (event.key === 'Escape' && !(granularity === 'year' || (granularity === 'month' && current.mode === 'months'))) {\n event.preventDefault();\n event.stopPropagation();\n closeChooser();\n return;\n }\n const amount = { ArrowLeft: -1, ArrowRight: 1, ArrowUp: -3, ArrowDown: 3, PageUp: -YEARS, PageDown: YEARS }[event.key];\n if (!amount) return;\n event.preventDefault();\n moveChooser(current, amount, true);\n };\n\n const months = Array.from({ length: count }, (_, index) => addMonths(view, index));\n const previous = addDays(view, -1);\n const following = addMonths(view, count);\n\n return (\n <div ref={ref} className={cx('oui-calendar', className)} {...props}>\n <div\n ref={monthsRef}\n className=\"oui-calendar__months\"\n onPointerLeave={onPreview ? () => onPreview(null) : undefined}\n >\n {months.map((first, index) => {\n const days = monthGrid(first, weekStartsOn);\n const month = first.slice(0, 7);\n const weeks = Array.from({ length: 6 }, (_, week) => days.slice(week * 7, week * 7 + 7));\n const choosing = chooser?.index === index ? chooser : null;\n const choices = choosing ? chooserItems(choosing) : [];\n return (\n <div key={month} className=\"oui-calendar__month\">\n <div className=\"oui-calendar__header\">\n {choosing ? (\n <button\n type=\"button\"\n className=\"oui-calendar__nav\"\n aria-label={choosing.mode === 'months' ? text.previousYear : text.previousYears}\n disabled={choices[0].slice(0, 4) <= earliest.slice(0, 4)}\n onClick={() => moveChooser(choosing, -YEARS, false)}\n >\n <ChevronLeftIcon />\n </button>\n ) : index === 0 ? (\n <button\n type=\"button\"\n className=\"oui-calendar__nav\"\n aria-label={text.previousMonth}\n disabled={Boolean(min && previous < min)}\n onClick={() => page(-1)}\n >\n <ChevronLeftIcon />\n </button>\n ) : (\n <span className=\"oui-calendar__nav-spacer\" />\n )}\n <div id={`${titleId}-${index}`} className=\"oui-calendar__title\" aria-live=\"polite\">\n {!choosing ? (\n // Year first, as in the written date format: \"2026. March\".\n <>\n <button\n type=\"button\"\n className=\"oui-calendar__title-button\"\n title={text.chooseYear}\n onClick={() => openChooser(index, 'years', first)}\n >\n {yearText(first)}\n </button>\n {'. '}\n <button\n type=\"button\"\n className=\"oui-calendar__title-button\"\n title={text.chooseMonth}\n onClick={() => openChooser(index, 'months', first)}\n >\n {formats.monthLong.format(toUtcDate(first))}\n </button>\n </>\n ) : choosing.mode === 'months' ? (\n <button\n type=\"button\"\n className=\"oui-calendar__title-button\"\n title={text.chooseYear}\n onClick={() => openChooser(index, 'years', choosing.cursor)}\n >\n {yearText(choosing.cursor)}\n </button>\n ) : (\n `${yearText(choices[0])} – ${yearText(choices[choices.length - 1])}`\n )}\n </div>\n {choosing ? (\n <button\n type=\"button\"\n className=\"oui-calendar__nav\"\n aria-label={choosing.mode === 'months' ? text.nextYear : text.nextYears}\n disabled={choices[choices.length - 1].slice(0, 4) >= latest.slice(0, 4)}\n onClick={() => moveChooser(choosing, YEARS, false)}\n >\n <ChevronRightIcon />\n </button>\n ) : index === count - 1 ? (\n <button\n type=\"button\"\n className=\"oui-calendar__nav\"\n aria-label={text.nextMonth}\n disabled={Boolean(max && following > max)}\n onClick={() => page(1)}\n >\n <ChevronRightIcon />\n </button>\n ) : (\n <span className=\"oui-calendar__nav-spacer\" />\n )}\n </div>\n {choosing ? (\n <div\n role=\"group\"\n aria-labelledby={`${titleId}-${index}`}\n className=\"oui-calendar__choices\"\n onKeyDown={onChooserKeyDown(choosing)}\n >\n {choices.map((date) => {\n const unit = choosing.mode === 'months' ? 7 : 4;\n const key = date.slice(0, unit);\n const unavailable = key < earliest.slice(0, unit) || key > latest.slice(0, unit);\n // In a month or year calendar the list holds the value; otherwise it marks the month on show.\n const picking = granularity !== 'day' && choosing.mode === (granularity === 'year' ? 'years' : 'months');\n const state: DayState = picking\n ? dayState(unit === 4 ? `${key}-01-01` : `${key}-01`)\n : { selected: key === first.slice(0, unit) };\n return (\n <button\n key={date}\n type=\"button\"\n className=\"oui-calendar__choice\"\n tabIndex={key === choosing.cursor.slice(0, unit) ? 0 : -1}\n aria-pressed={Boolean(state.selected || state.inRange)}\n aria-disabled={unavailable || undefined}\n data-selected={state.selected ? '' : undefined}\n data-in-range={state.inRange ? '' : undefined}\n data-range-start={state.rangeStart ? '' : undefined}\n data-range-end={state.rangeEnd ? '' : undefined}\n data-today={key === today.slice(0, unit) ? '' : undefined}\n data-disabled={unavailable ? '' : undefined}\n onClick={unavailable ? undefined : () => choose(choosing, date)}\n onPointerEnter={picking && onPreview ? () => onPreview(unit === 4 ? `${key}-01-01` : `${key}-01`) : undefined}\n >\n {choosing.mode === 'months' ? formats.month.format(toUtcDate(date)) : yearText(date)}\n </button>\n );\n })}\n </div>\n ) : (\n <div\n role=\"grid\"\n aria-labelledby={`${titleId}-${index}`}\n aria-multiselectable={multiselectable || undefined}\n className=\"oui-calendar__grid\"\n onKeyDown={onKeyDown}\n >\n <div role=\"row\" className=\"oui-calendar__row\">\n {days.slice(0, 7).map((date) => (\n <span\n key={date}\n role=\"columnheader\"\n className=\"oui-calendar__weekday\"\n aria-label={formats.weekdayLong.format(toUtcDate(date))}\n >\n {formats.weekdayShort.format(toUtcDate(date))}\n </span>\n ))}\n </div>\n {weeks.map((week) => (\n <div key={week[0]} role=\"row\" className=\"oui-calendar__row\">\n {week.map((date) => {\n const outside = date.slice(0, 7) !== month;\n // Side by side, each day appears once: in its own month.\n if (outside && count > 1) return <span key={date} role=\"gridcell\" className=\"oui-calendar__blank\" />;\n const state = dayState(date);\n return (\n <button\n key={date}\n type=\"button\"\n role=\"gridcell\"\n className=\"oui-calendar__day\"\n tabIndex={date === focused ? 0 : -1}\n aria-label={formats.dayLong.format(toUtcDate(date))}\n aria-selected={Boolean(state.selected || state.inRange)}\n aria-current={date === today ? 'date' : undefined}\n aria-disabled={disabled(date) || undefined}\n data-selected={state.selected ? '' : undefined}\n data-in-range={state.inRange ? '' : undefined}\n data-range-start={state.rangeStart ? '' : undefined}\n data-range-end={state.rangeEnd ? '' : undefined}\n data-today={date === today ? '' : undefined}\n data-outside={outside ? '' : undefined}\n data-disabled={disabled(date) ? '' : undefined}\n onClick={() => select(date)}\n onPointerEnter={onPreview ? () => onPreview(date) : undefined}\n >\n {Number(date.slice(8))}\n </button>\n );\n })}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nexport interface CalendarProps extends CalendarOptions {\n /** Selected day as an ISO date (`\"2026-03-09\"`). With a month or year `granularity`, the day it falls in is enough. */\n value?: string | null;\n /** Initially selected day (ISO date) when uncontrolled. */\n defaultValue?: string | null;\n /** Called with the picked day as an ISO date: the 1st of the month, or 1 January, for a month or year `granularity`. */\n onValueChange?: (value: string) => void;\n}\n\n/** A date cut down to the calendar's unit, or `null`. */\nconst cut = (value: string | null | undefined, granularity: CalendarGranularity = 'day') => {\n const date = datePart(value);\n return date && truncate(date, granularity);\n};\n\n/**\n * Month grid for picking one day. Keyboard: arrows move by day / week,\n * Home / End jump within the week, PageUp / PageDown change month (with Shift: year).\n * The month and year in the title open a list to jump straight to another one.\n * With `granularity=\"month\"` or `\"year\"` it shows a month or year grid instead.\n *\n * @example\n * <Calendar value={month} onValueChange={setMonth} granularity=\"month\" />\n */\nexport function Calendar({ value, defaultValue = null, onValueChange, ...props }: CalendarProps) {\n const [inner, setInner] = React.useState(() => cut(defaultValue, props.granularity));\n const selected = value === undefined ? inner : cut(value, props.granularity);\n return (\n <CalendarView\n target={selected}\n dayState={(date) => ({ selected: date === selected })}\n {...props}\n onPick={(date) => {\n setInner(date);\n onValueChange?.(date);\n }}\n />\n );\n}\n\nexport interface RangeCalendarProps extends CalendarOptions {\n /** Selected days as ISO dates; both ends are inclusive. With a month or year `granularity`, each end is the 1st day of its month or year. */\n value?: DateRange | null;\n /** Initially selected range when uncontrolled. */\n defaultValue?: DateRange | null;\n /** Called once both ends are picked, with `start` on or before `end`. */\n onValueChange?: (value: DateRange) => void;\n}\n\nconst rangeKey = (range: DateRange | null) => (range ? `${range.start}/${range.end}` : '');\n\nconst cutRange = (range: DateRange | null | undefined, granularity?: CalendarGranularity) =>\n toRange(cut(range?.start, granularity), cut(range?.end, granularity));\n\n/**\n * Month grid for picking a range of days: the first pick sets one end, the\n * second completes the range (in either order). Same keyboard as Calendar.\n * Disabled days cannot be picked as an end but may fall inside a range.\n */\nexport function RangeCalendar({ value, defaultValue = null, onValueChange, ...props }: RangeCalendarProps) {\n const [inner, setInner] = React.useState(() => cutRange(defaultValue, props.granularity));\n const range = value === undefined ? inner : cutRange(value, props.granularity);\n // While one end is picked, the range runs from it to the hovered or focused day.\n const [anchor, setAnchor] = React.useState<string | null>(null);\n const [preview, setPreview] = React.useState<string | null>(null);\n const shown = anchor ? toRange(anchor, preview ?? anchor) : range;\n\n // Bring the range into view when it changes from outside, but not after a pick made here.\n const [seen, setSeen] = React.useState(() => rangeKey(range));\n const [target, setTarget] = React.useState(range?.start ?? null);\n if (rangeKey(range) !== seen) {\n setSeen(rangeKey(range));\n setTarget(range?.start ?? null);\n }\n\n const select = (date: string) => {\n if (!anchor) {\n setAnchor(date);\n setPreview(date);\n return;\n }\n const next = toRange(anchor, date);\n setAnchor(null);\n setPreview(null);\n if (!next) return;\n setInner(next);\n setSeen(rangeKey(next));\n onValueChange?.(next);\n };\n\n return (\n <CalendarView\n multiselectable\n data-selecting={anchor ? '' : undefined}\n target={target}\n dayState={(date) =>\n shown\n ? {\n selected: date === shown.start || date === shown.end,\n inRange: date >= shown.start && date <= shown.end,\n rangeStart: date === shown.start,\n rangeEnd: date === shown.end,\n }\n : {}\n }\n {...props}\n onPick={select}\n onPreview={(date) => {\n if (anchor) setPreview(date);\n }}\n />\n );\n}\n"],"mappings":";;;;;;;;;AAwCA,IAAM+B,gBAAgC;CACpCR,eAAe;CACfC,WAAW;CACXC,cAAc;CACdC,UAAU;CACVC,eAAe;CACfC,WAAW;CACXC,aAAa;CACbC,YAAY;AACd;;AAYA,IAAMM,QAAQ;AAEd,IAAMC,UAAUC,SAAiBC,OAAOD,KAAKE,MAAM,GAAG,CAAC,CAAC;AACxD,IAAMC,eAAeH,SAAiBD,OAAOC,IAAI,IAAI,KAAKC,OAAOD,KAAKE,MAAM,GAAG,CAAC,CAAC;;AA8CjF,SAAS8B,OAAOC,MAAcjC,MAAckC,OAAuB;CACjE,MAAMC,QAAQ9D,aAAa2B,IAAI;CAC/B,IAAImC,QAAQF,MAAM,OAAOE;CACzB,OAAOA,QAAQpE,UAAUkE,MAAMC,QAAQ,CAAC,IAAInE,UAAUoE,OAAO,IAAID,KAAK,IAAID;AAC5E;;AAGA,SAASG,aAAa,EAAExC,MAAMC,UAA6B;CACzD,MAAMwC,OAAOtC,OAAOF,MAAM;CAC1B,IAAID,SAAS,UAAU,OAAO0C,MAAMC,KAAK,EAAEC,QAAQ,GAAG,IAAIC,GAAGN,UAAU,GAAGtC,OAAOK,MAAM,GAAG,CAAC,IAAI9B,IAAI+D,QAAQ,CAAC,EAAC,IAAK;CAClH,MAAMO,QAAQC,KAAKC,OAAOP,OAAO,KAAKvC,KAAK,IAAIA,QAAQ;CACvD,OAAOwC,MAAMC,KAAK,EAAEC,QAAQ1C,MAAM,IAAI2C,GAAGI,WAAWH,QAAQG,MAAM,CAAC,CAChEC,QAAQC,SAASA,QAAQ,IAAI,CAAC,CAC9BC,KAAKD,SAAS,GAAG3E,IAAI2E,MAAM,CAAC,IAAIlD,OAAOK,MAAM,GAAG,CAAC,EAAC,GAAI;AAC3D;;AAGA,SAAA+C,aAAAC,IAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAA,IAAAlC;CAAA,IAAAmC;CAAA,IAAAzB;CAAA,IAAAf;CAAA,IAAAD;CAAA,IAAAO;CAAA,IAAAmC;CAAA,IAAA3C;CAAA,IAAAD;CAAA,IAAAqB;CAAA,IAAAF;CAAA,IAAAC;CAAA,IAAAyB;CAAA,IAAA/C;CAAA,IAAAgD;CAAA,IAAAC;CAAA,IAAA9B;CAAA,IAAA+B;CAAA,IAAAP,EAAA,OAAAD,IAAA;EAAsB,CAAA,CAAAvB,QAAAC,UAAAC,QAAAC,WAAAC,iBAAArB,KAAAC,KAAAC,gBAAAC,cAAAC,QAAAwC,YAAAvC,cAAA2C,kBAAA1C,aAAAwC,IAAAvC,gBAAAwC,IAAAvC,WAAAC,QAAAkC,WAAA7C,KAAA,GAAA+C,SAAAL;EAmBFC,EAAA,KAAAD;EAAAC,EAAA,KAAAjC;EAAAiC,EAAA,KAAAE;EAAAF,EAAA,KAAAvB;EAAAuB,EAAA,KAAAtC;EAAAsC,EAAA,KAAAvC;EAAAuC,EAAA,KAAAhC;EAAAgC,EAAA,KAAAG;EAAAH,EAAA,KAAAxC;EAAAwC,EAAA,KAAAzC;EAAAyC,EAAA,MAAApB;EAAAoB,EAAA,MAAAtB;EAAAsB,EAAA,MAAArB;EAAAqB,EAAA,MAAAI;EAAAJ,EAAA,MAAA3C;EAAA2C,EAAA,MAAAK;EAAAL,EAAA,MAAAM;EAAAN,EAAA,MAAAxB;EAAAwB,EAAA,MAAAO;CAAA,OAAA;EAAAxC,YAAAiC,EAAA;EAAAE,YAAAF,EAAA;EAAAvB,WAAAuB,EAAA;EAAAtC,eAAAsC,EAAA;EAAAvC,iBAAAuC,EAAA;EAAAhC,SAAAgC,EAAA;EAAAG,aAAAH,EAAA;EAAAxC,MAAAwC,EAAA;EAAAzC,MAAAyC,EAAA;EAAApB,kBAAAoB,EAAA;EAAAtB,SAAAsB,EAAA;EAAArB,YAAAqB,EAAA;EAAAI,QAAAJ,EAAA;EAAA3C,MAAA2C,EAAA;EAAAK,KAAAL,EAAA;EAAAM,KAAAN,EAAA;EAAAxB,SAAAwB,EAAA;EAAAO,mBAAAP,EAAA;CAAA;CAPlB,MAAAnC,cAAAwC,OAAAG,KAAAA,IAAA,QAAAH;CACA,MAAAvC,iBAAAwC,OAAAE,KAAAA,IAAA,IAAAF;CAOA,MAAAG,SAAe9E,cAAc;CAC7B,MAAAgC,SAAewC,cAAcM,OAAM9C;CACnC,MAAAC,eAAqB2C,oBAAoBE,OAAM7C,gBAA1B;CAA6C,IAAA8C;CAAA,IAAAV,EAAA,QAAAhC,QAAA;EACrD0C,KAAA;GAAA,GAAKpE;GAAa,GAAK0B;EAAO;EAACgC,EAAA,MAAAhC;EAAAgC,EAAA,MAAAU;CAAA,OAAAA,KAAAV,EAAA;CAA5C,MAAAW,OAAaD;CAEb,MAAA3B,QAAclB,gBAAgB,QAAQ2B,KAAIhC,IAAK,GAAGgC,KAAIC,MAAO3B,cAAc,CAAK,IAAlE;CACd,MAAA,CAAA8C,SAAgBrG,MAAKsG,SAAUxF,QAAQ;CAAE,IAAAyF;CAAA,IAAAd,EAAA,QAAAtC,gBAAAsC,EAAA,QAAAxC,OAAAwC,EAAA,QAAAzC,OAAAyC,EAAA,QAAAxB,UAAAwB,EAAA,QAAAY,OAAA;EAGIE,WAAMjG,UAAU2D,UAAU1D,SAAS4C,YAAY,KAA/BkD,OAA2CrD,KAAKC,GAAG;EAACwC,EAAA,MAAAtC;EAAAsC,EAAA,MAAAxC;EAAAwC,EAAA,MAAAzC;EAAAyC,EAAA,MAAAxB;EAAAwB,EAAA,MAAAY;EAAAZ,EAAA,MAAAc;CAAA,OAAAA,KAAAd,EAAA;CAAjH,MAAA,CAAAe,SAAAC,cAA8BzG,MAAKsG,SAAUC,EAAoE;CAAE,IAAAG;CAAA,IAAAjB,EAAA,QAAAe,SAAA;EAE5EE,WAAM/F,aAAa6F,OAAO;EAACf,EAAA,MAAAe;EAAAf,EAAA,MAAAiB;CAAA,OAAAA,KAAAjB,EAAA;CAAlE,MAAA,CAAAlB,MAAAoC,WAAwB3G,MAAKsG,SAAUI,EAA2B;CAClE,MAAAE,YAAkB5G,MAAK6G,OAAwB,IAAI;CACnD,MAAAC,YAAkB9G,MAAK6G,OAAQE,QAAQvD,SAAS,CAAC;CACjD,MAAAwD,UAAgBhH,MAAKiH,MAAO;CAEE,MAAAC,KAAAlE,OAAA;CAAmB,IAAAmE;CAAA,IAAA1B,EAAA,QAAAyB,IAAA;EAAhCC,KAAAxG,aAAauG,EAAmB;EAACzB,EAAA,MAAAyB;EAAAzB,EAAA,MAAA0B;CAAA,OAAAA,KAAA1B,EAAA;CAAlD,MAAA2B,WAAiBD;CACW,MAAAE,KAAApE,OAAA;CAAmB,IAAAqE;CAAA,IAAA7B,EAAA,QAAA4B,IAAA;EAAhCC,KAAA3G,aAAa0G,EAAmB;EAAC5B,EAAA,MAAA4B;EAAA5B,EAAA,MAAA6B;CAAA,OAAAA,KAAA7B,EAAA;CAAhD,MAAA8B,SAAeD;CAAkC,IAAAE;CAAA,IAAA/B,EAAA,QAAA2B,YAAA3B,EAAA,QAAAnC,eAAAmC,EAAA,QAAA8B,QAAA;EAE7BC,OAAArF,WAClBmB,gBAAgB,QAAhB,OAAA;GAAArB,OAEa;GAACC,MAAQoB,gBAAgB,SAAhB,UAAA;GAA2CnB,QAAU7B,UAAUK,aAAawB,MAAM,GAAGiF,UAAUG,MAAM;EAAE;EAAC9B,EAAA,MAAA2B;EAAA3B,EAAA,MAAAnC;EAAAmC,EAAA,MAAA8B;EAAA9B,EAAA,MAAA+B;CAAA,OAAAA,MAAA/B,EAAA;CAHhI,MAAAgC,cAAoBD;CAG6G,IAAAE;CAAA,IAAAjC,EAAA,QAAAgC,eAAAhC,EAAA,QAAAe,SAAA;EACpEkB,YAAMD,YAAYjB,OAAO;EAACf,EAAA,MAAAgC;EAAAhC,EAAA,MAAAe;EAAAf,EAAA,MAAAiC;CAAA,OAAAA,MAAAjC,EAAA;CAAvF,MAAA,CAAAkC,SAAAC,cAA8B5H,MAAKsG,SAA0BoB,GAA0B;CAGvF,MAAA,CAAAG,MAAAC,WAAwB9H,MAAKsG,SAAUrC,MAAM;CAC7C,IAAIA,WAAW4D,MAAI;EACjBC,QAAQ7D,MAAM;EACd,IAAIA,QAAM;GACRwC,WAAWxC,MAAM;GACjB0C,QAAQrC,OAAOC,MAAMN,QAAQO,KAAK,CAAC;GACnC,IAAIlB,gBAAgB,OAAOsE,WAAWH,YAAYxD,MAAM,CAAC;EAAE;CAC5D;CACF,IAAA8D;CAAA,IAAAtC,EAAA,QAAAuC,OAAAC,IAAA,2BAAA,GAAA;EAEeF,YAAA;GACd,IAAI,CAACjB,UAASoB,SAAQ;GACtBpB,UAASoB,UAAW;GACpB,MAAAC,SAAevB,UAASsB;GACxB,CACEC,QAAMC,cAA6B,uCACgB,KAAnDD,QAAMC,cAA6B,kBAAgB,EAAA,EAC7CC,MAAC;EAAC;EACX5C,EAAA,MAAAsC;CAAA,OAAAA,MAAAtC,EAAA;CAAA,IAAA6C;CAAA,IAAA7C,EAAA,QAAAkC,WAAAlC,EAAA,QAAAe,SAAA;EAAE8B,MAAA,CAAC9B,SAASmB,OAAO;EAAClC,EAAA,MAAAkC;EAAAlC,EAAA,MAAAe;EAAAf,EAAA,MAAA6C;CAAA,OAAAA,MAAA7C,EAAA;CARrBzF,MAAKuI,UAAWR,KAQbO,GAAkB;CAAC,IAAAE;CAAA,IAAA/C,EAAA,QAAAvC,kBAAAuC,EAAA,QAAAxC,OAAAwC,EAAA,QAAAzC,KAAA;EAELwF,OAAAlG,SACfyE,QAAS/D,OAAOV,OAAOU,OAASC,OAAOX,OAAOW,OAAQC,iBAAiBZ,IAAI,CAAC;EAACmD,EAAA,MAAAvC;EAAAuC,EAAA,MAAAxC;EAAAwC,EAAA,MAAAzC;EAAAyC,EAAA,MAAA+C;CAAA,OAAAA,MAAA/C,EAAA;CAD/E,MAAAgD,WAAiBD;CAC+D,IAAAE;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAvD,EAAA,QAAAgC,eAAAhC,EAAA,QAAAkC,WAAAlC,EAAA,QAAAE,aAAAF,EAAA,QAAAjB,SAAAiB,EAAA,QAAAvB,YAAAuB,EAAA,QAAAgD,YAAAhD,EAAA,QAAA2B,YAAA3B,EAAA,QAAAe,WAAAf,EAAA,QAAAnC,eAAAmC,EAAA,QAAA8B,UAAA9B,EAAA,QAAArC,UAAAqC,EAAA,QAAAxC,OAAAwC,EAAA,QAAAzC,OAAAyC,EAAA,QAAApB,mBAAAoB,EAAA,QAAAtB,UAAAsB,EAAA,QAAArB,aAAAqB,EAAA,QAAAI,SAAAJ,EAAA,QAAA3C,OAAA2C,EAAA,QAAAW,QAAAX,EAAA,QAAAuB,WAAAvB,EAAA,QAAAY,SAAAZ,EAAA,QAAAlB,QAAAkB,EAAA,QAAApC,cAAA;EAEhF,MAAA4F,UAAgB;GAAAC,WACH,IAAIC,KAAIC,eAAgBhG,QAAQ;IAAAqB,OAAS;IAAM4E,UAAY;GAAM,CAAC;GAAC5E,OACvE,IAAI0E,KAAIC,eAAgBhG,QAAQ;IAAAqB,OAAS;IAAO4E,UAAY;GAAM,CAAC;GAACC,cAC7D,IAAIH,KAAIC,eAAgBhG,QAAQ;IAAApC,SAAW;IAAOqI,UAAY;GAAM,CAAC;GAACE,aACvE,IAAIJ,KAAIC,eAAgBhG,QAAQ;IAAApC,SAAW;IAAMqI,UAAY;GAAM,CAAC;GAACG,SACzE,IAAIL,KAAIC,eAAgBhG,QAAQ;IAAAqG,WAAa;IAAMJ,UAAY;GAAM,CAAC;EACjF;EAEA,MAAAK,WAAiBC;EAEjB,MAAAC,MAAWC,WAAA;GACT,MAAAC,OAAaxJ,UAAUgC,QAAMU,KAAKC,GAAG;GACrC6D,UAASoB,UAAW;GACpBzB,WAAWqD,IAAI;GACfnD,QAAQrC,OAAOC,MAAMuF,MAAMtF,KAAK,CAAC;GAAC,OAC3BsF;EAAI;EAIb,MAAAC,QAAaC,WAAA;GACX,MAAAC,SAAa3J,UAAUD,UAAUmG,SAASwD,MAAM,GAAGhH,KAAKC,GAAG;GAC3DwD,WAAWqD,MAAI;GACfnD,QAAQrC,OAAOjE,UAAUkE,MAAMyF,MAAM,GAAGF,QAAMtF,KAAK,CAAC;EAAC;EAGvD,MAAA0F,UAAeC,WAAA;GACb,IAAI1B,SAASnG,MAAI,GAAC;GAClBsH,GAAGtH,MAAI;GACP6B,OAAO7B,MAAI;EAAC;EAGd,MAAA8H,aAAkBC,UAAA;GAChB,MAAAlF,UAAgBnE,QAAQwF,OAAO,IAAInD,eAAe,KAAK;GAWvD,MAAA2H,OAAalB;IAV8BS,iBACxBnK,QAAQoG,SAAS,EAAE;IAACgE,kBACnBpK,QAAQoG,SAAS,CAAC;IAACiE,eACtBrK,QAAQoG,SAAS,EAAE;IAACkE,iBAClBtK,QAAQoG,SAAS,CAAC;IAACmE,YACxBvK,QAAQoG,SAAS,CAACrB,MAAM;IAACyF,WAC1BxK,QAAQoG,SAAS,IAAIrB,MAAM;IAAC0F,cACzBxK,UAAUmG,SAAS6D,MAAKS,WAAL,MAAA,EAAyB;IAACC,gBAC3C1K,UAAUmG,SAAS6D,MAAKS,WAAL,KAAA,CAAuB;GAE/ChB,EAAKO,MAAKY;GACvB,IAAI,CAACD,MAAI;GACTX,MAAKa,eAAgB;GAErB,MAAAC,MAAYvB,GAAGoB,KAAK,CAAC;GACrB5G,YAAY+G,GAAG;EAAC;EAGlB,MAAAC,eAAoBnJ,OAAAC,MAAAmJ,aAAA;GAClBvE,UAASoB,UAAW;GACpBN,WAAW;IAAA3F;IAAAC;IAAAC,QAAuB7B,UAAU6B,UAAQiF,UAAUG,MAAM;GAAE,CAAC;EAAC;EAG1E,MAAA+D,qBAAqB;GACnBxE,UAASoB,UAAW;GACpBN,WAAWH,YAAYE,SAAOxF,UAAPqE,OAA0B,CAAC;EAAC;EAGrD,MAAA+E,eAAoBrD,SAAAsD,UAAAnD,UAAA;GAClB,MAAAoD,OAAavD,QAAOhG,SAAU,WAAjBsJ,WAAqCxB,WAAS;GAE3D,IAAIvH,YAAYyF,QAAO/F,MAAO,IAAIsJ,OAAO,MAAMhJ,YAAYyF,QAAO/F,MAAO,IAAIsJ,OAAO,MAAc;GAClG3E,UAASoB,UAAWG;GACpBT,WAAW;IAAA,GAAKM;IAAO/F,QAAU7B,UAAUD,UAAU6H,QAAO/F,QAASsJ,IAAI,GAAGrE,UAAUG,MAAM;GAAE,CAAC;EAAC;EAGlG,MAAAmE,UAAeC,WAAAC,WAAA;GACb,IAAItI,gBAAgB,SAAS4E,UAAOhG,UAAWoB,gBAAgB,SAAhB,UAAA,WAA4C;IACzFmD,WAAWnE,MAAI;IACf6B,OAAO7B,MAAI;IAAC;GAAA;GAGd,IAAI4F,UAAOhG,SAAU,SAAO;IAC1BkJ,YAAYlD,UAAOjG,OAAQ,UAAUK,MAAI;IAAC;GAAA;GAI5C,MAAAuJ,SAAavL,UAAUD,UAAUmG,SAAS/D,YAAYH,MAAI,IAAIG,YAAY+D,OAAO,CAAC,GAAGxD,KAAKC,GAAG;GAC7F6D,UAASoB,UAAW;GACpBzB,WAAWqD,MAAI;GACfnD,QAAQrC,OAAOjE,UAAUiC,QAAM,CAAC4F,UAAOjG,KAAM,GAAG6H,QAAMtF,KAAK,CAAC;GAC5DoD,WAAW,IAAI;EAAC;EAGlB,MAAAkE,oBAAyBC,eAAsBC,YAAA;GAE7C,IAAI3B,QAAKY,QAAS,YAAd,EAA4B3H,gBAAgB,UAAWA,gBAAgB,WAAW4E,UAAOhG,SAAU,WAAU;IAC/GmI,QAAKa,eAAgB;IACrBb,QAAK4B,gBAAiB;IACtBX,aAAa;IAAC;GAAA;GAGhB,MAAAY,WAAe;IAAA3B,WAAa;IAAEC,YAAc;IAACC,SAAW;IAAEC,WAAa;IAACG,QAAU;IAAME,UAAY3I;GAAM,EAAEiI,QAAKY;GACjH,IAAI,CAACjB,UAAM;GACXK,QAAKa,eAAgB;GACrBK,YAAYrD,WAAS8B,UAAQ,IAAI;EAAC;EAGpC,MAAAmC,WAAevH,MAAKC,KAAM,EAAAC,QAAUN,MAAM,IAAGO,GAAAqH,YAAc/L,UAAUkE,MAAMtC,OAAK,CAAC;EACjF,MAAAoK,WAAiBjM,QAAQmE,MAAM,EAAE;EACjC,MAAA+H,YAAkBjM,UAAUkE,MAAMC,KAAK;EAG3B1B,MAAAA;EAAG,IAAA2C,EAAA,QAAAE,WAAA;GAAaoD,MAAA9I,GAAG,gBAAgB0F,SAAS;GAACF,EAAA,MAAAE;GAAAF,EAAA,MAAAsD;EAAA,OAAAA,MAAAtD,EAAA;EAAMI,MAAAA;EAEpDe,MAAAA;EACK+B,MAAA;EAAsB,IAAAlD,EAAA,QAAArB,WAAA;GAChBwE,MAAAxE,kBAAkBA,UAAU,IAAI,IAAhC6B,KAAAA;GAA6CR,EAAA,MAAArB;GAAAqB,EAAA,MAAAmD;EAAA,OAAAA,MAAAnD,EAAA;EAE5DoD,MAAAV,SAAM7C,KAAKiH,OAAAC,YAAA;GACV,MAAAC,OAAahM,UAAU8L,OAAOlJ,YAAY;GAC1C,MAAAoB,QAAc8H,MAAK/J,MAAO,GAAG,CAAC;GAC9B,MAAAkK,QAAc9H,MAAKC,KAAM,EAAAC,QAAU,EAAE,IAAG6H,KAAAC,SAAaH,KAAIjK,MAAOoK,OAAO,GAAGA,OAAO,IAAI,CAAC,CAAC;GACvF,MAAAC,WAAiBlF,SAAO1F,UAAYA,UAAnB0F,UAAA;GACjB,MAAAmF,UAAgBD,WAAWnI,aAAamI,QAAa,IAArC,CAAA;GAAuC,OAErD,qBAAA,OAAA;IAA2B,WAAA;IAA3B,UAAA,CACE,qBAAA,OAAA;KAAe,WAAA;KAAf,UAAA;MACGA,WACC,oBAAA,UAAA;OACO,MAAA;OACK,WAAA;OACE,cAAAA,SAAQ3K,SAAU,WAAWkE,KAAI3E,eAAgB2E,KAAIzE;OACvD,UAAAmL,QAAO,EAAG,CAAAtK,MAAO,GAAG,CAAC,KAAK4E,SAAQ5E,MAAO,GAAG,CAAC;OAC9C,eAAM+I,YAAYsB,UAAU,KAAQ,KAAK;OAElD,UAAA,oBAAC,iBAAD,CAAgB,CAAA;MACT,CAAA,IACP5K,YAAU,IACZ,oBAAA,UAAA;OACO,MAAA;OACK,WAAA;OACE,cAAAmE,KAAI7E;OACN,UAAAwF,QAAQ/D,OAAOqJ,WAAWrJ,GAAG;OAC9B,eAAM+G,KAAK,EAAE;OAEtB,UAAA,oBAAC,iBAAD,CAAgB,CAAA;MACT,CAAA,IAET,oBAAA,QAAA,EAAgB,WAAA,2BAA0B,CAAA;MAE5C,oBAAA,OAAA;OAAS,IAAA,GAAG/C,QAAO,GAAI/E;OAAmB,WAAA;OAAgC,aAAA;OACvE,UAAA,CAAC4K,WAAD,qBAAAsC,UAAA,EAAA,UAAA;QAGG,oBAAA,UAAA;SACO,MAAA;SACK,WAAA;SACH,OAAA/I,KAAItE;SACF,eAAMsJ,YAAYnJ,SAAO,SAASsK,KAAK;SAE/C7C,UAAAA,SAAS6C,KAAK;QACR,CAAA;QACR;QACD,oBAAA,UAAA;SACO,MAAA;SACK,WAAA;SACH,OAAAnG,KAAIvE;SACF,eAAMuJ,YAAYnJ,SAAO,UAAUsK,KAAK;SAEhDtD,UAAAA,QAAOC,UAAU6D,OAAQlM,UAAU0L,KAAK,CAAC;QACnC,CAAA;OAAA,EAAA,CAAA,IAETM,SAAQ3K,SAAU,WACpB,oBAAA,UAAA;QACO,MAAA;QACK,WAAA;QACH,OAAAkE,KAAItE;QACF,eAAMsJ,YAAYnJ,SAAO,SAAS4K,SAAQ1K,MAAO;QAEzDuH,UAAAA,SAASmD,SAAQ1K,MAAO;OAClB,CAAA,IARP,GAUCuH,SAASoD,QAAO,EAAG,EAAC,KAAMpD,SAASoD,QAAQA,QAAOhI,SAAU,EAAE;MAE/D,CAAA;MACL+H,WACC,oBAAA,UAAA;OACO,MAAA;OACK,WAAA;OACE,cAAAA,SAAQ3K,SAAU,WAAWkE,KAAI1E,WAAY0E,KAAIxE;OACnD,UAAAkL,QAAQA,QAAOhI,SAAU,EAAE,CAAAtC,MAAO,GAAG,CAAC,KAAK+E,OAAM/E,MAAO,GAAG,CAAC;OAC7D,eAAM+I,YAAYsB,UAAUzK,OAAO,KAAK;OAEjD,UAAA,oBAAC,kBAAD,CAAiB,CAAA;MACV,CAAA,IACPH,YAAUuC,QAAQ,IACpB,oBAAA,UAAA;OACO,MAAA;OACK,WAAA;OACE,cAAA4B,KAAI5E;OACN,UAAAuF,QAAQ9D,OAAOqJ,YAAYrJ,GAAG;OAC/B,eAAM8G,KAAK,CAAC;OAErB,UAAA,oBAAC,kBAAD,CAAiB,CAAA;MACV,CAAA,IAET,oBAAA,QAAA,EAAgB,WAAA,2BAA0B,CAAA;KAExC;IACL8C,CAAAA,GAAAA,WACC,oBAAA,OAAA;KACO,MAAA;KACY,mBAAA,GAAG7F,QAAO,GAAI/E;KACrB,WAAA;KACC,WAAA6J,iBAAiBe,QAAQ;KAEnCC,UAAAA,QAAOxH,KAAK0H,WAAA;MACX,MAAAC,OAAaJ,SAAQ3K,SAAU,WAAlB,IAAA;MACb,MAAA+I,MAAY3I,OAAIE,MAAO,GAAGyK,IAAI;MAC9B,MAAAC,cAAoBjC,MAAM7D,SAAQ5E,MAAO,GAAGyK,IAAI,KAAKhC,MAAM1D,OAAM/E,MAAO,GAAGyK,IAAI;MAE/E,MAAAE,UAAgB7J,gBAAgB,SAASuJ,SAAQ3K,UAAWoB,gBAAgB,SAAhB,UAAA;MAC5D,MAAA8J,QAAwBD,UACpBjJ,SAAS+I,SAAS,IAAT,GAAgBhC,IAAG,UAAnB,GAAiCA,IAAG,IACJ,IAFrB,EAAArH,UAERqH,QAAQsB,MAAK/J,MAAO,GAAGyK,IAAI,EAAE;MAAE,OAE7C,oBAAA,UAAA;OAEO,MAAA;OACK,WAAA;OACA,UAAAhC,QAAQ4B,SAAQ1K,OAAOK,MAAO,GAAGyK,IAAI,IAArC,IAAA;OACI,gBAAAlG,QAAQqG,MAAKxJ,YAAawJ,MAAKvJ,OAAQ;OACtC,iBAAAqJ,eAAAjH,KAAAA;OACA,iBAAAmH,MAAKxJ,WAAL,KAAAqC,KAAAA;OACA,iBAAAmH,MAAKvJ,UAAL,KAAAoC,KAAAA;OACG,oBAAAmH,MAAKtJ,aAAL,KAAAmC,KAAAA;OACF,kBAAAmH,MAAKrJ,WAAL,KAAAkC,KAAAA;OACJ,cAAAgF,QAAQ5E,MAAK7D,MAAO,GAAGyK,IAAI,IAA3B,KAAAhH,KAAAA;OACG,iBAAAiH,cAAA,KAAAjH,KAAAA;OACN,SAAAiH,cAAAjH,KAAAA,UAAgCyF,OAAOmB,UAAUvK,MAAI;OAC9C,gBAAA6K,WAAA/I,kBAA6BA,UAAU6I,SAAS,IAAT,GAAgBhC,IAAG,UAAnB,GAAiCA,IAAG,IAAK,IAAhFhF,KAAAA;OAEf4G,UAAAA,SAAQ3K,SAAU,WAAW+G,QAAOxE,MAAMsI,OAAQlM,UAAUyB,MAAI,CAAkB,IAAboH,SAASpH,MAAI;MAC5E,GAhBFA,MAgBE;KAAA,CAEZ;IACG,CAAA,IAEN,qBAAA,OAAA;KACO,MAAA;KACY,mBAAA,GAAG0E,QAAO,GAAI/E;KACT,wBAAAoC,mBAAA4B,KAAAA;KACZ,WAAA;KACCmE;KALb,UAAA,CAOE,oBAAA,OAAA;MAAU,MAAA;MAAgB,WAAA;MACvBqC,UAAAA,KAAIjK,MAAO,GAAG,CAAC,CAAC,CAAA8C,KAAK+H,WACpB,oBAAA,QAAA;OAEO,MAAA;OACK,WAAA;OACE,cAAApE,QAAOM,YAAYwD,OAAQlM,UAAUyB,MAAI,CAAC;OAErD2G,UAAAA,QAAOK,aAAayD,OAAQlM,UAAUyB,MAAI,CAAC;MACvC,GANAA,MAMA,CACR;KACG,CAAA,GACLoK,MAAKpH,KAAKgI,WACT,oBAAA,OAAA;MAAwB,MAAA;MAAgB,WAAA;MACrCV,UAAAA,OAAItH,KAAKiI,WAAA;OACR,MAAAC,UAAgBlL,OAAIE,MAAO,GAAG,CAAC,MAAMiC;OAErC,IAAI+I,WAAWhJ,QAAQ,GAAC,OAAS,oBAAA,QAAA;QAAsB,MAAA;QAAqB,WAAA;OAAqB,GAArDlC,MAAqD;OACjG,MAAAmL,UAAcvJ,SAAS5B,MAAI;OAAE,OAE3B,oBAAA,UAAA;QAEO,MAAA;QACA,MAAA;QACK,WAAA;QACA,UAAAA,WAASkE,UAAT,IAAA;QACE,cAAAyC,QAAOO,QAAQuD,OAAQlM,UAAUyB,MAAI,CAAC;QACnC,iBAAAyE,QAAQqG,QAAKxJ,YAAawJ,QAAKvJ,OAAQ;QACxC,gBAAAvB,WAAS+D,QAAT,SAAAJ,KAAAA;QACC,iBAAAwC,SAASnG,MAAiB,KAA1B2D,KAAAA;QACA,iBAAAmH,QAAKxJ,WAAL,KAAAqC,KAAAA;QACA,iBAAAmH,QAAKvJ,UAAL,KAAAoC,KAAAA;QACG,oBAAAmH,QAAKtJ,aAAL,KAAAmC,KAAAA;QACF,kBAAAmH,QAAKrJ,WAAL,KAAAkC,KAAAA;QACJ,cAAA3D,WAAS+D,QAAT,KAAAJ,KAAAA;QACE,gBAAAuH,UAAA,KAAAvH,KAAAA;QACC,iBAAAwC,SAASnG,MAAqB,IAA9B,KAAA2D,KAAAA;QACN,eAAMiE,OAAO5H,MAAI;QACV,gBAAA8B,kBAAkBA,UAAU9B,MAAI,IAAhC2D,KAAAA;QAEf1D,UAAAA,OAAOD,OAAIE,MAAO,CAAC,CAAC;OACd,GApBFF,MAoBE;MAAA,CAEZ;KACG,GA/BIsK,OAAI,EA+BR,CACP,CACG;IAEJ,CAAA,CAAA;GAlLInI,GAAAA,KAkLJ;EAAA,CAET;EAACgB,EAAA,MAAAgC;EAAAhC,EAAA,MAAAkC;EAAAlC,EAAA,MAAAE;EAAAF,EAAA,MAAAjB;EAAAiB,EAAA,MAAAvB;EAAAuB,EAAA,MAAAgD;EAAAhD,EAAA,MAAA2B;EAAA3B,EAAA,MAAAe;EAAAf,EAAA,MAAAnC;EAAAmC,EAAA,MAAA8B;EAAA9B,EAAA,MAAArC;EAAAqC,EAAA,MAAAxC;EAAAwC,EAAA,MAAAzC;EAAAyC,EAAA,MAAApB;EAAAoB,EAAA,MAAAtB;EAAAsB,EAAA,MAAArB;EAAAqB,EAAA,MAAAI;EAAAJ,EAAA,MAAA3C;EAAA2C,EAAA,MAAAW;EAAAX,EAAA,MAAAuB;EAAAvB,EAAA,MAAAY;EAAAZ,EAAA,MAAAlB;EAAAkB,EAAA,MAAApC;EAAAoC,EAAA,MAAAiD;EAAAjD,EAAA,MAAAkD;EAAAlD,EAAA,MAAAmD;EAAAnD,EAAA,MAAAoD;EAAApD,EAAA,MAAAqD;EAAArD,EAAA,MAAAsD;EAAAtD,EAAA,MAAAuD;CAAA,OAAA;EAAAN,MAAAjD,EAAA;EAAAkD,MAAAlD,EAAA;EAAAmD,MAAAnD,EAAA;EAAAoD,MAAApD,EAAA;EAAAqD,MAAArD,EAAA;EAAAsD,MAAAtD,EAAA;EAAAuD,MAAAvD,EAAA;CAAA;CAAA,IAAAiI;CAAA,IAAAjI,EAAA,QAAAiD,OAAAjD,EAAA,QAAAkD,OAAAlD,EAAA,QAAAmD,OAAAnD,EAAA,QAAAoD,KAAA;EAhMJ6E,MAAA,oBAAA,OAAA;GACO9G,KAAAA;GACK,WAAA+B;GACM,gBAAAC;GAEfC,UAAAA;EA4LG,CAAA;EAAApD,EAAA,MAAAiD;EAAAjD,EAAA,MAAAkD;EAAAlD,EAAA,MAAAmD;EAAAnD,EAAA,MAAAoD;EAAApD,EAAA,MAAAiI;CAAA,OAAAA,MAAAjI,EAAA;CAAA,IAAAkI;CAAA,IAAAlI,EAAA,QAAAqD,OAAArD,EAAA,QAAAsD,OAAAtD,EAAA,QAAAuD,OAAAvD,EAAA,QAAAiI,KAAA;EAlMRC,MAAA,oBAAA,OAAA;GAAU7K,KAAAA;GAAgB,WAAAiG;GAA6B,GAAMlD;GAC3D6H,UAAAA;EAkMI,CAAA;EAAAjI,EAAA,MAAAqD;EAAArD,EAAA,MAAAsD;EAAAtD,EAAA,MAAAuD;EAAAvD,EAAA,MAAAiI;EAAAjI,EAAA,MAAAkI;CAAA,OAAAA,MAAAlI,EAAA;CAAA,OAnMNkI;AAmMM;AAlXV,SAAAhE,MAAAiE,QAAA;CAAA,OA6EqCC,OAAOxL,OAAOC,MAAI,CAAC;AAAC;;AAmTzD,IAAM4L,OAAOH,OAAkCzK,cAAmC,UAAU;CAC1F,MAAMhB,OAAO/B,SAASwN,KAAK;CAC3B,OAAOzL,QAAQvB,SAASuB,MAAMgB,WAAW;AAC3C;;;;;;;;;;AAWA,SAAO6K,SAAA3I,IAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAA,IAAAuI;CAAA,IAAApI;CAAA,IAAAC;CAAA,IAAAiI;CAAA,IAAAtI,EAAA,OAAAD,IAAA;EAAkB,CAAA,CAAAuI,OAAAC,cAAAlI,IAAAmI,eAAA,GAAApI,SAAAL;EAAsEC,EAAA,KAAAD;EAAAC,EAAA,KAAAwI;EAAAxI,EAAA,KAAAI;EAAAJ,EAAA,KAAAK;EAAAL,EAAA,KAAAsI;CAAA,OAAA;EAAAE,gBAAAxI,EAAA;EAAAI,QAAAJ,EAAA;EAAAK,KAAAL,EAAA;EAAAsI,QAAAtI,EAAA;CAAA;CAA7D,MAAAuI,eAAAlI,OAAAG,KAAAA,IAAA,OAAAH;CAAmB,IAAAC;CAAA,IAAAN,EAAA,OAAAuI,gBAAAvI,EAAA,OAAAI,OAAA;EACVE,WAAMmI,IAAIF,cAAcnI,MAAKvC,WAAY;EAACmC,EAAA,KAAAuI;EAAAvI,EAAA,KAAAI;EAAAJ,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CAAnF,MAAA,CAAA2I,OAAAC,YAA0BrO,MAAKsG,SAAUP,EAA0C;CAAE,IAAAI;CAAA,IAAAV,EAAA,OAAA2I,SAAA3I,EAAA,OAAAI,SAAAJ,EAAA,QAAAsI,OAAA;EACpE5H,KAAA4H,UAAU9H,KAAAA,IAAVmI,QAA8BF,IAAIH,OAAOlI,MAAKvC,WAAY;EAACmC,EAAA,KAAA2I;EAAA3I,EAAA,KAAAI;EAAAJ,EAAA,MAAAsI;EAAAtI,EAAA,MAAAU;CAAA,OAAAA,KAAAV,EAAA;CAA5E,MAAA7B,WAAiBuC;CAA4D,IAAAI;CAAA,IAAAd,EAAA,QAAA7B,UAAA;EAI/D2C,MAAAjE,UAAW,EAAAsB,UAAYtB,SAASsB,SAAS;EAAE6B,EAAA,MAAA7B;EAAA6B,EAAA,MAAAc;CAAA,OAAAA,KAAAd,EAAA;CAAA,IAAAiB;CAAA,IAAAjB,EAAA,QAAAwI,eAAA;EAE7CvH,MAAAkH,WAAA;GACNS,SAAS/L,MAAI;GACb2L,gBAAgB3L,MAAI;EAAC;EACtBmD,EAAA,MAAAwI;EAAAxI,EAAA,MAAAiB;CAAA,OAAAA,KAAAjB,EAAA;CAAA,IAAAyB;CAAA,IAAAzB,EAAA,QAAAI,SAAAJ,EAAA,QAAA7B,YAAA6B,EAAA,QAAAc,MAAAd,EAAA,QAAAiB,IAAA;EAPHQ,KAAA,oBAAC,cAAD;GACUtD,QAAAA;GACE,UAAA2C;GAA2C,GACjDV;GACI,QAAAa;EAGP,CAAA;EACDjB,EAAA,MAAAI;EAAAJ,EAAA,MAAA7B;EAAA6B,EAAA,MAAAc;EAAAd,EAAA,MAAAiB;EAAAjB,EAAA,MAAAyB;CAAA,OAAAA,KAAAzB,EAAA;CAAA,OARFyB;AAQE;AAaN,IAAMqH,YAAYC,UAA6BA,QAAQ,GAAGA,MAAMxJ,MAAK,GAAIwJ,MAAMC,QAAQ;AAEvF,IAAMC,YAAYF,OAAqClL,gBACrD1C,QAAQsN,IAAIM,OAAOxJ,OAAO1B,WAAW,GAAG4K,IAAIM,OAAOC,KAAKnL,WAAW,CAAC;;;;;;AAOtE,SAAOqL,cAAAnJ,IAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAA,IAAAuI;CAAA,IAAApI;CAAA,IAAAC;CAAA,IAAAiI;CAAA,IAAAtI,EAAA,OAAAD,IAAA;EAAuB,CAAA,CAAAuI,OAAAC,cAAAlI,IAAAmI,eAAA,GAAApI,SAAAL;EAA2EC,EAAA,KAAAD;EAAAC,EAAA,KAAAwI;EAAAxI,EAAA,KAAAI;EAAAJ,EAAA,KAAAK;EAAAL,EAAA,KAAAsI;CAAA,OAAA;EAAAE,gBAAAxI,EAAA;EAAAI,QAAAJ,EAAA;EAAAK,KAAAL,EAAA;EAAAsI,QAAAtI,EAAA;CAAA;CAAlE,MAAAuI,eAAAlI,OAAAG,KAAAA,IAAA,OAAAH;CAAmB,IAAAC;CAAA,IAAAN,EAAA,OAAAuI,gBAAAvI,EAAA,OAAAI,OAAA;EACfE,WAAM2I,SAASV,cAAcnI,MAAKvC,WAAY;EAACmC,EAAA,KAAAuI;EAAAvI,EAAA,KAAAI;EAAAJ,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CAAxF,MAAA,CAAA2I,OAAAC,YAA0BrO,MAAKsG,SAAUP,EAA+C;CAAE,IAAAI;CAAA,IAAAV,EAAA,OAAA2I,SAAA3I,EAAA,OAAAI,SAAAJ,EAAA,QAAAsI,OAAA;EAC5E5H,KAAA4H,UAAU9H,KAAAA,IAAVmI,QAA8BM,SAASX,OAAOlI,MAAKvC,WAAY;EAACmC,EAAA,KAAA2I;EAAA3I,EAAA,KAAAI;EAAAJ,EAAA,MAAAsI;EAAAtI,EAAA,MAAAU;CAAA,OAAAA,KAAAV,EAAA;CAA9E,MAAA+I,QAAcrI;CAEd,MAAA,CAAAyI,QAAAC,aAA4B7O,MAAKsG,SAAyB,IAAI;CAC9D,MAAA,CAAAwI,SAAAC,cAA8B/O,MAAKsG,SAAyB,IAAI;CAAE,IAAAC;CAAA,IAAAd,EAAA,QAAAmJ,UAAAnJ,EAAA,QAAAqJ,WAAArJ,EAAA,QAAA+I,OAAA;EACpDjI,KAAAqI,SAAShO,QAAQgO,QAAQE,WAAAF,MAAyB,IAAlDJ;EAAmD/I,EAAA,MAAAmJ;EAAAnJ,EAAA,MAAAqJ;EAAArJ,EAAA,MAAA+I;EAAA/I,EAAA,MAAAc;CAAA,OAAAA,KAAAd,EAAA;CAAjE,MAAAuJ,QAAczI;CAAoD,IAAAG;CAAA,IAAAjB,EAAA,QAAA+I,OAAA;EAG3B9H,WAAM6H,SAASC,KAAK;EAAC/I,EAAA,MAAA+I;EAAA/I,EAAA,MAAAiB;CAAA,OAAAA,KAAAjB,EAAA;CAA5D,MAAA,CAAAoC,MAAAC,WAAwB9H,MAAKsG,SAAUI,EAAqB;CAC5D,MAAA,CAAAzC,QAAAgL,aAA4BjP,MAAKsG,SAAUkI,OAAKxJ,SAAL,IAAoB;CAC/D,IAAIuJ,SAASC,KAAK,MAAM3G,MAAI;EAC1BC,QAAQyG,SAASC,KAAK,CAAC;EACvBS,UAAUT,OAAKxJ,SAAL,IAAoB;CAAC;CAChC,IAAAkC;CAAA,IAAAzB,EAAA,QAAAmJ,UAAAnJ,EAAA,QAAAwI,eAAA;EAEc/G,MAAA5E,SAAA;GACb,IAAI,CAACsM,QAAM;IACTC,UAAUvM,IAAI;IACdyM,WAAWzM,IAAI;IAAC;GAAA;GAGlB,MAAAwH,OAAalJ,QAAQgO,QAAQtM,IAAI;GACjCuM,UAAU,IAAI;GACdE,WAAW,IAAI;GACf,IAAI,CAACjF,MAAI;GACTuE,SAASvE,IAAI;GACbhC,QAAQyG,SAASzE,IAAI,CAAC;GACtBmE,gBAAgBnE,IAAI;EAAC;EACtBrE,EAAA,MAAAmJ;EAAAnJ,EAAA,MAAAwI;EAAAxI,EAAA,MAAAyB;CAAA,OAAAA,KAAAzB,EAAA;CAbD,MAAAyE,SAAehD;CAkBK,MAAAC,KAAAyH,SAAA,KAAA3I,KAAAA;CAAuB,IAAAoB;CAAA,IAAA5B,EAAA,QAAAuJ,OAAA;EAE7B3H,MAAAuG,WACRoB,QAAA;GAAApL,UAEgBtB,WAAS0M,MAAKhK,SAAU1C,WAAS0M,MAAKP;GAAI5K,SAC3CvB,UAAQ0M,MAAKhK,SAAU1C,UAAQ0M,MAAKP;GAAI3K,YACrCxB,WAAS0M,MAAKhK;GAAMjB,UACtBzB,WAAS0M,MAAKP;EAEzB,IAPL,CAOK;EAAChJ,EAAA,MAAAuJ;EAAAvJ,EAAA,MAAA4B;CAAA,OAAAA,KAAA5B,EAAA;CAAA,IAAA6B;CAAA,IAAA7B,EAAA,QAAAmJ,QAAA;EAIGtH,MAAAuC,WAAA;GACT,IAAI+E,QAAQG,WAAWzM,MAAI;EAAE;EAC9BmD,EAAA,MAAAmJ;EAAAnJ,EAAA,MAAA6B;CAAA,OAAAA,KAAA7B,EAAA;CAAA,IAAA+B;CAAA,IAAA/B,EAAA,QAAAI,SAAAJ,EAAA,QAAAyE,UAAAzE,EAAA,QAAA0B,MAAA1B,EAAA,QAAA4B,MAAA5B,EAAA,QAAA6B,MAAA7B,EAAA,QAAAxB,QAAA;EAlBHuD,MAAA,oBAAC,cAAD;GACE,iBAAA;GACgB,kBAAAL;GACRlD;GACE,UAAAoD;GAQF,GAEJxB;GACIqE,QAAAA;GACG,WAAA5C;EAEV,CAAA;EACD7B,EAAA,MAAAI;EAAAJ,EAAA,MAAAyE;EAAAzE,EAAA,MAAA0B;EAAA1B,EAAA,MAAA4B;EAAA5B,EAAA,MAAA6B;EAAA7B,EAAA,MAAAxB;EAAAwB,EAAA,MAAA+B;CAAA,OAAAA,MAAA/B,EAAA;CAAA,OAnBF+B;AAmBE"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { DateGranularity } from './date-utils';
|
|
3
|
+
/** App-wide date settings read by the calendars, the date pickers and `useDateConfig`. */
|
|
4
|
+
export interface DateConfig {
|
|
5
|
+
/** BCP 47 locale for month and weekday names. */
|
|
6
|
+
locale?: string;
|
|
7
|
+
/** IANA zone (`"Europe/Budapest"`) that date-times are shown and edited in. Defaults to the browser's. */
|
|
8
|
+
timeZone?: string;
|
|
9
|
+
/** First calendar column: 0 = Sunday, 1 = Monday. */
|
|
10
|
+
weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;
|
|
11
|
+
/** Display patterns per granularity, e.g. `{ day: 'DD.MM.YYYY' }`. Tokens as in `formatDate`. */
|
|
12
|
+
formats?: Partial<Record<DateGranularity, string>>;
|
|
13
|
+
}
|
|
14
|
+
export interface DateConfigProviderProps extends DateConfig {
|
|
15
|
+
/** The subtree that uses these settings. */
|
|
16
|
+
children?: React.ReactNode;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Sets default locale, time zone, week start and display formats for every
|
|
20
|
+
* date picker and calendar inside it. Props on a component still win.
|
|
21
|
+
* Nested providers override only the settings they pass.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* <DateConfigProvider timeZone="Europe/Budapest" locale="hu-HU" formats={{ day: 'YYYY.MM.DD' }}>
|
|
25
|
+
* <App />
|
|
26
|
+
* </DateConfigProvider>
|
|
27
|
+
*/
|
|
28
|
+
export declare function DateConfigProvider({ children, ...config }: DateConfigProviderProps): React.JSX.Element;
|
|
29
|
+
/**
|
|
30
|
+
* The date settings from the nearest `DateConfigProvider`. Spread it into
|
|
31
|
+
* `formatDate` options to format dates the same way the pickers do.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* const config = useDateConfig();
|
|
35
|
+
* return <span>{formatDate(order.createdAt, { ...config, granularity: 'minute' })}</span>;
|
|
36
|
+
*/
|
|
37
|
+
export declare function useDateConfig(): DateConfig;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { c } from "react/compiler-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { jsx } from "react/jsx-runtime";
|
|
5
|
+
//#region src/components/calendar/DateConfig.tsx
|
|
6
|
+
var DateConfigContext = React.createContext({});
|
|
7
|
+
/**
|
|
8
|
+
* Sets default locale, time zone, week start and display formats for every
|
|
9
|
+
* date picker and calendar inside it. Props on a component still win.
|
|
10
|
+
* Nested providers override only the settings they pass.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* <DateConfigProvider timeZone="Europe/Budapest" locale="hu-HU" formats={{ day: 'YYYY.MM.DD' }}>
|
|
14
|
+
* <App />
|
|
15
|
+
* </DateConfigProvider>
|
|
16
|
+
*/
|
|
17
|
+
function DateConfigProvider(t0) {
|
|
18
|
+
const $ = c(10);
|
|
19
|
+
const { children, ...config } = t0;
|
|
20
|
+
const parent = React.useContext(DateConfigContext);
|
|
21
|
+
const defined = Object.fromEntries(Object.entries(config).filter(_temp));
|
|
22
|
+
let t1;
|
|
23
|
+
if ($[0] !== config.formats || $[1] !== parent.formats) {
|
|
24
|
+
t1 = {
|
|
25
|
+
...parent.formats,
|
|
26
|
+
...config.formats
|
|
27
|
+
};
|
|
28
|
+
$[0] = config.formats;
|
|
29
|
+
$[1] = parent.formats;
|
|
30
|
+
$[2] = t1;
|
|
31
|
+
} else t1 = $[2];
|
|
32
|
+
let t2;
|
|
33
|
+
if ($[3] !== defined || $[4] !== parent || $[5] !== t1) {
|
|
34
|
+
t2 = {
|
|
35
|
+
...parent,
|
|
36
|
+
...defined,
|
|
37
|
+
formats: t1
|
|
38
|
+
};
|
|
39
|
+
$[3] = defined;
|
|
40
|
+
$[4] = parent;
|
|
41
|
+
$[5] = t1;
|
|
42
|
+
$[6] = t2;
|
|
43
|
+
} else t2 = $[6];
|
|
44
|
+
const value_0 = t2;
|
|
45
|
+
let t3;
|
|
46
|
+
if ($[7] !== children || $[8] !== value_0) {
|
|
47
|
+
t3 = /* @__PURE__ */ jsx(DateConfigContext.Provider, {
|
|
48
|
+
value: value_0,
|
|
49
|
+
children
|
|
50
|
+
});
|
|
51
|
+
$[7] = children;
|
|
52
|
+
$[8] = value_0;
|
|
53
|
+
$[9] = t3;
|
|
54
|
+
} else t3 = $[9];
|
|
55
|
+
return t3;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* The date settings from the nearest `DateConfigProvider`. Spread it into
|
|
59
|
+
* `formatDate` options to format dates the same way the pickers do.
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* const config = useDateConfig();
|
|
63
|
+
* return <span>{formatDate(order.createdAt, { ...config, granularity: 'minute' })}</span>;
|
|
64
|
+
*/
|
|
65
|
+
function _temp(t0) {
|
|
66
|
+
const [, value] = t0;
|
|
67
|
+
return value !== void 0;
|
|
68
|
+
}
|
|
69
|
+
function useDateConfig() {
|
|
70
|
+
return React.useContext(DateConfigContext);
|
|
71
|
+
}
|
|
72
|
+
//#endregion
|
|
73
|
+
export { DateConfigProvider, useDateConfig };
|
|
74
|
+
|
|
75
|
+
//# sourceMappingURL=DateConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DateConfig.js","names":["React","DateGranularity","DateConfig","locale","timeZone","weekStartsOn","formats","Partial","Record","DateConfigContext","createContext","DateConfigProviderProps","children","ReactNode","DateConfigProvider","t0","$","_c","config","parent","useContext","defined","Object","fromEntries","entries","filter","_temp","t1","t2","value_0","t3","value","undefined","useDateConfig","_c"],"sources":["../../../src/components/calendar/DateConfig.tsx"],"sourcesContent":["import * as React from 'react';\nimport type { DateGranularity } from './date-utils';\n\n/** App-wide date settings read by the calendars, the date pickers and `useDateConfig`. */\nexport interface DateConfig {\n /** BCP 47 locale for month and weekday names. */\n locale?: string;\n /** IANA zone (`\"Europe/Budapest\"`) that date-times are shown and edited in. Defaults to the browser's. */\n timeZone?: string;\n /** First calendar column: 0 = Sunday, 1 = Monday. */\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n /** Display patterns per granularity, e.g. `{ day: 'DD.MM.YYYY' }`. Tokens as in `formatDate`. */\n formats?: Partial<Record<DateGranularity, string>>;\n}\n\nconst DateConfigContext = React.createContext<DateConfig>({});\n\nexport interface DateConfigProviderProps extends DateConfig {\n /** The subtree that uses these settings. */\n children?: React.ReactNode;\n}\n\n/**\n * Sets default locale, time zone, week start and display formats for every\n * date picker and calendar inside it. Props on a component still win.\n * Nested providers override only the settings they pass.\n *\n * @example\n * <DateConfigProvider timeZone=\"Europe/Budapest\" locale=\"hu-HU\" formats={{ day: 'YYYY.MM.DD' }}>\n * <App />\n * </DateConfigProvider>\n */\nexport function DateConfigProvider({ children, ...config }: DateConfigProviderProps) {\n const parent = React.useContext(DateConfigContext);\n const defined = Object.fromEntries(Object.entries(config).filter(([, value]) => value !== undefined));\n const value = { ...parent, ...defined, formats: { ...parent.formats, ...config.formats } };\n return <DateConfigContext.Provider value={value}>{children}</DateConfigContext.Provider>;\n}\n\n/**\n * The date settings from the nearest `DateConfigProvider`. Spread it into\n * `formatDate` options to format dates the same way the pickers do.\n *\n * @example\n * const config = useDateConfig();\n * return <span>{formatDate(order.createdAt, { ...config, granularity: 'minute' })}</span>;\n */\nexport function useDateConfig(): DateConfig {\n return React.useContext(DateConfigContext);\n}\n"],"mappings":";;;;;AAeA,IAAMS,oBAAoBT,MAAMU,cAA0B,CAAC,CAAC;;;;;;;;;;;AAiB5D,SAAOI,mBAAAC,IAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAA4B,MAAA,EAAAL,UAAA,GAAAM,WAAAH;CACjC,MAAAI,SAAenB,MAAKoB,WAAYX,iBAAiB;CACjD,MAAAY,UAAgBC,OAAMC,YAAaD,OAAME,QAASN,MAAM,CAAC,CAAAO,OAAQC,KAAkC,CAAC;CAAE,IAAAC;CAAA,IAAAX,EAAA,OAAAE,OAAAZ,WAAAU,EAAA,OAAAG,OAAAb,SAAA;EACtDqB,KAAA;GAAA,GAAKR,OAAMb;GAAQ,GAAKY,OAAMZ;EAAS;EAACU,EAAA,KAAAE,OAAAZ;EAAAU,EAAA,KAAAG,OAAAb;EAAAU,EAAA,KAAAW;CAAA,OAAAA,KAAAX,EAAA;CAAA,IAAAY;CAAA,IAAAZ,EAAA,OAAAK,WAAAL,EAAA,OAAAG,UAAAH,EAAA,OAAAW,IAAA;EAA1EC,KAAA;GAAA,GAAKT;GAAM,GAAKE;GAAOf,SAAWqB;EAAyC;EAACX,EAAA,KAAAK;EAAAL,EAAA,KAAAG;EAAAH,EAAA,KAAAW;EAAAX,EAAA,KAAAY;CAAA,OAAAA,KAAAZ,EAAA;CAA1F,MAAAa,UAAcD;CAA6E,IAAAE;CAAA,IAAAd,EAAA,OAAAJ,YAAAI,EAAA,OAAAa,SAAA;EACpFC,KAAA,oBAAA,kBAAA,UAAA;GAAmCC,OAAAA;GAAQnB;EAAS,CAAA;EAA6BI,EAAA,KAAAJ;EAAAI,EAAA,KAAAa;EAAAb,EAAA,KAAAc;CAAA,OAAAA,KAAAd,EAAA;CAAA,OAAjFc;AAAiF;;;;;;;;;AAJnF,SAAAJ,MAAAX,IAAA;CAE6D,MAAA,GAAAgB,SAAAhB;CAAS,OAAKgB,UAAUC,KAAAA;AAAS;AAarG,SAAOC,gBAAA;CAAA,OACEjC,MAAKoB,WAAYX,iBAAiB;AAAC"}
|
|
@@ -3,14 +3,49 @@ export declare function pad(value: number, length?: number): string;
|
|
|
3
3
|
export declare function datePart(value: string | null | undefined): string | null;
|
|
4
4
|
/** The time part (`"14:30"`, `"14:30:05"`, …) of an ISO date-time string. */
|
|
5
5
|
export declare function timePart(value: string | null | undefined): string | null;
|
|
6
|
-
/**
|
|
7
|
-
export
|
|
6
|
+
/** How precise a date value is, from a whole year down to the second. */
|
|
7
|
+
export type DateGranularity = 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second';
|
|
8
|
+
/** Whether `granularity` includes a time of day. */
|
|
9
|
+
export declare function hasTime(granularity: DateGranularity): boolean;
|
|
10
|
+
/** Default display pattern for each granularity. */
|
|
11
|
+
export declare const defaultFormats: Record<DateGranularity, string>;
|
|
12
|
+
/** The browser's IANA time zone, e.g. `"Europe/Budapest"`. */
|
|
13
|
+
export declare function browserTimeZone(): string;
|
|
8
14
|
/**
|
|
9
|
-
*
|
|
10
|
-
*
|
|
15
|
+
* Normalises a value to the wall clock in `timeZone`: `"2026-03-09"` for a date,
|
|
16
|
+
* `"2026-03-09T14:30:00"` for a date-time. Instants (with `Z` or an offset) are converted;
|
|
17
|
+
* date-times without one are taken as already in `timeZone`. `null` when invalid.
|
|
11
18
|
*/
|
|
12
|
-
export declare function
|
|
13
|
-
|
|
19
|
+
export declare function toWall(value: string | null | undefined, timeZone: string): string | null;
|
|
20
|
+
/** The UTC instant (`"2026-03-09T13:30:00Z"`) of a wall clock in `timeZone`. */
|
|
21
|
+
export declare function toInstant(wall: string, timeZone: string): string;
|
|
22
|
+
/** Cuts a wall clock down to `granularity`: `"2026-03-01"` for a month, `"2026-03-09T14:00:00"` for an hour. */
|
|
23
|
+
export declare function truncate(wall: string, granularity: DateGranularity): string;
|
|
24
|
+
/** Options for `formatDate`. Pass `useDateConfig()` in to follow the app's `DateConfigProvider`. */
|
|
25
|
+
export interface FormatDateOptions {
|
|
26
|
+
/** Token pattern: `YYYY`, `MM`, `MMM` / `MMMM` (month name in `locale`), `DD`, `HH` (24h), `mm`, `ss`. Text in `[brackets]` is kept as is. Wins over `formats`. */
|
|
27
|
+
format?: string;
|
|
28
|
+
/** Unit the default pattern stops at. Defaults to `day` for dates and `minute` (or `second` when set) for date-times. */
|
|
29
|
+
granularity?: DateGranularity;
|
|
30
|
+
/** IANA zone that instants are shown in. Defaults to the browser's. Values without an offset are not shifted. */
|
|
31
|
+
timeZone?: string;
|
|
32
|
+
/** BCP 47 locale for `MMM` / `MMMM`. */
|
|
33
|
+
locale?: string;
|
|
34
|
+
/** Default patterns per granularity, e.g. from `DateConfigProvider`. */
|
|
35
|
+
formats?: Partial<Record<DateGranularity, string>>;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Formats a date or date-time the way the date pickers show it: ISO-style
|
|
39
|
+
* (`2026-03-09 14:30`) on a 24-hour clock by default, or with a custom `format`.
|
|
40
|
+
* Instants (`"2026-03-09T13:30:00Z"`) are shown in `timeZone`. Returns `""` for an invalid value.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* formatDate('2026-03-09T13:30:00Z', { timeZone: 'Europe/Budapest' }); // "2026-03-09 14:30"
|
|
44
|
+
* formatDate('2026-03-01', { granularity: 'month', format: 'MMMM YYYY', locale: 'en' }); // "March 2026"
|
|
45
|
+
*/
|
|
46
|
+
export declare function formatDate(value: string | null | undefined, options?: FormatDateOptions): string;
|
|
47
|
+
/** Today's date in `timeZone` (the browser's by default). */
|
|
48
|
+
export declare function todayIso(timeZone?: string): string;
|
|
14
49
|
export declare function addDays(value: string, amount: number): string;
|
|
15
50
|
/** Moves by whole months, clamping the day (31 Jan + 1 month → 28/29 Feb). */
|
|
16
51
|
export declare function addMonths(value: string, amount: number): string;
|
|
@@ -30,32 +30,131 @@ function timePart(value) {
|
|
|
30
30
|
const match = value ? /T(\d{2}:\d{2}(?::\d{2}(?:\.\d{1,3})?)?)/.exec(value) : null;
|
|
31
31
|
return match ? match[1] : null;
|
|
32
32
|
}
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
var UNITS = [
|
|
34
|
+
"year",
|
|
35
|
+
"month",
|
|
36
|
+
"day",
|
|
37
|
+
"hour",
|
|
38
|
+
"minute",
|
|
39
|
+
"second"
|
|
40
|
+
];
|
|
41
|
+
/** Whether `granularity` includes a time of day. */
|
|
42
|
+
function hasTime(granularity) {
|
|
43
|
+
return UNITS.indexOf(granularity) > UNITS.indexOf("day");
|
|
44
|
+
}
|
|
45
|
+
/** Default display pattern for each granularity. */
|
|
46
|
+
var defaultFormats = {
|
|
47
|
+
year: "YYYY",
|
|
48
|
+
month: "YYYY-MM",
|
|
49
|
+
day: "YYYY-MM-DD",
|
|
50
|
+
hour: "YYYY-MM-DD HH",
|
|
51
|
+
minute: "YYYY-MM-DD HH:mm",
|
|
52
|
+
second: "YYYY-MM-DD HH:mm:ss"
|
|
53
|
+
};
|
|
54
|
+
/** The browser's IANA time zone, e.g. `"Europe/Budapest"`. */
|
|
55
|
+
function browserTimeZone() {
|
|
56
|
+
return Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
57
|
+
}
|
|
58
|
+
var OFFSET = /(?:Z|[+-]\d{2}:?\d{2})$/i;
|
|
59
|
+
var zoneFormats = /* @__PURE__ */ new Map();
|
|
60
|
+
/** `"2026-03-09T14:30:00"`: the wall clock in `timeZone` at a UTC timestamp. */
|
|
61
|
+
function wallAt(time, timeZone) {
|
|
62
|
+
let format = zoneFormats.get(timeZone);
|
|
63
|
+
if (!format) {
|
|
64
|
+
format = new Intl.DateTimeFormat("en-US", {
|
|
65
|
+
timeZone,
|
|
66
|
+
hourCycle: "h23",
|
|
67
|
+
year: "numeric",
|
|
68
|
+
month: "2-digit",
|
|
69
|
+
day: "2-digit",
|
|
70
|
+
hour: "2-digit",
|
|
71
|
+
minute: "2-digit",
|
|
72
|
+
second: "2-digit"
|
|
73
|
+
});
|
|
74
|
+
zoneFormats.set(timeZone, format);
|
|
75
|
+
}
|
|
76
|
+
const part = Object.fromEntries(format.formatToParts(new Date(time)).map((item) => [item.type, item.value]));
|
|
77
|
+
return `${pad(Number(part.year), 4)}-${part.month}-${part.day}T${part.hour}:${part.minute}:${part.second}`;
|
|
78
|
+
}
|
|
79
|
+
/** A wall-clock string read as if it were UTC, in milliseconds. */
|
|
80
|
+
function wallTime(wall) {
|
|
81
|
+
const [hours = 0, minutes = 0, seconds = 0] = (timePart(wall) ?? "").split(":").map((item) => Math.floor(Number(item)) || 0);
|
|
82
|
+
return (toTime(wall) ?? 0) + ((hours * 60 + minutes) * 60 + seconds) * 1e3;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* The UTC timestamp of a wall clock in `timeZone`. In a daylight-saving overlap
|
|
86
|
+
* the earlier offset wins; a time skipped by a gap is read with the offset before it.
|
|
87
|
+
*/
|
|
88
|
+
function instantOf(wall, timeZone) {
|
|
89
|
+
const local = wallTime(wall);
|
|
90
|
+
const candidates = [local - 864e5, local + 864e5].map((time) => wallTime(wallAt(time, timeZone)) - time).map((offset) => local - offset);
|
|
91
|
+
const exact = candidates.filter((time) => wallTime(wallAt(time, timeZone)) === local);
|
|
92
|
+
return exact.length ? Math.min(...exact) : candidates[0];
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Normalises a value to the wall clock in `timeZone`: `"2026-03-09"` for a date,
|
|
96
|
+
* `"2026-03-09T14:30:00"` for a date-time. Instants (with `Z` or an offset) are converted;
|
|
97
|
+
* date-times without one are taken as already in `timeZone`. `null` when invalid.
|
|
98
|
+
*/
|
|
99
|
+
function toWall(value, timeZone) {
|
|
35
100
|
const date = datePart(value);
|
|
36
|
-
if (!date) return
|
|
101
|
+
if (!date || !value) return null;
|
|
37
102
|
const time = timePart(value);
|
|
38
103
|
if (!time) return date;
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
104
|
+
const local = `${date}T${pad(Number(time.slice(0, 2)))}:${time.slice(3, 5)}:${time.slice(6, 8) || "00"}`;
|
|
105
|
+
if (!OFFSET.test(value)) return local;
|
|
106
|
+
const instant = new Date(value).getTime();
|
|
107
|
+
return Number.isNaN(instant) ? local : wallAt(instant, timeZone);
|
|
108
|
+
}
|
|
109
|
+
/** The UTC instant (`"2026-03-09T13:30:00Z"`) of a wall clock in `timeZone`. */
|
|
110
|
+
function toInstant(wall, timeZone) {
|
|
111
|
+
return new Date(instantOf(wall, timeZone)).toISOString().replace(/\.\d{3}Z$/, "Z");
|
|
112
|
+
}
|
|
113
|
+
/** Cuts a wall clock down to `granularity`: `"2026-03-01"` for a month, `"2026-03-09T14:00:00"` for an hour. */
|
|
114
|
+
function truncate(wall, granularity) {
|
|
115
|
+
const date = datePart(wall) ?? wall.slice(0, 10);
|
|
116
|
+
if (granularity === "year") return `${date.slice(0, 4)}-01-01`;
|
|
117
|
+
if (granularity === "month") return `${date.slice(0, 7)}-01`;
|
|
118
|
+
if (granularity === "day") return date;
|
|
119
|
+
const [hours = "00", minutes = "00", seconds = "00"] = (timePart(wall) ?? "").split(":");
|
|
120
|
+
return `${date}T${granularity === "hour" ? `${hours}:00:00` : granularity === "minute" ? `${hours}:${minutes}:00` : `${hours}:${minutes}:${seconds.slice(0, 2)}`}`;
|
|
121
|
+
}
|
|
122
|
+
var TOKENS = /\[([^\]]*)\]|YYYY|MMMM|MMM|MM|DD|HH|mm|ss/g;
|
|
42
123
|
/**
|
|
43
|
-
*
|
|
44
|
-
*
|
|
124
|
+
* Formats a date or date-time the way the date pickers show it: ISO-style
|
|
125
|
+
* (`2026-03-09 14:30`) on a 24-hour clock by default, or with a custom `format`.
|
|
126
|
+
* Instants (`"2026-03-09T13:30:00Z"`) are shown in `timeZone`. Returns `""` for an invalid value.
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* formatDate('2026-03-09T13:30:00Z', { timeZone: 'Europe/Budapest' }); // "2026-03-09 14:30"
|
|
130
|
+
* formatDate('2026-03-01', { granularity: 'month', format: 'MMMM YYYY', locale: 'en' }); // "March 2026"
|
|
45
131
|
*/
|
|
46
|
-
function
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
132
|
+
function formatDate(value, options = {}) {
|
|
133
|
+
const { format, granularity, timeZone = browserTimeZone(), locale, formats } = options;
|
|
134
|
+
const wall = toWall(value, timeZone);
|
|
135
|
+
if (!wall) return "";
|
|
136
|
+
const unit = granularity ?? (wall.length > 10 ? wall.endsWith(":00") ? "minute" : "second" : "day");
|
|
137
|
+
const pattern = format ?? formats?.[unit] ?? defaultFormats[unit];
|
|
138
|
+
const time = timePart(wall) ?? "00:00:00";
|
|
139
|
+
const month = (style) => new Intl.DateTimeFormat(locale, {
|
|
140
|
+
month: style,
|
|
51
141
|
timeZone: "UTC"
|
|
52
|
-
}).format(toUtcDate(
|
|
53
|
-
const
|
|
54
|
-
|
|
142
|
+
}).format(toUtcDate(wall));
|
|
143
|
+
const parts = {
|
|
144
|
+
YYYY: () => wall.slice(0, 4),
|
|
145
|
+
MMMM: () => month("long"),
|
|
146
|
+
MMM: () => month("short"),
|
|
147
|
+
MM: () => wall.slice(5, 7),
|
|
148
|
+
DD: () => wall.slice(8, 10),
|
|
149
|
+
HH: () => time.slice(0, 2),
|
|
150
|
+
mm: () => time.slice(3, 5),
|
|
151
|
+
ss: () => time.slice(6, 8)
|
|
152
|
+
};
|
|
153
|
+
return pattern.replace(TOKENS, (token, literal) => literal ?? parts[token]());
|
|
55
154
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
return
|
|
155
|
+
/** Today's date in `timeZone` (the browser's by default). */
|
|
156
|
+
function todayIso(timeZone) {
|
|
157
|
+
return wallAt(Date.now(), timeZone ?? browserTimeZone()).slice(0, 10);
|
|
59
158
|
}
|
|
60
159
|
function addDays(value, amount) {
|
|
61
160
|
const date = new Date(toTime(value) ?? 0);
|
|
@@ -107,6 +206,6 @@ function toRange(a, b) {
|
|
|
107
206
|
};
|
|
108
207
|
}
|
|
109
208
|
//#endregion
|
|
110
|
-
export { addDays, addMonths, clampDate, datePart, formatDate,
|
|
209
|
+
export { addDays, addMonths, browserTimeZone, clampDate, datePart, defaultFormats, formatDate, hasTime, monthGrid, pad, startOfMonth, timePart, toInstant, toRange, toUtcDate, toWall, todayIso, truncate, weekday };
|
|
111
210
|
|
|
112
211
|
//# sourceMappingURL=date-utils.js.map
|