diff --git a/apps/desktop/package.json b/apps/desktop/package.json index e40be3df8181..0d2c07756af8 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -111,7 +111,7 @@ "motion": "^12.38.0", "nanostores": "^1.3.0", "node-pty": "1.1.0", - "radix-ui": "^1.4.3", + "radix-ui": "^1.6.5", "react": "^19.2.5", "react-arborist": "^3.5.0", "react-dnd-html5-backend": "^14.0.3", diff --git a/apps/desktop/src/app/cron/blueprints.test.ts b/apps/desktop/src/app/cron/blueprints.test.ts new file mode 100644 index 000000000000..87dadb051120 --- /dev/null +++ b/apps/desktop/src/app/cron/blueprints.test.ts @@ -0,0 +1,97 @@ +import { describe, expect, it } from 'vitest' + +import type { AutomationBlueprint } from '@/hermes' + +import { initialBlueprintValues } from './blueprints' + +function blueprint(fields: AutomationBlueprint['fields']): AutomationBlueprint { + return { + key: 'test', + title: 'Test', + description: '', + category: 'general', + tags: [], + command: '', + appUrl: '', + fields + } +} + +describe('initialBlueprintValues', () => { + it('seeds each field from its default', () => { + const values = initialBlueprintValues( + blueprint([ + { name: 'time', type: 'time', label: 'Time', default: '08:00', options: [], optional: false, help: '' }, + { + name: 'topic', + type: 'enum', + label: 'Topic', + default: 'news', + options: ['news', 'sports'], + optional: false, + help: '' + } + ]) + ) + + expect(values).toEqual({ time: '08:00', topic: 'news' }) + }) + + it('falls back to an empty string when a field has no default', () => { + const values = initialBlueprintValues( + blueprint([{ name: 'topic', type: 'text', label: 'Topic', default: null, options: [], optional: true, help: '' }]) + ) + + expect(values).toEqual({ topic: '' }) + }) + + it('returns an empty object for a blueprint with no fields', () => { + expect(initialBlueprintValues(blueprint([]))).toEqual({}) + }) + + it("seeds the deliver slot to 'local' when its default is the dashboard-only 'origin'", () => { + const values = initialBlueprintValues( + blueprint([ + { + name: 'deliver', + type: 'enum', + label: 'Deliver', + default: 'origin', + options: ['origin', 'local', 'telegram'], + optional: false, + help: '' + } + ]) + ) + + expect(values).toEqual({ deliver: 'local' }) + }) + + it("seeds the deliver slot to 'local' when it has no default", () => { + const values = initialBlueprintValues( + blueprint([ + { name: 'deliver', type: 'enum', label: 'Deliver', default: null, options: ['origin', 'local'], optional: false, help: '' } + ]) + ) + + expect(values).toEqual({ deliver: 'local' }) + }) + + it('leaves a non-origin deliver default untouched', () => { + const values = initialBlueprintValues( + blueprint([ + { + name: 'deliver', + type: 'enum', + label: 'Deliver', + default: 'telegram', + options: ['origin', 'local', 'telegram'], + optional: false, + help: '' + } + ]) + ) + + expect(values).toEqual({ deliver: 'telegram' }) + }) +}) diff --git a/apps/desktop/src/app/cron/blueprints.tsx b/apps/desktop/src/app/cron/blueprints.tsx new file mode 100644 index 000000000000..69c122cf4a38 --- /dev/null +++ b/apps/desktop/src/app/cron/blueprints.tsx @@ -0,0 +1,160 @@ +import { useQuery } from '@tanstack/react-query' +import { useMemo } from 'react' + +import { PageLoader } from '@/components/page-loader' +import { Input } from '@/components/ui/input' +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' +import { getAutomationBlueprints } from '@/hermes' +import type { AutomationBlueprint, AutomationBlueprintField } from '@/hermes' +import { useI18n } from '@/i18n' +import { selectableCardClass } from '@/lib/selectable-card' +import { cn } from '@/lib/utils' + +import { PanelDetail, PanelEmpty, PanelPill } from '../overlays/panel' + +// The blueprint catalog is shared with the dashboard, so its deliver slot +// defaults to "origin" (the chat/home-channel a dashboard or gateway job was +// created from). Desktop has no origin chat, so seed the deliver slot to the +// desktop's native target ("local" = This desktop) instead. The dialog then +// renders that slot with the shared DeliverSelect (backend-sourced targets), so +// the raw "origin" option never reaches the desktop UI. +const DELIVER_FIELD = 'deliver' +const DESKTOP_DELIVER_DEFAULT = 'local' + +function isDeliverField(field: AutomationBlueprintField): boolean { + return field.name === DELIVER_FIELD +} + +// Initial form state for a blueprint = each field's default (or ''). Pure so the +// suite can assert the form seeds correctly without mounting React. The deliver +// slot is special-cased: an "origin" default (or empty) becomes "local" so a +// desktop-created job delivers to This desktop instead of nowhere. +export function initialBlueprintValues(blueprint: AutomationBlueprint): Record { + const out: Record = {} + + for (const field of blueprint.fields) { + const seeded = field.default ?? '' + out[field.name] = isDeliverField(field) && (seeded === '' || seeded === 'origin') ? DESKTOP_DELIVER_DEFAULT : seeded + } + + return out +} + +// A slot-level validation error from the backend arrives as "422: " +// (or ": "); strip the leading numeric code for inline display. +export function cleanBlueprintFieldError(message: string): string { + return message.replace(/^\d+:\s*/, '') +} + +// Help text to show under a slot control. The backend deliver help is +// origin/dashboard-centric and even contradicts desktop semantics ("local = +// save only" vs. This desktop), and the DeliverSelect is self-explanatory — +// skip it for the deliver slot. +export function blueprintSlotHelp(field: AutomationBlueprintField): string | undefined { + return field.help && field.type !== 'text' && !isDeliverField(field) ? field.help : undefined +} + +// Renders one blueprint slot's control (enum/weekdays → Select, time → time +// input, else text). The deliver slot is handled separately by the dialog's +// shared DeliverSelect, so it's not rendered here. +export function BlueprintSlotControl({ + field, + id, + onChange, + value +}: { + field: AutomationBlueprintField + id: string + onChange: (next: string) => void + value: string +}) { + if (field.type === 'enum' || field.type === 'weekdays') { + return ( + + ) + } + + if (field.type === 'time') { + return onChange(event.target.value)} type="time" value={value} /> + } + + return ( + onChange(event.target.value)} + placeholder={field.help || field.label} + type="text" + value={value} + /> + ) +} + +// A clickable blueprint card — mirrors the app's other selectable cards +// (theme/pet/gateway/profile pickers) via selectableCardClass. Clicking opens +// the shared cron editor dialog pre-filled with this blueprint's slots; there's +// no inline expand form or divider. +function BlueprintCard({ blueprint, onSetUp }: { blueprint: AutomationBlueprint; onSetUp: () => void }) { + return ( + + ) +} + +// Automation Blueprints gallery — the desktop counterpart to the dashboard's +// blueprint tab. Each card opens the shared cron editor dialog pre-filled with +// the blueprint's typed slots; submitting POSTs to +// /api/cron/blueprints/instantiate, which fills the blueprint and creates the +// job via the same create_job path as a hand-written cron. +export function BlueprintsPanel({ onSetUp }: { onSetUp: (blueprint: AutomationBlueprint) => void }) { + const { t } = useI18n() + const c = t.cron + + const blueprints = useQuery({ + queryKey: ['cron-blueprints'], + queryFn: async () => (await getAutomationBlueprints()).blueprints + }) + + const cards = useMemo(() => blueprints.data ?? [], [blueprints.data]) + + if (blueprints.isLoading) { + return + } + + if (blueprints.isError) { + return + } + + if (cards.length === 0) { + return + } + + return ( + + {cards.map(blueprint => ( + onSetUp(blueprint)} /> + ))} + + ) +} diff --git a/apps/desktop/src/app/cron/index.tsx b/apps/desktop/src/app/cron/index.tsx index e0c421e41057..4e7a5a082dbd 100644 --- a/apps/desktop/src/app/cron/index.tsx +++ b/apps/desktop/src/app/cron/index.tsx @@ -5,7 +5,7 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { PageLoader } from '@/components/page-loader' import { Button } from '@/components/ui/button' -import { Codicon } from '@/components/ui/codicon' +import { Codicon, codiconIcon } from '@/components/ui/codicon' import { Dialog, DialogContent, @@ -15,6 +15,7 @@ import { DialogTitle } from '@/components/ui/dialog' import { Input } from '@/components/ui/input' +import { SegmentedControl } from '@/components/ui/segmented-control' import { Select, SelectContent, @@ -26,11 +27,15 @@ import { } from '@/components/ui/select' import { Textarea } from '@/components/ui/textarea' import { + type AutomationBlueprint, createCronJob, + type CronDeliveryTarget, type CronJob, deleteCronJob, + getCronDeliveryTargets, getCronJobRuns, getCronJobs, + instantiateAutomationBlueprint, pauseCronJob, resumeCronJob, type SessionInfo, @@ -65,17 +70,27 @@ import { } from '../overlays/panel' import type { SetStatusbarItemGroup } from '../shell/statusbar-controls' +import { + BlueprintSlotControl, + blueprintSlotHelp, + BlueprintsPanel, + cleanBlueprintFieldError, + initialBlueprintValues +} from './blueprints' import { cronEditorUpdates, jobIsScriptOnly, validateCronEditor } from './cron-job-model' import { jobState, jobTitle, STATE_DOT } from './job-state' const DEFAULT_DELIVER = 'local' +// Two surfaces share the cron panel: the live Jobs list and the Blueprints +// gallery (parameterized templates that instantiate a real job). The active tab +// is pure view state — it lives here, not in a store. +type CronTab = 'blueprints' | 'jobs' + // Radix rejects empty-string values, so the "no override" row in // the model picker carries this sentinel and is mapped back to '' on save. const MODEL_DEFAULT_VALUE = '__default__' -const DELIVERY_VALUES: readonly string[] = ['local', 'telegram', 'discord', 'slack', 'email'] - const SCHEDULE_OPTIONS: ReadonlyArray = [ { expr: '0 9 * * *', value: 'daily' }, { expr: '0 9 * * 1-5', value: 'weekdays' }, @@ -290,6 +305,7 @@ export function CronView({ onClose, onOpenSession, setStatusbarItemGroup: _setSt const pendingScrollRef = useRef(null) const focusJobId = useStore($cronFocusJobId) + const [tab, setTab] = useState('jobs') const [editor, setEditor] = useState({ mode: 'closed' }) const [pendingDelete, setPendingDelete] = useState(null) const [deleting, setDeleting] = useState(false) @@ -437,9 +453,53 @@ export function CronView({ onClose, onOpenSession, setStatusbarItemGroup: _setSt setEditor({ mode: 'closed' }) } + // Blueprint instantiation is a distinct backend path (fills typed slots, then + // creates the job) so it can't share the raw-cron onSave contract. Merge the + // created job into $cronJobs like every other create path. + async function handleBlueprintCreate(blueprint: AutomationBlueprint, values: Record, profile: string) { + const job = await instantiateAutomationBlueprint({ blueprint: blueprint.key, values }, profile) + + updateCronJobs(rows => { + const rest = rows.filter(row => row.id !== job.id) + + return [...rest, job] + }) + notify({ kind: 'success', title: c.blueprints.scheduled, message: asText(job.schedule_display) || blueprint.title }) + setEditor({ mode: 'closed' }) + } + + const tabToggle = ( + + ) + return ( - {loading && jobs.length === 0 ? ( + + + {tab === 'blueprints' ? ( + // A blueprint instantiates a real per-profile job, and "all" is not a + // writable target — collapse it to 'default', matching the create path + // in handleEditorSave. A user scoped to all profiles gets the job in + // 'default'. The gallery is a single scroll column, so it renders + // directly (BlueprintsPanel uses PanelDetail) rather than in PanelBody's + // master/detail row. + + setEditor({ + blueprint, + mode: 'blueprint', + profile: profileScope === ALL_PROFILES ? 'default' : profileScope + }) + } + /> + ) : loading && jobs.length === 0 ? ( ) : totalCount === 0 ? ( ) : ( - <> - - - t.common.tryHint(title))} - searchLabel={c.search} - searchPlaceholder={c.search} - searchValue={query} - > - {visibleJobs.map(job => ( - setEditor({ mode: 'edit', job }) }, - { icon: 'trash', label: t.common.delete, onSelect: () => setPendingDelete(job), tone: 'danger' } - ]} - /> - } - onSelect={() => setSelectedJobId(job.id)} - /> - ))} - {visibleJobs.length === 0 && ( -

{c.emptyTitleSearch}

