remove react select (#1367)

Co-authored-by: Elizabet Oliveira <elizabet.oliveira@clickhouse.com>
This commit is contained in:
Brandon Pereira 2025-11-14 13:36:10 -07:00 committed by GitHub
parent af6a8d0dac
commit 44a6a08a29
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 37 additions and 460 deletions

View file

@ -0,0 +1,5 @@
---
"@hyperdx/app": patch
---
Remove react-select for mantine

View file

@ -86,7 +86,6 @@
"react-markdown": "^8.0.4",
"react-papaparse": "^4.4.0",
"react-query": "^3.39.3",
"react-select": "^5.7.0",
"react-sortable-hoc": "^2.0.0",
"react-useportal": "^1.0.18",
"recharts": "^2.12.7",

View file

@ -1,6 +1,5 @@
import { useMemo, useRef } from 'react';
import { add } from 'date-fns';
import Select from 'react-select';
import { z } from 'zod';
import {
filterColumnMetaByType,
@ -197,33 +196,6 @@ export function seriesToUrlSearchQueryParam({
});
}
export function TableSelect({
table,
setTableAndAggFn,
}: {
setTableAndAggFn: (table: SourceTable, fn: AggFn) => void;
table: string;
}) {
return (
<Select
options={TABLES}
className="ds-select w-auto text-nowrap"
value={TABLES.find(v => v.value === table)}
onChange={opt => {
const val = opt?.value ?? 'logs';
if (val === 'logs') {
setTableAndAggFn('logs', 'count');
} else if (val === 'metrics') {
// TODO: This should set rate if metric field is a sum
// or we should just reset the field if changing tables
setTableAndAggFn('metrics', 'max');
}
}}
classNamePrefix="ds-react-select"
/>
);
}
export function TableToggle({
table,
setTableAndAggFn,

View file

@ -1,26 +0,0 @@
import Select from 'react-select';
export default function DSSelect<
Option extends { value: string | undefined; label: React.ReactNode },
>({
options,
value,
onChange,
disabled,
}: {
options: Option[];
disabled?: boolean;
value: string | undefined;
onChange: (value: Option['value'] | undefined) => void;
}) {
return (
<Select
isDisabled={disabled}
options={options}
className="ds-select"
value={options.find(v => v.value === value)}
onChange={newValue => onChange(newValue?.value)}
classNamePrefix="ds-react-select"
/>
);
}

View file

@ -1,8 +1,8 @@
import { memo } from 'react';
import { useController, UseControllerProps } from 'react-hook-form';
import { Select } from '@mantine/core';
import { Granularity } from './ChartUtils';
import DSSelect from './DSSelect';
export default function GranularityPicker({
value,
@ -14,9 +14,9 @@ export default function GranularityPicker({
disabled?: boolean;
}) {
return (
<DSSelect
<Select
disabled={disabled}
options={[
data={[
{
value: 'auto' as const,
label: 'Auto Granularity',
@ -58,7 +58,9 @@ export default function GranularityPicker({
label: '7 Day Granularity',
},
]}
onChange={onChange}
onChange={v =>
onChange((v ?? undefined) as Granularity | 'auto' | undefined)
}
value={value}
/>
);

View file

@ -1,144 +0,0 @@
import React, { MouseEventHandler, useMemo } from 'react';
import {
components,
MultiValueGenericProps,
MultiValueProps,
OnChangeValue,
Props,
} from 'react-select';
import AsyncSelect from 'react-select/async';
import {
SortableContainer,
SortableContainerProps,
SortableElement,
SortableHandle,
SortEndHandler,
} from 'react-sortable-hoc';
import api from '@/api';
import { useColumns } from '@/hooks/useMetadata';
// import { usePropertyOptions } from './ChartUtils';
function arrayMove<T>(array: readonly T[], from: number, to: number) {
const slicedArray = array.slice();
slicedArray.splice(
to < 0 ? array.length + to : to,
0,
slicedArray.splice(from, 1)[0],
);
return slicedArray;
}
const SortableMultiValue = SortableElement(
(props: MultiValueProps<{ value: string; label: string }, true>) => {
// this prevents the menu from being opened/closed when the user clicks
// on a value to begin dragging it. ideally, detecting a click (instead of
// a drag) would still focus the control and toggle the menu, but that
// requires some magic with refs that are out of scope for this example
const onMouseDown: MouseEventHandler<HTMLDivElement> = e => {
e.preventDefault();
e.stopPropagation();
};
const innerProps = { ...props.innerProps, onMouseDown };
return <components.MultiValue {...props} innerProps={innerProps} />;
},
);
const SortableMultiValueLabel = SortableHandle(
(props: MultiValueGenericProps<{ value: string; label: string }, true>) => (
<components.MultiValueLabel {...props} />
),
);
const SortableSelect = SortableContainer(AsyncSelect) as React.ComponentClass<
Props<{ value: string; label: string }, true> & SortableContainerProps
>;
export default function DBColumnMultiSelect({
values,
setValues,
database,
connectionId,
table,
}: {
database: string | undefined;
table: string | undefined;
connectionId: string | undefined;
values: string[];
setValues: (value: string[]) => void;
}) {
const { data: columns } = useColumns({
databaseName: database ?? '',
tableName: table ?? '',
connectionId: connectionId ?? '',
});
const propertyOptions = (columns ?? []).map((column: { name: string }) => ({
value: column.name,
label: column.name,
}));
const onChange = (
selectedOptions: OnChangeValue<(typeof propertyOptions)[number], true>,
) => setValues(selectedOptions.map(o => o.value));
const onSortEnd: SortEndHandler = ({
oldIndex,
newIndex,
}: {
oldIndex: number;
newIndex: number;
}) => {
const newValue = arrayMove(values, oldIndex, newIndex);
setValues(newValue);
};
return (
<SortableSelect
className="ds-select"
classNamePrefix="ds-react-select"
// @ts-ignore I don't think it's understanding we're using async select here
loadOptions={(input: string) => {
return Promise.resolve([
{ value: undefined, label: 'None' },
...propertyOptions
.filter(v =>
input.length > 0
? v.value.toLowerCase().includes(input.toLowerCase())
: true,
)
.slice(0, 1000), // TODO: better surface too many results... somehow?
]);
}}
defaultOptions={[
{ value: undefined, label: 'None' },
...propertyOptions
// Filter out index properties on initial dropdown
.filter(v => v.value.match(/\.\d+(\.|$)/) == null)
.slice(0, 1000), // TODO: better surface too many results... somehow?
]}
useDragHandle
// react-sortable-hoc props:
axis="xy"
onSortEnd={onSortEnd}
distance={4}
// small fix for https://github.com/clauderic/react-sortable-hoc/pull/352:
getHelperDimensions={({ node }) => node.getBoundingClientRect()}
// react-select props:
isMulti
value={values.flatMap(v => {
const propertyOption = propertyOptions.find(o => o.value === v);
return propertyOption != null ? [propertyOption] : [];
})}
onChange={onChange}
components={{
// @ts-ignore
MultiValue: SortableMultiValue,
// @ts-ignore
MultiValueLabel: SortableMultiValueLabel,
}}
closeMenuOnSelect={false}
/>
);
}

View file

@ -35,7 +35,7 @@
text-transform: uppercase;
font-size: 11px;
letter-spacing: 1px;
margin-bottom: 2x;
margin-bottom: 2px;
margin-top: 6px;
padding-left: 16px;
width: 100%;

View file

@ -180,69 +180,6 @@ body {
}
}
.ds-select {
&.w-auto {
.ds-react-select__menu {
width: auto;
}
}
&.text-nowrap {
.ds-react-select__option {
text-wrap: nowrap;
}
}
&.input-bg .ds-react-select__control {
background: var(--color-bg-field);
}
.ds-react-select__control {
background: var(--color-bg-field);
border: 1px solid var(--color-border);
}
.ds-react-select__menu {
background: var(--color-bg-field);
border: 1px solid var(--color-border);
}
.ds-react-select__option {
color: var(--color-text);
}
.ds-react-select__option--is-focused {
background: var(--color-bg-muted);
}
.ds-react-select__option--is-selected {
background: var(--color-bg-muted);
}
.ds-react-select__multi-value {
background: var(--color-bg-field);
.ds-react-select__multi-value__label {
color: var(--color-text);
}
}
.ds-react-select__indicator-separator {
width: 0;
}
.ds-react-select__indicator {
color: var(--color-text-muted);
}
.ds-react-select__input-container,
.ds-react-select__placeholder,
.ds-react-select__single-value {
// @apply text-neutral-600 dark:text-neutral-200;
color: var(--color-text);
// background: $bg-dark;
background: transparent;
}
}
// React Grid for Dashboarding
.react-grid-item.react-grid-placeholder {
// Override the default placeholder color from red

View file

@ -54,6 +54,7 @@ test.describe('Multiline Input', { tag: '@search' }, () => {
page: Page,
editor: Locator,
additionalLines: string[],
mode: EditorConfig['mode'],
) => {
const initialBox = await editor.boundingBox();
const initialHeight = initialBox?.height || 0;
@ -61,11 +62,11 @@ test.describe('Multiline Input', { tag: '@search' }, () => {
// Add more content
for (const line of additionalLines) {
await editor.press('Shift+Enter');
await editor.type(line);
await editor.pressSequentially(line);
}
// Wait for potential height changes to take effect
await page.waitForTimeout(200);
await page.waitForTimeout(500);
const expandedBox = await editor.boundingBox();
const expandedHeight = expandedBox?.height || 0;
@ -77,16 +78,24 @@ test.describe('Multiline Input', { tag: '@search' }, () => {
`Height did not expand: initial=${initialHeight}, final=${expandedHeight}`,
);
// Fallback: verify that content was actually added (multiline functionality works)
const content = await editor.textContent();
const inputValue = await editor.inputValue().catch(() => null);
const actualContent = content || inputValue || '';
// For SQL - its rendered in CodeMirror, we can check line count through its DOM
if (mode === 'SQL') {
const numLines = await editor.evaluate(
node => node.querySelectorAll('.cm-line').length,
);
expect(numLines).toBeGreaterThan(1);
// For Lucene - fallback to checking the value of the textarea
} else {
const content = await editor.textContent();
const inputValue = await editor.inputValue().catch(() => null);
const actualContent = content || inputValue || '';
// Check that we have multiple lines of content
const lineCount = actualContent
.split('\n')
.filter(line => line.trim()).length;
expect(lineCount).toBeGreaterThan(1);
// Check that we have multiple lines of content
const lineCount = actualContent
.split('\n')
.filter(line => line.trim()).length;
expect(lineCount).toBeGreaterThan(1);
}
} else {
expect(expandedHeight).toBeGreaterThan(initialHeight);
}
@ -151,7 +160,7 @@ test.describe('Multiline Input', { tag: '@search' }, () => {
'user_id:* AND session_id:exists',
];
await testHeightExpansion(page, editor, additionalLines);
await testHeightExpansion(page, editor, additionalLines, config.mode);
});
// SQL-specific max height test

185
yarn.lock
View file

@ -2750,7 +2750,7 @@ __metadata:
languageName: node
linkType: hard
"@babel/runtime@npm:^7.12.0, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.16.7, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.2.0, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.2, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2":
"@babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.16.7, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.2.0, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.2, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2":
version: 7.21.0
resolution: "@babel/runtime@npm:7.21.0"
dependencies:
@ -3469,25 +3469,6 @@ __metadata:
languageName: node
linkType: hard
"@emotion/babel-plugin@npm:^11.10.6":
version: 11.10.6
resolution: "@emotion/babel-plugin@npm:11.10.6"
dependencies:
"@babel/helper-module-imports": "npm:^7.16.7"
"@babel/runtime": "npm:^7.18.3"
"@emotion/hash": "npm:^0.9.0"
"@emotion/memoize": "npm:^0.8.0"
"@emotion/serialize": "npm:^1.1.1"
babel-plugin-macros: "npm:^3.1.0"
convert-source-map: "npm:^1.5.0"
escape-string-regexp: "npm:^4.0.0"
find-root: "npm:^1.1.0"
source-map: "npm:^0.5.7"
stylis: "npm:4.1.3"
checksum: 10c0/734ab5d59f8a64ec2cb140f71483f74910ada115bf78ce5b645a9e3e379554ffd79045edb74efb8c1d8f856ef4d302bf8ac59b969b1cc28dedcd5000072e63ce
languageName: node
linkType: hard
"@emotion/babel-plugin@npm:^11.12.0":
version: 11.12.0
resolution: "@emotion/babel-plugin@npm:11.12.0"
@ -3507,19 +3488,6 @@ __metadata:
languageName: node
linkType: hard
"@emotion/cache@npm:^11.10.5, @emotion/cache@npm:^11.4.0":
version: 11.10.5
resolution: "@emotion/cache@npm:11.10.5"
dependencies:
"@emotion/memoize": "npm:^0.8.0"
"@emotion/sheet": "npm:^1.2.1"
"@emotion/utils": "npm:^1.2.0"
"@emotion/weak-memoize": "npm:^0.3.0"
stylis: "npm:4.1.3"
checksum: 10c0/eeb6891ab04cf17ace0e175742550b97c30df777d6c5b145e91c4c9fbd783c29b4dabe12a8c786b78f37176313a8295c9b90c69d875e6caab5f7e4677a18be91
languageName: node
linkType: hard
"@emotion/cache@npm:^11.13.0":
version: 11.13.1
resolution: "@emotion/cache@npm:11.13.1"
@ -3533,13 +3501,6 @@ __metadata:
languageName: node
linkType: hard
"@emotion/hash@npm:^0.9.0":
version: 0.9.0
resolution: "@emotion/hash@npm:0.9.0"
checksum: 10c0/0910d3e9ec46cc780f691c96fb6f6f67b4f080b50ecf4f441bc4b33b5906e28099f530a368fe0b31c6bad38a857ac44df3c36f8978be603789d71330ac01af12
languageName: node
linkType: hard
"@emotion/hash@npm:^0.9.2":
version: 0.9.2
resolution: "@emotion/hash@npm:0.9.2"
@ -3556,13 +3517,6 @@ __metadata:
languageName: node
linkType: hard
"@emotion/memoize@npm:^0.8.0":
version: 0.8.0
resolution: "@emotion/memoize@npm:0.8.0"
checksum: 10c0/246087ec09b32b295af67a094253831f398aabd953d03d14f186acb8607ed2a755e944f5e20b5ccebb461f15c2e5ccbf8fe977bcf3be951cf10961c504e1e65b
languageName: node
linkType: hard
"@emotion/memoize@npm:^0.9.0":
version: 0.9.0
resolution: "@emotion/memoize@npm:0.9.0"
@ -3591,40 +3545,6 @@ __metadata:
languageName: node
linkType: hard
"@emotion/react@npm:^11.8.1":
version: 11.10.6
resolution: "@emotion/react@npm:11.10.6"
dependencies:
"@babel/runtime": "npm:^7.18.3"
"@emotion/babel-plugin": "npm:^11.10.6"
"@emotion/cache": "npm:^11.10.5"
"@emotion/serialize": "npm:^1.1.1"
"@emotion/use-insertion-effect-with-fallbacks": "npm:^1.0.0"
"@emotion/utils": "npm:^1.2.0"
"@emotion/weak-memoize": "npm:^0.3.0"
hoist-non-react-statics: "npm:^3.3.1"
peerDependencies:
react: ">=16.8.0"
peerDependenciesMeta:
"@types/react":
optional: true
checksum: 10c0/4c5ce8ef279a8ce0d371414720d9b2b195ce6b30abf82d99a856ef3b7dc8643f8a32b9b01fded35d94ab9159e4982f7eb0ffa3c4b1aabb102180383e56232bcf
languageName: node
linkType: hard
"@emotion/serialize@npm:^1.1.1":
version: 1.1.1
resolution: "@emotion/serialize@npm:1.1.1"
dependencies:
"@emotion/hash": "npm:^0.9.0"
"@emotion/memoize": "npm:^0.8.0"
"@emotion/unitless": "npm:^0.8.0"
"@emotion/utils": "npm:^1.2.0"
csstype: "npm:^3.0.2"
checksum: 10c0/ea353abbf530ede8b74fe4df30eb626f245f710ce0bfcb9d34e72630a1dede688fddf02b1143f33a1a4ef5b66b70715a3c1cd6a12ec43f5b585ed60d4f3e8712
languageName: node
linkType: hard
"@emotion/serialize@npm:^1.2.0, @emotion/serialize@npm:^1.3.0, @emotion/serialize@npm:^1.3.1":
version: 1.3.2
resolution: "@emotion/serialize@npm:1.3.2"
@ -3638,13 +3558,6 @@ __metadata:
languageName: node
linkType: hard
"@emotion/sheet@npm:^1.2.1":
version: 1.2.1
resolution: "@emotion/sheet@npm:1.2.1"
checksum: 10c0/88268c00005d310df3ebb249b839ad0b234943da5a0cc614b232b9bd4ae600292dca9b0f61c45cde3a592c77459e880d77a2aa73af20ec3c0d579afccc3f71af
languageName: node
linkType: hard
"@emotion/sheet@npm:^1.4.0":
version: 1.4.0
resolution: "@emotion/sheet@npm:1.4.0"
@ -3679,22 +3592,6 @@ __metadata:
languageName: node
linkType: hard
"@emotion/unitless@npm:^0.8.0":
version: 0.8.0
resolution: "@emotion/unitless@npm:0.8.0"
checksum: 10c0/1f2cfb7c0ccb83c20b1c6d8d92a74a93da4b2a440f9a0d49ded08647faf299065a2ffde17e1335920fa10397b85f8635bbfe14f3cd29222a59ea81d978478072
languageName: node
linkType: hard
"@emotion/use-insertion-effect-with-fallbacks@npm:^1.0.0":
version: 1.0.0
resolution: "@emotion/use-insertion-effect-with-fallbacks@npm:1.0.0"
peerDependencies:
react: ">=16.8.0"
checksum: 10c0/0c5fbd36a4f416a5abaf428ba3dca6e79018c4c74016ecb4e3991a11cf8b5dbd306d7770fee09692971335e33f97e3b555deda595e5ae7831841505078bd07d7
languageName: node
linkType: hard
"@emotion/use-insertion-effect-with-fallbacks@npm:^1.0.1":
version: 1.0.1
resolution: "@emotion/use-insertion-effect-with-fallbacks@npm:1.0.1"
@ -3713,13 +3610,6 @@ __metadata:
languageName: node
linkType: hard
"@emotion/utils@npm:^1.2.0":
version: 1.2.0
resolution: "@emotion/utils@npm:1.2.0"
checksum: 10c0/7051cec83bb49688549667484058d3a19a30001fa3692c23f7a2e727c05121f952854e1196feb9ece4fa36914705ebf474edba833a2178bdc133c654b5e3ca7d
languageName: node
linkType: hard
"@emotion/utils@npm:^1.4.0, @emotion/utils@npm:^1.4.1":
version: 1.4.1
resolution: "@emotion/utils@npm:1.4.1"
@ -3727,13 +3617,6 @@ __metadata:
languageName: node
linkType: hard
"@emotion/weak-memoize@npm:^0.3.0":
version: 0.3.0
resolution: "@emotion/weak-memoize@npm:0.3.0"
checksum: 10c0/1771687cc3b3280371de12698f1b78756c64654fc7d15ce76e1fb5d4adf9fd49d4411e41276bbfd5b521ef9cef647196aa9dca26f936c466fb80bf48491fa844
languageName: node
linkType: hard
"@emotion/weak-memoize@npm:^0.4.0":
version: 0.4.0
resolution: "@emotion/weak-memoize@npm:0.4.0"
@ -4161,13 +4044,6 @@ __metadata:
languageName: node
linkType: hard
"@floating-ui/core@npm:^1.2.3":
version: 1.2.3
resolution: "@floating-ui/core@npm:1.2.3"
checksum: 10c0/978c517a20a55e74ef14170d50ca5eeddd65360b190593b8e042bfe759106eb59aadc965a47f4c2bfbe44ef7f7d146a27bb9b8348b12abb55371e878d1033be5
languageName: node
linkType: hard
"@floating-ui/core@npm:^1.6.0":
version: 1.6.0
resolution: "@floating-ui/core@npm:1.6.0"
@ -4177,15 +4053,6 @@ __metadata:
languageName: node
linkType: hard
"@floating-ui/dom@npm:^1.0.1":
version: 1.2.4
resolution: "@floating-ui/dom@npm:1.2.4"
dependencies:
"@floating-ui/core": "npm:^1.2.3"
checksum: 10c0/e58c0a8819e7205df0e8f609dbfbeb487add9ba2ee016b0f874b7dca0377a231cccfd76a8e5a97b47408eeb06f4c7685f97e767abee5fd4f2a502262689de477
languageName: node
linkType: hard
"@floating-ui/dom@npm:^1.6.1":
version: 1.6.1
resolution: "@floating-ui/dom@npm:1.6.1"
@ -4499,7 +4366,6 @@ __metadata:
react-markdown: "npm:^8.0.4"
react-papaparse: "npm:^4.4.0"
react-query: "npm:^3.39.3"
react-select: "npm:^5.7.0"
react-sortable-hoc: "npm:^2.0.0"
react-useportal: "npm:^1.0.18"
recharts: "npm:^2.12.7"
@ -10359,15 +10225,6 @@ __metadata:
languageName: node
linkType: hard
"@types/react-transition-group@npm:^4.4.0":
version: 4.4.5
resolution: "@types/react-transition-group@npm:4.4.5"
dependencies:
"@types/react": "npm:*"
checksum: 10c0/c0d81634ca5e1efac3ca6f6f006245976d584833ab9e933edf08b66551c1c7b9f0bc7878897f57ba44b137d3754583d623c932fe4b7721840ae5218ec2414942
languageName: node
linkType: hard
"@types/react@npm:18.3.1":
version: 18.3.1
resolution: "@types/react@npm:18.3.1"
@ -20912,13 +20769,6 @@ __metadata:
languageName: node
linkType: hard
"memoize-one@npm:^6.0.0":
version: 6.0.0
resolution: "memoize-one@npm:6.0.0"
checksum: 10c0/45c88e064fd715166619af72e8cf8a7a17224d6edf61f7a8633d740ed8c8c0558a4373876c9b8ffc5518c2b65a960266adf403cc215cb1e90f7e262b58991f54
languageName: node
linkType: hard
"memoizerific@npm:^1.11.3":
version: 1.11.3
resolution: "memoizerific@npm:1.11.3"
@ -24077,7 +23927,7 @@ __metadata:
languageName: node
linkType: hard
"prop-types@npm:15.x, prop-types@npm:^15.0.0, prop-types@npm:^15.5.7, prop-types@npm:^15.6.0, prop-types@npm:^15.6.2, prop-types@npm:^15.7.2, prop-types@npm:^15.8.1":
"prop-types@npm:15.x, prop-types@npm:^15.0.0, prop-types@npm:^15.5.7, prop-types@npm:^15.6.2, prop-types@npm:^15.7.2, prop-types@npm:^15.8.1":
version: 15.8.1
resolution: "prop-types@npm:15.8.1"
dependencies:
@ -24820,26 +24670,6 @@ __metadata:
languageName: node
linkType: hard
"react-select@npm:^5.7.0":
version: 5.7.0
resolution: "react-select@npm:5.7.0"
dependencies:
"@babel/runtime": "npm:^7.12.0"
"@emotion/cache": "npm:^11.4.0"
"@emotion/react": "npm:^11.8.1"
"@floating-ui/dom": "npm:^1.0.1"
"@types/react-transition-group": "npm:^4.4.0"
memoize-one: "npm:^6.0.0"
prop-types: "npm:^15.6.0"
react-transition-group: "npm:^4.3.0"
use-isomorphic-layout-effect: "npm:^1.1.2"
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
checksum: 10c0/5ab64144930245cabedd08a399deaa35a19281163b0d4637811ae1cffd3b9ba45090d640c4f3ab95864229d07509fbdee69e960d074ad22dbacb223d21876443
languageName: node
linkType: hard
"react-simple-animate@npm:^3.3.12":
version: 3.5.2
resolution: "react-simple-animate@npm:3.5.2"
@ -24908,7 +24738,7 @@ __metadata:
languageName: node
linkType: hard
"react-transition-group@npm:4.4.5, react-transition-group@npm:^4.3.0, react-transition-group@npm:^4.4.5":
"react-transition-group@npm:4.4.5, react-transition-group@npm:^4.4.5":
version: 4.4.5
resolution: "react-transition-group@npm:4.4.5"
dependencies:
@ -27214,13 +27044,6 @@ __metadata:
languageName: node
linkType: hard
"stylis@npm:4.1.3":
version: 4.1.3
resolution: "stylis@npm:4.1.3"
checksum: 10c0/3e4670f26f79bcfba628dcc2756d9d415edfcbf4ec51e40f3b628fd15286222257317cad57390752964eba85cca6163a7621ce90038d68dd630a674479e52334
languageName: node
linkType: hard
"stylis@npm:4.2.0":
version: 4.2.0
resolution: "stylis@npm:4.2.0"
@ -28878,7 +28701,7 @@ __metadata:
languageName: node
linkType: hard
"use-isomorphic-layout-effect@npm:^1.1.1, use-isomorphic-layout-effect@npm:^1.1.2":
"use-isomorphic-layout-effect@npm:^1.1.1":
version: 1.1.2
resolution: "use-isomorphic-layout-effect@npm:1.1.2"
peerDependencies: