@kalyx/react 1.0.0-rc.12 → 1.0.0-rc.13
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/CHANGELOG.md +34 -0
- package/dist/index.cjs +9 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/package.json +3 -4
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/context/DatePickerContext.ts","../src/hooks/useChangeEffect.ts","../src/components/DatePicker/Root.tsx","../src/components/DatePicker/Input.tsx","../src/components/DatePicker/Trigger.tsx","../src/hooks/usePopover.ts","../src/components/DatePicker/Popover.tsx","../src/components/DatePicker/Calendar.tsx","../src/components/_shared/grid-keyboard.ts","../src/components/DatePicker/MonthGrid.tsx","../src/components/DatePicker/YearGrid.tsx","../src/components/DatePicker/Presets.tsx","../src/components/DatePicker/index.ts","../src/context/RangePickerContext.ts","../src/components/RangePicker/Root.tsx","../src/components/RangePicker/Input.tsx","../src/components/RangePicker/Popover.tsx","../src/components/RangePicker/Calendar.tsx","../src/components/RangePicker/Presets.tsx","../src/components/RangePicker/index.ts","../src/context/TimePickerContext.ts","../src/components/TimePicker/Root.tsx","../src/components/TimePicker/Input.tsx","../src/hooks/useListboxNavigation.ts","../src/components/TimePicker/HourList.tsx","../src/components/TimePicker/MinuteList.tsx","../src/components/TimePicker/AmPmToggle.tsx","../src/components/TimePicker/index.ts","../src/components/DateTimePicker/Root.tsx","../src/components/DateTimePicker/Input.tsx","../src/components/DateTimePicker/index.ts","../src/components/MonthPicker/Root.tsx","../src/components/MonthPicker/Grid.tsx","../src/components/MonthPicker/index.ts","../src/components/YearPicker/Root.tsx","../src/components/YearPicker/Grid.tsx","../src/components/YearPicker/index.ts","../src/components/WeekPicker/Root.tsx","../src/components/WeekPicker/Calendar.tsx","../src/components/WeekPicker/index.ts","../src/hooks/useDatePicker.ts","../src/hooks/useRangePicker.ts","../src/hooks/useTimePicker.ts"],"names":["useRef","DatePickerInput","useState","useEffect","useCallback","jsx","forwardRef","DatePickerTrigger","useMemo","jsxs","createContext","useContext","DateFnsAdapter","useId","civilMidnightFromUtcDay","RangePickerInput","safeFormatFullDate","formatFullDate","getWeekdayNames","getCalendarDays","formatMonthYear","isDateDisabled","getISOWeekNumber","setTime","setTimeOnIso","TimePickerInput","to12Hour","to24Hour","DEFAULT_DATEPICKER_LABELS","DEFAULT_TIMEPICKER_LABELS","getTimeInTimezone","getTime","setTimeInTimezone","DateTimePickerInput","formatTimeString","_","getMonthName","EMPTY_RANGE","generateHours","generateMinutes"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext, useContext } from 'react';\nimport type { RefObject } from 'react';\nimport type {\n DateAdapter,\n DatePickerLabels,\n DisabledRule,\n ISODateString,\n WeekStartsOn,\n} from '@kalyx/core';\n\nexport interface DatePickerContextValue {\n /** Floating UI reference element (set by Input/Trigger, read by Popover) */\n referenceRef: RefObject<HTMLElement | null>;\n /** Currently selected date (ISO 8601 UTC) */\n value: ISODateString | null;\n /** Date selection handler */\n selectDate: (iso: ISODateString | null) => void;\n /** Popover open state */\n isOpen: boolean;\n /** Open the popover */\n open: () => void;\n /** Close the popover */\n close: () => void;\n /** Toggle the popover */\n toggle: () => void;\n /** Currently displayed month (ISO string) */\n viewMonth: ISODateString;\n /** Change the displayed month */\n setViewMonth: (iso: ISODateString) => void;\n /** Currently focused date in the calendar */\n focusedDate: ISODateString;\n /** Change the focused date */\n setFocusedDate: (iso: ISODateString) => void;\n /** Date adapter */\n adapter: DateAdapter;\n /** Disabled rules */\n disabled: DisabledRule[];\n /** Week start day */\n weekStartsOn: WeekStartsOn;\n /** Date display format */\n displayFormat: string;\n /** BCP 47 locale (e.g., \"en-US\", \"ko-KR\") */\n locale: string;\n /**\n * IANA timezone for display (e.g., \"Asia/Seoul\"). When set, the Input formats the value in\n * this zone, Calendar highlights the matching civil day, and selecting a date emits the civil\n * midnight of that day in the zone (UTC-ISO form).\n */\n displayTimezone?: string;\n /** Whether entire picker is disabled */\n isDisabled: boolean;\n /** Read-only */\n isReadOnly: boolean;\n /** Unique ID (useId-based) */\n pickerId: string;\n /** ARIA labels */\n labels: DatePickerLabels;\n}\n\nexport const DatePickerContext = createContext<DatePickerContextValue | null>(null);\n\n/**\n * Consume DatePickerContext.\n * Throws a clear error when called outside of DatePicker.Root.\n */\nexport function useDatePickerContext(componentName: string): DatePickerContextValue {\n const context = useContext(DatePickerContext);\n if (!context) {\n throw new Error(\n `[${componentName}] DatePicker.Root 내부에서 사용해야 합니다.\\n\\n` +\n '올바른 사용법:\\n' +\n ' <DatePicker>\\n' +\n ` <DatePicker.${componentName.replace('DatePicker.', '')} />\\n` +\n ' </DatePicker>',\n );\n }\n return context;\n}\n","import { useEffect, useRef } from 'react';\n\n/**\n * Fires `callback` when `value` changes (reference-identity), but not on mount.\n * Stores the callback in a ref so changing its identity does not re-trigger the effect.\n *\n * Internal utility — not exported from the package public API.\n */\nexport function useChangeEffect<T>(value: T, callback: ((value: T) => void) | undefined): void {\n const callbackRef = useRef(callback);\n callbackRef.current = callback;\n\n const prevRef = useRef(value);\n useEffect(() => {\n if (prevRef.current !== value) {\n prevRef.current = value;\n callbackRef.current?.(value);\n }\n }, [value]);\n}\n","import { useCallback, useId, useMemo, useRef, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { DateFnsAdapter, DEFAULT_DATEPICKER_LABELS, civilMidnightFromUtcDay } from '@kalyx/core';\nimport type {\n DateAdapter,\n DatePickerLabels,\n DisabledRule,\n ISODateString,\n WeekStartsOn,\n} from '@kalyx/core';\nimport { DatePickerContext } from '../../context/DatePickerContext.js';\nimport type { DatePickerContextValue } from '../../context/DatePickerContext.js';\nimport { useChangeEffect } from '../../hooks/useChangeEffect.js';\n\n/**\n * Props for the DatePicker Root component.\n *\n * @example Controlled\n * ```tsx\n * <DatePicker value={date} onChange={setDate}>\n * <DatePicker.Input />\n * <DatePicker.Popover>\n * <DatePicker.Calendar />\n * </DatePicker.Popover>\n * </DatePicker>\n * ```\n *\n * @example Uncontrolled\n * ```tsx\n * <DatePicker defaultValue=\"2026-01-15T00:00:00.000Z\">\n * <DatePicker.Input />\n * </DatePicker>\n * ```\n */\nexport interface DatePickerRootProps {\n /** Selected date (controlled, ISO 8601 UTC). `null` means empty. */\n value?: ISODateString | null;\n /** Initial date (uncontrolled) */\n defaultValue?: ISODateString;\n /** Callback fired when the date changes */\n onChange?: (value: ISODateString | null) => void;\n /** Callback fired when the popover open state changes */\n onOpenChange?: (isOpen: boolean) => void;\n /**\n * Callback fired when the calendar view navigates to a different month.\n * The value is the ISO string of the first day of the newly-visible month (UTC).\n */\n onCalendarNavigate?: (viewMonth: ISODateString) => void;\n /** Disabled rules */\n disabled?: DisabledRule[] | boolean;\n /** Read-only */\n readOnly?: boolean;\n /** Week start day */\n weekStartsOn?: WeekStartsOn;\n /** Date display format */\n displayFormat?: string;\n /** BCP 47 locale (e.g., \"en-US\", \"ko-KR\", \"ja-JP\") */\n locale?: string;\n /**\n * IANA timezone used for display and selection semantics (e.g., \"Asia/Seoul\").\n * When set, the Input formats the value in this zone, Calendar highlights the matching civil\n * day, and selecting a date emits the civil midnight of that day (UTC-ISO form).\n */\n displayTimezone?: string;\n /** Date adapter */\n adapter?: DateAdapter;\n /** Override ARIA labels (defaults to English) */\n labels?: Partial<DatePickerLabels>;\n /** Child components */\n children: ReactNode;\n}\n\nexport function DatePickerRoot({\n value: controlledValue,\n defaultValue,\n onChange,\n onOpenChange,\n onCalendarNavigate,\n disabled = false,\n readOnly = false,\n weekStartsOn = 0,\n displayFormat = 'yyyy-MM-dd',\n locale = 'en-US',\n displayTimezone,\n adapter = DateFnsAdapter,\n labels: labelsProp,\n children,\n}: DatePickerRootProps) {\n const pickerId = useId();\n const isControlled = useRef(controlledValue !== undefined).current;\n const referenceRef = useRef<HTMLElement | null>(null);\n\n // Internal state for uncontrolled mode\n const [uncontrolledValue, setUncontrolledValue] = useState<ISODateString | null>(\n defaultValue ?? null,\n );\n\n const currentValue = isControlled ? (controlledValue ?? null) : uncontrolledValue;\n\n const [isOpen, setIsOpen] = useState(false);\n\n // Lazy initializers: today() is only computed once per mount instead of on every\n // render. Avoids redundant Date allocations and makes the SSR/hydration contract\n // explicit — neither server nor client re-evaluates the fallback after first render.\n const [viewMonth, setViewMonth] = useState<ISODateString>(\n () => currentValue ?? adapter.today(displayTimezone),\n );\n\n const [focusedDate, setFocusedDate] = useState<ISODateString>(\n () => currentValue ?? adapter.today(displayTimezone),\n );\n\n useChangeEffect(isOpen, onOpenChange);\n const viewMonthStart = useMemo(() => adapter.startOfMonth(viewMonth), [viewMonth, adapter]);\n useChangeEffect(viewMonthStart, onCalendarNavigate);\n\n const mergedLabels = useMemo(\n () => ({ ...DEFAULT_DATEPICKER_LABELS, ...labelsProp }),\n [labelsProp],\n );\n\n const isDisabled = typeof disabled === 'boolean' ? disabled : false;\n const disabledRules: DisabledRule[] = useMemo(\n () => (Array.isArray(disabled) ? disabled : []),\n [disabled],\n );\n\n const selectDate = useCallback(\n (iso: ISODateString | null) => {\n if (isDisabled || readOnly) return;\n\n // The grid emits UTC-midnight ISO strings. When displayTimezone is set, map those to the\n // civil midnight of the same calendar day in that zone — otherwise \"picking Jan 15 in KST\"\n // would save Jan 14 15:00 UTC shifted incorrectly.\n const normalized =\n iso && displayTimezone ? civilMidnightFromUtcDay(iso, displayTimezone) : iso;\n\n if (!isControlled) {\n setUncontrolledValue(normalized);\n }\n onChange?.(normalized);\n\n // Close the popover after selection\n setIsOpen(false);\n },\n [isControlled, isDisabled, readOnly, onChange, displayTimezone],\n );\n\n const open = useCallback(() => {\n if (isDisabled || readOnly) return;\n setIsOpen(true);\n // Reset the view to the current value or today when opening\n const target = currentValue ?? adapter.today(displayTimezone);\n setViewMonth(target);\n setFocusedDate(target);\n }, [isDisabled, readOnly, currentValue, adapter, displayTimezone]);\n\n const close = useCallback(() => {\n setIsOpen(false);\n }, []);\n\n const toggle = useCallback(() => {\n if (isOpen) {\n close();\n } else {\n open();\n }\n }, [isOpen, open, close]);\n\n const contextValue: DatePickerContextValue = useMemo(\n () => ({\n referenceRef,\n value: currentValue,\n selectDate,\n isOpen,\n open,\n close,\n toggle,\n viewMonth,\n setViewMonth,\n focusedDate,\n setFocusedDate,\n adapter,\n disabled: disabledRules,\n weekStartsOn,\n displayFormat,\n locale,\n displayTimezone,\n isDisabled,\n isReadOnly: readOnly,\n pickerId,\n labels: mergedLabels,\n }),\n [\n currentValue,\n selectDate,\n isOpen,\n open,\n close,\n toggle,\n viewMonth,\n focusedDate,\n adapter,\n disabledRules,\n weekStartsOn,\n displayFormat,\n locale,\n displayTimezone,\n isDisabled,\n readOnly,\n pickerId,\n mergedLabels,\n ],\n );\n\n return <DatePickerContext.Provider value={contextValue}>{children}</DatePickerContext.Provider>;\n}\n","import { forwardRef, useCallback, useEffect, useRef, useState } from 'react';\nimport type { InputHTMLAttributes } from 'react';\nimport { parseInputValue } from '@kalyx/core';\nimport { useDatePickerContext } from '../../context/DatePickerContext.js';\n\nexport interface DatePickerInputProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'value' | 'onChange' | 'type'\n> {\n /** Date display format (defaults to parent's displayFormat) */\n format?: string;\n /**\n * Form field name. When set, a hidden `<input type=\"hidden\" name={name} value={ISO}>`\n * is rendered alongside the visible input so the value participates in native form\n * submission (and integrates with `react-hook-form` Controller-less flows).\n */\n name?: string;\n}\n\n/**\n * DatePicker.Input — Combobox-style text input wired to the DatePicker context.\n *\n * Accepts free-form date typing (parsed via the active adapter), opens the popover\n * on click / `ArrowDown`, and commits typed values on `Enter` / blur.\n */\nexport const DatePickerInput = forwardRef<HTMLInputElement, DatePickerInputProps>(\n function DatePickerInput(\n { format: formatProp, name, onClick, onBlur, onKeyDown, ...props },\n ref,\n ) {\n const ctx = useDatePickerContext('DatePicker.Input');\n const displayFormat = formatProp ?? ctx.displayFormat;\n\n // Text currently being edited (edit mode)\n const [inputText, setInputText] = useState<string | null>(null);\n // IME (composition) state — non-Latin scripts like Korean/Japanese/Chinese fire\n // change events for in-progress composition characters. Parsing those mid-stream\n // throws away the user's input. Defer parsing until composition completes.\n const isComposingRef = useRef(false);\n\n // Drop stale typed text when the value changes from outside (parent re-sets,\n // calendar selection, preset click, etc.) so the input doesn't keep displaying\n // an old half-typed string while the source-of-truth has already moved.\n // Skip during IME composition so we don't wipe an in-flight character.\n useEffect(() => {\n if (isComposingRef.current) return;\n setInputText(null);\n }, [ctx.value]);\n\n let formattedValue = '';\n if (ctx.value) {\n try {\n formattedValue = ctx.adapter.format(ctx.value, displayFormat, ctx.displayTimezone);\n } catch {\n formattedValue = ctx.value;\n }\n }\n const displayValue = inputText !== null ? inputText : formattedValue;\n\n // Open on an explicit pointer click, not on focus — tabbing between form\n // fields should not pop the calendar open, and restoring focus after a\n // selection would otherwise loop us back to open.\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLInputElement>) => {\n if (!ctx.isOpen) ctx.open();\n onClick?.(e);\n },\n [ctx, onClick],\n );\n\n // Single commit path used by blur / change / compositionend / Enter.\n // Returns true when a value was committed (parsed or null).\n const commitText = useCallback(\n (text: string): boolean => {\n if (!text) {\n ctx.selectDate(null);\n setInputText(null);\n return true;\n }\n const parsed = parseInputValue(text, ctx.adapter);\n if (parsed) {\n ctx.selectDate(parsed);\n setInputText(null);\n return true;\n }\n return false;\n },\n [ctx],\n );\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n if (inputText !== null) {\n commitText(inputText);\n setInputText(null);\n }\n onBlur?.(e);\n },\n [inputText, commitText, onBlur],\n );\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const text = e.target.value;\n setInputText(text);\n // Don't try to parse partial IME composition output (e.g. \"ㅇ\" before\n // the full Korean syllable is committed). The compositionend handler\n // will parse the final committed value.\n if (isComposingRef.current) return;\n commitText(text);\n },\n [commitText],\n );\n\n const handleCompositionStart = useCallback(() => {\n isComposingRef.current = true;\n }, []);\n\n const handleCompositionEnd = useCallback(\n (e: React.CompositionEvent<HTMLInputElement>) => {\n isComposingRef.current = false;\n commitText((e.target as HTMLInputElement).value);\n },\n [commitText],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Escape') {\n ctx.close();\n } else if (e.key === 'Enter') {\n // Block form submission while the calendar is open. Otherwise an Enter\n // intended to commit a typed date (or simply navigate inside the popover)\n // bubbles up and submits the surrounding <form>, which surprised users.\n if (ctx.isOpen) e.preventDefault();\n if (inputText !== null) {\n commitText(inputText);\n } else if (ctx.isOpen) {\n // No typed text but the popover is open — commit the calendar's\n // currently focused day so Enter \"just works\" even when focus\n // never made it from the input to the day button (notably WebKit).\n ctx.selectDate(ctx.focusedDate);\n }\n } else if (e.key === 'ArrowDown' && !ctx.isOpen) {\n e.preventDefault();\n ctx.open();\n }\n onKeyDown?.(e);\n },\n [ctx, inputText, commitText, onKeyDown],\n );\n\n const calendarId = `${ctx.pickerId}-calendar`;\n\n return (\n <>\n <input\n ref={(node) => {\n // Register as Floating UI reference\n ctx.referenceRef.current = node;\n // Forward the ref\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n }}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={ctx.isOpen}\n aria-haspopup=\"dialog\"\n aria-controls={ctx.isOpen ? calendarId : undefined}\n aria-autocomplete=\"none\"\n autoComplete=\"off\"\n value={displayValue}\n disabled={ctx.isDisabled || props.disabled}\n readOnly={ctx.isReadOnly}\n onChange={handleChange}\n onClick={handleClick}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n onCompositionStart={handleCompositionStart}\n onCompositionEnd={handleCompositionEnd}\n {...props}\n />\n {/* Hidden field for native form submission. Skipped when no `name` is set\n so we don't leak an empty field into the form data unintentionally. */}\n {name ? <input type=\"hidden\" name={name} value={ctx.value ?? ''} /> : null}\n </>\n );\n },\n);\n\nDatePickerInput.displayName = 'DatePicker.Input';\n","import { forwardRef, useCallback } from 'react';\nimport type { ButtonHTMLAttributes, ReactNode } from 'react';\nimport { useDatePickerContext } from '../../context/DatePickerContext.js';\n\nexport interface DatePickerTriggerProps extends Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n 'type'\n> {\n children?: ReactNode;\n}\n\n/**\n * DatePicker.Trigger — Calendar icon button. Toggles the popover on click and\n * announces its state via `aria-expanded` / `aria-haspopup=\"dialog\"`.\n *\n * If you render a `DatePicker.Input`, the input acts as the popover reference;\n * Trigger is purely auxiliary. Without an Input, Trigger becomes the reference.\n */\nexport const DatePickerTrigger = forwardRef<HTMLButtonElement, DatePickerTriggerProps>(\n function DatePickerTrigger({ onClick, children, ...props }, ref) {\n const ctx = useDatePickerContext('DatePicker.Trigger');\n\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n ctx.toggle();\n onClick?.(e);\n },\n [ctx, onClick],\n );\n\n const calendarId = `${ctx.pickerId}-calendar`;\n\n return (\n <button\n ref={(node) => {\n // If there's no Input, Trigger becomes the reference\n if (!ctx.referenceRef.current) ctx.referenceRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n }}\n type=\"button\"\n tabIndex={0}\n aria-label={ctx.isOpen ? ctx.labels.triggerClose : ctx.labels.triggerOpen}\n aria-expanded={ctx.isOpen}\n aria-haspopup=\"dialog\"\n aria-controls={ctx.isOpen ? calendarId : undefined}\n disabled={ctx.isDisabled || props.disabled}\n onClick={handleClick}\n {...props}\n >\n {children ?? (\n <svg\n aria-hidden=\"true\"\n focusable=\"false\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M5 1v2M11 1v2M1 6h14M3 3h10a2 2 0 012 2v8a2 2 0 01-2 2H3a2 2 0 01-2-2V5a2 2 0 012-2z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </button>\n );\n },\n);\n\nDatePickerTrigger.displayName = 'DatePicker.Trigger';\n","import { useCallback, useEffect, useRef } from 'react';\nimport { useFloating, autoUpdate, offset, flip, shift } from '@floating-ui/react';\nimport type { Middleware, Placement } from '@floating-ui/react';\n\n// Hoisted to module scope so it isn't reallocated on every render. Floating UI\n// shallow-compares the middleware array, so a fresh array each render forced\n// useless reposition cycles.\nconst POPOVER_MIDDLEWARE: Middleware[] = [offset(4), flip(), shift({ padding: 8 })];\n\nexport interface UsePopoverOptions {\n isOpen: boolean;\n close: () => void;\n referenceRef: React.RefObject<HTMLElement | null>;\n placement?: Placement;\n}\n\n/**\n * Shared popover behavior: Floating UI positioning, outside-click detection,\n * Escape key handling, and focus restoration on close.\n *\n * Extracted to eliminate duplication between DatePicker.Popover and RangePicker.Popover.\n * Follows the pattern used by Radix UI's usePopover and Ark UI's dismissable layer.\n */\nexport function usePopover({\n isOpen,\n close,\n referenceRef,\n placement = 'bottom-start',\n}: UsePopoverOptions) {\n const floatingRef = useRef<HTMLDivElement | null>(null);\n const previousFocusRef = useRef<HTMLElement | null>(null);\n\n const { refs, floatingStyles, isPositioned } = useFloating({\n open: isOpen,\n placement,\n middleware: POPOVER_MIDDLEWARE,\n whileElementsMounted: autoUpdate,\n });\n\n // Wire the context's referenceRef into Floating UI as a fallback for cases\n // where the popover mounts before reference is updated. The ref callback in\n // setFloatingRef below handles the common synchronous case.\n useEffect(() => {\n if (referenceRef.current) {\n refs.setReference(referenceRef.current);\n }\n }, [referenceRef, refs, isOpen]);\n\n // Focus restoration: restore focus to the previous element on close.\n // Skip restoration to the reference element itself (Input auto-opens on\n // focus, which would immediately reopen the popover).\n useEffect(() => {\n if (isOpen) {\n previousFocusRef.current = document.activeElement as HTMLElement;\n } else if (previousFocusRef.current) {\n const el = previousFocusRef.current;\n previousFocusRef.current = null;\n if (el !== referenceRef.current && typeof el.focus === 'function') {\n el.focus({ preventScroll: true });\n }\n }\n }, [isOpen, referenceRef]);\n\n // Detect outside clicks\n useEffect(() => {\n if (!isOpen) return;\n\n function handleClickOutside(e: MouseEvent) {\n const floating = floatingRef.current;\n const reference = referenceRef.current;\n const target = e.target as Node;\n if (floating && !floating.contains(target) && (!reference || !reference.contains(target))) {\n close();\n }\n }\n\n // Register on next tick to skip the current click event\n const timer = setTimeout(() => {\n document.addEventListener('mousedown', handleClickOutside);\n }, 0);\n\n return () => {\n clearTimeout(timer);\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isOpen, close, referenceRef]);\n\n // Escape key\n useEffect(() => {\n if (!isOpen) return;\n\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n close();\n }\n }\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, close]);\n\n // Focus-out: when the user tabs out of the popover (and out of the reference\n // element), close the popover. This isn't a focus *trap* — keyboard users can\n // still leave with Tab — but it follows the Radix/Ark pattern of closing the\n // overlay when focus leaves so it doesn't dangle while the user is elsewhere.\n useEffect(() => {\n if (!isOpen) return;\n\n function handleFocusOut(e: FocusEvent) {\n // `relatedTarget` is the element receiving focus. If it's null (focus left\n // the document), or if it's outside both the floating layer and reference,\n // close.\n const next = e.relatedTarget as Node | null;\n const floating = floatingRef.current;\n const reference = referenceRef.current;\n if (!next) return; // focus moved to body — leave popover alone\n const insideFloating = floating?.contains(next) ?? false;\n const insideReference = reference?.contains(next) ?? false;\n if (!insideFloating && !insideReference) {\n close();\n }\n }\n\n // `focusout` bubbles, so attach to the floating root once it's mounted.\n const node = floatingRef.current;\n if (!node) return;\n node.addEventListener('focusout', handleFocusOut);\n return () => node.removeEventListener('focusout', handleFocusOut);\n }, [isOpen, close, referenceRef]);\n\n // Set floating + reference together when the popover mounts. The reference\n // is already attached via Input/Trigger's ref callback by the time the\n // popover renders, so calling setReference here means Floating UI has both\n // elements before paint — eliminating the unpositioned first-frame flash.\n const setFloatingRef = useCallback(\n (node: HTMLDivElement | null) => {\n floatingRef.current = node;\n refs.setFloating(node);\n if (node && referenceRef.current) {\n refs.setReference(referenceRef.current);\n }\n },\n [refs, referenceRef],\n );\n\n return { floatingStyles, setFloatingRef, isPositioned };\n}\n","import type { HTMLAttributes, ReactNode } from 'react';\nimport { useDatePickerContext } from '../../context/DatePickerContext.js';\nimport { usePopover } from '../../hooks/usePopover.js';\n\nexport interface DatePickerPopoverProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role'> {\n children?: ReactNode;\n}\n\nexport function DatePickerPopover({ children, ...props }: DatePickerPopoverProps) {\n const ctx = useDatePickerContext('DatePicker.Popover');\n const calendarId = `${ctx.pickerId}-calendar`;\n\n const { floatingStyles, setFloatingRef, isPositioned } = usePopover({\n isOpen: ctx.isOpen,\n close: ctx.close,\n referenceRef: ctx.referenceRef,\n });\n\n if (!ctx.isOpen) return null;\n\n const { style: userStyle, ...rest } = props;\n\n return (\n <div\n ref={setFloatingRef}\n id={calendarId}\n role=\"dialog\"\n aria-label={ctx.labels.popoverLabel}\n aria-modal=\"false\"\n {...rest}\n style={{\n ...userStyle,\n ...floatingStyles,\n visibility: isPositioned ? undefined : 'hidden',\n }}\n >\n {children}\n </div>\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { HTMLAttributes } from 'react';\nimport {\n getCalendarDays,\n getISOWeekNumber,\n isDateDisabled,\n getWeekdayNames,\n formatMonthYear,\n formatFullDate,\n} from '@kalyx/core';\nimport type { CalendarDay } from '@kalyx/core';\nimport { useDatePickerContext } from '../../context/DatePickerContext.js';\n\nexport interface DatePickerCalendarClassNames {\n root?: string;\n header?: string;\n title?: string;\n navButton?: string;\n grid?: string;\n gridRow?: string;\n gridCell?: string;\n day?: string;\n daySelected?: string;\n dayToday?: string;\n dayDisabled?: string;\n dayOutsideMonth?: string;\n weekdayHeader?: string;\n /** Header cell at the top of the week-number column. Rendered only when `showWeekNumber` is set. */\n weekNumberHeader?: string;\n /** Each row's week-number cell. Rendered only when `showWeekNumber` is set. */\n weekNumber?: string;\n}\n\nexport interface DatePickerCalendarProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role'> {\n classNames?: DatePickerCalendarClassNames;\n /** Called when the title (\"January 2026\") is clicked. Useful for switching to Month/Year views. */\n onTitleClick?: () => void;\n /**\n * Render an ISO 8601 week-number column on the left of the grid (1–53).\n * The column is a `<th scope=\"row\">`; it doesn't participate in the WAI-ARIA grid\n * data region, so keyboard navigation across the date cells is unaffected.\n */\n showWeekNumber?: boolean;\n /**\n * Always render 6 weeks (42 cells), even when the month fits in 4 or 5 rows. Useful for\n * popover layouts that need a fixed height across month navigation.\n */\n fixedWeeks?: boolean;\n}\n\n/** Safe wrapper for formatFullDate — falls back to ISO string on error */\nfunction safeFormatFullDate(iso: string, locale: string): string {\n try {\n return formatFullDate(iso, locale);\n } catch {\n return iso;\n }\n}\n\n/** Visually-hidden style for screen-reader-only content */\nconst srOnly: React.CSSProperties = {\n position: 'absolute',\n width: '1px',\n height: '1px',\n padding: 0,\n margin: '-1px',\n overflow: 'hidden',\n clip: 'rect(0, 0, 0, 0)',\n whiteSpace: 'nowrap',\n border: 0,\n};\n\nexport function DatePickerCalendar({\n classNames,\n onTitleClick,\n showWeekNumber = false,\n fixedWeeks = false,\n ...props\n}: DatePickerCalendarProps) {\n const ctx = useDatePickerContext('DatePicker.Calendar');\n const gridRef = useRef<HTMLTableElement>(null);\n const [announcement, setAnnouncement] = useState('');\n\n const { adapter, viewMonth, focusedDate, weekStartsOn, disabled, locale, displayTimezone } = ctx;\n // Memoized — weekday header tuples only change when locale or week start changes.\n const weekdays = useMemo(() => getWeekdayNames(locale, weekStartsOn), [locale, weekStartsOn]);\n\n // Recompute cell flags with a timezone-aware today/selected matcher when displayTimezone is set.\n // The grid iteration stays in UTC — only the `isSelected` / `isToday` highlighting shifts.\n // Memoized so the 42-cell grid isn't rebuilt on unrelated re-renders (parent state, etc.).\n const weeks = useMemo(\n () =>\n getCalendarDays(viewMonth, adapter, {\n weekStartsOn,\n selected: ctx.value,\n focusedDate,\n disabled,\n timezone: displayTimezone,\n fixedWeeks,\n }),\n [\n viewMonth,\n adapter,\n weekStartsOn,\n ctx.value,\n focusedDate,\n disabled,\n displayTimezone,\n fixedWeeks,\n ],\n );\n\n // For each row, derive the ISO week number from the Thursday cell — Thursday is always\n // in the row's \"owning\" ISO week regardless of weekStartsOn, so this is stable across\n // week-start configurations.\n const thursdayIndex = weekStartsOn === 0 ? 4 : 3;\n\n const year = adapter.getYear(viewMonth);\n const month = adapter.getMonth(viewMonth);\n const title = formatMonthYear(year, month, locale);\n\n // Move focus to the focused day cell. `preventScroll` avoids the page\n // jumping when the calendar mounts below an input/trigger that's already\n // scrolled into view.\n useEffect(() => {\n if (!ctx.isOpen || !gridRef.current) return;\n const focusedButton = gridRef.current.querySelector<HTMLButtonElement>('[data-focused=\"true\"]');\n focusedButton?.focus({ preventScroll: true });\n }, [focusedDate, ctx.isOpen]);\n\n const navigateMonth = useCallback(\n (direction: number) => {\n const newMonth = adapter.addMonths(viewMonth, direction);\n ctx.setViewMonth(newMonth);\n ctx.setFocusedDate(adapter.startOfMonth(newMonth));\n const y = adapter.getYear(newMonth);\n const m = adapter.getMonth(newMonth);\n setAnnouncement(formatMonthYear(y, m, locale));\n },\n [adapter, viewMonth, ctx, locale],\n );\n\n const handleDayClick = useCallback(\n (day: CalendarDay) => {\n if (day.isDisabled) return;\n ctx.selectDate(day.isoString);\n setAnnouncement(safeFormatFullDate(day.isoString, locale));\n },\n [ctx, locale],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n let newFocused: string | null = null;\n\n switch (e.key) {\n case 'ArrowLeft':\n newFocused = adapter.addDays(focusedDate, -1);\n break;\n case 'ArrowRight':\n newFocused = adapter.addDays(focusedDate, 1);\n break;\n case 'ArrowUp':\n newFocused = adapter.addDays(focusedDate, -7);\n break;\n case 'ArrowDown':\n newFocused = adapter.addDays(focusedDate, 7);\n break;\n case 'PageUp':\n if (e.shiftKey) {\n newFocused = adapter.addYears(focusedDate, -1);\n } else {\n newFocused = adapter.addMonths(focusedDate, -1);\n }\n break;\n case 'PageDown':\n if (e.shiftKey) {\n newFocused = adapter.addYears(focusedDate, 1);\n } else {\n newFocused = adapter.addMonths(focusedDate, 1);\n }\n break;\n case 'Home':\n newFocused = adapter.startOfWeek(focusedDate, weekStartsOn);\n break;\n case 'End':\n newFocused = adapter.endOfWeek(focusedDate, weekStartsOn);\n // endOfWeek returns 23:59:59; normalize to start of day\n newFocused = adapter.startOfDay(newFocused);\n break;\n case 'Enter':\n case ' ':\n e.preventDefault();\n if (!isDateDisabled(focusedDate, disabled, adapter)) {\n ctx.selectDate(focusedDate);\n }\n return;\n case 'Escape':\n ctx.close();\n return;\n default:\n return;\n }\n\n if (newFocused) {\n e.preventDefault();\n\n // WAI-ARIA grid pattern: disabled cells should be skipped during keyboard\n // navigation. Keep stepping in the original direction until we land on an\n // enabled day, capped at 42 attempts (one full grid) to avoid infinite loops\n // when every day in range is disabled.\n const skipStep =\n e.key === 'ArrowLeft' || e.key === 'ArrowUp' || e.key === 'PageUp' || e.key === 'Home'\n ? -1\n : 1;\n let attempts = 0;\n while (isDateDisabled(newFocused, disabled, adapter) && attempts < 42) {\n newFocused = adapter.addDays(newFocused, skipStep);\n attempts++;\n }\n if (attempts >= 42) {\n // No reachable enabled date in this direction — leave focus where it was.\n return;\n }\n\n ctx.setFocusedDate(newFocused);\n\n // Update the view when focus moves outside the current view month\n if (!adapter.isSameMonth(newFocused, viewMonth)) {\n ctx.setViewMonth(newFocused);\n }\n }\n },\n [adapter, focusedDate, viewMonth, weekStartsOn, disabled, ctx],\n );\n\n return (\n <div className={classNames?.root} {...props}>\n <div className={classNames?.header}>\n <button\n type=\"button\"\n className={classNames?.navButton}\n onClick={() => navigateMonth(-1)}\n aria-label={ctx.labels.prevMonth}\n >\n <\n </button>\n {onTitleClick ? (\n <button\n type=\"button\"\n className={classNames?.title}\n onClick={onTitleClick}\n aria-live=\"polite\"\n >\n {title}\n </button>\n ) : (\n <span className={classNames?.title} aria-live=\"polite\">\n {title}\n </span>\n )}\n <button\n type=\"button\"\n className={classNames?.navButton}\n onClick={() => navigateMonth(1)}\n aria-label={ctx.labels.nextMonth}\n >\n >\n </button>\n </div>\n\n <table\n ref={gridRef}\n role=\"grid\"\n aria-label={title}\n aria-rowcount={weeks.length + 1}\n aria-colcount={7}\n className={classNames?.grid}\n onKeyDown={handleKeyDown}\n >\n <thead>\n <tr role=\"row\" aria-rowindex={1}>\n {showWeekNumber ? (\n <th scope=\"col\" aria-hidden=\"true\" className={classNames?.weekNumberHeader}>\n #\n </th>\n ) : null}\n {weekdays.map((day, colIndex) => (\n <th\n key={day.short}\n role=\"columnheader\"\n abbr={day.full}\n scope=\"col\"\n aria-colindex={colIndex + 1}\n className={classNames?.weekdayHeader}\n >\n {day.short}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {weeks.map((week, weekIndex) => (\n <tr\n key={weekIndex}\n role=\"row\"\n aria-rowindex={weekIndex + 2}\n className={classNames?.gridRow}\n >\n {showWeekNumber ? (\n <th\n scope=\"row\"\n aria-hidden=\"true\"\n className={classNames?.weekNumber}\n data-week-number\n >\n {getISOWeekNumber(week[thursdayIndex]!.isoString)}\n </th>\n ) : null}\n {week.map((day, colIndex) => {\n const dayClasses =\n [\n classNames?.day,\n day.isSelected && classNames?.daySelected,\n day.isToday && classNames?.dayToday,\n day.isDisabled && classNames?.dayDisabled,\n !day.isCurrentMonth && classNames?.dayOutsideMonth,\n ]\n .filter(Boolean)\n .join(' ') || undefined;\n\n return (\n <td\n key={day.isoString}\n role=\"gridcell\"\n aria-colindex={colIndex + 1}\n aria-selected={day.isSelected || undefined}\n aria-disabled={day.isDisabled || undefined}\n aria-current={day.isToday ? 'date' : undefined}\n className={classNames?.gridCell}\n >\n <button\n type=\"button\"\n tabIndex={day.isFocused ? 0 : -1}\n disabled={day.isDisabled}\n data-focused={day.isFocused || undefined}\n data-selected={day.isSelected || undefined}\n data-today={day.isToday || undefined}\n data-outside-month={!day.isCurrentMonth || undefined}\n className={dayClasses}\n onClick={() => handleDayClick(day)}\n aria-label={safeFormatFullDate(day.isoString, locale)}\n >\n {day.dayNumber}\n </button>\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n\n <div role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" style={srOnly}>\n {announcement}\n </div>\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport type { KeyboardEvent } from 'react';\nimport type { DateAdapter, DisabledRule, ISODateString } from '@kalyx/core';\n\n/**\n * A range of dates `[start, end]` is \"fully disabled\" when every day in it is\n * excluded by a `before` or `after` rule. `date` and `dayOfWeek` rules only\n * disable individual days, so they never disable an entire range.\n *\n * Used by `MonthPicker.Grid` and `YearPicker.Grid` to mark a whole month or\n * year unselectable when min/max bounds rule it out.\n */\nexport function isRangeFullyDisabled(\n start: ISODateString,\n end: ISODateString,\n rules: DisabledRule[],\n adapter: DateAdapter,\n): boolean {\n for (const rule of rules) {\n if ('before' in rule && adapter.isBefore(end, rule.before)) return true;\n if ('after' in rule && adapter.isAfter(start, rule.after)) return true;\n }\n return false;\n}\n\nexport interface UseGridStateOptions {\n /** Initial focused-cell index (0..11). */\n initialIndex: number;\n /**\n * Per-cell disabled flags (length 12). When provided, keyboard navigation\n * skips cells where the flag is true; if no enabled cell remains in the\n * travel direction, focus is left where it was.\n */\n disabledFlags?: boolean[];\n /** Enter / Space — receives the focused index. */\n onSelect: (index: number) => void;\n /** PageUp — typically navigates to the previous frame (year/decade). */\n onPageUp: () => void;\n /** PageDown — typically navigates to the next frame. */\n onPageDown: () => void;\n /** Escape — typically closes the popover. */\n onEscape: () => void;\n}\n\n/**\n * Shared WAI-ARIA grid keyboard handler + roving-focus state for the four 3×4\n * picker grids (`DatePicker.MonthGrid` / `YearGrid`, `MonthPicker.Grid`,\n * `YearPicker.Grid`).\n *\n * - Arrow keys: ±1 column / ±3 rows, clamped to grid bounds.\n * - Home / End: row-first / row-last cell.\n * - PageUp / PageDown: delegated to caller (year/decade navigation).\n * - Enter / Space: delegated commit/drilldown.\n * - Disabled cells (when `disabledFlags` is provided) are skipped in the\n * original travel direction.\n * - Auto-refocus on focusedIndex change. (All four grids use stable index\n * keys, so DOM nodes persist across page nav and DOM focus is preserved\n * without an extra dependency.)\n */\nexport function useGridState(opts: UseGridStateOptions) {\n const { initialIndex, disabledFlags, onSelect, onPageUp, onPageDown, onEscape } = opts;\n const gridRef = useRef<HTMLDivElement>(null);\n const [focusedIndex, setFocusedIndex] = useState<number>(initialIndex);\n\n const handleKeyDown = (e: KeyboardEvent) => {\n let next: number | null = null;\n let step = 1;\n switch (e.key) {\n case 'ArrowLeft':\n next = Math.max(0, focusedIndex - 1);\n step = -1;\n break;\n case 'ArrowRight':\n next = Math.min(11, focusedIndex + 1);\n break;\n case 'ArrowUp':\n next = Math.max(0, focusedIndex - 3);\n step = -1;\n break;\n case 'ArrowDown':\n next = Math.min(11, focusedIndex + 3);\n break;\n case 'Home':\n next = focusedIndex - (focusedIndex % 3);\n step = -1;\n break;\n case 'End':\n next = focusedIndex - (focusedIndex % 3) + 2;\n break;\n case 'PageUp':\n e.preventDefault();\n onPageUp();\n return;\n case 'PageDown':\n e.preventDefault();\n onPageDown();\n return;\n case 'Enter':\n case ' ':\n e.preventDefault();\n onSelect(focusedIndex);\n return;\n case 'Escape':\n onEscape();\n return;\n default:\n return;\n }\n if (next === null) return;\n e.preventDefault();\n\n if (disabledFlags) {\n let attempts = 0;\n while (next >= 0 && next < 12 && disabledFlags[next] && attempts < 12) {\n next += step;\n attempts++;\n }\n if (next < 0 || next >= 12 || disabledFlags[next]) return;\n }\n if (next !== focusedIndex) setFocusedIndex(next);\n };\n\n // Re-anchor focus when the cell at `focusedIndex` has become disabled\n // (e.g. after the consumer navigated to a year where the same column is now\n // out of range). A `disabled` HTML button can't receive DOM focus, so\n // without this we'd land focus on nothing and the user would lose keyboard\n // navigation.\n useEffect(() => {\n if (!disabledFlags || !disabledFlags[focusedIndex]) return;\n const firstEnabled = disabledFlags.findIndex((d) => !d);\n if (firstEnabled !== -1 && firstEnabled !== focusedIndex) {\n setFocusedIndex(firstEnabled);\n }\n }, [disabledFlags, focusedIndex]);\n\n useEffect(() => {\n const btn = gridRef.current?.querySelector<HTMLButtonElement>('[data-focused=\"true\"]');\n btn?.focus({ preventScroll: true });\n }, [focusedIndex]);\n\n return { gridRef, focusedIndex, handleKeyDown };\n}\n","import { useCallback, useEffect, useState } from 'react';\nimport type { HTMLAttributes } from 'react';\nimport { getMonthName, type ISODateString } from '@kalyx/core';\nimport { useDatePickerContext } from '../../context/DatePickerContext.js';\nimport { useGridState } from '../_shared/grid-keyboard.js';\n\nexport interface DatePickerMonthGridClassNames {\n root?: string;\n header?: string;\n title?: string;\n navButton?: string;\n grid?: string;\n month?: string;\n monthSelected?: string;\n monthCurrent?: string;\n}\n\nexport interface DatePickerMonthGridProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role'> {\n classNames?: DatePickerMonthGridClassNames;\n /** Called when a month is selected. Typically used to switch back to the day view. */\n onSelect?: () => void;\n /** Called when the title (year) is clicked. Useful for switching to the year view. */\n onTitleClick?: () => void;\n}\n\n/**\n * DatePicker.MonthGrid — Quickly pick a month from a 12-month grid.\n * Click Calendar title -> MonthGrid -> click a month -> back to Calendar.\n *\n * @example\n * ```tsx\n * {view === 'months' && (\n * <DatePicker.MonthGrid\n * onSelect={() => setView('days')}\n * onTitleClick={() => setView('years')}\n * />\n * )}\n * ```\n */\nexport function DatePickerMonthGrid({\n classNames,\n onSelect,\n onTitleClick,\n ...props\n}: DatePickerMonthGridProps) {\n const ctx = useDatePickerContext('DatePicker.MonthGrid');\n const { adapter, viewMonth, locale, displayTimezone } = ctx;\n\n const currentYear = adapter.getYear(viewMonth);\n const currentMonth = adapter.getMonth(viewMonth);\n // SSR-safe: today is null on server and during hydration, set after mount.\n // Avoids server/client clock-mismatch hydration warnings across day boundaries.\n const [today, setToday] = useState<ISODateString | null>(null);\n useEffect(() => {\n setToday(adapter.today(displayTimezone));\n }, [adapter, displayTimezone]);\n const todayMonth = today !== null ? adapter.getMonth(today) : -1;\n const todayYear = today !== null ? adapter.getYear(today) : -1;\n\n const navigateYear = useCallback(\n (direction: number) => {\n ctx.setViewMonth(adapter.addYears(viewMonth, direction));\n },\n [adapter, viewMonth, ctx],\n );\n\n const handleMonthSelect = useCallback(\n (monthIndex: number) => {\n const target = new Date(Date.UTC(currentYear, monthIndex, 1)).toISOString();\n ctx.setViewMonth(target);\n ctx.setFocusedDate(target);\n onSelect?.();\n },\n [currentYear, ctx, onSelect],\n );\n\n const { gridRef, focusedIndex, handleKeyDown } = useGridState({\n initialIndex: currentMonth,\n onSelect: handleMonthSelect,\n onPageUp: () => navigateYear(-1),\n onPageDown: () => navigateYear(1),\n onEscape: ctx.close,\n });\n\n return (\n <div className={classNames?.root} {...props}>\n <div className={classNames?.header}>\n <button\n type=\"button\"\n className={classNames?.navButton}\n onClick={() => navigateYear(-1)}\n aria-label={ctx.labels.prevYear}\n >\n <\n </button>\n {onTitleClick ? (\n <button type=\"button\" className={classNames?.title} onClick={onTitleClick}>\n {currentYear}\n </button>\n ) : (\n <span className={classNames?.title}>{currentYear}</span>\n )}\n <button\n type=\"button\"\n className={classNames?.navButton}\n onClick={() => navigateYear(1)}\n aria-label={ctx.labels.nextYear}\n >\n >\n </button>\n </div>\n\n <div\n ref={gridRef}\n role=\"grid\"\n aria-label={`${currentYear} months`}\n className={classNames?.grid}\n style={{ display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)' }}\n onKeyDown={handleKeyDown}\n >\n {Array.from({ length: 12 }, (_, i) => {\n const isSelected = i === currentMonth;\n const isCurrent = i === todayMonth && currentYear === todayYear;\n const isFocused = i === focusedIndex;\n const cls =\n [\n classNames?.month,\n isSelected && classNames?.monthSelected,\n isCurrent && classNames?.monthCurrent,\n ]\n .filter(Boolean)\n .join(' ') || undefined;\n\n return (\n <button\n key={i}\n type=\"button\"\n role=\"gridcell\"\n tabIndex={isFocused ? 0 : -1}\n aria-selected={isSelected || undefined}\n aria-current={isCurrent ? 'date' : undefined}\n data-selected={isSelected || undefined}\n data-current={isCurrent || undefined}\n data-focused={isFocused || undefined}\n className={cls}\n onClick={() => handleMonthSelect(i)}\n >\n {getMonthName(i, locale)}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n","import { useCallback, useEffect, useState } from 'react';\nimport type { HTMLAttributes } from 'react';\nimport type { ISODateString } from '@kalyx/core';\nimport { useDatePickerContext } from '../../context/DatePickerContext.js';\nimport { useGridState } from '../_shared/grid-keyboard.js';\n\nexport interface DatePickerYearGridClassNames {\n root?: string;\n header?: string;\n title?: string;\n navButton?: string;\n grid?: string;\n year?: string;\n yearSelected?: string;\n yearCurrent?: string;\n}\n\nexport interface DatePickerYearGridProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role'> {\n classNames?: DatePickerYearGridClassNames;\n /** Called when a year is selected. Typically used to switch back to the month view. */\n onSelect?: () => void;\n}\n\n/**\n * DatePicker.YearGrid — Quickly pick a year from a 12-year grid.\n * Click MonthGrid title -> YearGrid -> click a year -> back to MonthGrid.\n *\n * @example\n * ```tsx\n * {view === 'years' && (\n * <DatePicker.YearGrid onSelect={() => setView('months')} />\n * )}\n * ```\n */\nexport function DatePickerYearGrid({ classNames, onSelect, ...props }: DatePickerYearGridProps) {\n const ctx = useDatePickerContext('DatePicker.YearGrid');\n const { adapter, viewMonth, displayTimezone } = ctx;\n\n const currentYear = adapter.getYear(viewMonth);\n // SSR-safe: today is null on server and during hydration, set after mount.\n const [today, setToday] = useState<ISODateString | null>(null);\n useEffect(() => {\n setToday(adapter.today(displayTimezone));\n }, [adapter, displayTimezone]);\n const todayYear = today !== null ? adapter.getYear(today) : -1;\n\n // 12-year range (decade block containing the current year)\n const decadeStart = currentYear - (currentYear % 12);\n\n const navigateDecade = useCallback(\n (direction: number) => {\n ctx.setViewMonth(adapter.addYears(viewMonth, direction * 12));\n },\n [adapter, viewMonth, ctx],\n );\n\n const handleYearSelect = useCallback(\n (indexInDecade: number) => {\n const year = decadeStart + indexInDecade;\n const currentMonth = adapter.getMonth(viewMonth);\n const target = new Date(Date.UTC(year, currentMonth, 1)).toISOString();\n ctx.setViewMonth(target);\n ctx.setFocusedDate(target);\n onSelect?.();\n },\n [adapter, viewMonth, ctx, onSelect, decadeStart],\n );\n\n const { gridRef, focusedIndex, handleKeyDown } = useGridState({\n initialIndex: currentYear - decadeStart,\n onSelect: handleYearSelect,\n onPageUp: () => navigateDecade(-1),\n onPageDown: () => navigateDecade(1),\n onEscape: ctx.close,\n });\n\n const rangeLabel = `${decadeStart}–${decadeStart + 11}`;\n\n return (\n <div className={classNames?.root} {...props}>\n <div className={classNames?.header}>\n <button\n type=\"button\"\n className={classNames?.navButton}\n onClick={() => navigateDecade(-1)}\n aria-label={ctx.labels.prevDecade}\n >\n <\n </button>\n <span className={classNames?.title}>{rangeLabel}</span>\n <button\n type=\"button\"\n className={classNames?.navButton}\n onClick={() => navigateDecade(1)}\n aria-label={ctx.labels.nextDecade}\n >\n >\n </button>\n </div>\n\n <div\n ref={gridRef}\n role=\"grid\"\n aria-label={rangeLabel}\n className={classNames?.grid}\n style={{ display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)' }}\n onKeyDown={handleKeyDown}\n >\n {Array.from({ length: 12 }, (_, i) => {\n const year = decadeStart + i;\n const isSelected = year === currentYear;\n const isCurrent = year === todayYear;\n const isFocused = i === focusedIndex;\n const cls =\n [\n classNames?.year,\n isSelected && classNames?.yearSelected,\n isCurrent && classNames?.yearCurrent,\n ]\n .filter(Boolean)\n .join(' ') || undefined;\n return (\n <button\n // Stable index key keeps the DOM node mounted across decade\n // navigation so focus on the same-position cell persists.\n key={i}\n type=\"button\"\n role=\"gridcell\"\n tabIndex={isFocused ? 0 : -1}\n aria-selected={isSelected || undefined}\n aria-current={isCurrent ? 'date' : undefined}\n data-selected={isSelected || undefined}\n data-current={isCurrent || undefined}\n data-focused={isFocused || undefined}\n className={cls}\n onClick={() => handleYearSelect(i)}\n >\n {year}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n","import { useCallback } from 'react';\nimport type { HTMLAttributes, ReactNode } from 'react';\nimport type { ISODateString } from '@kalyx/core';\nimport { useDatePickerContext } from '../../context/DatePickerContext.js';\n\n/** Predefined single-date preset keys. Pass a custom ISO via `date` for anything else. */\nexport type DatePickerPresetKey =\n | 'today'\n | 'tomorrow'\n | 'yesterday'\n | 'startOfMonth'\n | 'endOfMonth'\n | 'startOfYear';\n\nexport interface DatePickerPresetsClassNames {\n root?: string;\n preset?: string;\n presetActive?: string;\n}\n\nexport interface DatePickerPresetsProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role'> {\n classNames?: DatePickerPresetsClassNames;\n children?: ReactNode;\n}\n\n/**\n * DatePicker.Presets — Container wrapping preset buttons.\n *\n * @example\n * ```tsx\n * <DatePicker.Presets>\n * <DatePicker.Preset value=\"today\">Today</DatePicker.Preset>\n * <DatePicker.Preset value=\"tomorrow\">Tomorrow</DatePicker.Preset>\n * </DatePicker.Presets>\n * ```\n */\nexport function DatePickerPresets({ classNames, children, ...props }: DatePickerPresetsProps) {\n const ctx = useDatePickerContext('DatePicker.Presets');\n return (\n <div role=\"group\" aria-label={ctx.labels.popoverLabel} className={classNames?.root} {...props}>\n {children}\n </div>\n );\n}\n\ntype PresetAdapter = {\n addDays: (iso: string, n: number) => string;\n startOfMonth: (iso: string) => string;\n endOfMonth: (iso: string) => string;\n startOfDay: (iso: string, timezone?: string) => string;\n addMonths: (iso: string, n: number) => string;\n getMonth: (iso: string) => number;\n};\n\nfunction resolveDatePreset(\n key: DatePickerPresetKey,\n today: ISODateString,\n adapter: PresetAdapter,\n): ISODateString {\n switch (key) {\n case 'today':\n return today;\n case 'tomorrow':\n return adapter.addDays(today, 1);\n case 'yesterday':\n return adapter.addDays(today, -1);\n case 'startOfMonth':\n return adapter.startOfMonth(today);\n case 'endOfMonth':\n return adapter.startOfDay(adapter.endOfMonth(today));\n case 'startOfYear': {\n const currentMonth = adapter.getMonth(today);\n return adapter.startOfMonth(adapter.addMonths(today, -currentMonth));\n }\n }\n}\n\nexport interface DatePickerPresetProps extends Omit<HTMLAttributes<HTMLButtonElement>, 'value'> {\n /** Predefined preset key; omit when passing `date` directly */\n value?: DatePickerPresetKey;\n /** Pass an ISO date directly (alternative to `value`) */\n date?: ISODateString;\n children: ReactNode;\n className?: string;\n}\n\n/**\n * DatePicker.Preset — One-click preset button to select a specific date.\n *\n * Pass either `value` (a preset key) or `date` (a direct ISO string).\n *\n * @example\n * ```tsx\n * <DatePicker.Preset value=\"today\">Today</DatePicker.Preset>\n * <DatePicker.Preset date=\"2026-01-01T00:00:00.000Z\">New Year's</DatePicker.Preset>\n * ```\n */\nexport function DatePickerPreset({\n value: presetKey,\n date: directDate,\n children,\n onClick,\n ...props\n}: DatePickerPresetProps) {\n const ctx = useDatePickerContext('DatePicker.Preset');\n\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n if (ctx.isDisabled || ctx.isReadOnly) return;\n\n let resolved: ISODateString;\n if (directDate) {\n resolved = directDate;\n } else if (presetKey) {\n resolved = resolveDatePreset(\n presetKey,\n ctx.adapter.today(ctx.displayTimezone),\n ctx.adapter,\n );\n } else {\n return;\n }\n\n ctx.selectDate(resolved);\n onClick?.(e);\n },\n [ctx, presetKey, directDate, onClick],\n );\n\n // Active when the preset's resolved date equals the current value (same civil day, tz-aware).\n const isActive = (() => {\n if (!ctx.value) return false;\n let target: ISODateString;\n if (directDate) {\n target = directDate;\n } else if (presetKey) {\n target = resolveDatePreset(presetKey, ctx.adapter.today(ctx.displayTimezone), ctx.adapter);\n } else {\n return false;\n }\n return ctx.adapter.isSameDay(ctx.value, target, ctx.displayTimezone);\n })();\n\n // role=\"option\" is invalid outside role=\"listbox\"/role=\"combobox\"; the parent\n // <DatePicker.Presets> is role=\"group\". Use a regular button with aria-pressed\n // so the active state is announced as a toggle.\n return (\n <button\n type=\"button\"\n aria-pressed={isActive}\n data-active={isActive || undefined}\n disabled={ctx.isDisabled}\n onClick={handleClick}\n {...props}\n >\n {children}\n </button>\n );\n}\n","import { DatePickerRoot } from './Root.js';\nimport { DatePickerInput } from './Input.js';\nimport { DatePickerTrigger } from './Trigger.js';\nimport { DatePickerPopover } from './Popover.js';\nimport { DatePickerCalendar } from './Calendar.js';\nimport { DatePickerMonthGrid } from './MonthGrid.js';\nimport { DatePickerYearGrid } from './YearGrid.js';\nimport { DatePickerPresets, DatePickerPreset } from './Presets.js';\n\nimport type { DatePickerRootProps } from './Root.js';\nimport type { DatePickerInputProps } from './Input.js';\nimport type { DatePickerTriggerProps } from './Trigger.js';\nimport type { DatePickerPopoverProps } from './Popover.js';\nimport type { DatePickerCalendarProps, DatePickerCalendarClassNames } from './Calendar.js';\nimport type { DatePickerMonthGridProps, DatePickerMonthGridClassNames } from './MonthGrid.js';\nimport type { DatePickerYearGridProps, DatePickerYearGridClassNames } from './YearGrid.js';\nimport type {\n DatePickerPresetsProps,\n DatePickerPresetsClassNames,\n DatePickerPresetProps,\n DatePickerPresetKey,\n} from './Presets.js';\n\n/**\n * DatePicker — Headless, SSR-safe React DatePicker\n *\n * @example Basic\n * ```tsx\n * <DatePicker value={date} onChange={setDate}>\n * <DatePicker.Input placeholder=\"날짜 선택\" />\n * <DatePicker.Popover>\n * <DatePicker.Calendar />\n * </DatePicker.Popover>\n * </DatePicker>\n * ```\n *\n * @example Month/Year quick navigation\n * ```tsx\n * const [view, setView] = useState('days');\n * <DatePicker value={date} onChange={setDate}>\n * <DatePicker.Input />\n * <DatePicker.Popover>\n * {view === 'days' && <DatePicker.Calendar onTitleClick={() => setView('months')} />}\n * {view === 'months' && <DatePicker.MonthGrid onSelect={() => setView('days')} onTitleClick={() => setView('years')} />}\n * {view === 'years' && <DatePicker.YearGrid onSelect={() => setView('months')} />}\n * </DatePicker.Popover>\n * </DatePicker>\n * ```\n */\nexport const DatePicker = Object.assign(DatePickerRoot, {\n Input: DatePickerInput,\n Trigger: DatePickerTrigger,\n Popover: DatePickerPopover,\n Calendar: DatePickerCalendar,\n MonthGrid: DatePickerMonthGrid,\n YearGrid: DatePickerYearGrid,\n Presets: DatePickerPresets,\n Preset: DatePickerPreset,\n});\n\nexport type {\n DatePickerRootProps,\n DatePickerInputProps,\n DatePickerTriggerProps,\n DatePickerPopoverProps,\n DatePickerCalendarProps,\n DatePickerCalendarClassNames,\n DatePickerMonthGridProps,\n DatePickerMonthGridClassNames,\n DatePickerYearGridProps,\n DatePickerYearGridClassNames,\n DatePickerPresetsProps,\n DatePickerPresetsClassNames,\n DatePickerPresetProps,\n DatePickerPresetKey,\n};\n","import { createContext, useContext } from 'react';\nimport type { RefObject } from 'react';\nimport type {\n DateAdapter,\n DateRange,\n DisabledRule,\n ISODateString,\n RangePickerLabels,\n WeekStartsOn,\n} from '@kalyx/core';\n\n/** Which part to select next (start | end) */\nexport type RangeSelectingTarget = 'start' | 'end';\n\nexport interface RangePickerContextValue {\n /** Floating UI reference element */\n referenceRef: RefObject<HTMLElement | null>;\n /** Currently selected range */\n value: DateRange;\n /** Update the entire range object */\n setRange: (range: DateRange) => void;\n /** Single-date click; automatically decides start/end */\n selectDate: (iso: ISODateString) => void;\n /** Which part gets selected next (start first, then end) */\n selectingTarget: RangeSelectingTarget;\n /** Hovered date (for range preview) */\n hoverDate: ISODateString | null;\n setHoverDate: (iso: ISODateString | null) => void;\n /** Popover open state */\n isOpen: boolean;\n open: () => void;\n close: () => void;\n toggle: () => void;\n /** Currently displayed month */\n viewMonth: ISODateString;\n setViewMonth: (iso: ISODateString) => void;\n /** Currently focused date in the calendar */\n focusedDate: ISODateString;\n setFocusedDate: (iso: ISODateString) => void;\n /** Date adapter */\n adapter: DateAdapter;\n /** Disabled rules */\n disabled: DisabledRule[];\n /** Week start day */\n weekStartsOn: WeekStartsOn;\n /** Date display format */\n displayFormat: string;\n /** BCP 47 locale */\n locale: string;\n /** IANA timezone for display (see DatePickerContext#displayTimezone) */\n displayTimezone?: string;\n /** Whether entire picker is disabled */\n isDisabled: boolean;\n /** Read-only */\n isReadOnly: boolean;\n /** Unique ID */\n pickerId: string;\n /** ARIA labels */\n labels: RangePickerLabels;\n /**\n * Push a transient message to the picker's `role=\"status\"` live region.\n * The live region lives on Root so it survives popover close/Calendar unmount\n * — without that, announcements set on the commit click are silenced before\n * screen readers can pick them up.\n */\n announce: (message: string) => void;\n}\n\nexport const RangePickerContext = createContext<RangePickerContextValue | null>(null);\n\n/**\n * Consume RangePickerContext.\n * Throws a clear error when called outside of RangePicker.Root.\n */\nexport function useRangePickerContext(componentName: string): RangePickerContextValue {\n const context = useContext(RangePickerContext);\n if (!context) {\n throw new Error(\n `[${componentName}] RangePicker.Root 내부에서 사용해야 합니다.\\n\\n` +\n '올바른 사용법:\\n' +\n ' <RangePicker>\\n' +\n ` <RangePicker.${componentName.replace('RangePicker.', '')} />\\n` +\n ' </RangePicker>',\n );\n }\n return context;\n}\n","import { useCallback, useId, useMemo, useRef, useState } from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport { DateFnsAdapter, DEFAULT_RANGEPICKER_LABELS, civilMidnightFromUtcDay } from '@kalyx/core';\nimport type {\n DateAdapter,\n DateRange,\n DisabledRule,\n ISODateString,\n RangePickerLabels,\n WeekStartsOn,\n} from '@kalyx/core';\nimport { RangePickerContext } from '../../context/RangePickerContext.js';\nimport type {\n RangePickerContextValue,\n RangeSelectingTarget,\n} from '../../context/RangePickerContext.js';\nimport { useChangeEffect } from '../../hooks/useChangeEffect.js';\n\nconst EMPTY_RANGE: DateRange = { start: null, end: null };\n\nconst SR_ONLY: CSSProperties = {\n position: 'absolute',\n width: 1,\n height: 1,\n padding: 0,\n margin: -1,\n overflow: 'hidden',\n clip: 'rect(0, 0, 0, 0)',\n whiteSpace: 'nowrap',\n border: 0,\n};\n\n/**\n * Props for the RangePicker Root component.\n *\n * @example\n * ```tsx\n * <RangePicker value={range} onChange={setRange}>\n * <RangePicker.Input part=\"start\" />\n * <RangePicker.Input part=\"end\" />\n * <RangePicker.Popover>\n * <RangePicker.Calendar />\n * </RangePicker.Popover>\n * </RangePicker>\n * ```\n */\nexport interface RangePickerRootProps {\n /** Selected range (controlled). `{ start, end }` with ISO strings or null. */\n value?: DateRange;\n /** Initial range (uncontrolled) */\n defaultValue?: DateRange;\n /** Callback fired when the range changes */\n onChange?: (range: DateRange) => void;\n /** Callback fired when the popover open state changes */\n onOpenChange?: (isOpen: boolean) => void;\n /**\n * Callback fired when the calendar view navigates to a different month.\n * The value is the ISO string of the first day of the newly-visible month (UTC).\n */\n onCalendarNavigate?: (viewMonth: ISODateString) => void;\n /** Disabled rules */\n disabled?: DisabledRule[] | boolean;\n /** Read-only */\n readOnly?: boolean;\n /** Week start day */\n weekStartsOn?: WeekStartsOn;\n /** Date display format */\n displayFormat?: string;\n /** BCP 47 locale */\n locale?: string;\n /**\n * IANA timezone for display (e.g., \"Asia/Seoul\"). When set, inputs format in this zone,\n * calendar highlighting uses civil-day comparison in this zone, and selected start/end are\n * emitted as civil midnight of the clicked day in this zone (UTC-ISO form).\n */\n displayTimezone?: string;\n /** Date adapter */\n adapter?: DateAdapter;\n /** Override ARIA labels (defaults to English) */\n labels?: Partial<RangePickerLabels>;\n /** Child components */\n children: ReactNode;\n}\n\nexport function RangePickerRoot({\n value: controlledValue,\n defaultValue,\n onChange,\n onOpenChange,\n onCalendarNavigate,\n disabled = false,\n readOnly = false,\n weekStartsOn = 0,\n displayFormat = 'yyyy-MM-dd',\n locale = 'en-US',\n displayTimezone,\n adapter = DateFnsAdapter,\n labels: labelsProp,\n children,\n}: RangePickerRootProps) {\n const pickerId = useId();\n const isControlled = useRef(controlledValue !== undefined).current;\n const referenceRef = useRef<HTMLElement | null>(null);\n\n // Internal state for uncontrolled mode\n const [uncontrolledValue, setUncontrolledValue] = useState<DateRange>(\n defaultValue ?? EMPTY_RANGE,\n );\n\n const currentValue = isControlled ? (controlledValue ?? EMPTY_RANGE) : uncontrolledValue;\n\n const [isOpen, setIsOpen] = useState(false);\n\n // Which part to select next (start first, then end)\n const [selectingTarget, setSelectingTarget] = useState<RangeSelectingTarget>('start');\n\n const [hoverDate, setHoverDate] = useState<ISODateString | null>(null);\n\n // Live-region announcement (mounted on Root so it survives Calendar unmount).\n const [announcement, setAnnouncement] = useState('');\n const announce = useCallback((message: string) => setAnnouncement(message), []);\n\n // Lazy initializers — see DatePicker/Root.tsx for the SSR/hydration rationale.\n const [viewMonth, setViewMonth] = useState<ISODateString>(\n () => currentValue.start ?? adapter.today(displayTimezone),\n );\n\n const [focusedDate, setFocusedDate] = useState<ISODateString>(\n () => currentValue.start ?? adapter.today(displayTimezone),\n );\n\n useChangeEffect(isOpen, onOpenChange);\n const viewMonthStart = useMemo(() => adapter.startOfMonth(viewMonth), [viewMonth, adapter]);\n useChangeEffect(viewMonthStart, onCalendarNavigate);\n\n const mergedLabels = useMemo(\n () => ({ ...DEFAULT_RANGEPICKER_LABELS, ...labelsProp }),\n [labelsProp],\n );\n\n const isDisabled = typeof disabled === 'boolean' ? disabled : false;\n const disabledRules: DisabledRule[] = useMemo(\n () => (Array.isArray(disabled) ? disabled : []),\n [disabled],\n );\n\n const setRange = useCallback(\n (range: DateRange) => {\n if (isDisabled || readOnly) return;\n if (!isControlled) {\n setUncontrolledValue(range);\n }\n onChange?.(range);\n },\n [isControlled, isDisabled, readOnly, onChange],\n );\n\n /**\n * Single-date click handler.\n * - selectingTarget === 'start' -> pick start, switch target to 'end'\n * - selectingTarget === 'end' -> pick end (swap if before start), switch target to 'start', close\n */\n const selectDate = useCallback(\n (iso: ISODateString) => {\n if (isDisabled || readOnly) return;\n\n // Normalize UTC-grid ISOs to civil-midnight-in-tz before storing (see DatePicker.Root).\n const normalized = displayTimezone ? civilMidnightFromUtcDay(iso, displayTimezone) : iso;\n\n if (selectingTarget === 'start') {\n const newRange: DateRange = { start: normalized, end: null };\n setRange(newRange);\n setSelectingTarget('end');\n setHoverDate(null);\n } else {\n const start = currentValue.start;\n if (!start) {\n // Safety: if start is missing, treat this click as start\n setRange({ start: normalized, end: null });\n setSelectingTarget('end');\n return;\n }\n\n let newRange: DateRange;\n if (adapter.isBefore(normalized, start)) {\n // Swap if the clicked end is earlier than start\n newRange = { start: normalized, end: start };\n } else {\n newRange = { start, end: normalized };\n }\n\n setRange(newRange);\n setSelectingTarget('start');\n setHoverDate(null);\n setIsOpen(false);\n }\n },\n [isDisabled, readOnly, selectingTarget, currentValue.start, adapter, setRange, displayTimezone],\n );\n\n const open = useCallback(() => {\n if (isDisabled || readOnly) return;\n setIsOpen(true);\n const target = currentValue.start ?? adapter.today(displayTimezone);\n setViewMonth(target);\n setFocusedDate(target);\n // If the range is complete, restart; otherwise preserve current state\n if (currentValue.start && currentValue.end) {\n setSelectingTarget('start');\n }\n }, [isDisabled, readOnly, currentValue, adapter, displayTimezone]);\n\n const close = useCallback(() => {\n setIsOpen(false);\n setHoverDate(null);\n }, []);\n\n const toggle = useCallback(() => {\n if (isOpen) close();\n else open();\n }, [isOpen, open, close]);\n\n const contextValue: RangePickerContextValue = useMemo(\n () => ({\n referenceRef,\n value: currentValue,\n setRange,\n selectDate,\n selectingTarget,\n hoverDate,\n setHoverDate,\n isOpen,\n open,\n close,\n toggle,\n viewMonth,\n setViewMonth,\n focusedDate,\n setFocusedDate,\n adapter,\n disabled: disabledRules,\n weekStartsOn,\n displayFormat,\n locale,\n displayTimezone,\n isDisabled,\n isReadOnly: readOnly,\n pickerId,\n labels: mergedLabels,\n announce,\n }),\n [\n currentValue,\n setRange,\n selectDate,\n selectingTarget,\n hoverDate,\n isOpen,\n open,\n close,\n toggle,\n viewMonth,\n focusedDate,\n adapter,\n disabledRules,\n weekStartsOn,\n displayFormat,\n locale,\n displayTimezone,\n isDisabled,\n readOnly,\n pickerId,\n mergedLabels,\n announce,\n ],\n );\n\n return (\n <RangePickerContext.Provider value={contextValue}>\n {children}\n <div role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" style={SR_ONLY}>\n {announcement}\n </div>\n </RangePickerContext.Provider>\n );\n}\n","import { forwardRef, useCallback } from 'react';\nimport type { InputHTMLAttributes } from 'react';\nimport { useRangePickerContext } from '../../context/RangePickerContext.js';\n\nexport type RangeInputPart = 'start' | 'end';\n\nexport interface RangePickerInputProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'value' | 'onChange' | 'type'\n> {\n /** Which part this input represents (start | end) */\n part: RangeInputPart;\n /** Date display format (defaults to parent's displayFormat) */\n format?: string;\n}\n\n/**\n * RangePicker.Input — Separate input for start/end dates.\n *\n * Use one with `part=\"start\"` and another with `part=\"end\"`. Currently `readOnly`\n * because keyboard parsing of two inputs into a single range is ambiguous; users\n * select via the calendar.\n */\nexport const RangePickerInput = forwardRef<HTMLInputElement, RangePickerInputProps>(\n function RangePickerInput({ part, format: formatProp, onClick, onKeyDown, ...props }, ref) {\n const ctx = useRangePickerContext('RangePicker.Input');\n const displayFormat = formatProp ?? ctx.displayFormat;\n\n const value = ctx.value[part];\n let displayValue = '';\n if (value) {\n try {\n displayValue = ctx.adapter.format(value, displayFormat, ctx.displayTimezone);\n } catch {\n displayValue = value;\n }\n }\n\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLInputElement>) => {\n if (!ctx.isOpen) ctx.open();\n onClick?.(e);\n },\n [ctx, onClick],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Escape') {\n ctx.close();\n } else if (e.key === 'Enter' && ctx.isOpen) {\n // Don't submit the surrounding form when the calendar is open.\n e.preventDefault();\n } else if (e.key === 'ArrowDown' && !ctx.isOpen) {\n e.preventDefault();\n ctx.open();\n }\n onKeyDown?.(e);\n },\n [ctx, onKeyDown],\n );\n\n const calendarId = `${ctx.pickerId}-calendar`;\n\n return (\n <input\n ref={(node) => {\n // Use the first Input (start) as the reference\n if (part === 'start' && node) ctx.referenceRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n }}\n type=\"text\"\n role=\"combobox\"\n readOnly\n aria-expanded={ctx.isOpen}\n aria-haspopup=\"dialog\"\n aria-controls={ctx.isOpen ? calendarId : undefined}\n aria-autocomplete=\"none\"\n aria-label={part === 'start' ? ctx.labels.startInput : ctx.labels.endInput}\n autoComplete=\"off\"\n value={displayValue}\n disabled={ctx.isDisabled || props.disabled}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n data-part={part}\n {...props}\n />\n );\n },\n);\n\nRangePickerInput.displayName = 'RangePicker.Input';\n","import type { HTMLAttributes, ReactNode } from 'react';\nimport { useRangePickerContext } from '../../context/RangePickerContext.js';\nimport { usePopover } from '../../hooks/usePopover.js';\n\nexport interface RangePickerPopoverProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role'> {\n children?: ReactNode;\n}\n\nexport function RangePickerPopover({ children, ...props }: RangePickerPopoverProps) {\n const ctx = useRangePickerContext('RangePicker.Popover');\n const calendarId = `${ctx.pickerId}-calendar`;\n\n const { floatingStyles, setFloatingRef, isPositioned } = usePopover({\n isOpen: ctx.isOpen,\n close: ctx.close,\n referenceRef: ctx.referenceRef,\n });\n\n if (!ctx.isOpen) return null;\n\n const { style: userStyle, ...rest } = props;\n\n return (\n <div\n ref={setFloatingRef}\n id={calendarId}\n role=\"dialog\"\n aria-label={ctx.labels.popoverLabel}\n aria-modal=\"false\"\n {...rest}\n style={{\n ...userStyle,\n ...floatingStyles,\n visibility: isPositioned ? undefined : 'hidden',\n }}\n >\n {children}\n </div>\n );\n}\n","import { useCallback, useEffect, useMemo, useRef } from 'react';\nimport type { HTMLAttributes } from 'react';\nimport {\n getCalendarDays,\n getISOWeekNumber,\n isDateDisabled,\n getWeekdayNames,\n formatMonthYear,\n formatFullDate,\n} from '@kalyx/core';\nimport type { CalendarDay, DateRange } from '@kalyx/core';\nimport { useRangePickerContext } from '../../context/RangePickerContext.js';\n\nexport interface RangePickerCalendarClassNames {\n root?: string;\n header?: string;\n title?: string;\n navButton?: string;\n grid?: string;\n gridRow?: string;\n gridCell?: string;\n day?: string;\n daySelected?: string;\n dayToday?: string;\n dayDisabled?: string;\n dayOutsideMonth?: string;\n dayRangeStart?: string;\n dayRangeEnd?: string;\n dayInRange?: string;\n weekdayHeader?: string;\n /** Header cell at the top of the week-number column. Rendered only when `showWeekNumber` is set. */\n weekNumberHeader?: string;\n /** Each row's week-number cell. Rendered only when `showWeekNumber` is set. */\n weekNumber?: string;\n}\n\n/**\n * Selection mode for the calendar grid.\n * - `'range'` (default): RangePicker behavior — two clicks (start, end) commit a custom range.\n * - `'week'`: WeekPicker behavior — a single click commits the entire week containing the clicked day.\n */\nexport type RangePickerCalendarSelectionMode = 'range' | 'week';\n\nexport interface RangePickerCalendarProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role'> {\n classNames?: RangePickerCalendarClassNames;\n /** @default 'range' */\n selectionMode?: RangePickerCalendarSelectionMode;\n /**\n * Render an ISO 8601 week-number column on the left of the grid (1–53).\n * The column is a `<th scope=\"row\">`; it doesn't participate in the WAI-ARIA grid\n * data region, so keyboard navigation across the date cells is unaffected.\n */\n showWeekNumber?: boolean;\n /**\n * Always render 6 weeks (42 cells), even when the month fits in 4 or 5 rows.\n */\n fixedWeeks?: boolean;\n}\n\n/** Safe wrapper for formatFullDate — falls back to ISO string on error */\nfunction safeFormatFullDate(iso: string, locale: string): string {\n try {\n return formatFullDate(iso, locale);\n } catch {\n return iso;\n }\n}\n\nexport function RangePickerCalendar({\n classNames,\n selectionMode = 'range',\n showWeekNumber = false,\n fixedWeeks = false,\n ...props\n}: RangePickerCalendarProps) {\n const ctx = useRangePickerContext('RangePicker.Calendar');\n const gridRef = useRef<HTMLTableElement>(null);\n\n const {\n adapter,\n viewMonth,\n focusedDate,\n weekStartsOn,\n disabled,\n value,\n hoverDate,\n selectingTarget,\n displayTimezone,\n } = ctx;\n\n const { locale } = ctx;\n // Memoized — see DatePicker/Calendar.tsx for the rationale.\n const weekdays = useMemo(() => getWeekdayNames(locale, weekStartsOn), [locale, weekStartsOn]);\n\n const weeks = useMemo(\n () =>\n getCalendarDays(viewMonth, adapter, {\n weekStartsOn,\n focusedDate,\n disabled,\n range: value,\n rangeHover: hoverDate,\n timezone: displayTimezone,\n fixedWeeks,\n }),\n [\n viewMonth,\n adapter,\n weekStartsOn,\n focusedDate,\n disabled,\n value,\n hoverDate,\n displayTimezone,\n fixedWeeks,\n ],\n );\n\n // ISO week number anchored to the row's Thursday — see DatePicker/Calendar.tsx for rationale.\n const thursdayIndex = weekStartsOn === 0 ? 4 : 3;\n\n const year = adapter.getYear(viewMonth);\n const month = adapter.getMonth(viewMonth);\n const title = formatMonthYear(year, month, locale);\n\n useEffect(() => {\n if (!ctx.isOpen || !gridRef.current) return;\n const focusedButton = gridRef.current.querySelector<HTMLButtonElement>('[data-focused=\"true\"]');\n focusedButton?.focus({ preventScroll: true });\n }, [focusedDate, ctx.isOpen]);\n\n const navigateMonth = useCallback(\n (direction: number) => {\n const newMonth = adapter.addMonths(viewMonth, direction);\n ctx.setViewMonth(newMonth);\n ctx.setFocusedDate(adapter.startOfMonth(newMonth));\n const y = adapter.getYear(newMonth);\n const m = adapter.getMonth(newMonth);\n ctx.announce(formatMonthYear(y, m, locale));\n },\n [adapter, viewMonth, ctx, locale],\n );\n\n const commitDay = useCallback(\n (iso: string) => {\n if (selectionMode === 'week') {\n const weekStart = adapter.startOfWeek(iso, weekStartsOn);\n const weekEnd = adapter.startOfDay(adapter.endOfWeek(iso, weekStartsOn));\n const range: DateRange = { start: weekStart, end: weekEnd };\n ctx.setRange(range);\n ctx.close();\n ctx.announce(\n `${ctx.labels.rangeSelected}: ${safeFormatFullDate(weekStart, locale)} – ${safeFormatFullDate(weekEnd, locale)}`,\n );\n } else {\n // Capture selectingTarget BEFORE selectDate flips it so we can announce\n // the right state. \"start\" click prompts for the end; \"end\" click closes\n // the range and announces the full span.\n const wasPickingStart = selectingTarget === 'start';\n const previousStart = value.start;\n ctx.selectDate(iso);\n const formatted = safeFormatFullDate(iso, locale);\n if (wasPickingStart) {\n ctx.announce(`${formatted}. ${ctx.labels.selectingEnd}`);\n } else if (previousStart) {\n // Mirror the swap-if-before logic from RangePickerRoot.selectDate so the\n // announcement matches what will be committed.\n const [start, end] = adapter.isBefore(iso, previousStart)\n ? [iso, previousStart]\n : [previousStart, iso];\n ctx.announce(\n `${ctx.labels.rangeSelected}: ${safeFormatFullDate(start, locale)} – ${safeFormatFullDate(end, locale)}`,\n );\n } else {\n // Safety: no previous start (e.g. preset cleared mid-flow) — fall back\n // to a simple per-day announcement so the user still hears something.\n ctx.announce(formatted);\n }\n }\n },\n [selectionMode, adapter, weekStartsOn, ctx, locale, selectingTarget, value.start],\n );\n\n const handleDayClick = useCallback(\n (day: CalendarDay) => {\n if (day.isDisabled) return;\n commitDay(day.isoString);\n },\n [commitDay],\n );\n\n const handleDayMouseEnter = useCallback(\n (day: CalendarDay) => {\n // Week mode has no two-click flow and therefore no hover preview.\n if (selectionMode === 'week') return;\n if (selectingTarget === 'end' && value.start && !day.isDisabled) {\n ctx.setHoverDate(day.isoString);\n }\n },\n [selectionMode, selectingTarget, value.start, ctx],\n );\n\n const handleMouseLeave = useCallback(() => {\n ctx.setHoverDate(null);\n }, [ctx]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n let newFocused: string | null = null;\n\n switch (e.key) {\n case 'ArrowLeft':\n newFocused = adapter.addDays(focusedDate, -1);\n break;\n case 'ArrowRight':\n newFocused = adapter.addDays(focusedDate, 1);\n break;\n case 'ArrowUp':\n newFocused = adapter.addDays(focusedDate, -7);\n break;\n case 'ArrowDown':\n newFocused = adapter.addDays(focusedDate, 7);\n break;\n case 'PageUp':\n newFocused = e.shiftKey\n ? adapter.addYears(focusedDate, -1)\n : adapter.addMonths(focusedDate, -1);\n break;\n case 'PageDown':\n newFocused = e.shiftKey\n ? adapter.addYears(focusedDate, 1)\n : adapter.addMonths(focusedDate, 1);\n break;\n case 'Home':\n newFocused = adapter.startOfWeek(focusedDate, weekStartsOn);\n break;\n case 'End':\n newFocused = adapter.startOfDay(adapter.endOfWeek(focusedDate, weekStartsOn));\n break;\n case 'Enter':\n case ' ':\n e.preventDefault();\n if (!isDateDisabled(focusedDate, disabled, adapter)) {\n commitDay(focusedDate);\n }\n return;\n case 'Escape':\n ctx.close();\n return;\n default:\n return;\n }\n\n if (newFocused) {\n e.preventDefault();\n\n // WAI-ARIA grid pattern: skip disabled cells while keyboard-navigating.\n // Step in the original direction up to one full grid (42 cells) before giving up.\n const skipStep =\n e.key === 'ArrowLeft' || e.key === 'ArrowUp' || e.key === 'PageUp' || e.key === 'Home'\n ? -1\n : 1;\n let attempts = 0;\n while (isDateDisabled(newFocused, disabled, adapter) && attempts < 42) {\n newFocused = adapter.addDays(newFocused, skipStep);\n attempts++;\n }\n if (attempts >= 42) return;\n\n ctx.setFocusedDate(newFocused);\n\n if (!adapter.isSameMonth(newFocused, viewMonth)) {\n ctx.setViewMonth(newFocused);\n }\n\n // Keep hover preview in sync while keyboard-navigating (range mode only)\n if (selectionMode === 'range' && selectingTarget === 'end' && value.start) {\n ctx.setHoverDate(newFocused);\n }\n }\n },\n [\n adapter,\n focusedDate,\n viewMonth,\n weekStartsOn,\n disabled,\n ctx,\n selectionMode,\n selectingTarget,\n value.start,\n commitDay,\n ],\n );\n\n return (\n <div className={classNames?.root} {...props} onMouseLeave={handleMouseLeave}>\n <div className={classNames?.header}>\n <button\n type=\"button\"\n className={classNames?.navButton}\n onClick={() => navigateMonth(-1)}\n aria-label={ctx.labels.prevMonth}\n >\n <\n </button>\n <span className={classNames?.title} aria-live=\"polite\">\n {title}\n </span>\n <button\n type=\"button\"\n className={classNames?.navButton}\n onClick={() => navigateMonth(1)}\n aria-label={ctx.labels.nextMonth}\n >\n >\n </button>\n </div>\n\n {/* aria-multiselectable intentionally omitted: a date range is one selection\n (two endpoints), not multi-select. */}\n <table\n ref={gridRef}\n role=\"grid\"\n aria-label={title}\n aria-rowcount={weeks.length + 1}\n aria-colcount={7}\n className={classNames?.grid}\n onKeyDown={handleKeyDown}\n >\n <thead>\n <tr role=\"row\" aria-rowindex={1}>\n {showWeekNumber ? (\n <th scope=\"col\" aria-hidden=\"true\" className={classNames?.weekNumberHeader}>\n #\n </th>\n ) : null}\n {weekdays.map((day, colIndex) => (\n <th\n key={day.short}\n role=\"columnheader\"\n abbr={day.full}\n scope=\"col\"\n aria-colindex={colIndex + 1}\n className={classNames?.weekdayHeader}\n >\n {day.short}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {weeks.map((week, weekIndex) => (\n <tr\n key={weekIndex}\n role=\"row\"\n aria-rowindex={weekIndex + 2}\n className={classNames?.gridRow}\n >\n {showWeekNumber ? (\n <th\n scope=\"row\"\n aria-hidden=\"true\"\n className={classNames?.weekNumber}\n data-week-number\n >\n {getISOWeekNumber(week[thursdayIndex]!.isoString)}\n </th>\n ) : null}\n {week.map((day, colIndex) => {\n const dayClasses =\n [\n classNames?.day,\n day.isRangeStart && classNames?.dayRangeStart,\n day.isRangeEnd && classNames?.dayRangeEnd,\n day.isInRange && classNames?.dayInRange,\n day.isToday && classNames?.dayToday,\n day.isDisabled && classNames?.dayDisabled,\n !day.isCurrentMonth && classNames?.dayOutsideMonth,\n ]\n .filter(Boolean)\n .join(' ') || undefined;\n\n const isSelected =\n selectionMode === 'week'\n ? day.isRangeStart || day.isRangeEnd || day.isInRange\n : day.isRangeStart || day.isRangeEnd;\n\n return (\n <td\n key={day.isoString}\n role=\"gridcell\"\n aria-colindex={colIndex + 1}\n aria-selected={isSelected || undefined}\n aria-disabled={day.isDisabled || undefined}\n aria-current={day.isToday ? 'date' : undefined}\n className={classNames?.gridCell}\n >\n <button\n type=\"button\"\n tabIndex={day.isFocused ? 0 : -1}\n disabled={day.isDisabled}\n data-focused={day.isFocused || undefined}\n data-range-start={day.isRangeStart || undefined}\n data-range-end={day.isRangeEnd || undefined}\n data-in-range={day.isInRange || undefined}\n data-today={day.isToday || undefined}\n data-outside-month={!day.isCurrentMonth || undefined}\n className={dayClasses}\n onClick={() => handleDayClick(day)}\n onMouseEnter={() => handleDayMouseEnter(day)}\n aria-label={safeFormatFullDate(day.isoString, locale)}\n >\n {day.dayNumber}\n </button>\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n","import { useCallback, useMemo } from 'react';\nimport type { HTMLAttributes, ReactNode } from 'react';\nimport type { DateRange, ISODateString } from '@kalyx/core';\nimport { useRangePickerContext } from '../../context/RangePickerContext.js';\n\n/** Predefined preset keys. Custom ranges are also supported. */\nexport type PresetKey =\n | 'today'\n | 'yesterday'\n | 'last7days'\n | 'last30days'\n | 'thisWeek'\n | 'lastWeek'\n | 'thisMonth'\n | 'lastMonth'\n | 'thisYear';\n\nexport interface RangePickerPresetsClassNames {\n root?: string;\n preset?: string;\n presetActive?: string;\n}\n\nexport interface RangePickerPresetsProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role'> {\n classNames?: RangePickerPresetsClassNames;\n children?: ReactNode;\n}\n\n/**\n * RangePicker.Presets — Container that wraps preset buttons.\n * Place `RangePicker.Preset` buttons inside.\n *\n * @example\n * ```tsx\n * <RangePicker.Presets>\n * <RangePicker.Preset value=\"last7days\">Last 7 days</RangePicker.Preset>\n * <RangePicker.Preset value=\"thisMonth\">This month</RangePicker.Preset>\n * </RangePicker.Presets>\n * ```\n */\nexport function RangePickerPresets({ classNames, children, ...props }: RangePickerPresetsProps) {\n const ctx = useRangePickerContext('RangePicker.Presets');\n return (\n <div role=\"group\" aria-label={ctx.labels.presetsGroup} className={classNames?.root} {...props}>\n {children}\n </div>\n );\n}\n\nexport interface RangePickerPresetProps extends Omit<HTMLAttributes<HTMLButtonElement>, 'value'> {\n /** Predefined preset key; omit when passing `range` directly */\n value?: PresetKey;\n /** Pass a range directly (alternative to `value`) */\n range?: DateRange;\n children: ReactNode;\n className?: string;\n}\n\n/**\n * Resolve a predefined preset key into an actual DateRange.\n */\nfunction resolvePreset(\n key: PresetKey,\n today: ISODateString,\n adapter: {\n addDays: (iso: string, n: number) => string;\n addMonths: (iso: string, n: number) => string;\n addYears: (iso: string, n: number) => string;\n startOfMonth: (iso: string) => string;\n endOfMonth: (iso: string) => string;\n startOfWeek: (iso: string, weekStartsOn?: 0 | 1) => string;\n endOfWeek: (iso: string, weekStartsOn?: 0 | 1) => string;\n startOfDay: (iso: string) => string;\n },\n): DateRange {\n switch (key) {\n case 'today':\n return { start: today, end: today };\n case 'yesterday': {\n const yesterday = adapter.addDays(today, -1);\n return { start: yesterday, end: yesterday };\n }\n case 'last7days':\n return { start: adapter.addDays(today, -6), end: today };\n case 'last30days':\n return { start: adapter.addDays(today, -29), end: today };\n case 'thisWeek':\n return {\n start: adapter.startOfDay(adapter.startOfWeek(today)),\n end: adapter.startOfDay(adapter.endOfWeek(today)),\n };\n case 'lastWeek': {\n const prevWeek = adapter.addDays(today, -7);\n return {\n start: adapter.startOfDay(adapter.startOfWeek(prevWeek)),\n end: adapter.startOfDay(adapter.endOfWeek(prevWeek)),\n };\n }\n case 'thisMonth':\n return {\n start: adapter.startOfMonth(today),\n end: adapter.startOfDay(adapter.endOfMonth(today)),\n };\n case 'lastMonth': {\n const prevMonth = adapter.addMonths(today, -1);\n return {\n start: adapter.startOfMonth(prevMonth),\n end: adapter.startOfDay(adapter.endOfMonth(prevMonth)),\n };\n }\n case 'thisYear': {\n // Navigate back to January of the current year\n const currentMonth = new Date(today).getUTCMonth();\n const yearStart = adapter.startOfMonth(adapter.addMonths(today, -currentMonth));\n return { start: yearStart, end: today };\n }\n }\n}\n\n/**\n * RangePicker.Preset — One-click preset button to select a date range.\n *\n * Pass either `value` (a preset key) or `range` (a direct range).\n *\n * @example\n * ```tsx\n * <RangePicker.Preset value=\"last7days\">Last 7 days</RangePicker.Preset>\n * <RangePicker.Preset range={{ start: \"2026-01-01T...\", end: \"2026-03-31T...\" }}>\n * Q1 2026\n * </RangePicker.Preset>\n * ```\n */\nexport function RangePickerPreset({\n value: presetKey,\n range: directRange,\n children,\n onClick,\n ...props\n}: RangePickerPresetProps) {\n const ctx = useRangePickerContext('RangePicker.Preset');\n\n // Resolve the preset once per render — previously `resolvePreset` + `adapter.today()`\n // ran twice per render per preset (in handleClick AND isActive), turning a 5-preset\n // row into 10 today() allocations per render.\n const resolved = useMemo<DateRange | null>(() => {\n if (directRange) return directRange;\n if (presetKey)\n return resolvePreset(presetKey, ctx.adapter.today(ctx.displayTimezone), ctx.adapter);\n return null;\n }, [directRange, presetKey, ctx.adapter, ctx.displayTimezone]);\n\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n if (ctx.isDisabled || ctx.isReadOnly) return;\n if (!resolved) return;\n\n ctx.setRange(resolved);\n ctx.close();\n onClick?.(e);\n },\n [ctx, resolved, onClick],\n );\n\n // Determine whether the currently selected range matches this preset\n const isActive = useMemo(() => {\n if (!ctx.value.start || !ctx.value.end || !resolved || !resolved.start || !resolved.end) {\n return false;\n }\n return (\n ctx.adapter.isSameDay(ctx.value.start, resolved.start) &&\n ctx.adapter.isSameDay(ctx.value.end, resolved.end)\n );\n }, [ctx.value.start, ctx.value.end, ctx.adapter, resolved]);\n\n // role=\"option\" is invalid outside role=\"listbox\"/role=\"combobox\"; parent is\n // role=\"group\". Use a regular toggle button with aria-pressed.\n return (\n <button\n type=\"button\"\n aria-pressed={isActive}\n data-active={isActive || undefined}\n disabled={ctx.isDisabled}\n onClick={handleClick}\n {...props}\n >\n {children}\n </button>\n );\n}\n","import { RangePickerRoot } from './Root.js';\nimport { RangePickerInput } from './Input.js';\nimport { RangePickerPopover } from './Popover.js';\nimport { RangePickerCalendar } from './Calendar.js';\nimport { RangePickerPresets, RangePickerPreset } from './Presets.js';\n\nimport type { RangePickerRootProps } from './Root.js';\nimport type { RangePickerInputProps, RangeInputPart } from './Input.js';\nimport type { RangePickerPopoverProps } from './Popover.js';\nimport type { RangePickerCalendarProps, RangePickerCalendarClassNames } from './Calendar.js';\nimport type {\n RangePickerPresetsProps,\n RangePickerPresetsClassNames,\n RangePickerPresetProps,\n PresetKey,\n} from './Presets.js';\n\n/**\n * RangePicker — Headless date-range picker component\n *\n * @example Basic\n * ```tsx\n * <RangePicker value={range} onChange={setRange}>\n * <RangePicker.Input part=\"start\" />\n * <RangePicker.Input part=\"end\" />\n * <RangePicker.Popover>\n * <RangePicker.Calendar />\n * </RangePicker.Popover>\n * </RangePicker>\n * ```\n *\n * @example Presets (dashboard)\n * ```tsx\n * <RangePicker value={range} onChange={setRange}>\n * <RangePicker.Input part=\"start\" />\n * <RangePicker.Input part=\"end\" />\n * <RangePicker.Popover>\n * <RangePicker.Presets>\n * <RangePicker.Preset value=\"last7days\">Last 7 days</RangePicker.Preset>\n * <RangePicker.Preset value=\"last30days\">Last 30 days</RangePicker.Preset>\n * <RangePicker.Preset value=\"thisMonth\">This month</RangePicker.Preset>\n * </RangePicker.Presets>\n * <RangePicker.Calendar />\n * </RangePicker.Popover>\n * </RangePicker>\n * ```\n */\nexport const RangePicker = Object.assign(RangePickerRoot, {\n Input: RangePickerInput,\n Popover: RangePickerPopover,\n Calendar: RangePickerCalendar,\n Presets: RangePickerPresets,\n Preset: RangePickerPreset,\n});\n\nexport type {\n RangePickerRootProps,\n RangePickerInputProps,\n RangeInputPart,\n RangePickerPopoverProps,\n RangePickerCalendarProps,\n RangePickerCalendarClassNames,\n RangePickerPresetsProps,\n RangePickerPresetsClassNames,\n RangePickerPresetProps,\n PresetKey,\n};\n","import { createContext, useContext } from 'react';\nimport type { ISODateString, TimePickerLabels, TimeValue } from '@kalyx/core';\n\nexport type TimePickerFormat = '12h' | '24h';\n\nexport interface TimePickerContextValue {\n /** Currently selected ISO datetime (only the time portion is meaningful) */\n value: ISODateString | null;\n /** Update only the time portion (TimeValue) */\n setTime: (partial: Partial<TimeValue>) => void;\n /** 12-hour or 24-hour mode */\n format: TimePickerFormat;\n /** Minute step (e.g., 15 -> 0, 15, 30, 45) */\n step: number;\n /** Whether to display seconds */\n withSeconds: boolean;\n /**\n * IANA timezone for time interpretation. When set, the hour/minute controls read and write\n * the time as observed in this zone rather than UTC.\n */\n displayTimezone?: string;\n /** Whether entire picker is disabled */\n isDisabled: boolean;\n /** Read-only */\n isReadOnly: boolean;\n /** Current time (TimeValue) */\n currentTime: TimeValue;\n /** Unique ID */\n pickerId: string;\n /** ARIA labels */\n labels: TimePickerLabels;\n /**\n * Programmatic per-slot disable predicate. Returns `true` for any (hour, minute) pair that\n * should be unselectable — same polarity as MUI X's `shouldDisableTime`, the **inverse** of\n * react-datepicker's `filterTime` (which returns `true` to *keep* a slot). Use cases:\n * business hours, lunch breaks, blackout slots. The hour-list disables a row only when the\n * predicate returns `true` for *every* step in that hour.\n */\n filterTime?: (hours: number, minutes: number) => boolean;\n}\n\nexport const TimePickerContext = createContext<TimePickerContextValue | null>(null);\n\n/**\n * Consume TimePickerContext.\n * Throws a clear error when called outside of TimePicker.Root.\n */\nexport function useTimePickerContext(componentName: string): TimePickerContextValue {\n const context = useContext(TimePickerContext);\n if (!context) {\n throw new Error(\n `[${componentName}] TimePicker.Root 내부에서 사용해야 합니다.\\n\\n` +\n '올바른 사용법:\\n' +\n ' <TimePicker>\\n' +\n ` <TimePicker.${componentName.replace('TimePicker.', '')} />\\n` +\n ' </TimePicker>',\n );\n }\n return context;\n}\n","import { useCallback, useId, useMemo, useRef, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport {\n DateFnsAdapter,\n DEFAULT_TIMEPICKER_LABELS,\n getTime,\n setTime as setTimeOnIso,\n getTimeInTimezone,\n setTimeInTimezone,\n} from '@kalyx/core';\nimport type { ISODateString, TimePickerLabels, TimeValue } from '@kalyx/core';\nimport { TimePickerContext } from '../../context/TimePickerContext.js';\nimport type { TimePickerContextValue, TimePickerFormat } from '../../context/TimePickerContext.js';\n\n/**\n * Props for the TimePicker Root component.\n *\n * @example\n * ```tsx\n * <TimePicker value={time} onChange={setTime} format=\"24h\" step={15}>\n * <TimePicker.Input />\n * <TimePicker.HourList />\n * <TimePicker.MinuteList />\n * <TimePicker.AmPmToggle />\n * </TimePicker>\n * ```\n */\nexport interface TimePickerRootProps {\n /** Selected time (controlled, ISO 8601 UTC). The date portion is ignored; only the time is used. */\n value?: ISODateString | null;\n /** Initial time (uncontrolled) */\n defaultValue?: ISODateString;\n /** Callback fired when the time changes */\n onChange?: (value: ISODateString | null) => void;\n /** 12-hour or 24-hour mode */\n format?: TimePickerFormat;\n /** Minute step (e.g., 1, 5, 10, 15, 30) */\n step?: number;\n /** Whether to display seconds */\n withSeconds?: boolean;\n /**\n * IANA timezone used to interpret time. When set, the hour/minute controls read and write\n * the time as observed in this zone.\n */\n displayTimezone?: string;\n /** Whether entire picker is disabled */\n disabled?: boolean;\n /** Read-only */\n readOnly?: boolean;\n /**\n * Programmatic per-slot disable predicate. Returns `true` for any `(hours, minutes)` pair\n * that should be unselectable — same polarity as MUI X's `shouldDisableTime`, and the\n * **inverse** of react-datepicker's `filterTime` (which returns `true` to *keep* a slot).\n * Use cases: business hours, lunch breaks, blackout slots. Hours are disabled only when the\n * predicate returns `true` for every step within the hour. Always receives 24-hour values.\n */\n filterTime?: (hours: number, minutes: number) => boolean;\n /** Override ARIA labels (defaults to English) */\n labels?: Partial<TimePickerLabels>;\n /** Child components */\n children: ReactNode;\n}\n\nexport function TimePickerRoot({\n value: controlledValue,\n defaultValue,\n onChange,\n format = '24h',\n step = 1,\n withSeconds = false,\n displayTimezone,\n disabled = false,\n readOnly = false,\n filterTime,\n labels: labelsProp,\n children,\n}: TimePickerRootProps) {\n const pickerId = useId();\n const mergedLabels = useMemo(\n () => ({ ...DEFAULT_TIMEPICKER_LABELS, ...labelsProp }),\n [labelsProp],\n );\n const isControlled = useRef(controlledValue !== undefined).current;\n\n const [uncontrolledValue, setUncontrolledValue] = useState<ISODateString | null>(\n defaultValue ?? null,\n );\n\n const currentValue = isControlled ? (controlledValue ?? null) : uncontrolledValue;\n\n // SSR-safe: when value is null, fall back to a deterministic {0,0,0} so server\n // and client render the same markup. `today()` is only resolved at event time.\n const currentTime = useMemo(() => {\n if (!currentValue) return { hours: 0, minutes: 0, seconds: 0 };\n return displayTimezone\n ? getTimeInTimezone(currentValue, displayTimezone)\n : getTime(currentValue);\n }, [currentValue, displayTimezone]);\n\n const setTime = useCallback(\n (partial: Partial<TimeValue>) => {\n if (disabled || readOnly) return;\n const base = currentValue ?? DateFnsAdapter.today(displayTimezone);\n const newIso = displayTimezone\n ? setTimeInTimezone(base, partial, displayTimezone)\n : setTimeOnIso(base, partial);\n if (!isControlled) {\n setUncontrolledValue(newIso);\n }\n onChange?.(newIso);\n },\n [disabled, readOnly, currentValue, displayTimezone, isControlled, onChange],\n );\n\n const contextValue: TimePickerContextValue = useMemo(\n () => ({\n value: currentValue,\n setTime,\n format,\n step,\n withSeconds,\n displayTimezone,\n isDisabled: disabled,\n isReadOnly: readOnly,\n currentTime,\n pickerId,\n labels: mergedLabels,\n filterTime,\n }),\n [\n currentValue,\n setTime,\n format,\n step,\n withSeconds,\n displayTimezone,\n disabled,\n readOnly,\n currentTime,\n pickerId,\n mergedLabels,\n filterTime,\n ],\n );\n\n return <TimePickerContext.Provider value={contextValue}>{children}</TimePickerContext.Provider>;\n}\n","import { forwardRef, useCallback, useEffect, useState } from 'react';\nimport type { InputHTMLAttributes } from 'react';\nimport { formatTimeString, parseTimeString } from '@kalyx/core';\nimport { useTimePickerContext } from '../../context/TimePickerContext.js';\n\nexport interface TimePickerInputProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'value' | 'onChange' | 'type'\n> {}\n\n/**\n * TimePicker.Input — Text input for HH:MM or HH:MM:SS format.\n * Supports direct typing by the user.\n */\nexport const TimePickerInput = forwardRef<HTMLInputElement, TimePickerInputProps>(\n function TimePickerInput({ onBlur, onKeyDown, ...props }, ref) {\n const ctx = useTimePickerContext('TimePicker.Input');\n const [inputText, setInputText] = useState<string | null>(null);\n\n // Drop stale typed text when the value changes from outside (parent re-sets,\n // HourList/MinuteList click, AM/PM toggle) so the input reflects the new time\n // instead of holding the user's earlier half-typed string. Time inputs are\n // numeric — no IME composition to worry about.\n useEffect(() => {\n setInputText(null);\n }, [ctx.value]);\n\n const displayValue =\n inputText !== null ? inputText : formatTimeString(ctx.currentTime, ctx.withSeconds);\n\n const commitInput = useCallback(() => {\n if (inputText === null) return;\n const parsed = parseTimeString(inputText);\n if (parsed) {\n ctx.setTime(parsed);\n }\n setInputText(null);\n }, [inputText, ctx]);\n\n const handleChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n setInputText(e.target.value);\n }, []);\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n commitInput();\n onBlur?.(e);\n },\n [commitInput, onBlur],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n commitInput();\n }\n onKeyDown?.(e);\n },\n [commitInput, onKeyDown],\n );\n\n return (\n <input\n ref={ref}\n type=\"text\"\n inputMode=\"numeric\"\n autoComplete=\"off\"\n aria-label={ctx.labels.timeInput}\n placeholder={ctx.withSeconds ? 'HH:MM:SS' : 'HH:MM'}\n value={displayValue}\n disabled={ctx.isDisabled || props.disabled}\n readOnly={ctx.isReadOnly}\n onChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n {...props}\n />\n );\n },\n);\n\nTimePickerInput.displayName = 'TimePicker.Input';\n","import { useCallback, useEffect, useRef } from 'react';\nimport type { KeyboardEvent, RefObject } from 'react';\n\nexport interface UseListboxNavigationOptions<T> {\n items: T[];\n onSelect: (item: T) => void;\n disabled?: boolean;\n}\n\nexport interface UseListboxNavigationReturn<T> {\n listRef: RefObject<HTMLUListElement | null>;\n handleKeyDown: (e: KeyboardEvent<HTMLLIElement>, item: T) => void;\n}\n\n/**\n * Shared listbox keyboard navigation following WAI-ARIA Listbox pattern.\n * Used by TimePicker.HourList and TimePicker.MinuteList.\n *\n * Handles: ArrowUp/Down, Home/End, Enter/Space.\n * After navigation, focuses the newly selected option via requestAnimationFrame.\n */\nexport function useListboxNavigation<T>({\n items,\n onSelect,\n disabled = false,\n}: UseListboxNavigationOptions<T>): UseListboxNavigationReturn<T> {\n const listRef = useRef<HTMLUListElement>(null);\n const rafIdRef = useRef<number>(0);\n\n // Cancel any pending rAF on unmount to avoid focusing a dead ref\n useEffect(() => {\n return () => cancelAnimationFrame(rafIdRef.current);\n }, []);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLLIElement>, item: T) => {\n if (disabled) return;\n const currentIndex = items.indexOf(item);\n\n let newIndex = -1;\n if (e.key === 'ArrowDown') {\n newIndex = Math.min(currentIndex + 1, items.length - 1);\n } else if (e.key === 'ArrowUp') {\n newIndex = Math.max(currentIndex - 1, 0);\n } else if (e.key === 'Home') {\n newIndex = 0;\n } else if (e.key === 'End') {\n newIndex = items.length - 1;\n } else if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onSelect(item);\n return;\n } else {\n return;\n }\n\n e.preventDefault();\n const target = items[newIndex];\n if (target !== undefined) {\n onSelect(target);\n cancelAnimationFrame(rafIdRef.current);\n rafIdRef.current = requestAnimationFrame(() => {\n const next = listRef.current?.querySelector<HTMLLIElement>('[data-selected=\"true\"]');\n next?.focus();\n });\n }\n },\n [items, onSelect, disabled],\n );\n\n return { listRef, handleKeyDown };\n}\n","import { useCallback, useMemo } from 'react';\nimport type { HTMLAttributes } from 'react';\nimport { generateHours, to12Hour, to24Hour } from '@kalyx/core';\nimport { useTimePickerContext } from '../../context/TimePickerContext.js';\nimport { useListboxNavigation } from '../../hooks/useListboxNavigation.js';\n\nexport interface TimePickerHourListClassNames {\n root?: string;\n option?: string;\n optionSelected?: string;\n}\n\nexport interface TimePickerHourListProps extends Omit<\n HTMLAttributes<HTMLUListElement>,\n 'role' | 'children'\n> {\n classNames?: TimePickerHourListClassNames;\n}\n\n/**\n * TimePicker.HourList — `role=\"listbox\"` pattern for hour selection.\n * Renders differently depending on 12h/24h mode.\n *\n * ARIA-standard listbox: the <li role=\"option\"> element itself is interactive.\n * Keyboard: ArrowUp/ArrowDown to navigate, Enter/Space to select.\n */\nexport function TimePickerHourList({ classNames, ...props }: TimePickerHourListProps) {\n const ctx = useTimePickerContext('TimePicker.HourList');\n const { format, step, currentTime, isDisabled, isReadOnly, filterTime } = ctx;\n\n // Stable across renders unless `format` changes — useListboxNavigation\n // identity-compares its `items` array internally.\n const hours = useMemo(() => generateHours(format), [format]);\n\n const selectedHourDisplay =\n format === '12h' ? to12Hour(currentTime.hours).hours12 : currentTime.hours;\n\n const currentPeriod = format === '12h' ? to12Hour(currentTime.hours).period : null;\n\n // An hour is fully disabled only when every step minute within it is rejected by `filterTime`.\n // Pre-compute the 24-bit mask once per filterTime/step change; per-render hour lookups are O(1).\n const fullyDisabledHours24 = useMemo(() => {\n if (!filterTime) return null;\n const disabled = new Set<number>();\n for (let h = 0; h < 24; h++) {\n let allRejected = true;\n for (let m = 0; m < 60; m += step) {\n if (!filterTime(h, m)) {\n allRejected = false;\n break;\n }\n }\n if (allRejected) disabled.add(h);\n }\n return disabled;\n }, [filterTime, step]);\n\n const isHourDisabled = useCallback(\n (hourDisplay: number) => {\n if (!fullyDisabledHours24) return false;\n const hours24 =\n format === '12h' && currentPeriod ? to24Hour(hourDisplay, currentPeriod) : hourDisplay;\n return fullyDisabledHours24.has(hours24);\n },\n [fullyDisabledHours24, format, currentPeriod],\n );\n\n const handleSelect = useCallback(\n (hourDisplay: number) => {\n if (isDisabled || isReadOnly) return;\n if (isHourDisabled(hourDisplay)) return;\n const hours24 =\n format === '12h' && currentPeriod ? to24Hour(hourDisplay, currentPeriod) : hourDisplay;\n ctx.setTime({ hours: hours24 });\n },\n [format, currentPeriod, ctx, isDisabled, isReadOnly, isHourDisabled],\n );\n\n const { listRef, handleKeyDown } = useListboxNavigation({\n items: hours,\n onSelect: handleSelect,\n disabled: isDisabled || isReadOnly,\n });\n\n return (\n <ul\n ref={listRef}\n role=\"listbox\"\n aria-label={ctx.labels.hourList}\n aria-disabled={isDisabled || undefined}\n className={classNames?.root}\n {...props}\n >\n {hours.map((hour) => {\n const isSelected = hour === selectedHourDisplay;\n const isHourFullyDisabled = isHourDisabled(hour);\n const optionClass =\n [classNames?.option, isSelected && classNames?.optionSelected]\n .filter(Boolean)\n .join(' ') || undefined;\n\n return (\n <li\n key={hour}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={isDisabled || isHourFullyDisabled || undefined}\n aria-label={ctx.labels.hourOption(hour)}\n data-selected={isSelected || undefined}\n tabIndex={isSelected ? 0 : -1}\n className={optionClass}\n onClick={() => handleSelect(hour)}\n onKeyDown={(e) => handleKeyDown(e, hour)}\n >\n {String(hour).padStart(2, '0')}\n </li>\n );\n })}\n </ul>\n );\n}\n","import { useCallback, useMemo } from 'react';\nimport type { HTMLAttributes } from 'react';\nimport { generateMinutes } from '@kalyx/core';\nimport { useTimePickerContext } from '../../context/TimePickerContext.js';\nimport { useListboxNavigation } from '../../hooks/useListboxNavigation.js';\n\nexport interface TimePickerMinuteListClassNames {\n root?: string;\n option?: string;\n optionSelected?: string;\n}\n\nexport interface TimePickerMinuteListProps extends Omit<\n HTMLAttributes<HTMLUListElement>,\n 'role' | 'children'\n> {\n classNames?: TimePickerMinuteListClassNames;\n}\n\n/**\n * TimePicker.MinuteList — `role=\"listbox\"` pattern for minute selection.\n * The displayed minutes depend on the `step` prop (e.g., step=15 -> [0, 15, 30, 45]).\n */\nexport function TimePickerMinuteList({ classNames, ...props }: TimePickerMinuteListProps) {\n const ctx = useTimePickerContext('TimePicker.MinuteList');\n const { step, currentTime, isDisabled, isReadOnly, filterTime } = ctx;\n\n // Stable across renders unless `step` changes — useListboxNavigation\n // identity-compares its `items` array internally.\n const minutes = useMemo(() => generateMinutes(step), [step]);\n\n const isMinuteDisabled = useCallback(\n (minute: number) => {\n if (!filterTime) return false;\n return filterTime(currentTime.hours, minute);\n },\n [filterTime, currentTime.hours],\n );\n\n const handleSelect = useCallback(\n (minute: number) => {\n if (isDisabled || isReadOnly) return;\n if (isMinuteDisabled(minute)) return;\n ctx.setTime({ minutes: minute });\n },\n [ctx, isDisabled, isReadOnly, isMinuteDisabled],\n );\n\n const { listRef, handleKeyDown } = useListboxNavigation({\n items: minutes,\n onSelect: handleSelect,\n disabled: isDisabled || isReadOnly,\n });\n\n return (\n <ul\n ref={listRef}\n role=\"listbox\"\n aria-label={ctx.labels.minuteList}\n aria-disabled={isDisabled || undefined}\n className={classNames?.root}\n {...props}\n >\n {minutes.map((minute) => {\n const isSelected = minute === currentTime.minutes;\n const isMinuteFullyDisabled = isMinuteDisabled(minute);\n const optionClass =\n [classNames?.option, isSelected && classNames?.optionSelected]\n .filter(Boolean)\n .join(' ') || undefined;\n\n return (\n <li\n key={minute}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={isDisabled || isMinuteFullyDisabled || undefined}\n aria-label={ctx.labels.minuteOption(minute)}\n data-selected={isSelected || undefined}\n tabIndex={isSelected ? 0 : -1}\n className={optionClass}\n onClick={() => handleSelect(minute)}\n onKeyDown={(e) => handleKeyDown(e, minute)}\n >\n {String(minute).padStart(2, '0')}\n </li>\n );\n })}\n </ul>\n );\n}\n","import { useCallback, useRef } from 'react';\nimport type { HTMLAttributes, KeyboardEvent } from 'react';\nimport { to12Hour, to24Hour } from '@kalyx/core';\nimport { useTimePickerContext } from '../../context/TimePickerContext.js';\n\nexport interface TimePickerAmPmToggleClassNames {\n root?: string;\n option?: string;\n optionSelected?: string;\n}\n\nexport interface TimePickerAmPmToggleProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'role' | 'children'\n> {\n classNames?: TimePickerAmPmToggleClassNames;\n}\n\n/**\n * TimePicker.AmPmToggle — AM/PM toggle shown only in 12-hour mode.\n * Returns null in 24-hour mode.\n *\n * Implements the WAI-ARIA radiogroup pattern: only the checked radio is in the\n * tab order; ArrowLeft/Right/Up/Down + Home/End move selection between radios.\n */\nexport function TimePickerAmPmToggle({ classNames, ...props }: TimePickerAmPmToggleProps) {\n const ctx = useTimePickerContext('TimePicker.AmPmToggle');\n const amRef = useRef<HTMLButtonElement | null>(null);\n const pmRef = useRef<HTMLButtonElement | null>(null);\n\n const setPeriod = useCallback(\n (newPeriod: 'AM' | 'PM') => {\n if (ctx.isDisabled || ctx.isReadOnly) return;\n const { hours12 } = to12Hour(ctx.currentTime.hours);\n const newHours24 = to24Hour(hours12, newPeriod);\n ctx.setTime({ hours: newHours24 });\n },\n [ctx],\n );\n\n if (ctx.format !== '12h') return null;\n\n const { period } = to12Hour(ctx.currentTime.hours);\n\n const focusOther = (target: 'AM' | 'PM') => {\n (target === 'AM' ? amRef : pmRef).current?.focus();\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLButtonElement>, target: 'AM' | 'PM') => {\n switch (e.key) {\n case 'ArrowRight':\n case 'ArrowDown':\n case 'ArrowLeft':\n case 'ArrowUp': {\n e.preventDefault();\n const next: 'AM' | 'PM' = target === 'AM' ? 'PM' : 'AM';\n setPeriod(next);\n focusOther(next);\n break;\n }\n case 'Home': {\n e.preventDefault();\n setPeriod('AM');\n focusOther('AM');\n break;\n }\n case 'End': {\n e.preventDefault();\n setPeriod('PM');\n focusOther('PM');\n break;\n }\n case ' ':\n case 'Enter': {\n e.preventDefault();\n setPeriod(target);\n break;\n }\n default:\n break;\n }\n };\n\n const renderButton = (target: 'AM' | 'PM') => {\n const isSelected = period === target;\n const optionClass =\n [classNames?.option, isSelected && classNames?.optionSelected].filter(Boolean).join(' ') ||\n undefined;\n\n return (\n <button\n ref={target === 'AM' ? amRef : pmRef}\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n tabIndex={isSelected ? 0 : -1}\n data-selected={isSelected || undefined}\n disabled={ctx.isDisabled}\n className={optionClass}\n onClick={() => setPeriod(target)}\n onKeyDown={(e) => handleKeyDown(e, target)}\n >\n {target}\n </button>\n );\n };\n\n return (\n <div\n role=\"radiogroup\"\n aria-label={ctx.labels.amPmToggle}\n className={classNames?.root}\n {...props}\n >\n {renderButton('AM')}\n {renderButton('PM')}\n </div>\n );\n}\n","import { TimePickerRoot } from './Root.js';\nimport { TimePickerInput } from './Input.js';\nimport { TimePickerHourList } from './HourList.js';\nimport { TimePickerMinuteList } from './MinuteList.js';\nimport { TimePickerAmPmToggle } from './AmPmToggle.js';\n\nimport type { TimePickerRootProps } from './Root.js';\nimport type { TimePickerInputProps } from './Input.js';\nimport type { TimePickerHourListProps, TimePickerHourListClassNames } from './HourList.js';\nimport type { TimePickerMinuteListProps, TimePickerMinuteListClassNames } from './MinuteList.js';\nimport type { TimePickerAmPmToggleProps, TimePickerAmPmToggleClassNames } from './AmPmToggle.js';\n\n/**\n * TimePicker — Headless time-picker component\n *\n * @example\n * ```tsx\n * <TimePicker value={time} onChange={setTime} format=\"24h\" step={15}>\n * <TimePicker.Input />\n * <div>\n * <TimePicker.HourList />\n * <TimePicker.MinuteList />\n * <TimePicker.AmPmToggle />\n * </div>\n * </TimePicker>\n * ```\n */\nexport const TimePicker = Object.assign(TimePickerRoot, {\n Input: TimePickerInput,\n HourList: TimePickerHourList,\n MinuteList: TimePickerMinuteList,\n AmPmToggle: TimePickerAmPmToggle,\n});\n\nexport type {\n TimePickerRootProps,\n TimePickerInputProps,\n TimePickerHourListProps,\n TimePickerHourListClassNames,\n TimePickerMinuteListProps,\n TimePickerMinuteListClassNames,\n TimePickerAmPmToggleProps,\n TimePickerAmPmToggleClassNames,\n};\n","import { useCallback, useId, useMemo, useRef, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport {\n DateFnsAdapter,\n DEFAULT_DATEPICKER_LABELS,\n DEFAULT_TIMEPICKER_LABELS,\n getTime,\n setTime as setTimeOnIso,\n getTimeInTimezone,\n setTimeInTimezone,\n civilMidnightFromUtcDay,\n} from '@kalyx/core';\nimport type {\n DateAdapter,\n DateTimePickerLabels,\n DisabledRule,\n ISODateString,\n TimeValue,\n WeekStartsOn,\n} from '@kalyx/core';\nimport { DatePickerContext } from '../../context/DatePickerContext.js';\nimport type { DatePickerContextValue } from '../../context/DatePickerContext.js';\nimport { TimePickerContext } from '../../context/TimePickerContext.js';\nimport type { TimePickerContextValue, TimePickerFormat } from '../../context/TimePickerContext.js';\nimport { useChangeEffect } from '../../hooks/useChangeEffect.js';\n\n/**\n * Props for the DateTimePicker Root component.\n * Internally provides both DatePickerContext and TimePickerContext (context bridging).\n *\n * @example\n * ```tsx\n * <DateTimePicker value={dt} onChange={setDt} format=\"24h\" step={15}>\n * <DateTimePicker.Input />\n * <DateTimePicker.Popover>\n * <DateTimePicker.Calendar />\n * <DateTimePicker.HourList />\n * <DateTimePicker.MinuteList />\n * </DateTimePicker.Popover>\n * </DateTimePicker>\n * ```\n */\nexport interface DateTimePickerRootProps {\n /** Selected datetime (controlled, ISO 8601 UTC). Includes both date and time. */\n value?: ISODateString | null;\n /** Initial datetime (uncontrolled) */\n defaultValue?: ISODateString;\n /** Callback fired when the datetime changes */\n onChange?: (value: ISODateString | null) => void;\n /** Callback fired when the popover open state changes */\n onOpenChange?: (isOpen: boolean) => void;\n /**\n * Callback fired when the calendar view navigates to a different month.\n * The value is the ISO string of the first day of the newly-visible month (UTC).\n */\n onCalendarNavigate?: (viewMonth: ISODateString) => void;\n /** 12-hour or 24-hour mode */\n format?: TimePickerFormat;\n /** Minute step (e.g., 1, 5, 15, 30) */\n step?: number;\n /** Whether to display seconds in the time controls */\n withSeconds?: boolean;\n /**\n * Programmatic per-slot disable predicate for the time controls. Returns `true` for any\n * `(hours, minutes)` pair that should be unselectable — same polarity as MUI X's\n * `shouldDisableTime`, and the **inverse** of react-datepicker's `filterTime`. Always\n * receives 24-hour values.\n */\n filterTime?: (hours: number, minutes: number) => boolean;\n /** Disabled rules (applied to dates) */\n disabled?: DisabledRule[] | boolean;\n /** Read-only */\n readOnly?: boolean;\n /** Week start day */\n weekStartsOn?: WeekStartsOn;\n /** Date+time display format (for Input) */\n displayFormat?: string;\n /** BCP 47 locale */\n locale?: string;\n /**\n * IANA timezone used for display (e.g., \"Asia/Seoul\"). When set, Calendar highlights match\n * civil days in this zone, TimePicker reads/writes the time in this zone, and the Input\n * formats the combined date+time in this zone.\n */\n displayTimezone?: string;\n /** Date adapter */\n adapter?: DateAdapter;\n /** Override ARIA labels (defaults to English) */\n labels?: Partial<DateTimePickerLabels>;\n /** Child components */\n children: ReactNode;\n}\n\n/**\n * DateTimePicker.Root — Combined DatePicker + TimePicker component.\n *\n * Manages a single ISO datetime as the source of truth while providing both\n * DatePickerContext and TimePickerContext internally. This lets existing\n * components such as DatePicker.Calendar and TimePicker.HourList be reused as-is.\n *\n * Key behavior:\n * - Clicking a day in Calendar -> changes only the date, preserves the time, keeps popover open\n * - Changing time in TimePicker -> changes only the time, preserves the date\n * - Escape / outside click -> close the popover (commit)\n */\nexport function DateTimePickerRoot({\n value: controlledValue,\n defaultValue,\n onChange,\n onOpenChange,\n onCalendarNavigate,\n format = '24h',\n step = 1,\n withSeconds = false,\n filterTime,\n disabled = false,\n readOnly = false,\n weekStartsOn = 0,\n displayFormat = 'yyyy-MM-dd HH:mm',\n locale = 'en-US',\n displayTimezone,\n adapter = DateFnsAdapter,\n labels: labelsProp,\n children,\n}: DateTimePickerRootProps) {\n const pickerId = useId();\n const mergedDateLabels = useMemo(\n () => ({ ...DEFAULT_DATEPICKER_LABELS, ...labelsProp }),\n [labelsProp],\n );\n const mergedTimeLabels = useMemo(\n () => ({ ...DEFAULT_TIMEPICKER_LABELS, ...labelsProp }),\n [labelsProp],\n );\n const isControlled = useRef(controlledValue !== undefined).current;\n const referenceRef = useRef<HTMLElement | null>(null);\n\n const [uncontrolledValue, setUncontrolledValue] = useState<ISODateString | null>(\n defaultValue ?? null,\n );\n\n const currentValue = isControlled ? (controlledValue ?? null) : uncontrolledValue;\n\n const [isOpen, setIsOpen] = useState(false);\n // Lazy initializers — see DatePicker/Root.tsx for the SSR/hydration rationale.\n const [viewMonth, setViewMonth] = useState<ISODateString>(\n () => currentValue ?? adapter.today(displayTimezone),\n );\n const [focusedDate, setFocusedDate] = useState<ISODateString>(\n () => currentValue ?? adapter.today(displayTimezone),\n );\n\n useChangeEffect(isOpen, onOpenChange);\n const viewMonthStart = useMemo(() => adapter.startOfMonth(viewMonth), [viewMonth, adapter]);\n useChangeEffect(viewMonthStart, onCalendarNavigate);\n\n const isDisabled = typeof disabled === 'boolean' ? disabled : false;\n const disabledRules: DisabledRule[] = useMemo(\n () => (Array.isArray(disabled) ? disabled : []),\n [disabled],\n );\n\n // When value is null, use a stable {0,0,0} fallback for hydration safety —\n // avoid invoking adapter.today() during render to keep server/client output deterministic.\n const currentTime: TimeValue = useMemo(() => {\n if (!currentValue) return { hours: 0, minutes: 0, seconds: 0 };\n return displayTimezone\n ? getTimeInTimezone(currentValue, displayTimezone)\n : getTime(currentValue);\n }, [currentValue, displayTimezone]);\n\n const updateValue = useCallback(\n (next: ISODateString | null) => {\n if (isDisabled || readOnly) return;\n if (!isControlled) {\n setUncontrolledValue(next);\n }\n onChange?.(next);\n },\n [isControlled, isDisabled, readOnly, onChange],\n );\n\n /**\n * Select a date while preserving the time portion.\n * Unlike DatePicker.Root, this does not automatically close the popover.\n */\n const selectDate = useCallback(\n (newDateIso: ISODateString | null) => {\n if (newDateIso === null) {\n updateValue(null);\n return;\n }\n // Map UTC-grid ISO to civil-midnight in display timezone when set\n const normalizedDate = displayTimezone\n ? civilMidnightFromUtcDay(newDateIso, displayTimezone)\n : newDateIso;\n // Preserve the current time portion (tz-aware when applicable)\n const time = currentValue\n ? displayTimezone\n ? getTimeInTimezone(currentValue, displayTimezone)\n : getTime(currentValue)\n : currentTime;\n const merged = displayTimezone\n ? setTimeInTimezone(normalizedDate, time, displayTimezone)\n : setTimeOnIso(normalizedDate, time);\n updateValue(merged);\n },\n [currentValue, currentTime, updateValue, displayTimezone],\n );\n\n /**\n * Change the time while preserving the date portion.\n */\n const setTime = useCallback(\n (partial: Partial<TimeValue>) => {\n // If no date yet, start from today at midnight (tz-aware). today() is resolved at\n // event time (not during render) so SSR hydration output stays stable.\n const base = currentValue ?? adapter.today(displayTimezone);\n const merged = displayTimezone\n ? setTimeInTimezone(base, partial, displayTimezone)\n : setTimeOnIso(base, partial);\n updateValue(merged);\n },\n [currentValue, updateValue, displayTimezone, adapter],\n );\n\n const open = useCallback(() => {\n if (isDisabled || readOnly) return;\n setIsOpen(true);\n const target = currentValue ?? adapter.today(displayTimezone);\n setViewMonth(target);\n setFocusedDate(target);\n }, [isDisabled, readOnly, currentValue, adapter, displayTimezone]);\n\n const close = useCallback(() => {\n setIsOpen(false);\n }, []);\n\n const toggle = useCallback(() => {\n if (isOpen) close();\n else open();\n }, [isOpen, open, close]);\n\n // DatePickerContext (for reusing Calendar and Popover)\n const dateContext: DatePickerContextValue = useMemo(\n () => ({\n referenceRef,\n value: currentValue,\n selectDate,\n isOpen,\n open,\n close,\n toggle,\n viewMonth,\n setViewMonth,\n focusedDate,\n setFocusedDate,\n adapter,\n disabled: disabledRules,\n weekStartsOn,\n displayFormat,\n locale,\n displayTimezone,\n isDisabled,\n isReadOnly: readOnly,\n pickerId,\n labels: mergedDateLabels,\n }),\n [\n currentValue,\n selectDate,\n isOpen,\n open,\n close,\n toggle,\n viewMonth,\n focusedDate,\n adapter,\n disabledRules,\n weekStartsOn,\n displayFormat,\n locale,\n displayTimezone,\n isDisabled,\n readOnly,\n pickerId,\n mergedDateLabels,\n ],\n );\n\n // TimePickerContext (for reusing HourList, MinuteList, AmPmToggle)\n const timeContext: TimePickerContextValue = useMemo(\n () => ({\n value: currentValue,\n setTime,\n format,\n step,\n withSeconds,\n displayTimezone,\n isDisabled,\n isReadOnly: readOnly,\n currentTime,\n pickerId,\n labels: mergedTimeLabels,\n filterTime,\n }),\n [\n currentValue,\n setTime,\n format,\n step,\n withSeconds,\n displayTimezone,\n isDisabled,\n readOnly,\n currentTime,\n pickerId,\n mergedTimeLabels,\n filterTime,\n ],\n );\n\n return (\n <DatePickerContext.Provider value={dateContext}>\n <TimePickerContext.Provider value={timeContext}>{children}</TimePickerContext.Provider>\n </DatePickerContext.Provider>\n );\n}\n","import { forwardRef, useCallback } from 'react';\nimport type { InputHTMLAttributes } from 'react';\nimport { formatTimeString, getTime, getTimeInTimezone } from '@kalyx/core';\nimport { useDatePickerContext } from '../../context/DatePickerContext.js';\n\nexport interface DateTimePickerInputProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'value' | 'onChange' | 'type'\n> {}\n\n/**\n * DateTimePicker.Input — Displays date and time combined.\n * Example: \"2026-01-15 14:30\"\n *\n * The input is read-only — use Calendar/TimePicker sub-components to select values.\n */\nexport const DateTimePickerInput = forwardRef<HTMLInputElement, DateTimePickerInputProps>(\n function DateTimePickerInput({ onClick, onKeyDown, ...props }, ref) {\n const ctx = useDatePickerContext('DateTimePicker.Input');\n\n // Combine the date portion (yyyy-MM-dd) and the time portion (HH:mm)\n let displayValue = '';\n if (ctx.value) {\n try {\n const datePart = ctx.adapter.format(ctx.value, 'yyyy-MM-dd', ctx.displayTimezone);\n const time = ctx.displayTimezone\n ? getTimeInTimezone(ctx.value, ctx.displayTimezone)\n : getTime(ctx.value);\n displayValue = `${datePart} ${formatTimeString(time)}`;\n } catch {\n displayValue = ctx.value;\n }\n }\n\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLInputElement>) => {\n if (!ctx.isOpen) ctx.open();\n onClick?.(e);\n },\n [ctx, onClick],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Escape') {\n ctx.close();\n } else if (e.key === 'Enter' && ctx.isOpen) {\n // Don't submit the surrounding form when the calendar is open.\n e.preventDefault();\n } else if (e.key === 'ArrowDown' && !ctx.isOpen) {\n e.preventDefault();\n ctx.open();\n }\n onKeyDown?.(e);\n },\n [ctx, onKeyDown],\n );\n\n const calendarId = `${ctx.pickerId}-calendar`;\n\n return (\n <input\n ref={(node) => {\n ctx.referenceRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n }}\n type=\"text\"\n role=\"combobox\"\n readOnly\n aria-label={ctx.labels.dateTimeInput ?? 'Date and time'}\n aria-expanded={ctx.isOpen}\n aria-haspopup=\"dialog\"\n aria-controls={ctx.isOpen ? calendarId : undefined}\n aria-autocomplete=\"none\"\n autoComplete=\"off\"\n value={displayValue}\n disabled={ctx.isDisabled || props.disabled}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n {...props}\n />\n );\n },\n);\n\nDateTimePickerInput.displayName = 'DateTimePicker.Input';\n","import { DateTimePickerRoot } from './Root.js';\nimport { DateTimePickerInput } from './Input.js';\n\n// Reuse: DatePicker subcomponents (consume DatePickerContext)\nimport { DatePickerPopover } from '../DatePicker/Popover.js';\nimport { DatePickerCalendar } from '../DatePicker/Calendar.js';\nimport { DatePickerMonthGrid } from '../DatePicker/MonthGrid.js';\nimport { DatePickerYearGrid } from '../DatePicker/YearGrid.js';\n\n// Reuse: TimePicker subcomponents (consume TimePickerContext)\nimport { TimePickerHourList } from '../TimePicker/HourList.js';\nimport { TimePickerMinuteList } from '../TimePicker/MinuteList.js';\nimport { TimePickerAmPmToggle } from '../TimePicker/AmPmToggle.js';\n\nimport type { DateTimePickerRootProps } from './Root.js';\nimport type { DateTimePickerInputProps } from './Input.js';\n\n/**\n * DateTimePicker — Combined component for selecting both date and time.\n *\n * Manages a single ISO datetime as the source of truth while providing both\n * DatePickerContext and TimePickerContext internally. This lets existing\n * components such as DatePicker.Calendar and TimePicker.HourList work as-is.\n *\n * @example\n * ```tsx\n * <DateTimePicker value={dt} onChange={setDt} format=\"24h\" step={15}>\n * <DateTimePicker.Input />\n * <DateTimePicker.Popover>\n * <DateTimePicker.Calendar />\n * <DateTimePicker.HourList />\n * <DateTimePicker.MinuteList />\n * </DateTimePicker.Popover>\n * </DateTimePicker>\n * ```\n *\n * @example 12-hour mode\n * ```tsx\n * <DateTimePicker value={dt} onChange={setDt} format=\"12h\" step={15}>\n * <DateTimePicker.Input />\n * <DateTimePicker.Popover>\n * <DateTimePicker.Calendar />\n * <DateTimePicker.HourList />\n * <DateTimePicker.MinuteList />\n * <DateTimePicker.AmPmToggle />\n * </DateTimePicker.Popover>\n * </DateTimePicker>\n * ```\n */\nexport const DateTimePicker = Object.assign(DateTimePickerRoot, {\n Input: DateTimePickerInput,\n Popover: DatePickerPopover,\n Calendar: DatePickerCalendar,\n MonthGrid: DatePickerMonthGrid,\n YearGrid: DatePickerYearGrid,\n HourList: TimePickerHourList,\n MinuteList: TimePickerMinuteList,\n AmPmToggle: TimePickerAmPmToggle,\n});\n\nexport type { DateTimePickerRootProps, DateTimePickerInputProps };\n","import { DatePickerRoot } from '../DatePicker/Root.js';\nimport type { DatePickerRootProps } from '../DatePicker/Root.js';\n\n/** Props for MonthPicker Root — identical to DatePicker Root, but `displayFormat` defaults to `\"yyyy-MM\"`. */\nexport type MonthPickerRootProps = DatePickerRootProps;\n\n/**\n * MonthPicker.Root — thin wrapper over DatePicker.Root that defaults `displayFormat` to `\"yyyy-MM\"`.\n * All other behavior (controlled/uncontrolled, displayTimezone, disabled rules) is inherited.\n */\nexport function MonthPickerRoot(props: MonthPickerRootProps) {\n const displayFormat = props.displayFormat ?? 'yyyy-MM';\n return <DatePickerRoot {...props} displayFormat={displayFormat} />;\n}\n","import { useCallback, useEffect, useMemo, useState } from 'react';\nimport type { HTMLAttributes } from 'react';\nimport { getMonthName, type ISODateString } from '@kalyx/core';\nimport { useDatePickerContext } from '../../context/DatePickerContext.js';\nimport { isRangeFullyDisabled, useGridState } from '../_shared/grid-keyboard.js';\n\nexport interface MonthPickerGridClassNames {\n root?: string;\n header?: string;\n title?: string;\n navButton?: string;\n grid?: string;\n gridRow?: string;\n month?: string;\n monthSelected?: string;\n monthCurrent?: string;\n monthDisabled?: string;\n}\n\nexport interface MonthPickerGridProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role'> {\n classNames?: MonthPickerGridClassNames;\n}\n\n/**\n * MonthPicker.Grid — 12-month commit grid. Clicking a month selects it and closes the popover.\n *\n * Unlike `DatePicker.MonthGrid` (drilldown), this component commits the month selection\n * via `ctx.selectDate`, emitting the month-start ISO string.\n *\n * Disabled state: a month is marked unselectable when every day in it is\n * excluded by a `before`/`after` rule on the `disabled` prop. The cell is\n * rendered with `disabled` + `aria-disabled` + the `monthDisabled` className,\n * and keyboard navigation skips it.\n *\n * @example\n * ```tsx\n * <MonthPicker\n * value={month}\n * onChange={setMonth}\n * disabled={[{ before: '2026-04-01T00:00:00.000Z' }]}\n * >\n * <MonthPicker.Input />\n * <MonthPicker.Popover>\n * <MonthPicker.Grid />\n * </MonthPicker.Popover>\n * </MonthPicker>\n * ```\n */\nexport function MonthPickerGrid({ classNames, ...props }: MonthPickerGridProps) {\n const ctx = useDatePickerContext('MonthPicker.Grid');\n const { adapter, viewMonth, locale, value, displayTimezone, labels, disabled } = ctx;\n\n const currentYear = adapter.getYear(viewMonth);\n\n // Extract the value's year and month in the display timezone so highlighting\n // remains correct when storage is civil-midnight-in-tz (UTC-ISO form).\n const [valueYear, valueMonthZeroBased] = useMemo(() => {\n if (!value) return [null, null] as const;\n try {\n const [y, m] = adapter.format(value, 'yyyy-MM', displayTimezone).split('-').map(Number);\n return [y!, m! - 1] as const;\n } catch {\n return [null, null] as const;\n }\n }, [value, adapter, displayTimezone]);\n\n // SSR-safe: today is null on server and during hydration, set after mount.\n const [today, setToday] = useState<ISODateString | null>(null);\n useEffect(() => {\n setToday(adapter.today(displayTimezone));\n }, [adapter, displayTimezone]);\n const todayYear = today !== null ? adapter.getYear(today) : -1;\n const todayMonth = today !== null ? adapter.getMonth(today) : -1;\n\n // A month is \"fully disabled\" only when every day in it is excluded by a\n // `before`/`after` rule. `date` and `dayOfWeek` rules can't disable a whole\n // month, so they're ignored here.\n const monthDisabledFlags = useMemo(\n () =>\n Array.from({ length: 12 }, (_, i) => {\n const monthStart = new Date(Date.UTC(currentYear, i, 1)).toISOString();\n return isRangeFullyDisabled(monthStart, adapter.endOfMonth(monthStart), disabled, adapter);\n }),\n [currentYear, disabled, adapter],\n );\n\n const navigateYear = useCallback(\n (direction: number) => {\n ctx.setViewMonth(adapter.addYears(viewMonth, direction));\n },\n [adapter, viewMonth, ctx],\n );\n\n const handleMonthSelect = useCallback(\n (monthIndex: number) => {\n if (monthDisabledFlags[monthIndex]) return;\n const target = new Date(Date.UTC(currentYear, monthIndex, 1)).toISOString();\n ctx.selectDate(target);\n },\n [currentYear, ctx, monthDisabledFlags],\n );\n\n // Roving tabIndex: focus the selected cell on the value's year, else the\n // current month. Falls back to the first enabled cell when the natural\n // choice is itself disabled (a `disabled` HTML button can't receive DOM\n // focus, so without this fallback the auto-refocus useEffect would silently\n // no-op and the user would have nowhere to keyboard-navigate from).\n const naturalIndex =\n valueYear === currentYear && valueMonthZeroBased !== null\n ? valueMonthZeroBased\n : adapter.getMonth(viewMonth);\n const firstEnabled = monthDisabledFlags.findIndex((d) => !d);\n const initialIndex = monthDisabledFlags[naturalIndex]\n ? firstEnabled === -1\n ? naturalIndex\n : firstEnabled\n : naturalIndex;\n\n const { gridRef, focusedIndex, handleKeyDown } = useGridState({\n initialIndex,\n disabledFlags: monthDisabledFlags,\n onSelect: handleMonthSelect,\n onPageUp: () => navigateYear(-1),\n onPageDown: () => navigateYear(1),\n onEscape: ctx.close,\n });\n\n return (\n <div className={classNames?.root} {...props}>\n <div className={classNames?.header}>\n <button\n type=\"button\"\n className={classNames?.navButton}\n onClick={() => navigateYear(-1)}\n aria-label={labels.prevYear}\n >\n <\n </button>\n <span className={classNames?.title}>{currentYear}</span>\n <button\n type=\"button\"\n className={classNames?.navButton}\n onClick={() => navigateYear(1)}\n aria-label={labels.nextYear}\n >\n >\n </button>\n </div>\n\n <div\n ref={gridRef}\n role=\"grid\"\n aria-label={`${currentYear} months`}\n className={classNames?.grid}\n onKeyDown={handleKeyDown}\n >\n {Array.from({ length: 4 }, (_, rowIndex) => (\n <div\n key={rowIndex}\n role=\"row\"\n className={classNames?.gridRow}\n style={{ display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)' }}\n >\n {Array.from({ length: 3 }, (_, col) => {\n const i = rowIndex * 3 + col;\n const isSelected = valueYear === currentYear && valueMonthZeroBased === i;\n const isCurrent = todayYear === currentYear && todayMonth === i;\n const isFocused = i === focusedIndex;\n const isDisabled = monthDisabledFlags[i] ?? false;\n const cls =\n [\n classNames?.month,\n isSelected && classNames?.monthSelected,\n isCurrent && classNames?.monthCurrent,\n isDisabled && classNames?.monthDisabled,\n ]\n .filter(Boolean)\n .join(' ') || undefined;\n return (\n <button\n key={i}\n type=\"button\"\n role=\"gridcell\"\n tabIndex={isFocused ? 0 : -1}\n disabled={isDisabled}\n aria-selected={isSelected || undefined}\n aria-disabled={isDisabled || undefined}\n aria-current={isCurrent ? 'date' : undefined}\n data-selected={isSelected || undefined}\n data-current={isCurrent || undefined}\n data-focused={isFocused || undefined}\n className={cls}\n onClick={() => handleMonthSelect(i)}\n >\n {getMonthName(i, locale)}\n </button>\n );\n })}\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import { MonthPickerRoot } from './Root.js';\nimport { DatePickerInput } from '../DatePicker/Input.js';\nimport { DatePickerTrigger } from '../DatePicker/Trigger.js';\nimport { DatePickerPopover } from '../DatePicker/Popover.js';\nimport { MonthPickerGrid } from './Grid.js';\n\nimport type { MonthPickerRootProps } from './Root.js';\nimport type { DatePickerInputProps } from '../DatePicker/Input.js';\nimport type { DatePickerTriggerProps } from '../DatePicker/Trigger.js';\nimport type { DatePickerPopoverProps } from '../DatePicker/Popover.js';\nimport type { MonthPickerGridProps, MonthPickerGridClassNames } from './Grid.js';\n\n/**\n * MonthPicker — Headless month selector. Value is the first day of the selected month (UTC-ISO).\n *\n * Reuses DatePicker infrastructure (Root, Input, Trigger, Popover) so the public surface stays\n * consistent. The only new building block is `MonthPicker.Grid`, a 12-month commit grid.\n *\n * @example Basic\n * ```tsx\n * const [month, setMonth] = useState<string | null>(null);\n * <MonthPicker value={month} onChange={setMonth}>\n * <MonthPicker.Input placeholder=\"Pick a month\" />\n * <MonthPicker.Popover>\n * <MonthPicker.Grid />\n * </MonthPicker.Popover>\n * </MonthPicker>\n * ```\n */\nexport const MonthPicker = Object.assign(MonthPickerRoot, {\n Input: DatePickerInput,\n Trigger: DatePickerTrigger,\n Popover: DatePickerPopover,\n Grid: MonthPickerGrid,\n});\n\nexport type {\n MonthPickerRootProps,\n DatePickerInputProps as MonthPickerInputProps,\n DatePickerTriggerProps as MonthPickerTriggerProps,\n DatePickerPopoverProps as MonthPickerPopoverProps,\n MonthPickerGridProps,\n MonthPickerGridClassNames,\n};\n","import { DatePickerRoot } from '../DatePicker/Root.js';\nimport type { DatePickerRootProps } from '../DatePicker/Root.js';\n\n/** Props for YearPicker Root — identical to DatePicker Root, but `displayFormat` defaults to `\"yyyy\"`. */\nexport type YearPickerRootProps = DatePickerRootProps;\n\n/**\n * YearPicker.Root — thin wrapper over DatePicker.Root that defaults `displayFormat` to `\"yyyy\"`.\n */\nexport function YearPickerRoot(props: YearPickerRootProps) {\n const displayFormat = props.displayFormat ?? 'yyyy';\n return <DatePickerRoot {...props} displayFormat={displayFormat} />;\n}\n","import { useCallback, useEffect, useMemo, useState } from 'react';\nimport type { HTMLAttributes } from 'react';\nimport type { ISODateString } from '@kalyx/core';\nimport { useDatePickerContext } from '../../context/DatePickerContext.js';\nimport { isRangeFullyDisabled, useGridState } from '../_shared/grid-keyboard.js';\n\nexport interface YearPickerGridClassNames {\n root?: string;\n header?: string;\n title?: string;\n navButton?: string;\n grid?: string;\n gridRow?: string;\n year?: string;\n yearSelected?: string;\n yearCurrent?: string;\n yearDisabled?: string;\n}\n\nexport interface YearPickerGridProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role'> {\n classNames?: YearPickerGridClassNames;\n}\n\n/**\n * YearPicker.Grid — 12-year decade commit grid. Clicking a year selects it and closes the popover.\n *\n * Unlike `DatePicker.YearGrid` (drilldown), this component commits the year selection via\n * `ctx.selectDate`, emitting the year-start ISO string (Jan 1 at UTC midnight).\n *\n * Disabled state: a year is marked unselectable when every day in it is\n * excluded by a `before`/`after` rule on the `disabled` prop. The cell is\n * rendered with `disabled` + `aria-disabled` + the `yearDisabled` className,\n * and keyboard navigation skips it.\n *\n * @example\n * ```tsx\n * <YearPicker\n * value={year}\n * onChange={setYear}\n * disabled={[{ before: '2024-01-01T00:00:00.000Z' }]}\n * >\n * <YearPicker.Input />\n * <YearPicker.Popover>\n * <YearPicker.Grid />\n * </YearPicker.Popover>\n * </YearPicker>\n * ```\n */\nexport function YearPickerGrid({ classNames, ...props }: YearPickerGridProps) {\n const ctx = useDatePickerContext('YearPicker.Grid');\n const { adapter, viewMonth, value, displayTimezone, labels, disabled } = ctx;\n\n const currentYear = adapter.getYear(viewMonth);\n // Decade block containing the currently viewed year (12-year range)\n const decadeStart = currentYear - (currentYear % 12);\n\n // Extract the value's year in the display timezone so highlighting is timezone-aware.\n const valueYear = useMemo(() => {\n if (!value) return null;\n try {\n return Number(adapter.format(value, 'yyyy', displayTimezone));\n } catch {\n return null;\n }\n }, [value, adapter, displayTimezone]);\n\n // SSR-safe: today is null on server and during hydration, set after mount.\n const [today, setToday] = useState<ISODateString | null>(null);\n useEffect(() => {\n setToday(adapter.today(displayTimezone));\n }, [adapter, displayTimezone]);\n const todayYear = today !== null ? adapter.getYear(today) : -1;\n\n // A year is \"fully disabled\" only when every day in it is excluded by a\n // `before`/`after` rule.\n const yearDisabledFlags = useMemo(\n () =>\n Array.from({ length: 12 }, (_, i) => {\n const year = decadeStart + i;\n const yearStart = new Date(Date.UTC(year, 0, 1)).toISOString();\n const yearEnd = new Date(Date.UTC(year, 11, 31, 23, 59, 59, 999)).toISOString();\n return isRangeFullyDisabled(yearStart, yearEnd, disabled, adapter);\n }),\n [decadeStart, disabled, adapter],\n );\n\n const navigateDecade = useCallback(\n (direction: number) => {\n ctx.setViewMonth(adapter.addYears(viewMonth, direction * 12));\n },\n [adapter, viewMonth, ctx],\n );\n\n const handleYearSelect = useCallback(\n (indexInDecade: number) => {\n if (yearDisabledFlags[indexInDecade]) return;\n const year = decadeStart + indexInDecade;\n const target = new Date(Date.UTC(year, 0, 1)).toISOString();\n ctx.selectDate(target);\n },\n [ctx, decadeStart, yearDisabledFlags],\n );\n\n // Roving tabIndex: focus the selected cell if the value falls in this\n // decade, otherwise focus the cell representing the current viewMonth's\n // year. Falls back to the first enabled cell when the natural choice is\n // disabled (a `disabled` HTML button can't receive DOM focus, so without\n // this fallback the auto-refocus useEffect would silently no-op).\n const naturalIndex =\n valueYear !== null && valueYear >= decadeStart && valueYear <= decadeStart + 11\n ? valueYear - decadeStart\n : currentYear - decadeStart;\n const firstEnabled = yearDisabledFlags.findIndex((d) => !d);\n const initialIndex = yearDisabledFlags[naturalIndex]\n ? firstEnabled === -1\n ? naturalIndex\n : firstEnabled\n : naturalIndex;\n\n const { gridRef, focusedIndex, handleKeyDown } = useGridState({\n initialIndex,\n disabledFlags: yearDisabledFlags,\n onSelect: handleYearSelect,\n onPageUp: () => navigateDecade(-1),\n onPageDown: () => navigateDecade(1),\n onEscape: ctx.close,\n });\n\n const rangeLabel = `${decadeStart}–${decadeStart + 11}`;\n\n return (\n <div className={classNames?.root} {...props}>\n <div className={classNames?.header}>\n <button\n type=\"button\"\n className={classNames?.navButton}\n onClick={() => navigateDecade(-1)}\n aria-label={labels.prevDecade}\n >\n <\n </button>\n <span className={classNames?.title}>{rangeLabel}</span>\n <button\n type=\"button\"\n className={classNames?.navButton}\n onClick={() => navigateDecade(1)}\n aria-label={labels.nextDecade}\n >\n >\n </button>\n </div>\n\n <div\n ref={gridRef}\n role=\"grid\"\n aria-label={rangeLabel}\n className={classNames?.grid}\n onKeyDown={handleKeyDown}\n >\n {Array.from({ length: 4 }, (_, rowIndex) => (\n <div\n key={rowIndex}\n role=\"row\"\n className={classNames?.gridRow}\n style={{ display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)' }}\n >\n {Array.from({ length: 3 }, (_, col) => {\n const i = rowIndex * 3 + col;\n const year = decadeStart + i;\n const isSelected = year === valueYear;\n const isCurrent = year === todayYear;\n const isFocused = i === focusedIndex;\n const isDisabled = yearDisabledFlags[i] ?? false;\n const cls =\n [\n classNames?.year,\n isSelected && classNames?.yearSelected,\n isCurrent && classNames?.yearCurrent,\n isDisabled && classNames?.yearDisabled,\n ]\n .filter(Boolean)\n .join(' ') || undefined;\n return (\n <button\n // Stable index key keeps the DOM node mounted across decade\n // navigation so focus on the same-position cell persists.\n key={i}\n type=\"button\"\n role=\"gridcell\"\n tabIndex={isFocused ? 0 : -1}\n disabled={isDisabled}\n aria-selected={isSelected || undefined}\n aria-disabled={isDisabled || undefined}\n aria-current={isCurrent ? 'date' : undefined}\n data-selected={isSelected || undefined}\n data-current={isCurrent || undefined}\n data-focused={isFocused || undefined}\n className={cls}\n onClick={() => handleYearSelect(i)}\n >\n {year}\n </button>\n );\n })}\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import { YearPickerRoot } from './Root.js';\nimport { DatePickerInput } from '../DatePicker/Input.js';\nimport { DatePickerTrigger } from '../DatePicker/Trigger.js';\nimport { DatePickerPopover } from '../DatePicker/Popover.js';\nimport { YearPickerGrid } from './Grid.js';\n\nimport type { YearPickerRootProps } from './Root.js';\nimport type { DatePickerInputProps } from '../DatePicker/Input.js';\nimport type { DatePickerTriggerProps } from '../DatePicker/Trigger.js';\nimport type { DatePickerPopoverProps } from '../DatePicker/Popover.js';\nimport type { YearPickerGridProps, YearPickerGridClassNames } from './Grid.js';\n\n/**\n * YearPicker — Headless year selector. Value is Jan 1 of the selected year (UTC-ISO).\n *\n * Reuses DatePicker infrastructure (Root, Input, Trigger, Popover) so the public surface stays\n * consistent. The only new building block is `YearPicker.Grid`, a 12-year decade commit grid.\n *\n * @example Basic\n * ```tsx\n * const [year, setYear] = useState<string | null>(null);\n * <YearPicker value={year} onChange={setYear}>\n * <YearPicker.Input placeholder=\"Pick a year\" />\n * <YearPicker.Popover>\n * <YearPicker.Grid />\n * </YearPicker.Popover>\n * </YearPicker>\n * ```\n */\nexport const YearPicker = Object.assign(YearPickerRoot, {\n Input: DatePickerInput,\n Trigger: DatePickerTrigger,\n Popover: DatePickerPopover,\n Grid: YearPickerGrid,\n});\n\nexport type {\n YearPickerRootProps,\n DatePickerInputProps as YearPickerInputProps,\n DatePickerTriggerProps as YearPickerTriggerProps,\n DatePickerPopoverProps as YearPickerPopoverProps,\n YearPickerGridProps,\n YearPickerGridClassNames,\n};\n","import { RangePickerRoot } from '../RangePicker/Root.js';\nimport type { RangePickerRootProps } from '../RangePicker/Root.js';\n\n/** Props for WeekPicker.Root — reuses RangePicker.Root. */\nexport type WeekPickerRootProps = RangePickerRootProps;\n\n/**\n * WeekPicker.Root — thin wrapper over RangePicker.Root.\n *\n * The wrapper is necessary (rather than aliasing `RangePickerRoot` directly) because\n * `Object.assign` on the exported root mutates the target. Without a distinct identity here,\n * `WeekPicker.Calendar` would leak onto `RangePicker.Calendar`.\n */\nexport function WeekPickerRoot(props: WeekPickerRootProps) {\n return <RangePickerRoot {...props} />;\n}\n","import { RangePickerCalendar } from '../RangePicker/Calendar.js';\nimport type {\n RangePickerCalendarProps,\n RangePickerCalendarClassNames,\n} from '../RangePicker/Calendar.js';\n\n/**\n * WeekPicker.Calendar — renders the same calendar grid as `RangePicker.Calendar` but with\n * `selectionMode=\"week\"` so a single click commits the full week containing the clicked day.\n *\n * This is a thin wrapper over `RangePicker.Calendar` — the two share all keyboard navigation,\n * ARIA semantics, and rendering logic.\n */\nexport function WeekPickerCalendar(props: Omit<RangePickerCalendarProps, 'selectionMode'>) {\n return <RangePickerCalendar {...props} selectionMode=\"week\" />;\n}\n\n/** Re-export RangePicker calendar classNames — the surface is identical. */\nexport type WeekPickerCalendarClassNames = RangePickerCalendarClassNames;\n\nexport type WeekPickerCalendarProps = Omit<RangePickerCalendarProps, 'selectionMode'>;\n","import { WeekPickerRoot } from './Root.js';\nimport { RangePickerInput } from '../RangePicker/Input.js';\nimport { RangePickerPopover } from '../RangePicker/Popover.js';\nimport { WeekPickerCalendar } from './Calendar.js';\n\nimport type { WeekPickerRootProps } from './Root.js';\nimport type { RangePickerInputProps } from '../RangePicker/Input.js';\nimport type { RangePickerPopoverProps } from '../RangePicker/Popover.js';\nimport type { WeekPickerCalendarProps, WeekPickerCalendarClassNames } from './Calendar.js';\n\n/**\n * WeekPicker — Headless week selector. Value is a `DateRange` spanning the entire week (start\n * and end days inclusive, based on `weekStartsOn`). A single click selects the full week.\n *\n * Internally reuses `RangePicker` infrastructure (Root, Input, Popover). The only new primitive\n * is `WeekPicker.Calendar`, which overrides click behavior to commit the full week.\n *\n * @example Basic\n * ```tsx\n * const [week, setWeek] = useState<DateRange>({ start: null, end: null });\n * <WeekPicker value={week} onChange={setWeek}>\n * <WeekPicker.Input part=\"start\" />\n * <WeekPicker.Input part=\"end\" />\n * <WeekPicker.Popover>\n * <WeekPicker.Calendar />\n * </WeekPicker.Popover>\n * </WeekPicker>\n * ```\n */\nexport const WeekPicker = Object.assign(WeekPickerRoot, {\n Input: RangePickerInput,\n Popover: RangePickerPopover,\n Calendar: WeekPickerCalendar,\n});\n\nexport type {\n WeekPickerRootProps,\n RangePickerInputProps as WeekPickerInputProps,\n RangePickerPopoverProps as WeekPickerPopoverProps,\n WeekPickerCalendarProps,\n WeekPickerCalendarClassNames,\n};\n","import { useCallback, useId, useRef, useState } from 'react';\nimport { DateFnsAdapter, civilMidnightFromUtcDay, getCalendarDays } from '@kalyx/core';\nimport type {\n CalendarGrid,\n DateAdapter,\n DisabledRule,\n ISODateString,\n WeekStartsOn,\n} from '@kalyx/core';\n\nexport interface UseDatePickerOptions {\n /** Selected date (controlled mode) */\n value?: ISODateString | null;\n /** Initial date (uncontrolled mode) */\n defaultValue?: ISODateString;\n /** Callback fired when the date changes */\n onChange?: (value: ISODateString | null) => void;\n /** Rules that mark days as disabled */\n disabled?: DisabledRule[];\n /** Day the week starts on */\n weekStartsOn?: WeekStartsOn;\n /** Date adapter */\n adapter?: DateAdapter;\n /** IANA timezone for display (see DatePickerRoot#displayTimezone) */\n displayTimezone?: string;\n}\n\nexport interface UseDatePickerReturn {\n /** Currently selected date (ISO string) */\n value: ISODateString | null;\n /** Whether the popover is open */\n isOpen: boolean;\n /** Open the popover */\n open: () => void;\n /** Close the popover */\n close: () => void;\n /** Toggle the popover */\n toggle: () => void;\n /** Select a date */\n selectDate: (iso: ISODateString | null) => void;\n /** Month currently displayed (ISO string) */\n viewMonth: ISODateString;\n /** Change the displayed month */\n setViewMonth: (iso: ISODateString) => void;\n /** Calendar grid data */\n calendar: CalendarGrid;\n /** Currently focused date */\n focusedDate: ISODateString;\n /** Update the focused date */\n setFocusedDate: (iso: ISODateString) => void;\n /** Move to the previous month */\n previousMonth: () => void;\n /** Move to the next month */\n nextMonth: () => void;\n /** Unique ID */\n pickerId: string;\n /** Date adapter */\n adapter: DateAdapter;\n}\n\n/**\n * Hook that manages DatePicker state.\n * Use this when you want to implement a fully custom UI without the built-in components.\n *\n * @example\n * ```tsx\n * function MyDatePicker() {\n * const { value, isOpen, calendar, open, selectDate } = useDatePicker({\n * onChange: (iso) => console.log(iso),\n * });\n * // ... custom rendering\n * }\n * ```\n */\nexport function useDatePicker(options: UseDatePickerOptions = {}): UseDatePickerReturn {\n const {\n value: controlledValue,\n defaultValue,\n onChange,\n disabled = [],\n weekStartsOn = 0,\n adapter = DateFnsAdapter,\n displayTimezone,\n } = options;\n\n const pickerId = useId();\n const isControlled = useRef(controlledValue !== undefined).current;\n\n const [uncontrolledValue, setUncontrolledValue] = useState<ISODateString | null>(\n defaultValue ?? null,\n );\n\n const currentValue = isControlled ? (controlledValue ?? null) : uncontrolledValue;\n\n const [isOpen, setIsOpen] = useState(false);\n const [viewMonth, setViewMonth] = useState<ISODateString>(\n currentValue ?? adapter.today(displayTimezone),\n );\n const [focusedDate, setFocusedDate] = useState<ISODateString>(\n currentValue ?? adapter.today(displayTimezone),\n );\n\n const selectDate = useCallback(\n (iso: ISODateString | null) => {\n const normalized =\n iso && displayTimezone ? civilMidnightFromUtcDay(iso, displayTimezone) : iso;\n if (!isControlled) {\n setUncontrolledValue(normalized);\n }\n onChange?.(normalized);\n setIsOpen(false);\n },\n [isControlled, onChange, displayTimezone],\n );\n\n const open = useCallback(() => {\n setIsOpen(true);\n const target = currentValue ?? adapter.today(displayTimezone);\n setViewMonth(target);\n setFocusedDate(target);\n }, [currentValue, adapter, displayTimezone]);\n\n const close = useCallback(() => {\n setIsOpen(false);\n }, []);\n\n const toggle = useCallback(() => {\n if (isOpen) close();\n else open();\n }, [isOpen, open, close]);\n\n const previousMonth = useCallback(() => {\n const newMonth = adapter.addMonths(viewMonth, -1);\n setViewMonth(newMonth);\n setFocusedDate(adapter.startOfMonth(newMonth));\n }, [adapter, viewMonth]);\n\n const nextMonth = useCallback(() => {\n const newMonth = adapter.addMonths(viewMonth, 1);\n setViewMonth(newMonth);\n setFocusedDate(adapter.startOfMonth(newMonth));\n }, [adapter, viewMonth]);\n\n const calendar = getCalendarDays(viewMonth, adapter, {\n weekStartsOn,\n selected: currentValue,\n focusedDate,\n disabled,\n timezone: displayTimezone,\n });\n\n return {\n value: currentValue,\n isOpen,\n open,\n close,\n toggle,\n selectDate,\n viewMonth,\n setViewMonth,\n calendar,\n focusedDate,\n setFocusedDate,\n previousMonth,\n nextMonth,\n pickerId,\n adapter,\n };\n}\n","import { useCallback, useId, useRef, useState } from 'react';\nimport { DateFnsAdapter, civilMidnightFromUtcDay, getCalendarDays } from '@kalyx/core';\nimport type {\n CalendarGrid,\n DateAdapter,\n DateRange,\n DisabledRule,\n ISODateString,\n WeekStartsOn,\n} from '@kalyx/core';\nimport type { RangeSelectingTarget } from '../context/RangePickerContext.js';\n\nconst EMPTY_RANGE: DateRange = { start: null, end: null };\n\nexport interface UseRangePickerOptions {\n /** Selected range (controlled mode) */\n value?: DateRange;\n /** Initial range (uncontrolled mode) */\n defaultValue?: DateRange;\n /** Callback fired when the range changes */\n onChange?: (range: DateRange) => void;\n /** Rules that mark days as disabled */\n disabled?: DisabledRule[];\n /** Day the week starts on */\n weekStartsOn?: WeekStartsOn;\n /** Date adapter */\n adapter?: DateAdapter;\n /** IANA timezone for display (see RangePickerRoot#displayTimezone) */\n displayTimezone?: string;\n}\n\nexport interface UseRangePickerReturn {\n /** Currently selected range */\n value: DateRange;\n /** Which endpoint will be selected next */\n selectingTarget: RangeSelectingTarget;\n /** Handler for clicking a single date */\n selectDate: (iso: ISODateString) => void;\n /** Set the range directly */\n setRange: (range: DateRange) => void;\n /** Whether the popover is open */\n isOpen: boolean;\n open: () => void;\n close: () => void;\n toggle: () => void;\n /** Hovered date (for range preview) */\n hoverDate: ISODateString | null;\n setHoverDate: (iso: ISODateString | null) => void;\n /** Month currently displayed */\n viewMonth: ISODateString;\n setViewMonth: (iso: ISODateString) => void;\n /** Calendar grid */\n calendar: CalendarGrid;\n /** Currently focused date */\n focusedDate: ISODateString;\n setFocusedDate: (iso: ISODateString) => void;\n /** Move to the previous month */\n previousMonth: () => void;\n /** Move to the next month */\n nextMonth: () => void;\n /** Unique ID */\n pickerId: string;\n /** Date adapter */\n adapter: DateAdapter;\n}\n\n/**\n * Hook that manages RangePicker state.\n * Use this when you want to build a fully custom UI without the built-in components.\n *\n * @example\n * ```tsx\n * function MyRangePicker() {\n * const { value, calendar, selectDate, selectingTarget } = useRangePicker({\n * onChange: (range) => console.log(range.start, range.end),\n * });\n * // selectingTarget === 'start' -> waiting for start date\n * // selectingTarget === 'end' -> waiting for end date\n * }\n * ```\n */\nexport function useRangePicker(options: UseRangePickerOptions = {}): UseRangePickerReturn {\n const {\n value: controlledValue,\n defaultValue,\n onChange,\n disabled = [],\n weekStartsOn = 0,\n adapter = DateFnsAdapter,\n displayTimezone,\n } = options;\n\n const pickerId = useId();\n const isControlled = useRef(controlledValue !== undefined).current;\n\n const [uncontrolledValue, setUncontrolledValue] = useState<DateRange>(\n defaultValue ?? EMPTY_RANGE,\n );\n\n const currentValue = isControlled ? (controlledValue ?? EMPTY_RANGE) : uncontrolledValue;\n\n const [isOpen, setIsOpen] = useState(false);\n const [selectingTarget, setSelectingTarget] = useState<RangeSelectingTarget>('start');\n const [hoverDate, setHoverDate] = useState<ISODateString | null>(null);\n const [viewMonth, setViewMonth] = useState<ISODateString>(\n currentValue.start ?? adapter.today(displayTimezone),\n );\n const [focusedDate, setFocusedDate] = useState<ISODateString>(\n currentValue.start ?? adapter.today(displayTimezone),\n );\n\n const setRange = useCallback(\n (range: DateRange) => {\n if (!isControlled) {\n setUncontrolledValue(range);\n }\n onChange?.(range);\n },\n [isControlled, onChange],\n );\n\n const selectDate = useCallback(\n (iso: ISODateString) => {\n const normalized = displayTimezone ? civilMidnightFromUtcDay(iso, displayTimezone) : iso;\n if (selectingTarget === 'start') {\n setRange({ start: normalized, end: null });\n setSelectingTarget('end');\n setHoverDate(null);\n } else {\n const start = currentValue.start;\n if (!start) {\n setRange({ start: normalized, end: null });\n setSelectingTarget('end');\n return;\n }\n\n const newRange: DateRange = adapter.isBefore(normalized, start)\n ? { start: normalized, end: start }\n : { start, end: normalized };\n\n setRange(newRange);\n setSelectingTarget('start');\n setHoverDate(null);\n setIsOpen(false);\n }\n },\n [selectingTarget, currentValue.start, adapter, setRange, displayTimezone],\n );\n\n const open = useCallback(() => {\n setIsOpen(true);\n const target = currentValue.start ?? adapter.today(displayTimezone);\n setViewMonth(target);\n setFocusedDate(target);\n if (currentValue.start && currentValue.end) {\n setSelectingTarget('start');\n }\n }, [currentValue, adapter, displayTimezone]);\n\n const close = useCallback(() => {\n setIsOpen(false);\n setHoverDate(null);\n }, []);\n\n const toggle = useCallback(() => {\n if (isOpen) close();\n else open();\n }, [isOpen, open, close]);\n\n const previousMonth = useCallback(() => {\n const newMonth = adapter.addMonths(viewMonth, -1);\n setViewMonth(newMonth);\n setFocusedDate(adapter.startOfMonth(newMonth));\n }, [adapter, viewMonth]);\n\n const nextMonth = useCallback(() => {\n const newMonth = adapter.addMonths(viewMonth, 1);\n setViewMonth(newMonth);\n setFocusedDate(adapter.startOfMonth(newMonth));\n }, [adapter, viewMonth]);\n\n const calendar = getCalendarDays(viewMonth, adapter, {\n weekStartsOn,\n focusedDate,\n disabled,\n range: currentValue,\n rangeHover: hoverDate,\n timezone: displayTimezone,\n });\n\n return {\n value: currentValue,\n selectingTarget,\n selectDate,\n setRange,\n isOpen,\n open,\n close,\n toggle,\n hoverDate,\n setHoverDate,\n viewMonth,\n setViewMonth,\n calendar,\n focusedDate,\n setFocusedDate,\n previousMonth,\n nextMonth,\n pickerId,\n adapter,\n };\n}\n","import { useCallback, useId, useMemo, useRef, useState } from 'react';\nimport {\n DateFnsAdapter,\n generateHours,\n generateMinutes,\n getTime,\n setTime as setTimeOnIso,\n getTimeInTimezone,\n setTimeInTimezone,\n to12Hour,\n to24Hour,\n} from '@kalyx/core';\nimport type { ISODateString, TimeValue } from '@kalyx/core';\nimport type { TimePickerFormat } from '../context/TimePickerContext.js';\n\nexport interface UseTimePickerOptions {\n /** Selected time (controlled mode) */\n value?: ISODateString | null;\n /** Initial time (uncontrolled mode) */\n defaultValue?: ISODateString;\n /** Callback fired when the time changes */\n onChange?: (value: ISODateString | null) => void;\n /** 12h or 24h format */\n format?: TimePickerFormat;\n /** Minute step */\n step?: number;\n /** Whether seconds are shown */\n withSeconds?: boolean;\n /** IANA timezone for time interpretation (see TimePickerRoot#displayTimezone) */\n displayTimezone?: string;\n}\n\nexport interface UseTimePickerReturn {\n /** Current ISO datetime value */\n value: ISODateString | null;\n /** Current time (TimeValue) */\n currentTime: TimeValue;\n /** Update part of the time */\n setTime: (partial: Partial<TimeValue>) => void;\n /** Set the hour directly (1-12 in 12h mode, 0-23 in 24h mode) */\n setHour: (hour: number) => void;\n /** Set the minute */\n setMinute: (minute: number) => void;\n /** Set the second */\n setSecond: (second: number) => void;\n /** Change AM/PM (12h mode only) */\n setPeriod: (period: 'AM' | 'PM') => void;\n /** Available hour list */\n availableHours: number[];\n /** Available minute list (respects step) */\n availableMinutes: number[];\n /** 12h or 24h mode */\n format: TimePickerFormat;\n /** Hour value for display (1-12 in 12h mode) */\n displayHour: number;\n /** Current AM/PM (12h mode only, null in 24h) */\n period: 'AM' | 'PM' | null;\n /** Unique ID */\n pickerId: string;\n}\n\nfunction getDefaultIso(): ISODateString {\n return DateFnsAdapter.today();\n}\n\n/**\n * Hook that manages TimePicker state.\n * Use this when you want to build a fully custom UI without the built-in components.\n *\n * @example\n * ```tsx\n * function MyTimePicker() {\n * const {\n * currentTime, displayHour, period,\n * availableHours, availableMinutes,\n * setHour, setMinute, setPeriod,\n * } = useTimePicker({ format: '12h', step: 15 });\n * // displayHour = 1-12, period = \"AM\" | \"PM\"\n * // availableMinutes = [0, 15, 30, 45]\n * }\n * ```\n */\nexport function useTimePicker(options: UseTimePickerOptions = {}): UseTimePickerReturn {\n const {\n value: controlledValue,\n defaultValue,\n onChange,\n format = '24h',\n step = 1,\n displayTimezone,\n } = options;\n\n const pickerId = useId();\n const isControlled = useRef(controlledValue !== undefined).current;\n\n const [uncontrolledValue, setUncontrolledValue] = useState<ISODateString | null>(\n defaultValue ?? null,\n );\n\n const currentValue = isControlled ? (controlledValue ?? null) : uncontrolledValue;\n const baseIso = currentValue ?? getDefaultIso();\n const currentTime = useMemo(\n () => (displayTimezone ? getTimeInTimezone(baseIso, displayTimezone) : getTime(baseIso)),\n [baseIso, displayTimezone],\n );\n\n const setTime = useCallback(\n (partial: Partial<TimeValue>) => {\n const newIso = displayTimezone\n ? setTimeInTimezone(baseIso, partial, displayTimezone)\n : setTimeOnIso(baseIso, partial);\n if (!isControlled) {\n setUncontrolledValue(newIso);\n }\n onChange?.(newIso);\n },\n [baseIso, isControlled, onChange, displayTimezone],\n );\n\n const period = format === '12h' ? to12Hour(currentTime.hours).period : null;\n const displayHour = format === '12h' ? to12Hour(currentTime.hours).hours12 : currentTime.hours;\n\n const setHour = useCallback(\n (hour: number) => {\n const hours24 = format === '12h' && period ? to24Hour(hour, period) : hour;\n setTime({ hours: hours24 });\n },\n [format, period, setTime],\n );\n\n const setMinute = useCallback((minute: number) => setTime({ minutes: minute }), [setTime]);\n\n const setSecond = useCallback((second: number) => setTime({ seconds: second }), [setTime]);\n\n const setPeriod = useCallback(\n (newPeriod: 'AM' | 'PM') => {\n if (format !== '12h') return;\n const newHours24 = to24Hour(displayHour, newPeriod);\n setTime({ hours: newHours24 });\n },\n [format, displayHour, setTime],\n );\n\n return {\n value: currentValue,\n currentTime,\n setTime,\n setHour,\n setMinute,\n setSecond,\n setPeriod,\n availableHours: generateHours(format),\n availableMinutes: generateMinutes(step),\n format,\n displayHour,\n period,\n pickerId,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/context/DatePickerContext.ts","../src/hooks/useChangeEffect.ts","../src/components/DatePicker/Root.tsx","../src/components/DatePicker/Input.tsx","../src/components/DatePicker/Trigger.tsx","../src/hooks/usePopover.ts","../src/components/DatePicker/Popover.tsx","../src/components/DatePicker/Calendar.tsx","../src/components/_shared/grid-keyboard.ts","../src/components/DatePicker/MonthGrid.tsx","../src/components/DatePicker/YearGrid.tsx","../src/components/DatePicker/Presets.tsx","../src/components/DatePicker/index.ts","../src/context/RangePickerContext.ts","../src/components/RangePicker/Root.tsx","../src/components/RangePicker/Input.tsx","../src/components/RangePicker/Popover.tsx","../src/components/RangePicker/Calendar.tsx","../src/components/RangePicker/Presets.tsx","../src/components/RangePicker/index.ts","../src/context/TimePickerContext.ts","../src/components/TimePicker/Root.tsx","../src/components/TimePicker/Input.tsx","../src/hooks/useListboxNavigation.ts","../src/components/TimePicker/HourList.tsx","../src/components/TimePicker/MinuteList.tsx","../src/components/TimePicker/AmPmToggle.tsx","../src/components/TimePicker/index.ts","../src/components/DateTimePicker/Root.tsx","../src/components/DateTimePicker/Input.tsx","../src/components/DateTimePicker/index.ts","../src/components/MonthPicker/Root.tsx","../src/components/MonthPicker/Grid.tsx","../src/components/MonthPicker/index.ts","../src/components/YearPicker/Root.tsx","../src/components/YearPicker/Grid.tsx","../src/components/YearPicker/index.ts","../src/components/WeekPicker/Root.tsx","../src/components/WeekPicker/Calendar.tsx","../src/components/WeekPicker/index.ts","../src/hooks/useDatePicker.ts","../src/hooks/useRangePicker.ts","../src/hooks/useTimePicker.ts"],"names":["useRef","DatePickerInput","useState","useEffect","useCallback","jsx","forwardRef","DatePickerTrigger","useMemo","jsxs","createContext","useContext","DateFnsAdapter","useId","civilMidnightFromUtcDay","RangePickerInput","safeFormatFullDate","formatFullDate","getWeekdayNames","getCalendarDays","formatMonthYear","isDateDisabled","getISOWeekNumber","setTime","setTimeOnIso","TimePickerInput","to12Hour","to24Hour","DEFAULT_DATEPICKER_LABELS","DEFAULT_TIMEPICKER_LABELS","getTimeInTimezone","getTime","setTimeInTimezone","DateTimePickerInput","formatTimeString","_","getMonthName","EMPTY_RANGE","generateHours","generateMinutes"],"mappings":";;;;;;;;;AA2DO,IAAM,iBAAA,GAAoB,cAA6C,IAAI,CAAA;AAM3E,SAAS,qBAAqB,aAAA,EAA+C;AAClF,EAAA,MAAM,OAAA,GAAU,WAAW,iBAAiB,CAAA;AAC5C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,IAAI,aAAa,CAAA;;AAAA;AAAA;AAAA,gBAAA,EAGI,aAAA,CAAc,OAAA,CAAQ,aAAA,EAAe,EAAE,CAAC,CAAA;AAAA,eAAA;AAAA,KAE/D;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;ACrEO,SAAS,eAAA,CAAmB,OAAU,QAAA,EAAkD;AAC7F,EAAA,MAAM,WAAA,GAAc,OAAO,QAAQ,CAAA;AACnC,EAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AAEtB,EAAA,MAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC5B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAA,CAAQ,YAAY,KAAA,EAAO;AAC7B,MAAA,OAAA,CAAQ,OAAA,GAAU,KAAA;AAClB,MAAA,WAAA,CAAY,UAAU,KAAK,CAAA;AAAA,IAC7B;AAAA,EACF,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AACZ;ACsDO,SAAS,cAAA,CAAe;AAAA,EAC7B,KAAA,EAAO,eAAA;AAAA,EACP,YAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,kBAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,QAAA,GAAW,KAAA;AAAA,EACX,YAAA,GAAe,CAAA;AAAA,EACf,aAAA,GAAgB,YAAA;AAAA,EAChB,MAAA,GAAS,OAAA;AAAA,EACT,eAAA;AAAA,EACA,OAAA,GAAU,cAAA;AAAA,EACV,MAAA,EAAQ,UAAA;AAAA,EACR;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,WAAW,KAAA,EAAM;AACvB,EAAA,MAAM,YAAA,GAAeA,MAAAA,CAAO,eAAA,KAAoB,MAAS,CAAA,CAAE,OAAA;AAC3D,EAAA,MAAM,YAAA,GAAeA,OAA2B,IAAI,CAAA;AAGpD,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAI,QAAA;AAAA,IAChD,YAAA,IAAgB;AAAA,GAClB;AAEA,EAAA,MAAM,YAAA,GAAe,YAAA,GAAgB,eAAA,IAAmB,IAAA,GAAQ,iBAAA;AAEhE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,KAAK,CAAA;AAK1C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,QAAA;AAAA,IAChC,MAAM,YAAA,IAAgB,OAAA,CAAQ,KAAA,CAAM,eAAe;AAAA,GACrD;AAEA,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,QAAA;AAAA,IACpC,MAAM,YAAA,IAAgB,OAAA,CAAQ,KAAA,CAAM,eAAe;AAAA,GACrD;AAEA,EAAA,eAAA,CAAgB,QAAQ,YAAY,CAAA;AACpC,EAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,MAAM,OAAA,CAAQ,YAAA,CAAa,SAAS,CAAA,EAAG,CAAC,SAAA,EAAW,OAAO,CAAC,CAAA;AAC1F,EAAA,eAAA,CAAgB,gBAAgB,kBAAkB,CAAA;AAElD,EAAA,MAAM,YAAA,GAAe,OAAA;AAAA,IACnB,OAAO,EAAE,GAAG,yBAAA,EAA2B,GAAG,UAAA,EAAW,CAAA;AAAA,IACrD,CAAC,UAAU;AAAA,GACb;AAEA,EAAA,MAAM,UAAA,GAAa,OAAO,QAAA,KAAa,SAAA,GAAY,QAAA,GAAW,KAAA;AAC9D,EAAA,MAAM,aAAA,GAAgC,OAAA;AAAA,IACpC,MAAO,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,WAAW,EAAC;AAAA,IAC7C,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,MAAM,UAAA,GAAa,WAAA;AAAA,IACjB,CAAC,GAAA,KAA8B;AAC7B,MAAA,IAAI,cAAc,QAAA,EAAU;AAK5B,MAAA,MAAM,aACJ,GAAA,IAAO,eAAA,GAAkB,uBAAA,CAAwB,GAAA,EAAK,eAAe,CAAA,GAAI,GAAA;AAE3E,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,oBAAA,CAAqB,UAAU,CAAA;AAAA,MACjC;AACA,MAAA,QAAA,GAAW,UAAU,CAAA;AAGrB,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACjB,CAAA;AAAA,IACA,CAAC,YAAA,EAAc,UAAA,EAAY,QAAA,EAAU,UAAU,eAAe;AAAA,GAChE;AAEA,EAAA,MAAM,IAAA,GAAO,YAAY,MAAM;AAC7B,IAAA,IAAI,cAAc,QAAA,EAAU;AAC5B,IAAA,SAAA,CAAU,IAAI,CAAA;AAEd,IAAA,MAAM,MAAA,GAAS,YAAA,IAAgB,OAAA,CAAQ,KAAA,CAAM,eAAe,CAAA;AAC5D,IAAA,YAAA,CAAa,MAAM,CAAA;AACnB,IAAA,cAAA,CAAe,MAAM,CAAA;AAAA,EACvB,GAAG,CAAC,UAAA,EAAY,UAAU,YAAA,EAAc,OAAA,EAAS,eAAe,CAAC,CAAA;AAEjE,EAAA,MAAM,KAAA,GAAQ,YAAY,MAAM;AAC9B,IAAA,SAAA,CAAU,KAAK,CAAA;AAAA,EACjB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,MAAA,GAAS,YAAY,MAAM;AAC/B,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,KAAA,EAAM;AAAA,IACR,CAAA,MAAO;AACL,MAAA,IAAA,EAAK;AAAA,IACP;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,IAAA,EAAM,KAAK,CAAC,CAAA;AAExB,EAAA,MAAM,YAAA,GAAuC,OAAA;AAAA,IAC3C,OAAO;AAAA,MACL,YAAA;AAAA,MACA,KAAA,EAAO,YAAA;AAAA,MACP,UAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA,WAAA;AAAA,MACA,cAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA,EAAU,aAAA;AAAA,MACV,YAAA;AAAA,MACA,aAAA;AAAA,MACA,MAAA;AAAA,MACA,eAAA;AAAA,MACA,UAAA;AAAA,MACA,UAAA,EAAY,QAAA;AAAA,MACZ,QAAA;AAAA,MACA,MAAA,EAAQ;AAAA,KACV,CAAA;AAAA,IACA;AAAA,MACE,YAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,WAAA;AAAA,MACA,OAAA;AAAA,MACA,aAAA;AAAA,MACA,YAAA;AAAA,MACA,aAAA;AAAA,MACA,MAAA;AAAA,MACA,eAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,2BAAQ,iBAAA,CAAkB,QAAA,EAAlB,EAA2B,KAAA,EAAO,cAAe,QAAA,EAAS,CAAA;AACpE;AChMO,IAAM,eAAA,GAAkB,UAAA;AAAA,EAC7B,SAASC,gBAAAA,CACP,EAAE,MAAA,EAAQ,UAAA,EAAY,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,SAAA,EAAW,GAAG,KAAA,EAAM,EACjE,GAAA,EACA;AACA,IAAA,MAAM,GAAA,GAAM,qBAAqB,kBAAkB,CAAA;AACnD,IAAA,MAAM,aAAA,GAAgB,cAAc,GAAA,CAAI,aAAA;AAGxC,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIC,SAAwB,IAAI,CAAA;AAI9D,IAAA,MAAM,cAAA,GAAiBF,OAAO,KAAK,CAAA;AAMnC,IAAAG,UAAU,MAAM;AACd,MAAA,IAAI,eAAe,OAAA,EAAS;AAC5B,MAAA,YAAA,CAAa,IAAI,CAAA;AAAA,IACnB,CAAA,EAAG,CAAC,GAAA,CAAI,KAAK,CAAC,CAAA;AAEd,IAAA,IAAI,cAAA,GAAiB,EAAA;AACrB,IAAA,IAAI,IAAI,KAAA,EAAO;AACb,MAAA,IAAI;AACF,QAAA,cAAA,GAAiB,IAAI,OAAA,CAAQ,MAAA,CAAO,IAAI,KAAA,EAAO,aAAA,EAAe,IAAI,eAAe,CAAA;AAAA,MACnF,CAAA,CAAA,MAAQ;AACN,QAAA,cAAA,GAAiB,GAAA,CAAI,KAAA;AAAA,MACvB;AAAA,IACF;AACA,IAAA,MAAM,YAAA,GAAe,SAAA,KAAc,IAAA,GAAO,SAAA,GAAY,cAAA;AAKtD,IAAA,MAAM,WAAA,GAAcC,WAAAA;AAAA,MAClB,CAAC,CAAA,KAA0C;AACzC,QAAA,IAAI,CAAC,GAAA,CAAI,MAAA,EAAQ,GAAA,CAAI,IAAA,EAAK;AAC1B,QAAA,OAAA,GAAU,CAAC,CAAA;AAAA,MACb,CAAA;AAAA,MACA,CAAC,KAAK,OAAO;AAAA,KACf;AAIA,IAAA,MAAM,UAAA,GAAaA,WAAAA;AAAA,MACjB,CAAC,IAAA,KAA0B;AACzB,QAAA,IAAI,CAAC,IAAA,EAAM;AACT,UAAA,GAAA,CAAI,WAAW,IAAI,CAAA;AACnB,UAAA,YAAA,CAAa,IAAI,CAAA;AACjB,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,IAAA,EAAM,GAAA,CAAI,OAAO,CAAA;AAChD,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,GAAA,CAAI,WAAW,MAAM,CAAA;AACrB,UAAA,YAAA,CAAa,IAAI,CAAA;AACjB,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,OAAO,KAAA;AAAA,MACT,CAAA;AAAA,MACA,CAAC,GAAG;AAAA,KACN;AAEA,IAAA,MAAM,UAAA,GAAaA,WAAAA;AAAA,MACjB,CAAC,CAAA,KAA0C;AACzC,QAAA,IAAI,cAAc,IAAA,EAAM;AACtB,UAAA,UAAA,CAAW,SAAS,CAAA;AACpB,UAAA,YAAA,CAAa,IAAI,CAAA;AAAA,QACnB;AACA,QAAA,MAAA,GAAS,CAAC,CAAA;AAAA,MACZ,CAAA;AAAA,MACA,CAAC,SAAA,EAAW,UAAA,EAAY,MAAM;AAAA,KAChC;AAEA,IAAA,MAAM,YAAA,GAAeA,WAAAA;AAAA,MACnB,CAAC,CAAA,KAA2C;AAC1C,QAAA,MAAM,IAAA,GAAO,EAAE,MAAA,CAAO,KAAA;AACtB,QAAA,YAAA,CAAa,IAAI,CAAA;AAIjB,QAAA,IAAI,eAAe,OAAA,EAAS;AAC5B,QAAA,UAAA,CAAW,IAAI,CAAA;AAAA,MACjB,CAAA;AAAA,MACA,CAAC,UAAU;AAAA,KACb;AAEA,IAAA,MAAM,sBAAA,GAAyBA,YAAY,MAAM;AAC/C,MAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AAAA,IAC3B,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,MAAM,oBAAA,GAAuBA,WAAAA;AAAA,MAC3B,CAAC,CAAA,KAAgD;AAC/C,QAAA,cAAA,CAAe,OAAA,GAAU,KAAA;AACzB,QAAA,UAAA,CAAY,CAAA,CAAE,OAA4B,KAAK,CAAA;AAAA,MACjD,CAAA;AAAA,MACA,CAAC,UAAU;AAAA,KACb;AAEA,IAAA,MAAM,aAAA,GAAgBA,WAAAA;AAAA,MACpB,CAAC,CAAA,KAA6C;AAC5C,QAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,UAAA,GAAA,CAAI,KAAA,EAAM;AAAA,QACZ,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,OAAA,EAAS;AAI5B,UAAA,IAAI,GAAA,CAAI,MAAA,EAAQ,CAAA,CAAE,cAAA,EAAe;AACjC,UAAA,IAAI,cAAc,IAAA,EAAM;AACtB,YAAA,UAAA,CAAW,SAAS,CAAA;AAAA,UACtB,CAAA,MAAA,IAAW,IAAI,MAAA,EAAQ;AAIrB,YAAA,GAAA,CAAI,UAAA,CAAW,IAAI,WAAW,CAAA;AAAA,UAChC;AAAA,QACF,WAAW,CAAA,CAAE,GAAA,KAAQ,WAAA,IAAe,CAAC,IAAI,MAAA,EAAQ;AAC/C,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,GAAA,CAAI,IAAA,EAAK;AAAA,QACX;AACA,QAAA,SAAA,GAAY,CAAC,CAAA;AAAA,MACf,CAAA;AAAA,MACA,CAAC,GAAA,EAAK,SAAA,EAAW,UAAA,EAAY,SAAS;AAAA,KACxC;AAEA,IAAA,MAAM,UAAA,GAAa,CAAA,EAAG,GAAA,CAAI,QAAQ,CAAA,SAAA,CAAA;AAElC,IAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,CAAC,IAAA,KAAS;AAEb,YAAA,GAAA,CAAI,aAAa,OAAA,GAAU,IAAA;AAE3B,YAAA,IAAI,OAAO,GAAA,KAAQ,UAAA,EAAY,GAAA,CAAI,IAAI,CAAA;AAAA,iBAAA,IAC9B,GAAA,MAAS,OAAA,GAAU,IAAA;AAAA,UAC9B,CAAA;AAAA,UACA,IAAA,EAAK,MAAA;AAAA,UACL,IAAA,EAAK,UAAA;AAAA,UACL,iBAAe,GAAA,CAAI,MAAA;AAAA,UACnB,eAAA,EAAc,QAAA;AAAA,UACd,eAAA,EAAe,GAAA,CAAI,MAAA,GAAS,UAAA,GAAa,MAAA;AAAA,UACzC,mBAAA,EAAkB,MAAA;AAAA,UAClB,YAAA,EAAa,KAAA;AAAA,UACb,KAAA,EAAO,YAAA;AAAA,UACP,QAAA,EAAU,GAAA,CAAI,UAAA,IAAc,KAAA,CAAM,QAAA;AAAA,UAClC,UAAU,GAAA,CAAI,UAAA;AAAA,UACd,QAAA,EAAU,YAAA;AAAA,UACV,OAAA,EAAS,WAAA;AAAA,UACT,MAAA,EAAQ,UAAA;AAAA,UACR,SAAA,EAAW,aAAA;AAAA,UACX,kBAAA,EAAoB,sBAAA;AAAA,UACpB,gBAAA,EAAkB,oBAAA;AAAA,UACjB,GAAG;AAAA;AAAA,OACN;AAAA,MAGC,IAAA,mBAAOA,GAAAA,CAAC,OAAA,EAAA,EAAM,IAAA,EAAK,QAAA,EAAS,IAAA,EAAY,KAAA,EAAO,GAAA,CAAI,KAAA,IAAS,EAAA,EAAI,CAAA,GAAK;AAAA,KAAA,EACxE,CAAA;AAAA,EAEJ;AACF,CAAA;AAEA,eAAA,CAAgB,WAAA,GAAc,kBAAA;AC5KvB,IAAM,iBAAA,GAAoBC,UAAAA;AAAA,EAC/B,SAASC,mBAAkB,EAAE,OAAA,EAAS,UAAU,GAAG,KAAA,IAAS,GAAA,EAAK;AAC/D,IAAA,MAAM,GAAA,GAAM,qBAAqB,oBAAoB,CAAA;AAErD,IAAA,MAAM,WAAA,GAAcH,WAAAA;AAAA,MAClB,CAAC,CAAA,KAA2C;AAC1C,QAAA,GAAA,CAAI,MAAA,EAAO;AACX,QAAA,OAAA,GAAU,CAAC,CAAA;AAAA,MACb,CAAA;AAAA,MACA,CAAC,KAAK,OAAO;AAAA,KACf;AAEA,IAAA,MAAM,UAAA,GAAa,CAAA,EAAG,GAAA,CAAI,QAAQ,CAAA,SAAA,CAAA;AAElC,IAAA,uBACEC,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,CAAC,IAAA,KAAS;AAEb,UAAA,IAAI,CAAC,GAAA,CAAI,YAAA,CAAa,OAAA,EAAS,GAAA,CAAI,aAAa,OAAA,GAAU,IAAA;AAC1D,UAAA,IAAI,OAAO,GAAA,KAAQ,UAAA,EAAY,GAAA,CAAI,IAAI,CAAA;AAAA,eAAA,IAC9B,GAAA,MAAS,OAAA,GAAU,IAAA;AAAA,QAC9B,CAAA;AAAA,QACA,IAAA,EAAK,QAAA;AAAA,QACL,QAAA,EAAU,CAAA;AAAA,QACV,cAAY,GAAA,CAAI,MAAA,GAAS,IAAI,MAAA,CAAO,YAAA,GAAe,IAAI,MAAA,CAAO,WAAA;AAAA,QAC9D,iBAAe,GAAA,CAAI,MAAA;AAAA,QACnB,eAAA,EAAc,QAAA;AAAA,QACd,eAAA,EAAe,GAAA,CAAI,MAAA,GAAS,UAAA,GAAa,MAAA;AAAA,QACzC,QAAA,EAAU,GAAA,CAAI,UAAA,IAAc,KAAA,CAAM,QAAA;AAAA,QAClC,OAAA,EAAS,WAAA;AAAA,QACR,GAAG,KAAA;AAAA,QAEH,sCACCA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAY,MAAA;AAAA,YACZ,SAAA,EAAU,OAAA;AAAA,YACV,KAAA,EAAM,IAAA;AAAA,YACN,MAAA,EAAO,IAAA;AAAA,YACP,OAAA,EAAQ,WAAA;AAAA,YACR,IAAA,EAAK,MAAA;AAAA,YACL,KAAA,EAAM,4BAAA;AAAA,YAEN,QAAA,kBAAAA,GAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,CAAA,EAAE,sFAAA;AAAA,gBACF,MAAA,EAAO,cAAA;AAAA,gBACP,WAAA,EAAY,KAAA;AAAA,gBACZ,aAAA,EAAc,OAAA;AAAA,gBACd,cAAA,EAAe;AAAA;AAAA;AACjB;AAAA;AACF;AAAA,KAEJ;AAAA,EAEJ;AACF,CAAA;AAEA,iBAAA,CAAkB,WAAA,GAAc,oBAAA;ACnEhC,IAAM,kBAAA,GAAmC,CAAC,MAAA,CAAO,CAAC,CAAA,EAAG,IAAA,EAAK,EAAG,KAAA,CAAM,EAAE,OAAA,EAAS,CAAA,EAAG,CAAC,CAAA;AAgB3E,SAAS,UAAA,CAAW;AAAA,EACzB,MAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,EAAsB;AACpB,EAAA,MAAM,WAAA,GAAcL,OAA8B,IAAI,CAAA;AACtD,EAAA,MAAM,gBAAA,GAAmBA,OAA2B,IAAI,CAAA;AAExD,EAAA,MAAM,EAAE,IAAA,EAAM,cAAA,EAAgB,YAAA,KAAiB,WAAA,CAAY;AAAA,IACzD,IAAA,EAAM,MAAA;AAAA,IACN,SAAA;AAAA,IACA,UAAA,EAAY,kBAAA;AAAA,IACZ,oBAAA,EAAsB;AAAA,GACvB,CAAA;AAKD,EAAAG,UAAU,MAAM;AACd,IAAA,IAAI,aAAa,OAAA,EAAS;AACxB,MAAA,IAAA,CAAK,YAAA,CAAa,aAAa,OAAO,CAAA;AAAA,IACxC;AAAA,EACF,CAAA,EAAG,CAAC,YAAA,EAAc,IAAA,EAAM,MAAM,CAAC,CAAA;AAK/B,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,gBAAA,CAAiB,UAAU,QAAA,CAAS,aAAA;AAAA,IACtC,CAAA,MAAA,IAAW,iBAAiB,OAAA,EAAS;AACnC,MAAA,MAAM,KAAK,gBAAA,CAAiB,OAAA;AAC5B,MAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAC3B,MAAA,IAAI,OAAO,YAAA,CAAa,OAAA,IAAW,OAAO,EAAA,CAAG,UAAU,UAAA,EAAY;AACjE,QAAA,EAAA,CAAG,KAAA,CAAM,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA;AAAA,MAClC;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,YAAY,CAAC,CAAA;AAGzB,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,SAAS,mBAAmB,CAAA,EAAe;AACzC,MAAA,MAAM,WAAW,WAAA,CAAY,OAAA;AAC7B,MAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,MAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,MAAA,IAAI,QAAA,IAAY,CAAC,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA,KAAM,CAAC,SAAA,IAAa,CAAC,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI;AACzF,QAAA,KAAA,EAAM;AAAA,MACR;AAAA,IACF;AAGA,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,kBAAkB,CAAA;AAAA,IAC3D,GAAG,CAAC,CAAA;AAEJ,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,kBAAkB,CAAA;AAAA,IAC9D,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,KAAA,EAAO,YAAY,CAAC,CAAA;AAGhC,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,SAAS,cAAc,CAAA,EAAkB;AACvC,MAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,QAAA,KAAA,EAAM;AAAA,MACR;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAClD,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,aAAa,CAAA;AAAA,EACpE,CAAA,EAAG,CAAC,MAAA,EAAQ,KAAK,CAAC,CAAA;AAMlB,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,SAAS,eAAe,CAAA,EAAe;AAIrC,MAAA,MAAM,OAAO,CAAA,CAAE,aAAA;AACf,MAAA,MAAM,WAAW,WAAA,CAAY,OAAA;AAC7B,MAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,MAAM,cAAA,GAAiB,QAAA,EAAU,QAAA,CAAS,IAAI,CAAA,IAAK,KAAA;AACnD,MAAA,MAAM,eAAA,GAAkB,SAAA,EAAW,QAAA,CAAS,IAAI,CAAA,IAAK,KAAA;AACrD,MAAA,IAAI,CAAC,cAAA,IAAkB,CAAC,eAAA,EAAiB;AACvC,QAAA,KAAA,EAAM;AAAA,MACR;AAAA,IACF;AAGA,IAAA,MAAM,OAAO,WAAA,CAAY,OAAA;AACzB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAA,CAAK,gBAAA,CAAiB,YAAY,cAAc,CAAA;AAChD,IAAA,OAAO,MAAM,IAAA,CAAK,mBAAA,CAAoB,UAAA,EAAY,cAAc,CAAA;AAAA,EAClE,CAAA,EAAG,CAAC,MAAA,EAAQ,KAAA,EAAO,YAAY,CAAC,CAAA;AAMhC,EAAA,MAAM,cAAA,GAAiBC,WAAAA;AAAA,IACrB,CAAC,IAAA,KAAgC;AAC/B,MAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AACtB,MAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AACrB,MAAA,IAAI,IAAA,IAAQ,aAAa,OAAA,EAAS;AAChC,QAAA,IAAA,CAAK,YAAA,CAAa,aAAa,OAAO,CAAA;AAAA,MACxC;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAM,YAAY;AAAA,GACrB;AAEA,EAAA,OAAO,EAAE,cAAA,EAAgB,cAAA,EAAgB,YAAA,EAAa;AACxD;AC1IO,SAAS,iBAAA,CAAkB,EAAE,QAAA,EAAU,GAAG,OAAM,EAA2B;AAChF,EAAA,MAAM,GAAA,GAAM,qBAAqB,oBAAoB,CAAA;AACrD,EAAA,MAAM,UAAA,GAAa,CAAA,EAAG,GAAA,CAAI,QAAQ,CAAA,SAAA,CAAA;AAElC,EAAA,MAAM,EAAE,cAAA,EAAgB,cAAA,EAAgB,YAAA,KAAiB,UAAA,CAAW;AAAA,IAClE,QAAQ,GAAA,CAAI,MAAA;AAAA,IACZ,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,cAAc,GAAA,CAAI;AAAA,GACnB,CAAA;AAED,EAAA,IAAI,CAAC,GAAA,CAAI,MAAA,EAAQ,OAAO,IAAA;AAExB,EAAA,MAAM,EAAE,KAAA,EAAO,SAAA,EAAW,GAAG,MAAK,GAAI,KAAA;AAEtC,EAAA,uBACEC,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,cAAA;AAAA,MACL,EAAA,EAAI,UAAA;AAAA,MACJ,IAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAY,IAAI,MAAA,CAAO,YAAA;AAAA,MACvB,YAAA,EAAW,OAAA;AAAA,MACV,GAAG,IAAA;AAAA,MACJ,KAAA,EAAO;AAAA,QACL,GAAG,SAAA;AAAA,QACH,GAAG,cAAA;AAAA,QACH,UAAA,EAAY,eAAe,MAAA,GAAY;AAAA,OACzC;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;ACYA,SAAS,kBAAA,CAAmB,KAAa,MAAA,EAAwB;AAC/D,EAAA,IAAI;AACF,IAAA,OAAO,cAAA,CAAe,KAAK,MAAM,CAAA;AAAA,EACnC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,GAAA;AAAA,EACT;AACF;AAGA,IAAM,MAAA,GAA8B;AAAA,EAClC,QAAA,EAAU,UAAA;AAAA,EACV,KAAA,EAAO,KAAA;AAAA,EACP,MAAA,EAAQ,KAAA;AAAA,EACR,OAAA,EAAS,CAAA;AAAA,EACT,MAAA,EAAQ,MAAA;AAAA,EACR,QAAA,EAAU,QAAA;AAAA,EACV,IAAA,EAAM,kBAAA;AAAA,EACN,UAAA,EAAY,QAAA;AAAA,EACZ,MAAA,EAAQ;AACV,CAAA;AAEO,SAAS,kBAAA,CAAmB;AAAA,EACjC,UAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA,GAAiB,KAAA;AAAA,EACjB,UAAA,GAAa,KAAA;AAAA,EACb,GAAG;AACL,CAAA,EAA4B;AAC1B,EAAA,MAAM,GAAA,GAAM,qBAAqB,qBAAqB,CAAA;AACtD,EAAA,MAAM,OAAA,GAAUL,OAAyB,IAAI,CAAA;AAC7C,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIE,SAAS,EAAE,CAAA;AAEnD,EAAA,MAAM,EAAE,SAAS,SAAA,EAAW,WAAA,EAAa,cAAc,QAAA,EAAU,MAAA,EAAQ,iBAAgB,GAAI,GAAA;AAE7F,EAAA,MAAM,QAAA,GAAWM,OAAAA,CAAQ,MAAM,eAAA,CAAgB,MAAA,EAAQ,YAAY,CAAA,EAAG,CAAC,MAAA,EAAQ,YAAY,CAAC,CAAA;AAK5F,EAAA,MAAM,KAAA,GAAQA,OAAAA;AAAA,IACZ,MACE,eAAA,CAAgB,SAAA,EAAW,OAAA,EAAS;AAAA,MAClC,YAAA;AAAA,MACA,UAAU,GAAA,CAAI,KAAA;AAAA,MACd,WAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA,EAAU,eAAA;AAAA,MACV;AAAA,KACD,CAAA;AAAA,IACH;AAAA,MACE,SAAA;AAAA,MACA,OAAA;AAAA,MACA,YAAA;AAAA,MACA,GAAA,CAAI,KAAA;AAAA,MACJ,WAAA;AAAA,MACA,QAAA;AAAA,MACA,eAAA;AAAA,MACA;AAAA;AACF,GACF;AAKA,EAAA,MAAM,aAAA,GAAgB,YAAA,KAAiB,CAAA,GAAI,CAAA,GAAI,CAAA;AAE/C,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAA;AACtC,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA;AACxC,EAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAKjD,EAAAL,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,GAAA,CAAI,MAAA,IAAU,CAAC,QAAQ,OAAA,EAAS;AACrC,IAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,OAAA,CAAQ,aAAA,CAAiC,uBAAuB,CAAA;AAC9F,IAAA,aAAA,EAAe,KAAA,CAAM,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA;AAAA,EAC9C,CAAA,EAAG,CAAC,WAAA,EAAa,GAAA,CAAI,MAAM,CAAC,CAAA;AAE5B,EAAA,MAAM,aAAA,GAAgBC,WAAAA;AAAA,IACpB,CAAC,SAAA,KAAsB;AACrB,MAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,SAAA,CAAU,SAAA,EAAW,SAAS,CAAA;AACvD,MAAA,GAAA,CAAI,aAAa,QAAQ,CAAA;AACzB,MAAA,GAAA,CAAI,cAAA,CAAe,OAAA,CAAQ,YAAA,CAAa,QAAQ,CAAC,CAAA;AACjD,MAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA;AAClC,MAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAA;AACnC,MAAA,eAAA,CAAgB,eAAA,CAAgB,CAAA,EAAG,CAAA,EAAG,MAAM,CAAC,CAAA;AAAA,IAC/C,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,SAAA,EAAW,GAAA,EAAK,MAAM;AAAA,GAClC;AAEA,EAAA,MAAM,cAAA,GAAiBA,WAAAA;AAAA,IACrB,CAAC,GAAA,KAAqB;AACpB,MAAA,IAAI,IAAI,UAAA,EAAY;AACpB,MAAA,GAAA,CAAI,UAAA,CAAW,IAAI,SAAS,CAAA;AAC5B,MAAA,eAAA,CAAgB,kBAAA,CAAmB,GAAA,CAAI,SAAA,EAAW,MAAM,CAAC,CAAA;AAAA,IAC3D,CAAA;AAAA,IACA,CAAC,KAAK,MAAM;AAAA,GACd;AAEA,EAAA,MAAM,aAAA,GAAgBA,WAAAA;AAAA,IACpB,CAAC,CAAA,KAA2B;AAC1B,MAAA,IAAI,UAAA,GAA4B,IAAA;AAEhC,MAAA,QAAQ,EAAE,GAAA;AAAK,QACb,KAAK,WAAA;AACH,UAAA,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,WAAA,EAAa,EAAE,CAAA;AAC5C,UAAA;AAAA,QACF,KAAK,YAAA;AACH,UAAA,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,WAAA,EAAa,CAAC,CAAA;AAC3C,UAAA;AAAA,QACF,KAAK,SAAA;AACH,UAAA,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,WAAA,EAAa,EAAE,CAAA;AAC5C,UAAA;AAAA,QACF,KAAK,WAAA;AACH,UAAA,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,WAAA,EAAa,CAAC,CAAA;AAC3C,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,IAAI,EAAE,QAAA,EAAU;AACd,YAAA,UAAA,GAAa,OAAA,CAAQ,QAAA,CAAS,WAAA,EAAa,EAAE,CAAA;AAAA,UAC/C,CAAA,MAAO;AACL,YAAA,UAAA,GAAa,OAAA,CAAQ,SAAA,CAAU,WAAA,EAAa,EAAE,CAAA;AAAA,UAChD;AACA,UAAA;AAAA,QACF,KAAK,UAAA;AACH,UAAA,IAAI,EAAE,QAAA,EAAU;AACd,YAAA,UAAA,GAAa,OAAA,CAAQ,QAAA,CAAS,WAAA,EAAa,CAAC,CAAA;AAAA,UAC9C,CAAA,MAAO;AACL,YAAA,UAAA,GAAa,OAAA,CAAQ,SAAA,CAAU,WAAA,EAAa,CAAC,CAAA;AAAA,UAC/C;AACA,UAAA;AAAA,QACF,KAAK,MAAA;AACH,UAAA,UAAA,GAAa,OAAA,CAAQ,WAAA,CAAY,WAAA,EAAa,YAAY,CAAA;AAC1D,UAAA;AAAA,QACF,KAAK,KAAA;AACH,UAAA,UAAA,GAAa,OAAA,CAAQ,SAAA,CAAU,WAAA,EAAa,YAAY,CAAA;AAExD,UAAA,UAAA,GAAa,OAAA,CAAQ,WAAW,UAAU,CAAA;AAC1C,UAAA;AAAA,QACF,KAAK,OAAA;AAAA,QACL,KAAK,GAAA;AACH,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,IAAI,CAAC,cAAA,CAAe,WAAA,EAAa,QAAA,EAAU,OAAO,CAAA,EAAG;AACnD,YAAA,GAAA,CAAI,WAAW,WAAW,CAAA;AAAA,UAC5B;AACA,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,GAAA,CAAI,KAAA,EAAM;AACV,UAAA;AAAA,QACF;AACE,UAAA;AAAA;AAGJ,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,CAAA,CAAE,cAAA,EAAe;AAMjB,QAAA,MAAM,QAAA,GACJ,CAAA,CAAE,GAAA,KAAQ,WAAA,IAAe,CAAA,CAAE,GAAA,KAAQ,SAAA,IAAa,CAAA,CAAE,GAAA,KAAQ,QAAA,IAAY,CAAA,CAAE,GAAA,KAAQ,SAC5E,EAAA,GACA,CAAA;AACN,QAAA,IAAI,QAAA,GAAW,CAAA;AACf,QAAA,OAAO,eAAe,UAAA,EAAY,QAAA,EAAU,OAAO,CAAA,IAAK,WAAW,EAAA,EAAI;AACrE,UAAA,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,UAAA,EAAY,QAAQ,CAAA;AACjD,UAAA,QAAA,EAAA;AAAA,QACF;AACA,QAAA,IAAI,YAAY,EAAA,EAAI;AAElB,UAAA;AAAA,QACF;AAEA,QAAA,GAAA,CAAI,eAAe,UAAU,CAAA;AAG7B,QAAA,IAAI,CAAC,OAAA,CAAQ,WAAA,CAAY,UAAA,EAAY,SAAS,CAAA,EAAG;AAC/C,UAAA,GAAA,CAAI,aAAa,UAAU,CAAA;AAAA,QAC7B;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,WAAA,EAAa,SAAA,EAAW,YAAA,EAAc,UAAU,GAAG;AAAA,GAC/D;AAEA,EAAA,uBACEK,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,UAAA,EAAY,IAAA,EAAO,GAAG,KAAA,EACpC,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,UAAA,EAAY,MAAA,EAC1B,QAAA,EAAA;AAAA,sBAAAJ,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,WAAW,UAAA,EAAY,SAAA;AAAA,UACvB,OAAA,EAAS,MAAM,aAAA,CAAc,EAAE,CAAA;AAAA,UAC/B,YAAA,EAAY,IAAI,MAAA,CAAO,SAAA;AAAA,UACxB,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,MACC,+BACCA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,WAAW,UAAA,EAAY,KAAA;AAAA,UACvB,OAAA,EAAS,YAAA;AAAA,UACT,WAAA,EAAU,QAAA;AAAA,UAET,QAAA,EAAA;AAAA;AAAA,OACH,mBAEAA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAW,UAAA,EAAY,KAAA,EAAO,WAAA,EAAU,QAAA,EAC3C,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,sBAEFA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,WAAW,UAAA,EAAY,SAAA;AAAA,UACvB,OAAA,EAAS,MAAM,aAAA,CAAc,CAAC,CAAA;AAAA,UAC9B,YAAA,EAAY,IAAI,MAAA,CAAO,SAAA;AAAA,UACxB,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF,CAAA;AAAA,oBAEAI,IAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,OAAA;AAAA,QACL,IAAA,EAAK,MAAA;AAAA,QACL,YAAA,EAAY,KAAA;AAAA,QACZ,eAAA,EAAe,MAAM,MAAA,GAAS,CAAA;AAAA,QAC9B,eAAA,EAAe,CAAA;AAAA,QACf,WAAW,UAAA,EAAY,IAAA;AAAA,QACvB,SAAA,EAAW,aAAA;AAAA,QAEX,QAAA,EAAA;AAAA,0BAAAJ,GAAAA,CAAC,WACC,QAAA,kBAAAI,IAAAA,CAAC,QAAG,IAAA,EAAK,KAAA,EAAM,iBAAe,CAAA,EAC3B,QAAA,EAAA;AAAA,YAAA,cAAA,mBACCJ,GAAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAM,KAAA,EAAM,aAAA,EAAY,MAAA,EAAO,SAAA,EAAW,UAAA,EAAY,gBAAA,EAAkB,QAAA,EAAA,GAAA,EAE5E,CAAA,GACE,IAAA;AAAA,YACH,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,EAAK,6BAClBA,GAAAA;AAAA,cAAC,IAAA;AAAA,cAAA;AAAA,gBAEC,IAAA,EAAK,cAAA;AAAA,gBACL,MAAM,GAAA,CAAI,IAAA;AAAA,gBACV,KAAA,EAAM,KAAA;AAAA,gBACN,iBAAe,QAAA,GAAW,CAAA;AAAA,gBAC1B,WAAW,UAAA,EAAY,aAAA;AAAA,gBAEtB,QAAA,EAAA,GAAA,CAAI;AAAA,eAAA;AAAA,cAPA,GAAA,CAAI;AAAA,aASZ;AAAA,WAAA,EACH,CAAA,EACF,CAAA;AAAA,0BACAA,IAAC,OAAA,EAAA,EACE,QAAA,EAAA,KAAA,CAAM,IAAI,CAAC,IAAA,EAAM,8BAChBI,IAAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cAEC,IAAA,EAAK,KAAA;AAAA,cACL,iBAAe,SAAA,GAAY,CAAA;AAAA,cAC3B,WAAW,UAAA,EAAY,OAAA;AAAA,cAEtB,QAAA,EAAA;AAAA,gBAAA,cAAA,mBACCJ,GAAAA;AAAA,kBAAC,IAAA;AAAA,kBAAA;AAAA,oBACC,KAAA,EAAM,KAAA;AAAA,oBACN,aAAA,EAAY,MAAA;AAAA,oBACZ,WAAW,UAAA,EAAY,UAAA;AAAA,oBACvB,kBAAA,EAAgB,IAAA;AAAA,oBAEf,QAAA,EAAA,gBAAA,CAAiB,IAAA,CAAK,aAAa,CAAA,CAAG,SAAS;AAAA;AAAA,iBAClD,GACE,IAAA;AAAA,gBACH,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,QAAA,KAAa;AAC3B,kBAAA,MAAM,UAAA,GACJ;AAAA,oBACE,UAAA,EAAY,GAAA;AAAA,oBACZ,GAAA,CAAI,cAAc,UAAA,EAAY,WAAA;AAAA,oBAC9B,GAAA,CAAI,WAAW,UAAA,EAAY,QAAA;AAAA,oBAC3B,GAAA,CAAI,cAAc,UAAA,EAAY,WAAA;AAAA,oBAC9B,CAAC,GAAA,CAAI,cAAA,IAAkB,UAAA,EAAY;AAAA,oBAElC,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,GAAG,CAAA,IAAK,MAAA;AAElB,kBAAA,uBACEA,GAAAA;AAAA,oBAAC,IAAA;AAAA,oBAAA;AAAA,sBAEC,IAAA,EAAK,UAAA;AAAA,sBACL,iBAAe,QAAA,GAAW,CAAA;AAAA,sBAC1B,eAAA,EAAe,IAAI,UAAA,IAAc,MAAA;AAAA,sBACjC,eAAA,EAAe,IAAI,UAAA,IAAc,MAAA;AAAA,sBACjC,cAAA,EAAc,GAAA,CAAI,OAAA,GAAU,MAAA,GAAS,MAAA;AAAA,sBACrC,WAAW,UAAA,EAAY,QAAA;AAAA,sBAEvB,QAAA,kBAAAA,GAAAA;AAAA,wBAAC,QAAA;AAAA,wBAAA;AAAA,0BACC,IAAA,EAAK,QAAA;AAAA,0BACL,QAAA,EAAU,GAAA,CAAI,SAAA,GAAY,CAAA,GAAI,EAAA;AAAA,0BAC9B,UAAU,GAAA,CAAI,UAAA;AAAA,0BACd,cAAA,EAAc,IAAI,SAAA,IAAa,MAAA;AAAA,0BAC/B,eAAA,EAAe,IAAI,UAAA,IAAc,MAAA;AAAA,0BACjC,YAAA,EAAY,IAAI,OAAA,IAAW,MAAA;AAAA,0BAC3B,oBAAA,EAAoB,CAAC,GAAA,CAAI,cAAA,IAAkB,MAAA;AAAA,0BAC3C,SAAA,EAAW,UAAA;AAAA,0BACX,OAAA,EAAS,MAAM,cAAA,CAAe,GAAG,CAAA;AAAA,0BACjC,YAAA,EAAY,kBAAA,CAAmB,GAAA,CAAI,SAAA,EAAW,MAAM,CAAA;AAAA,0BAEnD,QAAA,EAAA,GAAA,CAAI;AAAA;AAAA;AACP,qBAAA;AAAA,oBArBK,GAAA,CAAI;AAAA,mBAsBX;AAAA,gBAEJ,CAAC;AAAA;AAAA,aAAA;AAAA,YArDI;AAAA,WAuDR,CAAA,EACH;AAAA;AAAA;AAAA,KACF;AAAA,oBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,IAAA,EAAK,QAAA,EAAS,WAAA,EAAU,QAAA,EAAS,aAAA,EAAY,MAAA,EAAO,KAAA,EAAO,MAAA,EAC7D,QAAA,EAAA,YAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;ACpWO,SAAS,oBAAA,CACd,KAAA,EACA,GAAA,EACA,KAAA,EACA,OAAA,EACS;AACT,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,QAAA,IAAY,QAAQ,OAAA,CAAQ,QAAA,CAAS,KAAK,IAAA,CAAK,MAAM,GAAG,OAAO,IAAA;AACnE,IAAA,IAAI,OAAA,IAAW,QAAQ,OAAA,CAAQ,OAAA,CAAQ,OAAO,IAAA,CAAK,KAAK,GAAG,OAAO,IAAA;AAAA,EACpE;AACA,EAAA,OAAO,KAAA;AACT;AAoCO,SAAS,aAAa,IAAA,EAA2B;AACtD,EAAA,MAAM,EAAE,YAAA,EAAc,aAAA,EAAe,UAAU,QAAA,EAAU,UAAA,EAAY,UAAS,GAAI,IAAA;AAClF,EAAA,MAAM,OAAA,GAAUL,OAAuB,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIE,SAAiB,YAAY,CAAA;AAErE,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAqB;AAC1C,IAAA,IAAI,IAAA,GAAsB,IAAA;AAC1B,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,QAAQ,EAAE,GAAA;AAAK,MACb,KAAK,WAAA;AACH,QAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,YAAA,GAAe,CAAC,CAAA;AACnC,QAAA,IAAA,GAAO,EAAA;AACP,QAAA;AAAA,MACF,KAAK,YAAA;AACH,QAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,YAAA,GAAe,CAAC,CAAA;AACpC,QAAA;AAAA,MACF,KAAK,SAAA;AACH,QAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,YAAA,GAAe,CAAC,CAAA;AACnC,QAAA,IAAA,GAAO,EAAA;AACP,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,YAAA,GAAe,CAAC,CAAA;AACpC,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,IAAA,GAAO,eAAgB,YAAA,GAAe,CAAA;AACtC,QAAA,IAAA,GAAO,EAAA;AACP,QAAA;AAAA,MACF,KAAK,KAAA;AACH,QAAA,IAAA,GAAO,YAAA,GAAgB,eAAe,CAAA,GAAK,CAAA;AAC3C,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,QAAA,EAAS;AACT,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,UAAA,EAAW;AACX,QAAA;AAAA,MACF,KAAK,OAAA;AAAA,MACL,KAAK,GAAA;AACH,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,QAAA,CAAS,YAAY,CAAA;AACrB,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,QAAA,EAAS;AACT,QAAA;AAAA,MACF;AACE,QAAA;AAAA;AAEJ,IAAA,IAAI,SAAS,IAAA,EAAM;AACnB,IAAA,CAAA,CAAE,cAAA,EAAe;AAEjB,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,IAAI,QAAA,GAAW,CAAA;AACf,MAAA,OAAO,IAAA,IAAQ,KAAK,IAAA,GAAO,EAAA,IAAM,cAAc,IAAI,CAAA,IAAK,WAAW,EAAA,EAAI;AACrE,QAAA,IAAA,IAAQ,IAAA;AACR,QAAA,QAAA,EAAA;AAAA,MACF;AACA,MAAA,IAAI,OAAO,CAAA,IAAK,IAAA,IAAQ,EAAA,IAAM,aAAA,CAAc,IAAI,CAAA,EAAG;AAAA,IACrD;AACA,IAAA,IAAI,IAAA,KAAS,YAAA,EAAc,eAAA,CAAgB,IAAI,CAAA;AAAA,EACjD,CAAA;AAOA,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,aAAA,IAAiB,CAAC,aAAA,CAAc,YAAY,CAAA,EAAG;AACpD,IAAA,MAAM,eAAe,aAAA,CAAc,SAAA,CAAU,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AACtD,IAAA,IAAI,YAAA,KAAiB,EAAA,IAAM,YAAA,KAAiB,YAAA,EAAc;AACxD,MAAA,eAAA,CAAgB,YAAY,CAAA;AAAA,IAC9B;AAAA,EACF,CAAA,EAAG,CAAC,aAAA,EAAe,YAAY,CAAC,CAAA;AAEhC,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,OAAA,EAAS,aAAA,CAAiC,uBAAuB,CAAA;AACrF,IAAA,GAAA,EAAK,KAAA,CAAM,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA;AAAA,EACpC,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,OAAO,EAAE,OAAA,EAAS,YAAA,EAAc,aAAA,EAAc;AAChD;ACtGO,SAAS,mBAAA,CAAoB;AAAA,EAClC,UAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA6B;AAC3B,EAAA,MAAM,GAAA,GAAM,qBAAqB,sBAAsB,CAAA;AACvD,EAAA,MAAM,EAAE,OAAA,EAAS,SAAA,EAAW,MAAA,EAAQ,iBAAgB,GAAI,GAAA;AAExD,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAA;AAC7C,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA;AAG/C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAID,SAA+B,IAAI,CAAA;AAC7D,EAAAC,UAAU,MAAM;AACd,IAAA,QAAA,CAAS,OAAA,CAAQ,KAAA,CAAM,eAAe,CAAC,CAAA;AAAA,EACzC,CAAA,EAAG,CAAC,OAAA,EAAS,eAAe,CAAC,CAAA;AAC7B,EAAA,MAAM,aAAa,KAAA,KAAU,IAAA,GAAO,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,GAAI,EAAA;AAC9D,EAAA,MAAM,YAAY,KAAA,KAAU,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA,GAAI,EAAA;AAE5D,EAAA,MAAM,YAAA,GAAeC,WAAAA;AAAA,IACnB,CAAC,SAAA,KAAsB;AACrB,MAAA,GAAA,CAAI,YAAA,CAAa,OAAA,CAAQ,QAAA,CAAS,SAAA,EAAW,SAAS,CAAC,CAAA;AAAA,IACzD,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,SAAA,EAAW,GAAG;AAAA,GAC1B;AAEA,EAAA,MAAM,iBAAA,GAAoBA,WAAAA;AAAA,IACxB,CAAC,UAAA,KAAuB;AACtB,MAAA,MAAM,MAAA,GAAS,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,aAAa,UAAA,EAAY,CAAC,CAAC,CAAA,CAAE,WAAA,EAAY;AAC1E,MAAA,GAAA,CAAI,aAAa,MAAM,CAAA;AACvB,MAAA,GAAA,CAAI,eAAe,MAAM,CAAA;AACzB,MAAA,QAAA,IAAW;AAAA,IACb,CAAA;AAAA,IACA,CAAC,WAAA,EAAa,GAAA,EAAK,QAAQ;AAAA,GAC7B;AAEA,EAAA,MAAM,EAAE,OAAA,EAAS,YAAA,EAAc,aAAA,KAAkB,YAAA,CAAa;AAAA,IAC5D,YAAA,EAAc,YAAA;AAAA,IACd,QAAA,EAAU,iBAAA;AAAA,IACV,QAAA,EAAU,MAAM,YAAA,CAAa,EAAE,CAAA;AAAA,IAC/B,UAAA,EAAY,MAAM,YAAA,CAAa,CAAC,CAAA;AAAA,IAChC,UAAU,GAAA,CAAI;AAAA,GACf,CAAA;AAED,EAAA,uBACEK,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,UAAA,EAAY,IAAA,EAAO,GAAG,KAAA,EACpC,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,UAAA,EAAY,MAAA,EAC1B,QAAA,EAAA;AAAA,sBAAAJ,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,WAAW,UAAA,EAAY,SAAA;AAAA,UACvB,OAAA,EAAS,MAAM,YAAA,CAAa,EAAE,CAAA;AAAA,UAC9B,YAAA,EAAY,IAAI,MAAA,CAAO,QAAA;AAAA,UACxB,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,MACC,+BACCA,GAAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,WAAW,UAAA,EAAY,KAAA,EAAO,SAAS,YAAA,EAC1D,QAAA,EAAA,WAAA,EACH,oBAEAA,GAAAA,CAAC,UAAK,SAAA,EAAW,UAAA,EAAY,OAAQ,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,sBAEnDA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,WAAW,UAAA,EAAY,SAAA;AAAA,UACvB,OAAA,EAAS,MAAM,YAAA,CAAa,CAAC,CAAA;AAAA,UAC7B,YAAA,EAAY,IAAI,MAAA,CAAO,QAAA;AAAA,UACxB,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF,CAAA;AAAA,oBAEAA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,OAAA;AAAA,QACL,IAAA,EAAK,MAAA;AAAA,QACL,YAAA,EAAY,GAAG,WAAW,CAAA,OAAA,CAAA;AAAA,QAC1B,WAAW,UAAA,EAAY,IAAA;AAAA,QACvB,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,qBAAqB,gBAAA,EAAiB;AAAA,QAChE,SAAA,EAAW,aAAA;AAAA,QAEV,QAAA,EAAA,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,IAAG,EAAG,CAAC,GAAG,CAAA,KAAM;AACpC,UAAA,MAAM,aAAa,CAAA,KAAM,YAAA;AACzB,UAAA,MAAM,SAAA,GAAY,CAAA,KAAM,UAAA,IAAc,WAAA,KAAgB,SAAA;AACtD,UAAA,MAAM,YAAY,CAAA,KAAM,YAAA;AACxB,UAAA,MAAM,GAAA,GACJ;AAAA,YACE,UAAA,EAAY,KAAA;AAAA,YACZ,cAAc,UAAA,EAAY,aAAA;AAAA,YAC1B,aAAa,UAAA,EAAY;AAAA,YAExB,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,GAAG,CAAA,IAAK,MAAA;AAElB,UAAA,uBACEA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cAEC,IAAA,EAAK,QAAA;AAAA,cACL,IAAA,EAAK,UAAA;AAAA,cACL,QAAA,EAAU,YAAY,CAAA,GAAI,EAAA;AAAA,cAC1B,iBAAe,UAAA,IAAc,MAAA;AAAA,cAC7B,cAAA,EAAc,YAAY,MAAA,GAAS,MAAA;AAAA,cACnC,iBAAe,UAAA,IAAc,MAAA;AAAA,cAC7B,gBAAc,SAAA,IAAa,MAAA;AAAA,cAC3B,gBAAc,SAAA,IAAa,MAAA;AAAA,cAC3B,SAAA,EAAW,GAAA;AAAA,cACX,OAAA,EAAS,MAAM,iBAAA,CAAkB,CAAC,CAAA;AAAA,cAEjC,QAAA,EAAA,YAAA,CAAa,GAAG,MAAM;AAAA,aAAA;AAAA,YAZlB;AAAA,WAaP;AAAA,QAEJ,CAAC;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ;ACxHO,SAAS,mBAAmB,EAAE,UAAA,EAAY,QAAA,EAAU,GAAG,OAAM,EAA4B;AAC9F,EAAA,MAAM,GAAA,GAAM,qBAAqB,qBAAqB,CAAA;AACtD,EAAA,MAAM,EAAE,OAAA,EAAS,SAAA,EAAW,eAAA,EAAgB,GAAI,GAAA;AAEhD,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAA;AAE7C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIH,SAA+B,IAAI,CAAA;AAC7D,EAAAC,UAAU,MAAM;AACd,IAAA,QAAA,CAAS,OAAA,CAAQ,KAAA,CAAM,eAAe,CAAC,CAAA;AAAA,EACzC,CAAA,EAAG,CAAC,OAAA,EAAS,eAAe,CAAC,CAAA;AAC7B,EAAA,MAAM,YAAY,KAAA,KAAU,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA,GAAI,EAAA;AAG5D,EAAA,MAAM,WAAA,GAAc,cAAe,WAAA,GAAc,EAAA;AAEjD,EAAA,MAAM,cAAA,GAAiBC,WAAAA;AAAA,IACrB,CAAC,SAAA,KAAsB;AACrB,MAAA,GAAA,CAAI,aAAa,OAAA,CAAQ,QAAA,CAAS,SAAA,EAAW,SAAA,GAAY,EAAE,CAAC,CAAA;AAAA,IAC9D,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,SAAA,EAAW,GAAG;AAAA,GAC1B;AAEA,EAAA,MAAM,gBAAA,GAAmBA,WAAAA;AAAA,IACvB,CAAC,aAAA,KAA0B;AACzB,MAAA,MAAM,OAAO,WAAA,GAAc,aAAA;AAC3B,MAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA;AAC/C,MAAA,MAAM,MAAA,GAAS,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,MAAM,YAAA,EAAc,CAAC,CAAC,CAAA,CAAE,WAAA,EAAY;AACrE,MAAA,GAAA,CAAI,aAAa,MAAM,CAAA;AACvB,MAAA,GAAA,CAAI,eAAe,MAAM,CAAA;AACzB,MAAA,QAAA,IAAW;AAAA,IACb,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,SAAA,EAAW,GAAA,EAAK,UAAU,WAAW;AAAA,GACjD;AAEA,EAAA,MAAM,EAAE,OAAA,EAAS,YAAA,EAAc,aAAA,KAAkB,YAAA,CAAa;AAAA,IAC5D,cAAc,WAAA,GAAc,WAAA;AAAA,IAC5B,QAAA,EAAU,gBAAA;AAAA,IACV,QAAA,EAAU,MAAM,cAAA,CAAe,EAAE,CAAA;AAAA,IACjC,UAAA,EAAY,MAAM,cAAA,CAAe,CAAC,CAAA;AAAA,IAClC,UAAU,GAAA,CAAI;AAAA,GACf,CAAA;AAED,EAAA,MAAM,UAAA,GAAa,CAAA,EAAG,WAAW,CAAA,MAAA,EAAI,cAAc,EAAE,CAAA,CAAA;AAErD,EAAA,uBACEK,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,UAAA,EAAY,IAAA,EAAO,GAAG,KAAA,EACpC,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,UAAA,EAAY,MAAA,EAC1B,QAAA,EAAA;AAAA,sBAAAJ,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,WAAW,UAAA,EAAY,SAAA;AAAA,UACvB,OAAA,EAAS,MAAM,cAAA,CAAe,EAAE,CAAA;AAAA,UAChC,YAAA,EAAY,IAAI,MAAA,CAAO,UAAA;AAAA,UACxB,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,sBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,UAAA,EAAY,OAAQ,QAAA,EAAA,UAAA,EAAW,CAAA;AAAA,sBAChDA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,WAAW,UAAA,EAAY,SAAA;AAAA,UACvB,OAAA,EAAS,MAAM,cAAA,CAAe,CAAC,CAAA;AAAA,UAC/B,YAAA,EAAY,IAAI,MAAA,CAAO,UAAA;AAAA,UACxB,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF,CAAA;AAAA,oBAEAA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,OAAA;AAAA,QACL,IAAA,EAAK,MAAA;AAAA,QACL,YAAA,EAAY,UAAA;AAAA,QACZ,WAAW,UAAA,EAAY,IAAA;AAAA,QACvB,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,qBAAqB,gBAAA,EAAiB;AAAA,QAChE,SAAA,EAAW,aAAA;AAAA,QAEV,QAAA,EAAA,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,IAAG,EAAG,CAAC,GAAG,CAAA,KAAM;AACpC,UAAA,MAAM,OAAO,WAAA,GAAc,CAAA;AAC3B,UAAA,MAAM,aAAa,IAAA,KAAS,WAAA;AAC5B,UAAA,MAAM,YAAY,IAAA,KAAS,SAAA;AAC3B,UAAA,MAAM,YAAY,CAAA,KAAM,YAAA;AACxB,UAAA,MAAM,GAAA,GACJ;AAAA,YACE,UAAA,EAAY,IAAA;AAAA,YACZ,cAAc,UAAA,EAAY,YAAA;AAAA,YAC1B,aAAa,UAAA,EAAY;AAAA,YAExB,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,GAAG,CAAA,IAAK,MAAA;AAClB,UAAA,uBACEA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cAIC,IAAA,EAAK,QAAA;AAAA,cACL,IAAA,EAAK,UAAA;AAAA,cACL,QAAA,EAAU,YAAY,CAAA,GAAI,EAAA;AAAA,cAC1B,iBAAe,UAAA,IAAc,MAAA;AAAA,cAC7B,cAAA,EAAc,YAAY,MAAA,GAAS,MAAA;AAAA,cACnC,iBAAe,UAAA,IAAc,MAAA;AAAA,cAC7B,gBAAc,SAAA,IAAa,MAAA;AAAA,cAC3B,gBAAc,SAAA,IAAa,MAAA;AAAA,cAC3B,SAAA,EAAW,GAAA;AAAA,cACX,OAAA,EAAS,MAAM,gBAAA,CAAiB,CAAC,CAAA;AAAA,cAEhC,QAAA,EAAA;AAAA,aAAA;AAAA,YAZI;AAAA,WAaP;AAAA,QAEJ,CAAC;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ;AC5GO,SAAS,kBAAkB,EAAE,UAAA,EAAY,QAAA,EAAU,GAAG,OAAM,EAA2B;AAC5F,EAAA,MAAM,GAAA,GAAM,qBAAqB,oBAAoB,CAAA;AACrD,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,IAAA,EAAK,SAAQ,YAAA,EAAY,GAAA,CAAI,MAAA,CAAO,YAAA,EAAc,SAAA,EAAW,UAAA,EAAY,IAAA,EAAO,GAAG,OACrF,QAAA,EACH,CAAA;AAEJ;AAWA,SAAS,iBAAA,CACP,GAAA,EACA,KAAA,EACA,OAAA,EACe;AACf,EAAA,QAAQ,GAAA;AAAK,IACX,KAAK,OAAA;AACH,MAAA,OAAO,KAAA;AAAA,IACT,KAAK,UAAA;AACH,MAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO,CAAC,CAAA;AAAA,IACjC,KAAK,WAAA;AACH,MAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAAA,IAClC,KAAK,cAAA;AACH,MAAA,OAAO,OAAA,CAAQ,aAAa,KAAK,CAAA;AAAA,IACnC,KAAK,YAAA;AACH,MAAA,OAAO,OAAA,CAAQ,UAAA,CAAW,OAAA,CAAQ,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,IACrD,KAAK,aAAA,EAAe;AAClB,MAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA;AAC3C,MAAA,OAAO,QAAQ,YAAA,CAAa,OAAA,CAAQ,UAAU,KAAA,EAAO,CAAC,YAAY,CAAC,CAAA;AAAA,IACrE;AAAA;AAEJ;AAsBO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,KAAA,EAAO,SAAA;AAAA,EACP,IAAA,EAAM,UAAA;AAAA,EACN,QAAA;AAAA,EACA,OAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA0B;AACxB,EAAA,MAAM,GAAA,GAAM,qBAAqB,mBAAmB,CAAA;AAEpD,EAAA,MAAM,WAAA,GAAcD,WAAAA;AAAA,IAClB,CAAC,CAAA,KAA2C;AAC1C,MAAA,IAAI,GAAA,CAAI,UAAA,IAAc,GAAA,CAAI,UAAA,EAAY;AAEtC,MAAA,IAAI,QAAA;AACJ,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,QAAA,GAAW,UAAA;AAAA,MACb,WAAW,SAAA,EAAW;AACpB,QAAA,QAAA,GAAW,iBAAA;AAAA,UACT,SAAA;AAAA,UACA,GAAA,CAAI,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,eAAe,CAAA;AAAA,UACrC,GAAA,CAAI;AAAA,SACN;AAAA,MACF,CAAA,MAAO;AACL,QAAA;AAAA,MACF;AAEA,MAAA,GAAA,CAAI,WAAW,QAAQ,CAAA;AACvB,MAAA,OAAA,GAAU,CAAC,CAAA;AAAA,IACb,CAAA;AAAA,IACA,CAAC,GAAA,EAAK,SAAA,EAAW,UAAA,EAAY,OAAO;AAAA,GACtC;AAGA,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,OAAO,KAAA;AACvB,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAA,GAAS,UAAA;AAAA,IACX,WAAW,SAAA,EAAW;AACpB,MAAA,MAAA,GAAS,iBAAA,CAAkB,WAAW,GAAA,CAAI,OAAA,CAAQ,MAAM,GAAA,CAAI,eAAe,CAAA,EAAG,GAAA,CAAI,OAAO,CAAA;AAAA,IAC3F,CAAA,MAAO;AACL,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAI,OAAA,CAAQ,SAAA,CAAU,IAAI,KAAA,EAAO,MAAA,EAAQ,IAAI,eAAe,CAAA;AAAA,EACrE,CAAA,GAAG;AAKH,EAAA,uBACEC,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,cAAA,EAAc,QAAA;AAAA,MACd,eAAa,QAAA,IAAY,MAAA;AAAA,MACzB,UAAU,GAAA,CAAI,UAAA;AAAA,MACd,OAAA,EAAS,WAAA;AAAA,MACR,GAAG,KAAA;AAAA,MAEH;AAAA;AAAA,GACH;AAEJ;;;AC7GO,IAAM,UAAA,GAAa,MAAA,CAAO,MAAA,CAAO,cAAA,EAAgB;AAAA,EACtD,KAAA,EAAO,eAAA;AAAA,EACP,OAAA,EAAS,iBAAA;AAAA,EACT,OAAA,EAAS,iBAAA;AAAA,EACT,QAAA,EAAU,kBAAA;AAAA,EACV,SAAA,EAAW,mBAAA;AAAA,EACX,QAAA,EAAU,kBAAA;AAAA,EACV,OAAA,EAAS,iBAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAC;ACUM,IAAM,kBAAA,GAAqBK,cAA8C,IAAI,CAAA;AAM7E,SAAS,sBAAsB,aAAA,EAAgD;AACpF,EAAA,MAAM,OAAA,GAAUC,WAAW,kBAAkB,CAAA;AAC7C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,IAAI,aAAa,CAAA;;AAAA;AAAA;AAAA,iBAAA,EAGK,aAAA,CAAc,OAAA,CAAQ,cAAA,EAAgB,EAAE,CAAC,CAAA;AAAA,gBAAA;AAAA,KAEjE;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;ACnEA,IAAM,WAAA,GAAyB,EAAE,KAAA,EAAO,IAAA,EAAM,KAAK,IAAA,EAAK;AAExD,IAAM,OAAA,GAAyB;AAAA,EAC7B,QAAA,EAAU,UAAA;AAAA,EACV,KAAA,EAAO,CAAA;AAAA,EACP,MAAA,EAAQ,CAAA;AAAA,EACR,OAAA,EAAS,CAAA;AAAA,EACT,MAAA,EAAQ,EAAA;AAAA,EACR,QAAA,EAAU,QAAA;AAAA,EACV,IAAA,EAAM,kBAAA;AAAA,EACN,UAAA,EAAY,QAAA;AAAA,EACZ,MAAA,EAAQ;AACV,CAAA;AAsDO,SAAS,eAAA,CAAgB;AAAA,EAC9B,KAAA,EAAO,eAAA;AAAA,EACP,YAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,kBAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,QAAA,GAAW,KAAA;AAAA,EACX,YAAA,GAAe,CAAA;AAAA,EACf,aAAA,GAAgB,YAAA;AAAA,EAChB,MAAA,GAAS,OAAA;AAAA,EACT,eAAA;AAAA,EACA,OAAA,GAAUC,cAAAA;AAAA,EACV,MAAA,EAAQ,UAAA;AAAA,EACR;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,WAAWC,KAAAA,EAAM;AACvB,EAAA,MAAM,YAAA,GAAeb,MAAAA,CAAO,eAAA,KAAoB,MAAS,CAAA,CAAE,OAAA;AAC3D,EAAA,MAAM,YAAA,GAAeA,OAA2B,IAAI,CAAA;AAGpD,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIE,QAAAA;AAAA,IAChD,YAAA,IAAgB;AAAA,GAClB;AAEA,EAAA,MAAM,YAAA,GAAe,YAAA,GAAgB,eAAA,IAAmB,WAAA,GAAe,iBAAA;AAEvE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,KAAK,CAAA;AAG1C,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,SAA+B,OAAO,CAAA;AAEpF,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAA+B,IAAI,CAAA;AAGrE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAS,EAAE,CAAA;AACnD,EAAA,MAAM,QAAA,GAAWE,YAAY,CAAC,OAAA,KAAoB,gBAAgB,OAAO,CAAA,EAAG,EAAE,CAAA;AAG9E,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIF,QAAAA;AAAA,IAChC,MAAM,YAAA,CAAa,KAAA,IAAS,OAAA,CAAQ,MAAM,eAAe;AAAA,GAC3D;AAEA,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,QAAAA;AAAA,IACpC,MAAM,YAAA,CAAa,KAAA,IAAS,OAAA,CAAQ,MAAM,eAAe;AAAA,GAC3D;AAEA,EAAA,eAAA,CAAgB,QAAQ,YAAY,CAAA;AACpC,EAAA,MAAM,cAAA,GAAiBM,OAAAA,CAAQ,MAAM,OAAA,CAAQ,YAAA,CAAa,SAAS,CAAA,EAAG,CAAC,SAAA,EAAW,OAAO,CAAC,CAAA;AAC1F,EAAA,eAAA,CAAgB,gBAAgB,kBAAkB,CAAA;AAElD,EAAA,MAAM,YAAA,GAAeA,OAAAA;AAAA,IACnB,OAAO,EAAE,GAAG,0BAAA,EAA4B,GAAG,UAAA,EAAW,CAAA;AAAA,IACtD,CAAC,UAAU;AAAA,GACb;AAEA,EAAA,MAAM,UAAA,GAAa,OAAO,QAAA,KAAa,SAAA,GAAY,QAAA,GAAW,KAAA;AAC9D,EAAA,MAAM,aAAA,GAAgCA,OAAAA;AAAA,IACpC,MAAO,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,WAAW,EAAC;AAAA,IAC7C,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,MAAM,QAAA,GAAWJ,WAAAA;AAAA,IACf,CAAC,KAAA,KAAqB;AACpB,MAAA,IAAI,cAAc,QAAA,EAAU;AAC5B,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,oBAAA,CAAqB,KAAK,CAAA;AAAA,MAC5B;AACA,MAAA,QAAA,GAAW,KAAK,CAAA;AAAA,IAClB,CAAA;AAAA,IACA,CAAC,YAAA,EAAc,UAAA,EAAY,QAAA,EAAU,QAAQ;AAAA,GAC/C;AAOA,EAAA,MAAM,UAAA,GAAaA,WAAAA;AAAA,IACjB,CAAC,GAAA,KAAuB;AACtB,MAAA,IAAI,cAAc,QAAA,EAAU;AAG5B,MAAA,MAAM,UAAA,GAAa,eAAA,GAAkBU,uBAAAA,CAAwB,GAAA,EAAK,eAAe,CAAA,GAAI,GAAA;AAErF,MAAA,IAAI,oBAAoB,OAAA,EAAS;AAC/B,QAAA,MAAM,QAAA,GAAsB,EAAE,KAAA,EAAO,UAAA,EAAY,KAAK,IAAA,EAAK;AAC3D,QAAA,QAAA,CAAS,QAAQ,CAAA;AACjB,QAAA,kBAAA,CAAmB,KAAK,CAAA;AACxB,QAAA,YAAA,CAAa,IAAI,CAAA;AAAA,MACnB,CAAA,MAAO;AACL,QAAA,MAAM,QAAQ,YAAA,CAAa,KAAA;AAC3B,QAAA,IAAI,CAAC,KAAA,EAAO;AAEV,UAAA,QAAA,CAAS,EAAE,KAAA,EAAO,UAAA,EAAY,GAAA,EAAK,MAAM,CAAA;AACzC,UAAA,kBAAA,CAAmB,KAAK,CAAA;AACxB,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,QAAA;AACJ,QAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,UAAA,EAAY,KAAK,CAAA,EAAG;AAEvC,UAAA,QAAA,GAAW,EAAE,KAAA,EAAO,UAAA,EAAY,GAAA,EAAK,KAAA,EAAM;AAAA,QAC7C,CAAA,MAAO;AACL,UAAA,QAAA,GAAW,EAAE,KAAA,EAAO,GAAA,EAAK,UAAA,EAAW;AAAA,QACtC;AAEA,QAAA,QAAA,CAAS,QAAQ,CAAA;AACjB,QAAA,kBAAA,CAAmB,OAAO,CAAA;AAC1B,QAAA,YAAA,CAAa,IAAI,CAAA;AACjB,QAAA,SAAA,CAAU,KAAK,CAAA;AAAA,MACjB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,YAAY,QAAA,EAAU,eAAA,EAAiB,aAAa,KAAA,EAAO,OAAA,EAAS,UAAU,eAAe;AAAA,GAChG;AAEA,EAAA,MAAM,IAAA,GAAOV,YAAY,MAAM;AAC7B,IAAA,IAAI,cAAc,QAAA,EAAU;AAC5B,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,KAAA,IAAS,OAAA,CAAQ,MAAM,eAAe,CAAA;AAClE,IAAA,YAAA,CAAa,MAAM,CAAA;AACnB,IAAA,cAAA,CAAe,MAAM,CAAA;AAErB,IAAA,IAAI,YAAA,CAAa,KAAA,IAAS,YAAA,CAAa,GAAA,EAAK;AAC1C,MAAA,kBAAA,CAAmB,OAAO,CAAA;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,UAAA,EAAY,UAAU,YAAA,EAAc,OAAA,EAAS,eAAe,CAAC,CAAA;AAEjE,EAAA,MAAM,KAAA,GAAQA,YAAY,MAAM;AAC9B,IAAA,SAAA,CAAU,KAAK,CAAA;AACf,IAAA,YAAA,CAAa,IAAI,CAAA;AAAA,EACnB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,MAAA,GAASA,YAAY,MAAM;AAC/B,IAAA,IAAI,QAAQ,KAAA,EAAM;AAAA,SACb,IAAA,EAAK;AAAA,EACZ,CAAA,EAAG,CAAC,MAAA,EAAQ,IAAA,EAAM,KAAK,CAAC,CAAA;AAExB,EAAA,MAAM,YAAA,GAAwCI,OAAAA;AAAA,IAC5C,OAAO;AAAA,MACL,YAAA;AAAA,MACA,KAAA,EAAO,YAAA;AAAA,MACP,QAAA;AAAA,MACA,UAAA;AAAA,MACA,eAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA,WAAA;AAAA,MACA,cAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA,EAAU,aAAA;AAAA,MACV,YAAA;AAAA,MACA,aAAA;AAAA,MACA,MAAA;AAAA,MACA,eAAA;AAAA,MACA,UAAA;AAAA,MACA,UAAA,EAAY,QAAA;AAAA,MACZ,QAAA;AAAA,MACA,MAAA,EAAQ,YAAA;AAAA,MACR;AAAA,KACF,CAAA;AAAA,IACA;AAAA,MACE,YAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA;AAAA,MACA,eAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,WAAA;AAAA,MACA,OAAA;AAAA,MACA,aAAA;AAAA,MACA,YAAA;AAAA,MACA,aAAA;AAAA,MACA,MAAA;AAAA,MACA,eAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,uBACEC,IAAAA,CAAC,kBAAA,CAAmB,QAAA,EAAnB,EAA4B,OAAO,YAAA,EACjC,QAAA,EAAA;AAAA,IAAA,QAAA;AAAA,oBACDJ,GAAAA,CAAC,KAAA,EAAA,EAAI,IAAA,EAAK,QAAA,EAAS,WAAA,EAAU,QAAA,EAAS,aAAA,EAAY,MAAA,EAAO,KAAA,EAAO,OAAA,EAC7D,QAAA,EAAA,YAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;ACvQO,IAAM,gBAAA,GAAmBC,UAAAA;AAAA,EAC9B,SAASS,iBAAAA,CAAiB,EAAE,IAAA,EAAM,MAAA,EAAQ,UAAA,EAAY,OAAA,EAAS,SAAA,EAAW,GAAG,KAAA,EAAM,EAAG,GAAA,EAAK;AACzF,IAAA,MAAM,GAAA,GAAM,sBAAsB,mBAAmB,CAAA;AACrD,IAAA,MAAM,aAAA,GAAgB,cAAc,GAAA,CAAI,aAAA;AAExC,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC5B,IAAA,IAAI,YAAA,GAAe,EAAA;AACnB,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAI;AACF,QAAA,YAAA,GAAe,IAAI,OAAA,CAAQ,MAAA,CAAO,KAAA,EAAO,aAAA,EAAe,IAAI,eAAe,CAAA;AAAA,MAC7E,CAAA,CAAA,MAAQ;AACN,QAAA,YAAA,GAAe,KAAA;AAAA,MACjB;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAcX,WAAAA;AAAA,MAClB,CAAC,CAAA,KAA0C;AACzC,QAAA,IAAI,CAAC,GAAA,CAAI,MAAA,EAAQ,GAAA,CAAI,IAAA,EAAK;AAC1B,QAAA,OAAA,GAAU,CAAC,CAAA;AAAA,MACb,CAAA;AAAA,MACA,CAAC,KAAK,OAAO;AAAA,KACf;AAEA,IAAA,MAAM,aAAA,GAAgBA,WAAAA;AAAA,MACpB,CAAC,CAAA,KAA6C;AAC5C,QAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,UAAA,GAAA,CAAI,KAAA,EAAM;AAAA,QACZ,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,IAAI,MAAA,EAAQ;AAE1C,UAAA,CAAA,CAAE,cAAA,EAAe;AAAA,QACnB,WAAW,CAAA,CAAE,GAAA,KAAQ,WAAA,IAAe,CAAC,IAAI,MAAA,EAAQ;AAC/C,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,GAAA,CAAI,IAAA,EAAK;AAAA,QACX;AACA,QAAA,SAAA,GAAY,CAAC,CAAA;AAAA,MACf,CAAA;AAAA,MACA,CAAC,KAAK,SAAS;AAAA,KACjB;AAEA,IAAA,MAAM,UAAA,GAAa,CAAA,EAAG,GAAA,CAAI,QAAQ,CAAA,SAAA,CAAA;AAElC,IAAA,uBACEC,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,CAAC,IAAA,KAAS;AAEb,UAAA,IAAI,IAAA,KAAS,OAAA,IAAW,IAAA,EAAM,GAAA,CAAI,aAAa,OAAA,GAAU,IAAA;AACzD,UAAA,IAAI,OAAO,GAAA,KAAQ,UAAA,EAAY,GAAA,CAAI,IAAI,CAAA;AAAA,eAAA,IAC9B,GAAA,MAAS,OAAA,GAAU,IAAA;AAAA,QAC9B,CAAA;AAAA,QACA,IAAA,EAAK,MAAA;AAAA,QACL,IAAA,EAAK,UAAA;AAAA,QACL,QAAA,EAAQ,IAAA;AAAA,QACR,iBAAe,GAAA,CAAI,MAAA;AAAA,QACnB,eAAA,EAAc,QAAA;AAAA,QACd,eAAA,EAAe,GAAA,CAAI,MAAA,GAAS,UAAA,GAAa,MAAA;AAAA,QACzC,mBAAA,EAAkB,MAAA;AAAA,QAClB,cAAY,IAAA,KAAS,OAAA,GAAU,IAAI,MAAA,CAAO,UAAA,GAAa,IAAI,MAAA,CAAO,QAAA;AAAA,QAClE,YAAA,EAAa,KAAA;AAAA,QACb,KAAA,EAAO,YAAA;AAAA,QACP,QAAA,EAAU,GAAA,CAAI,UAAA,IAAc,KAAA,CAAM,QAAA;AAAA,QAClC,OAAA,EAAS,WAAA;AAAA,QACT,SAAA,EAAW,aAAA;AAAA,QACX,WAAA,EAAW,IAAA;AAAA,QACV,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF,CAAA;AAEA,gBAAA,CAAiB,WAAA,GAAc,mBAAA;ACpFxB,SAAS,kBAAA,CAAmB,EAAE,QAAA,EAAU,GAAG,OAAM,EAA4B;AAClF,EAAA,MAAM,GAAA,GAAM,sBAAsB,qBAAqB,CAAA;AACvD,EAAA,MAAM,UAAA,GAAa,CAAA,EAAG,GAAA,CAAI,QAAQ,CAAA,SAAA,CAAA;AAElC,EAAA,MAAM,EAAE,cAAA,EAAgB,cAAA,EAAgB,YAAA,KAAiB,UAAA,CAAW;AAAA,IAClE,QAAQ,GAAA,CAAI,MAAA;AAAA,IACZ,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,cAAc,GAAA,CAAI;AAAA,GACnB,CAAA;AAED,EAAA,IAAI,CAAC,GAAA,CAAI,MAAA,EAAQ,OAAO,IAAA;AAExB,EAAA,MAAM,EAAE,KAAA,EAAO,SAAA,EAAW,GAAG,MAAK,GAAI,KAAA;AAEtC,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,cAAA;AAAA,MACL,EAAA,EAAI,UAAA;AAAA,MACJ,IAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAY,IAAI,MAAA,CAAO,YAAA;AAAA,MACvB,YAAA,EAAW,OAAA;AAAA,MACV,GAAG,IAAA;AAAA,MACJ,KAAA,EAAO;AAAA,QACL,GAAG,SAAA;AAAA,QACH,GAAG,cAAA;AAAA,QACH,UAAA,EAAY,eAAe,MAAA,GAAY;AAAA,OACzC;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;ACqBA,SAASW,mBAAAA,CAAmB,KAAa,MAAA,EAAwB;AAC/D,EAAA,IAAI;AACF,IAAA,OAAOC,cAAAA,CAAe,KAAK,MAAM,CAAA;AAAA,EACnC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,GAAA;AAAA,EACT;AACF;AAEO,SAAS,mBAAA,CAAoB;AAAA,EAClC,UAAA;AAAA,EACA,aAAA,GAAgB,OAAA;AAAA,EAChB,cAAA,GAAiB,KAAA;AAAA,EACjB,UAAA,GAAa,KAAA;AAAA,EACb,GAAG;AACL,CAAA,EAA6B;AAC3B,EAAA,MAAM,GAAA,GAAM,sBAAsB,sBAAsB,CAAA;AACxD,EAAA,MAAM,OAAA,GAAUjB,OAAyB,IAAI,CAAA;AAE7C,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACF,GAAI,GAAA;AAEJ,EAAA,MAAM,EAAE,QAAO,GAAI,GAAA;AAEnB,EAAA,MAAM,QAAA,GAAWQ,OAAAA,CAAQ,MAAMU,eAAAA,CAAgB,MAAA,EAAQ,YAAY,CAAA,EAAG,CAAC,MAAA,EAAQ,YAAY,CAAC,CAAA;AAE5F,EAAA,MAAM,KAAA,GAAQV,OAAAA;AAAA,IACZ,MACEW,eAAAA,CAAgB,SAAA,EAAW,OAAA,EAAS;AAAA,MAClC,YAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA,EAAO,KAAA;AAAA,MACP,UAAA,EAAY,SAAA;AAAA,MACZ,QAAA,EAAU,eAAA;AAAA,MACV;AAAA,KACD,CAAA;AAAA,IACH;AAAA,MACE,SAAA;AAAA,MACA,OAAA;AAAA,MACA,YAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA;AAAA,MACA,eAAA;AAAA,MACA;AAAA;AACF,GACF;AAGA,EAAA,MAAM,aAAA,GAAgB,YAAA,KAAiB,CAAA,GAAI,CAAA,GAAI,CAAA;AAE/C,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAA;AACtC,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA;AACxC,EAAA,MAAM,KAAA,GAAQC,eAAAA,CAAgB,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAEjD,EAAAjB,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,GAAA,CAAI,MAAA,IAAU,CAAC,QAAQ,OAAA,EAAS;AACrC,IAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,OAAA,CAAQ,aAAA,CAAiC,uBAAuB,CAAA;AAC9F,IAAA,aAAA,EAAe,KAAA,CAAM,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA;AAAA,EAC9C,CAAA,EAAG,CAAC,WAAA,EAAa,GAAA,CAAI,MAAM,CAAC,CAAA;AAE5B,EAAA,MAAM,aAAA,GAAgBC,WAAAA;AAAA,IACpB,CAAC,SAAA,KAAsB;AACrB,MAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,SAAA,CAAU,SAAA,EAAW,SAAS,CAAA;AACvD,MAAA,GAAA,CAAI,aAAa,QAAQ,CAAA;AACzB,MAAA,GAAA,CAAI,cAAA,CAAe,OAAA,CAAQ,YAAA,CAAa,QAAQ,CAAC,CAAA;AACjD,MAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA;AAClC,MAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAA;AACnC,MAAA,GAAA,CAAI,QAAA,CAASgB,eAAAA,CAAgB,CAAA,EAAG,CAAA,EAAG,MAAM,CAAC,CAAA;AAAA,IAC5C,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,SAAA,EAAW,GAAA,EAAK,MAAM;AAAA,GAClC;AAEA,EAAA,MAAM,SAAA,GAAYhB,WAAAA;AAAA,IAChB,CAAC,GAAA,KAAgB;AACf,MAAA,IAAI,kBAAkB,MAAA,EAAQ;AAC5B,QAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,WAAA,CAAY,GAAA,EAAK,YAAY,CAAA;AACvD,QAAA,MAAM,UAAU,OAAA,CAAQ,UAAA,CAAW,QAAQ,SAAA,CAAU,GAAA,EAAK,YAAY,CAAC,CAAA;AACvE,QAAA,MAAM,KAAA,GAAmB,EAAE,KAAA,EAAO,SAAA,EAAW,KAAK,OAAA,EAAQ;AAC1D,QAAA,GAAA,CAAI,SAAS,KAAK,CAAA;AAClB,QAAA,GAAA,CAAI,KAAA,EAAM;AACV,QAAA,GAAA,CAAI,QAAA;AAAA,UACF,CAAA,EAAG,GAAA,CAAI,MAAA,CAAO,aAAa,CAAA,EAAA,EAAKY,mBAAAA,CAAmB,SAAA,EAAW,MAAM,CAAC,CAAA,QAAA,EAAMA,mBAAAA,CAAmB,OAAA,EAAS,MAAM,CAAC,CAAA;AAAA,SAChH;AAAA,MACF,CAAA,MAAO;AAIL,QAAA,MAAM,kBAAkB,eAAA,KAAoB,OAAA;AAC5C,QAAA,MAAM,gBAAgB,KAAA,CAAM,KAAA;AAC5B,QAAA,GAAA,CAAI,WAAW,GAAG,CAAA;AAClB,QAAA,MAAM,SAAA,GAAYA,mBAAAA,CAAmB,GAAA,EAAK,MAAM,CAAA;AAChD,QAAA,IAAI,eAAA,EAAiB;AACnB,UAAA,GAAA,CAAI,SAAS,CAAA,EAAG,SAAS,KAAK,GAAA,CAAI,MAAA,CAAO,YAAY,CAAA,CAAE,CAAA;AAAA,QACzD,WAAW,aAAA,EAAe;AAGxB,UAAA,MAAM,CAAC,KAAA,EAAO,GAAG,CAAA,GAAI,QAAQ,QAAA,CAAS,GAAA,EAAK,aAAa,CAAA,GACpD,CAAC,GAAA,EAAK,aAAa,CAAA,GACnB,CAAC,eAAe,GAAG,CAAA;AACvB,UAAA,GAAA,CAAI,QAAA;AAAA,YACF,CAAA,EAAG,GAAA,CAAI,MAAA,CAAO,aAAa,CAAA,EAAA,EAAKA,mBAAAA,CAAmB,KAAA,EAAO,MAAM,CAAC,CAAA,QAAA,EAAMA,mBAAAA,CAAmB,GAAA,EAAK,MAAM,CAAC,CAAA;AAAA,WACxG;AAAA,QACF,CAAA,MAAO;AAGL,UAAA,GAAA,CAAI,SAAS,SAAS,CAAA;AAAA,QACxB;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,CAAC,eAAe,OAAA,EAAS,YAAA,EAAc,KAAK,MAAA,EAAQ,eAAA,EAAiB,MAAM,KAAK;AAAA,GAClF;AAEA,EAAA,MAAM,cAAA,GAAiBZ,WAAAA;AAAA,IACrB,CAAC,GAAA,KAAqB;AACpB,MAAA,IAAI,IAAI,UAAA,EAAY;AACpB,MAAA,SAAA,CAAU,IAAI,SAAS,CAAA;AAAA,IACzB,CAAA;AAAA,IACA,CAAC,SAAS;AAAA,GACZ;AAEA,EAAA,MAAM,mBAAA,GAAsBA,WAAAA;AAAA,IAC1B,CAAC,GAAA,KAAqB;AAEpB,MAAA,IAAI,kBAAkB,MAAA,EAAQ;AAC9B,MAAA,IAAI,oBAAoB,KAAA,IAAS,KAAA,CAAM,KAAA,IAAS,CAAC,IAAI,UAAA,EAAY;AAC/D,QAAA,GAAA,CAAI,YAAA,CAAa,IAAI,SAAS,CAAA;AAAA,MAChC;AAAA,IACF,CAAA;AAAA,IACA,CAAC,aAAA,EAAe,eAAA,EAAiB,KAAA,CAAM,OAAO,GAAG;AAAA,GACnD;AAEA,EAAA,MAAM,gBAAA,GAAmBA,YAAY,MAAM;AACzC,IAAA,GAAA,CAAI,aAAa,IAAI,CAAA;AAAA,EACvB,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAER,EAAA,MAAM,aAAA,GAAgBA,WAAAA;AAAA,IACpB,CAAC,CAAA,KAA2B;AAC1B,MAAA,IAAI,UAAA,GAA4B,IAAA;AAEhC,MAAA,QAAQ,EAAE,GAAA;AAAK,QACb,KAAK,WAAA;AACH,UAAA,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,WAAA,EAAa,EAAE,CAAA;AAC5C,UAAA;AAAA,QACF,KAAK,YAAA;AACH,UAAA,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,WAAA,EAAa,CAAC,CAAA;AAC3C,UAAA;AAAA,QACF,KAAK,SAAA;AACH,UAAA,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,WAAA,EAAa,EAAE,CAAA;AAC5C,UAAA;AAAA,QACF,KAAK,WAAA;AACH,UAAA,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,WAAA,EAAa,CAAC,CAAA;AAC3C,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,UAAA,GAAa,CAAA,CAAE,QAAA,GACX,OAAA,CAAQ,QAAA,CAAS,WAAA,EAAa,EAAE,CAAA,GAChC,OAAA,CAAQ,SAAA,CAAU,WAAA,EAAa,EAAE,CAAA;AACrC,UAAA;AAAA,QACF,KAAK,UAAA;AACH,UAAA,UAAA,GAAa,CAAA,CAAE,QAAA,GACX,OAAA,CAAQ,QAAA,CAAS,WAAA,EAAa,CAAC,CAAA,GAC/B,OAAA,CAAQ,SAAA,CAAU,WAAA,EAAa,CAAC,CAAA;AACpC,UAAA;AAAA,QACF,KAAK,MAAA;AACH,UAAA,UAAA,GAAa,OAAA,CAAQ,WAAA,CAAY,WAAA,EAAa,YAAY,CAAA;AAC1D,UAAA;AAAA,QACF,KAAK,KAAA;AACH,UAAA,UAAA,GAAa,QAAQ,UAAA,CAAW,OAAA,CAAQ,SAAA,CAAU,WAAA,EAAa,YAAY,CAAC,CAAA;AAC5E,UAAA;AAAA,QACF,KAAK,OAAA;AAAA,QACL,KAAK,GAAA;AACH,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,IAAI,CAACiB,cAAAA,CAAe,WAAA,EAAa,QAAA,EAAU,OAAO,CAAA,EAAG;AACnD,YAAA,SAAA,CAAU,WAAW,CAAA;AAAA,UACvB;AACA,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,GAAA,CAAI,KAAA,EAAM;AACV,UAAA;AAAA,QACF;AACE,UAAA;AAAA;AAGJ,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,CAAA,CAAE,cAAA,EAAe;AAIjB,QAAA,MAAM,QAAA,GACJ,CAAA,CAAE,GAAA,KAAQ,WAAA,IAAe,CAAA,CAAE,GAAA,KAAQ,SAAA,IAAa,CAAA,CAAE,GAAA,KAAQ,QAAA,IAAY,CAAA,CAAE,GAAA,KAAQ,SAC5E,EAAA,GACA,CAAA;AACN,QAAA,IAAI,QAAA,GAAW,CAAA;AACf,QAAA,OAAOA,eAAe,UAAA,EAAY,QAAA,EAAU,OAAO,CAAA,IAAK,WAAW,EAAA,EAAI;AACrE,UAAA,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,UAAA,EAAY,QAAQ,CAAA;AACjD,UAAA,QAAA,EAAA;AAAA,QACF;AACA,QAAA,IAAI,YAAY,EAAA,EAAI;AAEpB,QAAA,GAAA,CAAI,eAAe,UAAU,CAAA;AAE7B,QAAA,IAAI,CAAC,OAAA,CAAQ,WAAA,CAAY,UAAA,EAAY,SAAS,CAAA,EAAG;AAC/C,UAAA,GAAA,CAAI,aAAa,UAAU,CAAA;AAAA,QAC7B;AAGA,QAAA,IAAI,aAAA,KAAkB,OAAA,IAAW,eAAA,KAAoB,KAAA,IAAS,MAAM,KAAA,EAAO;AACzE,UAAA,GAAA,CAAI,aAAa,UAAU,CAAA;AAAA,QAC7B;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,OAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA,QAAA;AAAA,MACA,GAAA;AAAA,MACA,aAAA;AAAA,MACA,eAAA;AAAA,MACA,KAAA,CAAM,KAAA;AAAA,MACN;AAAA;AACF,GACF;AAEA,EAAA,uBACEZ,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,YAAY,IAAA,EAAO,GAAG,KAAA,EAAO,YAAA,EAAc,gBAAA,EACzD,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,UAAA,EAAY,MAAA,EAC1B,QAAA,EAAA;AAAA,sBAAAJ,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,WAAW,UAAA,EAAY,SAAA;AAAA,UACvB,OAAA,EAAS,MAAM,aAAA,CAAc,EAAE,CAAA;AAAA,UAC/B,YAAA,EAAY,IAAI,MAAA,CAAO,SAAA;AAAA,UACxB,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,sBACAA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAW,YAAY,KAAA,EAAO,WAAA,EAAU,UAC3C,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,WAAW,UAAA,EAAY,SAAA;AAAA,UACvB,OAAA,EAAS,MAAM,aAAA,CAAc,CAAC,CAAA;AAAA,UAC9B,YAAA,EAAY,IAAI,MAAA,CAAO,SAAA;AAAA,UACxB,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF,CAAA;AAAA,oBAIAI,IAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,OAAA;AAAA,QACL,IAAA,EAAK,MAAA;AAAA,QACL,YAAA,EAAY,KAAA;AAAA,QACZ,eAAA,EAAe,MAAM,MAAA,GAAS,CAAA;AAAA,QAC9B,eAAA,EAAe,CAAA;AAAA,QACf,WAAW,UAAA,EAAY,IAAA;AAAA,QACvB,SAAA,EAAW,aAAA;AAAA,QAEX,QAAA,EAAA;AAAA,0BAAAJ,GAAAA,CAAC,WACC,QAAA,kBAAAI,IAAAA,CAAC,QAAG,IAAA,EAAK,KAAA,EAAM,iBAAe,CAAA,EAC3B,QAAA,EAAA;AAAA,YAAA,cAAA,mBACCJ,GAAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAM,KAAA,EAAM,aAAA,EAAY,MAAA,EAAO,SAAA,EAAW,UAAA,EAAY,gBAAA,EAAkB,QAAA,EAAA,GAAA,EAE5E,CAAA,GACE,IAAA;AAAA,YACH,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,EAAK,6BAClBA,GAAAA;AAAA,cAAC,IAAA;AAAA,cAAA;AAAA,gBAEC,IAAA,EAAK,cAAA;AAAA,gBACL,MAAM,GAAA,CAAI,IAAA;AAAA,gBACV,KAAA,EAAM,KAAA;AAAA,gBACN,iBAAe,QAAA,GAAW,CAAA;AAAA,gBAC1B,WAAW,UAAA,EAAY,aAAA;AAAA,gBAEtB,QAAA,EAAA,GAAA,CAAI;AAAA,eAAA;AAAA,cAPA,GAAA,CAAI;AAAA,aASZ;AAAA,WAAA,EACH,CAAA,EACF,CAAA;AAAA,0BACAA,IAAC,OAAA,EAAA,EACE,QAAA,EAAA,KAAA,CAAM,IAAI,CAAC,IAAA,EAAM,8BAChBI,IAAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cAEC,IAAA,EAAK,KAAA;AAAA,cACL,iBAAe,SAAA,GAAY,CAAA;AAAA,cAC3B,WAAW,UAAA,EAAY,OAAA;AAAA,cAEtB,QAAA,EAAA;AAAA,gBAAA,cAAA,mBACCJ,GAAAA;AAAA,kBAAC,IAAA;AAAA,kBAAA;AAAA,oBACC,KAAA,EAAM,KAAA;AAAA,oBACN,aAAA,EAAY,MAAA;AAAA,oBACZ,WAAW,UAAA,EAAY,UAAA;AAAA,oBACvB,kBAAA,EAAgB,IAAA;AAAA,oBAEf,QAAA,EAAAiB,gBAAAA,CAAiB,IAAA,CAAK,aAAa,EAAG,SAAS;AAAA;AAAA,iBAClD,GACE,IAAA;AAAA,gBACH,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,QAAA,KAAa;AAC3B,kBAAA,MAAM,UAAA,GACJ;AAAA,oBACE,UAAA,EAAY,GAAA;AAAA,oBACZ,GAAA,CAAI,gBAAgB,UAAA,EAAY,aAAA;AAAA,oBAChC,GAAA,CAAI,cAAc,UAAA,EAAY,WAAA;AAAA,oBAC9B,GAAA,CAAI,aAAa,UAAA,EAAY,UAAA;AAAA,oBAC7B,GAAA,CAAI,WAAW,UAAA,EAAY,QAAA;AAAA,oBAC3B,GAAA,CAAI,cAAc,UAAA,EAAY,WAAA;AAAA,oBAC9B,CAAC,GAAA,CAAI,cAAA,IAAkB,UAAA,EAAY;AAAA,oBAElC,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,GAAG,CAAA,IAAK,MAAA;AAElB,kBAAA,MAAM,UAAA,GACJ,aAAA,KAAkB,MAAA,GACd,GAAA,CAAI,YAAA,IAAgB,GAAA,CAAI,UAAA,IAAc,GAAA,CAAI,SAAA,GAC1C,GAAA,CAAI,YAAA,IAAgB,GAAA,CAAI,UAAA;AAE9B,kBAAA,uBACEjB,GAAAA;AAAA,oBAAC,IAAA;AAAA,oBAAA;AAAA,sBAEC,IAAA,EAAK,UAAA;AAAA,sBACL,iBAAe,QAAA,GAAW,CAAA;AAAA,sBAC1B,iBAAe,UAAA,IAAc,MAAA;AAAA,sBAC7B,eAAA,EAAe,IAAI,UAAA,IAAc,MAAA;AAAA,sBACjC,cAAA,EAAc,GAAA,CAAI,OAAA,GAAU,MAAA,GAAS,MAAA;AAAA,sBACrC,WAAW,UAAA,EAAY,QAAA;AAAA,sBAEvB,QAAA,kBAAAA,GAAAA;AAAA,wBAAC,QAAA;AAAA,wBAAA;AAAA,0BACC,IAAA,EAAK,QAAA;AAAA,0BACL,QAAA,EAAU,GAAA,CAAI,SAAA,GAAY,CAAA,GAAI,EAAA;AAAA,0BAC9B,UAAU,GAAA,CAAI,UAAA;AAAA,0BACd,cAAA,EAAc,IAAI,SAAA,IAAa,MAAA;AAAA,0BAC/B,kBAAA,EAAkB,IAAI,YAAA,IAAgB,MAAA;AAAA,0BACtC,gBAAA,EAAgB,IAAI,UAAA,IAAc,MAAA;AAAA,0BAClC,eAAA,EAAe,IAAI,SAAA,IAAa,MAAA;AAAA,0BAChC,YAAA,EAAY,IAAI,OAAA,IAAW,MAAA;AAAA,0BAC3B,oBAAA,EAAoB,CAAC,GAAA,CAAI,cAAA,IAAkB,MAAA;AAAA,0BAC3C,SAAA,EAAW,UAAA;AAAA,0BACX,OAAA,EAAS,MAAM,cAAA,CAAe,GAAG,CAAA;AAAA,0BACjC,YAAA,EAAc,MAAM,mBAAA,CAAoB,GAAG,CAAA;AAAA,0BAC3C,YAAA,EAAYW,mBAAAA,CAAmB,GAAA,CAAI,SAAA,EAAW,MAAM,CAAA;AAAA,0BAEnD,QAAA,EAAA,GAAA,CAAI;AAAA;AAAA;AACP,qBAAA;AAAA,oBAxBK,GAAA,CAAI;AAAA,mBAyBX;AAAA,gBAEJ,CAAC;AAAA;AAAA,aAAA;AAAA,YA/DI;AAAA,WAiER,CAAA,EACH;AAAA;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;AChYO,SAAS,mBAAmB,EAAE,UAAA,EAAY,QAAA,EAAU,GAAG,OAAM,EAA4B;AAC9F,EAAA,MAAM,GAAA,GAAM,sBAAsB,qBAAqB,CAAA;AACvD,EAAA,uBACEX,GAAAA,CAAC,KAAA,EAAA,EAAI,IAAA,EAAK,SAAQ,YAAA,EAAY,GAAA,CAAI,MAAA,CAAO,YAAA,EAAc,SAAA,EAAW,UAAA,EAAY,IAAA,EAAO,GAAG,OACrF,QAAA,EACH,CAAA;AAEJ;AAcA,SAAS,aAAA,CACP,GAAA,EACA,KAAA,EACA,OAAA,EAUW;AACX,EAAA,QAAQ,GAAA;AAAK,IACX,KAAK,OAAA;AACH,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,GAAA,EAAK,KAAA,EAAM;AAAA,IACpC,KAAK,WAAA,EAAa;AAChB,MAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAC3C,MAAA,OAAO,EAAE,KAAA,EAAO,SAAA,EAAW,GAAA,EAAK,SAAA,EAAU;AAAA,IAC5C;AAAA,IACA,KAAK,WAAA;AACH,MAAA,OAAO,EAAE,OAAO,OAAA,CAAQ,OAAA,CAAQ,OAAO,EAAE,CAAA,EAAG,KAAK,KAAA,EAAM;AAAA,IACzD,KAAK,YAAA;AACH,MAAA,OAAO,EAAE,OAAO,OAAA,CAAQ,OAAA,CAAQ,OAAO,GAAG,CAAA,EAAG,KAAK,KAAA,EAAM;AAAA,IAC1D,KAAK,UAAA;AACH,MAAA,OAAO;AAAA,QACL,OAAO,OAAA,CAAQ,UAAA,CAAW,OAAA,CAAQ,WAAA,CAAY,KAAK,CAAC,CAAA;AAAA,QACpD,KAAK,OAAA,CAAQ,UAAA,CAAW,OAAA,CAAQ,SAAA,CAAU,KAAK,CAAC;AAAA,OAClD;AAAA,IACF,KAAK,UAAA,EAAY;AACf,MAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAC1C,MAAA,OAAO;AAAA,QACL,OAAO,OAAA,CAAQ,UAAA,CAAW,OAAA,CAAQ,WAAA,CAAY,QAAQ,CAAC,CAAA;AAAA,QACvD,KAAK,OAAA,CAAQ,UAAA,CAAW,OAAA,CAAQ,SAAA,CAAU,QAAQ,CAAC;AAAA,OACrD;AAAA,IACF;AAAA,IACA,KAAK,WAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,OAAA,CAAQ,YAAA,CAAa,KAAK,CAAA;AAAA,QACjC,KAAK,OAAA,CAAQ,UAAA,CAAW,OAAA,CAAQ,UAAA,CAAW,KAAK,CAAC;AAAA,OACnD;AAAA,IACF,KAAK,WAAA,EAAa;AAChB,MAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,SAAA,CAAU,KAAA,EAAO,EAAE,CAAA;AAC7C,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,OAAA,CAAQ,YAAA,CAAa,SAAS,CAAA;AAAA,QACrC,KAAK,OAAA,CAAQ,UAAA,CAAW,OAAA,CAAQ,UAAA,CAAW,SAAS,CAAC;AAAA,OACvD;AAAA,IACF;AAAA,IACA,KAAK,UAAA,EAAY;AAEf,MAAA,MAAM,YAAA,GAAe,IAAI,IAAA,CAAK,KAAK,EAAE,WAAA,EAAY;AACjD,MAAA,MAAM,SAAA,GAAY,QAAQ,YAAA,CAAa,OAAA,CAAQ,UAAU,KAAA,EAAO,CAAC,YAAY,CAAC,CAAA;AAC9E,MAAA,OAAO,EAAE,KAAA,EAAO,SAAA,EAAW,GAAA,EAAK,KAAA,EAAM;AAAA,IACxC;AAAA;AAEJ;AAeO,SAAS,iBAAA,CAAkB;AAAA,EAChC,KAAA,EAAO,SAAA;AAAA,EACP,KAAA,EAAO,WAAA;AAAA,EACP,QAAA;AAAA,EACA,OAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA2B;AACzB,EAAA,MAAM,GAAA,GAAM,sBAAsB,oBAAoB,CAAA;AAKtD,EAAA,MAAM,QAAA,GAAWG,QAA0B,MAAM;AAC/C,IAAA,IAAI,aAAa,OAAO,WAAA;AACxB,IAAA,IAAI,SAAA;AACF,MAAA,OAAO,aAAA,CAAc,WAAW,GAAA,CAAI,OAAA,CAAQ,MAAM,GAAA,CAAI,eAAe,CAAA,EAAG,GAAA,CAAI,OAAO,CAAA;AACrF,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,EAAG,CAAC,WAAA,EAAa,SAAA,EAAW,IAAI,OAAA,EAAS,GAAA,CAAI,eAAe,CAAC,CAAA;AAE7D,EAAA,MAAM,WAAA,GAAcJ,WAAAA;AAAA,IAClB,CAAC,CAAA,KAA2C;AAC1C,MAAA,IAAI,GAAA,CAAI,UAAA,IAAc,GAAA,CAAI,UAAA,EAAY;AACtC,MAAA,IAAI,CAAC,QAAA,EAAU;AAEf,MAAA,GAAA,CAAI,SAAS,QAAQ,CAAA;AACrB,MAAA,GAAA,CAAI,KAAA,EAAM;AACV,MAAA,OAAA,GAAU,CAAC,CAAA;AAAA,IACb,CAAA;AAAA,IACA,CAAC,GAAA,EAAK,QAAA,EAAU,OAAO;AAAA,GACzB;AAGA,EAAA,MAAM,QAAA,GAAWI,QAAQ,MAAM;AAC7B,IAAA,IAAI,CAAC,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,CAAC,GAAA,CAAI,KAAA,CAAM,GAAA,IAAO,CAAC,YAAY,CAAC,QAAA,CAAS,KAAA,IAAS,CAAC,SAAS,GAAA,EAAK;AACvF,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,OACE,IAAI,OAAA,CAAQ,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,OAAO,QAAA,CAAS,KAAK,CAAA,IACrD,GAAA,CAAI,QAAQ,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,GAAA,EAAK,SAAS,GAAG,CAAA;AAAA,EAErD,CAAA,EAAG,CAAC,GAAA,CAAI,KAAA,CAAM,KAAA,EAAO,GAAA,CAAI,KAAA,CAAM,GAAA,EAAK,GAAA,CAAI,OAAA,EAAS,QAAQ,CAAC,CAAA;AAI1D,EAAA,uBACEH,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,cAAA,EAAc,QAAA;AAAA,MACd,eAAa,QAAA,IAAY,MAAA;AAAA,MACzB,UAAU,GAAA,CAAI,UAAA;AAAA,MACd,OAAA,EAAS,WAAA;AAAA,MACR,GAAG,KAAA;AAAA,MAEH;AAAA;AAAA,GACH;AAEJ;;;AC7IO,IAAM,WAAA,GAAc,MAAA,CAAO,MAAA,CAAO,eAAA,EAAiB;AAAA,EACxD,KAAA,EAAO,gBAAA;AAAA,EACP,OAAA,EAAS,kBAAA;AAAA,EACT,QAAA,EAAU,mBAAA;AAAA,EACV,OAAA,EAAS,kBAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAC;ACZM,IAAM,iBAAA,GAAoBK,cAA6C,IAAI,CAAA;AAM3E,SAAS,qBAAqB,aAAA,EAA+C;AAClF,EAAA,MAAM,OAAA,GAAUC,WAAW,iBAAiB,CAAA;AAC5C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,IAAI,aAAa,CAAA;;AAAA;AAAA;AAAA,gBAAA,EAGI,aAAA,CAAc,OAAA,CAAQ,aAAA,EAAe,EAAE,CAAC,CAAA;AAAA,eAAA;AAAA,KAE/D;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;ACIO,SAAS,cAAA,CAAe;AAAA,EAC7B,KAAA,EAAO,eAAA;AAAA,EACP,YAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA,GAAS,KAAA;AAAA,EACT,IAAA,GAAO,CAAA;AAAA,EACP,WAAA,GAAc,KAAA;AAAA,EACd,eAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,QAAA,GAAW,KAAA;AAAA,EACX,UAAA;AAAA,EACA,MAAA,EAAQ,UAAA;AAAA,EACR;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,WAAWE,KAAAA,EAAM;AACvB,EAAA,MAAM,YAAA,GAAeL,OAAAA;AAAA,IACnB,OAAO,EAAE,GAAG,yBAAA,EAA2B,GAAG,UAAA,EAAW,CAAA;AAAA,IACrD,CAAC,UAAU;AAAA,GACb;AACA,EAAA,MAAM,YAAA,GAAeR,MAAAA,CAAO,eAAA,KAAoB,MAAS,CAAA,CAAE,OAAA;AAE3D,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIE,QAAAA;AAAA,IAChD,YAAA,IAAgB;AAAA,GAClB;AAEA,EAAA,MAAM,YAAA,GAAe,YAAA,GAAgB,eAAA,IAAmB,IAAA,GAAQ,iBAAA;AAIhE,EAAA,MAAM,WAAA,GAAcM,QAAQ,MAAM;AAChC,IAAA,IAAI,CAAC,cAAc,OAAO,EAAE,OAAO,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,OAAA,EAAS,CAAA,EAAE;AAC7D,IAAA,OAAO,kBACH,iBAAA,CAAkB,YAAA,EAAc,eAAe,CAAA,GAC/C,QAAQ,YAAY,CAAA;AAAA,EAC1B,CAAA,EAAG,CAAC,YAAA,EAAc,eAAe,CAAC,CAAA;AAElC,EAAA,MAAMe,SAAA,GAAUnB,WAAAA;AAAA,IACd,CAAC,OAAA,KAAgC;AAC/B,MAAA,IAAI,YAAY,QAAA,EAAU;AAC1B,MAAA,MAAM,IAAA,GAAO,YAAA,IAAgBQ,cAAAA,CAAe,KAAA,CAAM,eAAe,CAAA;AACjE,MAAA,MAAM,MAAA,GAAS,kBACX,iBAAA,CAAkB,IAAA,EAAM,SAAS,eAAe,CAAA,GAChDY,OAAA,CAAa,IAAA,EAAM,OAAO,CAAA;AAC9B,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,oBAAA,CAAqB,MAAM,CAAA;AAAA,MAC7B;AACA,MAAA,QAAA,GAAW,MAAM,CAAA;AAAA,IACnB,CAAA;AAAA,IACA,CAAC,QAAA,EAAU,QAAA,EAAU,YAAA,EAAc,eAAA,EAAiB,cAAc,QAAQ;AAAA,GAC5E;AAEA,EAAA,MAAM,YAAA,GAAuChB,OAAAA;AAAA,IAC3C,OAAO;AAAA,MACL,KAAA,EAAO,YAAA;AAAA,eACPe,SAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAA;AAAA,MACA,WAAA;AAAA,MACA,eAAA;AAAA,MACA,UAAA,EAAY,QAAA;AAAA,MACZ,UAAA,EAAY,QAAA;AAAA,MACZ,WAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA,EAAQ,YAAA;AAAA,MACR;AAAA,KACF,CAAA;AAAA,IACA;AAAA,MACE,YAAA;AAAA,MACAA,SAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAA;AAAA,MACA,WAAA;AAAA,MACA,eAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,uBAAOlB,GAAAA,CAAC,iBAAA,CAAkB,UAAlB,EAA2B,KAAA,EAAO,cAAe,QAAA,EAAS,CAAA;AACpE;ACpIO,IAAM,eAAA,GAAkBC,UAAAA;AAAA,EAC7B,SAASmB,iBAAgB,EAAE,MAAA,EAAQ,WAAW,GAAG,KAAA,IAAS,GAAA,EAAK;AAC7D,IAAA,MAAM,GAAA,GAAM,qBAAqB,kBAAkB,CAAA;AACnD,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIvB,SAAwB,IAAI,CAAA;AAM9D,IAAAC,UAAU,MAAM;AACd,MAAA,YAAA,CAAa,IAAI,CAAA;AAAA,IACnB,CAAA,EAAG,CAAC,GAAA,CAAI,KAAK,CAAC,CAAA;AAEd,IAAA,MAAM,YAAA,GACJ,cAAc,IAAA,GAAO,SAAA,GAAY,iBAAiB,GAAA,CAAI,WAAA,EAAa,IAAI,WAAW,CAAA;AAEpF,IAAA,MAAM,WAAA,GAAcC,YAAY,MAAM;AACpC,MAAA,IAAI,cAAc,IAAA,EAAM;AACxB,MAAA,MAAM,MAAA,GAAS,gBAAgB,SAAS,CAAA;AACxC,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,GAAA,CAAI,QAAQ,MAAM,CAAA;AAAA,MACpB;AACA,MAAA,YAAA,CAAa,IAAI,CAAA;AAAA,IACnB,CAAA,EAAG,CAAC,SAAA,EAAW,GAAG,CAAC,CAAA;AAEnB,IAAA,MAAM,YAAA,GAAeA,WAAAA,CAAY,CAAC,CAAA,KAA2C;AAC3E,MAAA,YAAA,CAAa,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,IAC7B,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,MAAM,UAAA,GAAaA,WAAAA;AAAA,MACjB,CAAC,CAAA,KAA0C;AACzC,QAAA,WAAA,EAAY;AACZ,QAAA,MAAA,GAAS,CAAC,CAAA;AAAA,MACZ,CAAA;AAAA,MACA,CAAC,aAAa,MAAM;AAAA,KACtB;AAEA,IAAA,MAAM,aAAA,GAAgBA,WAAAA;AAAA,MACpB,CAAC,CAAA,KAA6C;AAC5C,QAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACrB,UAAA,WAAA,EAAY;AAAA,QACd;AACA,QAAA,SAAA,GAAY,CAAC,CAAA;AAAA,MACf,CAAA;AAAA,MACA,CAAC,aAAa,SAAS;AAAA,KACzB;AAEA,IAAA,uBACEC,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,MAAA;AAAA,QACL,SAAA,EAAU,SAAA;AAAA,QACV,YAAA,EAAa,KAAA;AAAA,QACb,YAAA,EAAY,IAAI,MAAA,CAAO,SAAA;AAAA,QACvB,WAAA,EAAa,GAAA,CAAI,WAAA,GAAc,UAAA,GAAa,OAAA;AAAA,QAC5C,KAAA,EAAO,YAAA;AAAA,QACP,QAAA,EAAU,GAAA,CAAI,UAAA,IAAc,KAAA,CAAM,QAAA;AAAA,QAClC,UAAU,GAAA,CAAI,UAAA;AAAA,QACd,QAAA,EAAU,YAAA;AAAA,QACV,MAAA,EAAQ,UAAA;AAAA,QACR,SAAA,EAAW,aAAA;AAAA,QACV,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF,CAAA;AAEA,eAAA,CAAgB,WAAA,GAAc,kBAAA;AC5DvB,SAAS,oBAAA,CAAwB;AAAA,EACtC,KAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA,GAAW;AACb,CAAA,EAAkE;AAChE,EAAA,MAAM,OAAA,GAAUL,OAAyB,IAAI,CAAA;AAC7C,EAAA,MAAM,QAAA,GAAWA,OAAe,CAAC,CAAA;AAGjC,EAAAG,UAAU,MAAM;AACd,IAAA,OAAO,MAAM,oBAAA,CAAqB,QAAA,CAAS,OAAO,CAAA;AAAA,EACpD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgBC,WAAAA;AAAA,IACpB,CAAC,GAAiC,IAAA,KAAY;AAC5C,MAAA,IAAI,QAAA,EAAU;AACd,MAAA,MAAM,YAAA,GAAe,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA;AAEvC,MAAA,IAAI,QAAA,GAAW,EAAA;AACf,MAAA,IAAI,CAAA,CAAE,QAAQ,WAAA,EAAa;AACzB,QAAA,QAAA,GAAW,KAAK,GAAA,CAAI,YAAA,GAAe,CAAA,EAAG,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA,MACxD,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,SAAA,EAAW;AAC9B,QAAA,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,YAAA,GAAe,CAAA,EAAG,CAAC,CAAA;AAAA,MACzC,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,MAAA,EAAQ;AAC3B,QAAA,QAAA,GAAW,CAAA;AAAA,MACb,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,KAAA,EAAO;AAC1B,QAAA,QAAA,GAAW,MAAM,MAAA,GAAS,CAAA;AAAA,MAC5B,WAAW,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AAC7C,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,QAAA,CAAS,IAAI,CAAA;AACb,QAAA;AAAA,MACF,CAAA,MAAO;AACL,QAAA;AAAA,MACF;AAEA,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,MAAM,MAAA,GAAS,MAAM,QAAQ,CAAA;AAC7B,MAAA,IAAI,WAAW,MAAA,EAAW;AACxB,QAAA,QAAA,CAAS,MAAM,CAAA;AACf,QAAA,oBAAA,CAAqB,SAAS,OAAO,CAAA;AACrC,QAAA,QAAA,CAAS,OAAA,GAAU,sBAAsB,MAAM;AAC7C,UAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,EAAS,aAAA,CAA6B,wBAAwB,CAAA;AACnF,UAAA,IAAA,EAAM,KAAA,EAAM;AAAA,QACd,CAAC,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAAA,IACA,CAAC,KAAA,EAAO,QAAA,EAAU,QAAQ;AAAA,GAC5B;AAEA,EAAA,OAAO,EAAE,SAAS,aAAA,EAAc;AAClC;AC7CO,SAAS,kBAAA,CAAmB,EAAE,UAAA,EAAY,GAAG,OAAM,EAA4B;AACpF,EAAA,MAAM,GAAA,GAAM,qBAAqB,qBAAqB,CAAA;AACtD,EAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,aAAa,UAAA,EAAY,UAAA,EAAY,YAAW,GAAI,GAAA;AAI1E,EAAA,MAAM,KAAA,GAAQI,QAAQ,MAAM,aAAA,CAAc,MAAM,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAE3D,EAAA,MAAM,mBAAA,GACJ,WAAW,KAAA,GAAQ,QAAA,CAAS,YAAY,KAAK,CAAA,CAAE,UAAU,WAAA,CAAY,KAAA;AAEvE,EAAA,MAAM,gBAAgB,MAAA,KAAW,KAAA,GAAQ,SAAS,WAAA,CAAY,KAAK,EAAE,MAAA,GAAS,IAAA;AAI9E,EAAA,MAAM,oBAAA,GAAuBA,QAAQ,MAAM;AACzC,IAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AACxB,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,MAAA,IAAI,WAAA,GAAc,IAAA;AAClB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,KAAK,IAAA,EAAM;AACjC,QAAA,IAAI,CAAC,UAAA,CAAW,CAAA,EAAG,CAAC,CAAA,EAAG;AACrB,UAAA,WAAA,GAAc,KAAA;AACd,UAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,IAAI,WAAA,EAAa,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA;AAAA,IACjC;AACA,IAAA,OAAO,QAAA;AAAA,EACT,CAAA,EAAG,CAAC,UAAA,EAAY,IAAI,CAAC,CAAA;AAErB,EAAA,MAAM,cAAA,GAAiBJ,WAAAA;AAAA,IACrB,CAAC,WAAA,KAAwB;AACvB,MAAA,IAAI,CAAC,sBAAsB,OAAO,KAAA;AAClC,MAAA,MAAM,UACJ,MAAA,KAAW,KAAA,IAAS,gBAAgB,QAAA,CAAS,WAAA,EAAa,aAAa,CAAA,GAAI,WAAA;AAC7E,MAAA,OAAO,oBAAA,CAAqB,IAAI,OAAO,CAAA;AAAA,IACzC,CAAA;AAAA,IACA,CAAC,oBAAA,EAAsB,MAAA,EAAQ,aAAa;AAAA,GAC9C;AAEA,EAAA,MAAM,YAAA,GAAeA,WAAAA;AAAA,IACnB,CAAC,WAAA,KAAwB;AACvB,MAAA,IAAI,cAAc,UAAA,EAAY;AAC9B,MAAA,IAAI,cAAA,CAAe,WAAW,CAAA,EAAG;AACjC,MAAA,MAAM,UACJ,MAAA,KAAW,KAAA,IAAS,gBAAgB,QAAA,CAAS,WAAA,EAAa,aAAa,CAAA,GAAI,WAAA;AAC7E,MAAA,GAAA,CAAI,OAAA,CAAQ,EAAE,KAAA,EAAO,OAAA,EAAS,CAAA;AAAA,IAChC,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,aAAA,EAAe,GAAA,EAAK,UAAA,EAAY,YAAY,cAAc;AAAA,GACrE;AAEA,EAAA,MAAM,EAAE,OAAA,EAAS,aAAA,EAAc,GAAI,oBAAA,CAAqB;AAAA,IACtD,KAAA,EAAO,KAAA;AAAA,IACP,QAAA,EAAU,YAAA;AAAA,IACV,UAAU,UAAA,IAAc;AAAA,GACzB,CAAA;AAED,EAAA,uBACEC,GAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,OAAA;AAAA,MACL,IAAA,EAAK,SAAA;AAAA,MACL,YAAA,EAAY,IAAI,MAAA,CAAO,QAAA;AAAA,MACvB,iBAAe,UAAA,IAAc,MAAA;AAAA,MAC7B,WAAW,UAAA,EAAY,IAAA;AAAA,MACtB,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACnB,QAAA,MAAM,aAAa,IAAA,KAAS,mBAAA;AAC5B,QAAA,MAAM,mBAAA,GAAsB,eAAe,IAAI,CAAA;AAC/C,QAAA,MAAM,WAAA,GACJ,CAAC,UAAA,EAAY,MAAA,EAAQ,UAAA,IAAc,UAAA,EAAY,cAAc,CAAA,CAC1D,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,GAAG,CAAA,IAAK,MAAA;AAElB,QAAA,uBACEA,GAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,QAAA;AAAA,YACL,eAAA,EAAe,UAAA;AAAA,YACf,eAAA,EAAe,cAAc,mBAAA,IAAuB,MAAA;AAAA,YACpD,YAAA,EAAY,GAAA,CAAI,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAAA,YACtC,iBAAe,UAAA,IAAc,MAAA;AAAA,YAC7B,QAAA,EAAU,aAAa,CAAA,GAAI,EAAA;AAAA,YAC3B,SAAA,EAAW,WAAA;AAAA,YACX,OAAA,EAAS,MAAM,YAAA,CAAa,IAAI,CAAA;AAAA,YAChC,SAAA,EAAW,CAAC,CAAA,KAAM,aAAA,CAAc,GAAG,IAAI,CAAA;AAAA,YAEtC,QAAA,EAAA,MAAA,CAAO,IAAI,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG;AAAA,WAAA;AAAA,UAXxB;AAAA,SAYP;AAAA,MAEJ,CAAC;AAAA;AAAA,GACH;AAEJ;ACjGO,SAAS,oBAAA,CAAqB,EAAE,UAAA,EAAY,GAAG,OAAM,EAA8B;AACxF,EAAA,MAAM,GAAA,GAAM,qBAAqB,uBAAuB,CAAA;AACxD,EAAA,MAAM,EAAE,IAAA,EAAM,WAAA,EAAa,UAAA,EAAY,UAAA,EAAY,YAAW,GAAI,GAAA;AAIlE,EAAA,MAAM,OAAA,GAAUG,QAAQ,MAAM,eAAA,CAAgB,IAAI,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAE3D,EAAA,MAAM,gBAAA,GAAmBJ,WAAAA;AAAA,IACvB,CAAC,MAAA,KAAmB;AAClB,MAAA,IAAI,CAAC,YAAY,OAAO,KAAA;AACxB,MAAA,OAAO,UAAA,CAAW,WAAA,CAAY,KAAA,EAAO,MAAM,CAAA;AAAA,IAC7C,CAAA;AAAA,IACA,CAAC,UAAA,EAAY,WAAA,CAAY,KAAK;AAAA,GAChC;AAEA,EAAA,MAAM,YAAA,GAAeA,WAAAA;AAAA,IACnB,CAAC,MAAA,KAAmB;AAClB,MAAA,IAAI,cAAc,UAAA,EAAY;AAC9B,MAAA,IAAI,gBAAA,CAAiB,MAAM,CAAA,EAAG;AAC9B,MAAA,GAAA,CAAI,OAAA,CAAQ,EAAE,OAAA,EAAS,MAAA,EAAQ,CAAA;AAAA,IACjC,CAAA;AAAA,IACA,CAAC,GAAA,EAAK,UAAA,EAAY,UAAA,EAAY,gBAAgB;AAAA,GAChD;AAEA,EAAA,MAAM,EAAE,OAAA,EAAS,aAAA,EAAc,GAAI,oBAAA,CAAqB;AAAA,IACtD,KAAA,EAAO,OAAA;AAAA,IACP,QAAA,EAAU,YAAA;AAAA,IACV,UAAU,UAAA,IAAc;AAAA,GACzB,CAAA;AAED,EAAA,uBACEC,GAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,OAAA;AAAA,MACL,IAAA,EAAK,SAAA;AAAA,MACL,YAAA,EAAY,IAAI,MAAA,CAAO,UAAA;AAAA,MACvB,iBAAe,UAAA,IAAc,MAAA;AAAA,MAC7B,WAAW,UAAA,EAAY,IAAA;AAAA,MACtB,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AACvB,QAAA,MAAM,UAAA,GAAa,WAAW,WAAA,CAAY,OAAA;AAC1C,QAAA,MAAM,qBAAA,GAAwB,iBAAiB,MAAM,CAAA;AACrD,QAAA,MAAM,WAAA,GACJ,CAAC,UAAA,EAAY,MAAA,EAAQ,UAAA,IAAc,UAAA,EAAY,cAAc,CAAA,CAC1D,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,GAAG,CAAA,IAAK,MAAA;AAElB,QAAA,uBACEA,GAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,QAAA;AAAA,YACL,eAAA,EAAe,UAAA;AAAA,YACf,eAAA,EAAe,cAAc,qBAAA,IAAyB,MAAA;AAAA,YACtD,YAAA,EAAY,GAAA,CAAI,MAAA,CAAO,YAAA,CAAa,MAAM,CAAA;AAAA,YAC1C,iBAAe,UAAA,IAAc,MAAA;AAAA,YAC7B,QAAA,EAAU,aAAa,CAAA,GAAI,EAAA;AAAA,YAC3B,SAAA,EAAW,WAAA;AAAA,YACX,OAAA,EAAS,MAAM,YAAA,CAAa,MAAM,CAAA;AAAA,YAClC,SAAA,EAAW,CAAC,CAAA,KAAM,aAAA,CAAc,GAAG,MAAM,CAAA;AAAA,YAExC,QAAA,EAAA,MAAA,CAAO,MAAM,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG;AAAA,WAAA;AAAA,UAX1B;AAAA,SAYP;AAAA,MAEJ,CAAC;AAAA;AAAA,GACH;AAEJ;ACjEO,SAAS,oBAAA,CAAqB,EAAE,UAAA,EAAY,GAAG,OAAM,EAA8B;AACxF,EAAA,MAAM,GAAA,GAAM,qBAAqB,uBAAuB,CAAA;AACxD,EAAA,MAAM,KAAA,GAAQL,OAAiC,IAAI,CAAA;AACnD,EAAA,MAAM,KAAA,GAAQA,OAAiC,IAAI,CAAA;AAEnD,EAAA,MAAM,SAAA,GAAYI,WAAAA;AAAA,IAChB,CAAC,SAAA,KAA2B;AAC1B,MAAA,IAAI,GAAA,CAAI,UAAA,IAAc,GAAA,CAAI,UAAA,EAAY;AACtC,MAAA,MAAM,EAAE,OAAA,EAAQ,GAAIsB,QAAAA,CAAS,GAAA,CAAI,YAAY,KAAK,CAAA;AAClD,MAAA,MAAM,UAAA,GAAaC,QAAAA,CAAS,OAAA,EAAS,SAAS,CAAA;AAC9C,MAAA,GAAA,CAAI,OAAA,CAAQ,EAAE,KAAA,EAAO,UAAA,EAAY,CAAA;AAAA,IACnC,CAAA;AAAA,IACA,CAAC,GAAG;AAAA,GACN;AAEA,EAAA,IAAI,GAAA,CAAI,MAAA,KAAW,KAAA,EAAO,OAAO,IAAA;AAEjC,EAAA,MAAM,EAAE,MAAA,EAAO,GAAID,QAAAA,CAAS,GAAA,CAAI,YAAY,KAAK,CAAA;AAEjD,EAAA,MAAM,UAAA,GAAa,CAAC,MAAA,KAAwB;AAC1C,IAAA,CAAC,MAAA,KAAW,IAAA,GAAO,KAAA,GAAQ,KAAA,EAAO,SAAS,KAAA,EAAM;AAAA,EACnD,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,EAAqC,MAAA,KAAwB;AAClF,IAAA,QAAQ,EAAE,GAAA;AAAK,MACb,KAAK,YAAA;AAAA,MACL,KAAK,WAAA;AAAA,MACL,KAAK,WAAA;AAAA,MACL,KAAK,SAAA,EAAW;AACd,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,MAAM,IAAA,GAAoB,MAAA,KAAW,IAAA,GAAO,IAAA,GAAO,IAAA;AACnD,QAAA,SAAA,CAAU,IAAI,CAAA;AACd,QAAA,UAAA,CAAW,IAAI,CAAA;AACf,QAAA;AAAA,MACF;AAAA,MACA,KAAK,MAAA,EAAQ;AACX,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,SAAA,CAAU,IAAI,CAAA;AACd,QAAA,UAAA,CAAW,IAAI,CAAA;AACf,QAAA;AAAA,MACF;AAAA,MACA,KAAK,KAAA,EAAO;AACV,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,SAAA,CAAU,IAAI,CAAA;AACd,QAAA,UAAA,CAAW,IAAI,CAAA;AACf,QAAA;AAAA,MACF;AAAA,MACA,KAAK,GAAA;AAAA,MACL,KAAK,OAAA,EAAS;AACZ,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,SAAA,CAAU,MAAM,CAAA;AAChB,QAAA;AAAA,MACF;AAEE;AACJ,EACF,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,MAAA,KAAwB;AAC5C,IAAA,MAAM,aAAa,MAAA,KAAW,MAAA;AAC9B,IAAA,MAAM,WAAA,GACJ,CAAC,UAAA,EAAY,MAAA,EAAQ,UAAA,IAAc,UAAA,EAAY,cAAc,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,IACvF,MAAA;AAEF,IAAA,uBACErB,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,MAAA,KAAW,IAAA,GAAO,KAAA,GAAQ,KAAA;AAAA,QAC/B,IAAA,EAAK,QAAA;AAAA,QACL,IAAA,EAAK,OAAA;AAAA,QACL,cAAA,EAAc,UAAA;AAAA,QACd,QAAA,EAAU,aAAa,CAAA,GAAI,EAAA;AAAA,QAC3B,iBAAe,UAAA,IAAc,MAAA;AAAA,QAC7B,UAAU,GAAA,CAAI,UAAA;AAAA,QACd,SAAA,EAAW,WAAA;AAAA,QACX,OAAA,EAAS,MAAM,SAAA,CAAU,MAAM,CAAA;AAAA,QAC/B,SAAA,EAAW,CAAC,CAAA,KAAM,aAAA,CAAc,GAAG,MAAM,CAAA;AAAA,QAExC,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,EAEJ,CAAA;AAEA,EAAA,uBACEI,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,YAAA;AAAA,MACL,YAAA,EAAY,IAAI,MAAA,CAAO,UAAA;AAAA,MACvB,WAAW,UAAA,EAAY,IAAA;AAAA,MACtB,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,YAAA,CAAa,IAAI,CAAA;AAAA,QACjB,aAAa,IAAI;AAAA;AAAA;AAAA,GACpB;AAEJ;;;AC3FO,IAAM,UAAA,GAAa,MAAA,CAAO,MAAA,CAAO,cAAA,EAAgB;AAAA,EACtD,KAAA,EAAO,eAAA;AAAA,EACP,QAAA,EAAU,kBAAA;AAAA,EACV,UAAA,EAAY,oBAAA;AAAA,EACZ,UAAA,EAAY;AACd,CAAC;ACyEM,SAAS,kBAAA,CAAmB;AAAA,EACjC,KAAA,EAAO,eAAA;AAAA,EACP,YAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,kBAAA;AAAA,EACA,MAAA,GAAS,KAAA;AAAA,EACT,IAAA,GAAO,CAAA;AAAA,EACP,WAAA,GAAc,KAAA;AAAA,EACd,UAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,QAAA,GAAW,KAAA;AAAA,EACX,YAAA,GAAe,CAAA;AAAA,EACf,aAAA,GAAgB,kBAAA;AAAA,EAChB,MAAA,GAAS,OAAA;AAAA,EACT,eAAA;AAAA,EACA,OAAA,GAAUG,cAAAA;AAAA,EACV,MAAA,EAAQ,UAAA;AAAA,EACR;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,WAAWC,KAAAA,EAAM;AACvB,EAAA,MAAM,gBAAA,GAAmBL,OAAAA;AAAA,IACvB,OAAO,EAAE,GAAGoB,yBAAAA,EAA2B,GAAG,UAAA,EAAW,CAAA;AAAA,IACrD,CAAC,UAAU;AAAA,GACb;AACA,EAAA,MAAM,gBAAA,GAAmBpB,OAAAA;AAAA,IACvB,OAAO,EAAE,GAAGqB,yBAAAA,EAA2B,GAAG,UAAA,EAAW,CAAA;AAAA,IACrD,CAAC,UAAU;AAAA,GACb;AACA,EAAA,MAAM,YAAA,GAAe7B,MAAAA,CAAO,eAAA,KAAoB,MAAS,CAAA,CAAE,OAAA;AAC3D,EAAA,MAAM,YAAA,GAAeA,OAA2B,IAAI,CAAA;AAEpD,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIE,QAAAA;AAAA,IAChD,YAAA,IAAgB;AAAA,GAClB;AAEA,EAAA,MAAM,YAAA,GAAe,YAAA,GAAgB,eAAA,IAAmB,IAAA,GAAQ,iBAAA;AAEhE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,KAAK,CAAA;AAE1C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,QAAAA;AAAA,IAChC,MAAM,YAAA,IAAgB,OAAA,CAAQ,KAAA,CAAM,eAAe;AAAA,GACrD;AACA,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,QAAAA;AAAA,IACpC,MAAM,YAAA,IAAgB,OAAA,CAAQ,KAAA,CAAM,eAAe;AAAA,GACrD;AAEA,EAAA,eAAA,CAAgB,QAAQ,YAAY,CAAA;AACpC,EAAA,MAAM,cAAA,GAAiBM,OAAAA,CAAQ,MAAM,OAAA,CAAQ,YAAA,CAAa,SAAS,CAAA,EAAG,CAAC,SAAA,EAAW,OAAO,CAAC,CAAA;AAC1F,EAAA,eAAA,CAAgB,gBAAgB,kBAAkB,CAAA;AAElD,EAAA,MAAM,UAAA,GAAa,OAAO,QAAA,KAAa,SAAA,GAAY,QAAA,GAAW,KAAA;AAC9D,EAAA,MAAM,aAAA,GAAgCA,OAAAA;AAAA,IACpC,MAAO,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,WAAW,EAAC;AAAA,IAC7C,CAAC,QAAQ;AAAA,GACX;AAIA,EAAA,MAAM,WAAA,GAAyBA,QAAQ,MAAM;AAC3C,IAAA,IAAI,CAAC,cAAc,OAAO,EAAE,OAAO,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,OAAA,EAAS,CAAA,EAAE;AAC7D,IAAA,OAAO,kBACHsB,iBAAAA,CAAkB,YAAA,EAAc,eAAe,CAAA,GAC/CC,QAAQ,YAAY,CAAA;AAAA,EAC1B,CAAA,EAAG,CAAC,YAAA,EAAc,eAAe,CAAC,CAAA;AAElC,EAAA,MAAM,WAAA,GAAc3B,WAAAA;AAAA,IAClB,CAAC,IAAA,KAA+B;AAC9B,MAAA,IAAI,cAAc,QAAA,EAAU;AAC5B,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,oBAAA,CAAqB,IAAI,CAAA;AAAA,MAC3B;AACA,MAAA,QAAA,GAAW,IAAI,CAAA;AAAA,IACjB,CAAA;AAAA,IACA,CAAC,YAAA,EAAc,UAAA,EAAY,QAAA,EAAU,QAAQ;AAAA,GAC/C;AAMA,EAAA,MAAM,UAAA,GAAaA,WAAAA;AAAA,IACjB,CAAC,UAAA,KAAqC;AACpC,MAAA,IAAI,eAAe,IAAA,EAAM;AACvB,QAAA,WAAA,CAAY,IAAI,CAAA;AAChB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,cAAA,GAAiB,eAAA,GACnBU,uBAAAA,CAAwB,UAAA,EAAY,eAAe,CAAA,GACnD,UAAA;AAEJ,MAAA,MAAM,IAAA,GAAO,eACT,eAAA,GACEgB,iBAAAA,CAAkB,cAAc,eAAe,CAAA,GAC/CC,OAAAA,CAAQ,YAAY,CAAA,GACtB,WAAA;AACJ,MAAA,MAAM,MAAA,GAAS,kBACXC,iBAAAA,CAAkB,cAAA,EAAgB,MAAM,eAAe,CAAA,GACvDR,OAAAA,CAAa,cAAA,EAAgB,IAAI,CAAA;AACrC,MAAA,WAAA,CAAY,MAAM,CAAA;AAAA,IACpB,CAAA;AAAA,IACA,CAAC,YAAA,EAAc,WAAA,EAAa,WAAA,EAAa,eAAe;AAAA,GAC1D;AAKA,EAAA,MAAMD,SAAA,GAAUnB,WAAAA;AAAA,IACd,CAAC,OAAA,KAAgC;AAG/B,MAAA,MAAM,IAAA,GAAO,YAAA,IAAgB,OAAA,CAAQ,KAAA,CAAM,eAAe,CAAA;AAC1D,MAAA,MAAM,MAAA,GAAS,kBACX4B,iBAAAA,CAAkB,IAAA,EAAM,SAAS,eAAe,CAAA,GAChDR,OAAAA,CAAa,IAAA,EAAM,OAAO,CAAA;AAC9B,MAAA,WAAA,CAAY,MAAM,CAAA;AAAA,IACpB,CAAA;AAAA,IACA,CAAC,YAAA,EAAc,WAAA,EAAa,eAAA,EAAiB,OAAO;AAAA,GACtD;AAEA,EAAA,MAAM,IAAA,GAAOpB,YAAY,MAAM;AAC7B,IAAA,IAAI,cAAc,QAAA,EAAU;AAC5B,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,MAAM,MAAA,GAAS,YAAA,IAAgB,OAAA,CAAQ,KAAA,CAAM,eAAe,CAAA;AAC5D,IAAA,YAAA,CAAa,MAAM,CAAA;AACnB,IAAA,cAAA,CAAe,MAAM,CAAA;AAAA,EACvB,GAAG,CAAC,UAAA,EAAY,UAAU,YAAA,EAAc,OAAA,EAAS,eAAe,CAAC,CAAA;AAEjE,EAAA,MAAM,KAAA,GAAQA,YAAY,MAAM;AAC9B,IAAA,SAAA,CAAU,KAAK,CAAA;AAAA,EACjB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,MAAA,GAASA,YAAY,MAAM;AAC/B,IAAA,IAAI,QAAQ,KAAA,EAAM;AAAA,SACb,IAAA,EAAK;AAAA,EACZ,CAAA,EAAG,CAAC,MAAA,EAAQ,IAAA,EAAM,KAAK,CAAC,CAAA;AAGxB,EAAA,MAAM,WAAA,GAAsCI,OAAAA;AAAA,IAC1C,OAAO;AAAA,MACL,YAAA;AAAA,MACA,KAAA,EAAO,YAAA;AAAA,MACP,UAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA,WAAA;AAAA,MACA,cAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA,EAAU,aAAA;AAAA,MACV,YAAA;AAAA,MACA,aAAA;AAAA,MACA,MAAA;AAAA,MACA,eAAA;AAAA,MACA,UAAA;AAAA,MACA,UAAA,EAAY,QAAA;AAAA,MACZ,QAAA;AAAA,MACA,MAAA,EAAQ;AAAA,KACV,CAAA;AAAA,IACA;AAAA,MACE,YAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,WAAA;AAAA,MACA,OAAA;AAAA,MACA,aAAA;AAAA,MACA,YAAA;AAAA,MACA,aAAA;AAAA,MACA,MAAA;AAAA,MACA,eAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA;AACF,GACF;AAGA,EAAA,MAAM,WAAA,GAAsCA,OAAAA;AAAA,IAC1C,OAAO;AAAA,MACL,KAAA,EAAO,YAAA;AAAA,eACPe,SAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAA;AAAA,MACA,WAAA;AAAA,MACA,eAAA;AAAA,MACA,UAAA;AAAA,MACA,UAAA,EAAY,QAAA;AAAA,MACZ,WAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA,EAAQ,gBAAA;AAAA,MACR;AAAA,KACF,CAAA;AAAA,IACA;AAAA,MACE,YAAA;AAAA,MACAA,SAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAA;AAAA,MACA,WAAA;AAAA,MACA,eAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAA;AAAA,MACA,gBAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,uBACElB,GAAAA,CAAC,iBAAA,CAAkB,QAAA,EAAlB,EAA2B,KAAA,EAAO,WAAA,EACjC,QAAA,kBAAAA,GAAAA,CAAC,kBAAkB,QAAA,EAAlB,EAA2B,KAAA,EAAO,WAAA,EAAc,UAAS,CAAA,EAC5D,CAAA;AAEJ;ACvTO,IAAM,mBAAA,GAAsBC,UAAAA;AAAA,EACjC,SAAS2B,qBAAoB,EAAE,OAAA,EAAS,WAAW,GAAG,KAAA,IAAS,GAAA,EAAK;AAClE,IAAA,MAAM,GAAA,GAAM,qBAAqB,sBAAsB,CAAA;AAGvD,IAAA,IAAI,YAAA,GAAe,EAAA;AACnB,IAAA,IAAI,IAAI,KAAA,EAAO;AACb,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,IAAI,OAAA,CAAQ,MAAA,CAAO,IAAI,KAAA,EAAO,YAAA,EAAc,IAAI,eAAe,CAAA;AAChF,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,eAAA,GACbH,iBAAAA,CAAkB,GAAA,CAAI,KAAA,EAAO,GAAA,CAAI,eAAe,CAAA,GAChDC,OAAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AACrB,QAAA,YAAA,GAAe,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAIG,gBAAAA,CAAiB,IAAI,CAAC,CAAA,CAAA;AAAA,MACtD,CAAA,CAAA,MAAQ;AACN,QAAA,YAAA,GAAe,GAAA,CAAI,KAAA;AAAA,MACrB;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAc9B,WAAAA;AAAA,MAClB,CAAC,CAAA,KAA0C;AACzC,QAAA,IAAI,CAAC,GAAA,CAAI,MAAA,EAAQ,GAAA,CAAI,IAAA,EAAK;AAC1B,QAAA,OAAA,GAAU,CAAC,CAAA;AAAA,MACb,CAAA;AAAA,MACA,CAAC,KAAK,OAAO;AAAA,KACf;AAEA,IAAA,MAAM,aAAA,GAAgBA,WAAAA;AAAA,MACpB,CAAC,CAAA,KAA6C;AAC5C,QAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,UAAA,GAAA,CAAI,KAAA,EAAM;AAAA,QACZ,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,IAAI,MAAA,EAAQ;AAE1C,UAAA,CAAA,CAAE,cAAA,EAAe;AAAA,QACnB,WAAW,CAAA,CAAE,GAAA,KAAQ,WAAA,IAAe,CAAC,IAAI,MAAA,EAAQ;AAC/C,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,GAAA,CAAI,IAAA,EAAK;AAAA,QACX;AACA,QAAA,SAAA,GAAY,CAAC,CAAA;AAAA,MACf,CAAA;AAAA,MACA,CAAC,KAAK,SAAS;AAAA,KACjB;AAEA,IAAA,MAAM,UAAA,GAAa,CAAA,EAAG,GAAA,CAAI,QAAQ,CAAA,SAAA,CAAA;AAElC,IAAA,uBACEC,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,CAAC,IAAA,KAAS;AACb,UAAA,GAAA,CAAI,aAAa,OAAA,GAAU,IAAA;AAC3B,UAAA,IAAI,OAAO,GAAA,KAAQ,UAAA,EAAY,GAAA,CAAI,IAAI,CAAA;AAAA,eAAA,IAC9B,GAAA,MAAS,OAAA,GAAU,IAAA;AAAA,QAC9B,CAAA;AAAA,QACA,IAAA,EAAK,MAAA;AAAA,QACL,IAAA,EAAK,UAAA;AAAA,QACL,QAAA,EAAQ,IAAA;AAAA,QACR,YAAA,EAAY,GAAA,CAAI,MAAA,CAAO,aAAA,IAAiB,eAAA;AAAA,QACxC,iBAAe,GAAA,CAAI,MAAA;AAAA,QACnB,eAAA,EAAc,QAAA;AAAA,QACd,eAAA,EAAe,GAAA,CAAI,MAAA,GAAS,UAAA,GAAa,MAAA;AAAA,QACzC,mBAAA,EAAkB,MAAA;AAAA,QAClB,YAAA,EAAa,KAAA;AAAA,QACb,KAAA,EAAO,YAAA;AAAA,QACP,QAAA,EAAU,GAAA,CAAI,UAAA,IAAc,KAAA,CAAM,QAAA;AAAA,QAClC,OAAA,EAAS,WAAA;AAAA,QACT,SAAA,EAAW,aAAA;AAAA,QACV,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF,CAAA;AAEA,mBAAA,CAAoB,WAAA,GAAc,sBAAA;;;ACrC3B,IAAM,cAAA,GAAiB,MAAA,CAAO,MAAA,CAAO,kBAAA,EAAoB;AAAA,EAC9D,KAAA,EAAO,mBAAA;AAAA,EACP,OAAA,EAAS,iBAAA;AAAA,EACT,QAAA,EAAU,kBAAA;AAAA,EACV,SAAA,EAAW,mBAAA;AAAA,EACX,QAAA,EAAU,kBAAA;AAAA,EACV,QAAA,EAAU,kBAAA;AAAA,EACV,UAAA,EAAY,oBAAA;AAAA,EACZ,UAAA,EAAY;AACd,CAAC;AChDM,SAAS,gBAAgB,KAAA,EAA6B;AAC3D,EAAA,MAAM,aAAA,GAAgB,MAAM,aAAA,IAAiB,SAAA;AAC7C,EAAA,uBAAOA,GAAAA,CAAC,cAAA,EAAA,EAAgB,GAAG,OAAO,aAAA,EAA8B,CAAA;AAClE;ACmCO,SAAS,eAAA,CAAgB,EAAE,UAAA,EAAY,GAAG,OAAM,EAAyB;AAC9E,EAAA,MAAM,GAAA,GAAM,qBAAqB,kBAAkB,CAAA;AACnD,EAAA,MAAM,EAAE,SAAS,SAAA,EAAW,MAAA,EAAQ,OAAO,eAAA,EAAiB,MAAA,EAAQ,UAAS,GAAI,GAAA;AAEjF,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAA;AAI7C,EAAA,MAAM,CAAC,SAAA,EAAW,mBAAmB,CAAA,GAAIG,QAAQ,MAAM;AACrD,IAAA,IAAI,CAAC,KAAA,EAAO,OAAO,CAAC,MAAM,IAAI,CAAA;AAC9B,IAAA,IAAI;AACF,MAAA,MAAM,CAAC,CAAA,EAAG,CAAC,CAAA,GAAI,QAAQ,MAAA,CAAO,KAAA,EAAO,SAAA,EAAW,eAAe,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,MAAM,CAAA;AACtF,MAAA,OAAO,CAAC,CAAA,EAAI,CAAA,GAAK,CAAC,CAAA;AAAA,IACpB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,CAAC,MAAM,IAAI,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,OAAA,EAAS,eAAe,CAAC,CAAA;AAGpC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIN,SAA+B,IAAI,CAAA;AAC7D,EAAAC,UAAU,MAAM;AACd,IAAA,QAAA,CAAS,OAAA,CAAQ,KAAA,CAAM,eAAe,CAAC,CAAA;AAAA,EACzC,CAAA,EAAG,CAAC,OAAA,EAAS,eAAe,CAAC,CAAA;AAC7B,EAAA,MAAM,YAAY,KAAA,KAAU,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA,GAAI,EAAA;AAC5D,EAAA,MAAM,aAAa,KAAA,KAAU,IAAA,GAAO,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,GAAI,EAAA;AAK9D,EAAA,MAAM,kBAAA,GAAqBK,OAAAA;AAAA,IACzB,MACE,MAAM,IAAA,CAAK,EAAE,QAAQ,EAAA,EAAG,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM;AACnC,MAAA,MAAM,UAAA,GAAa,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,aAAa,CAAA,EAAG,CAAC,CAAC,CAAA,CAAE,WAAA,EAAY;AACrE,MAAA,OAAO,qBAAqB,UAAA,EAAY,OAAA,CAAQ,WAAW,UAAU,CAAA,EAAG,UAAU,OAAO,CAAA;AAAA,IAC3F,CAAC,CAAA;AAAA,IACH,CAAC,WAAA,EAAa,QAAA,EAAU,OAAO;AAAA,GACjC;AAEA,EAAA,MAAM,YAAA,GAAeJ,WAAAA;AAAA,IACnB,CAAC,SAAA,KAAsB;AACrB,MAAA,GAAA,CAAI,YAAA,CAAa,OAAA,CAAQ,QAAA,CAAS,SAAA,EAAW,SAAS,CAAC,CAAA;AAAA,IACzD,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,SAAA,EAAW,GAAG;AAAA,GAC1B;AAEA,EAAA,MAAM,iBAAA,GAAoBA,WAAAA;AAAA,IACxB,CAAC,UAAA,KAAuB;AACtB,MAAA,IAAI,kBAAA,CAAmB,UAAU,CAAA,EAAG;AACpC,MAAA,MAAM,MAAA,GAAS,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,aAAa,UAAA,EAAY,CAAC,CAAC,CAAA,CAAE,WAAA,EAAY;AAC1E,MAAA,GAAA,CAAI,WAAW,MAAM,CAAA;AAAA,IACvB,CAAA;AAAA,IACA,CAAC,WAAA,EAAa,GAAA,EAAK,kBAAkB;AAAA,GACvC;AAOA,EAAA,MAAM,YAAA,GACJ,cAAc,WAAA,IAAe,mBAAA,KAAwB,OACjD,mBAAA,GACA,OAAA,CAAQ,SAAS,SAAS,CAAA;AAChC,EAAA,MAAM,eAAe,kBAAA,CAAmB,SAAA,CAAU,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAC3D,EAAA,MAAM,eAAe,kBAAA,CAAmB,YAAY,IAChD,YAAA,KAAiB,EAAA,GACf,eACA,YAAA,GACF,YAAA;AAEJ,EAAA,MAAM,EAAE,OAAA,EAAS,YAAA,EAAc,aAAA,KAAkB,YAAA,CAAa;AAAA,IAC5D,YAAA;AAAA,IACA,aAAA,EAAe,kBAAA;AAAA,IACf,QAAA,EAAU,iBAAA;AAAA,IACV,QAAA,EAAU,MAAM,YAAA,CAAa,EAAE,CAAA;AAAA,IAC/B,UAAA,EAAY,MAAM,YAAA,CAAa,CAAC,CAAA;AAAA,IAChC,UAAU,GAAA,CAAI;AAAA,GACf,CAAA;AAED,EAAA,uBACEK,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,UAAA,EAAY,IAAA,EAAO,GAAG,KAAA,EACpC,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,UAAA,EAAY,MAAA,EAC1B,QAAA,EAAA;AAAA,sBAAAJ,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,WAAW,UAAA,EAAY,SAAA;AAAA,UACvB,OAAA,EAAS,MAAM,YAAA,CAAa,EAAE,CAAA;AAAA,UAC9B,cAAY,MAAA,CAAO,QAAA;AAAA,UACpB,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,sBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,UAAA,EAAY,OAAQ,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,sBACjDA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,WAAW,UAAA,EAAY,SAAA;AAAA,UACvB,OAAA,EAAS,MAAM,YAAA,CAAa,CAAC,CAAA;AAAA,UAC7B,cAAY,MAAA,CAAO,QAAA;AAAA,UACpB,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF,CAAA;AAAA,oBAEAA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,OAAA;AAAA,QACL,IAAA,EAAK,MAAA;AAAA,QACL,YAAA,EAAY,GAAG,WAAW,CAAA,OAAA,CAAA;AAAA,QAC1B,WAAW,UAAA,EAAY,IAAA;AAAA,QACvB,SAAA,EAAW,aAAA;AAAA,QAEV,QAAA,EAAA,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,GAAE,EAAG,CAAC,CAAA,EAAG,QAAA,qBAC7BA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,KAAA;AAAA,YACL,WAAW,UAAA,EAAY,OAAA;AAAA,YACvB,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,qBAAqB,gBAAA,EAAiB;AAAA,YAE/D,QAAA,EAAA,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,GAAE,EAAG,CAAC8B,IAAG,GAAA,KAAQ;AACrC,cAAA,MAAM,CAAA,GAAI,WAAW,CAAA,GAAI,GAAA;AACzB,cAAA,MAAM,UAAA,GAAa,SAAA,KAAc,WAAA,IAAe,mBAAA,KAAwB,CAAA;AACxE,cAAA,MAAM,SAAA,GAAY,SAAA,KAAc,WAAA,IAAe,UAAA,KAAe,CAAA;AAC9D,cAAA,MAAM,YAAY,CAAA,KAAM,YAAA;AACxB,cAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,CAAC,CAAA,IAAK,KAAA;AAC5C,cAAA,MAAM,GAAA,GACJ;AAAA,gBACE,UAAA,EAAY,KAAA;AAAA,gBACZ,cAAc,UAAA,EAAY,aAAA;AAAA,gBAC1B,aAAa,UAAA,EAAY,YAAA;AAAA,gBACzB,cAAc,UAAA,EAAY;AAAA,gBAEzB,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,GAAG,CAAA,IAAK,MAAA;AAClB,cAAA,uBACE9B,GAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBAEC,IAAA,EAAK,QAAA;AAAA,kBACL,IAAA,EAAK,UAAA;AAAA,kBACL,QAAA,EAAU,YAAY,CAAA,GAAI,EAAA;AAAA,kBAC1B,QAAA,EAAU,UAAA;AAAA,kBACV,iBAAe,UAAA,IAAc,MAAA;AAAA,kBAC7B,iBAAe,UAAA,IAAc,MAAA;AAAA,kBAC7B,cAAA,EAAc,YAAY,MAAA,GAAS,MAAA;AAAA,kBACnC,iBAAe,UAAA,IAAc,MAAA;AAAA,kBAC7B,gBAAc,SAAA,IAAa,MAAA;AAAA,kBAC3B,gBAAc,SAAA,IAAa,MAAA;AAAA,kBAC3B,SAAA,EAAW,GAAA;AAAA,kBACX,OAAA,EAAS,MAAM,iBAAA,CAAkB,CAAC,CAAA;AAAA,kBAEjC,QAAA,EAAA+B,YAAAA,CAAa,CAAA,EAAG,MAAM;AAAA,iBAAA;AAAA,gBAdlB;AAAA,eAeP;AAAA,YAEJ,CAAC;AAAA,WAAA;AAAA,UAvCI;AAAA,SAyCR;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ;;;AC9KO,IAAM,WAAA,GAAc,MAAA,CAAO,MAAA,CAAO,eAAA,EAAiB;AAAA,EACxD,KAAA,EAAO,eAAA;AAAA,EACP,OAAA,EAAS,iBAAA;AAAA,EACT,OAAA,EAAS,iBAAA;AAAA,EACT,IAAA,EAAM;AACR,CAAC;ACzBM,SAAS,eAAe,KAAA,EAA4B;AACzD,EAAA,MAAM,aAAA,GAAgB,MAAM,aAAA,IAAiB,MAAA;AAC7C,EAAA,uBAAO/B,GAAAA,CAAC,cAAA,EAAA,EAAgB,GAAG,OAAO,aAAA,EAA8B,CAAA;AAClE;ACoCO,SAAS,cAAA,CAAe,EAAE,UAAA,EAAY,GAAG,OAAM,EAAwB;AAC5E,EAAA,MAAM,GAAA,GAAM,qBAAqB,iBAAiB,CAAA;AAClD,EAAA,MAAM,EAAE,OAAA,EAAS,SAAA,EAAW,OAAO,eAAA,EAAiB,MAAA,EAAQ,UAAS,GAAI,GAAA;AAEzE,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAA;AAE7C,EAAA,MAAM,WAAA,GAAc,cAAe,WAAA,GAAc,EAAA;AAGjD,EAAA,MAAM,SAAA,GAAYG,QAAQ,MAAM;AAC9B,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,IAAA,IAAI;AACF,MAAA,OAAO,OAAO,OAAA,CAAQ,MAAA,CAAO,KAAA,EAAO,MAAA,EAAQ,eAAe,CAAC,CAAA;AAAA,IAC9D,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,OAAA,EAAS,eAAe,CAAC,CAAA;AAGpC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIN,SAA+B,IAAI,CAAA;AAC7D,EAAAC,UAAU,MAAM;AACd,IAAA,QAAA,CAAS,OAAA,CAAQ,KAAA,CAAM,eAAe,CAAC,CAAA;AAAA,EACzC,CAAA,EAAG,CAAC,OAAA,EAAS,eAAe,CAAC,CAAA;AAC7B,EAAA,MAAM,YAAY,KAAA,KAAU,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA,GAAI,EAAA;AAI5D,EAAA,MAAM,iBAAA,GAAoBK,OAAAA;AAAA,IACxB,MACE,MAAM,IAAA,CAAK,EAAE,QAAQ,EAAA,EAAG,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM;AACnC,MAAA,MAAM,OAAO,WAAA,GAAc,CAAA;AAC3B,MAAA,MAAM,SAAA,GAAY,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAE,WAAA,EAAY;AAC7D,MAAA,MAAM,OAAA,GAAU,IAAI,IAAA,CAAK,IAAA,CAAK,IAAI,IAAA,EAAM,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,GAAG,CAAC,EAAE,WAAA,EAAY;AAC9E,MAAA,OAAO,oBAAA,CAAqB,SAAA,EAAW,OAAA,EAAS,QAAA,EAAU,OAAO,CAAA;AAAA,IACnE,CAAC,CAAA;AAAA,IACH,CAAC,WAAA,EAAa,QAAA,EAAU,OAAO;AAAA,GACjC;AAEA,EAAA,MAAM,cAAA,GAAiBJ,WAAAA;AAAA,IACrB,CAAC,SAAA,KAAsB;AACrB,MAAA,GAAA,CAAI,aAAa,OAAA,CAAQ,QAAA,CAAS,SAAA,EAAW,SAAA,GAAY,EAAE,CAAC,CAAA;AAAA,IAC9D,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,SAAA,EAAW,GAAG;AAAA,GAC1B;AAEA,EAAA,MAAM,gBAAA,GAAmBA,WAAAA;AAAA,IACvB,CAAC,aAAA,KAA0B;AACzB,MAAA,IAAI,iBAAA,CAAkB,aAAa,CAAA,EAAG;AACtC,MAAA,MAAM,OAAO,WAAA,GAAc,aAAA;AAC3B,MAAA,MAAM,MAAA,GAAS,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAE,WAAA,EAAY;AAC1D,MAAA,GAAA,CAAI,WAAW,MAAM,CAAA;AAAA,IACvB,CAAA;AAAA,IACA,CAAC,GAAA,EAAK,WAAA,EAAa,iBAAiB;AAAA,GACtC;AAOA,EAAA,MAAM,YAAA,GACJ,SAAA,KAAc,IAAA,IAAQ,SAAA,IAAa,WAAA,IAAe,aAAa,WAAA,GAAc,EAAA,GACzE,SAAA,GAAY,WAAA,GACZ,WAAA,GAAc,WAAA;AACpB,EAAA,MAAM,eAAe,iBAAA,CAAkB,SAAA,CAAU,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAC1D,EAAA,MAAM,eAAe,iBAAA,CAAkB,YAAY,IAC/C,YAAA,KAAiB,EAAA,GACf,eACA,YAAA,GACF,YAAA;AAEJ,EAAA,MAAM,EAAE,OAAA,EAAS,YAAA,EAAc,aAAA,KAAkB,YAAA,CAAa;AAAA,IAC5D,YAAA;AAAA,IACA,aAAA,EAAe,iBAAA;AAAA,IACf,QAAA,EAAU,gBAAA;AAAA,IACV,QAAA,EAAU,MAAM,cAAA,CAAe,EAAE,CAAA;AAAA,IACjC,UAAA,EAAY,MAAM,cAAA,CAAe,CAAC,CAAA;AAAA,IAClC,UAAU,GAAA,CAAI;AAAA,GACf,CAAA;AAED,EAAA,MAAM,UAAA,GAAa,CAAA,EAAG,WAAW,CAAA,MAAA,EAAI,cAAc,EAAE,CAAA,CAAA;AAErD,EAAA,uBACEK,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,UAAA,EAAY,IAAA,EAAO,GAAG,KAAA,EACpC,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,UAAA,EAAY,MAAA,EAC1B,QAAA,EAAA;AAAA,sBAAAJ,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,WAAW,UAAA,EAAY,SAAA;AAAA,UACvB,OAAA,EAAS,MAAM,cAAA,CAAe,EAAE,CAAA;AAAA,UAChC,cAAY,MAAA,CAAO,UAAA;AAAA,UACpB,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,sBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,UAAA,EAAY,OAAQ,QAAA,EAAA,UAAA,EAAW,CAAA;AAAA,sBAChDA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,WAAW,UAAA,EAAY,SAAA;AAAA,UACvB,OAAA,EAAS,MAAM,cAAA,CAAe,CAAC,CAAA;AAAA,UAC/B,cAAY,MAAA,CAAO,UAAA;AAAA,UACpB,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF,CAAA;AAAA,oBAEAA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,OAAA;AAAA,QACL,IAAA,EAAK,MAAA;AAAA,QACL,YAAA,EAAY,UAAA;AAAA,QACZ,WAAW,UAAA,EAAY,IAAA;AAAA,QACvB,SAAA,EAAW,aAAA;AAAA,QAEV,QAAA,EAAA,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,GAAE,EAAG,CAAC,CAAA,EAAG,QAAA,qBAC7BA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,KAAA;AAAA,YACL,WAAW,UAAA,EAAY,OAAA;AAAA,YACvB,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,qBAAqB,gBAAA,EAAiB;AAAA,YAE/D,QAAA,EAAA,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,GAAE,EAAG,CAAC8B,IAAG,GAAA,KAAQ;AACrC,cAAA,MAAM,CAAA,GAAI,WAAW,CAAA,GAAI,GAAA;AACzB,cAAA,MAAM,OAAO,WAAA,GAAc,CAAA;AAC3B,cAAA,MAAM,aAAa,IAAA,KAAS,SAAA;AAC5B,cAAA,MAAM,YAAY,IAAA,KAAS,SAAA;AAC3B,cAAA,MAAM,YAAY,CAAA,KAAM,YAAA;AACxB,cAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,CAAC,CAAA,IAAK,KAAA;AAC3C,cAAA,MAAM,GAAA,GACJ;AAAA,gBACE,UAAA,EAAY,IAAA;AAAA,gBACZ,cAAc,UAAA,EAAY,YAAA;AAAA,gBAC1B,aAAa,UAAA,EAAY,WAAA;AAAA,gBACzB,cAAc,UAAA,EAAY;AAAA,gBAEzB,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,GAAG,CAAA,IAAK,MAAA;AAClB,cAAA,uBACE9B,GAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBAIC,IAAA,EAAK,QAAA;AAAA,kBACL,IAAA,EAAK,UAAA;AAAA,kBACL,QAAA,EAAU,YAAY,CAAA,GAAI,EAAA;AAAA,kBAC1B,QAAA,EAAU,UAAA;AAAA,kBACV,iBAAe,UAAA,IAAc,MAAA;AAAA,kBAC7B,iBAAe,UAAA,IAAc,MAAA;AAAA,kBAC7B,cAAA,EAAc,YAAY,MAAA,GAAS,MAAA;AAAA,kBACnC,iBAAe,UAAA,IAAc,MAAA;AAAA,kBAC7B,gBAAc,SAAA,IAAa,MAAA;AAAA,kBAC3B,gBAAc,SAAA,IAAa,MAAA;AAAA,kBAC3B,SAAA,EAAW,GAAA;AAAA,kBACX,OAAA,EAAS,MAAM,gBAAA,CAAiB,CAAC,CAAA;AAAA,kBAEhC,QAAA,EAAA;AAAA,iBAAA;AAAA,gBAdI;AAAA,eAeP;AAAA,YAEJ,CAAC;AAAA,WAAA;AAAA,UA1CI;AAAA,SA4CR;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ;;;ACpLO,IAAM,UAAA,GAAa,MAAA,CAAO,MAAA,CAAO,cAAA,EAAgB;AAAA,EACtD,KAAA,EAAO,eAAA;AAAA,EACP,OAAA,EAAS,iBAAA;AAAA,EACT,OAAA,EAAS,iBAAA;AAAA,EACT,IAAA,EAAM;AACR,CAAC;ACrBM,SAAS,eAAe,KAAA,EAA4B;AACzD,EAAA,uBAAOA,GAAAA,CAAC,eAAA,EAAA,EAAiB,GAAG,KAAA,EAAO,CAAA;AACrC;ACFO,SAAS,mBAAmB,KAAA,EAAwD;AACzF,EAAA,uBAAOA,GAAAA,CAAC,mBAAA,EAAA,EAAqB,GAAG,KAAA,EAAO,eAAc,MAAA,EAAO,CAAA;AAC9D;;;ACcO,IAAM,UAAA,GAAa,MAAA,CAAO,MAAA,CAAO,cAAA,EAAgB;AAAA,EACtD,KAAA,EAAO,gBAAA;AAAA,EACP,OAAA,EAAS,kBAAA;AAAA,EACT,QAAA,EAAU;AACZ,CAAC;AC0CM,SAAS,aAAA,CAAc,OAAA,GAAgC,EAAC,EAAwB;AACrF,EAAA,MAAM;AAAA,IACJ,KAAA,EAAO,eAAA;AAAA,IACP,YAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAW,EAAC;AAAA,IACZ,YAAA,GAAe,CAAA;AAAA,IACf,OAAA,GAAUO,cAAAA;AAAA,IACV;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,WAAWC,KAAAA,EAAM;AACvB,EAAA,MAAM,YAAA,GAAeb,MAAAA,CAAO,eAAA,KAAoB,MAAS,CAAA,CAAE,OAAA;AAE3D,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIE,QAAAA;AAAA,IAChD,YAAA,IAAgB;AAAA,GAClB;AAEA,EAAA,MAAM,YAAA,GAAe,YAAA,GAAgB,eAAA,IAAmB,IAAA,GAAQ,iBAAA;AAEhE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,QAAAA;AAAA,IAChC,YAAA,IAAgB,OAAA,CAAQ,KAAA,CAAM,eAAe;AAAA,GAC/C;AACA,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,QAAAA;AAAA,IACpC,YAAA,IAAgB,OAAA,CAAQ,KAAA,CAAM,eAAe;AAAA,GAC/C;AAEA,EAAA,MAAM,UAAA,GAAaE,WAAAA;AAAA,IACjB,CAAC,GAAA,KAA8B;AAC7B,MAAA,MAAM,aACJ,GAAA,IAAO,eAAA,GAAkBU,uBAAAA,CAAwB,GAAA,EAAK,eAAe,CAAA,GAAI,GAAA;AAC3E,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,oBAAA,CAAqB,UAAU,CAAA;AAAA,MACjC;AACA,MAAA,QAAA,GAAW,UAAU,CAAA;AACrB,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACjB,CAAA;AAAA,IACA,CAAC,YAAA,EAAc,QAAA,EAAU,eAAe;AAAA,GAC1C;AAEA,EAAA,MAAM,IAAA,GAAOV,YAAY,MAAM;AAC7B,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,MAAM,MAAA,GAAS,YAAA,IAAgB,OAAA,CAAQ,KAAA,CAAM,eAAe,CAAA;AAC5D,IAAA,YAAA,CAAa,MAAM,CAAA;AACnB,IAAA,cAAA,CAAe,MAAM,CAAA;AAAA,EACvB,CAAA,EAAG,CAAC,YAAA,EAAc,OAAA,EAAS,eAAe,CAAC,CAAA;AAE3C,EAAA,MAAM,KAAA,GAAQA,YAAY,MAAM;AAC9B,IAAA,SAAA,CAAU,KAAK,CAAA;AAAA,EACjB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,MAAA,GAASA,YAAY,MAAM;AAC/B,IAAA,IAAI,QAAQ,KAAA,EAAM;AAAA,SACb,IAAA,EAAK;AAAA,EACZ,CAAA,EAAG,CAAC,MAAA,EAAQ,IAAA,EAAM,KAAK,CAAC,CAAA;AAExB,EAAA,MAAM,aAAA,GAAgBA,YAAY,MAAM;AACtC,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,SAAA,CAAU,SAAA,EAAW,EAAE,CAAA;AAChD,IAAA,YAAA,CAAa,QAAQ,CAAA;AACrB,IAAA,cAAA,CAAe,OAAA,CAAQ,YAAA,CAAa,QAAQ,CAAC,CAAA;AAAA,EAC/C,CAAA,EAAG,CAAC,OAAA,EAAS,SAAS,CAAC,CAAA;AAEvB,EAAA,MAAM,SAAA,GAAYA,YAAY,MAAM;AAClC,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,SAAA,CAAU,SAAA,EAAW,CAAC,CAAA;AAC/C,IAAA,YAAA,CAAa,QAAQ,CAAA;AACrB,IAAA,cAAA,CAAe,OAAA,CAAQ,YAAA,CAAa,QAAQ,CAAC,CAAA;AAAA,EAC/C,CAAA,EAAG,CAAC,OAAA,EAAS,SAAS,CAAC,CAAA;AAEvB,EAAA,MAAM,QAAA,GAAWe,eAAAA,CAAgB,SAAA,EAAW,OAAA,EAAS;AAAA,IACnD,YAAA;AAAA,IACA,QAAA,EAAU,YAAA;AAAA,IACV,WAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,YAAA;AAAA,IACP,MAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,aAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AACF;AC5JA,IAAMkB,YAAAA,GAAyB,EAAE,KAAA,EAAO,IAAA,EAAM,KAAK,IAAA,EAAK;AAqEjD,SAAS,cAAA,CAAe,OAAA,GAAiC,EAAC,EAAyB;AACxF,EAAA,MAAM;AAAA,IACJ,KAAA,EAAO,eAAA;AAAA,IACP,YAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAW,EAAC;AAAA,IACZ,YAAA,GAAe,CAAA;AAAA,IACf,OAAA,GAAUzB,cAAAA;AAAA,IACV;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,WAAWC,KAAAA,EAAM;AACvB,EAAA,MAAM,YAAA,GAAeb,MAAAA,CAAO,eAAA,KAAoB,MAAS,CAAA,CAAE,OAAA;AAE3D,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIE,QAAAA;AAAA,IAChD,YAAA,IAAgBmC;AAAA,GAClB;AAEA,EAAA,MAAM,YAAA,GAAe,YAAA,GAAgB,eAAA,IAAmBA,YAAAA,GAAe,iBAAA;AAEvE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAInC,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,SAA+B,OAAO,CAAA;AACpF,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAA+B,IAAI,CAAA;AACrE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,QAAAA;AAAA,IAChC,YAAA,CAAa,KAAA,IAAS,OAAA,CAAQ,KAAA,CAAM,eAAe;AAAA,GACrD;AACA,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,QAAAA;AAAA,IACpC,YAAA,CAAa,KAAA,IAAS,OAAA,CAAQ,KAAA,CAAM,eAAe;AAAA,GACrD;AAEA,EAAA,MAAM,QAAA,GAAWE,WAAAA;AAAA,IACf,CAAC,KAAA,KAAqB;AACpB,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,oBAAA,CAAqB,KAAK,CAAA;AAAA,MAC5B;AACA,MAAA,QAAA,GAAW,KAAK,CAAA;AAAA,IAClB,CAAA;AAAA,IACA,CAAC,cAAc,QAAQ;AAAA,GACzB;AAEA,EAAA,MAAM,UAAA,GAAaA,WAAAA;AAAA,IACjB,CAAC,GAAA,KAAuB;AACtB,MAAA,MAAM,UAAA,GAAa,eAAA,GAAkBU,uBAAAA,CAAwB,GAAA,EAAK,eAAe,CAAA,GAAI,GAAA;AACrF,MAAA,IAAI,oBAAoB,OAAA,EAAS;AAC/B,QAAA,QAAA,CAAS,EAAE,KAAA,EAAO,UAAA,EAAY,GAAA,EAAK,MAAM,CAAA;AACzC,QAAA,kBAAA,CAAmB,KAAK,CAAA;AACxB,QAAA,YAAA,CAAa,IAAI,CAAA;AAAA,MACnB,CAAA,MAAO;AACL,QAAA,MAAM,QAAQ,YAAA,CAAa,KAAA;AAC3B,QAAA,IAAI,CAAC,KAAA,EAAO;AACV,UAAA,QAAA,CAAS,EAAE,KAAA,EAAO,UAAA,EAAY,GAAA,EAAK,MAAM,CAAA;AACzC,UAAA,kBAAA,CAAmB,KAAK,CAAA;AACxB,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,QAAA,GAAsB,OAAA,CAAQ,QAAA,CAAS,UAAA,EAAY,KAAK,CAAA,GAC1D,EAAE,KAAA,EAAO,UAAA,EAAY,KAAK,KAAA,EAAM,GAChC,EAAE,KAAA,EAAO,KAAK,UAAA,EAAW;AAE7B,QAAA,QAAA,CAAS,QAAQ,CAAA;AACjB,QAAA,kBAAA,CAAmB,OAAO,CAAA;AAC1B,QAAA,YAAA,CAAa,IAAI,CAAA;AACjB,QAAA,SAAA,CAAU,KAAK,CAAA;AAAA,MACjB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,eAAA,EAAiB,YAAA,CAAa,KAAA,EAAO,OAAA,EAAS,UAAU,eAAe;AAAA,GAC1E;AAEA,EAAA,MAAM,IAAA,GAAOV,YAAY,MAAM;AAC7B,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,KAAA,IAAS,OAAA,CAAQ,MAAM,eAAe,CAAA;AAClE,IAAA,YAAA,CAAa,MAAM,CAAA;AACnB,IAAA,cAAA,CAAe,MAAM,CAAA;AACrB,IAAA,IAAI,YAAA,CAAa,KAAA,IAAS,YAAA,CAAa,GAAA,EAAK;AAC1C,MAAA,kBAAA,CAAmB,OAAO,CAAA;AAAA,IAC5B;AAAA,EACF,CAAA,EAAG,CAAC,YAAA,EAAc,OAAA,EAAS,eAAe,CAAC,CAAA;AAE3C,EAAA,MAAM,KAAA,GAAQA,YAAY,MAAM;AAC9B,IAAA,SAAA,CAAU,KAAK,CAAA;AACf,IAAA,YAAA,CAAa,IAAI,CAAA;AAAA,EACnB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,MAAA,GAASA,YAAY,MAAM;AAC/B,IAAA,IAAI,QAAQ,KAAA,EAAM;AAAA,SACb,IAAA,EAAK;AAAA,EACZ,CAAA,EAAG,CAAC,MAAA,EAAQ,IAAA,EAAM,KAAK,CAAC,CAAA;AAExB,EAAA,MAAM,aAAA,GAAgBA,YAAY,MAAM;AACtC,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,SAAA,CAAU,SAAA,EAAW,EAAE,CAAA;AAChD,IAAA,YAAA,CAAa,QAAQ,CAAA;AACrB,IAAA,cAAA,CAAe,OAAA,CAAQ,YAAA,CAAa,QAAQ,CAAC,CAAA;AAAA,EAC/C,CAAA,EAAG,CAAC,OAAA,EAAS,SAAS,CAAC,CAAA;AAEvB,EAAA,MAAM,SAAA,GAAYA,YAAY,MAAM;AAClC,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,SAAA,CAAU,SAAA,EAAW,CAAC,CAAA;AAC/C,IAAA,YAAA,CAAa,QAAQ,CAAA;AACrB,IAAA,cAAA,CAAe,OAAA,CAAQ,YAAA,CAAa,QAAQ,CAAC,CAAA;AAAA,EAC/C,CAAA,EAAG,CAAC,OAAA,EAAS,SAAS,CAAC,CAAA;AAEvB,EAAA,MAAM,QAAA,GAAWe,eAAAA,CAAgB,SAAA,EAAW,OAAA,EAAS;AAAA,IACnD,YAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA,EAAO,YAAA;AAAA,IACP,UAAA,EAAY,SAAA;AAAA,IACZ,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,YAAA;AAAA,IACP,eAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,aAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AACF;ACvJA,SAAS,aAAA,GAA+B;AACtC,EAAA,OAAOP,eAAe,KAAA,EAAM;AAC9B;AAmBO,SAAS,aAAA,CAAc,OAAA,GAAgC,EAAC,EAAwB;AACrF,EAAA,MAAM;AAAA,IACJ,KAAA,EAAO,eAAA;AAAA,IACP,YAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA,GAAS,KAAA;AAAA,IACT,IAAA,GAAO,CAAA;AAAA,IACP;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,WAAWC,KAAAA,EAAM;AACvB,EAAA,MAAM,YAAA,GAAeb,MAAAA,CAAO,eAAA,KAAoB,MAAS,CAAA,CAAE,OAAA;AAE3D,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIE,QAAAA;AAAA,IAChD,YAAA,IAAgB;AAAA,GAClB;AAEA,EAAA,MAAM,YAAA,GAAe,YAAA,GAAgB,eAAA,IAAmB,IAAA,GAAQ,iBAAA;AAChE,EAAA,MAAM,OAAA,GAAU,gBAAgB,aAAA,EAAc;AAC9C,EAAA,MAAM,WAAA,GAAcM,OAAAA;AAAA,IAClB,MAAO,eAAA,GAAkBsB,iBAAAA,CAAkB,SAAS,eAAe,CAAA,GAAIC,QAAQ,OAAO,CAAA;AAAA,IACtF,CAAC,SAAS,eAAe;AAAA,GAC3B;AAEA,EAAA,MAAMR,SAAA,GAAUnB,WAAAA;AAAA,IACd,CAAC,OAAA,KAAgC;AAC/B,MAAA,MAAM,MAAA,GAAS,kBACX4B,iBAAAA,CAAkB,OAAA,EAAS,SAAS,eAAe,CAAA,GACnDR,OAAAA,CAAa,OAAA,EAAS,OAAO,CAAA;AACjC,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,oBAAA,CAAqB,MAAM,CAAA;AAAA,MAC7B;AACA,MAAA,QAAA,GAAW,MAAM,CAAA;AAAA,IACnB,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,YAAA,EAAc,QAAA,EAAU,eAAe;AAAA,GACnD;AAEA,EAAA,MAAM,SAAS,MAAA,KAAW,KAAA,GAAQE,SAAS,WAAA,CAAY,KAAK,EAAE,MAAA,GAAS,IAAA;AACvE,EAAA,MAAM,WAAA,GAAc,WAAW,KAAA,GAAQA,QAAAA,CAAS,YAAY,KAAK,CAAA,CAAE,UAAU,WAAA,CAAY,KAAA;AAEzF,EAAA,MAAM,OAAA,GAAUtB,WAAAA;AAAA,IACd,CAAC,IAAA,KAAiB;AAChB,MAAA,MAAM,UAAU,MAAA,KAAW,KAAA,IAAS,SAASuB,QAAAA,CAAS,IAAA,EAAM,MAAM,CAAA,GAAI,IAAA;AACtE,MAAAJ,SAAA,CAAQ,EAAE,KAAA,EAAO,OAAA,EAAS,CAAA;AAAA,IAC5B,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,MAAA,EAAQA,SAAO;AAAA,GAC1B;AAEA,EAAA,MAAM,SAAA,GAAYnB,WAAAA,CAAY,CAAC,MAAA,KAAmBmB,SAAA,CAAQ,EAAE,OAAA,EAAS,MAAA,EAAQ,CAAA,EAAG,CAACA,SAAO,CAAC,CAAA;AAEzF,EAAA,MAAM,SAAA,GAAYnB,WAAAA,CAAY,CAAC,MAAA,KAAmBmB,SAAA,CAAQ,EAAE,OAAA,EAAS,MAAA,EAAQ,CAAA,EAAG,CAACA,SAAO,CAAC,CAAA;AAEzF,EAAA,MAAM,SAAA,GAAYnB,WAAAA;AAAA,IAChB,CAAC,SAAA,KAA2B;AAC1B,MAAA,IAAI,WAAW,KAAA,EAAO;AACtB,MAAA,MAAM,UAAA,GAAauB,QAAAA,CAAS,WAAA,EAAa,SAAS,CAAA;AAClD,MAAAJ,SAAA,CAAQ,EAAE,KAAA,EAAO,UAAA,EAAY,CAAA;AAAA,IAC/B,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,WAAA,EAAaA,SAAO;AAAA,GAC/B;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,YAAA;AAAA,IACP,WAAA;AAAA,aACAA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,cAAA,EAAgBe,cAAc,MAAM,CAAA;AAAA,IACpC,gBAAA,EAAkBC,gBAAgB,IAAI,CAAA;AAAA,IACtC,MAAA;AAAA,IACA,WAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AACF","file":"index.js","sourcesContent":["import { createContext, useContext } from 'react';\nimport type { RefObject } from 'react';\nimport type {\n DateAdapter,\n DatePickerLabels,\n DisabledRule,\n ISODateString,\n WeekStartsOn,\n} from '@kalyx/core';\n\nexport interface DatePickerContextValue {\n /** Floating UI reference element (set by Input/Trigger, read by Popover) */\n referenceRef: RefObject<HTMLElement | null>;\n /** Currently selected date (ISO 8601 UTC) */\n value: ISODateString | null;\n /** Date selection handler */\n selectDate: (iso: ISODateString | null) => void;\n /** Popover open state */\n isOpen: boolean;\n /** Open the popover */\n open: () => void;\n /** Close the popover */\n close: () => void;\n /** Toggle the popover */\n toggle: () => void;\n /** Currently displayed month (ISO string) */\n viewMonth: ISODateString;\n /** Change the displayed month */\n setViewMonth: (iso: ISODateString) => void;\n /** Currently focused date in the calendar */\n focusedDate: ISODateString;\n /** Change the focused date */\n setFocusedDate: (iso: ISODateString) => void;\n /** Date adapter */\n adapter: DateAdapter;\n /** Disabled rules */\n disabled: DisabledRule[];\n /** Week start day */\n weekStartsOn: WeekStartsOn;\n /** Date display format */\n displayFormat: string;\n /** BCP 47 locale (e.g., \"en-US\", \"ko-KR\") */\n locale: string;\n /**\n * IANA timezone for display (e.g., \"Asia/Seoul\"). When set, the Input formats the value in\n * this zone, Calendar highlights the matching civil day, and selecting a date emits the civil\n * midnight of that day in the zone (UTC-ISO form).\n */\n displayTimezone?: string;\n /** Whether entire picker is disabled */\n isDisabled: boolean;\n /** Read-only */\n isReadOnly: boolean;\n /** Unique ID (useId-based) */\n pickerId: string;\n /** ARIA labels */\n labels: DatePickerLabels;\n}\n\nexport const DatePickerContext = createContext<DatePickerContextValue | null>(null);\n\n/**\n * Consume DatePickerContext.\n * Throws a clear error when called outside of DatePicker.Root.\n */\nexport function useDatePickerContext(componentName: string): DatePickerContextValue {\n const context = useContext(DatePickerContext);\n if (!context) {\n throw new Error(\n `[${componentName}] DatePicker.Root 내부에서 사용해야 합니다.\\n\\n` +\n '올바른 사용법:\\n' +\n ' <DatePicker>\\n' +\n ` <DatePicker.${componentName.replace('DatePicker.', '')} />\\n` +\n ' </DatePicker>',\n );\n }\n return context;\n}\n","import { useEffect, useRef } from 'react';\n\n/**\n * Fires `callback` when `value` changes (reference-identity), but not on mount.\n * Stores the callback in a ref so changing its identity does not re-trigger the effect.\n *\n * Internal utility — not exported from the package public API.\n */\nexport function useChangeEffect<T>(value: T, callback: ((value: T) => void) | undefined): void {\n const callbackRef = useRef(callback);\n callbackRef.current = callback;\n\n const prevRef = useRef(value);\n useEffect(() => {\n if (prevRef.current !== value) {\n prevRef.current = value;\n callbackRef.current?.(value);\n }\n }, [value]);\n}\n","import { useCallback, useId, useMemo, useRef, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { DEFAULT_DATEPICKER_LABELS, civilMidnightFromUtcDay } from '@kalyx/core';\nimport { DateFnsAdapter } from '@kalyx/adapter-date-fns';\nimport type {\n DateAdapter,\n DatePickerLabels,\n DisabledRule,\n ISODateString,\n WeekStartsOn,\n} from '@kalyx/core';\nimport { DatePickerContext } from '../../context/DatePickerContext.js';\nimport type { DatePickerContextValue } from '../../context/DatePickerContext.js';\nimport { useChangeEffect } from '../../hooks/useChangeEffect.js';\n\n/**\n * Props for the DatePicker Root component.\n *\n * @example Controlled\n * ```tsx\n * <DatePicker value={date} onChange={setDate}>\n * <DatePicker.Input />\n * <DatePicker.Popover>\n * <DatePicker.Calendar />\n * </DatePicker.Popover>\n * </DatePicker>\n * ```\n *\n * @example Uncontrolled\n * ```tsx\n * <DatePicker defaultValue=\"2026-01-15T00:00:00.000Z\">\n * <DatePicker.Input />\n * </DatePicker>\n * ```\n */\nexport interface DatePickerRootProps {\n /** Selected date (controlled, ISO 8601 UTC). `null` means empty. */\n value?: ISODateString | null;\n /** Initial date (uncontrolled) */\n defaultValue?: ISODateString;\n /** Callback fired when the date changes */\n onChange?: (value: ISODateString | null) => void;\n /** Callback fired when the popover open state changes */\n onOpenChange?: (isOpen: boolean) => void;\n /**\n * Callback fired when the calendar view navigates to a different month.\n * The value is the ISO string of the first day of the newly-visible month (UTC).\n */\n onCalendarNavigate?: (viewMonth: ISODateString) => void;\n /** Disabled rules */\n disabled?: DisabledRule[] | boolean;\n /** Read-only */\n readOnly?: boolean;\n /** Week start day */\n weekStartsOn?: WeekStartsOn;\n /** Date display format */\n displayFormat?: string;\n /** BCP 47 locale (e.g., \"en-US\", \"ko-KR\", \"ja-JP\") */\n locale?: string;\n /**\n * IANA timezone used for display and selection semantics (e.g., \"Asia/Seoul\").\n * When set, the Input formats the value in this zone, Calendar highlights the matching civil\n * day, and selecting a date emits the civil midnight of that day (UTC-ISO form).\n */\n displayTimezone?: string;\n /** Date adapter */\n adapter?: DateAdapter;\n /** Override ARIA labels (defaults to English) */\n labels?: Partial<DatePickerLabels>;\n /** Child components */\n children: ReactNode;\n}\n\nexport function DatePickerRoot({\n value: controlledValue,\n defaultValue,\n onChange,\n onOpenChange,\n onCalendarNavigate,\n disabled = false,\n readOnly = false,\n weekStartsOn = 0,\n displayFormat = 'yyyy-MM-dd',\n locale = 'en-US',\n displayTimezone,\n adapter = DateFnsAdapter,\n labels: labelsProp,\n children,\n}: DatePickerRootProps) {\n const pickerId = useId();\n const isControlled = useRef(controlledValue !== undefined).current;\n const referenceRef = useRef<HTMLElement | null>(null);\n\n // Internal state for uncontrolled mode\n const [uncontrolledValue, setUncontrolledValue] = useState<ISODateString | null>(\n defaultValue ?? null,\n );\n\n const currentValue = isControlled ? (controlledValue ?? null) : uncontrolledValue;\n\n const [isOpen, setIsOpen] = useState(false);\n\n // Lazy initializers: today() is only computed once per mount instead of on every\n // render. Avoids redundant Date allocations and makes the SSR/hydration contract\n // explicit — neither server nor client re-evaluates the fallback after first render.\n const [viewMonth, setViewMonth] = useState<ISODateString>(\n () => currentValue ?? adapter.today(displayTimezone),\n );\n\n const [focusedDate, setFocusedDate] = useState<ISODateString>(\n () => currentValue ?? adapter.today(displayTimezone),\n );\n\n useChangeEffect(isOpen, onOpenChange);\n const viewMonthStart = useMemo(() => adapter.startOfMonth(viewMonth), [viewMonth, adapter]);\n useChangeEffect(viewMonthStart, onCalendarNavigate);\n\n const mergedLabels = useMemo(\n () => ({ ...DEFAULT_DATEPICKER_LABELS, ...labelsProp }),\n [labelsProp],\n );\n\n const isDisabled = typeof disabled === 'boolean' ? disabled : false;\n const disabledRules: DisabledRule[] = useMemo(\n () => (Array.isArray(disabled) ? disabled : []),\n [disabled],\n );\n\n const selectDate = useCallback(\n (iso: ISODateString | null) => {\n if (isDisabled || readOnly) return;\n\n // The grid emits UTC-midnight ISO strings. When displayTimezone is set, map those to the\n // civil midnight of the same calendar day in that zone — otherwise \"picking Jan 15 in KST\"\n // would save Jan 14 15:00 UTC shifted incorrectly.\n const normalized =\n iso && displayTimezone ? civilMidnightFromUtcDay(iso, displayTimezone) : iso;\n\n if (!isControlled) {\n setUncontrolledValue(normalized);\n }\n onChange?.(normalized);\n\n // Close the popover after selection\n setIsOpen(false);\n },\n [isControlled, isDisabled, readOnly, onChange, displayTimezone],\n );\n\n const open = useCallback(() => {\n if (isDisabled || readOnly) return;\n setIsOpen(true);\n // Reset the view to the current value or today when opening\n const target = currentValue ?? adapter.today(displayTimezone);\n setViewMonth(target);\n setFocusedDate(target);\n }, [isDisabled, readOnly, currentValue, adapter, displayTimezone]);\n\n const close = useCallback(() => {\n setIsOpen(false);\n }, []);\n\n const toggle = useCallback(() => {\n if (isOpen) {\n close();\n } else {\n open();\n }\n }, [isOpen, open, close]);\n\n const contextValue: DatePickerContextValue = useMemo(\n () => ({\n referenceRef,\n value: currentValue,\n selectDate,\n isOpen,\n open,\n close,\n toggle,\n viewMonth,\n setViewMonth,\n focusedDate,\n setFocusedDate,\n adapter,\n disabled: disabledRules,\n weekStartsOn,\n displayFormat,\n locale,\n displayTimezone,\n isDisabled,\n isReadOnly: readOnly,\n pickerId,\n labels: mergedLabels,\n }),\n [\n currentValue,\n selectDate,\n isOpen,\n open,\n close,\n toggle,\n viewMonth,\n focusedDate,\n adapter,\n disabledRules,\n weekStartsOn,\n displayFormat,\n locale,\n displayTimezone,\n isDisabled,\n readOnly,\n pickerId,\n mergedLabels,\n ],\n );\n\n return <DatePickerContext.Provider value={contextValue}>{children}</DatePickerContext.Provider>;\n}\n","import { forwardRef, useCallback, useEffect, useRef, useState } from 'react';\nimport type { InputHTMLAttributes } from 'react';\nimport { parseInputValue } from '@kalyx/core';\nimport { useDatePickerContext } from '../../context/DatePickerContext.js';\n\nexport interface DatePickerInputProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'value' | 'onChange' | 'type'\n> {\n /** Date display format (defaults to parent's displayFormat) */\n format?: string;\n /**\n * Form field name. When set, a hidden `<input type=\"hidden\" name={name} value={ISO}>`\n * is rendered alongside the visible input so the value participates in native form\n * submission (and integrates with `react-hook-form` Controller-less flows).\n */\n name?: string;\n}\n\n/**\n * DatePicker.Input — Combobox-style text input wired to the DatePicker context.\n *\n * Accepts free-form date typing (parsed via the active adapter), opens the popover\n * on click / `ArrowDown`, and commits typed values on `Enter` / blur.\n */\nexport const DatePickerInput = forwardRef<HTMLInputElement, DatePickerInputProps>(\n function DatePickerInput(\n { format: formatProp, name, onClick, onBlur, onKeyDown, ...props },\n ref,\n ) {\n const ctx = useDatePickerContext('DatePicker.Input');\n const displayFormat = formatProp ?? ctx.displayFormat;\n\n // Text currently being edited (edit mode)\n const [inputText, setInputText] = useState<string | null>(null);\n // IME (composition) state — non-Latin scripts like Korean/Japanese/Chinese fire\n // change events for in-progress composition characters. Parsing those mid-stream\n // throws away the user's input. Defer parsing until composition completes.\n const isComposingRef = useRef(false);\n\n // Drop stale typed text when the value changes from outside (parent re-sets,\n // calendar selection, preset click, etc.) so the input doesn't keep displaying\n // an old half-typed string while the source-of-truth has already moved.\n // Skip during IME composition so we don't wipe an in-flight character.\n useEffect(() => {\n if (isComposingRef.current) return;\n setInputText(null);\n }, [ctx.value]);\n\n let formattedValue = '';\n if (ctx.value) {\n try {\n formattedValue = ctx.adapter.format(ctx.value, displayFormat, ctx.displayTimezone);\n } catch {\n formattedValue = ctx.value;\n }\n }\n const displayValue = inputText !== null ? inputText : formattedValue;\n\n // Open on an explicit pointer click, not on focus — tabbing between form\n // fields should not pop the calendar open, and restoring focus after a\n // selection would otherwise loop us back to open.\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLInputElement>) => {\n if (!ctx.isOpen) ctx.open();\n onClick?.(e);\n },\n [ctx, onClick],\n );\n\n // Single commit path used by blur / change / compositionend / Enter.\n // Returns true when a value was committed (parsed or null).\n const commitText = useCallback(\n (text: string): boolean => {\n if (!text) {\n ctx.selectDate(null);\n setInputText(null);\n return true;\n }\n const parsed = parseInputValue(text, ctx.adapter);\n if (parsed) {\n ctx.selectDate(parsed);\n setInputText(null);\n return true;\n }\n return false;\n },\n [ctx],\n );\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n if (inputText !== null) {\n commitText(inputText);\n setInputText(null);\n }\n onBlur?.(e);\n },\n [inputText, commitText, onBlur],\n );\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const text = e.target.value;\n setInputText(text);\n // Don't try to parse partial IME composition output (e.g. \"ㅇ\" before\n // the full Korean syllable is committed). The compositionend handler\n // will parse the final committed value.\n if (isComposingRef.current) return;\n commitText(text);\n },\n [commitText],\n );\n\n const handleCompositionStart = useCallback(() => {\n isComposingRef.current = true;\n }, []);\n\n const handleCompositionEnd = useCallback(\n (e: React.CompositionEvent<HTMLInputElement>) => {\n isComposingRef.current = false;\n commitText((e.target as HTMLInputElement).value);\n },\n [commitText],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Escape') {\n ctx.close();\n } else if (e.key === 'Enter') {\n // Block form submission while the calendar is open. Otherwise an Enter\n // intended to commit a typed date (or simply navigate inside the popover)\n // bubbles up and submits the surrounding <form>, which surprised users.\n if (ctx.isOpen) e.preventDefault();\n if (inputText !== null) {\n commitText(inputText);\n } else if (ctx.isOpen) {\n // No typed text but the popover is open — commit the calendar's\n // currently focused day so Enter \"just works\" even when focus\n // never made it from the input to the day button (notably WebKit).\n ctx.selectDate(ctx.focusedDate);\n }\n } else if (e.key === 'ArrowDown' && !ctx.isOpen) {\n e.preventDefault();\n ctx.open();\n }\n onKeyDown?.(e);\n },\n [ctx, inputText, commitText, onKeyDown],\n );\n\n const calendarId = `${ctx.pickerId}-calendar`;\n\n return (\n <>\n <input\n ref={(node) => {\n // Register as Floating UI reference\n ctx.referenceRef.current = node;\n // Forward the ref\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n }}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={ctx.isOpen}\n aria-haspopup=\"dialog\"\n aria-controls={ctx.isOpen ? calendarId : undefined}\n aria-autocomplete=\"none\"\n autoComplete=\"off\"\n value={displayValue}\n disabled={ctx.isDisabled || props.disabled}\n readOnly={ctx.isReadOnly}\n onChange={handleChange}\n onClick={handleClick}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n onCompositionStart={handleCompositionStart}\n onCompositionEnd={handleCompositionEnd}\n {...props}\n />\n {/* Hidden field for native form submission. Skipped when no `name` is set\n so we don't leak an empty field into the form data unintentionally. */}\n {name ? <input type=\"hidden\" name={name} value={ctx.value ?? ''} /> : null}\n </>\n );\n },\n);\n\nDatePickerInput.displayName = 'DatePicker.Input';\n","import { forwardRef, useCallback } from 'react';\nimport type { ButtonHTMLAttributes, ReactNode } from 'react';\nimport { useDatePickerContext } from '../../context/DatePickerContext.js';\n\nexport interface DatePickerTriggerProps extends Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n 'type'\n> {\n children?: ReactNode;\n}\n\n/**\n * DatePicker.Trigger — Calendar icon button. Toggles the popover on click and\n * announces its state via `aria-expanded` / `aria-haspopup=\"dialog\"`.\n *\n * If you render a `DatePicker.Input`, the input acts as the popover reference;\n * Trigger is purely auxiliary. Without an Input, Trigger becomes the reference.\n */\nexport const DatePickerTrigger = forwardRef<HTMLButtonElement, DatePickerTriggerProps>(\n function DatePickerTrigger({ onClick, children, ...props }, ref) {\n const ctx = useDatePickerContext('DatePicker.Trigger');\n\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n ctx.toggle();\n onClick?.(e);\n },\n [ctx, onClick],\n );\n\n const calendarId = `${ctx.pickerId}-calendar`;\n\n return (\n <button\n ref={(node) => {\n // If there's no Input, Trigger becomes the reference\n if (!ctx.referenceRef.current) ctx.referenceRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n }}\n type=\"button\"\n tabIndex={0}\n aria-label={ctx.isOpen ? ctx.labels.triggerClose : ctx.labels.triggerOpen}\n aria-expanded={ctx.isOpen}\n aria-haspopup=\"dialog\"\n aria-controls={ctx.isOpen ? calendarId : undefined}\n disabled={ctx.isDisabled || props.disabled}\n onClick={handleClick}\n {...props}\n >\n {children ?? (\n <svg\n aria-hidden=\"true\"\n focusable=\"false\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M5 1v2M11 1v2M1 6h14M3 3h10a2 2 0 012 2v8a2 2 0 01-2 2H3a2 2 0 01-2-2V5a2 2 0 012-2z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </button>\n );\n },\n);\n\nDatePickerTrigger.displayName = 'DatePicker.Trigger';\n","import { useCallback, useEffect, useRef } from 'react';\nimport { useFloating, autoUpdate, offset, flip, shift } from '@floating-ui/react';\nimport type { Middleware, Placement } from '@floating-ui/react';\n\n// Hoisted to module scope so it isn't reallocated on every render. Floating UI\n// shallow-compares the middleware array, so a fresh array each render forced\n// useless reposition cycles.\nconst POPOVER_MIDDLEWARE: Middleware[] = [offset(4), flip(), shift({ padding: 8 })];\n\nexport interface UsePopoverOptions {\n isOpen: boolean;\n close: () => void;\n referenceRef: React.RefObject<HTMLElement | null>;\n placement?: Placement;\n}\n\n/**\n * Shared popover behavior: Floating UI positioning, outside-click detection,\n * Escape key handling, and focus restoration on close.\n *\n * Extracted to eliminate duplication between DatePicker.Popover and RangePicker.Popover.\n * Follows the pattern used by Radix UI's usePopover and Ark UI's dismissable layer.\n */\nexport function usePopover({\n isOpen,\n close,\n referenceRef,\n placement = 'bottom-start',\n}: UsePopoverOptions) {\n const floatingRef = useRef<HTMLDivElement | null>(null);\n const previousFocusRef = useRef<HTMLElement | null>(null);\n\n const { refs, floatingStyles, isPositioned } = useFloating({\n open: isOpen,\n placement,\n middleware: POPOVER_MIDDLEWARE,\n whileElementsMounted: autoUpdate,\n });\n\n // Wire the context's referenceRef into Floating UI as a fallback for cases\n // where the popover mounts before reference is updated. The ref callback in\n // setFloatingRef below handles the common synchronous case.\n useEffect(() => {\n if (referenceRef.current) {\n refs.setReference(referenceRef.current);\n }\n }, [referenceRef, refs, isOpen]);\n\n // Focus restoration: restore focus to the previous element on close.\n // Skip restoration to the reference element itself (Input auto-opens on\n // focus, which would immediately reopen the popover).\n useEffect(() => {\n if (isOpen) {\n previousFocusRef.current = document.activeElement as HTMLElement;\n } else if (previousFocusRef.current) {\n const el = previousFocusRef.current;\n previousFocusRef.current = null;\n if (el !== referenceRef.current && typeof el.focus === 'function') {\n el.focus({ preventScroll: true });\n }\n }\n }, [isOpen, referenceRef]);\n\n // Detect outside clicks\n useEffect(() => {\n if (!isOpen) return;\n\n function handleClickOutside(e: MouseEvent) {\n const floating = floatingRef.current;\n const reference = referenceRef.current;\n const target = e.target as Node;\n if (floating && !floating.contains(target) && (!reference || !reference.contains(target))) {\n close();\n }\n }\n\n // Register on next tick to skip the current click event\n const timer = setTimeout(() => {\n document.addEventListener('mousedown', handleClickOutside);\n }, 0);\n\n return () => {\n clearTimeout(timer);\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isOpen, close, referenceRef]);\n\n // Escape key\n useEffect(() => {\n if (!isOpen) return;\n\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n close();\n }\n }\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, close]);\n\n // Focus-out: when the user tabs out of the popover (and out of the reference\n // element), close the popover. This isn't a focus *trap* — keyboard users can\n // still leave with Tab — but it follows the Radix/Ark pattern of closing the\n // overlay when focus leaves so it doesn't dangle while the user is elsewhere.\n useEffect(() => {\n if (!isOpen) return;\n\n function handleFocusOut(e: FocusEvent) {\n // `relatedTarget` is the element receiving focus. If it's null (focus left\n // the document), or if it's outside both the floating layer and reference,\n // close.\n const next = e.relatedTarget as Node | null;\n const floating = floatingRef.current;\n const reference = referenceRef.current;\n if (!next) return; // focus moved to body — leave popover alone\n const insideFloating = floating?.contains(next) ?? false;\n const insideReference = reference?.contains(next) ?? false;\n if (!insideFloating && !insideReference) {\n close();\n }\n }\n\n // `focusout` bubbles, so attach to the floating root once it's mounted.\n const node = floatingRef.current;\n if (!node) return;\n node.addEventListener('focusout', handleFocusOut);\n return () => node.removeEventListener('focusout', handleFocusOut);\n }, [isOpen, close, referenceRef]);\n\n // Set floating + reference together when the popover mounts. The reference\n // is already attached via Input/Trigger's ref callback by the time the\n // popover renders, so calling setReference here means Floating UI has both\n // elements before paint — eliminating the unpositioned first-frame flash.\n const setFloatingRef = useCallback(\n (node: HTMLDivElement | null) => {\n floatingRef.current = node;\n refs.setFloating(node);\n if (node && referenceRef.current) {\n refs.setReference(referenceRef.current);\n }\n },\n [refs, referenceRef],\n );\n\n return { floatingStyles, setFloatingRef, isPositioned };\n}\n","import type { HTMLAttributes, ReactNode } from 'react';\nimport { useDatePickerContext } from '../../context/DatePickerContext.js';\nimport { usePopover } from '../../hooks/usePopover.js';\n\nexport interface DatePickerPopoverProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role'> {\n children?: ReactNode;\n}\n\nexport function DatePickerPopover({ children, ...props }: DatePickerPopoverProps) {\n const ctx = useDatePickerContext('DatePicker.Popover');\n const calendarId = `${ctx.pickerId}-calendar`;\n\n const { floatingStyles, setFloatingRef, isPositioned } = usePopover({\n isOpen: ctx.isOpen,\n close: ctx.close,\n referenceRef: ctx.referenceRef,\n });\n\n if (!ctx.isOpen) return null;\n\n const { style: userStyle, ...rest } = props;\n\n return (\n <div\n ref={setFloatingRef}\n id={calendarId}\n role=\"dialog\"\n aria-label={ctx.labels.popoverLabel}\n aria-modal=\"false\"\n {...rest}\n style={{\n ...userStyle,\n ...floatingStyles,\n visibility: isPositioned ? undefined : 'hidden',\n }}\n >\n {children}\n </div>\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { HTMLAttributes } from 'react';\nimport {\n getCalendarDays,\n getISOWeekNumber,\n isDateDisabled,\n getWeekdayNames,\n formatMonthYear,\n formatFullDate,\n} from '@kalyx/core';\nimport type { CalendarDay } from '@kalyx/core';\nimport { useDatePickerContext } from '../../context/DatePickerContext.js';\n\nexport interface DatePickerCalendarClassNames {\n root?: string;\n header?: string;\n title?: string;\n navButton?: string;\n grid?: string;\n gridRow?: string;\n gridCell?: string;\n day?: string;\n daySelected?: string;\n dayToday?: string;\n dayDisabled?: string;\n dayOutsideMonth?: string;\n weekdayHeader?: string;\n /** Header cell at the top of the week-number column. Rendered only when `showWeekNumber` is set. */\n weekNumberHeader?: string;\n /** Each row's week-number cell. Rendered only when `showWeekNumber` is set. */\n weekNumber?: string;\n}\n\nexport interface DatePickerCalendarProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role'> {\n classNames?: DatePickerCalendarClassNames;\n /** Called when the title (\"January 2026\") is clicked. Useful for switching to Month/Year views. */\n onTitleClick?: () => void;\n /**\n * Render an ISO 8601 week-number column on the left of the grid (1–53).\n * The column is a `<th scope=\"row\">`; it doesn't participate in the WAI-ARIA grid\n * data region, so keyboard navigation across the date cells is unaffected.\n */\n showWeekNumber?: boolean;\n /**\n * Always render 6 weeks (42 cells), even when the month fits in 4 or 5 rows. Useful for\n * popover layouts that need a fixed height across month navigation.\n */\n fixedWeeks?: boolean;\n}\n\n/** Safe wrapper for formatFullDate — falls back to ISO string on error */\nfunction safeFormatFullDate(iso: string, locale: string): string {\n try {\n return formatFullDate(iso, locale);\n } catch {\n return iso;\n }\n}\n\n/** Visually-hidden style for screen-reader-only content */\nconst srOnly: React.CSSProperties = {\n position: 'absolute',\n width: '1px',\n height: '1px',\n padding: 0,\n margin: '-1px',\n overflow: 'hidden',\n clip: 'rect(0, 0, 0, 0)',\n whiteSpace: 'nowrap',\n border: 0,\n};\n\nexport function DatePickerCalendar({\n classNames,\n onTitleClick,\n showWeekNumber = false,\n fixedWeeks = false,\n ...props\n}: DatePickerCalendarProps) {\n const ctx = useDatePickerContext('DatePicker.Calendar');\n const gridRef = useRef<HTMLTableElement>(null);\n const [announcement, setAnnouncement] = useState('');\n\n const { adapter, viewMonth, focusedDate, weekStartsOn, disabled, locale, displayTimezone } = ctx;\n // Memoized — weekday header tuples only change when locale or week start changes.\n const weekdays = useMemo(() => getWeekdayNames(locale, weekStartsOn), [locale, weekStartsOn]);\n\n // Recompute cell flags with a timezone-aware today/selected matcher when displayTimezone is set.\n // The grid iteration stays in UTC — only the `isSelected` / `isToday` highlighting shifts.\n // Memoized so the 42-cell grid isn't rebuilt on unrelated re-renders (parent state, etc.).\n const weeks = useMemo(\n () =>\n getCalendarDays(viewMonth, adapter, {\n weekStartsOn,\n selected: ctx.value,\n focusedDate,\n disabled,\n timezone: displayTimezone,\n fixedWeeks,\n }),\n [\n viewMonth,\n adapter,\n weekStartsOn,\n ctx.value,\n focusedDate,\n disabled,\n displayTimezone,\n fixedWeeks,\n ],\n );\n\n // For each row, derive the ISO week number from the Thursday cell — Thursday is always\n // in the row's \"owning\" ISO week regardless of weekStartsOn, so this is stable across\n // week-start configurations.\n const thursdayIndex = weekStartsOn === 0 ? 4 : 3;\n\n const year = adapter.getYear(viewMonth);\n const month = adapter.getMonth(viewMonth);\n const title = formatMonthYear(year, month, locale);\n\n // Move focus to the focused day cell. `preventScroll` avoids the page\n // jumping when the calendar mounts below an input/trigger that's already\n // scrolled into view.\n useEffect(() => {\n if (!ctx.isOpen || !gridRef.current) return;\n const focusedButton = gridRef.current.querySelector<HTMLButtonElement>('[data-focused=\"true\"]');\n focusedButton?.focus({ preventScroll: true });\n }, [focusedDate, ctx.isOpen]);\n\n const navigateMonth = useCallback(\n (direction: number) => {\n const newMonth = adapter.addMonths(viewMonth, direction);\n ctx.setViewMonth(newMonth);\n ctx.setFocusedDate(adapter.startOfMonth(newMonth));\n const y = adapter.getYear(newMonth);\n const m = adapter.getMonth(newMonth);\n setAnnouncement(formatMonthYear(y, m, locale));\n },\n [adapter, viewMonth, ctx, locale],\n );\n\n const handleDayClick = useCallback(\n (day: CalendarDay) => {\n if (day.isDisabled) return;\n ctx.selectDate(day.isoString);\n setAnnouncement(safeFormatFullDate(day.isoString, locale));\n },\n [ctx, locale],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n let newFocused: string | null = null;\n\n switch (e.key) {\n case 'ArrowLeft':\n newFocused = adapter.addDays(focusedDate, -1);\n break;\n case 'ArrowRight':\n newFocused = adapter.addDays(focusedDate, 1);\n break;\n case 'ArrowUp':\n newFocused = adapter.addDays(focusedDate, -7);\n break;\n case 'ArrowDown':\n newFocused = adapter.addDays(focusedDate, 7);\n break;\n case 'PageUp':\n if (e.shiftKey) {\n newFocused = adapter.addYears(focusedDate, -1);\n } else {\n newFocused = adapter.addMonths(focusedDate, -1);\n }\n break;\n case 'PageDown':\n if (e.shiftKey) {\n newFocused = adapter.addYears(focusedDate, 1);\n } else {\n newFocused = adapter.addMonths(focusedDate, 1);\n }\n break;\n case 'Home':\n newFocused = adapter.startOfWeek(focusedDate, weekStartsOn);\n break;\n case 'End':\n newFocused = adapter.endOfWeek(focusedDate, weekStartsOn);\n // endOfWeek returns 23:59:59; normalize to start of day\n newFocused = adapter.startOfDay(newFocused);\n break;\n case 'Enter':\n case ' ':\n e.preventDefault();\n if (!isDateDisabled(focusedDate, disabled, adapter)) {\n ctx.selectDate(focusedDate);\n }\n return;\n case 'Escape':\n ctx.close();\n return;\n default:\n return;\n }\n\n if (newFocused) {\n e.preventDefault();\n\n // WAI-ARIA grid pattern: disabled cells should be skipped during keyboard\n // navigation. Keep stepping in the original direction until we land on an\n // enabled day, capped at 42 attempts (one full grid) to avoid infinite loops\n // when every day in range is disabled.\n const skipStep =\n e.key === 'ArrowLeft' || e.key === 'ArrowUp' || e.key === 'PageUp' || e.key === 'Home'\n ? -1\n : 1;\n let attempts = 0;\n while (isDateDisabled(newFocused, disabled, adapter) && attempts < 42) {\n newFocused = adapter.addDays(newFocused, skipStep);\n attempts++;\n }\n if (attempts >= 42) {\n // No reachable enabled date in this direction — leave focus where it was.\n return;\n }\n\n ctx.setFocusedDate(newFocused);\n\n // Update the view when focus moves outside the current view month\n if (!adapter.isSameMonth(newFocused, viewMonth)) {\n ctx.setViewMonth(newFocused);\n }\n }\n },\n [adapter, focusedDate, viewMonth, weekStartsOn, disabled, ctx],\n );\n\n return (\n <div className={classNames?.root} {...props}>\n <div className={classNames?.header}>\n <button\n type=\"button\"\n className={classNames?.navButton}\n onClick={() => navigateMonth(-1)}\n aria-label={ctx.labels.prevMonth}\n >\n <\n </button>\n {onTitleClick ? (\n <button\n type=\"button\"\n className={classNames?.title}\n onClick={onTitleClick}\n aria-live=\"polite\"\n >\n {title}\n </button>\n ) : (\n <span className={classNames?.title} aria-live=\"polite\">\n {title}\n </span>\n )}\n <button\n type=\"button\"\n className={classNames?.navButton}\n onClick={() => navigateMonth(1)}\n aria-label={ctx.labels.nextMonth}\n >\n >\n </button>\n </div>\n\n <table\n ref={gridRef}\n role=\"grid\"\n aria-label={title}\n aria-rowcount={weeks.length + 1}\n aria-colcount={7}\n className={classNames?.grid}\n onKeyDown={handleKeyDown}\n >\n <thead>\n <tr role=\"row\" aria-rowindex={1}>\n {showWeekNumber ? (\n <th scope=\"col\" aria-hidden=\"true\" className={classNames?.weekNumberHeader}>\n #\n </th>\n ) : null}\n {weekdays.map((day, colIndex) => (\n <th\n key={day.short}\n role=\"columnheader\"\n abbr={day.full}\n scope=\"col\"\n aria-colindex={colIndex + 1}\n className={classNames?.weekdayHeader}\n >\n {day.short}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {weeks.map((week, weekIndex) => (\n <tr\n key={weekIndex}\n role=\"row\"\n aria-rowindex={weekIndex + 2}\n className={classNames?.gridRow}\n >\n {showWeekNumber ? (\n <th\n scope=\"row\"\n aria-hidden=\"true\"\n className={classNames?.weekNumber}\n data-week-number\n >\n {getISOWeekNumber(week[thursdayIndex]!.isoString)}\n </th>\n ) : null}\n {week.map((day, colIndex) => {\n const dayClasses =\n [\n classNames?.day,\n day.isSelected && classNames?.daySelected,\n day.isToday && classNames?.dayToday,\n day.isDisabled && classNames?.dayDisabled,\n !day.isCurrentMonth && classNames?.dayOutsideMonth,\n ]\n .filter(Boolean)\n .join(' ') || undefined;\n\n return (\n <td\n key={day.isoString}\n role=\"gridcell\"\n aria-colindex={colIndex + 1}\n aria-selected={day.isSelected || undefined}\n aria-disabled={day.isDisabled || undefined}\n aria-current={day.isToday ? 'date' : undefined}\n className={classNames?.gridCell}\n >\n <button\n type=\"button\"\n tabIndex={day.isFocused ? 0 : -1}\n disabled={day.isDisabled}\n data-focused={day.isFocused || undefined}\n data-selected={day.isSelected || undefined}\n data-today={day.isToday || undefined}\n data-outside-month={!day.isCurrentMonth || undefined}\n className={dayClasses}\n onClick={() => handleDayClick(day)}\n aria-label={safeFormatFullDate(day.isoString, locale)}\n >\n {day.dayNumber}\n </button>\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n\n <div role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" style={srOnly}>\n {announcement}\n </div>\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport type { KeyboardEvent } from 'react';\nimport type { DateAdapter, DisabledRule, ISODateString } from '@kalyx/core';\n\n/**\n * A range of dates `[start, end]` is \"fully disabled\" when every day in it is\n * excluded by a `before` or `after` rule. `date` and `dayOfWeek` rules only\n * disable individual days, so they never disable an entire range.\n *\n * Used by `MonthPicker.Grid` and `YearPicker.Grid` to mark a whole month or\n * year unselectable when min/max bounds rule it out.\n */\nexport function isRangeFullyDisabled(\n start: ISODateString,\n end: ISODateString,\n rules: DisabledRule[],\n adapter: DateAdapter,\n): boolean {\n for (const rule of rules) {\n if ('before' in rule && adapter.isBefore(end, rule.before)) return true;\n if ('after' in rule && adapter.isAfter(start, rule.after)) return true;\n }\n return false;\n}\n\nexport interface UseGridStateOptions {\n /** Initial focused-cell index (0..11). */\n initialIndex: number;\n /**\n * Per-cell disabled flags (length 12). When provided, keyboard navigation\n * skips cells where the flag is true; if no enabled cell remains in the\n * travel direction, focus is left where it was.\n */\n disabledFlags?: boolean[];\n /** Enter / Space — receives the focused index. */\n onSelect: (index: number) => void;\n /** PageUp — typically navigates to the previous frame (year/decade). */\n onPageUp: () => void;\n /** PageDown — typically navigates to the next frame. */\n onPageDown: () => void;\n /** Escape — typically closes the popover. */\n onEscape: () => void;\n}\n\n/**\n * Shared WAI-ARIA grid keyboard handler + roving-focus state for the four 3×4\n * picker grids (`DatePicker.MonthGrid` / `YearGrid`, `MonthPicker.Grid`,\n * `YearPicker.Grid`).\n *\n * - Arrow keys: ±1 column / ±3 rows, clamped to grid bounds.\n * - Home / End: row-first / row-last cell.\n * - PageUp / PageDown: delegated to caller (year/decade navigation).\n * - Enter / Space: delegated commit/drilldown.\n * - Disabled cells (when `disabledFlags` is provided) are skipped in the\n * original travel direction.\n * - Auto-refocus on focusedIndex change. (All four grids use stable index\n * keys, so DOM nodes persist across page nav and DOM focus is preserved\n * without an extra dependency.)\n */\nexport function useGridState(opts: UseGridStateOptions) {\n const { initialIndex, disabledFlags, onSelect, onPageUp, onPageDown, onEscape } = opts;\n const gridRef = useRef<HTMLDivElement>(null);\n const [focusedIndex, setFocusedIndex] = useState<number>(initialIndex);\n\n const handleKeyDown = (e: KeyboardEvent) => {\n let next: number | null = null;\n let step = 1;\n switch (e.key) {\n case 'ArrowLeft':\n next = Math.max(0, focusedIndex - 1);\n step = -1;\n break;\n case 'ArrowRight':\n next = Math.min(11, focusedIndex + 1);\n break;\n case 'ArrowUp':\n next = Math.max(0, focusedIndex - 3);\n step = -1;\n break;\n case 'ArrowDown':\n next = Math.min(11, focusedIndex + 3);\n break;\n case 'Home':\n next = focusedIndex - (focusedIndex % 3);\n step = -1;\n break;\n case 'End':\n next = focusedIndex - (focusedIndex % 3) + 2;\n break;\n case 'PageUp':\n e.preventDefault();\n onPageUp();\n return;\n case 'PageDown':\n e.preventDefault();\n onPageDown();\n return;\n case 'Enter':\n case ' ':\n e.preventDefault();\n onSelect(focusedIndex);\n return;\n case 'Escape':\n onEscape();\n return;\n default:\n return;\n }\n if (next === null) return;\n e.preventDefault();\n\n if (disabledFlags) {\n let attempts = 0;\n while (next >= 0 && next < 12 && disabledFlags[next] && attempts < 12) {\n next += step;\n attempts++;\n }\n if (next < 0 || next >= 12 || disabledFlags[next]) return;\n }\n if (next !== focusedIndex) setFocusedIndex(next);\n };\n\n // Re-anchor focus when the cell at `focusedIndex` has become disabled\n // (e.g. after the consumer navigated to a year where the same column is now\n // out of range). A `disabled` HTML button can't receive DOM focus, so\n // without this we'd land focus on nothing and the user would lose keyboard\n // navigation.\n useEffect(() => {\n if (!disabledFlags || !disabledFlags[focusedIndex]) return;\n const firstEnabled = disabledFlags.findIndex((d) => !d);\n if (firstEnabled !== -1 && firstEnabled !== focusedIndex) {\n setFocusedIndex(firstEnabled);\n }\n }, [disabledFlags, focusedIndex]);\n\n useEffect(() => {\n const btn = gridRef.current?.querySelector<HTMLButtonElement>('[data-focused=\"true\"]');\n btn?.focus({ preventScroll: true });\n }, [focusedIndex]);\n\n return { gridRef, focusedIndex, handleKeyDown };\n}\n","import { useCallback, useEffect, useState } from 'react';\nimport type { HTMLAttributes } from 'react';\nimport { getMonthName, type ISODateString } from '@kalyx/core';\nimport { useDatePickerContext } from '../../context/DatePickerContext.js';\nimport { useGridState } from '../_shared/grid-keyboard.js';\n\nexport interface DatePickerMonthGridClassNames {\n root?: string;\n header?: string;\n title?: string;\n navButton?: string;\n grid?: string;\n month?: string;\n monthSelected?: string;\n monthCurrent?: string;\n}\n\nexport interface DatePickerMonthGridProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role'> {\n classNames?: DatePickerMonthGridClassNames;\n /** Called when a month is selected. Typically used to switch back to the day view. */\n onSelect?: () => void;\n /** Called when the title (year) is clicked. Useful for switching to the year view. */\n onTitleClick?: () => void;\n}\n\n/**\n * DatePicker.MonthGrid — Quickly pick a month from a 12-month grid.\n * Click Calendar title -> MonthGrid -> click a month -> back to Calendar.\n *\n * @example\n * ```tsx\n * {view === 'months' && (\n * <DatePicker.MonthGrid\n * onSelect={() => setView('days')}\n * onTitleClick={() => setView('years')}\n * />\n * )}\n * ```\n */\nexport function DatePickerMonthGrid({\n classNames,\n onSelect,\n onTitleClick,\n ...props\n}: DatePickerMonthGridProps) {\n const ctx = useDatePickerContext('DatePicker.MonthGrid');\n const { adapter, viewMonth, locale, displayTimezone } = ctx;\n\n const currentYear = adapter.getYear(viewMonth);\n const currentMonth = adapter.getMonth(viewMonth);\n // SSR-safe: today is null on server and during hydration, set after mount.\n // Avoids server/client clock-mismatch hydration warnings across day boundaries.\n const [today, setToday] = useState<ISODateString | null>(null);\n useEffect(() => {\n setToday(adapter.today(displayTimezone));\n }, [adapter, displayTimezone]);\n const todayMonth = today !== null ? adapter.getMonth(today) : -1;\n const todayYear = today !== null ? adapter.getYear(today) : -1;\n\n const navigateYear = useCallback(\n (direction: number) => {\n ctx.setViewMonth(adapter.addYears(viewMonth, direction));\n },\n [adapter, viewMonth, ctx],\n );\n\n const handleMonthSelect = useCallback(\n (monthIndex: number) => {\n const target = new Date(Date.UTC(currentYear, monthIndex, 1)).toISOString();\n ctx.setViewMonth(target);\n ctx.setFocusedDate(target);\n onSelect?.();\n },\n [currentYear, ctx, onSelect],\n );\n\n const { gridRef, focusedIndex, handleKeyDown } = useGridState({\n initialIndex: currentMonth,\n onSelect: handleMonthSelect,\n onPageUp: () => navigateYear(-1),\n onPageDown: () => navigateYear(1),\n onEscape: ctx.close,\n });\n\n return (\n <div className={classNames?.root} {...props}>\n <div className={classNames?.header}>\n <button\n type=\"button\"\n className={classNames?.navButton}\n onClick={() => navigateYear(-1)}\n aria-label={ctx.labels.prevYear}\n >\n <\n </button>\n {onTitleClick ? (\n <button type=\"button\" className={classNames?.title} onClick={onTitleClick}>\n {currentYear}\n </button>\n ) : (\n <span className={classNames?.title}>{currentYear}</span>\n )}\n <button\n type=\"button\"\n className={classNames?.navButton}\n onClick={() => navigateYear(1)}\n aria-label={ctx.labels.nextYear}\n >\n >\n </button>\n </div>\n\n <div\n ref={gridRef}\n role=\"grid\"\n aria-label={`${currentYear} months`}\n className={classNames?.grid}\n style={{ display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)' }}\n onKeyDown={handleKeyDown}\n >\n {Array.from({ length: 12 }, (_, i) => {\n const isSelected = i === currentMonth;\n const isCurrent = i === todayMonth && currentYear === todayYear;\n const isFocused = i === focusedIndex;\n const cls =\n [\n classNames?.month,\n isSelected && classNames?.monthSelected,\n isCurrent && classNames?.monthCurrent,\n ]\n .filter(Boolean)\n .join(' ') || undefined;\n\n return (\n <button\n key={i}\n type=\"button\"\n role=\"gridcell\"\n tabIndex={isFocused ? 0 : -1}\n aria-selected={isSelected || undefined}\n aria-current={isCurrent ? 'date' : undefined}\n data-selected={isSelected || undefined}\n data-current={isCurrent || undefined}\n data-focused={isFocused || undefined}\n className={cls}\n onClick={() => handleMonthSelect(i)}\n >\n {getMonthName(i, locale)}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n","import { useCallback, useEffect, useState } from 'react';\nimport type { HTMLAttributes } from 'react';\nimport type { ISODateString } from '@kalyx/core';\nimport { useDatePickerContext } from '../../context/DatePickerContext.js';\nimport { useGridState } from '../_shared/grid-keyboard.js';\n\nexport interface DatePickerYearGridClassNames {\n root?: string;\n header?: string;\n title?: string;\n navButton?: string;\n grid?: string;\n year?: string;\n yearSelected?: string;\n yearCurrent?: string;\n}\n\nexport interface DatePickerYearGridProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role'> {\n classNames?: DatePickerYearGridClassNames;\n /** Called when a year is selected. Typically used to switch back to the month view. */\n onSelect?: () => void;\n}\n\n/**\n * DatePicker.YearGrid — Quickly pick a year from a 12-year grid.\n * Click MonthGrid title -> YearGrid -> click a year -> back to MonthGrid.\n *\n * @example\n * ```tsx\n * {view === 'years' && (\n * <DatePicker.YearGrid onSelect={() => setView('months')} />\n * )}\n * ```\n */\nexport function DatePickerYearGrid({ classNames, onSelect, ...props }: DatePickerYearGridProps) {\n const ctx = useDatePickerContext('DatePicker.YearGrid');\n const { adapter, viewMonth, displayTimezone } = ctx;\n\n const currentYear = adapter.getYear(viewMonth);\n // SSR-safe: today is null on server and during hydration, set after mount.\n const [today, setToday] = useState<ISODateString | null>(null);\n useEffect(() => {\n setToday(adapter.today(displayTimezone));\n }, [adapter, displayTimezone]);\n const todayYear = today !== null ? adapter.getYear(today) : -1;\n\n // 12-year range (decade block containing the current year)\n const decadeStart = currentYear - (currentYear % 12);\n\n const navigateDecade = useCallback(\n (direction: number) => {\n ctx.setViewMonth(adapter.addYears(viewMonth, direction * 12));\n },\n [adapter, viewMonth, ctx],\n );\n\n const handleYearSelect = useCallback(\n (indexInDecade: number) => {\n const year = decadeStart + indexInDecade;\n const currentMonth = adapter.getMonth(viewMonth);\n const target = new Date(Date.UTC(year, currentMonth, 1)).toISOString();\n ctx.setViewMonth(target);\n ctx.setFocusedDate(target);\n onSelect?.();\n },\n [adapter, viewMonth, ctx, onSelect, decadeStart],\n );\n\n const { gridRef, focusedIndex, handleKeyDown } = useGridState({\n initialIndex: currentYear - decadeStart,\n onSelect: handleYearSelect,\n onPageUp: () => navigateDecade(-1),\n onPageDown: () => navigateDecade(1),\n onEscape: ctx.close,\n });\n\n const rangeLabel = `${decadeStart}–${decadeStart + 11}`;\n\n return (\n <div className={classNames?.root} {...props}>\n <div className={classNames?.header}>\n <button\n type=\"button\"\n className={classNames?.navButton}\n onClick={() => navigateDecade(-1)}\n aria-label={ctx.labels.prevDecade}\n >\n <\n </button>\n <span className={classNames?.title}>{rangeLabel}</span>\n <button\n type=\"button\"\n className={classNames?.navButton}\n onClick={() => navigateDecade(1)}\n aria-label={ctx.labels.nextDecade}\n >\n >\n </button>\n </div>\n\n <div\n ref={gridRef}\n role=\"grid\"\n aria-label={rangeLabel}\n className={classNames?.grid}\n style={{ display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)' }}\n onKeyDown={handleKeyDown}\n >\n {Array.from({ length: 12 }, (_, i) => {\n const year = decadeStart + i;\n const isSelected = year === currentYear;\n const isCurrent = year === todayYear;\n const isFocused = i === focusedIndex;\n const cls =\n [\n classNames?.year,\n isSelected && classNames?.yearSelected,\n isCurrent && classNames?.yearCurrent,\n ]\n .filter(Boolean)\n .join(' ') || undefined;\n return (\n <button\n // Stable index key keeps the DOM node mounted across decade\n // navigation so focus on the same-position cell persists.\n key={i}\n type=\"button\"\n role=\"gridcell\"\n tabIndex={isFocused ? 0 : -1}\n aria-selected={isSelected || undefined}\n aria-current={isCurrent ? 'date' : undefined}\n data-selected={isSelected || undefined}\n data-current={isCurrent || undefined}\n data-focused={isFocused || undefined}\n className={cls}\n onClick={() => handleYearSelect(i)}\n >\n {year}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n","import { useCallback } from 'react';\nimport type { HTMLAttributes, ReactNode } from 'react';\nimport type { ISODateString } from '@kalyx/core';\nimport { useDatePickerContext } from '../../context/DatePickerContext.js';\n\n/** Predefined single-date preset keys. Pass a custom ISO via `date` for anything else. */\nexport type DatePickerPresetKey =\n | 'today'\n | 'tomorrow'\n | 'yesterday'\n | 'startOfMonth'\n | 'endOfMonth'\n | 'startOfYear';\n\nexport interface DatePickerPresetsClassNames {\n root?: string;\n preset?: string;\n presetActive?: string;\n}\n\nexport interface DatePickerPresetsProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role'> {\n classNames?: DatePickerPresetsClassNames;\n children?: ReactNode;\n}\n\n/**\n * DatePicker.Presets — Container wrapping preset buttons.\n *\n * @example\n * ```tsx\n * <DatePicker.Presets>\n * <DatePicker.Preset value=\"today\">Today</DatePicker.Preset>\n * <DatePicker.Preset value=\"tomorrow\">Tomorrow</DatePicker.Preset>\n * </DatePicker.Presets>\n * ```\n */\nexport function DatePickerPresets({ classNames, children, ...props }: DatePickerPresetsProps) {\n const ctx = useDatePickerContext('DatePicker.Presets');\n return (\n <div role=\"group\" aria-label={ctx.labels.popoverLabel} className={classNames?.root} {...props}>\n {children}\n </div>\n );\n}\n\ntype PresetAdapter = {\n addDays: (iso: string, n: number) => string;\n startOfMonth: (iso: string) => string;\n endOfMonth: (iso: string) => string;\n startOfDay: (iso: string, timezone?: string) => string;\n addMonths: (iso: string, n: number) => string;\n getMonth: (iso: string) => number;\n};\n\nfunction resolveDatePreset(\n key: DatePickerPresetKey,\n today: ISODateString,\n adapter: PresetAdapter,\n): ISODateString {\n switch (key) {\n case 'today':\n return today;\n case 'tomorrow':\n return adapter.addDays(today, 1);\n case 'yesterday':\n return adapter.addDays(today, -1);\n case 'startOfMonth':\n return adapter.startOfMonth(today);\n case 'endOfMonth':\n return adapter.startOfDay(adapter.endOfMonth(today));\n case 'startOfYear': {\n const currentMonth = adapter.getMonth(today);\n return adapter.startOfMonth(adapter.addMonths(today, -currentMonth));\n }\n }\n}\n\nexport interface DatePickerPresetProps extends Omit<HTMLAttributes<HTMLButtonElement>, 'value'> {\n /** Predefined preset key; omit when passing `date` directly */\n value?: DatePickerPresetKey;\n /** Pass an ISO date directly (alternative to `value`) */\n date?: ISODateString;\n children: ReactNode;\n className?: string;\n}\n\n/**\n * DatePicker.Preset — One-click preset button to select a specific date.\n *\n * Pass either `value` (a preset key) or `date` (a direct ISO string).\n *\n * @example\n * ```tsx\n * <DatePicker.Preset value=\"today\">Today</DatePicker.Preset>\n * <DatePicker.Preset date=\"2026-01-01T00:00:00.000Z\">New Year's</DatePicker.Preset>\n * ```\n */\nexport function DatePickerPreset({\n value: presetKey,\n date: directDate,\n children,\n onClick,\n ...props\n}: DatePickerPresetProps) {\n const ctx = useDatePickerContext('DatePicker.Preset');\n\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n if (ctx.isDisabled || ctx.isReadOnly) return;\n\n let resolved: ISODateString;\n if (directDate) {\n resolved = directDate;\n } else if (presetKey) {\n resolved = resolveDatePreset(\n presetKey,\n ctx.adapter.today(ctx.displayTimezone),\n ctx.adapter,\n );\n } else {\n return;\n }\n\n ctx.selectDate(resolved);\n onClick?.(e);\n },\n [ctx, presetKey, directDate, onClick],\n );\n\n // Active when the preset's resolved date equals the current value (same civil day, tz-aware).\n const isActive = (() => {\n if (!ctx.value) return false;\n let target: ISODateString;\n if (directDate) {\n target = directDate;\n } else if (presetKey) {\n target = resolveDatePreset(presetKey, ctx.adapter.today(ctx.displayTimezone), ctx.adapter);\n } else {\n return false;\n }\n return ctx.adapter.isSameDay(ctx.value, target, ctx.displayTimezone);\n })();\n\n // role=\"option\" is invalid outside role=\"listbox\"/role=\"combobox\"; the parent\n // <DatePicker.Presets> is role=\"group\". Use a regular button with aria-pressed\n // so the active state is announced as a toggle.\n return (\n <button\n type=\"button\"\n aria-pressed={isActive}\n data-active={isActive || undefined}\n disabled={ctx.isDisabled}\n onClick={handleClick}\n {...props}\n >\n {children}\n </button>\n );\n}\n","import { DatePickerRoot } from './Root.js';\nimport { DatePickerInput } from './Input.js';\nimport { DatePickerTrigger } from './Trigger.js';\nimport { DatePickerPopover } from './Popover.js';\nimport { DatePickerCalendar } from './Calendar.js';\nimport { DatePickerMonthGrid } from './MonthGrid.js';\nimport { DatePickerYearGrid } from './YearGrid.js';\nimport { DatePickerPresets, DatePickerPreset } from './Presets.js';\n\nimport type { DatePickerRootProps } from './Root.js';\nimport type { DatePickerInputProps } from './Input.js';\nimport type { DatePickerTriggerProps } from './Trigger.js';\nimport type { DatePickerPopoverProps } from './Popover.js';\nimport type { DatePickerCalendarProps, DatePickerCalendarClassNames } from './Calendar.js';\nimport type { DatePickerMonthGridProps, DatePickerMonthGridClassNames } from './MonthGrid.js';\nimport type { DatePickerYearGridProps, DatePickerYearGridClassNames } from './YearGrid.js';\nimport type {\n DatePickerPresetsProps,\n DatePickerPresetsClassNames,\n DatePickerPresetProps,\n DatePickerPresetKey,\n} from './Presets.js';\n\n/**\n * DatePicker — Headless, SSR-safe React DatePicker\n *\n * @example Basic\n * ```tsx\n * <DatePicker value={date} onChange={setDate}>\n * <DatePicker.Input placeholder=\"날짜 선택\" />\n * <DatePicker.Popover>\n * <DatePicker.Calendar />\n * </DatePicker.Popover>\n * </DatePicker>\n * ```\n *\n * @example Month/Year quick navigation\n * ```tsx\n * const [view, setView] = useState('days');\n * <DatePicker value={date} onChange={setDate}>\n * <DatePicker.Input />\n * <DatePicker.Popover>\n * {view === 'days' && <DatePicker.Calendar onTitleClick={() => setView('months')} />}\n * {view === 'months' && <DatePicker.MonthGrid onSelect={() => setView('days')} onTitleClick={() => setView('years')} />}\n * {view === 'years' && <DatePicker.YearGrid onSelect={() => setView('months')} />}\n * </DatePicker.Popover>\n * </DatePicker>\n * ```\n */\nexport const DatePicker = Object.assign(DatePickerRoot, {\n Input: DatePickerInput,\n Trigger: DatePickerTrigger,\n Popover: DatePickerPopover,\n Calendar: DatePickerCalendar,\n MonthGrid: DatePickerMonthGrid,\n YearGrid: DatePickerYearGrid,\n Presets: DatePickerPresets,\n Preset: DatePickerPreset,\n});\n\nexport type {\n DatePickerRootProps,\n DatePickerInputProps,\n DatePickerTriggerProps,\n DatePickerPopoverProps,\n DatePickerCalendarProps,\n DatePickerCalendarClassNames,\n DatePickerMonthGridProps,\n DatePickerMonthGridClassNames,\n DatePickerYearGridProps,\n DatePickerYearGridClassNames,\n DatePickerPresetsProps,\n DatePickerPresetsClassNames,\n DatePickerPresetProps,\n DatePickerPresetKey,\n};\n","import { createContext, useContext } from 'react';\nimport type { RefObject } from 'react';\nimport type {\n DateAdapter,\n DateRange,\n DisabledRule,\n ISODateString,\n RangePickerLabels,\n WeekStartsOn,\n} from '@kalyx/core';\n\n/** Which part to select next (start | end) */\nexport type RangeSelectingTarget = 'start' | 'end';\n\nexport interface RangePickerContextValue {\n /** Floating UI reference element */\n referenceRef: RefObject<HTMLElement | null>;\n /** Currently selected range */\n value: DateRange;\n /** Update the entire range object */\n setRange: (range: DateRange) => void;\n /** Single-date click; automatically decides start/end */\n selectDate: (iso: ISODateString) => void;\n /** Which part gets selected next (start first, then end) */\n selectingTarget: RangeSelectingTarget;\n /** Hovered date (for range preview) */\n hoverDate: ISODateString | null;\n setHoverDate: (iso: ISODateString | null) => void;\n /** Popover open state */\n isOpen: boolean;\n open: () => void;\n close: () => void;\n toggle: () => void;\n /** Currently displayed month */\n viewMonth: ISODateString;\n setViewMonth: (iso: ISODateString) => void;\n /** Currently focused date in the calendar */\n focusedDate: ISODateString;\n setFocusedDate: (iso: ISODateString) => void;\n /** Date adapter */\n adapter: DateAdapter;\n /** Disabled rules */\n disabled: DisabledRule[];\n /** Week start day */\n weekStartsOn: WeekStartsOn;\n /** Date display format */\n displayFormat: string;\n /** BCP 47 locale */\n locale: string;\n /** IANA timezone for display (see DatePickerContext#displayTimezone) */\n displayTimezone?: string;\n /** Whether entire picker is disabled */\n isDisabled: boolean;\n /** Read-only */\n isReadOnly: boolean;\n /** Unique ID */\n pickerId: string;\n /** ARIA labels */\n labels: RangePickerLabels;\n /**\n * Push a transient message to the picker's `role=\"status\"` live region.\n * The live region lives on Root so it survives popover close/Calendar unmount\n * — without that, announcements set on the commit click are silenced before\n * screen readers can pick them up.\n */\n announce: (message: string) => void;\n}\n\nexport const RangePickerContext = createContext<RangePickerContextValue | null>(null);\n\n/**\n * Consume RangePickerContext.\n * Throws a clear error when called outside of RangePicker.Root.\n */\nexport function useRangePickerContext(componentName: string): RangePickerContextValue {\n const context = useContext(RangePickerContext);\n if (!context) {\n throw new Error(\n `[${componentName}] RangePicker.Root 내부에서 사용해야 합니다.\\n\\n` +\n '올바른 사용법:\\n' +\n ' <RangePicker>\\n' +\n ` <RangePicker.${componentName.replace('RangePicker.', '')} />\\n` +\n ' </RangePicker>',\n );\n }\n return context;\n}\n","import { useCallback, useId, useMemo, useRef, useState } from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport { DEFAULT_RANGEPICKER_LABELS, civilMidnightFromUtcDay } from '@kalyx/core';\nimport { DateFnsAdapter } from '@kalyx/adapter-date-fns';\nimport type {\n DateAdapter,\n DateRange,\n DisabledRule,\n ISODateString,\n RangePickerLabels,\n WeekStartsOn,\n} from '@kalyx/core';\nimport { RangePickerContext } from '../../context/RangePickerContext.js';\nimport type {\n RangePickerContextValue,\n RangeSelectingTarget,\n} from '../../context/RangePickerContext.js';\nimport { useChangeEffect } from '../../hooks/useChangeEffect.js';\n\nconst EMPTY_RANGE: DateRange = { start: null, end: null };\n\nconst SR_ONLY: CSSProperties = {\n position: 'absolute',\n width: 1,\n height: 1,\n padding: 0,\n margin: -1,\n overflow: 'hidden',\n clip: 'rect(0, 0, 0, 0)',\n whiteSpace: 'nowrap',\n border: 0,\n};\n\n/**\n * Props for the RangePicker Root component.\n *\n * @example\n * ```tsx\n * <RangePicker value={range} onChange={setRange}>\n * <RangePicker.Input part=\"start\" />\n * <RangePicker.Input part=\"end\" />\n * <RangePicker.Popover>\n * <RangePicker.Calendar />\n * </RangePicker.Popover>\n * </RangePicker>\n * ```\n */\nexport interface RangePickerRootProps {\n /** Selected range (controlled). `{ start, end }` with ISO strings or null. */\n value?: DateRange;\n /** Initial range (uncontrolled) */\n defaultValue?: DateRange;\n /** Callback fired when the range changes */\n onChange?: (range: DateRange) => void;\n /** Callback fired when the popover open state changes */\n onOpenChange?: (isOpen: boolean) => void;\n /**\n * Callback fired when the calendar view navigates to a different month.\n * The value is the ISO string of the first day of the newly-visible month (UTC).\n */\n onCalendarNavigate?: (viewMonth: ISODateString) => void;\n /** Disabled rules */\n disabled?: DisabledRule[] | boolean;\n /** Read-only */\n readOnly?: boolean;\n /** Week start day */\n weekStartsOn?: WeekStartsOn;\n /** Date display format */\n displayFormat?: string;\n /** BCP 47 locale */\n locale?: string;\n /**\n * IANA timezone for display (e.g., \"Asia/Seoul\"). When set, inputs format in this zone,\n * calendar highlighting uses civil-day comparison in this zone, and selected start/end are\n * emitted as civil midnight of the clicked day in this zone (UTC-ISO form).\n */\n displayTimezone?: string;\n /** Date adapter */\n adapter?: DateAdapter;\n /** Override ARIA labels (defaults to English) */\n labels?: Partial<RangePickerLabels>;\n /** Child components */\n children: ReactNode;\n}\n\nexport function RangePickerRoot({\n value: controlledValue,\n defaultValue,\n onChange,\n onOpenChange,\n onCalendarNavigate,\n disabled = false,\n readOnly = false,\n weekStartsOn = 0,\n displayFormat = 'yyyy-MM-dd',\n locale = 'en-US',\n displayTimezone,\n adapter = DateFnsAdapter,\n labels: labelsProp,\n children,\n}: RangePickerRootProps) {\n const pickerId = useId();\n const isControlled = useRef(controlledValue !== undefined).current;\n const referenceRef = useRef<HTMLElement | null>(null);\n\n // Internal state for uncontrolled mode\n const [uncontrolledValue, setUncontrolledValue] = useState<DateRange>(\n defaultValue ?? EMPTY_RANGE,\n );\n\n const currentValue = isControlled ? (controlledValue ?? EMPTY_RANGE) : uncontrolledValue;\n\n const [isOpen, setIsOpen] = useState(false);\n\n // Which part to select next (start first, then end)\n const [selectingTarget, setSelectingTarget] = useState<RangeSelectingTarget>('start');\n\n const [hoverDate, setHoverDate] = useState<ISODateString | null>(null);\n\n // Live-region announcement (mounted on Root so it survives Calendar unmount).\n const [announcement, setAnnouncement] = useState('');\n const announce = useCallback((message: string) => setAnnouncement(message), []);\n\n // Lazy initializers — see DatePicker/Root.tsx for the SSR/hydration rationale.\n const [viewMonth, setViewMonth] = useState<ISODateString>(\n () => currentValue.start ?? adapter.today(displayTimezone),\n );\n\n const [focusedDate, setFocusedDate] = useState<ISODateString>(\n () => currentValue.start ?? adapter.today(displayTimezone),\n );\n\n useChangeEffect(isOpen, onOpenChange);\n const viewMonthStart = useMemo(() => adapter.startOfMonth(viewMonth), [viewMonth, adapter]);\n useChangeEffect(viewMonthStart, onCalendarNavigate);\n\n const mergedLabels = useMemo(\n () => ({ ...DEFAULT_RANGEPICKER_LABELS, ...labelsProp }),\n [labelsProp],\n );\n\n const isDisabled = typeof disabled === 'boolean' ? disabled : false;\n const disabledRules: DisabledRule[] = useMemo(\n () => (Array.isArray(disabled) ? disabled : []),\n [disabled],\n );\n\n const setRange = useCallback(\n (range: DateRange) => {\n if (isDisabled || readOnly) return;\n if (!isControlled) {\n setUncontrolledValue(range);\n }\n onChange?.(range);\n },\n [isControlled, isDisabled, readOnly, onChange],\n );\n\n /**\n * Single-date click handler.\n * - selectingTarget === 'start' -> pick start, switch target to 'end'\n * - selectingTarget === 'end' -> pick end (swap if before start), switch target to 'start', close\n */\n const selectDate = useCallback(\n (iso: ISODateString) => {\n if (isDisabled || readOnly) return;\n\n // Normalize UTC-grid ISOs to civil-midnight-in-tz before storing (see DatePicker.Root).\n const normalized = displayTimezone ? civilMidnightFromUtcDay(iso, displayTimezone) : iso;\n\n if (selectingTarget === 'start') {\n const newRange: DateRange = { start: normalized, end: null };\n setRange(newRange);\n setSelectingTarget('end');\n setHoverDate(null);\n } else {\n const start = currentValue.start;\n if (!start) {\n // Safety: if start is missing, treat this click as start\n setRange({ start: normalized, end: null });\n setSelectingTarget('end');\n return;\n }\n\n let newRange: DateRange;\n if (adapter.isBefore(normalized, start)) {\n // Swap if the clicked end is earlier than start\n newRange = { start: normalized, end: start };\n } else {\n newRange = { start, end: normalized };\n }\n\n setRange(newRange);\n setSelectingTarget('start');\n setHoverDate(null);\n setIsOpen(false);\n }\n },\n [isDisabled, readOnly, selectingTarget, currentValue.start, adapter, setRange, displayTimezone],\n );\n\n const open = useCallback(() => {\n if (isDisabled || readOnly) return;\n setIsOpen(true);\n const target = currentValue.start ?? adapter.today(displayTimezone);\n setViewMonth(target);\n setFocusedDate(target);\n // If the range is complete, restart; otherwise preserve current state\n if (currentValue.start && currentValue.end) {\n setSelectingTarget('start');\n }\n }, [isDisabled, readOnly, currentValue, adapter, displayTimezone]);\n\n const close = useCallback(() => {\n setIsOpen(false);\n setHoverDate(null);\n }, []);\n\n const toggle = useCallback(() => {\n if (isOpen) close();\n else open();\n }, [isOpen, open, close]);\n\n const contextValue: RangePickerContextValue = useMemo(\n () => ({\n referenceRef,\n value: currentValue,\n setRange,\n selectDate,\n selectingTarget,\n hoverDate,\n setHoverDate,\n isOpen,\n open,\n close,\n toggle,\n viewMonth,\n setViewMonth,\n focusedDate,\n setFocusedDate,\n adapter,\n disabled: disabledRules,\n weekStartsOn,\n displayFormat,\n locale,\n displayTimezone,\n isDisabled,\n isReadOnly: readOnly,\n pickerId,\n labels: mergedLabels,\n announce,\n }),\n [\n currentValue,\n setRange,\n selectDate,\n selectingTarget,\n hoverDate,\n isOpen,\n open,\n close,\n toggle,\n viewMonth,\n focusedDate,\n adapter,\n disabledRules,\n weekStartsOn,\n displayFormat,\n locale,\n displayTimezone,\n isDisabled,\n readOnly,\n pickerId,\n mergedLabels,\n announce,\n ],\n );\n\n return (\n <RangePickerContext.Provider value={contextValue}>\n {children}\n <div role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" style={SR_ONLY}>\n {announcement}\n </div>\n </RangePickerContext.Provider>\n );\n}\n","import { forwardRef, useCallback } from 'react';\nimport type { InputHTMLAttributes } from 'react';\nimport { useRangePickerContext } from '../../context/RangePickerContext.js';\n\nexport type RangeInputPart = 'start' | 'end';\n\nexport interface RangePickerInputProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'value' | 'onChange' | 'type'\n> {\n /** Which part this input represents (start | end) */\n part: RangeInputPart;\n /** Date display format (defaults to parent's displayFormat) */\n format?: string;\n}\n\n/**\n * RangePicker.Input — Separate input for start/end dates.\n *\n * Use one with `part=\"start\"` and another with `part=\"end\"`. Currently `readOnly`\n * because keyboard parsing of two inputs into a single range is ambiguous; users\n * select via the calendar.\n */\nexport const RangePickerInput = forwardRef<HTMLInputElement, RangePickerInputProps>(\n function RangePickerInput({ part, format: formatProp, onClick, onKeyDown, ...props }, ref) {\n const ctx = useRangePickerContext('RangePicker.Input');\n const displayFormat = formatProp ?? ctx.displayFormat;\n\n const value = ctx.value[part];\n let displayValue = '';\n if (value) {\n try {\n displayValue = ctx.adapter.format(value, displayFormat, ctx.displayTimezone);\n } catch {\n displayValue = value;\n }\n }\n\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLInputElement>) => {\n if (!ctx.isOpen) ctx.open();\n onClick?.(e);\n },\n [ctx, onClick],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Escape') {\n ctx.close();\n } else if (e.key === 'Enter' && ctx.isOpen) {\n // Don't submit the surrounding form when the calendar is open.\n e.preventDefault();\n } else if (e.key === 'ArrowDown' && !ctx.isOpen) {\n e.preventDefault();\n ctx.open();\n }\n onKeyDown?.(e);\n },\n [ctx, onKeyDown],\n );\n\n const calendarId = `${ctx.pickerId}-calendar`;\n\n return (\n <input\n ref={(node) => {\n // Use the first Input (start) as the reference\n if (part === 'start' && node) ctx.referenceRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n }}\n type=\"text\"\n role=\"combobox\"\n readOnly\n aria-expanded={ctx.isOpen}\n aria-haspopup=\"dialog\"\n aria-controls={ctx.isOpen ? calendarId : undefined}\n aria-autocomplete=\"none\"\n aria-label={part === 'start' ? ctx.labels.startInput : ctx.labels.endInput}\n autoComplete=\"off\"\n value={displayValue}\n disabled={ctx.isDisabled || props.disabled}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n data-part={part}\n {...props}\n />\n );\n },\n);\n\nRangePickerInput.displayName = 'RangePicker.Input';\n","import type { HTMLAttributes, ReactNode } from 'react';\nimport { useRangePickerContext } from '../../context/RangePickerContext.js';\nimport { usePopover } from '../../hooks/usePopover.js';\n\nexport interface RangePickerPopoverProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role'> {\n children?: ReactNode;\n}\n\nexport function RangePickerPopover({ children, ...props }: RangePickerPopoverProps) {\n const ctx = useRangePickerContext('RangePicker.Popover');\n const calendarId = `${ctx.pickerId}-calendar`;\n\n const { floatingStyles, setFloatingRef, isPositioned } = usePopover({\n isOpen: ctx.isOpen,\n close: ctx.close,\n referenceRef: ctx.referenceRef,\n });\n\n if (!ctx.isOpen) return null;\n\n const { style: userStyle, ...rest } = props;\n\n return (\n <div\n ref={setFloatingRef}\n id={calendarId}\n role=\"dialog\"\n aria-label={ctx.labels.popoverLabel}\n aria-modal=\"false\"\n {...rest}\n style={{\n ...userStyle,\n ...floatingStyles,\n visibility: isPositioned ? undefined : 'hidden',\n }}\n >\n {children}\n </div>\n );\n}\n","import { useCallback, useEffect, useMemo, useRef } from 'react';\nimport type { HTMLAttributes } from 'react';\nimport {\n getCalendarDays,\n getISOWeekNumber,\n isDateDisabled,\n getWeekdayNames,\n formatMonthYear,\n formatFullDate,\n} from '@kalyx/core';\nimport type { CalendarDay, DateRange } from '@kalyx/core';\nimport { useRangePickerContext } from '../../context/RangePickerContext.js';\n\nexport interface RangePickerCalendarClassNames {\n root?: string;\n header?: string;\n title?: string;\n navButton?: string;\n grid?: string;\n gridRow?: string;\n gridCell?: string;\n day?: string;\n daySelected?: string;\n dayToday?: string;\n dayDisabled?: string;\n dayOutsideMonth?: string;\n dayRangeStart?: string;\n dayRangeEnd?: string;\n dayInRange?: string;\n weekdayHeader?: string;\n /** Header cell at the top of the week-number column. Rendered only when `showWeekNumber` is set. */\n weekNumberHeader?: string;\n /** Each row's week-number cell. Rendered only when `showWeekNumber` is set. */\n weekNumber?: string;\n}\n\n/**\n * Selection mode for the calendar grid.\n * - `'range'` (default): RangePicker behavior — two clicks (start, end) commit a custom range.\n * - `'week'`: WeekPicker behavior — a single click commits the entire week containing the clicked day.\n */\nexport type RangePickerCalendarSelectionMode = 'range' | 'week';\n\nexport interface RangePickerCalendarProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role'> {\n classNames?: RangePickerCalendarClassNames;\n /** @default 'range' */\n selectionMode?: RangePickerCalendarSelectionMode;\n /**\n * Render an ISO 8601 week-number column on the left of the grid (1–53).\n * The column is a `<th scope=\"row\">`; it doesn't participate in the WAI-ARIA grid\n * data region, so keyboard navigation across the date cells is unaffected.\n */\n showWeekNumber?: boolean;\n /**\n * Always render 6 weeks (42 cells), even when the month fits in 4 or 5 rows.\n */\n fixedWeeks?: boolean;\n}\n\n/** Safe wrapper for formatFullDate — falls back to ISO string on error */\nfunction safeFormatFullDate(iso: string, locale: string): string {\n try {\n return formatFullDate(iso, locale);\n } catch {\n return iso;\n }\n}\n\nexport function RangePickerCalendar({\n classNames,\n selectionMode = 'range',\n showWeekNumber = false,\n fixedWeeks = false,\n ...props\n}: RangePickerCalendarProps) {\n const ctx = useRangePickerContext('RangePicker.Calendar');\n const gridRef = useRef<HTMLTableElement>(null);\n\n const {\n adapter,\n viewMonth,\n focusedDate,\n weekStartsOn,\n disabled,\n value,\n hoverDate,\n selectingTarget,\n displayTimezone,\n } = ctx;\n\n const { locale } = ctx;\n // Memoized — see DatePicker/Calendar.tsx for the rationale.\n const weekdays = useMemo(() => getWeekdayNames(locale, weekStartsOn), [locale, weekStartsOn]);\n\n const weeks = useMemo(\n () =>\n getCalendarDays(viewMonth, adapter, {\n weekStartsOn,\n focusedDate,\n disabled,\n range: value,\n rangeHover: hoverDate,\n timezone: displayTimezone,\n fixedWeeks,\n }),\n [\n viewMonth,\n adapter,\n weekStartsOn,\n focusedDate,\n disabled,\n value,\n hoverDate,\n displayTimezone,\n fixedWeeks,\n ],\n );\n\n // ISO week number anchored to the row's Thursday — see DatePicker/Calendar.tsx for rationale.\n const thursdayIndex = weekStartsOn === 0 ? 4 : 3;\n\n const year = adapter.getYear(viewMonth);\n const month = adapter.getMonth(viewMonth);\n const title = formatMonthYear(year, month, locale);\n\n useEffect(() => {\n if (!ctx.isOpen || !gridRef.current) return;\n const focusedButton = gridRef.current.querySelector<HTMLButtonElement>('[data-focused=\"true\"]');\n focusedButton?.focus({ preventScroll: true });\n }, [focusedDate, ctx.isOpen]);\n\n const navigateMonth = useCallback(\n (direction: number) => {\n const newMonth = adapter.addMonths(viewMonth, direction);\n ctx.setViewMonth(newMonth);\n ctx.setFocusedDate(adapter.startOfMonth(newMonth));\n const y = adapter.getYear(newMonth);\n const m = adapter.getMonth(newMonth);\n ctx.announce(formatMonthYear(y, m, locale));\n },\n [adapter, viewMonth, ctx, locale],\n );\n\n const commitDay = useCallback(\n (iso: string) => {\n if (selectionMode === 'week') {\n const weekStart = adapter.startOfWeek(iso, weekStartsOn);\n const weekEnd = adapter.startOfDay(adapter.endOfWeek(iso, weekStartsOn));\n const range: DateRange = { start: weekStart, end: weekEnd };\n ctx.setRange(range);\n ctx.close();\n ctx.announce(\n `${ctx.labels.rangeSelected}: ${safeFormatFullDate(weekStart, locale)} – ${safeFormatFullDate(weekEnd, locale)}`,\n );\n } else {\n // Capture selectingTarget BEFORE selectDate flips it so we can announce\n // the right state. \"start\" click prompts for the end; \"end\" click closes\n // the range and announces the full span.\n const wasPickingStart = selectingTarget === 'start';\n const previousStart = value.start;\n ctx.selectDate(iso);\n const formatted = safeFormatFullDate(iso, locale);\n if (wasPickingStart) {\n ctx.announce(`${formatted}. ${ctx.labels.selectingEnd}`);\n } else if (previousStart) {\n // Mirror the swap-if-before logic from RangePickerRoot.selectDate so the\n // announcement matches what will be committed.\n const [start, end] = adapter.isBefore(iso, previousStart)\n ? [iso, previousStart]\n : [previousStart, iso];\n ctx.announce(\n `${ctx.labels.rangeSelected}: ${safeFormatFullDate(start, locale)} – ${safeFormatFullDate(end, locale)}`,\n );\n } else {\n // Safety: no previous start (e.g. preset cleared mid-flow) — fall back\n // to a simple per-day announcement so the user still hears something.\n ctx.announce(formatted);\n }\n }\n },\n [selectionMode, adapter, weekStartsOn, ctx, locale, selectingTarget, value.start],\n );\n\n const handleDayClick = useCallback(\n (day: CalendarDay) => {\n if (day.isDisabled) return;\n commitDay(day.isoString);\n },\n [commitDay],\n );\n\n const handleDayMouseEnter = useCallback(\n (day: CalendarDay) => {\n // Week mode has no two-click flow and therefore no hover preview.\n if (selectionMode === 'week') return;\n if (selectingTarget === 'end' && value.start && !day.isDisabled) {\n ctx.setHoverDate(day.isoString);\n }\n },\n [selectionMode, selectingTarget, value.start, ctx],\n );\n\n const handleMouseLeave = useCallback(() => {\n ctx.setHoverDate(null);\n }, [ctx]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n let newFocused: string | null = null;\n\n switch (e.key) {\n case 'ArrowLeft':\n newFocused = adapter.addDays(focusedDate, -1);\n break;\n case 'ArrowRight':\n newFocused = adapter.addDays(focusedDate, 1);\n break;\n case 'ArrowUp':\n newFocused = adapter.addDays(focusedDate, -7);\n break;\n case 'ArrowDown':\n newFocused = adapter.addDays(focusedDate, 7);\n break;\n case 'PageUp':\n newFocused = e.shiftKey\n ? adapter.addYears(focusedDate, -1)\n : adapter.addMonths(focusedDate, -1);\n break;\n case 'PageDown':\n newFocused = e.shiftKey\n ? adapter.addYears(focusedDate, 1)\n : adapter.addMonths(focusedDate, 1);\n break;\n case 'Home':\n newFocused = adapter.startOfWeek(focusedDate, weekStartsOn);\n break;\n case 'End':\n newFocused = adapter.startOfDay(adapter.endOfWeek(focusedDate, weekStartsOn));\n break;\n case 'Enter':\n case ' ':\n e.preventDefault();\n if (!isDateDisabled(focusedDate, disabled, adapter)) {\n commitDay(focusedDate);\n }\n return;\n case 'Escape':\n ctx.close();\n return;\n default:\n return;\n }\n\n if (newFocused) {\n e.preventDefault();\n\n // WAI-ARIA grid pattern: skip disabled cells while keyboard-navigating.\n // Step in the original direction up to one full grid (42 cells) before giving up.\n const skipStep =\n e.key === 'ArrowLeft' || e.key === 'ArrowUp' || e.key === 'PageUp' || e.key === 'Home'\n ? -1\n : 1;\n let attempts = 0;\n while (isDateDisabled(newFocused, disabled, adapter) && attempts < 42) {\n newFocused = adapter.addDays(newFocused, skipStep);\n attempts++;\n }\n if (attempts >= 42) return;\n\n ctx.setFocusedDate(newFocused);\n\n if (!adapter.isSameMonth(newFocused, viewMonth)) {\n ctx.setViewMonth(newFocused);\n }\n\n // Keep hover preview in sync while keyboard-navigating (range mode only)\n if (selectionMode === 'range' && selectingTarget === 'end' && value.start) {\n ctx.setHoverDate(newFocused);\n }\n }\n },\n [\n adapter,\n focusedDate,\n viewMonth,\n weekStartsOn,\n disabled,\n ctx,\n selectionMode,\n selectingTarget,\n value.start,\n commitDay,\n ],\n );\n\n return (\n <div className={classNames?.root} {...props} onMouseLeave={handleMouseLeave}>\n <div className={classNames?.header}>\n <button\n type=\"button\"\n className={classNames?.navButton}\n onClick={() => navigateMonth(-1)}\n aria-label={ctx.labels.prevMonth}\n >\n <\n </button>\n <span className={classNames?.title} aria-live=\"polite\">\n {title}\n </span>\n <button\n type=\"button\"\n className={classNames?.navButton}\n onClick={() => navigateMonth(1)}\n aria-label={ctx.labels.nextMonth}\n >\n >\n </button>\n </div>\n\n {/* aria-multiselectable intentionally omitted: a date range is one selection\n (two endpoints), not multi-select. */}\n <table\n ref={gridRef}\n role=\"grid\"\n aria-label={title}\n aria-rowcount={weeks.length + 1}\n aria-colcount={7}\n className={classNames?.grid}\n onKeyDown={handleKeyDown}\n >\n <thead>\n <tr role=\"row\" aria-rowindex={1}>\n {showWeekNumber ? (\n <th scope=\"col\" aria-hidden=\"true\" className={classNames?.weekNumberHeader}>\n #\n </th>\n ) : null}\n {weekdays.map((day, colIndex) => (\n <th\n key={day.short}\n role=\"columnheader\"\n abbr={day.full}\n scope=\"col\"\n aria-colindex={colIndex + 1}\n className={classNames?.weekdayHeader}\n >\n {day.short}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {weeks.map((week, weekIndex) => (\n <tr\n key={weekIndex}\n role=\"row\"\n aria-rowindex={weekIndex + 2}\n className={classNames?.gridRow}\n >\n {showWeekNumber ? (\n <th\n scope=\"row\"\n aria-hidden=\"true\"\n className={classNames?.weekNumber}\n data-week-number\n >\n {getISOWeekNumber(week[thursdayIndex]!.isoString)}\n </th>\n ) : null}\n {week.map((day, colIndex) => {\n const dayClasses =\n [\n classNames?.day,\n day.isRangeStart && classNames?.dayRangeStart,\n day.isRangeEnd && classNames?.dayRangeEnd,\n day.isInRange && classNames?.dayInRange,\n day.isToday && classNames?.dayToday,\n day.isDisabled && classNames?.dayDisabled,\n !day.isCurrentMonth && classNames?.dayOutsideMonth,\n ]\n .filter(Boolean)\n .join(' ') || undefined;\n\n const isSelected =\n selectionMode === 'week'\n ? day.isRangeStart || day.isRangeEnd || day.isInRange\n : day.isRangeStart || day.isRangeEnd;\n\n return (\n <td\n key={day.isoString}\n role=\"gridcell\"\n aria-colindex={colIndex + 1}\n aria-selected={isSelected || undefined}\n aria-disabled={day.isDisabled || undefined}\n aria-current={day.isToday ? 'date' : undefined}\n className={classNames?.gridCell}\n >\n <button\n type=\"button\"\n tabIndex={day.isFocused ? 0 : -1}\n disabled={day.isDisabled}\n data-focused={day.isFocused || undefined}\n data-range-start={day.isRangeStart || undefined}\n data-range-end={day.isRangeEnd || undefined}\n data-in-range={day.isInRange || undefined}\n data-today={day.isToday || undefined}\n data-outside-month={!day.isCurrentMonth || undefined}\n className={dayClasses}\n onClick={() => handleDayClick(day)}\n onMouseEnter={() => handleDayMouseEnter(day)}\n aria-label={safeFormatFullDate(day.isoString, locale)}\n >\n {day.dayNumber}\n </button>\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n","import { useCallback, useMemo } from 'react';\nimport type { HTMLAttributes, ReactNode } from 'react';\nimport type { DateRange, ISODateString } from '@kalyx/core';\nimport { useRangePickerContext } from '../../context/RangePickerContext.js';\n\n/** Predefined preset keys. Custom ranges are also supported. */\nexport type PresetKey =\n | 'today'\n | 'yesterday'\n | 'last7days'\n | 'last30days'\n | 'thisWeek'\n | 'lastWeek'\n | 'thisMonth'\n | 'lastMonth'\n | 'thisYear';\n\nexport interface RangePickerPresetsClassNames {\n root?: string;\n preset?: string;\n presetActive?: string;\n}\n\nexport interface RangePickerPresetsProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role'> {\n classNames?: RangePickerPresetsClassNames;\n children?: ReactNode;\n}\n\n/**\n * RangePicker.Presets — Container that wraps preset buttons.\n * Place `RangePicker.Preset` buttons inside.\n *\n * @example\n * ```tsx\n * <RangePicker.Presets>\n * <RangePicker.Preset value=\"last7days\">Last 7 days</RangePicker.Preset>\n * <RangePicker.Preset value=\"thisMonth\">This month</RangePicker.Preset>\n * </RangePicker.Presets>\n * ```\n */\nexport function RangePickerPresets({ classNames, children, ...props }: RangePickerPresetsProps) {\n const ctx = useRangePickerContext('RangePicker.Presets');\n return (\n <div role=\"group\" aria-label={ctx.labels.presetsGroup} className={classNames?.root} {...props}>\n {children}\n </div>\n );\n}\n\nexport interface RangePickerPresetProps extends Omit<HTMLAttributes<HTMLButtonElement>, 'value'> {\n /** Predefined preset key; omit when passing `range` directly */\n value?: PresetKey;\n /** Pass a range directly (alternative to `value`) */\n range?: DateRange;\n children: ReactNode;\n className?: string;\n}\n\n/**\n * Resolve a predefined preset key into an actual DateRange.\n */\nfunction resolvePreset(\n key: PresetKey,\n today: ISODateString,\n adapter: {\n addDays: (iso: string, n: number) => string;\n addMonths: (iso: string, n: number) => string;\n addYears: (iso: string, n: number) => string;\n startOfMonth: (iso: string) => string;\n endOfMonth: (iso: string) => string;\n startOfWeek: (iso: string, weekStartsOn?: 0 | 1) => string;\n endOfWeek: (iso: string, weekStartsOn?: 0 | 1) => string;\n startOfDay: (iso: string) => string;\n },\n): DateRange {\n switch (key) {\n case 'today':\n return { start: today, end: today };\n case 'yesterday': {\n const yesterday = adapter.addDays(today, -1);\n return { start: yesterday, end: yesterday };\n }\n case 'last7days':\n return { start: adapter.addDays(today, -6), end: today };\n case 'last30days':\n return { start: adapter.addDays(today, -29), end: today };\n case 'thisWeek':\n return {\n start: adapter.startOfDay(adapter.startOfWeek(today)),\n end: adapter.startOfDay(adapter.endOfWeek(today)),\n };\n case 'lastWeek': {\n const prevWeek = adapter.addDays(today, -7);\n return {\n start: adapter.startOfDay(adapter.startOfWeek(prevWeek)),\n end: adapter.startOfDay(adapter.endOfWeek(prevWeek)),\n };\n }\n case 'thisMonth':\n return {\n start: adapter.startOfMonth(today),\n end: adapter.startOfDay(adapter.endOfMonth(today)),\n };\n case 'lastMonth': {\n const prevMonth = adapter.addMonths(today, -1);\n return {\n start: adapter.startOfMonth(prevMonth),\n end: adapter.startOfDay(adapter.endOfMonth(prevMonth)),\n };\n }\n case 'thisYear': {\n // Navigate back to January of the current year\n const currentMonth = new Date(today).getUTCMonth();\n const yearStart = adapter.startOfMonth(adapter.addMonths(today, -currentMonth));\n return { start: yearStart, end: today };\n }\n }\n}\n\n/**\n * RangePicker.Preset — One-click preset button to select a date range.\n *\n * Pass either `value` (a preset key) or `range` (a direct range).\n *\n * @example\n * ```tsx\n * <RangePicker.Preset value=\"last7days\">Last 7 days</RangePicker.Preset>\n * <RangePicker.Preset range={{ start: \"2026-01-01T...\", end: \"2026-03-31T...\" }}>\n * Q1 2026\n * </RangePicker.Preset>\n * ```\n */\nexport function RangePickerPreset({\n value: presetKey,\n range: directRange,\n children,\n onClick,\n ...props\n}: RangePickerPresetProps) {\n const ctx = useRangePickerContext('RangePicker.Preset');\n\n // Resolve the preset once per render — previously `resolvePreset` + `adapter.today()`\n // ran twice per render per preset (in handleClick AND isActive), turning a 5-preset\n // row into 10 today() allocations per render.\n const resolved = useMemo<DateRange | null>(() => {\n if (directRange) return directRange;\n if (presetKey)\n return resolvePreset(presetKey, ctx.adapter.today(ctx.displayTimezone), ctx.adapter);\n return null;\n }, [directRange, presetKey, ctx.adapter, ctx.displayTimezone]);\n\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n if (ctx.isDisabled || ctx.isReadOnly) return;\n if (!resolved) return;\n\n ctx.setRange(resolved);\n ctx.close();\n onClick?.(e);\n },\n [ctx, resolved, onClick],\n );\n\n // Determine whether the currently selected range matches this preset\n const isActive = useMemo(() => {\n if (!ctx.value.start || !ctx.value.end || !resolved || !resolved.start || !resolved.end) {\n return false;\n }\n return (\n ctx.adapter.isSameDay(ctx.value.start, resolved.start) &&\n ctx.adapter.isSameDay(ctx.value.end, resolved.end)\n );\n }, [ctx.value.start, ctx.value.end, ctx.adapter, resolved]);\n\n // role=\"option\" is invalid outside role=\"listbox\"/role=\"combobox\"; parent is\n // role=\"group\". Use a regular toggle button with aria-pressed.\n return (\n <button\n type=\"button\"\n aria-pressed={isActive}\n data-active={isActive || undefined}\n disabled={ctx.isDisabled}\n onClick={handleClick}\n {...props}\n >\n {children}\n </button>\n );\n}\n","import { RangePickerRoot } from './Root.js';\nimport { RangePickerInput } from './Input.js';\nimport { RangePickerPopover } from './Popover.js';\nimport { RangePickerCalendar } from './Calendar.js';\nimport { RangePickerPresets, RangePickerPreset } from './Presets.js';\n\nimport type { RangePickerRootProps } from './Root.js';\nimport type { RangePickerInputProps, RangeInputPart } from './Input.js';\nimport type { RangePickerPopoverProps } from './Popover.js';\nimport type { RangePickerCalendarProps, RangePickerCalendarClassNames } from './Calendar.js';\nimport type {\n RangePickerPresetsProps,\n RangePickerPresetsClassNames,\n RangePickerPresetProps,\n PresetKey,\n} from './Presets.js';\n\n/**\n * RangePicker — Headless date-range picker component\n *\n * @example Basic\n * ```tsx\n * <RangePicker value={range} onChange={setRange}>\n * <RangePicker.Input part=\"start\" />\n * <RangePicker.Input part=\"end\" />\n * <RangePicker.Popover>\n * <RangePicker.Calendar />\n * </RangePicker.Popover>\n * </RangePicker>\n * ```\n *\n * @example Presets (dashboard)\n * ```tsx\n * <RangePicker value={range} onChange={setRange}>\n * <RangePicker.Input part=\"start\" />\n * <RangePicker.Input part=\"end\" />\n * <RangePicker.Popover>\n * <RangePicker.Presets>\n * <RangePicker.Preset value=\"last7days\">Last 7 days</RangePicker.Preset>\n * <RangePicker.Preset value=\"last30days\">Last 30 days</RangePicker.Preset>\n * <RangePicker.Preset value=\"thisMonth\">This month</RangePicker.Preset>\n * </RangePicker.Presets>\n * <RangePicker.Calendar />\n * </RangePicker.Popover>\n * </RangePicker>\n * ```\n */\nexport const RangePicker = Object.assign(RangePickerRoot, {\n Input: RangePickerInput,\n Popover: RangePickerPopover,\n Calendar: RangePickerCalendar,\n Presets: RangePickerPresets,\n Preset: RangePickerPreset,\n});\n\nexport type {\n RangePickerRootProps,\n RangePickerInputProps,\n RangeInputPart,\n RangePickerPopoverProps,\n RangePickerCalendarProps,\n RangePickerCalendarClassNames,\n RangePickerPresetsProps,\n RangePickerPresetsClassNames,\n RangePickerPresetProps,\n PresetKey,\n};\n","import { createContext, useContext } from 'react';\nimport type { ISODateString, TimePickerLabels, TimeValue } from '@kalyx/core';\n\nexport type TimePickerFormat = '12h' | '24h';\n\nexport interface TimePickerContextValue {\n /** Currently selected ISO datetime (only the time portion is meaningful) */\n value: ISODateString | null;\n /** Update only the time portion (TimeValue) */\n setTime: (partial: Partial<TimeValue>) => void;\n /** 12-hour or 24-hour mode */\n format: TimePickerFormat;\n /** Minute step (e.g., 15 -> 0, 15, 30, 45) */\n step: number;\n /** Whether to display seconds */\n withSeconds: boolean;\n /**\n * IANA timezone for time interpretation. When set, the hour/minute controls read and write\n * the time as observed in this zone rather than UTC.\n */\n displayTimezone?: string;\n /** Whether entire picker is disabled */\n isDisabled: boolean;\n /** Read-only */\n isReadOnly: boolean;\n /** Current time (TimeValue) */\n currentTime: TimeValue;\n /** Unique ID */\n pickerId: string;\n /** ARIA labels */\n labels: TimePickerLabels;\n /**\n * Programmatic per-slot disable predicate. Returns `true` for any (hour, minute) pair that\n * should be unselectable — same polarity as MUI X's `shouldDisableTime`, the **inverse** of\n * react-datepicker's `filterTime` (which returns `true` to *keep* a slot). Use cases:\n * business hours, lunch breaks, blackout slots. The hour-list disables a row only when the\n * predicate returns `true` for *every* step in that hour.\n */\n filterTime?: (hours: number, minutes: number) => boolean;\n}\n\nexport const TimePickerContext = createContext<TimePickerContextValue | null>(null);\n\n/**\n * Consume TimePickerContext.\n * Throws a clear error when called outside of TimePicker.Root.\n */\nexport function useTimePickerContext(componentName: string): TimePickerContextValue {\n const context = useContext(TimePickerContext);\n if (!context) {\n throw new Error(\n `[${componentName}] TimePicker.Root 내부에서 사용해야 합니다.\\n\\n` +\n '올바른 사용법:\\n' +\n ' <TimePicker>\\n' +\n ` <TimePicker.${componentName.replace('TimePicker.', '')} />\\n` +\n ' </TimePicker>',\n );\n }\n return context;\n}\n","import { useCallback, useId, useMemo, useRef, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport {\n DEFAULT_TIMEPICKER_LABELS,\n getTime,\n setTime as setTimeOnIso,\n getTimeInTimezone,\n setTimeInTimezone,\n} from '@kalyx/core';\nimport { DateFnsAdapter } from '@kalyx/adapter-date-fns';\nimport type { ISODateString, TimePickerLabels, TimeValue } from '@kalyx/core';\nimport { TimePickerContext } from '../../context/TimePickerContext.js';\nimport type { TimePickerContextValue, TimePickerFormat } from '../../context/TimePickerContext.js';\n\n/**\n * Props for the TimePicker Root component.\n *\n * @example\n * ```tsx\n * <TimePicker value={time} onChange={setTime} format=\"24h\" step={15}>\n * <TimePicker.Input />\n * <TimePicker.HourList />\n * <TimePicker.MinuteList />\n * <TimePicker.AmPmToggle />\n * </TimePicker>\n * ```\n */\nexport interface TimePickerRootProps {\n /** Selected time (controlled, ISO 8601 UTC). The date portion is ignored; only the time is used. */\n value?: ISODateString | null;\n /** Initial time (uncontrolled) */\n defaultValue?: ISODateString;\n /** Callback fired when the time changes */\n onChange?: (value: ISODateString | null) => void;\n /** 12-hour or 24-hour mode */\n format?: TimePickerFormat;\n /** Minute step (e.g., 1, 5, 10, 15, 30) */\n step?: number;\n /** Whether to display seconds */\n withSeconds?: boolean;\n /**\n * IANA timezone used to interpret time. When set, the hour/minute controls read and write\n * the time as observed in this zone.\n */\n displayTimezone?: string;\n /** Whether entire picker is disabled */\n disabled?: boolean;\n /** Read-only */\n readOnly?: boolean;\n /**\n * Programmatic per-slot disable predicate. Returns `true` for any `(hours, minutes)` pair\n * that should be unselectable — same polarity as MUI X's `shouldDisableTime`, and the\n * **inverse** of react-datepicker's `filterTime` (which returns `true` to *keep* a slot).\n * Use cases: business hours, lunch breaks, blackout slots. Hours are disabled only when the\n * predicate returns `true` for every step within the hour. Always receives 24-hour values.\n */\n filterTime?: (hours: number, minutes: number) => boolean;\n /** Override ARIA labels (defaults to English) */\n labels?: Partial<TimePickerLabels>;\n /** Child components */\n children: ReactNode;\n}\n\nexport function TimePickerRoot({\n value: controlledValue,\n defaultValue,\n onChange,\n format = '24h',\n step = 1,\n withSeconds = false,\n displayTimezone,\n disabled = false,\n readOnly = false,\n filterTime,\n labels: labelsProp,\n children,\n}: TimePickerRootProps) {\n const pickerId = useId();\n const mergedLabels = useMemo(\n () => ({ ...DEFAULT_TIMEPICKER_LABELS, ...labelsProp }),\n [labelsProp],\n );\n const isControlled = useRef(controlledValue !== undefined).current;\n\n const [uncontrolledValue, setUncontrolledValue] = useState<ISODateString | null>(\n defaultValue ?? null,\n );\n\n const currentValue = isControlled ? (controlledValue ?? null) : uncontrolledValue;\n\n // SSR-safe: when value is null, fall back to a deterministic {0,0,0} so server\n // and client render the same markup. `today()` is only resolved at event time.\n const currentTime = useMemo(() => {\n if (!currentValue) return { hours: 0, minutes: 0, seconds: 0 };\n return displayTimezone\n ? getTimeInTimezone(currentValue, displayTimezone)\n : getTime(currentValue);\n }, [currentValue, displayTimezone]);\n\n const setTime = useCallback(\n (partial: Partial<TimeValue>) => {\n if (disabled || readOnly) return;\n const base = currentValue ?? DateFnsAdapter.today(displayTimezone);\n const newIso = displayTimezone\n ? setTimeInTimezone(base, partial, displayTimezone)\n : setTimeOnIso(base, partial);\n if (!isControlled) {\n setUncontrolledValue(newIso);\n }\n onChange?.(newIso);\n },\n [disabled, readOnly, currentValue, displayTimezone, isControlled, onChange],\n );\n\n const contextValue: TimePickerContextValue = useMemo(\n () => ({\n value: currentValue,\n setTime,\n format,\n step,\n withSeconds,\n displayTimezone,\n isDisabled: disabled,\n isReadOnly: readOnly,\n currentTime,\n pickerId,\n labels: mergedLabels,\n filterTime,\n }),\n [\n currentValue,\n setTime,\n format,\n step,\n withSeconds,\n displayTimezone,\n disabled,\n readOnly,\n currentTime,\n pickerId,\n mergedLabels,\n filterTime,\n ],\n );\n\n return <TimePickerContext.Provider value={contextValue}>{children}</TimePickerContext.Provider>;\n}\n","import { forwardRef, useCallback, useEffect, useState } from 'react';\nimport type { InputHTMLAttributes } from 'react';\nimport { formatTimeString, parseTimeString } from '@kalyx/core';\nimport { useTimePickerContext } from '../../context/TimePickerContext.js';\n\nexport interface TimePickerInputProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'value' | 'onChange' | 'type'\n> {}\n\n/**\n * TimePicker.Input — Text input for HH:MM or HH:MM:SS format.\n * Supports direct typing by the user.\n */\nexport const TimePickerInput = forwardRef<HTMLInputElement, TimePickerInputProps>(\n function TimePickerInput({ onBlur, onKeyDown, ...props }, ref) {\n const ctx = useTimePickerContext('TimePicker.Input');\n const [inputText, setInputText] = useState<string | null>(null);\n\n // Drop stale typed text when the value changes from outside (parent re-sets,\n // HourList/MinuteList click, AM/PM toggle) so the input reflects the new time\n // instead of holding the user's earlier half-typed string. Time inputs are\n // numeric — no IME composition to worry about.\n useEffect(() => {\n setInputText(null);\n }, [ctx.value]);\n\n const displayValue =\n inputText !== null ? inputText : formatTimeString(ctx.currentTime, ctx.withSeconds);\n\n const commitInput = useCallback(() => {\n if (inputText === null) return;\n const parsed = parseTimeString(inputText);\n if (parsed) {\n ctx.setTime(parsed);\n }\n setInputText(null);\n }, [inputText, ctx]);\n\n const handleChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n setInputText(e.target.value);\n }, []);\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n commitInput();\n onBlur?.(e);\n },\n [commitInput, onBlur],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n commitInput();\n }\n onKeyDown?.(e);\n },\n [commitInput, onKeyDown],\n );\n\n return (\n <input\n ref={ref}\n type=\"text\"\n inputMode=\"numeric\"\n autoComplete=\"off\"\n aria-label={ctx.labels.timeInput}\n placeholder={ctx.withSeconds ? 'HH:MM:SS' : 'HH:MM'}\n value={displayValue}\n disabled={ctx.isDisabled || props.disabled}\n readOnly={ctx.isReadOnly}\n onChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n {...props}\n />\n );\n },\n);\n\nTimePickerInput.displayName = 'TimePicker.Input';\n","import { useCallback, useEffect, useRef } from 'react';\nimport type { KeyboardEvent, RefObject } from 'react';\n\nexport interface UseListboxNavigationOptions<T> {\n items: T[];\n onSelect: (item: T) => void;\n disabled?: boolean;\n}\n\nexport interface UseListboxNavigationReturn<T> {\n listRef: RefObject<HTMLUListElement | null>;\n handleKeyDown: (e: KeyboardEvent<HTMLLIElement>, item: T) => void;\n}\n\n/**\n * Shared listbox keyboard navigation following WAI-ARIA Listbox pattern.\n * Used by TimePicker.HourList and TimePicker.MinuteList.\n *\n * Handles: ArrowUp/Down, Home/End, Enter/Space.\n * After navigation, focuses the newly selected option via requestAnimationFrame.\n */\nexport function useListboxNavigation<T>({\n items,\n onSelect,\n disabled = false,\n}: UseListboxNavigationOptions<T>): UseListboxNavigationReturn<T> {\n const listRef = useRef<HTMLUListElement>(null);\n const rafIdRef = useRef<number>(0);\n\n // Cancel any pending rAF on unmount to avoid focusing a dead ref\n useEffect(() => {\n return () => cancelAnimationFrame(rafIdRef.current);\n }, []);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLLIElement>, item: T) => {\n if (disabled) return;\n const currentIndex = items.indexOf(item);\n\n let newIndex = -1;\n if (e.key === 'ArrowDown') {\n newIndex = Math.min(currentIndex + 1, items.length - 1);\n } else if (e.key === 'ArrowUp') {\n newIndex = Math.max(currentIndex - 1, 0);\n } else if (e.key === 'Home') {\n newIndex = 0;\n } else if (e.key === 'End') {\n newIndex = items.length - 1;\n } else if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onSelect(item);\n return;\n } else {\n return;\n }\n\n e.preventDefault();\n const target = items[newIndex];\n if (target !== undefined) {\n onSelect(target);\n cancelAnimationFrame(rafIdRef.current);\n rafIdRef.current = requestAnimationFrame(() => {\n const next = listRef.current?.querySelector<HTMLLIElement>('[data-selected=\"true\"]');\n next?.focus();\n });\n }\n },\n [items, onSelect, disabled],\n );\n\n return { listRef, handleKeyDown };\n}\n","import { useCallback, useMemo } from 'react';\nimport type { HTMLAttributes } from 'react';\nimport { generateHours, to12Hour, to24Hour } from '@kalyx/core';\nimport { useTimePickerContext } from '../../context/TimePickerContext.js';\nimport { useListboxNavigation } from '../../hooks/useListboxNavigation.js';\n\nexport interface TimePickerHourListClassNames {\n root?: string;\n option?: string;\n optionSelected?: string;\n}\n\nexport interface TimePickerHourListProps extends Omit<\n HTMLAttributes<HTMLUListElement>,\n 'role' | 'children'\n> {\n classNames?: TimePickerHourListClassNames;\n}\n\n/**\n * TimePicker.HourList — `role=\"listbox\"` pattern for hour selection.\n * Renders differently depending on 12h/24h mode.\n *\n * ARIA-standard listbox: the <li role=\"option\"> element itself is interactive.\n * Keyboard: ArrowUp/ArrowDown to navigate, Enter/Space to select.\n */\nexport function TimePickerHourList({ classNames, ...props }: TimePickerHourListProps) {\n const ctx = useTimePickerContext('TimePicker.HourList');\n const { format, step, currentTime, isDisabled, isReadOnly, filterTime } = ctx;\n\n // Stable across renders unless `format` changes — useListboxNavigation\n // identity-compares its `items` array internally.\n const hours = useMemo(() => generateHours(format), [format]);\n\n const selectedHourDisplay =\n format === '12h' ? to12Hour(currentTime.hours).hours12 : currentTime.hours;\n\n const currentPeriod = format === '12h' ? to12Hour(currentTime.hours).period : null;\n\n // An hour is fully disabled only when every step minute within it is rejected by `filterTime`.\n // Pre-compute the 24-bit mask once per filterTime/step change; per-render hour lookups are O(1).\n const fullyDisabledHours24 = useMemo(() => {\n if (!filterTime) return null;\n const disabled = new Set<number>();\n for (let h = 0; h < 24; h++) {\n let allRejected = true;\n for (let m = 0; m < 60; m += step) {\n if (!filterTime(h, m)) {\n allRejected = false;\n break;\n }\n }\n if (allRejected) disabled.add(h);\n }\n return disabled;\n }, [filterTime, step]);\n\n const isHourDisabled = useCallback(\n (hourDisplay: number) => {\n if (!fullyDisabledHours24) return false;\n const hours24 =\n format === '12h' && currentPeriod ? to24Hour(hourDisplay, currentPeriod) : hourDisplay;\n return fullyDisabledHours24.has(hours24);\n },\n [fullyDisabledHours24, format, currentPeriod],\n );\n\n const handleSelect = useCallback(\n (hourDisplay: number) => {\n if (isDisabled || isReadOnly) return;\n if (isHourDisabled(hourDisplay)) return;\n const hours24 =\n format === '12h' && currentPeriod ? to24Hour(hourDisplay, currentPeriod) : hourDisplay;\n ctx.setTime({ hours: hours24 });\n },\n [format, currentPeriod, ctx, isDisabled, isReadOnly, isHourDisabled],\n );\n\n const { listRef, handleKeyDown } = useListboxNavigation({\n items: hours,\n onSelect: handleSelect,\n disabled: isDisabled || isReadOnly,\n });\n\n return (\n <ul\n ref={listRef}\n role=\"listbox\"\n aria-label={ctx.labels.hourList}\n aria-disabled={isDisabled || undefined}\n className={classNames?.root}\n {...props}\n >\n {hours.map((hour) => {\n const isSelected = hour === selectedHourDisplay;\n const isHourFullyDisabled = isHourDisabled(hour);\n const optionClass =\n [classNames?.option, isSelected && classNames?.optionSelected]\n .filter(Boolean)\n .join(' ') || undefined;\n\n return (\n <li\n key={hour}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={isDisabled || isHourFullyDisabled || undefined}\n aria-label={ctx.labels.hourOption(hour)}\n data-selected={isSelected || undefined}\n tabIndex={isSelected ? 0 : -1}\n className={optionClass}\n onClick={() => handleSelect(hour)}\n onKeyDown={(e) => handleKeyDown(e, hour)}\n >\n {String(hour).padStart(2, '0')}\n </li>\n );\n })}\n </ul>\n );\n}\n","import { useCallback, useMemo } from 'react';\nimport type { HTMLAttributes } from 'react';\nimport { generateMinutes } from '@kalyx/core';\nimport { useTimePickerContext } from '../../context/TimePickerContext.js';\nimport { useListboxNavigation } from '../../hooks/useListboxNavigation.js';\n\nexport interface TimePickerMinuteListClassNames {\n root?: string;\n option?: string;\n optionSelected?: string;\n}\n\nexport interface TimePickerMinuteListProps extends Omit<\n HTMLAttributes<HTMLUListElement>,\n 'role' | 'children'\n> {\n classNames?: TimePickerMinuteListClassNames;\n}\n\n/**\n * TimePicker.MinuteList — `role=\"listbox\"` pattern for minute selection.\n * The displayed minutes depend on the `step` prop (e.g., step=15 -> [0, 15, 30, 45]).\n */\nexport function TimePickerMinuteList({ classNames, ...props }: TimePickerMinuteListProps) {\n const ctx = useTimePickerContext('TimePicker.MinuteList');\n const { step, currentTime, isDisabled, isReadOnly, filterTime } = ctx;\n\n // Stable across renders unless `step` changes — useListboxNavigation\n // identity-compares its `items` array internally.\n const minutes = useMemo(() => generateMinutes(step), [step]);\n\n const isMinuteDisabled = useCallback(\n (minute: number) => {\n if (!filterTime) return false;\n return filterTime(currentTime.hours, minute);\n },\n [filterTime, currentTime.hours],\n );\n\n const handleSelect = useCallback(\n (minute: number) => {\n if (isDisabled || isReadOnly) return;\n if (isMinuteDisabled(minute)) return;\n ctx.setTime({ minutes: minute });\n },\n [ctx, isDisabled, isReadOnly, isMinuteDisabled],\n );\n\n const { listRef, handleKeyDown } = useListboxNavigation({\n items: minutes,\n onSelect: handleSelect,\n disabled: isDisabled || isReadOnly,\n });\n\n return (\n <ul\n ref={listRef}\n role=\"listbox\"\n aria-label={ctx.labels.minuteList}\n aria-disabled={isDisabled || undefined}\n className={classNames?.root}\n {...props}\n >\n {minutes.map((minute) => {\n const isSelected = minute === currentTime.minutes;\n const isMinuteFullyDisabled = isMinuteDisabled(minute);\n const optionClass =\n [classNames?.option, isSelected && classNames?.optionSelected]\n .filter(Boolean)\n .join(' ') || undefined;\n\n return (\n <li\n key={minute}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={isDisabled || isMinuteFullyDisabled || undefined}\n aria-label={ctx.labels.minuteOption(minute)}\n data-selected={isSelected || undefined}\n tabIndex={isSelected ? 0 : -1}\n className={optionClass}\n onClick={() => handleSelect(minute)}\n onKeyDown={(e) => handleKeyDown(e, minute)}\n >\n {String(minute).padStart(2, '0')}\n </li>\n );\n })}\n </ul>\n );\n}\n","import { useCallback, useRef } from 'react';\nimport type { HTMLAttributes, KeyboardEvent } from 'react';\nimport { to12Hour, to24Hour } from '@kalyx/core';\nimport { useTimePickerContext } from '../../context/TimePickerContext.js';\n\nexport interface TimePickerAmPmToggleClassNames {\n root?: string;\n option?: string;\n optionSelected?: string;\n}\n\nexport interface TimePickerAmPmToggleProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'role' | 'children'\n> {\n classNames?: TimePickerAmPmToggleClassNames;\n}\n\n/**\n * TimePicker.AmPmToggle — AM/PM toggle shown only in 12-hour mode.\n * Returns null in 24-hour mode.\n *\n * Implements the WAI-ARIA radiogroup pattern: only the checked radio is in the\n * tab order; ArrowLeft/Right/Up/Down + Home/End move selection between radios.\n */\nexport function TimePickerAmPmToggle({ classNames, ...props }: TimePickerAmPmToggleProps) {\n const ctx = useTimePickerContext('TimePicker.AmPmToggle');\n const amRef = useRef<HTMLButtonElement | null>(null);\n const pmRef = useRef<HTMLButtonElement | null>(null);\n\n const setPeriod = useCallback(\n (newPeriod: 'AM' | 'PM') => {\n if (ctx.isDisabled || ctx.isReadOnly) return;\n const { hours12 } = to12Hour(ctx.currentTime.hours);\n const newHours24 = to24Hour(hours12, newPeriod);\n ctx.setTime({ hours: newHours24 });\n },\n [ctx],\n );\n\n if (ctx.format !== '12h') return null;\n\n const { period } = to12Hour(ctx.currentTime.hours);\n\n const focusOther = (target: 'AM' | 'PM') => {\n (target === 'AM' ? amRef : pmRef).current?.focus();\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLButtonElement>, target: 'AM' | 'PM') => {\n switch (e.key) {\n case 'ArrowRight':\n case 'ArrowDown':\n case 'ArrowLeft':\n case 'ArrowUp': {\n e.preventDefault();\n const next: 'AM' | 'PM' = target === 'AM' ? 'PM' : 'AM';\n setPeriod(next);\n focusOther(next);\n break;\n }\n case 'Home': {\n e.preventDefault();\n setPeriod('AM');\n focusOther('AM');\n break;\n }\n case 'End': {\n e.preventDefault();\n setPeriod('PM');\n focusOther('PM');\n break;\n }\n case ' ':\n case 'Enter': {\n e.preventDefault();\n setPeriod(target);\n break;\n }\n default:\n break;\n }\n };\n\n const renderButton = (target: 'AM' | 'PM') => {\n const isSelected = period === target;\n const optionClass =\n [classNames?.option, isSelected && classNames?.optionSelected].filter(Boolean).join(' ') ||\n undefined;\n\n return (\n <button\n ref={target === 'AM' ? amRef : pmRef}\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n tabIndex={isSelected ? 0 : -1}\n data-selected={isSelected || undefined}\n disabled={ctx.isDisabled}\n className={optionClass}\n onClick={() => setPeriod(target)}\n onKeyDown={(e) => handleKeyDown(e, target)}\n >\n {target}\n </button>\n );\n };\n\n return (\n <div\n role=\"radiogroup\"\n aria-label={ctx.labels.amPmToggle}\n className={classNames?.root}\n {...props}\n >\n {renderButton('AM')}\n {renderButton('PM')}\n </div>\n );\n}\n","import { TimePickerRoot } from './Root.js';\nimport { TimePickerInput } from './Input.js';\nimport { TimePickerHourList } from './HourList.js';\nimport { TimePickerMinuteList } from './MinuteList.js';\nimport { TimePickerAmPmToggle } from './AmPmToggle.js';\n\nimport type { TimePickerRootProps } from './Root.js';\nimport type { TimePickerInputProps } from './Input.js';\nimport type { TimePickerHourListProps, TimePickerHourListClassNames } from './HourList.js';\nimport type { TimePickerMinuteListProps, TimePickerMinuteListClassNames } from './MinuteList.js';\nimport type { TimePickerAmPmToggleProps, TimePickerAmPmToggleClassNames } from './AmPmToggle.js';\n\n/**\n * TimePicker — Headless time-picker component\n *\n * @example\n * ```tsx\n * <TimePicker value={time} onChange={setTime} format=\"24h\" step={15}>\n * <TimePicker.Input />\n * <div>\n * <TimePicker.HourList />\n * <TimePicker.MinuteList />\n * <TimePicker.AmPmToggle />\n * </div>\n * </TimePicker>\n * ```\n */\nexport const TimePicker = Object.assign(TimePickerRoot, {\n Input: TimePickerInput,\n HourList: TimePickerHourList,\n MinuteList: TimePickerMinuteList,\n AmPmToggle: TimePickerAmPmToggle,\n});\n\nexport type {\n TimePickerRootProps,\n TimePickerInputProps,\n TimePickerHourListProps,\n TimePickerHourListClassNames,\n TimePickerMinuteListProps,\n TimePickerMinuteListClassNames,\n TimePickerAmPmToggleProps,\n TimePickerAmPmToggleClassNames,\n};\n","import { useCallback, useId, useMemo, useRef, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport {\n DEFAULT_DATEPICKER_LABELS,\n DEFAULT_TIMEPICKER_LABELS,\n getTime,\n setTime as setTimeOnIso,\n getTimeInTimezone,\n setTimeInTimezone,\n civilMidnightFromUtcDay,\n} from '@kalyx/core';\nimport { DateFnsAdapter } from '@kalyx/adapter-date-fns';\nimport type {\n DateAdapter,\n DateTimePickerLabels,\n DisabledRule,\n ISODateString,\n TimeValue,\n WeekStartsOn,\n} from '@kalyx/core';\nimport { DatePickerContext } from '../../context/DatePickerContext.js';\nimport type { DatePickerContextValue } from '../../context/DatePickerContext.js';\nimport { TimePickerContext } from '../../context/TimePickerContext.js';\nimport type { TimePickerContextValue, TimePickerFormat } from '../../context/TimePickerContext.js';\nimport { useChangeEffect } from '../../hooks/useChangeEffect.js';\n\n/**\n * Props for the DateTimePicker Root component.\n * Internally provides both DatePickerContext and TimePickerContext (context bridging).\n *\n * @example\n * ```tsx\n * <DateTimePicker value={dt} onChange={setDt} format=\"24h\" step={15}>\n * <DateTimePicker.Input />\n * <DateTimePicker.Popover>\n * <DateTimePicker.Calendar />\n * <DateTimePicker.HourList />\n * <DateTimePicker.MinuteList />\n * </DateTimePicker.Popover>\n * </DateTimePicker>\n * ```\n */\nexport interface DateTimePickerRootProps {\n /** Selected datetime (controlled, ISO 8601 UTC). Includes both date and time. */\n value?: ISODateString | null;\n /** Initial datetime (uncontrolled) */\n defaultValue?: ISODateString;\n /** Callback fired when the datetime changes */\n onChange?: (value: ISODateString | null) => void;\n /** Callback fired when the popover open state changes */\n onOpenChange?: (isOpen: boolean) => void;\n /**\n * Callback fired when the calendar view navigates to a different month.\n * The value is the ISO string of the first day of the newly-visible month (UTC).\n */\n onCalendarNavigate?: (viewMonth: ISODateString) => void;\n /** 12-hour or 24-hour mode */\n format?: TimePickerFormat;\n /** Minute step (e.g., 1, 5, 15, 30) */\n step?: number;\n /** Whether to display seconds in the time controls */\n withSeconds?: boolean;\n /**\n * Programmatic per-slot disable predicate for the time controls. Returns `true` for any\n * `(hours, minutes)` pair that should be unselectable — same polarity as MUI X's\n * `shouldDisableTime`, and the **inverse** of react-datepicker's `filterTime`. Always\n * receives 24-hour values.\n */\n filterTime?: (hours: number, minutes: number) => boolean;\n /** Disabled rules (applied to dates) */\n disabled?: DisabledRule[] | boolean;\n /** Read-only */\n readOnly?: boolean;\n /** Week start day */\n weekStartsOn?: WeekStartsOn;\n /** Date+time display format (for Input) */\n displayFormat?: string;\n /** BCP 47 locale */\n locale?: string;\n /**\n * IANA timezone used for display (e.g., \"Asia/Seoul\"). When set, Calendar highlights match\n * civil days in this zone, TimePicker reads/writes the time in this zone, and the Input\n * formats the combined date+time in this zone.\n */\n displayTimezone?: string;\n /** Date adapter */\n adapter?: DateAdapter;\n /** Override ARIA labels (defaults to English) */\n labels?: Partial<DateTimePickerLabels>;\n /** Child components */\n children: ReactNode;\n}\n\n/**\n * DateTimePicker.Root — Combined DatePicker + TimePicker component.\n *\n * Manages a single ISO datetime as the source of truth while providing both\n * DatePickerContext and TimePickerContext internally. This lets existing\n * components such as DatePicker.Calendar and TimePicker.HourList be reused as-is.\n *\n * Key behavior:\n * - Clicking a day in Calendar -> changes only the date, preserves the time, keeps popover open\n * - Changing time in TimePicker -> changes only the time, preserves the date\n * - Escape / outside click -> close the popover (commit)\n */\nexport function DateTimePickerRoot({\n value: controlledValue,\n defaultValue,\n onChange,\n onOpenChange,\n onCalendarNavigate,\n format = '24h',\n step = 1,\n withSeconds = false,\n filterTime,\n disabled = false,\n readOnly = false,\n weekStartsOn = 0,\n displayFormat = 'yyyy-MM-dd HH:mm',\n locale = 'en-US',\n displayTimezone,\n adapter = DateFnsAdapter,\n labels: labelsProp,\n children,\n}: DateTimePickerRootProps) {\n const pickerId = useId();\n const mergedDateLabels = useMemo(\n () => ({ ...DEFAULT_DATEPICKER_LABELS, ...labelsProp }),\n [labelsProp],\n );\n const mergedTimeLabels = useMemo(\n () => ({ ...DEFAULT_TIMEPICKER_LABELS, ...labelsProp }),\n [labelsProp],\n );\n const isControlled = useRef(controlledValue !== undefined).current;\n const referenceRef = useRef<HTMLElement | null>(null);\n\n const [uncontrolledValue, setUncontrolledValue] = useState<ISODateString | null>(\n defaultValue ?? null,\n );\n\n const currentValue = isControlled ? (controlledValue ?? null) : uncontrolledValue;\n\n const [isOpen, setIsOpen] = useState(false);\n // Lazy initializers — see DatePicker/Root.tsx for the SSR/hydration rationale.\n const [viewMonth, setViewMonth] = useState<ISODateString>(\n () => currentValue ?? adapter.today(displayTimezone),\n );\n const [focusedDate, setFocusedDate] = useState<ISODateString>(\n () => currentValue ?? adapter.today(displayTimezone),\n );\n\n useChangeEffect(isOpen, onOpenChange);\n const viewMonthStart = useMemo(() => adapter.startOfMonth(viewMonth), [viewMonth, adapter]);\n useChangeEffect(viewMonthStart, onCalendarNavigate);\n\n const isDisabled = typeof disabled === 'boolean' ? disabled : false;\n const disabledRules: DisabledRule[] = useMemo(\n () => (Array.isArray(disabled) ? disabled : []),\n [disabled],\n );\n\n // When value is null, use a stable {0,0,0} fallback for hydration safety —\n // avoid invoking adapter.today() during render to keep server/client output deterministic.\n const currentTime: TimeValue = useMemo(() => {\n if (!currentValue) return { hours: 0, minutes: 0, seconds: 0 };\n return displayTimezone\n ? getTimeInTimezone(currentValue, displayTimezone)\n : getTime(currentValue);\n }, [currentValue, displayTimezone]);\n\n const updateValue = useCallback(\n (next: ISODateString | null) => {\n if (isDisabled || readOnly) return;\n if (!isControlled) {\n setUncontrolledValue(next);\n }\n onChange?.(next);\n },\n [isControlled, isDisabled, readOnly, onChange],\n );\n\n /**\n * Select a date while preserving the time portion.\n * Unlike DatePicker.Root, this does not automatically close the popover.\n */\n const selectDate = useCallback(\n (newDateIso: ISODateString | null) => {\n if (newDateIso === null) {\n updateValue(null);\n return;\n }\n // Map UTC-grid ISO to civil-midnight in display timezone when set\n const normalizedDate = displayTimezone\n ? civilMidnightFromUtcDay(newDateIso, displayTimezone)\n : newDateIso;\n // Preserve the current time portion (tz-aware when applicable)\n const time = currentValue\n ? displayTimezone\n ? getTimeInTimezone(currentValue, displayTimezone)\n : getTime(currentValue)\n : currentTime;\n const merged = displayTimezone\n ? setTimeInTimezone(normalizedDate, time, displayTimezone)\n : setTimeOnIso(normalizedDate, time);\n updateValue(merged);\n },\n [currentValue, currentTime, updateValue, displayTimezone],\n );\n\n /**\n * Change the time while preserving the date portion.\n */\n const setTime = useCallback(\n (partial: Partial<TimeValue>) => {\n // If no date yet, start from today at midnight (tz-aware). today() is resolved at\n // event time (not during render) so SSR hydration output stays stable.\n const base = currentValue ?? adapter.today(displayTimezone);\n const merged = displayTimezone\n ? setTimeInTimezone(base, partial, displayTimezone)\n : setTimeOnIso(base, partial);\n updateValue(merged);\n },\n [currentValue, updateValue, displayTimezone, adapter],\n );\n\n const open = useCallback(() => {\n if (isDisabled || readOnly) return;\n setIsOpen(true);\n const target = currentValue ?? adapter.today(displayTimezone);\n setViewMonth(target);\n setFocusedDate(target);\n }, [isDisabled, readOnly, currentValue, adapter, displayTimezone]);\n\n const close = useCallback(() => {\n setIsOpen(false);\n }, []);\n\n const toggle = useCallback(() => {\n if (isOpen) close();\n else open();\n }, [isOpen, open, close]);\n\n // DatePickerContext (for reusing Calendar and Popover)\n const dateContext: DatePickerContextValue = useMemo(\n () => ({\n referenceRef,\n value: currentValue,\n selectDate,\n isOpen,\n open,\n close,\n toggle,\n viewMonth,\n setViewMonth,\n focusedDate,\n setFocusedDate,\n adapter,\n disabled: disabledRules,\n weekStartsOn,\n displayFormat,\n locale,\n displayTimezone,\n isDisabled,\n isReadOnly: readOnly,\n pickerId,\n labels: mergedDateLabels,\n }),\n [\n currentValue,\n selectDate,\n isOpen,\n open,\n close,\n toggle,\n viewMonth,\n focusedDate,\n adapter,\n disabledRules,\n weekStartsOn,\n displayFormat,\n locale,\n displayTimezone,\n isDisabled,\n readOnly,\n pickerId,\n mergedDateLabels,\n ],\n );\n\n // TimePickerContext (for reusing HourList, MinuteList, AmPmToggle)\n const timeContext: TimePickerContextValue = useMemo(\n () => ({\n value: currentValue,\n setTime,\n format,\n step,\n withSeconds,\n displayTimezone,\n isDisabled,\n isReadOnly: readOnly,\n currentTime,\n pickerId,\n labels: mergedTimeLabels,\n filterTime,\n }),\n [\n currentValue,\n setTime,\n format,\n step,\n withSeconds,\n displayTimezone,\n isDisabled,\n readOnly,\n currentTime,\n pickerId,\n mergedTimeLabels,\n filterTime,\n ],\n );\n\n return (\n <DatePickerContext.Provider value={dateContext}>\n <TimePickerContext.Provider value={timeContext}>{children}</TimePickerContext.Provider>\n </DatePickerContext.Provider>\n );\n}\n","import { forwardRef, useCallback } from 'react';\nimport type { InputHTMLAttributes } from 'react';\nimport { formatTimeString, getTime, getTimeInTimezone } from '@kalyx/core';\nimport { useDatePickerContext } from '../../context/DatePickerContext.js';\n\nexport interface DateTimePickerInputProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'value' | 'onChange' | 'type'\n> {}\n\n/**\n * DateTimePicker.Input — Displays date and time combined.\n * Example: \"2026-01-15 14:30\"\n *\n * The input is read-only — use Calendar/TimePicker sub-components to select values.\n */\nexport const DateTimePickerInput = forwardRef<HTMLInputElement, DateTimePickerInputProps>(\n function DateTimePickerInput({ onClick, onKeyDown, ...props }, ref) {\n const ctx = useDatePickerContext('DateTimePicker.Input');\n\n // Combine the date portion (yyyy-MM-dd) and the time portion (HH:mm)\n let displayValue = '';\n if (ctx.value) {\n try {\n const datePart = ctx.adapter.format(ctx.value, 'yyyy-MM-dd', ctx.displayTimezone);\n const time = ctx.displayTimezone\n ? getTimeInTimezone(ctx.value, ctx.displayTimezone)\n : getTime(ctx.value);\n displayValue = `${datePart} ${formatTimeString(time)}`;\n } catch {\n displayValue = ctx.value;\n }\n }\n\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLInputElement>) => {\n if (!ctx.isOpen) ctx.open();\n onClick?.(e);\n },\n [ctx, onClick],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Escape') {\n ctx.close();\n } else if (e.key === 'Enter' && ctx.isOpen) {\n // Don't submit the surrounding form when the calendar is open.\n e.preventDefault();\n } else if (e.key === 'ArrowDown' && !ctx.isOpen) {\n e.preventDefault();\n ctx.open();\n }\n onKeyDown?.(e);\n },\n [ctx, onKeyDown],\n );\n\n const calendarId = `${ctx.pickerId}-calendar`;\n\n return (\n <input\n ref={(node) => {\n ctx.referenceRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n }}\n type=\"text\"\n role=\"combobox\"\n readOnly\n aria-label={ctx.labels.dateTimeInput ?? 'Date and time'}\n aria-expanded={ctx.isOpen}\n aria-haspopup=\"dialog\"\n aria-controls={ctx.isOpen ? calendarId : undefined}\n aria-autocomplete=\"none\"\n autoComplete=\"off\"\n value={displayValue}\n disabled={ctx.isDisabled || props.disabled}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n {...props}\n />\n );\n },\n);\n\nDateTimePickerInput.displayName = 'DateTimePicker.Input';\n","import { DateTimePickerRoot } from './Root.js';\nimport { DateTimePickerInput } from './Input.js';\n\n// Reuse: DatePicker subcomponents (consume DatePickerContext)\nimport { DatePickerPopover } from '../DatePicker/Popover.js';\nimport { DatePickerCalendar } from '../DatePicker/Calendar.js';\nimport { DatePickerMonthGrid } from '../DatePicker/MonthGrid.js';\nimport { DatePickerYearGrid } from '../DatePicker/YearGrid.js';\n\n// Reuse: TimePicker subcomponents (consume TimePickerContext)\nimport { TimePickerHourList } from '../TimePicker/HourList.js';\nimport { TimePickerMinuteList } from '../TimePicker/MinuteList.js';\nimport { TimePickerAmPmToggle } from '../TimePicker/AmPmToggle.js';\n\nimport type { DateTimePickerRootProps } from './Root.js';\nimport type { DateTimePickerInputProps } from './Input.js';\n\n/**\n * DateTimePicker — Combined component for selecting both date and time.\n *\n * Manages a single ISO datetime as the source of truth while providing both\n * DatePickerContext and TimePickerContext internally. This lets existing\n * components such as DatePicker.Calendar and TimePicker.HourList work as-is.\n *\n * @example\n * ```tsx\n * <DateTimePicker value={dt} onChange={setDt} format=\"24h\" step={15}>\n * <DateTimePicker.Input />\n * <DateTimePicker.Popover>\n * <DateTimePicker.Calendar />\n * <DateTimePicker.HourList />\n * <DateTimePicker.MinuteList />\n * </DateTimePicker.Popover>\n * </DateTimePicker>\n * ```\n *\n * @example 12-hour mode\n * ```tsx\n * <DateTimePicker value={dt} onChange={setDt} format=\"12h\" step={15}>\n * <DateTimePicker.Input />\n * <DateTimePicker.Popover>\n * <DateTimePicker.Calendar />\n * <DateTimePicker.HourList />\n * <DateTimePicker.MinuteList />\n * <DateTimePicker.AmPmToggle />\n * </DateTimePicker.Popover>\n * </DateTimePicker>\n * ```\n */\nexport const DateTimePicker = Object.assign(DateTimePickerRoot, {\n Input: DateTimePickerInput,\n Popover: DatePickerPopover,\n Calendar: DatePickerCalendar,\n MonthGrid: DatePickerMonthGrid,\n YearGrid: DatePickerYearGrid,\n HourList: TimePickerHourList,\n MinuteList: TimePickerMinuteList,\n AmPmToggle: TimePickerAmPmToggle,\n});\n\nexport type { DateTimePickerRootProps, DateTimePickerInputProps };\n","import { DatePickerRoot } from '../DatePicker/Root.js';\nimport type { DatePickerRootProps } from '../DatePicker/Root.js';\n\n/** Props for MonthPicker Root — identical to DatePicker Root, but `displayFormat` defaults to `\"yyyy-MM\"`. */\nexport type MonthPickerRootProps = DatePickerRootProps;\n\n/**\n * MonthPicker.Root — thin wrapper over DatePicker.Root that defaults `displayFormat` to `\"yyyy-MM\"`.\n * All other behavior (controlled/uncontrolled, displayTimezone, disabled rules) is inherited.\n */\nexport function MonthPickerRoot(props: MonthPickerRootProps) {\n const displayFormat = props.displayFormat ?? 'yyyy-MM';\n return <DatePickerRoot {...props} displayFormat={displayFormat} />;\n}\n","import { useCallback, useEffect, useMemo, useState } from 'react';\nimport type { HTMLAttributes } from 'react';\nimport { getMonthName, type ISODateString } from '@kalyx/core';\nimport { useDatePickerContext } from '../../context/DatePickerContext.js';\nimport { isRangeFullyDisabled, useGridState } from '../_shared/grid-keyboard.js';\n\nexport interface MonthPickerGridClassNames {\n root?: string;\n header?: string;\n title?: string;\n navButton?: string;\n grid?: string;\n gridRow?: string;\n month?: string;\n monthSelected?: string;\n monthCurrent?: string;\n monthDisabled?: string;\n}\n\nexport interface MonthPickerGridProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role'> {\n classNames?: MonthPickerGridClassNames;\n}\n\n/**\n * MonthPicker.Grid — 12-month commit grid. Clicking a month selects it and closes the popover.\n *\n * Unlike `DatePicker.MonthGrid` (drilldown), this component commits the month selection\n * via `ctx.selectDate`, emitting the month-start ISO string.\n *\n * Disabled state: a month is marked unselectable when every day in it is\n * excluded by a `before`/`after` rule on the `disabled` prop. The cell is\n * rendered with `disabled` + `aria-disabled` + the `monthDisabled` className,\n * and keyboard navigation skips it.\n *\n * @example\n * ```tsx\n * <MonthPicker\n * value={month}\n * onChange={setMonth}\n * disabled={[{ before: '2026-04-01T00:00:00.000Z' }]}\n * >\n * <MonthPicker.Input />\n * <MonthPicker.Popover>\n * <MonthPicker.Grid />\n * </MonthPicker.Popover>\n * </MonthPicker>\n * ```\n */\nexport function MonthPickerGrid({ classNames, ...props }: MonthPickerGridProps) {\n const ctx = useDatePickerContext('MonthPicker.Grid');\n const { adapter, viewMonth, locale, value, displayTimezone, labels, disabled } = ctx;\n\n const currentYear = adapter.getYear(viewMonth);\n\n // Extract the value's year and month in the display timezone so highlighting\n // remains correct when storage is civil-midnight-in-tz (UTC-ISO form).\n const [valueYear, valueMonthZeroBased] = useMemo(() => {\n if (!value) return [null, null] as const;\n try {\n const [y, m] = adapter.format(value, 'yyyy-MM', displayTimezone).split('-').map(Number);\n return [y!, m! - 1] as const;\n } catch {\n return [null, null] as const;\n }\n }, [value, adapter, displayTimezone]);\n\n // SSR-safe: today is null on server and during hydration, set after mount.\n const [today, setToday] = useState<ISODateString | null>(null);\n useEffect(() => {\n setToday(adapter.today(displayTimezone));\n }, [adapter, displayTimezone]);\n const todayYear = today !== null ? adapter.getYear(today) : -1;\n const todayMonth = today !== null ? adapter.getMonth(today) : -1;\n\n // A month is \"fully disabled\" only when every day in it is excluded by a\n // `before`/`after` rule. `date` and `dayOfWeek` rules can't disable a whole\n // month, so they're ignored here.\n const monthDisabledFlags = useMemo(\n () =>\n Array.from({ length: 12 }, (_, i) => {\n const monthStart = new Date(Date.UTC(currentYear, i, 1)).toISOString();\n return isRangeFullyDisabled(monthStart, adapter.endOfMonth(monthStart), disabled, adapter);\n }),\n [currentYear, disabled, adapter],\n );\n\n const navigateYear = useCallback(\n (direction: number) => {\n ctx.setViewMonth(adapter.addYears(viewMonth, direction));\n },\n [adapter, viewMonth, ctx],\n );\n\n const handleMonthSelect = useCallback(\n (monthIndex: number) => {\n if (monthDisabledFlags[monthIndex]) return;\n const target = new Date(Date.UTC(currentYear, monthIndex, 1)).toISOString();\n ctx.selectDate(target);\n },\n [currentYear, ctx, monthDisabledFlags],\n );\n\n // Roving tabIndex: focus the selected cell on the value's year, else the\n // current month. Falls back to the first enabled cell when the natural\n // choice is itself disabled (a `disabled` HTML button can't receive DOM\n // focus, so without this fallback the auto-refocus useEffect would silently\n // no-op and the user would have nowhere to keyboard-navigate from).\n const naturalIndex =\n valueYear === currentYear && valueMonthZeroBased !== null\n ? valueMonthZeroBased\n : adapter.getMonth(viewMonth);\n const firstEnabled = monthDisabledFlags.findIndex((d) => !d);\n const initialIndex = monthDisabledFlags[naturalIndex]\n ? firstEnabled === -1\n ? naturalIndex\n : firstEnabled\n : naturalIndex;\n\n const { gridRef, focusedIndex, handleKeyDown } = useGridState({\n initialIndex,\n disabledFlags: monthDisabledFlags,\n onSelect: handleMonthSelect,\n onPageUp: () => navigateYear(-1),\n onPageDown: () => navigateYear(1),\n onEscape: ctx.close,\n });\n\n return (\n <div className={classNames?.root} {...props}>\n <div className={classNames?.header}>\n <button\n type=\"button\"\n className={classNames?.navButton}\n onClick={() => navigateYear(-1)}\n aria-label={labels.prevYear}\n >\n <\n </button>\n <span className={classNames?.title}>{currentYear}</span>\n <button\n type=\"button\"\n className={classNames?.navButton}\n onClick={() => navigateYear(1)}\n aria-label={labels.nextYear}\n >\n >\n </button>\n </div>\n\n <div\n ref={gridRef}\n role=\"grid\"\n aria-label={`${currentYear} months`}\n className={classNames?.grid}\n onKeyDown={handleKeyDown}\n >\n {Array.from({ length: 4 }, (_, rowIndex) => (\n <div\n key={rowIndex}\n role=\"row\"\n className={classNames?.gridRow}\n style={{ display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)' }}\n >\n {Array.from({ length: 3 }, (_, col) => {\n const i = rowIndex * 3 + col;\n const isSelected = valueYear === currentYear && valueMonthZeroBased === i;\n const isCurrent = todayYear === currentYear && todayMonth === i;\n const isFocused = i === focusedIndex;\n const isDisabled = monthDisabledFlags[i] ?? false;\n const cls =\n [\n classNames?.month,\n isSelected && classNames?.monthSelected,\n isCurrent && classNames?.monthCurrent,\n isDisabled && classNames?.monthDisabled,\n ]\n .filter(Boolean)\n .join(' ') || undefined;\n return (\n <button\n key={i}\n type=\"button\"\n role=\"gridcell\"\n tabIndex={isFocused ? 0 : -1}\n disabled={isDisabled}\n aria-selected={isSelected || undefined}\n aria-disabled={isDisabled || undefined}\n aria-current={isCurrent ? 'date' : undefined}\n data-selected={isSelected || undefined}\n data-current={isCurrent || undefined}\n data-focused={isFocused || undefined}\n className={cls}\n onClick={() => handleMonthSelect(i)}\n >\n {getMonthName(i, locale)}\n </button>\n );\n })}\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import { MonthPickerRoot } from './Root.js';\nimport { DatePickerInput } from '../DatePicker/Input.js';\nimport { DatePickerTrigger } from '../DatePicker/Trigger.js';\nimport { DatePickerPopover } from '../DatePicker/Popover.js';\nimport { MonthPickerGrid } from './Grid.js';\n\nimport type { MonthPickerRootProps } from './Root.js';\nimport type { DatePickerInputProps } from '../DatePicker/Input.js';\nimport type { DatePickerTriggerProps } from '../DatePicker/Trigger.js';\nimport type { DatePickerPopoverProps } from '../DatePicker/Popover.js';\nimport type { MonthPickerGridProps, MonthPickerGridClassNames } from './Grid.js';\n\n/**\n * MonthPicker — Headless month selector. Value is the first day of the selected month (UTC-ISO).\n *\n * Reuses DatePicker infrastructure (Root, Input, Trigger, Popover) so the public surface stays\n * consistent. The only new building block is `MonthPicker.Grid`, a 12-month commit grid.\n *\n * @example Basic\n * ```tsx\n * const [month, setMonth] = useState<string | null>(null);\n * <MonthPicker value={month} onChange={setMonth}>\n * <MonthPicker.Input placeholder=\"Pick a month\" />\n * <MonthPicker.Popover>\n * <MonthPicker.Grid />\n * </MonthPicker.Popover>\n * </MonthPicker>\n * ```\n */\nexport const MonthPicker = Object.assign(MonthPickerRoot, {\n Input: DatePickerInput,\n Trigger: DatePickerTrigger,\n Popover: DatePickerPopover,\n Grid: MonthPickerGrid,\n});\n\nexport type {\n MonthPickerRootProps,\n DatePickerInputProps as MonthPickerInputProps,\n DatePickerTriggerProps as MonthPickerTriggerProps,\n DatePickerPopoverProps as MonthPickerPopoverProps,\n MonthPickerGridProps,\n MonthPickerGridClassNames,\n};\n","import { DatePickerRoot } from '../DatePicker/Root.js';\nimport type { DatePickerRootProps } from '../DatePicker/Root.js';\n\n/** Props for YearPicker Root — identical to DatePicker Root, but `displayFormat` defaults to `\"yyyy\"`. */\nexport type YearPickerRootProps = DatePickerRootProps;\n\n/**\n * YearPicker.Root — thin wrapper over DatePicker.Root that defaults `displayFormat` to `\"yyyy\"`.\n */\nexport function YearPickerRoot(props: YearPickerRootProps) {\n const displayFormat = props.displayFormat ?? 'yyyy';\n return <DatePickerRoot {...props} displayFormat={displayFormat} />;\n}\n","import { useCallback, useEffect, useMemo, useState } from 'react';\nimport type { HTMLAttributes } from 'react';\nimport type { ISODateString } from '@kalyx/core';\nimport { useDatePickerContext } from '../../context/DatePickerContext.js';\nimport { isRangeFullyDisabled, useGridState } from '../_shared/grid-keyboard.js';\n\nexport interface YearPickerGridClassNames {\n root?: string;\n header?: string;\n title?: string;\n navButton?: string;\n grid?: string;\n gridRow?: string;\n year?: string;\n yearSelected?: string;\n yearCurrent?: string;\n yearDisabled?: string;\n}\n\nexport interface YearPickerGridProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role'> {\n classNames?: YearPickerGridClassNames;\n}\n\n/**\n * YearPicker.Grid — 12-year decade commit grid. Clicking a year selects it and closes the popover.\n *\n * Unlike `DatePicker.YearGrid` (drilldown), this component commits the year selection via\n * `ctx.selectDate`, emitting the year-start ISO string (Jan 1 at UTC midnight).\n *\n * Disabled state: a year is marked unselectable when every day in it is\n * excluded by a `before`/`after` rule on the `disabled` prop. The cell is\n * rendered with `disabled` + `aria-disabled` + the `yearDisabled` className,\n * and keyboard navigation skips it.\n *\n * @example\n * ```tsx\n * <YearPicker\n * value={year}\n * onChange={setYear}\n * disabled={[{ before: '2024-01-01T00:00:00.000Z' }]}\n * >\n * <YearPicker.Input />\n * <YearPicker.Popover>\n * <YearPicker.Grid />\n * </YearPicker.Popover>\n * </YearPicker>\n * ```\n */\nexport function YearPickerGrid({ classNames, ...props }: YearPickerGridProps) {\n const ctx = useDatePickerContext('YearPicker.Grid');\n const { adapter, viewMonth, value, displayTimezone, labels, disabled } = ctx;\n\n const currentYear = adapter.getYear(viewMonth);\n // Decade block containing the currently viewed year (12-year range)\n const decadeStart = currentYear - (currentYear % 12);\n\n // Extract the value's year in the display timezone so highlighting is timezone-aware.\n const valueYear = useMemo(() => {\n if (!value) return null;\n try {\n return Number(adapter.format(value, 'yyyy', displayTimezone));\n } catch {\n return null;\n }\n }, [value, adapter, displayTimezone]);\n\n // SSR-safe: today is null on server and during hydration, set after mount.\n const [today, setToday] = useState<ISODateString | null>(null);\n useEffect(() => {\n setToday(adapter.today(displayTimezone));\n }, [adapter, displayTimezone]);\n const todayYear = today !== null ? adapter.getYear(today) : -1;\n\n // A year is \"fully disabled\" only when every day in it is excluded by a\n // `before`/`after` rule.\n const yearDisabledFlags = useMemo(\n () =>\n Array.from({ length: 12 }, (_, i) => {\n const year = decadeStart + i;\n const yearStart = new Date(Date.UTC(year, 0, 1)).toISOString();\n const yearEnd = new Date(Date.UTC(year, 11, 31, 23, 59, 59, 999)).toISOString();\n return isRangeFullyDisabled(yearStart, yearEnd, disabled, adapter);\n }),\n [decadeStart, disabled, adapter],\n );\n\n const navigateDecade = useCallback(\n (direction: number) => {\n ctx.setViewMonth(adapter.addYears(viewMonth, direction * 12));\n },\n [adapter, viewMonth, ctx],\n );\n\n const handleYearSelect = useCallback(\n (indexInDecade: number) => {\n if (yearDisabledFlags[indexInDecade]) return;\n const year = decadeStart + indexInDecade;\n const target = new Date(Date.UTC(year, 0, 1)).toISOString();\n ctx.selectDate(target);\n },\n [ctx, decadeStart, yearDisabledFlags],\n );\n\n // Roving tabIndex: focus the selected cell if the value falls in this\n // decade, otherwise focus the cell representing the current viewMonth's\n // year. Falls back to the first enabled cell when the natural choice is\n // disabled (a `disabled` HTML button can't receive DOM focus, so without\n // this fallback the auto-refocus useEffect would silently no-op).\n const naturalIndex =\n valueYear !== null && valueYear >= decadeStart && valueYear <= decadeStart + 11\n ? valueYear - decadeStart\n : currentYear - decadeStart;\n const firstEnabled = yearDisabledFlags.findIndex((d) => !d);\n const initialIndex = yearDisabledFlags[naturalIndex]\n ? firstEnabled === -1\n ? naturalIndex\n : firstEnabled\n : naturalIndex;\n\n const { gridRef, focusedIndex, handleKeyDown } = useGridState({\n initialIndex,\n disabledFlags: yearDisabledFlags,\n onSelect: handleYearSelect,\n onPageUp: () => navigateDecade(-1),\n onPageDown: () => navigateDecade(1),\n onEscape: ctx.close,\n });\n\n const rangeLabel = `${decadeStart}–${decadeStart + 11}`;\n\n return (\n <div className={classNames?.root} {...props}>\n <div className={classNames?.header}>\n <button\n type=\"button\"\n className={classNames?.navButton}\n onClick={() => navigateDecade(-1)}\n aria-label={labels.prevDecade}\n >\n <\n </button>\n <span className={classNames?.title}>{rangeLabel}</span>\n <button\n type=\"button\"\n className={classNames?.navButton}\n onClick={() => navigateDecade(1)}\n aria-label={labels.nextDecade}\n >\n >\n </button>\n </div>\n\n <div\n ref={gridRef}\n role=\"grid\"\n aria-label={rangeLabel}\n className={classNames?.grid}\n onKeyDown={handleKeyDown}\n >\n {Array.from({ length: 4 }, (_, rowIndex) => (\n <div\n key={rowIndex}\n role=\"row\"\n className={classNames?.gridRow}\n style={{ display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)' }}\n >\n {Array.from({ length: 3 }, (_, col) => {\n const i = rowIndex * 3 + col;\n const year = decadeStart + i;\n const isSelected = year === valueYear;\n const isCurrent = year === todayYear;\n const isFocused = i === focusedIndex;\n const isDisabled = yearDisabledFlags[i] ?? false;\n const cls =\n [\n classNames?.year,\n isSelected && classNames?.yearSelected,\n isCurrent && classNames?.yearCurrent,\n isDisabled && classNames?.yearDisabled,\n ]\n .filter(Boolean)\n .join(' ') || undefined;\n return (\n <button\n // Stable index key keeps the DOM node mounted across decade\n // navigation so focus on the same-position cell persists.\n key={i}\n type=\"button\"\n role=\"gridcell\"\n tabIndex={isFocused ? 0 : -1}\n disabled={isDisabled}\n aria-selected={isSelected || undefined}\n aria-disabled={isDisabled || undefined}\n aria-current={isCurrent ? 'date' : undefined}\n data-selected={isSelected || undefined}\n data-current={isCurrent || undefined}\n data-focused={isFocused || undefined}\n className={cls}\n onClick={() => handleYearSelect(i)}\n >\n {year}\n </button>\n );\n })}\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import { YearPickerRoot } from './Root.js';\nimport { DatePickerInput } from '../DatePicker/Input.js';\nimport { DatePickerTrigger } from '../DatePicker/Trigger.js';\nimport { DatePickerPopover } from '../DatePicker/Popover.js';\nimport { YearPickerGrid } from './Grid.js';\n\nimport type { YearPickerRootProps } from './Root.js';\nimport type { DatePickerInputProps } from '../DatePicker/Input.js';\nimport type { DatePickerTriggerProps } from '../DatePicker/Trigger.js';\nimport type { DatePickerPopoverProps } from '../DatePicker/Popover.js';\nimport type { YearPickerGridProps, YearPickerGridClassNames } from './Grid.js';\n\n/**\n * YearPicker — Headless year selector. Value is Jan 1 of the selected year (UTC-ISO).\n *\n * Reuses DatePicker infrastructure (Root, Input, Trigger, Popover) so the public surface stays\n * consistent. The only new building block is `YearPicker.Grid`, a 12-year decade commit grid.\n *\n * @example Basic\n * ```tsx\n * const [year, setYear] = useState<string | null>(null);\n * <YearPicker value={year} onChange={setYear}>\n * <YearPicker.Input placeholder=\"Pick a year\" />\n * <YearPicker.Popover>\n * <YearPicker.Grid />\n * </YearPicker.Popover>\n * </YearPicker>\n * ```\n */\nexport const YearPicker = Object.assign(YearPickerRoot, {\n Input: DatePickerInput,\n Trigger: DatePickerTrigger,\n Popover: DatePickerPopover,\n Grid: YearPickerGrid,\n});\n\nexport type {\n YearPickerRootProps,\n DatePickerInputProps as YearPickerInputProps,\n DatePickerTriggerProps as YearPickerTriggerProps,\n DatePickerPopoverProps as YearPickerPopoverProps,\n YearPickerGridProps,\n YearPickerGridClassNames,\n};\n","import { RangePickerRoot } from '../RangePicker/Root.js';\nimport type { RangePickerRootProps } from '../RangePicker/Root.js';\n\n/** Props for WeekPicker.Root — reuses RangePicker.Root. */\nexport type WeekPickerRootProps = RangePickerRootProps;\n\n/**\n * WeekPicker.Root — thin wrapper over RangePicker.Root.\n *\n * The wrapper is necessary (rather than aliasing `RangePickerRoot` directly) because\n * `Object.assign` on the exported root mutates the target. Without a distinct identity here,\n * `WeekPicker.Calendar` would leak onto `RangePicker.Calendar`.\n */\nexport function WeekPickerRoot(props: WeekPickerRootProps) {\n return <RangePickerRoot {...props} />;\n}\n","import { RangePickerCalendar } from '../RangePicker/Calendar.js';\nimport type {\n RangePickerCalendarProps,\n RangePickerCalendarClassNames,\n} from '../RangePicker/Calendar.js';\n\n/**\n * WeekPicker.Calendar — renders the same calendar grid as `RangePicker.Calendar` but with\n * `selectionMode=\"week\"` so a single click commits the full week containing the clicked day.\n *\n * This is a thin wrapper over `RangePicker.Calendar` — the two share all keyboard navigation,\n * ARIA semantics, and rendering logic.\n */\nexport function WeekPickerCalendar(props: Omit<RangePickerCalendarProps, 'selectionMode'>) {\n return <RangePickerCalendar {...props} selectionMode=\"week\" />;\n}\n\n/** Re-export RangePicker calendar classNames — the surface is identical. */\nexport type WeekPickerCalendarClassNames = RangePickerCalendarClassNames;\n\nexport type WeekPickerCalendarProps = Omit<RangePickerCalendarProps, 'selectionMode'>;\n","import { WeekPickerRoot } from './Root.js';\nimport { RangePickerInput } from '../RangePicker/Input.js';\nimport { RangePickerPopover } from '../RangePicker/Popover.js';\nimport { WeekPickerCalendar } from './Calendar.js';\n\nimport type { WeekPickerRootProps } from './Root.js';\nimport type { RangePickerInputProps } from '../RangePicker/Input.js';\nimport type { RangePickerPopoverProps } from '../RangePicker/Popover.js';\nimport type { WeekPickerCalendarProps, WeekPickerCalendarClassNames } from './Calendar.js';\n\n/**\n * WeekPicker — Headless week selector. Value is a `DateRange` spanning the entire week (start\n * and end days inclusive, based on `weekStartsOn`). A single click selects the full week.\n *\n * Internally reuses `RangePicker` infrastructure (Root, Input, Popover). The only new primitive\n * is `WeekPicker.Calendar`, which overrides click behavior to commit the full week.\n *\n * @example Basic\n * ```tsx\n * const [week, setWeek] = useState<DateRange>({ start: null, end: null });\n * <WeekPicker value={week} onChange={setWeek}>\n * <WeekPicker.Input part=\"start\" />\n * <WeekPicker.Input part=\"end\" />\n * <WeekPicker.Popover>\n * <WeekPicker.Calendar />\n * </WeekPicker.Popover>\n * </WeekPicker>\n * ```\n */\nexport const WeekPicker = Object.assign(WeekPickerRoot, {\n Input: RangePickerInput,\n Popover: RangePickerPopover,\n Calendar: WeekPickerCalendar,\n});\n\nexport type {\n WeekPickerRootProps,\n RangePickerInputProps as WeekPickerInputProps,\n RangePickerPopoverProps as WeekPickerPopoverProps,\n WeekPickerCalendarProps,\n WeekPickerCalendarClassNames,\n};\n","import { useCallback, useId, useRef, useState } from 'react';\nimport { civilMidnightFromUtcDay, getCalendarDays } from '@kalyx/core';\nimport { DateFnsAdapter } from '@kalyx/adapter-date-fns';\nimport type {\n CalendarGrid,\n DateAdapter,\n DisabledRule,\n ISODateString,\n WeekStartsOn,\n} from '@kalyx/core';\n\nexport interface UseDatePickerOptions {\n /** Selected date (controlled mode) */\n value?: ISODateString | null;\n /** Initial date (uncontrolled mode) */\n defaultValue?: ISODateString;\n /** Callback fired when the date changes */\n onChange?: (value: ISODateString | null) => void;\n /** Rules that mark days as disabled */\n disabled?: DisabledRule[];\n /** Day the week starts on */\n weekStartsOn?: WeekStartsOn;\n /** Date adapter */\n adapter?: DateAdapter;\n /** IANA timezone for display (see DatePickerRoot#displayTimezone) */\n displayTimezone?: string;\n}\n\nexport interface UseDatePickerReturn {\n /** Currently selected date (ISO string) */\n value: ISODateString | null;\n /** Whether the popover is open */\n isOpen: boolean;\n /** Open the popover */\n open: () => void;\n /** Close the popover */\n close: () => void;\n /** Toggle the popover */\n toggle: () => void;\n /** Select a date */\n selectDate: (iso: ISODateString | null) => void;\n /** Month currently displayed (ISO string) */\n viewMonth: ISODateString;\n /** Change the displayed month */\n setViewMonth: (iso: ISODateString) => void;\n /** Calendar grid data */\n calendar: CalendarGrid;\n /** Currently focused date */\n focusedDate: ISODateString;\n /** Update the focused date */\n setFocusedDate: (iso: ISODateString) => void;\n /** Move to the previous month */\n previousMonth: () => void;\n /** Move to the next month */\n nextMonth: () => void;\n /** Unique ID */\n pickerId: string;\n /** Date adapter */\n adapter: DateAdapter;\n}\n\n/**\n * Hook that manages DatePicker state.\n * Use this when you want to implement a fully custom UI without the built-in components.\n *\n * @example\n * ```tsx\n * function MyDatePicker() {\n * const { value, isOpen, calendar, open, selectDate } = useDatePicker({\n * onChange: (iso) => console.log(iso),\n * });\n * // ... custom rendering\n * }\n * ```\n */\nexport function useDatePicker(options: UseDatePickerOptions = {}): UseDatePickerReturn {\n const {\n value: controlledValue,\n defaultValue,\n onChange,\n disabled = [],\n weekStartsOn = 0,\n adapter = DateFnsAdapter,\n displayTimezone,\n } = options;\n\n const pickerId = useId();\n const isControlled = useRef(controlledValue !== undefined).current;\n\n const [uncontrolledValue, setUncontrolledValue] = useState<ISODateString | null>(\n defaultValue ?? null,\n );\n\n const currentValue = isControlled ? (controlledValue ?? null) : uncontrolledValue;\n\n const [isOpen, setIsOpen] = useState(false);\n const [viewMonth, setViewMonth] = useState<ISODateString>(\n currentValue ?? adapter.today(displayTimezone),\n );\n const [focusedDate, setFocusedDate] = useState<ISODateString>(\n currentValue ?? adapter.today(displayTimezone),\n );\n\n const selectDate = useCallback(\n (iso: ISODateString | null) => {\n const normalized =\n iso && displayTimezone ? civilMidnightFromUtcDay(iso, displayTimezone) : iso;\n if (!isControlled) {\n setUncontrolledValue(normalized);\n }\n onChange?.(normalized);\n setIsOpen(false);\n },\n [isControlled, onChange, displayTimezone],\n );\n\n const open = useCallback(() => {\n setIsOpen(true);\n const target = currentValue ?? adapter.today(displayTimezone);\n setViewMonth(target);\n setFocusedDate(target);\n }, [currentValue, adapter, displayTimezone]);\n\n const close = useCallback(() => {\n setIsOpen(false);\n }, []);\n\n const toggle = useCallback(() => {\n if (isOpen) close();\n else open();\n }, [isOpen, open, close]);\n\n const previousMonth = useCallback(() => {\n const newMonth = adapter.addMonths(viewMonth, -1);\n setViewMonth(newMonth);\n setFocusedDate(adapter.startOfMonth(newMonth));\n }, [adapter, viewMonth]);\n\n const nextMonth = useCallback(() => {\n const newMonth = adapter.addMonths(viewMonth, 1);\n setViewMonth(newMonth);\n setFocusedDate(adapter.startOfMonth(newMonth));\n }, [adapter, viewMonth]);\n\n const calendar = getCalendarDays(viewMonth, adapter, {\n weekStartsOn,\n selected: currentValue,\n focusedDate,\n disabled,\n timezone: displayTimezone,\n });\n\n return {\n value: currentValue,\n isOpen,\n open,\n close,\n toggle,\n selectDate,\n viewMonth,\n setViewMonth,\n calendar,\n focusedDate,\n setFocusedDate,\n previousMonth,\n nextMonth,\n pickerId,\n adapter,\n };\n}\n","import { useCallback, useId, useRef, useState } from 'react';\nimport { civilMidnightFromUtcDay, getCalendarDays } from '@kalyx/core';\nimport { DateFnsAdapter } from '@kalyx/adapter-date-fns';\nimport type {\n CalendarGrid,\n DateAdapter,\n DateRange,\n DisabledRule,\n ISODateString,\n WeekStartsOn,\n} from '@kalyx/core';\nimport type { RangeSelectingTarget } from '../context/RangePickerContext.js';\n\nconst EMPTY_RANGE: DateRange = { start: null, end: null };\n\nexport interface UseRangePickerOptions {\n /** Selected range (controlled mode) */\n value?: DateRange;\n /** Initial range (uncontrolled mode) */\n defaultValue?: DateRange;\n /** Callback fired when the range changes */\n onChange?: (range: DateRange) => void;\n /** Rules that mark days as disabled */\n disabled?: DisabledRule[];\n /** Day the week starts on */\n weekStartsOn?: WeekStartsOn;\n /** Date adapter */\n adapter?: DateAdapter;\n /** IANA timezone for display (see RangePickerRoot#displayTimezone) */\n displayTimezone?: string;\n}\n\nexport interface UseRangePickerReturn {\n /** Currently selected range */\n value: DateRange;\n /** Which endpoint will be selected next */\n selectingTarget: RangeSelectingTarget;\n /** Handler for clicking a single date */\n selectDate: (iso: ISODateString) => void;\n /** Set the range directly */\n setRange: (range: DateRange) => void;\n /** Whether the popover is open */\n isOpen: boolean;\n open: () => void;\n close: () => void;\n toggle: () => void;\n /** Hovered date (for range preview) */\n hoverDate: ISODateString | null;\n setHoverDate: (iso: ISODateString | null) => void;\n /** Month currently displayed */\n viewMonth: ISODateString;\n setViewMonth: (iso: ISODateString) => void;\n /** Calendar grid */\n calendar: CalendarGrid;\n /** Currently focused date */\n focusedDate: ISODateString;\n setFocusedDate: (iso: ISODateString) => void;\n /** Move to the previous month */\n previousMonth: () => void;\n /** Move to the next month */\n nextMonth: () => void;\n /** Unique ID */\n pickerId: string;\n /** Date adapter */\n adapter: DateAdapter;\n}\n\n/**\n * Hook that manages RangePicker state.\n * Use this when you want to build a fully custom UI without the built-in components.\n *\n * @example\n * ```tsx\n * function MyRangePicker() {\n * const { value, calendar, selectDate, selectingTarget } = useRangePicker({\n * onChange: (range) => console.log(range.start, range.end),\n * });\n * // selectingTarget === 'start' -> waiting for start date\n * // selectingTarget === 'end' -> waiting for end date\n * }\n * ```\n */\nexport function useRangePicker(options: UseRangePickerOptions = {}): UseRangePickerReturn {\n const {\n value: controlledValue,\n defaultValue,\n onChange,\n disabled = [],\n weekStartsOn = 0,\n adapter = DateFnsAdapter,\n displayTimezone,\n } = options;\n\n const pickerId = useId();\n const isControlled = useRef(controlledValue !== undefined).current;\n\n const [uncontrolledValue, setUncontrolledValue] = useState<DateRange>(\n defaultValue ?? EMPTY_RANGE,\n );\n\n const currentValue = isControlled ? (controlledValue ?? EMPTY_RANGE) : uncontrolledValue;\n\n const [isOpen, setIsOpen] = useState(false);\n const [selectingTarget, setSelectingTarget] = useState<RangeSelectingTarget>('start');\n const [hoverDate, setHoverDate] = useState<ISODateString | null>(null);\n const [viewMonth, setViewMonth] = useState<ISODateString>(\n currentValue.start ?? adapter.today(displayTimezone),\n );\n const [focusedDate, setFocusedDate] = useState<ISODateString>(\n currentValue.start ?? adapter.today(displayTimezone),\n );\n\n const setRange = useCallback(\n (range: DateRange) => {\n if (!isControlled) {\n setUncontrolledValue(range);\n }\n onChange?.(range);\n },\n [isControlled, onChange],\n );\n\n const selectDate = useCallback(\n (iso: ISODateString) => {\n const normalized = displayTimezone ? civilMidnightFromUtcDay(iso, displayTimezone) : iso;\n if (selectingTarget === 'start') {\n setRange({ start: normalized, end: null });\n setSelectingTarget('end');\n setHoverDate(null);\n } else {\n const start = currentValue.start;\n if (!start) {\n setRange({ start: normalized, end: null });\n setSelectingTarget('end');\n return;\n }\n\n const newRange: DateRange = adapter.isBefore(normalized, start)\n ? { start: normalized, end: start }\n : { start, end: normalized };\n\n setRange(newRange);\n setSelectingTarget('start');\n setHoverDate(null);\n setIsOpen(false);\n }\n },\n [selectingTarget, currentValue.start, adapter, setRange, displayTimezone],\n );\n\n const open = useCallback(() => {\n setIsOpen(true);\n const target = currentValue.start ?? adapter.today(displayTimezone);\n setViewMonth(target);\n setFocusedDate(target);\n if (currentValue.start && currentValue.end) {\n setSelectingTarget('start');\n }\n }, [currentValue, adapter, displayTimezone]);\n\n const close = useCallback(() => {\n setIsOpen(false);\n setHoverDate(null);\n }, []);\n\n const toggle = useCallback(() => {\n if (isOpen) close();\n else open();\n }, [isOpen, open, close]);\n\n const previousMonth = useCallback(() => {\n const newMonth = adapter.addMonths(viewMonth, -1);\n setViewMonth(newMonth);\n setFocusedDate(adapter.startOfMonth(newMonth));\n }, [adapter, viewMonth]);\n\n const nextMonth = useCallback(() => {\n const newMonth = adapter.addMonths(viewMonth, 1);\n setViewMonth(newMonth);\n setFocusedDate(adapter.startOfMonth(newMonth));\n }, [adapter, viewMonth]);\n\n const calendar = getCalendarDays(viewMonth, adapter, {\n weekStartsOn,\n focusedDate,\n disabled,\n range: currentValue,\n rangeHover: hoverDate,\n timezone: displayTimezone,\n });\n\n return {\n value: currentValue,\n selectingTarget,\n selectDate,\n setRange,\n isOpen,\n open,\n close,\n toggle,\n hoverDate,\n setHoverDate,\n viewMonth,\n setViewMonth,\n calendar,\n focusedDate,\n setFocusedDate,\n previousMonth,\n nextMonth,\n pickerId,\n adapter,\n };\n}\n","import { useCallback, useId, useMemo, useRef, useState } from 'react';\nimport {\n generateHours,\n generateMinutes,\n getTime,\n setTime as setTimeOnIso,\n getTimeInTimezone,\n setTimeInTimezone,\n to12Hour,\n to24Hour,\n} from '@kalyx/core';\nimport { DateFnsAdapter } from '@kalyx/adapter-date-fns';\nimport type { ISODateString, TimeValue } from '@kalyx/core';\nimport type { TimePickerFormat } from '../context/TimePickerContext.js';\n\nexport interface UseTimePickerOptions {\n /** Selected time (controlled mode) */\n value?: ISODateString | null;\n /** Initial time (uncontrolled mode) */\n defaultValue?: ISODateString;\n /** Callback fired when the time changes */\n onChange?: (value: ISODateString | null) => void;\n /** 12h or 24h format */\n format?: TimePickerFormat;\n /** Minute step */\n step?: number;\n /** Whether seconds are shown */\n withSeconds?: boolean;\n /** IANA timezone for time interpretation (see TimePickerRoot#displayTimezone) */\n displayTimezone?: string;\n}\n\nexport interface UseTimePickerReturn {\n /** Current ISO datetime value */\n value: ISODateString | null;\n /** Current time (TimeValue) */\n currentTime: TimeValue;\n /** Update part of the time */\n setTime: (partial: Partial<TimeValue>) => void;\n /** Set the hour directly (1-12 in 12h mode, 0-23 in 24h mode) */\n setHour: (hour: number) => void;\n /** Set the minute */\n setMinute: (minute: number) => void;\n /** Set the second */\n setSecond: (second: number) => void;\n /** Change AM/PM (12h mode only) */\n setPeriod: (period: 'AM' | 'PM') => void;\n /** Available hour list */\n availableHours: number[];\n /** Available minute list (respects step) */\n availableMinutes: number[];\n /** 12h or 24h mode */\n format: TimePickerFormat;\n /** Hour value for display (1-12 in 12h mode) */\n displayHour: number;\n /** Current AM/PM (12h mode only, null in 24h) */\n period: 'AM' | 'PM' | null;\n /** Unique ID */\n pickerId: string;\n}\n\nfunction getDefaultIso(): ISODateString {\n return DateFnsAdapter.today();\n}\n\n/**\n * Hook that manages TimePicker state.\n * Use this when you want to build a fully custom UI without the built-in components.\n *\n * @example\n * ```tsx\n * function MyTimePicker() {\n * const {\n * currentTime, displayHour, period,\n * availableHours, availableMinutes,\n * setHour, setMinute, setPeriod,\n * } = useTimePicker({ format: '12h', step: 15 });\n * // displayHour = 1-12, period = \"AM\" | \"PM\"\n * // availableMinutes = [0, 15, 30, 45]\n * }\n * ```\n */\nexport function useTimePicker(options: UseTimePickerOptions = {}): UseTimePickerReturn {\n const {\n value: controlledValue,\n defaultValue,\n onChange,\n format = '24h',\n step = 1,\n displayTimezone,\n } = options;\n\n const pickerId = useId();\n const isControlled = useRef(controlledValue !== undefined).current;\n\n const [uncontrolledValue, setUncontrolledValue] = useState<ISODateString | null>(\n defaultValue ?? null,\n );\n\n const currentValue = isControlled ? (controlledValue ?? null) : uncontrolledValue;\n const baseIso = currentValue ?? getDefaultIso();\n const currentTime = useMemo(\n () => (displayTimezone ? getTimeInTimezone(baseIso, displayTimezone) : getTime(baseIso)),\n [baseIso, displayTimezone],\n );\n\n const setTime = useCallback(\n (partial: Partial<TimeValue>) => {\n const newIso = displayTimezone\n ? setTimeInTimezone(baseIso, partial, displayTimezone)\n : setTimeOnIso(baseIso, partial);\n if (!isControlled) {\n setUncontrolledValue(newIso);\n }\n onChange?.(newIso);\n },\n [baseIso, isControlled, onChange, displayTimezone],\n );\n\n const period = format === '12h' ? to12Hour(currentTime.hours).period : null;\n const displayHour = format === '12h' ? to12Hour(currentTime.hours).hours12 : currentTime.hours;\n\n const setHour = useCallback(\n (hour: number) => {\n const hours24 = format === '12h' && period ? to24Hour(hour, period) : hour;\n setTime({ hours: hours24 });\n },\n [format, period, setTime],\n );\n\n const setMinute = useCallback((minute: number) => setTime({ minutes: minute }), [setTime]);\n\n const setSecond = useCallback((second: number) => setTime({ seconds: second }), [setTime]);\n\n const setPeriod = useCallback(\n (newPeriod: 'AM' | 'PM') => {\n if (format !== '12h') return;\n const newHours24 = to24Hour(displayHour, newPeriod);\n setTime({ hours: newHours24 });\n },\n [format, displayHour, setTime],\n );\n\n return {\n value: currentValue,\n currentTime,\n setTime,\n setHour,\n setMinute,\n setSecond,\n setPeriod,\n availableHours: generateHours(format),\n availableMinutes: generateMinutes(step),\n format,\n displayHour,\n period,\n pickerId,\n };\n}\n"]}
|