chrona-react 0.2.0 → 0.3.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.
Files changed (34) hide show
  1. package/AGENTS.md +8 -2
  2. package/README.md +230 -7
  3. package/dist/calendar.js +3 -2
  4. package/dist/{chunk-JNQXKZO3.js → chunk-27APJXNX.js} +23 -9
  5. package/dist/chunk-27APJXNX.js.map +1 -0
  6. package/dist/{chunk-QQANBK5G.js → chunk-GXQA645Q.js} +9 -5
  7. package/dist/chunk-GXQA645Q.js.map +1 -0
  8. package/dist/{chunk-RCWVBOO6.js → chunk-I46LC4EZ.js} +12 -3
  9. package/dist/chunk-I46LC4EZ.js.map +1 -0
  10. package/dist/{chunk-2GZMCFFY.js → chunk-RTDRFDYG.js} +3 -2
  11. package/dist/{chunk-2GZMCFFY.js.map → chunk-RTDRFDYG.js.map} +1 -1
  12. package/dist/{chunk-GN2YCKFZ.js → chunk-SDDSKOYU.js} +3 -1
  13. package/dist/{chunk-GN2YCKFZ.js.map → chunk-SDDSKOYU.js.map} +1 -1
  14. package/dist/{chunk-ROJQDSGQ.js → chunk-WMHLPJBG.js} +3 -2
  15. package/dist/{chunk-ROJQDSGQ.js.map → chunk-WMHLPJBG.js.map} +1 -1
  16. package/dist/{chunk-U4LLSRIH.js → chunk-YMCXDNWB.js} +5 -4
  17. package/dist/{chunk-U4LLSRIH.js.map → chunk-YMCXDNWB.js.map} +1 -1
  18. package/dist/date-field.js +4 -3
  19. package/dist/date-picker.js +6 -5
  20. package/dist/index.js +8 -7
  21. package/dist/range-calendar.js +4 -3
  22. package/dist/time-field.js +4 -3
  23. package/package.json +3 -3
  24. package/dist/calendar.d.ts +0 -142
  25. package/dist/chunk-JNQXKZO3.js.map +0 -1
  26. package/dist/chunk-QQANBK5G.js.map +0 -1
  27. package/dist/chunk-RCWVBOO6.js.map +0 -1
  28. package/dist/date-field.d.ts +0 -74
  29. package/dist/date-picker.d.ts +0 -69
  30. package/dist/field-DayikvR6.d.ts +0 -11
  31. package/dist/form-BCAGbNh-.d.ts +0 -20
  32. package/dist/index.d.ts +0 -10
  33. package/dist/range-calendar.d.ts +0 -233
  34. package/dist/time-field.d.ts +0 -74
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/part.tsx","../src/provider.tsx","../src/form.ts"],"sourcesContent":["import * as React from \"react\";\n\nexport type PartProps = React.HTMLAttributes<HTMLElement> & { asChild?: boolean };\n\n// React 19 ref callbacks may return a cleanup function; React 18 types say void,\n// which would narrow that result to never at the call sites below.\nfunction setRef(ref: React.Ref<HTMLElement> | undefined, value: HTMLElement | null): (() => void) | void {\n if (typeof ref === \"function\") return ref(value);\n if (ref) (ref as React.MutableRefObject<HTMLElement | null>).current = value;\n}\n\nexport const Part = React.forwardRef<HTMLElement, PartProps & { as?: React.ElementType; type?: string; disabled?: boolean }>(function Part({ as: element = \"div\", asChild, children, ...props }, ref) {\n if (!asChild) return React.createElement(element, { ...props, ref }, children);\n const child = React.Children.only(children) as React.ReactElement<Record<string, unknown>>;\n if (!React.isValidElement(child) || child.type === React.Fragment) throw new Error(\"Chrona asChild requires one non-Fragment element.\");\n // Radix convention: the child's own props win over injected part props (events/className/style are merged).\n const merged: Record<string, unknown> = { ...props, ...child.props };\n for (const name of Object.keys(child.props)) {\n const own = (props as Record<string, unknown>)[name];\n const nested = child.props[name];\n if (/^on[A-Z]/.test(name) && typeof own === \"function\" && typeof nested === \"function\") {\n merged[name] = (event: React.SyntheticEvent) => {\n nested(event);\n if (!event.defaultPrevented) own(event);\n };\n }\n }\n merged.className = [props.className, child.props.className].filter(Boolean).join(\" \") || undefined;\n merged.style = { ...(props.style as React.CSSProperties), ...(child.props.style as React.CSSProperties) };\n const childRef = (Object.getOwnPropertyDescriptor(child.props, \"ref\")?.value ?? Object.getOwnPropertyDescriptor(child, \"ref\")?.value) as React.Ref<HTMLElement> | undefined;\n let cleanup: (() => void) | undefined;\n merged.ref = (node: HTMLElement | null) => {\n cleanup?.();\n cleanup = undefined;\n if (node === null) return;\n const ownCleanup = setRef(ref, node);\n const childCleanup = setRef(childRef, node);\n cleanup = () => {\n if (typeof ownCleanup === \"function\") ownCleanup(); else setRef(ref, null);\n if (typeof childCleanup === \"function\") childCleanup(); else setRef(childRef, null);\n };\n };\n return React.cloneElement(child, merged);\n});\n\nexport function composeEvent<Event extends React.SyntheticEvent>(user: ((event: Event) => void) | undefined, internal: (event: Event) => void) {\n return (event: Event) => {\n user?.(event);\n if (!event.defaultPrevented) internal(event);\n };\n}","import * as React from \"react\";\nimport type { Translations } from \"chrona-core\";\n\nexport interface ChronaConfig {\n locale?: string;\n timeZone?: string;\n dir?: \"ltr\" | \"rtl\";\n translations?: Partial<Translations>;\n}\n\nconst ConfigContext = React.createContext<ChronaConfig>({});\n\nexport function ChronaProvider({ children, ...config }: ChronaConfig & { children: React.ReactNode }) {\n const parent = React.useContext(ConfigContext);\n const { locale = parent.locale, timeZone = parent.timeZone, dir = parent.dir, translations } = config;\n const value = React.useMemo(() => ({ locale, timeZone, dir, translations: { ...parent.translations, ...translations } }), [locale, timeZone, dir, parent.translations, translations]);\n return <ConfigContext.Provider value={value}>{children}</ConfigContext.Provider>;\n}\n\nexport function useChronaConfig<Options extends ChronaConfig>(options: Options): Options & ChronaConfig {\n const parent = React.useContext(ConfigContext);\n return {\n ...options,\n locale: options.locale ?? parent.locale,\n timeZone: options.timeZone ?? parent.timeZone,\n dir: options.dir ?? parent.dir,\n translations: { ...parent.translations, ...options.translations },\n };\n}","import * as React from \"react\";\n\nexport type HiddenInputProps = Omit<React.ComponentPropsWithoutRef<\"input\">, \"type\" | \"value\" | \"defaultValue\" | \"onChange\">;\n\nexport function useFormReset(input: React.RefObject<HTMLInputElement | null>, form: string | undefined, reset: () => void) {\n const latest = React.useRef(reset);\n React.useEffect(() => { latest.current = reset; });\n React.useEffect(() => {\n const owner = input.current?.form;\n if (!owner) return;\n let active = true;\n const handler = (event: Event) => queueMicrotask(() => {\n if (active && !event.defaultPrevented) latest.current();\n });\n owner.addEventListener(\"reset\", handler);\n return () => {\n active = false;\n owner.removeEventListener(\"reset\", handler);\n };\n }, [input, form]);\n}"],"mappings":"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","names":["Part","React","React"]}
1
+ {"version":3,"sources":["../src/part.tsx","../src/provider.tsx","../src/form.ts"],"sourcesContent":["import * as React from \"react\";\n\nexport type PartProps = React.HTMLAttributes<HTMLElement> & { asChild?: boolean };\n\n// React 19 ref callbacks may return a cleanup function; React 18 types say void,\n// which would narrow that result to never at the call sites below.\nfunction setRef(ref: React.Ref<HTMLElement> | undefined, value: HTMLElement | null): (() => void) | void {\n if (typeof ref === \"function\") return ref(value);\n if (ref) (ref as React.MutableRefObject<HTMLElement | null>).current = value;\n}\n\nexport const Part = React.forwardRef<HTMLElement, PartProps & { as?: React.ElementType; type?: string; disabled?: boolean }>(function Part({ as: element = \"div\", asChild, children, ...props }, ref) {\n if (!asChild) return React.createElement(element, { ...props, ref }, children);\n const child = React.Children.only(children) as React.ReactElement<Record<string, unknown>>;\n if (!React.isValidElement(child) || child.type === React.Fragment) throw new Error(\"Chrona asChild requires one non-Fragment element.\");\n // Radix convention: the child's own props win over injected part props (events/className/style are merged).\n const merged: Record<string, unknown> = { ...props, ...child.props };\n for (const name of Object.keys(child.props)) {\n const own = (props as Record<string, unknown>)[name];\n const nested = child.props[name];\n if (/^on[A-Z]/.test(name) && typeof own === \"function\" && typeof nested === \"function\") {\n merged[name] = (event: React.SyntheticEvent) => {\n nested(event);\n if (!event.defaultPrevented) own(event);\n };\n }\n }\n merged.className = [props.className, child.props.className].filter(Boolean).join(\" \") || undefined;\n merged.style = { ...(props.style as React.CSSProperties), ...(child.props.style as React.CSSProperties) };\n const childRef = (Object.getOwnPropertyDescriptor(child.props, \"ref\")?.value ?? Object.getOwnPropertyDescriptor(child, \"ref\")?.value) as React.Ref<HTMLElement> | undefined;\n let cleanup: (() => void) | undefined;\n merged.ref = (node: HTMLElement | null) => {\n cleanup?.();\n cleanup = undefined;\n if (node === null) return;\n const ownCleanup = setRef(ref, node);\n const childCleanup = setRef(childRef, node);\n cleanup = () => {\n if (typeof ownCleanup === \"function\") ownCleanup(); else setRef(ref, null);\n if (typeof childCleanup === \"function\") childCleanup(); else setRef(childRef, null);\n };\n };\n return React.cloneElement(child, merged);\n});\n\nexport function composeEvent<Event extends React.SyntheticEvent>(user: ((event: Event) => void) | undefined, internal: (event: Event) => void) {\n return (event: Event) => {\n user?.(event);\n if (!event.defaultPrevented) internal(event);\n };\n}","import * as React from \"react\";\nimport type { Translations } from \"chrona-core\";\n\nexport interface ChronaConfig {\n locale?: string;\n timeZone?: string;\n dir?: \"ltr\" | \"rtl\";\n translations?: Partial<Translations>;\n}\n\nconst ConfigContext = React.createContext<ChronaConfig>({});\n\nexport function ChronaProvider({ children, ...config }: ChronaConfig & { children: React.ReactNode }) {\n const parent = React.useContext(ConfigContext);\n const { locale = parent.locale, timeZone = parent.timeZone, dir = parent.dir, translations } = config;\n const value = React.useMemo(() => ({ locale, timeZone, dir, translations: { ...parent.translations, ...translations } }), [locale, timeZone, dir, parent.translations, translations]);\n return <ConfigContext.Provider value={value}>{children}</ConfigContext.Provider>;\n}\n\nexport function useChronaConfig<Options extends ChronaConfig>(options: Options): Options & ChronaConfig {\n const parent = React.useContext(ConfigContext);\n return {\n ...options,\n locale: options.locale ?? parent.locale,\n timeZone: options.timeZone ?? parent.timeZone,\n dir: options.dir ?? parent.dir,\n translations: { ...parent.translations, ...options.translations },\n };\n}","import * as React from \"react\";\n\nexport type HiddenInputProps = Omit<React.ComponentPropsWithoutRef<\"input\">, \"type\" | \"value\" | \"defaultValue\" | \"onChange\">;\n\nexport function useFormReset(input: React.RefObject<HTMLInputElement | null>, form: string | undefined, reset: () => void) {\n const latest = React.useRef(reset);\n React.useEffect(() => { latest.current = reset; });\n React.useEffect(() => {\n const owner = input.current?.form;\n if (!owner) return;\n let active = true;\n const handler = (event: Event) => queueMicrotask(() => {\n if (active && !event.defaultPrevented) latest.current();\n });\n owner.addEventListener(\"reset\", handler);\n return () => {\n active = false;\n owner.removeEventListener(\"reset\", handler);\n };\n }, [input, form]);\n}"],"mappings":"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","names":["Part","React","React"]}
@@ -1,7 +1,8 @@
1
+ "use client";
1
2
  import {
2
3
  createFieldComponents,
3
4
  useField
4
- } from "./chunk-JNQXKZO3.js";
5
+ } from "./chunk-27APJXNX.js";
5
6
 
6
7
  // src/time-field.tsx
7
8
  var TimeField = createFieldComponents("time");
@@ -13,4 +14,4 @@ export {
13
14
  TimeField,
14
15
  useTimeField
15
16
  };
