chore: consolidate calendar pickers (#40052)

* chore: update react-day-picker

* fix(design system): date picker demos

* refactor(date picker): change logs date picker to use react-day-picker

* refactor(date pickers): change remaining date pickers to use react-day-picker

* cleanup(date pickers): minor code cleanup

* fix(date picker): fix behavior for single day selection
This commit is contained in:
Charis authored and GitHub committed 2025-11-03 10:10:19 -05:00
1 parent 74486d3a0a
commit 0c501d7889
20 files changed
+303 -844

No files matched your search

+2 -1
View File
@@ -29,6 +29,7 @@
"next-contentlayer2": "0.4.6",
"next-themes": "^0.3.0",
"react": "catalog:",
"react-day-picker": "^9.11.1",
"react-docgen": "^7.0.3",
"react-dom": "catalog:",
"react-hook-form": "^7.45.0",
@@ -53,8 +54,8 @@
"@types/lodash.template": "4.5.0",
"@types/react": "catalog:",
"@types/react-dom": "catalog:",
"config": "workspace:^",
"concurrently": "^8.2.2",
"config": "workspace:^",
"mdast-util-toc": "^6.1.1",
"postcss": "^8.5.3",
"rimraf": "^4.1.3",
@@ -1,13 +1,17 @@
'use client'
import * as React from 'react'
import { format } from 'date-fns'
import { Calendar as CalendarIcon } from 'lucide-react'
import * as React from 'react'
import { cn } from '@/lib/utils'
import { Button } from 'ui'
import { Calendar } from 'ui'
import { Popover_Shadcn_, PopoverContent_Shadcn_, PopoverTrigger_Shadcn_ } from 'ui'
import {
Button,
Calendar,
Popover_Shadcn_,
PopoverContent_Shadcn_,
PopoverTrigger_Shadcn_,
} from 'ui'
export default function DatePickerDemo() {
const [date, setDate] = React.useState<Date>()
@@ -21,8 +25,8 @@ export default function DatePickerDemo() {
'w-[280px] justify-start text-left font-normal',
!date && 'text-muted-foreground'
)}
icon={<CalendarIcon className="h-4 w-4" />}
>
<CalendarIcon className="mr-2 h-4 w-4" />
{date ? format(date, 'PPP') : <span>Pick a date</span>}
</Button>
</PopoverTrigger_Shadcn_>
@@ -62,9 +62,9 @@ export default function DatePickerForm() {
'w-[240px] pl-3 text-left font-normal',
!field.value && 'text-muted-foreground'
)}
icon={<CalendarIcon className="h-4 w-4 opacity-50" />}
>
{field.value ? format(field.value, 'PPP') : <span>Pick a date</span>}
<CalendarIcon className="ml-auto h-4 w-4 opacity-50" />
</Button>
</FormControl_Shadcn_>
</PopoverTrigger_Shadcn_>
@@ -1,14 +1,16 @@
'use client'
import * as React from 'react'
import { addDays, format } from 'date-fns'
import { Calendar as CalendarIcon } from 'lucide-react'
import * as React from 'react'
import { cn } from '@/lib/utils'
import { Button } from 'ui'
import { Calendar } from 'ui'
import { Popover_Shadcn_, PopoverContent_Shadcn_, PopoverTrigger_Shadcn_ } from 'ui'
import {
Button,
Calendar,
Popover_Shadcn_,
PopoverContent_Shadcn_,
PopoverTrigger_Shadcn_,
Select_Shadcn_,
SelectContent_Shadcn_,
SelectItem_Shadcn_,
@@ -28,8 +30,8 @@ export default function DatePickerWithPresets() {
'w-[280px] justify-start text-left font-normal',
!date && 'text-muted-foreground'
)}
icon={<CalendarIcon className="h-4 w-4" />}
>
<CalendarIcon className="mr-2 h-4 w-4" />
{date ? format(date, 'PPP') : <span>Pick a date</span>}
</Button>
</PopoverTrigger_Shadcn_>
@@ -1,14 +1,18 @@
'use client'
import * as React from 'react'
import { addDays, format } from 'date-fns'
import { Calendar as CalendarIcon } from 'lucide-react'
// @ts-expect-error
import * as React from 'react'
import { DateRange } from 'react-day-picker'
import { cn } from '@/lib/utils'
import { Button } from 'ui'
import { Calendar } from 'ui'
import { Popover_Shadcn_, PopoverContent_Shadcn_, PopoverTrigger_Shadcn_ } from 'ui'
import {
Button,
Calendar,
Popover_Shadcn_,
PopoverContent_Shadcn_,
PopoverTrigger_Shadcn_,
} from 'ui'
export default function DatePickerWithRange({ className }: React.HTMLAttributes<HTMLDivElement>) {
const [date, setDate] = React.useState<DateRange | undefined>({
@@ -27,8 +31,8 @@ export default function DatePickerWithRange({ className }: React.HTMLAttributes<
'w-[300px] justify-start text-left font-normal',
!date && 'text-muted-foreground'
)}
icon={<CalendarIcon className="h-4 w-4" />}
>
<CalendarIcon className="mr-2 h-4 w-4" />
{date?.from ? (
date.to ? (
<>
@@ -2,7 +2,7 @@ import { zodResolver } from '@hookform/resolvers/zod'
import dayjs from 'dayjs'
import { ExternalLink } from 'lucide-react'
import { useState } from 'react'
import { type SubmitHandler, useForm } from 'react-hook-form'
import { useForm, type SubmitHandler } from 'react-hook-form'
import { toast } from 'sonner'
import { z } from 'zod'
@@ -214,16 +214,13 @@ export const NewAccessTokenDialog = ({
selectsRange={false}
triggerButtonSize="small"
contentSide="top"
to={customExpiryDate?.date}
minDate={new Date()}
maxDate={dayjs().add(1, 'year').toDate()}
onChange={(date) => {
if (date.to) handleCustomDateChange({ date: date.to })
}}
>
{customExpiryDate
? `${dayjs(customExpiryDate.date).format('DD MMM, HH:mm')}`
: 'Select date'}
</DatePicker>
/>
)}
</div>
{field.value === NON_EXPIRING_TOKEN_VALUE && (
@@ -1,12 +1,11 @@
import { format } from 'date-fns'
import dayjs from 'dayjs'
import { ChevronLeft, ChevronRight, HelpCircle } from 'lucide-react'
import { HelpCircle } from 'lucide-react'
import { useMemo, useState } from 'react'
import DatePicker from 'react-datepicker'
import { ButtonTooltip } from 'components/ui/ButtonTooltip'
import { FormPanel } from 'components/ui/Forms/FormPanel'
import InformationBox from 'components/ui/InformationBox'
import { Calendar, cn } from 'ui'
import { Timezone } from './PITR.types'
import {
constrainDateToRange,
@@ -41,6 +40,8 @@ export function PITRForm({
const latestAvailableBackup = dayjs
.unix(latestAvailableBackupUnix ?? 0)
.tz(selectedTimezone.utc[0])
const earliestAvailableBackupAsDate = earliestAvailableBackup.toDate()
const latestAvailableBackupAsDate = latestAvailableBackup.toDate()
const [selectedDateRaw, setSelectedDateRaw] = useState<Date>(latestAvailableBackup.toDate())
@@ -125,51 +126,25 @@ export function PITRForm({
>
<div className="flex justify-between px-4 md:px-10 py-6 space-x-10">
<div className="w-1/3 space-y-2">
<DatePicker
inline
<Calendar
mode="single"
required={true}
selected={selectedDateRaw}
onChange={onUpdateDate}
dayClassName={() => 'cursor-pointer'}
minDate={earliestAvailableBackup.toDate()}
maxDate={latestAvailableBackup.toDate()}
highlightDates={availableDates.map((date) => date.toDate())}
renderCustomHeader={({
date,
decreaseMonth,
increaseMonth,
prevMonthButtonDisabled,
nextMonthButtonDisabled,
}) => (
<div className="flex items-center justify-between px-2 py-2">
<div className="flex w-full items-center justify-between">
<button
onClick={decreaseMonth}
disabled={prevMonthButtonDisabled}
type="button"
className={`
${prevMonthButtonDisabled && 'cursor-not-allowed opacity-50'}
text-foreground-light hover:text-foreground focus:outline-none
`}
>
<ChevronLeft size={16} strokeWidth={2} />
</button>
<span className="text-foreground-light text-sm">
{format(date, 'MMMM yyyy')}
</span>
<button
onClick={increaseMonth}
disabled={nextMonthButtonDisabled}
type="button"
className={`
${nextMonthButtonDisabled && 'cursor-not-allowed opacity-50'}
text-foreground-light hover:text-foreground focus:outline-none
`}
>
<ChevronRight size={16} strokeWidth={2} />
</button>
</div>
</div>
)}
onSelect={onUpdateDate}
defaultMonth={latestAvailableBackupAsDate}
startMonth={earliestAvailableBackupAsDate}
endMonth={latestAvailableBackupAsDate}
disabled={[
{ before: earliestAvailableBackupAsDate },
{ after: latestAvailableBackupAsDate },
]}
classNames={{
day: cn(
'[&:not(:has(:disabled))]:border [&:not(:has(:disabled))]:border-stronger [&:not(:last-child)]:border-r-0 [&:not(:has(:disabled))]:bg-overlay-hover',
'rounded-none'
),
selected: '!bg-brand-500',
}}
/>
{availableDates.length > 1 && (
<div className="flex items-center space-x-2">
@@ -1,8 +1,7 @@
/* eslint-disable react-hooks/exhaustive-deps */
import dayjs from 'dayjs'
import { ChevronLeft, ChevronRight, Clock, HistoryIcon } from 'lucide-react'
import { PropsWithChildren, useEffect, useRef, useState } from 'react'
import DatePicker from 'react-datepicker'
import { Clock, HistoryIcon } from 'lucide-react'
import type { PropsWithChildren } from 'react'
import { useCallback, useEffect, useState } from 'react'
import { Badge } from '@ui/components/shadcn/ui/badge'
import { Label } from '@ui/components/shadcn/ui/label'
@@ -13,6 +12,7 @@ import { useCurrentOrgPlan } from 'hooks/misc/useCurrentOrgPlan'
import {
Button,
ButtonProps,
Calendar,
PopoverContent_Shadcn_,
PopoverTrigger_Shadcn_,
Popover_Shadcn_,
@@ -50,13 +50,13 @@ export const LogsDatePicker = ({
}: PropsWithChildren<LogsDatePickerProps>) => {
const [open, setOpen] = useState(false)
const todayButtonRef = useRef<HTMLButtonElement>(null)
// Reset the state when the popover closes
useEffect(() => {
if (!open) {
setStartDate(value.from ? new Date(value.from) : null)
setEndDate(value.to ? new Date(value.to) : new Date())
const defaultEndDate = value.to ? new Date(value.to) : new Date()
setEndDate(defaultEndDate)
setCurrentMonth(new Date(defaultEndDate))
const fromDate = value.from ? new Date(value.from) : null
const toDate = value.to ? new Date(value.to) : null
@@ -96,6 +96,9 @@ export const LogsDatePicker = ({
const [startDate, setStartDate] = useState<Date | null>(value.from ? new Date(value.from) : null)
const [endDate, setEndDate] = useState<Date | null>(value.to ? new Date(value.to) : new Date())
const [currentMonth, setCurrentMonth] = useState<Date>(() =>
value.to ? new Date(value.to) : new Date()
)
const [startTime, setStartTime] = useState({
HH: startDate?.getHours().toString() || '00',
@@ -166,6 +169,7 @@ export const LogsDatePicker = ({
setStartDate(fromDate)
setEndDate(toDate)
setCurrentMonth(new Date(toDate))
// Update time states
setStartTime({
@@ -190,7 +194,7 @@ export const LogsDatePicker = ({
})
}
function handleCopy() {
const handleCopy = useCallback(() => {
if (!startDate || !endDate) return
const fromDate = new Date(startDate)
@@ -208,7 +212,7 @@ export const LogsDatePicker = ({
)
setCopied(true)
}
}, [startDate, endDate, startTime, endTime])
useEffect(() => {
if (pasted) {
@@ -227,7 +231,7 @@ export const LogsDatePicker = ({
document.removeEventListener('paste', handlePaste)
document.removeEventListener('copy', handleCopy)
}
}, [open, startDate, endDate])
}, [open, startDate, endDate, handleCopy])
const isLargeRange =
Math.abs(dayjs(startDate).diff(dayjs(endDate), 'days')) >
@@ -340,54 +344,14 @@ export const LogsDatePicker = ({
</div>
</div>
<div className="p-2 border-t">
<DatePicker
inline
selectsRange
todayButton={
<div className="sr-only">
<Button type="text" size="tiny" ref={todayButtonRef}>
Go to today
</Button>
</div>
}
onChange={(dates) => {
handleDatePickerChange(dates)
<Calendar
mode="range"
month={currentMonth}
onMonthChange={(month) => setCurrentMonth(new Date(month))}
selected={{ from: startDate ?? undefined, to: endDate ?? undefined }}
onSelect={(range) => {
handleDatePickerChange([range?.from ?? null, range?.to ?? null])
}}
dateFormat="MMMM d, yyyy h:mm aa"
dayClassName={() => 'cursor-pointer'}
startDate={startDate}
endDate={endDate}
renderCustomHeader={({
date,
decreaseMonth,
increaseMonth,
prevMonthButtonDisabled,
nextMonthButtonDisabled,
}) => (
<div className="flex items-center justify-between">
<div className="flex w-full items-center justify-between">
<Button
onClick={decreaseMonth}
disabled={prevMonthButtonDisabled}
icon={<ChevronLeft size={14} strokeWidth={2} />}
type="text"
size="tiny"
className="px-1.5"
></Button>
<span className="text-sm text-foreground-light">
{dayjs(date).format('MMMM YYYY')}
</span>
<Button
onClick={increaseMonth}
disabled={nextMonthButtonDisabled}
icon={<ChevronRight size={14} strokeWidth={2} />}
type="text"
size="tiny"
className="px-1.5"
></Button>
</div>
</div>
)}
/>
</div>
{isLargeRange && !hideWarnings && (
@@ -412,12 +376,10 @@ export const LogsDatePicker = ({
<Button
type="default"
onClick={() => {
// [Jordi]: Workaround so that if the user is in a different month, the datepicker will move the view to the current month
if (todayButtonRef.current) {
todayButtonRef.current.click()
}
setStartDate(new Date())
setEndDate(new Date())
const today = new Date()
setCurrentMonth(today)
setStartDate(new Date(today))
setEndDate(new Date(today))
}}
>
Today
@@ -70,12 +70,7 @@ export function DataTableFilterControls({ dateRangeDisabled }: DataTableFilterCo
return <DataTableFilterInput {...field} />
}
case 'timerange': {
return (
<DataTableFilterTimerange
dateRangeDisabled={dateRangeDisabled}
{...field}
/>
)
return <DataTableFilterTimerange {...field} />
}
}
})()}
@@ -1,11 +1,11 @@
import { useMemo, useState } from 'react'
import type { DateRange } from 'react-day-picker'
import {
LogsDatePicker,
DatePickerValue,
} from 'components/interfaces/Settings/Logs/Logs.DatePickers'
import { REPORTS_DATEPICKER_HELPERS } from 'components/interfaces/Reports/Reports.constants'
import {
DatePickerValue,
LogsDatePicker,
} from 'components/interfaces/Settings/Logs/Logs.DatePickers'
import { maybeShowUpgradePrompt } from 'components/interfaces/Settings/Logs/Logs.utils'
import UpgradePrompt from 'components/interfaces/Settings/Logs/UpgradePrompt'
import { useCurrentOrgPlan } from 'hooks/misc/useCurrentOrgPlan'
@@ -15,8 +15,6 @@ import { useDataTable } from '../providers/DataTableProvider'
export function DataTableFilterTimerange<TData>({
value: _value,
presets,
dateRangeDisabled,
}: DataTableTimerangeFilterField<TData>) {
const value = _value as string
const { table, columnFilters } = useDataTable()
@@ -1,271 +0,0 @@
import { format } from 'date-fns'
import { Calendar as CalendarIcon } from 'lucide-react'
import { HTMLAttributes, useEffect, useState } from 'react'
import type { DateRange } from 'react-day-picker'
import {
Button,
Calendar,
cn,
Input,
Label_Shadcn_ as Label,
Popover_Shadcn_ as Popover,
PopoverContent_Shadcn_ as PopoverContent,
PopoverSeparator_Shadcn_ as PopoverSeparator,
PopoverTrigger_Shadcn_ as PopoverTrigger,
Select_Shadcn_ as Select,
SelectContent_Shadcn_ as SelectContent,
SelectGroup_Shadcn_ as SelectGroup,
SelectItem_Shadcn_ as SelectItem,
SelectLabel_Shadcn_ as SelectLabel,
SelectTrigger_Shadcn_ as SelectTrigger,
SelectValue_Shadcn_ as SelectValue,
} from 'ui'
import { presets as defaultPresets } from './DataTable.constants'
import type { DatePreset, DateRangeDisabled } from './DataTable.types'
import { useDebounce } from './hooks/useDebounce'
import { kdbClassName } from './primitives/Kbd'
interface DatePickerWithRangeProps extends HTMLAttributes<HTMLDivElement> {
date: DateRange | undefined
setDate: (date: DateRange | undefined) => void
presets?: DatePreset[]
dateRangeDisabled?: DateRangeDisabled
}
// [Joshen] This might be better placed in ui instead of DataTable since it could be reusable
export function DatePickerWithRange({
className,
date,
setDate,
presets = defaultPresets,
dateRangeDisabled,
}: DatePickerWithRangeProps) {
const [open, setOpen] = useState(false)
useEffect(() => {
const down = (e: KeyboardEvent) => {
if (!open) return
presets.map((preset) => {
if (preset.shortcut === e.key) {
setDate({ from: preset.from, to: preset.to })
}
})
}
document.addEventListener('keydown', down)
return () => document.removeEventListener('keydown', down)
}, [setDate, presets, open])
return (
<div className={cn('grid gap-2', className)}>
<Popover open={open} onOpenChange={setOpen}>
<PopoverTrigger asChild>
<Button
id="date"
type="outline"
size="small"
className={cn(
'max-w-full justify-start truncate text-left font-normal hover:bg-muted/50',
!date && 'text-muted-foreground'
)}
icon={<CalendarIcon className="mr-2 h-4 w-4" />}
>
{date?.from ? (
date.to ? (
<span className="truncate">
{format(date.from, 'LLL dd, y')} - {format(date.to, 'LLL dd, y')}
</span>
) : (
format(date.from, 'LLL dd, y')
)
) : (
<span>Pick a date</span>
)}
</Button>
</PopoverTrigger>
<PopoverContent className="w-auto p-0" align="start" portal={true}>
<div className="flex flex-col justify-between sm:flex-row">
<div className="hidden sm:block">
<DatePresets onSelect={setDate} selected={date} presets={presets} />
</div>
<div className="block p-3 sm:hidden">
<DatePresetsSelect onSelect={setDate} selected={date} presets={presets} />
</div>
<PopoverSeparator className="h-auto w-px" />
<Calendar
initialFocus
mode="range"
defaultMonth={date?.from}
selected={date}
onSelect={setDate}
numberOfMonths={1}
// @ts-ignore
disabled={dateRangeDisabled}
/>
</div>
<PopoverSeparator />
<CustomDateRange onSelect={setDate} selected={date} />
</PopoverContent>
</Popover>
</div>
)
}
function DatePresets({
selected,
onSelect,
presets,
}: {
selected: DateRange | undefined
onSelect: (date: DateRange | undefined) => void
presets: DatePreset[]
}) {
return (
<div className="flex flex-col gap-2 p-3">
<p className="mx-3 text-xs uppercase text-muted-foreground">Date Range</p>
<div className="grid gap-1">
{presets.map(({ label, shortcut, from, to }) => {
const isActive = selected?.from === from && selected?.to === to
return (
<Button
key={label}
type={isActive ? 'secondary' : 'default'}
size="small"
onClick={() => onSelect({ from, to })}
className="text-left"
>
<div className="flex items-center justify-between gap-6">
<span className="mr-auto">{label}</span>
<span className={cn(kdbClassName, 'uppercase')}>{shortcut}</span>
</div>
</Button>
)
})}
</div>
</div>
)
}
function DatePresetsSelect({
selected,
onSelect,
presets,
}: {
selected: DateRange | undefined
onSelect: (date: DateRange | undefined) => void
presets: DatePreset[]
}) {
function findPreset(from?: Date, to?: Date) {
return presets.find((p) => p.from === from && p.to === to)?.shortcut
}
const [value, setValue] = useState<string | undefined>(findPreset(selected?.from, selected?.to))
useEffect(() => {
const preset = findPreset(selected?.from, selected?.to)
if (preset === value) return
setValue(preset)
}, [selected, presets])
return (
<Select
value={value}
onValueChange={(v) => {
const preset = presets.find((p) => p.shortcut === v)
if (preset) {
onSelect({ from: preset.from, to: preset.to })
}
}}
>
<SelectTrigger>
<SelectValue placeholder="Date Presets" />
</SelectTrigger>
<SelectContent>
<SelectGroup>
<SelectLabel>Date Presets</SelectLabel>
{presets.map(({ label, shortcut }) => {
return (
<SelectItem
key={label}
value={shortcut}
className="flex items-center justify-between [&>span:last-child]:flex [&>span:last-child]:w-full [&>span:last-child]:justify-between"
>
<span>{label}</span>
<span className={cn(kdbClassName, 'ml-2 h-5 uppercase leading-snug')}>
{shortcut}
</span>
</SelectItem>
)
})}
</SelectGroup>
</SelectContent>
</Select>
)
}
// REMINDER: We can add min max date range validation https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/datetime-local#setting_maximum_and_minimum_dates_and_times
function CustomDateRange({
selected,
onSelect,
}: {
selected: DateRange | undefined
onSelect: (date: DateRange | undefined) => void
}) {
const [dateFrom, setDateFrom] = useState<Date | undefined>(selected?.from)
const [dateTo, setDateTo] = useState<Date | undefined>(selected?.to)
const debounceDateFrom = useDebounce(dateFrom, 1000)
const debounceDateTo = useDebounce(dateTo, 1000)
const formatDateForInput = (date: Date | undefined): string => {
if (!date) return ''
const utcDate = new Date(date.getTime() - date.getTimezoneOffset() * 60000)
return utcDate.toISOString().slice(0, 16)
}
useEffect(() => {
onSelect({ from: debounceDateFrom, to: debounceDateTo })
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [debounceDateFrom, debounceDateTo])
return (
<div className="flex flex-col gap-2 p-3">
<p className="text-xs uppercase text-muted-foreground">Custom Range</p>
<div className="grid gap-2 sm:grid-cols-2">
<div className="grid w-full gap-1.5">
<Label htmlFor="from">Start</Label>
<Input
key={formatDateForInput(selected?.from)}
type="datetime-local"
id="from"
name="from"
defaultValue={formatDateForInput(selected?.from)}
onChange={(e) => {
const newDate = new Date(e.target.value)
if (!Number.isNaN(newDate.getTime())) {
setDateFrom(newDate)
}
}}
disabled={!selected?.from}
/>
</div>
<div className="grid w-full gap-1.5">
<Label htmlFor="to">End</Label>
<Input
key={formatDateForInput(selected?.to)}
type="datetime-local"
id="to"
name="to"
defaultValue={formatDateForInput(selected?.to)}
onChange={(e) => {
const newDate = new Date(e.target.value)
if (!Number.isNaN(newDate.getTime())) {
setDateTo(newDate)
}
}}
disabled={!selected?.to}
/>
</div>
</div>
</div>
)
}
+88 -55
View File
@@ -1,12 +1,12 @@
import { format } from 'date-fns'
import dayjs from 'dayjs'
import { ArrowRight, Calendar, ChevronLeft, ChevronRight } from 'lucide-react'
import { ReactNode, useEffect, useState } from 'react'
import ReactDatePicker from 'react-datepicker'
import { ArrowRight, Calendar } from 'lucide-react'
import { ReactNode, useCallback, useEffect, useMemo, useState } from 'react'
import type { DatePickerToFrom } from 'components/interfaces/Settings/Logs/Logs.types'
import {
Button,
Calendar as CalendarPicker,
Popover,
PopoverContent_Shadcn_,
PopoverTrigger_Shadcn_,
@@ -39,6 +39,22 @@ const END_DATE_DEFAULT = new Date()
const START_TIME_DEFAULT = { HH: '00', mm: '00', ss: '00' }
const END_TIME_DEFAULT = { HH: '23', mm: '59', ss: '59' }
const calculateDisabledDays = (minDate?: Date, maxDate?: Date) => {
const rules: Array<{ before: Date } | { after: Date }> = []
if (minDate) {
rules.push({ before: dayjs(minDate).startOf('day').toDate() })
}
if (maxDate) {
rules.push({ after: dayjs(maxDate).endOf('day').toDate() })
}
if (rules.length === 0) return undefined
if (rules.length === 1) return rules[0]
return rules
}
export function DatePicker({
to,
from,
@@ -64,6 +80,55 @@ export function DatePicker({
const [startTime, setStartTime] = useState<any>(START_TIME_DEFAULT)
const [endTime, setEndTime] = useState<any>(END_TIME_DEFAULT)
const disabledDays = useMemo(() => calculateDisabledDays(minDate, maxDate), [minDate, maxDate])
const clampDateToRange = useCallback(
(date: Date | null) => {
if (!date) return date
let nextDate = date
if (minDate && dayjs(nextDate).isBefore(minDate, 'day')) {
nextDate = dayjs(minDate).toDate()
}
if (maxDate && dayjs(nextDate).isAfter(maxDate, 'day')) {
nextDate = dayjs(maxDate).toDate()
}
return nextDate
},
[minDate, maxDate]
)
useEffect(() => {
if (!minDate && !maxDate) return
setStartDate((prev) => {
if (!prev) return prev
const clamped = clampDateToRange(prev)
return dayjs(clamped).isSame(prev) ? prev : clamped
})
setEndDate((prev) => {
if (!prev) return prev
const clamped = clampDateToRange(prev)
return dayjs(clamped).isSame(prev) ? prev : clamped
})
setAppliedStartDate((prev) => {
if (!prev) return prev
const clamped = clampDateToRange(prev)
return dayjs(clamped).isSame(prev) ? prev : clamped
})
setAppliedEndDate((prev) => {
if (!prev) return prev
const clamped = clampDateToRange(prev)
return dayjs(clamped).isSame(prev) ? prev : clamped
})
}, [minDate, maxDate, clampDateToRange])
useEffect(() => {
if (!from) {
setAppliedStartDate(null)
@@ -145,7 +210,7 @@ export function DatePicker({
}
return (
<Popover_Shadcn_ open={open} onOpenChange={setOpen}>
<Popover_Shadcn_ modal open={open} onOpenChange={setOpen}>
<PopoverTrigger_Shadcn_ asChild>
<Button
title={triggerButtonTitle}
@@ -218,57 +283,25 @@ export function DatePicker({
</>
)}
<div className="p-2">
<ReactDatePicker
inline
selectsRange={selectsRange}
selected={startDate}
onChange={(dates) => {
handleDatePickerChange(dates)
}}
dateFormat="MMMM d, yyyy h:mm aa"
startDate={startDate}
endDate={endDate}
minDate={minDate}
maxDate={maxDate}
dayClassName={() => 'cursor-pointer'}
renderCustomHeader={({
date,
decreaseMonth,
increaseMonth,
prevMonthButtonDisabled,
nextMonthButtonDisabled,
}) => (
<div className="flex items-center justify-between">
<div className="flex w-full items-center justify-between">
<button
onClick={decreaseMonth}
disabled={prevMonthButtonDisabled}
type="button"
className={`
${prevMonthButtonDisabled && 'cursor-not-allowed opacity-50'}
text-foreground-light hover:text-foreground focus:outline-none p-2
`}
>
<ChevronLeft size={16} strokeWidth={2} />
</button>
<span className="text-sm text-foreground-light">
{format(date, 'MMMM yyyy')}
</span>
<button
onClick={increaseMonth}
disabled={nextMonthButtonDisabled}
type="button"
className={`
${nextMonthButtonDisabled && 'cursor-not-allowed opacity-50'}
text-foreground-light p-2 hover:text-foreground focus:outline-none
`}
>
<ChevronRight size={16} strokeWidth={2} />
</button>
</div>
</div>
)}
/>
{selectsRange ? (
<CalendarPicker
mode="range"
disabled={disabledDays}
selected={{ from: startDate ?? undefined, to: endDate ?? undefined }}
onSelect={(range) => {
handleDatePickerChange([range?.from ?? null, range?.to ?? null])
}}
/>
) : (
<CalendarPicker
mode="single"
disabled={disabledDays}
selected={endDate ?? undefined}
onSelect={(date) => {
handleDatePickerChange(date ?? null)
}}
/>
)}
</div>
{renderFooter({
from: startDate?.toISOString() || null,
@@ -1,164 +0,0 @@
import { format } from 'date-fns'
import { ArrowUpDown } from 'lucide-react'
import { useEffect, useState } from 'react'
import { DatePicker } from 'components/ui/DatePicker'
import { Parameter } from 'lib/sql-parameters'
import {
Button,
Input_Shadcn_,
Label_Shadcn_,
Popover_Shadcn_,
PopoverContent_Shadcn_,
PopoverTrigger_Shadcn_,
Select_Shadcn_,
SelectContent_Shadcn_,
SelectItem_Shadcn_,
SelectTrigger_Shadcn_,
SelectValue_Shadcn_,
} from 'ui'
interface ParametersPopoverProps {
parameters: Parameter[]
parameterValues?: Record<string, string>
onSubmit?: (parameters: Record<string, string>) => void
onChange?: (parameters: Record<string, string>) => void
}
export const ParametersPopover = ({
parameters,
parameterValues = {},
onSubmit,
onChange,
}: ParametersPopoverProps) => {
const [tempParameters, setTempParameters] = useState<Record<string, string>>(
parameters.reduce(
(acc, param) => ({
...acc,
[param.name]: parameterValues[param.name] ?? param.defaultValue ?? '',
}),
{}
)
)
// Update temp parameters when external parameters or values change
useEffect(() => {
setTempParameters(
parameters.reduce(
(acc, param) => ({
...acc,
[param.name]: parameterValues[param.name] ?? param.defaultValue ?? '',
}),
{}
)
)
}, [parameters, parameterValues])
const handleParameterChange = (name: string, value: string) => {
const newParameters = {
...tempParameters,
[name]: value,
}
setTempParameters(newParameters)
onChange?.(newParameters)
}
const renderInput = (param: Parameter) => {
const currentValue = tempParameters[param.name] ?? parameterValues[param.name] ?? ''
if (param.type === 'date') {
// Check if the current value is a valid date
const isValidDate = currentValue && !isNaN(new Date(currentValue).getTime())
if (isValidDate) {
return (
<DatePicker
selectsRange={false}
from={currentValue}
to={currentValue}
onChange={(date) => {
if (date && date.to) {
handleParameterChange(param.name, date.to)
} else {
handleParameterChange(param.name, '')
}
}}
>
<span>{currentValue ? format(new Date(currentValue), 'dd MMM') : 'Pick a date'}</span>
</DatePicker>
)
}
// Fallback to regular input if date is invalid
return (
<Input_Shadcn_
size="tiny"
value={currentValue}
onChange={(e) => handleParameterChange(param.name, e.target.value)}
/>
)
}
if (param.type === 'enum' && param.possibleValues) {
return (
<Select_Shadcn_
value={currentValue}
onValueChange={(value) => handleParameterChange(param.name, value)}
>
<SelectTrigger_Shadcn_ className="h-8">
<SelectValue_Shadcn_ placeholder="Select value" />
</SelectTrigger_Shadcn_>
<SelectContent_Shadcn_>
{param.possibleValues.map((value) => (
<SelectItem_Shadcn_ key={value} value={value}>
{value}
</SelectItem_Shadcn_>
))}
</SelectContent_Shadcn_>
</Select_Shadcn_>
)
}
return (
<Input_Shadcn_
size="tiny"
value={currentValue}
onChange={(e) => handleParameterChange(param.name, e.target.value)}
/>
)
}
return (
<Popover_Shadcn_ modal={false}>
<PopoverTrigger_Shadcn_ asChild>
<Button icon={<ArrowUpDown size={14} />} type="text" size="tiny" className="w-7 h-7" />
</PopoverTrigger_Shadcn_>
<PopoverContent_Shadcn_ side="bottom" align="end" className="w-[300px] p-4">
<div className="space-y-4">
<div className="space-y-2">
{parameters.map((param) => (
<div key={param.name} className="grid gap-2">
<Label_Shadcn_ className="flex items-center gap-2">
{param.name}
{param.occurrences > 1 && (
<span className="text-xs text-foreground-light">
(used {param.occurrences} times)
</span>
)}
</Label_Shadcn_>
{renderInput(param)}
</div>
))}
</div>
{onSubmit && (
<div className="flex justify-end">
<Button type="primary" size="tiny" onClick={() => onSubmit(tempParameters)}>
Apply changes
</Button>
</div>
)}
</div>
</PopoverContent_Shadcn_>
</Popover_Shadcn_>
)
}
+1 -2
View File
@@ -112,8 +112,7 @@
"react-beautiful-dnd": "^13.1.0",
"react-contexify": "^5.0.0",
"react-data-grid": "7.0.0-beta.41",
"react-datepicker": "^4.18.0",
"react-day-picker": "^8.8.0",
"react-day-picker": "^9.11.1",
"react-dnd": "^16.0.1",
"react-dnd-html5-backend": "^16.0.1",
"react-dom": "catalog:",
-1
View File
@@ -1,7 +1,6 @@
import 'react-data-grid/lib/styles.css'
import 'styles/code.scss'
import 'styles/contextMenu.scss'
import 'styles/date-picker.scss'
import 'styles/editor.scss'
import 'styles/graphiql-base.scss'
import 'styles/grid.scss'
-104
View File
@@ -1,104 +0,0 @@
/* // date picker */
.react-datepicker__input-container input {
@apply block w-full text-base md:text-sm bg-white border border-background-surface-100 rounded shadow-sm;
}
.react-datepicker-popper {
@apply z-40 w-72 text-sm bg-surface-100 shadow px-3 py-2 border-2 border-background rounded;
}
.react-datepicker-left {
@apply absolute left-0 right-auto top-11 transform-none #{!important};
}
.react-datepicker-right {
@apply absolute right-0 left-auto top-11 transform-none #{!important};
}
.react-datepicker__portal {
@apply absolute z-10 w-72 text-sm transform-none bg-studio shadow px-3 py-2 top-12 right-0 border-2 border-background rounded;
}
.react-datepicker__month-container {
@apply flex flex-col;
}
.react-datepicker__month {
@apply flex flex-col;
@apply -space-y-px;
}
.react-datepicker__current-month {
@apply ml-2.5 text-lg font-semibold text-border-stronger;
}
.react-datepicker__week {
@apply flex -space-x-px;
}
.react-datepicker__day-names {
@apply flex -space-x-px text-foreground-lighter font-normal text-center text-xs;
}
.react-datepicker__day-name {
@apply w-10 h-10 flex items-center justify-center py-1 rounded-full;
}
.react-datepicker__navigation {
@apply absolute top-2;
}
.react-datepicker__navigation--previous {
@apply right-12 w-10 h-10 rounded transition flex items-center justify-center hover:bg-studio;
}
.react-datepicker__navigation--next {
@apply right-4 w-10 h-10 rounded transition flex items-center justify-center hover:bg-studio;
}
.react-datepicker__day {
@apply w-10 h-10 flex items-center font-normal justify-center text-sm leading-loose transition text-foreground-light cursor-pointer;
/* @apply mb-1 py-1; */
@apply -space-y-px;
@apply border border-default;
}
.react-datepicker__day--disabled {
@apply cursor-not-allowed opacity-40 hover:bg-transparent;
}
.react-datepicker__day--outside-month {
@apply text-border-stronger;
}
.react-datepicker__day--in-range {
@apply bg-brand-400 text-scale-fixed-100 border-brand-300 text-foreground;
}
.react-datepicker__day--in-selecting-range {
@apply bg-brand-400 text-scale-fixed-100 border-brand-400 text-foreground;
}
.react-datepicker__day--selecting-range-start,
.react-datepicker__day--selecting-range-end {
@apply bg-brand-300 text-foreground hover:bg-brand-400;
}
.react-datepicker__day--selected,
.react-datepicker__day--selected.react-datepicker__day--highlighted {
@apply bg-brand text-foreground;
}
.react-datepicker__day--range-start,
.react-datepicker__day--range-end {
@apply bg-brand text-foreground;
}
.react-datepicker__day--highlighted {
@apply bg-overlay-hover text-foreground-light;
}
.react-datepicker__aria-live {
@apply sr-only;
}
@@ -71,8 +71,8 @@ test('renders datepicker selected dates in local time', async () => {
`${from.format('DD MMM')}, ${from.format('HH:mm')} - ${to.format('DD MMM')}, ${to.format('HH:mm')}`
)
// selected date should be in local time
await screen.findByText('25', { selector: "*[class*='--range-start'" })
await screen.findByText('27', { selector: "*[class*='--range-end'" })
await screen.findByText('25', { selector: "*[aria-label*='selected'" })
await screen.findByText('27', { selector: "*[aria-label*='selected'" })
})
test('datepicker onSubmit will return ISO string of selected dates', async () => {
+1 -1
View File
@@ -66,7 +66,7 @@
"react": "catalog:",
"react-accessible-treeview": "^2.11.2",
"react-copy-to-clipboard": "^5.1.0",
"react-day-picker": "^8.8.0",
"react-day-picker": "^9.11.1",
"react-dom": "catalog:",
"react-hook-form": "^7.45.0",
"react-intersection-observer": "^9.8.2",
@@ -1,7 +1,6 @@
'use client'
import { ChevronLeft, ChevronRight } from 'lucide-react'
import * as React from 'react'
import { DayPicker } from 'react-day-picker'
import { cn } from '../../../lib/utils/cn'
@@ -10,53 +9,99 @@ import { buttonVariants } from './button'
export type CalendarProps = React.ComponentProps<typeof DayPicker>
function Calendar({ className, classNames, showOutsideDays = true, ...props }: CalendarProps) {
// [Joshen] Wondering if this is a bug with react-day-picker v8 whereby a single selected date
// has styles applied for both day_range_start and day_range_end. This might be fixed with the latest
// version of react-day-picker, but in case we can opt for a pure tailwind solution instead of JS
const fullDateRangeSelected =
props.mode === 'range' && !!props.selected?.from && !!props.selected?.to
const {
months,
month,
month_caption,
caption_label,
button_previous,
button_next,
month_grid,
weekdays,
weekday,
week,
day,
day_button,
selected,
today,
outside,
disabled,
range_start,
range_middle,
range_end,
hidden,
...restClassNames
} = classNames ?? {}
return (
<DayPicker
showOutsideDays={showOutsideDays}
className={cn('p-3', className)}
classNames={{
months: 'flex flex-col sm:flex-row space-y-4 sm:space-x-4 sm:space-y-0',
month: 'space-y-4',
caption: 'flex justify-center pt-1 relative items-center',
caption_label: 'text-sm font-medium',
nav: 'space-x-1 flex items-center',
nav_button: cn(
months: cn(
'relative flex flex-col sm:flex-row space-y-4 sm:[&>*:not(nav)+*]:ml-4 sm:space-y-0',
months
),
month: cn('space-y-4', month),
month_caption: cn('flex justify-center pt-1 relative items-center', month_caption),
caption_label: cn('text-sm font-medium', caption_label),
button_previous: cn(
buttonVariants({ variant: 'outline' }),
'h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100'
'h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100',
'z-[5]',
'aria-disabled:opacity-25 aria-disabled:hover:opacity-25 aria-disabled:cursor-not-allowed',
'absolute left-0 top-0',
button_previous
),
nav_button_previous: 'absolute left-1',
nav_button_next: 'absolute right-1',
table: 'w-full border-collapse space-y-1',
head_row: 'flex',
head_cell: 'text-foreground-muted rounded-md w-9 font-normal text-[0.8rem]',
row: 'flex w-full mt-2',
cell: cn(
'text-center text-sm p-0 relative [&:has([aria-selected])]:bg-accent first:[&:has([aria-selected])]:rounded-l-md',
'last:[&:has([aria-selected])]:rounded-r-md focus-within:relative focus-within:z-20'
button_next: cn(
buttonVariants({ variant: 'outline' }),
'h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100',
'z-[5]',
'aria-disabled:opacity-25 aria-disabled:hover:opacity-25 aria-disabled:cursor-not-allowed',
'absolute right-0 top-0',
button_next
),
month_grid: cn('w-full border-collapse space-y-1', month_grid),
weekdays: cn('flex', weekdays),
weekday: cn('text-foreground-muted rounded-md w-9 font-normal text-[0.8rem]', weekday),
week: cn('flex w-full mt-2', week),
day: cn(
buttonVariants({ variant: 'ghost' }),
'h-9 w-9 p-0 font-normal aria-selected:opacity-100'
'text-center text-sm p-0 relative [&:has([aria-selected])]:bg-accent first:[&:has([aria-selected])]:rounded-l-md',
'last:[&:has([aria-selected])]:rounded-r-md focus-within:relative focus-within:z-20',
day
),
day_selected: 'bg-brand-500 text-foreground text-foreground',
day_today: 'bg-accent text-accent-foreground',
day_outside: 'text-foreground-muted opacity-50',
day_disabled: 'text-foreground-muted opacity-50',
day_range_start: cn(fullDateRangeSelected && 'bg-brand-500 rounded-r-none'),
day_range_middle: 'aria-selected:bg-brand-400 rounded-none',
day_range_end: cn(fullDateRangeSelected && 'bg-brand-500 rounded-l-none'),
day_hidden: 'invisible',
...classNames,
day_button: cn(
buttonVariants({ variant: 'ghost' }),
'h-9 w-9 p-0 font-normal aria-selected:opacity-100',
day_button
),
selected: cn('bg-brand-500 text-foreground text-foreground', selected),
today: cn('bg-accent text-accent-foreground', today),
outside: cn('text-foreground-muted opacity-50', outside),
disabled: cn('text-foreground-muted opacity-50', disabled),
range_start: cn(fullDateRangeSelected && 'bg-brand-500 rounded-r-none', range_start),
range_middle: cn('aria-selected:bg-brand-400 rounded-none', range_middle),
range_end: cn(fullDateRangeSelected && 'bg-brand-500 rounded-l-none', range_end),
hidden: cn('invisible', hidden),
...restClassNames,
}}
components={{
IconLeft: () => <ChevronLeft className="h-4 w-4" />,
IconRight: () => <ChevronRight className="h-4 w-4" />,
Chevron: (props) => {
const { className, ...rest } = props
if (props.orientation === 'left') {
return (
<ChevronLeft className={cn('h-4 w-4 pointer-events-none', className)} {...rest} />
)
} else {
return (
<ChevronRight className={cn('h-4 w-4 pointer-events-none', className)} {...rest} />
)
}
},
}}
{...props}
/>
+49 -65
View File
@@ -259,6 +259,9 @@ importers:
react:
specifier: 'catalog:'
version: 18.3.1
react-day-picker:
specifier: ^9.11.1
version: 9.11.1(react@18.3.1)
react-docgen:
specifier: ^7.0.3
version: 7.0.3(supports-color@8.1.1)
@@ -397,7 +400,7 @@ importers:
version: 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@sentry/nextjs':
specifier: ^10.3.0
version: 10.3.0(@opentelemetry/context-async-hooks@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.5.2(@babel/core@7.28.4(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4))(react@18.3.1)(supports-color@8.1.1)(webpack@5.94.0)
version: 10.3.0(@opentelemetry/context-async-hooks@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4))(react@18.3.1)(supports-color@8.1.1)(webpack@5.94.0)
'@supabase/supabase-js':
specifier: 'catalog:'
version: 2.78.0
@@ -812,7 +815,7 @@ importers:
version: 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@sentry/nextjs':
specifier: ^10.3.0
version: 10.3.0(@opentelemetry/context-async-hooks@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.5.2(@babel/core@7.28.4(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4))(react@18.3.1)(supports-color@8.1.1)(webpack@5.94.0)
version: 10.3.0(@opentelemetry/context-async-hooks@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4))(react@18.3.1)(supports-color@8.1.1)(webpack@5.94.0)
'@std/path':
specifier: npm:@jsr/std__path@^1.0.8
version: '@jsr/std__path@1.0.8'
@@ -990,12 +993,9 @@ importers:
react-data-grid:
specifier: 7.0.0-beta.41
version: 7.0.0-beta.41(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react-datepicker:
specifier: ^4.18.0
version: 4.18.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react-day-picker:
specifier: ^8.8.0
version: 8.8.0(date-fns@2.30.0)(react@18.3.1)
specifier: ^9.11.1
version: 9.11.1(react@18.3.1)
react-dnd:
specifier: ^16.0.1
version: 16.0.1(@types/hoist-non-react-statics@3.3.2)(@types/node@22.13.14)(@types/react@18.3.3)(react@18.3.1)
@@ -1474,7 +1474,7 @@ importers:
version: 1.114.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@tanstack/react-start':
specifier: ^1.114.25
version: 1.114.27(@electric-sql/pglite@0.2.15)(@tanstack/react-router@1.114.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@22.13.14)(aws4fetch@1.0.20)(babel-plugin-macros@3.1.0)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(encoding@0.1.13)(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(typescript@5.9.2)(vite@7.1.11(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1))(webpack@5.94.0(esbuild@0.25.2))(yaml@2.8.1)
version: 1.114.27(@electric-sql/pglite@0.2.15)(@tanstack/react-router@1.114.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@22.13.14)(aws4fetch@1.0.20)(babel-plugin-macros@3.1.0)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(typescript@5.9.2)(vite@7.1.11(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1))(webpack@5.94.0(esbuild@0.25.2))(yaml@2.8.1)
'@types/common-tags':
specifier: ^1.8.4
version: 1.8.4
@@ -1576,7 +1576,7 @@ importers:
version: 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@sentry/nextjs':
specifier: ^10
version: 10.3.0(@opentelemetry/context-async-hooks@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.5.2(@babel/core@7.28.4(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4))(react@18.3.1)(supports-color@8.1.1)(webpack@5.94.0)
version: 10.3.0(@opentelemetry/context-async-hooks@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4))(react@18.3.1)(supports-color@8.1.1)(webpack@5.94.0)
'@supabase/supabase-js':
specifier: 'catalog:'
version: 2.78.0
@@ -2300,8 +2300,8 @@ importers:
specifier: ^5.1.0
version: 5.1.0(react@18.3.1)
react-day-picker:
specifier: ^8.8.0
version: 8.8.0(date-fns@2.30.0)(react@18.3.1)
specifier: ^9.11.1
version: 9.11.1(react@18.3.1)
react-dom:
specifier: 'catalog:'
version: 18.3.1(react@18.3.1)
@@ -3414,6 +3414,9 @@ packages:
'@date-fns/tz@1.2.0':
resolution: {integrity: sha512-LBrd7MiJZ9McsOgxqWX7AaxrDjcFVjWH/tIKJd7pnR7McaslGYOP1QmmiBXdJH/H/yLCT+rcQ7FaPBUxRGUtrg==}
'@date-fns/tz@1.4.1':
resolution: {integrity: sha512-P5LUNhtbj6YfI3iJjw5EL9eUAG6OitD0W3fWQcpQjDRc/QIsL0tRNuO1PcDvPccWL1fSTXXdE1ds+l95DV/OFA==}
'@deno/shim-deno-test@0.5.0':
resolution: {integrity: sha512-4nMhecpGlPi0cSzT67L+Tm+GOJqvuk8gqHBziqcUQOarnuIax1z96/gJHCSIz2Z0zhxE6Rzwb3IZXPtFh51j+w==}
@@ -11446,6 +11449,9 @@ packages:
dataloader@2.2.3:
resolution: {integrity: sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA==}
date-fns-jalali@4.1.0-0:
resolution: {integrity: sha512-hTIP/z+t+qKwBDcmmsnmjWTduxCg+5KfdqWQvb2X/8C9+knYY6epN/pfxdDuyVlSVeFz0sM5eEfwIUQ70U4ckg==}
date-fns@2.30.0:
resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==}
engines: {node: '>=0.11'}
@@ -16782,23 +16788,17 @@ packages:
react: ^18.0
react-dom: ^18.0
react-datepicker@4.18.0:
resolution: {integrity: sha512-0MYt3HmLbHVk1sw4v+RCbLAVg5TA3jWP7RyjZbo53PC+SEi+pjdgc92lB53ai/ENZaTOhbXmgni9GzvMrorMAw==}
peerDependencies:
react: ^16.9.0 || ^17 || ^18
react-dom: ^16.9.0 || ^17 || ^18
react-datepicker@7.6.0:
resolution: {integrity: sha512-9cQH6Z/qa4LrGhzdc3XoHbhrxNcMi9MKjZmYgF/1MNNaJwvdSjv3Xd+jjvrEEbKEf71ZgCA3n7fQbdwd70qCRw==}
peerDependencies:
react: ^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc
react-dom: ^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc
react-day-picker@8.8.0:
resolution: {integrity: sha512-QIC3uOuyGGbtypbd5QEggsCSqVaPNu8kzUWquZ7JjW9fuWB9yv7WyixKmnaFelTLXFdq7h7zU6n/aBleBqe/dA==}
react-day-picker@9.11.1:
resolution: {integrity: sha512-l3ub6o8NlchqIjPKrRFUCkTUEq6KwemQlfv3XZzzwpUeGwmDJ+0u0Upmt38hJyd7D/vn2dQoOoLV/qAp0o3uUw==}
engines: {node: '>=18'}
peerDependencies:
date-fns: ^2.28.0
react: ^16.8.0 || ^17.0.0 || ^18.0.0
react: '>=16.8.0'
react-devtools-inline@4.4.0:
resolution: {integrity: sha512-ES0GolSrKO8wsKbsEkVeiR/ZAaHQTY4zDh1UW8DImVmm8oaGLl3ijJDvSGe+qDRKPZdPRnDtWWnSvvrgxXdThQ==}
@@ -16933,12 +16933,6 @@ packages:
react: ^16.8.0 || ^17.0.0 || ^18.0.0
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
react-onclickoutside@6.13.0:
resolution: {integrity: sha512-ty8So6tcUpIb+ZE+1HAhbLROvAIJYyJe/1vRrrcmW+jLsaM+/powDRqxzo6hSh9CuRZGSL1Q8mvcF5WRD93a0A==}
peerDependencies:
react: ^15.5.x || ^16.x || ^17.x || ^18.x
react-dom: ^15.5.x || ^16.x || ^17.x || ^18.x
react-popper@2.3.0:
resolution: {integrity: sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==}
peerDependencies:
@@ -21802,6 +21796,8 @@ snapshots:
'@date-fns/tz@1.2.0': {}
'@date-fns/tz@1.4.1': {}
'@deno/shim-deno-test@0.5.0': {}
'@deno/shim-deno@0.19.2':
@@ -27570,7 +27566,7 @@ snapshots:
'@sentry/core@10.3.0': {}
'@sentry/nextjs@10.3.0(@opentelemetry/context-async-hooks@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.5.2(@babel/core@7.28.4(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4))(react@18.3.1)(supports-color@8.1.1)(webpack@5.94.0)':
'@sentry/nextjs@10.3.0(@opentelemetry/context-async-hooks@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4))(react@18.3.1)(supports-color@8.1.1)(webpack@5.94.0)':
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/semantic-conventions': 1.36.0
@@ -28639,7 +28635,7 @@ snapshots:
tiny-invariant: 1.3.3
tiny-warning: 1.0.3
'@tanstack/react-start-client@1.114.27(@electric-sql/pglite@0.2.15)(@types/node@22.13.14)(aws4fetch@1.0.20)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(encoding@0.1.13)(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.1)':
'@tanstack/react-start-client@1.114.27(@electric-sql/pglite@0.2.15)(@types/node@22.13.14)(aws4fetch@1.0.20)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.1)':
dependencies:
'@tanstack/react-router': 1.114.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@tanstack/router-core': 1.114.25
@@ -28650,7 +28646,7 @@ snapshots:
react-dom: 18.3.1(react@18.3.1)
tiny-invariant: 1.3.3
tiny-warning: 1.0.3
vinxi: 0.5.3(@electric-sql/pglite@0.2.15)(@types/node@22.13.14)(aws4fetch@1.0.20)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(encoding@0.1.13)(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.1)
vinxi: 0.5.3(@electric-sql/pglite@0.2.15)(@types/node@22.13.14)(aws4fetch@1.0.20)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.1)
transitivePeerDependencies:
- '@azure/app-configuration'
- '@azure/cosmos'
@@ -28694,7 +28690,7 @@ snapshots:
- xml2js
- yaml
'@tanstack/react-start-config@1.114.27(@electric-sql/pglite@0.2.15)(@tanstack/react-router@1.114.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@22.13.14)(aws4fetch@1.0.20)(babel-plugin-macros@3.1.0)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(encoding@0.1.13)(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(typescript@5.9.2)(vite@7.1.11(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1))(webpack@5.94.0(esbuild@0.25.2))(yaml@2.8.1)':
'@tanstack/react-start-config@1.114.27(@electric-sql/pglite@0.2.15)(@tanstack/react-router@1.114.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@22.13.14)(aws4fetch@1.0.20)(babel-plugin-macros@3.1.0)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(typescript@5.9.2)(vite@7.1.11(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1))(webpack@5.94.0(esbuild@0.25.2))(yaml@2.8.1)':
dependencies:
'@tanstack/react-start-plugin': 1.114.12(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1)
'@tanstack/router-core': 1.114.25
@@ -28704,11 +28700,11 @@ snapshots:
'@tanstack/start-server-functions-handler': 1.114.25
'@vitejs/plugin-react': 4.3.4(supports-color@8.1.1)(vite@7.1.11(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1))
import-meta-resolve: 4.1.0
nitropack: 2.11.7(@electric-sql/pglite@0.2.15)(aws4fetch@1.0.20)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(encoding@0.1.13)(supports-color@8.1.1)(typescript@5.9.2)
nitropack: 2.11.7(@electric-sql/pglite@0.2.15)(aws4fetch@1.0.20)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(supports-color@8.1.1)(typescript@5.9.2)
ofetch: 1.4.1
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
vinxi: 0.5.3(@electric-sql/pglite@0.2.15)(@types/node@22.13.14)(aws4fetch@1.0.20)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(encoding@0.1.13)(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.1)
vinxi: 0.5.3(@electric-sql/pglite@0.2.15)(@types/node@22.13.14)(aws4fetch@1.0.20)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.1)
vite: 7.1.11(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1)
zod: 3.25.76
transitivePeerDependencies:
@@ -28786,11 +28782,11 @@ snapshots:
- tsx
- yaml
'@tanstack/react-start-router-manifest@1.114.25(@electric-sql/pglite@0.2.15)(@types/node@22.13.14)(aws4fetch@1.0.20)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(encoding@0.1.13)(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.1)':
'@tanstack/react-start-router-manifest@1.114.25(@electric-sql/pglite@0.2.15)(@types/node@22.13.14)(aws4fetch@1.0.20)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.1)':
dependencies:
'@tanstack/router-core': 1.114.25
tiny-invariant: 1.3.3
vinxi: 0.5.3(@electric-sql/pglite@0.2.15)(@types/node@22.13.14)(aws4fetch@1.0.20)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(encoding@0.1.13)(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.1)
vinxi: 0.5.3(@electric-sql/pglite@0.2.15)(@types/node@22.13.14)(aws4fetch@1.0.20)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.1)
transitivePeerDependencies:
- '@azure/app-configuration'
- '@azure/cosmos'
@@ -28849,13 +28845,13 @@ snapshots:
tiny-warning: 1.0.3
unctx: 2.4.1
'@tanstack/react-start@1.114.27(@electric-sql/pglite@0.2.15)(@tanstack/react-router@1.114.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@22.13.14)(aws4fetch@1.0.20)(babel-plugin-macros@3.1.0)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(encoding@0.1.13)(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(typescript@5.9.2)(vite@7.1.11(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1))(webpack@5.94.0(esbuild@0.25.2))(yaml@2.8.1)':
'@tanstack/react-start@1.114.27(@electric-sql/pglite@0.2.15)(@tanstack/react-router@1.114.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@22.13.14)(aws4fetch@1.0.20)(babel-plugin-macros@3.1.0)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(typescript@5.9.2)(vite@7.1.11(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1))(webpack@5.94.0(esbuild@0.25.2))(yaml@2.8.1)':
dependencies:
'@tanstack/react-start-client': 1.114.27(@electric-sql/pglite@0.2.15)(@types/node@22.13.14)(aws4fetch@1.0.20)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(encoding@0.1.13)(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.1)
'@tanstack/react-start-config': 1.114.27(@electric-sql/pglite@0.2.15)(@tanstack/react-router@1.114.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@22.13.14)(aws4fetch@1.0.20)(babel-plugin-macros@3.1.0)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(encoding@0.1.13)(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(typescript@5.9.2)(vite@7.1.11(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1))(webpack@5.94.0(esbuild@0.25.2))(yaml@2.8.1)
'@tanstack/react-start-router-manifest': 1.114.25(@electric-sql/pglite@0.2.15)(@types/node@22.13.14)(aws4fetch@1.0.20)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(encoding@0.1.13)(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.1)
'@tanstack/react-start-client': 1.114.27(@electric-sql/pglite@0.2.15)(@types/node@22.13.14)(aws4fetch@1.0.20)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.1)
'@tanstack/react-start-config': 1.114.27(@electric-sql/pglite@0.2.15)(@tanstack/react-router@1.114.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@22.13.14)(aws4fetch@1.0.20)(babel-plugin-macros@3.1.0)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(typescript@5.9.2)(vite@7.1.11(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1))(webpack@5.94.0(esbuild@0.25.2))(yaml@2.8.1)
'@tanstack/react-start-router-manifest': 1.114.25(@electric-sql/pglite@0.2.15)(@types/node@22.13.14)(aws4fetch@1.0.20)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.1)
'@tanstack/react-start-server': 1.114.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@tanstack/start-api-routes': 1.114.25(@electric-sql/pglite@0.2.15)(@types/node@22.13.14)(aws4fetch@1.0.20)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(encoding@0.1.13)(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.1)
'@tanstack/start-api-routes': 1.114.25(@electric-sql/pglite@0.2.15)(@types/node@22.13.14)(aws4fetch@1.0.20)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.1)
'@tanstack/start-server-functions-client': 1.114.25(@types/node@22.13.14)(babel-plugin-macros@3.1.0)(jiti@2.5.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1)
'@tanstack/start-server-functions-handler': 1.114.25
'@tanstack/start-server-functions-server': 1.114.12(@types/node@22.13.14)(babel-plugin-macros@3.1.0)(jiti@2.5.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1)
@@ -29006,11 +29002,11 @@ snapshots:
- tsx
- yaml
'@tanstack/start-api-routes@1.114.25(@electric-sql/pglite@0.2.15)(@types/node@22.13.14)(aws4fetch@1.0.20)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(encoding@0.1.13)(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.1)':
'@tanstack/start-api-routes@1.114.25(@electric-sql/pglite@0.2.15)(@types/node@22.13.14)(aws4fetch@1.0.20)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.1)':
dependencies:
'@tanstack/router-core': 1.114.25
'@tanstack/start-server-core': 1.114.25
vinxi: 0.5.3(@electric-sql/pglite@0.2.15)(@types/node@22.13.14)(aws4fetch@1.0.20)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(encoding@0.1.13)(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.1)
vinxi: 0.5.3(@electric-sql/pglite@0.2.15)(@types/node@22.13.14)(aws4fetch@1.0.20)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.1)
transitivePeerDependencies:
- '@azure/app-configuration'
- '@azure/cosmos'
@@ -29899,7 +29895,7 @@ snapshots:
optionalDependencies:
'@aws-sdk/credential-provider-web-identity': 3.830.0
'@vercel/nft@0.29.2(encoding@0.1.13)(rollup@4.50.2)(supports-color@8.1.1)':
'@vercel/nft@0.29.2(rollup@4.50.2)(supports-color@8.1.1)':
dependencies:
'@mapbox/node-pre-gyp': 2.0.0(encoding@0.1.13)(supports-color@8.1.1)
'@rollup/pluginutils': 5.1.4(rollup@4.50.2)
@@ -31933,6 +31929,8 @@ snapshots:
dataloader@2.2.3: {}
date-fns-jalali@4.1.0-0: {}
date-fns@2.30.0:
dependencies:
'@babel/runtime': 7.26.10
@@ -36713,7 +36711,7 @@ snapshots:
nice-try@1.0.5: {}
nitropack@2.11.7(@electric-sql/pglite@0.2.15)(aws4fetch@1.0.20)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(encoding@0.1.13)(supports-color@8.1.1)(typescript@5.9.2):
nitropack@2.11.7(@electric-sql/pglite@0.2.15)(aws4fetch@1.0.20)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(supports-color@8.1.1)(typescript@5.9.2):
dependencies:
'@cloudflare/kv-asset-handler': 0.4.0
'@netlify/functions': 3.0.4
@@ -36724,7 +36722,7 @@ snapshots:
'@rollup/plugin-node-resolve': 16.0.1(rollup@4.50.2)
'@rollup/plugin-replace': 6.0.2(rollup@4.50.2)
'@rollup/plugin-terser': 0.4.4(rollup@4.50.2)
'@vercel/nft': 0.29.2(encoding@0.1.13)(rollup@4.50.2)(supports-color@8.1.1)
'@vercel/nft': 0.29.2(rollup@4.50.2)(supports-color@8.1.1)
archiver: 7.0.1
c12: 3.0.2(magicast@0.3.5)
chokidar: 4.0.3
@@ -38574,17 +38572,6 @@ snapshots:
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
react-datepicker@4.18.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
'@popperjs/core': 2.11.8
classnames: 2.3.2
date-fns: 2.30.0
prop-types: 15.8.1
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
react-onclickoutside: 6.13.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react-popper: 2.3.0(@popperjs/core@2.11.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react-datepicker@7.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
'@floating-ui/react': 0.27.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -38593,9 +38580,11 @@ snapshots:
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
react-day-picker@8.8.0(date-fns@2.30.0)(react@18.3.1):
react-day-picker@9.11.1(react@18.3.1):
dependencies:
date-fns: 2.30.0
'@date-fns/tz': 1.4.1
date-fns: 4.1.0
date-fns-jalali: 4.1.0-0
react: 18.3.1
react-devtools-inline@4.4.0:
@@ -38775,11 +38764,6 @@ snapshots:
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
react-onclickoutside@6.13.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
react-popper@2.3.0(@popperjs/core@2.11.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
'@popperjs/core': 2.11.8
@@ -41678,7 +41662,7 @@ snapshots:
d3-time: 3.1.0
d3-timer: 3.0.1
vinxi@0.5.3(@electric-sql/pglite@0.2.15)(@types/node@22.13.14)(aws4fetch@1.0.20)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(encoding@0.1.13)(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.1):
vinxi@0.5.3(@electric-sql/pglite@0.2.15)(@types/node@22.13.14)(aws4fetch@1.0.20)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.1):
dependencies:
'@babel/core': 7.28.4(supports-color@8.1.1)
'@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4(supports-color@8.1.1))
@@ -41700,7 +41684,7 @@ snapshots:
hookable: 5.5.3
http-proxy: 1.18.1
micromatch: 4.0.8
nitropack: 2.11.7(@electric-sql/pglite@0.2.15)(aws4fetch@1.0.20)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(encoding@0.1.13)(supports-color@8.1.1)(typescript@5.9.2)
nitropack: 2.11.7(@electric-sql/pglite@0.2.15)(aws4fetch@1.0.20)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(supports-color@8.1.1)(typescript@5.9.2)
node-fetch-native: 1.6.6
path-to-regexp: 6.3.0
pathe: 1.1.2