@open-mercato/ui 0.6.6-develop.6516.1.86a8538145 → 0.6.6-develop.6520.1.55df6df792

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.
@@ -21,6 +21,11 @@ export type DatePickerProps = {
21
21
  size?: 'sm' | 'default'
22
22
  disabled?: boolean
23
23
  readOnly?: boolean
24
+ /** Controlled open state of the popover. Omit for the default uncontrolled
25
+ * behavior. Pair with `onOpenChange` to drive it externally (e.g. closing the
26
+ * picker when a surrounding dialog scrolls). */
27
+ open?: boolean
28
+ onOpenChange?: (open: boolean) => void
24
29
  /**
25
30
  * Footer mode in the popover.
26
31
  * - `'apply-cancel'` (default, Figma-aligned): selecting a day stages a draft;
@@ -88,6 +93,8 @@ export function DatePicker({
88
93
  size = 'default',
89
94
  disabled = false,
90
95
  readOnly = false,
96
+ open: controlledOpen,
97
+ onOpenChange,
91
98
  footer = 'apply-cancel',
92
99
  closeOnSelect,
93
100
  showTodayButton = true,
@@ -109,7 +116,12 @@ export function DatePicker({
109
116
  }: DatePickerProps) {
110
117
  const resolvedCloseOnSelect = closeOnSelect ?? footer === 'today-clear'
111
118
  const t = useT()
112
- const [open, setOpen] = React.useState(false)
119
+ const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false)
120
+ const open = controlledOpen ?? uncontrolledOpen
121
+ const setOpen = React.useCallback((next: boolean) => {
122
+ if (controlledOpen === undefined) setUncontrolledOpen(next)
123
+ onOpenChange?.(next)
124
+ }, [controlledOpen, onOpenChange])
113
125
  const [draft, setDraft] = React.useState<Date | null>(value ?? null)
114
126
 
115
127
  const isInteractive = !disabled && !readOnly
@@ -147,7 +159,7 @@ export function DatePicker({
147
159
  if (footer === 'none' || resolvedCloseOnSelect) setOpen(false)
148
160
  }
149
161
  },
150
- [isInteractive, withTime, useDraft, draft, value, footer, resolvedCloseOnSelect, onChange],
162
+ [isInteractive, withTime, useDraft, draft, value, footer, resolvedCloseOnSelect, onChange, setOpen],
151
163
  )
152
164
 
153
165
  const handleTimeChange = React.useCallback(
@@ -164,23 +176,23 @@ export function DatePicker({
164
176
  const handleApply = React.useCallback(() => {
165
177
  onChange(draft)
166
178
  setOpen(false)
167
- }, [draft, onChange])
179
+ }, [draft, onChange, setOpen])
168
180
 
169
181
  const handleCancel = React.useCallback(() => {
170
182
  setDraft(value ?? null)
171
183
  setOpen(false)
172
- }, [value])
184
+ }, [value, setOpen])
173
185
 
174
186
  const handleToday = React.useCallback(() => {
175
187
  const today = withTime ? new Date() : startOfDay(new Date())
176
188
  onChange(today)
177
189
  setOpen(false)
178
- }, [withTime, onChange])
190
+ }, [withTime, onChange, setOpen])
179
191
 
180
192
  const handleClear = React.useCallback(() => {
181
193
  onChange(null)
182
194
  setOpen(false)
183
- }, [onChange])
195
+ }, [onChange, setOpen])
184
196
 
185
197
  const disabledMatcher = React.useMemo(() => {
186
198
  if (!minDate && !maxDate) return undefined