@kalyx/react 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +26 -0
- package/LICENSE +21 -0
- package/README.md +88 -0
- package/dist/components/DatePicker/Calendar.d.ts +23 -0
- package/dist/components/DatePicker/Calendar.d.ts.map +1 -0
- package/dist/components/DatePicker/Calendar.js +127 -0
- package/dist/components/DatePicker/Calendar.js.map +1 -0
- package/dist/components/DatePicker/Input.d.ts +7 -0
- package/dist/components/DatePicker/Input.d.ts.map +1 -0
- package/dist/components/DatePicker/Input.js +73 -0
- package/dist/components/DatePicker/Input.js.map +1 -0
- package/dist/components/DatePicker/MonthGrid.d.ts +34 -0
- package/dist/components/DatePicker/MonthGrid.d.ts.map +1 -0
- package/dist/components/DatePicker/MonthGrid.js +54 -0
- package/dist/components/DatePicker/MonthGrid.js.map +1 -0
- package/dist/components/DatePicker/Popover.d.ts +6 -0
- package/dist/components/DatePicker/Popover.d.ts.map +1 -0
- package/dist/components/DatePicker/Popover.js +72 -0
- package/dist/components/DatePicker/Popover.js.map +1 -0
- package/dist/components/DatePicker/Root.d.ts +46 -0
- package/dist/components/DatePicker/Root.d.ts.map +1 -0
- package/dist/components/DatePicker/Root.js +90 -0
- package/dist/components/DatePicker/Root.js.map +1 -0
- package/dist/components/DatePicker/Trigger.d.ts +6 -0
- package/dist/components/DatePicker/Trigger.d.ts.map +1 -0
- package/dist/components/DatePicker/Trigger.js +21 -0
- package/dist/components/DatePicker/Trigger.js.map +1 -0
- package/dist/components/DatePicker/YearGrid.d.ts +29 -0
- package/dist/components/DatePicker/YearGrid.d.ts.map +1 -0
- package/dist/components/DatePicker/YearGrid.js +53 -0
- package/dist/components/DatePicker/YearGrid.js.map +1 -0
- package/dist/components/DatePicker/index.d.ts +48 -0
- package/dist/components/DatePicker/index.d.ts.map +1 -0
- package/dist/components/DatePicker/index.js +42 -0
- package/dist/components/DatePicker/index.js.map +1 -0
- package/dist/components/DateTimePicker/Input.d.ts +12 -0
- package/dist/components/DateTimePicker/Input.d.ts.map +1 -0
- package/dist/components/DateTimePicker/Input.js +41 -0
- package/dist/components/DateTimePicker/Input.js.map +1 -0
- package/dist/components/DateTimePicker/Root.d.ts +60 -0
- package/dist/components/DateTimePicker/Root.d.ts.map +1 -0
- package/dist/components/DateTimePicker/Root.js +140 -0
- package/dist/components/DateTimePicker/Root.js.map +1 -0
- package/dist/components/DateTimePicker/index.d.ts +55 -0
- package/dist/components/DateTimePicker/index.d.ts.map +1 -0
- package/dist/components/DateTimePicker/index.js +55 -0
- package/dist/components/DateTimePicker/index.js.map +1 -0
- package/dist/components/RangePicker/Calendar.d.ts +24 -0
- package/dist/components/RangePicker/Calendar.d.ts.map +1 -0
- package/dist/components/RangePicker/Calendar.js +134 -0
- package/dist/components/RangePicker/Calendar.js.map +1 -0
- package/dist/components/RangePicker/Input.d.ts +14 -0
- package/dist/components/RangePicker/Input.d.ts.map +1 -0
- package/dist/components/RangePicker/Input.js +38 -0
- package/dist/components/RangePicker/Input.js.map +1 -0
- package/dist/components/RangePicker/Popover.d.ts +6 -0
- package/dist/components/RangePicker/Popover.d.ts.map +1 -0
- package/dist/components/RangePicker/Popover.js +71 -0
- package/dist/components/RangePicker/Popover.js.map +1 -0
- package/dist/components/RangePicker/Presets.d.ts +49 -0
- package/dist/components/RangePicker/Presets.d.ts.map +1 -0
- package/dist/components/RangePicker/Presets.js +117 -0
- package/dist/components/RangePicker/Presets.js.map +1 -0
- package/dist/components/RangePicker/Root.d.ts +40 -0
- package/dist/components/RangePicker/Root.d.ts.map +1 -0
- package/dist/components/RangePicker/Root.js +138 -0
- package/dist/components/RangePicker/Root.js.map +1 -0
- package/dist/components/RangePicker/index.d.ts +48 -0
- package/dist/components/RangePicker/index.d.ts.map +1 -0
- package/dist/components/RangePicker/index.js +43 -0
- package/dist/components/RangePicker/index.js.map +1 -0
- package/dist/components/TimePicker/AmPmToggle.d.ts +15 -0
- package/dist/components/TimePicker/AmPmToggle.d.ts.map +1 -0
- package/dist/components/TimePicker/AmPmToggle.js +29 -0
- package/dist/components/TimePicker/AmPmToggle.js.map +1 -0
- package/dist/components/TimePicker/HourList.d.ts +18 -0
- package/dist/components/TimePicker/HourList.d.ts.map +1 -0
- package/dist/components/TimePicker/HourList.js +71 -0
- package/dist/components/TimePicker/HourList.js.map +1 -0
- package/dist/components/TimePicker/Input.d.ts +9 -0
- package/dist/components/TimePicker/Input.d.ts.map +1 -0
- package/dist/components/TimePicker/Input.js +37 -0
- package/dist/components/TimePicker/Input.js.map +1 -0
- package/dist/components/TimePicker/MinuteList.d.ts +15 -0
- package/dist/components/TimePicker/MinuteList.d.ts.map +1 -0
- package/dist/components/TimePicker/MinuteList.js +62 -0
- package/dist/components/TimePicker/MinuteList.js.map +1 -0
- package/dist/components/TimePicker/Root.d.ts +38 -0
- package/dist/components/TimePicker/Root.d.ts.map +1 -0
- package/dist/components/TimePicker/Root.js +40 -0
- package/dist/components/TimePicker/Root.js.map +1 -0
- package/dist/components/TimePicker/index.d.ts +32 -0
- package/dist/components/TimePicker/index.d.ts.map +1 -0
- package/dist/components/TimePicker/index.js +27 -0
- package/dist/components/TimePicker/index.js.map +1 -0
- package/dist/context/DatePickerContext.d.ts +49 -0
- package/dist/context/DatePickerContext.d.ts.map +1 -0
- package/dist/context/DatePickerContext.js +18 -0
- package/dist/context/DatePickerContext.js.map +1 -0
- package/dist/context/RangePickerContext.d.ts +53 -0
- package/dist/context/RangePickerContext.d.ts.map +1 -0
- package/dist/context/RangePickerContext.js +18 -0
- package/dist/context/RangePickerContext.js.map +1 -0
- package/dist/context/TimePickerContext.d.ts +29 -0
- package/dist/context/TimePickerContext.d.ts.map +1 -0
- package/dist/context/TimePickerContext.js +18 -0
- package/dist/context/TimePickerContext.js.map +1 -0
- package/dist/hooks/useDatePicker.d.ts +63 -0
- package/dist/hooks/useDatePicker.d.ts.map +1 -0
- package/dist/hooks/useDatePicker.js +82 -0
- package/dist/hooks/useDatePicker.js.map +1 -0
- package/dist/hooks/useRangePicker.d.ts +67 -0
- package/dist/hooks/useRangePicker.d.ts.map +1 -0
- package/dist/hooks/useRangePicker.js +116 -0
- package/dist/hooks/useRangePicker.js.map +1 -0
- package/dist/hooks/useTimePicker.d.ts +63 -0
- package/dist/hooks/useTimePicker.d.ts.map +1 -0
- package/dist/hooks/useTimePicker.js +69 -0
- package/dist/hooks/useTimePicker.js.map +1 -0
- package/dist/index.cjs +2150 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +744 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/context/DatePickerContext.ts","../src/components/DatePicker/Root.tsx","../src/components/DatePicker/Input.tsx","../src/components/DatePicker/Trigger.tsx","../src/components/DatePicker/Popover.tsx","../src/components/DatePicker/Calendar.tsx","../src/components/DatePicker/MonthGrid.tsx","../src/components/DatePicker/YearGrid.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/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/hooks/useDatePicker.ts","../src/hooks/useRangePicker.ts","../src/hooks/useTimePicker.ts"],"names":["createContext","useContext","DateFnsAdapter","useId","useRef","useState","useCallback","useMemo","forwardRef","DatePickerInput","parseInputValue","jsx","DatePickerTrigger","useFloating","offset","flip","shift","autoUpdate","useEffect","getWeekdayNames","getCalendarDays","formatMonthYear","formatFullDate","isDateDisabled","jsxs","getMonthName","RangePickerInput","srOnly","getTime","setTimeOnIso","TimePickerInput","formatTimeString","parseTimeString","generateHours","to12Hour","to24Hour","generateMinutes","getDefaultIso","DateTimePickerInput","EMPTY_RANGE"],"mappings":"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","file":"index.cjs","sourcesContent":["import { createContext, useContext } from 'react';\nimport type { MutableRefObject } from 'react';\nimport type { DateAdapter, DisabledRule, ISODateString, WeekStartsOn } from '@kalyx/core';\n\nexport interface DatePickerContextValue {\n /** Floating UI reference 요소 (Input/Trigger가 설정, Popover가 읽음) */\n referenceRef: MutableRefObject<HTMLElement | null>;\n /** 현재 선택된 날짜 (ISO 8601 UTC) */\n value: ISODateString | null;\n /** 날짜 선택 핸들러 */\n selectDate: (iso: ISODateString | null) => void;\n /** 팝오버 열림 상태 */\n isOpen: boolean;\n /** 팝오버 열기 */\n open: () => void;\n /** 팝오버 닫기 */\n close: () => void;\n /** 팝오버 토글 */\n toggle: () => void;\n /** 현재 표시 중인 월 (ISO string) */\n viewMonth: ISODateString;\n /** 표시 월 변경 */\n setViewMonth: (iso: ISODateString) => void;\n /** 캘린더에서 포커스된 날짜 */\n focusedDate: ISODateString;\n /** 포커스 날짜 변경 */\n setFocusedDate: (iso: ISODateString) => void;\n /** 날짜 어댑터 */\n adapter: DateAdapter;\n /** 비활성화 규칙 */\n disabled: DisabledRule[];\n /** 주 시작 요일 */\n weekStartsOn: WeekStartsOn;\n /** 날짜 표시 포맷 */\n displayFormat: string;\n /** BCP 47 locale (예: \"en-US\", \"ko-KR\") */\n locale: string;\n /** 전체 비활성화 */\n isDisabled: boolean;\n /** 읽기 전용 */\n isReadOnly: boolean;\n /** 고유 ID (useId 기반) */\n pickerId: string;\n}\n\nexport const DatePickerContext = createContext<DatePickerContextValue | null>(null);\n\n/**\n * DatePickerContext를 소비한다.\n * 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 { useCallback, useId, useMemo, useRef, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { DateFnsAdapter } from '@kalyx/core';\nimport type { DateAdapter, DisabledRule, ISODateString, WeekStartsOn } from '@kalyx/core';\nimport { DatePickerContext } from '../../context/DatePickerContext.js';\nimport type { DatePickerContextValue } from '../../context/DatePickerContext.js';\n\n/**\n * DatePicker의 Root 컴포넌트 props.\n *\n * @example 제어 모드\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 비제어 모드\n * ```tsx\n * <DatePicker defaultValue=\"2026-01-15T00:00:00.000Z\">\n * <DatePicker.Input />\n * </DatePicker>\n * ```\n */\nexport interface DatePickerRootProps {\n /** 선택된 날짜 (제어 모드, ISO 8601 UTC). `null`이면 빈 상태. */\n value?: ISODateString | null;\n /** 초기 날짜 (비제어 모드) */\n defaultValue?: ISODateString;\n /** 날짜 변경 콜백 */\n onChange?: (value: ISODateString | null) => void;\n /** 비활성화 규칙 */\n disabled?: DisabledRule[] | boolean;\n /** 읽기 전용 */\n readOnly?: boolean;\n /** 주 시작 요일 */\n weekStartsOn?: WeekStartsOn;\n /** 날짜 표시 포맷 */\n displayFormat?: string;\n /** BCP 47 locale (예: \"en-US\", \"ko-KR\", \"ja-JP\") */\n locale?: string;\n /** 날짜 어댑터 */\n adapter?: DateAdapter;\n /** 자식 컴포넌트 */\n children: ReactNode;\n}\n\nexport function DatePickerRoot({\n value: controlledValue,\n defaultValue,\n onChange,\n disabled = false,\n readOnly = false,\n weekStartsOn = 0,\n displayFormat = 'yyyy-MM-dd',\n locale = 'en-US',\n adapter = DateFnsAdapter,\n children,\n}: DatePickerRootProps) {\n const pickerId = useId();\n const isControlled = useRef(controlledValue !== undefined).current;\n const referenceRef = useRef<HTMLElement | null>(null);\n\n // 비제어 모드의 내부 상태\n const [uncontrolledValue, setUncontrolledValue] = useState<ISODateString | null>(\n defaultValue ?? null,\n );\n\n const currentValue = isControlled ? (controlledValue ?? null) : uncontrolledValue;\n\n // 팝오버 상태\n const [isOpen, setIsOpen] = useState(false);\n\n // 뷰 월 (캘린더에서 현재 보고 있는 달)\n const [viewMonth, setViewMonth] = useState<ISODateString>(\n currentValue ?? adapter.today(),\n );\n\n // 포커스된 날짜\n const [focusedDate, setFocusedDate] = useState<ISODateString>(\n currentValue ?? adapter.today(),\n );\n\n const isDisabled = typeof disabled === 'boolean' ? disabled : false;\n const disabledRules: DisabledRule[] = Array.isArray(disabled) ? disabled : [];\n\n const selectDate = useCallback(\n (iso: ISODateString | null) => {\n if (isDisabled || readOnly) return;\n\n if (!isControlled) {\n setUncontrolledValue(iso);\n }\n onChange?.(iso);\n\n // 날짜 선택 후 팝오버 닫기\n setIsOpen(false);\n },\n [isControlled, isDisabled, readOnly, onChange],\n );\n\n const open = useCallback(() => {\n if (isDisabled || readOnly) return;\n setIsOpen(true);\n // 팝오버 열 때 현재 값 또는 오늘로 뷰 초기화\n const target = currentValue ?? adapter.today();\n setViewMonth(target);\n setFocusedDate(target);\n }, [isDisabled, readOnly, currentValue, adapter]);\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 isDisabled,\n isReadOnly: readOnly,\n pickerId,\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 isDisabled,\n readOnly,\n pickerId,\n ],\n );\n\n return (\n <DatePickerContext.Provider value={contextValue}>\n {children}\n </DatePickerContext.Provider>\n );\n}\n","import { forwardRef, useCallback, useState } from 'react';\nimport type { InputHTMLAttributes } from 'react';\nimport { parseInputValue } from '@kalyx/core';\nimport { useDatePickerContext } from '../../context/DatePickerContext.js';\n\nexport interface DatePickerInputProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange' | 'type'> {\n /** 날짜 표시 포맷 (기본: 부모의 displayFormat) */\n format?: string;\n}\n\nexport const DatePickerInput = forwardRef<HTMLInputElement, DatePickerInputProps>(\n function DatePickerInput({ format: formatProp, onFocus, onBlur, onKeyDown, ...props }, ref) {\n const ctx = useDatePickerContext('DatePicker.Input');\n const displayFormat = formatProp ?? ctx.displayFormat;\n\n // 입력 중인 텍스트 (편집 모드)\n const [inputText, setInputText] = useState<string | null>(null);\n\n const displayValue =\n inputText !== null\n ? inputText\n : ctx.value\n ? ctx.adapter.format(ctx.value, displayFormat)\n : '';\n\n const handleFocus = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n ctx.open();\n onFocus?.(e);\n },\n [ctx, onFocus],\n );\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n if (inputText !== null) {\n const parsed = parseInputValue(inputText, displayFormat, ctx.adapter);\n if (parsed) {\n ctx.selectDate(parsed);\n }\n setInputText(null);\n }\n onBlur?.(e);\n },\n [inputText, displayFormat, ctx, onBlur],\n );\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const text = e.target.value;\n setInputText(text);\n\n if (!text) {\n ctx.selectDate(null);\n setInputText(null);\n return;\n }\n\n const parsed = parseInputValue(text, displayFormat, ctx.adapter);\n if (parsed) {\n ctx.selectDate(parsed);\n setInputText(null);\n }\n },\n [displayFormat, ctx],\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 if (inputText !== null) {\n const parsed = parseInputValue(inputText, displayFormat, ctx.adapter);\n if (parsed) {\n ctx.selectDate(parsed);\n setInputText(null);\n }\n }\n } else if (e.key === 'ArrowDown' && !ctx.isOpen) {\n e.preventDefault();\n ctx.open();\n }\n onKeyDown?.(e);\n },\n [ctx, inputText, displayFormat, onKeyDown],\n );\n\n const calendarId = `${ctx.pickerId}-calendar`;\n\n return (\n <input\n ref={(node) => {\n // Floating UI reference 등록\n ctx.referenceRef.current = node;\n // forwardRef 전달\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 onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n {...props}\n />\n );\n },\n);\n","import { forwardRef, useCallback } from 'react';\nimport type { ButtonHTMLAttributes, ReactNode } from 'react';\nimport { useDatePickerContext } from '../../context/DatePickerContext.js';\n\nexport interface DatePickerTriggerProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'type'> {\n children?: ReactNode;\n}\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 // Input이 없으면 Trigger가 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 ? '캘린더 닫기' : '캘린더 열기'}\n aria-expanded={ctx.isOpen}\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","import { useEffect, useRef } from 'react';\nimport type { HTMLAttributes, ReactNode } from 'react';\nimport {\n useFloating,\n autoUpdate,\n offset,\n flip,\n shift,\n} from '@floating-ui/react';\nimport { useDatePickerContext } from '../../context/DatePickerContext.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 const floatingRef = useRef<HTMLDivElement | null>(null);\n\n const { refs, floatingStyles } = useFloating({\n open: ctx.isOpen,\n placement: 'bottom-start',\n middleware: [offset(4), flip(), shift({ padding: 8 })],\n whileElementsMounted: autoUpdate,\n });\n\n // Context의 referenceRef를 Floating UI에 연결\n useEffect(() => {\n if (ctx.referenceRef.current) {\n refs.setReference(ctx.referenceRef.current);\n }\n }, [ctx.referenceRef, refs, ctx.isOpen]);\n\n // 포커스 복원: 닫힐 때 이전 포커스 요소로 복원\n const previousFocusRef = useRef<HTMLElement | null>(null);\n\n useEffect(() => {\n if (ctx.isOpen) {\n previousFocusRef.current = document.activeElement as HTMLElement;\n } else if (previousFocusRef.current) {\n previousFocusRef.current.focus();\n previousFocusRef.current = null;\n }\n }, [ctx.isOpen]);\n\n // 바깥 클릭 감지\n useEffect(() => {\n if (!ctx.isOpen) return;\n\n function handleClickOutside(e: MouseEvent) {\n const floating = floatingRef.current;\n const reference = ctx.referenceRef.current;\n const target = e.target as Node;\n if (floating && !floating.contains(target) && (!reference || !reference.contains(target))) {\n ctx.close();\n }\n }\n\n // 다음 틱에 등록해서 현재 클릭 이벤트는 무시\n const timer = setTimeout(() => {\n document.addEventListener('mousedown', handleClickOutside);\n }, 0);\n\n return () => {\n clearTimeout(timer);\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [ctx.isOpen, ctx]);\n\n // Escape 키 처리\n useEffect(() => {\n if (!ctx.isOpen) return;\n\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n ctx.close();\n }\n }\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [ctx.isOpen, ctx]);\n\n if (!ctx.isOpen) return null;\n\n return (\n <div\n ref={(node) => {\n floatingRef.current = node;\n refs.setFloating(node);\n }}\n id={calendarId}\n role=\"dialog\"\n aria-label=\"날짜 선택\"\n aria-modal=\"false\"\n style={floatingStyles}\n {...props}\n >\n {children}\n </div>\n );\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport type { HTMLAttributes } from 'react';\nimport { getCalendarDays, isDateDisabled, getWeekdayNames, formatMonthYear, formatFullDate } 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}\n\nexport interface DatePickerCalendarProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role'> {\n classNames?: DatePickerCalendarClassNames;\n /** 타이틀(\"January 2026\") 클릭 시 콜백. Month/Year 뷰 전환에 사용. */\n onTitleClick?: () => void;\n}\n\n/** 스크린리더 전용 숨김 스타일 */\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({ classNames, onTitleClick, ...props }: 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 } = ctx;\n const weekdays = getWeekdayNames(locale, weekStartsOn);\n\n const weeks = getCalendarDays(viewMonth, adapter, {\n weekStartsOn,\n selected: ctx.value,\n focusedDate,\n disabled,\n });\n\n const year = adapter.getYear(viewMonth);\n const month = adapter.getMonth(viewMonth);\n const title = formatMonthYear(year, month, locale);\n\n // 포커스된 날짜 셀에 포커스 이동\n useEffect(() => {\n if (!ctx.isOpen || !gridRef.current) return;\n const focusedButton = gridRef.current.querySelector<HTMLButtonElement>(\n '[data-focused=\"true\"]',\n );\n focusedButton?.focus();\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(formatFullDate(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는 23:59:59 반환하므로 startOfDay로 정규화\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 ctx.setFocusedDate(newFocused);\n\n // 포커스가 현재 뷰 월을 벗어나면 뷰도 업데이트\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 {/* 헤더: 이전/다음 월 네비게이션 */}\n <div className={classNames?.header}>\n <button\n type=\"button\"\n className={classNames?.navButton}\n onClick={() => navigateMonth(-1)}\n aria-label=\"이전 달\"\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=\"다음 달\"\n >\n >\n </button>\n </div>\n\n {/* 캘린더 그리드 */}\n <table\n ref={gridRef}\n role=\"grid\"\n aria-label={title}\n className={classNames?.grid}\n onKeyDown={handleKeyDown}\n >\n <thead>\n <tr role=\"row\">\n {weekdays.map((day) => (\n <th\n key={day.short}\n role=\"columnheader\"\n abbr={day.full}\n scope=\"col\"\n className={classNames?.weekdayHeader}\n >\n {day.short}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {weeks.map((week, weekIndex) => (\n <tr key={weekIndex} role=\"row\" className={classNames?.gridRow}>\n {week.map((day) => {\n const dayClasses = [\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-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={formatFullDate(day.isoString, locale)}\n >\n {day.dayNumber}\n </button>\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n\n {/* 스크린리더용 알림 */}\n <div role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" style={srOnly}>\n {announcement}\n </div>\n </div>\n );\n}\n","import { useCallback } from 'react';\nimport type { HTMLAttributes } from 'react';\nimport { getMonthName } from '@kalyx/core';\nimport { useDatePickerContext } from '../../context/DatePickerContext.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 /** 월 선택 시 콜백. 일반적으로 day 뷰로 전환한다. */\n onSelect?: () => void;\n /** 타이틀(년도) 클릭 시 콜백. Year 뷰로 전환할 때 사용. */\n onTitleClick?: () => void;\n}\n\n/**\n * DatePicker.MonthGrid — 12개월 그리드에서 월을 빠르게 선택.\n * Calendar 타이틀 클릭 → MonthGrid 표시 → 월 클릭 → 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 } = ctx;\n\n const currentYear = adapter.getYear(viewMonth);\n const currentMonth = adapter.getMonth(viewMonth);\n const todayMonth = adapter.getMonth(adapter.today());\n const todayYear = adapter.getYear(adapter.today());\n\n const navigateYear = useCallback(\n (direction: number) => {\n const newDate = adapter.addYears(viewMonth, direction);\n ctx.setViewMonth(newDate);\n },\n [adapter, viewMonth, ctx],\n );\n\n const handleMonthSelect = useCallback(\n (monthIndex: number) => {\n // 현재 년도 + 선택된 월의 1일로 viewMonth 설정\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 months = Array.from({ length: 12 }, (_, i) => ({\n index: i,\n name: getMonthName(i, locale),\n isSelected: i === currentMonth,\n isCurrent: i === todayMonth && currentYear === todayYear,\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=\"이전 년\"\n >\n <\n </button>\n {onTitleClick ? (\n <button\n type=\"button\"\n className={classNames?.title}\n onClick={onTitleClick}\n >\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=\"다음 년\"\n >\n >\n </button>\n </div>\n\n <div\n role=\"grid\"\n aria-label={`${currentYear} months`}\n className={classNames?.grid}\n style={{ display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)' }}\n >\n {months.map((m) => {\n const monthClass = [\n classNames?.month,\n m.isSelected && classNames?.monthSelected,\n m.isCurrent && classNames?.monthCurrent,\n ]\n .filter(Boolean)\n .join(' ') || undefined;\n\n return (\n <button\n key={m.index}\n type=\"button\"\n role=\"gridcell\"\n aria-selected={m.isSelected || undefined}\n aria-current={m.isCurrent ? 'date' : undefined}\n data-selected={m.isSelected || undefined}\n data-current={m.isCurrent || undefined}\n className={monthClass}\n onClick={() => handleMonthSelect(m.index)}\n >\n {m.name}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n","import { useCallback, useMemo } from 'react';\nimport type { HTMLAttributes } from 'react';\nimport { useDatePickerContext } from '../../context/DatePickerContext.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 /** 년 선택 시 콜백. 일반적으로 month 뷰로 전환한다. */\n onSelect?: () => void;\n}\n\n/**\n * DatePicker.YearGrid — 12년 단위 그리드에서 년도를 빠르게 선택.\n * MonthGrid 타이틀 클릭 → YearGrid 표시 → 년 클릭 → MonthGrid로 복귀.\n *\n * @example\n * ```tsx\n * {view === 'years' && (\n * <DatePicker.YearGrid onSelect={() => setView('months')} />\n * )}\n * ```\n */\nexport function DatePickerYearGrid({\n classNames,\n onSelect,\n ...props\n}: DatePickerYearGridProps) {\n const ctx = useDatePickerContext('DatePicker.YearGrid');\n const { adapter, viewMonth } = ctx;\n\n const currentYear = adapter.getYear(viewMonth);\n const todayYear = adapter.getYear(adapter.today());\n\n // 12년 단위 범위 (현재 년도를 포함하는 decade)\n const decadeStart = currentYear - (currentYear % 12);\n\n const navigateDecade = useCallback(\n (direction: number) => {\n const newDate = adapter.addYears(viewMonth, direction * 12);\n ctx.setViewMonth(newDate);\n },\n [adapter, viewMonth, ctx],\n );\n\n const handleYearSelect = useCallback(\n (year: number) => {\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],\n );\n\n const years = useMemo(\n () =>\n Array.from({ length: 12 }, (_, i) => {\n const year = decadeStart + i;\n return {\n value: year,\n isSelected: year === currentYear,\n isCurrent: year === todayYear,\n };\n }),\n [decadeStart, currentYear, todayYear],\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=\"이전 12년\"\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=\"다음 12년\"\n >\n >\n </button>\n </div>\n\n <div\n role=\"grid\"\n aria-label={rangeLabel}\n className={classNames?.grid}\n style={{ display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)' }}\n >\n {years.map((y) => {\n const yearClass = [\n classNames?.year,\n y.isSelected && classNames?.yearSelected,\n y.isCurrent && classNames?.yearCurrent,\n ]\n .filter(Boolean)\n .join(' ') || undefined;\n\n return (\n <button\n key={y.value}\n type=\"button\"\n role=\"gridcell\"\n aria-selected={y.isSelected || undefined}\n aria-current={y.isCurrent ? 'date' : undefined}\n data-selected={y.isSelected || undefined}\n data-current={y.isCurrent || undefined}\n className={yearClass}\n onClick={() => handleYearSelect(y.value)}\n >\n {y.value}\n </button>\n );\n })}\n </div>\n </div>\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';\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';\n\n/**\n * DatePicker — Headless, SSR-safe React DatePicker\n *\n * @example 기본\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 빠른 네비게이션\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});\n\nexport type {\n DatePickerRootProps,\n DatePickerInputProps,\n DatePickerTriggerProps,\n DatePickerPopoverProps,\n DatePickerCalendarProps,\n DatePickerCalendarClassNames,\n DatePickerMonthGridProps,\n DatePickerMonthGridClassNames,\n DatePickerYearGridProps,\n DatePickerYearGridClassNames,\n};\n","import { createContext, useContext } from 'react';\nimport type { MutableRefObject } from 'react';\nimport type {\n DateAdapter,\n DateRange,\n DisabledRule,\n ISODateString,\n WeekStartsOn,\n} from '@kalyx/core';\n\n/** 다음에 선택할 부분 (start | end) */\nexport type RangeSelectingTarget = 'start' | 'end';\n\nexport interface RangePickerContextValue {\n /** Floating UI reference 요소 */\n referenceRef: MutableRefObject<HTMLElement | null>;\n /** 현재 선택된 범위 */\n value: DateRange;\n /** 범위 변경 (Range 객체 전체 갱신) */\n setRange: (range: DateRange) => void;\n /** 단일 날짜 클릭 → 자동으로 start/end 결정 */\n selectDate: (iso: ISODateString) => void;\n /** 다음에 선택될 부분 (start 먼저 → end 다음) */\n selectingTarget: RangeSelectingTarget;\n /** hover 중인 날짜 (범위 미리보기용) */\n hoverDate: ISODateString | null;\n setHoverDate: (iso: ISODateString | null) => void;\n /** 팝오버 열림 상태 */\n isOpen: boolean;\n open: () => void;\n close: () => void;\n toggle: () => void;\n /** 현재 표시 중인 월 */\n viewMonth: ISODateString;\n setViewMonth: (iso: ISODateString) => void;\n /** 캘린더에서 포커스된 날짜 */\n focusedDate: ISODateString;\n setFocusedDate: (iso: ISODateString) => void;\n /** 날짜 어댑터 */\n adapter: DateAdapter;\n /** 비활성화 규칙 */\n disabled: DisabledRule[];\n /** 주 시작 요일 */\n weekStartsOn: WeekStartsOn;\n /** 날짜 표시 포맷 */\n displayFormat: string;\n /** BCP 47 locale */\n locale: string;\n /** 전체 비활성화 */\n isDisabled: boolean;\n /** 읽기 전용 */\n isReadOnly: boolean;\n /** 고유 ID */\n pickerId: string;\n}\n\nexport const RangePickerContext = createContext<RangePickerContextValue | null>(null);\n\n/**\n * RangePickerContext를 소비한다.\n * 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 { ReactNode } from 'react';\nimport { DateFnsAdapter } from '@kalyx/core';\nimport type {\n DateAdapter,\n DateRange,\n DisabledRule,\n ISODateString,\n WeekStartsOn,\n} from '@kalyx/core';\nimport { RangePickerContext } from '../../context/RangePickerContext.js';\nimport type {\n RangePickerContextValue,\n RangeSelectingTarget,\n} from '../../context/RangePickerContext.js';\n\nconst EMPTY_RANGE: DateRange = { start: null, end: null };\n\n/**\n * RangePicker의 Root 컴포넌트 props.\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 /** 선택된 범위 (제어 모드). `{ start, end }` 형태의 ISO string 또는 null. */\n value?: DateRange;\n /** 초기 범위 (비제어 모드) */\n defaultValue?: DateRange;\n /** 범위 변경 콜백 */\n onChange?: (range: DateRange) => void;\n /** 비활성화 규칙 */\n disabled?: DisabledRule[] | boolean;\n /** 읽기 전용 */\n readOnly?: boolean;\n /** 주 시작 요일 */\n weekStartsOn?: WeekStartsOn;\n /** 날짜 표시 포맷 */\n displayFormat?: string;\n /** BCP 47 locale */\n locale?: string;\n /** 날짜 어댑터 */\n adapter?: DateAdapter;\n /** 자식 컴포넌트 */\n children: ReactNode;\n}\n\nexport function RangePickerRoot({\n value: controlledValue,\n defaultValue,\n onChange,\n disabled = false,\n readOnly = false,\n weekStartsOn = 0,\n displayFormat = 'yyyy-MM-dd',\n locale = 'en-US',\n adapter = DateFnsAdapter,\n children,\n}: RangePickerRootProps) {\n const pickerId = useId();\n const isControlled = useRef(controlledValue !== undefined).current;\n const referenceRef = useRef<HTMLElement | null>(null);\n\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\n // 다음에 어디를 선택할지 (start 먼저, 이후 end)\n const [selectingTarget, setSelectingTarget] = useState<RangeSelectingTarget>('start');\n\n // hover 상태\n const [hoverDate, setHoverDate] = useState<ISODateString | null>(null);\n\n // 뷰 월\n const [viewMonth, setViewMonth] = useState<ISODateString>(\n currentValue.start ?? adapter.today(),\n );\n\n // 포커스된 날짜\n const [focusedDate, setFocusedDate] = useState<ISODateString>(\n currentValue.start ?? adapter.today(),\n );\n\n const isDisabled = typeof disabled === 'boolean' ? disabled : false;\n const disabledRules: DisabledRule[] = Array.isArray(disabled) ? disabled : [];\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 * 단일 날짜 클릭 핸들러.\n * - selectingTarget === 'start' → start 선택, target = 'end'\n * - selectingTarget === 'end' → end 선택 (start보다 이전이면 swap), target = 'start', 닫기\n */\n const selectDate = useCallback(\n (iso: ISODateString) => {\n if (isDisabled || readOnly) return;\n\n if (selectingTarget === 'start') {\n const newRange: DateRange = { start: iso, end: null };\n setRange(newRange);\n setSelectingTarget('end');\n setHoverDate(null);\n } else {\n // end 선택\n const start = currentValue.start;\n if (!start) {\n // 안전장치: start가 없으면 start로 처리\n setRange({ start: iso, end: null });\n setSelectingTarget('end');\n return;\n }\n\n let newRange: DateRange;\n if (adapter.isBefore(iso, start)) {\n // end가 start보다 이전이면 swap\n newRange = { start: iso, end: start };\n } else {\n newRange = { start, end: iso };\n }\n\n setRange(newRange);\n setSelectingTarget('start');\n setHoverDate(null);\n setIsOpen(false);\n }\n },\n [isDisabled, readOnly, selectingTarget, currentValue.start, adapter, setRange],\n );\n\n const open = useCallback(() => {\n if (isDisabled || readOnly) return;\n setIsOpen(true);\n const target = currentValue.start ?? adapter.today();\n setViewMonth(target);\n setFocusedDate(target);\n // 범위가 완전하면 새로 시작, 아니면 현재 상태 유지\n if (currentValue.start && currentValue.end) {\n setSelectingTarget('start');\n }\n }, [isDisabled, readOnly, currentValue, adapter]);\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 isDisabled,\n isReadOnly: readOnly,\n pickerId,\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 isDisabled,\n readOnly,\n pickerId,\n ],\n );\n\n return (\n <RangePickerContext.Provider value={contextValue}>\n {children}\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\n extends Omit<InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange' | 'type'> {\n /** 어떤 부분의 입력인지 (start | end) */\n part: RangeInputPart;\n /** 날짜 표시 포맷 (기본: 부모의 displayFormat) */\n format?: string;\n}\n\n/**\n * RangePicker.Input — 시작일/종료일을 위한 별도 input.\n * `part=\"start\"`와 `part=\"end\"` 두 개를 함께 사용한다.\n */\nexport const RangePickerInput = forwardRef<HTMLInputElement, RangePickerInputProps>(\n function RangePickerInput({ part, format: formatProp, onFocus, onKeyDown, ...props }, ref) {\n const ctx = useRangePickerContext('RangePicker.Input');\n const displayFormat = formatProp ?? ctx.displayFormat;\n\n const value = ctx.value[part];\n const displayValue = value ? ctx.adapter.format(value, displayFormat) : '';\n\n const handleFocus = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n ctx.open();\n onFocus?.(e);\n },\n [ctx, onFocus],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Escape') {\n ctx.close();\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 // 첫 번째 Input(start)을 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' ? '시작일' : '종료일'}\n autoComplete=\"off\"\n value={displayValue}\n disabled={ctx.isDisabled || props.disabled}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n data-part={part}\n {...props}\n />\n );\n },\n);\n","import { useEffect, useRef } from 'react';\nimport type { HTMLAttributes, ReactNode } from 'react';\nimport {\n useFloating,\n autoUpdate,\n offset,\n flip,\n shift,\n} from '@floating-ui/react';\nimport { useRangePickerContext } from '../../context/RangePickerContext.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 const floatingRef = useRef<HTMLDivElement | null>(null);\n\n const { refs, floatingStyles } = useFloating({\n open: ctx.isOpen,\n placement: 'bottom-start',\n middleware: [offset(4), flip(), shift({ padding: 8 })],\n whileElementsMounted: autoUpdate,\n });\n\n // Context의 referenceRef를 Floating UI에 연결\n useEffect(() => {\n if (ctx.referenceRef.current) {\n refs.setReference(ctx.referenceRef.current);\n }\n }, [ctx.referenceRef, refs, ctx.isOpen]);\n\n // 포커스 복원\n const previousFocusRef = useRef<HTMLElement | null>(null);\n\n useEffect(() => {\n if (ctx.isOpen) {\n previousFocusRef.current = document.activeElement as HTMLElement;\n } else if (previousFocusRef.current) {\n previousFocusRef.current.focus();\n previousFocusRef.current = null;\n }\n }, [ctx.isOpen]);\n\n // 바깥 클릭 감지\n useEffect(() => {\n if (!ctx.isOpen) return;\n\n function handleClickOutside(e: MouseEvent) {\n const floating = floatingRef.current;\n const reference = ctx.referenceRef.current;\n const target = e.target as Node;\n if (floating && !floating.contains(target) && (!reference || !reference.contains(target))) {\n ctx.close();\n }\n }\n\n const timer = setTimeout(() => {\n document.addEventListener('mousedown', handleClickOutside);\n }, 0);\n\n return () => {\n clearTimeout(timer);\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [ctx.isOpen, ctx]);\n\n // Escape 키\n useEffect(() => {\n if (!ctx.isOpen) return;\n\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n ctx.close();\n }\n }\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [ctx.isOpen, ctx]);\n\n if (!ctx.isOpen) return null;\n\n return (\n <div\n ref={(node) => {\n floatingRef.current = node;\n refs.setFloating(node);\n }}\n id={calendarId}\n role=\"dialog\"\n aria-label=\"날짜 범위 선택\"\n aria-modal=\"false\"\n style={floatingStyles}\n {...props}\n >\n {children}\n </div>\n );\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport type { HTMLAttributes } from 'react';\nimport { getCalendarDays, isDateDisabled, getWeekdayNames, formatMonthYear, formatFullDate } from '@kalyx/core';\nimport type { CalendarDay } 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}\n\nexport interface RangePickerCalendarProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role'> {\n classNames?: RangePickerCalendarClassNames;\n}\n\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 RangePickerCalendar({ classNames, ...props }: RangePickerCalendarProps) {\n const ctx = useRangePickerContext('RangePicker.Calendar');\n const gridRef = useRef<HTMLTableElement>(null);\n const [announcement, setAnnouncement] = useState('');\n\n const {\n adapter,\n viewMonth,\n focusedDate,\n weekStartsOn,\n disabled,\n value,\n hoverDate,\n selectingTarget,\n } = ctx;\n\n const { locale } = ctx;\n const weekdays = getWeekdayNames(locale, weekStartsOn);\n\n const weeks = getCalendarDays(viewMonth, adapter, {\n weekStartsOn,\n focusedDate,\n disabled,\n range: value,\n rangeHover: hoverDate,\n });\n\n const year = adapter.getYear(viewMonth);\n const month = adapter.getMonth(viewMonth);\n const title = formatMonthYear(year, month, locale);\n\n // 포커스된 날짜 셀에 포커스 이동\n useEffect(() => {\n if (!ctx.isOpen || !gridRef.current) return;\n const focusedButton = gridRef.current.querySelector<HTMLButtonElement>(\n '[data-focused=\"true\"]',\n );\n focusedButton?.focus();\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(formatFullDate(day.isoString, locale));\n },\n [ctx, locale],\n );\n\n const handleDayMouseEnter = useCallback(\n (day: CalendarDay) => {\n if (selectingTarget === 'end' && value.start && !day.isDisabled) {\n ctx.setHoverDate(day.isoString);\n }\n },\n [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 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 ctx.setFocusedDate(newFocused);\n\n if (!adapter.isSameMonth(newFocused, viewMonth)) {\n ctx.setViewMonth(newFocused);\n }\n\n // 키보드로 이동 중에도 hover 미리보기를 유지\n if (selectingTarget === 'end' && value.start) {\n ctx.setHoverDate(newFocused);\n }\n }\n },\n [adapter, focusedDate, viewMonth, weekStartsOn, disabled, ctx, selectingTarget, value.start],\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=\"이전 달\"\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=\"다음 달\"\n >\n >\n </button>\n </div>\n\n <table\n ref={gridRef}\n role=\"grid\"\n aria-label={title}\n aria-multiselectable=\"true\"\n className={classNames?.grid}\n onKeyDown={handleKeyDown}\n >\n <thead>\n <tr role=\"row\">\n {weekdays.map((day) => (\n <th\n key={day.short}\n role=\"columnheader\"\n abbr={day.full}\n scope=\"col\"\n className={classNames?.weekdayHeader}\n >\n {day.short}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {weeks.map((week, weekIndex) => (\n <tr key={weekIndex} role=\"row\" className={classNames?.gridRow}>\n {week.map((day) => {\n const dayClasses = [\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 = day.isRangeStart || day.isRangeEnd;\n\n return (\n <td\n key={day.isoString}\n role=\"gridcell\"\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={formatFullDate(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 { useCallback } from 'react';\nimport type { HTMLAttributes, ReactNode } from 'react';\nimport type { DateRange, ISODateString } from '@kalyx/core';\nimport { useRangePickerContext } from '../../context/RangePickerContext.js';\n\n/** 미리 정의된 프리셋 키. 커스텀 범위도 가능. */\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 — 프리셋 버튼들을 감싸는 컨테이너.\n * 내부에 `RangePicker.Preset` 버튼들을 배치한다.\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 return (\n <div role=\"group\" aria-label=\"날짜 범위 프리셋\" className={classNames?.root} {...props}>\n {children}\n </div>\n );\n}\n\nexport interface RangePickerPresetProps\n extends Omit<HTMLAttributes<HTMLButtonElement>, 'value'> {\n /** 미리 정의된 프리셋 키 또는 직접 range 전달 시 생략 */\n value?: PresetKey;\n /** 직접 범위를 지정할 때 사용 (value 대신) */\n range?: DateRange;\n children: ReactNode;\n className?: string;\n}\n\n/**\n * 미리 정의된 프리셋 키를 실제 DateRange로 변환한다.\n */\nfunction resolvePreset(key: PresetKey, today: ISODateString, adapter: { addDays: (iso: string, n: number) => string; addMonths: (iso: string, n: number) => string; addYears: (iso: string, n: number) => string; startOfMonth: (iso: string) => string; endOfMonth: (iso: string) => string; startOfWeek: (iso: string, weekStartsOn?: 0 | 1) => string; endOfWeek: (iso: string, weekStartsOn?: 0 | 1) => string; startOfDay: (iso: string) => string }): 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 const yearStart = adapter.startOfMonth(\n adapter.addMonths(today, -(new Date(today).getUTCMonth())),\n );\n return { start: yearStart, end: today };\n }\n }\n}\n\n/**\n * RangePicker.Preset — 한 클릭으로 날짜 범위를 선택하는 프리셋 버튼.\n *\n * `value` (프리셋 키) 또는 `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 const handleClick = useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n if (ctx.isDisabled || ctx.isReadOnly) return;\n\n let resolved: DateRange;\n if (directRange) {\n resolved = directRange;\n } else if (presetKey) {\n resolved = resolvePreset(presetKey, ctx.adapter.today(), ctx.adapter);\n } else {\n return;\n }\n\n ctx.setRange(resolved);\n ctx.close();\n onClick?.(e);\n },\n [ctx, presetKey, directRange, onClick],\n );\n\n // 현재 선택된 범위와 프리셋이 일치하는지 확인\n const isActive = (() => {\n if (!ctx.value.start || !ctx.value.end) return false;\n let target: DateRange;\n if (directRange) {\n target = directRange;\n } else if (presetKey) {\n target = resolvePreset(presetKey, ctx.adapter.today(), ctx.adapter);\n } else {\n return false;\n }\n return (\n target.start !== null &&\n target.end !== null &&\n ctx.adapter.isSameDay(ctx.value.start, target.start) &&\n ctx.adapter.isSameDay(ctx.value.end, target.end)\n );\n })();\n\n return (\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={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 {\n RangePickerCalendarProps,\n RangePickerCalendarClassNames,\n} from './Calendar.js';\nimport type {\n RangePickerPresetsProps,\n RangePickerPresetsClassNames,\n RangePickerPresetProps,\n PresetKey,\n} from './Presets.js';\n\n/**\n * RangePicker — Headless 날짜 범위 선택 컴포넌트\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 *\n * @example Presets (대시보드)\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, TimeValue } from '@kalyx/core';\n\nexport type TimePickerFormat = '12h' | '24h';\n\nexport interface TimePickerContextValue {\n /** 현재 선택된 ISO datetime (시간 부분만 의미 있음) */\n value: ISODateString | null;\n /** 시간 변경 (TimeValue 부분만 갱신) */\n setTime: (partial: Partial<TimeValue>) => void;\n /** 12/24시간제 모드 */\n format: TimePickerFormat;\n /** 분 step (예: 15면 0,15,30,45) */\n step: number;\n /** 초 표시 여부 */\n withSeconds: boolean;\n /** 전체 비활성화 */\n isDisabled: boolean;\n /** 읽기 전용 */\n isReadOnly: boolean;\n /** 현재 시간 (TimeValue) */\n currentTime: TimeValue;\n /** 고유 ID */\n pickerId: string;\n}\n\nexport const TimePickerContext = createContext<TimePickerContextValue | null>(null);\n\n/**\n * TimePickerContext를 소비한다.\n * 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 { getTime, setTime as setTimeOnIso } from '@kalyx/core';\nimport type { ISODateString, TimeValue } from '@kalyx/core';\nimport { TimePickerContext } from '../../context/TimePickerContext.js';\nimport type {\n TimePickerContextValue,\n TimePickerFormat,\n} from '../../context/TimePickerContext.js';\n\n/**\n * TimePicker의 Root 컴포넌트 props.\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 /** 선택된 시간 (제어 모드, ISO 8601 UTC). 날짜 부분은 무시되고 시간만 사용. */\n value?: ISODateString | null;\n /** 초기 시간 (비제어 모드) */\n defaultValue?: ISODateString;\n /** 시간 변경 콜백 */\n onChange?: (value: ISODateString | null) => void;\n /** 12시간제 또는 24시간제 */\n format?: TimePickerFormat;\n /** 분 step (1, 5, 10, 15, 30 등) */\n step?: number;\n /** 초 표시 여부 */\n withSeconds?: boolean;\n /** 전체 비활성화 */\n disabled?: boolean;\n /** 읽기 전용 */\n readOnly?: boolean;\n /** 자식 컴포넌트 */\n children: ReactNode;\n}\n\n/** value가 null일 때 사용할 기본 ISO (오늘 00:00:00 UTC) */\nfunction getDefaultIso(): ISODateString {\n const now = new Date();\n return new Date(\n Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()),\n ).toISOString();\n}\n\nexport function TimePickerRoot({\n value: controlledValue,\n defaultValue,\n onChange,\n format = '24h',\n step = 1,\n withSeconds = false,\n disabled = false,\n readOnly = false,\n children,\n}: TimePickerRootProps) {\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 // value가 null이어도 시간 선택은 가능해야 함 → fallback\n const baseIso = currentValue ?? getDefaultIso();\n const currentTime = useMemo(() => getTime(baseIso), [baseIso]);\n\n const setTime = useCallback(\n (partial: Partial<TimeValue>) => {\n if (disabled || readOnly) return;\n const newIso = setTimeOnIso(baseIso, partial);\n if (!isControlled) {\n setUncontrolledValue(newIso);\n }\n onChange?.(newIso);\n },\n [disabled, readOnly, baseIso, isControlled, onChange],\n );\n\n const contextValue: TimePickerContextValue = useMemo(\n () => ({\n value: currentValue,\n setTime,\n format,\n step,\n withSeconds,\n isDisabled: disabled,\n isReadOnly: readOnly,\n currentTime,\n pickerId,\n }),\n [currentValue, setTime, format, step, withSeconds, disabled, readOnly, currentTime, pickerId],\n );\n\n return (\n <TimePickerContext.Provider value={contextValue}>\n {children}\n </TimePickerContext.Provider>\n );\n}\n","import { forwardRef, useCallback, useState } from 'react';\nimport type { InputHTMLAttributes } from 'react';\nimport { formatTimeString, parseTimeString } from '@kalyx/core';\nimport { useTimePickerContext } from '../../context/TimePickerContext.js';\n\nexport interface TimePickerInputProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange' | 'type'> {}\n\n/**\n * TimePicker.Input — HH:MM 또는 HH:MM:SS 형식의 텍스트 입력.\n * 사용자가 직접 타이핑할 수 있다.\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 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(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setInputText(e.target.value);\n },\n [],\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=\"시간 입력\"\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","import { useCallback, useRef } from 'react';\nimport type { HTMLAttributes, KeyboardEvent } from 'react';\nimport { generateHours, to12Hour, to24Hour } from '@kalyx/core';\nimport { useTimePickerContext } from '../../context/TimePickerContext.js';\n\nexport interface TimePickerHourListClassNames {\n root?: string;\n option?: string;\n optionSelected?: string;\n}\n\nexport interface TimePickerHourListProps\n extends Omit<HTMLAttributes<HTMLUListElement>, 'role' | 'children'> {\n classNames?: TimePickerHourListClassNames;\n}\n\n/**\n * TimePicker.HourList — `role=\"listbox\"` 패턴의 시간 선택 리스트.\n * 12h/24h 모드에 따라 다르게 렌더링.\n *\n * ARIA 표준 listbox: <li role=\"option\">이 직접 인터랙티브 요소.\n * 키보드: ↑/↓로 이동, Enter/Space로 선택.\n */\nexport function TimePickerHourList({ classNames, ...props }: TimePickerHourListProps) {\n const ctx = useTimePickerContext('TimePicker.HourList');\n const { format, currentTime, isDisabled, isReadOnly } = ctx;\n const listRef = useRef<HTMLUListElement>(null);\n\n const hours = generateHours(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 const handleSelect = useCallback(\n (hourDisplay: number) => {\n if (isDisabled || isReadOnly) return;\n const hours24 =\n format === '12h' && currentPeriod\n ? to24Hour(hourDisplay, currentPeriod)\n : hourDisplay;\n ctx.setTime({ hours: hours24 });\n },\n [format, currentPeriod, ctx, isDisabled, isReadOnly],\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLLIElement>, hour: number) => {\n if (isDisabled || isReadOnly) return;\n const currentIndex = hours.indexOf(hour);\n\n let newIndex = -1;\n if (e.key === 'ArrowDown') {\n newIndex = Math.min(currentIndex + 1, hours.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 = hours.length - 1;\n } else if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleSelect(hour);\n return;\n } else {\n return;\n }\n\n e.preventDefault();\n const targetHour = hours[newIndex];\n if (targetHour !== undefined) {\n handleSelect(targetHour);\n // 다음 렌더에서 새 selected 옵션에 포커스 이동\n requestAnimationFrame(() => {\n const next = listRef.current?.querySelector<HTMLLIElement>(\n '[data-selected=\"true\"]',\n );\n next?.focus();\n });\n }\n },\n [hours, handleSelect, isDisabled, isReadOnly],\n );\n\n return (\n <ul\n ref={listRef}\n role=\"listbox\"\n aria-label=\"시\"\n aria-disabled={isDisabled || undefined}\n className={classNames?.root}\n {...props}\n >\n {hours.map((hour) => {\n const isSelected = hour === selectedHourDisplay;\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 || undefined}\n aria-label={`${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, useRef } from 'react';\nimport type { HTMLAttributes, KeyboardEvent } from 'react';\nimport { generateMinutes } from '@kalyx/core';\nimport { useTimePickerContext } from '../../context/TimePickerContext.js';\n\nexport interface TimePickerMinuteListClassNames {\n root?: string;\n option?: string;\n optionSelected?: string;\n}\n\nexport interface TimePickerMinuteListProps\n extends Omit<HTMLAttributes<HTMLUListElement>, 'role' | 'children'> {\n classNames?: TimePickerMinuteListClassNames;\n}\n\n/**\n * TimePicker.MinuteList — `role=\"listbox\"` 패턴의 분 선택 리스트.\n * step prop에 따라 표시되는 분이 결정된다 (예: 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 } = ctx;\n const listRef = useRef<HTMLUListElement>(null);\n\n const minutes = generateMinutes(step);\n\n const handleSelect = useCallback(\n (minute: number) => {\n if (isDisabled || isReadOnly) return;\n ctx.setTime({ minutes: minute });\n },\n [ctx, isDisabled, isReadOnly],\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLLIElement>, minute: number) => {\n if (isDisabled || isReadOnly) return;\n const currentIndex = minutes.indexOf(minute);\n\n let newIndex = -1;\n if (e.key === 'ArrowDown') {\n newIndex = Math.min(currentIndex + 1, minutes.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 = minutes.length - 1;\n } else if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleSelect(minute);\n return;\n } else {\n return;\n }\n\n e.preventDefault();\n const target = minutes[newIndex];\n if (target !== undefined) {\n handleSelect(target);\n requestAnimationFrame(() => {\n const next = listRef.current?.querySelector<HTMLLIElement>(\n '[data-selected=\"true\"]',\n );\n next?.focus();\n });\n }\n },\n [minutes, handleSelect, isDisabled, isReadOnly],\n );\n\n return (\n <ul\n ref={listRef}\n role=\"listbox\"\n aria-label=\"분\"\n aria-disabled={isDisabled || undefined}\n className={classNames?.root}\n {...props}\n >\n {minutes.map((minute) => {\n const isSelected = minute === currentTime.minutes;\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 || undefined}\n aria-label={`${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 } from 'react';\nimport type { HTMLAttributes } 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\n extends Omit<HTMLAttributes<HTMLDivElement>, 'role' | 'children'> {\n classNames?: TimePickerAmPmToggleClassNames;\n}\n\n/**\n * TimePicker.AmPmToggle — 12시간제 모드에서만 표시되는 AM/PM 전환 버튼.\n * 24시간제에서는 null을 반환한다.\n */\nexport function TimePickerAmPmToggle({ classNames, ...props }: TimePickerAmPmToggleProps) {\n const ctx = useTimePickerContext('TimePicker.AmPmToggle');\n\n if (ctx.format !== '12h') return null;\n\n const { period, hours12 } = to12Hour(ctx.currentTime.hours);\n\n const setPeriod = useCallback(\n (newPeriod: 'AM' | 'PM') => {\n if (ctx.isDisabled || ctx.isReadOnly) return;\n const newHours24 = to24Hour(hours12, newPeriod);\n ctx.setTime({ hours: newHours24 });\n },\n [hours12, ctx],\n );\n\n const renderButton = (target: 'AM' | 'PM') => {\n const isSelected = period === target;\n const optionClass =\n [classNames?.option, isSelected && classNames?.optionSelected]\n .filter(Boolean)\n .join(' ') || undefined;\n\n return (\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n data-selected={isSelected || undefined}\n disabled={ctx.isDisabled}\n className={optionClass}\n onClick={() => setPeriod(target)}\n >\n {target}\n </button>\n );\n };\n\n return (\n <div role=\"radiogroup\" aria-label=\"오전/오후\" className={classNames?.root} {...props}>\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 {\n TimePickerHourListProps,\n TimePickerHourListClassNames,\n} from './HourList.js';\nimport type {\n TimePickerMinuteListProps,\n TimePickerMinuteListClassNames,\n} from './MinuteList.js';\nimport type {\n TimePickerAmPmToggleProps,\n TimePickerAmPmToggleClassNames,\n} from './AmPmToggle.js';\n\n/**\n * TimePicker — Headless 시간 선택 컴포넌트\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 getTime,\n setTime as setTimeOnIso,\n} from '@kalyx/core';\nimport type {\n DateAdapter,\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 {\n TimePickerContextValue,\n TimePickerFormat,\n} from '../../context/TimePickerContext.js';\n\n/**\n * DateTimePicker의 Root 컴포넌트 props.\n * 내부적으로 DatePickerContext + 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 /** 선택된 datetime (제어 모드, ISO 8601 UTC). 날짜+시간 모두 포함. */\n value?: ISODateString | null;\n /** 초기 datetime (비제어 모드) */\n defaultValue?: ISODateString;\n /** datetime 변경 콜백 */\n onChange?: (value: ISODateString | null) => void;\n /** 12/24시간제 */\n format?: TimePickerFormat;\n /** 분 step (1, 5, 15, 30 등) */\n step?: number;\n /** 비활성화 규칙 (날짜) */\n disabled?: DisabledRule[] | boolean;\n /** 읽기 전용 */\n readOnly?: boolean;\n /** 주 시작 요일 */\n weekStartsOn?: WeekStartsOn;\n /** 날짜·시간 표시 포맷 (Input용) */\n displayFormat?: string;\n /** BCP 47 locale */\n locale?: string;\n /** 날짜 어댑터 */\n adapter?: DateAdapter;\n /** 자식 컴포넌트 */\n children: ReactNode;\n}\n\n/** value=null 시 fallback ISO (오늘 00:00:00 UTC) */\nfunction getDefaultIso(): ISODateString {\n const now = new Date();\n return new Date(\n Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()),\n ).toISOString();\n}\n\n/**\n * DateTimePicker.Root — DatePicker + TimePicker 통합 컴포넌트.\n *\n * 단일 ISO datetime을 source of truth로 관리하고, 내부적으로\n * DatePickerContext와 TimePickerContext를 동시에 제공한다.\n * 따라서 DatePicker.Calendar, TimePicker.HourList 등 기존 컴포넌트를\n * 그대로 재사용할 수 있다.\n *\n * 핵심 동작:\n * - Calendar에서 날짜 클릭 → 날짜 부분만 변경, 시간 부분 보존, 팝오버 유지\n * - TimePicker에서 시간 변경 → 시간 부분만 변경, 날짜 부분 보존\n * - Escape / 바깥 클릭 → 팝오버 닫기 (확정)\n */\nexport function DateTimePickerRoot({\n value: controlledValue,\n defaultValue,\n onChange,\n format = '24h',\n step = 1,\n disabled = false,\n readOnly = false,\n weekStartsOn = 0,\n displayFormat = 'yyyy-MM-dd HH:mm',\n locale = 'en-US',\n adapter = DateFnsAdapter,\n children,\n}: DateTimePickerRootProps) {\n const pickerId = useId();\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 // 팝오버 / 캘린더 상태\n const [isOpen, setIsOpen] = useState(false);\n const [viewMonth, setViewMonth] = useState<ISODateString>(\n currentValue ?? adapter.today(),\n );\n const [focusedDate, setFocusedDate] = useState<ISODateString>(\n currentValue ?? adapter.today(),\n );\n\n const isDisabled = typeof disabled === 'boolean' ? disabled : false;\n const disabledRules: DisabledRule[] = Array.isArray(disabled) ? disabled : [];\n\n // value가 null이면 시간 추출용 fallback 사용\n const baseIso = currentValue ?? getDefaultIso();\n const currentTime: TimeValue = useMemo(() => getTime(baseIso), [baseIso]);\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 * 날짜 선택: 시간 부분을 보존한다.\n * DatePicker.Root와 달리 팝오버를 자동으로 닫지 않는다.\n */\n const selectDate = useCallback(\n (newDateIso: ISODateString | null) => {\n if (newDateIso === null) {\n updateValue(null);\n return;\n }\n // 현재 시간 부분을 보존하여 새 날짜에 적용\n const time = currentValue ? getTime(currentValue) : currentTime;\n const merged = setTimeOnIso(newDateIso, time);\n updateValue(merged);\n },\n [currentValue, currentTime, updateValue],\n );\n\n /**\n * 시간 변경: 날짜 부분을 보존한다.\n */\n const setTime = useCallback(\n (partial: Partial<TimeValue>) => {\n // 날짜가 없으면 오늘 자정으로 시작\n const base = currentValue ?? getDefaultIso();\n const merged = setTimeOnIso(base, partial);\n updateValue(merged);\n },\n [currentValue, updateValue],\n );\n\n const open = useCallback(() => {\n if (isDisabled || readOnly) return;\n setIsOpen(true);\n const target = currentValue ?? adapter.today();\n setViewMonth(target);\n setFocusedDate(target);\n }, [isDisabled, readOnly, currentValue, adapter]);\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 (Calendar, 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 isDisabled,\n isReadOnly: readOnly,\n pickerId,\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 isDisabled,\n readOnly,\n pickerId,\n ],\n );\n\n // ─── TimePickerContext (HourList, MinuteList, AmPmToggle 재사용용) ───\n const timeContext: TimePickerContextValue = useMemo(\n () => ({\n value: currentValue,\n setTime,\n format,\n step,\n withSeconds: false,\n isDisabled,\n isReadOnly: readOnly,\n currentTime,\n pickerId,\n }),\n [currentValue, setTime, format, step, isDisabled, readOnly, currentTime, pickerId],\n );\n\n return (\n <DatePickerContext.Provider value={dateContext}>\n <TimePickerContext.Provider value={timeContext}>\n {children}\n </TimePickerContext.Provider>\n </DatePickerContext.Provider>\n );\n}\n","import { forwardRef, useCallback } from 'react';\nimport type { InputHTMLAttributes } from 'react';\nimport { formatTimeString, getTime } from '@kalyx/core';\nimport { useDatePickerContext } from '../../context/DatePickerContext.js';\n\nexport interface DateTimePickerInputProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange' | 'type'> {}\n\n/**\n * DateTimePicker.Input — 날짜와 시간을 결합한 형식으로 표시.\n * 예: \"2026-01-15 14:30\"\n *\n * v0.3에서는 readOnly로 동작한다 (Calendar/TimePicker로 선택).\n * 직접 타이핑 파싱은 v0.4에서 지원 예정.\n */\nexport const DateTimePickerInput = forwardRef<HTMLInputElement, DateTimePickerInputProps>(\n function DateTimePickerInput({ onFocus, onKeyDown, ...props }, ref) {\n const ctx = useDatePickerContext('DateTimePicker.Input');\n\n // 날짜 부분 (yyyy-MM-dd) + 시간 부분 (HH:mm) 결합\n const displayValue = ctx.value\n ? `${ctx.adapter.format(ctx.value, 'yyyy-MM-dd')} ${formatTimeString(getTime(ctx.value))}`\n : '';\n\n const handleFocus = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n ctx.open();\n onFocus?.(e);\n },\n [ctx, onFocus],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Escape') {\n ctx.close();\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=\"날짜 및 시간\"\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 onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n {...props}\n />\n );\n },\n);\n","import { DateTimePickerRoot } from './Root.js';\nimport { DateTimePickerInput } from './Input.js';\n\n// 재사용: DatePicker 하위 컴포넌트 (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// 재사용: TimePicker 하위 컴포넌트 (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 — 날짜와 시간을 함께 선택하는 통합 컴포넌트.\n *\n * 단일 ISO datetime을 source of truth로 관리하며, 내부적으로\n * DatePickerContext와 TimePickerContext를 동시에 제공한다.\n * 따라서 DatePicker.Calendar, TimePicker.HourList 등 기존 컴포넌트가\n * 그대로 동작한다.\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시간제 모드\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 { useCallback, useId, useRef, useState } from 'react';\nimport { DateFnsAdapter, 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 /** 선택된 날짜 (제어 모드) */\n value?: ISODateString | null;\n /** 초기 날짜 (비제어 모드) */\n defaultValue?: ISODateString;\n /** 날짜 변경 콜백 */\n onChange?: (value: ISODateString | null) => void;\n /** 비활성화 규칙 */\n disabled?: DisabledRule[];\n /** 주 시작 요일 */\n weekStartsOn?: WeekStartsOn;\n /** 날짜 어댑터 */\n adapter?: DateAdapter;\n}\n\nexport interface UseDatePickerReturn {\n /** 현재 선택된 날짜 (ISO string) */\n value: ISODateString | null;\n /** 팝오버 열림 상태 */\n isOpen: boolean;\n /** 팝오버 열기 */\n open: () => void;\n /** 팝오버 닫기 */\n close: () => void;\n /** 팝오버 토글 */\n toggle: () => void;\n /** 날짜 선택 */\n selectDate: (iso: ISODateString | null) => void;\n /** 현재 표시 중인 월 (ISO string) */\n viewMonth: ISODateString;\n /** 표시 월 변경 */\n setViewMonth: (iso: ISODateString) => void;\n /** 캘린더 그리드 데이터 */\n calendar: CalendarGrid;\n /** 포커스된 날짜 */\n focusedDate: ISODateString;\n /** 포커스 날짜 변경 */\n setFocusedDate: (iso: ISODateString) => void;\n /** 이전 달로 이동 */\n previousMonth: () => void;\n /** 다음 달로 이동 */\n nextMonth: () => void;\n /** 고유 ID */\n pickerId: string;\n /** 날짜 어댑터 */\n adapter: DateAdapter;\n}\n\n/**\n * DatePicker의 상태를 관리하는 Hook.\n * 컴포넌트를 사용하지 않고 완전 커스텀 UI를 구현할 때 사용한다.\n *\n * @example\n * ```tsx\n * function MyDatePicker() {\n * const { value, isOpen, calendar, open, selectDate } = useDatePicker({\n * onChange: (iso) => console.log(iso),\n * });\n * // ... 커스텀 렌더링\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 } = 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>(currentValue ?? adapter.today());\n const [focusedDate, setFocusedDate] = useState<ISODateString>(currentValue ?? adapter.today());\n\n const selectDate = useCallback(\n (iso: ISODateString | null) => {\n if (!isControlled) {\n setUncontrolledValue(iso);\n }\n onChange?.(iso);\n setIsOpen(false);\n },\n [isControlled, onChange],\n );\n\n const open = useCallback(() => {\n setIsOpen(true);\n const target = currentValue ?? adapter.today();\n setViewMonth(target);\n setFocusedDate(target);\n }, [currentValue, adapter]);\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 });\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, 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 /** 선택된 범위 (제어 모드) */\n value?: DateRange;\n /** 초기 범위 (비제어 모드) */\n defaultValue?: DateRange;\n /** 범위 변경 콜백 */\n onChange?: (range: DateRange) => void;\n /** 비활성화 규칙 */\n disabled?: DisabledRule[];\n /** 주 시작 요일 */\n weekStartsOn?: WeekStartsOn;\n /** 날짜 어댑터 */\n adapter?: DateAdapter;\n}\n\nexport interface UseRangePickerReturn {\n /** 현재 선택된 범위 */\n value: DateRange;\n /** 다음에 선택될 부분 */\n selectingTarget: RangeSelectingTarget;\n /** 단일 날짜 클릭 핸들러 */\n selectDate: (iso: ISODateString) => void;\n /** 범위 직접 설정 */\n setRange: (range: DateRange) => void;\n /** 팝오버 열림 상태 */\n isOpen: boolean;\n open: () => void;\n close: () => void;\n toggle: () => void;\n /** hover 날짜 (미리보기용) */\n hoverDate: ISODateString | null;\n setHoverDate: (iso: ISODateString | null) => void;\n /** 현재 표시 중인 월 */\n viewMonth: ISODateString;\n setViewMonth: (iso: ISODateString) => void;\n /** 캘린더 그리드 */\n calendar: CalendarGrid;\n /** 포커스된 날짜 */\n focusedDate: ISODateString;\n setFocusedDate: (iso: ISODateString) => void;\n /** 이전 달로 이동 */\n previousMonth: () => void;\n /** 다음 달로 이동 */\n nextMonth: () => void;\n /** 고유 ID */\n pickerId: string;\n /** 어댑터 */\n adapter: DateAdapter;\n}\n\n/**\n * RangePicker 상태 관리 Hook.\n * 컴포넌트 없이 완전 커스텀 UI를 만들 때 사용한다.\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' → 시작일 선택 대기\n * // selectingTarget === 'end' → 종료일 선택 대기\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 } = 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(),\n );\n const [focusedDate, setFocusedDate] = useState<ISODateString>(\n currentValue.start ?? adapter.today(),\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 if (selectingTarget === 'start') {\n setRange({ start: iso, end: null });\n setSelectingTarget('end');\n setHoverDate(null);\n } else {\n const start = currentValue.start;\n if (!start) {\n setRange({ start: iso, end: null });\n setSelectingTarget('end');\n return;\n }\n\n const newRange: DateRange = adapter.isBefore(iso, start)\n ? { start: iso, end: start }\n : { start, end: iso };\n\n setRange(newRange);\n setSelectingTarget('start');\n setHoverDate(null);\n setIsOpen(false);\n }\n },\n [selectingTarget, currentValue.start, adapter, setRange],\n );\n\n const open = useCallback(() => {\n setIsOpen(true);\n const target = currentValue.start ?? adapter.today();\n setViewMonth(target);\n setFocusedDate(target);\n if (currentValue.start && currentValue.end) {\n setSelectingTarget('start');\n }\n }, [currentValue, adapter]);\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 });\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 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 /** 선택된 시간 (제어 모드) */\n value?: ISODateString | null;\n /** 초기 시간 (비제어 모드) */\n defaultValue?: ISODateString;\n /** 시간 변경 콜백 */\n onChange?: (value: ISODateString | null) => void;\n /** 12/24시간제 */\n format?: TimePickerFormat;\n /** 분 step */\n step?: number;\n /** 초 표시 */\n withSeconds?: boolean;\n}\n\nexport interface UseTimePickerReturn {\n /** 현재 ISO datetime 값 */\n value: ISODateString | null;\n /** 현재 시간 (TimeValue) */\n currentTime: TimeValue;\n /** 시간 부분 변경 */\n setTime: (partial: Partial<TimeValue>) => void;\n /** 시(hour) 직접 설정 (12h 모드면 1-12, 24h 모드면 0-23) */\n setHour: (hour: number) => void;\n /** 분 설정 */\n setMinute: (minute: number) => void;\n /** 초 설정 */\n setSecond: (second: number) => void;\n /** AM/PM 변경 (12h 모드 전용) */\n setPeriod: (period: 'AM' | 'PM') => void;\n /** 사용 가능한 시 리스트 */\n availableHours: number[];\n /** 사용 가능한 분 리스트 (step 적용) */\n availableMinutes: number[];\n /** 12/24h 모드 */\n format: TimePickerFormat;\n /** 현재 표시용 시 (12h 모드면 1-12) */\n displayHour: number;\n /** 현재 AM/PM (12h 모드 전용, 24h면 null) */\n period: 'AM' | 'PM' | null;\n /** 고유 ID */\n pickerId: string;\n}\n\nfunction getDefaultIso(): ISODateString {\n const now = new Date();\n return new Date(\n Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()),\n ).toISOString();\n}\n\n/**\n * TimePicker 상태 관리 Hook.\n * 컴포넌트 없이 완전 커스텀 UI를 구현할 때 사용한다.\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 } = 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(() => getTime(baseIso), [baseIso]);\n\n const setTime = useCallback(\n (partial: Partial<TimeValue>) => {\n const newIso = setTimeOnIso(baseIso, partial);\n if (!isControlled) {\n setUncontrolledValue(newIso);\n }\n onChange?.(newIso);\n },\n [baseIso, isControlled, onChange],\n );\n\n const period = format === '12h' ? to12Hour(currentTime.hours).period : null;\n const displayHour =\n 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(\n (minute: number) => setTime({ minutes: minute }),\n [setTime],\n );\n\n const setSecond = useCallback(\n (second: number) => setTime({ seconds: second }),\n [setTime],\n );\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"]}
|