From 6a528dd4d88316ed1477287fdd53bf6c0761a06c Mon Sep 17 00:00:00 2001 From: liberuum Date: Fri, 7 Jun 2024 12:44:57 +0100 Subject: [PATCH 1/7] update readme --- .github/app.png | Bin 0 -> 41051 bytes README.md | 62 +++++++++++++++++++++--------------------------- 2 files changed, 27 insertions(+), 35 deletions(-) create mode 100644 .github/app.png diff --git a/.github/app.png b/.github/app.png new file mode 100644 index 0000000000000000000000000000000000000000..ee9f4ec1ae7d837275e03ddeca040a75f5f0e199 GIT binary patch literal 41051 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�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 literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 924eeefb..39146fe6 100644 --- a/README.md +++ b/README.md @@ -1,57 +1,49 @@ -# Document Model Editor Demo +# Powerhouse Connect -Demo Electron app to interact with Budget Statement documents. +Open-source desktop and web application for document model management. +Interact, create, edit and manage documents with ease. -## Usage +- Connect functions as a private editor & contributor tool for contributors of open organisations. It allows teams to manage internal documents with full control over the data ownership. Connect is available as stand-alone desktop application or in the cloud. +- Connect offers a navigation menu for adding, synchronising and browsing document drives that are shared within an organisation or are private to the contributor. +- Connect allows contributors to edit and work on different 'document model types' selected or defined by the organisation. -Install dependencies: +![app](./.github/app.png) -```bash -$ yarn install -``` - -Start development mode: - -```bash -$ yarn start -``` - -Run browser version only: - -```bash -$ yarn start:web -``` +## Prerequisites -Create package for the current platform: +You can follow these instructions to setup a dev environment: -```bash -$ yarn make -``` +- Install [**Node (LTS)**](https://nodejs.org/en/download/) +- Clone this repository +- Run `npm install` to install dependencies -Build for Mac OSX: (only works on Mac) +**Starting Connect** ```bash -$ npm make:mac +npm start # start desktop app +# OR +npm run dev:web # start web app ``` -Build for Linux (deb and dpkg): (works on Linux or Mac) +After initialized, you can access the web app at `http://localhost:5173`. -```bash -$ npm make:linux -``` - -Build for Windows: (only works on Windows) +**Create a packaged version of the desktop app** ```bash -$ npm make:windows +npm run make # Create package for the current platform +npm run make:mac # Create package for Mac OSX +npm run make:linux # Create package for Linux +npm run make:windows # Create package for Windows ``` ## Troubleshooting - For a complete list of *Electron Forge* options and requirements, visit the [official docs](https://github.com/electron-userland/electron-forge#usage). - - If you're experiencing troubles with node-gyp on Windows 11, follow [this guide](https://devkimchi.com/2021/11/26/troubleshooting-node-gyp-package-on-windows11/). +- If you're experiencing troubles with node-gyp on Windows 11, follow [this guide](https://devkimchi.com/2021/11/26/troubleshooting-node-gyp-package-on-windows11/). + +- If you're experiencing troubles with node-gyp on older versions, check out [this guide](https://spin.atomicobject.com/2019/03/27/node-gyp-windows/). - - If you're experiencing troubles with node-gyp on older versions, check out [this guide](https://spin.atomicobject.com/2019/03/27/node-gyp-windows/). +- To use yarn via Windows PowerShell, check [this guide](https://bobbyhadz.com/blog/yarn-cannot-be-loaded-running-scripts-disabled) - - To use yarn via Windows PowerShell, check [this guide](https://bobbyhadz.com/blog/yarn-cannot-be-loaded-running-scripts-disabled) +- For any other issues, reach out to our discord server [`#ask-powerhouse-team`](https://discord.com/channels/815917281728659516/883285185595047937) channel for help. From 3b1342f4ceb9c07eb1e1175daeb4647fde1d8792 Mon Sep 17 00:00:00 2001 From: ryanwolhuter Date: Mon, 29 Jul 2024 15:26:02 +0200 Subject: [PATCH 2/7] feat: include copy and move handlers Signed-off-by: ryanwolhuter --- src/hooks/useUiNodes.ts | 42 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/src/hooks/useUiNodes.ts b/src/hooks/useUiNodes.ts index e2c9315b..84e73c38 100644 --- a/src/hooks/useUiNodes.ts +++ b/src/hooks/useUiNodes.ts @@ -18,7 +18,7 @@ import { useUiNodesContext, } from '@powerhousedao/design-system'; import { DocumentDriveDocument } from 'document-model-libs/document-drive'; -import { useCallback, useMemo, useState } from 'react'; +import { useCallback, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { useModal } from 'src/components/modal'; import { getNodeOptions } from 'src/utils/drive-sections'; @@ -30,9 +30,6 @@ import { useOpenSwitchboardLink } from './useOpenSwitchboardLink'; import { useUserPermissions } from './useUserPermissions'; export function useUiNodes() { - const [disableHighlightStyles, setDisableHighlightStyles] = useState(false); - const [disableDropBetween, setDisableDropBetween] = useState(false); - const { showModal } = useModal(); const { t } = useTranslation(); const uiNodesContext = useUiNodesContext(); @@ -47,6 +44,7 @@ export function useUiNodes() { const documentDriveServer = useDocumentDriveServer(); const { addFolder, + addFile, renameNode, deleteNode, addDrive, @@ -56,6 +54,7 @@ export function useUiNodes() { setDriveAvailableOffline, setDriveSharingType, copyNode, + moveNode, getSyncStatus, removeTrigger, addTrigger, @@ -185,6 +184,41 @@ export function useUiNodes() { [renameNode], ); + const onCopyNode = useCallback( + async (uiNode: UiNode, targetNode: UiNode) => { + if (uiNode.kind === DRIVE) { + throw new Error('Drive cannot be duplicated'); + } + + await copyNode(uiNode, targetNode); + }, + [copyNode], + ); + + const onMoveNode = useCallback( + async (uiNode: UiNode, targetNode: UiNode) => { + if (uiNode.kind === DRIVE) { + throw new Error('Drive cannot be moved'); + } + + await moveNode(uiNode, targetNode); + }, + [moveNode], + ); + + const onAddFile = useCallback( + async (file: File, parentNode: UiNode | null) => { + if (!parentNode) { + throw new Error('Parent node is required'); + } + if (parentNode.kind === FILE) { + throw new Error('Cannot add file to a file'); + } + return await addFile(file, parentNode.driveId, file.name, parentNode.id); + }, + [addFile], + ); + const onDuplicateNode = useCallback( async (uiNode: UiNode) => { if (!selectedParentNode) return; From 80e035328daa59c423cde9199887df11b54b0934 Mon Sep 17 00:00:00 2001 From: ryanwolhuter Date: Tue, 30 Jul 2024 09:19:04 +0200 Subject: [PATCH 3/7] feat: remove react aria drag and drop Signed-off-by: ryanwolhuter --- package-lock.json | 6 +- package.json | 2 - src/components/file-content-view.tsx | 2 +- src/components/folder-view.tsx | 17 +- .../modal/modals/CreateDocumentModal.tsx | 10 +- src/components/root.tsx | 25 +-- src/components/tabs/reordable-tab-list.tsx | 160 ------------------ src/components/tabs/tab-new.tsx | 21 ++- src/components/tabs/tab.tsx | 124 -------------- src/hooks/index.ts | 1 - src/hooks/useDropFile.tsx | 74 -------- src/hooks/useOnDropEvent.ts | 35 ---- src/hooks/useUiNodes.ts | 36 ++-- 13 files changed, 39 insertions(+), 474 deletions(-) delete mode 100644 src/components/tabs/reordable-tab-list.tsx delete mode 100644 src/components/tabs/tab.tsx delete mode 100644 src/hooks/useDropFile.tsx delete mode 100644 src/hooks/useOnDropEvent.ts diff --git a/package-lock.json b/package-lock.json index 7f193b71..4f3949ca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@powerhousedao/connect", - "version": "1.0.0-dev.45", + "version": "1.0.0-dev.46", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@powerhousedao/connect", - "version": "1.0.0-dev.45", + "version": "1.0.0-dev.46", "license": "AGPL-3.0-only", "dependencies": { "@powerhousedao/design-system": "1.0.0-alpha.150", @@ -74,8 +74,6 @@ "prettier": "^3.1.1", "prettier-plugin-organize-imports": "^3.2.4", "react": "^18.2.0", - "react-aria": "^3.32.0", - "react-aria-components": "1.2.0", "react-dom": "^18.2.0", "rollup-plugin-node-polyfills": "^0.2.1", "rollup-plugin-shim": "^1.0.0", diff --git a/package.json b/package.json index 86ac57a9..145a4043 100644 --- a/package.json +++ b/package.json @@ -76,8 +76,6 @@ "prettier": "^3.1.1", "prettier-plugin-organize-imports": "^3.2.4", "react": "^18.2.0", - "react-aria": "^3.32.0", - "react-aria-components": "1.2.0", "react-dom": "^18.2.0", "rollup-plugin-node-polyfills": "^0.2.1", "rollup-plugin-shim": "^1.0.0", diff --git a/src/components/file-content-view.tsx b/src/components/file-content-view.tsx index 6814547d..07b18a83 100644 --- a/src/components/file-content-view.tsx +++ b/src/components/file-content-view.tsx @@ -82,7 +82,7 @@ export function FileContentView(props: Props) { marginLeft: columnIndex === 0 ? 0 : GAP, }} > - + ); }; diff --git a/src/components/folder-view.tsx b/src/components/folder-view.tsx index 46ab258f..1756b1c1 100644 --- a/src/components/folder-view.tsx +++ b/src/components/folder-view.tsx @@ -2,11 +2,9 @@ import { FILE, FOLDER, FolderItem, - UiNode, - useDraggableTarget, + useDrop, } from '@powerhousedao/design-system'; import { useTranslation } from 'react-i18next'; -import { useOnDropEvent } from 'src/hooks/useOnDropEvent'; import { UiNodes } from 'src/hooks/useUiNodes'; import { sortUiNodesByName } from 'src/utils'; import { twMerge } from 'tailwind-merge'; @@ -16,10 +14,9 @@ import FileContentView from './file-content-view'; export function FolderView(props: UiNodes) { const { t } = useTranslation(); const { selectedParentNode } = props; - const onDropEvent = useOnDropEvent(); - const { dropProps, isDropTarget } = useDraggableTarget({ - data: selectedParentNode, - onDropEvent, + const { isDropTarget, dropProps } = useDrop({ + ...props, + uiNode: selectedParentNode, }); const folderNodes = @@ -36,8 +33,8 @@ export function FolderView(props: UiNodes) {
)) ) : ( diff --git a/src/components/modal/modals/CreateDocumentModal.tsx b/src/components/modal/modals/CreateDocumentModal.tsx index 5ae8f1d0..8297c856 100644 --- a/src/components/modal/modals/CreateDocumentModal.tsx +++ b/src/components/modal/modals/CreateDocumentModal.tsx @@ -1,13 +1,12 @@ import { + CreateDocumentModal as ConnectCreateDocumentModal, FILE, - RenameNodeModal, TDocumentType, UiDriveNode, UiFolderNode, UiNode, } from '@powerhousedao/design-system'; import { DocumentModel } from 'document-model/document'; -import { useTranslation } from 'react-i18next'; import { useDocumentDriveServer } from 'src/hooks/useDocumentDriveServer'; import { makeNodeSlugFromNodeName } from 'src/utils/slug'; @@ -30,7 +29,6 @@ export const CreateDocumentModal: React.FC< documentModel, } = props; - const { t } = useTranslation(); const { addDocument } = useDocumentDriveServer(); const onCreateDocument = async (documentName: string) => { @@ -63,12 +61,8 @@ export const CreateDocumentModal: React.FC< }; return ( - { if (!status) return onClose(); diff --git a/src/components/root.tsx b/src/components/root.tsx index b2146aa3..dc652565 100644 --- a/src/components/root.tsx +++ b/src/components/root.tsx @@ -1,18 +1,14 @@ import IconConnect from '@/assets/icons/connect.svg?react'; import IconLogo from '@/assets/icons/logo.svg?react'; -import React, { Suspense, useEffect } from 'react'; +import { Suspense, useEffect } from 'react'; import { Outlet, useNavigate, useSearchParams } from 'react-router-dom'; -import { useDropFile } from 'src/hooks'; import { useLoadInitialData } from 'src/hooks/useLoadInitialData'; import { useLogin } from 'src/hooks/useLogin'; import { isElectron, isMac } from 'src/hooks/utils'; import Sidebar from './sidebar'; -const ROOT_FILE_DROP = false; - const Root = () => { useLoadInitialData(); - const ref = React.useRef(null); const navigate = useNavigate(); const { login } = useLogin(); @@ -40,21 +36,13 @@ const Root = () => { return unsubscribe; }, [navigate]); - let { dropProps, isDropTarget } = useDropFile(ref); - - if (!ROOT_FILE_DROP) { - dropProps = {}; - isDropTarget = false; - } - return (
{isElectron && (
@@ -63,9 +51,7 @@ const Root = () => {
@@ -74,13 +60,6 @@ const Root = () => {
-
diff --git a/src/components/tabs/reordable-tab-list.tsx b/src/components/tabs/reordable-tab-list.tsx deleted file mode 100644 index ce92727d..00000000 --- a/src/components/tabs/reordable-tab-list.tsx +++ /dev/null @@ -1,160 +0,0 @@ -import IconCross from '@/assets/icons/cross.svg?react'; -import type { TabListStateOptions } from '@react-stately/tabs'; -import { useRef } from 'react'; -import { - DragPreview, - ListKeyboardDelegate, - mergeProps, - useDraggableCollection, - useDroppableCollection, - useTabList, -} from 'react-aria'; -import { DraggableCollectionEndEvent, Tabs } from 'react-aria-components'; -import type { DroppableCollectionStateOptions } from 'react-stately'; -import { - useDraggableCollectionState, - useDroppableCollectionState, - useTabListState, -} from 'react-stately'; -import { Tab } from 'src/store/tabs'; -import TabComponent from './tab'; -import TabButton from './tab-button'; -import { TabListDropTargetDelegate } from './tab-list-drop-target-delegate'; -import TabPanel from './tab-panel'; - -export function ReorderableTabList( - props: TabListStateOptions & - Omit< - DroppableCollectionStateOptions, - 'collection' | 'selectionManager' - > & { - onDragOut?: (key: DraggableCollectionEndEvent) => void; - } & { - onNewTab: () => void; - onCloseTab: (tab: Tab) => void; - onUpdateTab: (tab: Tab) => void; - }, -) { - // Setup listbox as normal. See the useListBox docs for more details. - const state = useTabListState(props); - const preview = useRef(null); - const ref = useRef(null); - const { tabListProps } = useTabList( - { - ...props, - orientation: 'horizontal', - }, - state, - ref, - ); - - // Setup drag state for the collection. - const dragState = useDraggableCollectionState({ - // Pass through events from props. - ...props, - // Collection and selection manager come from list state. - collection: state.collection, - selectionManager: state.selectionManager, - preview, - // Provide data for each dragged item. This function could - // also be provided by the user of the component. - getItems: keys => { - return [...keys].map(key => { - const item = state.collection.getItem(key); - const test = { - 'text/plain': item?.value?.name ?? '', - key: key.toString(), - tab: item?.value ? Tab.serialize(item.value) : '', - }; - return test; - }); - }, - onDragEnd(e) { - if (e.isInternal) { - return true; - } - - props.onDragOut?.(e); - }, - }); - - useDraggableCollection(props, dragState, ref); - - // Setup react-stately and react-aria hooks for dropping. - const dropState = useDroppableCollectionState({ - ...props, - collection: state.collection, - selectionManager: state.selectionManager, - }); - - const isDropTarget = dropState.isDropTarget({ type: 'root' }); - - const { collectionProps } = useDroppableCollection( - { - ...props, - // Provide drop targets for keyboard and pointer-based drag and drop. - keyboardDelegate: new ListKeyboardDelegate( - state.collection, - state.disabledKeys, - ref, - ), - dropTargetDelegate: new TabListDropTargetDelegate( - state.collection, - ref, - ), - }, - dropState, - ref, - ); - - return ( - -
    - {[...state.collection].map(item => ( - - ))} - - - {items => ( - 1 - ? `${items.length} items` - : items[0]['text/plain'] - } - /> - )} - -
- -
- ); -} diff --git a/src/components/tabs/tab-new.tsx b/src/components/tabs/tab-new.tsx index 8fe238ae..3de3ab3e 100644 --- a/src/components/tabs/tab-new.tsx +++ b/src/components/tabs/tab-new.tsx @@ -1,16 +1,20 @@ +import { useDrop } from '@powerhousedao/design-system'; import { useAtomValue } from 'jotai'; -import { useEffect, useRef } from 'react'; -import { useDropFile, useOpenFile } from 'src/hooks'; -import { useDocumentDriveServer } from 'src/hooks/useDocumentDriveServer'; +import { useEffect } from 'react'; +import { useOpenFile } from 'src/hooks'; +import { useUiNodes } from 'src/hooks/useUiNodes'; import { documentModelsAtom } from 'src/store/document-model'; import { preloadTabs, useTabs } from 'src/store/tabs'; import Button from '../button'; export default function TabNew() { - const ref = useRef(null); const { selectedTab, updateTab, fromDocument } = useTabs(); - const { documentDrives, addFile, openFile } = useDocumentDriveServer(); - const { dropProps, isDropTarget } = useDropFile(ref); + const uiNodes = useUiNodes(); + const { selectedDriveNode, documentDrives, addFile, openFile } = uiNodes; + const { isDropTarget, onDragOver, onDragLeave, onDrop } = useDrop({ + ...uiNodes, + uiNode: selectedDriveNode, + }); const documentModels = useAtomValue(documentModelsAtom); const handleOpenFile = useOpenFile(async (document, file) => { @@ -56,8 +60,9 @@ export default function TabNew() { Open existing file
; - state: TabListState; - dragState: DraggableCollectionState; - dropState: DroppableCollectionState; - onCloseTab: (tab: StoreTab) => void; -}) { - const ref = useRef(null); - const { tabProps } = useTab({ key: item.key }, state, ref); - const { focusProps } = useFocusRing(); - - // Register the item as a drag source. - const { dragProps } = useDraggableItem( - { - key: item.key, - }, - dragState - ); - - const isSameTab = dragState.draggedKey === item.key; - - const isNextTab = - dragState.draggedKey === state.collection.getKeyBefore(item.key); - - const previewItem = dragState.draggedKey - ? state.collection.getItem(dragState.draggedKey) - : null; - const previewElement = previewItem ? ( - - ) : undefined; - - ref.current?.addEventListener('contextmenu', () => { - window.electronAPI?.showTabMenu( - item.value ? StoreTab.serialize(item.value) : '' - ); - }); - - return ( - <> - {!(isSameTab || isNextTab) && ( - - )} - - {!isSameTab && state.collection.getKeyAfter(item.key) == null && ( - - )} - - ); -} - -function DropIndicator( - props: { dropState: DroppableCollectionState } & DropIndicatorProps & { - preview?: ReactNode; - } -) { - const ref = useRef(null); - const { dropIndicatorProps, isHidden } = useDropIndicator( - props, - props.dropState, - ref - ); - if (isHidden) { - return null; - } - - return ( -
  • - {props.preview} -
  • - ); -} diff --git a/src/hooks/index.ts b/src/hooks/index.ts index 5df51641..ce58ebe3 100644 --- a/src/hooks/index.ts +++ b/src/hooks/index.ts @@ -1,2 +1 @@ -export * from './useDropFile'; export * from './useOpenFile'; diff --git a/src/hooks/useDropFile.tsx b/src/hooks/useDropFile.tsx deleted file mode 100644 index 718c82ae..00000000 --- a/src/hooks/useDropFile.tsx +++ /dev/null @@ -1,74 +0,0 @@ -import type { DropEvent } from '@react-types/shared'; -import { useCallback } from 'react'; -import { useDrop } from 'react-aria'; -import { useNavigate } from 'react-router-dom'; -import { useGetDocumentModel } from 'src/store/document-model'; -import { useTabs } from 'src/store/tabs'; -import { loadFile } from 'src/utils/file'; -import { useDocumentDriveServer } from './useDocumentDriveServer'; - -export function useDropFile(ref: React.RefObject) { - const { - addTab, - selectedTab, - getItem, - updateTab, - fromDocument, - fromString, - } = useTabs(); - const navigate = useNavigate(); - const getDocumentModel = useGetDocumentModel(); - const { documentDrives, addFile, openFile } = useDocumentDriveServer(); - - const onDrop = useCallback( - async (e: DropEvent) => { - for (const item of e.items) { - if (item.kind === 'file') { - const file = await item.getFile(); - - const drive = documentDrives[0]; // TODO improve default drive selection - if (drive) { - const fileName = file.name - .split('.') - .slice(0, -1) - .join('.'); - - const node = await addFile( - file, - drive.state.global.id, - fileName, - undefined, // TODO selectedFolder as parent folder - ); - - if (node) { - openFile(drive.state.global.id, node.id); - } - } else { - const document = await loadFile(file, getDocumentModel); - const tab = await fromDocument(document, selectedTab); - addTab(tab); - } - navigate('/'); - } else if (item.kind === 'text') { - try { - const tabStr = await item.getText('tab'); - const tab = await fromString(tabStr); - addTab(tab); - navigate('/'); - } catch (error) { - console.log( - `Dropped text not recognized as tab: ${error}`, - ); - console.log(item); - } - } - } - }, - [addTab, selectedTab, getItem, updateTab, documentDrives], - ); - - return useDrop({ - ref, - onDrop, - }); -} diff --git a/src/hooks/useOnDropEvent.ts b/src/hooks/useOnDropEvent.ts deleted file mode 100644 index cc5901f0..00000000 --- a/src/hooks/useOnDropEvent.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { UiNode, UseDraggableTargetProps } from '@powerhousedao/design-system'; -import { useDocumentDriveServer } from 'src/hooks/useDocumentDriveServer'; - -export const useOnDropEvent = () => { - const { copyNode, moveNode, addFile } = useDocumentDriveServer(); - - const onDropEventHandler: UseDraggableTargetProps['onDropEvent'] = - async (item, target, event) => { - const isDropAfter = !!item.dropAfterItem; - const isFileUpload = item.kind === 'file'; - // const sortOptions: SortOptions | undefined = isDropAfter - // ? { afterNodePath: target.id } - // : undefined; - if (!target) return; - - if (isFileUpload) { - const file = await item.getFile(); - await addFile(file, target.driveId, file.name, target.id); - - return; - } - - if (item.data === null) return; - - const isMoveOperation = event.dropOperation === 'move'; - - if (isMoveOperation) { - await moveNode(item.data, target); - } else { - await copyNode(item.data, target); - } - }; - - return onDropEventHandler; -}; diff --git a/src/hooks/useUiNodes.ts b/src/hooks/useUiNodes.ts index 84e73c38..4d21624c 100644 --- a/src/hooks/useUiNodes.ts +++ b/src/hooks/useUiNodes.ts @@ -2,7 +2,6 @@ import { AddLocalDriveInput, AddRemoteDriveInput, CLOUD, - DragAndDropProps, DRIVE, FILE, FOLDER, @@ -25,7 +24,6 @@ import { getNodeOptions } from 'src/utils/drive-sections'; import { makeNodeSlugFromNodeName } from 'src/utils/slug'; import { useDocumentDriveById } from './useDocumentDriveById'; import { useDocumentDriveServer } from './useDocumentDriveServer'; -import { useOnDropEvent } from './useOnDropEvent'; import { useOpenSwitchboardLink } from './useOpenSwitchboardLink'; import { useUserPermissions } from './useUserPermissions'; @@ -40,7 +38,6 @@ export function useUiNodes() { setSelectedNode, getParentNode, } = uiNodesContext; - const onDropEvent = useOnDropEvent(); const documentDriveServer = useDocumentDriveServer(); const { addFolder, @@ -214,7 +211,12 @@ export function useUiNodes() { if (parentNode.kind === FILE) { throw new Error('Cannot add file to a file'); } - return await addFile(file, parentNode.driveId, file.name, parentNode.id); + return await addFile( + file, + parentNode.driveId, + file.name, + parentNode.id, + ); }, [addFile], ); @@ -469,24 +471,6 @@ export function useUiNodes() { [addTrigger], ); - const draDragAndDropProps: DragAndDropProps = useMemo( - () => ({ - onDropEvent, - onDropActivate: (dropTargetItem: UiNode) => - setSelectedNode(dropTargetItem), - onDragStart: () => setDisableHighlightStyles(true), - onDragEnd: () => setDisableHighlightStyles(false), - disableDropBetween, - disableHighlightStyles, - }), - [ - disableDropBetween, - disableHighlightStyles, - onDropEvent, - setSelectedNode, - ], - ); - const driveNodesBySharingType = useMemo( () => driveNodes.reduce>( @@ -508,11 +492,13 @@ export function useUiNodes() { ...documentDriveServer, ...uiNodesContext, ...userPermissions, - ...draDragAndDropProps, ...selectedDocumentDrive, nodeOptions, driveNodesBySharingType, onAddFolder, + onAddFile, + onCopyNode, + onMoveNode, onRenameNode, onDuplicateNode, onDeleteNode, @@ -530,11 +516,13 @@ export function useUiNodes() { documentDriveServer, uiNodesContext, userPermissions, - draDragAndDropProps, selectedDocumentDrive, nodeOptions, driveNodesBySharingType, onAddFolder, + onAddFile, + onCopyNode, + onMoveNode, onRenameNode, onDuplicateNode, onDeleteNode, From e959228254441df256a4477812b941623c64feea Mon Sep 17 00:00:00 2001 From: ryanwolhuter Date: Tue, 30 Jul 2024 17:05:07 +0200 Subject: [PATCH 4/7] feat: update node lifecycle scripts Signed-off-by: ryanwolhuter --- package-lock.json | 1 + package.json | 9 ++++++--- scripts/{index.js => copyIconsFromDesignSystem.js} | 0 3 files changed, 7 insertions(+), 3 deletions(-) rename scripts/{index.js => copyIconsFromDesignSystem.js} (100%) diff --git a/package-lock.json b/package-lock.json index 4f3949ca..e7523fd3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,6 +7,7 @@ "": { "name": "@powerhousedao/connect", "version": "1.0.0-dev.46", + "hasInstallScript": true, "license": "AGPL-3.0-only", "dependencies": { "@powerhousedao/design-system": "1.0.0-alpha.150", diff --git a/package.json b/package.json index 145a4043..61b11125 100644 --- a/package.json +++ b/package.json @@ -29,10 +29,13 @@ "build:web": "NODE_OPTIONS=--max-old-space-size=6144 vite build -c vite.renderer.config.mts", "preview:web": "vite preview -c vite.renderer.config.mts", "release": "semantic-release", - "prepare": "npm run prepare:scripts", - "prepare:scripts": "node scripts/index.js", + "update-icons": "node scripts/copyIconsFromDesignSystem.js", "e2e": "playwright test", - "cy:open": "cypress open" + "postinstall": "npm run update-icons", + "cy:open": "cypress open", + "prestart": "npm run update-icons", + "prebuild:web": "npm run update-icons", + "predev:web": "npm run update-icons" }, "devDependencies": { "@commitlint/cli": "^18.4.3", diff --git a/scripts/index.js b/scripts/copyIconsFromDesignSystem.js similarity index 100% rename from scripts/index.js rename to scripts/copyIconsFromDesignSystem.js From 9866258f1da336e3161232e279b68bbaf7c901b0 Mon Sep 17 00:00:00 2001 From: ryanwolhuter Date: Tue, 30 Jul 2024 17:14:26 +0200 Subject: [PATCH 5/7] feat: only copy icons post install Signed-off-by: ryanwolhuter --- package.json | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/package.json b/package.json index 61b11125..3adc2994 100644 --- a/package.json +++ b/package.json @@ -32,10 +32,7 @@ "update-icons": "node scripts/copyIconsFromDesignSystem.js", "e2e": "playwright test", "postinstall": "npm run update-icons", - "cy:open": "cypress open", - "prestart": "npm run update-icons", - "prebuild:web": "npm run update-icons", - "predev:web": "npm run update-icons" + "cy:open": "cypress open" }, "devDependencies": { "@commitlint/cli": "^18.4.3", From 9f5516c502769a4056e36d92187595c0ea53ea33 Mon Sep 17 00:00:00 2001 From: ryanwolhuter Date: Wed, 31 Jul 2024 10:02:23 +0200 Subject: [PATCH 6/7] feat: bump document-model-libs Signed-off-by: ryanwolhuter --- package-lock.json | 1300 ++++++--------------------------------------- package.json | 6 +- 2 files changed, 179 insertions(+), 1127 deletions(-) diff --git a/package-lock.json b/package-lock.json index e7523fd3..03832eeb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,13 +10,13 @@ "hasInstallScript": true, "license": "AGPL-3.0-only", "dependencies": { - "@powerhousedao/design-system": "1.0.0-alpha.150", + "@powerhousedao/design-system": "1.0.0-alpha.153", "@sentry/react": "^7.109.0", "@tanstack/react-virtual": "^3.8.1", "did-key-creator": "^1.2.0", "document-drive": "1.0.0-alpha.82", "document-model": "1.7.0", - "document-model-libs": "^1.69.0", + "document-model-libs": "^1.75.0", "electron-is-dev": "^3.0.1", "electron-squirrel-startup": "^1.0.0", "electron-store": "^8.1.0", @@ -5034,50 +5034,6 @@ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.4.tgz", "integrity": "sha512-dWO2pw8hhi+WrXq1YJy2yCuWoL20PddgGaqTgVe4cOS9Q6qklXCiA1tJEqX6BEwRNSCP84/afac9hd4MS+zEUA==" }, - "node_modules/@formatjs/ecma402-abstract": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.0.0.tgz", - "integrity": "sha512-rRqXOqdFmk7RYvj4khklyqzcfQl9vEL/usogncBHRZfZBDOwMGuSRNFl02fu5KGHXdbinju+YXyuR+Nk8xlr/g==", - "dependencies": { - "@formatjs/intl-localematcher": "0.5.4", - "tslib": "^2.4.0" - } - }, - "node_modules/@formatjs/fast-memoize": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.0.tgz", - "integrity": "sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==", - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@formatjs/icu-messageformat-parser": { - "version": "2.7.8", - "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.7.8.tgz", - "integrity": "sha512-nBZJYmhpcSX0WeJ5SDYUkZ42AgR3xiyhNCsQweFx3cz/ULJjym8bHAzWKvG5e2+1XO98dBYC0fWeeAECAVSwLA==", - "dependencies": { - "@formatjs/ecma402-abstract": "2.0.0", - "@formatjs/icu-skeleton-parser": "1.8.2", - "tslib": "^2.4.0" - } - }, - "node_modules/@formatjs/icu-skeleton-parser": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.2.tgz", - "integrity": "sha512-k4ERKgw7aKGWJZgTarIcNEmvyTVD9FYh0mTrrBMHZ1b8hUu6iOJ4SzsZlo3UNAvHYa+PnvntIwRPt1/vy4nA9Q==", - "dependencies": { - "@formatjs/ecma402-abstract": "2.0.0", - "tslib": "^2.4.0" - } - }, - "node_modules/@formatjs/intl-localematcher": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.4.tgz", - "integrity": "sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@gar/promisify": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", @@ -5367,15 +5323,6 @@ "@swc/helpers": "^0.5.0" } }, - "node_modules/@internationalized/message": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@internationalized/message/-/message-3.1.4.tgz", - "integrity": "sha512-Dygi9hH1s7V9nha07pggCkvmRfDd3q2lWnMGvrJyrOwYMe1yj4D2T9BoH9I6MGR7xz0biQrtLPsqUkqXzIrBOw==", - "dependencies": { - "@swc/helpers": "^0.5.0", - "intl-messageformat": "^10.1.0" - } - }, "node_modules/@internationalized/number": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.5.3.tgz", @@ -6873,12 +6820,14 @@ } }, "node_modules/@powerhousedao/design-system": { - "version": "1.0.0-alpha.150", - "resolved": "https://registry.npmjs.org/@powerhousedao/design-system/-/design-system-1.0.0-alpha.150.tgz", - "integrity": "sha512-tCXhZ7vr9iI+JnhP3yt17kSHI6jey3C1xBHgM295X+1VbxFih/PgeSyY4UEwjOgF91V7/L+h3TbZb/lnQdRHhg==", + "version": "1.0.0-alpha.153", + "resolved": "https://registry.npmjs.org/@powerhousedao/design-system/-/design-system-1.0.0-alpha.153.tgz", + "integrity": "sha512-KB60KsM+viU1fJ+mxPjLy+R3yH1Lk0Nk5Su0B3yfm3mmCidGVne8FzrvAS/KnDQCr10B1mdXHHNi9WHKBYALMA==", "dependencies": { "@internationalized/date": "^3.5.1", "@radix-ui/react-dialog": "^1.0.5", + "@radix-ui/react-dropdown-menu": "^2.1.1", + "@radix-ui/react-tabs": "^1.1.0", "@radix-ui/react-tooltip": "^1.1.2", "@tanstack/react-query": "^5.49.2", "@tanstack/react-virtual": "^3.8.1", @@ -6894,8 +6843,6 @@ }, "peerDependencies": { "react": "^18.2.0", - "react-aria": "^3.32.0", - "react-aria-components": "1.2.0", "react-dom": "^18.2.0" } }, @@ -6944,6 +6891,31 @@ } } }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz", + "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-compose-refs": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", @@ -7007,6 +6979,20 @@ } } }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", + "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-dismissable-layer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.0.tgz", @@ -7033,6 +7019,34 @@ } } }, + "node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.1.tgz", + "integrity": "sha512-y8E+x9fBq9qvteD2Zwa4397pUVhYsh9iq44b5RD5qu1GMJWBCBuVg1hMyItbc6+zH00TxGRqd9Iot4wzf3OoBQ==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-menu": "2.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-focus-guards": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.0.tgz", @@ -7088,6 +7102,45 @@ } } }, + "node_modules/@radix-ui/react-menu": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.1.tgz", + "integrity": "sha512-oa3mXRRVjHi6DZu/ghuzdylyjaMXLymx83irM7hTxutQbD+7IhPKdMdRHD26Rm+kHRrWcrUkkRPv5pd47a2xFQ==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-focus-guards": "1.1.0", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-roving-focus": "1.1.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.7" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-popper": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.0.tgz", @@ -7187,6 +7240,36 @@ } } }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.0.tgz", + "integrity": "sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", @@ -7204,6 +7287,35 @@ } } }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.0.tgz", + "integrity": "sha512-bZgOKB/LtZIij75FSuPzyEti/XBhJH52ExgtdVqjCIh+Nx/FW+LhnbXtbCzIi34ccyMsyOja8T0thCzoHFXNKA==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-roving-focus": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-tooltip": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.1.2.tgz", @@ -7360,802 +7472,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz", "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==" }, - "node_modules/@react-aria/breadcrumbs": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@react-aria/breadcrumbs/-/breadcrumbs-3.5.13.tgz", - "integrity": "sha512-G1Gqf/P6kVdfs94ovwP18fTWuIxadIQgHsXS08JEVcFVYMjb9YjqnEBaohUxD1tq2WldMbYw53ahQblT4NTG+g==", - "dependencies": { - "@react-aria/i18n": "^3.11.1", - "@react-aria/link": "^3.7.1", - "@react-aria/utils": "^3.24.1", - "@react-types/breadcrumbs": "^3.7.5", - "@react-types/shared": "^3.23.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/button": { - "version": "3.9.5", - "resolved": "https://registry.npmjs.org/@react-aria/button/-/button-3.9.5.tgz", - "integrity": "sha512-dgcYR6j8WDOMLKuVrtxzx4jIC05cVKDzc+HnPO8lNkBAOfjcuN5tkGRtIjLtqjMvpZHhQT5aDbgFpIaZzxgFIg==", - "dependencies": { - "@react-aria/focus": "^3.17.1", - "@react-aria/interactions": "^3.21.3", - "@react-aria/utils": "^3.24.1", - "@react-stately/toggle": "^3.7.4", - "@react-types/button": "^3.9.4", - "@react-types/shared": "^3.23.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/calendar": { - "version": "3.5.8", - "resolved": "https://registry.npmjs.org/@react-aria/calendar/-/calendar-3.5.8.tgz", - "integrity": "sha512-Whlp4CeAA5/ZkzrAHUv73kgIRYjw088eYGSc+cvSOCxfrc/2XkBm9rNrnSBv0DvhJ8AG0Fjz3vYakTmF3BgZBw==", - "dependencies": { - "@internationalized/date": "^3.5.4", - "@react-aria/i18n": "^3.11.1", - "@react-aria/interactions": "^3.21.3", - "@react-aria/live-announcer": "^3.3.4", - "@react-aria/utils": "^3.24.1", - "@react-stately/calendar": "^3.5.1", - "@react-types/button": "^3.9.4", - "@react-types/calendar": "^3.4.6", - "@react-types/shared": "^3.23.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/checkbox": { - "version": "3.14.3", - "resolved": "https://registry.npmjs.org/@react-aria/checkbox/-/checkbox-3.14.3.tgz", - "integrity": "sha512-EtBJL6iu0gvrw3A4R7UeVLR6diaVk/mh4kFBc7c8hQjpEJweRr4hmJT3hrNg3MBcTWLxFiMEXPGgWEwXDBygtA==", - "dependencies": { - "@react-aria/form": "^3.0.5", - "@react-aria/interactions": "^3.21.3", - "@react-aria/label": "^3.7.8", - "@react-aria/toggle": "^3.10.4", - "@react-aria/utils": "^3.24.1", - "@react-stately/checkbox": "^3.6.5", - "@react-stately/form": "^3.0.3", - "@react-stately/toggle": "^3.7.4", - "@react-types/checkbox": "^3.8.1", - "@react-types/shared": "^3.23.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/color": { - "version": "3.0.0-beta.32", - "resolved": "https://registry.npmjs.org/@react-aria/color/-/color-3.0.0-beta.32.tgz", - "integrity": "sha512-FKy5jb+31SIaLrjQR7oMq23CCBgoPdlYN06mwb16EdN024D1ZkQ2ULUvI84vBJxCul8cMOmoIK1DBOnhDslbrQ==", - "dependencies": { - "@react-aria/i18n": "^3.11.0", - "@react-aria/interactions": "^3.21.2", - "@react-aria/numberfield": "^3.11.2", - "@react-aria/slider": "^3.7.7", - "@react-aria/spinbutton": "^3.6.4", - "@react-aria/textfield": "^3.14.4", - "@react-aria/utils": "^3.24.0", - "@react-aria/visually-hidden": "^3.8.11", - "@react-stately/color": "^3.6.0", - "@react-stately/form": "^3.0.2", - "@react-types/color": "3.0.0-beta.24", - "@react-types/shared": "^3.23.0", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/combobox": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@react-aria/combobox/-/combobox-3.9.1.tgz", - "integrity": "sha512-SpK92dCmT8qn8aEcUAihRQrBb5LZUhwIbDExFII8PvUvEFy/PoQHXIo3j1V29WkutDBDpMvBv/6XRCHGXPqrhQ==", - "dependencies": { - "@react-aria/i18n": "^3.11.1", - "@react-aria/listbox": "^3.12.1", - "@react-aria/live-announcer": "^3.3.4", - "@react-aria/menu": "^3.14.1", - "@react-aria/overlays": "^3.22.1", - "@react-aria/selection": "^3.18.1", - "@react-aria/textfield": "^3.14.5", - "@react-aria/utils": "^3.24.1", - "@react-stately/collections": "^3.10.7", - "@react-stately/combobox": "^3.8.4", - "@react-stately/form": "^3.0.3", - "@react-types/button": "^3.9.4", - "@react-types/combobox": "^3.11.1", - "@react-types/shared": "^3.23.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/datepicker": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@react-aria/datepicker/-/datepicker-3.10.1.tgz", - "integrity": "sha512-4HZL593nrNMa1GjBmWEN/OTvNS6d3/16G1YJWlqiUlv11ADulSbqBIjMmkgwrJVFcjrgqtXFy+yyrTA/oq94Zw==", - "dependencies": { - "@internationalized/date": "^3.5.4", - "@internationalized/number": "^3.5.3", - "@internationalized/string": "^3.2.3", - "@react-aria/focus": "^3.17.1", - "@react-aria/form": "^3.0.5", - "@react-aria/i18n": "^3.11.1", - "@react-aria/interactions": "^3.21.3", - "@react-aria/label": "^3.7.8", - "@react-aria/spinbutton": "^3.6.5", - "@react-aria/utils": "^3.24.1", - "@react-stately/datepicker": "^3.9.4", - "@react-stately/form": "^3.0.3", - "@react-types/button": "^3.9.4", - "@react-types/calendar": "^3.4.6", - "@react-types/datepicker": "^3.7.4", - "@react-types/dialog": "^3.5.10", - "@react-types/shared": "^3.23.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/dialog": { - "version": "3.5.14", - "resolved": "https://registry.npmjs.org/@react-aria/dialog/-/dialog-3.5.14.tgz", - "integrity": "sha512-oqDCjQ8hxe3GStf48XWBf2CliEnxlR9GgSYPHJPUc69WBj68D9rVcCW3kogJnLAnwIyf3FnzbX4wSjvUa88sAQ==", - "dependencies": { - "@react-aria/focus": "^3.17.1", - "@react-aria/overlays": "^3.22.1", - "@react-aria/utils": "^3.24.1", - "@react-types/dialog": "^3.5.10", - "@react-types/shared": "^3.23.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/dnd": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@react-aria/dnd/-/dnd-3.6.1.tgz", - "integrity": "sha512-6WnujUTD+cIYZVF/B+uXdHyJ+WSpbYa8jH282epvY4FUAq1qLmen12/HHcoj/5dswKQe8X6EM3OhkQM89d9vFw==", - "dependencies": { - "@internationalized/string": "^3.2.3", - "@react-aria/i18n": "^3.11.1", - "@react-aria/interactions": "^3.21.3", - "@react-aria/live-announcer": "^3.3.4", - "@react-aria/overlays": "^3.22.1", - "@react-aria/utils": "^3.24.1", - "@react-stately/dnd": "^3.3.1", - "@react-types/button": "^3.9.4", - "@react-types/shared": "^3.23.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/focus": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.17.1.tgz", - "integrity": "sha512-FLTySoSNqX++u0nWZJPPN5etXY0WBxaIe/YuL/GTEeuqUIuC/2bJSaw5hlsM6T2yjy6Y/VAxBcKSdAFUlU6njQ==", - "dependencies": { - "@react-aria/interactions": "^3.21.3", - "@react-aria/utils": "^3.24.1", - "@react-types/shared": "^3.23.1", - "@swc/helpers": "^0.5.0", - "clsx": "^2.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/form": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@react-aria/form/-/form-3.0.5.tgz", - "integrity": "sha512-n290jRwrrRXO3fS82MyWR+OKN7yznVesy5Q10IclSTVYHHI3VI53xtAPr/WzNjJR1um8aLhOcDNFKwnNIUUCsQ==", - "dependencies": { - "@react-aria/interactions": "^3.21.3", - "@react-aria/utils": "^3.24.1", - "@react-stately/form": "^3.0.3", - "@react-types/shared": "^3.23.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/grid": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@react-aria/grid/-/grid-3.9.1.tgz", - "integrity": "sha512-fGEZqAEaS8mqzV/II3N4ndoNWegIcbh+L3PmKbXdpKKUP8VgMs/WY5rYl5WAF0f5RoFwXqx3ibDLeR9tKj/bOg==", - "dependencies": { - "@react-aria/focus": "^3.17.1", - "@react-aria/i18n": "^3.11.1", - "@react-aria/interactions": "^3.21.3", - "@react-aria/live-announcer": "^3.3.4", - "@react-aria/selection": "^3.18.1", - "@react-aria/utils": "^3.24.1", - "@react-stately/collections": "^3.10.7", - "@react-stately/grid": "^3.8.7", - "@react-stately/selection": "^3.15.1", - "@react-stately/virtualizer": "^3.7.1", - "@react-types/checkbox": "^3.8.1", - "@react-types/grid": "^3.2.6", - "@react-types/shared": "^3.23.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/gridlist": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@react-aria/gridlist/-/gridlist-3.8.1.tgz", - "integrity": "sha512-vVPkkA+Ct0NDcpnNm/tnYaBumg0fP9pXxsPLqL1rxvsTyj1PaIpFTZ4corabPTbTDExZwUSTS3LG1n+o1OvBtQ==", - "dependencies": { - "@react-aria/focus": "^3.17.1", - "@react-aria/grid": "^3.9.1", - "@react-aria/i18n": "^3.11.1", - "@react-aria/interactions": "^3.21.3", - "@react-aria/selection": "^3.18.1", - "@react-aria/utils": "^3.24.1", - "@react-stately/collections": "^3.10.7", - "@react-stately/list": "^3.10.5", - "@react-stately/tree": "^3.8.1", - "@react-types/shared": "^3.23.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/i18n": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.11.1.tgz", - "integrity": "sha512-vuiBHw1kZruNMYeKkTGGnmPyMnM5T+gT8bz97H1FqIq1hQ6OPzmtBZ6W6l6OIMjeHI5oJo4utTwfZl495GALFQ==", - "dependencies": { - "@internationalized/date": "^3.5.4", - "@internationalized/message": "^3.1.4", - "@internationalized/number": "^3.5.3", - "@internationalized/string": "^3.2.3", - "@react-aria/ssr": "^3.9.4", - "@react-aria/utils": "^3.24.1", - "@react-types/shared": "^3.23.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/interactions": { - "version": "3.21.3", - "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.21.3.tgz", - "integrity": "sha512-BWIuf4qCs5FreDJ9AguawLVS0lV9UU+sK4CCnbCNNmYqOWY+1+gRXCsnOM32K+oMESBxilAjdHW5n1hsMqYMpA==", - "dependencies": { - "@react-aria/ssr": "^3.9.4", - "@react-aria/utils": "^3.24.1", - "@react-types/shared": "^3.23.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/label": { - "version": "3.7.8", - "resolved": "https://registry.npmjs.org/@react-aria/label/-/label-3.7.8.tgz", - "integrity": "sha512-MzgTm5+suPA3KX7Ug6ZBK2NX9cin/RFLsv1BdafJ6CZpmUSpWnGE/yQfYUB7csN7j31OsZrD3/P56eShYWAQfg==", - "dependencies": { - "@react-aria/utils": "^3.24.1", - "@react-types/shared": "^3.23.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/link": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/@react-aria/link/-/link-3.7.1.tgz", - "integrity": "sha512-a4IaV50P3fXc7DQvEIPYkJJv26JknFbRzFT5MJOMgtzuhyJoQdILEUK6XHYjcSSNCA7uLgzpojArVk5Hz3lCpw==", - "dependencies": { - "@react-aria/focus": "^3.17.1", - "@react-aria/interactions": "^3.21.3", - "@react-aria/utils": "^3.24.1", - "@react-types/link": "^3.5.5", - "@react-types/shared": "^3.23.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/listbox": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/@react-aria/listbox/-/listbox-3.12.1.tgz", - "integrity": "sha512-7JiUp0NGykbv/HgSpmTY1wqhuf/RmjFxs1HZcNaTv8A+DlzgJYc7yQqFjP3ZA/z5RvJFuuIxggIYmgIFjaRYdA==", - "dependencies": { - "@react-aria/interactions": "^3.21.3", - "@react-aria/label": "^3.7.8", - "@react-aria/selection": "^3.18.1", - "@react-aria/utils": "^3.24.1", - "@react-stately/collections": "^3.10.7", - "@react-stately/list": "^3.10.5", - "@react-types/listbox": "^3.4.9", - "@react-types/shared": "^3.23.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/live-announcer": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@react-aria/live-announcer/-/live-announcer-3.3.4.tgz", - "integrity": "sha512-w8lxs35QrRrn6pBNzVfyGOeqWdxeVKf9U6bXIVwhq7rrTqRULL8jqy8RJIMfIs1s8G5FpwWYjyBOjl2g5Cu1iA==", - "dependencies": { - "@swc/helpers": "^0.5.0" - } - }, - "node_modules/@react-aria/menu": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/@react-aria/menu/-/menu-3.14.1.tgz", - "integrity": "sha512-BYliRb38uAzq05UOFcD5XkjA5foQoXRbcH3ZufBsc4kvh79BcP1PMW6KsXKGJ7dC/PJWUwCui6QL1kUg8PqMHA==", - "dependencies": { - "@react-aria/focus": "^3.17.1", - "@react-aria/i18n": "^3.11.1", - "@react-aria/interactions": "^3.21.3", - "@react-aria/overlays": "^3.22.1", - "@react-aria/selection": "^3.18.1", - "@react-aria/utils": "^3.24.1", - "@react-stately/collections": "^3.10.7", - "@react-stately/menu": "^3.7.1", - "@react-stately/tree": "^3.8.1", - "@react-types/button": "^3.9.4", - "@react-types/menu": "^3.9.9", - "@react-types/shared": "^3.23.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/meter": { - "version": "3.4.13", - "resolved": "https://registry.npmjs.org/@react-aria/meter/-/meter-3.4.13.tgz", - "integrity": "sha512-oG6KvHQM3ri93XkYQkgEaMKSMO9KNDVpcW1MUqFfqyUXHFBRZRrJB4BTXMZ4nyjheFVQjVboU51fRwoLjOzThg==", - "dependencies": { - "@react-aria/progress": "^3.4.13", - "@react-types/meter": "^3.4.1", - "@react-types/shared": "^3.23.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/numberfield": { - "version": "3.11.3", - "resolved": "https://registry.npmjs.org/@react-aria/numberfield/-/numberfield-3.11.3.tgz", - "integrity": "sha512-QQ9ZTzBbRI8d9ksaBWm6YVXbgv+5zzUsdxVxwzJVXLznvivoORB8rpdFJzUEWVCo25lzoBxluCEPYtLOxP1B0w==", - "dependencies": { - "@react-aria/i18n": "^3.11.1", - "@react-aria/interactions": "^3.21.3", - "@react-aria/spinbutton": "^3.6.5", - "@react-aria/textfield": "^3.14.5", - "@react-aria/utils": "^3.24.1", - "@react-stately/form": "^3.0.3", - "@react-stately/numberfield": "^3.9.3", - "@react-types/button": "^3.9.4", - "@react-types/numberfield": "^3.8.3", - "@react-types/shared": "^3.23.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/overlays": { - "version": "3.22.1", - "resolved": "https://registry.npmjs.org/@react-aria/overlays/-/overlays-3.22.1.tgz", - "integrity": "sha512-GHiFMWO4EQ6+j6b5QCnNoOYiyx1Gk8ZiwLzzglCI4q1NY5AG2EAmfU4Z1+Gtrf2S5Y0zHbumC7rs9GnPoGLUYg==", - "dependencies": { - "@react-aria/focus": "^3.17.1", - "@react-aria/i18n": "^3.11.1", - "@react-aria/interactions": "^3.21.3", - "@react-aria/ssr": "^3.9.4", - "@react-aria/utils": "^3.24.1", - "@react-aria/visually-hidden": "^3.8.12", - "@react-stately/overlays": "^3.6.7", - "@react-types/button": "^3.9.4", - "@react-types/overlays": "^3.8.7", - "@react-types/shared": "^3.23.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/progress": { - "version": "3.4.13", - "resolved": "https://registry.npmjs.org/@react-aria/progress/-/progress-3.4.13.tgz", - "integrity": "sha512-YBV9bOO5JzKvG8QCI0IAA00o6FczMgIDiK8Q9p5gKorFMatFUdRayxlbIPoYHMi+PguLil0jHgC7eOyaUcrZ0g==", - "dependencies": { - "@react-aria/i18n": "^3.11.1", - "@react-aria/label": "^3.7.8", - "@react-aria/utils": "^3.24.1", - "@react-types/progress": "^3.5.4", - "@react-types/shared": "^3.23.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/radio": { - "version": "3.10.4", - "resolved": "https://registry.npmjs.org/@react-aria/radio/-/radio-3.10.4.tgz", - "integrity": "sha512-3fmoMcQtCpgjTwJReFjnvIE/C7zOZeCeWUn4JKDqz9s1ILYsC3Rk5zZ4q66tFn6v+IQnecrKT52wH6+hlVLwTA==", - "dependencies": { - "@react-aria/focus": "^3.17.1", - "@react-aria/form": "^3.0.5", - "@react-aria/i18n": "^3.11.1", - "@react-aria/interactions": "^3.21.3", - "@react-aria/label": "^3.7.8", - "@react-aria/utils": "^3.24.1", - "@react-stately/radio": "^3.10.4", - "@react-types/radio": "^3.8.1", - "@react-types/shared": "^3.23.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/searchfield": { - "version": "3.7.5", - "resolved": "https://registry.npmjs.org/@react-aria/searchfield/-/searchfield-3.7.5.tgz", - "integrity": "sha512-h1sMUOWjhevaKKUHab/luHbM6yiyeN57L4RxZU0IIc9Ww0h5Rp2GUuKZA3pcdPiExHje0aijcImL3wBHEbKAzw==", - "dependencies": { - "@react-aria/i18n": "^3.11.1", - "@react-aria/textfield": "^3.14.5", - "@react-aria/utils": "^3.24.1", - "@react-stately/searchfield": "^3.5.3", - "@react-types/button": "^3.9.4", - "@react-types/searchfield": "^3.5.5", - "@react-types/shared": "^3.23.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/select": { - "version": "3.14.5", - "resolved": "https://registry.npmjs.org/@react-aria/select/-/select-3.14.5.tgz", - "integrity": "sha512-s8jixBuTUNdKWRHe2tIJqp55ORHeUObGMw1s7PQRRVrrHPdNSYseAOI9B2W7qpl3hKhvjJg40UW+45mcb1WKbw==", - "dependencies": { - "@react-aria/form": "^3.0.5", - "@react-aria/i18n": "^3.11.1", - "@react-aria/interactions": "^3.21.3", - "@react-aria/label": "^3.7.8", - "@react-aria/listbox": "^3.12.1", - "@react-aria/menu": "^3.14.1", - "@react-aria/selection": "^3.18.1", - "@react-aria/utils": "^3.24.1", - "@react-aria/visually-hidden": "^3.8.12", - "@react-stately/select": "^3.6.4", - "@react-types/button": "^3.9.4", - "@react-types/select": "^3.9.4", - "@react-types/shared": "^3.23.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/selection": { - "version": "3.18.1", - "resolved": "https://registry.npmjs.org/@react-aria/selection/-/selection-3.18.1.tgz", - "integrity": "sha512-GSqN2jX6lh7v+ldqhVjAXDcrWS3N4IsKXxO6L6Ygsye86Q9q9Mq9twWDWWu5IjHD6LoVZLUBCMO+ENGbOkyqeQ==", - "dependencies": { - "@react-aria/focus": "^3.17.1", - "@react-aria/i18n": "^3.11.1", - "@react-aria/interactions": "^3.21.3", - "@react-aria/utils": "^3.24.1", - "@react-stately/selection": "^3.15.1", - "@react-types/shared": "^3.23.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/separator": { - "version": "3.3.13", - "resolved": "https://registry.npmjs.org/@react-aria/separator/-/separator-3.3.13.tgz", - "integrity": "sha512-hofA6JCPnAOqSE9vxnq7Dkazr7Kb2A0I5sR16fOG7ddjYRc/YEY5Nv7MWfKUGU0kNFHkgNjsDAILERtLechzeA==", - "dependencies": { - "@react-aria/utils": "^3.24.1", - "@react-types/shared": "^3.23.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/slider": { - "version": "3.7.8", - "resolved": "https://registry.npmjs.org/@react-aria/slider/-/slider-3.7.8.tgz", - "integrity": "sha512-MYvPcM0K8jxEJJicUK2+WxUkBIM/mquBxOTOSSIL3CszA80nXIGVnLlCUnQV3LOUzpWtabbWaZokSPtGgOgQOw==", - "dependencies": { - "@react-aria/focus": "^3.17.1", - "@react-aria/i18n": "^3.11.1", - "@react-aria/interactions": "^3.21.3", - "@react-aria/label": "^3.7.8", - "@react-aria/utils": "^3.24.1", - "@react-stately/slider": "^3.5.4", - "@react-types/shared": "^3.23.1", - "@react-types/slider": "^3.7.3", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/spinbutton": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/@react-aria/spinbutton/-/spinbutton-3.6.5.tgz", - "integrity": "sha512-0aACBarF/Xr/7ixzjVBTQ0NBwwwsoGkf5v6AVFVMTC0uYMXHTALvRs+ULHjHMa5e/cX/aPlEvaVT7jfSs+Xy9Q==", - "dependencies": { - "@react-aria/i18n": "^3.11.1", - "@react-aria/live-announcer": "^3.3.4", - "@react-aria/utils": "^3.24.1", - "@react-types/button": "^3.9.4", - "@react-types/shared": "^3.23.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/ssr": { - "version": "3.9.4", - "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.4.tgz", - "integrity": "sha512-4jmAigVq409qcJvQyuorsmBR4+9r3+JEC60wC+Y0MZV0HCtTmm8D9guYXlJMdx0SSkgj0hHAyFm/HvPNFofCoQ==", - "dependencies": { - "@swc/helpers": "^0.5.0" - }, - "engines": { - "node": ">= 12" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/switch": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/@react-aria/switch/-/switch-3.6.4.tgz", - "integrity": "sha512-2nVqz4ZuJyof47IpGSt3oZRmp+EdS8wzeDYgf42WHQXrx4uEOk1mdLJ20+NnsYhj/2NHZsvXVrjBeKMjlMs+0w==", - "dependencies": { - "@react-aria/toggle": "^3.10.4", - "@react-stately/toggle": "^3.7.4", - "@react-types/switch": "^3.5.3", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/table": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/@react-aria/table/-/table-3.14.1.tgz", - "integrity": "sha512-WaPgQe4zQF5OaluO5rm+Y2nEoFR63vsLd4BT4yjK1uaFhKhDY2Zk+1SCVQvBLLKS4WK9dhP05nrNzT0vp/ZPOw==", - "dependencies": { - "@react-aria/focus": "^3.17.1", - "@react-aria/grid": "^3.9.1", - "@react-aria/i18n": "^3.11.1", - "@react-aria/interactions": "^3.21.3", - "@react-aria/live-announcer": "^3.3.4", - "@react-aria/utils": "^3.24.1", - "@react-aria/visually-hidden": "^3.8.12", - "@react-stately/collections": "^3.10.7", - "@react-stately/flags": "^3.0.3", - "@react-stately/table": "^3.11.8", - "@react-stately/virtualizer": "^3.7.1", - "@react-types/checkbox": "^3.8.1", - "@react-types/grid": "^3.2.6", - "@react-types/shared": "^3.23.1", - "@react-types/table": "^3.9.5", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/tabs": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@react-aria/tabs/-/tabs-3.9.1.tgz", - "integrity": "sha512-S5v/0sRcOaSXaJYZuuy1ZVzYc7JD4sDyseG1133GjyuNjJOFHgoWMb+b4uxNIJbZxnLgynn/ZDBZSO+qU+fIxw==", - "dependencies": { - "@react-aria/focus": "^3.17.1", - "@react-aria/i18n": "^3.11.1", - "@react-aria/selection": "^3.18.1", - "@react-aria/utils": "^3.24.1", - "@react-stately/tabs": "^3.6.6", - "@react-types/shared": "^3.23.1", - "@react-types/tabs": "^3.3.7", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/tag": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@react-aria/tag/-/tag-3.4.1.tgz", - "integrity": "sha512-gcIGPYZ2OBwMT4IHnlczEezKlxr0KRPL/mSfm2Q91GE027ZGOJnqusH9az6DX1qxrQx8x3vRdqYT2KmuefkrBQ==", - "dependencies": { - "@react-aria/gridlist": "^3.8.1", - "@react-aria/i18n": "^3.11.1", - "@react-aria/interactions": "^3.21.3", - "@react-aria/label": "^3.7.8", - "@react-aria/selection": "^3.18.1", - "@react-aria/utils": "^3.24.1", - "@react-stately/list": "^3.10.5", - "@react-types/button": "^3.9.4", - "@react-types/shared": "^3.23.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/textfield": { - "version": "3.14.5", - "resolved": "https://registry.npmjs.org/@react-aria/textfield/-/textfield-3.14.5.tgz", - "integrity": "sha512-hj7H+66BjB1iTKKaFXwSZBZg88YT+wZboEXZ0DNdQB2ytzoz/g045wBItUuNi4ZjXI3P+0AOZznVMYadWBAmiA==", - "dependencies": { - "@react-aria/focus": "^3.17.1", - "@react-aria/form": "^3.0.5", - "@react-aria/label": "^3.7.8", - "@react-aria/utils": "^3.24.1", - "@react-stately/form": "^3.0.3", - "@react-stately/utils": "^3.10.1", - "@react-types/shared": "^3.23.1", - "@react-types/textfield": "^3.9.3", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/toggle": { - "version": "3.10.4", - "resolved": "https://registry.npmjs.org/@react-aria/toggle/-/toggle-3.10.4.tgz", - "integrity": "sha512-bRk+CdB8QzrSyGNjENXiTWxfzYKRw753iwQXsEAU7agPCUdB8cZJyrhbaUoD0rwczzTp2zDbZ9rRbUPdsBE2YQ==", - "dependencies": { - "@react-aria/focus": "^3.17.1", - "@react-aria/interactions": "^3.21.3", - "@react-aria/utils": "^3.24.1", - "@react-stately/toggle": "^3.7.4", - "@react-types/checkbox": "^3.8.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/toolbar": { - "version": "3.0.0-beta.4", - "resolved": "https://registry.npmjs.org/@react-aria/toolbar/-/toolbar-3.0.0-beta.4.tgz", - "integrity": "sha512-nerKAoHwHFTvf25DDtj8d/zlDaZHaTPWvL4gweTm3hu9ztisE58CoVUqzqH+VNiYjcrWr2PYgLbNLsuOzk0q1Q==", - "dependencies": { - "@react-aria/focus": "^3.17.0", - "@react-aria/i18n": "^3.11.0", - "@react-aria/utils": "^3.24.0", - "@react-types/shared": "^3.23.0", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/tooltip": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@react-aria/tooltip/-/tooltip-3.7.4.tgz", - "integrity": "sha512-+XRx4HlLYqWY3fB8Z60bQi/rbWDIGlFUtXYbtoa1J+EyRWfhpvsYImP8qeeNO/vgjUtDy1j9oKa8p6App9mBMQ==", - "dependencies": { - "@react-aria/focus": "^3.17.1", - "@react-aria/interactions": "^3.21.3", - "@react-aria/utils": "^3.24.1", - "@react-stately/tooltip": "^3.4.9", - "@react-types/shared": "^3.23.1", - "@react-types/tooltip": "^3.4.9", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/tree": { - "version": "3.0.0-alpha.0", - "resolved": "https://registry.npmjs.org/@react-aria/tree/-/tree-3.0.0-alpha.0.tgz", - "integrity": "sha512-/5dqWjSHEMlrvoJTsQuGHrtKRoxYco5OKrdIf5UQq5wHB/quUD6ZexEfn9/NzflyoHVz2zPIm7RU8J9WuZugNw==", - "dependencies": { - "@react-aria/gridlist": "^3.8.0", - "@react-aria/i18n": "^3.11.0", - "@react-aria/selection": "^3.18.0", - "@react-aria/utils": "^3.24.0", - "@react-stately/tree": "^3.8.0", - "@react-types/button": "^3.9.3", - "@react-types/shared": "^3.23.0", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/utils": { - "version": "3.24.1", - "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.24.1.tgz", - "integrity": "sha512-O3s9qhPMd6n42x9sKeJ3lhu5V1Tlnzhu6Yk8QOvDuXf7UGuUjXf9mzfHJt1dYzID4l9Fwm8toczBzPM9t0jc8Q==", - "dependencies": { - "@react-aria/ssr": "^3.9.4", - "@react-stately/utils": "^3.10.1", - "@react-types/shared": "^3.23.1", - "@swc/helpers": "^0.5.0", - "clsx": "^2.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/visually-hidden": { - "version": "3.8.12", - "resolved": "https://registry.npmjs.org/@react-aria/visually-hidden/-/visually-hidden-3.8.12.tgz", - "integrity": "sha512-Bawm+2Cmw3Xrlr7ARzl2RLtKh0lNUdJ0eNqzWcyx4c0VHUAWtThmH5l+HRqFUGzzutFZVo89SAy40BAbd0gjVw==", - "dependencies": { - "@react-aria/interactions": "^3.21.3", - "@react-aria/utils": "^3.24.1", - "@react-types/shared": "^3.23.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, "node_modules/@react-native-community/cli": { "version": "13.6.9", "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-13.6.9.tgz", @@ -9006,38 +8322,6 @@ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, - "node_modules/@react-stately/color": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@react-stately/color/-/color-3.6.1.tgz", - "integrity": "sha512-iW0nAhl3+fUBegHMw5EcAbFVDpgwHBrivfC85pVoTM3pyzp66hqNN6R6xWxW6ETyljS8UOer59+/w4GDVGdPig==", - "dependencies": { - "@internationalized/number": "^3.5.3", - "@internationalized/string": "^3.2.3", - "@react-aria/i18n": "^3.11.1", - "@react-stately/form": "^3.0.3", - "@react-stately/numberfield": "^3.9.3", - "@react-stately/slider": "^3.5.4", - "@react-stately/utils": "^3.10.1", - "@react-types/color": "3.0.0-beta.25", - "@react-types/shared": "^3.23.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-stately/color/node_modules/@react-types/color": { - "version": "3.0.0-beta.25", - "resolved": "https://registry.npmjs.org/@react-types/color/-/color-3.0.0-beta.25.tgz", - "integrity": "sha512-D24ASvLeSWouBwOBi4ftUe4/BhrZj5AiHV7tXwrVeMGOy9Z9jyeK65Xysq+R3ecaSONLXsgai5CQMvj13cOacA==", - "dependencies": { - "@react-types/shared": "^3.23.1", - "@react-types/slider": "^3.7.3" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, "node_modules/@react-stately/combobox": { "version": "3.8.4", "resolved": "https://registry.npmjs.org/@react-stately/combobox/-/combobox-3.8.4.tgz", @@ -9349,42 +8633,6 @@ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, - "node_modules/@react-stately/virtualizer": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/@react-stately/virtualizer/-/virtualizer-3.7.1.tgz", - "integrity": "sha512-voHgE6EQ+oZaLv6u2umKxakvIKNkCQuUihqKACTjdslp7SJh4Mvs3oLBI0hf0JOh+rCcFIKDvQtFwy1fXFRYBA==", - "dependencies": { - "@react-aria/utils": "^3.24.1", - "@react-types/shared": "^3.23.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/breadcrumbs": { - "version": "3.7.5", - "resolved": "https://registry.npmjs.org/@react-types/breadcrumbs/-/breadcrumbs-3.7.5.tgz", - "integrity": "sha512-lV9IDYsMiu2TgdMIjEmsOE0YWwjb3jhUNK1DCZZfq6uWuiHLgyx2EncazJBUWSjHJ4ta32j7xTuXch+8Ai6u/A==", - "dependencies": { - "@react-types/link": "^3.5.5", - "@react-types/shared": "^3.23.1" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/button": { - "version": "3.9.4", - "resolved": "https://registry.npmjs.org/@react-types/button/-/button-3.9.4.tgz", - "integrity": "sha512-raeQBJUxBp0axNF74TXB8/H50GY8Q3eV6cEKMbZFP1+Dzr09Ngv0tJBeW0ewAxAguNH5DRoMUAUGIXtSXskVdA==", - "dependencies": { - "@react-types/shared": "^3.23.1" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, "node_modules/@react-types/calendar": { "version": "3.4.6", "resolved": "https://registry.npmjs.org/@react-types/calendar/-/calendar-3.4.6.tgz", @@ -9408,18 +8656,6 @@ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, - "node_modules/@react-types/color": { - "version": "3.0.0-beta.24", - "resolved": "https://registry.npmjs.org/@react-types/color/-/color-3.0.0-beta.24.tgz", - "integrity": "sha512-YSb/9ERmFp7JxC+vjhqpcYI8HUt92SSv6aDEB+e//4RzBnCxvy+YQAGei9tI6PYIgzGgMLwEMkgpgH/7UcFblA==", - "dependencies": { - "@react-types/shared": "^3.23.0", - "@react-types/slider": "^3.7.2" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, "node_modules/@react-types/combobox": { "version": "3.11.1", "resolved": "https://registry.npmjs.org/@react-types/combobox/-/combobox-3.11.1.tgz", @@ -9445,29 +8681,6 @@ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, - "node_modules/@react-types/dialog": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@react-types/dialog/-/dialog-3.5.10.tgz", - "integrity": "sha512-S9ga+edOLNLZw7/zVOnZdT5T40etpzUYBXEKdFPbxyPYnERvRxJAsC1/ASuBU9fQAXMRgLZzADWV+wJoGS/X9g==", - "dependencies": { - "@react-types/overlays": "^3.8.7", - "@react-types/shared": "^3.23.1" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/form": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@react-types/form/-/form-3.7.4.tgz", - "integrity": "sha512-HZojAWrb6feYnhDEOy3vBamDVAHDl0l2JQZ7aIDLHmeTAGQC3JNZcm2fLTxqLye46zz8w8l8OHgI+NdD4PHdOw==", - "dependencies": { - "@react-types/shared": "^3.23.1" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, "node_modules/@react-types/grid": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/@react-types/grid/-/grid-3.2.6.tgz", @@ -9479,28 +8692,6 @@ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, - "node_modules/@react-types/link": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/@react-types/link/-/link-3.5.5.tgz", - "integrity": "sha512-G6P5WagHDR87npN7sEuC5IIgL1GsoY4WFWKO4734i2CXRYx24G9P0Su3AX4GA3qpspz8sK1AWkaCzBMmvnunfw==", - "dependencies": { - "@react-types/shared": "^3.23.1" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/listbox": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/@react-types/listbox/-/listbox-3.4.9.tgz", - "integrity": "sha512-S5G+WmNKUIOPZxZ4svWwWQupP3C6LmVfnf8QQmPDvwYXGzVc0WovkqUWyhhjJirFDswTXRCO9p0yaTHHIlkdwQ==", - "dependencies": { - "@react-types/shared": "^3.23.1" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, "node_modules/@react-types/menu": { "version": "3.9.9", "resolved": "https://registry.npmjs.org/@react-types/menu/-/menu-3.9.9.tgz", @@ -9513,17 +8704,6 @@ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, - "node_modules/@react-types/meter": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@react-types/meter/-/meter-3.4.1.tgz", - "integrity": "sha512-AIJV4NDFAqKH94s02c5Da4TH2qgJjfrw978zuFM0KUBFD85WRPKh7MvgWpomvUgmzqE6lMCzIdi1KPKqrRabdw==", - "dependencies": { - "@react-types/progress": "^3.5.4" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, "node_modules/@react-types/numberfield": { "version": "3.8.3", "resolved": "https://registry.npmjs.org/@react-types/numberfield/-/numberfield-3.8.3.tgz", @@ -9546,17 +8726,6 @@ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, - "node_modules/@react-types/progress": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@react-types/progress/-/progress-3.5.4.tgz", - "integrity": "sha512-JNc246sTjasPyx5Dp7/s0rp3Bz4qlu4LrZTulZlxWyb53WgBNL7axc26CCi+I20rWL9+c7JjhrRxnLl/1cLN5g==", - "dependencies": { - "@react-types/shared": "^3.23.1" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, "node_modules/@react-types/radio": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/@react-types/radio/-/radio-3.8.1.tgz", @@ -9610,17 +8779,6 @@ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, - "node_modules/@react-types/switch": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/@react-types/switch/-/switch-3.5.3.tgz", - "integrity": "sha512-Nb6+J5MrPaFa8ZNFKGMzAsen/NNzl5UG/BbC65SLGPy7O0VDa/sUpn7dcu8V2xRpRwwIN/Oso4v63bt2sgdkgA==", - "dependencies": { - "@react-types/shared": "^3.23.1" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, "node_modules/@react-types/table": { "version": "3.9.5", "resolved": "https://registry.npmjs.org/@react-types/table/-/table-3.9.5.tgz", @@ -14810,11 +13968,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/client-only": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" - }, "node_modules/clipboardy": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-4.0.0.tgz", @@ -16489,9 +15642,10 @@ } }, "node_modules/document-model-libs": { - "version": "1.70.0", - "resolved": "https://registry.npmjs.org/document-model-libs/-/document-model-libs-1.70.0.tgz", - "integrity": "sha512-dQ/GQmutBcwDgCug/HRjlCZ/4tl0xtA1L6K7m4gMPj1DAsA+GBqR9oFBlzMd8Ds9iNMqpj2Z1Jr9x7Iah+H6Nw==", + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/document-model-libs/-/document-model-libs-1.75.0.tgz", + "integrity": "sha512-UybDuzMtuycfDZ97vjtWcw40wWnBR3RX3XzJ7eVbBBdoI8xUWCC0LgxIBPRHLqYeU+TEmEsxLmdcJiR0UoDnDg==", + "hasInstallScript": true, "dependencies": { "@acaldas/graphql-codegen-typescript-validation-schema": "^0.12.3", "@graphql-codegen/core": "^4.0.2", @@ -16504,7 +15658,6 @@ "jsonc-parser": "^3.2.1", "jszip": "^3.10.1", "mathjs": "^13.0.0", - "react-aria-components": "1.2.0", "tailwind-merge": "^2.2.1" }, "peerDependencies": { @@ -20753,17 +19906,6 @@ "node": ">=10.13.0" } }, - "node_modules/intl-messageformat": { - "version": "10.5.14", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.5.14.tgz", - "integrity": "sha512-IjC6sI0X7YRjjyVH9aUgdftcmZK7WXdHeil4KwbjDnRWjnVitKpAx3rr6t6di1joFp5188VqKcobOPA6mCLG/w==", - "dependencies": { - "@formatjs/ecma402-abstract": "2.0.0", - "@formatjs/fast-memoize": "2.2.0", - "@formatjs/icu-messageformat-parser": "2.7.8", - "tslib": "^2.4.0" - } - }, "node_modules/into-stream": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-7.0.0.tgz", @@ -29239,88 +28381,6 @@ "node": ">=0.10.0" } }, - "node_modules/react-aria": { - "version": "3.33.1", - "resolved": "https://registry.npmjs.org/react-aria/-/react-aria-3.33.1.tgz", - "integrity": "sha512-hFC3K/UA+90Krlx2IgRTgzFbC6FSPi4pUwHT+STperPLK+cTEHkI+3Lu0YYwQSBatkgxnIv9+GtFuVbps2kROw==", - "dependencies": { - "@internationalized/string": "^3.2.3", - "@react-aria/breadcrumbs": "^3.5.13", - "@react-aria/button": "^3.9.5", - "@react-aria/calendar": "^3.5.8", - "@react-aria/checkbox": "^3.14.3", - "@react-aria/combobox": "^3.9.1", - "@react-aria/datepicker": "^3.10.1", - "@react-aria/dialog": "^3.5.14", - "@react-aria/dnd": "^3.6.1", - "@react-aria/focus": "^3.17.1", - "@react-aria/gridlist": "^3.8.1", - "@react-aria/i18n": "^3.11.1", - "@react-aria/interactions": "^3.21.3", - "@react-aria/label": "^3.7.8", - "@react-aria/link": "^3.7.1", - "@react-aria/listbox": "^3.12.1", - "@react-aria/menu": "^3.14.1", - "@react-aria/meter": "^3.4.13", - "@react-aria/numberfield": "^3.11.3", - "@react-aria/overlays": "^3.22.1", - "@react-aria/progress": "^3.4.13", - "@react-aria/radio": "^3.10.4", - "@react-aria/searchfield": "^3.7.5", - "@react-aria/select": "^3.14.5", - "@react-aria/selection": "^3.18.1", - "@react-aria/separator": "^3.3.13", - "@react-aria/slider": "^3.7.8", - "@react-aria/ssr": "^3.9.4", - "@react-aria/switch": "^3.6.4", - "@react-aria/table": "^3.14.1", - "@react-aria/tabs": "^3.9.1", - "@react-aria/tag": "^3.4.1", - "@react-aria/textfield": "^3.14.5", - "@react-aria/tooltip": "^3.7.4", - "@react-aria/utils": "^3.24.1", - "@react-aria/visually-hidden": "^3.8.12", - "@react-types/shared": "^3.23.1" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/react-aria-components": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/react-aria-components/-/react-aria-components-1.2.0.tgz", - "integrity": "sha512-Cqr1tewYe/SgNcVOptqYdm0PPAV0Xsvd2uzWX7EqJsPGHvKStl/mh2a3Ebe6dYuoOddLsqqj36DdiLC5Pb5okw==", - "dependencies": { - "@internationalized/date": "^3.5.3", - "@internationalized/string": "^3.2.2", - "@react-aria/color": "3.0.0-beta.32", - "@react-aria/focus": "^3.17.0", - "@react-aria/interactions": "^3.21.2", - "@react-aria/menu": "^3.14.0", - "@react-aria/toolbar": "3.0.0-beta.4", - "@react-aria/tree": "3.0.0-alpha.0", - "@react-aria/utils": "^3.24.0", - "@react-stately/color": "^3.6.0", - "@react-stately/menu": "^3.7.0", - "@react-stately/table": "^3.11.7", - "@react-stately/utils": "^3.10.0", - "@react-types/color": "3.0.0-beta.24", - "@react-types/form": "^3.7.3", - "@react-types/grid": "^3.2.5", - "@react-types/shared": "^3.23.0", - "@react-types/table": "^3.9.4", - "@swc/helpers": "^0.5.0", - "client-only": "^0.0.1", - "react-aria": "^3.33.0", - "react-stately": "^3.31.0", - "use-sync-external-store": "^1.2.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, "node_modules/react-devtools-core": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-5.3.1.tgz", @@ -33575,14 +32635,6 @@ } } }, - "node_modules/use-sync-external-store": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", - "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, "node_modules/username": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/username/-/username-5.1.0.tgz", diff --git a/package.json b/package.json index 3adc2994..7cc2bf4b 100644 --- a/package.json +++ b/package.json @@ -29,8 +29,8 @@ "build:web": "NODE_OPTIONS=--max-old-space-size=6144 vite build -c vite.renderer.config.mts", "preview:web": "vite preview -c vite.renderer.config.mts", "release": "semantic-release", - "update-icons": "node scripts/copyIconsFromDesignSystem.js", "e2e": "playwright test", + "update-icons": "node scripts/copyIconsFromDesignSystem.js", "postinstall": "npm run update-icons", "cy:open": "cypress open" }, @@ -91,13 +91,13 @@ "xvfb-maybe": "^0.2.1" }, "dependencies": { - "@powerhousedao/design-system": "1.0.0-alpha.150", + "@powerhousedao/design-system": "1.0.0-alpha.153", "@sentry/react": "^7.109.0", "@tanstack/react-virtual": "^3.8.1", "did-key-creator": "^1.2.0", "document-drive": "1.0.0-alpha.82", "document-model": "1.7.0", - "document-model-libs": "^1.69.0", + "document-model-libs": "^1.75.0", "electron-is-dev": "^3.0.1", "electron-squirrel-startup": "^1.0.0", "electron-store": "^8.1.0", From 8a7f62dd4e6f2145f0f86fd3652a63645624e5da Mon Sep 17 00:00:00 2001 From: ryanwolhuter Date: Wed, 31 Jul 2024 10:06:16 +0200 Subject: [PATCH 7/7] feat: remove old tabs Signed-off-by: ryanwolhuter --- src/components/tabs/index.tsx | 106 ----------------- src/components/tabs/tab-button.tsx | 51 -------- .../tabs/tab-list-drop-target-delegate.tsx | 112 ------------------ src/components/tabs/tab-new.tsx | 77 ------------ src/components/tabs/tab-panel.tsx | 41 ------- src/components/theme-selector.tsx | 75 ------------ 6 files changed, 462 deletions(-) delete mode 100644 src/components/tabs/index.tsx delete mode 100644 src/components/tabs/tab-button.tsx delete mode 100644 src/components/tabs/tab-list-drop-target-delegate.tsx delete mode 100644 src/components/tabs/tab-new.tsx delete mode 100644 src/components/tabs/tab-panel.tsx delete mode 100644 src/components/theme-selector.tsx diff --git a/src/components/tabs/index.tsx b/src/components/tabs/index.tsx deleted file mode 100644 index 16e258df..00000000 --- a/src/components/tabs/index.tsx +++ /dev/null @@ -1,106 +0,0 @@ -import { useEffect } from 'react'; -import { - DraggableCollectionEndEvent, - DroppableCollectionReorderEvent, - DroppableCollectionRootDropEvent, - TextDropItem, -} from 'react-aria-components'; -import { Item } from 'react-stately'; -import { Tab, useTabs } from 'src/store/tabs'; -import { ReorderableTabList } from './reordable-tab-list'; - -interface IProps { - tabs: ReturnType; - onNewTab: (tab?: Tab, args?: unknown[]) => void; - onCloseTab: (tab: Tab) => void; - onUpdateTab: (tab: Tab) => void; -} - -export default function Tabs({ tabs, onNewTab, onCloseTab, onUpdateTab }: IProps) { - const onReorder = (e: DroppableCollectionReorderEvent) => { - if (e.target.dropPosition === 'before') { - tabs.moveBefore(e.target.key, e.keys); - } else if (e.target.dropPosition === 'after') { - tabs.moveAfter(e.target.key, e.keys); - } - }; - - const handleTextdrop = async (item: TextDropItem) => { - try { - const tabStr = await item.getText('tab'); - const tab = await tabs.fromString(tabStr); - onNewTab(tab); - } catch (e) { - console.error(e); - } - }; - - const onRootDrop = (e: DroppableCollectionRootDropEvent) => { - e.items.forEach(item => { - switch (item.kind) { - case 'text': - handleTextdrop(item); - break; - case 'directory': - console.log('Directory dropped'); // TODO - break; - case 'file': - console.log('File dropped'); // TODO - break; - } - }); - }; - - const onSelectionChange = (key: string | number) => { - tabs.setSelectedTab(key.toString()); - }; - - const onDragOut = (e: DraggableCollectionEndEvent) => { - // check window bounds - if ( - e.x < 0 || - e.x > window.innerWidth || - e.y < 0 || - e.y > window.innerHeight - ) { - tabs.remove(...e.keys); - } - }; - - useEffect(() => { - const removeHandler1 = window.electronAPI?.handleAddTab( - async (_, tabStr) => { - const tab = await tabs.fromString(tabStr); - tabs.addTab(tab); - } - ); - - const removeHandler2 = window.electronAPI?.handleRemoveTab( - async (_, tabStr) => { - const tab = await tabs.fromString(tabStr); - tabs.remove(tab.id); - } - ); - return () => { - removeHandler1?.(); - removeHandler2?.(); - }; - }, [tabs]); - - return ( - onNewTab()} - // eslint-disable-next-line react/no-children-prop - children={item => {item.name}} - /> - ); -} diff --git a/src/components/tabs/tab-button.tsx b/src/components/tabs/tab-button.tsx deleted file mode 100644 index 95175b54..00000000 --- a/src/components/tabs/tab-button.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import IconCross from '@/assets/icons/cross.svg?react'; -import { Node } from '@react-types/shared'; -import { ButtonHTMLAttributes, DetailedHTMLProps, forwardRef } from 'react'; -import { Tab } from 'src/store/tabs'; -import { twMerge } from 'tailwind-merge'; - -type IProps = DetailedHTMLProps< - ButtonHTMLAttributes, - HTMLButtonElement -> & { - as: React.ElementType; - item: Node | string; - onCloseTab?: (tab: Tab) => void; -}; - -export default forwardRef(function TabButton(props: IProps, ref) { - const { - as = 'button', - className, - item, - onCloseTab, - ...buttonProps - } = props; - const As = as; - return ( - - {typeof item === 'string' ? item : item.rendered} -
    - typeof item !== 'string' && - item.value && - onCloseTab?.(item.value) - } - > - -
    -
    - ); -}); diff --git a/src/components/tabs/tab-list-drop-target-delegate.tsx b/src/components/tabs/tab-list-drop-target-delegate.tsx deleted file mode 100644 index a7dd9045..00000000 --- a/src/components/tabs/tab-list-drop-target-delegate.tsx +++ /dev/null @@ -1,112 +0,0 @@ -import { - Collection, - DropTarget, - DropTargetDelegate, - Node, -} from '@react-types/shared'; -import { RefObject } from 'react'; - -export class TabListDropTargetDelegate implements DropTargetDelegate { - private collection: Collection>; - private ref: RefObject; - - constructor( - collection: Collection>, - ref: RefObject - ) { - this.collection = collection; - this.ref = ref; - } - - getDropTargetFromPoint( - x: number, - _y: number, - isValidDropTarget: (target: DropTarget) => boolean - ): DropTarget { - if (this.collection.size === 0 || !this.ref.current) { - return { type: 'root' }; - } - - let rect = this.ref.current.getBoundingClientRect(); - x += rect.x; - - const elements = this.ref.current.querySelectorAll('[data-key]'); - const elementMap = new Map(); - for (const item of elements) { - if (item instanceof HTMLElement) { - elementMap.set(item.dataset.key!, item); - } - } - - const items = [...this.collection]; - let low = 0; - let high = items.length; - while (low < high) { - const mid = Math.floor((low + high) / 2); - const item = items[mid]; - const element = elementMap.get(String(item.key)); - const rect = element!.getBoundingClientRect(); - - if (x < rect.right) { - high = mid; - } else if (x > rect.left) { - low = mid + 1; - } else { - const target: DropTarget = { - type: 'item', - key: item.key, - dropPosition: 'on', - }; - - if (isValidDropTarget(target)) { - // Otherwise, if dropping on the item is accepted, try the before/after positions if within 5px - // of the right or left of the item. - if ( - x <= rect.right + 5 && - isValidDropTarget({ ...target, dropPosition: 'before' }) - ) { - target.dropPosition = 'before'; - } else if ( - x >= rect.left - 5 && - isValidDropTarget({ ...target, dropPosition: 'after' }) - ) { - target.dropPosition = 'after'; - } - } else { - // If dropping on the item isn't accepted, try the target before or after depending on the x position. - const midY = rect.right + rect.width / 2; - if ( - x <= midY && - isValidDropTarget({ ...target, dropPosition: 'before' }) - ) { - target.dropPosition = 'before'; - } else if ( - x >= midY && - isValidDropTarget({ ...target, dropPosition: 'after' }) - ) { - target.dropPosition = 'after'; - } - } - return target; - } - } - - const item = items[Math.min(low, items.length - 1)]; - const element = elementMap.get(String(item.key)); - rect = element!.getBoundingClientRect(); - - if (Math.abs(x - rect.right) < Math.abs(x - rect.left)) { - return { - type: 'item', - key: item.key, - dropPosition: 'after', - }; - } - - return { - type: 'item', - key: item.key, - dropPosition: 'before', - }; - } -} diff --git a/src/components/tabs/tab-new.tsx b/src/components/tabs/tab-new.tsx deleted file mode 100644 index 3de3ab3e..00000000 --- a/src/components/tabs/tab-new.tsx +++ /dev/null @@ -1,77 +0,0 @@ -import { useDrop } from '@powerhousedao/design-system'; -import { useAtomValue } from 'jotai'; -import { useEffect } from 'react'; -import { useOpenFile } from 'src/hooks'; -import { useUiNodes } from 'src/hooks/useUiNodes'; -import { documentModelsAtom } from 'src/store/document-model'; -import { preloadTabs, useTabs } from 'src/store/tabs'; -import Button from '../button'; - -export default function TabNew() { - const { selectedTab, updateTab, fromDocument } = useTabs(); - const uiNodes = useUiNodes(); - const { selectedDriveNode, documentDrives, addFile, openFile } = uiNodes; - const { isDropTarget, onDragOver, onDragLeave, onDrop } = useDrop({ - ...uiNodes, - uiNode: selectedDriveNode, - }); - const documentModels = useAtomValue(documentModelsAtom); - - const handleOpenFile = useOpenFile(async (document, file) => { - const drive = documentDrives[0]; // TODO improve default drive selection - if (drive) { - const node = await addFile(file, drive.state.global.id, file.name); - if (node) { - openFile(drive.state.global.id, node.id); - } - } else { - updateTab(await fromDocument(document, selectedTab)); - } - }); - - // preload document editors - useEffect(() => { - preloadTabs(); - }, []); - - return ( -
    -
    - {documentModels.map(doc => ( - - ))} -
    -

    - Open existing file -

    -
    -
    -

    Drag file here

    - -
    -
    - ); -} diff --git a/src/components/tabs/tab-panel.tsx b/src/components/tabs/tab-panel.tsx deleted file mode 100644 index e0997b33..00000000 --- a/src/components/tabs/tab-panel.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { Document } from 'document-model/document'; -import { useRef } from 'react'; -import { useTabList, useTabPanel } from 'react-aria'; -import { TabListState } from 'react-stately'; -import { Tab } from 'src/store/tabs'; -import TabNew from './tab-new'; - -export default function TabPanel({ - state, - onUpdateTab, - ...props -}: Parameters[0] & { - state: TabListState; - onUpdateTab: (tab: Tab) => void; -}) { - const ref = useRef(null); - const { tabPanelProps } = useTabPanel(props, state, ref); - const Editor = state.selectedItem.value?.content || TabNew; - - function updateTab(document: Document) { - if (!state.selectedItem.value) { - return; - } - onUpdateTab({ - ...state.selectedItem.value, - name: document.name || state.selectedItem.value.name, - document, - }); - } - - if (!state.selectedItem.value?.document) return null; - - return ( -
    - -
    - ); -} diff --git a/src/components/theme-selector.tsx b/src/components/theme-selector.tsx deleted file mode 100644 index d5c0ac37..00000000 --- a/src/components/theme-selector.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import IconDark from '@/assets/icons/dark.svg?react'; -import IconLight from '@/assets/icons/light.svg?react'; -import { useAtom, useAtomValue } from 'jotai'; -import { Switch } from 'react-aria-components'; -import { sidebarCollapsedAtom, themeAtom } from 'src/store'; - -function ThemeButton({ - Icon, - name, - isSelected, - collapsed, -}: { - Icon: React.FunctionComponent>; - name: string; - isSelected: boolean; - collapsed: boolean; -}) { - if (collapsed && !isSelected) { - return null; - } - - return ( -
    - - {collapsed || {name}} -
    - ); -} - -export default function ThemeSelector() { - const collapsed = useAtomValue(sidebarCollapsedAtom); - const [theme, setTheme] = useAtom(themeAtom); - - const isDark = theme === 'dark'; - - return ( - setTheme(isSelected ? 'dark' : 'light')} - isSelected={theme === 'dark'} - className={`flex cursor-pointer rounded-xl p-1 - ${ - collapsed - ? 'text-neutral-4' - : isDark - ? 'border-neutral-6/50 bg-neutral-6' - : 'border-neutral-3/50 bg-bg' - } - - `} - > - - - - ); -}