16
- //# sourceMappingURL=chunk-ROJQDSGQ.js.map
17
+ //# sourceMappingURL=chunk-WMHLPJBG.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/time-field.tsx"],"sourcesContent":["import { createFieldComponents, useField, type FieldProps } from \"./field\";\n\nexport type TimeFieldProps = FieldProps<\"time\">;\nexport const TimeField = createFieldComponents(\"time\");\nexport function useTimeField(props: TimeFieldProps = {}) { return useField(\"time\", props); }"],"mappings":";;;;;;AAGO,IAAM,YAAY,sBAAsB,MAAM;AAC9C,SAAS,aAAa,QAAwB,CAAC,GAAG;AAAE,SAAO,SAAS,QAAQ,KAAK;AAAG;","names":[]}
1
+ {"version":3,"sources":["../src/time-field.tsx"],"sourcesContent":["import { createFieldComponents, useField, type FieldProps } from \"./field\";\n\nexport type TimeFieldProps = FieldProps<\"time\">;\nexport const TimeField = createFieldComponents(\"time\");\nexport function useTimeField(props: TimeFieldProps = {}) { return useField(\"time\", props); }"],"mappings":";;;;;;;AAGO,IAAM,YAAY,sBAAsB,MAAM;AAC9C,SAAS,aAAa,QAAwB,CAAC,GAAG;AAAE,SAAO,SAAS,QAAQ,KAAK;AAAG;","names":[]}
@@ -1,14 +1,15 @@
1
+ "use client";
1
2
  import {
2
3
  DateField
3
- } from "./chunk-2GZMCFFY.js";
4
+ } from "./chunk-RTDRFDYG.js";
4
5
  import {
5
6
  Calendar
6
- } from "./chunk-RCWVBOO6.js";
7
+ } from "./chunk-I46LC4EZ.js";
7
8
  import {
8
9
  Part,
9
10
  composeEvent,
10
11
  useChronaConfig
11
- } from "./chunk-GN2YCKFZ.js";
12
+ } from "./chunk-SDDSKOYU.js";
12
13
 
13
14
  // src/date-picker.tsx
14
15
  import * as React from "react";
@@ -216,4 +217,4 @@ export {
216
217
  useDatePicker,
217
218
  DatePicker
218
219
  };