- )} - setEditor({ mode: 'create' })} /> -
- - {selectedJob ? ( - void handlePauseResume(selectedJob)} - onTrigger={() => void handleTrigger(selectedJob)} + + t.common.tryHint(title))} + searchLabel={c.search} + searchPlaceholder={c.search} + searchValue={query} + > + {visibleJobs.map(job => ( + setEditor({ mode: 'edit', job }) }, + { icon: 'trash', label: t.common.delete, onSelect: () => setPendingDelete(job), tone: 'danger' } + ]} + /> + } + onSelect={() => setSelectedJobId(job.id)} /> - ) : ( - + ))} + {visibleJobs.length === 0 && ( +

{c.emptyTitleSearch}

)} -
- + setEditor({ mode: 'create' })} /> + + + {selectedJob ? ( + void handlePauseResume(selectedJob)} + onTrigger={() => void handleTrigger(selectedJob)} + /> + ) : ( + + )} +
)} - setEditor({ mode: 'closed' })} onSave={handleEditorSave} /> + setEditor({ mode: 'closed' })} + onSave={handleEditorSave} + /> !open && !deleting && setPendingDelete(null)} open={pendingDelete !== null}> @@ -727,12 +789,57 @@ function CronJobRuns({ ) } +// Label a cron delivery target: 'local' → localized "This desktop", known +// platforms → their delivery label, anything else → the backend name. Configured +// platforms without a cron home channel get a "set a home channel first" hint. +function deliverTargetLabel(target: CronDeliveryTarget, c: Translations['cron']): string { + const base = target.id === 'local' ? c.deliveryLabels.local : (c.deliveryLabels[target.id] ?? target.name) + + return target.id !== 'local' && !target.home_target_set ? `${base} — ${c.deliverNeedsHomeChannel}` : base +} + +// The delivery-target dropdown, shared by the manual cron editor and the +// blueprint form so both offer exactly the connected platforms (never a +// hardcoded list). While the targets load, keep the current value selectable. +function DeliverSelect({ + c, + id, + onChange, + targets, + value +}: { + c: Translations['cron'] + id: string + onChange: (next: string) => void + targets: CronDeliveryTarget[] + value: string +}) { + const options = targets.length > 0 ? targets : [{ home_env_var: null, home_target_set: true, id: value, name: value }] + + return ( + + ) +} + function CronEditorDialog({ editor, + onBlueprintCreate, onClose, onSave }: { editor: EditorState + onBlueprintCreate: (blueprint: AutomationBlueprint, values: Record, profile: string) => Promise onClose: () => void onSave: (values: EditorValues) => Promise }) { @@ -740,6 +847,8 @@ function CronEditorDialog({ const c = t.cron const open = editor.mode !== 'closed' const isEdit = editor.mode === 'edit' + const isBlueprint = editor.mode === 'blueprint' + const blueprint = isBlueprint ? editor.blueprint : null const initial = isEdit ? editor.job : null const scriptOnlyJob = initial ? jobIsScriptOnly(initial) : false @@ -751,16 +860,28 @@ function CronEditorDialog({ // Per-job model override, encoded as `${providerSlug}:${model}` (split on the // first ':' when saving). MODEL_DEFAULT_VALUE = follow the global default. const [modelChoice, setModelChoice] = useState(MODEL_DEFAULT_VALUE) + // Blueprint mode fills typed slots (time/enum/weekdays/text) instead of the + // raw cron fields; the backend renders the prompt + schedule from them. + const [slotValues, setSlotValues] = useState>({}) const [saving, setSaving] = useState(false) const [error, setError] = useState(null) // Same catalog the chat model picker uses: configured providers and their - // actually-available models only. Script-only jobs never run an agent, so - // skip the fetch entirely for them. + // actually-available models only. Script-only + blueprint dialogs never pick a + // model here, so skip the fetch entirely for them. const modelOptions = useQuery({ queryKey: ['model-options', 'global'], queryFn: () => requestModelOptions({}), - enabled: open && !scriptOnlyJob + enabled: open && !scriptOnlyJob && !isBlueprint + }) + + // Single source of truth for where a cron can deliver (local + configured + // gateways) — same endpoint the dashboard uses, so no dialog offers a platform + // that isn't connected. Shared by the manual editor and the blueprint form. + const deliveryTargets = useQuery({ + queryKey: ['cron-delivery-targets'], + queryFn: getCronDeliveryTargets, + enabled: open }) useEffect(() => { @@ -774,9 +895,10 @@ function CronEditorDialog({ setSchedulePreset(initial ? scheduleOptionForExpr(jobScheduleExpr(initial)).value : 'daily') setDeliver(initial ? jobDeliver(initial) : DEFAULT_DELIVER) setModelChoice(initial && jobModel(initial) ? `${jobProvider(initial)}:${jobModel(initial)}` : MODEL_DEFAULT_VALUE) + setSlotValues(blueprint ? initialBlueprintValues(blueprint) : {}) setError(null) setSaving(false) - }, [initial, open]) + }, [blueprint, initial, open]) const selectedScheduleOption = SCHEDULE_OPTIONS.find(candidate => candidate.value === schedulePreset) ?? SCHEDULE_OPTIONS[0] @@ -855,15 +977,86 @@ function CronEditorDialog({ } } + async function handleBlueprintSubmit(event: React.FormEvent) { + event.preventDefault() + + if (!isBlueprint) { + return + } + + setSaving(true) + setError(null) + + try { + await onBlueprintCreate(editor.blueprint, slotValues, editor.profile) + } catch (err) { + // 422 carries the slot-level validation message; surface it inline. + setError(cleanBlueprintFieldError(err instanceof Error ? err.message : String(err))) + } finally { + setSaving(false) + } + } + return ( !value && !saving && onClose()} open={open}> - {isEdit ? c.editTitle : c.createTitle} - {isEdit ? c.editDesc : c.createDesc} + {isBlueprint ? blueprint?.title : isEdit ? c.editTitle : c.createTitle} + + {isBlueprint ? blueprint?.description || c.blueprints.dialogDesc : isEdit ? c.editDesc : c.createDesc} + -
+ {isBlueprint && blueprint ? ( + + {blueprint.fields.map(field => { + const fieldId = `blueprint-${blueprint.key}-${field.name}` + const help = blueprintSlotHelp(field) + + return ( + + {field.name === 'deliver' ? ( + // Use the shared, backend-sourced delivery targets (same as the + // manual editor) rather than the blueprint's static field.options, + // so both dialogs offer exactly the connected platforms. + setSlotValues(prev => ({ ...prev, [field.name]: next }))} + targets={deliveryTargets.data ?? []} + value={slotValues[field.name] ?? DEFAULT_DELIVER} + /> + ) : ( + setSlotValues(prev => ({ ...prev, [field.name]: next }))} + value={slotValues[field.name] ?? ''} + /> + )} + {help && {help}} + + ) + })} + + {error && ( +
+ + {error} +
+ )} + + + + + +
+ ) : ( +
{scriptOnlyJob && initial && ( {c.scriptOnlyEditHint} {initial.id} @@ -907,18 +1100,13 @@ function CronEditorDialog({ - + @@ -990,6 +1178,7 @@ function CronEditorDialog({ + )}
) @@ -1023,7 +1212,11 @@ function FieldHint({ children }: { children: React.ReactNode }) { return

{children}

} -type EditorState = { mode: 'closed' } | { mode: 'create' } | { job: CronJob; mode: 'edit' } +type EditorState = + | { blueprint: AutomationBlueprint; mode: 'blueprint'; profile: string } + | { job: CronJob; mode: 'edit' } + | { mode: 'closed' } + | { mode: 'create' } interface EditorValues { deliver: string diff --git a/apps/desktop/src/app/overlays/panel.tsx b/apps/desktop/src/app/overlays/panel.tsx index 2561740724ec..d4109a2f221b 100644 --- a/apps/desktop/src/app/overlays/panel.tsx +++ b/apps/desktop/src/app/overlays/panel.tsx @@ -71,7 +71,11 @@ interface PanelHeaderProps { export function PanelHeader({ actions, subtitle, title }: PanelHeaderProps) { return ( -
+ // The overlay's close (X) is absolutely positioned at right-3 and costs no + // layout space, so header actions would otherwise slide right up against it. + // Reserve clearance (button footprint from the card edge + a small gap) on + // the right whenever actions are present. +

{title}

{subtitle ?

{subtitle}

: null} diff --git a/apps/desktop/src/components/ui/dialog-dismiss-repro.test.tsx b/apps/desktop/src/components/ui/dialog-dismiss-repro.test.tsx new file mode 100644 index 000000000000..f8daa94ef004 --- /dev/null +++ b/apps/desktop/src/components/ui/dialog-dismiss-repro.test.tsx @@ -0,0 +1,87 @@ +import { cleanup, fireEvent, render, screen } from '@testing-library/react' +import { afterEach, describe, expect, it, vi } from 'vitest' + +import { Dialog, DialogContent, DialogTitle } from './dialog' +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from './select' + +afterEach(cleanup) + +// jsdom lacks these; Radix Select calls them on open. +window.HTMLElement.prototype.scrollIntoView = vi.fn() +window.HTMLElement.prototype.hasPointerCapture = vi.fn() +window.HTMLElement.prototype.releasePointerCapture = vi.fn() + +const flushTimers = () => new Promise(resolve => setTimeout(resolve, 10)) + +describe('REPRO: dismissing an open Select inside a Dialog', () => { + it('closes only the select, not the dialog, when the press lands on the overlay', async () => { + // While a modal Select is open, the dialog content div is pointer-events: + // none, so a real click anywhere in the dialog body hit-tests through to + // the overlay. Simulate that by firing the pointer sequence on the overlay. + const onOpenChange = vi.fn() + render( + + + Test dialog + + + + ) + + // DismissableLayer registers its document pointerdown listener in a + // setTimeout(0) — flush it first. + await flushTimers() + + const overlay = document.querySelector('[data-slot="dialog-overlay"]') as HTMLElement + expect(overlay).toBeTruthy() + expect(screen.getByText('Option A')).toBeTruthy() + + fireEvent.pointerDown(overlay, { button: 0 }) + fireEvent.pointerUp(overlay, { button: 0 }) + fireEvent.click(overlay, { button: 0 }) + + // The deferred dismissal path resolves through another setTimeout(0). + await flushTimers() + + // The select closed... + expect(screen.queryByText('Option A')).toBeNull() + // ...but the dialog must NOT have been asked to close. + expect(onOpenChange).not.toHaveBeenCalledWith(false) + }) + + it('still closes the dialog on a genuine overlay click when no dropdown is open', async () => { + const onOpenChange = vi.fn() + render( + + + Test dialog + + + + ) + + await flushTimers() + + const overlay = document.querySelector('[data-slot="dialog-overlay"]') as HTMLElement + fireEvent.pointerDown(overlay, { button: 0 }) + fireEvent.pointerUp(overlay, { button: 0 }) + fireEvent.click(overlay, { button: 0 }) + await flushTimers() + + expect(onOpenChange).toHaveBeenCalledWith(false) + }) +}) diff --git a/apps/desktop/src/components/ui/dialog-portal-context.ts b/apps/desktop/src/components/ui/dialog-portal-context.ts new file mode 100644 index 000000000000..88dde1f6b958 --- /dev/null +++ b/apps/desktop/src/components/ui/dialog-portal-context.ts @@ -0,0 +1,29 @@ +import * as React from 'react' + +// Layering system for portalled popovers (Select / Popover / DropdownMenu) that +// open INSIDE a Dialog. +// +// By default every Radix popover portals to `document.body`, i.e. as a sibling +// of the Dialog — OUTSIDE the dialog's DOM subtree. That breaks two things: +// 1. Dismissing the popover (clicking elsewhere in the dialog) moves focus and +// fires pointer/focus events the Dialog's DismissableLayer reads as +// "outside", so the whole dialog closes. +// 2. z-index across separate body-level portals is fragile — the popover and +// dialog live in different stacking siblings. +// +// The fix: a Dialog publishes its own content node here; any popover rendered +// inside that Dialog portals into that node instead of `document.body`. Now the +// popover is a real DOM descendant of the dialog — focus never leaves, the +// DismissableLayer sees it as inside, and it shares the dialog's stacking +// context so z-index is deterministic. Outside a dialog the value is null and +// popovers fall back to the default body portal. +export const DialogPortalContainerContext = React.createContext(null) + +// The container a popover should portal into: an explicit `container` prop wins, +// then the enclosing dialog's content node, then undefined (Radix default: +// document.body). +export function usePopoverPortalContainer(explicit?: HTMLElement | null): HTMLElement | undefined { + const fromDialog = React.useContext(DialogPortalContainerContext) + + return explicit ?? fromDialog ?? undefined +} diff --git a/apps/desktop/src/components/ui/dialog.test.tsx b/apps/desktop/src/components/ui/dialog.test.tsx index 4b6d99a9bf01..afebf60760dc 100644 --- a/apps/desktop/src/components/ui/dialog.test.tsx +++ b/apps/desktop/src/components/ui/dialog.test.tsx @@ -2,9 +2,40 @@ import { cleanup, fireEvent, render, screen, waitFor } from '@testing-library/re import { afterEach, describe, expect, it, vi } from 'vitest' import { Dialog, DialogContent, DialogTitle, preventCloseButtonAutoFocus } from './dialog' +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from './select' afterEach(cleanup) +describe('Select portalled inside a Dialog', () => { + it('renders the open dropdown inside the dialog DOM subtree, not document.body', () => { + // Force the Select open (defaultOpen) to sidestep jsdom's missing + // hasPointerCapture on the trigger. The dropdown content must land inside the + // dialog content node — that DOM nesting is what keeps focus in the dialog so + // dismissing the dropdown no longer closes the dialog. + render( + + + Test dialog + + + + ) + + const dialog = screen.getByRole('dialog') + const option = screen.getByText('Option A') + + // The dropdown item is a descendant of the dialog, i.e. portalled into it. + expect(dialog.contains(option)).toBe(true) + }) +}) + describe('DialogContent close button', () => { it('closes the dialog when clicked', () => { const onOpenChange = vi.fn() diff --git a/apps/desktop/src/components/ui/dialog.tsx b/apps/desktop/src/components/ui/dialog.tsx index a88ebc086e18..d84bb30c3453 100644 --- a/apps/desktop/src/components/ui/dialog.tsx +++ b/apps/desktop/src/components/ui/dialog.tsx @@ -2,6 +2,7 @@ import { Dialog as DialogPrimitive } from 'radix-ui' import * as React from 'react' import { Button } from '@/components/ui/button' +import { DialogPortalContainerContext } from '@/components/ui/dialog-portal-context' import { Tip } from '@/components/ui/tooltip' import { useI18n } from '@/i18n' import { X } from '@/lib/icons' @@ -85,6 +86,15 @@ function DialogContent({ const widthClass = fitContent ? 'w-auto max-w-[92vw]' : 'w-full max-w-lg' + // Publish the dialog's content node so popovers (Select / Popover / + // DropdownMenu) opened inside it portal INTO the dialog instead of + // document.body. That keeps them as DOM descendants — focus never leaves the + // dialog, so dismissing a dropdown (or clicking another field) no longer + // trips the Dialog's outside-interaction/focus-out close. See + // dialog-portal-context.ts. State (not just a ref) so consumers re-render once + // the node mounts. + const [contentNode, setContentNode] = React.useState(null) + // No default here — Radix's normal autofocus (first focusable element, often // an input) is what most dialogs want. Dialogs with no input should pass // `onOpenAutoFocus={preventCloseButtonAutoFocus}` explicitly instead. @@ -129,25 +139,28 @@ function DialogContent({ )} data-slot="dialog-content" onOpenAutoFocus={onOpenAutoFocus} + ref={setContentNode} {...props} > - {/* Scroll lives on an inner box so this shell keeps a painted bottom radius. */} -
-
{children}
-
-
- {banner} -
- {closeButton} + + {/* Scroll lives on an inner box so this shell keeps a painted bottom radius. */} +
+
{children}
+
+
+ {banner} +
+ {closeButton} +
) @@ -167,10 +180,13 @@ function DialogContent({ )} data-slot="dialog-content" onOpenAutoFocus={onOpenAutoFocus} + ref={setContentNode} {...props} > - {children} - {closeButton} + + {children} + {closeButton} + ) diff --git a/apps/desktop/src/components/ui/dropdown-menu.tsx b/apps/desktop/src/components/ui/dropdown-menu.tsx index 7c4c7072c129..57db60fba68d 100644 --- a/apps/desktop/src/components/ui/dropdown-menu.tsx +++ b/apps/desktop/src/components/ui/dropdown-menu.tsx @@ -2,6 +2,7 @@ import { DropdownMenu as DropdownMenuPrimitive } from 'radix-ui' import * as React from 'react' import { Codicon } from '@/components/ui/codicon' +import { usePopoverPortalContainer } from '@/components/ui/dialog-portal-context' import { cn } from '@/lib/utils' // Shared class tokens for edge-to-edge menus (use with `p-0` content): rows go @@ -73,8 +74,12 @@ function DropdownMenuContent({ sideOffset = 4, ...props }: React.ComponentProps) { + // Portal into the enclosing dialog when nested in one, so dismissing the menu + // doesn't close the dialog; document.body otherwise. + const container = usePopoverPortalContainer() + return ( - + ) { @@ -27,8 +28,12 @@ function PopoverContent({ sideOffset = 6, ...props }: React.ComponentProps) { + // Portal into the enclosing dialog when nested in one (keeps focus inside so + // the dialog doesn't close on dismiss); document.body otherwise. + const container = usePopoverPortalContainer() + return ( - + ) { @@ -43,8 +44,13 @@ function SelectContent({ position = 'popper', ...props }: React.ComponentProps) { + // Portal into the enclosing dialog (if any) so the dropdown is a DOM + // descendant of the dialog — keeps focus inside and stops the dialog closing + // when the dropdown is dismissed. Falls back to document.body outside a dialog. + const container = usePopoverPortalContainer() + return ( - + { + const { targets } = await window.hermesDesktop.api<{ targets: CronDeliveryTarget[] }>({ + ...profileScoped(), + path: '/api/cron/delivery-targets' + }) + + return targets ?? [] +} + export function createCronJob(body: CronJobCreatePayload): Promise { return window.hermesDesktop.api({ ...profileScoped(), @@ -1261,6 +1278,37 @@ export function deleteCronJob(jobId: string): Promise<{ ok: boolean }> { }) } +// Automation Blueprints — parameterized cron templates the backend serves from +// cron/blueprint_catalog.py. getAutomationBlueprints returns the gallery +// (deliver options already rewritten to this machine's configured gateways); +// instantiateAutomationBlueprint fills the slots and creates a real cron job via +// the same create_job path as createCronJob. +// +// Profile-scoping is intentionally asymmetric: the GET catalog is global (the +// list endpoint takes no profile — only deliver options are rewritten from the +// configured gateways), so it carries only the profileScoped() header for +// routing. instantiate creates a real per-profile job, so it names the target +// profile explicitly via ?profile=. This mirrors the dashboard's api.ts. +export function getAutomationBlueprints(): Promise<{ blueprints: AutomationBlueprint[] }> { + return window.hermesDesktop.api<{ blueprints: AutomationBlueprint[] }>({ + ...profileScoped(), + path: '/api/cron/blueprints', + timeoutMs: STARTUP_REQUEST_TIMEOUT_MS + }) +} + +export function instantiateAutomationBlueprint( + body: { blueprint: string; values: Record }, + profile: string +): Promise { + return window.hermesDesktop.api({ + ...profileScoped(), + path: `/api/cron/blueprints/instantiate?profile=${encodeURIComponent(profile)}`, + method: 'POST', + body + }) +} + export function getProfiles(): Promise { return window.hermesDesktop.api({ path: '/api/profiles', diff --git a/apps/desktop/src/i18n/en.ts b/apps/desktop/src/i18n/en.ts index 5cd85f032737..141675550f1f 100644 --- a/apps/desktop/src/i18n/en.ts +++ b/apps/desktop/src/i18n/en.ts @@ -1669,6 +1669,7 @@ export const en: Translations = { promptPlaceholder: 'Summarize my unread Slack threads and email me the top 5...', frequencyLabel: 'Frequency', deliverLabel: 'Deliver to', + deliverNeedsHomeChannel: 'set a home channel first', modelLabel: 'Model', modelDefault: 'Default (global model)', customScheduleLabel: 'Custom schedule', @@ -1680,7 +1681,23 @@ export const en: Translations = { scheduleRequired: 'Schedule is required.', scriptOnlyEditHint: 'Script-only job (no AI prompt). Job id:', saveChanges: 'Save changes', - createAction: 'Create cron' + createAction: 'Create cron', + tabs: { + jobs: 'Jobs', + blueprints: 'Blueprints' + }, + blueprints: { + tab: 'Blueprints', + subtitle: 'Ready-made automations', + dialogDesc: 'Fill in the details and schedule it.', + scheduleIt: 'Schedule it', + scheduling: 'Scheduling...', + scheduled: 'Blueprint scheduled', + loading: 'Loading blueprints...', + failedLoad: 'Failed to load blueprints', + emptyTitle: 'No blueprints available', + emptyDesc: 'No automation blueprints are available on this backend.' + } }, artifacts: { diff --git a/apps/desktop/src/i18n/ja.ts b/apps/desktop/src/i18n/ja.ts index 9c640512595a..e4ee9999e34d 100644 --- a/apps/desktop/src/i18n/ja.ts +++ b/apps/desktop/src/i18n/ja.ts @@ -1541,6 +1541,7 @@ export const ja = defineLocale({ promptPlaceholder: '実行ごとにエージェントが行う内容は?', frequencyLabel: '頻度', deliverLabel: '配信先', + deliverNeedsHomeChannel: '先にホームチャンネルを設定してください', modelLabel: 'モデル', modelDefault: 'デフォルト(グローバルモデル)', customScheduleLabel: 'カスタムスケジュール', @@ -1552,7 +1553,23 @@ export const ja = defineLocale({ scheduleRequired: 'スケジュールは必須です。', scriptOnlyEditHint: 'スクリプトのみのジョブ(AI プロンプトなし)。ジョブ ID:', saveChanges: '変更を保存', - createAction: 'Cron を作成' + createAction: 'Cron を作成', + tabs: { + jobs: 'ジョブ', + blueprints: 'ブレーンプリント' + }, + blueprints: { + tab: 'ブレーンプリント', + subtitle: 'すぐに使える自動化', + dialogDesc: '詳細を入力してスケジュールします。', + scheduleIt: 'スケジュールする', + scheduling: 'スケジュール中...', + scheduled: 'ブレーンプリントをスケジュールしました', + loading: 'ブレーンプリントを読み込み中...', + failedLoad: 'ブレーンプリントの読み込みに失敗しました', + emptyTitle: '利用できるブレーンプリントはありません', + emptyDesc: 'このバックエンドで利用できる自動化ブレーンプリントはありません。' + } }, artifacts: { diff --git a/apps/desktop/src/i18n/types.ts b/apps/desktop/src/i18n/types.ts index d7c8bc39f8b5..a6961ac3363c 100644 --- a/apps/desktop/src/i18n/types.ts +++ b/apps/desktop/src/i18n/types.ts @@ -1380,6 +1380,7 @@ export interface Translations { promptPlaceholder: string frequencyLabel: string deliverLabel: string + deliverNeedsHomeChannel: string modelLabel: string modelDefault: string customScheduleLabel: string @@ -1392,6 +1393,22 @@ export interface Translations { scriptOnlyEditHint: string saveChanges: string createAction: string + tabs: { + jobs: string + blueprints: string + } + blueprints: { + tab: string + subtitle: string + dialogDesc: string + scheduleIt: string + scheduling: string + scheduled: string + loading: string + failedLoad: string + emptyTitle: string + emptyDesc: string + } } artifacts: { diff --git a/apps/desktop/src/i18n/zh-hant.ts b/apps/desktop/src/i18n/zh-hant.ts index a61b5b4373b7..53d5f464b213 100644 --- a/apps/desktop/src/i18n/zh-hant.ts +++ b/apps/desktop/src/i18n/zh-hant.ts @@ -1490,6 +1490,7 @@ export const zhHant = defineLocale({ promptPlaceholder: '代理每次執行時應做什麼?', frequencyLabel: '頻率', deliverLabel: '傳遞至', + deliverNeedsHomeChannel: '請先設定主頻道', modelLabel: '模型', modelDefault: '預設(全域模型)', customScheduleLabel: '自訂排程', @@ -1501,7 +1502,23 @@ export const zhHant = defineLocale({ scheduleRequired: '排程為必填項目。', scriptOnlyEditHint: '僅腳本任務(無 AI 提示詞)。任務 ID:', saveChanges: '儲存變更', - createAction: '建立排程工作' + createAction: '建立排程工作', + tabs: { + jobs: '工作', + blueprints: '藍圖' + }, + blueprints: { + tab: '藍圖', + subtitle: '現成的自動化', + dialogDesc: '填寫詳細資訊並進行排程。', + scheduleIt: '安排工作', + scheduling: '安排中...', + scheduled: '藍圖已安排', + loading: '正在載入藍圖...', + failedLoad: '載入藍圖失敗', + emptyTitle: '沒有可用的藍圖', + emptyDesc: '此後端上沒有可用的自動化藍圖。' + } }, artifacts: { diff --git a/apps/desktop/src/i18n/zh.ts b/apps/desktop/src/i18n/zh.ts index e6934b359bf5..4a5b41fd0159 100644 --- a/apps/desktop/src/i18n/zh.ts +++ b/apps/desktop/src/i18n/zh.ts @@ -1860,6 +1860,7 @@ export const zh: Translations = { promptPlaceholder: '总结我未读的 Slack 话题,并把前 5 条邮件发给我…', frequencyLabel: '频率', deliverLabel: '投递至', + deliverNeedsHomeChannel: '请先设置主频道', modelLabel: '模型', modelDefault: '默认(全局模型)', customScheduleLabel: '自定义排程', @@ -1871,7 +1872,23 @@ export const zh: Translations = { scheduleRequired: '排程为必填项。', scriptOnlyEditHint: '仅脚本任务(无 AI 提示词)。任务 ID:', saveChanges: '保存更改', - createAction: '创建定时任务' + createAction: '创建定时任务', + tabs: { + jobs: '任务', + blueprints: '蓝图' + }, + blueprints: { + tab: '蓝图', + subtitle: '现成的自动化', + dialogDesc: '填写详细信息并进行排程。', + scheduleIt: '安排任务', + scheduling: '安排中...', + scheduled: '蓝图已安排', + loading: '正在加载蓝图...', + failedLoad: '加载蓝图失败', + emptyTitle: '没有可用的蓝图', + emptyDesc: '此后端上没有可用的自动化蓝图。' + } }, artifacts: { diff --git a/apps/desktop/src/types/hermes.ts b/apps/desktop/src/types/hermes.ts index 6afdb5dbf07e..d811e07ed57c 100644 --- a/apps/desktop/src/types/hermes.ts +++ b/apps/desktop/src/types/hermes.ts @@ -728,6 +728,46 @@ export interface CronJobUpdates { schedule?: string } +// A cron delivery target from GET /api/cron/delivery-targets — the single +// source of truth (cron.scheduler.cron_delivery_targets) for where a cron job +// can auto-deliver. Only 'local' plus configured gateway platforms appear; a +// configured platform without a cron home channel comes back with +// home_target_set=false so the UI can flag it. +export interface CronDeliveryTarget { + home_env_var: null | string + home_target_set: boolean + id: string + name: string +} + +// Automation Blueprints — parameterized cron templates with typed slots. The +// backend (cron/blueprint_catalog.py) is the single source of truth; the +// desktop renders each slot as a form field, then instantiates a real cron job +// via the same create_job path as everything else. Shapes mirror the JSON from +// GET /api/cron/blueprints (blueprint_catalog_entry). +export interface AutomationBlueprintField { + name: string + type: 'enum' | 'text' | 'time' | 'weekdays' + label: string + default: null | string + options: string[] + optional: boolean + /** When false, options are suggestions — any value is accepted. */ + strict?: boolean + help: string +} + +export interface AutomationBlueprint { + key: string + title: string + description: string + category: string + tags: string[] + fields: AutomationBlueprintField[] + command: string + appUrl: string +} + export interface ProfileCreatePayload { clone_all?: boolean clone_from?: null | string diff --git a/package-lock.json b/package-lock.json index 62cf14905b69..0ee09bbcb294 100644 --- a/package-lock.json +++ b/package-lock.json @@ -130,7 +130,7 @@ "motion": "^12.38.0", "nanostores": "^1.3.0", "node-pty": "1.1.0", - "radix-ui": "^1.4.3", + "radix-ui": "^1.6.5", "react": "^19.2.5", "react-arborist": "^3.5.0", "react-dnd-html5-backend": "^14.0.3", @@ -1939,7 +1939,6 @@ "os": [ "aix" ], - "peer": true, "engines": { "node": ">=18" } @@ -1956,7 +1955,6 @@ "os": [ "android" ], - "peer": true, "engines": { "node": ">=18" } @@ -1973,7 +1971,6 @@ "os": [ "android" ], - "peer": true, "engines": { "node": ">=18" } @@ -1990,7 +1987,6 @@ "os": [ "android" ], - "peer": true, "engines": { "node": ">=18" } @@ -2007,7 +2003,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">=18" } @@ -2024,7 +2019,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">=18" } @@ -2041,7 +2035,6 @@ "os": [ "freebsd" ], - "peer": true, "engines": { "node": ">=18" } @@ -2058,7 +2051,6 @@ "os": [ "freebsd" ], - "peer": true, "engines": { "node": ">=18" } @@ -2075,7 +2067,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -2092,7 +2083,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -2109,7 +2099,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -2126,7 +2115,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -2143,7 +2131,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -2160,7 +2147,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -2177,7 +2163,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -2194,7 +2179,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -2211,7 +2195,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -2228,7 +2211,6 @@ "os": [ "netbsd" ], - "peer": true, "engines": { "node": ">=18" } @@ -2245,7 +2227,6 @@ "os": [ "netbsd" ], - "peer": true, "engines": { "node": ">=18" } @@ -2262,7 +2243,6 @@ "os": [ "openbsd" ], - "peer": true, "engines": { "node": ">=18" } @@ -2279,7 +2259,6 @@ "os": [ "openbsd" ], - "peer": true, "engines": { "node": ">=18" } @@ -2296,7 +2275,6 @@ "os": [ "openharmony" ], - "peer": true, "engines": { "node": ">=18" } @@ -2313,7 +2291,6 @@ "os": [ "sunos" ], - "peer": true, "engines": { "node": ">=18" } @@ -2330,7 +2307,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">=18" } @@ -2347,7 +2323,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">=18" } @@ -2364,7 +2339,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">=18" } @@ -3340,24 +3314,24 @@ } }, "node_modules/@radix-ui/number": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.2.tgz", - "integrity": "sha512-ceTwaxc4I5IOi97DgCotl3pqiyRGvffcc0oOsE2dQYaJOFIDsDt4VWG6xEbg1QePv9QWausCEIppud/tJ1wNig==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.3.tgz", + "integrity": "sha512-Road2bidD0uu/1BGDOWNdPI06g0lIRy6IF9GZcIrDK2KGItfor8IQwQa+yM2ERgHM1MmHxaxpTzk0/Jp42lNfA==", "license": "MIT" }, "node_modules/@radix-ui/primitive": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.4.tgz", - "integrity": "sha512-7AdCK9PQyiljKoBDbN8OuctCbd/esdwZPQ8RtOE3SsyQtUpiPb+ND75q0jEhC1m1ecBI0MFNeLJvwIh9iKHRcQ==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.7.tgz", + "integrity": "sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q==", "license": "MIT" }, "node_modules/@radix-ui/react-accessible-icon": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-accessible-icon/-/react-accessible-icon-1.1.10.tgz", - "integrity": "sha512-TraSwZUqTcVbiDV2/RXzAXC7aeVVXchq0daPFZE7zAxYFaMzjOUggLOfQH9KFLgRizuwVKZO/crveV1eeO3/ZQ==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accessible-icon/-/react-accessible-icon-1.1.13.tgz", + "integrity": "sha512-2/0RrtTngKZVkOFYDlvhe6JIsUravRnYGwH1iJ+qt+wPu8/fPu3HTLRkQptyIkpLovAy8qvHHJs9cvYJ3Uyqqg==", "license": "MIT", "dependencies": { - "@radix-ui/react-visually-hidden": "1.2.6" + "@radix-ui/react-visually-hidden": "1.2.9" }, "peerDependencies": { "@types/react": "*", @@ -3375,20 +3349,20 @@ } }, "node_modules/@radix-ui/react-accordion": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.14.tgz", - "integrity": "sha512-iE8YB9nmTBH8zd73ofBISZ8JCzgMoMkATJr7qDwa6u5F1+7mTM81V6fa71jgZ65rpjVpecDf1vSnwIFP9Ly1zw==", + "version": "1.2.18", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.18.tgz", + "integrity": "sha512-CGuUFvhjScXBF/bhjaU9xlgai2ikYqJRazXhMzngoUaZI7QaxAw24Ae3S/pR0b69p8GqW6i+CKJmx9JPNnZ4QQ==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-collapsible": "1.1.14", - "@radix-ui/react-collection": "1.1.10", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-use-controllable-state": "1.2.3" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collapsible": "1.1.18", + "@radix-ui/react-collection": "1.1.13", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-direction": "1.1.3", + "@radix-ui/react-id": "1.1.3", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-controllable-state": "1.2.5" }, "peerDependencies": { "@types/react": "*", @@ -3406,16 +3380,16 @@ } }, "node_modules/@radix-ui/react-alert-dialog": { - "version": "1.1.17", - "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.17.tgz", - "integrity": "sha512-563ygGeyWPrxyVCNp7OV4rE2aIXhFPknpFyo4wbDlcyMMPZ6ySh+zC5WTvY0ZFLgPTg/QB6tA8PyDQyJ2b4cPg==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.21.tgz", + "integrity": "sha512-VbSR148lNkE8JdWnOsYX72YdivmCAtcrot1dl8UmT0ZZRKNR3hHJUpQxJOw7jWlY/JFemn4oaDXxCxpD594B7Q==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-dialog": "1.1.17", - "@radix-ui/react-primitive": "2.1.6" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-dialog": "1.1.21", + "@radix-ui/react-primitive": "2.1.8" }, "peerDependencies": { "@types/react": "*", @@ -3433,12 +3407,12 @@ } }, "node_modules/@radix-ui/react-arrow": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.10.tgz", - "integrity": "sha512-j2VTDz1vgCsmuG0k5lBfOcM8n5JPFqZBcMryasFjHYMhwxYL5SRUV5lMSUpRdNtw3D/Sv8pzJtrlAgkssYSsQQ==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.13.tgz", + "integrity": "sha512-0Q310knIY0K+mkmncU9FxLggfW7V49Ok2oY+iu27KkERTsQXxYCIC8XW5QoK4w7Jp1z00vT5xj3oxTcn7QlcTg==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.6" + "@radix-ui/react-primitive": "2.1.8" }, "peerDependencies": { "@types/react": "*", @@ -3456,12 +3430,12 @@ } }, "node_modules/@radix-ui/react-aspect-ratio": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.10.tgz", - "integrity": "sha512-kbI7NrqhDeuytYrq7JjAsoXczvL8wgj2tc1MyaYWm+50bMKHCHQtVWCryslx4cCpmCTTkBcwQckE4CmmGV2haQ==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.13.tgz", + "integrity": "sha512-dD/EvbOiLskcdBKgNAeUmbTBCJfdCGp85fpFe3lmziE4ASbXuFERQCAB3sR41yvM+P711kJsTBNL9piP60urbA==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.6" + "@radix-ui/react-primitive": "2.1.8" }, "peerDependencies": { "@types/react": "*", @@ -3479,16 +3453,17 @@ } }, "node_modules/@radix-ui/react-avatar": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.2.0.tgz", - "integrity": "sha512-am/CwltXtmtdtP+5FbYblYDnMa/zuKcMJP1i3/SJMDXXfj2mG+BTqLH2wucqeyyiQMursUtg/5cK+Nh2pCaSOA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.2.4.tgz", + "integrity": "sha512-u4Sz6ajq2WobGMqbsNXnFI/3JP/o7TUBkEmQ4BRUYofPDQawdO3WWYy5907c9VgOFX+ETjKI3VxnnrKYAF7Pmg==", "license": "MIT", "dependencies": { - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-is-hydrated": "0.1.1", - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-callback-ref": "1.1.3", + "@radix-ui/react-use-is-hydrated": "0.1.2", + "@radix-ui/react-use-layout-effect": "1.1.3" }, "peerDependencies": { "@types/react": "*", @@ -3506,19 +3481,18 @@ } }, "node_modules/@radix-ui/react-checkbox": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.5.tgz", - "integrity": "sha512-pREzrmNnVwGvYaBoM64huTRK7B3lrTRuwj8A9nwhPiEtMb+yudiWh6zWAqEtP0Dzd5+iBa1Ki7V1pCxV8ExMdA==", + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.9.tgz", + "integrity": "sha512-YPXZlqjrKVqKtVD2F828CApHwu+PEu30i7x0Y9gg6SbQ3fJbcaQlDkGPT0gW6HjxoCjAEt8uJ494F1S61KpIjQ==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-use-controllable-state": "1.2.3", - "@radix-ui/react-use-previous": "1.1.2", - "@radix-ui/react-use-size": "1.1.2" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-presence": "1.1.9", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-controllable-state": "1.2.5", + "@radix-ui/react-use-size": "1.1.3" }, "peerDependencies": { "@types/react": "*", @@ -3536,19 +3510,19 @@ } }, "node_modules/@radix-ui/react-collapsible": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.14.tgz", - "integrity": "sha512-9bT+FvifX1FK2Mj6UEsTdyu0cN3JaA3KdfhaBao+ONrYFy/pyOy3TU1TNw7iOk1o+0hOEq67RojlUUmoFGwxyA==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.18.tgz", + "integrity": "sha512-aNMp8humfYzWERz5gxGb/eLNkB0ZthypLbNlNolzdgzFTeN78e/rnn9rxCdOaSsg/zClTOJ/OkjXYx9PUEPATw==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-use-controllable-state": "1.2.3", - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-id": "1.1.3", + "@radix-ui/react-presence": "1.1.9", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-controllable-state": "1.2.5", + "@radix-ui/react-use-layout-effect": "1.1.3" }, "peerDependencies": { "@types/react": "*", @@ -3566,15 +3540,15 @@ } }, "node_modules/@radix-ui/react-collection": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.10.tgz", - "integrity": "sha512-IVVz4EvBcKjrzKgof714qDnz/SzQAkLA2Emh5edlHbgcE6fNd3Un6CJLlaYcnm8N4JmAtzQgse4dOKxcD2yc9g==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.13.tgz", + "integrity": "sha512-Q8xYqNRFObXPmi45bFSkGdM2JA5hjBeYGFqzg6lZR3wp6b+cciraVq8DdneTabtws+uOYqjmsvmKOufk/M9Cyg==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-slot": "1.3.0" + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-slot": "1.3.1" }, "peerDependencies": { "@types/react": "*", @@ -3592,9 +3566,9 @@ } }, "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.3.tgz", - "integrity": "sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.4.tgz", + "integrity": "sha512-pWJo6lQAfR6uy1n7ii7PaCc9dLPwTXDYbQpORZU5B548Aqvl2pP1SM1vJGKyxIFqZMHRopRO4CQYX2iXAIB5jA==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -3607,9 +3581,9 @@ } }, "node_modules/@radix-ui/react-context": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.4.tgz", - "integrity": "sha512-QwH4PO5urrbO+FaGd5Aglg+YJgWTyyuZ3g/6mKvsqraLkglDdckw9JafgL5McL5VEJ6EPNduPaT3ZE9BttDAqg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.2.1.tgz", + "integrity": "sha512-EraVbFjiIjibpLr6EjvEDmSCYJU2SlKDMiO+qEK/D9GOWnQoAQlpQo2occGYC1UM9MBeEx5Bek3UtW/Qi57vAg==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -3622,16 +3596,16 @@ } }, "node_modules/@radix-ui/react-context-menu": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.3.1.tgz", - "integrity": "sha512-XbrxS68W5dyiE4fAb96yvJwSVU5x66B20A99sD5Mk3xSWK/LqeOnx6TZnim1KieMjXS/CTFq8reOAjWxas2G8Q==", + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.3.5.tgz", + "integrity": "sha512-wbvSjqc7r0xKmfhrMCiCPxSTv/aSHU0cCAy0tELthJbaIzT7dkAcevKuoGKbDLiPG2VePgMVqLi2sWb6tDnzvQ==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-menu": "2.1.18", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-use-controllable-state": "1.2.3" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-menu": "2.1.22", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-controllable-state": "1.2.5" }, "peerDependencies": { "@types/react": "*", @@ -3649,23 +3623,24 @@ } }, "node_modules/@radix-ui/react-dialog": { - "version": "1.1.17", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.17.tgz", - "integrity": "sha512-TDTYmpdq8dI2+Xgvgj9AJ8Ghqq+Eph/TRVEdaFQPDItIY+6QSkU7MJMeevw1568Yw/2Ijz8BTphPSP2XejKphw==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.21.tgz", + "integrity": "sha512-h+7qMDDmZJ8qTSPrwNyKb/PACY0ehtN8QOBlCz+C2C1jgehKekdhmHddG9YQk8BF/sHJqglPjte+jA1Jrp9HcA==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-dismissable-layer": "1.1.13", - "@radix-ui/react-focus-guards": "1.1.4", - "@radix-ui/react-focus-scope": "1.1.10", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-portal": "1.1.12", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-slot": "1.3.0", - "@radix-ui/react-use-controllable-state": "1.2.3", + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-dismissable-layer": "1.1.17", + "@radix-ui/react-focus-guards": "1.1.5", + "@radix-ui/react-focus-scope": "1.1.14", + "@radix-ui/react-id": "1.1.3", + "@radix-ui/react-portal": "1.1.15", + "@radix-ui/react-presence": "1.1.9", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-slot": "1.3.1", + "@radix-ui/react-use-controllable-state": "1.2.5", + "@radix-ui/react-use-layout-effect": "1.1.3", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.7.2" }, @@ -3685,9 +3660,9 @@ } }, "node_modules/@radix-ui/react-direction": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.2.tgz", - "integrity": "sha512-C3vFhbyi4SW3PmbAi6Awpu4OzJtd0MxGurvSsYtr7p7nM8RNB3VAF3CUmnp2j50knpkrRcB7+ycVXzgLgF6yNA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.3.tgz", + "integrity": "sha512-OdgAA/xb6WOQMKNn0mtbYoruMG6YMaBOnq+evWxSpMmiEMBdeFZawnIWRfPPeVXCRm+0lnN8jpJLjhD7/UIxWw==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -3700,16 +3675,16 @@ } }, "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.13.tgz", - "integrity": "sha512-2v+zNAWWe0ySxgC0D0yeXMPQ23xZVgXZTerTz+JKlmdRj6gfTqmCcR29jb6d290DezXPGgruHWDX/vYUebtErg==", + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.17.tgz", + "integrity": "sha512-QAXwa38pG0xNAYh1pjdSaf86NrkqsMoDNmget/Y7X8O8E/C3Iqlj9GAPE4DfX9BPLXc7WH2TWSzMRnIoCdcjzQ==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-escape-keydown": "1.1.2" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-callback-ref": "1.1.3", + "@radix-ui/react-use-effect-event": "0.0.4" }, "peerDependencies": { "@types/react": "*", @@ -3727,18 +3702,18 @@ } }, "node_modules/@radix-ui/react-dropdown-menu": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.18.tgz", - "integrity": "sha512-PZGV82gFk0WltDRI//SsG28ZIjlo9ANTmoNYg0jLNzXXiDsAy5PkOOYQaVD1pPxY6t7gxffb1QMD6qaUvsBZdw==", + "version": "2.1.22", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.22.tgz", + "integrity": "sha512-wZRLTjZaJf1HTxx0YepFKZUuo+SZMi+Cr4kJ2fuA5FxDSUE0vHDTscahUaU+jfz6LFk4OuguwqJs5K0JsIsIBA==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-menu": "2.1.18", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-use-controllable-state": "1.2.3" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-id": "1.1.3", + "@radix-ui/react-menu": "2.1.22", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-controllable-state": "1.2.5" }, "peerDependencies": { "@types/react": "*", @@ -3756,9 +3731,9 @@ } }, "node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.4.tgz", - "integrity": "sha512-cot/aB/mOm0IYVYTTmQcEEK1M48lZWi8FlYe5nDPQQ8NYZUlXEFgncJ9p2Kzer3RKSrY7cTTpEMLZKNo9QoP5Q==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.5.tgz", + "integrity": "sha512-UQvlB7L/BYh3P8MLvwZnQkH521EDos40Rwnbt5+Qpg4Vbk0z3xJjRUmR6+aka4aT1IQQXFdO5bNPoE7cvFl5xQ==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -3771,14 +3746,14 @@ } }, "node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.10.tgz", - "integrity": "sha512-Fas/lXQqhVvqwAb64s5RFeHiHYElZ6SUQbZaNd6EkfhP/Al7wTIQ9WIR4QVX475tlu5yFCEdDcJH6/UwsZjMWw==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.14.tgz", + "integrity": "sha512-/x4htnJfmW53MplkrePaDpf1o/rN1C++g88WpVobULXbSyC19NtLkXmewuJ/HCaceSmfKDNL5gOXcBGnuAvnvQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-use-callback-ref": "1.1.2" + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-callback-ref": "1.1.3" }, "peerDependencies": { "@types/react": "*", @@ -3796,17 +3771,17 @@ } }, "node_modules/@radix-ui/react-form": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-form/-/react-form-0.1.10.tgz", - "integrity": "sha512-1NfuvctVtX4sU3Mmq/IdrR8UunxiCMiVg3A5UENKhFzxUBeOyaQQ+lmaQaV7Tc8cqvBKsJL3/KGBsixK0D8WFg==", + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-form/-/react-form-0.1.14.tgz", + "integrity": "sha512-ZCuPb54PQ3ZQEdQ6G1PrMBfXXzAyaVoCI9Fl+bWOwYZKTOcFjPHL7JQ3tCb6CX6Ut81GZLWKgIpV6OS3n5z5Ig==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-label": "2.1.10", - "@radix-ui/react-primitive": "2.1.6" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-id": "1.1.3", + "@radix-ui/react-label": "2.1.13", + "@radix-ui/react-primitive": "2.1.8" }, "peerDependencies": { "@types/react": "*", @@ -3824,20 +3799,20 @@ } }, "node_modules/@radix-ui/react-hover-card": { - "version": "1.1.17", - "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.17.tgz", - "integrity": "sha512-GjZQIEANVkuuWeztlKz6QEHe31ZX2iDfHzcTMCQVZXC0JyQrgfKWSC+LOOEw6aVV64zyjzobIzSA4AU4eKWrHA==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.21.tgz", + "integrity": "sha512-ByFLyi+kdTGkObxIt5wKB3Ru3rtJRuYUqPEtqiv1HNYqutqbn1wDuNmVzI6iwus9qfY3vwpNgvx/UVZUGTWC1A==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-dismissable-layer": "1.1.13", - "@radix-ui/react-popper": "1.3.1", - "@radix-ui/react-portal": "1.1.12", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-use-controllable-state": "1.2.3" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-dismissable-layer": "1.1.17", + "@radix-ui/react-popper": "1.3.5", + "@radix-ui/react-portal": "1.1.15", + "@radix-ui/react-presence": "1.1.9", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-controllable-state": "1.2.5" }, "peerDependencies": { "@types/react": "*", @@ -3855,12 +3830,12 @@ } }, "node_modules/@radix-ui/react-id": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.2.tgz", - "integrity": "sha512-orBC88futVpqCmhX1p4cvquNHsELQ+w+vBJnuj3ftETI5bJb0bZn3Tqu3SWN2IOcPycTnMGnhwoermvISt72sA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.3.tgz", + "integrity": "sha512-f/Wxm0ctyMymUJK0fqTSQlm85rbzdAkoNbPXJQ5+6caowVO8Yx+NWGjGz/oGhs/D+WIbbQpOrU0hU2Li2/42xQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/react-use-layout-effect": "1.1.3" }, "peerDependencies": { "@types/react": "*", @@ -3873,12 +3848,12 @@ } }, "node_modules/@radix-ui/react-label": { - "version": "2.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.10.tgz", - "integrity": "sha512-ib0zvq2ZsAqKm5tRnqGJn3vOxSgIts5ToxsXT0q1S/GfLD1Zj7UOEnkw8u2w6sRmn47djpQWuSU1DCL1R29/yw==", + "version": "2.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.13.tgz", + "integrity": "sha512-kj7BXyM4uG0dyeoEdVmPQAOFN291+iJOtiGTvkXe1ijJWLQbAHpFNkopvqquaMVn+zjqTZRhnefESAinMErHKg==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.6" + "@radix-ui/react-primitive": "2.1.8" }, "peerDependencies": { "@types/react": "*", @@ -3896,27 +3871,27 @@ } }, "node_modules/@radix-ui/react-menu": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.18.tgz", - "integrity": "sha512-lj8Rxjtn6zJq1oSbE/uDtAwCbB9BnxgHD+8MwJMuTh6u1dPamYhW9iuELr/Z8d0D/UysFblYYHeBPwi7T4k0YQ==", + "version": "2.1.22", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.22.tgz", + "integrity": "sha512-xCFrVLttGDPwMjIPI6GS+tm3IGUNKsPXffrJQIPpQJuE9Qy1bU9GNUCkwranU/pEqyBlwMxcBIK/FUJFAZ9SqQ==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-collection": "1.1.10", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.13", - "@radix-ui/react-focus-guards": "1.1.4", - "@radix-ui/react-focus-scope": "1.1.10", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-popper": "1.3.1", - "@radix-ui/react-portal": "1.1.12", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-roving-focus": "1.1.13", - "@radix-ui/react-slot": "1.3.0", - "@radix-ui/react-use-callback-ref": "1.1.2", + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.13", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-direction": "1.1.3", + "@radix-ui/react-dismissable-layer": "1.1.17", + "@radix-ui/react-focus-guards": "1.1.5", + "@radix-ui/react-focus-scope": "1.1.14", + "@radix-ui/react-id": "1.1.3", + "@radix-ui/react-popper": "1.3.5", + "@radix-ui/react-portal": "1.1.15", + "@radix-ui/react-presence": "1.1.9", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-roving-focus": "1.1.17", + "@radix-ui/react-slot": "1.3.1", + "@radix-ui/react-use-callback-ref": "1.1.3", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.7.2" }, @@ -3936,21 +3911,21 @@ } }, "node_modules/@radix-ui/react-menubar": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.18.tgz", - "integrity": "sha512-hX7EGx/oFq6DPY27GQuP/2wP48GHf5LG6r06VgNJlG+znmDS8OfopZcRcGly3L4lsB9FqpmLx6JQSE9P3BUpyw==", + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.22.tgz", + "integrity": "sha512-jDkcZXd5rN4b/S9nnEv9KZajaQ7+RO98OCWqAxrULTJtkSvODlNOO+EIxNG/d4QIF6QOqK5ZZrTF9MYl6eQdiQ==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-collection": "1.1.10", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-menu": "2.1.18", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-roving-focus": "1.1.13", - "@radix-ui/react-use-controllable-state": "1.2.3" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.13", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-direction": "1.1.3", + "@radix-ui/react-id": "1.1.3", + "@radix-ui/react-menu": "2.1.22", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-roving-focus": "1.1.17", + "@radix-ui/react-use-controllable-state": "1.2.5" }, "peerDependencies": { "@types/react": "*", @@ -3968,25 +3943,25 @@ } }, "node_modules/@radix-ui/react-navigation-menu": { - "version": "1.2.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.16.tgz", - "integrity": "sha512-nJ0SkrSQgudyYhMiYeHA1ayLVuduEJCFLan1RZZN7c9kqzzCFLaU9kuy81uNtqzweM9YaQPgWzxi9MwQ9jZ04g==", + "version": "1.2.20", + "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.20.tgz", + "integrity": "sha512-in/exCQPatmmBmQZrtQkK4UrysEp8VGEuw5o8Bx3ozxbfg7DBb4H5j3DgxGz4N59J02NRVzhsWFtujZgy5ue3w==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-collection": "1.1.10", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.13", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-controllable-state": "1.2.3", - "@radix-ui/react-use-layout-effect": "1.1.2", - "@radix-ui/react-use-previous": "1.1.2", - "@radix-ui/react-visually-hidden": "1.2.6" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.13", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-direction": "1.1.3", + "@radix-ui/react-dismissable-layer": "1.1.17", + "@radix-ui/react-id": "1.1.3", + "@radix-ui/react-presence": "1.1.9", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-callback-ref": "1.1.3", + "@radix-ui/react-use-controllable-state": "1.2.5", + "@radix-ui/react-use-layout-effect": "1.1.3", + "@radix-ui/react-use-previous": "1.1.3", + "@radix-ui/react-visually-hidden": "1.2.9" }, "peerDependencies": { "@types/react": "*", @@ -4004,23 +3979,23 @@ } }, "node_modules/@radix-ui/react-one-time-password-field": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-one-time-password-field/-/react-one-time-password-field-0.1.10.tgz", - "integrity": "sha512-GHkcJ+WVj91At+OvUVTD4R3W0/wxw9t/sG5xFUBYXaCbtWiooZX5Md376QjJqgH4VsVyXrbVNHO2O4NYcmjfVg==", + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-one-time-password-field/-/react-one-time-password-field-0.1.14.tgz", + "integrity": "sha512-F3vMSK+d+huI3a4Zm6j2hUsS+/gByVbsechJwp/ZCZBCrusXHvBeZZz9aMqXqqYNYu23mtvVMt6AeHDds8EU7w==", "license": "MIT", "dependencies": { - "@radix-ui/number": "1.1.2", - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-collection": "1.1.10", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-roving-focus": "1.1.13", - "@radix-ui/react-use-controllable-state": "1.2.3", - "@radix-ui/react-use-effect-event": "0.0.3", - "@radix-ui/react-use-is-hydrated": "0.1.1", - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/number": "1.1.3", + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.13", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-direction": "1.1.3", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-roving-focus": "1.1.17", + "@radix-ui/react-use-controllable-state": "1.2.5", + "@radix-ui/react-use-effect-event": "0.0.4", + "@radix-ui/react-use-is-hydrated": "0.1.2", + "@radix-ui/react-use-layout-effect": "1.1.3" }, "peerDependencies": { "@types/react": "*", @@ -4038,19 +4013,19 @@ } }, "node_modules/@radix-ui/react-password-toggle-field": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-password-toggle-field/-/react-password-toggle-field-0.1.5.tgz", - "integrity": "sha512-fVuA82u0b/fClpbEJv8yp1nU9eSvoSEOERsU/hhf3FXGPIvkmE7oEaHEu8poowoXO39/Va7zq2E0TUcYr1dBRg==", + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-password-toggle-field/-/react-password-toggle-field-0.1.9.tgz", + "integrity": "sha512-JFkmnwZFD357odQkpzfxz++bpohQpaGCT/4PK6oRd4R/Rxzg02uFDucFzZDOTIOz6vWSluIlz91zelleg9BheA==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-use-controllable-state": "1.2.3", - "@radix-ui/react-use-effect-event": "0.0.3", - "@radix-ui/react-use-is-hydrated": "0.1.1" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-id": "1.1.3", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-controllable-state": "1.2.5", + "@radix-ui/react-use-effect-event": "0.0.4", + "@radix-ui/react-use-is-hydrated": "0.1.2" }, "peerDependencies": { "@types/react": "*", @@ -4068,24 +4043,25 @@ } }, "node_modules/@radix-ui/react-popover": { - "version": "1.1.17", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.17.tgz", - "integrity": "sha512-/YSAOdJ7YJvdn7bn5sdSx2egW+SKY+u7O5RyAVs94Ymrg2fg5QTSFPMRkzvhGyFuE4/qsmPBdrwYoZMZh/4f+g==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.21.tgz", + "integrity": "sha512-+AJ7P5oRcFqFtv7MaCD8fOuK3l5qQBAMdWEOnUOYd3JfHOeIUe7TnHHSSP15CtWwH4KrotyDCTzodOIoONh8vw==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-dismissable-layer": "1.1.13", - "@radix-ui/react-focus-guards": "1.1.4", - "@radix-ui/react-focus-scope": "1.1.10", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-popper": "1.3.1", - "@radix-ui/react-portal": "1.1.12", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-slot": "1.3.0", - "@radix-ui/react-use-controllable-state": "1.2.3", + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-dismissable-layer": "1.1.17", + "@radix-ui/react-focus-guards": "1.1.5", + "@radix-ui/react-focus-scope": "1.1.14", + "@radix-ui/react-id": "1.1.3", + "@radix-ui/react-popper": "1.3.5", + "@radix-ui/react-portal": "1.1.15", + "@radix-ui/react-presence": "1.1.9", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-slot": "1.3.1", + "@radix-ui/react-use-controllable-state": "1.2.5", + "@radix-ui/react-use-layout-effect": "1.1.3", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.7.2" }, @@ -4105,21 +4081,21 @@ } }, "node_modules/@radix-ui/react-popper": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.3.1.tgz", - "integrity": "sha512-bhnq/0DEPTi2lsOD3J5rTL65qUKHbKbhqHsmN9TMiclSXpipi651ooUKPPp6G5lF/WiHBdn1s0Wuqsn+myVAvw==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.3.5.tgz", + "integrity": "sha512-6hLng2Rs45IZcvZ31BNvMeaFEMMEbtsog4xPcb8LZrGfyoV9fdAXqB9UKhLpTHtL0+E2DhSr6VW54Tehd6ksAQ==", "license": "MIT", "dependencies": { "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.10", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-layout-effect": "1.1.2", - "@radix-ui/react-use-rect": "1.1.2", - "@radix-ui/react-use-size": "1.1.2", - "@radix-ui/rect": "1.1.2" + "@radix-ui/react-arrow": "1.1.13", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-callback-ref": "1.1.3", + "@radix-ui/react-use-layout-effect": "1.1.3", + "@radix-ui/react-use-rect": "1.1.3", + "@radix-ui/react-use-size": "1.1.3", + "@radix-ui/rect": "1.1.3" }, "peerDependencies": { "@types/react": "*", @@ -4137,13 +4113,13 @@ } }, "node_modules/@radix-ui/react-portal": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.12.tgz", - "integrity": "sha512-m309havGzsjLHHaIX50G5PlvRs3xkgPCsGk/5PTvYm8D5q33yG0J7w/712PTOhid7NTaFETtnSXjngHQavvhVw==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.15.tgz", + "integrity": "sha512-kAfBVJUKNNKZuyGQXXG6rKolAV2KAmxxVkPXJgoq9dEFTl39286RufHQFNTL8rzha4vP8159BJ6hMGpB+bqv7A==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-layout-effect": "1.1.3" }, "peerDependencies": { "@types/react": "*", @@ -4161,12 +4137,12 @@ } }, "node_modules/@radix-ui/react-presence": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.6.tgz", - "integrity": "sha512-zdTk4PlUO0E18HnZ3wYbW0KkJJxWCdiNYp6g6X1PtONFhxVkg01vliTJAmwIszU6mHiyBOoW9P0rAugl5/hULQ==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.9.tgz", + "integrity": "sha512-LTi1v05bprIb8/GSY/GWusI0jfsYjQ3CD3Nin8o7jVxnpHzVQfzjOQJoJTQkE9bdmOnsS7SFdhkXiBv8PrYnxw==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/react-use-layout-effect": "1.1.3" }, "peerDependencies": { "@types/react": "*", @@ -4184,12 +4160,12 @@ } }, "node_modules/@radix-ui/react-primitive": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.6.tgz", - "integrity": "sha512-wetd0QI77DbvrPpTAvH1SqOxsYF2wZe5TNxqwOd5Ty4XDpV3dpV0s8K/1MGMJBeY5o7lg8ub5VIt1Ub+yVen6g==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.8.tgz", + "integrity": "sha512-DOlK1BdcIeYYUcFkSYFka4v1h95XTov93b0jCgW1EEiZuIhdwHY2NlE1teLIh+p0uBsuZI5A+voay+iVWpprfA==", "license": "MIT", "dependencies": { - "@radix-ui/react-slot": "1.3.0" + "@radix-ui/react-slot": "1.3.1" }, "peerDependencies": { "@types/react": "*", @@ -4207,13 +4183,13 @@ } }, "node_modules/@radix-ui/react-progress": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.10.tgz", - "integrity": "sha512-JYzEg60lk79PwKM27WZyKd7PW8O4OM5jOaFfRPfOyeXmMw7tLJh5kSj+CEjVTehszuwml/AdCzPGMXBTGf4BBw==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.14.tgz", + "integrity": "sha512-lq5VXWp/t/b8MaqbRMAItXICc/jwhzJt0ZZ+au/CBtTYkX9EfAsSyGQL5brUVBgf9tUTKCoJEZlDl+uJF/08xQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-primitive": "2.1.6" + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-primitive": "2.1.8" }, "peerDependencies": { "@types/react": "*", @@ -4231,21 +4207,20 @@ } }, "node_modules/@radix-ui/react-radio-group": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.4.1.tgz", - "integrity": "sha512-/SSxZdKEo2Eo29FFRKd06EfFDYp8HryKg0WYg7QLXaydPzl52YfSvCH2a3QDBRdtcuwACroJT8UVjQVgOJ7P9A==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.4.5.tgz", + "integrity": "sha512-BM1xQgw1gpgPSw05U4hJCMDX9GmAS6b6vKZANuNQZo0vf/ah7NZDAnjLd4tPg3z2vMvlI0CV+B2CFM9Z19oQDA==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-roving-focus": "1.1.13", - "@radix-ui/react-use-controllable-state": "1.2.3", - "@radix-ui/react-use-previous": "1.1.2", - "@radix-ui/react-use-size": "1.1.2" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-direction": "1.1.3", + "@radix-ui/react-presence": "1.1.9", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-roving-focus": "1.1.17", + "@radix-ui/react-use-controllable-state": "1.2.5", + "@radix-ui/react-use-size": "1.1.3" }, "peerDependencies": { "@types/react": "*", @@ -4263,20 +4238,22 @@ } }, "node_modules/@radix-ui/react-roving-focus": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.13.tgz", - "integrity": "sha512-9gkwneI0guf8JDmrFxPjJF6Ozzgioyw+/lonYNCwefS9ZHA05er0BVHiXr+LbWGHxUfczvMY6G1oiZZi1VzjRw==", + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.17.tgz", + "integrity": "sha512-YdJmjETw7Py+4Nziv71jgZ6fH7xQgB5p+pQ5rV8Iufyrm0RHSijec/UV1zPfQoK/YcfzB9nOl/2bi1zf1SjRMQ==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-collection": "1.1.10", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-controllable-state": "1.2.3" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.13", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-direction": "1.1.3", + "@radix-ui/react-id": "1.1.3", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-callback-ref": "1.1.3", + "@radix-ui/react-use-controllable-state": "1.2.5", + "@radix-ui/react-use-is-hydrated": "0.1.2", + "@radix-ui/react-use-layout-effect": "1.1.3" }, "peerDependencies": { "@types/react": "*", @@ -4294,20 +4271,20 @@ } }, "node_modules/@radix-ui/react-scroll-area": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.12.tgz", - "integrity": "sha512-xuafVzQiTCLsyEjakowTdG3OgTXsmO7IdCiO77otIa+z44xoLNs9Do5eg7POFumIOCjtG6djfm6RKUKpUa/csA==", + "version": "1.2.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.16.tgz", + "integrity": "sha512-kEcmCenIJ+W5xlCv1u9VKDdPmzzGyfrJwEneY+02GH+lJRXrGpkiTkyjrfkspuRw6DXt4uduwT5c4xD8HTv27Q==", "license": "MIT", "dependencies": { - "@radix-ui/number": "1.1.2", - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/number": "1.1.3", + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-direction": "1.1.3", + "@radix-ui/react-presence": "1.1.9", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-callback-ref": "1.1.3", + "@radix-ui/react-use-layout-effect": "1.1.3" }, "peerDependencies": { "@types/react": "*", @@ -4325,31 +4302,31 @@ } }, "node_modules/@radix-ui/react-select": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.3.1.tgz", - "integrity": "sha512-w6eDvY78LE9ZUiNnXCA1QVK8RYN7k9galFv09kjVydJqBAgHd7Y9A6h0UJ/6DCZNGZMZrB2ohcSW1Bo9d8+wWA==", + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.3.5.tgz", + "integrity": "sha512-6CQx0xtdarAkSCsqgLJaz+coYQaru7rt8K6gMItR2rA+WP8/Ig6kRAzP6Zw88RccG98IZnszqJlJx9hejYOL3A==", "license": "MIT", "dependencies": { - "@radix-ui/number": "1.1.2", - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-collection": "1.1.10", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.13", - "@radix-ui/react-focus-guards": "1.1.4", - "@radix-ui/react-focus-scope": "1.1.10", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-popper": "1.3.1", - "@radix-ui/react-portal": "1.1.12", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-slot": "1.3.0", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-controllable-state": "1.2.3", - "@radix-ui/react-use-layout-effect": "1.1.2", - "@radix-ui/react-use-previous": "1.1.2", - "@radix-ui/react-visually-hidden": "1.2.6", + "@radix-ui/number": "1.1.3", + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.13", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-direction": "1.1.3", + "@radix-ui/react-dismissable-layer": "1.1.17", + "@radix-ui/react-focus-guards": "1.1.5", + "@radix-ui/react-focus-scope": "1.1.14", + "@radix-ui/react-id": "1.1.3", + "@radix-ui/react-popper": "1.3.5", + "@radix-ui/react-portal": "1.1.15", + "@radix-ui/react-presence": "1.1.9", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-slot": "1.3.1", + "@radix-ui/react-use-callback-ref": "1.1.3", + "@radix-ui/react-use-controllable-state": "1.2.5", + "@radix-ui/react-use-layout-effect": "1.1.3", + "@radix-ui/react-use-previous": "1.1.3", + "@radix-ui/react-visually-hidden": "1.2.9", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.7.2" }, @@ -4369,12 +4346,12 @@ } }, "node_modules/@radix-ui/react-separator": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.10.tgz", - "integrity": "sha512-Y6K6jLQCVfCnTL2MEtGxDLffkhNfEfHsEg3Wa8JU+IWdn3EWbLXd3OuOfQRN7p/W/cUce1WyTk3QeuAoDBzN9g==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.13.tgz", + "integrity": "sha512-wbagLhy4grekqiT6hU0WNP09FpmemTXbNWg4QEawaw9dix7hRIcrmDNnLDasOsKVLtArEznhgZKe5Gm4U6oPXQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.6" + "@radix-ui/react-primitive": "2.1.8" }, "peerDependencies": { "@types/react": "*", @@ -4392,22 +4369,22 @@ } }, "node_modules/@radix-ui/react-slider": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.4.1.tgz", - "integrity": "sha512-r91WSpQucNGFKAIxT8FT0H0zyjd5tJlqObLp7LOMV4z49KoDCwjy01w3vDOU4e1wxhF9IgjYco7SB6byOW7Buw==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.4.5.tgz", + "integrity": "sha512-7E8C13SdQKQxYganILiVZGEwM0NSbfbFcnNJ93kP++wD2pMT1SMsG3c04PFUlbPpaSXgicYgPeBndgJTvV3NKg==", "license": "MIT", "dependencies": { - "@radix-ui/number": "1.1.2", - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-collection": "1.1.10", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-use-controllable-state": "1.2.3", - "@radix-ui/react-use-layout-effect": "1.1.2", - "@radix-ui/react-use-previous": "1.1.2", - "@radix-ui/react-use-size": "1.1.2" + "@radix-ui/number": "1.1.3", + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.13", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-direction": "1.1.3", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-controllable-state": "1.2.5", + "@radix-ui/react-use-layout-effect": "1.1.3", + "@radix-ui/react-use-previous": "1.1.3", + "@radix-ui/react-use-size": "1.1.3" }, "peerDependencies": { "@types/react": "*", @@ -4425,12 +4402,13 @@ } }, "node_modules/@radix-ui/react-slot": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.3.0.tgz", - "integrity": "sha512-MojKku4U/miO8Av4Dkb+ctMAQx7JmY96LmtDQlAarCRtd7rN52QCSzBF+XAvr5S6coSVj9HEPBgHAHKEJVk/WA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.3.1.tgz", + "integrity": "sha512-Bu/aAQHFFh6/QAvXAeUMurJ9fbW0JUIqlojU/yBXZ7cAVqy75Y7JYYyuCr9zLNF0p4WWoJYV54CTUIf4l7FzTw==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.3" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -4443,18 +4421,17 @@ } }, "node_modules/@radix-ui/react-switch": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.3.1.tgz", - "integrity": "sha512-55bQtCnOB0BohomSHi6qvQXpJEEqUGDm6hRrM0Bph5OXwhSegqkd8IqgBAQkM1IlgUlWZIxpxRcpOEfRIgimyw==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.3.5.tgz", + "integrity": "sha512-e1YrvGvEjIqDhqKjQ4Q+IDkMfiY30u3FPz9CZXZMlQ8mU3kZ2PdeBM8Gssc48CDopPizNorKumGhjySBfO7BDQ==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-use-controllable-state": "1.2.3", - "@radix-ui/react-use-previous": "1.1.2", - "@radix-ui/react-use-size": "1.1.2" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-controllable-state": "1.2.5", + "@radix-ui/react-use-size": "1.1.3" }, "peerDependencies": { "@types/react": "*", @@ -4472,19 +4449,19 @@ } }, "node_modules/@radix-ui/react-tabs": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.15.tgz", - "integrity": "sha512-kxc9gI6/HfcU4nfMMVS3AmQK414kbU1IE6UCJmMmxjhO3cRPXOyYnmvyKD+ODt7q56nRq9l7Wovi6uaGwKgMlg==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.19.tgz", + "integrity": "sha512-4wbGf98pX2ZwYqHMVB/dakeMPyH4xSJ9MSDaCCWXlIpYt0VYY6mtZxKSTiGS/F3tk0yrEYmXE1V8uwG7TxDCcQ==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-roving-focus": "1.1.13", - "@radix-ui/react-use-controllable-state": "1.2.3" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-direction": "1.1.3", + "@radix-ui/react-id": "1.1.3", + "@radix-ui/react-presence": "1.1.9", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-roving-focus": "1.1.17", + "@radix-ui/react-use-controllable-state": "1.2.5" }, "peerDependencies": { "@types/react": "*", @@ -4502,23 +4479,23 @@ } }, "node_modules/@radix-ui/react-toast": { - "version": "1.2.17", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.17.tgz", - "integrity": "sha512-uL4kyyWy000pPL43fGGCV5qT6ZchCWEQZOSlkYiPwPt8Hy1iW38RjeptIvz1/SZesrW6Vn58Ct3sV7tfEfiAbw==", + "version": "1.2.21", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.21.tgz", + "integrity": "sha512-/o8uHzH2z6ZM59Dt1UPFj8aYJ0DjPu0EuQXQ7uuYJTQLH5mNqxa1KuBfbpnklgXOOjyAtTp/tll0Nm+Nkz+bEg==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-collection": "1.1.10", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-dismissable-layer": "1.1.13", - "@radix-ui/react-portal": "1.1.12", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-controllable-state": "1.2.3", - "@radix-ui/react-use-layout-effect": "1.1.2", - "@radix-ui/react-visually-hidden": "1.2.6" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.13", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-dismissable-layer": "1.1.17", + "@radix-ui/react-portal": "1.1.15", + "@radix-ui/react-presence": "1.1.9", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-callback-ref": "1.1.3", + "@radix-ui/react-use-controllable-state": "1.2.5", + "@radix-ui/react-use-layout-effect": "1.1.3", + "@radix-ui/react-visually-hidden": "1.2.9" }, "peerDependencies": { "@types/react": "*", @@ -4536,14 +4513,14 @@ } }, "node_modules/@radix-ui/react-toggle": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.12.tgz", - "integrity": "sha512-AsAVsYNZIlRBsci7BhE+QyQeKd1h6TffJYt+lF0QQkd5OpQ3klfIByPsCb4G0h/Fq6PJwh1FYNluzBFYzhk4+w==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.16.tgz", + "integrity": "sha512-pp4TLY3N4osN9IB4TLEaaZRGooBmCi/XJD65gSCs5tvsKofM9WgiBToNtGrmR0k3sG4jFj4Nw4utsIvQraWA9g==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-use-controllable-state": "1.2.3" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-controllable-state": "1.2.5" }, "peerDependencies": { "@types/react": "*", @@ -4561,18 +4538,18 @@ } }, "node_modules/@radix-ui/react-toggle-group": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.13.tgz", - "integrity": "sha512-Xb9PLtlvU66F36LiKba6dFswu6V2mDkgidO4fNSbQHQwmZ9ObxMIO17MN/LJ4aWJecVuSVLAHPZjyeMzJrgeiA==", + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.17.tgz", + "integrity": "sha512-KKsrxb1cZREc2RI5DOGwlUSpaPW40xIaK1/DXXqYDb7slRE8pkRa+iF2aFbYiuMJ+aNWpCSChiN5gFe3bVveaQ==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-roving-focus": "1.1.13", - "@radix-ui/react-toggle": "1.1.12", - "@radix-ui/react-use-controllable-state": "1.2.3" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-direction": "1.1.3", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-roving-focus": "1.1.17", + "@radix-ui/react-toggle": "1.1.16", + "@radix-ui/react-use-controllable-state": "1.2.5" }, "peerDependencies": { "@types/react": "*", @@ -4590,18 +4567,18 @@ } }, "node_modules/@radix-ui/react-toolbar": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.1.13.tgz", - "integrity": "sha512-Za1l4f6fzTkGgz/iynAMN8iaqiKff2wm2/QwiLmHPtDQreWEBrvSimgQFIekxMUdRPhILM7xdIXxuS/o/DGZag==", + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.1.17.tgz", + "integrity": "sha512-MjorZ0XQiWfCrrpStNXw/hX0HnG7VEzCgcSV226Ox8/WzS5yq0SiMhsLFE3LlXhdghlakFRFdE6eegtmUQW7Mg==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-roving-focus": "1.1.13", - "@radix-ui/react-separator": "1.1.10", - "@radix-ui/react-toggle-group": "1.1.13" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-direction": "1.1.3", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-roving-focus": "1.1.17", + "@radix-ui/react-separator": "1.1.13", + "@radix-ui/react-toggle-group": "1.1.17" }, "peerDependencies": { "@types/react": "*", @@ -4619,23 +4596,24 @@ } }, "node_modules/@radix-ui/react-tooltip": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.10.tgz", - "integrity": "sha512-NlNe8D0dWEpVfXFli90IO6X07Josx/b1iu98tDnx9Xv0HT4wLIL+m2VOheMHhK7qbp2HoTBqALEFzGyZs/levw==", + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.14.tgz", + "integrity": "sha512-C/JxCKJJac+wtHPW1yFBSN8Ssuaufy2jYQMgyiJYyW4Fw0WJfDWXQDAly1qsbd1YDznH+sYitaljhf8igPCvmA==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-dismissable-layer": "1.1.13", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-popper": "1.3.1", - "@radix-ui/react-portal": "1.1.12", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-slot": "1.3.0", - "@radix-ui/react-use-controllable-state": "1.2.3", - "@radix-ui/react-visually-hidden": "1.2.6" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-dismissable-layer": "1.1.17", + "@radix-ui/react-id": "1.1.3", + "@radix-ui/react-popper": "1.3.5", + "@radix-ui/react-portal": "1.1.15", + "@radix-ui/react-presence": "1.1.9", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-slot": "1.3.1", + "@radix-ui/react-use-controllable-state": "1.2.5", + "@radix-ui/react-use-layout-effect": "1.1.3", + "@radix-ui/react-visually-hidden": "1.2.9" }, "peerDependencies": { "@types/react": "*", @@ -4653,9 +4631,9 @@ } }, "node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.2.tgz", - "integrity": "sha512-xCso9j1/u8sEgP1RNHjFrXJLApL8LiqOkI1R4ywuN00rxWdYg4oQXuwKLS3i0j5NWLromUD27/4nlxj2UFVvIw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.3.tgz", + "integrity": "sha512-AUS7HoBBAncIsGMLNG+CcpLuJ+JIBbZzmyM8Qdb1eIThX0AlhSSC6wn40xfBlPE+ypx/vSSiRWnklUAjy3U3UA==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -4668,13 +4646,14 @@ } }, "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.3.tgz", - "integrity": "sha512-PLzC90MS+ReootmjC597dvopoelpZ8Q61HJkDXZSExitIq7PL55vHNnesAHwguHK0aPfBnpdNzQtv1uliaqQrA==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.5.tgz", + "integrity": "sha512-UB1dXpxvHjR48poyKdKdTm7jT0kp3elkUKdKQiOkirlbYumqXinSJtrjDsr9maXNPvL12bKI4CDSmydms/9Aeg==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.3", - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-use-effect-event": "0.0.4", + "@radix-ui/react-use-layout-effect": "1.1.3" }, "peerDependencies": { "@types/react": "*", @@ -4687,12 +4666,12 @@ } }, "node_modules/@radix-ui/react-use-effect-event": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.3.tgz", - "integrity": "sha512-6c8ZqvPTWILEKnyVkP53EGRCcpnJiKTC21sS/6R1GF5xKyHJJWQEPfkqlcgUkdRQivd6tb23abUwe4ngWmY0JA==", + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.4.tgz", + "integrity": "sha512-XYcfa6wlXDCwQtePuEiPmXLSAhGL4DWtedSyRgGbG3y10mw+OnrLp6SyeY1gJFMiYF0Dx0nMAX9InylKbLEFQQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/react-use-layout-effect": "1.1.3" }, "peerDependencies": { "@types/react": "*", @@ -4705,12 +4684,12 @@ } }, "node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.2.tgz", - "integrity": "sha512-2uVLvLjgO7NZCWw01/FdqRwmA42J0BcjPMUCA+koFEOAb+zjqIP7SiFz/7zWPrKnVmSqr76Omq2ALyCuX4dhLw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.4.tgz", + "integrity": "sha512-4MSb5SPbMH02uUn19tLkO5Bav66ZQg/zFbedo7FWLWGFg9r8Z9xSog7QGnq9ZceurzBVIAIwgzANg6ExWc8HkQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.2" + "@radix-ui/react-use-callback-ref": "1.1.3" }, "peerDependencies": { "@types/react": "*", @@ -4723,9 +4702,9 @@ } }, "node_modules/@radix-ui/react-use-is-hydrated": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.1.tgz", - "integrity": "sha512-qwOiz4Tjo8CNnrOLAYUMXeZwDzXgXpvK4TKQPmWLECM9XoWvA6+0Z2/7Ag3A4ivjS4ovbLJPbskkxioFyBhr8A==", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.2.tgz", + "integrity": "sha512-2+gAVu9uaSLbopCTvvuWX9MIgEOlyqXC1Ok+KLCO7cZPSHLENs7dL0KbFQUGFIcFKmDW/bmaQRJtd8E3cnMRUw==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -4738,9 +4717,9 @@ } }, "node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.2.tgz", - "integrity": "sha512-jrBWOxZITuGcnjRCM2t2U5ZPkCLxD+Ym6DjfssS5haTj2iiak/DOb64JeN6OdLfLgptb6/e2kKR+ZuTrGoZTPA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.3.tgz", + "integrity": "sha512-rDiah9wvtqihWtWz02XreeRKIxt2EJF8y5D9rtY9l5A2zxePAtcPiOMpDugNRw5bFHz+1/8viVoc7ZVKiJknCw==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -4753,9 +4732,9 @@ } }, "node_modules/@radix-ui/react-use-previous": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.2.tgz", - "integrity": "sha512-IGBQPtRFdhN6MQ8dbegVmBq1LVZluya3F1jWY+puIcQC3MHctRwTDSBWCkL/3ZcnMJLTMJ++Z+ktmvg0F89iCw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.3.tgz", + "integrity": "sha512-kbefNKla5AGhgvMqrg/qS7mYVLXTEHQLqoFIS03nKN2dAfQQ5PK5Tp+2LxS7BV6a6l4HHv4jTg6rtV2Uajwe2w==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -4768,12 +4747,12 @@ } }, "node_modules/@radix-ui/react-use-rect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.2.tgz", - "integrity": "sha512-d8a+bBY/FxikNPlgJJoaBHZX+zKVbWHYJGTLnLvveQgFSTntkGdEKv3JDtHrMS0DNYpllz2nRsTLGLKYttbpmw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.3.tgz", + "integrity": "sha512-W0GSYZFKEfi6raMiMEfJSngvVbFDIyxtW5JuVg5NoQBY59l0dVQVGLbhog/tOdwq0qtZ+TXuX1ikSNan4/IZXA==", "license": "MIT", "dependencies": { - "@radix-ui/rect": "1.1.2" + "@radix-ui/rect": "1.1.3" }, "peerDependencies": { "@types/react": "*", @@ -4786,12 +4765,12 @@ } }, "node_modules/@radix-ui/react-use-size": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.2.tgz", - "integrity": "sha512-giWQp+4mxjBPt4KZ0MmyuykFNWfbDxKt4x+fPkRYmgRFJSbCZFzUglvMb/Kjn38tm10YP4ufiQZDx3zna4LU6w==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.3.tgz", + "integrity": "sha512-jJq6tQQLvO/z4uWbztjwPV+1a/+H4rCaWypasLB/ac8DEdd6+p7dIm7o3F6P2KZPGkPMqD4s5424EdAdoU+GLA==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/react-use-layout-effect": "1.1.3" }, "peerDependencies": { "@types/react": "*", @@ -4804,12 +4783,12 @@ } }, "node_modules/@radix-ui/react-visually-hidden": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.6.tgz", - "integrity": "sha512-jCE0WljWifTI4niIMCll06kGpsJTAPiZVU9H4WR1N6qW7At9ystHbN7dDB+we2xH535roFHj7qKS+RGj0FMDWQ==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.9.tgz", + "integrity": "sha512-seuZXNZVCz1kLSQMRO/TdNOSahBI3S5nXE4jzO7u7aFRWQlMAnwyrr8vKMkEU115fCLEyzR2YyjnP+aRMxK34w==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.6" + "@radix-ui/react-primitive": "2.1.8" }, "peerDependencies": { "@types/react": "*", @@ -4827,9 +4806,9 @@ } }, "node_modules/@radix-ui/rect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.2.tgz", - "integrity": "sha512-xnXE7wG13PI+cxieVssYXlQJuYVRhH9NBoxt3KNwzghDIA69GMm7d4wXRouHIYjE+KvS6U/MsMO73NdS2MH9ZA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.3.tgz", + "integrity": "sha512-JtyZR+mqgBibTo8xea3B6ZRmzZiM/YeVBtUkas6zMuXjAlfIFIW2FgqeM9eLyvEaYX66vr6DJMK+4U6LV0KhNw==", "license": "MIT" }, "node_modules/@react-dnd/asap": { @@ -16020,66 +15999,66 @@ } }, "node_modules/radix-ui": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/radix-ui/-/radix-ui-1.6.0.tgz", - "integrity": "sha512-EUEC70O03EgxWMP5aoqfBZ6iLC5bczFagGy7zhSYRt8o5DP7IWNiP3ywetse3L9b8843ExB0OGWZvgbYVJuNeg==", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/radix-ui/-/radix-ui-1.6.5.tgz", + "integrity": "sha512-HVHPWDoOXBYxxiwvWR45KPcmvrjoa/NTFUbPbGmYoZv7BFYOIpZKiPQZWcpFJTX5z4LeoGenGCUgoafdYHuPWA==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-accessible-icon": "1.1.10", - "@radix-ui/react-accordion": "1.2.14", - "@radix-ui/react-alert-dialog": "1.1.17", - "@radix-ui/react-arrow": "1.1.10", - "@radix-ui/react-aspect-ratio": "1.1.10", - "@radix-ui/react-avatar": "1.2.0", - "@radix-ui/react-checkbox": "1.3.5", - "@radix-ui/react-collapsible": "1.1.14", - "@radix-ui/react-collection": "1.1.10", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-context-menu": "2.3.1", - "@radix-ui/react-dialog": "1.1.17", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.13", - "@radix-ui/react-dropdown-menu": "2.1.18", - "@radix-ui/react-focus-guards": "1.1.4", - "@radix-ui/react-focus-scope": "1.1.10", - "@radix-ui/react-form": "0.1.10", - "@radix-ui/react-hover-card": "1.1.17", - "@radix-ui/react-label": "2.1.10", - "@radix-ui/react-menu": "2.1.18", - "@radix-ui/react-menubar": "1.1.18", - "@radix-ui/react-navigation-menu": "1.2.16", - "@radix-ui/react-one-time-password-field": "0.1.10", - "@radix-ui/react-password-toggle-field": "0.1.5", - "@radix-ui/react-popover": "1.1.17", - "@radix-ui/react-popper": "1.3.1", - "@radix-ui/react-portal": "1.1.12", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-progress": "1.1.10", - "@radix-ui/react-radio-group": "1.4.1", - "@radix-ui/react-roving-focus": "1.1.13", - "@radix-ui/react-scroll-area": "1.2.12", - "@radix-ui/react-select": "2.3.1", - "@radix-ui/react-separator": "1.1.10", - "@radix-ui/react-slider": "1.4.1", - "@radix-ui/react-slot": "1.3.0", - "@radix-ui/react-switch": "1.3.1", - "@radix-ui/react-tabs": "1.1.15", - "@radix-ui/react-toast": "1.2.17", - "@radix-ui/react-toggle": "1.1.12", - "@radix-ui/react-toggle-group": "1.1.13", - "@radix-ui/react-toolbar": "1.1.13", - "@radix-ui/react-tooltip": "1.2.10", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-controllable-state": "1.2.3", - "@radix-ui/react-use-effect-event": "0.0.3", - "@radix-ui/react-use-escape-keydown": "1.1.2", - "@radix-ui/react-use-is-hydrated": "0.1.1", - "@radix-ui/react-use-layout-effect": "1.1.2", - "@radix-ui/react-use-size": "1.1.2", - "@radix-ui/react-visually-hidden": "1.2.6" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-accessible-icon": "1.1.13", + "@radix-ui/react-accordion": "1.2.18", + "@radix-ui/react-alert-dialog": "1.1.21", + "@radix-ui/react-arrow": "1.1.13", + "@radix-ui/react-aspect-ratio": "1.1.13", + "@radix-ui/react-avatar": "1.2.4", + "@radix-ui/react-checkbox": "1.3.9", + "@radix-ui/react-collapsible": "1.1.18", + "@radix-ui/react-collection": "1.1.13", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-context-menu": "2.3.5", + "@radix-ui/react-dialog": "1.1.21", + "@radix-ui/react-direction": "1.1.3", + "@radix-ui/react-dismissable-layer": "1.1.17", + "@radix-ui/react-dropdown-menu": "2.1.22", + "@radix-ui/react-focus-guards": "1.1.5", + "@radix-ui/react-focus-scope": "1.1.14", + "@radix-ui/react-form": "0.1.14", + "@radix-ui/react-hover-card": "1.1.21", + "@radix-ui/react-label": "2.1.13", + "@radix-ui/react-menu": "2.1.22", + "@radix-ui/react-menubar": "1.1.22", + "@radix-ui/react-navigation-menu": "1.2.20", + "@radix-ui/react-one-time-password-field": "0.1.14", + "@radix-ui/react-password-toggle-field": "0.1.9", + "@radix-ui/react-popover": "1.1.21", + "@radix-ui/react-popper": "1.3.5", + "@radix-ui/react-portal": "1.1.15", + "@radix-ui/react-presence": "1.1.9", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-progress": "1.1.14", + "@radix-ui/react-radio-group": "1.4.5", + "@radix-ui/react-roving-focus": "1.1.17", + "@radix-ui/react-scroll-area": "1.2.16", + "@radix-ui/react-select": "2.3.5", + "@radix-ui/react-separator": "1.1.13", + "@radix-ui/react-slider": "1.4.5", + "@radix-ui/react-slot": "1.3.1", + "@radix-ui/react-switch": "1.3.5", + "@radix-ui/react-tabs": "1.1.19", + "@radix-ui/react-toast": "1.2.21", + "@radix-ui/react-toggle": "1.1.16", + "@radix-ui/react-toggle-group": "1.1.17", + "@radix-ui/react-toolbar": "1.1.17", + "@radix-ui/react-tooltip": "1.2.14", + "@radix-ui/react-use-callback-ref": "1.1.3", + "@radix-ui/react-use-controllable-state": "1.2.5", + "@radix-ui/react-use-effect-event": "0.0.4", + "@radix-ui/react-use-escape-keydown": "1.1.4", + "@radix-ui/react-use-is-hydrated": "0.1.2", + "@radix-ui/react-use-layout-effect": "1.1.3", + "@radix-ui/react-use-size": "1.1.3", + "@radix-ui/react-visually-hidden": "1.2.9" }, "peerDependencies": { "@types/react": "*",