diff --git a/apps/client/package.json b/apps/client/package.json index 73bf13488..1d81d0247 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -3,7 +3,7 @@ "version": "2.0.0-alpha", "private": true, "dependencies": { - "@chakra-ui/react": "^2.4.5", + "@chakra-ui/react": "^2.5.1", "@dnd-kit/core": "^6.0.6", "@dnd-kit/sortable": "^7.0.1", "@dnd-kit/utilities": "^3.2.1", @@ -12,8 +12,8 @@ "@react-icons/all-files": "^4.1.0", "@sentry/react": "^7.28.1", "@sentry/tracing": "^7.24.1", - "@tanstack/react-query": "^4.18.0", - "@tanstack/react-query-devtools": "^4.18.0", + "@tanstack/react-query": "^4.26.1", + "@tanstack/react-query-devtools": "^4.26.1", "autosize": "^5.0.2", "axios": "^1.2.0", "color": "^4.2.3", @@ -26,7 +26,7 @@ "react-beautiful-dnd": "^13.1.1", "react-dom": "^18.2.0", "react-fast-compare": "^3.2.0", - "react-hook-form": "^7.43.1", + "react-hook-form": "^7.43.5", "react-qr-code": "^2.0.11", "react-router-dom": "^6.3.0", "react-table": "^7.7.0", @@ -59,7 +59,7 @@ }, "devDependencies": { "@sentry/vite-plugin": "^0.3.0", - "@tanstack/eslint-plugin-query": "^4.15.1", + "@tanstack/eslint-plugin-query": "^4.26.2", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.1.1", "@testing-library/user-event": "^14.1.1", diff --git a/apps/client/src/common/hooks-query/useOscSettings.ts b/apps/client/src/common/hooks-query/useOscSettings.ts index 77fdb3b3b..4e58c0e33 100644 --- a/apps/client/src/common/hooks-query/useOscSettings.ts +++ b/apps/client/src/common/hooks-query/useOscSettings.ts @@ -1,9 +1,11 @@ -import { useQuery } from '@tanstack/react-query'; +import { useMutation, useQuery } from '@tanstack/react-query'; +import { OSCSettings } from 'ontime-types'; import { queryRefetchIntervalSlow } from '../../ontimeConfig'; import { OSC_SETTINGS } from '../api/apiConstants'; -import { getOSC } from '../api/ontimeApi'; +import { getOSC, postOSC } from '../api/ontimeApi'; import { oscPlaceholderSettings } from '../models/OscSettings'; +import { ontimeQueryClient } from '../queryClient'; export default function useOscSettings() { const { data, status, isError, refetch } = useQuery({ @@ -11,10 +13,19 @@ export default function useOscSettings() { queryFn: getOSC, placeholderData: oscPlaceholderSettings, retry: 5, - retryDelay: (attempt) => attempt * 2500, + retryDelay: (attempt: number) => attempt * 2500, refetchInterval: queryRefetchIntervalSlow, networkMode: 'always', }); - return { data, status, isError, refetch }; + return { data: data! as unknown as OSCSettings, status, isError, refetch }; +} + +export function useOscSettingsMutation() { + const { isLoading, mutateAsync } = useMutation({ + mutationFn: postOSC, + onSuccess: (res) => ontimeQueryClient.setQueryData(OSC_SETTINGS, res.data), + onSettled: () => ontimeQueryClient.invalidateQueries({ queryKey: OSC_SETTINGS }), + }); + return { isLoading, mutateAsync }; } diff --git a/apps/client/src/common/models/OscSettings.ts b/apps/client/src/common/models/OscSettings.ts index caa5366b8..9c86368b0 100644 --- a/apps/client/src/common/models/OscSettings.ts +++ b/apps/client/src/common/models/OscSettings.ts @@ -12,5 +12,12 @@ export const oscPlaceholderSettings: PlaceholderSettings = { targetIP: '', enabledIn: false, enabledOut: false, - subscriptions: {}, + subscriptions: { + onLoad: [], + onStart: [], + onPause: [], + onStop: [], + onUpdate: [], + onFinish: [], + }, }; diff --git a/apps/client/src/common/stores/logger.ts b/apps/client/src/common/stores/logger.ts index dd57139c1..1b4e96eb2 100644 --- a/apps/client/src/common/stores/logger.ts +++ b/apps/client/src/common/stores/logger.ts @@ -40,7 +40,6 @@ export function useEmitLog() { text, }; - addLog(log); socketSendJson('ontime-log', log); }, []); diff --git a/apps/client/src/features/menu/MenuBar.tsx b/apps/client/src/features/menu/MenuBar.tsx index 97433e3ca..a15a7d1ca 100644 --- a/apps/client/src/features/menu/MenuBar.tsx +++ b/apps/client/src/features/menu/MenuBar.tsx @@ -119,6 +119,7 @@ export default function MenuBar(props: MenuBarProps) { clickHandler={() => actionHandler('max')} tooltip='Show full window' aria-label='Show full window' + isDisabled={!isElectron} /> actionHandler('min')} tooltip='Minimise to tray' aria-label='Minimise to tray' + isDisabled={!isElectron} />
- - - - - ); -} diff --git a/apps/client/src/features/modals/ModalWrapper.tsx b/apps/client/src/features/modals/ModalWrapper.tsx index 839695645..e417ac839 100644 --- a/apps/client/src/features/modals/ModalWrapper.tsx +++ b/apps/client/src/features/modals/ModalWrapper.tsx @@ -1,14 +1,5 @@ import { PropsWithChildren } from 'react'; -import { - Button, - Modal, - ModalCloseButton, - ModalContent, - ModalFooter, - ModalHeader, - ModalOverlay, -} from '@chakra-ui/react'; -import styles from './Modal.module.scss'; +import { Modal, ModalCloseButton, ModalContent, ModalHeader, ModalOverlay } from '@chakra-ui/react'; interface ModalWrapperProps { isOpen: boolean; diff --git a/apps/client/src/features/modals/integration-modal/IntegrationModal.tsx b/apps/client/src/features/modals/integration-modal/IntegrationModal.tsx index 95384f8e2..57a99cf7f 100644 --- a/apps/client/src/features/modals/integration-modal/IntegrationModal.tsx +++ b/apps/client/src/features/modals/integration-modal/IntegrationModal.tsx @@ -2,8 +2,8 @@ import { Tab, TabList, TabPanel, TabPanels, Tabs } from '@chakra-ui/react'; import ModalWrapper from '../ModalWrapper'; -import OscIntegrationSettings from './OscIntegrationSettings'; -import OscSettingsModal from './OscSettingsModal'; +import OscIntegration from './OscIntegration'; +import OscSettings from './OscSettings'; import styles from '../Modal.module.scss'; @@ -12,26 +12,30 @@ interface IntegrationModalProps { onClose: () => void; } +const oscDocsUrl = 'https://cpvalente.gitbook.io/ontime/control-and-feedback/osc'; + export default function IntegrationModal(props: IntegrationModalProps) { const { isOpen, onClose } = props; return (
- Manage settings related to protocol integrations.
- Changes take effect on app restart. + Manage settings related to protocol integrations + + Read the docs +
OSC - Old OSC + OSC Integration - + - + diff --git a/apps/client/src/features/modals/integration-modal/OntimeModalFooter.tsx b/apps/client/src/features/modals/integration-modal/OntimeModalFooter.tsx new file mode 100644 index 000000000..a69257e8c --- /dev/null +++ b/apps/client/src/features/modals/integration-modal/OntimeModalFooter.tsx @@ -0,0 +1,37 @@ +import { Button, ModalFooter } from '@chakra-ui/react'; + +import styles from '../Modal.module.scss'; + +interface OntimeModalFooterProps { + formId: string; + handleRevert: () => void; + isDirty: boolean; + isValid: boolean; + isSubmitting: boolean; +} + +export default function OntimeModalFooter(props: OntimeModalFooterProps) { + const { formId, handleRevert, isDirty, isValid, isSubmitting } = props; + + const disableRevert = !isDirty; + const disableSubmit = isSubmitting || !isDirty || !isValid; + + return ( + + + + + ); +} diff --git a/apps/client/src/features/modals/integration-modal/OscIntegration.tsx b/apps/client/src/features/modals/integration-modal/OscIntegration.tsx new file mode 100644 index 000000000..b4f500262 --- /dev/null +++ b/apps/client/src/features/modals/integration-modal/OscIntegration.tsx @@ -0,0 +1,123 @@ +import { useState } from 'react'; +import { useForm } from 'react-hook-form'; +import { ModalBody } from '@chakra-ui/react'; +import type { OSCSettings, OscSubscription } from 'ontime-types'; +import { TimerLifeCycle } from 'ontime-types'; +import { generateId } from 'ontime-utils'; + +import useOscSettings, { useOscSettingsMutation } from '../../../common/hooks-query/useOscSettings'; +import { oscPlaceholderSettings, PlaceholderSettings } from '../../../common/models/OscSettings'; +import { useEmitLog } from '../../../common/stores/logger'; + +import OntimeModalFooter from './OntimeModalFooter'; +import OscSubscriptionRow from './OscSubscriptionRow'; + +import styles from '../Modal.module.scss'; + +type OntimeCycle = keyof typeof TimerLifeCycle; + +const sectionText: { [key in TimerLifeCycle]: { title: string; subtitle: string } } = { + onLoad: { + title: 'On Load', + subtitle: 'Triggers when a timer is loaded', + }, + onStart: { + title: 'On Start', + subtitle: 'Triggers when a timer starts', + }, + onPause: { + title: 'On Pause', + subtitle: 'Triggers when a running timer is paused', + }, + onStop: { + title: 'On Stop', + subtitle: 'Triggers when a running timer is stopped', + }, + onUpdate: { + title: 'On Update', + subtitle: 'Triggers when timers are updated (at least once a second, can be more)', + }, + onFinish: { + title: 'On Finish', + subtitle: 'Triggers when a running reaches 0', + }, +}; + +export default function OscIntegration() { + const { data } = useOscSettings(); + const { mutateAsync } = useOscSettingsMutation(); + const { emitError } = useEmitLog(); + const { + handleSubmit, + register, + formState: { isSubmitting, isDirty, isValid }, + } = useForm({ + defaultValues: data, + values: data, + }); + + const resetForm = () => data?.subscriptions || oscPlaceholderSettings.subscriptions; + const [subscriptionState, setSubscription] = useState(() => resetForm()); + + const [showSection, setShowSection] = useState(TimerLifeCycle.onLoad); + + const deleteSubscriptionEntry = (cycle: OntimeCycle, id: string) => { + setSubscription((prev) => { + const newData = { ...prev }; + newData[cycle] = [...prev[cycle].filter((el) => el.id !== id)]; + return newData; + }); + }; + + const addNewSubscriptionEntry = async (cycle: OntimeCycle) => { + setSubscription((prev) => { + const newData = { ...prev }; + newData[cycle] = [...prev[cycle], { id: generateId(), message: '', enabled: false }]; + return newData; + }); + }; + + const onSubmit = async (values: OSCSettings | PlaceholderSettings) => { + try { + // @ts-expect-error -- we know of the type mismatch, not pertinent here + await mutateAsync(values); + } catch (error) { + emitError(`Error setting OSC: ${error}`); + } + }; + + const subscriptionKeys = Object.keys(subscriptionState); + + return ( +
+ + {subscriptionKeys.map((cycle, idx) => { + return ( + <> + + {idx < subscriptionKeys.length - 1 &&
} + + ); + })} +
+ + + ); +} diff --git a/apps/client/src/features/modals/integration-modal/OscIntegrationSettings.tsx b/apps/client/src/features/modals/integration-modal/OscSettings.tsx similarity index 83% rename from apps/client/src/features/modals/integration-modal/OscIntegrationSettings.tsx rename to apps/client/src/features/modals/integration-modal/OscSettings.tsx index 7e98b74a4..2bf3682e1 100644 --- a/apps/client/src/features/modals/integration-modal/OscIntegrationSettings.tsx +++ b/apps/client/src/features/modals/integration-modal/OscSettings.tsx @@ -1,16 +1,18 @@ import { useForm } from 'react-hook-form'; -import { Button, FormControl, Input, ModalBody, ModalFooter, Switch } from '@chakra-ui/react'; +import { FormControl, Input, ModalBody, Switch } from '@chakra-ui/react'; -import { postOSC } from '../../../common/api/ontimeApi'; -import useOscSettings from '../../../common/hooks-query/useOscSettings'; +import useOscSettings, { useOscSettingsMutation } from '../../../common/hooks-query/useOscSettings'; import { PlaceholderSettings } from '../../../common/models/OscSettings'; import { useEmitLog } from '../../../common/stores/logger'; import { isIPAddress, isOnlyNumbers } from '../../../common/utils/regex'; +import OntimeModalFooter from './OntimeModalFooter'; + import styles from '../Modal.module.scss'; -export default function OscIntegrationSettings() { +export default function OscSettings() { const { data } = useOscSettings(); + const { mutateAsync } = useOscSettingsMutation(); const { emitError } = useEmitLog(); const { handleSubmit, @@ -23,8 +25,6 @@ export default function OscIntegrationSettings() { values: data, }); - const disableSubmit = isSubmitting || !isDirty || !isValid; - const onSubmit = async (values: PlaceholderSettings) => { const numericPortIn = Number(values.portIn); const numericPortOut = Number(values.portOut); @@ -41,17 +41,20 @@ export default function OscIntegrationSettings() { }; try { - await postOSC(parsedValues); + await mutateAsync(parsedValues); } catch (error) { emitError(`Error setting OSC: ${error}`); } }; - const resetForm = () => reset(data); + const resetForm = () => { + // @ts-expect-error -- we know the types dont match + reset(data); + }; return ( <> -
+
@@ -77,6 +80,7 @@ export default function OscIntegrationSettings() { size='sm' textAlign='right' maxLength={5} + variant='ontime-filled-on-light' {...register('portIn', { required: { value: true, message: 'Required field' }, max: { value: 65535, message: 'Port in incorrect range (1024 - 65535)' }, @@ -116,6 +120,7 @@ export default function OscIntegrationSettings() { width='140px' size='sm' textAlign='right' + variant='ontime-filled-on-light' {...register('targetIP', { required: { value: true, message: 'Required field' }, pattern: { @@ -142,6 +147,7 @@ export default function OscIntegrationSettings() { size='sm' textAlign='right' maxLength={5} + variant='ontime-filled-on-light' {...register('portOut', { required: { value: true, message: 'Required field' }, max: { value: 65535, message: 'Port in incorrect range (1024 - 65535)' }, @@ -154,27 +160,14 @@ export default function OscIntegrationSettings() { /> - {/**/} - - - - - + ); } diff --git a/apps/client/src/features/modals/integration-modal/OscSettingsModal.jsx b/apps/client/src/features/modals/integration-modal/OscSettingsModal.jsx deleted file mode 100644 index e65702a68..000000000 --- a/apps/client/src/features/modals/integration-modal/OscSettingsModal.jsx +++ /dev/null @@ -1,291 +0,0 @@ -import { useCallback, useEffect, useState } from 'react'; -import { FormControl, FormLabel, Input, ModalBody } from '@chakra-ui/react'; -import { IoInformationCircleOutline } from '@react-icons/all-files/io5/IoInformationCircleOutline'; - -import { useEmitLog } from '@/common/stores/logger'; - -import { postOSC } from '../../../common/api/ontimeApi'; -import EnableBtn from '../../../common/components/buttons/EnableBtn'; -import useOscSettings from '../../../common/hooks-query/useOscSettings'; -import { oscPlaceholderSettings } from '../../../common/models/OscSettings'; -import { inputProps, portInputProps } from '../modalHelper'; -import SubmitContainer from '../SubmitContainer'; - -import style from '../Modals.module.scss'; - -// currently defined endpoints -// temporary -const oscCycleEndpoints = [ - { - title: 'On Event Start', - message: '/ontime/eventNumber', - value: '8 | int', - }, - { - title: 'On Update', - message: '/ontime/time', - value: '10:12:12 | string', - }, - { - title: 'On Update', - message: '/ontime/overtime', - value: '0-1 | int', - }, - { - title: 'On Update', - message: '/ontime/title', - value: 'Title of running event | string', - }, - { - title: 'On Finish', - message: '/ontime/finished', - value: '-', - }, -]; -const oscTriggerEndpoints = [ - { - title: 'On Start', - message: '/ontime/play', - value: '-', - }, - { - title: 'On Pause', - message: '/ontime/pause', - value: '-', - }, - { - title: 'On Previous', - message: '/ontime/prev', - value: '-', - }, - { - title: 'On Next', - message: '/ontime/next', - value: '-', - }, - { - title: 'On Reload', - message: '/ontime/reload', - value: '-', - }, - { - title: 'On Stop', - message: '/ontime/stop', - value: '-', - }, -]; - -export default function OscSettingsModal() { - const { data, status, refetch } = useOscSettings(); - const { emitError } = useEmitLog(); - const [formData, setFormData] = useState(oscPlaceholderSettings); - const [changed, setChanged] = useState(false); - const [submitting, setSubmitting] = useState(false); - - /** - * Set formdata from server state - */ - useEffect(() => { - if (data == null) return; - if (changed) return; - setFormData({ ...data }); - }, [changed, data]); - - /** - * Validate and submit data - */ - const submitHandler = useCallback( - async (event) => { - event.preventDefault(); - setSubmitting(true); - - const f = formData; - const e = { status: false, message: '' }; - - // Validate fields - if (f.port < 1024 || f.port > 65535) { - // Port in incorrect range - e.status = true; - e.message += 'OSC IN Port in incorrect range (1024 - 65535)'; - } else if (f.portOut < 1024 || f.portOut > 65535) { - // Port in incorrect range - e.status = true; - e.message += 'OSC OUT Port in incorrect range (1024 - 65535)'; - } else if (f.port === f.portOut) { - // Cant use the same port - e.status = true; - e.message += 'OSC IN and OUT Ports cant be the same'; - } - - // set fields with error - if (e.status) { - emitError(`Invalid Input: ${e.message}`); - } else { - try { - await postOSC(formData); - } catch (error) { - emitError(`Error setting OSC: ${error}`); - } finally { - await refetch(); - setChanged(false); - } - } - setSubmitting(false); - }, - [emitError, formData, refetch], - ); - - /** - * Reverts local state equals to server state - */ - const revert = useCallback(async () => { - setChanged(false); - await refetch(); - }, [refetch]); - - /** - * Handles change of input field in local state - * @param {string} field - object parameter to update - * @param {(string | number | boolean)} value - new object parameter value - */ - const handleChange = useCallback( - (field, value) => { - const temp = { ...formData }; - temp[field] = value; - setFormData(temp); - setChanged(true); - }, - [formData], - ); - - return ( - -

- Options related to Open Sound Control -
- 🔥 Changes take effect after app restart 🔥 -

-
-
-
OSC Input (Control ontime over OSC)
-
- - - OSC Enable - -
- Enable / Disable control -
-
- handleChange('enabled', !formData.enabled)} - /> -
- - - OSC In Port - -
- Port - Default 8888 -
-
- handleChange('port', parseInt(event.target.value, 10))} - style={{ width: '6em' }} - /> -
-
-
OSC Output (feedback)
-
- - - OSC Out Target IP - -
- Default 127.0.0.1 -
-
- handleChange('targetIP', event.target.value)} - isDisabled={submitting} - style={{ width: '12em', textAlign: 'right' }} - /> -
- - - OSC Out Port - -
- Default 9999 -
-
- handleChange('portOut', parseInt(event.target.value, 10))} - style={{ width: '6em', textAlign: 'left' }} - /> -
-
-
- - - OSC Feedback messages - - - In future OSC feedback will be user defined.
- For now this is the list of OSC messages sent from ontime -
- - - - - - - - {oscCycleEndpoints.map((e) => ( - - - - - - ))} - - - - - - {oscTriggerEndpoints.map((e) => ( - - - - - - ))} - -
- Cycle - MessageValue (example | type)
{e.title}{e.message}{e.value}
- Trigger - MessageValue (example | type)
{e.title}{e.message}{e.value}
-
-
- - -
- ); -} diff --git a/apps/client/src/features/modals/integration-modal/OscSubscriptionRow.tsx b/apps/client/src/features/modals/integration-modal/OscSubscriptionRow.tsx new file mode 100644 index 000000000..d89c2dc98 --- /dev/null +++ b/apps/client/src/features/modals/integration-modal/OscSubscriptionRow.tsx @@ -0,0 +1,74 @@ +import { Button, IconButton, Input, Switch } from '@chakra-ui/react'; +import { FiChevronUp } from '@react-icons/all-files/fi/FiChevronUp'; +import { IoRemove } from '@react-icons/all-files/io5/IoRemove'; +import { OscSubscriptionOptions, TimerLifeCycle } from 'ontime-types'; + +import style from '../../../common/components/collapse-bar/CollapseBar.module.scss'; +import styles from '../Modal.module.scss'; + +interface OscSubscriptionRowProps { + cycle: TimerLifeCycle; + title: string; + subtitle: string; + visible: boolean; + setShowSection: (cycle: TimerLifeCycle) => void; + subscriptionOptions: OscSubscriptionOptions[]; + handleDelete: (cycle: TimerLifeCycle, id: string) => void; + handleAddNew: (cycle: TimerLifeCycle) => void; + register: object; +} + +export default function OscSubscriptionRow(props: OscSubscriptionRowProps) { + const { cycle, title, subtitle, visible, setShowSection, subscriptionOptions, handleDelete, handleAddNew, register } = + props; + + const hasTooManyOptions = subscriptionOptions.length >= 3; + const headerStyle = `${styles.splitSection} ${visible ? '' : styles.showPointer}`; + const registerPrefix = `subscriptions.${cycle}`; + + return ( + <> +
setShowSection(cycle)}> +
+ {title} + {visible && {subtitle}} +
+ +
+ {visible && ( + <> + {subscriptionOptions.map((option, idx) => ( +
+ + + + } + onClick={() => handleDelete(cycle, option.id)} + aria-label='delete' + size='xs' + colorScheme='red' + /> +
+ ))} + + + )} + + ); +} diff --git a/apps/client/src/theme/ontimeButton.ts b/apps/client/src/theme/ontimeButton.ts index 82d15d5b6..4f543ff19 100644 --- a/apps/client/src/theme/ontimeButton.ts +++ b/apps/client/src/theme/ontimeButton.ts @@ -70,4 +70,5 @@ export const ontimeGhostOnLight = { export const ontimeButtonSubtleWhite = { ...ontimeButtonSubtle, color: '#f6f6f6', // $gray-50 + fontWeight: 600, }; diff --git a/apps/client/src/theme/ontimeModal.ts b/apps/client/src/theme/ontimeModal.ts index 4c448145d..bc8fcf54f 100644 --- a/apps/client/src/theme/ontimeModal.ts +++ b/apps/client/src/theme/ontimeModal.ts @@ -13,6 +13,8 @@ export const ontimeModal = { }, body: { padding: 0, + display: 'flex', + flexDirection: 'column', }, closeButton: { color: '#202020', // $gray-50 diff --git a/apps/client/src/theme/ontimeTextInputs.ts b/apps/client/src/theme/ontimeTextInputs.ts index d541a8553..e784d3b86 100644 --- a/apps/client/src/theme/ontimeTextInputs.ts +++ b/apps/client/src/theme/ontimeTextInputs.ts @@ -1,7 +1,6 @@ const commonStyles = { - borderRadius: '3px', fontWeight: '400', - backgroundColor: '#262626', // $gray-1250 + backgroundColor: '#262626', // $gray-1250 color: '#e2e2e2', // $gray-200 border: '1px solid transparent', _hover: { @@ -21,6 +20,21 @@ export const ontimeInputFilled = { }, }; +export const ontimeInputFilledOnLight = { + field: { + backgroundColor: 'white', + border: '2px solid transparent', + _hover: { + backgroundColor: 'white', + border: '2px solid #D2DDFF', // $blue-200 + }, + _focus: { + backgroundColor: 'white', + border: '2px solid #578AF4', // $blue-500 + }, + }, +}; + export const ontimeTextAreaFilled = { ...commonStyles, }; @@ -28,7 +42,7 @@ export const ontimeTextAreaFilled = { export const ontimeTextAreaFilledOnLight = { borderRadius: '3px', fontWeight: '400', - backgroundColor: '#ececec', // $gray-100 + backgroundColor: '#ececec', // $gray-100 color: '#202020', // $gray-1200 border: '1px solid transparent', _hover: { @@ -40,4 +54,4 @@ export const ontimeTextAreaFilledOnLight = { border: '1px solid #578AF4', // $blue-500 }, _placeholder: { color: '#9d9d9d' }, // $gray-500 -} +}; diff --git a/apps/client/src/theme/theme.ts b/apps/client/src/theme/theme.ts index b58a7b5b2..131f7e33b 100644 --- a/apps/client/src/theme/theme.ts +++ b/apps/client/src/theme/theme.ts @@ -15,7 +15,12 @@ import { ontimeModal } from './ontimeModal'; import { ontimeSelect } from './ontimeSelect'; import { lightSwitch, ontimeSwitch } from './ontimeSwitch'; import { ontimeTab } from './ontimeTab'; -import { ontimeInputFilled, ontimeTextAreaFilled, ontimeTextAreaFilledOnLight } from './ontimeTextInputs'; +import { + ontimeInputFilled, + ontimeInputFilledOnLight, + ontimeTextAreaFilled, + ontimeTextAreaFilledOnLight, +} from './ontimeTextInputs'; import { ontimeTooltip } from './ontimeTooltip'; const theme = extendTheme({ @@ -52,6 +57,7 @@ const theme = extendTheme({ }, variants: { 'ontime-filled': { ...ontimeInputFilled }, + 'ontime-filled-on-light': { ...ontimeInputFilledOnLight }, }, }, Modal: { diff --git a/apps/electron/main.js b/apps/electron/main.js index 61a549654..19842b6a7 100644 --- a/apps/electron/main.js +++ b/apps/electron/main.js @@ -252,7 +252,7 @@ ipcMain.on('set-window', (event, arg) => { win.maximize(); break; case 'to-tray': - win.maximize(); + win.hide(); break; case 'show-dev': win.webContents.openDevTools({ mode: 'detach' }); diff --git a/apps/server/package.json b/apps/server/package.json index bd9c088ec..8482f4d42 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -15,13 +15,12 @@ "express-validator": "^6.14.2", "lowdb": "^5.0.5", "multer": "^1.4.4", - "nanoid": "^4.0.0", - "node-osc": "^8.0.9", + "node-osc": "^8.0.10", "node-xlsx": "^0.21.0", "ontime-utils": "workspace:*", "passport": "^0.6.0", "passport-local": "~1.0.0", - "ws": "^8.12.1" + "ws": "^8.13.0" }, "devDependencies": { "@types/express": "^4.17.17", diff --git a/apps/server/src/adapters/WebsocketAdapter.ts b/apps/server/src/adapters/WebsocketAdapter.ts index 04c053171..a5540adfe 100644 --- a/apps/server/src/adapters/WebsocketAdapter.ts +++ b/apps/server/src/adapters/WebsocketAdapter.ts @@ -85,10 +85,14 @@ export class SocketServer implements IAdapter { if (type === 'hello') { ws.send('hi'); + return; } if (type === 'ontime-log') { - console.log('attempted adding to log'); + if (payload.level && payload.origin && payload.text) { + logger.emit(payload.level, payload.origin, payload.text); + } + return; } try { @@ -108,7 +112,7 @@ export class SocketServer implements IAdapter { } // message is any serializable value - send(message: any) { + send(message: unknown) { this.wss?.clients.forEach((client) => { if (client !== this.wss && client.readyState === WebSocket.OPEN) { client.send(JSON.stringify(message)); diff --git a/apps/server/src/app.ts b/apps/server/src/app.ts index 6900f4c16..514106a2f 100644 --- a/apps/server/src/app.ts +++ b/apps/server/src/app.ts @@ -25,10 +25,10 @@ import { dbLoadingProcess } from './modules/loadDb.js'; // Services import { eventTimer } from './services/TimerService.js'; -import { integrationService } from './services/integration-service/IntegrationService.js'; -import { OscIntegration } from './services/integration-service/OscIntegration.js'; -import { logger } from './classes/Logger.js'; import { eventLoader } from './classes/event-loader/EventLoader.js'; +import { integrationService } from './services/integration-service/IntegrationService.js'; +import { logger } from './classes/Logger.js'; +import { oscIntegration } from './services/integration-service/OscIntegration.js'; console.log(`Starting Ontime version ${ONTIME_VERSION}`); @@ -179,7 +179,6 @@ export const startIntegrations = async (config?: { osc: OSCSettings }) => { return 'OSC Invalid configuration'; } - const oscIntegration = new OscIntegration(); const { success, message } = oscIntegration.init(osc); logger.info('RX', message); diff --git a/apps/server/src/controllers/ontimeController.js b/apps/server/src/controllers/ontimeController.js index 2a258c8ae..00a175711 100644 --- a/apps/server/src/controllers/ontimeController.js +++ b/apps/server/src/controllers/ontimeController.js @@ -8,6 +8,8 @@ import { mergeObject } from '../utils/parserUtils.js'; import { PlaybackService } from '../services/PlaybackService.js'; import { eventStore } from '../stores/EventStore.js'; import { resolveDbPath } from '../setup.js'; +import { oscIntegration } from '../services/integration-service/OscIntegration.js'; +import { logger } from '../classes/Logger.js'; // Create controller for GET request to '/ontime/poll' // Returns data for current state @@ -42,7 +44,7 @@ export const dbDownload = async (req, res) => { * @param file * @param req * @param res - * @param options + * @param [options] * @returns {Promise} */ const uploadAndParse = async (file, req, res, options) => { @@ -247,7 +249,7 @@ export const postViewSettings = async (req, res) => { } }; -// Create controller for POST request to '/ontime/osc' +// Create controller for GET request to '/ontime/osc' // Returns - export const getOSC = async (req, res) => { const osc = DataProvider.getOsc(); @@ -262,8 +264,14 @@ export const postOSC = async (req, res) => { } try { - await DataProvider.setOsc(req.body); - res.send(req.body).status(200); + const oscSettings = req.body; + await DataProvider.setOsc(oscSettings); + + // TODO: this update could be more granular, checking that relevant data was changed + const { message } = oscIntegration.init(oscSettings); + logger.info('RX', message); + + res.send(oscSettings).status(200); } catch (error) { res.status(400).send(error); } diff --git a/apps/server/src/controllers/ontimeController.validate.js b/apps/server/src/controllers/ontimeController.validate.js index 256db8f24..7087d8229 100644 --- a/apps/server/src/controllers/ontimeController.validate.js +++ b/apps/server/src/controllers/ontimeController.validate.js @@ -1,4 +1,5 @@ import { body, check, validationResult } from 'express-validator'; +import { validateOscSubscription } from '../utils/parserFunctions.js'; /** * @description Validates object for POST /ontime/views @@ -70,6 +71,9 @@ export const validateOSC = [ body('targetIP').exists().isIP(), body('enabledIn').exists().isBoolean(), body('enabledOut').exists().isBoolean(), + body('subscriptions') + .isObject() + .custom((value) => validateOscSubscription(value)), (req, res, next) => { const errors = validationResult(req); if (!errors.isEmpty()) return res.status(422).json({ errors: errors.array() }); diff --git a/apps/server/src/models/dataModel.ts b/apps/server/src/models/dataModel.ts index 573f896da..eca70568f 100644 --- a/apps/server/src/models/dataModel.ts +++ b/apps/server/src/models/dataModel.ts @@ -41,30 +41,12 @@ export const dbModel: DatabaseModel = { enabledIn: false, enabledOut: false, subscriptions: { - onLoad: { - message: '', - enabled: false, - }, - onStart: { - message: '', - enabled: false, - }, - onPause: { - message: '', - enabled: false, - }, - onStop: { - message: '', - enabled: false, - }, - onUpdate: { - message: '', - enabled: false, - }, - onFinish: { - message: '', - enabled: false, - }, + onLoad: [], + onStart: [], + onPause: [], + onStop: [], + onUpdate: [], + onFinish: [], }, }, http: { diff --git a/apps/server/src/services/integration-service/OscIntegration.ts b/apps/server/src/services/integration-service/OscIntegration.ts index bf51f8e02..f2e591f19 100644 --- a/apps/server/src/services/integration-service/OscIntegration.ts +++ b/apps/server/src/services/integration-service/OscIntegration.ts @@ -2,8 +2,10 @@ import { ArgumentType, Client, Message } from 'node-osc'; import { OSCSettings, OscSubscription } from 'ontime-types'; import IIntegration, { TimerLifeCycleKey } from './IIntegration.js'; -import { parseTemplate } from './integrationUtils.js'; +import { parseTemplateNested } from './integrationUtils.js'; import { isObject } from '../../utils/varUtils.js'; +import { dbModel } from '../../models/dataModel.js'; +import { validateOscSubscription } from '../../utils/parserFunctions.js'; type Action = TimerLifeCycleKey | string; @@ -17,7 +19,7 @@ export class OscIntegration implements IIntegration { constructor() { this.oscClient = null; - this.subscriptions = {}; + this.subscriptions = dbModel.osc.subscriptions; } /** @@ -39,6 +41,8 @@ export class OscIntegration implements IIntegration { }; } try { + // this allows re-calling the init function during runtime + this.oscClient?.close(); this.oscClient = new Client(targetIP, portOut); return { success: true, @@ -54,7 +58,9 @@ export class OscIntegration implements IIntegration { } initSubscriptions(subscriptionOptions: OscSubscription) { - this.subscriptions = { ...this.subscriptions, ...subscriptionOptions }; + if (validateOscSubscription(subscriptionOptions)) { + this.subscriptions = { ...subscriptionOptions }; + } } dispatch(action: Action, state?: object) { @@ -73,11 +79,15 @@ export class OscIntegration implements IIntegration { } // check subscriptions for action - const { enabled, message } = this.subscriptions?.[action] || {}; - if (enabled) { - const parsedMessage = parseTemplate(message, state || {}); - this.emit('address/', parsedMessage); - } + const eventSubscriptions = this.subscriptions?.[action] || []; + + eventSubscriptions.forEach((sub) => { + const { enabled, message } = sub; + if (enabled && message) { + const parsedMessage = parseTemplateNested(message, state || {}); + this.emit(parsedMessage); + } + }); } emit(path: string, payload?: ArgumentType) { @@ -98,7 +108,7 @@ export class OscIntegration implements IIntegration { if (error) { return { success: false, - message: `error is here ${JSON.stringify(error)}`, + message: `Error sending message: ${JSON.stringify(error)}`, }; } return { @@ -116,3 +126,5 @@ export class OscIntegration implements IIntegration { } } } + +export const oscIntegration = new OscIntegration(); diff --git a/apps/server/src/services/integration-service/integrationUtils.test.ts b/apps/server/src/services/integration-service/integrationUtils.test.ts index 1f2ad4bc4..3425366a5 100644 --- a/apps/server/src/services/integration-service/integrationUtils.test.ts +++ b/apps/server/src/services/integration-service/integrationUtils.test.ts @@ -1,6 +1,6 @@ -import { parseTemplate } from './integrationUtils.js'; +import { parseTemplate, parseTemplateNested } from './integrationUtils.js'; -describe('integrationUtils', () => { +describe('parseTemplate()', () => { it('correctly parses a given string', () => { const mockState = { test: 'this' }; const testString = 'That should replace {{test}}'; @@ -51,3 +51,46 @@ describe('integrationUtils', () => { expect(result).toStrictEqual(expected); }); }); + +describe('parseTemplateNested()', () => { + it('parses string with a single-level variable name', () => { + const store = { timer: 10 }; + const templateString = '/test/{{timer}}'; + const result = parseTemplateNested(templateString, store); + expect(result).toEqual('/test/10'); + }); + + it('parses string with a nested variable name', () => { + const store = { timer: { clock: 10 } }; + const templateString = '/timer/{{timer.clock}}'; + const result = parseTemplateNested(templateString, store); + expect(result).toEqual('/timer/10'); + }); + + it('parses string with multiple variables', () => { + const mockState = { test1: 'that', test2: 'this' }; + const testString = '{{test1}} should replace {{test2}}'; + const expected = `${mockState.test1} should replace ${mockState.test2}`; + + const result = parseTemplateNested(testString, mockState); + expect(result).toStrictEqual(expected); + }); + + it('correctly parses a string without templates', () => { + const testString = 'That should replace {test}'; + + const result = parseTemplateNested(testString, {}); + expect(result).toStrictEqual(testString); + }); + + it('handles scenarios with missing variables', () => { + // by failing to provide a value, we give visibility to + // potential issues in the given string + const mockState = { test1: 'that', test2: 'this' }; + const testString = '{{test1}} should replace {{test2}}, but not {{test3}}'; + const expected = `${mockState.test1} should replace ${mockState.test2}, but not {{test3}}`; + + const result = parseTemplateNested(testString, mockState); + expect(result).toStrictEqual(expected); + }); +}); diff --git a/apps/server/src/services/integration-service/integrationUtils.ts b/apps/server/src/services/integration-service/integrationUtils.ts index 2d4b16893..31bde6d8c 100644 --- a/apps/server/src/services/integration-service/integrationUtils.ts +++ b/apps/server/src/services/integration-service/integrationUtils.ts @@ -16,3 +16,22 @@ export function parseTemplate(template: string, state: object): string { return parsedTemplate; } + +/** + * Parses a templated string to values in a nested object + */ +export function parseTemplateNested(template: string, state: object): string { + let parsedTemplate = template; + let match; + while ((match = placeholderRegex.exec(template)) !== null) { + const variableName = match[1]; + const variableParts = variableName.split('.'); + // iterate through variable parts, and look for the property in the state object + const value = variableParts.reduce((obj, key) => obj && obj[key], state); + if (value !== undefined) { + parsedTemplate = parsedTemplate.replace(match[0], value); + } + } + + return parsedTemplate; +} diff --git a/apps/server/src/utils/__tests__/parserFunctions.test.js b/apps/server/src/utils/__tests__/parserFunctions.test.js new file mode 100644 index 000000000..6a822f8c0 --- /dev/null +++ b/apps/server/src/utils/__tests__/parserFunctions.test.js @@ -0,0 +1,91 @@ +import { validateOscSubscription } from '../parserFunctions.js'; + +test('validateOscSubscription()', () => { + it('should return true when given a valid OscSubscription', () => { + const validSubscription = { + onLoad: [{ id: '1', message: 'test', enabled: true }], + onStart: [{ id: '2', message: 'test', enabled: false }], + onPause: [{ id: '3', message: 'test', enabled: true }], + onStop: [{ id: '4', message: 'test', enabled: false }], + onUpdate: [{ id: '5', message: 'test', enabled: true }], + onFinish: [{ id: '6', message: 'test', enabled: false }], + }; + + const result = validateOscSubscription(validSubscription); + + expect(result).toBe(true); + }); + + it('should return false when given undefined', () => { + const result = validateOscSubscription(undefined); + expect(result).toBe(false); + }); + + it('should return false when given null', () => { + const result = validateOscSubscription(null); + expect(result).toBe(false); + }); + + it('should return false when given an empty object', () => { + const result = validateOscSubscription({}); + expect(result).toBe(false); + }); + + it('should return false when given an empty array', () => { + const result = validateOscSubscription([]); + expect(result).toBe(false); + }); + + it('should return false when given an object that is not an OscSubscription', () => { + const invalidObject = { foo: 'bar' }; + + const result = validateOscSubscription(invalidObject); + + expect(result).toBe(false); + }); + + it('should return false when given an OscSubscription with a missing property', () => { + const invalidSubscription = { + onLoad: [{ id: '1', message: 'test', enabled: true }], + onStart: [{ id: '2', message: 'test', enabled: false }], + onPause: [{ id: '3', message: 'test', enabled: true }], + // Missing onStop + onUpdate: [{ id: '5', message: 'test', enabled: true }], + onFinish: [{ id: '6', message: 'test', enabled: false }], + }; + + const result = validateOscSubscription(invalidSubscription); + + expect(result).toBe(false); + }); + + it('should return false when given an OscSubscription with an invalid property value', () => { + const invalidSubscription = { + onLoad: [{ id: '1', message: 'test', enabled: true }], + onStart: [{ id: '2', message: 'test', enabled: false }], + onPause: [{ id: '3', message: 'test', enabled: true }], + onStop: [{ id: '4', message: 'test', enabled: false }], + onUpdate: [{ id: '5', message: 'test', enabled: true }], + onFinish: [{ id: '6', message: 'test', enabled: 'not a boolean' }], + }; + + const result = validateOscSubscription(invalidSubscription); + + expect(result).toBe(false); + }); + + it('should return true if the message field is empty', () => { + const invalidSubscription = { + onLoad: [{ id: '1', message: 'test', enabled: true }], + onStart: [{ id: '2', message: '', enabled: false }], + onPause: [{ id: '3', message: '', enabled: true }], + onStop: [{ id: '4', message: 'test', enabled: false }], + onUpdate: [{ id: '5', message: 'test', enabled: true }], + onFinish: [{ id: '6', message: 'test', enabled: 'not a boolean' }], + }; + + const result = validateOscSubscription(invalidSubscription); + + expect(result).toBe(true); + }); +}); diff --git a/apps/server/src/utils/getRandomName.js b/apps/server/src/utils/getRandomName.js index c7950878f..2cff4ffd6 100644 --- a/apps/server/src/utils/getRandomName.js +++ b/apps/server/src/utils/getRandomName.js @@ -976,7 +976,6 @@ const adjective = [ 'some', 'spherical', 'sophisticated', - 'sore', 'sorrowful', 'soulful', 'soupy', @@ -1248,7 +1247,6 @@ const adjective = [ 'worrisome', 'worse', 'worst', - 'worthless', 'worthwhile', 'worthy', 'wrathful', @@ -1473,7 +1471,6 @@ const object = [ 'studio', 'topic', 'collection', - 'depression', 'imagination', 'passion', 'percentage', @@ -1514,7 +1511,6 @@ const object = [ 'steak', 'union', 'agreement', - 'cancer', 'currency', 'employment', 'engineering', @@ -1527,7 +1523,6 @@ const object = [ 'republic', 'seat', 'tradition', - 'virus', 'actor', 'classroom', 'delivery', diff --git a/apps/server/src/utils/parserFunctions.ts b/apps/server/src/utils/parserFunctions.ts index 7651d9981..984ec9ada 100644 --- a/apps/server/src/utils/parserFunctions.ts +++ b/apps/server/src/utils/parserFunctions.ts @@ -1,5 +1,5 @@ import { generateId } from 'ontime-utils'; -import { OSCSettings } from 'ontime-types'; +import { OSCSettings, OscSubscription, TimerLifeCycle } from 'ontime-types'; import { block as blockDef, delay as delayDef } from '../models/eventsDefinition.js'; import { dbModel } from '../models/dataModel.js'; @@ -148,6 +148,28 @@ export const parseViewSettings = (data, enforce) => { return newViews; }; +/** + * Parses and validates subscription object + * @param data + */ +export const validateOscSubscription = (data: OscSubscription) => { + if (!data) { + return false; + } + const timerKeys = Object.keys(TimerLifeCycle); + for (const key of timerKeys) { + if (!(key in data) || !Array.isArray(data[key])) { + return false; + } + for (const subscription of data[key]) { + if (!subscription.id || typeof subscription.message !== 'string' || typeof subscription.enabled !== 'boolean') { + return false; + } + } + } + return true; +}; + /** * Parse osc portion of an entry */ @@ -159,13 +181,17 @@ export const parseOsc = ( console.log('Found OSC definition, importing...'); const loadedConfig = data?.osc || {}; + const validatedSubscriptions = validateOscSubscription(loadedConfig.subscriptions) + ? loadedConfig.subscriptions + : dbModel.osc.subscriptions; + return { portIn: loadedConfig.portIn ?? dbModel.osc.portIn, portOut: loadedConfig.portOut ?? dbModel.osc.portOut, targetIP: loadedConfig.targetIP ?? dbModel.osc.targetIP, enabledIn: loadedConfig.enabledIn ?? dbModel.osc.enabledIn, enabledOut: loadedConfig.enabledOut ?? dbModel.osc.enabledOut, - subscriptions: loadedConfig.subscriptions ?? dbModel.osc.subscriptions, + subscriptions: validatedSubscriptions, }; } else if (enforce) { console.log(`Created OSC object in db`); diff --git a/packages/types/src/definitions/core/OscSettings.type.ts b/packages/types/src/definitions/core/OscSettings.type.ts index ee5394533..aa6eb2f13 100644 --- a/packages/types/src/definitions/core/OscSettings.type.ts +++ b/packages/types/src/definitions/core/OscSettings.type.ts @@ -1,7 +1,7 @@ -import { TimerLifeCycle } from './TimerLifecycle.type'; +import { TimerLifeCycleKey } from './TimerLifecycle.type.js'; -export type TimerLifeCycleKey = keyof typeof TimerLifeCycle; -export type OscSubscription = { [key in TimerLifeCycleKey]?: { message: string; enabled: boolean } }; +export type OscSubscriptionOptions = { id: string; message: string; enabled: boolean }; +export type OscSubscription = { [key in TimerLifeCycleKey]: OscSubscriptionOptions[] }; export interface OSCSettings { portIn: number; diff --git a/packages/types/src/definitions/core/TimerLifecycle.type.ts b/packages/types/src/definitions/core/TimerLifecycle.type.ts index f803b4cdb..98dc68e3c 100644 --- a/packages/types/src/definitions/core/TimerLifecycle.type.ts +++ b/packages/types/src/definitions/core/TimerLifecycle.type.ts @@ -6,3 +6,5 @@ export enum TimerLifeCycle { onUpdate = 'onUpdate', onFinish = 'onFinish', } + +export type TimerLifeCycleKey = keyof typeof TimerLifeCycle; diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index 1ac6b655b..c6fde6c19 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -11,7 +11,7 @@ import { SupportedEvent, } from './definitions/core/OntimeEvent.type.js'; import { OntimeRundown, OntimeRundownEntry } from './definitions/core/Rundown.type.js'; -import { OSCSettings, OscSubscription } from './definitions/core/OscSettings.type.js'; +import { OSCSettings, OscSubscription, OscSubscriptionOptions } from './definitions/core/OscSettings.type.js'; import { Playback } from './definitions/runtime/Playback.type.js'; import { Loaded } from './definitions/runtime/Playlist.type.js'; import { Log, LogLevel, LogMessage } from './definitions/runtime/Logger.type.js'; @@ -50,7 +50,7 @@ export type { Alias }; export type { UserFields }; // ---> OSC -export type { OscSubscription, OSCSettings }; +export type { OscSubscription, OSCSettings, OscSubscriptionOptions }; // ---> HTTP diff --git a/packages/utils/package.json b/packages/utils/package.json index 02774b23e..fb9998638 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -13,7 +13,7 @@ }, "dependencies": { "luxon": "^3.3.0", - "nanoid": "^4.0.0" + "nanoid": "^4.0.1" }, "devDependencies": { "@types/luxon": "^3.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 473656dfc..29113d34b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,7 +30,7 @@ importers: apps/client: specifiers: - '@chakra-ui/react': ^2.4.5 + '@chakra-ui/react': ^2.5.1 '@dnd-kit/core': ^6.0.6 '@dnd-kit/sortable': ^7.0.1 '@dnd-kit/utilities': ^3.2.1 @@ -40,9 +40,9 @@ importers: '@sentry/react': ^7.28.1 '@sentry/tracing': ^7.24.1 '@sentry/vite-plugin': ^0.3.0 - '@tanstack/eslint-plugin-query': ^4.15.1 - '@tanstack/react-query': ^4.18.0 - '@tanstack/react-query-devtools': ^4.18.0 + '@tanstack/eslint-plugin-query': ^4.26.2 + '@tanstack/react-query': ^4.26.1 + '@tanstack/react-query-devtools': ^4.26.1 '@testing-library/jest-dom': ^5.16.5 '@testing-library/react': ^13.1.1 '@testing-library/user-event': ^14.1.1 @@ -81,7 +81,7 @@ importers: react-beautiful-dnd: ^13.1.1 react-dom: ^18.2.0 react-fast-compare: ^3.2.0 - react-hook-form: ^7.43.1 + react-hook-form: ^7.43.5 react-qr-code: ^2.0.11 react-router-dom: ^6.3.0 react-table: ^7.7.0 @@ -97,7 +97,7 @@ importers: web-vitals: ^3.1.1 zustand: ^4.3.6 dependencies: - '@chakra-ui/react': 2.4.8_loo4skotrnm7icurwgkplqpnwq + '@chakra-ui/react': 2.5.1_loo4skotrnm7icurwgkplqpnwq '@dnd-kit/core': 6.0.7_biqbaboplfbrettd7655fr4n2y '@dnd-kit/sortable': 7.0.2_pmudlfv2z3i7vvlookxjkeidxe '@dnd-kit/utilities': 3.2.1_react@18.2.0 @@ -106,8 +106,8 @@ importers: '@react-icons/all-files': 4.1.0_react@18.2.0 '@sentry/react': 7.30.0_react@18.2.0 '@sentry/tracing': 7.30.0 - '@tanstack/react-query': 4.22.0_biqbaboplfbrettd7655fr4n2y - '@tanstack/react-query-devtools': 4.22.0_gp275tdwez2a4eujt75dnnp754 + '@tanstack/react-query': 4.26.1_biqbaboplfbrettd7655fr4n2y + '@tanstack/react-query-devtools': 4.26.1_brdhmlf72zuns3lsk66phyptty autosize: 5.0.2 axios: 1.2.2 color: 4.2.3 @@ -120,7 +120,7 @@ importers: react-beautiful-dnd: 13.1.1_biqbaboplfbrettd7655fr4n2y react-dom: 18.2.0_react@18.2.0 react-fast-compare: 3.2.0 - react-hook-form: 7.43.1_react@18.2.0 + react-hook-form: 7.43.5_react@18.2.0 react-qr-code: 2.0.11_react@18.2.0 react-router-dom: 6.6.2_biqbaboplfbrettd7655fr4n2y react-table: 7.8.0_react@18.2.0 @@ -129,7 +129,7 @@ importers: zustand: 4.3.6_react@18.2.0 devDependencies: '@sentry/vite-plugin': 0.3.0 - '@tanstack/eslint-plugin-query': 4.21.0 + '@tanstack/eslint-plugin-query': 4.26.2 '@testing-library/jest-dom': 5.16.5 '@testing-library/react': 13.4.0_biqbaboplfbrettd7655fr4n2y '@testing-library/user-event': 14.4.3 @@ -200,8 +200,7 @@ importers: express-validator: ^6.14.2 lowdb: ^5.0.5 multer: ^1.4.4 - nanoid: ^4.0.0 - node-osc: ^8.0.9 + node-osc: ^8.0.10 node-xlsx: ^0.21.0 nodemon: ^2.0.20 ontime-types: workspace:* @@ -213,7 +212,7 @@ importers: ts-node: ^10.9.1 typescript: ^4.9.4 vitest: ^0.27.1 - ws: ^8.12.1 + ws: ^8.13.0 dependencies: '@sentry/node': 7.30.0 '@sentry/tracing': 7.30.0 @@ -225,13 +224,12 @@ importers: express-validator: 6.14.2 lowdb: 5.0.5 multer: 1.4.4 - nanoid: 4.0.0 - node-osc: 8.0.9 + node-osc: 8.0.10 node-xlsx: 0.21.0 ontime-utils: link:../../packages/utils passport: 0.6.0 passport-local: 1.0.0 - ws: 8.12.1 + ws: 8.13.0 devDependencies: '@types/express': 4.17.17 '@types/node': 16.18.11 @@ -272,13 +270,13 @@ importers: eslint-plugin-prettier: ^4.2.1 eslint-plugin-simple-import-sort: ^8.0.0 luxon: ^3.3.0 - nanoid: ^4.0.0 + nanoid: ^4.0.1 prettier: ^2.8.3 typescript: ^4.9.4 vitest: ^0.27.1 dependencies: luxon: 3.3.0 - nanoid: 4.0.0 + nanoid: 4.0.1 devDependencies: '@types/luxon': 3.2.0 '@typescript-eslint/eslint-plugin': 5.48.1_3jon24igvnqaqexgwtxk6nkpse @@ -501,6 +499,13 @@ packages: dependencies: regenerator-runtime: 0.13.11 + /@babel/runtime/7.21.0: + resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.13.11 + dev: false + /@babel/template/7.20.7: resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} engines: {node: '>=6.9.0'} @@ -536,36 +541,36 @@ packages: '@babel/helper-validator-identifier': 7.19.1 to-fast-properties: 2.0.0 - /@chakra-ui/accordion/2.1.7_ujgxj3m7cbv2aqhaw7egfu2jla: - resolution: {integrity: sha512-cptoRz/WkoSq20sL0BgWymHGjsJT6gFawdfdUW8mRlIDjlulKT2Imrn+YoKkiyqncohrQIVc4JiPYuZpy2pMRQ==} + /@chakra-ui/accordion/2.1.9_tqeex4sjgoujiorbrkdtxb3xpq: + resolution: {integrity: sha512-a9CKIAUHezc0f5FR/SQ4GVxnWuIb2HbDTxTEKTp58w/J9pecIbJaNrJ5TUZ0MVbDU9jkgO9RsZ29jkja8PomAw==} peerDependencies: '@chakra-ui/system': '>=2.0.0' framer-motion: '>=4.0.0' react: '>=18' dependencies: '@chakra-ui/descendant': 3.0.13_react@18.2.0 - '@chakra-ui/icon': 3.0.16_ublygk26yvqigtycgan52uuiea + '@chakra-ui/icon': 3.0.16_n3dxrjldmk5gnycgnw7noyo5tu '@chakra-ui/react-context': 2.0.7_react@18.2.0 '@chakra-ui/react-use-controllable-state': 2.0.8_react@18.2.0 '@chakra-ui/react-use-merge-refs': 2.0.7_react@18.2.0 '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm - '@chakra-ui/transition': 2.0.14_sbd3j3rtxuycmn2w3sdkri36ke + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/transition': 2.0.15_sbd3j3rtxuycmn2w3sdkri36ke framer-motion: 8.4.3_biqbaboplfbrettd7655fr4n2y react: 18.2.0 dev: false - /@chakra-ui/alert/2.0.16_ublygk26yvqigtycgan52uuiea: - resolution: {integrity: sha512-E8dGBYqX+K6+xYCPb2DAuPwd/svZ7vjPklLT1D3Xi5GtIpu6wTMv2Pd6HHoMbDkx8C4o2CqBWs5WawpbLzrTvg==} + /@chakra-ui/alert/2.0.17_n3dxrjldmk5gnycgnw7noyo5tu: + resolution: {integrity: sha512-0Y5vw+HkeXpwbL1roVpSSNM6luMRmUbwduUSHEA4OnX1ismvsDb1ZBfpi4Vxp6w8euJ2Uj6df3krbd5tbCP6tg==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/icon': 3.0.16_ublygk26yvqigtycgan52uuiea + '@chakra-ui/icon': 3.0.16_n3dxrjldmk5gnycgnw7noyo5tu '@chakra-ui/react-context': 2.0.7_react@18.2.0 '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/spinner': 2.0.13_ublygk26yvqigtycgan52uuiea - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/spinner': 2.0.13_n3dxrjldmk5gnycgnw7noyo5tu + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm react: 18.2.0 dev: false @@ -573,22 +578,22 @@ packages: resolution: {integrity: sha512-pKfOS/mztc4sUXHNc8ypJ1gPWSolWT770jrgVRfolVbYlki8y5Y+As996zMF6k5lewTu6j9DQequ7Cc9a69IVQ==} dev: false - /@chakra-ui/avatar/2.2.3_ublygk26yvqigtycgan52uuiea: - resolution: {integrity: sha512-vJ9kGAjApPKJeLBDj2w7ONN1cSNEZSWBGwJjv8J9D6aGjsQpqm54vAM1g597yQ6FVuUUm+meFB6AXuvUdAmF7Q==} + /@chakra-ui/avatar/2.2.5_n3dxrjldmk5gnycgnw7noyo5tu: + resolution: {integrity: sha512-TEHXuGE79+fEn61qJ7J/A0Ec+WjyNwobrDTATcLg9Zx2/WEMmZNfrWIAlI5ANQAwVbdSWeGVbyoLAK5mbcrE0A==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/image': 2.0.14_ublygk26yvqigtycgan52uuiea + '@chakra-ui/image': 2.0.15_n3dxrjldmk5gnycgnw7noyo5tu '@chakra-ui/react-children-utils': 2.0.6_react@18.2.0 '@chakra-ui/react-context': 2.0.7_react@18.2.0 '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm react: 18.2.0 dev: false - /@chakra-ui/breadcrumb/2.1.3_ublygk26yvqigtycgan52uuiea: - resolution: {integrity: sha512-TxPXPvvqQ6QUgonfZrg1kSKF8Ki/O/cKIIQQcowJlhdv70wmW5OJyUOYc9DpVePYhqnr70uobUtniyiTX1l3pQ==} + /@chakra-ui/breadcrumb/2.1.4_n3dxrjldmk5gnycgnw7noyo5tu: + resolution: {integrity: sha512-vyBx5TAxPnHhb0b8nyRGfqyjleD//9mySFhk96c9GL+T6YDO4swHw5y/kvDv3Ngc/iRwJ9hdI49PZKwPxLqsEg==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' @@ -596,18 +601,18 @@ packages: '@chakra-ui/react-children-utils': 2.0.6_react@18.2.0 '@chakra-ui/react-context': 2.0.7_react@18.2.0 '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm react: 18.2.0 dev: false - /@chakra-ui/breakpoint-utils/2.0.7: - resolution: {integrity: sha512-YBwsDPMlaMRZ4fKc2WyIIaUmByzkiP4ozxMJIjJRPhedzSho7FOZuE8532q+97f2SyY8z/yZPJ41q4GdwHI/HQ==} + /@chakra-ui/breakpoint-utils/2.0.8: + resolution: {integrity: sha512-Pq32MlEX9fwb5j5xx8s18zJMARNHlQZH2VH1RZgfgRDpp7DcEgtRW5AInfN5CfqdHLO1dGxA7I3MqEuL5JnIsA==} dependencies: '@chakra-ui/shared-utils': 2.0.5 dev: false - /@chakra-ui/button/2.0.15_ublygk26yvqigtycgan52uuiea: - resolution: {integrity: sha512-lZQsTVQ1C1q8Htxnz9i+O0Pc40SwLtz4QTP0RPBeNE8DX+OrRCMkn7YpcVtwiuJD8L/8kYh5h1HCUkyVhW672Q==} + /@chakra-ui/button/2.0.16_n3dxrjldmk5gnycgnw7noyo5tu: + resolution: {integrity: sha512-NjuTKa7gNhnGSUutKuTc8HoAOe9WWIigpciBG7yj3ok67kg8bXtSzPyQFZlgTY6XGdAckWTT+Do4tvhwa5LA+g==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' @@ -615,29 +620,29 @@ packages: '@chakra-ui/react-context': 2.0.7_react@18.2.0 '@chakra-ui/react-use-merge-refs': 2.0.7_react@18.2.0 '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/spinner': 2.0.13_ublygk26yvqigtycgan52uuiea - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/spinner': 2.0.13_n3dxrjldmk5gnycgnw7noyo5tu + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm react: 18.2.0 dev: false - /@chakra-ui/card/2.1.5_ublygk26yvqigtycgan52uuiea: - resolution: {integrity: sha512-Woyyi2rX76qnA/Sm6qxIRcAkpVSfaMCGgup4nwVThl9fWI3v/VpeCiPLVMInwgs418nSGrIliNEMGVtAq11DQw==} + /@chakra-ui/card/2.1.6_n3dxrjldmk5gnycgnw7noyo5tu: + resolution: {integrity: sha512-fFd/WAdRNVY/WOSQv4skpy0WeVhhI0f7dTY1Sm0jVl0KLmuP/GnpsWtKtqWjNcV00K963EXDyhlk6+9oxbP4gw==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm react: 18.2.0 dev: false - /@chakra-ui/checkbox/2.2.9_ublygk26yvqigtycgan52uuiea: - resolution: {integrity: sha512-sUCqP/wlt+Ff5qHmkmbwV2cJnRE3r0KFBjad6hsHK21Nn6/lrQssXATILcVkwYtG79wiV31c0jENqgTo3iMUBQ==} + /@chakra-ui/checkbox/2.2.10_n3dxrjldmk5gnycgnw7noyo5tu: + resolution: {integrity: sha512-vzxEjw99qj7loxAdP1WuHNt4EAvj/t6cc8oxyOB2mEvkAzhxI34rLR+3zWDuHWsmhyUO+XEDh4FiWdR+DK5Siw==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/form-control': 2.0.16_ublygk26yvqigtycgan52uuiea + '@chakra-ui/form-control': 2.0.17_n3dxrjldmk5gnycgnw7noyo5tu '@chakra-ui/react-context': 2.0.7_react@18.2.0 '@chakra-ui/react-types': 2.0.7_react@18.2.0 '@chakra-ui/react-use-callback-ref': 2.0.7_react@18.2.0 @@ -646,14 +651,14 @@ packages: '@chakra-ui/react-use-safe-layout-effect': 2.0.5_react@18.2.0 '@chakra-ui/react-use-update-effect': 2.0.7_react@18.2.0 '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm - '@chakra-ui/visually-hidden': 2.0.15_ublygk26yvqigtycgan52uuiea + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/visually-hidden': 2.0.15_n3dxrjldmk5gnycgnw7noyo5tu '@zag-js/focus-visible': 0.2.1 react: 18.2.0 dev: false - /@chakra-ui/clickable/2.0.13_react@18.2.0: - resolution: {integrity: sha512-e9xpdLemRHfeOZT+v0UJna+SeG2VmqgkBFYcsyrUo70UYL4cj/I3I6UUIvthQsOWa13osV5rv7Ef6jsCCCwZZg==} + /@chakra-ui/clickable/2.0.14_react@18.2.0: + resolution: {integrity: sha512-jfsM1qaD74ZykLHmvmsKRhDyokLUxEfL8Il1VoZMNX5RBI0xW/56vKpLTFF/v/+vLPLS+Te2cZdD4+2O+G6ulA==} peerDependencies: react: '>=18' dependencies: @@ -662,14 +667,14 @@ packages: react: 18.2.0 dev: false - /@chakra-ui/close-button/2.0.16_ublygk26yvqigtycgan52uuiea: - resolution: {integrity: sha512-iw0H7CpU50E/4qbvJADUApXzzF2fuX/5C/pnvECWArq80vFDPfwZVcJJdsQ29E4/KPuSjoCfGO2ER/gIdYClRQ==} + /@chakra-ui/close-button/2.0.17_n3dxrjldmk5gnycgnw7noyo5tu: + resolution: {integrity: sha512-05YPXk456t1Xa3KpqTrvm+7smx+95dmaPiwjiBN3p7LHUQVHJd8ZXSDB0V+WKi419k3cVQeJUdU/azDO2f40sw==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/icon': 3.0.16_ublygk26yvqigtycgan52uuiea - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/icon': 3.0.16_n3dxrjldmk5gnycgnw7noyo5tu + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm react: 18.2.0 dev: false @@ -682,18 +687,18 @@ packages: react: 18.2.0 dev: false - /@chakra-ui/control-box/2.0.13_ublygk26yvqigtycgan52uuiea: + /@chakra-ui/control-box/2.0.13_n3dxrjldmk5gnycgnw7noyo5tu: resolution: {integrity: sha512-FEyrU4crxati80KUF/+1Z1CU3eZK6Sa0Yv7Z/ydtz9/tvGblXW9NFanoomXAOvcIFLbaLQPPATm9Gmpr7VG05A==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm react: 18.2.0 dev: false - /@chakra-ui/counter/2.0.13_react@18.2.0: - resolution: {integrity: sha512-zfSMx0sWUjNaSeZ8nbOXulF+K3kQHIQzk1VDNXi6Qz1CdJT2GLLqf/gstOj2yeTtQRltzevSdh6t3HQAAoWaZQ==} + /@chakra-ui/counter/2.0.14_react@18.2.0: + resolution: {integrity: sha512-KxcSRfUbb94dP77xTip2myoE7P2HQQN4V5fRJmNAGbzcyLciJ+aDylUU/UxgNcEjawUp6Q242NbWb1TSbKoqog==} peerDependencies: react: '>=18' dependencies: @@ -727,8 +732,8 @@ packages: resolution: {integrity: sha512-PVtDkPrDD5b8aoL6Atg7SLjkwhWb7BwMcLOF1L449L3nZN+DAO3nyAh6iUhZVJyunELj9d0r65CDlnMREyJZmA==} dev: false - /@chakra-ui/editable/2.0.18_ublygk26yvqigtycgan52uuiea: - resolution: {integrity: sha512-6L8O6aE1Dvjnsh4sdIrAJK0e1b1BQ70zhrhKktCh4kE/morU3VksKOWpbBBycLGM9bC/pjbtgBhz83NTDZ55sA==} + /@chakra-ui/editable/2.0.19_n3dxrjldmk5gnycgnw7noyo5tu: + resolution: {integrity: sha512-YxRJsJ2JQd42zfPBgTKzIhg1HugT+gfQz1ZosmUN+IZT9YZXL2yodHTUz6Lee04Vc/CdEqgBFLuREXEUNBfGtA==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' @@ -742,7 +747,7 @@ packages: '@chakra-ui/react-use-safe-layout-effect': 2.0.5_react@18.2.0 '@chakra-ui/react-use-update-effect': 2.0.7_react@18.2.0 '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm react: 18.2.0 dev: false @@ -750,96 +755,96 @@ packages: resolution: {integrity: sha512-IGM/yGUHS+8TOQrZGpAKOJl/xGBrmRYJrmbHfUE7zrG3PpQyXvbLDP1M+RggkCFVgHlJi2wpYIf0QtQlU0XZfw==} dev: false - /@chakra-ui/focus-lock/2.0.15_kzbn2opkn2327fwg5yzwzya5o4: - resolution: {integrity: sha512-LF8vkaK4W4QTbEycAkh5AAI+upDHZmyBOwxIaS9ZVfi9sgtvu0WzZd6823nZWyEpbXRVXWzx+/L0sXUUogpFWQ==} + /@chakra-ui/focus-lock/2.0.16_kzbn2opkn2327fwg5yzwzya5o4: + resolution: {integrity: sha512-UuAdGCPVrCa1lecoAvpOQD7JFT7a9RdmhKWhFt5ioIcekSLJcerdLHuuL3w0qz//8kd1/SOt7oP0aJqdAJQrCw==} peerDependencies: react: '>=18' dependencies: '@chakra-ui/dom-utils': 2.0.6 react: 18.2.0 - react-focus-lock: 2.9.2_kzbn2opkn2327fwg5yzwzya5o4 + react-focus-lock: 2.9.4_kzbn2opkn2327fwg5yzwzya5o4 transitivePeerDependencies: - '@types/react' dev: false - /@chakra-ui/form-control/2.0.16_ublygk26yvqigtycgan52uuiea: - resolution: {integrity: sha512-Lu6zUiJF9D9I8FNllgC1EvqzBIMTkTp3H84g2PUz/5Xl3Qrd2nVyEwhnJQ9KEkqGB7N9bomPgDdqKv+B7imTiw==} + /@chakra-ui/form-control/2.0.17_n3dxrjldmk5gnycgnw7noyo5tu: + resolution: {integrity: sha512-34ptCaJ2LNvQNOlB6MAKsmH1AkT1xo7E+3Vw10Urr81yTOjDTM/iU6vG3JKPfRDMyXeowPjXmutlnuk72SSjRg==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/icon': 3.0.16_ublygk26yvqigtycgan52uuiea + '@chakra-ui/icon': 3.0.16_n3dxrjldmk5gnycgnw7noyo5tu '@chakra-ui/react-context': 2.0.7_react@18.2.0 '@chakra-ui/react-types': 2.0.7_react@18.2.0 '@chakra-ui/react-use-merge-refs': 2.0.7_react@18.2.0 '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm react: 18.2.0 dev: false - /@chakra-ui/hooks/2.1.5_react@18.2.0: - resolution: {integrity: sha512-E3bGwxjXvMUc9ev3egctrRi5fnER5xXbWUsivA3iFRdUrkfX+19JLUfP1TURzv7UQG8X1AxKSwfqIsYyeHrdmQ==} + /@chakra-ui/hooks/2.1.6_react@18.2.0: + resolution: {integrity: sha512-oMSOeoOF6/UpwTVlDFHSROAA4hPY8WgJ0erdHs1ZkuwAwHv7UzjDkvrb6xYzAAH9qHoFzc5RIBm6jVoh3LCc+Q==} peerDependencies: react: '>=18' dependencies: '@chakra-ui/react-utils': 2.0.12_react@18.2.0 '@chakra-ui/utils': 2.0.15 - compute-scroll-into-view: 1.0.14 - copy-to-clipboard: 3.3.1 + compute-scroll-into-view: 1.0.20 + copy-to-clipboard: 3.3.3 react: 18.2.0 dev: false - /@chakra-ui/icon/3.0.16_ublygk26yvqigtycgan52uuiea: + /@chakra-ui/icon/3.0.16_n3dxrjldmk5gnycgnw7noyo5tu: resolution: {integrity: sha512-RpA1X5Ptz8Mt39HSyEIW1wxAz2AXyf9H0JJ5HVx/dBdMZaGMDJ0HyyPBVci0m4RCoJuyG1HHG/DXJaVfUTVAeg==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm react: 18.2.0 dev: false - /@chakra-ui/image/2.0.14_ublygk26yvqigtycgan52uuiea: - resolution: {integrity: sha512-FglWbGhz/fcfnStllcZ7uOs6XTsWC39gdHx3096j/28DmVEhO1MNwqK/UtgxVR26E7NZf3xWnzbwP+HCTWTkcw==} + /@chakra-ui/image/2.0.15_n3dxrjldmk5gnycgnw7noyo5tu: + resolution: {integrity: sha512-w2rElXtI3FHXuGpMCsSklus+pO1Pl2LWDwsCGdpBQUvGFbnHfl7MftQgTlaGHeD5OS95Pxva39hKrA2VklKHiQ==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: '@chakra-ui/react-use-safe-layout-effect': 2.0.5_react@18.2.0 '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm react: 18.2.0 dev: false - /@chakra-ui/input/2.0.18_ublygk26yvqigtycgan52uuiea: - resolution: {integrity: sha512-2nG9hyBiPlLuGzy+VxjwRSec1R87lYbiYOFO9iAfH5ZOPfVVYZ5WyLUeSAMq3x4wA2t/+Ejw8H5+ucEoQr5VNA==} + /@chakra-ui/input/2.0.20_n3dxrjldmk5gnycgnw7noyo5tu: + resolution: {integrity: sha512-ypmsy4n4uNBVgn6Gd24Zrpi+qRf/T9WEzWkysuYC9Qfxo+i7yuf3snp7XmBy8KSGVSiXE11eO8ZN5oCg6Xg0jg==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/form-control': 2.0.16_ublygk26yvqigtycgan52uuiea + '@chakra-ui/form-control': 2.0.17_n3dxrjldmk5gnycgnw7noyo5tu '@chakra-ui/object-utils': 2.0.8 '@chakra-ui/react-children-utils': 2.0.6_react@18.2.0 '@chakra-ui/react-context': 2.0.7_react@18.2.0 '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm react: 18.2.0 dev: false - /@chakra-ui/layout/2.1.14_ublygk26yvqigtycgan52uuiea: - resolution: {integrity: sha512-RL8W684+DAw4dwnuGR5KtpDUhXKPjGaZRyi/tupli2iipQx8R27046WrS4/6DkYzok10vgMQLwvwfkk0Yn0u7g==} + /@chakra-ui/layout/2.1.16_n3dxrjldmk5gnycgnw7noyo5tu: + resolution: {integrity: sha512-QFS3feozIGsvB0H74lUocev55aRF26eNrdmhfJifwikZAiq+zzZAMdBdNU9UJhHClnMOU8/iGZ0MF7ti4zQS1A==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/breakpoint-utils': 2.0.7 - '@chakra-ui/icon': 3.0.16_ublygk26yvqigtycgan52uuiea + '@chakra-ui/breakpoint-utils': 2.0.8 + '@chakra-ui/icon': 3.0.16_n3dxrjldmk5gnycgnw7noyo5tu '@chakra-ui/object-utils': 2.0.8 '@chakra-ui/react-children-utils': 2.0.6_react@18.2.0 '@chakra-ui/react-context': 2.0.7_react@18.2.0 '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm react: 18.2.0 dev: false @@ -855,30 +860,30 @@ packages: react: 18.2.0 dev: false - /@chakra-ui/media-query/3.2.10_ublygk26yvqigtycgan52uuiea: - resolution: {integrity: sha512-R1dMsC/gLU52R14IRe3skwVkXnRLvhhyAIHZrIDXCrP2flrCLoWgk98YM2GTWu7ShrVPHVDjL+7zR0ql3FtS/w==} + /@chakra-ui/media-query/3.2.12_n3dxrjldmk5gnycgnw7noyo5tu: + resolution: {integrity: sha512-8pSLDf3oxxhFrhd40rs7vSeIBfvOmIKHA7DJlGUC/y+9irD24ZwgmCtFnn+y3gI47hTJsopbSX+wb8nr7XPswA==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/breakpoint-utils': 2.0.7 - '@chakra-ui/react-env': 2.0.13_react@18.2.0 + '@chakra-ui/breakpoint-utils': 2.0.8 + '@chakra-ui/react-env': 3.0.0_react@18.2.0 '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm react: 18.2.0 dev: false - /@chakra-ui/menu/2.1.7_ujgxj3m7cbv2aqhaw7egfu2jla: - resolution: {integrity: sha512-oVGjqHXdFc2ZocBn93+HtIVxeuNTOOewMsqUarfMb/MNX3yXD0lwmtecURG0ygm0TsYvXvZEc42t6W7m+2zPtQ==} + /@chakra-ui/menu/2.1.9_tqeex4sjgoujiorbrkdtxb3xpq: + resolution: {integrity: sha512-ue5nD4QJcl3H3UwN0zZNJmH89XUebnvEdW6THAUL41hDjJ0J/Fjpg9Sgzwug2aBbBXBNbVMsUuhcCj6x91d+IQ==} peerDependencies: '@chakra-ui/system': '>=2.0.0' framer-motion: '>=4.0.0' react: '>=18' dependencies: - '@chakra-ui/clickable': 2.0.13_react@18.2.0 + '@chakra-ui/clickable': 2.0.14_react@18.2.0 '@chakra-ui/descendant': 3.0.13_react@18.2.0 '@chakra-ui/lazy-utils': 2.0.5 - '@chakra-ui/popper': 3.0.12_react@18.2.0 + '@chakra-ui/popper': 3.0.13_react@18.2.0 '@chakra-ui/react-children-utils': 2.0.6_react@18.2.0 '@chakra-ui/react-context': 2.0.7_react@18.2.0 '@chakra-ui/react-use-animation-state': 2.0.8_react@18.2.0 @@ -889,30 +894,30 @@ packages: '@chakra-ui/react-use-outside-click': 2.0.7_react@18.2.0 '@chakra-ui/react-use-update-effect': 2.0.7_react@18.2.0 '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm - '@chakra-ui/transition': 2.0.14_sbd3j3rtxuycmn2w3sdkri36ke + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/transition': 2.0.15_sbd3j3rtxuycmn2w3sdkri36ke framer-motion: 8.4.3_biqbaboplfbrettd7655fr4n2y react: 18.2.0 dev: false - /@chakra-ui/modal/2.2.8_niqni3yoo4ibilvjxapfgfyqrq: - resolution: {integrity: sha512-i2dw79PRKKf3DNqc25bc5jTeSASR+S0mIu39PNSH4VkU6XFR/o3qm3qTMj4HvK1u7ci1sMHMcTwwzfvo81veXg==} + /@chakra-ui/modal/2.2.9_zdafp7qkal2hd2ygotnw7q7pti: + resolution: {integrity: sha512-nTfNp7XsVwn5+xJOtstoFA8j0kq/9sJj7KesyYzjEDaMKvCZvIOntRYowoydho43jb4+YC7ebKhp0KOIINS0gg==} peerDependencies: '@chakra-ui/system': '>=2.0.0' framer-motion: '>=4.0.0' react: '>=18' react-dom: '>=18' dependencies: - '@chakra-ui/close-button': 2.0.16_ublygk26yvqigtycgan52uuiea - '@chakra-ui/focus-lock': 2.0.15_kzbn2opkn2327fwg5yzwzya5o4 - '@chakra-ui/portal': 2.0.14_biqbaboplfbrettd7655fr4n2y + '@chakra-ui/close-button': 2.0.17_n3dxrjldmk5gnycgnw7noyo5tu + '@chakra-ui/focus-lock': 2.0.16_kzbn2opkn2327fwg5yzwzya5o4 + '@chakra-ui/portal': 2.0.15_biqbaboplfbrettd7655fr4n2y '@chakra-ui/react-context': 2.0.7_react@18.2.0 '@chakra-ui/react-types': 2.0.7_react@18.2.0 '@chakra-ui/react-use-merge-refs': 2.0.7_react@18.2.0 '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm - '@chakra-ui/transition': 2.0.14_sbd3j3rtxuycmn2w3sdkri36ke - aria-hidden: 1.2.2_kzbn2opkn2327fwg5yzwzya5o4 + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/transition': 2.0.15_sbd3j3rtxuycmn2w3sdkri36ke + aria-hidden: 1.2.3 framer-motion: 8.4.3_biqbaboplfbrettd7655fr4n2y react: 18.2.0 react-dom: 18.2.0_react@18.2.0 @@ -921,15 +926,15 @@ packages: - '@types/react' dev: false - /@chakra-ui/number-input/2.0.17_ublygk26yvqigtycgan52uuiea: - resolution: {integrity: sha512-134QRzEr6ia0pIO4C+7pFJ1+Weo+gU3yAHBeYMxfMniYz4qxsmsNHtBhgssvSoKe8dhL3pyuT0dsgbHIfW/3Qg==} + /@chakra-ui/number-input/2.0.18_n3dxrjldmk5gnycgnw7noyo5tu: + resolution: {integrity: sha512-cPkyAFFHHzeFBselrT1BtjlzMkJ6TKrTDUnHFlzqXy6aqeXuhrjFhMfXucjedSpOqedsP9ZbKFTdIAhu9DdL/A==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/counter': 2.0.13_react@18.2.0 - '@chakra-ui/form-control': 2.0.16_ublygk26yvqigtycgan52uuiea - '@chakra-ui/icon': 3.0.16_ublygk26yvqigtycgan52uuiea + '@chakra-ui/counter': 2.0.14_react@18.2.0 + '@chakra-ui/form-control': 2.0.17_n3dxrjldmk5gnycgnw7noyo5tu + '@chakra-ui/icon': 3.0.16_n3dxrjldmk5gnycgnw7noyo5tu '@chakra-ui/react-context': 2.0.7_react@18.2.0 '@chakra-ui/react-types': 2.0.7_react@18.2.0 '@chakra-ui/react-use-callback-ref': 2.0.7_react@18.2.0 @@ -939,7 +944,7 @@ packages: '@chakra-ui/react-use-safe-layout-effect': 2.0.5_react@18.2.0 '@chakra-ui/react-use-update-effect': 2.0.7_react@18.2.0 '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm react: 18.2.0 dev: false @@ -951,8 +956,8 @@ packages: resolution: {integrity: sha512-2upjT2JgRuiupdrtBWklKBS6tqeGMA77Nh6Q0JaoQuH/8yq+15CGckqn3IUWkWoGI0Fg3bK9LDlbbD+9DLw95Q==} dev: false - /@chakra-ui/pin-input/2.0.18_ublygk26yvqigtycgan52uuiea: - resolution: {integrity: sha512-+s/xOfCHzO+lA3FWPUXMYk7DjrpxwWGvMFsOqUnUWgSLZ6H7Gieplp+/qkXWtDvTZ7gfOpFsMRVsuA3LqeFPpg==} + /@chakra-ui/pin-input/2.0.19_n3dxrjldmk5gnycgnw7noyo5tu: + resolution: {integrity: sha512-6O7s4vWz4cqQ6zvMov9sYj6ZqWAsTxR/MNGe3DNgu1zWQg8veNCYtj1rNGhNS3eZNUMAa8uM2dXIphGTP53Xow==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' @@ -963,20 +968,20 @@ packages: '@chakra-ui/react-use-controllable-state': 2.0.8_react@18.2.0 '@chakra-ui/react-use-merge-refs': 2.0.7_react@18.2.0 '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm react: 18.2.0 dev: false - /@chakra-ui/popover/2.1.7_ujgxj3m7cbv2aqhaw7egfu2jla: - resolution: {integrity: sha512-iGREYqQUEAdByy/z46JAuZMJiU+r26NUuZuCRwgMKSiEPKtTuU3Z1r5R/OeIp8qtMhKF+YagpEXTBbyax7429g==} + /@chakra-ui/popover/2.1.8_tqeex4sjgoujiorbrkdtxb3xpq: + resolution: {integrity: sha512-ob7fAz+WWmXIq7iGHVB3wDKzZTj+T+noYBT/U1Q+jIf+jMr2WOpJLTfb0HTZcfhvn4EBFlfBg7Wk5qbXNaOn7g==} peerDependencies: '@chakra-ui/system': '>=2.0.0' framer-motion: '>=4.0.0' react: '>=18' dependencies: - '@chakra-ui/close-button': 2.0.16_ublygk26yvqigtycgan52uuiea + '@chakra-ui/close-button': 2.0.17_n3dxrjldmk5gnycgnw7noyo5tu '@chakra-ui/lazy-utils': 2.0.5 - '@chakra-ui/popper': 3.0.12_react@18.2.0 + '@chakra-ui/popper': 3.0.13_react@18.2.0 '@chakra-ui/react-context': 2.0.7_react@18.2.0 '@chakra-ui/react-types': 2.0.7_react@18.2.0 '@chakra-ui/react-use-animation-state': 2.0.8_react@18.2.0 @@ -985,13 +990,13 @@ packages: '@chakra-ui/react-use-focus-on-pointer-down': 2.0.6_react@18.2.0 '@chakra-ui/react-use-merge-refs': 2.0.7_react@18.2.0 '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm framer-motion: 8.4.3_biqbaboplfbrettd7655fr4n2y react: 18.2.0 dev: false - /@chakra-ui/popper/3.0.12_react@18.2.0: - resolution: {integrity: sha512-mJjyg1RalNusgRoB1HNryFlWTkgPWRVBAHwYW38AHRQFWbBRwdEV1lxWP8Ty+a++0rTXgnskzamF+bP5fRMpng==} + /@chakra-ui/popper/3.0.13_react@18.2.0: + resolution: {integrity: sha512-FwtmYz80Ju8oK3Z1HQfisUE7JIMmDsCQsRBu6XuJ3TFQnBHit73yjZmxKjuRJ4JgyT4WBnZoTF3ATbRKSagBeg==} peerDependencies: react: '>=18' dependencies: @@ -1001,8 +1006,8 @@ packages: react: 18.2.0 dev: false - /@chakra-ui/portal/2.0.14_biqbaboplfbrettd7655fr4n2y: - resolution: {integrity: sha512-X/8deILEgQ0u0s0Gmq/3Axl8CrXlv6MrrliBwHMEGyZO0h9rSKAGYr+gHCDLw70mkKuNmGcfGzqJ37HbVfXSNw==} + /@chakra-ui/portal/2.0.15_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-z8v7K3j1/nMuBzp2+wRIIw7s/eipVtnXLdjK5yqbMxMRa44E8Mu5VNJLz3aQFLHXEUST+ifqrjImQeli9do6LQ==} peerDependencies: react: '>=18' react-dom: '>=18' @@ -1013,19 +1018,19 @@ packages: react-dom: 18.2.0_react@18.2.0 dev: false - /@chakra-ui/progress/2.1.4_ublygk26yvqigtycgan52uuiea: - resolution: {integrity: sha512-UvOUMtbDqtuQxB2D4YGXrvztoBLkEASX5GY1UyOib0Bd0RKVMWLh8sqlP9Vbl7M/8YdbyGiEOmmsAi40/UMkoQ==} + /@chakra-ui/progress/2.1.5_n3dxrjldmk5gnycgnw7noyo5tu: + resolution: {integrity: sha512-jj5Vp4lxUchuwp4RPCepM0yAyKi344bgsOd3Apd+ldxclDcewPc82fbwDu7g/Xv27LqJkT+7E/SlQy04wGrk0g==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: '@chakra-ui/react-context': 2.0.7_react@18.2.0 - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm react: 18.2.0 dev: false - /@chakra-ui/provider/2.0.30_5rzy53przelm5jchjmb5vr6dxy: - resolution: {integrity: sha512-+bKz9JV/ufOltNfX6kzU4uhFCLgPO4/aJOuEsM6iHSgaKMFNNto9BnFNzFbZFPThB5FcXfpvwJD5r6IZzuIsVg==} + /@chakra-ui/provider/2.1.2_5rzy53przelm5jchjmb5vr6dxy: + resolution: {integrity: sha512-4lLlz8QuJv00BhfyKzWpzfoti9MDOdJ/MqXixJV/EZ02RMBOdE9qy9bSz/WckPC2MVhtRUuwMkxH+0QY21PXuw==} peerDependencies: '@emotion/react': ^11.0.0 '@emotion/styled': ^11.0.0 @@ -1033,9 +1038,9 @@ packages: react-dom: '>=18' dependencies: '@chakra-ui/css-reset': 2.0.12_hp5f5nkljdiwilp4rgxyefcplu - '@chakra-ui/portal': 2.0.14_biqbaboplfbrettd7655fr4n2y - '@chakra-ui/react-env': 2.0.13_react@18.2.0 - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/portal': 2.0.15_biqbaboplfbrettd7655fr4n2y + '@chakra-ui/react-env': 3.0.0_react@18.2.0 + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm '@chakra-ui/utils': 2.0.15 '@emotion/react': 11.10.5_kzbn2opkn2327fwg5yzwzya5o4 '@emotion/styled': 11.10.5_qvatmowesywn4ye42qoh247szu @@ -1043,18 +1048,18 @@ packages: react-dom: 18.2.0_react@18.2.0 dev: false - /@chakra-ui/radio/2.0.18_ublygk26yvqigtycgan52uuiea: - resolution: {integrity: sha512-Cw05WD23LAXGOdC0sTVMbBPUk8JjzH/bK0CthLQylo43lTzDjFRG7iPDR5dugyreHlj9qoU4wOWZJDFqKUIjRg==} + /@chakra-ui/radio/2.0.19_n3dxrjldmk5gnycgnw7noyo5tu: + resolution: {integrity: sha512-PlJiV59eGSmeKP4v/4+ccQUWGRd0cjPKkj/p3L+UbOf8pl9dWm8y9kIeL5TYbghQSDv0nzkrH4+yMnnDTZjdMQ==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/form-control': 2.0.16_ublygk26yvqigtycgan52uuiea + '@chakra-ui/form-control': 2.0.17_n3dxrjldmk5gnycgnw7noyo5tu '@chakra-ui/react-context': 2.0.7_react@18.2.0 '@chakra-ui/react-types': 2.0.7_react@18.2.0 '@chakra-ui/react-use-merge-refs': 2.0.7_react@18.2.0 '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm '@zag-js/focus-visible': 0.2.1 react: 18.2.0 dev: false @@ -1075,11 +1080,12 @@ packages: react: 18.2.0 dev: false - /@chakra-ui/react-env/2.0.13_react@18.2.0: - resolution: {integrity: sha512-rzrM5ZmpTb9+qIn248U2BCLygB8/FJp/kYYUScaqzn/2mGNUG+XGyFxKoDragTAFl+88jPR7o/2XAaxxgQ4WlQ==} + /@chakra-ui/react-env/3.0.0_react@18.2.0: + resolution: {integrity: sha512-tfMRO2v508HQWAqSADFrwZgR9oU10qC97oV6zGbjHh9ALP0/IcFR+Bi71KRTveDTm85fMeAzZYGj57P3Dsipkw==} peerDependencies: react: '>=18' dependencies: + '@chakra-ui/react-use-safe-layout-effect': 2.0.5_react@18.2.0 react: 18.2.0 dev: false @@ -1218,12 +1224,12 @@ packages: react: 18.2.0 dev: false - /@chakra-ui/react-use-size/2.0.8_react@18.2.0: - resolution: {integrity: sha512-OdCxVPm8ekPVn9R6S1OtfLVNRVZ0G1tcfA2/oY1c55aXbm/R0TFZ+twSoy+X+aRFhqydmE7DRsKyW2ysXuuVBw==} + /@chakra-ui/react-use-size/2.0.9_react@18.2.0: + resolution: {integrity: sha512-Jce7QmO1jlQZq+Y77VKckWzroRnajChzUQ8xhLQZO6VbYvrpg3cu+X2QCz3G+MZzB+1/hnvvAqmZ+uJLd8rEJg==} peerDependencies: react: '>=18' dependencies: - '@zag-js/element-size': 0.3.0 + '@zag-js/element-size': 0.3.1 react: 18.2.0 dev: false @@ -1253,8 +1259,8 @@ packages: react: 18.2.0 dev: false - /@chakra-ui/react/2.4.8_loo4skotrnm7icurwgkplqpnwq: - resolution: {integrity: sha512-s1iY+u6nUb/OiB6WgcWbBmbCwkmfPfQQ6xJn4Vs7rJAy7FiE8EEm623tHm1k4UdT0h4HJOm0UkQEyjh1kusCkQ==} + /@chakra-ui/react/2.5.1_loo4skotrnm7icurwgkplqpnwq: + resolution: {integrity: sha512-ugkaqfcNMb9L4TkalWiF3rnqfr0TlUUD46JZaDIZiORVisaSwXTZTQrVfG40VghhaJT28rnC5WtiE8kd567ZBQ==} peerDependencies: '@emotion/react': ^11.0.0 '@emotion/styled': ^11.0.0 @@ -1262,56 +1268,57 @@ packages: react: '>=18' react-dom: '>=18' dependencies: - '@chakra-ui/accordion': 2.1.7_ujgxj3m7cbv2aqhaw7egfu2jla - '@chakra-ui/alert': 2.0.16_ublygk26yvqigtycgan52uuiea - '@chakra-ui/avatar': 2.2.3_ublygk26yvqigtycgan52uuiea - '@chakra-ui/breadcrumb': 2.1.3_ublygk26yvqigtycgan52uuiea - '@chakra-ui/button': 2.0.15_ublygk26yvqigtycgan52uuiea - '@chakra-ui/card': 2.1.5_ublygk26yvqigtycgan52uuiea - '@chakra-ui/checkbox': 2.2.9_ublygk26yvqigtycgan52uuiea - '@chakra-ui/close-button': 2.0.16_ublygk26yvqigtycgan52uuiea - '@chakra-ui/control-box': 2.0.13_ublygk26yvqigtycgan52uuiea - '@chakra-ui/counter': 2.0.13_react@18.2.0 + '@chakra-ui/accordion': 2.1.9_tqeex4sjgoujiorbrkdtxb3xpq + '@chakra-ui/alert': 2.0.17_n3dxrjldmk5gnycgnw7noyo5tu + '@chakra-ui/avatar': 2.2.5_n3dxrjldmk5gnycgnw7noyo5tu + '@chakra-ui/breadcrumb': 2.1.4_n3dxrjldmk5gnycgnw7noyo5tu + '@chakra-ui/button': 2.0.16_n3dxrjldmk5gnycgnw7noyo5tu + '@chakra-ui/card': 2.1.6_n3dxrjldmk5gnycgnw7noyo5tu + '@chakra-ui/checkbox': 2.2.10_n3dxrjldmk5gnycgnw7noyo5tu + '@chakra-ui/close-button': 2.0.17_n3dxrjldmk5gnycgnw7noyo5tu + '@chakra-ui/control-box': 2.0.13_n3dxrjldmk5gnycgnw7noyo5tu + '@chakra-ui/counter': 2.0.14_react@18.2.0 '@chakra-ui/css-reset': 2.0.12_hp5f5nkljdiwilp4rgxyefcplu - '@chakra-ui/editable': 2.0.18_ublygk26yvqigtycgan52uuiea - '@chakra-ui/form-control': 2.0.16_ublygk26yvqigtycgan52uuiea - '@chakra-ui/hooks': 2.1.5_react@18.2.0 - '@chakra-ui/icon': 3.0.16_ublygk26yvqigtycgan52uuiea - '@chakra-ui/image': 2.0.14_ublygk26yvqigtycgan52uuiea - '@chakra-ui/input': 2.0.18_ublygk26yvqigtycgan52uuiea - '@chakra-ui/layout': 2.1.14_ublygk26yvqigtycgan52uuiea + '@chakra-ui/editable': 2.0.19_n3dxrjldmk5gnycgnw7noyo5tu + '@chakra-ui/focus-lock': 2.0.16_kzbn2opkn2327fwg5yzwzya5o4 + '@chakra-ui/form-control': 2.0.17_n3dxrjldmk5gnycgnw7noyo5tu + '@chakra-ui/hooks': 2.1.6_react@18.2.0 + '@chakra-ui/icon': 3.0.16_n3dxrjldmk5gnycgnw7noyo5tu + '@chakra-ui/image': 2.0.15_n3dxrjldmk5gnycgnw7noyo5tu + '@chakra-ui/input': 2.0.20_n3dxrjldmk5gnycgnw7noyo5tu + '@chakra-ui/layout': 2.1.16_n3dxrjldmk5gnycgnw7noyo5tu '@chakra-ui/live-region': 2.0.13_react@18.2.0 - '@chakra-ui/media-query': 3.2.10_ublygk26yvqigtycgan52uuiea - '@chakra-ui/menu': 2.1.7_ujgxj3m7cbv2aqhaw7egfu2jla - '@chakra-ui/modal': 2.2.8_niqni3yoo4ibilvjxapfgfyqrq - '@chakra-ui/number-input': 2.0.17_ublygk26yvqigtycgan52uuiea - '@chakra-ui/pin-input': 2.0.18_ublygk26yvqigtycgan52uuiea - '@chakra-ui/popover': 2.1.7_ujgxj3m7cbv2aqhaw7egfu2jla - '@chakra-ui/popper': 3.0.12_react@18.2.0 - '@chakra-ui/portal': 2.0.14_biqbaboplfbrettd7655fr4n2y - '@chakra-ui/progress': 2.1.4_ublygk26yvqigtycgan52uuiea - '@chakra-ui/provider': 2.0.30_5rzy53przelm5jchjmb5vr6dxy - '@chakra-ui/radio': 2.0.18_ublygk26yvqigtycgan52uuiea - '@chakra-ui/react-env': 2.0.13_react@18.2.0 - '@chakra-ui/select': 2.0.17_ublygk26yvqigtycgan52uuiea - '@chakra-ui/skeleton': 2.0.22_ublygk26yvqigtycgan52uuiea - '@chakra-ui/slider': 2.0.19_ublygk26yvqigtycgan52uuiea - '@chakra-ui/spinner': 2.0.13_ublygk26yvqigtycgan52uuiea - '@chakra-ui/stat': 2.0.16_ublygk26yvqigtycgan52uuiea - '@chakra-ui/styled-system': 2.5.2 - '@chakra-ui/switch': 2.0.21_ujgxj3m7cbv2aqhaw7egfu2jla - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm - '@chakra-ui/table': 2.0.15_ublygk26yvqigtycgan52uuiea - '@chakra-ui/tabs': 2.1.7_ublygk26yvqigtycgan52uuiea - '@chakra-ui/tag': 2.0.16_ublygk26yvqigtycgan52uuiea - '@chakra-ui/textarea': 2.0.17_ublygk26yvqigtycgan52uuiea - '@chakra-ui/theme': 2.2.5_m7jbdmx3mm6xt6t3gop7zi2pq4 - '@chakra-ui/theme-utils': 2.0.9 - '@chakra-ui/toast': 5.0.0_slq2sefyqbdqqxtft4p5ni2yxi - '@chakra-ui/tooltip': 2.2.5_slq2sefyqbdqqxtft4p5ni2yxi - '@chakra-ui/transition': 2.0.14_sbd3j3rtxuycmn2w3sdkri36ke + '@chakra-ui/media-query': 3.2.12_n3dxrjldmk5gnycgnw7noyo5tu + '@chakra-ui/menu': 2.1.9_tqeex4sjgoujiorbrkdtxb3xpq + '@chakra-ui/modal': 2.2.9_zdafp7qkal2hd2ygotnw7q7pti + '@chakra-ui/number-input': 2.0.18_n3dxrjldmk5gnycgnw7noyo5tu + '@chakra-ui/pin-input': 2.0.19_n3dxrjldmk5gnycgnw7noyo5tu + '@chakra-ui/popover': 2.1.8_tqeex4sjgoujiorbrkdtxb3xpq + '@chakra-ui/popper': 3.0.13_react@18.2.0 + '@chakra-ui/portal': 2.0.15_biqbaboplfbrettd7655fr4n2y + '@chakra-ui/progress': 2.1.5_n3dxrjldmk5gnycgnw7noyo5tu + '@chakra-ui/provider': 2.1.2_5rzy53przelm5jchjmb5vr6dxy + '@chakra-ui/radio': 2.0.19_n3dxrjldmk5gnycgnw7noyo5tu + '@chakra-ui/react-env': 3.0.0_react@18.2.0 + '@chakra-ui/select': 2.0.18_n3dxrjldmk5gnycgnw7noyo5tu + '@chakra-ui/skeleton': 2.0.24_n3dxrjldmk5gnycgnw7noyo5tu + '@chakra-ui/slider': 2.0.21_n3dxrjldmk5gnycgnw7noyo5tu + '@chakra-ui/spinner': 2.0.13_n3dxrjldmk5gnycgnw7noyo5tu + '@chakra-ui/stat': 2.0.17_n3dxrjldmk5gnycgnw7noyo5tu + '@chakra-ui/styled-system': 2.6.1 + '@chakra-ui/switch': 2.0.22_tqeex4sjgoujiorbrkdtxb3xpq + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/table': 2.0.16_n3dxrjldmk5gnycgnw7noyo5tu + '@chakra-ui/tabs': 2.1.8_n3dxrjldmk5gnycgnw7noyo5tu + '@chakra-ui/tag': 2.0.17_n3dxrjldmk5gnycgnw7noyo5tu + '@chakra-ui/textarea': 2.0.18_n3dxrjldmk5gnycgnw7noyo5tu + '@chakra-ui/theme': 2.2.5_es2flcfvdj7o2v4vs237ptvmhy + '@chakra-ui/theme-utils': 2.0.11 + '@chakra-ui/toast': 6.0.1_pr6hymabj523ryahkvknbwejcu + '@chakra-ui/tooltip': 2.2.6_pr6hymabj523ryahkvknbwejcu + '@chakra-ui/transition': 2.0.15_sbd3j3rtxuycmn2w3sdkri36ke '@chakra-ui/utils': 2.0.15 - '@chakra-ui/visually-hidden': 2.0.15_ublygk26yvqigtycgan52uuiea + '@chakra-ui/visually-hidden': 2.0.15_n3dxrjldmk5gnycgnw7noyo5tu '@emotion/react': 11.10.5_kzbn2opkn2327fwg5yzwzya5o4 '@emotion/styled': 11.10.5_qvatmowesywn4ye42qoh247szu framer-motion: 8.4.3_biqbaboplfbrettd7655fr4n2y @@ -1321,15 +1328,15 @@ packages: - '@types/react' dev: false - /@chakra-ui/select/2.0.17_ublygk26yvqigtycgan52uuiea: - resolution: {integrity: sha512-wH+Vxsl7Y/qjoGmRWEcRQuoH0tQwRwHS+1wWH4Ht+xfZkQwijoUxLUNoWfXo3B/mEvq5Y//YdRFZ2LCGxihJng==} + /@chakra-ui/select/2.0.18_n3dxrjldmk5gnycgnw7noyo5tu: + resolution: {integrity: sha512-1d2lUT5LM6oOs5x4lzBh4GFDuXX62+lr+sgV7099g951/5UNbb0CS2hSZHsO7yZThLNbr7QTWZvAOAayVcGzdw==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/form-control': 2.0.16_ublygk26yvqigtycgan52uuiea + '@chakra-ui/form-control': 2.0.17_n3dxrjldmk5gnycgnw7noyo5tu '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm react: 18.2.0 dev: false @@ -1337,21 +1344,21 @@ packages: resolution: {integrity: sha512-4/Wur0FqDov7Y0nCXl7HbHzCg4aq86h+SXdoUeuCMD3dSj7dpsVnStLYhng1vxvlbUnLpdF4oz5Myt3i/a7N3Q==} dev: false - /@chakra-ui/skeleton/2.0.22_ublygk26yvqigtycgan52uuiea: - resolution: {integrity: sha512-ruj6QtCv7L4GeRVFJFpgiTwwPfKNTJA68hGlcwqdHKmv4bVcyEdVRmzuyMgxdADOBPw9Wt2khGcybO/eSbmZIA==} + /@chakra-ui/skeleton/2.0.24_n3dxrjldmk5gnycgnw7noyo5tu: + resolution: {integrity: sha512-1jXtVKcl/jpbrJlc/TyMsFyI651GTXY5ma30kWyTXoby2E+cxbV6OR8GB/NMZdGxbQBax8/VdtYVjI0n+OBqWA==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/media-query': 3.2.10_ublygk26yvqigtycgan52uuiea + '@chakra-ui/media-query': 3.2.12_n3dxrjldmk5gnycgnw7noyo5tu '@chakra-ui/react-use-previous': 2.0.5_react@18.2.0 '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm react: 18.2.0 dev: false - /@chakra-ui/slider/2.0.19_ublygk26yvqigtycgan52uuiea: - resolution: {integrity: sha512-AeYpWAqvi7J8shdPLvqmXqIDReHIgWyHEei9+38Z74w64zhzKLqhC/+ch3bpajS4oDrLrFXEaEKI2OGsk/ooMg==} + /@chakra-ui/slider/2.0.21_n3dxrjldmk5gnycgnw7noyo5tu: + resolution: {integrity: sha512-Mm76yJxEqJl21+3waEcKg3tM8Y4elJ7mcViN6Brj35PTfzUJfSJxeBGo1nLPJ+X5jLj7o/L4kfBmUk3lY4QYEQ==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' @@ -1364,60 +1371,60 @@ packages: '@chakra-ui/react-use-latest-ref': 2.0.5_react@18.2.0 '@chakra-ui/react-use-merge-refs': 2.0.7_react@18.2.0 '@chakra-ui/react-use-pan-event': 2.0.9_react@18.2.0 - '@chakra-ui/react-use-size': 2.0.8_react@18.2.0 + '@chakra-ui/react-use-size': 2.0.9_react@18.2.0 '@chakra-ui/react-use-update-effect': 2.0.7_react@18.2.0 - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm react: 18.2.0 dev: false - /@chakra-ui/spinner/2.0.13_ublygk26yvqigtycgan52uuiea: + /@chakra-ui/spinner/2.0.13_n3dxrjldmk5gnycgnw7noyo5tu: resolution: {integrity: sha512-T1/aSkVpUIuiYyrjfn1+LsQEG7Onbi1UE9ccS/evgf61Dzy4GgTXQUnDuWFSgpV58owqirqOu6jn/9eCwDlzlg==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm react: 18.2.0 dev: false - /@chakra-ui/stat/2.0.16_ublygk26yvqigtycgan52uuiea: - resolution: {integrity: sha512-DWfNlR0bISwwRCG2h+KEaBDStPziA6Jl0wsvNqxspc/s//mhv7B4hIJ3MJqkTM717FCX9a8XLx23TkWyBMLUEw==} + /@chakra-ui/stat/2.0.17_n3dxrjldmk5gnycgnw7noyo5tu: + resolution: {integrity: sha512-PhD+5oVLWjQmGLfeZSmexp3AtLcaggWBwoMZ4z8QMZIQzf/fJJWMk0bMqxlpTv8ORDkfY/4ImuFB/RJHvcqlcA==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/icon': 3.0.16_ublygk26yvqigtycgan52uuiea + '@chakra-ui/icon': 3.0.16_n3dxrjldmk5gnycgnw7noyo5tu '@chakra-ui/react-context': 2.0.7_react@18.2.0 '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm react: 18.2.0 dev: false - /@chakra-ui/styled-system/2.5.2: - resolution: {integrity: sha512-FVnSWcj28F2t0R6slslYnhdWL8L3+elzoNt9oXBosS9PS6u6Yh56Dqq2GH2yasOWSmuuXGCPbzOYuc0U+MlCqg==} + /@chakra-ui/styled-system/2.6.1: + resolution: {integrity: sha512-jy/1dVi1LxjoRCm+Eo5mqBgvPy5SCWMlIcz6GbIZBDpkGeKZwtqrZLjekxxLBCy8ORY+kJlUB0FT6AzVR/1tjw==} dependencies: '@chakra-ui/shared-utils': 2.0.5 csstype: 3.1.1 lodash.mergewith: 4.6.2 dev: false - /@chakra-ui/switch/2.0.21_ujgxj3m7cbv2aqhaw7egfu2jla: - resolution: {integrity: sha512-igC4ajMeSy71+xfUro/5IRWpTkiF11RaPUZq3LPLBP3UGwvy30Zh2yeu40eCnfHFGSXHt61RKYuF0gt/3WdDyA==} + /@chakra-ui/switch/2.0.22_tqeex4sjgoujiorbrkdtxb3xpq: + resolution: {integrity: sha512-+/Yy6y7VFD91uSPruF8ZvePi3tl5D8UNVATtWEQ+QBI92DLSM+PtgJ2F0Y9GMZ9NzMxpZ80DqwY7/kqcPCfLvw==} peerDependencies: '@chakra-ui/system': '>=2.0.0' framer-motion: '>=4.0.0' react: '>=18' dependencies: - '@chakra-ui/checkbox': 2.2.9_ublygk26yvqigtycgan52uuiea + '@chakra-ui/checkbox': 2.2.10_n3dxrjldmk5gnycgnw7noyo5tu '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm framer-motion: 8.4.3_biqbaboplfbrettd7655fr4n2y react: 18.2.0 dev: false - /@chakra-ui/system/2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm: - resolution: {integrity: sha512-gUX6OZVvFDMV92NtKLuawIWqvjhYc0u1LCAMeb1k3ktVBjWEYjIM4DBIirEhHjcADa8ownrTEHeW0aGxN7uxjQ==} + /@chakra-ui/system/2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm: + resolution: {integrity: sha512-4+86OrcSoq7lGkm5fh+sJ3IWXSTzjz+HOllRbCW2Rtnmcg7ritiXVNV2VygEg2DrCcx5+tNqRHDM764zW+AEug==} peerDependencies: '@emotion/react': ^11.0.0 '@emotion/styled': ^11.0.0 @@ -1426,8 +1433,8 @@ packages: '@chakra-ui/color-mode': 2.1.12_react@18.2.0 '@chakra-ui/object-utils': 2.0.8 '@chakra-ui/react-utils': 2.0.12_react@18.2.0 - '@chakra-ui/styled-system': 2.5.2 - '@chakra-ui/theme-utils': 2.0.9 + '@chakra-ui/styled-system': 2.6.1 + '@chakra-ui/theme-utils': 2.0.11 '@chakra-ui/utils': 2.0.15 '@emotion/react': 11.10.5_kzbn2opkn2327fwg5yzwzya5o4 '@emotion/styled': 11.10.5_qvatmowesywn4ye42qoh247szu @@ -1435,25 +1442,25 @@ packages: react-fast-compare: 3.2.0 dev: false - /@chakra-ui/table/2.0.15_ublygk26yvqigtycgan52uuiea: - resolution: {integrity: sha512-tJxms2skChuTlHrNN9Alx1qFx0z7qxVP3CEo27GtIgQHaBLA8FLvyRqhTugtA6heDMJ+5EmZjsKAT2UY1Sc+xQ==} + /@chakra-ui/table/2.0.16_n3dxrjldmk5gnycgnw7noyo5tu: + resolution: {integrity: sha512-vWDXZ6Ad3Aj66curp1tZBHvCfQHX2FJ4ijLiqGgQszWFIchfhJ5vMgEBJaFMZ+BN1draAjuRTZqaQefOApzvRg==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: '@chakra-ui/react-context': 2.0.7_react@18.2.0 '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm react: 18.2.0 dev: false - /@chakra-ui/tabs/2.1.7_ublygk26yvqigtycgan52uuiea: - resolution: {integrity: sha512-h/jU0mq5ucTCMR7dSSVnw99zyhmcMp9yvFlkv8/3Pt4zafS5KzjhK0vSSFz+JHXinb4zg/YIb4OpaZi6wW2I9Q==} + /@chakra-ui/tabs/2.1.8_n3dxrjldmk5gnycgnw7noyo5tu: + resolution: {integrity: sha512-B7LeFN04Ny2jsSy5TFOQxnbZ6ITxGxLxsB2PE0vvQjMSblBrUryOxdjw80HZhfiw6od0ikK9CeKQOIt9QCguSw==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/clickable': 2.0.13_react@18.2.0 + '@chakra-ui/clickable': 2.0.14_react@18.2.0 '@chakra-ui/descendant': 3.0.13_react@18.2.0 '@chakra-ui/lazy-utils': 2.0.5 '@chakra-ui/react-children-utils': 2.0.6_react@18.2.0 @@ -1462,111 +1469,111 @@ packages: '@chakra-ui/react-use-merge-refs': 2.0.7_react@18.2.0 '@chakra-ui/react-use-safe-layout-effect': 2.0.5_react@18.2.0 '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm react: 18.2.0 dev: false - /@chakra-ui/tag/2.0.16_ublygk26yvqigtycgan52uuiea: - resolution: {integrity: sha512-o3mhyFC4oz58sN1168ufgJaGARJgmpHqJ201Gm+rj0tkIPS9cF0bCvNW9RO8X28IhzXt4vzVBwEfkN9uj4QkUw==} + /@chakra-ui/tag/2.0.17_n3dxrjldmk5gnycgnw7noyo5tu: + resolution: {integrity: sha512-A47zE9Ft9qxOJ+5r1cUseKRCoEdqCRzFm0pOtZgRcckqavglk75Xjgz8HbBpUO2zqqd49MlqdOwR8o87fXS1vg==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/icon': 3.0.16_ublygk26yvqigtycgan52uuiea + '@chakra-ui/icon': 3.0.16_n3dxrjldmk5gnycgnw7noyo5tu '@chakra-ui/react-context': 2.0.7_react@18.2.0 - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm react: 18.2.0 dev: false - /@chakra-ui/textarea/2.0.17_ublygk26yvqigtycgan52uuiea: - resolution: {integrity: sha512-tbk8CBIPApKrV/O2BEbjoAopAZz4rlPptJ4TOszp7JOI1C6PBcUJxJx6SQLHtq29aKVTjS/KhLxac6qWraPLfA==} + /@chakra-ui/textarea/2.0.18_n3dxrjldmk5gnycgnw7noyo5tu: + resolution: {integrity: sha512-aGHHb29vVifO0OtcK/k8cMykzjOKo/coDTU0NJqz7OOLAWIMNV2eGenvmO1n9tTZbmbqHiX+Sa1nPRX+pd14lg==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/form-control': 2.0.16_ublygk26yvqigtycgan52uuiea + '@chakra-ui/form-control': 2.0.17_n3dxrjldmk5gnycgnw7noyo5tu '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm react: 18.2.0 dev: false - /@chakra-ui/theme-tools/2.0.17_m7jbdmx3mm6xt6t3gop7zi2pq4: + /@chakra-ui/theme-tools/2.0.17_es2flcfvdj7o2v4vs237ptvmhy: resolution: {integrity: sha512-Auu38hnihlJZQcPok6itRDBbwof3TpXGYtDPnOvrq4Xp7jnab36HLt7KEXSDPXbtOk3ZqU99pvI1en5LbDrdjg==} peerDependencies: '@chakra-ui/styled-system': '>=2.0.0' dependencies: '@chakra-ui/anatomy': 2.1.2 '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/styled-system': 2.5.2 + '@chakra-ui/styled-system': 2.6.1 color2k: 2.0.1 dev: false - /@chakra-ui/theme-utils/2.0.9: - resolution: {integrity: sha512-+Nn1NooFeAr4d/OVU1NjXEMKCKCIfesYw27BoYzFYCWt/+cS/qcVdPJj+uXgK8L8xExhkREipt2r9kGlE+WpTw==} + /@chakra-ui/theme-utils/2.0.11: + resolution: {integrity: sha512-lBAay6Sq3/fl7exd3mFxWAbzgdQowytor0fnlHrpNStn1HgFjXukwsf6356XQOie2Vd8qaMM7qZtMh4AiC0dcg==} dependencies: '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/styled-system': 2.5.2 - '@chakra-ui/theme': 2.2.5_m7jbdmx3mm6xt6t3gop7zi2pq4 + '@chakra-ui/styled-system': 2.6.1 + '@chakra-ui/theme': 2.2.5_es2flcfvdj7o2v4vs237ptvmhy lodash.mergewith: 4.6.2 dev: false - /@chakra-ui/theme/2.2.5_m7jbdmx3mm6xt6t3gop7zi2pq4: + /@chakra-ui/theme/2.2.5_es2flcfvdj7o2v4vs237ptvmhy: resolution: {integrity: sha512-hYASZMwu0NqEv6PPydu+F3I+kMNd44yR4TwjR/lXBz/LEh64L6UPY6kQjebCfgdVtsGdl3HKg+eLlfa7SvfRgw==} peerDependencies: '@chakra-ui/styled-system': '>=2.0.0' dependencies: '@chakra-ui/anatomy': 2.1.2 '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/styled-system': 2.5.2 - '@chakra-ui/theme-tools': 2.0.17_m7jbdmx3mm6xt6t3gop7zi2pq4 + '@chakra-ui/styled-system': 2.6.1 + '@chakra-ui/theme-tools': 2.0.17_es2flcfvdj7o2v4vs237ptvmhy dev: false - /@chakra-ui/toast/5.0.0_slq2sefyqbdqqxtft4p5ni2yxi: - resolution: {integrity: sha512-K75Y6DSXmKuJatkPUuegUJXZKL+O8lvHYOONcjdBO7vYYA8mAHFcPGkDuNUFxY31LlSLCiHnWOZJiMre6HIKOg==} + /@chakra-ui/toast/6.0.1_pr6hymabj523ryahkvknbwejcu: + resolution: {integrity: sha512-ej2kJXvu/d2h6qnXU5D8XTyw0qpsfmbiU7hUffo/sPxkz89AUOQ08RUuUmB1ssW/FZcQvNMJ5WgzCTKHGBxtxw==} peerDependencies: - '@chakra-ui/system': 2.4.0 + '@chakra-ui/system': 2.5.1 framer-motion: '>=4.0.0' react: '>=18' react-dom: '>=18' dependencies: - '@chakra-ui/alert': 2.0.16_ublygk26yvqigtycgan52uuiea - '@chakra-ui/close-button': 2.0.16_ublygk26yvqigtycgan52uuiea - '@chakra-ui/portal': 2.0.14_biqbaboplfbrettd7655fr4n2y + '@chakra-ui/alert': 2.0.17_n3dxrjldmk5gnycgnw7noyo5tu + '@chakra-ui/close-button': 2.0.17_n3dxrjldmk5gnycgnw7noyo5tu + '@chakra-ui/portal': 2.0.15_biqbaboplfbrettd7655fr4n2y '@chakra-ui/react-context': 2.0.7_react@18.2.0 '@chakra-ui/react-use-timeout': 2.0.5_react@18.2.0 '@chakra-ui/react-use-update-effect': 2.0.7_react@18.2.0 '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/styled-system': 2.5.2 - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm - '@chakra-ui/theme': 2.2.5_m7jbdmx3mm6xt6t3gop7zi2pq4 + '@chakra-ui/styled-system': 2.6.1 + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/theme': 2.2.5_es2flcfvdj7o2v4vs237ptvmhy framer-motion: 8.4.3_biqbaboplfbrettd7655fr4n2y react: 18.2.0 react-dom: 18.2.0_react@18.2.0 dev: false - /@chakra-ui/tooltip/2.2.5_slq2sefyqbdqqxtft4p5ni2yxi: - resolution: {integrity: sha512-ERBn3AkhL8GITVpMqweYiu9LlKnyhKZ02CWt3wFM6sk0nmmeNxUZrlCeP5FiaOVsNT4ov5YeO5VTEO2alR7xOA==} + /@chakra-ui/tooltip/2.2.6_pr6hymabj523ryahkvknbwejcu: + resolution: {integrity: sha512-4cbneidZ5+HCWge3OZzewRQieIvhDjSsl+scrl4Scx7E0z3OmqlTIESU5nGIZDBLYqKn/UirEZhqaQ33FOS2fw==} peerDependencies: '@chakra-ui/system': '>=2.0.0' framer-motion: '>=4.0.0' react: '>=18' react-dom: '>=18' dependencies: - '@chakra-ui/popper': 3.0.12_react@18.2.0 - '@chakra-ui/portal': 2.0.14_biqbaboplfbrettd7655fr4n2y + '@chakra-ui/popper': 3.0.13_react@18.2.0 + '@chakra-ui/portal': 2.0.15_biqbaboplfbrettd7655fr4n2y '@chakra-ui/react-types': 2.0.7_react@18.2.0 '@chakra-ui/react-use-disclosure': 2.0.8_react@18.2.0 '@chakra-ui/react-use-event-listener': 2.0.7_react@18.2.0 '@chakra-ui/react-use-merge-refs': 2.0.7_react@18.2.0 '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm framer-motion: 8.4.3_biqbaboplfbrettd7655fr4n2y react: 18.2.0 react-dom: 18.2.0_react@18.2.0 dev: false - /@chakra-ui/transition/2.0.14_sbd3j3rtxuycmn2w3sdkri36ke: - resolution: {integrity: sha512-KphlRLzn9xXMGrKpd+QrxTTNFrXMvwjt+lUXjiX3m2G8ymq3zC2XzxbV+jGtuwi230PEnVMv72QV4SJYylRWTA==} + /@chakra-ui/transition/2.0.15_sbd3j3rtxuycmn2w3sdkri36ke: + resolution: {integrity: sha512-o9LBK/llQfUDHF/Ty3cQ6nShpekKTqHUoJlUOzNKhoTsNpoRerr9v0jwojrX1YI02KtVjfhFU6PiqXlDfREoNw==} peerDependencies: framer-motion: '>=4.0.0' react: '>=18' @@ -1585,13 +1592,13 @@ packages: lodash.mergewith: 4.6.2 dev: false - /@chakra-ui/visually-hidden/2.0.15_ublygk26yvqigtycgan52uuiea: + /@chakra-ui/visually-hidden/2.0.15_n3dxrjldmk5gnycgnw7noyo5tu: resolution: {integrity: sha512-WWULIiucYRBIewHKFA7BssQ2ABLHLVd9lrUo3N3SZgR0u4ZRDDVEUNOy+r+9ruDze8+36dGbN9wsN1IdELtdOw==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/system': 2.4.0_dovxhg2tvkkxkdnqyoum6wzcxm + '@chakra-ui/system': 2.5.1_dovxhg2tvkkxkdnqyoum6wzcxm react: 18.2.0 dev: false @@ -2750,8 +2757,8 @@ packages: defer-to-connect: 1.1.3 dev: true - /@tanstack/eslint-plugin-query/4.21.0: - resolution: {integrity: sha512-4ulPL4mQKb8YUjF8FXo1Dcsq8gkh8eZD5F3p/Y/jBX6UnM03lJFgy5bjWBYjDSphZ2WcIXfRsxT2TWHMFHhbog==} + /@tanstack/eslint-plugin-query/4.26.2: + resolution: {integrity: sha512-ugAvl6Is+bUMLt9BlAnXK6Wi7UnGV+4RwJ2W1ToFoucPvUb2Uf+ADU38JkHaNsI/TFgE3+kePhKh0zzDBhkw0Q==} dev: true /@tanstack/match-sorter-utils/8.7.6: @@ -2761,27 +2768,27 @@ packages: remove-accents: 0.4.2 dev: false - /@tanstack/query-core/4.22.0: - resolution: {integrity: sha512-OeLyBKBQoT265f5G9biReijeP8mBxNFwY7ZUu1dKL+YzqpG5q5z7J/N1eT8aWyKuhyDTiUHuKm5l+oIVzbtrjw==} + /@tanstack/query-core/4.26.1: + resolution: {integrity: sha512-Zrx2pVQUP4ndnsu6+K/m8zerXSVY8QM+YSbxA1/jbBY21GeCd5oKfYl92oXPK0hPEUtoNuunIdiq0ZMqLos+Zg==} dev: false - /@tanstack/react-query-devtools/4.22.0_gp275tdwez2a4eujt75dnnp754: - resolution: {integrity: sha512-YeYFBnfqvb+ZlA0IiJqiHNNSzepNhI1p2o9i8NlhQli9+Zrn230M47OBaBUs8qr3DD1dC2zGB1Dis50Ktz8gAA==} + /@tanstack/react-query-devtools/4.26.1_brdhmlf72zuns3lsk66phyptty: + resolution: {integrity: sha512-ts2mA+fyFYFRi3Cee4xBk8Fx6waSFOM+yCkFqwJfGQRGjjTIMYMZPJv4wkv7vy12IVi1SYhL8au22LRKlXS1Zg==} peerDependencies: - '@tanstack/react-query': 4.22.0 + '@tanstack/react-query': 4.26.1 react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: '@tanstack/match-sorter-utils': 8.7.6 - '@tanstack/react-query': 4.22.0_biqbaboplfbrettd7655fr4n2y + '@tanstack/react-query': 4.26.1_biqbaboplfbrettd7655fr4n2y react: 18.2.0 react-dom: 18.2.0_react@18.2.0 superjson: 1.12.1 use-sync-external-store: 1.2.0_react@18.2.0 dev: false - /@tanstack/react-query/4.22.0_biqbaboplfbrettd7655fr4n2y: - resolution: {integrity: sha512-P9o+HjG42uB/xHR6dMsJaPhtZydSe4v0xdG5G/cEj1oHZAXelMlm67/rYJNQGKgBamKElKogj+HYGF+NY2yHYg==} + /@tanstack/react-query/4.26.1_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-i3dnz4TOARGIXrXQ5P7S25Zfi4noii/bxhcwPurh2nrf5EUCcAt/95TB2HSmMweUBx206yIMWUMEQ7ptd6zwDg==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -2792,7 +2799,7 @@ packages: react-native: optional: true dependencies: - '@tanstack/query-core': 4.22.0 + '@tanstack/query-core': 4.26.1 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 use-sync-external-store: 1.2.0_react@18.2.0 @@ -3426,8 +3433,8 @@ packages: - supports-color dev: true - /@zag-js/element-size/0.3.0: - resolution: {integrity: sha512-5/hEI+0c6ZNCx6KHlOS5/WeHsd6+I7gk7Y/b/zATp4Rp3tHirs/tu1frq+iy5BmfaG9hbQtfHfUJTjOcI5jnoQ==} + /@zag-js/element-size/0.3.1: + resolution: {integrity: sha512-jR5j4G//bRzcxwAACWi9EfITnwjNmn10LxF4NmALrdZU7/PNWP3uUCdhCxd/0SCyeiJXUl0yvD57rWAbKPs1nw==} dev: false /@zag-js/focus-visible/0.2.1: @@ -3609,19 +3616,11 @@ packages: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true - /aria-hidden/1.2.2_kzbn2opkn2327fwg5yzwzya5o4: - resolution: {integrity: sha512-6y/ogyDTk/7YAe91T3E2PR1ALVKyM2QbTio5HwM+N1Q6CMlCKhvClyIjkckBswa0f2xJhjsfzIGa1yVSe1UMVA==} + /aria-hidden/1.2.3: + resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 - react: ^16.9.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true dependencies: - '@types/react': 18.0.26 - react: 18.2.0 - tslib: 2.4.1 + tslib: 2.5.0 dev: false /aria-query/5.1.3: @@ -4161,8 +4160,8 @@ packages: engines: {node: '>=0.10.0'} dev: true - /compute-scroll-into-view/1.0.14: - resolution: {integrity: sha512-mKDjINe3tc6hGelUMNDzuhorIUZ7kS7BwyY0r2wQd2HOH2tRuJykiC06iSEX8y1TuhNzvz4GcJnK16mM2J1NMQ==} + /compute-scroll-into-view/1.0.20: + resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==} dev: false /concat-map/0.0.1: @@ -4222,8 +4221,8 @@ packages: is-what: 4.1.8 dev: false - /copy-to-clipboard/3.3.1: - resolution: {integrity: sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==} + /copy-to-clipboard/3.3.3: + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} dependencies: toggle-selection: 1.0.6 dev: false @@ -5370,11 +5369,11 @@ packages: resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} dev: true - /focus-lock/0.11.4: - resolution: {integrity: sha512-LzZWJcOBIcHslQ46N3SUu/760iLPSrUtp8omM4gh9du438V2CQdks8TcOu1yvmu2C68nVOBnl1WFiKGPbQ8L6g==} + /focus-lock/0.11.6: + resolution: {integrity: sha512-KSuV3ur4gf2KqMNoZx3nXNVhqCkn42GuTYCX4tXPEwf0MjpFQmNMiN6m7dXaUXgIoivL6/65agoUMg4RLS0Vbg==} engines: {node: '>=10'} dependencies: - tslib: 2.4.1 + tslib: 2.5.0 dev: false /follow-redirects/1.15.2: @@ -6744,8 +6743,8 @@ packages: hasBin: true dev: true - /nanoid/4.0.0: - resolution: {integrity: sha512-IgBP8piMxe/gf73RTQx7hmnhwz0aaEXYakvqZyE302IXW3HyVNhdNGC+O2MwMAVhLEnvXlvKtGbtJf6wvHihCg==} + /nanoid/4.0.1: + resolution: {integrity: sha512-udKGtCCUafD3nQtJg9wBhRP3KMbPglUsgV5JVsXhvyBs/oefqb4sqMEhKBBgqZncYowu58p1prsZQBYvAj/Gww==} engines: {node: ^14 || ^16 || >=18} hasBin: true dev: false @@ -6781,8 +6780,8 @@ packages: whatwg-url: 5.0.0 dev: true - /node-osc/8.0.9: - resolution: {integrity: sha512-jC7VWbT6uUarrxFCuO2hbSzZxzF5vqVO7AwRostfzK0wNHnhJW7kSnVtzpycFxiW7B8NMNqKRZ+2eaJodaqh6Q==} + /node-osc/8.0.10: + resolution: {integrity: sha512-Lr4HdSh59V7+Tm6HfVfHoRpAbjCTdRvsm3Q7wcEb9BbVAqaDjEgvnelA1fIZa5MBRic9rHZAIPs6xzeuvKH1ng==} engines: {node: ^14.18 || ^16.13 || >=18} dependencies: osc-min: 1.1.2 @@ -7402,7 +7401,7 @@ packages: peerDependencies: react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 dependencies: - '@babel/runtime': 7.20.7 + '@babel/runtime': 7.21.0 react: 18.2.0 dev: false @@ -7419,8 +7418,8 @@ packages: resolution: {integrity: sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==} dev: false - /react-focus-lock/2.9.2_kzbn2opkn2327fwg5yzwzya5o4: - resolution: {integrity: sha512-5JfrsOKyA5Zn3h958mk7bAcfphr24jPoMoznJ8vaJF6fUrPQ8zrtEd3ILLOK8P5jvGxdMd96OxWNjDzATfR2qw==} + /react-focus-lock/2.9.4_kzbn2opkn2327fwg5yzwzya5o4: + resolution: {integrity: sha512-7pEdXyMseqm3kVjhdVH18sovparAzLg5h6WvIx7/Ck3ekjhrrDMEegHSa3swwC8wgfdd7DIdUVRGeiHT9/7Sgg==} peerDependencies: '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -7428,9 +7427,9 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.20.7 + '@babel/runtime': 7.21.0 '@types/react': 18.0.26 - focus-lock: 0.11.4 + focus-lock: 0.11.6 prop-types: 15.8.1 react: 18.2.0 react-clientside-effect: 1.2.6_react@18.2.0 @@ -7438,8 +7437,8 @@ packages: use-sidecar: 1.1.2_kzbn2opkn2327fwg5yzwzya5o4 dev: false - /react-hook-form/7.43.1_react@18.2.0: - resolution: {integrity: sha512-+s3+s8LLytRMriwwuSqeLStVjRXFGxgjjx2jED7Z+wz1J/88vpxieRQGvJVvzrzVxshZ0BRuocFERb779m2kNg==} + /react-hook-form/7.43.5_react@18.2.0: + resolution: {integrity: sha512-YcaXhuFHoOPipu5pC7ckxrLrialiOcU91pKu8P+isAcXZyMgByUK9PkI9j5fENO4+6XU5PwWXRGMIFlk9u9UBQ==} engines: {node: '>=12.22.0'} peerDependencies: react: ^16.8.0 || ^17 || ^18 @@ -7511,7 +7510,7 @@ packages: '@types/react': 18.0.26 react: 18.2.0 react-style-singleton: 2.2.1_kzbn2opkn2327fwg5yzwzya5o4 - tslib: 2.4.1 + tslib: 2.5.0 dev: false /react-remove-scroll/2.5.5_kzbn2opkn2327fwg5yzwzya5o4: @@ -7528,7 +7527,7 @@ packages: react: 18.2.0 react-remove-scroll-bar: 2.3.4_kzbn2opkn2327fwg5yzwzya5o4 react-style-singleton: 2.2.1_kzbn2opkn2327fwg5yzwzya5o4 - tslib: 2.4.1 + tslib: 2.5.0 use-callback-ref: 1.3.0_kzbn2opkn2327fwg5yzwzya5o4 use-sidecar: 1.1.2_kzbn2opkn2327fwg5yzwzya5o4 dev: false @@ -7570,7 +7569,7 @@ packages: get-nonce: 1.0.1 invariant: 2.2.4 react: 18.2.0 - tslib: 2.4.1 + tslib: 2.5.0 dev: false /react-table/7.8.0_react@18.2.0: @@ -8559,6 +8558,10 @@ packages: /tslib/2.4.1: resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} + /tslib/2.5.0: + resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} + dev: false + /tsutils/3.21.0_typescript@4.9.4: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} @@ -8807,7 +8810,7 @@ packages: dependencies: '@types/react': 18.0.26 react: 18.2.0 - tslib: 2.4.1 + tslib: 2.5.0 dev: false /use-memo-one/1.1.3_react@18.2.0: @@ -8831,7 +8834,7 @@ packages: '@types/react': 18.0.26 detect-node-es: 1.1.0 react: 18.2.0 - tslib: 2.4.1 + tslib: 2.5.0 dev: false /use-sync-external-store/1.2.0_react@18.2.0: @@ -9231,8 +9234,8 @@ packages: optional: true dev: true - /ws/8.12.1: - resolution: {integrity: sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew==} + /ws/8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1