219
- //# sourceMappingURL=chunk-U4LLSRIH.js.map
220
+ //# sourceMappingURL=chunk-YMCXDNWB.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/date-picker.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { computeAnchorPosition, containTabFocus, transitionPicker, translations, type PlainDate, type PickerEvent } from \"chrona-core\";\nimport { Calendar, type CalendarProps } from \"./calendar\";\nimport { DateField, type DateFieldProps } from \"./date-field\";\nimport { Part, composeEvent, type PartProps } from \"./part\";\nimport { useChronaConfig } from \"./provider\";\n\nexport interface DatePickerProps extends DateFieldProps {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n modal?: boolean;\n timeZone?: string;\n firstDayOfWeek?: number;\n fixedWeeks?: boolean;\n numberOfMonths?: number;\n pagedNavigation?: boolean;\n}\n\ninterface PickerContext {\n props: DatePickerProps;\n options: DatePickerProps;\n state: { value: PlainDate | null; open: boolean };\n id: string;\n value: PlainDate | null;\n change: (value: PlainDate | null) => void;\n open: boolean;\n send: (event: PickerEvent) => void;\n trigger: { current: HTMLElement | null };\n labelled: boolean;\n registerLabel: (present: boolean) => void;\n}\n\nconst Context = React.createContext<PickerContext | null>(null);\nfunction usePicker() {\n const value = React.useContext(Context);\n if (!value) throw new Error(\"DatePicker parts must be inside DatePicker.Root.\");\n return value;\n}\n\nfunction Root({ children, asChild, className, style, ...input }: DatePickerProps & Pick<PartProps, \"children\" | \"asChild\" | \"className\" | \"style\">) {\n const picker = useDatePicker(input);\n return <Context.Provider value={picker}><Part asChild={asChild} className={className} style={style} dir={picker.props.dir} data-scope=\"date-picker\" data-part=\"root\"><DateField.Root {...picker.props} id={`${picker.id}-field`} value={picker.value} onChange={picker.change}>{children}</DateField.Root></Part></Context.Provider>;\n}\n\nexport function useDatePicker(input: DatePickerProps = {}): PickerContext {\n const props = useChronaConfig(input);\n const generatedId = React.useId();\n const id = props.id ?? generatedId;\n const [uncontrolledValue, setValue] = React.useState(props.defaultValue ?? null);\n const [uncontrolledOpen, setOpen] = React.useState(props.defaultOpen ?? false);\n const value = props.value === undefined ? uncontrolledValue : props.value;\n const open = props.open ?? uncontrolledOpen;\n const trigger = React.useRef<HTMLElement | null>(null);\n const [labelled, registerLabel] = React.useState(false);\n function change(next: PlainDate | null) {\n if (props.value === undefined) setValue(next);\n props.onChange?.(next);\n }\n function send(event: PickerEvent) {\n const result = transitionPicker({ open }, event, props);\n for (const effect of result.effects) if (effect.type === \"openChange\") {\n if (props.open === undefined) setOpen(effect.open);\n props.onOpenChange?.(effect.open);\n }\n }\n return { props, options: props, state: { value, open }, id, value, change, open, send, trigger, labelled, registerLabel };\n}\n\nconst Label = React.forwardRef<HTMLElement, PartProps>(function Label(props, ref) {\n const { registerLabel } = usePicker();\n React.useEffect(() => {\n registerLabel(true);\n return () => registerLabel(false);\n }, [registerLabel]);\n return <DateField.Label {...props} ref={ref} />;\n});\n\n/** Like the paging buttons, the trigger is labelled but has no text of its own to show. */\nfunction CalendarGlyph() {\n return <svg aria-hidden=\"true\" focusable=\"false\" viewBox=\"0 0 24 24\" width=\"1em\" height=\"1em\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" data-scope=\"date-picker\" data-part=\"trigger-icon\"><rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"2\" /><path d=\"M3 10h18M8 3v4M16 3v4\" /></svg>;\n}\n\nconst Trigger = React.forwardRef<HTMLElement, React.ComponentPropsWithoutRef<\"button\"> & { asChild?: boolean }>(function Trigger({ onClick, children, ...props }, ref) {\n const picker = usePicker();\n return <Part as=\"button\" {...props} type=\"button\" ref={(node) => {\n picker.trigger.current = node;\n if (typeof ref === \"function\") ref(node); else if (ref) ref.current = node;\n }} aria-label={props[\"aria-label\"] ?? picker.props.translations?.chooseDate ?? translations.chooseDate} aria-haspopup=\"dialog\" aria-expanded={picker.open} aria-controls={`${picker.id}-dialog`} disabled={picker.props.disabled} data-scope=\"date-picker\" data-part=\"trigger\" onClick={composeEvent(onClick, () => picker.send({ type: \"TOGGLE\" }))}>{children ?? <CalendarGlyph />}</Part>;\n});\n\nconst Popover = React.forwardRef<HTMLDialogElement, Omit<React.ComponentPropsWithoutRef<\"dialog\">, \"open\"> & { anchored?: boolean }>(function Popover({ children, anchored = true, onCancel, onClose, onKeyDown, ...props }, ref) {\n const picker = usePicker();\n const dialog = React.useRef<HTMLDialogElement | null>(null);\n const latest = React.useRef(picker);\n latest.current = picker;\n\n React.useEffect(() => {\n const element = dialog.current;\n if (!element) return;\n if (picker.open && !element.open) {\n if (picker.props.modal === false) element.show(); else element.showModal();\n element.querySelector<HTMLElement>('[data-part=\"cell-trigger\"][tabindex=\"0\"]')?.focus();\n } else if (!picker.open && element.open) {\n element.close();\n picker.trigger.current?.focus();\n }\n }, [picker.open, picker.props.modal, picker.trigger]);\n\n React.useEffect(() => {\n if (!picker.open || !anchored) return;\n const element = dialog.current;\n const anchor = picker.trigger.current;\n const window = element?.ownerDocument.defaultView;\n if (!element || !anchor || !window) return;\n const properties = [\"position\", \"margin\", \"top\", \"left\", \"max-width\", \"max-height\", \"min-width\", \"min-height\", \"box-sizing\", \"overflow\"];\n const original = properties.map((property) => ({ property, value: element.style.getPropertyValue(property), priority: element.style.getPropertyPriority(property) }));\n const originalPlacement = element.getAttribute(\"data-placement\");\n const position = () => {\n const viewport = window.visualViewport;\n const width = viewport?.width ?? element.ownerDocument.documentElement.clientWidth;\n const height = viewport?.height ?? element.ownerDocument.documentElement.clientHeight;\n const offsetTop = viewport?.offsetTop ?? 0;\n const offsetLeft = viewport?.offsetLeft ?? 0;\n Object.assign(element.style, {\n position: \"fixed\", margin: \"0\", boxSizing: \"border-box\", overflow: \"auto\",\n minWidth: \"0\", minHeight: \"0\", maxWidth: `${Math.max(0, width - 8)}px`, maxHeight: `${Math.max(0, height - 8)}px`,\n });\n const rect = anchor.getBoundingClientRect();\n const { top, left, placement } = computeAnchorPosition(\n { top: rect.top - offsetTop, left: rect.left - offsetLeft, width: rect.width, height: rect.height },\n { width: element.offsetWidth, height: element.offsetHeight }, { width, height },\n );\n Object.assign(element.style, { top: `${top + offsetTop}px`, left: `${left + offsetLeft}px` });\n element.setAttribute(\"data-placement\", placement);\n };\n position();\n let frame: number | undefined;\n const schedulePosition = () => {\n if (frame !== undefined) return;\n frame = window.requestAnimationFrame(() => {\n frame = undefined;\n position();\n });\n };\n const observer = window.ResizeObserver ? new window.ResizeObserver(schedulePosition) : undefined;\n observer?.observe(element);\n observer?.observe(anchor);\n window.addEventListener(\"resize\", schedulePosition);\n window.addEventListener(\"scroll\", schedulePosition, true);\n window.visualViewport?.addEventListener(\"resize\", schedulePosition);\n window.visualViewport?.addEventListener(\"scroll\", schedulePosition);\n return () => {\n if (frame !== undefined) window.cancelAnimationFrame(frame);\n observer?.disconnect();\n window.removeEventListener(\"resize\", schedulePosition);\n window.removeEventListener(\"scroll\", schedulePosition, true);\n window.visualViewport?.removeEventListener(\"resize\", schedulePosition);\n window.visualViewport?.removeEventListener(\"scroll\", schedulePosition);\n for (const { property, value, priority } of original) {\n if (value) element.style.setProperty(property, value, priority);\n else element.style.removeProperty(property);\n }\n if (originalPlacement === null) element.removeAttribute(\"data-placement\");\n else element.setAttribute(\"data-placement\", originalPlacement);\n };\n }, [picker.open, anchored, picker.trigger]);\n\n React.useEffect(() => {\n const element = dialog.current;\n if (!picker.open || !element) return;\n const dismiss = (event: PointerEvent) => {\n if (!(event.target instanceof Node) || latest.current.trigger.current?.contains(event.target)) return;\n const rect = element.getBoundingClientRect();\n const onBackdrop = event.target === element && (event.clientX < rect.left || event.clientX > rect.right || event.clientY < rect.top || event.clientY > rect.bottom);\n if (!element.contains(event.target) || onBackdrop) latest.current.send({ type: \"CLOSE\" });\n };\n element.ownerDocument.addEventListener(\"pointerdown\", dismiss);\n return () => element.ownerDocument.removeEventListener(\"pointerdown\", dismiss);\n }, [picker.open]);\n\n // aria-labelledby wins wherever both are present, so the fallback name is only applied when\n // nothing else names the dialog.\n const labelledBy = props[\"aria-labelledby\"] ?? (props[\"aria-label\"] || !picker.labelled ? undefined : `${picker.id}-field-label`);\n const label = props[\"aria-label\"] ?? (labelledBy === undefined ? picker.props.translations?.chooseDate ?? translations.chooseDate : undefined);\n\n return <dialog {...props} ref={(node) => {\n dialog.current = node;\n if (typeof ref === \"function\") ref(node); else if (ref) ref.current = node;\n }} id={`${picker.id}-dialog`} aria-label={label} aria-labelledby={labelledBy} aria-modal={picker.props.modal !== false || undefined} data-scope=\"date-picker\" data-part=\"popover\"\n onKeyDown={composeEvent(onKeyDown, (event) => { if (picker.props.modal !== false) containTabFocus(event.currentTarget, event); })}\n onCancel={(event) => { onCancel?.(event); const canceled = event.defaultPrevented; event.preventDefault(); if (!canceled) picker.send({ type: \"CLOSE\" }); }}\n onClose={composeEvent(onClose, () => { if (picker.open) picker.send({ type: \"CLOSE\" }); })}>{picker.open ? children : null}</dialog>;\n});\n\nfunction PickerCalendar({ children, ...props }: Omit<CalendarProps, \"value\" | \"defaultValue\" | \"onChange\"> & Pick<PartProps, \"children\" | \"className\" | \"style\">) {\n const picker = usePicker();\n return <Calendar.Root {...picker.props} {...props} value={picker.value} onChange={picker.change} onSelect={() => picker.send({ type: \"SELECT\" })}>{children ?? <><Calendar.Header><Calendar.PrevButton /><Calendar.Heading /><Calendar.NextButton /></Calendar.Header><Calendar.Grid><Calendar.GridHeader /><Calendar.GridBody /></Calendar.Grid></>}</Calendar.Root>;\n}\n\nexport const DatePicker = { Root, Label, Field: DateField.Field, Segment: DateField.Segment, HiddenInput: DateField.HiddenInput, ClearButton: DateField.ClearButton, LiveRegion: DateField.LiveRegion, Trigger, Popover, Calendar: PickerCalendar };"],"mappings":";;;;;;;;;;;;;AAAA,YAAY,WAAW;AACvB,SAAS,uBAAuB,iBAAiB,kBAAkB,oBAAsD;AAyCgD,SA2JN,UA3JM,KAsC9J,YAtC8J;AATzK,IAAM,UAAgB,oBAAoC,IAAI;AAC9D,SAAS,YAAY;AACjB,QAAM,QAAc,iBAAW,OAAO;AACtC,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,kDAAkD;AAC9E,SAAO;AACX;AAEA,SAAS,KAAK,EAAE,UAAU,SAAS,WAAW,OAAO,GAAG,MAAM,GAAsF;AAChJ,QAAM,SAAS,cAAc,KAAK;AAClC,SAAO,oBAAC,QAAQ,UAAR,EAAiB,OAAO,QAAQ,8BAAC,QAAK,SAAkB,WAAsB,OAAc,KAAK,OAAO,MAAM,KAAK,cAAW,eAAc,aAAU,QAAO,8BAAC,UAAU,MAAV,EAAgB,GAAG,OAAO,OAAO,IAAI,GAAG,OAAO,EAAE,UAAU,OAAO,OAAO,OAAO,UAAU,OAAO,QAAS,UAAS,GAAiB,GAAO;AACrT;AAEO,SAAS,cAAc,QAAyB,CAAC,GAAkB;AACtE,QAAM,QAAQ,gBAAgB,KAAK;AACnC,QAAM,cAAoB,YAAM;AAChC,QAAM,KAAK,MAAM,MAAM;AACvB,QAAM,CAAC,mBAAmB,QAAQ,IAAU,eAAS,MAAM,gBAAgB,IAAI;AAC/E,QAAM,CAAC,kBAAkB,OAAO,IAAU,eAAS,MAAM,eAAe,KAAK;AAC7E,QAAM,QAAQ,MAAM,UAAU,SAAY,oBAAoB,MAAM;AACpE,QAAM,OAAO,MAAM,QAAQ;AAC3B,QAAM,UAAgB,aAA2B,IAAI;AACrD,QAAM,CAAC,UAAU,aAAa,IAAU,eAAS,KAAK;AACtD,WAAS,OAAO,MAAwB;AACpC,QAAI,MAAM,UAAU,OAAW,UAAS,IAAI;AAC5C,UAAM,WAAW,IAAI;AAAA,EACzB;AACA,WAAS,KAAK,OAAoB;AAC9B,UAAM,SAAS,iBAAiB,EAAE,KAAK,GAAG,OAAO,KAAK;AACtD,eAAW,UAAU,OAAO,QAAS,KAAI,OAAO,SAAS,cAAc;AACnE,UAAI,MAAM,SAAS,OAAW,SAAQ,OAAO,IAAI;AACjD,YAAM,eAAe,OAAO,IAAI;AAAA,IACpC;AAAA,EACJ;AACA,SAAO,EAAE,OAAO,SAAS,OAAO,OAAO,EAAE,OAAO,KAAK,GAAG,IAAI,OAAO,QAAQ,MAAM,MAAM,SAAS,UAAU,cAAc;AAC5H;AAEA,IAAM,QAAc,iBAAmC,SAASA,OAAM,OAAO,KAAK;AAC9E,QAAM,EAAE,cAAc,IAAI,UAAU;AACpC,EAAM,gBAAU,MAAM;AAClB,kBAAc,IAAI;AAClB,WAAO,MAAM,cAAc,KAAK;AAAA,EACpC,GAAG,CAAC,aAAa,CAAC;AAClB,SAAO,oBAAC,UAAU,OAAV,EAAiB,GAAG,OAAO,KAAU;AACjD,CAAC;AAGD,SAAS,gBAAgB;AACrB,SAAO,qBAAC,SAAI,eAAY,QAAO,WAAU,SAAQ,SAAQ,aAAY,OAAM,OAAM,QAAO,OAAM,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAQ,cAAW,eAAc,aAAU,gBAAe;AAAA,wBAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI;AAAA,IAAE,oBAAC,UAAK,GAAE,yBAAwB;AAAA,KAAE;AACvU;AAEA,IAAM,UAAgB,iBAA0F,SAASC,SAAQ,EAAE,SAAS,UAAU,GAAG,MAAM,GAAG,KAAK;AACnK,QAAM,SAAS,UAAU;AACzB,SAAO,oBAAC,QAAK,IAAG,UAAU,GAAG,OAAO,MAAK,UAAS,KAAK,CAAC,SAAS;AAC7D,WAAO,QAAQ,UAAU;AACzB,QAAI,OAAO,QAAQ,WAAY,KAAI,IAAI;AAAA,aAAY,IAAK,KAAI,UAAU;AAAA,EAC1E,GAAG,cAAY,MAAM,YAAY,KAAK,OAAO,MAAM,cAAc,cAAc,aAAa,YAAY,iBAAc,UAAS,iBAAe,OAAO,MAAM,iBAAe,GAAG,OAAO,EAAE,WAAW,UAAU,OAAO,MAAM,UAAU,cAAW,eAAc,aAAU,WAAU,SAAS,aAAa,SAAS,MAAM,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC,CAAC,GAAI,sBAAY,oBAAC,iBAAc,GAAG;AACzX,CAAC;AAED,IAAM,UAAgB,iBAA+G,SAASC,SAAQ,EAAE,UAAU,WAAW,MAAM,UAAU,SAAS,WAAW,GAAG,MAAM,GAAG,KAAK;AAC9N,QAAM,SAAS,UAAU;AACzB,QAAM,SAAe,aAAiC,IAAI;AAC1D,QAAM,SAAe,aAAO,MAAM;AAClC,SAAO,UAAU;AAEjB,EAAM,gBAAU,MAAM;AAClB,UAAM,UAAU,OAAO;AACvB,QAAI,CAAC,QAAS;AACd,QAAI,OAAO,QAAQ,CAAC,QAAQ,MAAM;AAC9B,UAAI,OAAO,MAAM,UAAU,MAAO,SAAQ,KAAK;AAAA,UAAQ,SAAQ,UAAU;AACzE,cAAQ,cAA2B,0CAA0C,GAAG,MAAM;AAAA,IAC1F,WAAW,CAAC,OAAO,QAAQ,QAAQ,MAAM;AACrC,cAAQ,MAAM;AACd,aAAO,QAAQ,SAAS,MAAM;AAAA,IAClC;AAAA,EACJ,GAAG,CAAC,OAAO,MAAM,OAAO,MAAM,OAAO,OAAO,OAAO,CAAC;AAEpD,EAAM,gBAAU,MAAM;AAClB,QAAI,CAAC,OAAO,QAAQ,CAAC,SAAU;AAC/B,UAAM,UAAU,OAAO;AACvB,UAAM,SAAS,OAAO,QAAQ;AAC9B,UAAM,SAAS,SAAS,cAAc;AACtC,QAAI,CAAC,WAAW,CAAC,UAAU,CAAC,OAAQ;AACpC,UAAM,aAAa,CAAC,YAAY,UAAU,OAAO,QAAQ,aAAa,cAAc,aAAa,cAAc,cAAc,UAAU;AACvI,UAAM,WAAW,WAAW,IAAI,CAAC,cAAc,EAAE,UAAU,OAAO,QAAQ,MAAM,iBAAiB,QAAQ,GAAG,UAAU,QAAQ,MAAM,oBAAoB,QAAQ,EAAE,EAAE;AACpK,UAAM,oBAAoB,QAAQ,aAAa,gBAAgB;AAC/D,UAAM,WAAW,MAAM;AACnB,YAAM,WAAW,OAAO;AACxB,YAAM,QAAQ,UAAU,SAAS,QAAQ,cAAc,gBAAgB;AACvE,YAAM,SAAS,UAAU,UAAU,QAAQ,cAAc,gBAAgB;AACzE,YAAM,YAAY,UAAU,aAAa;AACzC,YAAM,aAAa,UAAU,cAAc;AAC3C,aAAO,OAAO,QAAQ,OAAO;AAAA,QACzB,UAAU;AAAA,QAAS,QAAQ;AAAA,QAAK,WAAW;AAAA,QAAc,UAAU;AAAA,QACnE,UAAU;AAAA,QAAK,WAAW;AAAA,QAAK,UAAU,GAAG,KAAK,IAAI,GAAG,QAAQ,CAAC,CAAC;AAAA,QAAM,WAAW,GAAG,KAAK,IAAI,GAAG,SAAS,CAAC,CAAC;AAAA,MACjH,CAAC;AACD,YAAM,OAAO,OAAO,sBAAsB;AAC1C,YAAM,EAAE,KAAK,MAAM,UAAU,IAAI;AAAA,QAC7B,EAAE,KAAK,KAAK,MAAM,WAAW,MAAM,KAAK,OAAO,YAAY,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAO;AAAA,QAClG,EAAE,OAAO,QAAQ,aAAa,QAAQ,QAAQ,aAAa;AAAA,QAAG,EAAE,OAAO,OAAO;AAAA,MAClF;AACA,aAAO,OAAO,QAAQ,OAAO,EAAE,KAAK,GAAG,MAAM,SAAS,MAAM,MAAM,GAAG,OAAO,UAAU,KAAK,CAAC;AAC5F,cAAQ,aAAa,kBAAkB,SAAS;AAAA,IACpD;AACA,aAAS;AACT,QAAI;AACJ,UAAM,mBAAmB,MAAM;AAC3B,UAAI,UAAU,OAAW;AACzB,cAAQ,OAAO,sBAAsB,MAAM;AACvC,gBAAQ;AACR,iBAAS;AAAA,MACb,CAAC;AAAA,IACL;AACA,UAAM,WAAW,OAAO,iBAAiB,IAAI,OAAO,eAAe,gBAAgB,IAAI;AACvF,cAAU,QAAQ,OAAO;AACzB,cAAU,QAAQ,MAAM;AACxB,WAAO,iBAAiB,UAAU,gBAAgB;AAClD,WAAO,iBAAiB,UAAU,kBAAkB,IAAI;AACxD,WAAO,gBAAgB,iBAAiB,UAAU,gBAAgB;AAClE,WAAO,gBAAgB,iBAAiB,UAAU,gBAAgB;AAClE,WAAO,MAAM;AACT,UAAI,UAAU,OAAW,QAAO,qBAAqB,KAAK;AAC1D,gBAAU,WAAW;AACrB,aAAO,oBAAoB,UAAU,gBAAgB;AACrD,aAAO,oBAAoB,UAAU,kBAAkB,IAAI;AAC3D,aAAO,gBAAgB,oBAAoB,UAAU,gBAAgB;AACrE,aAAO,gBAAgB,oBAAoB,UAAU,gBAAgB;AACrE,iBAAW,EAAE,UAAU,OAAO,SAAS,KAAK,UAAU;AAClD,YAAI,MAAO,SAAQ,MAAM,YAAY,UAAU,OAAO,QAAQ;AAAA,YACzD,SAAQ,MAAM,eAAe,QAAQ;AAAA,MAC9C;AACA,UAAI,sBAAsB,KAAM,SAAQ,gBAAgB,gBAAgB;AAAA,UACnE,SAAQ,aAAa,kBAAkB,iBAAiB;AAAA,IACjE;AAAA,EACJ,GAAG,CAAC,OAAO,MAAM,UAAU,OAAO,OAAO,CAAC;AAE1C,EAAM,gBAAU,MAAM;AAClB,UAAM,UAAU,OAAO;AACvB,QAAI,CAAC,OAAO,QAAQ,CAAC,QAAS;AAC9B,UAAM,UAAU,CAAC,UAAwB;AACrC,UAAI,EAAE,MAAM,kBAAkB,SAAS,OAAO,QAAQ,QAAQ,SAAS,SAAS,MAAM,MAAM,EAAG;AAC/F,YAAM,OAAO,QAAQ,sBAAsB;AAC3C,YAAM,aAAa,MAAM,WAAW,YAAY,MAAM,UAAU,KAAK,QAAQ,MAAM,UAAU,KAAK,SAAS,MAAM,UAAU,KAAK,OAAO,MAAM,UAAU,KAAK;AAC5J,UAAI,CAAC,QAAQ,SAAS,MAAM,MAAM,KAAK,WAAY,QAAO,QAAQ,KAAK,EAAE,MAAM,QAAQ,CAAC;AAAA,IAC5F;AACA,YAAQ,cAAc,iBAAiB,eAAe,OAAO;AAC7D,WAAO,MAAM,QAAQ,cAAc,oBAAoB,eAAe,OAAO;AAAA,EACjF,GAAG,CAAC,OAAO,IAAI,CAAC;AAIhB,QAAM,aAAa,MAAM,iBAAiB,MAAM,MAAM,YAAY,KAAK,CAAC,OAAO,WAAW,SAAY,GAAG,OAAO,EAAE;AAClH,QAAM,QAAQ,MAAM,YAAY,MAAM,eAAe,SAAY,OAAO,MAAM,cAAc,cAAc,aAAa,aAAa;AAEpI,SAAO;AAAA,IAAC;AAAA;AAAA,MAAQ,GAAG;AAAA,MAAO,KAAK,CAAC,SAAS;AACrC,eAAO,UAAU;AACjB,YAAI,OAAO,QAAQ,WAAY,KAAI,IAAI;AAAA,iBAAY,IAAK,KAAI,UAAU;AAAA,MAC1E;AAAA,MAAG,IAAI,GAAG,OAAO,EAAE;AAAA,MAAW,cAAY;AAAA,MAAO,mBAAiB;AAAA,MAAY,cAAY,OAAO,MAAM,UAAU,SAAS;AAAA,MAAW,cAAW;AAAA,MAAc,aAAU;AAAA,MACpK,WAAW,aAAa,WAAW,CAAC,UAAU;AAAE,YAAI,OAAO,MAAM,UAAU,MAAO,iBAAgB,MAAM,eAAe,KAAK;AAAA,MAAG,CAAC;AAAA,MAChI,UAAU,CAAC,UAAU;AAAE,mBAAW,KAAK;AAAG,cAAM,WAAW,MAAM;AAAkB,cAAM,eAAe;AAAG,YAAI,CAAC,SAAU,QAAO,KAAK,EAAE,MAAM,QAAQ,CAAC;AAAA,MAAG;AAAA,MAC1J,SAAS,aAAa,SAAS,MAAM;AAAE,YAAI,OAAO,KAAM,QAAO,KAAK,EAAE,MAAM,QAAQ,CAAC;AAAA,MAAG,CAAC;AAAA,MAAI,iBAAO,OAAO,WAAW;AAAA;AAAA,EAAK;AACnI,CAAC;AAED,SAAS,eAAe,EAAE,UAAU,GAAG,MAAM,GAAqH;AAC9J,QAAM,SAAS,UAAU;AACzB,SAAO,oBAAC,SAAS,MAAT,EAAe,GAAG,OAAO,OAAQ,GAAG,OAAO,OAAO,OAAO,OAAO,UAAU,OAAO,QAAQ,UAAU,MAAM,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC,GAAI,sBAAY,iCAAE;AAAA,yBAAC,SAAS,QAAT,EAAgB;AAAA,0BAAC,SAAS,YAAT,EAAoB;AAAA,MAAE,oBAAC,SAAS,SAAT,EAAiB;AAAA,MAAE,oBAAC,SAAS,YAAT,EAAoB;AAAA,OAAE;AAAA,IAAkB,qBAAC,SAAS,MAAT,EAAc;AAAA,0BAAC,SAAS,YAAT,EAAoB;AAAA,MAAE,oBAAC,SAAS,UAAT,EAAkB;AAAA,OAAE;AAAA,KAAgB,GAAI;AACzV;AAEO,IAAM,aAAa,EAAE,MAAM,OAAO,OAAO,UAAU,OAAO,SAAS,UAAU,SAAS,aAAa,UAAU,aAAa,aAAa,UAAU,aAAa,YAAY,UAAU,YAAY,SAAS,SAAS,UAAU,eAAe;","names":["Label","Trigger","Popover"]}
1
+ {"version":3,"sources":["../src/date-picker.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { computeAnchorPosition, containTabFocus, transitionPicker, translations, type PlainDate, type PickerEvent } from \"chrona-core\";\nimport { Calendar, type CalendarProps } from \"./calendar\";\nimport { DateField, type DateFieldProps } from \"./date-field\";\nimport { Part, composeEvent, type PartProps } from \"./part\";\nimport { useChronaConfig } from \"./provider\";\n\nexport interface DatePickerProps extends DateFieldProps {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n modal?: boolean;\n timeZone?: string;\n firstDayOfWeek?: number;\n fixedWeeks?: boolean;\n numberOfMonths?: number;\n pagedNavigation?: boolean;\n}\n\ninterface PickerContext {\n props: DatePickerProps;\n options: DatePickerProps;\n state: { value: PlainDate | null; open: boolean };\n id: string;\n value: PlainDate | null;\n change: (value: PlainDate | null) => void;\n open: boolean;\n send: (event: PickerEvent) => void;\n trigger: { current: HTMLElement | null };\n labelled: boolean;\n registerLabel: (present: boolean) => void;\n}\n\nconst Context = React.createContext<PickerContext | null>(null);\nfunction usePicker() {\n const value = React.useContext(Context);\n if (!value) throw new Error(\"DatePicker parts must be inside DatePicker.Root.\");\n return value;\n}\n\nfunction Root({ children, asChild, className, style, ...input }: DatePickerProps & Pick<PartProps, \"children\" | \"asChild\" | \"className\" | \"style\">) {\n const picker = useDatePicker(input);\n return <Context.Provider value={picker}><Part asChild={asChild} className={className} style={style} dir={picker.props.dir} data-scope=\"date-picker\" data-part=\"root\"><DateField.Root {...picker.props} id={`${picker.id}-field`} value={picker.value} onChange={picker.change}>{children}</DateField.Root></Part></Context.Provider>;\n}\n\nexport function useDatePicker(input: DatePickerProps = {}): PickerContext {\n const props = useChronaConfig(input);\n const generatedId = React.useId();\n const id = props.id ?? generatedId;\n const [uncontrolledValue, setValue] = React.useState(props.defaultValue ?? null);\n const [uncontrolledOpen, setOpen] = React.useState(props.defaultOpen ?? false);\n const value = props.value === undefined ? uncontrolledValue : props.value;\n const open = props.open ?? uncontrolledOpen;\n const trigger = React.useRef<HTMLElement | null>(null);\n const [labelled, registerLabel] = React.useState(false);\n function change(next: PlainDate | null) {\n if (props.value === undefined) setValue(next);\n props.onChange?.(next);\n }\n function send(event: PickerEvent) {\n const result = transitionPicker({ open }, event, props);\n for (const effect of result.effects) if (effect.type === \"openChange\") {\n if (props.open === undefined) setOpen(effect.open);\n props.onOpenChange?.(effect.open);\n }\n }\n return { props, options: props, state: { value, open }, id, value, change, open, send, trigger, labelled, registerLabel };\n}\n\nconst Label = React.forwardRef<HTMLElement, PartProps>(function Label(props, ref) {\n const { registerLabel } = usePicker();\n React.useEffect(() => {\n registerLabel(true);\n return () => registerLabel(false);\n }, [registerLabel]);\n return <DateField.Label {...props} ref={ref} />;\n});\n\n/** Like the paging buttons, the trigger is labelled but has no text of its own to show. */\nfunction CalendarGlyph() {\n return <svg aria-hidden=\"true\" focusable=\"false\" viewBox=\"0 0 24 24\" width=\"1em\" height=\"1em\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" data-scope=\"date-picker\" data-part=\"trigger-icon\"><rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"2\" /><path d=\"M3 10h18M8 3v4M16 3v4\" /></svg>;\n}\n\nconst Trigger = React.forwardRef<HTMLElement, React.ComponentPropsWithoutRef<\"button\"> & { asChild?: boolean }>(function Trigger({ onClick, children, ...props }, ref) {\n const picker = usePicker();\n return <Part as=\"button\" {...props} type=\"button\" ref={(node) => {\n picker.trigger.current = node;\n if (typeof ref === \"function\") ref(node); else if (ref) ref.current = node;\n }} aria-label={props[\"aria-label\"] ?? picker.props.translations?.chooseDate ?? translations.chooseDate} aria-haspopup=\"dialog\" aria-expanded={picker.open} aria-controls={`${picker.id}-dialog`} disabled={picker.props.disabled} data-scope=\"date-picker\" data-part=\"trigger\" onClick={composeEvent(onClick, () => picker.send({ type: \"TOGGLE\" }))}>{children ?? <CalendarGlyph />}</Part>;\n});\n\nconst Popover = React.forwardRef<HTMLDialogElement, Omit<React.ComponentPropsWithoutRef<\"dialog\">, \"open\"> & { anchored?: boolean }>(function Popover({ children, anchored = true, onCancel, onClose, onKeyDown, ...props }, ref) {\n const picker = usePicker();\n const dialog = React.useRef<HTMLDialogElement | null>(null);\n const latest = React.useRef(picker);\n latest.current = picker;\n\n React.useEffect(() => {\n const element = dialog.current;\n if (!element) return;\n if (picker.open && !element.open) {\n if (picker.props.modal === false) element.show(); else element.showModal();\n element.querySelector<HTMLElement>('[data-part=\"cell-trigger\"][tabindex=\"0\"]')?.focus();\n } else if (!picker.open && element.open) {\n element.close();\n picker.trigger.current?.focus();\n }\n }, [picker.open, picker.props.modal, picker.trigger]);\n\n React.useEffect(() => {\n if (!picker.open || !anchored) return;\n const element = dialog.current;\n const anchor = picker.trigger.current;\n const window = element?.ownerDocument.defaultView;\n if (!element || !anchor || !window) return;\n const properties = [\"position\", \"margin\", \"top\", \"left\", \"max-width\", \"max-height\", \"min-width\", \"min-height\", \"box-sizing\", \"overflow\"];\n const original = properties.map((property) => ({ property, value: element.style.getPropertyValue(property), priority: element.style.getPropertyPriority(property) }));\n const originalPlacement = element.getAttribute(\"data-placement\");\n const position = () => {\n const viewport = window.visualViewport;\n const width = viewport?.width ?? element.ownerDocument.documentElement.clientWidth;\n const height = viewport?.height ?? element.ownerDocument.documentElement.clientHeight;\n const offsetTop = viewport?.offsetTop ?? 0;\n const offsetLeft = viewport?.offsetLeft ?? 0;\n Object.assign(element.style, {\n position: \"fixed\", margin: \"0\", boxSizing: \"border-box\", overflow: \"auto\",\n minWidth: \"0\", minHeight: \"0\", maxWidth: `${Math.max(0, width - 8)}px`, maxHeight: `${Math.max(0, height - 8)}px`,\n });\n const rect = anchor.getBoundingClientRect();\n const { top, left, placement } = computeAnchorPosition(\n { top: rect.top - offsetTop, left: rect.left - offsetLeft, width: rect.width, height: rect.height },\n { width: element.offsetWidth, height: element.offsetHeight }, { width, height },\n );\n Object.assign(element.style, { top: `${top + offsetTop}px`, left: `${left + offsetLeft}px` });\n element.setAttribute(\"data-placement\", placement);\n };\n position();\n let frame: number | undefined;\n const schedulePosition = () => {\n if (frame !== undefined) return;\n frame = window.requestAnimationFrame(() => {\n frame = undefined;\n position();\n });\n };\n const observer = window.ResizeObserver ? new window.ResizeObserver(schedulePosition) : undefined;\n observer?.observe(element);\n observer?.observe(anchor);\n window.addEventListener(\"resize\", schedulePosition);\n window.addEventListener(\"scroll\", schedulePosition, true);\n window.visualViewport?.addEventListener(\"resize\", schedulePosition);\n window.visualViewport?.addEventListener(\"scroll\", schedulePosition);\n return () => {\n if (frame !== undefined) window.cancelAnimationFrame(frame);\n observer?.disconnect();\n window.removeEventListener(\"resize\", schedulePosition);\n window.removeEventListener(\"scroll\", schedulePosition, true);\n window.visualViewport?.removeEventListener(\"resize\", schedulePosition);\n window.visualViewport?.removeEventListener(\"scroll\", schedulePosition);\n for (const { property, value, priority } of original) {\n if (value) element.style.setProperty(property, value, priority);\n else element.style.removeProperty(property);\n }\n if (originalPlacement === null) element.removeAttribute(\"data-placement\");\n else element.setAttribute(\"data-placement\", originalPlacement);\n };\n }, [picker.open, anchored, picker.trigger]);\n\n React.useEffect(() => {\n const element = dialog.current;\n if (!picker.open || !element) return;\n const dismiss = (event: PointerEvent) => {\n if (!(event.target instanceof Node) || latest.current.trigger.current?.contains(event.target)) return;\n const rect = element.getBoundingClientRect();\n const onBackdrop = event.target === element && (event.clientX < rect.left || event.clientX > rect.right || event.clientY < rect.top || event.clientY > rect.bottom);\n if (!element.contains(event.target) || onBackdrop) latest.current.send({ type: \"CLOSE\" });\n };\n element.ownerDocument.addEventListener(\"pointerdown\", dismiss);\n return () => element.ownerDocument.removeEventListener(\"pointerdown\", dismiss);\n }, [picker.open]);\n\n // aria-labelledby wins wherever both are present, so the fallback name is only applied when\n // nothing else names the dialog.\n const labelledBy = props[\"aria-labelledby\"] ?? (props[\"aria-label\"] || !picker.labelled ? undefined : `${picker.id}-field-label`);\n const label = props[\"aria-label\"] ?? (labelledBy === undefined ? picker.props.translations?.chooseDate ?? translations.chooseDate : undefined);\n\n return <dialog {...props} ref={(node) => {\n dialog.current = node;\n if (typeof ref === \"function\") ref(node); else if (ref) ref.current = node;\n }} id={`${picker.id}-dialog`} aria-label={label} aria-labelledby={labelledBy} aria-modal={picker.props.modal !== false || undefined} data-scope=\"date-picker\" data-part=\"popover\"\n onKeyDown={composeEvent(onKeyDown, (event) => { if (picker.props.modal !== false) containTabFocus(event.currentTarget, event); })}\n onCancel={(event) => { onCancel?.(event); const canceled = event.defaultPrevented; event.preventDefault(); if (!canceled) picker.send({ type: \"CLOSE\" }); }}\n onClose={composeEvent(onClose, () => { if (picker.open) picker.send({ type: \"CLOSE\" }); })}>{picker.open ? children : null}</dialog>;\n});\n\nfunction PickerCalendar({ children, ...props }: Omit<CalendarProps, \"value\" | \"defaultValue\" | \"onChange\"> & Pick<PartProps, \"children\" | \"className\" | \"style\">) {\n const picker = usePicker();\n return <Calendar.Root {...picker.props} {...props} value={picker.value} onChange={picker.change} onSelect={() => picker.send({ type: \"SELECT\" })}>{children ?? <><Calendar.Header><Calendar.PrevButton /><Calendar.Heading /><Calendar.NextButton /></Calendar.Header><Calendar.Grid><Calendar.GridHeader /><Calendar.GridBody /></Calendar.Grid></>}</Calendar.Root>;\n}\n\nexport const DatePicker = { Root, Label, Field: DateField.Field, Segment: DateField.Segment, HiddenInput: DateField.HiddenInput, ClearButton: DateField.ClearButton, LiveRegion: DateField.LiveRegion, Trigger, Popover, Calendar: PickerCalendar };"],"mappings":"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","names":["Label","Trigger","Popover"]}
@@ -1,9 +1,10 @@
1
+ "use client";
1
2
  import {
2
3
  DateField,
3
4
  useDateField
4
- } from "./chunk-2GZMCFFY.js";
5
- import "./chunk-JNQXKZO3.js";
6
- import "./chunk-GN2YCKFZ.js";
5
+ } from "./chunk-RTDRFDYG.js";
6
+ import "./chunk-27APJXNX.js";
7
+ import "./chunk-SDDSKOYU.js";
7
8
  export {
8
9
  DateField,
9
10
  useDateField
@@ -1,11 +1,12 @@
1
+ "use client";
1
2
  import {
2
3
  DatePicker,
3
4
  useDatePicker
4
- } from "./chunk-U4LLSRIH.js";
5
- import "./chunk-2GZMCFFY.js";
6
- import "./chunk-RCWVBOO6.js";
7
- import "./chunk-JNQXKZO3.js";
8
- import "./chunk-GN2YCKFZ.js";
5
+ } from "./chunk-YMCXDNWB.js";
6
+ import "./chunk-RTDRFDYG.js";
7
+ import "./chunk-I46LC4EZ.js";
8
+ import "./chunk-27APJXNX.js";
9
+ import "./chunk-SDDSKOYU.js";
9
10
  export {
10
11
  DatePicker,
11
12
  useDatePicker
package/dist/index.js CHANGED
@@ -1,28 +1,29 @@
1
+ "use client";
1
2
  import {
2
3
  DatePicker,
3
4
  useDatePicker
4
- } from "./chunk-U4LLSRIH.js";
5
+ } from "./chunk-YMCXDNWB.js";
5
6
  import {
6
7
  DateField,
7
8
  useDateField
8
- } from "./chunk-2GZMCFFY.js";
9
+ } from "./chunk-RTDRFDYG.js";
9
10
  import {
10
11
  RangeCalendar,
11
12
  useRangeCalendar
12
- } from "./chunk-QQANBK5G.js";
13
+ } from "./chunk-GXQA645Q.js";
13
14
  import {
14
15
  Calendar,
15
16
  CalendarRoot,
16
17
  useCalendar
17
- } from "./chunk-RCWVBOO6.js";
18
+ } from "./chunk-I46LC4EZ.js";
18
19
  import {
19
20
  TimeField,
20
21
  useTimeField
21
- } from "./chunk-ROJQDSGQ.js";
22
- import "./chunk-JNQXKZO3.js";
22
+ } from "./chunk-WMHLPJBG.js";
23
+ import "./chunk-27APJXNX.js";
23
24
  import {
24
25
  ChronaProvider
25
- } from "./chunk-GN2YCKFZ.js";
26
+ } from "./chunk-SDDSKOYU.js";
26
27
  export {
27
28
  Calendar,
28
29
  CalendarRoot,
@@ -1,9 +1,10 @@
1
+ "use client";
1
2
  import {
2
3
  RangeCalendar,
3
4
  useRangeCalendar
4
- } from "./chunk-QQANBK5G.js";
5
- import "./chunk-RCWVBOO6.js";
6
- import "./chunk-GN2YCKFZ.js";
5
+ } from "./chunk-GXQA645Q.js";
6
+ import "./chunk-I46LC4EZ.js";
7
+ import "./chunk-SDDSKOYU.js";
7
8
  export {
8
9
  RangeCalendar,
9
10
  useRangeCalendar
@@ -1,9 +1,10 @@
1
+ "use client";
1
2
  import {
2
3
  TimeField,
3
4
  useTimeField
4
- } from "./chunk-ROJQDSGQ.js";
5
- import "./chunk-JNQXKZO3.js";
6
- import "./chunk-GN2YCKFZ.js";
5
+ } from "./chunk-WMHLPJBG.js";
6
+ import "./chunk-27APJXNX.js";
7
+ import "./chunk-SDDSKOYU.js";
7
8
  export {
8
9
  TimeField,
9
10
  useTimeField
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "chrona-react",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Headless Temporal-native React date and time primitives",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -61,7 +61,7 @@
61
61
  }
