From 7e162ac95207e2267d488e895df4b92d248c6abe Mon Sep 17 00:00:00 2001 From: somebody1234 Date: Mon, 19 Aug 2024 16:09:43 +1000 Subject: [PATCH 01/49] Update rust-toolchain hash in Nix --- flake.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flake.nix b/flake.nix index aa797259d2b2..50264a0d7f68 100644 --- a/flake.nix +++ b/flake.nix @@ -16,7 +16,7 @@ pkgs = nixpkgs.legacyPackages.${system}; rust = fenix.packages.${system}.fromToolchainFile { dir = ./.; - sha256 = "sha256-o/MRwGYjLPyD1zZQe3LX0dOynwRJpVygfF9+vSnqTOc="; + sha256 = "sha256-IeUO263mdpDxBzWTY7upaZqX+ODkuK1JLTHdR3ItlkY="; }; isOnLinux = pkgs.lib.hasInfix "linux" system; rust-jni = if isOnLinux then with fenix.packages.${system}; combine [ From 361990aa1808c3eb2c98a3164232ce86bb4994f5 Mon Sep 17 00:00:00 2001 From: somebody1234 Date: Mon, 19 Aug 2024 16:40:27 +1000 Subject: [PATCH 02/49] Fix styling for JSON Schema Input --- app/dashboard/src/components/JSONSchemaInput.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/dashboard/src/components/JSONSchemaInput.tsx b/app/dashboard/src/components/JSONSchemaInput.tsx index 2cceec9761dd..bc4c9cc67b1a 100644 --- a/app/dashboard/src/components/JSONSchemaInput.tsx +++ b/app/dashboard/src/components/JSONSchemaInput.tsx @@ -212,7 +212,7 @@ export default function JSONSchemaInput(props: JSONSchemaInputProps) { isDisabled={!isOptional} isActive={!isOptional || isPresent} className={tailwindMerge.twMerge( - 'text col-start-1 inline-block whitespace-nowrap rounded-full px-button-x text-left', + 'col-start-1 inline-block whitespace-nowrap rounded-full px-button-x', isOptional && 'hover:bg-hover-bg', )} onPress={() => { From 8aed3759f8a902e5926fa3b7baa4a6482deab77d Mon Sep 17 00:00:00 2001 From: somebody1234 Date: Mon, 19 Aug 2024 19:57:45 +1000 Subject: [PATCH 03/49] Rewrite Dropdown component --- .../Inputs/Dropdown/Dropdown.tsx | 208 +++++++++++ .../AriaComponents/Inputs/Dropdown/index.ts | 2 + .../components/AriaComponents/Inputs/index.ts | 1 + app/dashboard/src/components/Dropdown.tsx | 334 ------------------ .../src/components/JSONSchemaInput.tsx | 83 ++--- .../Settings/ActivityLogSettingsSection.tsx | 19 +- app/dashboard/src/utilities/react.ts | 16 + app/dashboard/tailwind.config.js | 3 + 8 files changed, 273 insertions(+), 393 deletions(-) create mode 100644 app/dashboard/src/components/AriaComponents/Inputs/Dropdown/Dropdown.tsx create mode 100644 app/dashboard/src/components/AriaComponents/Inputs/Dropdown/index.ts delete mode 100644 app/dashboard/src/components/Dropdown.tsx create mode 100644 app/dashboard/src/utilities/react.ts diff --git a/app/dashboard/src/components/AriaComponents/Inputs/Dropdown/Dropdown.tsx b/app/dashboard/src/components/AriaComponents/Inputs/Dropdown/Dropdown.tsx new file mode 100644 index 000000000000..e0e6cbc42076 --- /dev/null +++ b/app/dashboard/src/components/AriaComponents/Inputs/Dropdown/Dropdown.tsx @@ -0,0 +1,208 @@ +/** @file A styled dropdown. */ +import { useEffect, useMemo, useRef, useState, type ForwardedRef, type ReactNode } from 'react' + +import CheckMarkIcon from '#/assets/check_mark.svg' +import FolderArrowIcon from '#/assets/folder_arrow.svg' +import { ListBox, ListBoxItem, mergeProps, useFocusWithin } from '#/components/aria' +import FocusRing from '#/components/styled/FocusRing' +import SvgMask from '#/components/SvgMask' +import { forwardRef } from '#/utilities/react' +import { twMerge } from '#/utilities/tailwindMerge' + +// ================ +// === Dropdown === +// ================ + +/** Props for a list item child. */ +interface InternalChildProps { + readonly item: T +} + +/** Props for the display of the currently selected item, when the dropdown supports multiple children. */ +interface InternalChildrenProps { + readonly items: T[] + /** This is the value passed as {@link DropdownProps.render}. */ + readonly render: (props: InternalChildProps) => ReactNode +} + +/** Props for a {@link Dropdown} shared between all variants. */ +interface InternalBaseDropdownProps { + readonly readOnly?: boolean + readonly className?: string + readonly items: readonly T[] + readonly render: (props: InternalChildProps) => ReactNode +} + +/** Props for a {@link Dropdown}, when `multiple` is `false` or absent. */ +interface InternalSingleDropdownProps extends InternalBaseDropdownProps { + readonly multiple?: false + readonly selectedIndex: number | null + readonly onChange: (item: T, index: number) => void +} + +/** Props for a {@link Dropdown}, when `multiple` is `true`. */ +interface InternalMultipleDropdownProps extends InternalBaseDropdownProps { + readonly multiple: true + readonly selectedIndices: readonly number[] + readonly renderMultiple: (props: InternalChildrenProps) => ReactNode + readonly onChange: (items: readonly T[], indices: readonly number[]) => void +} + +/** Props for a {@link Dropdown}. */ +export type DropdownProps = InternalMultipleDropdownProps | InternalSingleDropdownProps + +/** A styled dropdown. */ +export const Dropdown = forwardRef(function Dropdown( + props: DropdownProps, + ref: ForwardedRef, +) { + const { readOnly = false, className, items, render: Child } = props + const listBoxItems = useMemo(() => items.map((item, i) => ({ item, i })), [items]) + const [tempSelectedIndex, setTempSelectedIndex] = useState(null) + const rootRef = useRef(null) + const [isFocused, setIsFocused] = useState(false) + const { focusWithinProps } = useFocusWithin({ onFocusWithinChange: setIsFocused }) + const multiple = props.multiple === true + const selectedIndex = 'selectedIndex' in props ? props.selectedIndex : null + const selectedIndices = 'selectedIndices' in props ? props.selectedIndices : [] + const selectedItems = selectedIndices.flatMap((index) => { + const item = items[index] + return item != null ? [item] : [] + }) + const visuallySelectedIndex = tempSelectedIndex ?? selectedIndex + const visuallySelectedItem = visuallySelectedIndex == null ? null : items[visuallySelectedIndex] + + useEffect(() => { + setTempSelectedIndex(selectedIndex) + }, [selectedIndex]) + + useEffect(() => { + const onDocumentClick = () => { + rootRef.current?.blur() + } + document.addEventListener('click', onDocumentClick) + return () => { + document.removeEventListener('click', onDocumentClick) + } + }, []) + + return ( + +
()( + focusWithinProps, + { ref: rootRef }, + { + tabIndex: 0, + ref, + className: twMerge( + 'focus-child group relative flex w-max cursor-pointer flex-col items-start whitespace-nowrap rounded-input leading-cozy', + className, + ), + }, + )} + > +
+
+ {/* Spacing. */} +
+
+ { + if (multiple) { + const indices = Array.from(keys, (i) => Number(i)) + props.onChange( + indices.flatMap((i) => { + const item = items[i] + return item === undefined ? [] : [item] + }), + indices, + ) + } else { + const [key] = keys + if (key != null) { + const i = Number(key) + const item = items[i] + if (item !== undefined) { + props.onChange(item, i) + } + } + } + }} + > + {({ item, i }) => ( + + + + + )} + +
+
+
+
+ +
+ {visuallySelectedItem != null ? + + : multiple && } +
+
+ {/* Hidden, but required to exist for the width of the parent element to be correct. + * Classes that do not affect width have been removed. */} +
+ {items.map((item, i) => ( +
+ + +
+ ))} +
+
+ + ) +}) diff --git a/app/dashboard/src/components/AriaComponents/Inputs/Dropdown/index.ts b/app/dashboard/src/components/AriaComponents/Inputs/Dropdown/index.ts new file mode 100644 index 000000000000..99bd9edcb91b --- /dev/null +++ b/app/dashboard/src/components/AriaComponents/Inputs/Dropdown/index.ts @@ -0,0 +1,2 @@ +/** @file Barrel file for the Dropdown component. */ +export * from './Dropdown' diff --git a/app/dashboard/src/components/AriaComponents/Inputs/index.ts b/app/dashboard/src/components/AriaComponents/Inputs/index.ts index 2b0056d52c79..c737faf6b26a 100644 --- a/app/dashboard/src/components/AriaComponents/Inputs/index.ts +++ b/app/dashboard/src/components/AriaComponents/Inputs/index.ts @@ -4,6 +4,7 @@ * Barrel export file for Inputs */ +export * from './Dropdown' export * from './Input' export * from './Password' export * from './ResizableInput' diff --git a/app/dashboard/src/components/Dropdown.tsx b/app/dashboard/src/components/Dropdown.tsx deleted file mode 100644 index 2d3c0688d1ed..000000000000 --- a/app/dashboard/src/components/Dropdown.tsx +++ /dev/null @@ -1,334 +0,0 @@ -/** @file A styled dropdown. */ -import * as React from 'react' - -import CheckMarkIcon from '#/assets/check_mark.svg' -import FolderArrowIcon from '#/assets/folder_arrow.svg' - -import FocusRing from '#/components/styled/FocusRing' -import SvgMask from '#/components/SvgMask' - -import * as tailwindMerge from '#/utilities/tailwindMerge' - -// ================ -// === Dropdown === -// ================ - -/** Props for a list item child. */ -interface InternalChildProps { - readonly item: T -} - -/** Props for the display of the currently selected item, when the dropdown supports multiple children. */ -interface InternalChildrenProps { - readonly items: T[] - /** This is the value passed as {@link DropdownProps.render}. */ - readonly render: (props: InternalChildProps) => React.ReactNode -} - -/** Props for a {@link Dropdown} shared between all variants. */ -interface InternalBaseDropdownProps { - readonly readOnly?: boolean - readonly className?: string - readonly items: readonly T[] - readonly render: (props: InternalChildProps) => React.ReactNode -} - -/** Props for a {@link Dropdown}, when `multiple` is `false` or absent. */ -interface InternalSingleDropdownProps extends InternalBaseDropdownProps { - readonly multiple?: false - readonly selectedIndex: number | null - readonly onClick: (item: T, index: number) => void -} - -/** Props for a {@link Dropdown}, when `multiple` is `true`. */ -interface InternalMultipleDropdownProps extends InternalBaseDropdownProps { - readonly multiple: true - readonly selectedIndices: readonly number[] - readonly renderMultiple: (props: InternalChildrenProps) => React.ReactNode - readonly onClick: (items: readonly T[], indices: readonly number[]) => void -} - -/** Props for a {@link Dropdown}. */ -export type DropdownProps = InternalMultipleDropdownProps | InternalSingleDropdownProps - -/** A styled dropdown. */ -function Dropdown(props: DropdownProps, ref: React.ForwardedRef) { - const { readOnly = false, className, items, render: Child } = props - const [isDropdownVisible, setIsDropdownVisible] = React.useState(false) - const [tempSelectedIndex, setTempSelectedIndex] = React.useState(null) - const rootRef = React.useRef(null) - const justFocusedRef = React.useRef(false) - const justBlurredRef = React.useRef(false) - const isMouseDown = React.useRef(false) - const multiple = props.multiple === true - const selectedIndex = 'selectedIndex' in props ? props.selectedIndex : null - const selectedIndices = 'selectedIndices' in props ? props.selectedIndices : [] - const selectedItems = selectedIndices.flatMap((index) => { - const item = items[index] - return item != null ? [item] : [] - }) - const visuallySelectedIndex = tempSelectedIndex ?? selectedIndex - const visuallySelectedItem = visuallySelectedIndex == null ? null : items[visuallySelectedIndex] - - React.useEffect(() => { - setTempSelectedIndex(selectedIndex) - }, [selectedIndex]) - - React.useEffect(() => { - if (!isDropdownVisible) { - rootRef.current?.blur() - } - }, [isDropdownVisible]) - - React.useEffect(() => { - const onDocumentClick = () => { - setIsDropdownVisible(false) - justBlurredRef.current = true - } - document.addEventListener('click', onDocumentClick) - return () => { - document.removeEventListener('click', onDocumentClick) - } - }, []) - - const onKeyDown = (event: React.KeyboardEvent) => { - if (!event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) { - switch (event.key) { - case 'Escape': { - event.stopPropagation() - setIsDropdownVisible(false) - break - } - case 'Enter': - case 'Tab': { - event.stopPropagation() - if (event.key === 'Enter') { - setIsDropdownVisible(true) - } - if (tempSelectedIndex != null) { - const item = items[tempSelectedIndex] - if (item != null) { - if (multiple) { - const newIndices = - selectedIndices.includes(tempSelectedIndex) ? - selectedIndices.filter((index) => index !== tempSelectedIndex) - : [...selectedIndices, tempSelectedIndex] - props.onClick( - newIndices.flatMap((index) => { - const otherItem = items[index] - return otherItem != null ? [otherItem] : [] - }), - newIndices, - ) - } else { - props.onClick(item, tempSelectedIndex) - } - } - } - if (isDropdownVisible && (event.key !== 'Enter' || !multiple)) { - setIsDropdownVisible(false) - justBlurredRef.current = true - } - break - } - case 'ArrowUp': { - if (!isDropdownVisible) break - event.preventDefault() - setTempSelectedIndex( - ( - tempSelectedIndex == null || - tempSelectedIndex === 0 || - tempSelectedIndex >= items.length - ) ? - items.length - 1 - : tempSelectedIndex - 1, - ) - break - } - case 'ArrowDown': { - if (!isDropdownVisible) break - event.preventDefault() - setTempSelectedIndex( - tempSelectedIndex == null || tempSelectedIndex >= items.length - 1 ? - 0 - : tempSelectedIndex + 1, - ) - break - } - } - } - } - - return ( - -
{ - if (typeof ref === 'function') { - ref(element) - } else if (ref != null) { - ref.current = element - } - rootRef.current = element - }} - tabIndex={0} - className={tailwindMerge.twMerge( - 'focus-child group relative flex w-max cursor-pointer flex-col items-start whitespace-nowrap rounded-input leading-cozy', - className, - )} - onFocus={(event) => { - if (!justBlurredRef.current && !readOnly && event.target === event.currentTarget) { - setIsDropdownVisible(true) - justFocusedRef.current = true - } - justBlurredRef.current = false - }} - onBlur={(event) => { - if (!readOnly && event.target === event.currentTarget) { - setIsDropdownVisible(false) - justBlurredRef.current = true - } - }} - onKeyDown={onKeyDown} - onKeyUp={() => { - justFocusedRef.current = false - }} - onClick={(event) => { - event.stopPropagation() - }} - > -
-
- {/* Spacing. */} -
{ - event.stopPropagation() - if (!justFocusedRef.current && !readOnly) { - setIsDropdownVisible(!isDropdownVisible) - } - justFocusedRef.current = false - }} - /> -
-
- {items.map((item, i) => ( -
{ - event.preventDefault() - isMouseDown.current = true - }} - onMouseUp={() => { - isMouseDown.current = false - }} - onClick={() => { - if (i !== visuallySelectedIndex) { - if (multiple) { - const newIndices = - selectedIndices.includes(i) ? - selectedIndices.filter((index) => index !== i) - : [...selectedIndices, i] - props.onClick( - newIndices.flatMap((index) => { - const otherItem = items[index] - return otherItem != null ? [otherItem] : [] - }), - newIndices, - ) - rootRef.current?.focus() - } else { - setIsDropdownVisible(false) - props.onClick(item, i) - justBlurredRef.current = true - } - } - }} - onFocus={() => { - if (!isMouseDown.current) { - // This is from keyboard navigation. - if (multiple) { - props.onClick([item], [i]) - } else { - props.onClick(item, i) - } - } - }} - > - - -
- ))} -
-
-
-
-
{ - event.stopPropagation() - if (!justFocusedRef.current && !readOnly) { - setIsDropdownVisible(!isDropdownVisible) - } - justFocusedRef.current = false - }} - > - -
- {visuallySelectedItem != null ? - - : multiple && } -
-
- {/* Hidden, but required to exist for the width of the parent element to be correct. - * Classes that do not affect width have been removed. */} -
- {items.map((item, i) => ( -
- - -
- ))} -
-
- - ) -} - -/** A styled dropdown. */ -// This is REQUIRED, as `React.forwardRef` does not preserve types of generic functions. -// eslint-disable-next-line no-restricted-syntax -export default React.forwardRef(Dropdown) as ( - props: DropdownProps & React.RefAttributes, -) => React.JSX.Element diff --git a/app/dashboard/src/components/JSONSchemaInput.tsx b/app/dashboard/src/components/JSONSchemaInput.tsx index bc4c9cc67b1a..09926fc4330f 100644 --- a/app/dashboard/src/components/JSONSchemaInput.tsx +++ b/app/dashboard/src/components/JSONSchemaInput.tsx @@ -1,21 +1,18 @@ /** @file A dynamic wizard for creating an arbitrary type of Datalink. */ import * as React from 'react' -import * as backendProvider from '#/providers/BackendProvider' -import * as textProvider from '#/providers/TextProvider' - -import * as aria from '#/components/aria' -import * as ariaComponents from '#/components/AriaComponents' +import { Input, Text } from '#/components/aria' +import { Button, Dropdown } from '#/components/AriaComponents' import Autocomplete from '#/components/Autocomplete' -import Dropdown from '#/components/Dropdown' import Checkbox from '#/components/styled/Checkbox' import FocusArea from '#/components/styled/FocusArea' import FocusRing from '#/components/styled/FocusRing' - import { useBackendQuery } from '#/hooks/backendHooks' -import * as jsonSchema from '#/utilities/jsonSchema' -import * as object from '#/utilities/object' -import * as tailwindMerge from '#/utilities/tailwindMerge' +import { useRemoteBackendStrict } from '#/providers/BackendProvider' +import { useText } from '#/providers/TextProvider' +import { constantValue, getSchemaName, lookupDef } from '#/utilities/jsonSchema' +import { asObject, singletonObjectOrNull } from '#/utilities/object' +import { twMerge } from '#/utilities/tailwindMerge' // ======================= // === JSONSchemaInput === @@ -39,8 +36,8 @@ export default function JSONSchemaInput(props: JSONSchemaInputProps) { const { value, setValue } = props // The functionality for inputting `enso-secret`s SHOULD be injected using a plugin, // but it is more convenient to avoid having plugin infrastructure. - const remoteBackend = backendProvider.useRemoteBackendStrict() - const { getText } = textProvider.useText() + const remoteBackend = useRemoteBackendStrict() + const { getText } = useText() const [autocompleteText, setAutocompleteText] = React.useState(() => typeof value === 'string' ? value : null, ) @@ -66,7 +63,7 @@ export default function JSONSchemaInput(props: JSONSchemaInputProps) { const isValid = typeof value === 'string' && value !== '' children.push(
{(innerProps) => ( - {(innerProps) => ( - {(innerProps) => ( - { const [k, v] = kv - return object - .singletonObjectOrNull(v) - .map((childSchema) => ({ key: k, schema: childSchema })) + return singletonObjectOrNull(v).map((childSchema) => ({ + key: k, + schema: childSchema, + })) }, ) - if (jsonSchema.constantValue(defs, schema).length !== 1) { + if (constantValue(defs, schema).length !== 1) { children.push(
{propertyDefinitions.map((definition) => { const { key, schema: childSchema } = definition const isOptional = !requiredProperties.includes(key) - return jsonSchema.constantValue(defs, childSchema).length === 1 ? + return constantValue(defs, childSchema).length === 1 ? null : <> {(innerProps) => { const isPresent = value != null && key in value return ( - {'title' in childSchema ? String(childSchema.title) : key} - + ) }} @@ -298,7 +291,7 @@ export default function JSONSchemaInput(props: JSONSchemaInputProps) { } } if ('$ref' in schema && typeof schema.$ref === 'string') { - const referencedSchema = jsonSchema.lookupDef(defs, schema) + const referencedSchema = lookupDef(defs, schema) if (referencedSchema != null) { children.push( ( - {jsonSchema.getSchemaName(defs, childProps.item)} - )} + render={(childProps) => {getSchemaName(defs, childProps.item)}} className="self-start" - onClick={(childSchema, index) => { + onChange={(childSchema, index) => { setSelectedChildIndex(index) - const newConstantValue = jsonSchema.constantValue(defs, childSchema, true) + const newConstantValue = constantValue(defs, childSchema, true) setValue(newConstantValue[0] ?? null) }} {...innerProps} @@ -352,10 +342,7 @@ export default function JSONSchemaInput(props: JSONSchemaInputProps) { ) children.push(
{dropdownTitle != null ?
@@ -379,7 +366,7 @@ export default function JSONSchemaInput(props: JSONSchemaInputProps) { ) } if ('allOf' in schema && Array.isArray(schema.allOf)) { - const childSchemas = schema.allOf.flatMap(object.singletonObjectOrNull) + const childSchemas = schema.allOf.flatMap(singletonObjectOrNull) const newChildren = childSchemas.map((childSchema, i) => ( EVENT_TYPE_NAME[itemProps.item]} - renderMultiple={(itemsProps) => - ( - itemsProps.items.length === 0 || - itemsProps.items.length === backendModule.EVENT_TYPES.length - ) ? + render={({ item }) => EVENT_TYPE_NAME[item]} + renderMultiple={({ items }) => + items.length === 0 || items.length === backendModule.EVENT_TYPES.length ? 'All' - : (itemsProps.items[0] != null ? EVENT_TYPE_NAME[itemsProps.items[0]] : '') + - (itemsProps.items.length <= 1 ? '' : ` (+${itemsProps.items.length - 1})`) + : (items[0] != null ? EVENT_TYPE_NAME[items[0]] : '') + + (items.length <= 1 ? '' : ` (+${items.length - 1})`) } - onClick={(items, indices) => { + onChange={(items, indices) => { setTypes(items) setTypeIndices(indices) }} @@ -191,7 +188,7 @@ export default function ActivityLogSettingsSection(props: ActivityLogSettingsSec : (itemsProps.items[0] ?? '') + (itemsProps.items.length <= 1 ? '' : `(+${itemsProps.items.length - 1})`) } - onClick={(items, indices) => { + onChange={(items, indices) => { setEmails(items) setEmailIndices(indices) }} diff --git a/app/dashboard/src/utilities/react.ts b/app/dashboard/src/utilities/react.ts new file mode 100644 index 000000000000..faac8e8ccb8f --- /dev/null +++ b/app/dashboard/src/utilities/react.ts @@ -0,0 +1,16 @@ +/** @file Helper functions related to React. */ +import { type ForwardRefRenderFunction, forwardRef as reactForwardRef, type ReactNode } from 'react' + +// This is *technically* not correct as it has the extra parameter `ref`. +// However, it is not possible to specify a second parameter in JSX so this is not an issue in practice. +/** A type-safe wrapper around {@link reactForwardRef} that preserves generics. */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function forwardRef>( + component: F, + // A union of functions becomes a single function with parameters that are the intersection + // of their types due to function parmeter contravariance. +): F | ((props: { readonly ref?: Parameters[1] }) => ReactNode) { + // This is SAFE as + // eslint-disable-next-line no-restricted-syntax + return reactForwardRef(component) as never +} diff --git a/app/dashboard/tailwind.config.js b/app/dashboard/tailwind.config.js index 5dc061b59727..8eea527013c2 100644 --- a/app/dashboard/tailwind.config.js +++ b/app/dashboard/tailwind.config.js @@ -598,6 +598,9 @@ inset 0 -36px 51px -51px #00000014`, respectImportant: true, }, ) + + addVariant('not-focus', '&:where([data-rac]):not([data-focused])') + addVariant('not-selected', '&:where([data-rac]):not([data-selected])') }), ], }) From c68919452729e6a01d069cb9601232b84ead73e7 Mon Sep 17 00:00:00 2001 From: somebody1234 Date: Mon, 19 Aug 2024 23:16:39 +1000 Subject: [PATCH 04/49] Move Dropdown `render` prop to `children` --- .../AriaComponents/Inputs/Dropdown/Dropdown.tsx | 15 +++++++-------- .../src/components/JSONSchemaInput.tsx | 5 +++-- .../Settings/ActivityLogSettingsSection.tsx | 17 +++++++++-------- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/app/dashboard/src/components/AriaComponents/Inputs/Dropdown/Dropdown.tsx b/app/dashboard/src/components/AriaComponents/Inputs/Dropdown/Dropdown.tsx index e0e6cbc42076..4a9e322bfd68 100644 --- a/app/dashboard/src/components/AriaComponents/Inputs/Dropdown/Dropdown.tsx +++ b/app/dashboard/src/components/AriaComponents/Inputs/Dropdown/Dropdown.tsx @@ -20,17 +20,15 @@ interface InternalChildProps { /** Props for the display of the currently selected item, when the dropdown supports multiple children. */ interface InternalChildrenProps { - readonly items: T[] - /** This is the value passed as {@link DropdownProps.render}. */ - readonly render: (props: InternalChildProps) => ReactNode + readonly items: readonly T[] + /** This is the value passed as {@link DropdownProps.children}. */ + readonly children: (props: InternalChildProps) => ReactNode } /** Props for a {@link Dropdown} shared between all variants. */ -interface InternalBaseDropdownProps { +interface InternalBaseDropdownProps extends InternalChildrenProps { readonly readOnly?: boolean readonly className?: string - readonly items: readonly T[] - readonly render: (props: InternalChildProps) => ReactNode } /** Props for a {@link Dropdown}, when `multiple` is `false` or absent. */ @@ -56,7 +54,7 @@ export const Dropdown = forwardRef(function Dropdown( props: DropdownProps, ref: ForwardedRef, ) { - const { readOnly = false, className, items, render: Child } = props + const { readOnly = false, className, items, children: Child } = props const listBoxItems = useMemo(() => items.map((item, i) => ({ item, i })), [items]) const [tempSelectedIndex, setTempSelectedIndex] = useState(null) const rootRef = useRef(null) @@ -189,7 +187,8 @@ export const Dropdown = forwardRef(function Dropdown(
{visuallySelectedItem != null ? - : multiple && } + : multiple && {Child} + }
{/* Hidden, but required to exist for the width of the parent element to be correct. diff --git a/app/dashboard/src/components/JSONSchemaInput.tsx b/app/dashboard/src/components/JSONSchemaInput.tsx index 09926fc4330f..d0e2786a06a6 100644 --- a/app/dashboard/src/components/JSONSchemaInput.tsx +++ b/app/dashboard/src/components/JSONSchemaInput.tsx @@ -328,7 +328,6 @@ export default function JSONSchemaInput(props: JSONSchemaInputProps) { readOnly={readOnly} items={childSchemas} selectedIndex={selectedChildIndex} - render={(childProps) => {getSchemaName(defs, childProps.item)}} className="self-start" onChange={(childSchema, index) => { setSelectedChildIndex(index) @@ -336,7 +335,9 @@ export default function JSONSchemaInput(props: JSONSchemaInputProps) { setValue(newConstantValue[0] ?? null) }} {...innerProps} - /> + > + {({ item }) => {getSchemaName(defs, item)}} + )} ) diff --git a/app/dashboard/src/layouts/Settings/ActivityLogSettingsSection.tsx b/app/dashboard/src/layouts/Settings/ActivityLogSettingsSection.tsx index 7c5923982952..4c2e9c65b05a 100644 --- a/app/dashboard/src/layouts/Settings/ActivityLogSettingsSection.tsx +++ b/app/dashboard/src/layouts/Settings/ActivityLogSettingsSection.tsx @@ -160,7 +160,6 @@ export default function ActivityLogSettingsSection(props: ActivityLogSettingsSec multiple items={backendModule.EVENT_TYPES} selectedIndices={typeIndices} - render={({ item }) => EVENT_TYPE_NAME[item]} renderMultiple={({ items }) => items.length === 0 || items.length === backendModule.EVENT_TYPES.length ? 'All' @@ -171,7 +170,9 @@ export default function ActivityLogSettingsSection(props: ActivityLogSettingsSec setTypes(items) setTypeIndices(indices) }} - /> + > + {({ item }) => EVENT_TYPE_NAME[item]} +
@@ -181,18 +182,18 @@ export default function ActivityLogSettingsSection(props: ActivityLogSettingsSec multiple items={allEmails} selectedIndices={emailIndices} - render={(itemProps) => itemProps.item} - renderMultiple={(itemsProps) => - itemsProps.items.length === 0 || itemsProps.items.length === allEmails.length ? + renderMultiple={({ items }) => + items.length === 0 || items.length === allEmails.length ? 'All' - : (itemsProps.items[0] ?? '') + - (itemsProps.items.length <= 1 ? '' : `(+${itemsProps.items.length - 1})`) + : (items[0] ?? '') + (items.length <= 1 ? '' : `(+${items.length - 1})`) } onChange={(items, indices) => { setEmails(items) setEmailIndices(indices) }} - /> + > + {({ item }) => item} +
)} From 17b18acf4ec05c210e9b47a9e38ea0253bf25928 Mon Sep 17 00:00:00 2001 From: somebody1234 Date: Mon, 19 Aug 2024 23:27:32 +1000 Subject: [PATCH 05/49] Make error display fit on screen --- app/dashboard/src/components/ErrorBoundary.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/dashboard/src/components/ErrorBoundary.tsx b/app/dashboard/src/components/ErrorBoundary.tsx index 3a7c3ab2b26d..a57bcd274c7b 100644 --- a/app/dashboard/src/components/ErrorBoundary.tsx +++ b/app/dashboard/src/components/ErrorBoundary.tsx @@ -102,7 +102,7 @@ export function ErrorDisplay(props: ErrorDisplayProps): React.JSX.Element { {detect.IS_DEV_MODE && stack != null && ( Date: Mon, 19 Aug 2024 23:47:03 +1000 Subject: [PATCH 06/49] Switch secret from Modal to Dialog --- .../components/AriaComponents/Form/types.ts | 2 +- app/dashboard/src/layouts/DriveBar.tsx | 40 ++--- .../src/modals/UpsertSecretModal.tsx | 170 ++++++------------ 3 files changed, 78 insertions(+), 134 deletions(-) diff --git a/app/dashboard/src/components/AriaComponents/Form/types.ts b/app/dashboard/src/components/AriaComponents/Form/types.ts index 00d79f59d308..78eb310bd0f5 100644 --- a/app/dashboard/src/components/AriaComponents/Form/types.ts +++ b/app/dashboard/src/components/AriaComponents/Form/types.ts @@ -199,7 +199,7 @@ interface FormFieldProps< > { readonly name: TFieldName readonly value?: BaseValueType extends TFieldValues[TFieldName] ? TFieldValues[TFieldName] : never - readonly defaultValue?: TFieldValues[TFieldName] + readonly defaultValue?: TFieldValues[TFieldName] | undefined readonly isDisabled?: boolean readonly isRequired?: boolean readonly isInvalid?: boolean diff --git a/app/dashboard/src/layouts/DriveBar.tsx b/app/dashboard/src/layouts/DriveBar.tsx index defd3e1ffa5e..9c2d1ce56582 100644 --- a/app/dashboard/src/layouts/DriveBar.tsx +++ b/app/dashboard/src/layouts/DriveBar.tsx @@ -264,28 +264,28 @@ export default function DriveBar(props: DriveBarProps) { }} /> {isCloud && ( - { - setModal() - }} - /> + + + + )} {isCloud && ( - { - setModal() - }} - /> + + + {/* */} + )} void + readonly doCreate: (name: string, value: string) => void | Promise } /** A modal for creating and editing a secret. */ export default function UpsertSecretModal(props: UpsertSecretModalProps) { const { id, name: nameRaw, doCreate } = props - const toastAndLog = toastAndLogHooks.useToastAndLog() - const { unsetModal } = modalProvider.useSetModal() - const { getText } = textProvider.useText() + const { getText } = useText() - const [name, setName] = React.useState(nameRaw ?? '') - const [value, setValue] = React.useState('') - const [isShowingValue, setIsShowingValue] = React.useState(false) const isCreatingSecret = id == null const isNameEditable = nameRaw == null - const canSubmit = Boolean(name && value) - - const doSubmit = () => { - unsetModal() - try { - doCreate(name, value) - } catch (error) { - toastAndLog(null, error) - } - } return ( - -
{ - event.stopPropagation() - }} - onSubmit={(event) => { - event.preventDefault() - doSubmit() - }} - > - - {isCreatingSecret ? getText('newSecret') : getText('editSecret')} - -
- - {(innerProps) => ( - - {getText('name')} - - { - setName(event.currentTarget.value) - }} - /> - - - )} - - - {(innerProps) => ( - - {getText('value')} -
- - { - setValue(event.currentTarget.value) - }} - /> - -
-
- )} -
-
- - - {isCreatingSecret ? getText('create') : getText('update')} - - - {getText('cancel')} - - -
-
+ + {({ close }) => ( +
{ + await doCreate(name, value) + }} + > + {({ form }) => ( + <> + + + + + {isCreatingSecret ? getText('create') : getText('update')} + + + + + )} + + )} +
) } From f700791f7b96b82606aef81b14b46b148cbdde76 Mon Sep 17 00:00:00 2001 From: somebody1234 Date: Tue, 20 Aug 2024 16:27:13 +1000 Subject: [PATCH 07/49] Finish switching Dropdown to react-aria-components --- .../Inputs/Dropdown/Dropdown.tsx | 5 +- .../Inputs/Selector/Selector.tsx | 6 +- app/dashboard/src/components/Autocomplete.tsx | 8 +- .../src/components/JSONSchemaInput.tsx | 258 ++++++++---------- .../components/dashboard/DatalinkInput.tsx | 34 +++ app/dashboard/src/data/datalinkValidator.ts | 10 +- app/dashboard/src/layouts/DriveBar.tsx | 2 +- .../src/modals/ManagePermissionsModal.tsx | 13 +- .../src/modals/UpsertDatalinkModal.tsx | 130 +++------ .../src/modals/UpsertSecretModal.tsx | 5 +- .../components/PlanSelectorDialog.tsx | 5 +- .../utilities/__tests__/jsonSchema.test.ts | 10 +- app/dashboard/src/utilities/jsonSchema.ts | 27 +- 13 files changed, 247 insertions(+), 266 deletions(-) diff --git a/app/dashboard/src/components/AriaComponents/Inputs/Dropdown/Dropdown.tsx b/app/dashboard/src/components/AriaComponents/Inputs/Dropdown/Dropdown.tsx index 4a9e322bfd68..580a75e0203c 100644 --- a/app/dashboard/src/components/AriaComponents/Inputs/Dropdown/Dropdown.tsx +++ b/app/dashboard/src/components/AriaComponents/Inputs/Dropdown/Dropdown.tsx @@ -158,11 +158,8 @@ export const Dropdown = forwardRef(function Dropdown( key={i} id={i} className={twMerge( - 'not-selected:hover:bg-hover-bg not-focus:hover:bg-hover-bg flex h-6 items-center gap-dropdown-arrow rounded-input px-input-x transition-colors selected:focus:cursor-default selected:focus:bg-frame selected:focus:font-bold selected:focus:focus-ring', + 'flex h-6 items-center gap-dropdown-arrow rounded-input px-input-x transition-colors selected:focus:cursor-default selected:focus:bg-frame selected:focus:font-bold selected:focus:focus-ring not-focus:hover:bg-hover-bg not-selected:hover:bg-hover-bg', multiple && 'hover:font-semibold', - i === visuallySelectedIndex ? - 'cursor-default bg-frame font-bold focus-ring' - : 'hover:bg-hover-bg', )} > , 'disabled' | 'invalid'> { readonly items: readonly TFieldValues[TFieldName][] - readonly itemToString?: (item: TFieldValues[TFieldName]) => string + readonly children?: (item: TFieldValues[TFieldName]) => string readonly className?: string readonly style?: React.CSSProperties readonly inputRef?: React.Ref @@ -97,7 +97,7 @@ export const Selector = React.forwardRef(function Selector< const { name, items, - itemToString = String, + children = String, isDisabled = false, form, defaultValue, @@ -167,7 +167,7 @@ export const Selector = React.forwardRef(function Selector< }} > {items.map((item, i) => ( - + ))} ) diff --git a/app/dashboard/src/components/Autocomplete.tsx b/app/dashboard/src/components/Autocomplete.tsx index 141dba18b657..14a80f606b00 100644 --- a/app/dashboard/src/components/Autocomplete.tsx +++ b/app/dashboard/src/components/Autocomplete.tsx @@ -32,7 +32,7 @@ interface InternalBaseAutocompleteProps { /** This may change as the user types in the input. */ readonly items: readonly T[] readonly itemToKey: (item: T) => string - readonly itemToString: (item: T) => string + readonly children: (item: T) => string readonly itemsToString?: (items: T[]) => string readonly matches: (item: T, text: string) => boolean readonly text?: string | null @@ -80,7 +80,7 @@ export type AutocompleteProps = ( /** A select menu with a dropdown. */ export default function Autocomplete(props: AutocompleteProps) { const { multiple, type = 'text', inputRef: rawInputRef, placeholder, values, setValues } = props - const { text, setText, autoFocus = false, items, itemToKey, itemToString, itemsToString } = props + const { text, setText, autoFocus = false, items, itemToKey, children, itemsToString } = props const { matches } = props const [isDropdownVisible, setIsDropdownVisible] = React.useState(false) const [selectedIndex, setSelectedIndex] = React.useState(null) @@ -233,7 +233,7 @@ export default function Autocomplete(props: AutocompleteProps) { }) }} > - {itemsToString?.(values) ?? (values[0] != null ? itemToString(values[0]) : ZWSP)} + {itemsToString?.(values) ?? (values[0] != null ? children(values[0]) : ZWSP)}
}
))} diff --git a/app/dashboard/src/components/JSONSchemaInput.tsx b/app/dashboard/src/components/JSONSchemaInput.tsx index d0e2786a06a6..827d30a5e957 100644 --- a/app/dashboard/src/components/JSONSchemaInput.tsx +++ b/app/dashboard/src/components/JSONSchemaInput.tsx @@ -5,12 +5,11 @@ import { Input, Text } from '#/components/aria' import { Button, Dropdown } from '#/components/AriaComponents' import Autocomplete from '#/components/Autocomplete' import Checkbox from '#/components/styled/Checkbox' -import FocusArea from '#/components/styled/FocusArea' import FocusRing from '#/components/styled/FocusRing' import { useBackendQuery } from '#/hooks/backendHooks' import { useRemoteBackendStrict } from '#/providers/BackendProvider' import { useText } from '#/providers/TextProvider' -import { constantValue, getSchemaName, lookupDef } from '#/utilities/jsonSchema' +import { constantValueOfSchema, getSchemaName, lookupDef } from '#/utilities/jsonSchema' import { asObject, singletonObjectOrNull } from '#/utilities/object' import { twMerge } from '#/utilities/tailwindMerge' @@ -27,13 +26,13 @@ export interface JSONSchemaInputProps { readonly path: string readonly getValidator: (path: string) => (value: unknown) => boolean readonly value: NonNullable | null - readonly setValue: React.Dispatch | null>> + readonly onChange: React.Dispatch | null>> } /** A dynamic wizard for creating an arbitrary type of Datalink. */ export default function JSONSchemaInput(props: JSONSchemaInputProps) { const { dropdownTitle, readOnly = false, defs, schema, path, getValidator } = props - const { value, setValue } = props + const { value, onChange } = props // The functionality for inputting `enso-secret`s SHOULD be injected using a plugin, // but it is more convenient to avoid having plugin infrastructure. const remoteBackend = useRemoteBackendStrict() @@ -65,105 +64,91 @@ export default function JSONSchemaInput(props: JSONSchemaInputProps) {
item} - itemToString={(item) => item} placeholder={getText('enterSecretPath')} matches={(item, text) => item.toLowerCase().includes(text.toLowerCase())} values={isValid ? [value] : []} setValues={(values) => { - setValue(values[0] ?? '') + onChange(values[0] ?? '') }} text={autocompleteText} setText={setAutocompleteText} - /> + > + {(item) => item} +
, ) } else { children.push( - - {(innerProps) => ( - - { - const newValue: string = event.currentTarget.value - setValue(newValue) - }} - {...innerProps} - /> - - )} - , + + { + const newValue: string = event.currentTarget.value + onChange(newValue) + }} + /> + , ) } break } case 'number': { children.push( - - {(innerProps) => ( - - { - const newValue: number = event.currentTarget.valueAsNumber - if (Number.isFinite(newValue)) { - setValue(newValue) - } - }} - {...innerProps} - /> - - )} - , + + { + const newValue: number = event.currentTarget.valueAsNumber + if (Number.isFinite(newValue)) { + onChange(newValue) + } + }} + /> + , ) break } case 'integer': { children.push( - - {(innerProps) => ( - - { - const newValue: number = Math.floor(event.currentTarget.valueAsNumber) - setValue(newValue) - }} - {...innerProps} - /> - - )} - , + + { + const newValue: number = Math.floor(event.currentTarget.valueAsNumber) + onChange(newValue) + }} + /> + , ) break } @@ -172,7 +157,7 @@ export default function JSONSchemaInput(props: JSONSchemaInputProps) { , ) break @@ -190,57 +175,50 @@ export default function JSONSchemaInput(props: JSONSchemaInputProps) { })) }, ) - if (constantValue(defs, schema).length !== 1) { + if (constantValueOfSchema(defs, schema).length !== 1) { children.push(
{propertyDefinitions.map((definition) => { const { key, schema: childSchema } = definition const isOptional = !requiredProperties.includes(key) - return constantValue(defs, childSchema).length === 1 ? + const isPresent = value != null && key in value + return constantValueOfSchema(defs, childSchema).length === 1 ? null : <> - - {(innerProps) => { - const isPresent = value != null && key in value - return ( - - ) + } + }) + } }} - - {value != null && key in value && ( + > + {'title' in childSchema ? String(childSchema.title) : key} + + {isPresent && (
)[key] ?? null} - setValue={(newValue) => { - setValue((oldValue) => { + onChange={(newValue) => { + onChange((oldValue) => { if (typeof newValue === 'function') { const unsafeValue: unknown = newValue( // This is SAFE; but there is no way to tell TypeScript that an object @@ -308,7 +286,8 @@ export default function JSONSchemaInput(props: JSONSchemaInputProps) { const selectedChildSchema = selectedChildIndex == null ? null : childSchemas[selectedChildIndex] const selectedChildPath = `${path}/anyOf/${selectedChildIndex ?? 0}` - const childValue = selectedChildSchema == null ? [] : constantValue(defs, selectedChildSchema) + const childValue = + selectedChildSchema == null ? [] : constantValueOfSchema(defs, selectedChildSchema) if ( value != null && (selectedChildSchema == null || getValidator(selectedChildPath)(value) !== true) @@ -322,24 +301,19 @@ export default function JSONSchemaInput(props: JSONSchemaInputProps) { } } const dropdown = ( - - {(innerProps) => ( - { - setSelectedChildIndex(index) - const newConstantValue = constantValue(defs, childSchema, true) - setValue(newConstantValue[0] ?? null) - }} - {...innerProps} - > - {({ item }) => {getSchemaName(defs, item)}} - - )} - + { + setSelectedChildIndex(index) + const newConstantValue = constantValueOfSchema(defs, childSchema, true) + onChange(newConstantValue[0] ?? null) + }} + > + {({ item }) => {getSchemaName(defs, item)}} + ) children.push(
)}
, @@ -377,7 +351,7 @@ export default function JSONSchemaInput(props: JSONSchemaInputProps) { path={`${path}/allOf/${i}`} getValidator={getValidator} value={value} - setValue={setValue} + onChange={onChange} /> )) children.push(...newChildren) diff --git a/app/dashboard/src/components/dashboard/DatalinkInput.tsx b/app/dashboard/src/components/dashboard/DatalinkInput.tsx index 5afd58b8e49a..0e37387e6e3e 100644 --- a/app/dashboard/src/components/dashboard/DatalinkInput.tsx +++ b/app/dashboard/src/components/dashboard/DatalinkInput.tsx @@ -7,7 +7,11 @@ import * as datalinkValidator from '#/data/datalinkValidator' import type * as jsonSchemaInput from '#/components/JSONSchemaInput' import JSONSchemaInput from '#/components/JSONSchemaInput' +import { FieldError } from '#/components/aria' +import type { FieldValues, FormInstance, TSchema } from '#/components/AriaComponents' +import { useFormContext } from '#/components/AriaComponents/Form/components/useFormContext' import * as error from '#/utilities/error' +import { Controller, type FieldPath } from 'react-hook-form' // ================= // === Constants === @@ -45,3 +49,33 @@ export default function DatalinkInput(props: DatalinkInputProps) { /> ) } + +/** Props for a {@link DatalinkFormInput}. */ +export interface DatalinkFormInputProps + extends Omit { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + readonly form?: FormInstance + readonly name: FieldPath> +} + +/** A dynamic wizard for creating an arbitrary type of Datalink. */ +export function DatalinkFormInput(props: DatalinkFormInputProps) { + const fallbackForm = useFormContext() + const { form = fallbackForm, name, ...inputProps } = props + + return ( + { + const { value, onChange } = field + return ( + <> + + {fieldState.error?.message} + + ) + }} + /> + ) +} diff --git a/app/dashboard/src/data/datalinkValidator.ts b/app/dashboard/src/data/datalinkValidator.ts index c344ab444ef3..37858069303a 100644 --- a/app/dashboard/src/data/datalinkValidator.ts +++ b/app/dashboard/src/data/datalinkValidator.ts @@ -6,8 +6,14 @@ import SCHEMA from '#/data/datalinkSchema.json' with { type: 'json' } import * as error from '#/utilities/error' -// eslint-disable-next-line @typescript-eslint/naming-convention -export const AJV = new Ajv({ formats: { 'enso-secret': true, 'enso-file': true } }) +export const AJV = new Ajv({ + formats: { + // eslint-disable-next-line @typescript-eslint/naming-convention + 'enso-secret': (value) => typeof value === 'string' && value !== '', + // eslint-disable-next-line @typescript-eslint/naming-convention + 'enso-file': true, + }, +}) AJV.addSchema(SCHEMA) // This is a function, even though it does not contain function syntax. diff --git a/app/dashboard/src/layouts/DriveBar.tsx b/app/dashboard/src/layouts/DriveBar.tsx index 9c2d1ce56582..7701c09ed2f2 100644 --- a/app/dashboard/src/layouts/DriveBar.tsx +++ b/app/dashboard/src/layouts/DriveBar.tsx @@ -284,7 +284,7 @@ export default function DriveBar(props: DriveBarProps) { isDisabled={shouldBeDisabled} aria-label={getText('newDatalink')} /> - {/* */} + )} 'userId' in userOrGroup ? userOrGroup.userId : userOrGroup.id } - itemToString={(userOrGroup) => - 'name' in userOrGroup ? - `${userOrGroup.name} (${userOrGroup.email})` - : userOrGroup.groupName - } matches={(userOrGroup, text) => ('email' in userOrGroup && userOrGroup.email.toLowerCase().includes(text.toLowerCase())) || @@ -355,7 +350,13 @@ export default function ManagePermissionsModal< } text={email} setText={setEmail} - /> + > + {(userOrGroup) => + 'name' in userOrGroup ? + `${userOrGroup.name} (${userOrGroup.email})` + : userOrGroup.groupName + } +
= SCHEMA.$defs -const INITIAL_DATALINK_VALUE = - jsonSchema.constantValue(DEFS, SCHEMA.$defs.DataLink, true)[0] ?? null +const INITIAL_DATALINK_VALUE = constantValueOfSchema(DEFS, SCHEMA.$defs.DataLink, true)[0] ?? null + +/** Create the schema for this form. */ +function createUpsertDatalinkSchema() { + return z.object({ name: z.string().min(1), value: z.unknown().refine(validateDatalink) }) +} // =========================== // === UpsertDataLinkModal === @@ -31,81 +26,46 @@ const INITIAL_DATALINK_VALUE = /** Props for a {@link UpsertDatalinkModal}. */ export interface UpsertDatalinkModalProps { - readonly doCreate: (name: string, datalink: unknown) => void + readonly doCreate: (name: string, datalink: unknown) => Promise | void } /** A modal for creating a Datalink. */ export default function UpsertDatalinkModal(props: UpsertDatalinkModalProps) { const { doCreate } = props - const { unsetModal } = modalProvider.useSetModal() - const { getText } = textProvider.useText() - const [name, setName] = React.useState('') - const [value, setValue] = React.useState | null>(INITIAL_DATALINK_VALUE) - const isValueSubmittable = React.useMemo(() => datalinkValidator.validateDatalink(value), [value]) - const isSubmittable = name !== '' && isValueSubmittable - - const doSubmit = () => { - unsetModal() - doCreate(name, value) - } + const { getText } = useText() return ( - -
{ - event.stopPropagation() - }} - onSubmit={(event) => { - event.preventDefault() - doSubmit() - }} - > - - {getText('createDatalink')} - - - {(innerProps) => ( - - {getText('name')} - - { - setName(event.currentTarget.value) - }} - /> - - + + {({ close }) => ( + { + await doCreate(name, value) + }} + > + {({ form }) => ( + <> + +
+ +
+ + {getText('create')} + + + )} -
-
- -
- - - {getText('create')} - - - {getText('cancel')} - - -
-
+ + )} + ) } diff --git a/app/dashboard/src/modals/UpsertSecretModal.tsx b/app/dashboard/src/modals/UpsertSecretModal.tsx index 75d8b8cc70aa..020e36391427 100644 --- a/app/dashboard/src/modals/UpsertSecretModal.tsx +++ b/app/dashboard/src/modals/UpsertSecretModal.tsx @@ -3,8 +3,9 @@ import * as z from 'zod' import { Button, ButtonGroup, Dialog, Form, Input, Password } from '#/components/AriaComponents' import { useText } from '#/providers/TextProvider' -import { SecretId } from '#/services/Backend' +import type { SecretId } from '#/services/Backend' +/** Create the schema for this form. */ function createUpsertSecretSchema() { return z.object({ name: z.string().min(1), @@ -20,7 +21,7 @@ function createUpsertSecretSchema() { export interface UpsertSecretModalProps { readonly id: SecretId | null readonly name: string | null - readonly doCreate: (name: string, value: string) => void | Promise + readonly doCreate: (name: string, value: string) => Promise | void } /** A modal for creating and editing a secret. */ diff --git a/app/dashboard/src/modules/payments/components/PlanSelector/components/PlanSelectorDialog.tsx b/app/dashboard/src/modules/payments/components/PlanSelector/components/PlanSelectorDialog.tsx index 6261f07d0a1e..ea3ab94d7321 100644 --- a/app/dashboard/src/modules/payments/components/PlanSelector/components/PlanSelectorDialog.tsx +++ b/app/dashboard/src/modules/payments/components/PlanSelector/components/PlanSelectorDialog.tsx @@ -135,9 +135,10 @@ export function PlanSelectorDialog(props: PlanSelectorDialogProps) { name="period" // eslint-disable-next-line @typescript-eslint/no-magic-numbers items={[1, 12, 36]} - itemToString={(item) => billingPeriodToString(getText, item)} label={getText('billingPeriod')} - /> + > + {(item) => billingPeriodToString(getText, item)} + { const schema = jsonSchema.constantValueToSchema(value) if (schema != null) { - const extractedValue = jsonSchema.constantValue({}, schema)[0] + const extractedValue = jsonSchema.constantValueOfSchema({}, schema)[0] v.expect( extractedValue, `\`${JSON.stringify(value)}\` should round trip to schema and back`, @@ -38,7 +38,7 @@ v.test.each([{ value: JSON.parse('{"__proto__":{}}') }])( ({ value }) => { const schema = jsonSchema.constantValueToSchema(value) if (schema != null) { - const extractedValue = jsonSchema.constantValue({}, schema)[0] + const extractedValue = jsonSchema.constantValueOfSchema({}, schema)[0] v.expect( extractedValue, `\`${JSON.stringify(value)}\` should round trip to schema and back`, @@ -56,7 +56,7 @@ fc.test.prop({ value: fc.fc.string() })('string schema', ({ value }) => { const constSchema = { const: value, type: 'string' } v.expect(AJV.validate(STRING_SCHEMA, value)).toBe(true) v.expect(AJV.validate(constSchema, value)).toBe(true) - v.expect(jsonSchema.constantValue({}, constSchema)[0]).toBe(value) + v.expect(jsonSchema.constantValueOfSchema({}, constSchema)[0]).toBe(value) }) const NUMBER_SCHEMA = { type: 'number' } as const @@ -65,7 +65,7 @@ fc.test.prop({ value: fc.fc.float() })('number schema', ({ value }) => { const constSchema = { const: value, type: 'number' } v.expect(AJV.validate(NUMBER_SCHEMA, value)).toBe(true) v.expect(AJV.validate(constSchema, value)).toBe(true) - v.expect(jsonSchema.constantValue({}, constSchema)[0]).toBe(value) + v.expect(jsonSchema.constantValueOfSchema({}, constSchema)[0]).toBe(value) } }) @@ -94,7 +94,7 @@ fc.test.prop({ value: fc.fc.integer() })('integer schema', ({ value }) => { const constSchema = { const: value, type: 'integer' } v.expect(AJV.validate(INTEGER_SCHEMA, value)).toBe(true) v.expect(AJV.validate(constSchema, value)).toBe(true) - v.expect(jsonSchema.constantValue({}, constSchema)[0]).toBe(value) + v.expect(jsonSchema.constantValueOfSchema({}, constSchema)[0]).toBe(value) }) fc.test.prop({ diff --git a/app/dashboard/src/utilities/jsonSchema.ts b/app/dashboard/src/utilities/jsonSchema.ts index f838680ad796..d40a6e609307 100644 --- a/app/dashboard/src/utilities/jsonSchema.ts +++ b/app/dashboard/src/utilities/jsonSchema.ts @@ -146,7 +146,7 @@ const EMPTY_ARRAY = Object.freeze([] as const) // FIXME: Adjust to allow `type` and `anyOf` and `allOf` and `$ref` to all be present /** The value of the schema, if it can only have one possible value. */ -function constantValueHelper( +function constantValueOfSchemaHelper( defs: Record, schema: object, partial = false, @@ -180,7 +180,7 @@ function constantValueHelper( if (childSchema == null || (partial && !required.has(key))) { continue } - const value = constantValue(defs, childSchema, partial) + const value = constantValueOfSchema(defs, childSchema, partial) if (value.length === 0 && !partial) { // eslint-disable-next-line no-restricted-syntax return invalid @@ -204,7 +204,9 @@ function constantValueHelper( for (const childSchema of schema.prefixItems) { const childSchemaObject = objectModule.asObject(childSchema) const childValue = - childSchemaObject == null ? [] : constantValue(defs, childSchemaObject, partial) + childSchemaObject == null ? + [] + : constantValueOfSchema(defs, childSchemaObject, partial) if (childValue.length === 0 && !partial) { // eslint-disable-next-line no-restricted-syntax return invalid @@ -221,7 +223,7 @@ function constantValueHelper( // eslint-disable-next-line no-restricted-syntax return invalid } else { - const value = constantValue(defs, referencedSchema, partial) + const value = constantValueOfSchema(defs, referencedSchema, partial) if (!partial && value.length === 0) { // eslint-disable-next-line no-restricted-syntax return invalid @@ -240,7 +242,7 @@ function constantValueHelper( // eslint-disable-next-line no-restricted-syntax return invalid } else { - const value = constantValue(defs, firstMember, partial) + const value = constantValueOfSchema(defs, firstMember, partial) if (!partial && value.length === 0) { // eslint-disable-next-line no-restricted-syntax return invalid @@ -257,7 +259,8 @@ function constantValueHelper( } else { for (const childSchema of schema.allOf) { const schemaObject = objectModule.asObject(childSchema) - const value = schemaObject == null ? [] : constantValue(defs, schemaObject, partial) + const value = + schemaObject == null ? [] : constantValueOfSchema(defs, schemaObject, partial) if (!partial && value.length === 0) { // eslint-disable-next-line no-restricted-syntax return invalid @@ -298,7 +301,7 @@ function constantValueHelper( if (childSchema == null) { continue } - const value = constantValue(defs, childSchema, partial) + const value = constantValueOfSchema(defs, childSchema, partial) if (value.length === 0 && !partial) { resultArray = [] break @@ -339,14 +342,18 @@ function constantValueHelper( } /** The value of the schema, if it can only have one possible value. - * This function is a memoized version of {@link constantValueHelper}. */ -export function constantValue(defs: Record, schema: object, partial = false) { + * This function is a memoized version of {@link constantValueOfSchemaHelper}. */ +export function constantValueOfSchema( + defs: Record, + schema: object, + partial = false, +) { const cache = partial ? PARTIAL_CONSTANT_VALUE : CONSTANT_VALUE const cached = cache.get(schema) if (cached != null) { return cached } else { - const renderable = constantValueHelper(defs, schema, partial) + const renderable = constantValueOfSchemaHelper(defs, schema, partial) cache.set(schema, renderable) return renderable } From 931b34c1a5620f47a4ddf25967817177b9bea827 Mon Sep 17 00:00:00 2001 From: somebody1234 Date: Tue, 20 Aug 2024 16:42:48 +1000 Subject: [PATCH 08/49] Switch Dropdown to tailwind-variants --- .../Inputs/Dropdown/Dropdown.tsx | 103 ++++++++++-------- 1 file changed, 58 insertions(+), 45 deletions(-) diff --git a/app/dashboard/src/components/AriaComponents/Inputs/Dropdown/Dropdown.tsx b/app/dashboard/src/components/AriaComponents/Inputs/Dropdown/Dropdown.tsx index 580a75e0203c..877e9a4004ff 100644 --- a/app/dashboard/src/components/AriaComponents/Inputs/Dropdown/Dropdown.tsx +++ b/app/dashboard/src/components/AriaComponents/Inputs/Dropdown/Dropdown.tsx @@ -7,7 +7,51 @@ import { ListBox, ListBoxItem, mergeProps, useFocusWithin } from '#/components/a import FocusRing from '#/components/styled/FocusRing' import SvgMask from '#/components/SvgMask' import { forwardRef } from '#/utilities/react' -import { twMerge } from '#/utilities/tailwindMerge' +import { tv } from '#/utilities/tailwindVariants' + +const DROPDOWN_STYLES = tv({ + base: 'focus-child group relative flex w-max cursor-pointer flex-col items-start whitespace-nowrap rounded-input leading-cozy', + variants: { + isFocused: { + true: { + container: 'z-1', + options: 'before:h-full before:shadow-soft', + optionsContainer: 'grid-rows-1fr', + input: 'z-1', + }, + false: { + container: 'overflow-hidden', + options: 'before:h-6 group-hover:before:bg-hover-bg', + optionsContainer: 'grid-rows-0fr', + }, + }, + isReadOnly: { + true: { + input: 'read-only', + }, + }, + multiple: { + true: { + optionsItem: 'hover:font-semibold', + }, + }, + }, + slots: { + container: 'absolute left-0 h-full w-full min-w-max', + options: + 'relative before:absolute before:top before:w-full before:rounded-input before:border-0.5 before:border-primary/20 before:backdrop-blur-default before:transition-colors', + optionsSpacing: 'padding relative h-6', + optionsContainer: + 'relative grid max-h-dropdown-items w-full overflow-auto rounded-input transition-grid-template-rows', + optionsList: 'overflow-hidden', + optionsItem: + 'flex h-6 items-center gap-dropdown-arrow rounded-input px-input-x transition-colors selected:focus:cursor-default selected:focus:bg-frame selected:focus:font-bold selected:focus:focus-ring not-focus:hover:bg-hover-bg not-selected:hover:bg-hover-bg', + input: 'relative flex h-6 items-center gap-dropdown-arrow px-input-x', + inputDisplay: 'grow', + hiddenOptions: 'flex h-0 flex-col overflow-hidden', + hiddenOption: 'flex gap-dropdown-arrow px-input-x font-bold', + }, +}) // ================ // === Dropdown === @@ -70,6 +114,8 @@ export const Dropdown = forwardRef(function Dropdown( const visuallySelectedIndex = tempSelectedIndex ?? selectedIndex const visuallySelectedItem = visuallySelectedIndex == null ? null : items[visuallySelectedIndex] + const styles = DROPDOWN_STYLES({ className, isFocused, isReadOnly: readOnly }) + useEffect(() => { setTempSelectedIndex(selectedIndex) }, [selectedIndex]) @@ -93,35 +139,15 @@ export const Dropdown = forwardRef(function Dropdown( { tabIndex: 0, ref, - className: twMerge( - 'focus-child group relative flex w-max cursor-pointer flex-col items-start whitespace-nowrap rounded-input leading-cozy', - className, - ), + className: styles.base(), }, )} > -
-
+
+
{/* Spacing. */} -
-
+
+
( : 'single' } items={listBoxItems} - className="overflow-hidden" + className={styles.optionsList()} onSelectionChange={(keys) => { if (multiple) { const indices = Array.from(keys, (i) => Number(i)) @@ -154,14 +180,7 @@ export const Dropdown = forwardRef(function Dropdown( }} > {({ item, i }) => ( - + (
-
+
-
+
{visuallySelectedItem != null ? : multiple && {Child} @@ -190,9 +203,9 @@ export const Dropdown = forwardRef(function Dropdown(
{/* Hidden, but required to exist for the width of the parent element to be correct. * Classes that do not affect width have been removed. */} -
+
{items.map((item, i) => ( -
+
From 719b1f106f9ad1046a4955a85f1c3279e5f58e1e Mon Sep 17 00:00:00 2001 From: somebody1234 Date: Tue, 20 Aug 2024 17:20:59 +1000 Subject: [PATCH 09/49] Fix checkmark not showing for Dropdown; fix Dropdown toggle not working --- .../Inputs/Dropdown/Dropdown.tsx | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/app/dashboard/src/components/AriaComponents/Inputs/Dropdown/Dropdown.tsx b/app/dashboard/src/components/AriaComponents/Inputs/Dropdown/Dropdown.tsx index 877e9a4004ff..92f4f7d7579e 100644 --- a/app/dashboard/src/components/AriaComponents/Inputs/Dropdown/Dropdown.tsx +++ b/app/dashboard/src/components/AriaComponents/Inputs/Dropdown/Dropdown.tsx @@ -6,6 +6,8 @@ import FolderArrowIcon from '#/assets/folder_arrow.svg' import { ListBox, ListBoxItem, mergeProps, useFocusWithin } from '#/components/aria' import FocusRing from '#/components/styled/FocusRing' import SvgMask from '#/components/SvgMask' +import { useSyncRef } from '#/hooks/syncRefHooks' +import { mergeRefs } from '#/utilities/mergeRefs' import { forwardRef } from '#/utilities/react' import { tv } from '#/utilities/tailwindVariants' @@ -103,6 +105,8 @@ export const Dropdown = forwardRef(function Dropdown( const [tempSelectedIndex, setTempSelectedIndex] = useState(null) const rootRef = useRef(null) const [isFocused, setIsFocused] = useState(false) + const isFocusedRef = useSyncRef(isFocused) + const shouldBlurRef = useRef(isFocused) const { focusWithinProps } = useFocusWithin({ onFocusWithinChange: setIsFocused }) const multiple = props.multiple === true const selectedIndex = 'selectedIndex' in props ? props.selectedIndex : null @@ -122,26 +126,29 @@ export const Dropdown = forwardRef(function Dropdown( useEffect(() => { const onDocumentClick = () => { - rootRef.current?.blur() + if (shouldBlurRef.current) { + rootRef.current?.blur() + } + } + const onDocumentMouseDown = () => { + shouldBlurRef.current = isFocusedRef.current } document.addEventListener('click', onDocumentClick) + document.addEventListener('mousedown', onDocumentMouseDown) return () => { document.removeEventListener('click', onDocumentClick) + document.removeEventListener('mousedown', onDocumentMouseDown) } - }, []) + }, [isFocusedRef]) return (
()( - focusWithinProps, - { ref: rootRef }, - { - tabIndex: 0, - ref, - className: styles.base(), - }, - )} + ref={mergeRefs(ref, rootRef)} + {...mergeProps()(focusWithinProps, { + tabIndex: 0, + className: styles.base(), + })} >
@@ -156,6 +163,7 @@ export const Dropdown = forwardRef(function Dropdown( : 'single' } items={listBoxItems} + dependencies={[selectedIndices]} className={styles.optionsList()} onSelectionChange={(keys) => { if (multiple) { From 3941041315ed4170626d7907fae6f1ef1d1d9364 Mon Sep 17 00:00:00 2001 From: somebody1234 Date: Tue, 20 Aug 2024 18:48:37 +1000 Subject: [PATCH 10/49] Pull in form refactor from Async Execution PR --- .../AriaComponents/Dialog/Popover.tsx | 1 + .../components/AriaComponents/Form/Form.tsx | 76 ++++--- .../AriaComponents/Form/components/Field.tsx | 20 +- .../Form/components/FormError.tsx | 3 +- .../AriaComponents/Form/components/Reset.tsx | 4 +- .../AriaComponents/Form/components/Submit.tsx | 4 +- .../AriaComponents/Form/components/types.ts | 51 +++-- .../Form/components/useField.ts | 25 +-- .../AriaComponents/Form/components/useForm.ts | 65 +++--- .../components/AriaComponents/Form/types.ts | 132 ++++--------- .../Inputs/DatePicker/DatePicker.tsx | 173 ++++++++++++++++ .../AriaComponents/Inputs/DatePicker/index.ts | 2 + .../AriaComponents/Inputs/Input/Input.tsx | 94 ++++----- .../Inputs/MultiSelector/MultiSelector.tsx | 187 ++++++++++++++++++ .../MultiSelector/MultiSelectorOption.tsx | 68 +++++++ .../Inputs/MultiSelector/index.ts | 2 + .../Inputs/Password/Password.tsx | 17 +- .../ResizableContentEditableInput.tsx | 25 +-- .../Inputs/Selector/Selector.tsx | 63 +++--- .../components/AriaComponents/Inputs/index.ts | 3 +- .../AriaComponents/Radio/RadioGroup.tsx | 28 +-- .../components/AriaComponents/Text/Text.tsx | 3 +- .../AriaComponents/Text/useVisualTooltip.tsx | 8 +- 23 files changed, 682 insertions(+), 372 deletions(-) create mode 100644 app/dashboard/src/components/AriaComponents/Inputs/DatePicker/DatePicker.tsx create mode 100644 app/dashboard/src/components/AriaComponents/Inputs/DatePicker/index.ts create mode 100644 app/dashboard/src/components/AriaComponents/Inputs/MultiSelector/MultiSelector.tsx create mode 100644 app/dashboard/src/components/AriaComponents/Inputs/MultiSelector/MultiSelectorOption.tsx create mode 100644 app/dashboard/src/components/AriaComponents/Inputs/MultiSelector/index.ts diff --git a/app/dashboard/src/components/AriaComponents/Dialog/Popover.tsx b/app/dashboard/src/components/AriaComponents/Dialog/Popover.tsx index b95743eee220..a0bac0cc1282 100644 --- a/app/dashboard/src/components/AriaComponents/Dialog/Popover.tsx +++ b/app/dashboard/src/components/AriaComponents/Dialog/Popover.tsx @@ -40,6 +40,7 @@ export const POPOVER_STYLES = twv.tv({ true: 'animate-out fade-out placement-bottom:slide-out-to-top-1 placement-top:slide-out-to-bottom-1 placement-left:slide-out-to-right-1 placement-right:slide-out-to-left-1 ease-in duration-150', }, size: { + auto: { base: 'w-[unset]', dialog: 'p-2.5' }, xsmall: { base: 'max-w-xs', dialog: 'p-2.5' }, small: { base: 'max-w-sm', dialog: 'p-3.5' }, medium: { base: 'max-w-md', dialog: 'p-3.5' }, diff --git a/app/dashboard/src/components/AriaComponents/Form/Form.tsx b/app/dashboard/src/components/AriaComponents/Form/Form.tsx index f03489fe2f8e..6fe0961e71ea 100644 --- a/app/dashboard/src/components/AriaComponents/Form/Form.tsx +++ b/app/dashboard/src/components/AriaComponents/Form/Form.tsx @@ -35,14 +35,12 @@ function mapValueOnEvent(value: unknown) { * Provides better error handling and form state management and better UX out of the box. */ // There is no way to avoid type casting here // eslint-disable-next-line no-restricted-syntax -export const Form = React.forwardRef(function Form< - Schema extends components.TSchema, - TFieldValues extends components.FieldValues, - TTransformedValues extends components.FieldValues | undefined = undefined, ->( - props: types.FormProps, +export const Form = React.forwardRef(function Form( + props: types.FormProps, ref: React.Ref, ) { + /** Input values for this form. */ + type FieldValues = components.FieldValues const formId = React.useId() const { @@ -78,6 +76,7 @@ export const Form = React.forwardRef(function Form< schema, ...formOptions, }, + defaultValues, ) const dialogContext = dialog.useDialogContext() @@ -90,7 +89,7 @@ export const Form = React.forwardRef(function Form< // the result, and the variables(form fields). // In general, prefer using object literals for the mutation key. mutationKey: ['Form submission', `testId: ${testId}`, `id: ${id}`], - mutationFn: async (fieldValues: TFieldValues) => { + mutationFn: async (fieldValues: FieldValues) => { try { await onSubmit?.(fieldValues, innerForm) @@ -153,33 +152,32 @@ export const Form = React.forwardRef(function Form< control, } = innerForm - const formStateRenderProps: types.FormStateRenderProps = - { - formState, - register: (name, options) => { - const registered = register(name, options) - - const result: types.UseFormRegisterReturn = { - ...registered, - isDisabled: registered.disabled ?? false, - isRequired: registered.required ?? false, - isInvalid: Boolean(formState.errors[name]), - onChange: (value) => registered.onChange(mapValueOnEvent(value)), - onBlur: (value) => registered.onBlur(mapValueOnEvent(value)), - } + const formStateRenderProps: types.FormStateRenderProps = { + formState, + register: (name, options) => { + const registered = register(name, options) + + const result: types.UseFormRegisterReturn = { + ...registered, + isDisabled: registered.disabled ?? false, + isRequired: registered.required ?? false, + isInvalid: Boolean(formState.errors[name]), + onChange: (value) => registered.onChange(mapValueOnEvent(value)), + onBlur: (value) => registered.onBlur(mapValueOnEvent(value)), + } - return result - }, - unregister, - setError, - clearErrors, - getValues, - setValue, - setFocus, - reset, - control, - form: innerForm, - } + return result + }, + unregister, + setError, + clearErrors, + getValues, + setValue, + setFocus, + reset, + control, + form: innerForm, + } const base = styles.FORM_STYLES({ className: typeof className === 'function' ? className(formStateRenderProps) : className, @@ -192,7 +190,7 @@ export const Form = React.forwardRef(function Form< const message = error?.message ?? getText('arbitraryFormErrorMessage') return [key, message] }), - ) as Record + ) as Record return (
> & - (< - Schema extends components.TSchema, - TFieldValues extends components.FieldValues, - TTransformedValues extends components.FieldValues | undefined = undefined, - >( - props: React.RefAttributes & - types.FormProps, - // eslint-disable-next-line no-restricted-syntax + (( + props: React.RefAttributes & types.FormProps, ) => React.JSX.Element) Form.schema = components.schema diff --git a/app/dashboard/src/components/AriaComponents/Form/components/Field.tsx b/app/dashboard/src/components/AriaComponents/Form/components/Field.tsx index 31429f77f7d5..e841a76ad20e 100644 --- a/app/dashboard/src/components/AriaComponents/Form/components/Field.tsx +++ b/app/dashboard/src/components/AriaComponents/Form/components/Field.tsx @@ -3,13 +3,14 @@ * * Field component */ - import * as React from 'react' import * as aria from '#/components/aria' import { useText } from '#/providers/TextProvider' +import { forwardRef } from '#/utilities/react' import { type ExtractFunction, tv, type VariantProps } from '#/utilities/tailwindVariants' +import type { Path } from 'react-hook-form' import * as text from '../../Text' import type * as types from './types' import * as formContext from './useFormContext' @@ -17,11 +18,12 @@ import * as formContext from './useFormContext' /** * Props for Field component */ -export interface FieldComponentProps extends VariantProps, types.FieldProps { +export interface FieldComponentProps + extends VariantProps, + types.FieldProps { readonly 'data-testid'?: string | undefined - readonly name: string - // eslint-disable-next-line @typescript-eslint/no-explicit-any - readonly form?: types.FormInstance + readonly name: Path> + readonly form?: types.FormInstance readonly isInvalid?: boolean | undefined readonly className?: string | undefined readonly children?: React.ReactNode | ((props: FieldChildrenRenderProps) => React.ReactNode) @@ -62,12 +64,14 @@ export const FIELD_STYLES = tv({ /** * Field component */ -export const Field = React.forwardRef(function Field( - props: FieldComponentProps, +// eslint-disable-next-line no-restricted-syntax +export const Field = forwardRef(function Field( + props: FieldComponentProps, ref: React.ForwardedRef, ) { const { - form = formContext.useFormContext(), + // eslint-disable-next-line no-restricted-syntax + form = formContext.useFormContext() as unknown as types.FormInstance, isInvalid, children, className, diff --git a/app/dashboard/src/components/AriaComponents/Form/components/FormError.tsx b/app/dashboard/src/components/AriaComponents/Form/components/FormError.tsx index 65e73671342c..77f845153a64 100644 --- a/app/dashboard/src/components/AriaComponents/Form/components/FormError.tsx +++ b/app/dashboard/src/components/AriaComponents/Form/components/FormError.tsx @@ -17,8 +17,9 @@ import * as formContext from './useFormContext' * Props for the FormError component. */ export interface FormErrorProps extends Omit { + // We do not need to know the form fields. // eslint-disable-next-line @typescript-eslint/no-explicit-any - readonly form?: types.FormInstance + readonly form?: types.FormInstance } /** diff --git a/app/dashboard/src/components/AriaComponents/Form/components/Reset.tsx b/app/dashboard/src/components/AriaComponents/Form/components/Reset.tsx index 762da8d4ef6b..05d10e6e80e8 100644 --- a/app/dashboard/src/components/AriaComponents/Form/components/Reset.tsx +++ b/app/dashboard/src/components/AriaComponents/Form/components/Reset.tsx @@ -20,9 +20,9 @@ export interface ResetProps extends Omit * * This field is helpful when you need to use the submit button outside of the form. */ - // For this component, we don't need to know the form fields + // We do not need to know the form fields. // eslint-disable-next-line @typescript-eslint/no-explicit-any - readonly form?: types.FormInstance + readonly form?: types.FormInstance } /** diff --git a/app/dashboard/src/components/AriaComponents/Form/components/Submit.tsx b/app/dashboard/src/components/AriaComponents/Form/components/Submit.tsx index 8a0fba1a8a4d..a6505d85d9c5 100644 --- a/app/dashboard/src/components/AriaComponents/Form/components/Submit.tsx +++ b/app/dashboard/src/components/AriaComponents/Form/components/Submit.tsx @@ -24,9 +24,9 @@ interface SubmitButtonBaseProps { * * This field is helpful when you need to use the submit button outside of the form. */ - // For this component, we don't need to know the form fields + // We do not need to know the form fields. // eslint-disable-next-line @typescript-eslint/no-explicit-any - readonly form?: types.FormInstance + readonly form?: types.FormInstance /** * Prop that allows to close the parent dialog without submitting the form. * diff --git a/app/dashboard/src/components/AriaComponents/Form/components/types.ts b/app/dashboard/src/components/AriaComponents/Form/components/types.ts index 46e3ac542d86..d35a90fbef5c 100644 --- a/app/dashboard/src/components/AriaComponents/Form/components/types.ts +++ b/app/dashboard/src/components/AriaComponents/Form/components/types.ts @@ -9,33 +9,34 @@ import type * as z from 'zod' import type * as schemaModule from './schema' -/** - * Field values type. - */ -// eslint-disable-next-line no-restricted-syntax +/** The type of the inputs to the form, used for UI inputs. */ export type FieldValues = - Schema extends TSchema ? z.infer : reactHookForm.FieldValues + Schema extends TSchema ? z.input : reactHookForm.FieldValues + +/** The type of the outputs of the form, used for the callback. */ +export type TransformedValues = + Schema extends TSchema ? z.output : reactHookForm.FieldValues /** * Field path type. * @alias reactHookForm.FieldPath */ -export type FieldPath< - Schema extends TSchema, - TFieldValues extends FieldValues, -> = reactHookForm.FieldPath +export type FieldPath = reactHookForm.FieldPath> /** * Schema type */ -export type TSchema = z.AnyZodObject | z.ZodEffects +export type TSchema = + | z.AnyZodObject + | z.ZodEffects + | z.ZodEffects> /** * Props for the useForm hook. */ -export interface UseFormProps> +export interface UseFormProps extends Omit< - reactHookForm.UseFormProps, + reactHookForm.UseFormProps>, 'handleSubmit' | 'resetOptions' | 'resolver' > { readonly schema: Schema | ((schema: typeof schemaModule.schema) => Schema) @@ -45,11 +46,8 @@ export interface UseFormProps, - TTransformedValues extends Record | undefined = undefined, -> extends reactHookForm.UseFormReturn {} +export interface UseFormReturn + extends reactHookForm.UseFormReturn, unknown, TransformedValues> {} /** * Form state type. @@ -64,11 +62,7 @@ export type FormState< * Form instance type * @alias UseFormReturn */ -export type FormInstance< - Schema extends TSchema, - TFieldValues extends FieldValues = FieldValues, - TTransformedValues extends Record | undefined = undefined, -> = UseFormReturn +export type FormInstance = UseFormReturn /** * Form type interface that check if FieldValues type is compatible with the value type from component @@ -76,21 +70,20 @@ export type FormInstance< export interface FormWithValueValidation< BaseValueType, Schema extends TSchema, - TFieldValues extends FieldValues, - TFieldName extends FieldPath, - TTransformedValues extends FieldValues | undefined = undefined, + TFieldName extends FieldPath, + // It is not ideal to have this as a parameter as it can be edited, but this is the simplest way + // to avoid distributive conditional types to affect the error message. We want distributivity + // to happen, just not for the error message itself. ErrorType = [ 'Type mismatch: Expected', - TFieldValues[TFieldName], + FieldValues[TFieldName], 'got', BaseValueType, 'instead.', ], > { readonly form?: - | (BaseValueType extends TFieldValues[TFieldName] ? - FormInstance - : ErrorType) + | (BaseValueType extends FieldValues[TFieldName] ? FormInstance : ErrorType) | undefined } diff --git a/app/dashboard/src/components/AriaComponents/Form/components/useField.ts b/app/dashboard/src/components/AriaComponents/Form/components/useField.ts index bbd8714da1d5..165bcc8e3820 100644 --- a/app/dashboard/src/components/AriaComponents/Form/components/useField.ts +++ b/app/dashboard/src/components/AriaComponents/Form/components/useField.ts @@ -14,21 +14,11 @@ import * as formContext from './useFormContext' export interface UseFieldOptions< BaseValueType, Schema extends types.TSchema, - TFieldValues extends types.FieldValues, - TFieldName extends types.FieldPath, - // eslint-disable-next-line no-restricted-syntax - TTransformedValues extends types.FieldValues | undefined = undefined, -> extends types.FormWithValueValidation< - BaseValueType, - Schema, - TFieldValues, - TFieldName, - TTransformedValues - > { + TFieldName extends types.FieldPath, +> extends types.FormWithValueValidation { readonly name: TFieldName readonly isDisabled?: boolean | undefined - // eslint-disable-next-line no-restricted-syntax - readonly defaultValue?: TFieldValues[TFieldName] | undefined + readonly defaultValue?: types.FieldValues[TFieldName] | undefined } /** @@ -37,18 +27,15 @@ export interface UseFieldOptions< export function useField< BaseValueType, Schema extends types.TSchema, - TFieldValues extends types.FieldValues, - TFieldName extends types.FieldPath, - // eslint-disable-next-line no-restricted-syntax - TTransformedValues extends types.FieldValues | undefined = undefined, ->(options: UseFieldOptions) { + TFieldName extends types.FieldPath, +>(options: UseFieldOptions) { const { form = formContext.useFormContext(), name, defaultValue, isDisabled = false } = options // This is safe, because the form is always passed either via the options or via the context. // The assertion is needed because we use additional type validation for form instance and throw // ts error if form does not pass the validation. // eslint-disable-next-line no-restricted-syntax - const formInstance = form as types.FormInstance + const formInstance = form as types.FormInstance const { field, fieldState, formState } = reactHookForm.useController({ name, diff --git a/app/dashboard/src/components/AriaComponents/Form/components/useForm.ts b/app/dashboard/src/components/AriaComponents/Form/components/useForm.ts index 656e9bdc3c1b..ef0147673465 100644 --- a/app/dashboard/src/components/AriaComponents/Form/components/useForm.ts +++ b/app/dashboard/src/components/AriaComponents/Form/components/useForm.ts @@ -26,15 +26,12 @@ import type * as types from './types' * But be careful, You should not switch between the two types of arguments. * Otherwise you'll be fired */ -export function useForm< - Schema extends types.TSchema, - TFieldValues extends types.FieldValues = types.FieldValues, - TTransformedValues extends types.FieldValues | undefined = undefined, ->( - optionsOrFormInstance: - | types.UseFormProps - | types.UseFormReturn, -): types.UseFormReturn { +export function useForm( + optionsOrFormInstance: types.UseFormProps | types.UseFormReturn, + defaultValues?: + | reactHookForm.DefaultValues> + | ((payload?: unknown) => Promise>), +): types.UseFormReturn { const initialTypePassed = React.useRef(getArgsType(optionsOrFormInstance)) const argsType = getArgsType(optionsOrFormInstance) @@ -47,31 +44,45 @@ export function useForm< `, ) - if ('formState' in optionsOrFormInstance) { - return optionsOrFormInstance - } else { - const { schema, ...options } = optionsOrFormInstance + const form = + 'formState' in optionsOrFormInstance ? optionsOrFormInstance : ( + (() => { + const { schema, ...options } = optionsOrFormInstance - const computedSchema = typeof schema === 'function' ? schema(schemaModule.schema) : schema + const computedSchema = typeof schema === 'function' ? schema(schemaModule.schema) : schema - return reactHookForm.useForm({ - ...options, - resolver: zodResolver.zodResolver(computedSchema, { async: true }), - }) - } + return reactHookForm.useForm< + types.FieldValues, + unknown, + types.TransformedValues + >({ + ...options, + resolver: zodResolver.zodResolver(computedSchema, { async: true }), + }) + })() + ) + + const initialDefaultValues = React.useRef(defaultValues) + + React.useEffect(() => { + // Expose default values to controlled inputs like `Selector` and `MultiSelector`. + // Using `defaultValues` is not sufficient as the value needs to be manually set at least once. + const defaults = initialDefaultValues.current + if (defaults) { + if (typeof defaults !== 'function') { + form.reset(defaults) + } + } + }, [form]) + + return form } /** * Get the type of arguments passed to the useForm hook */ -function getArgsType< - Schema extends types.TSchema, - TFieldValues extends types.FieldValues, - TTransformedValues extends types.FieldValues | undefined = undefined, ->( - args: - | types.UseFormProps - | types.UseFormReturn, +function getArgsType( + args: types.UseFormProps | types.UseFormReturn, ) { return 'formState' in args ? 'formInstance' : 'formOptions' } diff --git a/app/dashboard/src/components/AriaComponents/Form/types.ts b/app/dashboard/src/components/AriaComponents/Form/types.ts index 78eb310bd0f5..0cae25dddf44 100644 --- a/app/dashboard/src/components/AriaComponents/Form/types.ts +++ b/app/dashboard/src/components/AriaComponents/Form/types.ts @@ -15,26 +15,14 @@ export type * from './components' /** * Props for the Form component */ -export type FormProps< - Schema extends components.TSchema, - TFieldValues extends components.FieldValues, - // eslint-disable-next-line no-restricted-syntax - TTransformedValues extends components.FieldValues | undefined = undefined, -> = BaseFormProps & - ( - | FormPropsWithOptions - | FormPropsWithParentForm - ) +export type FormProps = BaseFormProps & + (FormPropsWithOptions | FormPropsWithParentForm) /** * Base props for the Form component. */ -interface BaseFormProps< - Schema extends components.TSchema, - TFieldValues extends components.FieldValues, - // eslint-disable-next-line no-restricted-syntax - TTransformedValues extends components.FieldValues | undefined = undefined, -> extends Omit< +interface BaseFormProps + extends Omit< React.HTMLProps, 'children' | 'className' | 'form' | 'onSubmit' | 'onSubmitCapture' | 'style' >, @@ -47,26 +35,18 @@ interface BaseFormProps< * Otherwise Typescript fails to infer the correct type for the form values. * This is a known limitation and we are working on a solution. */ - readonly defaultValues?: components.UseFormProps['defaultValues'] + readonly defaultValues?: components.UseFormProps['defaultValues'] readonly onSubmit?: ( - values: TFieldValues, - form: components.UseFormReturn, + values: components.TransformedValues, + form: components.UseFormReturn, ) => unknown readonly style?: | React.CSSProperties - | (( - props: FormStateRenderProps, - ) => React.CSSProperties) - readonly children: - | React.ReactNode - | ((props: FormStateRenderProps) => React.ReactNode) - readonly formRef?: React.MutableRefObject< - components.UseFormReturn - > - - readonly className?: - | string - | ((props: FormStateRenderProps) => string) + | ((props: FormStateRenderProps) => React.CSSProperties) + readonly children: React.ReactNode | ((props: FormStateRenderProps) => React.ReactNode) + readonly formRef?: React.MutableRefObject> + + readonly className?: string | ((props: FormStateRenderProps) => string) readonly onSubmitFailed?: (error: unknown) => Promise | void readonly onSubmitSuccess?: () => Promise | void @@ -86,13 +66,8 @@ interface BaseFormProps< * Props for the Form component with parent form * or if form is passed as a prop. */ -interface FormPropsWithParentForm< - Schema extends components.TSchema, - TFieldValues extends components.FieldValues, - // eslint-disable-next-line no-restricted-syntax - TTransformedValues extends components.FieldValues | undefined = undefined, -> { - readonly form: components.UseFormReturn +interface FormPropsWithParentForm { + readonly form: components.UseFormReturn readonly schema?: never readonly formOptions?: never } @@ -101,42 +76,28 @@ interface FormPropsWithParentForm< * Props for the Form component with schema and form options. * Creates a new form instance. This is the default way to use the form. */ -interface FormPropsWithOptions< - Schema extends components.TSchema, - TFieldValues extends components.FieldValues, -> { +interface FormPropsWithOptions { readonly schema: Schema | ((schema: typeof components.schema) => Schema) readonly form?: never - readonly formOptions?: Omit, 'resolver' | 'schema'> + readonly formOptions?: Omit, 'resolver' | 'schema'> } /** * Register function for a form field. */ -export type UseFormRegister< - Schema extends components.TSchema, - TFieldValues extends components.FieldValues, -> = < - TFieldName extends components.FieldPath = components.FieldPath< - Schema, - TFieldValues - >, +export type UseFormRegister = < + TFieldName extends components.FieldPath = components.FieldPath, >( name: TFieldName, - options?: reactHookForm.RegisterOptions, - // eslint-disable-next-line no-restricted-syntax -) => UseFormRegisterReturn + options?: reactHookForm.RegisterOptions, TFieldName>, +) => UseFormRegisterReturn /** * UseFormRegister return type. */ export interface UseFormRegisterReturn< Schema extends components.TSchema, - TFieldValues extends components.FieldValues, - TFieldName extends components.FieldPath = components.FieldPath< - Schema, - TFieldValues - >, + TFieldName extends components.FieldPath = components.FieldPath, > extends Omit, 'onBlur' | 'onChange'> { // eslint-disable-next-line @typescript-eslint/no-invalid-void-type readonly onChange: (value: Value) => Promise | void @@ -150,13 +111,8 @@ export interface UseFormRegisterReturn< /** * Form Render Props. */ -export type FormStateRenderProps< - Schema extends components.TSchema, - TFieldValues extends components.FieldValues, - // eslint-disable-next-line no-restricted-syntax - TTransformedValues extends components.FieldValues | undefined = undefined, -> = Pick< - components.FormInstance, +export type FormStateRenderProps = Pick< + components.FormInstance, | 'clearErrors' | 'control' | 'formState' @@ -166,17 +122,11 @@ export type FormStateRenderProps< | 'setFocus' | 'setValue' | 'unregister' - // eslint-disable-next-line no-restricted-syntax > & { - /** - * The form register function. - * Adds a field to the form state. - */ - readonly register: UseFormRegister - /** - * Form Instance - */ - readonly form: components.FormInstance + /** The form register function. Adds a field to the form state. */ + readonly register: UseFormRegister + /** The form instance. */ + readonly form: components.FormInstance } /** @@ -186,20 +136,13 @@ export type FormStateRenderProps< interface FormFieldProps< BaseValueType, Schema extends components.TSchema, - TFieldValues extends components.FieldValues, - TFieldName extends components.FieldPath, - // eslint-disable-next-line no-restricted-syntax - TTransformedValues extends components.FieldValues | undefined = undefined, -> extends components.FormWithValueValidation< - BaseValueType, - Schema, - TFieldValues, - TFieldName, - TTransformedValues - > { + TFieldName extends components.FieldPath, +> extends components.FormWithValueValidation { readonly name: TFieldName - readonly value?: BaseValueType extends TFieldValues[TFieldName] ? TFieldValues[TFieldName] : never - readonly defaultValue?: TFieldValues[TFieldName] | undefined + readonly value?: BaseValueType extends components.FieldValues[TFieldName] ? + components.FieldValues[TFieldName] + : never + readonly defaultValue?: components.FieldValues[TFieldName] readonly isDisabled?: boolean readonly isRequired?: boolean readonly isInvalid?: boolean @@ -212,14 +155,11 @@ export type FieldStateProps< // eslint-disable-next-line no-restricted-syntax BaseProps extends { value?: unknown }, Schema extends components.TSchema, - TFieldValues extends components.FieldValues, - TFieldName extends components.FieldPath, - // eslint-disable-next-line no-restricted-syntax - TTransformedValues extends components.FieldValues | undefined = undefined, -> = FormFieldProps & { + TFieldName extends components.FieldPath, +> = FormFieldProps & { // to avoid conflicts with the FormFieldProps we need to omit the FormFieldProps from the BaseProps [K in keyof Omit< BaseProps, - keyof FormFieldProps + keyof FormFieldProps >]: BaseProps[K] } diff --git a/app/dashboard/src/components/AriaComponents/Inputs/DatePicker/DatePicker.tsx b/app/dashboard/src/components/AriaComponents/Inputs/DatePicker/DatePicker.tsx new file mode 100644 index 000000000000..71ee1a4281cc --- /dev/null +++ b/app/dashboard/src/components/AriaComponents/Inputs/DatePicker/DatePicker.tsx @@ -0,0 +1,173 @@ +/** @file A date picker. */ +import type { ForwardedRef } from 'react' + +import type { DateSegment as DateSegmentType } from 'react-stately' + +import ArrowIcon from '#/assets/folder_arrow.svg' +import { + DatePicker as AriaDatePicker, + Calendar, + CalendarCell, + CalendarGrid, + CalendarGridBody, + CalendarGridHeader, + CalendarHeaderCell, + DateInput, + DateSegment, + Dialog, + Group, + Heading, + Label, + type DatePickerProps as AriaDatePickerProps, + type DateValue, +} from '#/components/aria' +import { + Button, + Form, + Popover, + Text, + type FieldComponentProps, + type FieldPath, + type FieldProps, + type FieldStateProps, + type FieldValues, + type TSchema, +} from '#/components/AriaComponents' +import { forwardRef } from '#/utilities/react' +import { Controller } from 'react-hook-form' +import { tv } from 'tailwind-variants' + +const DATE_PICKER_STYLES = tv({ + base: '', + slots: { + inputGroup: 'flex items-center h-8 gap-2 rounded-full border-0.5 border-primary/20 px-4', + dateInput: 'flex', + dateSegment: 'rounded placeholder-shown:text-primary/30 focus:bg-primary/10 px-[0.5px]', + calendarPopover: 'w-0', + calendarDialog: 'text-primary text-xs', + calendarContainer: '', + calendarHeader: 'flex items-center mb-2', + calendarHeading: 'grow text-center', + calendarGrid: '', + calendarGridHeader: 'flex', + calendarGridHeaderCell: '', + calendarGridBody: '', + calendarGridCell: + 'text-center px-1 rounded hover:bg-primary/10 outside-visible-range:text-primary/30', + }, +}) + +/** Props for a {@link DatePicker}. */ +export interface DatePickerProps> + extends FieldStateProps< + Omit< + AriaDatePickerProps[TFieldName], DateValue>>, + 'children' | 'className' | 'style' + >, + Schema, + TFieldName + >, + FieldProps, + Pick, 'className' | 'style'> { + readonly noCalendarHeader?: boolean + readonly segments?: Partial> +} + +/** A date picker. */ +export const DatePicker = forwardRef(function DatePicker< + Schema extends TSchema, + TFieldName extends FieldPath, +>(props: DatePickerProps, ref: ForwardedRef) { + const { + noCalendarHeader = false, + segments = {}, + name, + isDisabled, + form, + defaultValue, + label, + isRequired, + } = props + + const { fieldState, formInstance } = Form.useField({ + name, + isDisabled, + form, + defaultValue, + }) + + const classes = DATE_PICKER_STYLES({}) + + return ( + + { + return ( + +
{description != null && ( - + {description} - + )}
- + ) -}) as < - Schema extends ariaComponents.TSchema, - TFieldValues extends ariaComponents.FieldValues, - TFieldName extends ariaComponents.FieldPath, - TTransformedValues extends ariaComponents.FieldValues | undefined = undefined, ->( - props: InputProps & - React.RefAttributes, -) => React.ReactElement +}) diff --git a/app/dashboard/src/components/AriaComponents/Inputs/MultiSelector/MultiSelector.tsx b/app/dashboard/src/components/AriaComponents/Inputs/MultiSelector/MultiSelector.tsx new file mode 100644 index 000000000000..018b5b064fb0 --- /dev/null +++ b/app/dashboard/src/components/AriaComponents/Inputs/MultiSelector/MultiSelector.tsx @@ -0,0 +1,187 @@ +/** @file A horizontal selector supporting multiple input. */ +import { useRef, type CSSProperties, type ForwardedRef, type Ref } from 'react' + +import type { VariantProps } from 'tailwind-variants' + +import { + FieldError, + ListBox, + mergeProps, + type ListBoxItemProps, + type ListBoxProps, +} from '#/components/aria' +import { + Form, + type FieldPath, + type FieldProps, + type FieldStateProps, + type FieldValues, + type TSchema, +} from '#/components/AriaComponents' +import { mergeRefs } from '#/utilities/mergeRefs' +import { forwardRef } from '#/utilities/react' +import { tv } from '#/utilities/tailwindVariants' +import { Controller } from 'react-hook-form' +import { MultiSelectorOption } from './MultiSelectorOption' + +/** * Props for the MultiSelector component. */ +export interface MultiSelectorProps> + extends FieldStateProps< + Omit & { value: FieldValues[TFieldName] }, + Schema, + TFieldName + >, + FieldProps, + Omit, 'disabled' | 'invalid'> { + readonly items: readonly Extract[TFieldName], readonly unknown[]>[number][] + readonly itemToString?: ( + item: Extract[TFieldName], readonly unknown[]>[number], + ) => string + readonly columns?: number + readonly className?: string + readonly style?: CSSProperties + readonly inputRef?: Ref + readonly placeholder?: string +} + +export const MULTI_SELECTOR_STYLES = tv({ + base: 'block w-full bg-transparent transition-[border-color,outline] duration-200', + variants: { + disabled: { + true: { base: 'cursor-default opacity-50', textArea: 'cursor-default' }, + false: { base: 'cursor-text', textArea: 'cursor-text' }, + }, + readOnly: { true: 'cursor-default' }, + size: { + medium: { base: '' }, + }, + rounded: { + none: 'rounded-none', + small: 'rounded-sm', + medium: 'rounded-md', + large: 'rounded-lg', + xlarge: 'rounded-xl', + xxlarge: 'rounded-2xl', + xxxlarge: 'rounded-3xl', + full: 'rounded-full', + }, + variant: { + outline: { + base: 'border-[0.5px] border-primary/20', + }, + }, + }, + defaultVariants: { + size: 'medium', + rounded: 'xxlarge', + variant: 'outline', + }, + slots: { + listBox: 'grid', + }, +}) + +/** + * A horizontal multi-selector. + */ +export const MultiSelector = forwardRef(function MultiSelector< + Schema extends TSchema, + TFieldName extends FieldPath, +>(props: MultiSelectorProps, ref: ForwardedRef) { + const { + name, + items, + itemToString = String, + isDisabled = false, + columns, + form, + defaultValue, + inputRef, + label, + size, + rounded, + isRequired = false, + ...inputProps + } = props + + const privateInputRef = useRef(null) + + const { fieldState, formInstance } = Form.useField({ + name, + isDisabled, + form, + defaultValue, + }) + + const classes = MULTI_SELECTOR_STYLES({ + size, + rounded, + readOnly: inputProps.readOnly, + disabled: isDisabled || formInstance.formState.isSubmitting, + }) + + return ( + +
privateInputRef.current?.focus({ preventScroll: true })} + > + { + const { ref: fieldRef, value, onChange, ...field } = renderProps.field + return ( + [TFieldName]>>()( + { + className: classes.listBox(), + style: { gridTemplateColumns: `repeat(${columns ?? items.length}, 1fr)` }, + }, + // @ts-expect-error This is UNSAFE. This error is caused by type mismatches for + // the `id` and `aria-*` properties. + inputProps, + field, + )} + // eslint-disable-next-line no-restricted-syntax + aria-label={props['aria-label'] ?? (typeof label === 'string' ? label : '')} + // This is SAFE, as there is a constraint on `items` that prevents using keys + // that do not correspond to array values. + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call + defaultSelectedKeys={value?.map((item: FieldValues[TFieldName]) => + items.indexOf(item), + )} + onSelectionChange={(selection) => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + onChange([...selection].map((key) => items[Number(key)])) + }} + > + {items.map((item, i) => ( + + ))} + + ) + }} + /> +
+ +
+ ) +}) diff --git a/app/dashboard/src/components/AriaComponents/Inputs/MultiSelector/MultiSelectorOption.tsx b/app/dashboard/src/components/AriaComponents/Inputs/MultiSelector/MultiSelectorOption.tsx new file mode 100644 index 000000000000..9be82618a963 --- /dev/null +++ b/app/dashboard/src/components/AriaComponents/Inputs/MultiSelector/MultiSelectorOption.tsx @@ -0,0 +1,68 @@ +/** @file An option in a selector. */ +import { ListBoxItem, type ListBoxItemProps } from '#/components/aria' +import { tv } from '#/utilities/tailwindVariants' +import * as React from 'react' +import type { VariantProps } from 'tailwind-variants' +import { TEXT_STYLE } from '../../Text' + +/** Props for a {@link MultiSelectorOption}. */ +export interface MultiSelectorOptionProps + extends ListBoxItemProps, + VariantProps { + readonly label: string +} + +export const MULTI_SELECTOR_OPTION_STYLES = tv({ + base: TEXT_STYLE({ + className: + 'flex flex-1 items-center justify-center min-h-8 relative overflow-clip cursor-pointer transition-[background-color,color,outline-offset] duration-200', + variant: 'body', + }), + variants: { + rounded: { + none: 'rounded-none', + small: 'rounded-sm', + medium: 'rounded-md', + large: 'rounded-lg', + xlarge: 'rounded-xl', + xxlarge: 'rounded-2xl', + xxxlarge: 'rounded-3xl', + full: 'rounded-full', + }, + size: { + medium: { base: 'px-[11px] pb-1.5 pt-2' }, + small: { base: 'px-[11px] pb-0.5 pt-1' }, + }, + variant: { + primary: + 'selected:bg-primary selected:text-white hover:bg-primary/5 pressed:bg-primary/10 outline outline-2 outline-transparent outline-offset-[-2px] focus-visible:outline-primary focus-visible:outline-offset-0', + }, + }, + defaultVariants: { + size: 'medium', + rounded: 'xxxlarge', + variant: 'primary', + }, +}) + +export const MultiSelectorOption = React.forwardRef(function MultiSelectorOption( + props: MultiSelectorOptionProps, + ref: React.ForwardedRef, +) { + const { label, ...radioProps } = props + const { className } = props + + return ( + + MULTI_SELECTOR_OPTION_STYLES({ + className: typeof className === 'function' ? className(renderProps) : className, + }) + } + > + {label} + + ) +}) diff --git a/app/dashboard/src/components/AriaComponents/Inputs/MultiSelector/index.ts b/app/dashboard/src/components/AriaComponents/Inputs/MultiSelector/index.ts new file mode 100644 index 000000000000..1670cd4ebc8c --- /dev/null +++ b/app/dashboard/src/components/AriaComponents/Inputs/MultiSelector/index.ts @@ -0,0 +1,2 @@ +/** @file Barrel file for the MultiSelector component. */ +export * from './MultiSelector' diff --git a/app/dashboard/src/components/AriaComponents/Inputs/Password/Password.tsx b/app/dashboard/src/components/AriaComponents/Inputs/Password/Password.tsx index c0221c76a06b..f8411352819c 100644 --- a/app/dashboard/src/components/AriaComponents/Inputs/Password/Password.tsx +++ b/app/dashboard/src/components/AriaComponents/Inputs/Password/Password.tsx @@ -17,20 +17,13 @@ import { // ================ /** Props for a {@link Password}. */ -export interface PasswordProps< - Schema extends TSchema, - TFieldValues extends FieldValues, - TFieldName extends Path, - TTransformedValues extends FieldValues | undefined = undefined, -> extends Omit, 'type'> {} +export interface PasswordProps>> + extends Omit, 'type'> {} /** A component wrapping {@link Input} with the ability to show and hide password. */ -export function Password< - Schema extends TSchema, - TFieldValues extends FieldValues, - TFieldName extends Path, - TTransformedValues extends FieldValues | undefined = undefined, ->(props: PasswordProps) { +export function Password>>( + props: PasswordProps, +) { const [showPassword, setShowPassword] = useState(false) return ( diff --git a/app/dashboard/src/components/AriaComponents/Inputs/ResizableInput/ResizableContentEditableInput.tsx b/app/dashboard/src/components/AriaComponents/Inputs/ResizableInput/ResizableContentEditableInput.tsx index 3755589a879f..d1311978c3bc 100644 --- a/app/dashboard/src/components/AriaComponents/Inputs/ResizableInput/ResizableContentEditableInput.tsx +++ b/app/dashboard/src/components/AriaComponents/Inputs/ResizableInput/ResizableContentEditableInput.tsx @@ -23,15 +23,11 @@ const CONTENT_EDITABLE_STYLES = twv.tv({ */ export interface ResizableContentEditableInputProps< Schema extends ariaComponents.TSchema, - TFieldValues extends ariaComponents.FieldValues, - TFieldName extends ariaComponents.FieldPath, - TTransformedValues extends ariaComponents.FieldValues | undefined = undefined, + TFieldName extends ariaComponents.FieldPath, > extends ariaComponents.FieldStateProps< React.HTMLAttributes & { value: string }, Schema, - TFieldValues, - TFieldName, - TTransformedValues + TFieldName >, Omit, Omit, 'disabled' | 'invalid'> { @@ -53,12 +49,9 @@ export interface ResizableContentEditableInputProps< export const ResizableContentEditableInput = React.forwardRef( function ResizableContentEditableInput< Schema extends ariaComponents.TSchema, - TFieldName extends ariaComponents.FieldPath, - TFieldValues extends ariaComponents.FieldValues = ariaComponents.FieldValues, - // eslint-disable-next-line no-restricted-syntax - TTransformedValues extends ariaComponents.FieldValues | undefined = undefined, + TFieldName extends ariaComponents.FieldPath, >( - props: ResizableContentEditableInputProps, + props: ResizableContentEditableInputProps, ref: React.ForwardedRef, ) { const { @@ -153,13 +146,7 @@ export const ResizableContentEditableInput = React.forwardRef( ) }, -) as < - Schema extends ariaComponents.TSchema, - TFieldName extends ariaComponents.FieldPath, - TFieldValues extends ariaComponents.FieldValues = ariaComponents.FieldValues, - // eslint-disable-next-line no-restricted-syntax - TTransformedValues extends ariaComponents.FieldValues | undefined = undefined, ->( +) as >( props: React.RefAttributes & - ResizableContentEditableInputProps, + ResizableContentEditableInputProps, ) => React.JSX.Element diff --git a/app/dashboard/src/components/AriaComponents/Inputs/Selector/Selector.tsx b/app/dashboard/src/components/AriaComponents/Inputs/Selector/Selector.tsx index e60d5567c46b..eca6a5aeda8d 100644 --- a/app/dashboard/src/components/AriaComponents/Inputs/Selector/Selector.tsx +++ b/app/dashboard/src/components/AriaComponents/Inputs/Selector/Selector.tsx @@ -12,36 +12,29 @@ import { Form, type TSchema, } from '#/components/AriaComponents' - -import { mergeRefs } from '#/utilities/mergeRefs' - import RadioGroup from '#/components/styled/RadioGroup' +import { mergeRefs } from '#/utilities/mergeRefs' +import { forwardRef } from '#/utilities/react' import { tv } from '#/utilities/tailwindVariants' import { Controller } from 'react-hook-form' import { SelectorOption } from './SelectorOption' /** * Props for the Selector component. */ -export interface SelectorProps< - Schema extends TSchema, - TFieldValues extends FieldValues, - TFieldName extends FieldPath, - TTransformedValues extends FieldValues | undefined = undefined, -> extends FieldStateProps< - Omit & { value: TFieldValues[TFieldName] }, +export interface SelectorProps> + extends FieldStateProps< + Omit & { value: FieldValues[TFieldName] }, Schema, - TFieldValues, - TFieldName, - TTransformedValues + TFieldName >, FieldProps, Omit, 'disabled' | 'invalid'> { - readonly items: readonly TFieldValues[TFieldName][] - readonly children?: (item: TFieldValues[TFieldName]) => string + readonly items: readonly FieldValues[TFieldName][] + readonly itemToString?: (item: FieldValues[TFieldName]) => string + readonly columns?: number readonly className?: string readonly style?: React.CSSProperties readonly inputRef?: React.Ref readonly placeholder?: string - readonly readOnly?: boolean } export const SELECTOR_STYLES = tv({ @@ -84,21 +77,16 @@ export const SELECTOR_STYLES = tv({ /** * A horizontal selector. */ -// eslint-disable-next-line no-restricted-syntax -export const Selector = React.forwardRef(function Selector< +export const Selector = forwardRef(function Selector< Schema extends TSchema, - TFieldValues extends FieldValues, - TFieldName extends FieldPath, - TTransformedValues extends FieldValues | undefined = undefined, ->( - props: SelectorProps, - ref: React.ForwardedRef, -) { + TFieldName extends FieldPath, +>(props: SelectorProps, ref: React.ForwardedRef) { const { name, items, - children = String, + itemToString = String, isDisabled = false, + columns, form, defaultValue, inputRef, @@ -115,7 +103,7 @@ export const Selector = React.forwardRef(function Selector< name, isDisabled, form, - defaultValue, + ...(defaultValue != null ? { defaultValue } : {}), }) const classes = SELECTOR_STYLES({ @@ -154,7 +142,14 @@ export const Selector = React.forwardRef(function Selector< ()( - { className: classes.radioGroup(), name, isRequired, isDisabled }, + { + className: classes.radioGroup(), + name, + isRequired, + isDisabled, + style: + columns != null ? { gridTemplateColumns: `repeat(${columns}, 1fr)` } : {}, + }, inputProps, field, )} @@ -167,7 +162,7 @@ export const Selector = React.forwardRef(function Selector< }} > {items.map((item, i) => ( - + ))} ) @@ -176,12 +171,4 @@ export const Selector = React.forwardRef(function Selector<
) -}) as < - Schema extends TSchema, - TFieldValues extends FieldValues, - TFieldName extends FieldPath, - TTransformedValues extends FieldValues | undefined = undefined, ->( - props: React.RefAttributes & - SelectorProps, -) => React.ReactElement +}) diff --git a/app/dashboard/src/components/AriaComponents/Inputs/index.ts b/app/dashboard/src/components/AriaComponents/Inputs/index.ts index c737faf6b26a..84c9aace9c3f 100644 --- a/app/dashboard/src/components/AriaComponents/Inputs/index.ts +++ b/app/dashboard/src/components/AriaComponents/Inputs/index.ts @@ -4,8 +4,9 @@ * Barrel export file for Inputs */ -export * from './Dropdown' +export * from './DatePicker' export * from './Input' +export * from './MultiSelector' export * from './Password' export * from './ResizableInput' export * from './Selector' diff --git a/app/dashboard/src/components/AriaComponents/Radio/RadioGroup.tsx b/app/dashboard/src/components/AriaComponents/Radio/RadioGroup.tsx index 092e8d33bfcd..f31fcdd65cfb 100644 --- a/app/dashboard/src/components/AriaComponents/Radio/RadioGroup.tsx +++ b/app/dashboard/src/components/AriaComponents/Radio/RadioGroup.tsx @@ -18,15 +18,11 @@ import * as radioGroupContext from './RadioGroupContext' */ export interface RadioGroupProps< Schema extends formComponent.TSchema, - TFieldValues extends formComponent.FieldValues, - TFieldName extends formComponent.FieldPath, - TTransformedValues extends formComponent.FieldValues | undefined = undefined, + TFieldName extends formComponent.FieldPath, > extends formComponent.FieldStateProps< Omit, Schema, - TFieldValues, - TFieldName, - TTransformedValues + TFieldName >, twv.VariantProps, formComponent.FieldProps { @@ -45,13 +41,8 @@ export const RADIO_GROUP_STYLES = twv.tv({ // eslint-disable-next-line no-restricted-syntax export const RadioGroup = React.forwardRef(function RadioGroup< Schema extends formComponent.TSchema, - TFieldName extends formComponent.FieldPath, - TFieldValues extends formComponent.FieldValues = formComponent.FieldValues, - TTransformedValues extends formComponent.FieldValues | undefined = undefined, ->( - props: RadioGroupProps, - ref: React.ForwardedRef, -) { + TFieldName extends formComponent.FieldPath, +>(props: RadioGroupProps, ref: React.ForwardedRef) { const { children, isRequired = false, @@ -109,13 +100,6 @@ export const RadioGroup = React.forwardRef(function RadioGroup< ) -}) as < - Schema extends formComponent.TSchema, - TFieldName extends formComponent.FieldPath, - TFieldValues extends formComponent.FieldValues = formComponent.FieldValues, - // eslint-disable-next-line no-restricted-syntax - TTransformedValues extends formComponent.FieldValues | undefined = undefined, ->( - props: RadioGroupProps & - React.RefAttributes, +}) as >( + props: RadioGroupProps & React.RefAttributes, ) => React.JSX.Element diff --git a/app/dashboard/src/components/AriaComponents/Text/Text.tsx b/app/dashboard/src/components/AriaComponents/Text/Text.tsx index 13e3644372bb..6ba2789f071e 100644 --- a/app/dashboard/src/components/AriaComponents/Text/Text.tsx +++ b/app/dashboard/src/components/AriaComponents/Text/Text.tsx @@ -17,6 +17,7 @@ import * as visualTooltip from './useVisualTooltip' export interface TextProps extends Omit, twv.VariantProps { + readonly elementType?: keyof HTMLElementTagNameMap readonly lineClamp?: number readonly tooltip?: React.ReactElement | string | false | null readonly tooltipDisplay?: visualTooltip.VisualTooltipProps['display'] @@ -185,8 +186,8 @@ export const Text = React.forwardRef(function Text( return ( - {/* @ts-expect-error We suppose that elementType is a valid HTML element */} >()( diff --git a/app/dashboard/src/components/AriaComponents/Text/useVisualTooltip.tsx b/app/dashboard/src/components/AriaComponents/Text/useVisualTooltip.tsx index 6ab897a22229..c926becfce34 100644 --- a/app/dashboard/src/components/AriaComponents/Text/useVisualTooltip.tsx +++ b/app/dashboard/src/components/AriaComponents/Text/useVisualTooltip.tsx @@ -35,6 +35,12 @@ export interface VisualTooltipProps readonly testId?: string } +/** The return value of the {@link useVisualTooltip} hook. */ +export interface VisualTooltipReturn { + readonly targetProps: aria.DOMAttributes & { readonly id: string } + readonly tooltip: JSX.Element | null +} + /** * The display strategy for the tooltip. */ @@ -50,7 +56,7 @@ const DEFAULT_DELAY = 250 * Common use case is to show a tooltip when the content of an element is overflowing, * Or show a description of the element when hovered over. */ -export function useVisualTooltip(props: VisualTooltipProps) { +export function useVisualTooltip(props: VisualTooltipProps): VisualTooltipReturn { const { children, targetRef, From 6a0d886b2c99b9323587226e41c9793e11e8f429 Mon Sep 17 00:00:00 2001 From: somebody1234 Date: Tue, 20 Aug 2024 18:57:05 +1000 Subject: [PATCH 11/49] Migrate from `React.forwardRef` to generic `forwardRef` wrapper --- .../components/AriaComponents/Alert/Alert.tsx | 21 +- .../AriaComponents/Button/Button.tsx | 17 +- .../components/AriaComponents/Form/Form.tsx | 3 +- .../MultiSelector/MultiSelectorOption.tsx | 3 +- .../ResizableContentEditableInput.tsx | 227 +++++++++--------- .../Inputs/ResizableInput/ResizableInput.tsx | 3 +- .../Inputs/Selector/SelectorOption.tsx | 3 +- .../components/AriaComponents/Radio/Radio.tsx | 3 +- .../AriaComponents/Radio/RadioGroup.tsx | 7 +- .../components/AriaComponents/Text/Text.tsx | 12 +- .../AriaComponents/VisuallyHidden.tsx | 15 +- app/dashboard/src/components/ColorPicker.tsx | 7 +- app/dashboard/src/components/ContextMenus.tsx | 5 +- app/dashboard/src/components/Link.tsx | 3 +- .../src/components/styled/Button.tsx | 5 +- app/dashboard/src/components/styled/Input.tsx | 5 +- .../src/components/styled/RadioGroup.tsx | 7 +- .../src/components/styled/SettingsInput.tsx | 5 +- 18 files changed, 179 insertions(+), 172 deletions(-) diff --git a/app/dashboard/src/components/AriaComponents/Alert/Alert.tsx b/app/dashboard/src/components/AriaComponents/Alert/Alert.tsx index b370b93d1502..2fc68c46b57b 100644 --- a/app/dashboard/src/components/AriaComponents/Alert/Alert.tsx +++ b/app/dashboard/src/components/AriaComponents/Alert/Alert.tsx @@ -1,14 +1,15 @@ /** @file Alert component. */ -import * as React from 'react' +import { type ForwardedRef, type HTMLAttributes, type PropsWithChildren } from 'react' -import * as mergeRefs from '#/utilities/mergeRefs' -import * as twv from '#/utilities/tailwindVariants' +import { mergeRefs } from '#/utilities/mergeRefs' +import { forwardRef } from '#/utilities/react' +import { tv, type VariantProps } from '#/utilities/tailwindVariants' // ================= // === Constants === // ================= -export const ALERT_STYLES = twv.tv({ +export const ALERT_STYLES = tv({ base: 'flex flex-col items-stretch', variants: { fullWidth: { true: 'w-full' }, @@ -51,14 +52,14 @@ export const ALERT_STYLES = twv.tv({ /** Props for an {@link Alert}. */ export interface AlertProps - extends React.PropsWithChildren, - twv.VariantProps, - React.HTMLAttributes {} + extends PropsWithChildren, + VariantProps, + HTMLAttributes {} /** Alert component. */ -export const Alert = React.forwardRef(function Alert( +export const Alert = forwardRef(function Alert( props: AlertProps, - ref: React.ForwardedRef, + ref: ForwardedRef, ) { const { children, className, variant, size, rounded, fullWidth, ...containerProps } = props @@ -70,7 +71,7 @@ export const Alert = React.forwardRef(function Alert( return (
{ + ref={mergeRefs(ref, (e) => { if (variant === 'error') { e?.focus() } diff --git a/app/dashboard/src/components/AriaComponents/Button/Button.tsx b/app/dashboard/src/components/AriaComponents/Button/Button.tsx index 55421ed0cb83..883aa7ad66ac 100644 --- a/app/dashboard/src/components/AriaComponents/Button/Button.tsx +++ b/app/dashboard/src/components/AriaComponents/Button/Button.tsx @@ -10,7 +10,8 @@ import SvgMask from '#/components/SvgMask' import * as twv from '#/utilities/tailwindVariants' -import * as text from '../Text' +import { forwardRef } from '#/utilities/react' +import { TEXT_STYLE } from '../Text' // ============== // === Button === @@ -104,7 +105,7 @@ export const BUTTON_STYLES = twv.tv({ custom: { base: '', extraClickZone: '', icon: 'h-full' }, hero: { base: 'px-8 py-4 text-lg font-bold', content: 'gap-[0.75em]' }, large: { - base: text.TEXT_STYLE({ + base: TEXT_STYLE({ variant: 'body', color: 'custom', weight: 'semibold', @@ -115,7 +116,7 @@ export const BUTTON_STYLES = twv.tv({ extraClickZone: 'after:inset-[-6px]', }, medium: { - base: text.TEXT_STYLE({ + base: TEXT_STYLE({ variant: 'body', color: 'custom', weight: 'semibold', @@ -126,7 +127,7 @@ export const BUTTON_STYLES = twv.tv({ extraClickZone: 'after:inset-[-8px]', }, small: { - base: text.TEXT_STYLE({ + base: TEXT_STYLE({ variant: 'body', color: 'custom', weight: 'medium', @@ -137,7 +138,7 @@ export const BUTTON_STYLES = twv.tv({ extraClickZone: 'after:inset-[-10px]', }, xsmall: { - base: text.TEXT_STYLE({ + base: TEXT_STYLE({ variant: 'body', color: 'custom', weight: 'medium', @@ -149,7 +150,7 @@ export const BUTTON_STYLES = twv.tv({ extraClickZone: 'after:inset-[-12px]', }, xxsmall: { - base: text.TEXT_STYLE({ + base: TEXT_STYLE({ variant: 'body', color: 'custom', className: 'flex px-[3px] pt-[0.5px] pb-[2.5px] leading-[16px]', @@ -164,7 +165,7 @@ export const BUTTON_STYLES = twv.tv({ }, iconOnly: { true: { - base: text.TEXT_STYLE({ + base: TEXT_STYLE({ disableLineHeightCompensation: true, className: 'border-0 outline-offset-[5px]', }), @@ -278,7 +279,7 @@ export const BUTTON_STYLES = twv.tv({ }) /** A button allows a user to perform an action, with mouse, touch, and keyboard interactions. */ -export const Button = React.forwardRef(function Button( +export const Button = forwardRef(function Button( props: ButtonProps, ref: React.ForwardedRef, ) { diff --git a/app/dashboard/src/components/AriaComponents/Form/Form.tsx b/app/dashboard/src/components/AriaComponents/Form/Form.tsx index 6fe0961e71ea..a1621671f0cf 100644 --- a/app/dashboard/src/components/AriaComponents/Form/Form.tsx +++ b/app/dashboard/src/components/AriaComponents/Form/Form.tsx @@ -13,6 +13,7 @@ import * as aria from '#/components/aria' import * as errorUtils from '#/utilities/error' +import { forwardRef } from '#/utilities/react' import type { Mutable } from 'enso-common/src/utilities/data/object' import * as dialog from '../Dialog' import * as components from './components' @@ -35,7 +36,7 @@ function mapValueOnEvent(value: unknown) { * Provides better error handling and form state management and better UX out of the box. */ // There is no way to avoid type casting here // eslint-disable-next-line no-restricted-syntax -export const Form = React.forwardRef(function Form( +export const Form = forwardRef(function Form( props: types.FormProps, ref: React.Ref, ) { diff --git a/app/dashboard/src/components/AriaComponents/Inputs/MultiSelector/MultiSelectorOption.tsx b/app/dashboard/src/components/AriaComponents/Inputs/MultiSelector/MultiSelectorOption.tsx index 9be82618a963..76aa7fe4e5a9 100644 --- a/app/dashboard/src/components/AriaComponents/Inputs/MultiSelector/MultiSelectorOption.tsx +++ b/app/dashboard/src/components/AriaComponents/Inputs/MultiSelector/MultiSelectorOption.tsx @@ -1,5 +1,6 @@ /** @file An option in a selector. */ import { ListBoxItem, type ListBoxItemProps } from '#/components/aria' +import { forwardRef } from '#/utilities/react' import { tv } from '#/utilities/tailwindVariants' import * as React from 'react' import type { VariantProps } from 'tailwind-variants' @@ -45,7 +46,7 @@ export const MULTI_SELECTOR_OPTION_STYLES = tv({ }, }) -export const MultiSelectorOption = React.forwardRef(function MultiSelectorOption( +export const MultiSelectorOption = forwardRef(function MultiSelectorOption( props: MultiSelectorOptionProps, ref: React.ForwardedRef, ) { diff --git a/app/dashboard/src/components/AriaComponents/Inputs/ResizableInput/ResizableContentEditableInput.tsx b/app/dashboard/src/components/AriaComponents/Inputs/ResizableInput/ResizableContentEditableInput.tsx index d1311978c3bc..615d0b78d22d 100644 --- a/app/dashboard/src/components/AriaComponents/Inputs/ResizableInput/ResizableContentEditableInput.tsx +++ b/app/dashboard/src/components/AriaComponents/Inputs/ResizableInput/ResizableContentEditableInput.tsx @@ -1,19 +1,24 @@ /** * @file A resizable input that uses a content-editable div. */ -import * as React from 'react' +import { useRef, type ClipboardEvent, type ForwardedRef, type HTMLAttributes } from 'react' -import * as eventCallbackHooks from '#/hooks/eventCallbackHooks' +import { + Form, + Text, + type FieldPath, + type FieldProps, + type FieldStateProps, + type TSchema, +} from '#/components/AriaComponents' +import { useEventCallback } from '#/hooks/eventCallbackHooks' +import { mergeRefs } from '#/utilities/mergeRefs' +import { forwardRef } from '#/utilities/react' +import { tv, type VariantProps } from '#/utilities/tailwindVariants' +import { INPUT_STYLES } from '../variants' -import * as ariaComponents from '#/components/AriaComponents' - -import * as mergeRefs from '#/utilities/mergeRefs' -import * as twv from '#/utilities/tailwindVariants' - -import * as variants from '../variants' - -const CONTENT_EDITABLE_STYLES = twv.tv({ - extend: variants.INPUT_STYLES, +const CONTENT_EDITABLE_STYLES = tv({ + extend: INPUT_STYLES, base: '', slots: { placeholder: 'opacity-50 absolute inset-0 pointer-events-none' }, }) @@ -22,15 +27,11 @@ const CONTENT_EDITABLE_STYLES = twv.tv({ * Props for a {@link ResizableContentEditableInput}. */ export interface ResizableContentEditableInputProps< - Schema extends ariaComponents.TSchema, - TFieldName extends ariaComponents.FieldPath, -> extends ariaComponents.FieldStateProps< - React.HTMLAttributes & { value: string }, - Schema, - TFieldName - >, - Omit, - Omit, 'disabled' | 'invalid'> { + Schema extends TSchema, + TFieldName extends FieldPath, +> extends FieldStateProps & { value: string }, Schema, TFieldName>, + Omit, + Omit, 'disabled' | 'invalid'> { /** * onChange is called when the content of the input changes. * There is no way to prevent the change, so the value is always the new value. @@ -45,108 +46,98 @@ export interface ResizableContentEditableInputProps< * A resizable input that uses a content-editable div. * This component might be useful for a text input that needs to have highlighted content inside of it. */ -// eslint-disable-next-line no-restricted-syntax -export const ResizableContentEditableInput = React.forwardRef( - function ResizableContentEditableInput< - Schema extends ariaComponents.TSchema, - TFieldName extends ariaComponents.FieldPath, - >( - props: ResizableContentEditableInputProps, - ref: React.ForwardedRef, - ) { - const { - placeholder = '', - description = null, - name, - isDisabled = false, - form, - defaultValue, - size, - rounded, - variant, - ...textFieldProps - } = props +export const ResizableContentEditableInput = forwardRef(function ResizableContentEditableInput< + Schema extends TSchema, + TFieldName extends FieldPath, +>( + props: ResizableContentEditableInputProps, + ref: ForwardedRef, +) { + const { + placeholder = '', + description = null, + name, + isDisabled = false, + form, + defaultValue, + size, + rounded, + variant, + ...textFieldProps + } = props - const inputRef = React.useRef(null) + const inputRef = useRef(null) - const onPaste = eventCallbackHooks.useEventCallback( - (event: React.ClipboardEvent) => { - // Prevent pasting styled text. - event.preventDefault() - // sanitize the pasted text - // replace all < with < to prevent XSS - const text = event.clipboardData - .getData('text/plain') - .replace(//g, '>') - document.execCommand('insertHTML', false, text) - }, - ) + const onPaste = useEventCallback((event: ClipboardEvent) => { + // Prevent pasting styled text. + event.preventDefault() + // sanitize the pasted text + // replace all < with < to prevent XSS + const text = event.clipboardData + .getData('text/plain') + .replace(//g, '>') + document.execCommand('insertHTML', false, text) + }) - const { field, fieldState, formInstance } = ariaComponents.Form.useField({ - name, - isDisabled, - form, - defaultValue, - }) + const { field, fieldState, formInstance } = Form.useField({ + name, + isDisabled, + form, + defaultValue, + }) - const { - base, - description: descriptionClass, - inputContainer, - textArea, - placeholder: placeholderClass, - } = CONTENT_EDITABLE_STYLES({ - variant, - invalid: fieldState.invalid, - disabled: isDisabled || formInstance.formState.isSubmitting, - rounded, - size, - }) + const { + base, + description: descriptionClass, + inputContainer, + textArea, + placeholder: placeholderClass, + } = CONTENT_EDITABLE_STYLES({ + variant, + invalid: fieldState.invalid, + disabled: isDisabled || formInstance.formState.isSubmitting, + rounded, + size, + }) - return ( - -
{ - inputRef.current?.focus({ preventScroll: true }) - }} - > -
-
{ - field.onChange(event.currentTarget.textContent ?? '') - }} - /> + return ( + +
{ + inputRef.current?.focus({ preventScroll: true }) + }} + > +
+
{ + field.onChange(event.currentTarget.textContent ?? '') + }} + /> - 0 ? 'hidden' : '' })} - > - {placeholder} - -
- - {description != null && ( - - {description} - - )} + 0 ? 'hidden' : '' })}> + {placeholder} +
- - ) - }, -) as >( - props: React.RefAttributes & - ResizableContentEditableInputProps, -) => React.JSX.Element + + {description != null && ( + + {description} + + )} +
+
+ ) +}) diff --git a/app/dashboard/src/components/AriaComponents/Inputs/ResizableInput/ResizableInput.tsx b/app/dashboard/src/components/AriaComponents/Inputs/ResizableInput/ResizableInput.tsx index 2e3ea5841b87..91c643732234 100644 --- a/app/dashboard/src/components/AriaComponents/Inputs/ResizableInput/ResizableInput.tsx +++ b/app/dashboard/src/components/AriaComponents/Inputs/ResizableInput/ResizableInput.tsx @@ -9,6 +9,7 @@ import * as aria from '#/components/aria' import * as mergeRefs from '#/utilities/mergeRefs' +import { forwardRef } from '#/utilities/react' import * as variants from '../variants' /** @@ -22,7 +23,7 @@ export interface ResizableInputProps extends aria.TextFieldProps { /** * A resizable input field. */ -export const ResizableInput = React.forwardRef(function ResizableInput( +export const ResizableInput = forwardRef(function ResizableInput( props: ResizableInputProps, ref: React.ForwardedRef, ) { diff --git a/app/dashboard/src/components/AriaComponents/Inputs/Selector/SelectorOption.tsx b/app/dashboard/src/components/AriaComponents/Inputs/Selector/SelectorOption.tsx index e85fea1f1b54..a292ba560599 100644 --- a/app/dashboard/src/components/AriaComponents/Inputs/Selector/SelectorOption.tsx +++ b/app/dashboard/src/components/AriaComponents/Inputs/Selector/SelectorOption.tsx @@ -1,5 +1,6 @@ /** @file An option in a selector. */ import { Radio, type RadioProps } from '#/components/aria' +import { forwardRef } from '#/utilities/react' import { tv } from '#/utilities/tailwindVariants' import * as React from 'react' import type { VariantProps } from 'tailwind-variants' @@ -45,7 +46,7 @@ export const SELECTOR_OPTION_STYLES = tv({ }, }) -export const SelectorOption = React.forwardRef(function SelectorOption( +export const SelectorOption = forwardRef(function SelectorOption( props: SelectorOptionProps, ref: React.ForwardedRef, ) { diff --git a/app/dashboard/src/components/AriaComponents/Radio/Radio.tsx b/app/dashboard/src/components/AriaComponents/Radio/Radio.tsx index 58fc79d07d48..3d010420fa7e 100644 --- a/app/dashboard/src/components/AriaComponents/Radio/Radio.tsx +++ b/app/dashboard/src/components/AriaComponents/Radio/Radio.tsx @@ -11,6 +11,7 @@ import * as aria from '#/components/aria' import * as mergeRefs from '#/utilities/mergeRefs' import * as twv from '#/utilities/tailwindVariants' +import { forwardRef } from '#/utilities/react' import * as text from '../Text' import * as radioGroup from './RadioGroup' import * as radioGroupContext from './RadioGroupContext' @@ -56,7 +57,7 @@ export interface RadioProps extends aria.RadioProps { * A radio button. */ // eslint-disable-next-line no-restricted-syntax -export const Radio = React.forwardRef(function Radio( +export const Radio = forwardRef(function Radio( props: RadioProps, ref: React.ForwardedRef, ) { diff --git a/app/dashboard/src/components/AriaComponents/Radio/RadioGroup.tsx b/app/dashboard/src/components/AriaComponents/Radio/RadioGroup.tsx index f31fcdd65cfb..a09a37ef39b1 100644 --- a/app/dashboard/src/components/AriaComponents/Radio/RadioGroup.tsx +++ b/app/dashboard/src/components/AriaComponents/Radio/RadioGroup.tsx @@ -10,6 +10,7 @@ import * as aria from '#/components/aria' import * as mergeRefs from '#/utilities/mergeRefs' import * as twv from '#/utilities/tailwindVariants' +import { forwardRef } from '#/utilities/react' import * as formComponent from '../Form' import * as radioGroupContext from './RadioGroupContext' @@ -39,7 +40,7 @@ export const RADIO_GROUP_STYLES = twv.tv({ * A radio group component. */ // eslint-disable-next-line no-restricted-syntax -export const RadioGroup = React.forwardRef(function RadioGroup< +export const RadioGroup = forwardRef(function RadioGroup< Schema extends formComponent.TSchema, TFieldName extends formComponent.FieldPath, >(props: RadioGroupProps, ref: React.ForwardedRef) { @@ -100,6 +101,4 @@ export const RadioGroup = React.forwardRef(function RadioGroup< ) -}) as >( - props: RadioGroupProps & React.RefAttributes, -) => React.JSX.Element +}) diff --git a/app/dashboard/src/components/AriaComponents/Text/Text.tsx b/app/dashboard/src/components/AriaComponents/Text/Text.tsx index 6ba2789f071e..65cce0737d76 100644 --- a/app/dashboard/src/components/AriaComponents/Text/Text.tsx +++ b/app/dashboard/src/components/AriaComponents/Text/Text.tsx @@ -8,6 +8,7 @@ import * as aria from '#/components/aria' import * as mergeRefs from '#/utilities/mergeRefs' import * as twv from '#/utilities/tailwindVariants' +import { forwardRef } from '#/utilities/react' import * as textProvider from './TextProvider' import * as visualTooltip from './useVisualTooltip' @@ -117,10 +118,7 @@ export const TEXT_STYLE = twv.tv({ * Text component that supports truncation and show a tooltip on hover when text is truncated */ // eslint-disable-next-line no-restricted-syntax -export const Text = React.forwardRef(function Text( - props: TextProps, - ref: React.Ref, -) { +export const Text = forwardRef(function Text(props: TextProps, ref: React.Ref) { const { className, variant, @@ -208,7 +206,7 @@ export const Text = React.forwardRef(function Text( // eslint-disable-next-line no-restricted-syntax }) as unknown as React.FC & TextProps> & { // eslint-disable-next-line @typescript-eslint/naming-convention - Heading: React.FC + Heading: typeof Heading } /** @@ -222,10 +220,12 @@ export interface HeadingProps extends Omit { /** * Heading component */ -Text.Heading = React.forwardRef(function Heading( +// eslint-disable-next-line no-restricted-syntax +const Heading = forwardRef(function Heading( props: HeadingProps, ref: React.Ref, ) { const { level = 1, ...textProps } = props return }) +Text.Heading = Heading diff --git a/app/dashboard/src/components/AriaComponents/VisuallyHidden.tsx b/app/dashboard/src/components/AriaComponents/VisuallyHidden.tsx index a646f7cfec4a..be6ac07ae514 100644 --- a/app/dashboard/src/components/AriaComponents/VisuallyHidden.tsx +++ b/app/dashboard/src/components/AriaComponents/VisuallyHidden.tsx @@ -5,6 +5,7 @@ */ import * as React from 'react' +import { forwardRef } from '#/utilities/react' import * as twv from '#/utilities/tailwindVariants' /** @@ -17,9 +18,11 @@ export const VISUALLY_HIDDEN_STYLES = twv.tv({ base: 'sr-only' }) /** * A component visually hides its children from the screen, but keeps them accessible to screen readers. */ -export const VisuallyHidden = React.forwardRef( - function VisuallyHidden(props, ref) { - const { className } = props - return - }, -) +// eslint-disable-next-line no-restricted-syntax +export const VisuallyHidden = forwardRef(function VisuallyHidden( + props: VisuallyHiddenProps, + ref: React.ForwardedRef, +) { + const { className } = props + return +}) diff --git a/app/dashboard/src/components/ColorPicker.tsx b/app/dashboard/src/components/ColorPicker.tsx index a5d47b435a6b..957f545661c7 100644 --- a/app/dashboard/src/components/ColorPicker.tsx +++ b/app/dashboard/src/components/ColorPicker.tsx @@ -12,6 +12,7 @@ import RadioGroup from '#/components/styled/RadioGroup' import * as backend from '#/services/Backend' +import { forwardRef } from '#/utilities/react' import * as tailwindMerge from '#/utilities/tailwindMerge' /** Props for a {@link ColorPickerItem}. */ @@ -55,6 +56,9 @@ export interface ColorPickerProps extends Readonly { readonly setColor: (color: backend.LChColor) => void } +/** A color picker to select from a predetermined list of colors. */ +export default forwardRef(ColorPicker) + /** A color picker to select from a predetermined list of colors. */ function ColorPicker(props: ColorPickerProps, ref: React.ForwardedRef) { const { pickerClassName = '', children, setColor, ...radioGroupProps } = props @@ -79,6 +83,3 @@ function ColorPicker(props: ColorPickerProps, ref: React.ForwardedRef ) } - -/** A color picker to select from a predetermined list of colors. */ -export default React.forwardRef(ColorPicker) diff --git a/app/dashboard/src/components/ContextMenus.tsx b/app/dashboard/src/components/ContextMenus.tsx index bbe8a7dd7c50..6a8fa106f46e 100644 --- a/app/dashboard/src/components/ContextMenus.tsx +++ b/app/dashboard/src/components/ContextMenus.tsx @@ -5,6 +5,7 @@ import * as detect from 'enso-common/src/detect' import Modal from '#/components/Modal' +import { forwardRef } from '#/utilities/react' import * as tailwindMerge from '#/utilities/tailwindMerge' // ================= @@ -28,6 +29,8 @@ export interface ContextMenusProps extends Readonly { readonly event: Pick } +export default forwardRef(ContextMenus) + /** A context menu that opens at the current mouse position. */ function ContextMenus(props: ContextMenusProps, ref: React.ForwardedRef) { const { hidden = false, children, event } = props @@ -55,5 +58,3 @@ function ContextMenus(props: ContextMenusProps, ref: React.ForwardedRef } - -export default React.forwardRef(ContextMenus) diff --git a/app/dashboard/src/components/Link.tsx b/app/dashboard/src/components/Link.tsx index 679cbfcc0735..9787f54761f9 100644 --- a/app/dashboard/src/components/Link.tsx +++ b/app/dashboard/src/components/Link.tsx @@ -7,6 +7,7 @@ import FocusRing from '#/components/styled/FocusRing' import SvgMask from '#/components/SvgMask' import { useFocusChild } from '#/hooks/focusHooks' import { useText } from '#/providers/TextProvider' +import { forwardRef } from '#/utilities/react' import { twMerge } from 'tailwind-merge' // ============ @@ -21,7 +22,7 @@ export interface LinkProps { readonly text: string } -export default React.forwardRef(Link) +export default forwardRef(Link) /** A styled colored link with an icon. */ function Link(props: LinkProps, ref: React.ForwardedRef) { diff --git a/app/dashboard/src/components/styled/Button.tsx b/app/dashboard/src/components/styled/Button.tsx index 5cdccd01e18b..8229f2794735 100644 --- a/app/dashboard/src/components/styled/Button.tsx +++ b/app/dashboard/src/components/styled/Button.tsx @@ -8,6 +8,7 @@ import * as ariaComponents from '#/components/AriaComponents' import FocusRing from '#/components/styled/FocusRing' import SvgMask from '#/components/SvgMask' +import { forwardRef } from '#/utilities/react' import * as tailwindMerge from '#/utilities/tailwindMerge' // ============== @@ -39,6 +40,8 @@ export interface ButtonProps { readonly onPress: (event: aria.PressEvent) => void } +export default forwardRef(Button) + /** A styled button. */ function Button(props: ButtonProps, ref: React.ForwardedRef) { const { @@ -103,5 +106,3 @@ function Button(props: ButtonProps, ref: React.ForwardedRef) ) } - -export default React.forwardRef(Button) diff --git a/app/dashboard/src/components/styled/Input.tsx b/app/dashboard/src/components/styled/Input.tsx index 7f8951648c78..36152b3c47ea 100644 --- a/app/dashboard/src/components/styled/Input.tsx +++ b/app/dashboard/src/components/styled/Input.tsx @@ -6,6 +6,7 @@ import * as focusHooks from '#/hooks/focusHooks' import * as focusDirectionProvider from '#/providers/FocusDirectionProvider' import * as aria from '#/components/aria' +import { forwardRef } from '#/utilities/react' // ============= // === Input === @@ -14,6 +15,8 @@ import * as aria from '#/components/aria' /** Props for a {@link Input}. */ export interface InputProps extends Readonly {} +export default forwardRef(Input) + /** An input that handles focus movement. */ function Input(props: InputProps, ref: React.ForwardedRef) { const focusDirection = focusDirectionProvider.useFocusDirection() @@ -29,5 +32,3 @@ function Input(props: InputProps, ref: React.ForwardedRef) { /> ) } - -export default React.forwardRef(Input) diff --git a/app/dashboard/src/components/styled/RadioGroup.tsx b/app/dashboard/src/components/styled/RadioGroup.tsx index fff8b53a940e..1dfcb1f93b27 100644 --- a/app/dashboard/src/components/styled/RadioGroup.tsx +++ b/app/dashboard/src/components/styled/RadioGroup.tsx @@ -19,6 +19,7 @@ import * as React from 'react' import * as reactStately from 'react-stately' import * as aria from '#/components/aria' +import { forwardRef } from '#/utilities/react' /** Options for {@link useRenderProps}. */ interface RenderPropsHookOptions extends aria.DOMProps, aria.AriaLabelingProps { @@ -101,6 +102,9 @@ function useSlot(): [React.RefCallback, boolean] { // eslint-disable-next-line no-restricted-syntax const UNDEFINED = undefined +/** A radio group allows a user to select a single item from a list of mutually exclusive options. */ +export default forwardRef(RadioGroup) + /** A radio group allows a user to select a single item from a list of mutually exclusive options. */ function RadioGroup(props: aria.RadioGroupProps, ref: React.ForwardedRef) { ;[props, ref] = aria.useContextProps(props, ref, aria.RadioGroupContext) @@ -171,6 +175,3 @@ function RadioGroup(props: aria.RadioGroupProps, ref: React.ForwardedRef ) } - -/** A radio group allows a user to select a single item from a list of mutually exclusive options. */ -export default React.forwardRef(RadioGroup) diff --git a/app/dashboard/src/components/styled/SettingsInput.tsx b/app/dashboard/src/components/styled/SettingsInput.tsx index b80cadf11e24..3ba0a2a64b2a 100644 --- a/app/dashboard/src/components/styled/SettingsInput.tsx +++ b/app/dashboard/src/components/styled/SettingsInput.tsx @@ -11,6 +11,7 @@ import * as textProvider from '#/providers/TextProvider' import * as aria from '#/components/aria' import Button from '#/components/styled/Button' import FocusRing from '#/components/styled/FocusRing' +import { forwardRef } from '#/utilities/react' import { twMerge } from '#/utilities/tailwindMerge' // ===================== @@ -27,6 +28,8 @@ export interface SettingsInputProps { readonly onSubmit?: (event: React.SyntheticEvent) => void } +export default forwardRef(SettingsInput) + /** A styled input specific to settings pages. */ function SettingsInput(props: SettingsInputProps, ref: React.ForwardedRef) { const { isDisabled = false, type, placeholder, autoComplete, onChange, onSubmit } = props @@ -98,5 +101,3 @@ function SettingsInput(props: SettingsInputProps, ref: React.ForwardedRef ) } - -export default React.forwardRef(SettingsInput) From a04c1fe31df1cf93abbe522977caccb42e4097a5 Mon Sep 17 00:00:00 2001 From: somebody1234 Date: Wed, 21 Aug 2024 11:51:42 +1000 Subject: [PATCH 12/49] Fix exports --- app/dashboard/src/components/AriaComponents/Inputs/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/app/dashboard/src/components/AriaComponents/Inputs/index.ts b/app/dashboard/src/components/AriaComponents/Inputs/index.ts index 84c9aace9c3f..fd6de6429cf4 100644 --- a/app/dashboard/src/components/AriaComponents/Inputs/index.ts +++ b/app/dashboard/src/components/AriaComponents/Inputs/index.ts @@ -5,6 +5,7 @@ */ export * from './DatePicker' +export * from './Dropdown' export * from './Input' export * from './MultiSelector' export * from './Password' From 09f2e225f54fbab5aba56d0929f5c89dce15e831 Mon Sep 17 00:00:00 2001 From: somebody1234 Date: Wed, 21 Aug 2024 11:54:30 +1000 Subject: [PATCH 13/49] Update launch.json --- app/.vscode/launch.json | 48 ++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/app/.vscode/launch.json b/app/.vscode/launch.json index ec7c5ec59fa0..fe8814b55311 100644 --- a/app/.vscode/launch.json +++ b/app/.vscode/launch.json @@ -5,88 +5,88 @@ "type": "node", "request": "launch", "name": "Dashboard", - "runtimeExecutable": "npm", - "runtimeArgs": ["run", "--workspace=enso-dashboard", "dev"] + "runtimeExecutable": "pnpm", + "runtimeArgs": ["run", "--filter", "enso-dashboard", "dev"] }, { "type": "node", "request": "launch", "name": "GUI", - "runtimeExecutable": "npm", - "runtimeArgs": ["run", "--workspace=enso-gui2", "dev"] + "runtimeExecutable": "pnpm", + "runtimeArgs": ["dev:gui"] }, { "type": "node", "request": "launch", "name": "GUI (Storybook)", - "runtimeExecutable": "npm", - "runtimeArgs": ["run", "--workspace=enso-gui2", "story:dev"] + "runtimeExecutable": "pnpm", + "runtimeArgs": ["run", "--filter", "enso-gui2", "story:dev"] }, { "type": "node", "request": "launch", "name": "Dashboard (Build)", - "runtimeExecutable": "npm", - "runtimeArgs": ["run", "--workspace=enso-gui2", "build:cloud"] + "runtimeExecutable": "pnpm", + "runtimeArgs": ["build:gui"] }, { "type": "node", "request": "launch", "name": "Dashboard (E2E UI)", - "runtimeExecutable": "npm", - "runtimeArgs": ["run", "--workspace=enso-dashboard", "test:e2e:debug"] + "runtimeExecutable": "pnpm", + "runtimeArgs": ["run", "--filter", "enso-dashboard", "test:e2e:debug"] }, { "type": "node", "request": "launch", "name": "GUI (E2E UI)", - "runtimeExecutable": "npm", - "runtimeArgs": ["run", "--workspace=enso-gui2", "test:e2e", "--", "--ui"] + "runtimeExecutable": "pnpm", + "runtimeArgs": ["run", "--filter", "enso-gui2", "test:e2e", "--", "--ui"] }, { "type": "node", "request": "launch", "name": "Dashboard (All tests)", - "runtimeExecutable": "npm", - "runtimeArgs": ["run", "--workspace=enso-dashboard", "test"] + "runtimeExecutable": "pnpm", + "runtimeArgs": ["run", "--filter", "enso-dashboard", "test"] }, { "type": "node", "request": "launch", "name": "Dashboard (E2E tests)", - "runtimeExecutable": "npm", - "runtimeArgs": ["run", "--workspace=enso-dashboard", "test:e2e"], + "runtimeExecutable": "pnpm", + "runtimeArgs": ["run", "--filter", "enso-dashboard", "test:e2e"], "outputCapture": "std" }, { "type": "node", "request": "launch", "name": "Dashboard (Unit tests)", - "runtimeExecutable": "npm", - "runtimeArgs": ["run", "--workspace=enso-dashboard", "test:unit"], + "runtimeExecutable": "pnpm", + "runtimeArgs": ["run", "--filter", "enso-dashboard", "test:unit"], "outputCapture": "std" }, { "type": "node", "request": "launch", "name": "GUI (All tests)", - "runtimeExecutable": "npm", - "runtimeArgs": ["run", "--workspace=enso-gui2", "test"] + "runtimeExecutable": "pnpm", + "runtimeArgs": ["run", "--filter", "enso-gui2", "test"] }, { "type": "node", "request": "launch", "name": "GUI (E2E tests)", - "runtimeExecutable": "npm", - "runtimeArgs": ["run", "--workspace=enso-gui2", "test:e2e"], + "runtimeExecutable": "pnpm", + "runtimeArgs": ["run", "--filter", "enso-gui2", "test:e2e"], "outputCapture": "std" }, { "type": "node", "request": "launch", "name": "GUI (Unit tests)", - "runtimeExecutable": "npm", - "runtimeArgs": ["run", "--workspace=enso-gui2", "test:unit", "--", "run"], + "runtimeExecutable": "pnpm", + "runtimeArgs": ["run", "--filter", "enso-gui2", "test:unit", "--", "run"], "outputCapture": "std" } ] From 6c45dd6d56ded1de0439a17546d437bdc4b9e496 Mon Sep 17 00:00:00 2001 From: somebody1234 Date: Wed, 21 Aug 2024 12:04:38 +1000 Subject: [PATCH 14/49] Update react-aria-components --- app/dashboard/package.json | 11 +- pnpm-lock.yaml | 2288 ++++++++++++++++++++---------------- 2 files changed, 1285 insertions(+), 1014 deletions(-) diff --git a/app/dashboard/package.json b/app/dashboard/package.json index 1bd447c99121..fefaa535b233 100644 --- a/app/dashboard/package.json +++ b/app/dashboard/package.json @@ -31,6 +31,7 @@ "@aws-amplify/auth": "5.6.5", "@aws-amplify/core": "5.8.5", "@hookform/resolvers": "^3.4.0", + "@internationalized/date": "^3.5.5", "@monaco-editor/react": "4.6.0", "@sentry/react": "^7.74.0", "@stripe/react-stripe-js": "^2.7.1", @@ -40,17 +41,18 @@ "ajv": "^8.12.0", "clsx": "^2.1.1", "enso-common": "workspace:*", + "framer-motion": "11.3.0", "is-network-error": "^1.0.1", "monaco-editor": "0.48.0", "react": "^18.3.1", - "react-aria": "^3.33.0", - "react-aria-components": "^1.2.0", + "react-aria": "^3.34.3", + "react-aria-components": "^1.3.3", "react-dom": "^18.3.1", "react-error-boundary": "4.0.13", "react-hook-form": "^7.51.4", "react-router": "^6.23.1", "react-router-dom": "^6.23.1", - "react-stately": "^3.31.0", + "react-stately": "^3.32.2", "react-toastify": "^9.1.3", "tailwind-merge": "^2.3.0", "tailwind-variants": "0.2.1", @@ -58,8 +60,7 @@ "ts-results": "^3.3.0", "validator": "^13.12.0", "zod": "^3.23.8", - "zustand": "^4.5.4", - "framer-motion": "11.3.0" + "zustand": "^4.5.4" }, "devDependencies": { "@fast-check/vitest": "^0.0.8", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ddec107c03ce..468d643ea7d4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -55,6 +55,9 @@ importers: '@hookform/resolvers': specifier: ^3.4.0 version: 3.6.0(react-hook-form@7.52.0(react@18.3.1)) + '@internationalized/date': + specifier: ^3.5.5 + version: 3.5.5 '@monaco-editor/react': specifier: 4.6.0 version: 4.6.0(monaco-editor@0.48.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -95,11 +98,11 @@ importers: specifier: ^18.3.1 version: 18.3.1 react-aria: - specifier: ^3.33.0 - version: 3.33.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^3.34.3 + version: 3.34.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-aria-components: - specifier: ^1.2.0 - version: 1.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^1.3.3 + version: 1.3.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-dom: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) @@ -116,8 +119,8 @@ importers: specifier: ^6.23.1 version: 6.24.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-stately: - specifier: ^3.31.0 - version: 3.31.1(react@18.3.1) + specifier: ^3.32.2 + version: 3.32.2(react@18.3.1) react-toastify: specifier: ^9.1.3 version: 9.1.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -1142,14 +1145,26 @@ packages: resolution: {integrity: sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==} engines: {node: '>=6.9.0'} + '@babel/compat-data@7.25.2': + resolution: {integrity: sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==} + engines: {node: '>=6.9.0'} + '@babel/core@7.24.7': resolution: {integrity: sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==} engines: {node: '>=6.9.0'} + '@babel/core@7.25.2': + resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} + engines: {node: '>=6.9.0'} + '@babel/generator@7.24.7': resolution: {integrity: sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==} engines: {node: '>=6.9.0'} + '@babel/generator@7.25.0': + resolution: {integrity: sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==} + engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.24.7': resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} engines: {node: '>=6.9.0'} @@ -1158,6 +1173,10 @@ packages: resolution: {integrity: sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==} engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.25.2': + resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} + engines: {node: '>=6.9.0'} + '@babel/helper-create-class-features-plugin@7.24.7': resolution: {integrity: sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==} engines: {node: '>=6.9.0'} @@ -1194,6 +1213,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-module-transforms@7.25.2': + resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-optimise-call-expression@7.24.7': resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==} engines: {node: '>=6.9.0'} @@ -1224,6 +1249,10 @@ packages: resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.24.8': + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.24.7': resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} @@ -1232,10 +1261,18 @@ packages: resolution: {integrity: sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.24.8': + resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} + engines: {node: '>=6.9.0'} + '@babel/helpers@7.24.7': resolution: {integrity: sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==} engines: {node: '>=6.9.0'} + '@babel/helpers@7.25.0': + resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} + engines: {node: '>=6.9.0'} + '@babel/highlight@7.24.7': resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} @@ -1245,6 +1282,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.25.3': + resolution: {integrity: sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-proposal-decorators@7.24.7': resolution: {integrity: sha512-RL9GR0pUG5Kc8BUWLNDm2T5OpYwSX15r98I0IkgmRQTXuELq/OynH8xtMTMvTJFjXbMWFVTKtYkTaYQsuAwQlQ==} engines: {node: '>=6.9.0'} @@ -1306,14 +1348,26 @@ packages: resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==} engines: {node: '>=6.9.0'} + '@babel/template@7.25.0': + resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} + engines: {node: '>=6.9.0'} + '@babel/traverse@7.24.7': resolution: {integrity: sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.25.3': + resolution: {integrity: sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==} + engines: {node: '>=6.9.0'} + '@babel/types@7.24.7': resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} engines: {node: '>=6.9.0'} + '@babel/types@7.25.2': + resolution: {integrity: sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==} + engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -1954,8 +2008,8 @@ packages: '@vue/compiler-sfc': optional: true - '@internationalized/date@3.5.4': - resolution: {integrity: sha512-qoVJVro+O0rBaw+8HPjUB1iH8Ihf8oziEnqMnvhJUSuVIrHOuZ6eNLHNvzXJKUvAtaDiqMnRlg8Z2mgh09BlUw==} + '@internationalized/date@3.5.5': + resolution: {integrity: sha512-H+CfYvOZ0LTJeeLOqm19E3uj/4YjrmOFtBufDHPfvtI80hFAMqtrp7oCACpe4Cil5l8S0Qu/9dYfZc/5lY8WQQ==} '@internationalized/message@3.1.4': resolution: {integrity: sha512-Dygi9hH1s7V9nha07pggCkvmRfDd3q2lWnMGvrJyrOwYMe1yj4D2T9BoH9I6MGR7xz0biQrtLPsqUkqXzIrBOw==} @@ -2131,506 +2185,528 @@ packages: '@polka/url@1.0.0-next.25': resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} - '@react-aria/breadcrumbs@3.5.13': - resolution: {integrity: sha512-G1Gqf/P6kVdfs94ovwP18fTWuIxadIQgHsXS08JEVcFVYMjb9YjqnEBaohUxD1tq2WldMbYw53ahQblT4NTG+g==} + '@react-aria/breadcrumbs@3.5.16': + resolution: {integrity: sha512-OXLKKu4SmjnSaSHkk4kow5/aH/SzlHWPJt+Uq3xec9TwDOr/Ob8aeFVGFoY0HxfGozuQlUz+4e+d29vfA0jNWg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/button@3.9.5': - resolution: {integrity: sha512-dgcYR6j8WDOMLKuVrtxzx4jIC05cVKDzc+HnPO8lNkBAOfjcuN5tkGRtIjLtqjMvpZHhQT5aDbgFpIaZzxgFIg==} + '@react-aria/button@3.9.8': + resolution: {integrity: sha512-MdbMQ3t5KSCkvKtwYd/Z6sgw0v+r1VQFRYOZ4L53xOkn+u140z8vBpNeWKZh/45gxGv7SJn9s2KstLPdCWmIxw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/calendar@3.5.8': - resolution: {integrity: sha512-Whlp4CeAA5/ZkzrAHUv73kgIRYjw088eYGSc+cvSOCxfrc/2XkBm9rNrnSBv0DvhJ8AG0Fjz3vYakTmF3BgZBw==} + '@react-aria/calendar@3.5.11': + resolution: {integrity: sha512-VLhBovLVu3uJXBkHbgEippmo/K58QLcc/tSJQ0aJUNyHsrvPgHEcj484cb+Uj/yOirXEIzaoW6WEvhcdKrb49Q==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/checkbox@3.14.3': - resolution: {integrity: sha512-EtBJL6iu0gvrw3A4R7UeVLR6diaVk/mh4kFBc7c8hQjpEJweRr4hmJT3hrNg3MBcTWLxFiMEXPGgWEwXDBygtA==} + '@react-aria/checkbox@3.14.6': + resolution: {integrity: sha512-LICY1PR3WsW/VbuLMjZbxo75+poeo3XCXGcUnk6hxMlWfp/Iy/XHVsHlGu9stRPKRF8BSuOGteaHWVn6IXfwtA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/color@3.0.0-beta.33': - resolution: {integrity: sha512-nhqnIHYm5p6MbuF3cC6lnqzG7MjwBsBd0DtpO+ByFYO+zxpMMbeC5R+1SFxvapR4uqmAzTotbtiUCGsG+SUaIg==} + '@react-aria/collections@3.0.0-alpha.4': + resolution: {integrity: sha512-chMNAlsubnpErBWN7sLhmAMOnE7o17hSfq3s0VDHlvRN9K/mPOPlYokmyWkkPqi7fYiR50EPVHDtwTWLJoqfnw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/combobox@3.9.1': - resolution: {integrity: sha512-SpK92dCmT8qn8aEcUAihRQrBb5LZUhwIbDExFII8PvUvEFy/PoQHXIo3j1V29WkutDBDpMvBv/6XRCHGXPqrhQ==} + '@react-aria/color@3.0.0-rc.2': + resolution: {integrity: sha512-h4P7LocDEHPOEWgHYb8VPJLRGkyMhcsXemmvGao6G23zGTpTX8Nr6pEuJhcXQlGWt8hXvj/ASnC750my+zb1yA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/datepicker@3.10.1': - resolution: {integrity: sha512-4HZL593nrNMa1GjBmWEN/OTvNS6d3/16G1YJWlqiUlv11ADulSbqBIjMmkgwrJVFcjrgqtXFy+yyrTA/oq94Zw==} + '@react-aria/combobox@3.10.3': + resolution: {integrity: sha512-EdDwr2Rp1xy7yWjOYHt2qF1IpAtUrkaNKZJzlIw1XSwcqizQY6E8orNPdZr6ZwD6/tgujxF1N71JTKyffrR0Xw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/dialog@3.5.14': - resolution: {integrity: sha512-oqDCjQ8hxe3GStf48XWBf2CliEnxlR9GgSYPHJPUc69WBj68D9rVcCW3kogJnLAnwIyf3FnzbX4wSjvUa88sAQ==} + '@react-aria/datepicker@3.11.2': + resolution: {integrity: sha512-6sbLln3VXSBcBRDgSACBzIzF/5KV5NlNOhZvXPFE6KqFw6GbevjZQTv5BNDXiwA3CQoawIRF7zgRvTANw8HkNA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/dnd@3.6.1': - resolution: {integrity: sha512-6WnujUTD+cIYZVF/B+uXdHyJ+WSpbYa8jH282epvY4FUAq1qLmen12/HHcoj/5dswKQe8X6EM3OhkQM89d9vFw==} + '@react-aria/dialog@3.5.17': + resolution: {integrity: sha512-lvfEgaqg922J1hurscqCS600OZQVitGtdpo81kAefJaUzMnCxzrYviyT96aaW0simHOlimbYF5js8lxBLZJRaw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/focus@3.17.1': - resolution: {integrity: sha512-FLTySoSNqX++u0nWZJPPN5etXY0WBxaIe/YuL/GTEeuqUIuC/2bJSaw5hlsM6T2yjy6Y/VAxBcKSdAFUlU6njQ==} + '@react-aria/dnd@3.7.2': + resolution: {integrity: sha512-NuE3EGqoBbe9aXAO9mDfbu4kMO7S4MCgkjkCqYi16TWfRUf38ajQbIlqodCx91b3LVN3SYvNbE3D4Tj5ebkljw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/form@3.0.5': - resolution: {integrity: sha512-n290jRwrrRXO3fS82MyWR+OKN7yznVesy5Q10IclSTVYHHI3VI53xtAPr/WzNjJR1um8aLhOcDNFKwnNIUUCsQ==} + '@react-aria/focus@3.18.2': + resolution: {integrity: sha512-Jc/IY+StjA3uqN73o6txKQ527RFU7gnG5crEl5Xy3V+gbYp2O5L3ezAo/E0Ipi2cyMbG6T5Iit1IDs7hcGu8aw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/grid@3.9.1': - resolution: {integrity: sha512-fGEZqAEaS8mqzV/II3N4ndoNWegIcbh+L3PmKbXdpKKUP8VgMs/WY5rYl5WAF0f5RoFwXqx3ibDLeR9tKj/bOg==} + '@react-aria/form@3.0.8': + resolution: {integrity: sha512-8S2QiyUdAgK43M3flohI0R+2rTyzH088EmgeRArA8euvJTL16cj/oSOKMEgWVihjotJ9n6awPb43ZhKboyNsMg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/gridlist@3.8.1': - resolution: {integrity: sha512-vVPkkA+Ct0NDcpnNm/tnYaBumg0fP9pXxsPLqL1rxvsTyj1PaIpFTZ4corabPTbTDExZwUSTS3LG1n+o1OvBtQ==} + '@react-aria/grid@3.10.3': + resolution: {integrity: sha512-l0r9mz05Gwjq3t6JOTNQOf+oAoWN0bXELPJtIr8m0XyXMPFCQe1xsTaX8igVQdrDmXyBc75RAWS0BJo2JF2fIA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/i18n@3.11.1': - resolution: {integrity: sha512-vuiBHw1kZruNMYeKkTGGnmPyMnM5T+gT8bz97H1FqIq1hQ6OPzmtBZ6W6l6OIMjeHI5oJo4utTwfZl495GALFQ==} + '@react-aria/gridlist@3.9.3': + resolution: {integrity: sha512-bb9GnKKeuL6NljoVUcHxr9F0cy/2WDOXRYeMikTnviRw6cuX95oojrhFfCUvz2d6ID22Btrvh7LkE+oIPVuc+g==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/interactions@3.21.3': - resolution: {integrity: sha512-BWIuf4qCs5FreDJ9AguawLVS0lV9UU+sK4CCnbCNNmYqOWY+1+gRXCsnOM32K+oMESBxilAjdHW5n1hsMqYMpA==} + '@react-aria/i18n@3.12.2': + resolution: {integrity: sha512-PvEyC6JWylTpe8dQEWqQwV6GiA+pbTxHQd//BxtMSapRW3JT9obObAnb/nFhj3HthkUvqHyj0oO1bfeN+mtD8A==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/label@3.7.8': - resolution: {integrity: sha512-MzgTm5+suPA3KX7Ug6ZBK2NX9cin/RFLsv1BdafJ6CZpmUSpWnGE/yQfYUB7csN7j31OsZrD3/P56eShYWAQfg==} + '@react-aria/interactions@3.22.2': + resolution: {integrity: sha512-xE/77fRVSlqHp2sfkrMeNLrqf2amF/RyuAS6T5oDJemRSgYM3UoxTbWjucPhfnoW7r32pFPHHgz4lbdX8xqD/g==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/link@3.7.1': - resolution: {integrity: sha512-a4IaV50P3fXc7DQvEIPYkJJv26JknFbRzFT5MJOMgtzuhyJoQdILEUK6XHYjcSSNCA7uLgzpojArVk5Hz3lCpw==} + '@react-aria/label@3.7.11': + resolution: {integrity: sha512-REgejE5Qr8cXG/b8H2GhzQmjQlII/0xQW/4eDzydskaTLvA7lF5HoJUE6biYTquH5va38d8XlH465RPk+bvHzA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/listbox@3.12.1': - resolution: {integrity: sha512-7JiUp0NGykbv/HgSpmTY1wqhuf/RmjFxs1HZcNaTv8A+DlzgJYc7yQqFjP3ZA/z5RvJFuuIxggIYmgIFjaRYdA==} + '@react-aria/link@3.7.4': + resolution: {integrity: sha512-E8SLDuS9ssm/d42+3sDFNthfMcNXMUrT2Tq1DIZt22EsMcuEzmJ9B0P7bDP5RgvIw05xVGqZ20nOpU4mKTxQtA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/listbox@3.13.3': + resolution: {integrity: sha512-htluPyDfFtn66OEYaJdIaFCYH9wGCNk30vOgZrQkPul9F9Cjce52tTyPVR0ERsf14oCUsjjS5qgeq3dGidRqEw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 '@react-aria/live-announcer@3.3.4': resolution: {integrity: sha512-w8lxs35QrRrn6pBNzVfyGOeqWdxeVKf9U6bXIVwhq7rrTqRULL8jqy8RJIMfIs1s8G5FpwWYjyBOjl2g5Cu1iA==} - '@react-aria/menu@3.14.1': - resolution: {integrity: sha512-BYliRb38uAzq05UOFcD5XkjA5foQoXRbcH3ZufBsc4kvh79BcP1PMW6KsXKGJ7dC/PJWUwCui6QL1kUg8PqMHA==} + '@react-aria/menu@3.15.3': + resolution: {integrity: sha512-vvUmVjJwIg3h2r+7isQXTwlmoDlPAFBckHkg94p3afrT1kNOTHveTsaVl17mStx/ymIioaAi3PrIXk/PZXp1jw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/meter@3.4.13': - resolution: {integrity: sha512-oG6KvHQM3ri93XkYQkgEaMKSMO9KNDVpcW1MUqFfqyUXHFBRZRrJB4BTXMZ4nyjheFVQjVboU51fRwoLjOzThg==} + '@react-aria/meter@3.4.16': + resolution: {integrity: sha512-hJqKnEE6mmK2Psx5kcI7NZ44OfTg0Bp7DatQSQ4zZE4yhnykRRwxqSKjze37tPR63cCqgRXtQ5LISfBfG54c0Q==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/numberfield@3.11.3': - resolution: {integrity: sha512-QQ9ZTzBbRI8d9ksaBWm6YVXbgv+5zzUsdxVxwzJVXLznvivoORB8rpdFJzUEWVCo25lzoBxluCEPYtLOxP1B0w==} + '@react-aria/numberfield@3.11.6': + resolution: {integrity: sha512-nvEWiQcWRwj6O2JXmkXEeWoBX/GVZT9zumFJcew3XknGTWJUr3h2AOymIQFt9g4mpag8IgOFEpSIlwhtZHdp1A==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/overlays@3.22.1': - resolution: {integrity: sha512-GHiFMWO4EQ6+j6b5QCnNoOYiyx1Gk8ZiwLzzglCI4q1NY5AG2EAmfU4Z1+Gtrf2S5Y0zHbumC7rs9GnPoGLUYg==} + '@react-aria/overlays@3.23.2': + resolution: {integrity: sha512-vjlplr953YAuJfHiP4O+CyrTlr6OaFgXAGrzWq4MVMjnpV/PT5VRJWYFHR0sUGlHTPqeKS4NZbi/xCSgl/3pGQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/progress@3.4.13': - resolution: {integrity: sha512-YBV9bOO5JzKvG8QCI0IAA00o6FczMgIDiK8Q9p5gKorFMatFUdRayxlbIPoYHMi+PguLil0jHgC7eOyaUcrZ0g==} + '@react-aria/progress@3.4.16': + resolution: {integrity: sha512-RbDIFQg4+/LG+KYZeLAijt2zH7K2Gp0CY9RKWdho3nU5l3/w57Fa7NrfDGWtpImrt7bR2nRmXMA6ESfr7THfrg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/radio@3.10.4': - resolution: {integrity: sha512-3fmoMcQtCpgjTwJReFjnvIE/C7zOZeCeWUn4JKDqz9s1ILYsC3Rk5zZ4q66tFn6v+IQnecrKT52wH6+hlVLwTA==} + '@react-aria/radio@3.10.7': + resolution: {integrity: sha512-o2tqIe7xd1y4HeCBQfz/sXIwLJuI6LQbVoCQ1hgk/5dGhQ0LiuXohRYitGRl9zvxW8jYdgLULmOEDt24IflE8A==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/searchfield@3.7.5': - resolution: {integrity: sha512-h1sMUOWjhevaKKUHab/luHbM6yiyeN57L4RxZU0IIc9Ww0h5Rp2GUuKZA3pcdPiExHje0aijcImL3wBHEbKAzw==} + '@react-aria/searchfield@3.7.8': + resolution: {integrity: sha512-SsF5xwH8Us548QgzivvbM7nhFbw7pu23xnRRIuhlP3MwOR3jRUFh17NKxf3Z0jvrDv/u0xfm3JKHIgaUN0KJ2A==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/select@3.14.5': - resolution: {integrity: sha512-s8jixBuTUNdKWRHe2tIJqp55ORHeUObGMw1s7PQRRVrrHPdNSYseAOI9B2W7qpl3hKhvjJg40UW+45mcb1WKbw==} + '@react-aria/select@3.14.9': + resolution: {integrity: sha512-tiNgMyA2G9nKnFn3pB/lMSgidNToxSFU7r6l4OcG+Vyr63J7B/3dF2lTXq8IYhlfOR3K3uQkjroSx52CmC3NDw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/selection@3.18.1': - resolution: {integrity: sha512-GSqN2jX6lh7v+ldqhVjAXDcrWS3N4IsKXxO6L6Ygsye86Q9q9Mq9twWDWWu5IjHD6LoVZLUBCMO+ENGbOkyqeQ==} + '@react-aria/selection@3.19.3': + resolution: {integrity: sha512-GYoObXCXlmGK08hp7Qfl6Bk0U+bKP5YDWSsX+MzNjJsqzQSLm4S06tRB9ACM7gIo9dDCvL4IRxdSYTJAlJc6bw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/separator@3.3.13': - resolution: {integrity: sha512-hofA6JCPnAOqSE9vxnq7Dkazr7Kb2A0I5sR16fOG7ddjYRc/YEY5Nv7MWfKUGU0kNFHkgNjsDAILERtLechzeA==} + '@react-aria/separator@3.4.2': + resolution: {integrity: sha512-Xql9Kg3VlGesEUC7QheE+L5b3KgBv0yxiUU+/4JP8V2vfU/XSz4xmprHEeq7KVQVOetn38iiXU8gA5g26SEsUA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/slider@3.7.8': - resolution: {integrity: sha512-MYvPcM0K8jxEJJicUK2+WxUkBIM/mquBxOTOSSIL3CszA80nXIGVnLlCUnQV3LOUzpWtabbWaZokSPtGgOgQOw==} + '@react-aria/slider@3.7.11': + resolution: {integrity: sha512-2WAwjANXPsA2LHJ5nxxV4c7ihFAzz2spaBz8+FJ7MDYE7WroYnE8uAXElea1aGo+Lk0DTiAdepLpBkggqPNanw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/spinbutton@3.6.5': - resolution: {integrity: sha512-0aACBarF/Xr/7ixzjVBTQ0NBwwwsoGkf5v6AVFVMTC0uYMXHTALvRs+ULHjHMa5e/cX/aPlEvaVT7jfSs+Xy9Q==} + '@react-aria/spinbutton@3.6.8': + resolution: {integrity: sha512-OJMAYRIZ0WrWE+5tZsywrSg4t+aOwl6vl/e1+J64YcGMM+p+AKd61KGG5T0OgNSORXjoVIZOmj6wZ6Od4xfPMw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/ssr@3.9.4': - resolution: {integrity: sha512-4jmAigVq409qcJvQyuorsmBR4+9r3+JEC60wC+Y0MZV0HCtTmm8D9guYXlJMdx0SSkgj0hHAyFm/HvPNFofCoQ==} + '@react-aria/ssr@3.9.5': + resolution: {integrity: sha512-xEwGKoysu+oXulibNUSkXf8itW0npHHTa6c4AyYeZIJyRoegeteYuFpZUBPtIDE8RfHdNsSmE1ssOkxRnwbkuQ==} engines: {node: '>= 12'} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/switch@3.6.4': - resolution: {integrity: sha512-2nVqz4ZuJyof47IpGSt3oZRmp+EdS8wzeDYgf42WHQXrx4uEOk1mdLJ20+NnsYhj/2NHZsvXVrjBeKMjlMs+0w==} + '@react-aria/switch@3.6.7': + resolution: {integrity: sha512-yBNvKylhc3ZRQ0+7mD0mIenRRe+1yb8YaqMMZr8r3Bf87LaiFtQyhRFziq6ZitcwTJz5LEWjBihxbSVvUrf49w==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/table@3.14.1': - resolution: {integrity: sha512-WaPgQe4zQF5OaluO5rm+Y2nEoFR63vsLd4BT4yjK1uaFhKhDY2Zk+1SCVQvBLLKS4WK9dhP05nrNzT0vp/ZPOw==} + '@react-aria/table@3.15.3': + resolution: {integrity: sha512-nQCLjlEvyJHyuijHw8ESqnA9fxNJfQHx0WPcl08VDEb8VxcE/MVzSAIedSWaqjG5k9Oflz6o/F/zHtzw4AFAow==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/tabs@3.9.1': - resolution: {integrity: sha512-S5v/0sRcOaSXaJYZuuy1ZVzYc7JD4sDyseG1133GjyuNjJOFHgoWMb+b4uxNIJbZxnLgynn/ZDBZSO+qU+fIxw==} + '@react-aria/tabs@3.9.5': + resolution: {integrity: sha512-aQZGAoOIg1B16qlvXIy6+rHbNBNVcWkGjOjeyvqTTPMjXt/FmElkICnqckI7MRJ1lTqzyppCOBitYOHSXRo8Uw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/tag@3.4.1': - resolution: {integrity: sha512-gcIGPYZ2OBwMT4IHnlczEezKlxr0KRPL/mSfm2Q91GE027ZGOJnqusH9az6DX1qxrQx8x3vRdqYT2KmuefkrBQ==} + '@react-aria/tag@3.4.5': + resolution: {integrity: sha512-iyJuATQ8t2cdLC7hiZm143eeZze/MtgxaMq0OewlI9TUje54bkw2Q+CjERdgisIo3Eemf55JJgylGrTcalEJAg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/textfield@3.14.5': - resolution: {integrity: sha512-hj7H+66BjB1iTKKaFXwSZBZg88YT+wZboEXZ0DNdQB2ytzoz/g045wBItUuNi4ZjXI3P+0AOZznVMYadWBAmiA==} + '@react-aria/textfield@3.14.8': + resolution: {integrity: sha512-FHEvsHdE1cMR2B7rlf+HIneITrC40r201oLYbHAp3q26jH/HUujzFBB9I20qhXjyBohMWfQLqJhSwhs1VW1RJQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/toggle@3.10.4': - resolution: {integrity: sha512-bRk+CdB8QzrSyGNjENXiTWxfzYKRw753iwQXsEAU7agPCUdB8cZJyrhbaUoD0rwczzTp2zDbZ9rRbUPdsBE2YQ==} + '@react-aria/toggle@3.10.7': + resolution: {integrity: sha512-/RJQU8QlPZXRElZ3Tt10F5K5STgUBUGPpfuFUGuwF3Kw3GpPxYsA1YAVjxXz2MMGwS0+y6+U/J1xIs1AF0Jwzg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/toolbar@3.0.0-beta.5': - resolution: {integrity: sha512-c8spY7aeLI6L+ygdXvEbAzaT41vExsxZ1Ld0t7BB+6iEF3nyBNJHshjkgdR7nv8FLgNk0no4tj0GTq4Jj4UqHQ==} + '@react-aria/toolbar@3.0.0-beta.8': + resolution: {integrity: sha512-nMlA1KK54/Kohb3HlHAzobg69PVIEr8Q1j5P3tLd9apY8FgGvnz7yLpcj6kO1GA872gseEzgiO0Rzk+yRHQRCA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/tooltip@3.7.4': - resolution: {integrity: sha512-+XRx4HlLYqWY3fB8Z60bQi/rbWDIGlFUtXYbtoa1J+EyRWfhpvsYImP8qeeNO/vgjUtDy1j9oKa8p6App9mBMQ==} + '@react-aria/tooltip@3.7.7': + resolution: {integrity: sha512-UOTTDbbUz7OaE48VjNSWl+XQbYCUs5Gss4I3Tv1pfRLXzVtGYXv3ur/vRayvZR0xd12ANY26fZPNkSmCFpmiXw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/tree@3.0.0-alpha.1': - resolution: {integrity: sha512-CucyeJ4VeAvWO5UJHt/l9JO65CVtsOVUctMOVNCQS77Isqp3olX9pvfD3LXt8fD5Ph2g0Q/b7siVpX5ieVB32g==} + '@react-aria/tree@3.0.0-alpha.5': + resolution: {integrity: sha512-6JtkvQ/KQNFyqxc5M6JMVY63heHt2gZAwXxEt+Ojx/sbWDtDb5RrZVgkb44n7R/tMrFPJEiYZLMFPbGCsUQeJQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/utils@3.24.1': - resolution: {integrity: sha512-O3s9qhPMd6n42x9sKeJ3lhu5V1Tlnzhu6Yk8QOvDuXf7UGuUjXf9mzfHJt1dYzID4l9Fwm8toczBzPM9t0jc8Q==} + '@react-aria/utils@3.25.2': + resolution: {integrity: sha512-GdIvG8GBJJZygB4L2QJP1Gabyn2mjFsha73I2wSe+o4DYeGWoJiMZRM06PyTIxLH4S7Sn7eVDtsSBfkc2VY/NA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/visually-hidden@3.8.12': - resolution: {integrity: sha512-Bawm+2Cmw3Xrlr7ARzl2RLtKh0lNUdJ0eNqzWcyx4c0VHUAWtThmH5l+HRqFUGzzutFZVo89SAy40BAbd0gjVw==} + '@react-aria/virtualizer@4.0.2': + resolution: {integrity: sha512-HNhpZl53UM2Z8g0DNvjAW7aZRwOReYgKRxdTF/IlYHNMLpdqWZinKwLbxZCsbgX3SCjdIGns90YhkMSKVpfrpw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-stately/calendar@3.5.1': - resolution: {integrity: sha512-7l7QhqGUJ5AzWHfvZzbTe3J4t72Ht5BmhW4hlVI7flQXtfrmYkVtl3ZdytEZkkHmWGYZRW9b4IQTQGZxhtlElA==} + '@react-aria/visually-hidden@3.8.15': + resolution: {integrity: sha512-l+sJ7xTdD5Sd6+rDNDaeJCSPnHOsI+BaJyApvb/YcVgHa7rB47lp6TXCWUCDItcPY4JqRGyeByRJVrtzBFTWCw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-stately/checkbox@3.6.5': - resolution: {integrity: sha512-IXV3f9k+LtmfQLE+DKIN41Q5QB/YBLDCB1YVx5PEdRp52S9+EACD5683rjVm8NVRDwjMi2SP6RnFRk7fVb5Azg==} + '@react-stately/calendar@3.5.4': + resolution: {integrity: sha512-R2011mtFSXIjzMXaA+CZ1sflPm9XkTBMqVk77Bnxso2ZsG7FUX8nqFmaDavxwTuHFC6OUexAGSMs8bP9KycTNg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-stately/collections@3.10.7': - resolution: {integrity: sha512-KRo5O2MWVL8n3aiqb+XR3vP6akmHLhLWYZEmPKjIv0ghQaEebBTrN3wiEjtd6dzllv0QqcWvDLM1LntNfJ2TsA==} + '@react-stately/checkbox@3.6.8': + resolution: {integrity: sha512-c8TWjU67XHHBCpqj6+FXXhQUWGr2Pil1IKggX81pkedhWiJl3/7+WHJuZI0ivGnRjp3aISNOG8UNVlBEjS9E8A==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-stately/color@3.6.1': - resolution: {integrity: sha512-iW0nAhl3+fUBegHMw5EcAbFVDpgwHBrivfC85pVoTM3pyzp66hqNN6R6xWxW6ETyljS8UOer59+/w4GDVGdPig==} + '@react-stately/collections@3.10.9': + resolution: {integrity: sha512-plyrng6hOQMG8LrjArMA6ts/DgWyXln3g90/hFNbqe/hdVYF53sDVsj8Jb+5LtoYTpiAlV6eOvy1XR0vPZUf8w==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-stately/combobox@3.8.4': - resolution: {integrity: sha512-iLVGvKRRz0TeJXZhZyK783hveHpYA6xovOSdzSD+WGYpiPXo1QrcrNoH3AE0Z2sHtorU+8nc0j58vh5PB+m2AA==} + '@react-stately/color@3.7.2': + resolution: {integrity: sha512-tNJ7pQjBqXtfASdLRjIYzeI8q0b3JtxqkJbusyEEdLAumpcWkbOvl3Vp9un0Bu/XXWihDa4v2dEdpKxjM+pPxg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-stately/data@3.11.4': - resolution: {integrity: sha512-PbnUQxeE6AznSuEWYnRmrYQ9t5z1Asx98Jtrl96EeA6Iapt9kOjTN9ySqCxtPxMKleb1NIqG3+uHU3veIqmLsg==} + '@react-stately/combobox@3.9.2': + resolution: {integrity: sha512-ZsbAcD58IvxZqwYxg9d2gOf8R/k5RUB2TPUiGKD6wgWfEKH6SDzY3bgRByHGOyMCyJB62cHjih/ZShizNTguqA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-stately/datepicker@3.9.4': - resolution: {integrity: sha512-yBdX01jn6gq4NIVvHIqdjBUPo+WN8Bujc4OnPw+ZnfA4jI0eIgq04pfZ84cp1LVXW0IB0VaCu1AlQ/kvtZjfGA==} + '@react-stately/data@3.11.6': + resolution: {integrity: sha512-S8q1Ejuhijl8SnyVOdDNFrMrWWnLk/Oh1ZT3KHSbTdpfMRtvhi5HukoiP06jlzz75phnpSPQL40npDtUB/kk3Q==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-stately/dnd@3.3.1': - resolution: {integrity: sha512-I/Ci5xB8hSgAXzoWYWScfMM9UK1MX/eTlARBhiSlfudewweOtNJAI+cXJgU7uiUnGjh4B4v3qDBtlAH1dWDCsw==} + '@react-stately/datepicker@3.10.2': + resolution: {integrity: sha512-pa5IZUw+49AyOnddwu4XwU2kI5eo/1thbiIVNHP8uDpbbBrBkquSk3zVFDAGX1cu/I1U2VUkt64U/dxgkwaMQw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-stately/dnd@3.4.2': + resolution: {integrity: sha512-VrHmNoNdVGrx5JHdz/zewmN+N8rlZe+vL/iAOLmvQ74RRLEz8KDFnHdlhgKg1AZqaSg3JJ18BlHEkS7oL1n+tA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 '@react-stately/flags@3.0.3': resolution: {integrity: sha512-/ha7XFA0RZTQsbzSPwu3KkbNMgbvuM0GuMTYLTBWpgBrovBNTM+QqI/PfZTdHg8PwCYF4H5Y8gjdSpdulCvJFw==} - '@react-stately/form@3.0.3': - resolution: {integrity: sha512-92YYBvlHEWUGUpXgIaQ48J50jU9XrxfjYIN8BTvvhBHdD63oWgm8DzQnyT/NIAMzdLnhkg7vP+fjG8LjHeyIAg==} + '@react-stately/form@3.0.5': + resolution: {integrity: sha512-J3plwJ63HQz109OdmaTqTA8Qhvl3gcYYK7DtgKyNP6mc/Me2Q4tl2avkWoA+22NRuv5m+J8TpBk4AVHUEOwqeQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-stately/grid@3.8.7': - resolution: {integrity: sha512-he3TXCLAhF5C5z1/G4ySzcwyt7PEiWcVIupxebJQqRyFrNWemSuv+7tolnStmG8maMVIyV3P/3j4eRBbdSlOIg==} + '@react-stately/grid@3.9.2': + resolution: {integrity: sha512-2gK//sqAqg2Xaq6UITTFQwFUJnBRgcW+cKBVbFt+F8d152xB6UwwTS/K79E5PUkOotwqZgTEpkrSFs/aVxCLpw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-stately/list@3.10.5': - resolution: {integrity: sha512-fV9plO+6QDHiewsYIhboxcDhF17GO95xepC5ki0bKXo44gr14g/LSo/BMmsaMnV+1BuGdBunB05bO4QOIaigXA==} + '@react-stately/layout@4.0.2': + resolution: {integrity: sha512-g3IOrYQcaWxWKW44fYCOLoLMYKEmoOAcT9vQIbgK8MLTQV9Zgt9sGREwn4WJPm85N58Ij6yP72aQ7og/PSymvg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-stately/menu@3.7.1': - resolution: {integrity: sha512-mX1w9HHzt+xal1WIT2xGrTQsoLvDwuB2R1Er1MBABs//MsJzccycatcgV/J/28m6tO5M9iuFQQvLV+i1dCtodg==} + '@react-stately/list@3.10.8': + resolution: {integrity: sha512-rHCiPLXd+Ry3ztR9DkLA5FPQeH4Zd4/oJAEDWJ77W3oBBOdiMp3ZdHDLP7KBRh17XGNLO/QruYoHWAQTPiMF4g==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-stately/numberfield@3.9.3': - resolution: {integrity: sha512-UlPTLSabhLEuHtgzM0PgfhtEaHy3yttbzcRb8yHNvGo4KbCHeHpTHd3QghKfTFm024Mug7+mVlWCmMtW0f5ttg==} + '@react-stately/menu@3.8.2': + resolution: {integrity: sha512-lt6hIHmSixMzkKx1rKJf3lbAf01EmEvvIlENL20GLiU9cRbpPnPJ1aJMZ5Ad5ygglA7wAemAx+daPhlTQfF2rg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-stately/overlays@3.6.7': - resolution: {integrity: sha512-6zp8v/iNUm6YQap0loaFx6PlvN8C0DgWHNlrlzMtMmNuvjhjR0wYXVaTfNoUZBWj25tlDM81ukXOjpRXg9rLrw==} + '@react-stately/numberfield@3.9.6': + resolution: {integrity: sha512-p2R9admGLI439qZzB39dyANhkruprJJtZwuoGVtxW/VD0ficw6BrPVqAaKG25iwKPkmveleh9p8o+yRqjGedcQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-stately/radio@3.10.4': - resolution: {integrity: sha512-kCIc7tAl4L7Hu4Wt9l2jaa+MzYmAJm0qmC8G8yPMbExpWbLRu6J8Un80GZu+JxvzgDlqDyrVvyv9zFifwH/NkQ==} + '@react-stately/overlays@3.6.10': + resolution: {integrity: sha512-XxZ2qScT5JPwGk9qiVJE4dtVh3AXTcYwGRA5RsHzC26oyVVsegPqY2PmNJGblAh6Q57VyodoVUyebE0Eo5CzRw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-stately/searchfield@3.5.3': - resolution: {integrity: sha512-H0OvlgwPIFdc471ypw79MDjz3WXaVq9+THaY6JM4DIohEJNN5Dwei7O9g6r6m/GqPXJIn5TT3b74kJ2Osc00YQ==} + '@react-stately/radio@3.10.7': + resolution: {integrity: sha512-ZwGzFR+sGd42DxRlDTp3G2vLZyhMVtgHkwv2BxazPHxPMvLO9yYl7+3PPNxAmhMB4tg2u9CrzffpGX2rmEJEXA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-stately/select@3.6.4': - resolution: {integrity: sha512-whZgF1N53D0/dS8tOFdrswB0alsk5Q5620HC3z+5f2Hpi8gwgAZ8TYa+2IcmMYRiT+bxVuvEc/NirU9yPmqGbA==} + '@react-stately/searchfield@3.5.6': + resolution: {integrity: sha512-gVzU0FeWiLYD8VOYRgWlk79Qn7b2eirqOnWhtI5VNuGN8WyNaCIuBp6SkXTW2dY8hs2Hzn8HlMbgy1MIc7130Q==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-stately/selection@3.15.1': - resolution: {integrity: sha512-6TQnN9L0UY9w19B7xzb1P6mbUVBtW840Cw1SjgNXCB3NPaCf59SwqClYzoj8O2ZFzMe8F/nUJtfU1NS65/OLlw==} + '@react-stately/select@3.6.7': + resolution: {integrity: sha512-hCUIddw0mPxVy1OH6jhyaDwgNea9wESjf+MYdnnTG/abRB+OZv/dWScd87OjzVsHTHWcw7CN4ZzlJoXm0FJbKQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-stately/slider@3.5.4': - resolution: {integrity: sha512-Jsf7K17dr93lkNKL9ij8HUcoM1sPbq8TvmibD6DhrK9If2lje+OOL8y4n4qreUnfMT56HCAeS9wCO3fg3eMyrw==} + '@react-stately/selection@3.16.2': + resolution: {integrity: sha512-C4eSKw7BIZHJLPzwqGqCnsyFHiUIEyryVQZTJDt6d0wYBOHU6k1pW+Q4VhrZuzSv+IMiI2RkiXeJKc55f0ZXrg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-stately/table@3.11.8': - resolution: {integrity: sha512-EdyRW3lT1/kAVDp5FkEIi1BQ7tvmD2YgniGdLuW/l9LADo0T+oxZqruv60qpUS6sQap+59Riaxl91ClDxrJnpg==} + '@react-stately/slider@3.5.7': + resolution: {integrity: sha512-gEIGTcpBLcXixd8LYiLc8HKrBiGQJltrrEGoOvvTP8KVItXQxmeL+JiSsh8qgOoUdRRpzmAoFNUKGEg2/gtN8A==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-stately/tabs@3.6.6': - resolution: {integrity: sha512-sOLxorH2uqjAA+v1ppkMCc2YyjgqvSGeBDgtR/lyPSDd4CVMoTExszROX2dqG0c8il9RQvzFuufUtQWMY6PgSA==} + '@react-stately/table@3.12.2': + resolution: {integrity: sha512-dUcsrdALylhWz6exqIoqtR/dnrzjIAptMyAUPT378Y/mCYs4PxKkHSvtPEQrZhdQS1ALIIgfeg9KUVIempoXPw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-stately/toggle@3.7.4': - resolution: {integrity: sha512-CoYFe9WrhLkDP4HGDpJYQKwfiYCRBAeoBQHv+JWl5eyK61S8xSwoHsveYuEZ3bowx71zyCnNAqWRrmNOxJ4CKA==} + '@react-stately/tabs@3.6.9': + resolution: {integrity: sha512-YZDqZng3HrRX+uXmg6u78x73Oi24G5ICpiXVqDKKDkO333XCA5H8MWItiuPZkYB2h3SbaCaLqSobLkvCoWYpNQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-stately/tooltip@3.4.9': - resolution: {integrity: sha512-P7CDJsdoKarz32qFwf3VNS01lyC+63gXpDZG31pUu+EO5BeQd4WKN/AH1Beuswpr4GWzxzFc1aXQgERFGVzraA==} + '@react-stately/toggle@3.7.7': + resolution: {integrity: sha512-AS+xB4+hHWa3wzYkbS6pwBkovPfIE02B9SnuYTe0stKcuejpWKo5L3QMptW0ftFYsW3ZPCXuneImfObEw2T01A==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-stately/tree@3.8.1': - resolution: {integrity: sha512-LOdkkruJWch3W89h4B/bXhfr0t0t1aRfEp+IMrrwdRAl23NaPqwl5ILHs4Xu5XDHqqhg8co73pHrJwUyiTWEjw==} + '@react-stately/tooltip@3.4.12': + resolution: {integrity: sha512-QKYT/cze7n9qaBsk7o5ais3jRfhYCzcVRfps+iys/W+/9FFbbhjfQG995Lwi6b+vGOHWfXxXpwmyIO2tzM1Iog==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-stately/utils@3.10.1': - resolution: {integrity: sha512-VS/EHRyicef25zDZcM/ClpzYMC5i2YGN6uegOeQawmgfGjb02yaCX0F0zR69Pod9m2Hr3wunTbtpgVXvYbZItg==} + '@react-stately/tree@3.8.4': + resolution: {integrity: sha512-HFNclIXJ/3QdGQWxXbj+tdlmIX/XwCfzAMB5m26xpJ6HtJhia6dtx3GLfcdyHNjmuRbAsTBsAAnnVKBmNRUdIQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-stately/virtualizer@3.7.1': - resolution: {integrity: sha512-voHgE6EQ+oZaLv6u2umKxakvIKNkCQuUihqKACTjdslp7SJh4Mvs3oLBI0hf0JOh+rCcFIKDvQtFwy1fXFRYBA==} + '@react-stately/utils@3.10.3': + resolution: {integrity: sha512-moClv7MlVSHpbYtQIkm0Cx+on8Pgt1XqtPx6fy9rQFb2DNc9u1G3AUVnqA17buOkH1vLxAtX4MedlxMWyRCYYA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/breadcrumbs@3.7.5': - resolution: {integrity: sha512-lV9IDYsMiu2TgdMIjEmsOE0YWwjb3jhUNK1DCZZfq6uWuiHLgyx2EncazJBUWSjHJ4ta32j7xTuXch+8Ai6u/A==} + '@react-stately/virtualizer@4.0.2': + resolution: {integrity: sha512-LiSr6E6OoL/cKVFO088zEzkNGj41g02nlOAgLluYONncNEjoYiHmb8Yw0otPgViVLKiFjO6Kk4W+dbt8EZ51Ag==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/button@3.9.4': - resolution: {integrity: sha512-raeQBJUxBp0axNF74TXB8/H50GY8Q3eV6cEKMbZFP1+Dzr09Ngv0tJBeW0ewAxAguNH5DRoMUAUGIXtSXskVdA==} + '@react-types/breadcrumbs@3.7.7': + resolution: {integrity: sha512-ZmhXwD2LLzfEA2OvOCp/QvXu8A/Edsrn5q0qUDGsmOZj9SCVeT82bIv8P+mQnATM13mi2gyoik6102Jc1OscJA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/calendar@3.4.6': - resolution: {integrity: sha512-WSntZPwtvsIYWvBQRAPvuCn55UTJBZroTvX0vQvWykJRQnPAI20G1hMQ3dNsnAL+gLZUYxBXn66vphmjUuSYew==} + '@react-types/button@3.9.6': + resolution: {integrity: sha512-8lA+D5JLbNyQikf8M/cPP2cji91aVTcqjrGpDqI7sQnaLFikM8eFR6l1ZWGtZS5MCcbfooko77ha35SYplSQvw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/checkbox@3.8.1': - resolution: {integrity: sha512-5/oVByPw4MbR/8QSdHCaalmyWC71H/QGgd4aduTJSaNi825o+v/hsN2/CH7Fq9atkLKsC8fvKD00Bj2VGaKriQ==} + '@react-types/calendar@3.4.9': + resolution: {integrity: sha512-O/PS9c21HgO9qzxOyZ7/dTccxabFZdF6tj3UED4DrBw7AN3KZ7JMzwzYbwHinOcO7nUcklGgNoAIHk45UAKR9g==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/color@3.0.0-beta.25': - resolution: {integrity: sha512-D24ASvLeSWouBwOBi4ftUe4/BhrZj5AiHV7tXwrVeMGOy9Z9jyeK65Xysq+R3ecaSONLXsgai5CQMvj13cOacA==} + '@react-types/checkbox@3.8.3': + resolution: {integrity: sha512-f4c1mnLEt0iS1NMkyZXgT3q3AgcxzDk7w6MSONOKydcnh0xG5L2oefY14DhVDLkAuQS7jThlUFwiAs+MxiO3MA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/combobox@3.11.1': - resolution: {integrity: sha512-UNc3OHt5cUt5gCTHqhQIqhaWwKCpaNciD8R7eQazmHiA9fq8ROlV+7l3gdNgdhJbTf5Bu/V5ISnN7Y1xwL3zqQ==} + '@react-types/color@3.0.0-rc.1': + resolution: {integrity: sha512-aw6FzrBlZTWKrFaFskM7e3AFICe6JqH10wO0E919goa3LZDDFbyYEwRpatwjIyiZH1elEUkFPgwqpv3ZcPPn8g==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/datepicker@3.7.4': - resolution: {integrity: sha512-ZfvgscvNzBJpYyVWg3nstJtA/VlWLwErwSkd1ivZYam859N30w8yH+4qoYLa6FzWLCFlrsRHyvtxlEM7lUAt5A==} + '@react-types/combobox@3.12.1': + resolution: {integrity: sha512-bd5YwHZWtgnJx4jGbplWbYzXj7IbO5w3IY5suNR7r891rx6IktquZ8GQwyYH0pQ/x+X5LdK2xI59i6+QC2PmlA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/dialog@3.5.10': - resolution: {integrity: sha512-S9ga+edOLNLZw7/zVOnZdT5T40etpzUYBXEKdFPbxyPYnERvRxJAsC1/ASuBU9fQAXMRgLZzADWV+wJoGS/X9g==} + '@react-types/datepicker@3.8.2': + resolution: {integrity: sha512-Ih4F0bNVGrEuwCD8XmmBAspuuOBsj/Svn/pDFtC2RyAZjXfWh+sI+n4XLz/sYKjvARh5TUI8GNy9smYS4vYXug==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/form@3.7.4': - resolution: {integrity: sha512-HZojAWrb6feYnhDEOy3vBamDVAHDl0l2JQZ7aIDLHmeTAGQC3JNZcm2fLTxqLye46zz8w8l8OHgI+NdD4PHdOw==} + '@react-types/dialog@3.5.12': + resolution: {integrity: sha512-JmpQbSpXltqEyYfEwoqDolABIiojeExkqolHNdQlayIsfFuSxZxNwXZPOpz58Ri/iwv21JP7K3QF0Gb2Ohxl9w==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/grid@3.2.6': - resolution: {integrity: sha512-XfHenL2jEBUYrhKiPdeM24mbLRXUn79wVzzMhrNYh24nBwhsPPpxF+gjFddT3Cy8dt6tRInfT6pMEu9nsXwaHw==} + '@react-types/form@3.7.6': + resolution: {integrity: sha512-lhS2y1bVtRnyYjkM+ylJUp2g663ZNbeZxu2o+mFfD5c2wYmVLA58IWR90c7DL8IVUitoANnZ1JPhhXvutiFpQQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/link@3.5.5': - resolution: {integrity: sha512-G6P5WagHDR87npN7sEuC5IIgL1GsoY4WFWKO4734i2CXRYx24G9P0Su3AX4GA3qpspz8sK1AWkaCzBMmvnunfw==} + '@react-types/grid@3.2.8': + resolution: {integrity: sha512-6PJrpukwMqlv3IhJSDkJuVbhHM8Oe6hd2supWqd9adMXrlSP7QHt9a8SgFcFblCCTx8JzUaA0PvY5sTudcEtOQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/listbox@3.4.9': - resolution: {integrity: sha512-S5G+WmNKUIOPZxZ4svWwWQupP3C6LmVfnf8QQmPDvwYXGzVc0WovkqUWyhhjJirFDswTXRCO9p0yaTHHIlkdwQ==} + '@react-types/link@3.5.7': + resolution: {integrity: sha512-2WyaVmm1qr9UrSG3Dq6iz+2ziuVp+DH8CsYZ9CA6aNNb6U18Hxju3LTPb4a5gM0eC7W0mQGNBmrgGlAdDZEJOw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/menu@3.9.9': - resolution: {integrity: sha512-FamUaPVs1Fxr4KOMI0YcR2rYZHoN7ypGtgiEiJ11v/tEPjPPGgeKDxii0McCrdOkjheatLN1yd2jmMwYj6hTDg==} + '@react-types/listbox@3.5.1': + resolution: {integrity: sha512-n5bOgD9lgfK1qaLtag9WPnu151SwXBCNn/OgGY/Br9mWRl+nPUEYtFcPX+2VCld7uThf54kwrTmzlFnaraIlcw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/meter@3.4.1': - resolution: {integrity: sha512-AIJV4NDFAqKH94s02c5Da4TH2qgJjfrw978zuFM0KUBFD85WRPKh7MvgWpomvUgmzqE6lMCzIdi1KPKqrRabdw==} + '@react-types/menu@3.9.11': + resolution: {integrity: sha512-IguQVF70d7aHXgWB1Rd2a/PiIuLZ2Nt7lyayJshLcy/NLOYmgpTmTyn2WCtlA5lTfQwmQrNFf4EvnWkeljJXdA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/numberfield@3.8.3': - resolution: {integrity: sha512-z5fGfVj3oh5bmkw9zDvClA1nDBSFL9affOuyk2qZ/M2SRUmykDAPCksbfcMndft0XULWKbF4s2CYbVI+E/yrUA==} + '@react-types/meter@3.4.3': + resolution: {integrity: sha512-Y2fX5CTAPGRKxVSeepbeyN6/K+wlF9pMRcNxTSU2qDwdoFqNCtTWMcWuCsU/Y2L/zU0jFWu4x0Vo7WkrcsgcMA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/overlays@3.8.7': - resolution: {integrity: sha512-zCOYvI4at2DkhVpviIClJ7bRrLXYhSg3Z3v9xymuPH3mkiuuP/dm8mUCtkyY4UhVeUTHmrQh1bzaOP00A+SSQA==} + '@react-types/numberfield@3.8.5': + resolution: {integrity: sha512-LVWggkxwd1nyVZomXBPfQA1E4I4/i4PBifjcDs2AfcV7q5RE9D+DVIDXsYucVOBxPlDOxiAq/T9ypobspWSwHw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/progress@3.5.4': - resolution: {integrity: sha512-JNc246sTjasPyx5Dp7/s0rp3Bz4qlu4LrZTulZlxWyb53WgBNL7axc26CCi+I20rWL9+c7JjhrRxnLl/1cLN5g==} + '@react-types/overlays@3.8.9': + resolution: {integrity: sha512-9ni9upQgXPnR+K9cWmbYWvm3ll9gH8P/XsEZprqIV5zNLMF334jADK48h4jafb1X9RFnj0WbHo6BqcSObzjTig==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/radio@3.8.1': - resolution: {integrity: sha512-bK0gio/qj1+0Ldu/3k/s9BaOZvnnRgvFtL3u5ky479+aLG5qf1CmYed3SKz8ErZ70JkpuCSrSwSCFf0t1IHovw==} + '@react-types/progress@3.5.6': + resolution: {integrity: sha512-Nh43sjQ5adyN1bTHBPRaIPhXUdBqP0miYeJpeMY3V/KUl4qmouJLwDnccwFG4xLm6gBfYe22lgbbV7nAfNnuTQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/searchfield@3.5.5': - resolution: {integrity: sha512-T/NHg12+w23TxlXMdetogLDUldk1z5dDavzbnjKrLkajLb221bp8brlR/+O6C1CtFpuJGALqYHgTasU1qkQFSA==} + '@react-types/radio@3.8.3': + resolution: {integrity: sha512-fUVJt4Bb6jOReFqnhHVNxWXH7t6c60uSFfoPKuXt/xI9LL1i2jhpur0ggpTfIn3qLIAmNBU6bKBCWAdr4KjeVQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/select@3.9.4': - resolution: {integrity: sha512-xI7dnOW2st91fPPcv6hdtrTdcfetYiqZuuVPZ5TRobY7Q10/Zqqe/KqtOw1zFKUj9xqNJe4Ov3xP5GSdcO60Eg==} + '@react-types/searchfield@3.5.8': + resolution: {integrity: sha512-EcdqalHNIC6BJoRfmqUhAvXRd3aHkWlV1cFCz57JJKgUEFYyXPNrXd1b73TKLzTXEk+X/D6LKV15ILYpEaxu8w==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-types/select@3.9.6': + resolution: {integrity: sha512-cVSFR0eJLup/ht1Uto+y8uyLmHO89J6wNh65SIHb3jeVz9oLBAedP3YNI2qB+F9qFMUcA8PBSLXIIuT6gXzLgQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 '@react-types/shared@3.23.1': resolution: {integrity: sha512-5d+3HbFDxGZjhbMBeFHRQhexMFt4pUce3okyRtUVKbbedQFUrtXSBg9VszgF2RTeQDKDkMCIQDtz5ccP/Lk1gw==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - '@react-types/slider@3.7.3': - resolution: {integrity: sha512-F8qFQaD2mqug2D0XeWMmjGBikiwbdERFlhFzdvNGbypPLz3AZICBKp1ZLPWdl0DMuy03G/jy6Gl4mDobl7RT2g==} + '@react-types/shared@3.24.1': + resolution: {integrity: sha512-AUQeGYEm/zDTN6zLzdXolDxz3Jk5dDL7f506F07U8tBwxNNI3WRdhU84G0/AaFikOZzDXhOZDr3MhQMzyE7Ydw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/switch@3.5.3': - resolution: {integrity: sha512-Nb6+J5MrPaFa8ZNFKGMzAsen/NNzl5UG/BbC65SLGPy7O0VDa/sUpn7dcu8V2xRpRwwIN/Oso4v63bt2sgdkgA==} + '@react-types/slider@3.7.5': + resolution: {integrity: sha512-bRitwQRQjQoOcKEdPMljnvm474dwrmsc6pdsVQDh/qynzr+KO9IHuYc3qPW53WVE2hMQJDohlqtCAWQXWQ5Vcg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/table@3.9.5': - resolution: {integrity: sha512-fgM2j9F/UR4Anmd28CueghCgBwOZoCVyN8fjaIFPd2MN4gCwUUfANwxLav65gZk4BpwUXGoQdsW+X50L3555mg==} + '@react-types/switch@3.5.5': + resolution: {integrity: sha512-SZx1Bd+COhAOs/RTifbZG+uq/llwba7VAKx7XBeX4LeIz1dtguy5bigOBgFTMQi4qsIVCpybSWEEl+daj4XFPw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/tabs@3.3.7': - resolution: {integrity: sha512-ZdLe5xOcFX6+/ni45Dl2jO0jFATpTnoSqj6kLIS/BYv8oh0n817OjJkLf+DS3CLfNjApJWrHqAk34xNh6nRnEg==} + '@react-types/table@3.10.1': + resolution: {integrity: sha512-xsNh0Gm4GtNeSknZqkMsfGvc94fycmfhspGO+FzQKim2hB5k4yILwd+lHYQ2UKW6New9GVH/zN2Pd3v67IeZ2g==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/textfield@3.9.3': - resolution: {integrity: sha512-DoAY6cYOL0pJhgNGI1Rosni7g72GAt4OVr2ltEx2S9ARmFZ0DBvdhA9lL2nywcnKMf27PEJcKMXzXc10qaHsJw==} + '@react-types/tabs@3.3.9': + resolution: {integrity: sha512-3Q9kRVvg/qDyeJR/W1+C2z2OyvDWQrSLvOCvAezX5UKzww4rBEAA8OqBlyDwn7q3fiwrh/m64l6p+dbln+RdxQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/tooltip@3.4.9': - resolution: {integrity: sha512-wZ+uF1+Zc43qG+cOJzioBmLUNjRa7ApdcT0LI1VvaYvH5GdfjzUJOorLX9V/vAci0XMJ50UZ+qsh79aUlw2yqg==} + '@react-types/textfield@3.9.6': + resolution: {integrity: sha512-0uPqjJh4lYp1aL1HL9IlV8Cgp8eT0PcsNfdoCktfkLytvvBPmox2Pfm57W/d0xTtzZu2CjxhYNTob+JtGAOeXA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-types/tooltip@3.4.11': + resolution: {integrity: sha512-WPikHQxeT5Lb09yJEaW6Ja3ecE0g1YM6ukWYS2v/iZLUPn5YlYrGytspuCYQNSh/u7suCz4zRLEHYCl7OCigjw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 '@remix-run/router@1.17.0': resolution: {integrity: sha512-2D6XaHEVvkCn682XBnipbJjgZUU7xjLtA4dGJRBVUKpEaDYOZMENZoZjAOSb7qirxt5RupjzZxz4fK2FO+EFPw==} @@ -2820,8 +2896,8 @@ packages: resolution: {integrity: sha512-pKS3wZnJoL1iTyGBXAvCwduNNeghJHY6QSRSNNvpYnrrQrLZ6Owsazjyynu0e0ObRgks0i7Rv+pe2M7/MBTZpQ==} engines: {node: '>=12.16'} - '@swc/helpers@0.5.11': - resolution: {integrity: sha512-YNlnKRWF2sVojTpIyzwou9XoTNbzbzONwRhOoniEioF1AtaitTvVZblaQRrAzChWQ1bLYyYSWzM18y4WwgzJ+A==} + '@swc/helpers@0.5.12': + resolution: {integrity: sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g==} '@szmarczak/http-timer@4.0.6': resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} @@ -3518,6 +3594,9 @@ packages: async@3.2.5: resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -3606,6 +3685,11 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + browserslist@4.23.3: + resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + buffer-alloc-unsafe@1.1.0: resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} @@ -3691,6 +3775,9 @@ packages: caniuse-lite@1.0.30001639: resolution: {integrity: sha512-eFHflNTBIlFwP2AIKaYuBQN/apnUoKNhBdza8ZnW/h2di4LCZ4xFqYlxUxo+LQ76KFI1PGcC1QDxMbxTZpSCAg==} + caniuse-lite@1.0.30001651: + resolution: {integrity: sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==} + capital-case@1.0.4: resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} @@ -4296,6 +4383,9 @@ packages: electron-to-chromium@1.4.815: resolution: {integrity: sha512-OvpTT2ItpOXJL7IGcYakRjHCt8L5GrrN/wHCQsRB4PQa1X9fe+X9oen245mIId7s14xvArCGSTIq644yPUKKLg==} + electron-to-chromium@1.5.12: + resolution: {integrity: sha512-tIhPkdlEoCL1Y+PToq3zRNehUaKp3wBX/sr7aclAWdIWjvqAe/Im/H0SiCM4c1Q8BLPHCdoJTol+ZblflydehA==} + electron@31.2.0: resolution: {integrity: sha512-5w+kjOsGiTXytPSErBPNp/3znnuEMKc42RD41MqRoQkiYaR8x/Le2+qWk1cL60UwE/67oeKnOHnnol8xEuldGg==} engines: {node: '>= 12.20.55'} @@ -5876,6 +5966,9 @@ packages: node-releases@2.0.14: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + nopt@7.2.1: resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -6395,17 +6488,17 @@ packages: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true - react-aria-components@1.2.1: - resolution: {integrity: sha512-iGIdDjbTyLLn0/tGUyBQxxu+E1bw4/H4AU89d0cRcu8yIdw6MXG29YElmRHn0ugiyrERrk/YQALihstnns5kRQ==} + react-aria-components@1.3.3: + resolution: {integrity: sha512-wNjcoyIFTL14Z07OJ1I5m37CYB+1oH2DW8PIgZQjGt9lLcYKKEBLSgsenHVKu1F1L9tqlpXgYk5TeXCzU/xUKw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-aria@3.33.1: - resolution: {integrity: sha512-hFC3K/UA+90Krlx2IgRTgzFbC6FSPi4pUwHT+STperPLK+cTEHkI+3Lu0YYwQSBatkgxnIv9+GtFuVbps2kROw==} + react-aria@3.34.3: + resolution: {integrity: sha512-wSprEI5EojDFCm357MxnKAxJZN68OYIt6UH6N0KCo6MEUAVZMbhMSmGYjw/kLK4rI7KrbJDqGqUMQkwc93W9Ng==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom@18.3.1: resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} @@ -6446,10 +6539,10 @@ packages: peerDependencies: react: '>=16.8' - react-stately@3.31.1: - resolution: {integrity: sha512-wuq673NHkYSdoceGryjtMJJvB9iQgyDkQDsnTN0t2v91pXjGDsN/EcOvnUrxXSBtY9eLdIw74R54z9GX5cJNEg==} + react-stately@3.32.2: + resolution: {integrity: sha512-pDSrbCIJtir4HeSa//PTqLSR7Tl7pFC9usmkkBObNKktObQq3Vdgkf46cxeTD1ov7J7GDdR3meIyjXGnZoEzUg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-toastify@9.1.3: resolution: {integrity: sha512-fPfb8ghtn/XMxw3LkxQBk3IyagNpF/LIKjOBflbexr2AWxAH1MJgvnESwEwBn9liLFXgTKWgBSdZpw9m4OTHTg==} @@ -6655,6 +6748,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + sentence-case@3.0.4: resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} @@ -7185,6 +7283,12 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + update-browserslist-db@1.1.0: + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + upper-case-first@2.0.2: resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} @@ -8018,6 +8122,9 @@ snapshots: '@babel/compat-data@7.24.7': {} + '@babel/compat-data@7.25.2': + optional: true + '@babel/core@7.24.7': dependencies: '@ampproject/remapping': 2.3.0 @@ -8038,6 +8145,27 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/core@7.25.2': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.0 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helpers': 7.25.0 + '@babel/parser': 7.25.3 + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.3 + '@babel/types': 7.25.2 + convert-source-map: 2.0.0 + debug: 4.3.6 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + optional: true + '@babel/generator@7.24.7': dependencies: '@babel/types': 7.24.7 @@ -8045,6 +8173,14 @@ snapshots: '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 + '@babel/generator@7.25.0': + dependencies: + '@babel/types': 7.25.2 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + optional: true + '@babel/helper-annotate-as-pure@7.24.7': dependencies: '@babel/types': 7.24.7 @@ -8057,6 +8193,15 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 + '@babel/helper-compilation-targets@7.25.2': + dependencies: + '@babel/compat-data': 7.25.2 + '@babel/helper-validator-option': 7.24.8 + browserslist: 4.23.3 + lru-cache: 5.1.1 + semver: 6.3.1 + optional: true + '@babel/helper-create-class-features-plugin@7.24.7(@babel/core@7.24.7)': dependencies: '@babel/core': 7.24.7 @@ -8114,6 +8259,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + '@babel/traverse': 7.25.3 + transitivePeerDependencies: + - supports-color + optional: true + '@babel/helper-optimise-call-expression@7.24.7': dependencies: '@babel/types': 7.24.7 @@ -8149,15 +8305,27 @@ snapshots: '@babel/helper-string-parser@7.24.7': {} + '@babel/helper-string-parser@7.24.8': + optional: true + '@babel/helper-validator-identifier@7.24.7': {} '@babel/helper-validator-option@7.24.7': {} + '@babel/helper-validator-option@7.24.8': + optional: true + '@babel/helpers@7.24.7': dependencies: '@babel/template': 7.24.7 '@babel/types': 7.24.7 + '@babel/helpers@7.25.0': + dependencies: + '@babel/template': 7.25.0 + '@babel/types': 7.25.2 + optional: true + '@babel/highlight@7.24.7': dependencies: '@babel/helper-validator-identifier': 7.24.7 @@ -8169,6 +8337,11 @@ snapshots: dependencies: '@babel/types': 7.24.7 + '@babel/parser@7.25.3': + dependencies: + '@babel/types': 7.25.2 + optional: true + '@babel/plugin-proposal-decorators@7.24.7(@babel/core@7.24.7)': dependencies: '@babel/core': 7.24.7 @@ -8233,6 +8406,13 @@ snapshots: '@babel/parser': 7.24.7 '@babel/types': 7.24.7 + '@babel/template@7.25.0': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.25.3 + '@babel/types': 7.25.2 + optional: true + '@babel/traverse@7.24.7': dependencies: '@babel/code-frame': 7.24.7 @@ -8248,12 +8428,32 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.25.3': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.0 + '@babel/parser': 7.25.3 + '@babel/template': 7.25.0 + '@babel/types': 7.25.2 + debug: 4.3.6 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + optional: true + '@babel/types@7.24.7': dependencies: '@babel/helper-string-parser': 7.24.7 '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 + '@babel/types@7.25.2': + dependencies: + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + optional: true + '@bcoe/v8-coverage@0.2.3': {} '@codemirror/autocomplete@6.16.3(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.3)(@lezer/common@1.2.1)': @@ -8817,33 +9017,33 @@ snapshots: '@ianvs/prettier-plugin-sort-imports@4.3.0(prettier@3.3.2)': dependencies: - '@babel/core': 7.24.7 - '@babel/generator': 7.24.7 - '@babel/parser': 7.24.7 - '@babel/traverse': 7.24.7 - '@babel/types': 7.24.7 + '@babel/core': 7.25.2 + '@babel/generator': 7.25.0 + '@babel/parser': 7.25.3 + '@babel/traverse': 7.25.3 + '@babel/types': 7.25.2 prettier: 3.3.2 - semver: 7.6.2 + semver: 7.6.3 transitivePeerDependencies: - supports-color optional: true - '@internationalized/date@3.5.4': + '@internationalized/date@3.5.5': dependencies: - '@swc/helpers': 0.5.11 + '@swc/helpers': 0.5.12 '@internationalized/message@3.1.4': dependencies: - '@swc/helpers': 0.5.11 + '@swc/helpers': 0.5.12 intl-messageformat: 10.5.14 '@internationalized/number@3.5.3': dependencies: - '@swc/helpers': 0.5.11 + '@swc/helpers': 0.5.12 '@internationalized/string@3.2.3': dependencies: - '@swc/helpers': 0.5.11 + '@swc/helpers': 0.5.12 '@isaacs/cliui@8.0.2': dependencies: @@ -9094,912 +9294,948 @@ snapshots: '@polka/url@1.0.0-next.25': {} - '@react-aria/breadcrumbs@3.5.13(react@18.3.1)': + '@react-aria/breadcrumbs@3.5.16(react@18.3.1)': dependencies: - '@react-aria/i18n': 3.11.1(react@18.3.1) - '@react-aria/link': 3.7.1(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-types/breadcrumbs': 3.7.5(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/i18n': 3.12.2(react@18.3.1) + '@react-aria/link': 3.7.4(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-types/breadcrumbs': 3.7.7(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-aria/button@3.9.5(react@18.3.1)': + '@react-aria/button@3.9.8(react@18.3.1)': dependencies: - '@react-aria/focus': 3.17.1(react@18.3.1) - '@react-aria/interactions': 3.21.3(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-stately/toggle': 3.7.4(react@18.3.1) - '@react-types/button': 3.9.4(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/focus': 3.18.2(react@18.3.1) + '@react-aria/interactions': 3.22.2(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-stately/toggle': 3.7.7(react@18.3.1) + '@react-types/button': 3.9.6(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-aria/calendar@3.5.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-aria/calendar@3.5.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@internationalized/date': 3.5.4 - '@react-aria/i18n': 3.11.1(react@18.3.1) - '@react-aria/interactions': 3.21.3(react@18.3.1) + '@internationalized/date': 3.5.5 + '@react-aria/i18n': 3.12.2(react@18.3.1) + '@react-aria/interactions': 3.22.2(react@18.3.1) '@react-aria/live-announcer': 3.3.4 - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-stately/calendar': 3.5.1(react@18.3.1) - '@react-types/button': 3.9.4(react@18.3.1) - '@react-types/calendar': 3.4.6(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-stately/calendar': 3.5.4(react@18.3.1) + '@react-types/button': 3.9.6(react@18.3.1) + '@react-types/calendar': 3.4.9(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/checkbox@3.14.3(react@18.3.1)': - dependencies: - '@react-aria/form': 3.0.5(react@18.3.1) - '@react-aria/interactions': 3.21.3(react@18.3.1) - '@react-aria/label': 3.7.8(react@18.3.1) - '@react-aria/toggle': 3.10.4(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-stately/checkbox': 3.6.5(react@18.3.1) - '@react-stately/form': 3.0.3(react@18.3.1) - '@react-stately/toggle': 3.7.4(react@18.3.1) - '@react-types/checkbox': 3.8.1(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/checkbox@3.14.6(react@18.3.1)': + dependencies: + '@react-aria/form': 3.0.8(react@18.3.1) + '@react-aria/interactions': 3.22.2(react@18.3.1) + '@react-aria/label': 3.7.11(react@18.3.1) + '@react-aria/toggle': 3.10.7(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-stately/checkbox': 3.6.8(react@18.3.1) + '@react-stately/form': 3.0.5(react@18.3.1) + '@react-stately/toggle': 3.7.7(react@18.3.1) + '@react-types/checkbox': 3.8.3(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-aria/color@3.0.0-beta.33(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@react-aria/i18n': 3.11.1(react@18.3.1) - '@react-aria/interactions': 3.21.3(react@18.3.1) - '@react-aria/numberfield': 3.11.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/slider': 3.7.8(react@18.3.1) - '@react-aria/spinbutton': 3.6.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/textfield': 3.14.5(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-aria/visually-hidden': 3.8.12(react@18.3.1) - '@react-stately/color': 3.6.1(react@18.3.1) - '@react-stately/form': 3.0.3(react@18.3.1) - '@react-types/color': 3.0.0-beta.25(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/collections@3.0.0-alpha.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/ssr': 3.9.5(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + use-sync-external-store: 1.2.2(react@18.3.1) - '@react-aria/combobox@3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-aria/color@3.0.0-rc.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/i18n': 3.12.2(react@18.3.1) + '@react-aria/interactions': 3.22.2(react@18.3.1) + '@react-aria/numberfield': 3.11.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/slider': 3.7.11(react@18.3.1) + '@react-aria/spinbutton': 3.6.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/textfield': 3.14.8(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-aria/visually-hidden': 3.8.15(react@18.3.1) + '@react-stately/color': 3.7.2(react@18.3.1) + '@react-stately/form': 3.0.5(react@18.3.1) + '@react-types/color': 3.0.0-rc.1(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-aria/combobox@3.10.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@react-aria/i18n': 3.11.1(react@18.3.1) - '@react-aria/listbox': 3.12.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/i18n': 3.12.2(react@18.3.1) + '@react-aria/listbox': 3.13.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-aria/live-announcer': 3.3.4 - '@react-aria/menu': 3.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/overlays': 3.22.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/selection': 3.18.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/textfield': 3.14.5(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-stately/collections': 3.10.7(react@18.3.1) - '@react-stately/combobox': 3.8.4(react@18.3.1) - '@react-stately/form': 3.0.3(react@18.3.1) - '@react-types/button': 3.9.4(react@18.3.1) - '@react-types/combobox': 3.11.1(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/menu': 3.15.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/overlays': 3.23.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/selection': 3.19.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/textfield': 3.14.8(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-stately/collections': 3.10.9(react@18.3.1) + '@react-stately/combobox': 3.9.2(react@18.3.1) + '@react-stately/form': 3.0.5(react@18.3.1) + '@react-types/button': 3.9.6(react@18.3.1) + '@react-types/combobox': 3.12.1(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/datepicker@3.10.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-aria/datepicker@3.11.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@internationalized/date': 3.5.4 + '@internationalized/date': 3.5.5 '@internationalized/number': 3.5.3 '@internationalized/string': 3.2.3 - '@react-aria/focus': 3.17.1(react@18.3.1) - '@react-aria/form': 3.0.5(react@18.3.1) - '@react-aria/i18n': 3.11.1(react@18.3.1) - '@react-aria/interactions': 3.21.3(react@18.3.1) - '@react-aria/label': 3.7.8(react@18.3.1) - '@react-aria/spinbutton': 3.6.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-stately/datepicker': 3.9.4(react@18.3.1) - '@react-stately/form': 3.0.3(react@18.3.1) - '@react-types/button': 3.9.4(react@18.3.1) - '@react-types/calendar': 3.4.6(react@18.3.1) - '@react-types/datepicker': 3.7.4(react@18.3.1) - '@react-types/dialog': 3.5.10(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/focus': 3.18.2(react@18.3.1) + '@react-aria/form': 3.0.8(react@18.3.1) + '@react-aria/i18n': 3.12.2(react@18.3.1) + '@react-aria/interactions': 3.22.2(react@18.3.1) + '@react-aria/label': 3.7.11(react@18.3.1) + '@react-aria/spinbutton': 3.6.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-stately/datepicker': 3.10.2(react@18.3.1) + '@react-stately/form': 3.0.5(react@18.3.1) + '@react-types/button': 3.9.6(react@18.3.1) + '@react-types/calendar': 3.4.9(react@18.3.1) + '@react-types/datepicker': 3.8.2(react@18.3.1) + '@react-types/dialog': 3.5.12(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/dialog@3.5.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-aria/dialog@3.5.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@react-aria/focus': 3.17.1(react@18.3.1) - '@react-aria/overlays': 3.22.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-types/dialog': 3.5.10(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/focus': 3.18.2(react@18.3.1) + '@react-aria/overlays': 3.23.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-types/dialog': 3.5.12(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/dnd@3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-aria/dnd@3.7.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@internationalized/string': 3.2.3 - '@react-aria/i18n': 3.11.1(react@18.3.1) - '@react-aria/interactions': 3.21.3(react@18.3.1) + '@react-aria/i18n': 3.12.2(react@18.3.1) + '@react-aria/interactions': 3.22.2(react@18.3.1) '@react-aria/live-announcer': 3.3.4 - '@react-aria/overlays': 3.22.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-stately/dnd': 3.3.1(react@18.3.1) - '@react-types/button': 3.9.4(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/overlays': 3.23.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-stately/dnd': 3.4.2(react@18.3.1) + '@react-types/button': 3.9.6(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/focus@3.17.1(react@18.3.1)': + '@react-aria/focus@3.18.2(react@18.3.1)': dependencies: - '@react-aria/interactions': 3.21.3(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/interactions': 3.22.2(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 clsx: 2.1.1 react: 18.3.1 - '@react-aria/form@3.0.5(react@18.3.1)': + '@react-aria/form@3.0.8(react@18.3.1)': dependencies: - '@react-aria/interactions': 3.21.3(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-stately/form': 3.0.3(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/interactions': 3.22.2(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-stately/form': 3.0.5(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-aria/grid@3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-aria/grid@3.10.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@react-aria/focus': 3.17.1(react@18.3.1) - '@react-aria/i18n': 3.11.1(react@18.3.1) - '@react-aria/interactions': 3.21.3(react@18.3.1) + '@react-aria/focus': 3.18.2(react@18.3.1) + '@react-aria/i18n': 3.12.2(react@18.3.1) + '@react-aria/interactions': 3.22.2(react@18.3.1) '@react-aria/live-announcer': 3.3.4 - '@react-aria/selection': 3.18.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-stately/collections': 3.10.7(react@18.3.1) - '@react-stately/grid': 3.8.7(react@18.3.1) - '@react-stately/selection': 3.15.1(react@18.3.1) - '@react-stately/virtualizer': 3.7.1(react@18.3.1) - '@react-types/checkbox': 3.8.1(react@18.3.1) - '@react-types/grid': 3.2.6(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/selection': 3.19.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-stately/collections': 3.10.9(react@18.3.1) + '@react-stately/grid': 3.9.2(react@18.3.1) + '@react-stately/selection': 3.16.2(react@18.3.1) + '@react-types/checkbox': 3.8.3(react@18.3.1) + '@react-types/grid': 3.2.8(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/gridlist@3.8.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@react-aria/focus': 3.17.1(react@18.3.1) - '@react-aria/grid': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/i18n': 3.11.1(react@18.3.1) - '@react-aria/interactions': 3.21.3(react@18.3.1) - '@react-aria/selection': 3.18.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-stately/collections': 3.10.7(react@18.3.1) - '@react-stately/list': 3.10.5(react@18.3.1) - '@react-stately/tree': 3.8.1(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/gridlist@3.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/focus': 3.18.2(react@18.3.1) + '@react-aria/grid': 3.10.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/i18n': 3.12.2(react@18.3.1) + '@react-aria/interactions': 3.22.2(react@18.3.1) + '@react-aria/selection': 3.19.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-stately/collections': 3.10.9(react@18.3.1) + '@react-stately/list': 3.10.8(react@18.3.1) + '@react-stately/tree': 3.8.4(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/i18n@3.11.1(react@18.3.1)': + '@react-aria/i18n@3.12.2(react@18.3.1)': dependencies: - '@internationalized/date': 3.5.4 + '@internationalized/date': 3.5.5 '@internationalized/message': 3.1.4 '@internationalized/number': 3.5.3 '@internationalized/string': 3.2.3 - '@react-aria/ssr': 3.9.4(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/ssr': 3.9.5(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-aria/interactions@3.21.3(react@18.3.1)': + '@react-aria/interactions@3.22.2(react@18.3.1)': dependencies: - '@react-aria/ssr': 3.9.4(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/ssr': 3.9.5(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-aria/label@3.7.8(react@18.3.1)': + '@react-aria/label@3.7.11(react@18.3.1)': dependencies: - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-aria/link@3.7.1(react@18.3.1)': + '@react-aria/link@3.7.4(react@18.3.1)': dependencies: - '@react-aria/focus': 3.17.1(react@18.3.1) - '@react-aria/interactions': 3.21.3(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-types/link': 3.5.5(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/focus': 3.18.2(react@18.3.1) + '@react-aria/interactions': 3.22.2(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-types/link': 3.5.7(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-aria/listbox@3.12.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@react-aria/interactions': 3.21.3(react@18.3.1) - '@react-aria/label': 3.7.8(react@18.3.1) - '@react-aria/selection': 3.18.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-stately/collections': 3.10.7(react@18.3.1) - '@react-stately/list': 3.10.5(react@18.3.1) - '@react-types/listbox': 3.4.9(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/listbox@3.13.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/interactions': 3.22.2(react@18.3.1) + '@react-aria/label': 3.7.11(react@18.3.1) + '@react-aria/selection': 3.19.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-stately/collections': 3.10.9(react@18.3.1) + '@react-stately/list': 3.10.8(react@18.3.1) + '@react-types/listbox': 3.5.1(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) '@react-aria/live-announcer@3.3.4': dependencies: - '@swc/helpers': 0.5.11 - - '@react-aria/menu@3.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@react-aria/focus': 3.17.1(react@18.3.1) - '@react-aria/i18n': 3.11.1(react@18.3.1) - '@react-aria/interactions': 3.21.3(react@18.3.1) - '@react-aria/overlays': 3.22.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/selection': 3.18.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-stately/collections': 3.10.7(react@18.3.1) - '@react-stately/menu': 3.7.1(react@18.3.1) - '@react-stately/tree': 3.8.1(react@18.3.1) - '@react-types/button': 3.9.4(react@18.3.1) - '@react-types/menu': 3.9.9(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@swc/helpers': 0.5.12 + + '@react-aria/menu@3.15.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/focus': 3.18.2(react@18.3.1) + '@react-aria/i18n': 3.12.2(react@18.3.1) + '@react-aria/interactions': 3.22.2(react@18.3.1) + '@react-aria/overlays': 3.23.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/selection': 3.19.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-stately/collections': 3.10.9(react@18.3.1) + '@react-stately/menu': 3.8.2(react@18.3.1) + '@react-stately/tree': 3.8.4(react@18.3.1) + '@react-types/button': 3.9.6(react@18.3.1) + '@react-types/menu': 3.9.11(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/meter@3.4.13(react@18.3.1)': + '@react-aria/meter@3.4.16(react@18.3.1)': dependencies: - '@react-aria/progress': 3.4.13(react@18.3.1) - '@react-types/meter': 3.4.1(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/progress': 3.4.16(react@18.3.1) + '@react-types/meter': 3.4.3(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-aria/numberfield@3.11.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@react-aria/i18n': 3.11.1(react@18.3.1) - '@react-aria/interactions': 3.21.3(react@18.3.1) - '@react-aria/spinbutton': 3.6.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/textfield': 3.14.5(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-stately/form': 3.0.3(react@18.3.1) - '@react-stately/numberfield': 3.9.3(react@18.3.1) - '@react-types/button': 3.9.4(react@18.3.1) - '@react-types/numberfield': 3.8.3(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/numberfield@3.11.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/i18n': 3.12.2(react@18.3.1) + '@react-aria/interactions': 3.22.2(react@18.3.1) + '@react-aria/spinbutton': 3.6.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/textfield': 3.14.8(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-stately/form': 3.0.5(react@18.3.1) + '@react-stately/numberfield': 3.9.6(react@18.3.1) + '@react-types/button': 3.9.6(react@18.3.1) + '@react-types/numberfield': 3.8.5(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/overlays@3.22.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@react-aria/focus': 3.17.1(react@18.3.1) - '@react-aria/i18n': 3.11.1(react@18.3.1) - '@react-aria/interactions': 3.21.3(react@18.3.1) - '@react-aria/ssr': 3.9.4(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-aria/visually-hidden': 3.8.12(react@18.3.1) - '@react-stately/overlays': 3.6.7(react@18.3.1) - '@react-types/button': 3.9.4(react@18.3.1) - '@react-types/overlays': 3.8.7(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/overlays@3.23.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/focus': 3.18.2(react@18.3.1) + '@react-aria/i18n': 3.12.2(react@18.3.1) + '@react-aria/interactions': 3.22.2(react@18.3.1) + '@react-aria/ssr': 3.9.5(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-aria/visually-hidden': 3.8.15(react@18.3.1) + '@react-stately/overlays': 3.6.10(react@18.3.1) + '@react-types/button': 3.9.6(react@18.3.1) + '@react-types/overlays': 3.8.9(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/progress@3.4.13(react@18.3.1)': + '@react-aria/progress@3.4.16(react@18.3.1)': dependencies: - '@react-aria/i18n': 3.11.1(react@18.3.1) - '@react-aria/label': 3.7.8(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-types/progress': 3.5.4(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/i18n': 3.12.2(react@18.3.1) + '@react-aria/label': 3.7.11(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-types/progress': 3.5.6(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-aria/radio@3.10.4(react@18.3.1)': - dependencies: - '@react-aria/focus': 3.17.1(react@18.3.1) - '@react-aria/form': 3.0.5(react@18.3.1) - '@react-aria/i18n': 3.11.1(react@18.3.1) - '@react-aria/interactions': 3.21.3(react@18.3.1) - '@react-aria/label': 3.7.8(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-stately/radio': 3.10.4(react@18.3.1) - '@react-types/radio': 3.8.1(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/radio@3.10.7(react@18.3.1)': + dependencies: + '@react-aria/focus': 3.18.2(react@18.3.1) + '@react-aria/form': 3.0.8(react@18.3.1) + '@react-aria/i18n': 3.12.2(react@18.3.1) + '@react-aria/interactions': 3.22.2(react@18.3.1) + '@react-aria/label': 3.7.11(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-stately/radio': 3.10.7(react@18.3.1) + '@react-types/radio': 3.8.3(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-aria/searchfield@3.7.5(react@18.3.1)': + '@react-aria/searchfield@3.7.8(react@18.3.1)': dependencies: - '@react-aria/i18n': 3.11.1(react@18.3.1) - '@react-aria/textfield': 3.14.5(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-stately/searchfield': 3.5.3(react@18.3.1) - '@react-types/button': 3.9.4(react@18.3.1) - '@react-types/searchfield': 3.5.5(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/i18n': 3.12.2(react@18.3.1) + '@react-aria/textfield': 3.14.8(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-stately/searchfield': 3.5.6(react@18.3.1) + '@react-types/button': 3.9.6(react@18.3.1) + '@react-types/searchfield': 3.5.8(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-aria/select@3.14.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@react-aria/form': 3.0.5(react@18.3.1) - '@react-aria/i18n': 3.11.1(react@18.3.1) - '@react-aria/interactions': 3.21.3(react@18.3.1) - '@react-aria/label': 3.7.8(react@18.3.1) - '@react-aria/listbox': 3.12.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/menu': 3.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/selection': 3.18.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-aria/visually-hidden': 3.8.12(react@18.3.1) - '@react-stately/select': 3.6.4(react@18.3.1) - '@react-types/button': 3.9.4(react@18.3.1) - '@react-types/select': 3.9.4(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/select@3.14.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/form': 3.0.8(react@18.3.1) + '@react-aria/i18n': 3.12.2(react@18.3.1) + '@react-aria/interactions': 3.22.2(react@18.3.1) + '@react-aria/label': 3.7.11(react@18.3.1) + '@react-aria/listbox': 3.13.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/menu': 3.15.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/selection': 3.19.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-aria/visually-hidden': 3.8.15(react@18.3.1) + '@react-stately/select': 3.6.7(react@18.3.1) + '@react-types/button': 3.9.6(react@18.3.1) + '@react-types/select': 3.9.6(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/selection@3.18.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-aria/selection@3.19.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@react-aria/focus': 3.17.1(react@18.3.1) - '@react-aria/i18n': 3.11.1(react@18.3.1) - '@react-aria/interactions': 3.21.3(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-stately/selection': 3.15.1(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/focus': 3.18.2(react@18.3.1) + '@react-aria/i18n': 3.12.2(react@18.3.1) + '@react-aria/interactions': 3.22.2(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-stately/selection': 3.16.2(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/separator@3.3.13(react@18.3.1)': + '@react-aria/separator@3.4.2(react@18.3.1)': dependencies: - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-aria/slider@3.7.8(react@18.3.1)': - dependencies: - '@react-aria/focus': 3.17.1(react@18.3.1) - '@react-aria/i18n': 3.11.1(react@18.3.1) - '@react-aria/interactions': 3.21.3(react@18.3.1) - '@react-aria/label': 3.7.8(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-stately/slider': 3.5.4(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@react-types/slider': 3.7.3(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/slider@3.7.11(react@18.3.1)': + dependencies: + '@react-aria/focus': 3.18.2(react@18.3.1) + '@react-aria/i18n': 3.12.2(react@18.3.1) + '@react-aria/interactions': 3.22.2(react@18.3.1) + '@react-aria/label': 3.7.11(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-stately/slider': 3.5.7(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@react-types/slider': 3.7.5(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-aria/spinbutton@3.6.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-aria/spinbutton@3.6.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@react-aria/i18n': 3.11.1(react@18.3.1) + '@react-aria/i18n': 3.12.2(react@18.3.1) '@react-aria/live-announcer': 3.3.4 - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-types/button': 3.9.4(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-types/button': 3.9.6(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/ssr@3.9.4(react@18.3.1)': + '@react-aria/ssr@3.9.5(react@18.3.1)': dependencies: - '@swc/helpers': 0.5.11 + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-aria/switch@3.6.4(react@18.3.1)': + '@react-aria/switch@3.6.7(react@18.3.1)': dependencies: - '@react-aria/toggle': 3.10.4(react@18.3.1) - '@react-stately/toggle': 3.7.4(react@18.3.1) - '@react-types/switch': 3.5.3(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/toggle': 3.10.7(react@18.3.1) + '@react-stately/toggle': 3.7.7(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@react-types/switch': 3.5.5(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-aria/table@3.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-aria/table@3.15.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@react-aria/focus': 3.17.1(react@18.3.1) - '@react-aria/grid': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/i18n': 3.11.1(react@18.3.1) - '@react-aria/interactions': 3.21.3(react@18.3.1) + '@react-aria/focus': 3.18.2(react@18.3.1) + '@react-aria/grid': 3.10.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/i18n': 3.12.2(react@18.3.1) + '@react-aria/interactions': 3.22.2(react@18.3.1) '@react-aria/live-announcer': 3.3.4 - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-aria/visually-hidden': 3.8.12(react@18.3.1) - '@react-stately/collections': 3.10.7(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-aria/visually-hidden': 3.8.15(react@18.3.1) + '@react-stately/collections': 3.10.9(react@18.3.1) '@react-stately/flags': 3.0.3 - '@react-stately/table': 3.11.8(react@18.3.1) - '@react-stately/virtualizer': 3.7.1(react@18.3.1) - '@react-types/checkbox': 3.8.1(react@18.3.1) - '@react-types/grid': 3.2.6(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@react-types/table': 3.9.5(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-stately/table': 3.12.2(react@18.3.1) + '@react-types/checkbox': 3.8.3(react@18.3.1) + '@react-types/grid': 3.2.8(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@react-types/table': 3.10.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/tabs@3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-aria/tabs@3.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@react-aria/focus': 3.17.1(react@18.3.1) - '@react-aria/i18n': 3.11.1(react@18.3.1) - '@react-aria/selection': 3.18.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-stately/tabs': 3.6.6(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@react-types/tabs': 3.3.7(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/focus': 3.18.2(react@18.3.1) + '@react-aria/i18n': 3.12.2(react@18.3.1) + '@react-aria/selection': 3.19.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-stately/tabs': 3.6.9(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@react-types/tabs': 3.3.9(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/tag@3.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@react-aria/gridlist': 3.8.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/i18n': 3.11.1(react@18.3.1) - '@react-aria/interactions': 3.21.3(react@18.3.1) - '@react-aria/label': 3.7.8(react@18.3.1) - '@react-aria/selection': 3.18.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-stately/list': 3.10.5(react@18.3.1) - '@react-types/button': 3.9.4(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/tag@3.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/gridlist': 3.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/i18n': 3.12.2(react@18.3.1) + '@react-aria/interactions': 3.22.2(react@18.3.1) + '@react-aria/label': 3.7.11(react@18.3.1) + '@react-aria/selection': 3.19.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-stately/list': 3.10.8(react@18.3.1) + '@react-types/button': 3.9.6(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/textfield@3.14.5(react@18.3.1)': - dependencies: - '@react-aria/focus': 3.17.1(react@18.3.1) - '@react-aria/form': 3.0.5(react@18.3.1) - '@react-aria/label': 3.7.8(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-stately/form': 3.0.3(react@18.3.1) - '@react-stately/utils': 3.10.1(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@react-types/textfield': 3.9.3(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/textfield@3.14.8(react@18.3.1)': + dependencies: + '@react-aria/focus': 3.18.2(react@18.3.1) + '@react-aria/form': 3.0.8(react@18.3.1) + '@react-aria/label': 3.7.11(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-stately/form': 3.0.5(react@18.3.1) + '@react-stately/utils': 3.10.3(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@react-types/textfield': 3.9.6(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-aria/toggle@3.10.4(react@18.3.1)': + '@react-aria/toggle@3.10.7(react@18.3.1)': dependencies: - '@react-aria/focus': 3.17.1(react@18.3.1) - '@react-aria/interactions': 3.21.3(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-stately/toggle': 3.7.4(react@18.3.1) - '@react-types/checkbox': 3.8.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/focus': 3.18.2(react@18.3.1) + '@react-aria/interactions': 3.22.2(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-stately/toggle': 3.7.7(react@18.3.1) + '@react-types/checkbox': 3.8.3(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-aria/toolbar@3.0.0-beta.5(react@18.3.1)': + '@react-aria/toolbar@3.0.0-beta.8(react@18.3.1)': dependencies: - '@react-aria/focus': 3.17.1(react@18.3.1) - '@react-aria/i18n': 3.11.1(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/focus': 3.18.2(react@18.3.1) + '@react-aria/i18n': 3.12.2(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-aria/tooltip@3.7.4(react@18.3.1)': + '@react-aria/tooltip@3.7.7(react@18.3.1)': dependencies: - '@react-aria/focus': 3.17.1(react@18.3.1) - '@react-aria/interactions': 3.21.3(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-stately/tooltip': 3.4.9(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@react-types/tooltip': 3.4.9(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/focus': 3.18.2(react@18.3.1) + '@react-aria/interactions': 3.22.2(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-stately/tooltip': 3.4.12(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@react-types/tooltip': 3.4.11(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-aria/tree@3.0.0-alpha.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-aria/tree@3.0.0-alpha.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@react-aria/gridlist': 3.8.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/i18n': 3.11.1(react@18.3.1) - '@react-aria/selection': 3.18.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-stately/tree': 3.8.1(react@18.3.1) - '@react-types/button': 3.9.4(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/gridlist': 3.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/i18n': 3.12.2(react@18.3.1) + '@react-aria/selection': 3.19.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-stately/tree': 3.8.4(react@18.3.1) + '@react-types/button': 3.9.6(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/utils@3.24.1(react@18.3.1)': + '@react-aria/utils@3.25.2(react@18.3.1)': dependencies: - '@react-aria/ssr': 3.9.4(react@18.3.1) - '@react-stately/utils': 3.10.1(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/ssr': 3.9.5(react@18.3.1) + '@react-stately/utils': 3.10.3(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 clsx: 2.1.1 react: 18.3.1 - '@react-aria/visually-hidden@3.8.12(react@18.3.1)': + '@react-aria/virtualizer@4.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/i18n': 3.12.2(react@18.3.1) + '@react-aria/interactions': 3.22.2(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-stately/virtualizer': 4.0.2(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-aria/visually-hidden@3.8.15(react@18.3.1)': dependencies: - '@react-aria/interactions': 3.21.3(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/interactions': 3.22.2(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-stately/calendar@3.5.1(react@18.3.1)': + '@react-stately/calendar@3.5.4(react@18.3.1)': dependencies: - '@internationalized/date': 3.5.4 - '@react-stately/utils': 3.10.1(react@18.3.1) - '@react-types/calendar': 3.4.6(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@internationalized/date': 3.5.5 + '@react-stately/utils': 3.10.3(react@18.3.1) + '@react-types/calendar': 3.4.9(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-stately/checkbox@3.6.5(react@18.3.1)': + '@react-stately/checkbox@3.6.8(react@18.3.1)': dependencies: - '@react-stately/form': 3.0.3(react@18.3.1) - '@react-stately/utils': 3.10.1(react@18.3.1) - '@react-types/checkbox': 3.8.1(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-stately/form': 3.0.5(react@18.3.1) + '@react-stately/utils': 3.10.3(react@18.3.1) + '@react-types/checkbox': 3.8.3(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-stately/collections@3.10.7(react@18.3.1)': + '@react-stately/collections@3.10.9(react@18.3.1)': dependencies: - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-stately/color@3.6.1(react@18.3.1)': + '@react-stately/color@3.7.2(react@18.3.1)': dependencies: '@internationalized/number': 3.5.3 '@internationalized/string': 3.2.3 - '@react-aria/i18n': 3.11.1(react@18.3.1) - '@react-stately/form': 3.0.3(react@18.3.1) - '@react-stately/numberfield': 3.9.3(react@18.3.1) - '@react-stately/slider': 3.5.4(react@18.3.1) - '@react-stately/utils': 3.10.1(react@18.3.1) - '@react-types/color': 3.0.0-beta.25(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/i18n': 3.12.2(react@18.3.1) + '@react-stately/form': 3.0.5(react@18.3.1) + '@react-stately/numberfield': 3.9.6(react@18.3.1) + '@react-stately/slider': 3.5.7(react@18.3.1) + '@react-stately/utils': 3.10.3(react@18.3.1) + '@react-types/color': 3.0.0-rc.1(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-stately/combobox@3.8.4(react@18.3.1)': - dependencies: - '@react-stately/collections': 3.10.7(react@18.3.1) - '@react-stately/form': 3.0.3(react@18.3.1) - '@react-stately/list': 3.10.5(react@18.3.1) - '@react-stately/overlays': 3.6.7(react@18.3.1) - '@react-stately/select': 3.6.4(react@18.3.1) - '@react-stately/utils': 3.10.1(react@18.3.1) - '@react-types/combobox': 3.11.1(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-stately/combobox@3.9.2(react@18.3.1)': + dependencies: + '@react-stately/collections': 3.10.9(react@18.3.1) + '@react-stately/form': 3.0.5(react@18.3.1) + '@react-stately/list': 3.10.8(react@18.3.1) + '@react-stately/overlays': 3.6.10(react@18.3.1) + '@react-stately/select': 3.6.7(react@18.3.1) + '@react-stately/utils': 3.10.3(react@18.3.1) + '@react-types/combobox': 3.12.1(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-stately/data@3.11.4(react@18.3.1)': + '@react-stately/data@3.11.6(react@18.3.1)': dependencies: - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-stately/datepicker@3.9.4(react@18.3.1)': + '@react-stately/datepicker@3.10.2(react@18.3.1)': dependencies: - '@internationalized/date': 3.5.4 + '@internationalized/date': 3.5.5 '@internationalized/string': 3.2.3 - '@react-stately/form': 3.0.3(react@18.3.1) - '@react-stately/overlays': 3.6.7(react@18.3.1) - '@react-stately/utils': 3.10.1(react@18.3.1) - '@react-types/datepicker': 3.7.4(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-stately/form': 3.0.5(react@18.3.1) + '@react-stately/overlays': 3.6.10(react@18.3.1) + '@react-stately/utils': 3.10.3(react@18.3.1) + '@react-types/datepicker': 3.8.2(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-stately/dnd@3.3.1(react@18.3.1)': + '@react-stately/dnd@3.4.2(react@18.3.1)': dependencies: - '@react-stately/selection': 3.15.1(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-stately/selection': 3.16.2(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 '@react-stately/flags@3.0.3': dependencies: - '@swc/helpers': 0.5.11 + '@swc/helpers': 0.5.12 - '@react-stately/form@3.0.3(react@18.3.1)': + '@react-stately/form@3.0.5(react@18.3.1)': dependencies: - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-stately/grid@3.8.7(react@18.3.1)': + '@react-stately/grid@3.9.2(react@18.3.1)': dependencies: - '@react-stately/collections': 3.10.7(react@18.3.1) - '@react-stately/selection': 3.15.1(react@18.3.1) - '@react-types/grid': 3.2.6(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-stately/collections': 3.10.9(react@18.3.1) + '@react-stately/selection': 3.16.2(react@18.3.1) + '@react-types/grid': 3.2.8(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-stately/list@3.10.5(react@18.3.1)': + '@react-stately/layout@4.0.2(react@18.3.1)': dependencies: - '@react-stately/collections': 3.10.7(react@18.3.1) - '@react-stately/selection': 3.15.1(react@18.3.1) - '@react-stately/utils': 3.10.1(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-stately/collections': 3.10.9(react@18.3.1) + '@react-stately/table': 3.12.2(react@18.3.1) + '@react-stately/virtualizer': 4.0.2(react@18.3.1) + '@react-types/grid': 3.2.8(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@react-types/table': 3.10.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-stately/menu@3.7.1(react@18.3.1)': + '@react-stately/list@3.10.8(react@18.3.1)': dependencies: - '@react-stately/overlays': 3.6.7(react@18.3.1) - '@react-types/menu': 3.9.9(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-stately/collections': 3.10.9(react@18.3.1) + '@react-stately/selection': 3.16.2(react@18.3.1) + '@react-stately/utils': 3.10.3(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-stately/numberfield@3.9.3(react@18.3.1)': + '@react-stately/menu@3.8.2(react@18.3.1)': + dependencies: + '@react-stately/overlays': 3.6.10(react@18.3.1) + '@react-types/menu': 3.9.11(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 + react: 18.3.1 + + '@react-stately/numberfield@3.9.6(react@18.3.1)': dependencies: '@internationalized/number': 3.5.3 - '@react-stately/form': 3.0.3(react@18.3.1) - '@react-stately/utils': 3.10.1(react@18.3.1) - '@react-types/numberfield': 3.8.3(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-stately/form': 3.0.5(react@18.3.1) + '@react-stately/utils': 3.10.3(react@18.3.1) + '@react-types/numberfield': 3.8.5(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-stately/overlays@3.6.7(react@18.3.1)': + '@react-stately/overlays@3.6.10(react@18.3.1)': dependencies: - '@react-stately/utils': 3.10.1(react@18.3.1) - '@react-types/overlays': 3.8.7(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-stately/utils': 3.10.3(react@18.3.1) + '@react-types/overlays': 3.8.9(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-stately/radio@3.10.4(react@18.3.1)': + '@react-stately/radio@3.10.7(react@18.3.1)': dependencies: - '@react-stately/form': 3.0.3(react@18.3.1) - '@react-stately/utils': 3.10.1(react@18.3.1) - '@react-types/radio': 3.8.1(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-stately/form': 3.0.5(react@18.3.1) + '@react-stately/utils': 3.10.3(react@18.3.1) + '@react-types/radio': 3.8.3(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-stately/searchfield@3.5.3(react@18.3.1)': + '@react-stately/searchfield@3.5.6(react@18.3.1)': dependencies: - '@react-stately/utils': 3.10.1(react@18.3.1) - '@react-types/searchfield': 3.5.5(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-stately/utils': 3.10.3(react@18.3.1) + '@react-types/searchfield': 3.5.8(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-stately/select@3.6.4(react@18.3.1)': + '@react-stately/select@3.6.7(react@18.3.1)': dependencies: - '@react-stately/form': 3.0.3(react@18.3.1) - '@react-stately/list': 3.10.5(react@18.3.1) - '@react-stately/overlays': 3.6.7(react@18.3.1) - '@react-types/select': 3.9.4(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-stately/form': 3.0.5(react@18.3.1) + '@react-stately/list': 3.10.8(react@18.3.1) + '@react-stately/overlays': 3.6.10(react@18.3.1) + '@react-types/select': 3.9.6(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-stately/selection@3.15.1(react@18.3.1)': + '@react-stately/selection@3.16.2(react@18.3.1)': dependencies: - '@react-stately/collections': 3.10.7(react@18.3.1) - '@react-stately/utils': 3.10.1(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-stately/collections': 3.10.9(react@18.3.1) + '@react-stately/utils': 3.10.3(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-stately/slider@3.5.4(react@18.3.1)': + '@react-stately/slider@3.5.7(react@18.3.1)': dependencies: - '@react-stately/utils': 3.10.1(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@react-types/slider': 3.7.3(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-stately/utils': 3.10.3(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@react-types/slider': 3.7.5(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-stately/table@3.11.8(react@18.3.1)': + '@react-stately/table@3.12.2(react@18.3.1)': dependencies: - '@react-stately/collections': 3.10.7(react@18.3.1) + '@react-stately/collections': 3.10.9(react@18.3.1) '@react-stately/flags': 3.0.3 - '@react-stately/grid': 3.8.7(react@18.3.1) - '@react-stately/selection': 3.15.1(react@18.3.1) - '@react-stately/utils': 3.10.1(react@18.3.1) - '@react-types/grid': 3.2.6(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@react-types/table': 3.9.5(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-stately/grid': 3.9.2(react@18.3.1) + '@react-stately/selection': 3.16.2(react@18.3.1) + '@react-stately/utils': 3.10.3(react@18.3.1) + '@react-types/grid': 3.2.8(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@react-types/table': 3.10.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-stately/tabs@3.6.6(react@18.3.1)': + '@react-stately/tabs@3.6.9(react@18.3.1)': dependencies: - '@react-stately/list': 3.10.5(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@react-types/tabs': 3.3.7(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-stately/list': 3.10.8(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@react-types/tabs': 3.3.9(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-stately/toggle@3.7.4(react@18.3.1)': + '@react-stately/toggle@3.7.7(react@18.3.1)': dependencies: - '@react-stately/utils': 3.10.1(react@18.3.1) - '@react-types/checkbox': 3.8.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-stately/utils': 3.10.3(react@18.3.1) + '@react-types/checkbox': 3.8.3(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-stately/tooltip@3.4.9(react@18.3.1)': + '@react-stately/tooltip@3.4.12(react@18.3.1)': dependencies: - '@react-stately/overlays': 3.6.7(react@18.3.1) - '@react-types/tooltip': 3.4.9(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-stately/overlays': 3.6.10(react@18.3.1) + '@react-types/tooltip': 3.4.11(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-stately/tree@3.8.1(react@18.3.1)': + '@react-stately/tree@3.8.4(react@18.3.1)': dependencies: - '@react-stately/collections': 3.10.7(react@18.3.1) - '@react-stately/selection': 3.15.1(react@18.3.1) - '@react-stately/utils': 3.10.1(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-stately/collections': 3.10.9(react@18.3.1) + '@react-stately/selection': 3.16.2(react@18.3.1) + '@react-stately/utils': 3.10.3(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-stately/utils@3.10.1(react@18.3.1)': + '@react-stately/utils@3.10.3(react@18.3.1)': dependencies: - '@swc/helpers': 0.5.11 + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-stately/virtualizer@3.7.1(react@18.3.1)': + '@react-stately/virtualizer@4.0.2(react@18.3.1)': dependencies: - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.12 react: 18.3.1 - '@react-types/breadcrumbs@3.7.5(react@18.3.1)': + '@react-types/breadcrumbs@3.7.7(react@18.3.1)': dependencies: - '@react-types/link': 3.5.5(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) + '@react-types/link': 3.5.7(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - '@react-types/button@3.9.4(react@18.3.1)': + '@react-types/button@3.9.6(react@18.3.1)': dependencies: - '@react-types/shared': 3.23.1(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - '@react-types/calendar@3.4.6(react@18.3.1)': + '@react-types/calendar@3.4.9(react@18.3.1)': dependencies: - '@internationalized/date': 3.5.4 - '@react-types/shared': 3.23.1(react@18.3.1) + '@internationalized/date': 3.5.5 + '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - '@react-types/checkbox@3.8.1(react@18.3.1)': + '@react-types/checkbox@3.8.3(react@18.3.1)': dependencies: - '@react-types/shared': 3.23.1(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - '@react-types/color@3.0.0-beta.25(react@18.3.1)': + '@react-types/color@3.0.0-rc.1(react@18.3.1)': dependencies: - '@react-types/shared': 3.23.1(react@18.3.1) - '@react-types/slider': 3.7.3(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@react-types/slider': 3.7.5(react@18.3.1) react: 18.3.1 - '@react-types/combobox@3.11.1(react@18.3.1)': + '@react-types/combobox@3.12.1(react@18.3.1)': dependencies: - '@react-types/shared': 3.23.1(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - '@react-types/datepicker@3.7.4(react@18.3.1)': + '@react-types/datepicker@3.8.2(react@18.3.1)': dependencies: - '@internationalized/date': 3.5.4 - '@react-types/calendar': 3.4.6(react@18.3.1) - '@react-types/overlays': 3.8.7(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) + '@internationalized/date': 3.5.5 + '@react-types/calendar': 3.4.9(react@18.3.1) + '@react-types/overlays': 3.8.9(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - '@react-types/dialog@3.5.10(react@18.3.1)': + '@react-types/dialog@3.5.12(react@18.3.1)': dependencies: - '@react-types/overlays': 3.8.7(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) + '@react-types/overlays': 3.8.9(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - '@react-types/form@3.7.4(react@18.3.1)': + '@react-types/form@3.7.6(react@18.3.1)': dependencies: - '@react-types/shared': 3.23.1(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - '@react-types/grid@3.2.6(react@18.3.1)': + '@react-types/grid@3.2.8(react@18.3.1)': dependencies: - '@react-types/shared': 3.23.1(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - '@react-types/link@3.5.5(react@18.3.1)': + '@react-types/link@3.5.7(react@18.3.1)': dependencies: - '@react-types/shared': 3.23.1(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - '@react-types/listbox@3.4.9(react@18.3.1)': + '@react-types/listbox@3.5.1(react@18.3.1)': dependencies: - '@react-types/shared': 3.23.1(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - '@react-types/menu@3.9.9(react@18.3.1)': + '@react-types/menu@3.9.11(react@18.3.1)': dependencies: - '@react-types/overlays': 3.8.7(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) + '@react-types/overlays': 3.8.9(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - '@react-types/meter@3.4.1(react@18.3.1)': + '@react-types/meter@3.4.3(react@18.3.1)': dependencies: - '@react-types/progress': 3.5.4(react@18.3.1) + '@react-types/progress': 3.5.6(react@18.3.1) react: 18.3.1 - '@react-types/numberfield@3.8.3(react@18.3.1)': + '@react-types/numberfield@3.8.5(react@18.3.1)': dependencies: - '@react-types/shared': 3.23.1(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - '@react-types/overlays@3.8.7(react@18.3.1)': + '@react-types/overlays@3.8.9(react@18.3.1)': dependencies: - '@react-types/shared': 3.23.1(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - '@react-types/progress@3.5.4(react@18.3.1)': + '@react-types/progress@3.5.6(react@18.3.1)': dependencies: - '@react-types/shared': 3.23.1(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - '@react-types/radio@3.8.1(react@18.3.1)': + '@react-types/radio@3.8.3(react@18.3.1)': dependencies: - '@react-types/shared': 3.23.1(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - '@react-types/searchfield@3.5.5(react@18.3.1)': + '@react-types/searchfield@3.5.8(react@18.3.1)': dependencies: - '@react-types/shared': 3.23.1(react@18.3.1) - '@react-types/textfield': 3.9.3(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@react-types/textfield': 3.9.6(react@18.3.1) react: 18.3.1 - '@react-types/select@3.9.4(react@18.3.1)': + '@react-types/select@3.9.6(react@18.3.1)': dependencies: - '@react-types/shared': 3.23.1(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 '@react-types/shared@3.23.1(react@18.3.1)': dependencies: react: 18.3.1 - '@react-types/slider@3.7.3(react@18.3.1)': + '@react-types/shared@3.24.1(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-types/slider@3.7.5(react@18.3.1)': dependencies: - '@react-types/shared': 3.23.1(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - '@react-types/switch@3.5.3(react@18.3.1)': + '@react-types/switch@3.5.5(react@18.3.1)': dependencies: - '@react-types/shared': 3.23.1(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - '@react-types/table@3.9.5(react@18.3.1)': + '@react-types/table@3.10.1(react@18.3.1)': dependencies: - '@react-types/grid': 3.2.6(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) + '@react-types/grid': 3.2.8(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - '@react-types/tabs@3.3.7(react@18.3.1)': + '@react-types/tabs@3.3.9(react@18.3.1)': dependencies: - '@react-types/shared': 3.23.1(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - '@react-types/textfield@3.9.3(react@18.3.1)': + '@react-types/textfield@3.9.6(react@18.3.1)': dependencies: - '@react-types/shared': 3.23.1(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - '@react-types/tooltip@3.4.9(react@18.3.1)': + '@react-types/tooltip@3.4.11(react@18.3.1)': dependencies: - '@react-types/overlays': 3.8.7(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) + '@react-types/overlays': 3.8.9(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 '@remix-run/router@1.17.0': {} @@ -10168,7 +10404,7 @@ snapshots: '@stripe/stripe-js@3.5.0': {} - '@swc/helpers@0.5.11': + '@swc/helpers@0.5.12': dependencies: tslib: 2.6.3 @@ -11014,7 +11250,7 @@ snapshots: archiver@5.3.2: dependencies: archiver-utils: 2.1.0 - async: 3.2.5 + async: 3.2.6 buffer-crc32: 0.2.13 readable-stream: 3.6.2 readdir-glob: 1.1.3 @@ -11117,6 +11353,8 @@ snapshots: async@3.2.5: {} + async@3.2.6: {} + asynckit@0.4.0: {} at-least-node@1.0.0: {} @@ -11214,6 +11452,14 @@ snapshots: node-releases: 2.0.14 update-browserslist-db: 1.0.16(browserslist@4.23.1) + browserslist@4.23.3: + dependencies: + caniuse-lite: 1.0.30001651 + electron-to-chromium: 1.5.12 + node-releases: 2.0.18 + update-browserslist-db: 1.1.0(browserslist@4.23.3) + optional: true + buffer-alloc-unsafe@1.1.0: {} buffer-alloc@1.2.0: @@ -11315,6 +11561,9 @@ snapshots: caniuse-lite@1.0.30001639: {} + caniuse-lite@1.0.30001651: + optional: true + capital-case@1.0.4: dependencies: no-case: 3.0.4 @@ -12004,6 +12253,9 @@ snapshots: electron-to-chromium@1.4.815: {} + electron-to-chromium@1.5.12: + optional: true + electron@31.2.0: dependencies: '@electron/get': 2.0.3 @@ -13819,6 +14071,9 @@ snapshots: node-releases@2.0.14: {} + node-releases@2.0.18: + optional: true + nopt@7.2.1: dependencies: abbrev: 2.0.0 @@ -14275,73 +14530,78 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-aria-components@1.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-aria-components@1.3.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@internationalized/date': 3.5.4 + '@internationalized/date': 3.5.5 '@internationalized/string': 3.2.3 - '@react-aria/color': 3.0.0-beta.33(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/focus': 3.17.1(react@18.3.1) - '@react-aria/interactions': 3.21.3(react@18.3.1) - '@react-aria/menu': 3.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/toolbar': 3.0.0-beta.5(react@18.3.1) - '@react-aria/tree': 3.0.0-alpha.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-stately/color': 3.6.1(react@18.3.1) - '@react-stately/menu': 3.7.1(react@18.3.1) - '@react-stately/table': 3.11.8(react@18.3.1) - '@react-stately/utils': 3.10.1(react@18.3.1) - '@react-types/color': 3.0.0-beta.25(react@18.3.1) - '@react-types/form': 3.7.4(react@18.3.1) - '@react-types/grid': 3.2.6(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@react-types/table': 3.9.5(react@18.3.1) - '@swc/helpers': 0.5.11 + '@react-aria/collections': 3.0.0-alpha.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/color': 3.0.0-rc.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/dnd': 3.7.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/focus': 3.18.2(react@18.3.1) + '@react-aria/interactions': 3.22.2(react@18.3.1) + '@react-aria/menu': 3.15.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/toolbar': 3.0.0-beta.8(react@18.3.1) + '@react-aria/tree': 3.0.0-alpha.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-aria/virtualizer': 4.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-stately/color': 3.7.2(react@18.3.1) + '@react-stately/layout': 4.0.2(react@18.3.1) + '@react-stately/menu': 3.8.2(react@18.3.1) + '@react-stately/table': 3.12.2(react@18.3.1) + '@react-stately/utils': 3.10.3(react@18.3.1) + '@react-stately/virtualizer': 4.0.2(react@18.3.1) + '@react-types/color': 3.0.0-rc.1(react@18.3.1) + '@react-types/form': 3.7.6(react@18.3.1) + '@react-types/grid': 3.2.8(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@react-types/table': 3.10.1(react@18.3.1) + '@swc/helpers': 0.5.12 client-only: 0.0.1 react: 18.3.1 - react-aria: 3.33.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-aria: 3.34.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-dom: 18.3.1(react@18.3.1) - react-stately: 3.31.1(react@18.3.1) + react-stately: 3.32.2(react@18.3.1) use-sync-external-store: 1.2.2(react@18.3.1) - react-aria@3.33.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-aria@3.34.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@internationalized/string': 3.2.3 - '@react-aria/breadcrumbs': 3.5.13(react@18.3.1) - '@react-aria/button': 3.9.5(react@18.3.1) - '@react-aria/calendar': 3.5.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/checkbox': 3.14.3(react@18.3.1) - '@react-aria/combobox': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/datepicker': 3.10.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/dialog': 3.5.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/dnd': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/focus': 3.17.1(react@18.3.1) - '@react-aria/gridlist': 3.8.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/i18n': 3.11.1(react@18.3.1) - '@react-aria/interactions': 3.21.3(react@18.3.1) - '@react-aria/label': 3.7.8(react@18.3.1) - '@react-aria/link': 3.7.1(react@18.3.1) - '@react-aria/listbox': 3.12.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/menu': 3.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/meter': 3.4.13(react@18.3.1) - '@react-aria/numberfield': 3.11.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/overlays': 3.22.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/progress': 3.4.13(react@18.3.1) - '@react-aria/radio': 3.10.4(react@18.3.1) - '@react-aria/searchfield': 3.7.5(react@18.3.1) - '@react-aria/select': 3.14.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/selection': 3.18.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/separator': 3.3.13(react@18.3.1) - '@react-aria/slider': 3.7.8(react@18.3.1) - '@react-aria/ssr': 3.9.4(react@18.3.1) - '@react-aria/switch': 3.6.4(react@18.3.1) - '@react-aria/table': 3.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/tabs': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/tag': 3.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/textfield': 3.14.5(react@18.3.1) - '@react-aria/tooltip': 3.7.4(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-aria/visually-hidden': 3.8.12(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) + '@react-aria/breadcrumbs': 3.5.16(react@18.3.1) + '@react-aria/button': 3.9.8(react@18.3.1) + '@react-aria/calendar': 3.5.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/checkbox': 3.14.6(react@18.3.1) + '@react-aria/combobox': 3.10.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/datepicker': 3.11.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/dialog': 3.5.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/dnd': 3.7.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/focus': 3.18.2(react@18.3.1) + '@react-aria/gridlist': 3.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/i18n': 3.12.2(react@18.3.1) + '@react-aria/interactions': 3.22.2(react@18.3.1) + '@react-aria/label': 3.7.11(react@18.3.1) + '@react-aria/link': 3.7.4(react@18.3.1) + '@react-aria/listbox': 3.13.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/menu': 3.15.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/meter': 3.4.16(react@18.3.1) + '@react-aria/numberfield': 3.11.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/overlays': 3.23.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/progress': 3.4.16(react@18.3.1) + '@react-aria/radio': 3.10.7(react@18.3.1) + '@react-aria/searchfield': 3.7.8(react@18.3.1) + '@react-aria/select': 3.14.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/selection': 3.19.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/separator': 3.4.2(react@18.3.1) + '@react-aria/slider': 3.7.11(react@18.3.1) + '@react-aria/ssr': 3.9.5(react@18.3.1) + '@react-aria/switch': 3.6.7(react@18.3.1) + '@react-aria/table': 3.15.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/tabs': 3.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/tag': 3.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/textfield': 3.14.8(react@18.3.1) + '@react-aria/tooltip': 3.7.7(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-aria/visually-hidden': 3.8.15(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -14378,31 +14638,31 @@ snapshots: '@remix-run/router': 1.17.0 react: 18.3.1 - react-stately@3.31.1(react@18.3.1): - dependencies: - '@react-stately/calendar': 3.5.1(react@18.3.1) - '@react-stately/checkbox': 3.6.5(react@18.3.1) - '@react-stately/collections': 3.10.7(react@18.3.1) - '@react-stately/combobox': 3.8.4(react@18.3.1) - '@react-stately/data': 3.11.4(react@18.3.1) - '@react-stately/datepicker': 3.9.4(react@18.3.1) - '@react-stately/dnd': 3.3.1(react@18.3.1) - '@react-stately/form': 3.0.3(react@18.3.1) - '@react-stately/list': 3.10.5(react@18.3.1) - '@react-stately/menu': 3.7.1(react@18.3.1) - '@react-stately/numberfield': 3.9.3(react@18.3.1) - '@react-stately/overlays': 3.6.7(react@18.3.1) - '@react-stately/radio': 3.10.4(react@18.3.1) - '@react-stately/searchfield': 3.5.3(react@18.3.1) - '@react-stately/select': 3.6.4(react@18.3.1) - '@react-stately/selection': 3.15.1(react@18.3.1) - '@react-stately/slider': 3.5.4(react@18.3.1) - '@react-stately/table': 3.11.8(react@18.3.1) - '@react-stately/tabs': 3.6.6(react@18.3.1) - '@react-stately/toggle': 3.7.4(react@18.3.1) - '@react-stately/tooltip': 3.4.9(react@18.3.1) - '@react-stately/tree': 3.8.1(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) + react-stately@3.32.2(react@18.3.1): + dependencies: + '@react-stately/calendar': 3.5.4(react@18.3.1) + '@react-stately/checkbox': 3.6.8(react@18.3.1) + '@react-stately/collections': 3.10.9(react@18.3.1) + '@react-stately/combobox': 3.9.2(react@18.3.1) + '@react-stately/data': 3.11.6(react@18.3.1) + '@react-stately/datepicker': 3.10.2(react@18.3.1) + '@react-stately/dnd': 3.4.2(react@18.3.1) + '@react-stately/form': 3.0.5(react@18.3.1) + '@react-stately/list': 3.10.8(react@18.3.1) + '@react-stately/menu': 3.8.2(react@18.3.1) + '@react-stately/numberfield': 3.9.6(react@18.3.1) + '@react-stately/overlays': 3.6.10(react@18.3.1) + '@react-stately/radio': 3.10.7(react@18.3.1) + '@react-stately/searchfield': 3.5.6(react@18.3.1) + '@react-stately/select': 3.6.7(react@18.3.1) + '@react-stately/selection': 3.16.2(react@18.3.1) + '@react-stately/slider': 3.5.7(react@18.3.1) + '@react-stately/table': 3.12.2(react@18.3.1) + '@react-stately/tabs': 3.6.9(react@18.3.1) + '@react-stately/toggle': 3.7.7(react@18.3.1) + '@react-stately/tooltip': 3.4.12(react@18.3.1) + '@react-stately/tree': 3.8.4(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 react-toastify@9.1.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): @@ -14657,6 +14917,9 @@ snapshots: semver@7.6.2: {} + semver@7.6.3: + optional: true + sentence-case@3.0.4: dependencies: no-case: 3.0.4 @@ -15249,6 +15512,13 @@ snapshots: escalade: 3.1.2 picocolors: 1.0.1 + update-browserslist-db@1.1.0(browserslist@4.23.3): + dependencies: + browserslist: 4.23.3 + escalade: 3.1.2 + picocolors: 1.0.1 + optional: true + upper-case-first@2.0.2: dependencies: tslib: 2.6.3 From 6c5dc08cf5a5649b84b843304d4c2da2697795f1 Mon Sep 17 00:00:00 2001 From: somebody1234 Date: Wed, 21 Aug 2024 12:26:50 +1000 Subject: [PATCH 15/49] Migrate ActivityLogSettingsSection to DatePicker --- .../src/assets/folder_arrow_double.svg | 8 - .../AriaComponents/Form/components/types.ts | 5 +- .../Inputs/DatePicker/DatePicker.tsx | 26 +- app/dashboard/src/components/DateInput.tsx | 262 ------------------ .../Settings/ActivityLogSettingsSection.tsx | 70 ++--- .../layouts/Settings/SettingsAriaInput.tsx | 15 +- .../authentication/AuthenticationPage.tsx | 17 +- 7 files changed, 67 insertions(+), 336 deletions(-) delete mode 100644 app/dashboard/src/assets/folder_arrow_double.svg delete mode 100644 app/dashboard/src/components/DateInput.tsx diff --git a/app/dashboard/src/assets/folder_arrow_double.svg b/app/dashboard/src/assets/folder_arrow_double.svg deleted file mode 100644 index 948ea85c83ec..000000000000 --- a/app/dashboard/src/assets/folder_arrow_double.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/dashboard/src/components/AriaComponents/Form/components/types.ts b/app/dashboard/src/components/AriaComponents/Form/components/types.ts index d35a90fbef5c..9d60651847b5 100644 --- a/app/dashboard/src/components/AriaComponents/Form/components/types.ts +++ b/app/dashboard/src/components/AriaComponents/Form/components/types.ts @@ -53,10 +53,7 @@ export interface UseFormReturn * Form state type. * @alias reactHookForm.FormState */ -export type FormState< - Schema extends TSchema, - TFieldValues extends FieldValues, -> = reactHookForm.FormState +export type FormState = reactHookForm.FormState> /** * Form instance type diff --git a/app/dashboard/src/components/AriaComponents/Inputs/DatePicker/DatePicker.tsx b/app/dashboard/src/components/AriaComponents/Inputs/DatePicker/DatePicker.tsx index 71ee1a4281cc..1da9e4963229 100644 --- a/app/dashboard/src/components/AriaComponents/Inputs/DatePicker/DatePicker.tsx +++ b/app/dashboard/src/components/AriaComponents/Inputs/DatePicker/DatePicker.tsx @@ -35,12 +35,22 @@ import { } from '#/components/AriaComponents' import { forwardRef } from '#/utilities/react' import { Controller } from 'react-hook-form' -import { tv } from 'tailwind-variants' +import { tv, VariantProps } from 'tailwind-variants' const DATE_PICKER_STYLES = tv({ base: '', + variants: { + size: { + small: { + inputGroup: 'h-6 px-2', + }, + medium: { + inputGroup: 'h-8 px-4', + }, + }, + }, slots: { - inputGroup: 'flex items-center h-8 gap-2 rounded-full border-0.5 border-primary/20 px-4', + inputGroup: 'flex items-center gap-2 rounded-full border-0.5 border-primary/20', dateInput: 'flex', dateSegment: 'rounded placeholder-shown:text-primary/30 focus:bg-primary/10 px-[0.5px]', calendarPopover: 'w-0', @@ -55,6 +65,9 @@ const DATE_PICKER_STYLES = tv({ calendarGridCell: 'text-center px-1 rounded hover:bg-primary/10 outside-visible-range:text-primary/30', }, + defaultVariants: { + size: 'medium', + }, }) /** Props for a {@link DatePicker}. */ @@ -68,7 +81,8 @@ export interface DatePickerProps, FieldProps, - Pick, 'className' | 'style'> { + Pick, 'className' | 'style'>, + VariantProps { readonly noCalendarHeader?: boolean readonly segments?: Partial> } @@ -87,6 +101,8 @@ export const DatePicker = forwardRef(function DatePicker< defaultValue, label, isRequired, + className, + size, } = props const { fieldState, formInstance } = Form.useField({ @@ -96,7 +112,7 @@ export const DatePicker = forwardRef(function DatePicker< defaultValue, }) - const classes = DATE_PICKER_STYLES({}) + const classes = DATE_PICKER_STYLES({ className, size }) return (