62
62
  },
63
63
  "dependencies": {
64
- "chrona-core": "^0.2.0"
64
+ "chrona-core": "^0.3.0"
65
65
  },
66
66
  "peerDependencies": {
67
67
  "react": ">=18.0.0",
@@ -71,6 +71,6 @@
71
71
  "access": "public"
72
72
  },
73
73
  "scripts": {
74
- "build": "tsup src/index.ts src/calendar.tsx src/date-field.tsx src/time-field.tsx src/date-picker.tsx src/range-calendar.tsx --format esm --dts --sourcemap --clean --target es2022 --external react --external react-dom"
74
+ "build": "tsup"
75
75
  }
76
76
  }
@@ -1,142 +0,0 @@
1
- import * as temporal_spec from 'temporal-spec';
2
- import { P as PartProps, H as HiddenInputProps, C as ChronaConfig } from './form-BCAGbNh-.js';
3
- import * as chrona_core from 'chrona-core';
4
- import { CalendarOptions, PlainDate, CalendarEvent } from 'chrona-core';
5
- import * as React from 'react';
6
-
7
- interface CalendarProps extends CalendarOptions {
8
- defaultValue?: PlainDate | null;
9
- defaultFocusedValue?: PlainDate;
10
- onChange?: (value: PlainDate | null) => void;
11
- onSelect?: (value: PlainDate) => void;
12
- onFocusedValueChange?: (value: PlainDate) => void;
13
- id?: string;
14
- }
15
- declare function useCalendar(props?: CalendarProps): {
16
- state: chrona_core.CalendarState;
17
- options: CalendarProps & ChronaConfig;
18
- send: (event: CalendarEvent) => void;
19
- rootRef: React.RefObject<HTMLElement | null>;
20
- announcement: string;
21
- api: {
22
- getRootProps: () => {
23
- dir: "ltr" | "rtl" | undefined;
24
- "data-disabled": string | undefined;
25
- "data-readonly": string | undefined;
26
- "data-scope": string;
27
- "data-part": string;
28
- };
29
- getGridProps: (month?: temporal_spec.Temporal.PlainDate) => {
30
- role: "grid";
31
- "aria-label": string;
32
- "aria-readonly": true | undefined;
33
- "aria-disabled": true | undefined;
34
- "data-scope": string;
35
- "data-part": string;
36
- };
37
- getCellProps: (date: PlainDate, month?: temporal_spec.Temporal.PlainDate) => {
38
- "data-date": string;
39
- "data-selected": string | undefined;
40
- "data-focused": string | undefined;
41
- "data-disabled": string | undefined;
42
- "data-unavailable": string | undefined;
43
- "data-outside-month": string | undefined;
44
- "data-today": string | undefined;
45
- role: "gridcell";
46
- "aria-selected": boolean;
47
- "aria-disabled": true | undefined;
48
- "data-scope": string;
49
- "data-part": string;
50
- };
51
- getCellTriggerProps: (date: PlainDate, month?: temporal_spec.Temporal.PlainDate) => {
52
- "data-date": string;
53
- "data-selected": string | undefined;
54
- "data-focused": string | undefined;
55
- "data-disabled": string | undefined;
56
- "data-unavailable": string | undefined;
57
- "data-outside-month": string | undefined;
58
- "data-today": string | undefined;
59
- id: string;
60
- type: "button";
61
- tabIndex: number;
62
- "aria-label": string;
63
- "aria-disabled": true | undefined;
64
- "aria-current": "date" | undefined;
65
- "data-scope": string;
66
- "data-part": string;
67
- };
68
- getPrevButtonProps: () => {
69
- type: "button";
70
- "aria-label": string;
71
- disabled: boolean;
72
- "data-scope": string;
73
- "data-part": string;
74
- };
75
- getNextButtonProps: () => {
76
- type: "button";
77
- "aria-label": string;
78
- disabled: boolean;
79
- "data-scope": string;
80
- "data-part": string;
81
- };
82
- };
83
- months: temporal_spec.Temporal.PlainDate[];
84
- };
85
- type CalendarContextValue = ReturnType<typeof useCalendar>;
86
- declare function CalendarRoot({ children, asChild, className, style, ...props }: CalendarProps & Pick<PartProps, "children" | "asChild" | "className" | "style">): React.JSX.Element;
87
- declare function CalendarSurface({ calendar, ...props }: PartProps & {
88
- calendar: CalendarContextValue;
89
- }): React.JSX.Element;
90
- interface Weekday {
91
- date: PlainDate;
92
- label: string;
93
- }
94
- declare function HiddenInput(props: HiddenInputProps): React.JSX.Element;
95
- declare const Calendar: {
96
- Root: typeof CalendarRoot;
97
- Header: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLElement> & {
98
- asChild?: boolean;
99
- } & React.RefAttributes<HTMLElement>>;
100
- Heading: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLElement> & {
101
- asChild?: boolean;
102
- } & React.RefAttributes<HTMLElement>>;
103
- PrevButton: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & {
104
- asChild?: boolean;
105
- } & React.RefAttributes<HTMLElement>>;
106
- NextButton: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & {
107
- asChild?: boolean;
108
- } & React.RefAttributes<HTMLElement>>;
109
- Grid: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLElement> & {
110
- asChild?: boolean;
111
- } & {
112
- monthIndex?: number;
113
- } & React.RefAttributes<HTMLElement>>;
114
- GridHeader: React.ForwardRefExoticComponent<Omit<PartProps, "children"> & {
115
- children?: (day: Weekday) => React.ReactNode;
116
- } & React.RefAttributes<HTMLElement>>;
117
- HeaderCell: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLElement> & {
118
- asChild?: boolean;
119
- } & {
120
- day: Weekday;
121
- } & React.RefAttributes<HTMLElement>>;
122
- GridBody: React.ForwardRefExoticComponent<Omit<PartProps, "children"> & {
123
- children?: (date: PlainDate) => React.ReactNode;
124
- } & React.RefAttributes<HTMLElement>>;
125
- Cell: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLElement> & {
126
- asChild?: boolean;
127
- } & {
128
- date: PlainDate;
129
- } & React.RefAttributes<HTMLElement>>;
130
- CellTrigger: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & {
131
- asChild?: boolean;
132
- } & React.RefAttributes<HTMLElement>>;
133
- LiveRegion: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLElement> & {
134
- asChild?: boolean;
135
- } & React.RefAttributes<HTMLElement>>;
136
- ClearButton: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & {
137
- asChild?: boolean;
138
- } & React.RefAttributes<HTMLElement>>;
139
- HiddenInput: typeof HiddenInput;
140
- };
141
-
142
- export { Calendar, type CalendarProps, CalendarRoot, CalendarSurface, type Weekday, useCalendar };
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/field.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { connectField, createField, createStore, digitValue, fieldHourCycle, transitionField, translations, type FieldEvent, type FieldInvalidReason, type FieldKind, type FieldOptions, type FieldValue, type SegmentType } from \"chrona-core\";\nimport { Part, composeEvent, type PartProps } from \"./part\";\nimport { useChronaConfig } from \"./provider\";\nimport { useFormReset, type HiddenInputProps } from \"./form\";\n\nexport interface FieldProps<Kind extends FieldKind> extends FieldOptions<Kind> {\n defaultValue?: FieldValue<Kind> | null;\n onChange?: (value: FieldValue<Kind> | null) => void;\n onInvalid?: (reason: FieldInvalidReason) => void;\n id?: string;\n describedBy?: string;\n}\n\nfunction equalValues(first: { equals: (other: never) => boolean } | null, second: { equals: (other: never) => boolean } | null) {\n return first === null || second === null ? first === second : first.equals(second as never);\n}\n\nexport function useField<Kind extends FieldKind>(kind: Kind, props: FieldProps<Kind>) {\n const options = useChronaConfig(props);\n const generatedId = React.useId();\n const id = props.id ?? generatedId;\n const [store] = React.useState(() => createStore(createField(kind, { ...options, value: props.value !== undefined ? props.value : props.defaultValue })));\n const snapshot = React.useSyncExternalStore(store.subscribe, store.getSnapshot, store.getServerSnapshot);\n const value = props.value !== undefined ? props.value : snapshot.value;\n const placeholderValue = options.placeholderValue ?? snapshot.reference;\n const { minValue, maxValue, locale, hourCycle, granularity } = options;\n const configured = React.useMemo(() => createField(kind, { value, placeholderValue, minValue, maxValue, locale, hourCycle, granularity }), [kind, value, placeholderValue, minValue, maxValue, locale, hourCycle, granularity]);\n const cycle = fieldHourCycle(options);\n const configuration = `${cycle}:${props.granularity ?? \"minute\"}`;\n const previousConfiguration = React.useRef(configuration);\n const state = props.value !== undefined && !equalValues(snapshot.value, props.value)\n ? configured\n : kind === \"time\" && configuration !== previousConfiguration.current\n ? configured\n : snapshot;\n React.useEffect(() => {\n if (previousConfiguration.current !== configuration) {\n previousConfiguration.current = configuration;\n store.setState(state);\n }\n }, [configuration, state, store]);\n const groupRef = React.useRef<HTMLElement | null>(null);\n const [invalidReason, setInvalidReason] = React.useState<FieldInvalidReason | null>(null);\n const announcementKey = { range: \"invalidRange\", unavailable: \"unavailable\", nonexistent: \"nonexistentDate\" } as const;\n const announcement = invalidReason === null ? \"\" : options.translations?.[announcementKey[invalidReason]] ?? translations[announcementKey[invalidReason]];\n\n function moveFocus(segment: SegmentType, offset: number) {\n const elements = Array.from(groupRef.current?.querySelectorAll<HTMLInputElement>(\"input[data-segment]\") ?? []);\n const index = elements.findIndex((element) => element.dataset.segment === segment);\n elements[index + offset]?.focus();\n }\n\n function send(event: FieldEvent) {\n const result = transitionField(state, event, options);\n store.setState(result.state);\n if (!result.state.invalid) setInvalidReason(null);\n for (const effect of result.effects) {\n if (effect.type === \"change\") props.onChange?.(effect.value);\n if (effect.type === \"invalid\") { setInvalidReason(effect.reason); props.onInvalid?.(effect.reason); }\n if (effect.type === \"advance\") queueMicrotask(() => moveFocus(effect.segment, 1));\n }\n }\n\n function reset() {\n setInvalidReason(null);\n const value = props.defaultValue ?? null;\n store.setState(createField(kind, { ...options, value }));\n if (!equalValues(state.value, value)) props.onChange?.(value);\n }\n\n const [labelled, setLabelled] = React.useState(false);\n return { id, state, options, send, reset, moveFocus, groupRef, announcement, registerLabel: setLabelled, api: connectField(state, { ...options, id, labelId: labelled ? `${id}-label` : undefined }) };\n}\n\nexport function createFieldComponents<Kind extends FieldKind>(kind: Kind) {\n const Context = React.createContext<ReturnType<typeof useField<Kind>> | null>(null);\n function useContext() {\n const context = React.useContext(Context);\n if (!context) throw new Error(`${kind === \"date\" ? \"DateField\" : \"TimeField\"} parts must be inside their Root.`);\n return context;\n }\n\n function Root({ children, asChild, className, style, ...props }: FieldProps<Kind> & Pick<PartProps, \"children\" | \"asChild\" | \"className\" | \"style\">) {\n const context = useField(kind, props);\n return <Context.Provider value={context}><Part asChild={asChild} className={className} style={style} id={props.id} dir={context.options.dir} data-scope={`${kind}-field`} data-part=\"root\">{children}</Part></Context.Provider>;\n }\n\n const Label = React.forwardRef<HTMLElement, PartProps>(function Label(props, ref) {\n const { id, registerLabel } = useContext();\n React.useEffect(() => {\n registerLabel(true);\n return () => registerLabel(false);\n }, [registerLabel]);\n return <Part as=\"span\" {...props} ref={ref} id={`${id}-label`} data-scope={`${kind}-field`} data-part=\"label\" />;\n });\n\n const Segment = React.forwardRef<HTMLInputElement, Omit<React.ComponentPropsWithoutRef<\"input\">, \"type\" | \"value\" | \"defaultValue\" | \"onChange\" | \"children\"> & { type: SegmentType }>(function Segment({ type, onKeyDown, onFocus, onBlur, onPaste, onDrop, ...props }, ref) {\n const { state, api, options, send, moveFocus, groupRef } = useContext();\n if (!(type in state.parts)) throw new Error(`The ${type} segment is not enabled in this field.`);\n const { display, ...segmentProps } = api.getSegmentProps(type);\n return <input {...props} {...segmentProps} ref={ref} type=\"text\" inputMode={type === \"dayPeriod\" ? \"text\" : \"numeric\"} autoComplete=\"off\" spellCheck={false} value={display} disabled={options.disabled} readOnly={options.readOnly}\n onFocus={composeEvent(onFocus, (event) => { event.currentTarget.select(); })}\n onBlur={composeEvent(onBlur, () => send({ type: \"BLUR\" }))}\n onPaste={composeEvent(onPaste, (event) => event.preventDefault())}\n onDrop={composeEvent(onDrop, (event) => event.preventDefault())}\n onChange={(event) => {\n const native = event.nativeEvent as InputEvent;\n const digit = digitValue(native.data ?? \"\", options.locale);\n event.currentTarget.value = display;\n if (native.inputType === \"insertText\" && digit !== null) send({ type: \"DIGIT\", segment: type, digit });\n else if (native.inputType === \"deleteContentBackward\" || native.inputType === \"deleteContentForward\") send({ type: \"CLEAR\", segment: type });\n }}\n onKeyDown={composeEvent(onKeyDown, (event) => {\n if (event.altKey || event.ctrlKey || event.metaKey || event.nativeEvent.isComposing) return;\n const digit = digitValue(event.key, options.locale);\n const dir = options.dir ?? (groupRef.current?.closest(\"[dir]\")?.getAttribute(\"dir\") === \"rtl\" ? \"rtl\" : \"ltr\");\n if (digit !== null) { event.preventDefault(); send({ type: \"DIGIT\", segment: type, digit }); return; }\n switch (event.key) {\n case \"ArrowUp\": case \"ArrowDown\": event.preventDefault(); send({ type: \"STEP\", segment: type, direction: event.key === \"ArrowUp\" ? 1 : -1 }); break;\n case \"Home\": case \"End\": event.preventDefault(); send({ type: \"EDGE\", segment: type, edge: event.key === \"Home\" ? \"min\" : \"max\" }); break;\n case \"Backspace\": case \"Delete\": event.preventDefault(); send({ type: \"CLEAR\", segment: type }); break;\n case \"ArrowLeft\": case \"ArrowRight\": event.preventDefault(); moveFocus(type, (event.key === \"ArrowRight\" ? 1 : -1) * (dir === \"rtl\" ? -1 : 1)); break;\n default:\n if (type === \"dayPeriod\" && [\"a\", \"p\"].includes(event.key.toLowerCase())) {\n event.preventDefault(); send({ type: \"PERIOD\", value: event.key.toLowerCase() === \"a\" ? 0 : 1 });\n }\n }\n })} />;\n });\n\n const Field = React.forwardRef<HTMLElement, PartProps>(function Field({ children, ...props }, ref) {\n const { api, groupRef } = useContext();\n return <Part {...props} {...api.getGroupProps()} ref={(node) => {\n groupRef.current = node;\n if (typeof ref === \"function\") ref(node); else if (ref) ref.current = node;\n }}>{children ?? api.segments.map((segment, index) => segment.type === \"literal\" ? <span key={index} aria-hidden=\"true\" data-scope={`${kind}-field`} data-part=\"literal\">{segment.value}</span> : <Segment key={segment.type} type={segment.type} />)}</Part>;\n });\n\n function HiddenInput(props: HiddenInputProps) {\n const { state, options, reset } = useContext();\n const input = React.useRef<HTMLInputElement>(null);\n useFormReset(input, props.form, reset);\n return <input {...props} ref={input} type=\"hidden\" value={state.value?.toString() ?? \"\"} disabled={options.disabled || props.disabled} data-scope={`${kind}-field`} data-part=\"hidden-input\" />;\n }\n\n const ClearButton = React.forwardRef<HTMLElement, React.ComponentPropsWithoutRef<\"button\"> & { asChild?: boolean }>(function ClearButton({ onClick, ...props }, ref) {\n const { options, send } = useContext();\n return <Part as=\"button\" {...props} ref={ref} type=\"button\" aria-label={options.translations?.clear ?? translations.clear} disabled={options.disabled || options.readOnly} data-scope={`${kind}-field`} data-part=\"clear-button\" onClick={composeEvent(onClick, () => send({ type: \"CLEAR\" }))} />;\n });\n\n const LiveRegion = React.forwardRef<HTMLElement, PartProps>(function LiveRegion(props, ref) {\n const { announcement } = useContext();\n return <Part {...props} ref={ref} role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" data-scope={`${kind}-field`} data-part=\"live-region\">{announcement}</Part>;\n });\n\n return { Root, Label, Field, Segment, HiddenInput, ClearButton, LiveRegion };\n}"],"mappings":"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","names":["value","useContext","Label","Segment","Field","ClearButton","LiveRegion"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/range-calendar.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { createRange, createStore, formatDate, getRangeCellProps, getRangeCellTriggerProps, transitionRange, translations, validateRange, type DateRange, type PlainDate, type RangeEvent } from \"chrona-core\";\nimport { Calendar, CalendarSurface, useCalendar, type CalendarProps } from \"./calendar\";\nimport { Part, composeEvent, type PartProps } from \"./part\";\nimport { useFormReset, type HiddenInputProps } from \"./form\";\nimport { useChronaConfig } from \"./provider\";\n\nexport interface RangeCalendarProps extends Omit<CalendarProps, \"value\" | \"defaultValue\" | \"onChange\"> {\n value?: DateRange | null;\n defaultValue?: DateRange | null;\n onChange?: (value: DateRange | null) => void;\n onRangeStartChange?: (value: PlainDate | null) => void;\n onInvalid?: () => void;\n}\n\nexport function useRangeCalendar(input: RangeCalendarProps = {}) {\n const props = useChronaConfig(input);\n const [store] = React.useState(() => createStore(createRange(props.value !== undefined ? props.value : props.defaultValue)));\n const snapshot = React.useSyncExternalStore(store.subscribe, store.getSnapshot, store.getServerSnapshot);\n if (props.value) validateRange(props.value);\n const state = { ...snapshot, value: props.value === undefined ? snapshot.value : props.value };\n const [announcement, setAnnouncement] = React.useState(\"\");\n function send(event: RangeEvent) {\n const result = transitionRange(state, event, props);\n store.setState(result.state);\n for (const effect of result.effects) {\n if (effect.type === \"change\") {\n props.onChange?.(effect.value);\n setAnnouncement(effect.value ? [effect.value.start, effect.value.end].map((date) => formatDate(date, props.locale, { dateStyle: \"long\" })).join(props.translations?.rangeSeparator ?? translations.rangeSeparator) : \"\");\n }\n if (effect.type === \"rangeStart\") {\n props.onRangeStartChange?.(effect.value);\n if (effect.value) setAnnouncement(formatDate(effect.value, props.locale, { dateStyle: \"long\" }));\n }\n if (effect.type === \"invalid\") { props.onInvalid?.(); setAnnouncement(props.translations?.unavailable ?? translations.unavailable); }\n }\n }\n const calendar = useCalendar({ ...props, value: null, defaultValue: null, placeholderValue: props.placeholderValue ?? state.value?.start, onChange: (date) => { if (date) send({ type: \"SELECT\", date }); }, onFocusedValueChange: (date) => { props.onFocusedValueChange?.(date); if (state.anchor) send({ type: \"PREVIEW\", date }); } });\n const baseApi = calendar.api;\n const api = {\n ...baseApi,\n getCellProps: (date: PlainDate, month?: PlainDate) => ({ ...baseApi.getCellProps(date, month), ...getRangeCellProps(state, date) }),\n getCellTriggerProps: (date: PlainDate, month?: PlainDate) => ({ ...baseApi.getCellTriggerProps(date, month), ...getRangeCellTriggerProps(state, date) }),\n };\n return {\n state, send, announcement, props, options: props, api, rootRef: calendar.rootRef, months: calendar.months,\n reset() { const value = props.defaultValue ?? null; store.setState(createRange(value)); props.onChange?.(value); },\n calendar: { ...calendar, api },\n };\n}\n\nconst Context = React.createContext<ReturnType<typeof useRangeCalendar> | null>(null);\nfunction useContext() {\n const value = React.useContext(Context);\n if (!value) throw new Error(\"RangeCalendar parts must be inside RangeCalendar.Root.\");\n return value;\n}\n\nfunction Root({ children, asChild, className, style, ...props }: RangeCalendarProps & Pick<PartProps, \"children\" | \"asChild\" | \"className\" | \"style\">) {\n const context = useRangeCalendar(props);\n return <Context.Provider value={context}><CalendarSurface calendar={context.calendar} asChild={asChild} className={className} style={style} data-scope=\"range-calendar\" onKeyDown={(event) => { if (event.key === \"Escape\" && context.state.anchor) { event.preventDefault(); context.send({ type: \"CANCEL\" }); } }}>{children}</CalendarSurface></Context.Provider>;\n}\n\nconst Cell = React.forwardRef<HTMLElement, React.ComponentPropsWithoutRef<typeof Calendar.Cell>>(function Cell({ date, onPointerEnter, ...props }, ref) {\n const { send } = useContext();\n return <Calendar.Cell {...props} ref={ref} date={date} onPointerEnter={composeEvent(onPointerEnter, () => send({ type: \"PREVIEW\", date }))} />;\n});\n\nconst GridBody = React.forwardRef<HTMLElement, React.ComponentPropsWithoutRef<typeof Calendar.GridBody>>(function GridBody({ children, ...props }, ref) {\n return <Calendar.GridBody {...props} ref={ref}>{children ?? ((date) => <Cell date={date} />)}</Calendar.GridBody>;\n});\n\nconst LiveRegion = React.forwardRef<HTMLElement, PartProps>(function LiveRegion(props, ref) {\n const { announcement } = useContext();\n return <Part {...props} ref={ref} role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" data-scope=\"range-calendar\" data-part=\"live-region\">{announcement}</Part>;\n});\n\nconst ClearButton = React.forwardRef<HTMLElement, React.ComponentPropsWithoutRef<typeof Calendar.ClearButton>>(function ClearButton({ onClick, ...props }, ref) {\n const { send, props: options } = useContext();\n return <Part as=\"button\" {...props} ref={ref} type=\"button\" disabled={options.disabled || options.readOnly} aria-label={options.translations?.clear ?? translations.clear} data-scope=\"range-calendar\" data-part=\"clear-button\" onClick={composeEvent(onClick, () => send({ type: \"CLEAR\" }))} />;\n});\n\nfunction HiddenInput({ name, form, id, disabled, ...inputProps }: HiddenInputProps & { name: string }) {\n const { state, props, reset } = useContext();\n const input = React.useRef<HTMLInputElement>(null);\n useFormReset(input, form, reset);\n return <><input {...inputProps} id={id ? `${id}-start` : undefined} ref={input} type=\"hidden\" name={`${name}.start`} form={form} value={state.value?.start.toString() ?? \"\"} disabled={props.disabled || disabled} data-scope=\"range-calendar\" data-part=\"hidden-input\" /><input {...inputProps} id={id ? `${id}-end` : undefined} type=\"hidden\" name={`${name}.end`} form={form} value={state.value?.end.toString() ?? \"\"} disabled={props.disabled || disabled} data-scope=\"range-calendar\" data-part=\"hidden-input\" /></>;\n}\n\nexport const RangeCalendar = { ...Calendar, Root, Cell, GridBody, LiveRegion, ClearButton, HiddenInput };"],"mappings":";;;;;;;;;;;;;AAAA,YAAY,WAAW;AACvB,SAAS,aAAa,aAAa,YAAY,mBAAmB,0BAA0B,iBAAiB,cAAc,qBAAsE;AA2DpJ,SA0BlC,UA1BkC,KA0BlC,YA1BkC;AA7CtC,SAAS,iBAAiB,QAA4B,CAAC,GAAG;AAC7D,QAAM,QAAQ,gBAAgB,KAAK;AACnC,QAAM,CAAC,KAAK,IAAU,eAAS,MAAM,YAAY,YAAY,MAAM,UAAU,SAAY,MAAM,QAAQ,MAAM,YAAY,CAAC,CAAC;AAC3H,QAAM,WAAiB,2BAAqB,MAAM,WAAW,MAAM,aAAa,MAAM,iBAAiB;AACvG,MAAI,MAAM,MAAO,eAAc,MAAM,KAAK;AAC1C,QAAM,QAAQ,EAAE,GAAG,UAAU,OAAO,MAAM,UAAU,SAAY,SAAS,QAAQ,MAAM,MAAM;AAC7F,QAAM,CAAC,cAAc,eAAe,IAAU,eAAS,EAAE;AACzD,WAAS,KAAK,OAAmB;AAC7B,UAAM,SAAS,gBAAgB,OAAO,OAAO,KAAK;AAClD,UAAM,SAAS,OAAO,KAAK;AAC3B,eAAW,UAAU,OAAO,SAAS;AACjC,UAAI,OAAO,SAAS,UAAU;AAC1B,cAAM,WAAW,OAAO,KAAK;AAC7B,wBAAgB,OAAO,QAAQ,CAAC,OAAO,MAAM,OAAO,OAAO,MAAM,GAAG,EAAE,IAAI,CAAC,SAAS,WAAW,MAAM,MAAM,QAAQ,EAAE,WAAW,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,cAAc,kBAAkB,aAAa,cAAc,IAAI,EAAE;AAAA,MAC3N;AACA,UAAI,OAAO,SAAS,cAAc;AAC9B,cAAM,qBAAqB,OAAO,KAAK;AACvC,YAAI,OAAO,MAAO,iBAAgB,WAAW,OAAO,OAAO,MAAM,QAAQ,EAAE,WAAW,OAAO,CAAC,CAAC;AAAA,MACnG;AACA,UAAI,OAAO,SAAS,WAAW;AAAE,cAAM,YAAY;AAAG,wBAAgB,MAAM,cAAc,eAAe,aAAa,WAAW;AAAA,MAAG;AAAA,IACxI;AAAA,EACJ;AACA,QAAM,WAAW,YAAY,EAAE,GAAG,OAAO,OAAO,MAAM,cAAc,MAAM,kBAAkB,MAAM,oBAAoB,MAAM,OAAO,OAAO,UAAU,CAAC,SAAS;AAAE,QAAI,KAAM,MAAK,EAAE,MAAM,UAAU,KAAK,CAAC;AAAA,EAAG,GAAG,sBAAsB,CAAC,SAAS;AAAE,UAAM,uBAAuB,IAAI;AAAG,QAAI,MAAM,OAAQ,MAAK,EAAE,MAAM,WAAW,KAAK,CAAC;AAAA,EAAG,EAAE,CAAC;AACzU,QAAM,UAAU,SAAS;AACzB,QAAM,MAAM;AAAA,IACR,GAAG;AAAA,IACH,cAAc,CAAC,MAAiB,WAAuB,EAAE,GAAG,QAAQ,aAAa,MAAM,KAAK,GAAG,GAAG,kBAAkB,OAAO,IAAI,EAAE;AAAA,IACjI,qBAAqB,CAAC,MAAiB,WAAuB,EAAE,GAAG,QAAQ,oBAAoB,MAAM,KAAK,GAAG,GAAG,yBAAyB,OAAO,IAAI,EAAE;AAAA,EAC1J;AACA,SAAO;AAAA,IACH;AAAA,IAAO;AAAA,IAAM;AAAA,IAAc;AAAA,IAAO,SAAS;AAAA,IAAO;AAAA,IAAK,SAAS,SAAS;AAAA,IAAS,QAAQ,SAAS;AAAA,IACnG,QAAQ;AAAE,YAAM,QAAQ,MAAM,gBAAgB;AAAM,YAAM,SAAS,YAAY,KAAK,CAAC;AAAG,YAAM,WAAW,KAAK;AAAA,IAAG;AAAA,IACjH,UAAU,EAAE,GAAG,UAAU,IAAI;AAAA,EACjC;AACJ;AAEA,IAAM,UAAgB,oBAA0D,IAAI;AACpF,SAASA,cAAa;AAClB,QAAM,QAAc,iBAAW,OAAO;AACtC,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,wDAAwD;AACpF,SAAO;AACX;AAEA,SAAS,KAAK,EAAE,UAAU,SAAS,WAAW,OAAO,GAAG,MAAM,GAAyF;AACnJ,QAAM,UAAU,iBAAiB,KAAK;AACtC,SAAO,oBAAC,QAAQ,UAAR,EAAiB,OAAO,SAAS,8BAAC,mBAAgB,UAAU,QAAQ,UAAU,SAAkB,WAAsB,OAAc,cAAW,kBAAiB,WAAW,CAAC,UAAU;AAAE,QAAI,MAAM,QAAQ,YAAY,QAAQ,MAAM,QAAQ;AAAE,YAAM,eAAe;AAAG,cAAQ,KAAK,EAAE,MAAM,SAAS,CAAC;AAAA,IAAG;AAAA,EAAE,GAAI,UAAS,GAAkB;AACrV;AAEA,IAAM,OAAa,iBAA8E,SAASC,MAAK,EAAE,MAAM,gBAAgB,GAAG,MAAM,GAAG,KAAK;AACpJ,QAAM,EAAE,KAAK,IAAID,YAAW;AAC5B,SAAO,oBAAC,SAAS,MAAT,EAAe,GAAG,OAAO,KAAU,MAAY,gBAAgB,aAAa,gBAAgB,MAAM,KAAK,EAAE,MAAM,WAAW,KAAK,CAAC,CAAC,GAAG;AAChJ,CAAC;AAED,IAAM,WAAiB,iBAAkF,SAASE,UAAS,EAAE,UAAU,GAAG,MAAM,GAAG,KAAK;AACpJ,SAAO,oBAAC,SAAS,UAAT,EAAmB,GAAG,OAAO,KAAW,uBAAa,CAAC,SAAS,oBAAC,QAAK,MAAY,IAAI;AACjG,CAAC;AAED,IAAM,aAAmB,iBAAmC,SAASC,YAAW,OAAO,KAAK;AACxF,QAAM,EAAE,aAAa,IAAIH,YAAW;AACpC,SAAO,oBAAC,QAAM,GAAG,OAAO,KAAU,MAAK,UAAS,aAAU,UAAS,eAAY,QAAO,cAAW,kBAAiB,aAAU,eAAe,wBAAa;AAC5J,CAAC;AAED,IAAM,cAAoB,iBAAqF,SAASI,aAAY,EAAE,SAAS,GAAG,MAAM,GAAG,KAAK;AAC5J,QAAM,EAAE,MAAM,OAAO,QAAQ,IAAIJ,YAAW;AAC5C,SAAO,oBAAC,QAAK,IAAG,UAAU,GAAG,OAAO,KAAU,MAAK,UAAS,UAAU,QAAQ,YAAY,QAAQ,UAAU,cAAY,QAAQ,cAAc,SAAS,aAAa,OAAO,cAAW,kBAAiB,aAAU,gBAAe,SAAS,aAAa,SAAS,MAAM,KAAK,EAAE,MAAM,QAAQ,CAAC,CAAC,GAAG;AACnS,CAAC;AAED,SAAS,YAAY,EAAE,MAAM,MAAM,IAAI,UAAU,GAAG,WAAW,GAAwC;AACnG,QAAM,EAAE,OAAO,OAAO,MAAM,IAAIA,YAAW;AAC3C,QAAM,QAAc,aAAyB,IAAI;AACjD,eAAa,OAAO,MAAM,KAAK;AAC/B,SAAO,iCAAE;AAAA,wBAAC,WAAO,GAAG,YAAY,IAAI,KAAK,GAAG,EAAE,WAAW,QAAW,KAAK,OAAO,MAAK,UAAS,MAAM,GAAG,IAAI,UAAU,MAAY,OAAO,MAAM,OAAO,MAAM,SAAS,KAAK,IAAI,UAAU,MAAM,YAAY,UAAU,cAAW,kBAAiB,aAAU,gBAAe;AAAA,IAAE,oBAAC,WAAO,GAAG,YAAY,IAAI,KAAK,GAAG,EAAE,SAAS,QAAW,MAAK,UAAS,MAAM,GAAG,IAAI,QAAQ,MAAY,OAAO,MAAM,OAAO,IAAI,SAAS,KAAK,IAAI,UAAU,MAAM,YAAY,UAAU,cAAW,kBAAiB,aAAU,gBAAe;AAAA,KAAE;AAC7f;AAEO,IAAM,gBAAgB,EAAE,GAAG,UAAU,MAAM,MAAM,UAAU,YAAY,aAAa,YAAY;","names":["useContext","Cell","GridBody","LiveRegion","ClearButton"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/calendar.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { calendarKeys, connectCalendar, createCalendar, createStore, formatDate, getNumberFormatter, resolveWeekStart, sameDate, syncCalendar, temporal, transitionCalendar, translations, weeksInMonthView, type CalendarEvent, type CalendarOptions, type PlainDate } from \"chrona-core\";\nimport { Part, composeEvent, type PartProps } from \"./part\";\nimport { useChronaConfig } from \"./provider\";\nimport { useFormReset, type HiddenInputProps } from \"./form\";\n\nexport interface CalendarProps extends CalendarOptions {\n defaultValue?: PlainDate | null;\n defaultFocusedValue?: PlainDate;\n onChange?: (value: PlainDate | null) => void;\n onSelect?: (value: PlainDate) => void;\n onFocusedValueChange?: (value: PlainDate) => void;\n id?: string;\n}\n\nexport function useCalendar(props: CalendarProps = {}) {\n const options = useChronaConfig(props);\n const generatedId = React.useId();\n const id = props.id ?? generatedId;\n const [store] = React.useState(() => createStore(createCalendar({ ...options, value: props.value !== undefined ? props.value : props.defaultValue, focusedValue: props.focusedValue ?? props.defaultFocusedValue })));\n const snapshot = React.useSyncExternalStore(store.subscribe, store.getSnapshot, store.getServerSnapshot);\n // The store is the single source of truth; controlled props are reconciled into it by syncCalendar.\n const state = syncCalendar(snapshot, { ...options, value: props.value, focusedValue: props.focusedValue });\n React.useEffect(() => { store.setState(state); });\n const rootRef = React.useRef<HTMLElement | null>(null);\n const pendingFocus = React.useRef(false);\n const [announcement, setAnnouncement] = React.useState(\"\");\n\n React.useEffect(() => {\n if (pendingFocus.current) {\n pendingFocus.current = false;\n rootRef.current?.querySelector<HTMLElement>('[data-part=\"cell-trigger\"][tabindex=\"0\"]')?.focus();\n }\n });\n\n function send(event: CalendarEvent) {\n const dir = options.dir ?? (rootRef.current?.closest(\"[dir]\")?.getAttribute(\"dir\") === \"rtl\" ? \"rtl\" : \"ltr\");\n const result = transitionCalendar(state, event, { ...options, dir });\n store.setState(result.state);\n for (const effect of result.effects) {\n if (effect.type === \"focus\") {\n pendingFocus.current = true;\n if (!sameDate(effect.value, state.focusedValue)) props.onFocusedValueChange?.(effect.value);\n } else if (effect.type === \"change\") {\n props.onChange?.(effect.value);\n setAnnouncement(effect.value ? (options.translations?.selected ?? translations.selected)(formatDate(effect.value, options.locale, { dateStyle: \"full\" })) : \"\");\n } else {\n props.onSelect?.(effect.value);\n }\n }\n }\n\n return {\n state, options, send, rootRef, announcement,\n api: connectCalendar(state, { ...options, id, today: temporal().Now.plainDateISO(options.timeZone) }),\n months: Array.from({ length: options.numberOfMonths ?? 1 }, (_, index) => state.visibleMonth.add({ months: index })),\n };\n}\n\ntype CalendarContextValue = ReturnType<typeof useCalendar>;\nconst Context = React.createContext<CalendarContextValue | null>(null);\nconst MonthContext = React.createContext<PlainDate | null>(null);\n\nfunction useContext() {\n const value = React.useContext(Context);\n if (!value) throw new Error(\"Calendar parts must be inside Calendar.Root.\");\n return value;\n}\n\nexport function CalendarRoot({ children, asChild, className, style, ...props }: CalendarProps & Pick<PartProps, \"children\" | \"asChild\" | \"className\" | \"style\">) {\n const calendar = useCalendar(props);\n return <CalendarSurface calendar={calendar} id={props.id} asChild={asChild} className={className} style={style}>{children}</CalendarSurface>;\n}\n\nexport function CalendarSurface({ calendar, ...props }: PartProps & { calendar: CalendarContextValue }) {\n return <Context.Provider value={calendar}><Part {...calendar.api.getRootProps()} {...props} ref={calendar.rootRef} /></Context.Provider>;\n}\n\nconst Header = React.forwardRef<HTMLElement, PartProps>(function Header(props, ref) {\n return <Part {...props} ref={ref} data-scope=\"calendar\" data-part=\"header\" />;\n});\n\nconst Heading = React.forwardRef<HTMLElement, PartProps>(function Heading({ children, ...props }, ref) {\n const { months, options } = useContext();\n const month = React.useContext(MonthContext);\n return <Part as=\"h2\" {...props} ref={ref} data-scope=\"calendar\" data-part=\"heading\" aria-live=\"polite\" aria-atomic=\"true\">{children ?? (month ? [month] : months).map((date) => formatDate(date, options.locale, { month: \"long\", year: \"numeric\" })).join(options.translations?.rangeSeparator ?? translations.rangeSeparator)}</Part>;\n});\n\ntype ButtonProps = React.ComponentPropsWithoutRef<\"button\"> & { asChild?: boolean };\n\n/**\n * Paging buttons carry an `aria-label` but no text, so without a default they render as blank\n * chrome for sighted users. The arrow points the way the button pages in the resolved direction.\n */\nfunction Chevron({ towards }: { towards: \"start\" | \"end\" }) {\n const points = towards === \"start\" ? \"15 4 7 12 15 20\" : \"9 4 17 12 9 20\";\n return <svg aria-hidden=\"true\" focusable=\"false\" viewBox=\"0 0 24 24\" width=\"1em\" height=\"1em\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" data-scope=\"calendar\" data-part=\"chevron\"><polyline points={points} /></svg>;\n}\n\nconst PrevButton = React.forwardRef<HTMLElement, ButtonProps>(function PrevButton({ onClick, children, ...props }, ref) {\n const { api, send, options } = useContext();\n return <Part as=\"button\" {...props} {...api.getPrevButtonProps()} ref={ref} onClick={composeEvent(onClick, () => send({ type: \"PAGE\", direction: -1 }))}>{children ?? <Chevron towards={options.dir === \"rtl\" ? \"end\" : \"start\"} />}</Part>;\n});\n\nconst NextButton = React.forwardRef<HTMLElement, ButtonProps>(function NextButton({ onClick, children, ...props }, ref) {\n const { api, send, options } = useContext();\n return <Part as=\"button\" {...props} {...api.getNextButtonProps()} ref={ref} onClick={composeEvent(onClick, () => send({ type: \"PAGE\", direction: 1 }))}>{children ?? <Chevron towards={options.dir === \"rtl\" ? \"start\" : \"end\"} />}</Part>;\n});\n\nconst Grid = React.forwardRef<HTMLElement, PartProps & { monthIndex?: number }>(function Grid({ monthIndex = 0, children, ...props }, ref) {\n const { api, months } = useContext();\n const month = months[monthIndex];\n if (!month) throw new Error(\"Calendar.Grid monthIndex is outside numberOfMonths.\");\n return <MonthContext.Provider value={month}><Part {...props} {...api.getGridProps(month)} ref={ref}>{children}</Part></MonthContext.Provider>;\n});\n\nfunction useMonth() {\n const context = useContext();\n const month = React.useContext(MonthContext) ?? context.state.visibleMonth;\n return { ...context, month, weeks: weeksInMonthView(month.toPlainYearMonth(), resolveWeekStart(context.options.locale, context.options.firstDayOfWeek), context.options.fixedWeeks) };\n}\n\nexport interface Weekday { date: PlainDate; label: string }\n\nconst GridHeader = React.forwardRef<HTMLElement, Omit<PartProps, \"children\"> & { children?: (day: Weekday) => React.ReactNode }>(function GridHeader({ children, ...props }, ref) {\n const { weeks, options } = useMonth();\n return <Part {...props} ref={ref} role=\"row\" data-scope=\"calendar\" data-part=\"grid-header\">{weeks[0]!.map((date) => {\n const day = { date, label: formatDate(date, options.locale, { weekday: \"short\" }) };\n return <React.Fragment key={date.toString()}>{children ? children(day) : <HeaderCell day={day} />}</React.Fragment>;\n })}</Part>;\n});\n\nconst HeaderCell = React.forwardRef<HTMLElement, PartProps & { day: Weekday }>(function HeaderCell({ day, children, ...props }, ref) {\n const { options } = useContext();\n return <Part {...props} ref={ref} role=\"columnheader\" aria-label={formatDate(day.date, options.locale, { weekday: \"long\" })} data-scope=\"calendar\" data-part=\"header-cell\">{children ?? day.label}</Part>;\n});\n\nconst GridBody = React.forwardRef<HTMLElement, Omit<PartProps, \"children\"> & { children?: (date: PlainDate) => React.ReactNode }>(function GridBody({ children, ...props }, ref) {\n const { weeks } = useMonth();\n return <Part {...props} ref={ref} role=\"rowgroup\" data-scope=\"calendar\" data-part=\"grid-body\">{weeks.map((week) => <div key={week[0]!.toString()} role=\"row\" data-scope=\"calendar\" data-part=\"row\">{week.map((date) => <React.Fragment key={date.toString()}>{children ? children(date) : <Cell date={date} />}</React.Fragment>)}</div>)}</Part>;\n});\n\nconst CellContext = React.createContext<PlainDate | null>(null);\n\nconst CellTrigger = React.forwardRef<HTMLElement, ButtonProps>(function CellTrigger({ children, onClick, onKeyDown, onFocus, ...props }, ref) {\n const { api, send, month, options } = useMonth();\n const date = React.useContext(CellContext);\n if (!date) throw new Error(\"Calendar.CellTrigger must be inside Calendar.Cell.\");\n // aria-disabled instead of native disabled keeps out-of-range dates discoverable by screen readers.\n return <Part as=\"button\" {...props} {...api.getCellTriggerProps(date, month)} ref={ref}\n onFocus={composeEvent(onFocus, () => { if (!options.disabled) send({ type: \"FOCUS\", date }); })}\n onClick={composeEvent(onClick, () => send({ type: \"SELECT\", date }))}\n onKeyDown={composeEvent(onKeyDown, (event) => {\n if (!calendarKeys.has(event.key) || event.altKey || event.ctrlKey || event.metaKey) return;\n event.preventDefault();\n send({ type: \"KEY_DOWN\", key: event.key, shiftKey: event.shiftKey });\n })}>{children ?? getNumberFormatter(options.locale, { useGrouping: false }).format(date.day)}</Part>;\n});\n\n/** The grid semantics live on the cell; the button inside it stays a button. */\nconst Cell = React.forwardRef<HTMLElement, PartProps & { date: PlainDate }>(function Cell({ date, children, ...props }, ref) {\n const { api, month } = useMonth();\n return <CellContext.Provider value={date}><Part {...props} {...api.getCellProps(date, month)} ref={ref}>{children ?? <CellTrigger />}</Part></CellContext.Provider>;\n});\n\nconst LiveRegion = React.forwardRef<HTMLElement, PartProps>(function LiveRegion(props, ref) {\n const { announcement } = useContext();\n return <Part {...props} ref={ref} role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" data-scope=\"calendar\" data-part=\"live-region\">{announcement}</Part>;\n});\n\nconst ClearButton = React.forwardRef<HTMLElement, ButtonProps>(function ClearButton({ onClick, ...props }, ref) {\n const { options, send, state } = useContext();\n return <Part as=\"button\" {...props} ref={ref} type=\"button\" data-scope=\"calendar\" data-part=\"clear-button\" aria-label={options.translations?.clear ?? translations.clear} disabled={options.disabled || options.readOnly || state.value === null} onClick={composeEvent(onClick, () => send({ type: \"CLEAR\" }))} />;\n});\n\nfunction HiddenInput(props: HiddenInputProps) {\n const { state, options, send } = useContext();\n const input = React.useRef<HTMLInputElement>(null);\n useFormReset(input, props.form, () => send({ type: \"RESET\", value: options.defaultValue ?? null }));\n return <input {...props} ref={input} type=\"hidden\" disabled={options.disabled || props.disabled} value={state.value?.toString() ?? \"\"} data-scope=\"calendar\" data-part=\"hidden-input\" />;\n}\n\nexport const Calendar = { Root: CalendarRoot, Header, Heading, PrevButton, NextButton, Grid, GridHeader, HeaderCell, GridBody, Cell, CellTrigger, LiveRegion, ClearButton, HiddenInput };"],"mappings":"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","names":["useContext","Header","Heading","PrevButton","NextButton","Grid","GridHeader","HeaderCell","GridBody","CellTrigger","Cell","LiveRegion","ClearButton"]}