From 5de26447b62f38325302ec5fd3e81f8fa9a5f15c Mon Sep 17 00:00:00 2001 From: Frederico Estrela Gaiva Date: Wed, 15 Nov 2023 10:01:29 +0100 Subject: [PATCH 01/33] PF-1391 - Adding breakout room example app --- examples/breakout-rooms/.gitignore | 24 + examples/breakout-rooms/APP_SUBMISSION.md | 5 + examples/breakout-rooms/NOTES.md | 3 + examples/breakout-rooms/README.md | 108 + examples/breakout-rooms/app-manifest.yaml | 8 + examples/breakout-rooms/app.html | 15 + examples/breakout-rooms/global.d.ts | 2 + examples/breakout-rooms/index.html | 12 + examples/breakout-rooms/package.json | 37 + .../breakout-rooms/src/BreakoutManager.tsx | 214 ++ examples/breakout-rooms/src/WaitingRoom.tsx | 7 + examples/breakout-rooms/src/app.tsx | 21 + examples/breakout-rooms/src/hooks.tsx | 198 ++ examples/breakout-rooms/src/index.ts | 7 + examples/breakout-rooms/src/styles.css | 36 + examples/breakout-rooms/src/types.ts | 18 + examples/breakout-rooms/src/utils.ts | 5 + examples/breakout-rooms/tsconfig.json | 25 + examples/breakout-rooms/vite.config.ts | 31 + yarn.lock | 2137 ++++++++++++++++- 20 files changed, 2912 insertions(+), 1 deletion(-) create mode 100644 examples/breakout-rooms/.gitignore create mode 100644 examples/breakout-rooms/APP_SUBMISSION.md create mode 100644 examples/breakout-rooms/NOTES.md create mode 100644 examples/breakout-rooms/README.md create mode 100644 examples/breakout-rooms/app-manifest.yaml create mode 100644 examples/breakout-rooms/app.html create mode 100644 examples/breakout-rooms/global.d.ts create mode 100644 examples/breakout-rooms/index.html create mode 100644 examples/breakout-rooms/package.json create mode 100644 examples/breakout-rooms/src/BreakoutManager.tsx create mode 100644 examples/breakout-rooms/src/WaitingRoom.tsx create mode 100644 examples/breakout-rooms/src/app.tsx create mode 100644 examples/breakout-rooms/src/hooks.tsx create mode 100644 examples/breakout-rooms/src/index.ts create mode 100644 examples/breakout-rooms/src/styles.css create mode 100644 examples/breakout-rooms/src/types.ts create mode 100644 examples/breakout-rooms/src/utils.ts create mode 100644 examples/breakout-rooms/tsconfig.json create mode 100644 examples/breakout-rooms/vite.config.ts diff --git a/examples/breakout-rooms/.gitignore b/examples/breakout-rooms/.gitignore new file mode 100644 index 000000000..b05b37f28 --- /dev/null +++ b/examples/breakout-rooms/.gitignore @@ -0,0 +1,24 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +.next + +# testing +/coverage + +# misc +.DS_Store +*.pem +.idea + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env +dist diff --git a/examples/breakout-rooms/APP_SUBMISSION.md b/examples/breakout-rooms/APP_SUBMISSION.md new file mode 100644 index 000000000..0d3d2f0cc --- /dev/null +++ b/examples/breakout-rooms/APP_SUBMISSION.md @@ -0,0 +1,5 @@ +## Submission to Miro Marketplace + +Congrats! You have finished building your app & you'd like to publish it for +users. You can submit your app on the +[Miro Marketplace](https://developers.miro.com/docs/submit-your-app) for review. diff --git a/examples/breakout-rooms/NOTES.md b/examples/breakout-rooms/NOTES.md new file mode 100644 index 000000000..aeecadec7 --- /dev/null +++ b/examples/breakout-rooms/NOTES.md @@ -0,0 +1,3 @@ +- We don't have capabilitu to enter select mode with the WebSDK. +- We don't return user avatars from the WebSDK. +- We need to release a new types package diff --git a/examples/breakout-rooms/README.md b/examples/breakout-rooms/README.md new file mode 100644 index 000000000..4c37d42ce --- /dev/null +++ b/examples/breakout-rooms/README.md @@ -0,0 +1,108 @@ +# Miro Breakout rooms + +This example shows you how leverage collaborative and real-time features, including sessions and real-time events and storage. + +# 👨🏻‍💻 App Demo + +## TODO add recorded demo + +https://github.com/miroapp/app-examples/assets/7162412/46b1708d-fb08-412e-a7b2-31fddf9f4e87 + +# 📒 Table of Contents + +- [Included Features](#features) +- [Tools and Technologies](#tools) +- [Prerequisites](#prerequisites) +- [Associated Developer Tutorial](#tutorial) +- [Run the app locally](#run) +- [Folder Structure](#folder) +- [License](#license) + +# ⚙️ Included Features + +- [Miro Web SDK](https://developers.miro.com/docs/web-sdk-reference) +- [Collaborative sessions](TODO) +- [Attention Management](TODO) +- [Real-time events](TODO) +- [Real-time storage](TODO) + +# 🛠️ Tools and Technologies + +- [React](https://react.dev/) +- [TypeScript](https://www.typescriptlang.org/) +- [Vite](https://vitejs.dev/) + +# ✅ Prerequisites + +- You have a [Miro account](https://miro.com/signup/). +- You're [signed in to Miro](https://miro.com/login/). +- Your Miro account has a [Developer team](https://developers.miro.com/docs/create-a-developer-team). +- Your development environment includes [Node.js 14.13](https://nodejs.org/en/download) or a later version. +- All examples use `npm` as a package manager and `npx` as a package runner. + +# 📖 Associated Developer Tutorial + +> To view a more in depth developer tutorial +> of this app (including code explanations) see the [custom actions tutorial](https://developers.miro.com/docs/add-custom-actions-to-your-app) on Miro's Developer documentation. + +# 🏃🏽‍♂️ Run the app locally + +1. Run `npm install` to install dependencies. +2. Run `npm start` to start developing. \ + Your URL should be similar to this example: + ``` + http://localhost:3000 + ``` +3. Open the [app manifest editor](https://developers.miro.com/docs/manually-create-an-app#step-2-configure-your-app-in-miro) by clicking **Edit in Manifest**. \ + In the app manifest editor, configure the app as follows: + + - [`sdkUri`](https://developers.miro.com/docs/app-manifest#sdkuri): assign `http://localhost:3000` as a value for this property. \ + It defines the entry point of the app, and it corresponds to the URL of the server that the app runs on. + - [`scopes`](https://developers.miro.com/docs/app-manifest#scopes): add the permission scopes that users need to grant the app when they install it. \ + To enable the app to read from and write to the board, add the following permissions: + - `boards:read` + - `boards:write` + - `identity:read` + +4. Go back to your app home page, and under the `Permissions` section, you will see a blue button that says `Install app and get OAuth token`. Click that button. Then click on `Add` as shown in the video below. In the video we install a different app, but the process is the same regardless of the app. + +> ⚠️ We recommend to install your app on a [developer team](https://developers.miro.com/docs/create-a-developer-team) while you are developing or testing apps.⚠️ + +https://github.com/miroapp/app-examples/assets/10428517/1e6862de-8617-46ef-b265-97ff1cbfe8bf + +5. Go to your developer team, and open your boards. +6. Click on the app icon on the left sidebar. + +### Example of app yaml + +```yaml +# See https://developers.miro.com/docs/app-manifest on how to use this +appName: Brekout rooms +sdkVersion: SDK_V2 +sdkUri: http://localhost:3000 +scopes: + - boards:read + - boards:write + - identity:read +``` + +# 🗂️ Folder structure + +``` +. +├── src +│ └── index.tsx <-- Where the custom actions and icon click handler are defined. +│ └── app.tsx <-- Where the selfie is taken and the image created/updated +├── tsconfig.json <-- typescript configuration file +├── vite.config.ts <-- Vite configuration file +└── index.html <-- The app entry point. This is the value you assign to 'sdkUri' in the app manifest file. +└── capture.html <-- The content displayed in the modal to capture your selfie. +``` + +# 🫱🏻‍🫲🏽 Contributing + +If you want to contribute to this example, or any other Miro Open Source project, please review [Miro's contributing guide](https://github.com/miroapp/app-examples/blob/main/CONTRIBUTING.md). + +# 🪪 License + +[MIT License](https://github.com/miroapp/app-examples/blob/main/LICENSE). diff --git a/examples/breakout-rooms/app-manifest.yaml b/examples/breakout-rooms/app-manifest.yaml new file mode 100644 index 000000000..b0b27a7a0 --- /dev/null +++ b/examples/breakout-rooms/app-manifest.yaml @@ -0,0 +1,8 @@ +# See https://developers.miro.com/docs/app-manifest on how to use this +appName: Brekout rooms +sdkVersion: SDK_V2 +sdkUri: http://localhost:3000 +scopes: + - boards:read + - boards:write + - identity:read diff --git a/examples/breakout-rooms/app.html b/examples/breakout-rooms/app.html new file mode 100644 index 000000000..c8a42e0c8 --- /dev/null +++ b/examples/breakout-rooms/app.html @@ -0,0 +1,15 @@ + + + + + + + + Miro - Breakout rooms + + +
+ + + + diff --git a/examples/breakout-rooms/global.d.ts b/examples/breakout-rooms/global.d.ts new file mode 100644 index 000000000..18b40cc0f --- /dev/null +++ b/examples/breakout-rooms/global.d.ts @@ -0,0 +1,2 @@ +// https://vitejs.dev/guide/features.html#typescript-compiler-options +/// diff --git a/examples/breakout-rooms/index.html b/examples/breakout-rooms/index.html new file mode 100644 index 000000000..091ae98d9 --- /dev/null +++ b/examples/breakout-rooms/index.html @@ -0,0 +1,12 @@ + + + + + + + Miro - Breakout rooms + + + + + diff --git a/examples/breakout-rooms/package.json b/examples/breakout-rooms/package.json new file mode 100644 index 000000000..48370c83e --- /dev/null +++ b/examples/breakout-rooms/package.json @@ -0,0 +1,37 @@ +{ + "name": "breakout-rooms", + "version": "0.0.1", + "license": "MIT", + "description": "This example shows you how leverage collaborative and real-time features, including sessions and real-time events and storage.", + "keywords": [ + "Miro SDK", + "Vite", + "React", + "TypeSript", + "Collaborative", + "Breakout rooms", + "Real-time", + "Attention Management" + ], + "scripts": { + "start": "vite", + "build": "vite build", + "serve": "vite preview" + }, + "dependencies": { + "@mirohq/design-system": "^0.17.19", + "@stitches/react": "^1.2.8", + "mirotone": "5", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@mirohq/websdk-types": "latest", + "@types/node": "^18.8.2", + "@types/react": "^18.0.24", + "@types/react-dom": "^18.0.8", + "@vitejs/plugin-react": "^2.2.0", + "typescript": "4.9.5", + "vite": "3.0.3" + } +} diff --git a/examples/breakout-rooms/src/BreakoutManager.tsx b/examples/breakout-rooms/src/BreakoutManager.tsx new file mode 100644 index 000000000..6da7de257 --- /dev/null +++ b/examples/breakout-rooms/src/BreakoutManager.tsx @@ -0,0 +1,214 @@ +"use client"; + +import * as React from "react"; +import { DropdownMenu, IconUser } from "@mirohq/design-system"; + +import { Room } from "./types"; +import { + Frame, + OnlineUserInfo, + SelectionUpdateEvent, +} from "@mirohq/websdk-types"; +import { useBreakout, useOnlineUsers } from "./hooks"; + +export const BreakoutManager: React.FC = () => { + const { session, rooms, ...service } = useBreakout(); + const onlineUsers = useOnlineUsers(); + const [selectedRoom, setSelectedRoom] = React.useState(); + + const getSelectedRoom = () => selectedRoom; + + const unassignedUsers = React.useMemo(() => { + return onlineUsers.filter((user) => + rooms.every((room) => + room.participants.every((participant) => participant.id !== user.id), + ), + ); + }, [onlineUsers, rooms]); + + React.useEffect(() => { + const boostrap = () => { + miro.board.ui.on("selection:update", handleSelectionUpdate); + + return () => { + miro.board.ui.off("selection:update", handleSelectionUpdate); + }; + }; + + return boostrap(); + }, []); + + const handleSelectionUpdate = async (event: SelectionUpdateEvent) => { + const selectedRoom = getSelectedRoom(); + console.log({ event, selectedRoom }); + if (!event.items.length || !selectedRoom) { + return; + } + + const frame = event.items.find((item) => item.type === "frame") as Frame; + + if (frame) { + await service.setRoomTarget(selectedRoom, frame.id); + await miro.board.notifications.showInfo( + `Frame "${frame.title}" has been selected as starting point.`, + ); + await miro.board.deselect({ id: frame.id }); + setSelectedRoom(undefined); + } else { + await miro.board.notifications.showError( + "We only support frames as starting point for now", + ); + } + }; + + const handleAddGroup = async () => { + await service.addRoom(); + }; + + const handleSelectTarget = async (selected: Room) => { + setSelectedRoom(selected); + + await miro.board.notifications.showInfo( + `Select the frame in the board for ${selected.name}`, + ); + }; + + const handleAddParticipant = async ( + selected: Room, + participant: OnlineUserInfo, + ) => { + await service.addParticipant(selected, participant); + }; + + const handleRemoveParticipant = async ( + selected: Room, + participant: OnlineUserInfo, + ) => { + await service.removeParticipant(selected, participant); + }; + + const handleRemoveRoom = async (selected: Room) => { + await service.removeRoom(selected); + }; + + console.log({ selectedRoom }); + + return ( +
+ + +
+ {rooms.map((room) => ( +
+

{room.name}

+ + + + + + + + {room.participants.length ? ( + + {room.participants.map((user) => ( + handleRemoveParticipant(room, user)} + > + + + + {user.name} + + Assigned + + + ))} + + + ) : null} + {unassignedUsers.length ? ( + +
+ {unassignedUsers.map((user) => ( + handleAddParticipant(room, user)} + > + + + + {user.name} + + ))} +
+
+ ) : ( +

No unassigned users left

+ )} +
+
+ + +
+ ))} +
+ + + +
+ + {unassignedUsers.length ? ( +
+

Unassigned users

+
    + {unassignedUsers.map((user) => ( +
  • {user.name}
  • + ))} +
+
+ ) : null} + + +
+ ); +}; diff --git a/examples/breakout-rooms/src/WaitingRoom.tsx b/examples/breakout-rooms/src/WaitingRoom.tsx new file mode 100644 index 000000000..d3d5e19e6 --- /dev/null +++ b/examples/breakout-rooms/src/WaitingRoom.tsx @@ -0,0 +1,7 @@ +"use client"; + +import * as React from "react"; + +export const WaitingRoom: React.FC = () => { + return

The facilitator is preparing the breakout rooms

; +}; diff --git a/examples/breakout-rooms/src/app.tsx b/examples/breakout-rooms/src/app.tsx new file mode 100644 index 000000000..3c788a48c --- /dev/null +++ b/examples/breakout-rooms/src/app.tsx @@ -0,0 +1,21 @@ +"use client"; + +import * as React from "react"; +import { useBreakout } from "./hooks"; +import { BreakoutManager } from "./BreakoutManager"; +import { WaitingRoom } from "./WaitingRoom"; +import { createRoot } from "react-dom/client"; + +const App: React.FC = () => { + const { isFacilitator, session, state } = useBreakout(); + + if (state === "loading") { + return

Spinneer

; + } + + return isFacilitator || !session ? : ; +}; + +const container = document.getElementById("root")!; +const root = createRoot(container); +root.render(); diff --git a/examples/breakout-rooms/src/hooks.tsx b/examples/breakout-rooms/src/hooks.tsx new file mode 100644 index 000000000..c56be6cc5 --- /dev/null +++ b/examples/breakout-rooms/src/hooks.tsx @@ -0,0 +1,198 @@ +import { OnlineUserInfo, UserInfo } from "@mirohq/websdk-types"; +import * as React from "react"; +import { generateUniqueId } from "./utils"; +import { BreakoutState, Room, Session } from "./types"; + +const COLLECTION_NAME = "breakout-rooms"; + +export const useCurrentUser = () => { + const [userInfo, setUserInfo] = React.useState(); + + React.useEffect(() => { + const fetch = async () => { + const info = await miro.board.getUserInfo(); + setUserInfo(info); + }; + + fetch(); + }, []); + + return userInfo; +}; + +export const useOnlineUsers = () => { + const [onlineUsers, setOnlineUsers] = React.useState([]); + + React.useEffect(() => { + const fetch = async () => { + const users = await miro.board.getOnlineUsers(); + setOnlineUsers(users); + }; + + miro.board.ui.on("online_users:update", fetch); + + fetch(); + + return () => { + miro.board.ui.off("online_users:update", fetch); + }; + }, []); + + return onlineUsers; +}; + +export const useBreakout = () => { + const [session, setSession] = React.useState(); + const [state, setState] = React.useState("idle"); + const currentUser = useCurrentUser(); + + React.useEffect(() => { + if (session || !currentUser) { + return; + } + + const init = () => { + setState("loading"); + const breakoutRooms = miro.board.storage.collection(COLLECTION_NAME); + + breakoutRooms.get("active").then((activeSession: Session) => { + setState("idle"); + setSession(activeSession); + }); + + const activeValue = (activeSession: Session) => { + console.log("onValue", { activeSession }); + setSession(activeSession); + }; + breakoutRooms.onValue("active", activeValue); + + return () => { + breakoutRooms.offValue("active", activeValue); + }; + }; + + return init(); + }, [session, currentUser]); + + const saveSession = async (opts: Pick) => { + if (!currentUser) { + throw new Error("Could not fetch current Miro user"); + } + + const breakoutRooms = await miro.board.storage.collection(COLLECTION_NAME); + + if (session) { + const payload = { + ...session, + rooms: opts.rooms, + }; + breakoutRooms.set("active", payload); + + console.log("saveSession.update", { payload, opts }); + } else { + const newSession: Session = { + id: generateUniqueId(), + creator: currentUser, + rooms: opts.rooms, + }; + + breakoutRooms.set("active", newSession); + console.log("saveSession.new", { newSession, opts }); + } + }; + + const addParticipant = async (room: Room, participant: OnlineUserInfo) => { + const sessionRooms = session?.rooms ?? []; + + const rooms = sessionRooms.map((r) => { + if (r.id === room.id) { + const participants = [...r.participants, participant].sort((a, b) => + a.name.localeCompare(b.name), + ); + return { + ...r, + participants, + }; + } + + return r; + }); + + console.log("addParticipant", { rooms, room, participant }); + + await saveSession({ rooms }); + }; + + const removeParticipant = async (room: Room, participant: OnlineUserInfo) => { + const sessionRooms = session?.rooms ?? []; + + const rooms = sessionRooms.map((r) => { + if (r.id === room.id) { + return { + ...r, + participants: r.participants.filter((p) => p.id !== participant.id), + }; + } + + return r; + }); + + console.log("removeParticipant", { rooms, room, participant }); + + await saveSession({ rooms }); + }; + + const removeRoom = async (room: Room) => { + const sessionRooms = session?.rooms ?? []; + + const rooms = sessionRooms.filter((r) => r.id !== room.id); + + console.log("removeRoom", { rooms, room }); + await saveSession({ rooms }); + }; + + const addRoom = async (opts?: Partial) => { + const sessionRooms = session?.rooms ?? []; + + const room: Room = { + id: generateUniqueId(), + name: `Room ${sessionRooms.length + 1}`, + participants: [], + ...opts, + }; + + console.log("addRoom", { room }); + + await saveSession({ rooms: [...sessionRooms, room] }); + }; + + const setRoomTarget = async (room: Room, targetId: string) => { + const sessionRooms = session?.rooms ?? []; + + const rooms = sessionRooms.map((r) => ({ + ...r, + targetId: r.id === room.id ? targetId : r.targetId, + })); + + console.log("setRoomTarget", { room, rooms, targetId }); + + await saveSession({ rooms }); + }; + + const isFacilitator = + Boolean(session) && session?.creator.id === currentUser?.id; + const rooms = session?.rooms ?? []; + + return { + session, + state, + isFacilitator, + rooms, + saveSession, + addRoom, + addParticipant, + removeParticipant, + removeRoom, + setRoomTarget, + }; +}; diff --git a/examples/breakout-rooms/src/index.ts b/examples/breakout-rooms/src/index.ts new file mode 100644 index 000000000..ba766d049 --- /dev/null +++ b/examples/breakout-rooms/src/index.ts @@ -0,0 +1,7 @@ +export async function init() { + miro.board.ui.on("icon:click", async () => { + await miro.board.ui.openPanel({ url: "app.html" }); + }); +} + +init(); diff --git a/examples/breakout-rooms/src/styles.css b/examples/breakout-rooms/src/styles.css new file mode 100644 index 000000000..7969ea9bb --- /dev/null +++ b/examples/breakout-rooms/src/styles.css @@ -0,0 +1,36 @@ +@import "mirotone/dist/styles.css"; + +*, +*:before, +*:after { + box-sizing: border-box; +} + +/* body { + display: flex; +} + +#root { + overflow: auto; + padding: var(--space-medium); +} + +img { + max-width: 100%; + height: auto; +} + +main { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} */ + +.button-selected { + background-color: var(--blue100); +} + +.button-active { + background-color: var(--blue300); +} diff --git a/examples/breakout-rooms/src/types.ts b/examples/breakout-rooms/src/types.ts new file mode 100644 index 000000000..9be129a41 --- /dev/null +++ b/examples/breakout-rooms/src/types.ts @@ -0,0 +1,18 @@ +import { OnlineUserInfo, UserInfo } from "@mirohq/websdk-types"; + +export type Room = { + id: string; + name: string; + targetId?: string; + participants: OnlineUserInfo[]; + selected?: boolean; +}; + +export type Session = { + id: string; + creator: UserInfo; + sessionId?: string; + rooms: Room[]; +}; + +export type BreakoutState = "idle" | "loading" | "started" | "ended"; diff --git a/examples/breakout-rooms/src/utils.ts b/examples/breakout-rooms/src/utils.ts new file mode 100644 index 000000000..ed5cb3269 --- /dev/null +++ b/examples/breakout-rooms/src/utils.ts @@ -0,0 +1,5 @@ +export function generateUniqueId(): string { + const timestamp = new Date().getTime(); + const random = Math.floor(Math.random() * 1000); + return `${timestamp}${random}`; +} diff --git a/examples/breakout-rooms/tsconfig.json b/examples/breakout-rooms/tsconfig.json new file mode 100644 index 000000000..09013aa3b --- /dev/null +++ b/examples/breakout-rooms/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "esnext", + "lib": ["esnext", "dom"], + "jsx": "preserve", + "moduleResolution": "node", + "strict": true, + "sourceMap": true, + "resolveJsonModule": true, + "esModuleInterop": true, + "noEmit": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "typeRoots": ["./node_modules/@types", "./node_modules/@mirohq"], + "allowJs": true, + "incremental": true, + "isolatedModules": true + }, + "include": ["src", "pages", "*.ts"], + "exclude": ["node_modules"] +} diff --git a/examples/breakout-rooms/vite.config.ts b/examples/breakout-rooms/vite.config.ts new file mode 100644 index 000000000..6a481aeb7 --- /dev/null +++ b/examples/breakout-rooms/vite.config.ts @@ -0,0 +1,31 @@ +import path from "path"; +import fs from "fs"; +import dns from "dns"; +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; + +// https://vitejs.dev/config/server-options.html#server-host +dns.setDefaultResultOrder("verbatim"); + +// make sure vite picks up all html files in root, needed for vite build +const allHtmlEntries = fs + .readdirSync(".") + .filter((file) => path.extname(file) === ".html") + .reduce((acc, file) => { + acc[path.basename(file, ".html")] = path.resolve(__dirname, file); + + return acc; + }, {}); + +// https://vitejs.dev/config/ +export default defineConfig({ + build: { + rollupOptions: { + input: allHtmlEntries, + }, + }, + plugins: [react()], + server: { + port: 3000, + }, +}); diff --git a/yarn.lock b/yarn.lock index 3ed89735b..957ca7259 100644 --- a/yarn.lock +++ b/yarn.lock @@ -284,6 +284,13 @@ dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@^7.13.10": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.2.tgz#062b0ac103261d68a966c4c7baf2ae3e62ec3885" + integrity sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/template@^7.20.7": version "7.20.7" resolved "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz" @@ -408,6 +415,72 @@ lodash.isundefined "^3.0.1" lodash.uniq "^4.5.0" +"@floating-ui/core@^1.4.2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.5.0.tgz#5c05c60d5ae2d05101c3021c1a2a350ddc027f8c" + integrity sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg== + dependencies: + "@floating-ui/utils" "^0.1.3" + +"@floating-ui/dom@^1.5.1": + version "1.5.3" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.5.3.tgz#54e50efcb432c06c23cd33de2b575102005436fa" + integrity sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA== + dependencies: + "@floating-ui/core" "^1.4.2" + "@floating-ui/utils" "^0.1.3" + +"@floating-ui/react-dom@^2.0.0": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.0.4.tgz#b076fafbdfeb881e1d86ae748b7ff95150e9f3ec" + integrity sha512-CF8k2rgKeh/49UrnIBs4BdxPUV6vize/Db1d/YbCLyp9GiVZ0BEwf5AiDSxJRCr6yOkGqTFHtmrULxkEfYZ7dQ== + dependencies: + "@floating-ui/dom" "^1.5.1" + +"@floating-ui/utils@^0.1.3": + version "0.1.6" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.1.6.tgz#22958c042e10b67463997bd6ea7115fe28cbcaf9" + integrity sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A== + +"@formatjs/ecma402-abstract@1.18.0": + version "1.18.0" + resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.18.0.tgz#e2120e7101020140661b58430a7ff4262705a2f2" + integrity sha512-PEVLoa3zBevWSCZzPIM/lvPCi8P5l4G+NXQMc/CjEiaCWgyHieUoo0nM7Bs0n/NbuQ6JpXEolivQ9pKSBHaDlA== + dependencies: + "@formatjs/intl-localematcher" "0.5.2" + tslib "^2.4.0" + +"@formatjs/fast-memoize@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-2.2.0.tgz#33bd616d2e486c3e8ef4e68c99648c196887802b" + integrity sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA== + dependencies: + tslib "^2.4.0" + +"@formatjs/icu-messageformat-parser@2.7.3": + version "2.7.3" + resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.7.3.tgz#c8c95e7c9f8141bdb93bea0e92e4fcace19d3c9f" + integrity sha512-X/jy10V9S/vW+qlplqhMUxR8wErQ0mmIYSq4mrjpjDl9mbuGcCILcI1SUYkL5nlM4PJqpc0KOS0bFkkJNPxYRw== + dependencies: + "@formatjs/ecma402-abstract" "1.18.0" + "@formatjs/icu-skeleton-parser" "1.7.0" + tslib "^2.4.0" + +"@formatjs/icu-skeleton-parser@1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.7.0.tgz#796938d6d0ba8fc75bb9edee038d1350bfee32cb" + integrity sha512-Cfdo/fgbZzpN/jlN/ptQVe0lRHora+8ezrEeg2RfrNjyp+YStwBy7cqDY8k5/z2LzXg6O0AdzAV91XS0zIWv+A== + dependencies: + "@formatjs/ecma402-abstract" "1.18.0" + tslib "^2.4.0" + +"@formatjs/intl-localematcher@0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.5.2.tgz#5fcf029fd218905575e5080fa33facdcb623d532" + integrity sha512-txaaE2fiBMagLrR4jYhxzFO6wEdEG4TPMqrzBAcbr4HFUYzH/YC+lg6OIzKCHm8WgDdyQevxbAAV1OgcXctuGw== + dependencies: + tslib "^2.4.0" + "@humanwhocodes/config-array@^0.10.5": version "0.10.7" resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz" @@ -455,6 +528,35 @@ resolved "https://registry.npmjs.org/@icons/material/-/material-0.2.4.tgz" integrity sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw== +"@internationalized/date@^3.3.0", "@internationalized/date@^3.5.0": + version "3.5.0" + resolved "https://registry.yarnpkg.com/@internationalized/date/-/date-3.5.0.tgz#67f1dd62355f05140cc80e324842e9bfb4553abe" + integrity sha512-nw0Q+oRkizBWMioseI8+2TeUPEyopJVz5YxoYVzR0W1v+2YytiYah7s/ot35F149q/xAg4F1gT/6eTd+tsUpFQ== + dependencies: + "@swc/helpers" "^0.5.0" + +"@internationalized/message@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@internationalized/message/-/message-3.1.1.tgz#0f29c5a239b5dcd457b55f21dcd38d1a44a1236a" + integrity sha512-ZgHxf5HAPIaR0th+w0RUD62yF6vxitjlprSxmLJ1tam7FOekqRSDELMg4Cr/DdszG5YLsp5BG3FgHgqquQZbqw== + dependencies: + "@swc/helpers" "^0.5.0" + intl-messageformat "^10.1.0" + +"@internationalized/number@^3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@internationalized/number/-/number-3.4.0.tgz#1c3ebf6ac40ce649d3d97bb835ff0559957f2e1f" + integrity sha512-8TvotW3qVDHC4uv/BVoN6Qx0Dm8clHY1/vpH+dh+XRiPW/9NVpKn1P8d1A+WLphWrMwyqyWXI7uWehJPviaeIw== + dependencies: + "@swc/helpers" "^0.5.0" + +"@internationalized/string@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@internationalized/string/-/string-3.1.1.tgz#2ab7372d58bbb7ffd3de62fc2a311e4690186981" + integrity sha512-fvSr6YRoVPgONiVIUhgCmIAlifMVCeej/snPZVzbzRPxGpHl3o1GRe+d/qh92D8KhgOciruDUH8I5mjdfdjzfA== + dependencies: + "@swc/helpers" "^0.5.0" + "@jridgewell/gen-mapping@^0.1.0": version "0.1.1" resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz" @@ -495,6 +597,414 @@ "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" +"@mirohq/design-system-badge@^0.3.22": + version "0.3.22" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-badge/-/design-system-badge-0.3.22.tgz#8446d7e3deb75f9f607fcf5a28e90c22e70ea56f" + integrity sha512-JQTfnJO+EQKZdrBKijIrpgDhi4PFiVUV1PbuWjsrC7P0vn8ffL9+LLhPmm/Wt0aExQ17fwpbbV7Wj7YRotNY/Q== + dependencies: + "@mirohq/design-system-primitive" "^1.1.1" + "@mirohq/design-system-stitches" "^2.3.14" + "@mirohq/design-system-types" "^0.6.2" + +"@mirohq/design-system-base-button@^0.4.24": + version "0.4.24" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-base-button/-/design-system-base-button-0.4.24.tgz#b4a67afb2f91cd5319e880907c31decdc4cf84f1" + integrity sha512-JBLVpZRw4+jHhMaa8CvcY8zhU3MapEftgtye7t8zGz4NQ1hjuH7e/4Sd48Sdcn7VAXq/xmo0QNeOiDSG2xv3Rw== + dependencies: + "@mirohq/design-system-primitive" "^1.1.1" + "@mirohq/design-system-stitches" "^2.3.14" + "@mirohq/design-system-types" "^0.6.2" + "@react-aria/interactions" "^3.13.0" + "@react-aria/utils" "^3.13.0" + "@react-types/shared" "^3.16.0" + +"@mirohq/design-system-base-icon@^0.1.13": + version "0.1.13" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-base-icon/-/design-system-base-icon-0.1.13.tgz#1c5aff564260b8929fd870a624a80ae69c3a6c65" + integrity sha512-VPJJ+RXHClLDQ/qIraU0vg1DR+0F6p46KRxRU3RmWdwRhFfDRCnvWledK08SPbKJ5YQ7kaugJuQ03EjyOPnK/A== + dependencies: + "@mirohq/design-system-primitive" "^1.1.1" + "@mirohq/design-system-stitches" "^2.3.14" + +"@mirohq/design-system-base-switch@^0.1.12": + version "0.1.12" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-base-switch/-/design-system-base-switch-0.1.12.tgz#76ec64eb07700e28e81825402397bb9e5cd12c68" + integrity sha512-Yec6BWnjF7lyWvmWiSVvysPpVfOk0exnk5MjmqU0BJ9dL75m6Tjc6BcJTDqsCLbXOZcmf/jybVRFR0c87q8uDA== + dependencies: + "@mirohq/design-system-primitive" "^1.1.1" + "@mirohq/design-system-stitches" "^2.3.14" + +"@mirohq/design-system-box@^2.1.23": + version "2.1.23" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-box/-/design-system-box-2.1.23.tgz#463f15033559ba8c56aedcb630fc00fd9afc1429" + integrity sha512-fafGR1g5g44rCe3D5dkiC/QinVUCTLHxIhykTOoSzZWCn6NRlARyrD8vG0UqnH//syqbXmGflYiDqCjfGdX+Nw== + dependencies: + "@mirohq/design-system-primitive" "^1.1.1" + "@mirohq/design-system-stitches" "^2.3.14" + +"@mirohq/design-system-button@^3.1.23": + version "3.1.23" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-button/-/design-system-button-3.1.23.tgz#fc6aba790670a806e9a0209e128323519903c422" + integrity sha512-XZpb2yG52+nXsXOuEYhr9ys/VzDY8p3G36r2MkpTHuJrCKKGXja3f6RNw2hz7A4Yt4ZyeoP7FxkST5eyeMvkgA== + dependencies: + "@mirohq/design-system-base-button" "^0.4.24" + "@mirohq/design-system-primitive" "^1.1.1" + "@mirohq/design-system-spinner" "^1.1.26" + "@mirohq/design-system-stitches" "^2.3.14" + "@mirohq/design-system-styles" "^1.1.11" + "@mirohq/design-system-types" "^0.6.2" + "@mirohq/design-system-utils" "^0.14.3" + "@react-aria/utils" "^3.13.0" + +"@mirohq/design-system-calendar@^0.1.37": + version "0.1.37" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-calendar/-/design-system-calendar-0.1.37.tgz#cc01022665bb1a3d946be4fbe8eb49d4370633c2" + integrity sha512-gpZqbMN5Siyz9jLvI2cnP1XSMbfqFmpmmppQUVlE+o6hNR2spzShApP9axkAZdGECXMbgNsRzpbHuvhK6ZUbsQ== + dependencies: + "@internationalized/date" "^3.3.0" + "@mirohq/design-system-button" "^3.1.23" + "@mirohq/design-system-flex" "^2.1.27" + "@mirohq/design-system-icons" "^0.31.0" + "@mirohq/design-system-primitive" "^1.1.1" + "@mirohq/design-system-stitches" "^2.3.14" + "@react-types/datepicker" "^3.4.0" + react-aria "^3.25.0" + react-stately "^3.23.0" + +"@mirohq/design-system-checkbox@^1.1.54": + version "1.1.54" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-checkbox/-/design-system-checkbox-1.1.54.tgz#4c0ff622916dbea1e6c3f0aec59ac3dbf81c3797" + integrity sha512-kOsmDUHjEJUkrLQ0SPlVb3dhYS8nS+7QZwVDxg25vyrqHKVfTOUUGgm4oucBa6jImc1T/NrX2/tuKTDW4gEvuw== + dependencies: + "@mirohq/design-system-icons" "^0.31.0" + "@mirohq/design-system-primitive" "^1.1.1" + "@mirohq/design-system-stitches" "^2.3.14" + "@mirohq/design-system-types" "^0.6.2" + "@radix-ui/react-checkbox" "^1.0.0" + +"@mirohq/design-system-dropdown-menu@^3.5.18": + version "3.5.18" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-dropdown-menu/-/design-system-dropdown-menu-3.5.18.tgz#7cf9f3d5c83e4f525559c727594fb17e7e36550a" + integrity sha512-C+D4SwcZWKwVBVhl1nfHEHgiK8owpQJXmhau8T1UOScnEqK+TFGahS4hfcWUcYTcmKVEKOqmUDm8Mby1wf1+uQ== + dependencies: + "@mirohq/design-system-base-icon" "^0.1.13" + "@mirohq/design-system-base-switch" "^0.1.12" + "@mirohq/design-system-primitive" "^1.1.1" + "@mirohq/design-system-scroll-area" "^0.1.14" + "@mirohq/design-system-stitches" "^2.3.14" + "@mirohq/design-system-styles" "^1.1.11" + "@mirohq/design-system-types" "^0.6.2" + "@mirohq/design-system-use-layout-effect" "^0.2.1" + "@mirohq/design-system-utils" "^0.14.3" + "@radix-ui/react-dropdown-menu" "^2.0.5" + "@react-aria/utils" "^3.13.0" + +"@mirohq/design-system-flex@^2.1.27": + version "2.1.27" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-flex/-/design-system-flex-2.1.27.tgz#33e60bcd9894e44418f751e4c47e56ec99d8062e" + integrity sha512-jAyELdLhU8sJDB9K17QUoWMsJpvnPpVbz/zpvySdnUSjNXXgbiUZhY6qkeQx67P4SvTWtbtgOVHGq7viq4iRNw== + dependencies: + "@mirohq/design-system-primitive" "^1.1.1" + "@mirohq/design-system-stitches" "^2.3.14" + "@mirohq/design-system-utils" "^0.14.3" + +"@mirohq/design-system-grid@^2.1.26": + version "2.1.26" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-grid/-/design-system-grid-2.1.26.tgz#7954ef8769f4dada9da74f533c61933efdc85c38" + integrity sha512-PT/lqtJjWljyTvJj9MLFSRFF8kVmGfh0yp+5Dhv8pgQhwzaZxyQD+zCe5P1kTK1AoZ/8Yst0p1fx06Yb5LDcpQ== + dependencies: + "@mirohq/design-system-primitive" "^1.1.1" + "@mirohq/design-system-stitches" "^2.3.14" + "@mirohq/design-system-utils" "^0.14.3" + +"@mirohq/design-system-icon-button@^1.3.17": + version "1.3.17" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-icon-button/-/design-system-icon-button-1.3.17.tgz#ade3a17498532ab9846b8d7758793751770cd15b" + integrity sha512-XaZgP/xoiqfdAfSK2NZENtx3MMfIe6IH3hxIlSXwnHpDmVPxybzJVy4WyA4OC8/yXmwFiH6GmYvMj5UhFcFCUg== + dependencies: + "@mirohq/design-system-badge" "^0.3.22" + "@mirohq/design-system-base-button" "^0.4.24" + "@mirohq/design-system-stitches" "^2.3.14" + "@mirohq/design-system-tooltip" "^3.2.29" + +"@mirohq/design-system-icons@^0.31.0": + version "0.31.0" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-icons/-/design-system-icons-0.31.0.tgz#77d78befc6b0b92c7c26aa40ffab6d5ed0782dd1" + integrity sha512-eTbFHD0cUYq3dFmxrM4evBfBAO6GTC0P9zYzGz4OfOylA4aud+WdFncrE5feEEx6bvoUt4JpCBTrBE2x8S9k2w== + dependencies: + "@mirohq/design-system-base-icon" "^0.1.13" + "@mirohq/design-system-link" "^1.3.4" + "@mirohq/design-system-primitive" "^1.1.1" + "@mirohq/design-system-stitches" "^2.3.14" + "@mirohq/design-system-utils" "^0.14.3" + +"@mirohq/design-system-link@^1.3.4": + version "1.3.4" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-link/-/design-system-link-1.3.4.tgz#10f8ba0fe498abf0e72cf96f0f4b7df16b78b410" + integrity sha512-MZzNsZQMEfDXXvt3BGpZ7GqYTJbS9ZpTS1r36WNB5/tDqH7Qn1BkkeVNhU7GKoQ/cIRxAbwLgMznNIDhlmw1/A== + dependencies: + "@mirohq/design-system-primitive" "^1.1.1" + "@mirohq/design-system-stitches" "^2.3.14" + "@mirohq/design-system-styles" "^1.1.11" + "@mirohq/design-system-utils" "^0.14.3" + "@react-aria/interactions" "^3.13.0" + "@react-aria/utils" "^3.13.0" + "@react-types/shared" "^3.16.0" + +"@mirohq/design-system-popover@^5.1.2": + version "5.1.2" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-popover/-/design-system-popover-5.1.2.tgz#589c5f389f4712e2613b69c61c01dd775e66d4dc" + integrity sha512-IoDCdMgtNNwz1nPwvTilTT39AQhdNwJJxSeBrpW0Ytvt7KPAs/TIZw9z8+PgaCQaib96WipnSdIpbYCRlxqaVQ== + dependencies: + "@mirohq/design-system-icons" "^0.31.0" + "@mirohq/design-system-primitive" "^1.1.1" + "@mirohq/design-system-stitches" "^2.3.14" + "@mirohq/design-system-styles" "^1.1.11" + "@radix-ui/react-popover" "^1.0.0" + "@radix-ui/react-use-size" "^1.0.1" + +"@mirohq/design-system-primitive@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-primitive/-/design-system-primitive-1.1.1.tgz#69b84ed8de5e83c674b9c98a4668118b2c1e8fc6" + integrity sha512-v+WEPMiZqM5xbfJuUqcY8fbxfH8RgJi69+pUrCD6mnxtpzN5epyKXPjUN86xzOQCLaHuSzES95FrNliTe9+5KQ== + dependencies: + "@radix-ui/react-slot" "^1.0.0" + +"@mirohq/design-system-scroll-area@^0.1.14": + version "0.1.14" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-scroll-area/-/design-system-scroll-area-0.1.14.tgz#33b871a1492834d0044b8c671346a7cb1f72df9b" + integrity sha512-mh2F8LbI8Y19HXFrNFEQLRyniLxyua9/z9MrI2WaRMVVRl6mXgw/OOmrsI2MPRDlqtN+E58dN8hs9VidLhic/w== + dependencies: + "@mirohq/design-system-stitches" "^2.3.14" + "@radix-ui/react-scroll-area" "^1.0.4" + +"@mirohq/design-system-select@^0.1.13": + version "0.1.13" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-select/-/design-system-select-0.1.13.tgz#17f82468ca54b0afde25785dfd18baf50a970209" + integrity sha512-j0aSzWgPIl0zZBblWnWdIve3Vzr9UXvwlEqZH2lpXyQHNkzRq5VQ7ouY8AtxoDbGIJ/MjnMT/mSR1P45V6uDLw== + dependencies: + "@mirohq/design-system-icons" "^0.31.0" + "@mirohq/design-system-primitive" "^1.1.1" + "@mirohq/design-system-scroll-area" "^0.1.14" + "@mirohq/design-system-stitches" "^2.3.14" + "@mirohq/design-system-types" "^0.6.2" + "@mirohq/design-system-utils" "^0.14.3" + "@radix-ui/react-select" "^2.0.0" + +"@mirohq/design-system-spinner@^1.1.26": + version "1.1.26" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-spinner/-/design-system-spinner-1.1.26.tgz#42207f42f08b2b6b44000f69b211b941380bf129" + integrity sha512-IK/IXnleSsBgWID+y2XhK+oQywJM5KbN3/YIMld0ZQp4H6SP3ObFkdRtZelSfJvyc/HoB3nq/tfP5IXFo2RIPg== + dependencies: + "@mirohq/design-system-primitive" "^1.1.1" + "@mirohq/design-system-stitches" "^2.3.14" + "@mirohq/design-tokens" "^3.4.1" + +"@mirohq/design-system-stitches@^2.3.14": + version "2.3.14" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-stitches/-/design-system-stitches-2.3.14.tgz#2b77f7985880c6ec970a7e7e165230df26b1445e" + integrity sha512-9vRlPQ20k8h0+Q0FDQEpitElbAdtXNMwWsz3+YDgX/mVHg9wN27Xs3wssISe/y/4Q/uhWs/I+az9O2/wiCcHnA== + dependencies: + "@mirohq/design-system-themes" "^0.5.1" + "@mirohq/design-system-types" "^0.6.2" + "@mirohq/design-tokens" "^3.4.1" + lodash.merge "^4.6.2" + +"@mirohq/design-system-styles@^1.1.11": + version "1.1.11" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-styles/-/design-system-styles-1.1.11.tgz#e8e22709bdd437df3e874a1c22bb3e7efd9e82c5" + integrity sha512-Kv3KYYPDsO0EoTHF6aA2o/HH7ngC9FvIFcsBg19dhRVGqUnM23hsLeMKJ7Y//N8ezpYDzZ1ONPyWGS71l83lkQ== + dependencies: + "@mirohq/design-system-stitches" "^2.3.14" + "@mirohq/design-tokens" "^3.4.1" + what-input "^5.2.11" + +"@mirohq/design-system-switch@^3.0.20": + version "3.0.20" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-switch/-/design-system-switch-3.0.20.tgz#51bb67c83a04ae7e7d1aac310b5fe9683f111175" + integrity sha512-0+yfDJFtK65Nly1H7qegB+GY91e+RtUbtFPJIaVvvZjL8Rx+4fgZIjS32MNAvmIyW6kk+3ECdFjQPlIvQ9XZZg== + dependencies: + "@mirohq/design-system-base-switch" "^0.1.12" + "@mirohq/design-system-stitches" "^2.3.14" + "@mirohq/design-system-styles" "^1.1.11" + "@mirohq/design-system-types" "^0.6.2" + "@mirohq/design-system-utils" "^0.14.3" + "@radix-ui/react-switch" "^1.0.0" + +"@mirohq/design-system-theme-provider@^0.3.4": + version "0.3.4" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-theme-provider/-/design-system-theme-provider-0.3.4.tgz#bd9efe76e66c7a7a4b046954f88438f83693e74a" + integrity sha512-9NIO+E8O4LdbY4OKbfr5h43B/l8+93OzVvTqyLRbHSDJKnMyxyLz9/WarJfR/ggYRlsoEngImg7Ys9ytwYi6Dw== + dependencies: + "@mirohq/design-system-stitches" "^2.3.14" + "@mirohq/design-system-themes" "^0.5.1" + "@mirohq/design-system-types" "^0.6.2" + "@mirohq/design-system-use-theme" "^0.2.10" + +"@mirohq/design-system-themes@^0.5.1": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-themes/-/design-system-themes-0.5.1.tgz#c677f8563e059574c565ea1c91cec7b793680f18" + integrity sha512-2WL1C2/7/FAhVLTVnFVPg5/wCUqqMPRSWFDR8yFGqAiPdRLgRKiRWXlfxsribXzUmFLXeOtfYkjjDjrqN7+NrA== + dependencies: + "@mirohq/design-tokens" "^3.4.1" + +"@mirohq/design-system-toolbar@^2.4.4": + version "2.4.4" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-toolbar/-/design-system-toolbar-2.4.4.tgz#a17c04b4d5bded8837a3ba980284bc935d9b33a2" + integrity sha512-ZO1uELcDh67qmRbW9ggT2hgDDnuzpK21zF9mUi+wefMaUJeVkoZW/icTq1GgO6r9H5mYkaMn7mMzYtAFk0DJXA== + dependencies: + "@mirohq/design-system-stitches" "^2.3.14" + "@mirohq/design-system-styles" "^1.1.11" + "@radix-ui/react-toolbar" "^1.0.0" + "@react-aria/interactions" "^3.13.0" + "@react-aria/utils" "^3.13.0" + "@react-types/shared" "^3.16.0" + +"@mirohq/design-system-tooltip@^3.2.29": + version "3.2.29" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-tooltip/-/design-system-tooltip-3.2.29.tgz#dd8597aab7f6aedccb36d8a07fc72f3b49d87065" + integrity sha512-N6gzZnoB0E4hhuWiGiQfhV4UgixT4f5NeAg2H4tL2LoKJwimQYnZSMCZMTh3dxDk7MabMUuhCPwv/ePDJ4eMQA== + dependencies: + "@mirohq/design-system-stitches" "^2.3.14" + "@mirohq/design-system-styles" "^1.1.11" + "@mirohq/design-system-utils" "^0.14.3" + "@mirohq/design-tokens" "^3.4.1" + "@radix-ui/react-tooltip" "^1.0.3" + +"@mirohq/design-system-types@^0.6.2": + version "0.6.2" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-types/-/design-system-types-0.6.2.tgz#72af4e196803932e57e51db8db39d16bd3da940d" + integrity sha512-e/2LJPswOBVCHbV08jIuCXYlb9gTpEGcqH2TQIGikSVCle1vQkQds1lbOF/Xf5vV+mz1fPLTm5UW5jkviESqNw== + +"@mirohq/design-system-typography@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-typography/-/design-system-typography-0.4.2.tgz#1ed54ca15c61bd9413445149e0c9ca4a54de2af7" + integrity sha512-kq0YUfX+BjGVrxKwLgINzeu3DY7rZAkGqFk6SZd+Qtfvrv56iyug5sF4YvvfZ4YZLkZB0YVYnP1ZfAzyxjQtmQ== + dependencies: + "@mirohq/design-system-primitive" "^1.1.1" + "@mirohq/design-system-stitches" "^2.3.14" + +"@mirohq/design-system-use-clipboard@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-use-clipboard/-/design-system-use-clipboard-0.1.1.tgz#78aea3f2f42097b87503dde4a0b4e6d32ac8b536" + integrity sha512-z66Hrut4LORXfyKibt1q/Za2jQ1LwwqIVG0u8OAOZ50PqWzCYmCPFxy9Y0g8L5J0mIYsYtgh8QC6Xu0BFDUl1g== + dependencies: + "@mirohq/design-system-use-event" "^0.2.1" + +"@mirohq/design-system-use-event-listener@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-use-event-listener/-/design-system-use-event-listener-0.3.1.tgz#e26be8805357d91c6b4cd61b7a03226e42b9eab9" + integrity sha512-WgTGpTSc+/TbOKxEIcLte/ddfJ41DtsOXojGvjkoCN+wFKuaxRMbhLs/EsU/BWjhZb8GSkqxADq51FppuHefRQ== + dependencies: + "@mirohq/design-system-use-layout-effect" "^0.2.1" + +"@mirohq/design-system-use-event@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-use-event/-/design-system-use-event-0.2.1.tgz#1c97fb1a54f8b6855b33ecceee7c85b26531995b" + integrity sha512-+VC5TiqMmD2THA13a097ZT2jsF0Mqo+4L4bSFFzsmsVNLtad5oo4ltQMCxoE0wWc4QAzdhZLR9833qP4yOtbmw== + dependencies: + "@mirohq/design-system-use-layout-effect" "^0.2.1" + +"@mirohq/design-system-use-layout-effect@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-use-layout-effect/-/design-system-use-layout-effect-0.2.1.tgz#a377388162021cd5f292ff77f76e9327ef0d11f7" + integrity sha512-hKoyGc7drQAoHWdJOW39VqOTGxVT9ilDV3NrtFXN1fCEDgnhg5+Ytx18jAqH9I7TVXptiKkPo03LupdIAQOlLA== + +"@mirohq/design-system-use-listeners@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-use-listeners/-/design-system-use-listeners-0.1.1.tgz#f2ccd9c04610630f23846568a081658f2da7d598" + integrity sha512-aP4GlBs6lOj5/3oMh9h38/gH6BNHHEZqwKXPkS1xTNbr/VC4sVcxdl/tjybzOjEuE5qvy4zW4Ve/8pf4S1xs2g== + +"@mirohq/design-system-use-local-storage@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-use-local-storage/-/design-system-use-local-storage-0.3.5.tgz#a9bed0b1a752c3e3441193f60061f19603101c32" + integrity sha512-4BE5iEwC5CBm1piDkBBr9tOxFxVqcV9I61IrWAfLlSXxGfWpEXwg5iQYsd/qLuNpSqeUWwPCpQQY1gCRlPNPJA== + dependencies: + "@mirohq/design-system-types" "^0.6.2" + "@mirohq/design-system-use-event" "^0.2.1" + "@mirohq/design-system-use-event-listener" "^0.3.1" + +"@mirohq/design-system-use-logger@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-use-logger/-/design-system-use-logger-0.1.5.tgz#74d8b91b0d562727af22bb57388be2e61c1e9e61" + integrity sha512-dPXwi/mWjSC5Et0VKvXNzIHzcEjRpQ4PTOjgLa9ITtQWEL5q5RsTUlUX2TTYp01iGfv/Q9q9FvnIPN23tx2YJw== + dependencies: + "@mirohq/design-system-types" "^0.6.2" + "@mirohq/design-system-use-local-storage" "^0.3.5" + "@mirohq/design-system-utils" "^0.14.3" + +"@mirohq/design-system-use-press@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-use-press/-/design-system-use-press-0.2.1.tgz#3e5d9f1496d10337070c136e795612bcea5d58ac" + integrity sha512-hbCpU4rbJbyzT5TTWogDCbcFiEv5lWFBCyASulv97cFM1kyg/ELehvIOQlAp4Iv7Sdfgm0ob1c2m9LSpmU/jMQ== + dependencies: + "@mirohq/design-system-use-listeners" "^0.1.1" + "@mirohq/design-system-use-logger" "^0.1.5" + "@mirohq/design-system-utils" "^0.14.3" + "@react-aria/utils" "^3.14.2" + +"@mirohq/design-system-use-theme@^0.2.10": + version "0.2.10" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-use-theme/-/design-system-use-theme-0.2.10.tgz#e901c81fd022c9f9ba1fc94e4283af415a2853ff" + integrity sha512-FmbpEMuHBfGXs/F3XBby4311LgYDR9qd6BKE00qNx66y6AOzciuFlkoOwy/T0w5jn5DMc/lGnkdOiA2AsxLsHQ== + dependencies: + "@mirohq/design-system-types" "^0.6.2" + "@mirohq/design-system-use-local-storage" "^0.3.5" + +"@mirohq/design-system-utils@^0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-utils/-/design-system-utils-0.14.3.tgz#3f4e1b26b62876c34b4b066835d6b864002ac914" + integrity sha512-o7e39TUkSEPZqCBb35NJJHWpF64Wa/7IQe6wOeK0UtXt3zUSns/0M1su1opoN5u2r25APPLSF/igdIEg8ncoLg== + dependencies: + "@mirohq/design-system-types" "^0.6.2" + +"@mirohq/design-system@^0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@mirohq/design-system/-/design-system-0.17.19.tgz#31a248e9923652d01bd0b8c230de302447c4aada" + integrity sha512-dISSTKS+1CRHaxaqve1v+a2Qg/P81zLZtbsvcTzZfzBoLf5a/PKe1yT3yUgfclo3TUberp6rO2Poi96cpjIvvg== + dependencies: + "@mirohq/design-system-badge" "^0.3.22" + "@mirohq/design-system-box" "^2.1.23" + "@mirohq/design-system-button" "^3.1.23" + "@mirohq/design-system-calendar" "^0.1.37" + "@mirohq/design-system-checkbox" "^1.1.54" + "@mirohq/design-system-dropdown-menu" "^3.5.18" + "@mirohq/design-system-flex" "^2.1.27" + "@mirohq/design-system-grid" "^2.1.26" + "@mirohq/design-system-icon-button" "^1.3.17" + "@mirohq/design-system-icons" "^0.31.0" + "@mirohq/design-system-link" "^1.3.4" + "@mirohq/design-system-popover" "^5.1.2" + "@mirohq/design-system-primitive" "^1.1.1" + "@mirohq/design-system-scroll-area" "^0.1.14" + "@mirohq/design-system-select" "^0.1.13" + "@mirohq/design-system-spinner" "^1.1.26" + "@mirohq/design-system-stitches" "^2.3.14" + "@mirohq/design-system-styles" "^1.1.11" + "@mirohq/design-system-switch" "^3.0.20" + "@mirohq/design-system-theme-provider" "^0.3.4" + "@mirohq/design-system-themes" "^0.5.1" + "@mirohq/design-system-toolbar" "^2.4.4" + "@mirohq/design-system-tooltip" "^3.2.29" + "@mirohq/design-system-types" "^0.6.2" + "@mirohq/design-system-typography" "^0.4.2" + "@mirohq/design-system-use-clipboard" "^0.1.1" + "@mirohq/design-system-use-event" "^0.2.1" + "@mirohq/design-system-use-event-listener" "^0.3.1" + "@mirohq/design-system-use-layout-effect" "^0.2.1" + "@mirohq/design-system-use-listeners" "^0.1.1" + "@mirohq/design-system-use-local-storage" "^0.3.5" + "@mirohq/design-system-use-logger" "^0.1.5" + "@mirohq/design-system-use-press" "^0.2.1" + "@mirohq/design-system-use-theme" "^0.2.10" + "@mirohq/design-system-utils" "^0.14.3" + "@mirohq/design-tokens" "^3.4.1" + +"@mirohq/design-tokens@^3.4.1": + version "3.4.1" + resolved "https://registry.yarnpkg.com/@mirohq/design-tokens/-/design-tokens-3.4.1.tgz#1ccf3d8acc45f54bbced6baa6fcc754e7e79ac69" + integrity sha512-eWN2bNWZ2nxhOTrWNO1W8Zp2ktCA4+u5dk8Wve6ZShFe4AL0u49tlIryMf9iFZYVt6eZBzrXec22aFKfm30FWQ== + "@mirohq/miro-api@1.0.2", "@mirohq/miro-api@^1.0.2": version "1.0.2" resolved "https://registry.npmjs.org/@mirohq/miro-api/-/miro-api-1.0.2.tgz" @@ -812,6 +1322,1436 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@radix-ui/number@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/number/-/number-1.0.1.tgz#644161a3557f46ed38a042acf4a770e826021674" + integrity sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/primitive@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.0.1.tgz#e46f9958b35d10e9f6dc71c497305c22e3e55dbd" + integrity sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-arrow@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-arrow/-/react-arrow-1.0.3.tgz#c24f7968996ed934d57fe6cde5d6ec7266e1d25d" + integrity sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-primitive" "1.0.3" + +"@radix-ui/react-checkbox@^1.0.0": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@radix-ui/react-checkbox/-/react-checkbox-1.0.4.tgz#98f22c38d5010dd6df4c5744cac74087e3275f4b" + integrity sha512-CBuGQa52aAYnADZVt/KBQzXrwx6TqnlwtcIPGtVt5JkkzQwMOLJjPukimhfKEr4GQNd43C+djUh5Ikopj8pSLg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-presence" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-controllable-state" "1.0.1" + "@radix-ui/react-use-previous" "1.0.1" + "@radix-ui/react-use-size" "1.0.1" + +"@radix-ui/react-collection@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-collection/-/react-collection-1.0.3.tgz#9595a66e09026187524a36c6e7e9c7d286469159" + integrity sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-slot" "1.0.2" + +"@radix-ui/react-compose-refs@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz#7ed868b66946aa6030e580b1ffca386dd4d21989" + integrity sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-context@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-1.0.1.tgz#fe46e67c96b240de59187dcb7a1a50ce3e2ec00c" + integrity sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-direction@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-direction/-/react-direction-1.0.1.tgz#9cb61bf2ccf568f3421422d182637b7f47596c9b" + integrity sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-dismissable-layer@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.5.tgz#3f98425b82b9068dfbab5db5fff3df6ebf48b9d4" + integrity sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-callback-ref" "1.0.1" + "@radix-ui/react-use-escape-keydown" "1.0.3" + +"@radix-ui/react-dropdown-menu@^2.0.5": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.0.6.tgz#cdf13c956c5e263afe4e5f3587b3071a25755b63" + integrity sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-id" "1.0.1" + "@radix-ui/react-menu" "2.0.6" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-controllable-state" "1.0.1" + +"@radix-ui/react-focus-guards@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz#1ea7e32092216b946397866199d892f71f7f98ad" + integrity sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-focus-scope@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.4.tgz#2ac45fce8c5bb33eb18419cdc1905ef4f1906525" + integrity sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-callback-ref" "1.0.1" + +"@radix-ui/react-id@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-id/-/react-id-1.0.1.tgz#73cdc181f650e4df24f0b6a5b7aa426b912c88c0" + integrity sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-layout-effect" "1.0.1" + +"@radix-ui/react-menu@2.0.6": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@radix-ui/react-menu/-/react-menu-2.0.6.tgz#2c9e093c1a5d5daa87304b2a2f884e32288ae79e" + integrity sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-collection" "1.0.3" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-direction" "1.0.1" + "@radix-ui/react-dismissable-layer" "1.0.5" + "@radix-ui/react-focus-guards" "1.0.1" + "@radix-ui/react-focus-scope" "1.0.4" + "@radix-ui/react-id" "1.0.1" + "@radix-ui/react-popper" "1.1.3" + "@radix-ui/react-portal" "1.0.4" + "@radix-ui/react-presence" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-roving-focus" "1.0.4" + "@radix-ui/react-slot" "1.0.2" + "@radix-ui/react-use-callback-ref" "1.0.1" + aria-hidden "^1.1.1" + react-remove-scroll "2.5.5" + +"@radix-ui/react-popover@^1.0.0": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@radix-ui/react-popover/-/react-popover-1.0.7.tgz#23eb7e3327330cb75ec7b4092d685398c1654e3c" + integrity sha512-shtvVnlsxT6faMnK/a7n0wptwBD23xc1Z5mdrtKLwVEfsEMXodS0r5s0/g5P0hX//EKYZS2sxUjqfzlg52ZSnQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-dismissable-layer" "1.0.5" + "@radix-ui/react-focus-guards" "1.0.1" + "@radix-ui/react-focus-scope" "1.0.4" + "@radix-ui/react-id" "1.0.1" + "@radix-ui/react-popper" "1.1.3" + "@radix-ui/react-portal" "1.0.4" + "@radix-ui/react-presence" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-slot" "1.0.2" + "@radix-ui/react-use-controllable-state" "1.0.1" + aria-hidden "^1.1.1" + react-remove-scroll "2.5.5" + +"@radix-ui/react-popper@1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-popper/-/react-popper-1.1.3.tgz#24c03f527e7ac348fabf18c89795d85d21b00b42" + integrity sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w== + dependencies: + "@babel/runtime" "^7.13.10" + "@floating-ui/react-dom" "^2.0.0" + "@radix-ui/react-arrow" "1.0.3" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-callback-ref" "1.0.1" + "@radix-ui/react-use-layout-effect" "1.0.1" + "@radix-ui/react-use-rect" "1.0.1" + "@radix-ui/react-use-size" "1.0.1" + "@radix-ui/rect" "1.0.1" + +"@radix-ui/react-portal@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-1.0.4.tgz#df4bfd353db3b1e84e639e9c63a5f2565fb00e15" + integrity sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-primitive" "1.0.3" + +"@radix-ui/react-presence@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-presence/-/react-presence-1.0.1.tgz#491990ba913b8e2a5db1b06b203cb24b5cdef9ba" + integrity sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-use-layout-effect" "1.0.1" + +"@radix-ui/react-primitive@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz#d49ea0f3f0b2fe3ab1cb5667eb03e8b843b914d0" + integrity sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-slot" "1.0.2" + +"@radix-ui/react-roving-focus@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.4.tgz#e90c4a6a5f6ac09d3b8c1f5b5e81aab2f0db1974" + integrity sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-collection" "1.0.3" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-direction" "1.0.1" + "@radix-ui/react-id" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-callback-ref" "1.0.1" + "@radix-ui/react-use-controllable-state" "1.0.1" + +"@radix-ui/react-scroll-area@^1.0.4": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@radix-ui/react-scroll-area/-/react-scroll-area-1.0.5.tgz#01160c6893f24a2ddb5aa399ae5b3ba84ad4d3cc" + integrity sha512-b6PAgH4GQf9QEn8zbT2XUHpW5z8BzqEc7Kl11TwDrvuTrxlkcjTD5qa/bxgKr+nmuXKu4L/W5UZ4mlP/VG/5Gw== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/number" "1.0.1" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-direction" "1.0.1" + "@radix-ui/react-presence" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-callback-ref" "1.0.1" + "@radix-ui/react-use-layout-effect" "1.0.1" + +"@radix-ui/react-select@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-select/-/react-select-2.0.0.tgz#a3511792a51a7018d6559357323a7f52e0e38887" + integrity sha512-RH5b7af4oHtkcHS7pG6Sgv5rk5Wxa7XI8W5gvB1N/yiuDGZxko1ynvOiVhFM7Cis2A8zxF9bTOUVbRDzPepe6w== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/number" "1.0.1" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-collection" "1.0.3" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-direction" "1.0.1" + "@radix-ui/react-dismissable-layer" "1.0.5" + "@radix-ui/react-focus-guards" "1.0.1" + "@radix-ui/react-focus-scope" "1.0.4" + "@radix-ui/react-id" "1.0.1" + "@radix-ui/react-popper" "1.1.3" + "@radix-ui/react-portal" "1.0.4" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-slot" "1.0.2" + "@radix-ui/react-use-callback-ref" "1.0.1" + "@radix-ui/react-use-controllable-state" "1.0.1" + "@radix-ui/react-use-layout-effect" "1.0.1" + "@radix-ui/react-use-previous" "1.0.1" + "@radix-ui/react-visually-hidden" "1.0.3" + aria-hidden "^1.1.1" + react-remove-scroll "2.5.5" + +"@radix-ui/react-separator@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-separator/-/react-separator-1.0.3.tgz#be5a931a543d5726336b112f465f58585c04c8aa" + integrity sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-primitive" "1.0.3" + +"@radix-ui/react-slot@1.0.2", "@radix-ui/react-slot@^1.0.0": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.0.2.tgz#a9ff4423eade67f501ffb32ec22064bc9d3099ab" + integrity sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.1" + +"@radix-ui/react-switch@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-switch/-/react-switch-1.0.3.tgz#6119f16656a9eafb4424c600fdb36efa5ec5837e" + integrity sha512-mxm87F88HyHztsI7N+ZUmEoARGkC22YVW5CaC+Byc+HRpuvCrOBPTAnXgf+tZ/7i0Sg/eOePGdMhUKhPaQEqow== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-controllable-state" "1.0.1" + "@radix-ui/react-use-previous" "1.0.1" + "@radix-ui/react-use-size" "1.0.1" + +"@radix-ui/react-toggle-group@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@radix-ui/react-toggle-group/-/react-toggle-group-1.0.4.tgz#f5b5c8c477831b013bec3580c55e20a68179d6ec" + integrity sha512-Uaj/M/cMyiyT9Bx6fOZO0SAG4Cls0GptBWiBmBxofmDbNVnYYoyRWj/2M/6VCi/7qcXFWnHhRUfdfZFvvkuu8A== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-direction" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-roving-focus" "1.0.4" + "@radix-ui/react-toggle" "1.0.3" + "@radix-ui/react-use-controllable-state" "1.0.1" + +"@radix-ui/react-toggle@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-toggle/-/react-toggle-1.0.3.tgz#aecb2945630d1dc5c512997556c57aba894e539e" + integrity sha512-Pkqg3+Bc98ftZGsl60CLANXQBBQ4W3mTFS9EJvNxKMZ7magklKV69/id1mlAlOFDDfHvlCms0fx8fA4CMKDJHg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-controllable-state" "1.0.1" + +"@radix-ui/react-toolbar@^1.0.0": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@radix-ui/react-toolbar/-/react-toolbar-1.0.4.tgz#3211a105567fa016e89921b5b514877f833de559" + integrity sha512-tBgmM/O7a07xbaEkYJWYTXkIdU/1pW4/KZORR43toC/4XWyBCURK0ei9kMUdp+gTPPKBgYLxXmRSH1EVcIDp8Q== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-direction" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-roving-focus" "1.0.4" + "@radix-ui/react-separator" "1.0.3" + "@radix-ui/react-toggle-group" "1.0.4" + +"@radix-ui/react-tooltip@^1.0.3": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@radix-ui/react-tooltip/-/react-tooltip-1.0.7.tgz#8f55070f852e7e7450cc1d9210b793d2e5a7686e" + integrity sha512-lPh5iKNFVQ/jav/j6ZrWq3blfDJ0OH9R6FlNUHPMqdLuQ9vwDgFsRxvl8b7Asuy5c8xmoojHUxKHQSOAvMHxyw== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-dismissable-layer" "1.0.5" + "@radix-ui/react-id" "1.0.1" + "@radix-ui/react-popper" "1.1.3" + "@radix-ui/react-portal" "1.0.4" + "@radix-ui/react-presence" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-slot" "1.0.2" + "@radix-ui/react-use-controllable-state" "1.0.1" + "@radix-ui/react-visually-hidden" "1.0.3" + +"@radix-ui/react-use-callback-ref@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz#f4bb1f27f2023c984e6534317ebc411fc181107a" + integrity sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-use-controllable-state@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.1.tgz#ecd2ced34e6330caf89a82854aa2f77e07440286" + integrity sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-callback-ref" "1.0.1" + +"@radix-ui/react-use-escape-keydown@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz#217b840c250541609c66f67ed7bab2b733620755" + integrity sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-callback-ref" "1.0.1" + +"@radix-ui/react-use-layout-effect@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.1.tgz#be8c7bc809b0c8934acf6657b577daf948a75399" + integrity sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-use-previous@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-previous/-/react-use-previous-1.0.1.tgz#b595c087b07317a4f143696c6a01de43b0d0ec66" + integrity sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-use-rect@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-rect/-/react-use-rect-1.0.1.tgz#fde50b3bb9fd08f4a1cd204572e5943c244fcec2" + integrity sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/rect" "1.0.1" + +"@radix-ui/react-use-size@1.0.1", "@radix-ui/react-use-size@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-size/-/react-use-size-1.0.1.tgz#1c5f5fea940a7d7ade77694bb98116fb49f870b2" + integrity sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-layout-effect" "1.0.1" + +"@radix-ui/react-visually-hidden@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.3.tgz#51aed9dd0fe5abcad7dee2a234ad36106a6984ac" + integrity sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-primitive" "1.0.3" + +"@radix-ui/rect@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/rect/-/rect-1.0.1.tgz#bf8e7d947671996da2e30f4904ece343bc4a883f" + integrity sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ== + dependencies: + "@babel/runtime" "^7.13.10" + +"@react-aria/breadcrumbs@^3.5.8": + version "3.5.8" + resolved "https://registry.yarnpkg.com/@react-aria/breadcrumbs/-/breadcrumbs-3.5.8.tgz#243a25621066443e42f2a6a1cb82fe3c558f6dea" + integrity sha512-jeek23igeqXct7S3ShW2jtFUc5g3fS9ZEBZkF64FWBrwfCiaZwb8TcKkK/xFw36/q5mxEt+seNiqnNzvsICJuQ== + dependencies: + "@react-aria/i18n" "^3.9.0" + "@react-aria/link" "^3.6.2" + "@react-aria/utils" "^3.22.0" + "@react-types/breadcrumbs" "^3.7.2" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/button@^3.9.0": + version "3.9.0" + resolved "https://registry.yarnpkg.com/@react-aria/button/-/button-3.9.0.tgz#df59e0628917b320c4d1655e23547eb41a9a0f08" + integrity sha512-Jri4OCN+4YmpJDPNQvk1DJoskKD9sdTxZaWWWJdAwoSIunZk3IEBXVvRfKzsEAVtI+UJN25zC2kyjXbVPS2XAA== + dependencies: + "@react-aria/focus" "^3.15.0" + "@react-aria/interactions" "^3.20.0" + "@react-aria/utils" "^3.22.0" + "@react-stately/toggle" "^3.7.0" + "@react-types/button" "^3.9.1" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/calendar@^3.5.3": + version "3.5.3" + resolved "https://registry.yarnpkg.com/@react-aria/calendar/-/calendar-3.5.3.tgz#225014e7ef3124bdbc915b7283f7c5d378e1a2a9" + integrity sha512-jW48jk0TIe0HAJS+z8zqd8M86FEuqrk1qEIjMWnf8rFnA7hPPpjdjUrY9vSIeC95NcbyZbFnr1bHzQjAIzosQw== + dependencies: + "@internationalized/date" "^3.5.0" + "@react-aria/i18n" "^3.9.0" + "@react-aria/interactions" "^3.20.0" + "@react-aria/live-announcer" "^3.3.1" + "@react-aria/utils" "^3.22.0" + "@react-stately/calendar" "^3.4.2" + "@react-types/button" "^3.9.1" + "@react-types/calendar" "^3.4.2" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/checkbox@^3.12.0": + version "3.12.0" + resolved "https://registry.yarnpkg.com/@react-aria/checkbox/-/checkbox-3.12.0.tgz#a965e975975404ecf1ff867284511e4490a69c21" + integrity sha512-CyFZoI+z9hhyB3wb7IBsZxE30vXfYO2vSyET16zlkJ4qiFMqMiVLE4ekq034MHltCdpAczgP5yfKgNnJOmj7vQ== + dependencies: + "@react-aria/form" "^3.0.0" + "@react-aria/label" "^3.7.3" + "@react-aria/toggle" "^3.9.0" + "@react-aria/utils" "^3.22.0" + "@react-stately/checkbox" "^3.6.0" + "@react-stately/form" "^3.0.0" + "@react-stately/toggle" "^3.7.0" + "@react-types/checkbox" "^3.6.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/combobox@^3.8.0": + version "3.8.0" + resolved "https://registry.yarnpkg.com/@react-aria/combobox/-/combobox-3.8.0.tgz#1806cd5ea6c11c90802d7c0a0807d93271265c1c" + integrity sha512-lInzzZrH4vFlxmvDpXgQRkkREm7YIx258IRpQqll8Bny2vKMmZoF06zWMbcHP0CjFqYxExQeTjSYx0OTRRxkCQ== + dependencies: + "@react-aria/i18n" "^3.9.0" + "@react-aria/listbox" "^3.11.2" + "@react-aria/live-announcer" "^3.3.1" + "@react-aria/menu" "^3.11.2" + "@react-aria/overlays" "^3.19.0" + "@react-aria/selection" "^3.17.2" + "@react-aria/textfield" "^3.13.0" + "@react-aria/utils" "^3.22.0" + "@react-stately/collections" "^3.10.3" + "@react-stately/combobox" "^3.8.0" + "@react-stately/form" "^3.0.0" + "@react-types/button" "^3.9.1" + "@react-types/combobox" "^3.9.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/datepicker@^3.9.0": + version "3.9.0" + resolved "https://registry.yarnpkg.com/@react-aria/datepicker/-/datepicker-3.9.0.tgz#281d351b36a3cd186e39f587437d9a3ce9d8986d" + integrity sha512-FIpiJxwBNOM8a6hLOqQJ4JrvRiGL6Zr44E1mHtAWStp2kBEJ6+O2JRm4PQ5Pzvdw6xnCpOBdfESdNdlXN7lVqQ== + dependencies: + "@internationalized/date" "^3.5.0" + "@internationalized/number" "^3.4.0" + "@internationalized/string" "^3.1.1" + "@react-aria/focus" "^3.15.0" + "@react-aria/form" "^3.0.0" + "@react-aria/i18n" "^3.9.0" + "@react-aria/interactions" "^3.20.0" + "@react-aria/label" "^3.7.3" + "@react-aria/spinbutton" "^3.6.0" + "@react-aria/utils" "^3.22.0" + "@react-stately/datepicker" "^3.9.0" + "@react-stately/form" "^3.0.0" + "@react-types/button" "^3.9.1" + "@react-types/calendar" "^3.4.2" + "@react-types/datepicker" "^3.7.0" + "@react-types/dialog" "^3.5.7" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/dialog@^3.5.8": + version "3.5.8" + resolved "https://registry.yarnpkg.com/@react-aria/dialog/-/dialog-3.5.8.tgz#3b52ff145b16e0f47b04364239bd91d39968e3c2" + integrity sha512-KIc1FORdHhZ3bWom4qHO0hmlL4e5Hup6N25EY8HP5I7Ftv9EBBGaO5grtxZ2fX8kiCJNI4y+k67ZZ71wKJvMiA== + dependencies: + "@react-aria/focus" "^3.15.0" + "@react-aria/overlays" "^3.19.0" + "@react-aria/utils" "^3.22.0" + "@react-types/dialog" "^3.5.7" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/dnd@^3.5.0": + version "3.5.0" + resolved "https://registry.yarnpkg.com/@react-aria/dnd/-/dnd-3.5.0.tgz#de803fa390e73205b600933c7fe45ac888a62f3c" + integrity sha512-6IuqmXwnfgRfeXDbfsPZzScapCmtRIkphTBPoLT575uEbZC7ROLgRJ/4NIKxvtTA6IIBqUGcvaqU9Mpg8j4U5Q== + dependencies: + "@internationalized/string" "^3.1.1" + "@react-aria/i18n" "^3.9.0" + "@react-aria/interactions" "^3.20.0" + "@react-aria/live-announcer" "^3.3.1" + "@react-aria/overlays" "^3.19.0" + "@react-aria/utils" "^3.22.0" + "@react-stately/dnd" "^3.2.6" + "@react-types/button" "^3.9.1" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/focus@^3.15.0": + version "3.15.0" + resolved "https://registry.yarnpkg.com/@react-aria/focus/-/focus-3.15.0.tgz#acca3cfe94e0ba0c00276e74c6cca06975f75f87" + integrity sha512-nnxRyfqHuAjRwdQ4BpQyZPtGFKZmRU6cnaIb3pqWFCqEyJQensV7MA3TJ4Jhadq67cy1Ji5SYSlr1duBwjoYvw== + dependencies: + "@react-aria/interactions" "^3.20.0" + "@react-aria/utils" "^3.22.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + clsx "^1.1.1" + +"@react-aria/form@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@react-aria/form/-/form-3.0.0.tgz#d4e892687331a9cba1cfc48be5754100ab736dec" + integrity sha512-APeGph9oTO8nro4ZObuy1hk+0hpF/ji9O3odPGhLkzP/HvW2J7NI9pjKJOINfgtYr2yvVUZf/MbTMxPwtAxhaQ== + dependencies: + "@react-aria/interactions" "^3.20.0" + "@react-aria/utils" "^3.22.0" + "@react-stately/form" "^3.0.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/grid@^3.8.5": + version "3.8.5" + resolved "https://registry.yarnpkg.com/@react-aria/grid/-/grid-3.8.5.tgz#92682b36b230920d507e3ed4fb7e9564f96c9f02" + integrity sha512-0p+Bbs9rpQeOy8b75DamlzVPKylBoe/z0XwkeeTChHP2TK3TwPXh6J5EmisQx6K8zsb3iZULQRcP4QibvnMbrg== + dependencies: + "@react-aria/focus" "^3.15.0" + "@react-aria/i18n" "^3.9.0" + "@react-aria/interactions" "^3.20.0" + "@react-aria/live-announcer" "^3.3.1" + "@react-aria/selection" "^3.17.2" + "@react-aria/utils" "^3.22.0" + "@react-stately/collections" "^3.10.3" + "@react-stately/grid" "^3.8.3" + "@react-stately/selection" "^3.14.1" + "@react-stately/virtualizer" "^3.6.5" + "@react-types/checkbox" "^3.6.0" + "@react-types/grid" "^3.2.3" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/gridlist@^3.7.2": + version "3.7.2" + resolved "https://registry.yarnpkg.com/@react-aria/gridlist/-/gridlist-3.7.2.tgz#80a1399eba438df9d8d8e721eb98b3bf1acdbe52" + integrity sha512-9keGYZz0yILVqAnFzF6hGRtHm1vfSD1mNnH8oyn7mKjyr7qOln7s5f8Nl85ueMolfrV3H2rCZgM2itNQ+Ezzgg== + dependencies: + "@react-aria/focus" "^3.15.0" + "@react-aria/grid" "^3.8.5" + "@react-aria/i18n" "^3.9.0" + "@react-aria/interactions" "^3.20.0" + "@react-aria/selection" "^3.17.2" + "@react-aria/utils" "^3.22.0" + "@react-stately/list" "^3.10.1" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/i18n@^3.9.0": + version "3.9.0" + resolved "https://registry.yarnpkg.com/@react-aria/i18n/-/i18n-3.9.0.tgz#7aa74e02e74e348de3a34b7599e71ff6920b73ee" + integrity sha512-ebGP/sVG0ZtNF4RNFzs/W01tl7waYpBManh1kKWgA4roDPFt/odkgkDBzKGl+ggBb7TQRHsfUFHuqKsrsMy9TA== + dependencies: + "@internationalized/date" "^3.5.0" + "@internationalized/message" "^3.1.1" + "@internationalized/number" "^3.4.0" + "@internationalized/string" "^3.1.1" + "@react-aria/ssr" "^3.9.0" + "@react-aria/utils" "^3.22.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/interactions@^3.13.0", "@react-aria/interactions@^3.20.0": + version "3.20.0" + resolved "https://registry.yarnpkg.com/@react-aria/interactions/-/interactions-3.20.0.tgz#8db350541004f50c0479cc52b82597d8248ac5db" + integrity sha512-JCCEyK2Nb4mEHucrgmqhTHTNAEqhsiM07jJmmY22eikxnCQnsEfdwXyg9cgZLG79D5V7jyqVRqOp2OsG7Qx7kQ== + dependencies: + "@react-aria/ssr" "^3.9.0" + "@react-aria/utils" "^3.22.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/label@^3.7.3": + version "3.7.3" + resolved "https://registry.yarnpkg.com/@react-aria/label/-/label-3.7.3.tgz#37cb12d2a9495534205b6266aa5174c2fd861368" + integrity sha512-v1zuqbpYyYaPjrBWpceGjMpwP4ne6fLoOXdoIZoKLux2jkAcyIF2kIJFiyYoPQYQJWGRNo7q1oSwamxmng4xJw== + dependencies: + "@react-aria/utils" "^3.22.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/link@^3.6.2": + version "3.6.2" + resolved "https://registry.yarnpkg.com/@react-aria/link/-/link-3.6.2.tgz#4d7fb00000219aa3ff4bd02f59d5d3bd08be0da8" + integrity sha512-v9gXgQ3Gev0JOlg2MAXcubDMgX+0BlJ+hTyFYFMuN/4jVBlAe426WKbjg+6MMzxwukWg9C3Q08JzqdFTi4cBng== + dependencies: + "@react-aria/focus" "^3.15.0" + "@react-aria/interactions" "^3.20.0" + "@react-aria/utils" "^3.22.0" + "@react-types/link" "^3.5.2" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/listbox@^3.11.2": + version "3.11.2" + resolved "https://registry.yarnpkg.com/@react-aria/listbox/-/listbox-3.11.2.tgz#5d1d841987c1fbe300fa5d4bf5071f660b2a625b" + integrity sha512-FXdoqYLUTJn16OxodyS518PIcwzFkCfW5bxQepoy88NDMGtqp6u8fvEPpAoZbomvw/pV9MuEaMAw9qLyfkD4DA== + dependencies: + "@react-aria/interactions" "^3.20.0" + "@react-aria/label" "^3.7.3" + "@react-aria/selection" "^3.17.2" + "@react-aria/utils" "^3.22.0" + "@react-stately/collections" "^3.10.3" + "@react-stately/list" "^3.10.1" + "@react-types/listbox" "^3.4.6" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/live-announcer@^3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@react-aria/live-announcer/-/live-announcer-3.3.1.tgz#bf864b8820fb02daaeefc1c972782a0174fd60b9" + integrity sha512-hsc77U7S16trM86d+peqJCOCQ7/smO1cybgdpOuzXyiwcHQw8RQ4GrXrS37P4Ux/44E9nMZkOwATQRT2aK8+Ew== + dependencies: + "@swc/helpers" "^0.5.0" + +"@react-aria/menu@^3.11.2": + version "3.11.2" + resolved "https://registry.yarnpkg.com/@react-aria/menu/-/menu-3.11.2.tgz#bf6dbf751acc09ace12d35bb034a3790f9006720" + integrity sha512-I4R5FOvRtwIQW+0naXav5giZBp935X2tXB2xBg/cSAYDXgfLmFPLHkyPbO77hR6FwazfFfJoKdn0pVcRox3lrQ== + dependencies: + "@react-aria/focus" "^3.15.0" + "@react-aria/i18n" "^3.9.0" + "@react-aria/interactions" "^3.20.0" + "@react-aria/overlays" "^3.19.0" + "@react-aria/selection" "^3.17.2" + "@react-aria/utils" "^3.22.0" + "@react-stately/collections" "^3.10.3" + "@react-stately/menu" "^3.5.7" + "@react-stately/tree" "^3.7.4" + "@react-types/button" "^3.9.1" + "@react-types/menu" "^3.9.6" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/meter@^3.4.8": + version "3.4.8" + resolved "https://registry.yarnpkg.com/@react-aria/meter/-/meter-3.4.8.tgz#af30df03a4c35b13a873ca0847cfa705902b918d" + integrity sha512-u/pNisFs8UottonYlwqaS2i/NhHIw9LcApHo55XP7XMFCnaHPlq3mJzpSsr0zuCTvat2djoKelj41jT6Fhuw+A== + dependencies: + "@react-aria/progress" "^3.4.8" + "@react-types/meter" "^3.3.6" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/numberfield@^3.10.0": + version "3.10.0" + resolved "https://registry.yarnpkg.com/@react-aria/numberfield/-/numberfield-3.10.0.tgz#07d9be63346a0b8e9177a4ca9e4363e03f04afa9" + integrity sha512-ixkvkPTn18RNPnbaT726CHA+Wpr/qTYWboq8hSaJK0LiAtiEWCKg0pmVtJ4lFntAQ5GNp02xudTwhQdLN5WRig== + dependencies: + "@react-aria/i18n" "^3.9.0" + "@react-aria/interactions" "^3.20.0" + "@react-aria/spinbutton" "^3.6.0" + "@react-aria/textfield" "^3.13.0" + "@react-aria/utils" "^3.22.0" + "@react-stately/form" "^3.0.0" + "@react-stately/numberfield" "^3.7.0" + "@react-types/button" "^3.9.1" + "@react-types/numberfield" "^3.7.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/overlays@^3.19.0": + version "3.19.0" + resolved "https://registry.yarnpkg.com/@react-aria/overlays/-/overlays-3.19.0.tgz#0568d808c61e923174e896fc342a1529538da545" + integrity sha512-VN5GkB8+uZ2cfXljBtkqmrsAhBdGoj4un/agH0Qyihi2dazsMeafczSNnqzbpVgB4Zt2UHPJUkKwihgzXRxJJA== + dependencies: + "@react-aria/focus" "^3.15.0" + "@react-aria/i18n" "^3.9.0" + "@react-aria/interactions" "^3.20.0" + "@react-aria/ssr" "^3.9.0" + "@react-aria/utils" "^3.22.0" + "@react-aria/visually-hidden" "^3.8.7" + "@react-stately/overlays" "^3.6.4" + "@react-types/button" "^3.9.1" + "@react-types/overlays" "^3.8.4" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/progress@^3.4.8": + version "3.4.8" + resolved "https://registry.yarnpkg.com/@react-aria/progress/-/progress-3.4.8.tgz#3776ebeecc27c5b03db7a260ab39a92dbf722a21" + integrity sha512-Nah3aj5BNRa0+urQZimzb0vuKQK7lsc8BrUwJuHTwGRBSWUjCADExrJYdhDIR/nLUV2TCmAQl+GJtTgbEEj0DQ== + dependencies: + "@react-aria/i18n" "^3.9.0" + "@react-aria/label" "^3.7.3" + "@react-aria/utils" "^3.22.0" + "@react-types/progress" "^3.5.1" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/radio@^3.9.0": + version "3.9.0" + resolved "https://registry.yarnpkg.com/@react-aria/radio/-/radio-3.9.0.tgz#529b796ed3c5731c808af0a3da29e5535fa553b2" + integrity sha512-kr3+OQ1YU/3mURZfCsYaQmJ/c15qOm8uScaDRC39qz97bLNASakQqMImIaS+GluPKx1PEW3y2ErAgLplH28zZw== + dependencies: + "@react-aria/focus" "^3.15.0" + "@react-aria/form" "^3.0.0" + "@react-aria/i18n" "^3.9.0" + "@react-aria/interactions" "^3.20.0" + "@react-aria/label" "^3.7.3" + "@react-aria/utils" "^3.22.0" + "@react-stately/radio" "^3.10.0" + "@react-types/radio" "^3.6.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/searchfield@^3.6.0": + version "3.6.0" + resolved "https://registry.yarnpkg.com/@react-aria/searchfield/-/searchfield-3.6.0.tgz#dc40310c875ba4edd288392ada7223186c5fd1eb" + integrity sha512-mHaN+sx2SLqluvF0/YIBQ9WA5LakSWl79FgC0sOWEaOZhDswAbJ9tESdi/M/ahtOnVwblE0cpHRlUKV0Oz4gOw== + dependencies: + "@react-aria/i18n" "^3.9.0" + "@react-aria/textfield" "^3.13.0" + "@react-aria/utils" "^3.22.0" + "@react-stately/searchfield" "^3.5.0" + "@react-types/button" "^3.9.1" + "@react-types/searchfield" "^3.5.2" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/select@^3.14.0": + version "3.14.0" + resolved "https://registry.yarnpkg.com/@react-aria/select/-/select-3.14.0.tgz#81c7a3db9fec6d55f4b2820913207afc39b1600d" + integrity sha512-ulVFH8K1yr8CxQE7pzhlM3aWBltWfSbWdJV3FXDqM0kA+GHqqPwZVJcqPuegtaiju1z6nRk4q789kJa4o+4M9g== + dependencies: + "@react-aria/form" "^3.0.0" + "@react-aria/i18n" "^3.9.0" + "@react-aria/interactions" "^3.20.0" + "@react-aria/label" "^3.7.3" + "@react-aria/listbox" "^3.11.2" + "@react-aria/menu" "^3.11.2" + "@react-aria/selection" "^3.17.2" + "@react-aria/utils" "^3.22.0" + "@react-aria/visually-hidden" "^3.8.7" + "@react-stately/select" "^3.6.0" + "@react-types/button" "^3.9.1" + "@react-types/select" "^3.9.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/selection@^3.17.2": + version "3.17.2" + resolved "https://registry.yarnpkg.com/@react-aria/selection/-/selection-3.17.2.tgz#74b798344df1eb90e3fdae9bc880c0488468ae3b" + integrity sha512-AXXY3eOIWnITabMn6c0bpLPXkSX7040LOZU+7pQgtZJwDdZorLuKw4i7WS5i71LcV71ywG4mtqc9mOb/GfhUbg== + dependencies: + "@react-aria/focus" "^3.15.0" + "@react-aria/i18n" "^3.9.0" + "@react-aria/interactions" "^3.20.0" + "@react-aria/utils" "^3.22.0" + "@react-stately/selection" "^3.14.1" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/separator@^3.3.8": + version "3.3.8" + resolved "https://registry.yarnpkg.com/@react-aria/separator/-/separator-3.3.8.tgz#de209f8158c4dd5d4d66f0a57525bbfdb5b00b15" + integrity sha512-u15HgH2IVKN/mx7Hp9dfNiFpPU/mq2EA7l0e2fsVSjA77nhSctUFBAqaR7FAI/y86RUhq3zplIz4BJek1/3Dvw== + dependencies: + "@react-aria/utils" "^3.22.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/slider@^3.7.3": + version "3.7.3" + resolved "https://registry.yarnpkg.com/@react-aria/slider/-/slider-3.7.3.tgz#799b47e8559acf63d9c1195fac88bd4d5ca7cad0" + integrity sha512-AbrTD9UzMn0CwxFjOhJHz2ms2zdJlBL3XnbvqkpsmpXUl0u8WT1QAEaMnS5+792gnSGZs/ARDmse53o+IO8wTA== + dependencies: + "@react-aria/focus" "^3.15.0" + "@react-aria/i18n" "^3.9.0" + "@react-aria/interactions" "^3.20.0" + "@react-aria/label" "^3.7.3" + "@react-aria/utils" "^3.22.0" + "@react-stately/slider" "^3.4.5" + "@react-types/shared" "^3.22.0" + "@react-types/slider" "^3.7.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/spinbutton@^3.6.0": + version "3.6.0" + resolved "https://registry.yarnpkg.com/@react-aria/spinbutton/-/spinbutton-3.6.0.tgz#b881ffd6780f90972879334268634740297197c9" + integrity sha512-I7f1gfwVRcjguEXZijk0z5g8njZ2YWnQzVzcwGf8ocLPxfw1CnSivNCzwVj2ChXPX10uXewXVMLWVCz+BRC9uQ== + dependencies: + "@react-aria/i18n" "^3.9.0" + "@react-aria/live-announcer" "^3.3.1" + "@react-aria/utils" "^3.22.0" + "@react-types/button" "^3.9.1" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/ssr@^3.9.0": + version "3.9.0" + resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.9.0.tgz#457310129e1447b09d2f4aa2fdd62ab0e668d88c" + integrity sha512-Bz6BqP6ZorCme9tSWHZVmmY+s7AU8l6Vl2NUYmBzezD//fVHHfFo4lFBn5tBuAaJEm3AuCLaJQ6H2qhxNSb7zg== + dependencies: + "@swc/helpers" "^0.5.0" + +"@react-aria/switch@^3.5.7": + version "3.5.7" + resolved "https://registry.yarnpkg.com/@react-aria/switch/-/switch-3.5.7.tgz#b543ac69b5d5dca70c75fc6c80b9c2c9d8191403" + integrity sha512-zBEsB071zzhQ82RwAA42pFLXHgrpya0OoRAsTO6jHZwiaYMsyqJI2eiXd7F6rqklpgyO6k7jOQklGUuoSJW4pA== + dependencies: + "@react-aria/toggle" "^3.9.0" + "@react-stately/toggle" "^3.7.0" + "@react-types/switch" "^3.5.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/table@^3.13.2": + version "3.13.2" + resolved "https://registry.yarnpkg.com/@react-aria/table/-/table-3.13.2.tgz#ef73709facdd005d7d0f6051dc9bedb85eb4e58a" + integrity sha512-bJgMx2SZ8SFmTosbv6k1lZ1a0Yw3f8tzWhpIQodCaMHhtI7izA6YqDNx47NeBNYpVm9DFfAoWbb79HFJ+OKIJA== + dependencies: + "@react-aria/focus" "^3.15.0" + "@react-aria/grid" "^3.8.5" + "@react-aria/i18n" "^3.9.0" + "@react-aria/interactions" "^3.20.0" + "@react-aria/live-announcer" "^3.3.1" + "@react-aria/utils" "^3.22.0" + "@react-aria/visually-hidden" "^3.8.7" + "@react-stately/collections" "^3.10.3" + "@react-stately/flags" "^3.0.0" + "@react-stately/table" "^3.11.3" + "@react-stately/virtualizer" "^3.6.5" + "@react-types/checkbox" "^3.6.0" + "@react-types/grid" "^3.2.3" + "@react-types/shared" "^3.22.0" + "@react-types/table" "^3.9.1" + "@swc/helpers" "^0.5.0" + +"@react-aria/tabs@^3.8.2": + version "3.8.2" + resolved "https://registry.yarnpkg.com/@react-aria/tabs/-/tabs-3.8.2.tgz#ab11e77e6e9afaebb7549983c0aa0d66ae5d96bf" + integrity sha512-zDfeEEyJmcnH9TFvJECWIrJpxX4SmREFV1/P8hN6ZUJPYoeiGMXYYFvjcRb1r3LN8XKlbwR37AQ3Cn1/yhrUwQ== + dependencies: + "@react-aria/focus" "^3.15.0" + "@react-aria/i18n" "^3.9.0" + "@react-aria/selection" "^3.17.2" + "@react-aria/utils" "^3.22.0" + "@react-stately/tabs" "^3.6.2" + "@react-types/shared" "^3.22.0" + "@react-types/tabs" "^3.3.4" + "@swc/helpers" "^0.5.0" + +"@react-aria/tag@^3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@react-aria/tag/-/tag-3.3.0.tgz#ba7b5e2fc3c65f9a37c4737cb96897313174b9f2" + integrity sha512-mANJTcPyut98O4D3cAKaNEV6QFfoljZCDAgC+uJkV/Zn8cU4JOFeNLAyNoLRlPvYw+msqr6wUyPkWNERuO+1Uw== + dependencies: + "@react-aria/gridlist" "^3.7.2" + "@react-aria/i18n" "^3.9.0" + "@react-aria/interactions" "^3.20.0" + "@react-aria/label" "^3.7.3" + "@react-aria/selection" "^3.17.2" + "@react-aria/utils" "^3.22.0" + "@react-stately/list" "^3.10.1" + "@react-types/button" "^3.9.1" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/textfield@^3.13.0": + version "3.13.0" + resolved "https://registry.yarnpkg.com/@react-aria/textfield/-/textfield-3.13.0.tgz#bc8a027f93598a1ebd5013d027549a03d7b8dd04" + integrity sha512-sUlinDE+k/WhbskyqVOkuffuhiQpjgvp+iGRoralStVgb8Tcb+POxgAlw5jS4tNjdivCb3IjVJemUNJM7xsxxA== + dependencies: + "@react-aria/focus" "^3.15.0" + "@react-aria/form" "^3.0.0" + "@react-aria/label" "^3.7.3" + "@react-aria/utils" "^3.22.0" + "@react-stately/form" "^3.0.0" + "@react-stately/utils" "^3.9.0" + "@react-types/shared" "^3.22.0" + "@react-types/textfield" "^3.9.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/toggle@^3.9.0": + version "3.9.0" + resolved "https://registry.yarnpkg.com/@react-aria/toggle/-/toggle-3.9.0.tgz#c1b253d2fc05f2a673abd9fe4d62bc01a8781a92" + integrity sha512-2YMWYQUEmcoAXtrAE86QXBS9XlmJyV6IFRlMTBNaeLTdH3AmACExgsyU66Tt0sKl6LMDMI376ItMFqAz27BBdQ== + dependencies: + "@react-aria/focus" "^3.15.0" + "@react-aria/interactions" "^3.20.0" + "@react-aria/utils" "^3.22.0" + "@react-stately/toggle" "^3.7.0" + "@react-types/checkbox" "^3.6.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/tooltip@^3.6.5": + version "3.6.5" + resolved "https://registry.yarnpkg.com/@react-aria/tooltip/-/tooltip-3.6.5.tgz#aeb4c71db46f2c9ad0ff0b6810002bdacc07fea1" + integrity sha512-hXw4Z8nYLOWz3QOQ807wWZdvDwR3gofsmZhAehg2HPRwdRfCQK+1cjVKeUd9cKCAxs0Cay7dV0oUdilLbCQ2Gg== + dependencies: + "@react-aria/focus" "^3.15.0" + "@react-aria/interactions" "^3.20.0" + "@react-aria/utils" "^3.22.0" + "@react-stately/tooltip" "^3.4.6" + "@react-types/shared" "^3.22.0" + "@react-types/tooltip" "^3.4.6" + "@swc/helpers" "^0.5.0" + +"@react-aria/utils@^3.13.0", "@react-aria/utils@^3.14.2", "@react-aria/utils@^3.22.0": + version "3.22.0" + resolved "https://registry.yarnpkg.com/@react-aria/utils/-/utils-3.22.0.tgz#962a45ae95fdc21de7f22dda68253b0fb2470d06" + integrity sha512-Qi/m65GFFljXA/ayj1m5g3KZdgbZY3jacSSqD5vNUOEGiKsn4OQcsw8RfC2c0SgtLV1hLzsfvFI1OiryPlGCcw== + dependencies: + "@react-aria/ssr" "^3.9.0" + "@react-stately/utils" "^3.9.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + clsx "^1.1.1" + +"@react-aria/visually-hidden@^3.8.7": + version "3.8.7" + resolved "https://registry.yarnpkg.com/@react-aria/visually-hidden/-/visually-hidden-3.8.7.tgz#059699c70cc354ccb3699151b09071b3fc43fa82" + integrity sha512-OuIGMVQIt7GC43h4x35BgkZid8lhoPu7Xz4TQRP8nvOJWb1lH7ehrRRuGdUsK3y90nwpxTdNdg4DILblg+VaLw== + dependencies: + "@react-aria/interactions" "^3.20.0" + "@react-aria/utils" "^3.22.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/calendar@^3.4.2": + version "3.4.2" + resolved "https://registry.yarnpkg.com/@react-stately/calendar/-/calendar-3.4.2.tgz#7dd55cd2f0689bd0a5825326507dcb6b3d7f3d05" + integrity sha512-RfH40rVa2EhUnQgqH3HTZL+YhL+6tZ8T9GbN1K3AbIM5BBEtkb3P8qGhcaI7WpwNy1rlRFFFXGcqFAMUncDg2Q== + dependencies: + "@internationalized/date" "^3.5.0" + "@react-stately/utils" "^3.9.0" + "@react-types/calendar" "^3.4.2" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/checkbox@^3.6.0": + version "3.6.0" + resolved "https://registry.yarnpkg.com/@react-stately/checkbox/-/checkbox-3.6.0.tgz#448da0b07710a120959985fb081ad3855232fdc9" + integrity sha512-e1ChMwGovcOEDcdizqXDT6eDZixIMiPQOzNV5wPQ91SlGaIry9b0lQnK18tHg3yv2iiS6Ipj96cGBUKLJqQ+cQ== + dependencies: + "@react-stately/form" "^3.0.0" + "@react-stately/utils" "^3.9.0" + "@react-types/checkbox" "^3.6.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/collections@^3.10.3": + version "3.10.3" + resolved "https://registry.yarnpkg.com/@react-stately/collections/-/collections-3.10.3.tgz#c80bd30df3bf5d2a9c6fdf25f6313c5187d0154d" + integrity sha512-fA28HIApAIz9sNGeOVXZJPgV5Kig6M72KI1t9sUbnRUr9Xq9OMJTR6ElDMXNe0iTeZffRFDOPYyqnX9zkxof6Q== + dependencies: + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/combobox@^3.8.0": + version "3.8.0" + resolved "https://registry.yarnpkg.com/@react-stately/combobox/-/combobox-3.8.0.tgz#6bd9b23ade552f04e8ebc0eeb80e077efed17d6d" + integrity sha512-F74Avf7+8ruRqEB+3Lh6/C5jXc3ESJbRf9ovUxhmNAzBGeFKesPn5HpEpo87C+3OukGb+/Buvi3Rhib9+HVBKA== + dependencies: + "@react-stately/collections" "^3.10.3" + "@react-stately/form" "^3.0.0" + "@react-stately/list" "^3.10.1" + "@react-stately/menu" "^3.5.7" + "@react-stately/select" "^3.6.0" + "@react-stately/utils" "^3.9.0" + "@react-types/combobox" "^3.9.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/data@^3.11.0": + version "3.11.0" + resolved "https://registry.yarnpkg.com/@react-stately/data/-/data-3.11.0.tgz#d744d868ee810126aef4a0a827ab394e3059d33a" + integrity sha512-0BlPT58WrAtUvpiEfUuyvIsGFTzp/9vA5y+pk53kGJhOdc5tqBGHi9cg40pYE/i1vdHJGMpyHGRD9nkQb8wN3Q== + dependencies: + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/datepicker@^3.9.0": + version "3.9.0" + resolved "https://registry.yarnpkg.com/@react-stately/datepicker/-/datepicker-3.9.0.tgz#0771c66df937806f812392f8a512a2e72bebbaf0" + integrity sha512-p6BuxPbDxjIgBZmskdv2dR6XIdPEftCjS7kYe/+iLZxfz1vYiDqpJVb3ascLyBjl84bDDyr4z2vWcKhdDwyhEA== + dependencies: + "@internationalized/date" "^3.5.0" + "@internationalized/string" "^3.1.1" + "@react-stately/form" "^3.0.0" + "@react-stately/overlays" "^3.6.4" + "@react-stately/utils" "^3.9.0" + "@react-types/datepicker" "^3.7.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/dnd@^3.2.6": + version "3.2.6" + resolved "https://registry.yarnpkg.com/@react-stately/dnd/-/dnd-3.2.6.tgz#683649dce4183890528d8bea08c30f2b11c812f0" + integrity sha512-ex3Pjn+9uIoqsBb9F4ZFJb3fB0YadN8uYBOEiBb9N4UXWyANibGUYJ2FvIbvq1nFDU7On7MW1J9e3vkGglX4FQ== + dependencies: + "@react-stately/selection" "^3.14.1" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/flags@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@react-stately/flags/-/flags-3.0.0.tgz#c5a73965f8c90e8bf5981adddb4bdbb0ba2f5690" + integrity sha512-e3i2ItHbIa0eEwmSXAnPdD7K8syW76JjGe8ENxwFJPW/H1Pu9RJfjkCb/Mq0WSPN/TpxBb54+I9TgrGhbCoZ9w== + dependencies: + "@swc/helpers" "^0.4.14" + +"@react-stately/form@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@react-stately/form/-/form-3.0.0.tgz#584af339a128045c357c1b8ca440c87460a41b0f" + integrity sha512-C8wkfFmtx1escizibhdka5JvTy9/Vp173CS9cakjvWTmnjYYC1nOlzwp7BsYWTgerCFbRY/BU/Cf/bJDxPiUKQ== + dependencies: + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/grid@^3.8.3": + version "3.8.3" + resolved "https://registry.yarnpkg.com/@react-stately/grid/-/grid-3.8.3.tgz#42420724084a023c74e50d9c82efd8074179680d" + integrity sha512-JceGSJcuO6Zv+Aq5s2NZvmbMjdPjTtGNQR9kTgXKC/pOfM6FJ58bJiOmEllyN6oawqh4Ey8Xdqk9NuW4l2ctuw== + dependencies: + "@react-stately/collections" "^3.10.3" + "@react-stately/selection" "^3.14.1" + "@react-types/grid" "^3.2.3" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/list@^3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@react-stately/list/-/list-3.10.1.tgz#1d926d4aef5764096ec357da8081ef09081fe5cc" + integrity sha512-iVarLMd7FmMT0H20dRWsFOHHX5+c4gK51AXP2BSr1VtDSfbL4dgaGgu7IaAMVc/rO0au1e1tPM2hutiIFvPcnA== + dependencies: + "@react-stately/collections" "^3.10.3" + "@react-stately/selection" "^3.14.1" + "@react-stately/utils" "^3.9.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/menu@^3.5.7": + version "3.5.7" + resolved "https://registry.yarnpkg.com/@react-stately/menu/-/menu-3.5.7.tgz#3232598399b4baebfc577d5f56b4bd5570f400c2" + integrity sha512-bzTmAqzcMNatvyruWlvOdZSmMhz3+mkdxtqaZzYHq+DpR6ka57lIRj8dBnZWQGwV3RypMZfz+X6aIX4kruGVbw== + dependencies: + "@react-stately/overlays" "^3.6.4" + "@react-types/menu" "^3.9.6" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/numberfield@^3.7.0": + version "3.7.0" + resolved "https://registry.yarnpkg.com/@react-stately/numberfield/-/numberfield-3.7.0.tgz#a0fd05da980dbe510d1d99ea7cf21ce4f9bac1bb" + integrity sha512-DOz4jL7T30KGUXpGh/z80aHf+DEOQfvCHVDfll+IU7p3sd+bbM5uj7JdwXpZgIYUK8KTf2N49sL6lq5uCoxh8w== + dependencies: + "@internationalized/number" "^3.4.0" + "@react-stately/form" "^3.0.0" + "@react-stately/utils" "^3.9.0" + "@react-types/numberfield" "^3.7.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/overlays@^3.6.4": + version "3.6.4" + resolved "https://registry.yarnpkg.com/@react-stately/overlays/-/overlays-3.6.4.tgz#1d0d974413fa3f13d97eec2cac5b48c49978d1a0" + integrity sha512-tHEaoAGpE9dSnsskqLPVKum59yGteoSqsniTopodM+miQozbpPlSjdiQnzGLroy5Afx5OZYClE616muNHUILXA== + dependencies: + "@react-stately/utils" "^3.9.0" + "@react-types/overlays" "^3.8.4" + "@swc/helpers" "^0.5.0" + +"@react-stately/radio@^3.10.0": + version "3.10.0" + resolved "https://registry.yarnpkg.com/@react-stately/radio/-/radio-3.10.0.tgz#01750b861bfdbb048c6e1bbfb6a97a4f42c29c25" + integrity sha512-d8IgZtUq/4vhE7YhyBVg1QdVoFS0caIcvPumXqtp/5vlDgpUsVy9jSeWtbk0H4FyUcmJlQhRcTylKB9THXY1YQ== + dependencies: + "@react-stately/form" "^3.0.0" + "@react-stately/utils" "^3.9.0" + "@react-types/radio" "^3.6.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/searchfield@^3.5.0": + version "3.5.0" + resolved "https://registry.yarnpkg.com/@react-stately/searchfield/-/searchfield-3.5.0.tgz#8493eefd684bc85117b42c7c714f6541afe54816" + integrity sha512-SStjChkn/33pEn40slKQPnBnmQYyxVazVwPjiBkdeVejC42lUVairUTrGJgF0PNoZTbxn0so2/XzjqTC9T8iCw== + dependencies: + "@react-stately/utils" "^3.9.0" + "@react-types/searchfield" "^3.5.2" + "@swc/helpers" "^0.5.0" + +"@react-stately/select@^3.6.0": + version "3.6.0" + resolved "https://registry.yarnpkg.com/@react-stately/select/-/select-3.6.0.tgz#e77464f3e0367d652866806c1ab61c132c31c49a" + integrity sha512-GvSE4DXmcvdRNUc+ciPU7gedt7LfRO8FFFIzhB/bCQhUlK6/xihUPrGXayzqxLeTQKttMH323LuYFKfwpJRhsA== + dependencies: + "@react-stately/form" "^3.0.0" + "@react-stately/list" "^3.10.1" + "@react-stately/menu" "^3.5.7" + "@react-types/select" "^3.9.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/selection@^3.14.1": + version "3.14.1" + resolved "https://registry.yarnpkg.com/@react-stately/selection/-/selection-3.14.1.tgz#798b4fbfda940778ae1dc1f2d2390cee97cce2c6" + integrity sha512-96/CerrB6yH4Ad9FkzBzyVerSPjcIj1NBTWTFHo1N+oHECvyGsDxZl7Y4LQR++teFK66FhX5KjCJQGae4IZd6A== + dependencies: + "@react-stately/collections" "^3.10.3" + "@react-stately/utils" "^3.9.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/slider@^3.4.5": + version "3.4.5" + resolved "https://registry.yarnpkg.com/@react-stately/slider/-/slider-3.4.5.tgz#46d4a7e0a1644894e91b12003fa1ba8e0787f4ca" + integrity sha512-lJPZC8seYbnZDqAlZm3/QC95I5iluG8ouwkPMmvtWCz1baayV/jJtfxA/74zR7Vcob9Fe7O57g8Edhz/hv9xOQ== + dependencies: + "@react-stately/utils" "^3.9.0" + "@react-types/shared" "^3.22.0" + "@react-types/slider" "^3.7.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/table@^3.11.3": + version "3.11.3" + resolved "https://registry.yarnpkg.com/@react-stately/table/-/table-3.11.3.tgz#0d9e547fc2e30df174ac4ba3728402f62fb2fc0a" + integrity sha512-r0rzSKbtMG4tjFpCGtXb8p6hOuek03c6rheJE88z4I/ujZ5EmEO6Ps8q0JMNEDCY2qigvKM+ODisMBeZCEkIJg== + dependencies: + "@react-stately/collections" "^3.10.3" + "@react-stately/flags" "^3.0.0" + "@react-stately/grid" "^3.8.3" + "@react-stately/selection" "^3.14.1" + "@react-stately/utils" "^3.9.0" + "@react-types/grid" "^3.2.3" + "@react-types/shared" "^3.22.0" + "@react-types/table" "^3.9.1" + "@swc/helpers" "^0.5.0" + +"@react-stately/tabs@^3.6.2": + version "3.6.2" + resolved "https://registry.yarnpkg.com/@react-stately/tabs/-/tabs-3.6.2.tgz#a9825d560af58c4f876e7b619c7e8cb29b071887" + integrity sha512-f+U4D1FAVfVVcNRbtKIv4GrO37CLFClYQlXx9zIuSXjHsviapVD2IQSyAmpKo/CbgXhYRMdGwENZdOsmF/Ns7g== + dependencies: + "@react-stately/list" "^3.10.1" + "@react-types/shared" "^3.22.0" + "@react-types/tabs" "^3.3.4" + "@swc/helpers" "^0.5.0" + +"@react-stately/toggle@^3.7.0": + version "3.7.0" + resolved "https://registry.yarnpkg.com/@react-stately/toggle/-/toggle-3.7.0.tgz#abe2f08f37a0f41e6513d4fde3d46f49500bb5cc" + integrity sha512-TRksHkCJk/Xogq4181g3CYgJf+EfsJCqX5UZDSw1Z1Kgpvonjmdf6FAfQfCh9QR2OuXUL6hOLUDVLte5OPI+5g== + dependencies: + "@react-stately/utils" "^3.9.0" + "@react-types/checkbox" "^3.6.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/tooltip@^3.4.6": + version "3.4.6" + resolved "https://registry.yarnpkg.com/@react-stately/tooltip/-/tooltip-3.4.6.tgz#e240184dedc35018f7b1e2d46eaca20a90d919bb" + integrity sha512-uL93bmsXf+OOgpKLPEKfpDH4z+MK2CuqlqVxx7rshN0vjWOSoezE5nzwgee90+RpDrLNNNWTNa7n+NkDRpI1jA== + dependencies: + "@react-stately/overlays" "^3.6.4" + "@react-types/tooltip" "^3.4.6" + "@swc/helpers" "^0.5.0" + +"@react-stately/tree@^3.7.4": + version "3.7.4" + resolved "https://registry.yarnpkg.com/@react-stately/tree/-/tree-3.7.4.tgz#57cc57863837092f13b7a3887e1b5c56330b5cac" + integrity sha512-0yvVODBS8WnSivLFX5ccEjCl2NA/8lbEt1E48wVcY1xcXgISNpw5MSGK5jC6YrtJPIqVolQIkNSbMreXGBktIg== + dependencies: + "@react-stately/collections" "^3.10.3" + "@react-stately/selection" "^3.14.1" + "@react-stately/utils" "^3.9.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/utils@^3.9.0": + version "3.9.0" + resolved "https://registry.yarnpkg.com/@react-stately/utils/-/utils-3.9.0.tgz#9cb2c8eea5dd1b58256ecb436b963c01526bae37" + integrity sha512-yPKFY1F88HxuZ15BG2qwAYxtpE4HnIU0Ofi4CuBE0xC6I8mwo4OQjDzi+DZjxQngM9D6AeTTD6F1V8gkozA0Gw== + dependencies: + "@swc/helpers" "^0.5.0" + +"@react-stately/virtualizer@^3.6.5": + version "3.6.5" + resolved "https://registry.yarnpkg.com/@react-stately/virtualizer/-/virtualizer-3.6.5.tgz#45891ac24b6aed0aa168e26c61a39d235d204a70" + integrity sha512-v0cZeNCGPMeo3LP4UrGuDo3Xpq7ufNaZyGObgSvdrIW49qK5F02kczcKy6NKg+QfOgC/+Nc9Tof/2S8dcxDrCA== + dependencies: + "@react-aria/utils" "^3.22.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-types/breadcrumbs@^3.7.2": + version "3.7.2" + resolved "https://registry.yarnpkg.com/@react-types/breadcrumbs/-/breadcrumbs-3.7.2.tgz#3dc0c8ccebf75844efc56ac8e53dc072df083d5f" + integrity sha512-esl6RucDW2CNMsApJxNYfMtDaUcfLlwKMPH/loYsOBbKxGl2HsgVLMcdpjEkTRs2HCTNCbBXWpeU8AY77t+bsw== + dependencies: + "@react-types/link" "^3.5.2" + "@react-types/shared" "^3.22.0" + +"@react-types/button@^3.9.1": + version "3.9.1" + resolved "https://registry.yarnpkg.com/@react-types/button/-/button-3.9.1.tgz#eb54745133bdaad345d8d589021b67ef2882e1c5" + integrity sha512-bf9iTar3PtqnyV9rA+wyFyrskZKhwmOuOd/ifYIjPs56YNVXWH5Wfqj6Dx3xdFBgtKx8mEVQxVhoX+WkHX+rtw== + dependencies: + "@react-types/shared" "^3.22.0" + +"@react-types/calendar@^3.4.2": + version "3.4.2" + resolved "https://registry.yarnpkg.com/@react-types/calendar/-/calendar-3.4.2.tgz#a184851c2c891e8baa06e3d11173bb4bf101a48b" + integrity sha512-tCZ21un/8OAhpNtmSXDkOVvS5Pzp+y/JwNr6VGFi8HBC5F/c8SzuwV0jKN8ymsZSWbDQ68xXGNWxFaG43Bw8Pg== + dependencies: + "@internationalized/date" "^3.5.0" + "@react-types/shared" "^3.22.0" + +"@react-types/checkbox@^3.6.0": + version "3.6.0" + resolved "https://registry.yarnpkg.com/@react-types/checkbox/-/checkbox-3.6.0.tgz#ba702be25555c1520f78be39c8260354638792b6" + integrity sha512-vgbuJzQpVCNT5AZWV0OozXCnihqrXxoZKfJFIw0xro47pT2sn3t5UC4RA9wfjDGMoK4frw1K/4HQLsQIOsPBkw== + dependencies: + "@react-types/shared" "^3.22.0" + +"@react-types/combobox@^3.9.0": + version "3.9.0" + resolved "https://registry.yarnpkg.com/@react-types/combobox/-/combobox-3.9.0.tgz#f671da0357cfe3a06a24a239fcfacc5b3e5125d0" + integrity sha512-VAQWM2jrIWROgcTKxj4k37WWpK/1zRjj1HfGeuenAQyOQwImqDwCHx5YxQR1GiUEFne4v1yXe2khT0T5Kt2vDg== + dependencies: + "@react-types/shared" "^3.22.0" + +"@react-types/datepicker@^3.4.0", "@react-types/datepicker@^3.7.0": + version "3.7.0" + resolved "https://registry.yarnpkg.com/@react-types/datepicker/-/datepicker-3.7.0.tgz#f44632994a0cdd20f350b40910f61a7c89091810" + integrity sha512-Uh+p6pZpMFc5ZBOns5TXCBbUvJp1KVROLBn2gk5dMEFVq78Qs1VFuAt4lwr9gQBOJrX5I/l65pRTwwWwAKxYtQ== + dependencies: + "@internationalized/date" "^3.5.0" + "@react-types/calendar" "^3.4.2" + "@react-types/overlays" "^3.8.4" + "@react-types/shared" "^3.22.0" + +"@react-types/dialog@^3.5.7": + version "3.5.7" + resolved "https://registry.yarnpkg.com/@react-types/dialog/-/dialog-3.5.7.tgz#3fd93875ff317d6014e814b6e1a2abb87272a1ef" + integrity sha512-geYoqAyQaTLG43AaXdMUVqZXYgkSifrD9cF7lR2kPAT0uGFv0YREi6ieU+aui8XJ83EW0xcxP+EPWd2YkN4D4w== + dependencies: + "@react-types/overlays" "^3.8.4" + "@react-types/shared" "^3.22.0" + +"@react-types/grid@^3.2.3": + version "3.2.3" + resolved "https://registry.yarnpkg.com/@react-types/grid/-/grid-3.2.3.tgz#20b19b73315343630145ff9e43138e7f2855d946" + integrity sha512-GQM4RDmYhstcYZ0Odjq+xUwh1fhLmRebG6qMM8OXHTPQ77nhl3wc1UTGRhZm6mzEionplSRx4GCpEMEHMJIU0w== + dependencies: + "@react-types/shared" "^3.22.0" + +"@react-types/link@^3.5.2": + version "3.5.2" + resolved "https://registry.yarnpkg.com/@react-types/link/-/link-3.5.2.tgz#b363abca3365adc64b49c47163ce00235c01c667" + integrity sha512-/s51/WejmpLiyxOgP89s4txgxYoGaPe8pVDItVo1h4+BhU1Puyvgv/Jx8t9dPvo6LUXbraaN+SgKk/QDxaiirw== + dependencies: + "@react-types/shared" "^3.22.0" + +"@react-types/listbox@^3.4.6": + version "3.4.6" + resolved "https://registry.yarnpkg.com/@react-types/listbox/-/listbox-3.4.6.tgz#da0887dbb89a868d53b87486111bf0a51042da7b" + integrity sha512-XOQvrTqNh5WIPDvKiWiep8T07RAsMfjAXTjDbnjxVlKACUXkcwpts9kFaLnJ9LJRFt6DwItfP+WMkzvmx63/NQ== + dependencies: + "@react-types/shared" "^3.22.0" + +"@react-types/menu@^3.9.6": + version "3.9.6" + resolved "https://registry.yarnpkg.com/@react-types/menu/-/menu-3.9.6.tgz#1b36842cbdb4590dfff78437316aec4a3f47b1f6" + integrity sha512-w/RbFInOf4nNayQDv5c2L8IMJbcFOkBhsT3xvvpTy+CHvJcQdjggwaV1sRiw7eF/PwB81k2CwigmidUzHJhKDg== + dependencies: + "@react-types/overlays" "^3.8.4" + "@react-types/shared" "^3.22.0" + +"@react-types/meter@^3.3.6": + version "3.3.6" + resolved "https://registry.yarnpkg.com/@react-types/meter/-/meter-3.3.6.tgz#ae5960b27012f52ca33970f2ff416af71dad274d" + integrity sha512-1XYp1fA9UU0lO6kjf3TwVE8mppOJa64mBKAcLWtTyq1e/cYIAbx5o6CsuUx0YDpXKF6gdtvIWvfmxeWsmqJ1jQ== + dependencies: + "@react-types/progress" "^3.5.1" + +"@react-types/numberfield@^3.7.0": + version "3.7.0" + resolved "https://registry.yarnpkg.com/@react-types/numberfield/-/numberfield-3.7.0.tgz#a029bf2a8a07049c96ea5ffe1f7533ab2305bcf4" + integrity sha512-gaGi+vqm1Y8LCWRsWYUjcGftPIzl+8W2VOfkgKMLM8y76nnwTPtmAqs+Ap1cg7sEJSfsiKMq93e9yvP3udrC2w== + dependencies: + "@react-types/shared" "^3.22.0" + +"@react-types/overlays@^3.8.4": + version "3.8.4" + resolved "https://registry.yarnpkg.com/@react-types/overlays/-/overlays-3.8.4.tgz#a538f6f2fb9826f1da78d3b4f0f6326a709ce37d" + integrity sha512-pfgNlQnbF6RB/R2oSxyqAP3Uzz0xE/k5q4n5gUeCDNLjY5qxFHGE8xniZZ503nZYw6VBa9XMN1efDOKQyeiO0w== + dependencies: + "@react-types/shared" "^3.22.0" + +"@react-types/progress@^3.5.1": + version "3.5.1" + resolved "https://registry.yarnpkg.com/@react-types/progress/-/progress-3.5.1.tgz#b988cd2d2ff194c7652d74f714b230f26ab73c6c" + integrity sha512-CqsUjczUK/SfuFzDcajBBaXRTW0D3G9S/yqLDj9e8E0ii+lGDLt1PHj24t1J7E88U2rVYqmM9VL4NHTt8o3IYA== + dependencies: + "@react-types/shared" "^3.22.0" + +"@react-types/radio@^3.6.0": + version "3.6.0" + resolved "https://registry.yarnpkg.com/@react-types/radio/-/radio-3.6.0.tgz#519e4aa40dbb2a13852a5a6f36299a84639376a5" + integrity sha512-VOZzegxxZS55gHRVyWu278Q4y/rEQGiAVQCUqi25GmpbMe4MlHrzg16c76RiZMUK9PPoyv+XNUgAaPmxebkn7g== + dependencies: + "@react-types/shared" "^3.22.0" + +"@react-types/searchfield@^3.5.2": + version "3.5.2" + resolved "https://registry.yarnpkg.com/@react-types/searchfield/-/searchfield-3.5.2.tgz#e663899f42344243ea7b4cd6f0ab0bfe6020151e" + integrity sha512-JAK2/Kg4Dr393FYfbRw0TlXKnJPX77sq1x/ZBxtO6p64+MuuIYKqw0i9PwDlo1PViw2QI5u8GFhKA2TgemY9uA== + dependencies: + "@react-types/shared" "^3.22.0" + "@react-types/textfield" "^3.9.0" + +"@react-types/select@^3.9.0": + version "3.9.0" + resolved "https://registry.yarnpkg.com/@react-types/select/-/select-3.9.0.tgz#ddc1238194776ef161260547d25038409885ced8" + integrity sha512-0nalGmcoma4jreICLSJae/uKAuMiVyWgqWjGrGiUGGcdDchH4limKVEqNDaBwLvxVT6NB5LLsaipCTCAEEl4Rg== + dependencies: + "@react-types/shared" "^3.22.0" + +"@react-types/shared@^3.16.0", "@react-types/shared@^3.22.0": + version "3.22.0" + resolved "https://registry.yarnpkg.com/@react-types/shared/-/shared-3.22.0.tgz#70f85aad46cd225f7fcb29f1c2b5213163605074" + integrity sha512-yVOekZWbtSmmiThGEIARbBpnmUIuePFlLyctjvCbgJgGhz8JnEJOipLQ/a4anaWfzAgzSceQP8j/K+VOOePleA== + +"@react-types/slider@^3.7.0": + version "3.7.0" + resolved "https://registry.yarnpkg.com/@react-types/slider/-/slider-3.7.0.tgz#d9e4dbe1b2109c7accfcc0e2e330ff10cd3a837c" + integrity sha512-uyQXUVFfqc9SPUW0LZLMan2n232F/OflRafiHXz9viLFa9tVOupVa7GhASRAoHojwkjoJ1LjFlPih7g5dOZ0/Q== + dependencies: + "@react-types/shared" "^3.22.0" + +"@react-types/switch@^3.5.0": + version "3.5.0" + resolved "https://registry.yarnpkg.com/@react-types/switch/-/switch-3.5.0.tgz#8ebf07c60aef22b181eb4ab884cf3d2abddd66c6" + integrity sha512-/wNmUGjk69bP6t5k2QkAdrNN5Eb9Rz4dOyp0pCPmoeE+5haW6sV5NmtkvWX1NSc4DQz1xL/a5b+A0vxPCP22Jw== + dependencies: + "@react-types/shared" "^3.22.0" + +"@react-types/table@^3.9.1": + version "3.9.1" + resolved "https://registry.yarnpkg.com/@react-types/table/-/table-3.9.1.tgz#5d1304d412bc7e637e832e86fcb8724e61c20735" + integrity sha512-3e+Oouw9jGqNDg+JRg7v7fgPqDZd6DtST9S/UPp81f32ntnQ8Wsu7S/J4eyLHu5CVQDqcHkf4xPeeXBgPx4qmw== + dependencies: + "@react-types/grid" "^3.2.3" + "@react-types/shared" "^3.22.0" + +"@react-types/tabs@^3.3.4": + version "3.3.4" + resolved "https://registry.yarnpkg.com/@react-types/tabs/-/tabs-3.3.4.tgz#43fa93a4a67dcc53031afc56a8ad3bf5f44473a8" + integrity sha512-4mCTtFrwMRypyGTZCvNYVT9CkknexO/UYvqwDm2jMYb8JgjRvxnomu776Yh7uyiYKWyql2upm20jqasEOm620w== + dependencies: + "@react-types/shared" "^3.22.0" + +"@react-types/textfield@^3.9.0": + version "3.9.0" + resolved "https://registry.yarnpkg.com/@react-types/textfield/-/textfield-3.9.0.tgz#ad29f0a70421f9d2cd6cf2795df10a7712954e69" + integrity sha512-D/DiwzsfkwlAg3uv8hoIfwju+zhB/hWDEdTvxQbPkntDr0kmN/QfI17NMSzbOBCInC4ABX87ViXLGxr940ykGA== + dependencies: + "@react-types/shared" "^3.22.0" + +"@react-types/tooltip@^3.4.6": + version "3.4.6" + resolved "https://registry.yarnpkg.com/@react-types/tooltip/-/tooltip-3.4.6.tgz#1f1eb22873a5d5ad355e0de1be46f48759b55f6f" + integrity sha512-RaZewdER7ZcsNL99RhVHs8kSLyzIBkwc0W6eFZrxST2MD9J5GzkVWRhIiqtFOd5U1aYnxdJ6woq72Ef+le6Vfw== + dependencies: + "@react-types/overlays" "^3.8.4" + "@react-types/shared" "^3.22.0" + "@remix-run/router@1.0.1": version "1.0.1" resolved "https://registry.npmjs.org/@remix-run/router/-/router-1.0.1.tgz" @@ -835,6 +2775,11 @@ resolved "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz" integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== +"@stitches/react@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@stitches/react/-/react-1.2.8.tgz#954f8008be8d9c65c4e58efa0937f32388ce3a38" + integrity sha512-9g9dWI4gsSVe8bNLlb+lMkBYsnIKCZTmvqvDG+Avnn69XfmHZKiaMrx7cgTaddq7aTPPmXiTsbFcUy0xgI4+wA== + "@stripe/react-stripe-js@^2.1.0": version "2.1.0" resolved "https://registry.npmjs.org/@stripe/react-stripe-js/-/react-stripe-js-2.1.0.tgz" @@ -910,6 +2855,21 @@ dependencies: tslib "^2.4.0" +"@swc/helpers@^0.4.14": + version "0.4.36" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.4.36.tgz#fcfff76ed52c214f357e8e9d3f37b568908072d9" + integrity sha512-5lxnyLEYFskErRPenYItLRSge5DjrJngYKdVjRSrWfza9G6KkgHEXi0vUZiyUeMU5JfXH1YnvXZzSp8ul88o2Q== + dependencies: + legacy-swc-helpers "npm:@swc/helpers@=0.4.14" + tslib "^2.4.0" + +"@swc/helpers@^0.5.0": + version "0.5.3" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.3.tgz#98c6da1e196f5f08f977658b80d6bd941b5f294f" + integrity sha512-FaruWX6KdudYloq1AHD/4nU+UsMTdNE8CKyrseXWEcgjDAbvkwJg2QGPAnfIJLIWsjZOSPLOAykK6fuYp4vp4A== + dependencies: + tslib "^2.4.0" + "@types/cookie@^0.4.1": version "0.4.1" resolved "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz" @@ -1341,6 +3301,13 @@ argparse@^2.0.1: resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +aria-hidden@^1.1.1: + version "1.2.3" + resolved "https://registry.yarnpkg.com/aria-hidden/-/aria-hidden-1.2.3.tgz#14aeb7fb692bbb72d69bebfa47279c1fd725e954" + integrity sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ== + dependencies: + tslib "^2.0.0" + aria-query@^4.2.2: version "4.2.2" resolved "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz" @@ -1645,6 +3612,11 @@ client-only@0.0.1: resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== +clsx@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== + color-convert@^1.9.0: version "1.9.3" resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" @@ -1873,6 +3845,11 @@ destroy@1.2.0: resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== +detect-node-es@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" + integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== + dicer@0.2.5: version "0.2.5" resolved "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz" @@ -2891,6 +4868,11 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@ has "^1.0.3" has-symbols "^1.0.3" +get-nonce@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" + integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== + get-stream@^6.0.0: version "6.0.1" resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" @@ -3163,6 +5145,23 @@ internal-slot@^1.0.3: has "^1.0.3" side-channel "^1.0.4" +intl-messageformat@^10.1.0: + version "10.5.8" + resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.5.8.tgz#7184da425f360a53a5483a6194e16d666b011fc0" + integrity sha512-NRf0jpBWV0vd671G5b06wNofAN8tp7WWDogMZyaU8GUAsmbouyvgwmFJI7zLjfAMpm3zK+vSwRP3jzaoIcMbaA== + dependencies: + "@formatjs/ecma402-abstract" "1.18.0" + "@formatjs/fast-memoize" "2.2.0" + "@formatjs/icu-messageformat-parser" "2.7.3" + tslib "^2.4.0" + +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" @@ -3413,6 +5412,13 @@ language-tags@^1.0.5: dependencies: language-subtag-registry "~0.3.2" +"legacy-swc-helpers@npm:@swc/helpers@=0.4.14": + version "0.4.14" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.4.14.tgz#1352ac6d95e3617ccb7c1498ff019654f1e12a74" + integrity sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw== + dependencies: + tslib "^2.4.0" + levn@^0.4.1: version "0.4.1" resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" @@ -3537,7 +5543,7 @@ log-update@^4.0.0: slice-ansi "^4.0.0" wrap-ansi "^6.2.0" -loose-envify@^1.1.0, loose-envify@^1.4.0: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -4260,6 +6266,48 @@ raw-body@2.5.1: iconv-lite "0.4.24" unpipe "1.0.0" +react-aria@^3.25.0: + version "3.30.0" + resolved "https://registry.yarnpkg.com/react-aria/-/react-aria-3.30.0.tgz#dd53d2103050e7279ec8f3faacce5ae8521f61ce" + integrity sha512-ULMlmH68/jXzkDaMjuM9O8dKCxnAYviW4E5sywfLX4J6mC6eGsQzoqtwWeQgr1M9SJqLfgKaVoDP1dLvb4XzEA== + dependencies: + "@react-aria/breadcrumbs" "^3.5.8" + "@react-aria/button" "^3.9.0" + "@react-aria/calendar" "^3.5.3" + "@react-aria/checkbox" "^3.12.0" + "@react-aria/combobox" "^3.8.0" + "@react-aria/datepicker" "^3.9.0" + "@react-aria/dialog" "^3.5.8" + "@react-aria/dnd" "^3.5.0" + "@react-aria/focus" "^3.15.0" + "@react-aria/gridlist" "^3.7.2" + "@react-aria/i18n" "^3.9.0" + "@react-aria/interactions" "^3.20.0" + "@react-aria/label" "^3.7.3" + "@react-aria/link" "^3.6.2" + "@react-aria/listbox" "^3.11.2" + "@react-aria/menu" "^3.11.2" + "@react-aria/meter" "^3.4.8" + "@react-aria/numberfield" "^3.10.0" + "@react-aria/overlays" "^3.19.0" + "@react-aria/progress" "^3.4.8" + "@react-aria/radio" "^3.9.0" + "@react-aria/searchfield" "^3.6.0" + "@react-aria/select" "^3.14.0" + "@react-aria/selection" "^3.17.2" + "@react-aria/separator" "^3.3.8" + "@react-aria/slider" "^3.7.3" + "@react-aria/ssr" "^3.9.0" + "@react-aria/switch" "^3.5.7" + "@react-aria/table" "^3.13.2" + "@react-aria/tabs" "^3.8.2" + "@react-aria/tag" "^3.3.0" + "@react-aria/textfield" "^3.13.0" + "@react-aria/tooltip" "^3.6.5" + "@react-aria/utils" "^3.22.0" + "@react-aria/visually-hidden" "^3.8.7" + "@react-types/shared" "^3.22.0" + react-color@^2.19.3: version "2.19.3" resolved "https://registry.npmjs.org/react-color/-/react-color-2.19.3.tgz" @@ -4319,6 +6367,25 @@ react-refresh@^0.14.0: resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz" integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ== +react-remove-scroll-bar@^2.3.3: + version "2.3.4" + resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz#53e272d7a5cb8242990c7f144c44d8bd8ab5afd9" + integrity sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A== + dependencies: + react-style-singleton "^2.2.1" + tslib "^2.0.0" + +react-remove-scroll@2.5.5: + version "2.5.5" + resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz#1e31a1260df08887a8a0e46d09271b52b3a37e77" + integrity sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw== + dependencies: + react-remove-scroll-bar "^2.3.3" + react-style-singleton "^2.2.1" + tslib "^2.1.0" + use-callback-ref "^1.3.0" + use-sidecar "^1.1.2" + react-router-dom@^6.3.0: version "6.4.1" resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.4.1.tgz" @@ -4334,6 +6401,44 @@ react-router@6.4.1: dependencies: "@remix-run/router" "1.0.1" +react-stately@^3.23.0: + version "3.28.0" + resolved "https://registry.yarnpkg.com/react-stately/-/react-stately-3.28.0.tgz#f2831e50b70b0dcec7e3d7e3787f9dc1df42d9c3" + integrity sha512-owEHRGS1zRMwtiR/jeXUjUWyqk8oe53wNtedMvg9+8+NNhDKL4/DXHcIp2A13q08v09xYWgVPtnu8fsF53x2PQ== + dependencies: + "@react-stately/calendar" "^3.4.2" + "@react-stately/checkbox" "^3.6.0" + "@react-stately/collections" "^3.10.3" + "@react-stately/combobox" "^3.8.0" + "@react-stately/data" "^3.11.0" + "@react-stately/datepicker" "^3.9.0" + "@react-stately/dnd" "^3.2.6" + "@react-stately/form" "^3.0.0" + "@react-stately/list" "^3.10.1" + "@react-stately/menu" "^3.5.7" + "@react-stately/numberfield" "^3.7.0" + "@react-stately/overlays" "^3.6.4" + "@react-stately/radio" "^3.10.0" + "@react-stately/searchfield" "^3.5.0" + "@react-stately/select" "^3.6.0" + "@react-stately/selection" "^3.14.1" + "@react-stately/slider" "^3.4.5" + "@react-stately/table" "^3.11.3" + "@react-stately/tabs" "^3.6.2" + "@react-stately/toggle" "^3.7.0" + "@react-stately/tooltip" "^3.4.6" + "@react-stately/tree" "^3.7.4" + "@react-types/shared" "^3.22.0" + +react-style-singleton@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.2.1.tgz#f99e420492b2d8f34d38308ff660b60d0b1205b4" + integrity sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g== + dependencies: + get-nonce "^1.0.0" + invariant "^2.2.4" + tslib "^2.0.0" + react@17.0.2, react@^17.0.2: version "17.0.2" resolved "https://registry.npmjs.org/react/-/react-17.0.2.tgz" @@ -4391,6 +6496,11 @@ regenerator-runtime@^0.13.4: resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz" integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + regexp.prototype.flags@^1.4.1, regexp.prototype.flags@^1.4.3: version "1.4.3" resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz" @@ -4974,6 +7084,11 @@ tslib@^1.8.1: resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +tslib@^2.0.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4.0: version "2.4.0" resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz" @@ -5167,6 +7282,21 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +use-callback-ref@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.0.tgz#772199899b9c9a50526fedc4993fc7fa1f7e32d5" + integrity sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w== + dependencies: + tslib "^2.0.0" + +use-sidecar@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.1.2.tgz#2f43126ba2d7d7e117aa5855e5d8f0276dfe73c2" + integrity sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw== + dependencies: + detect-node-es "^1.1.0" + tslib "^2.0.0" + use-sync-external-store@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz" @@ -5280,6 +7410,11 @@ websocket@^1.0.34: utf-8-validate "^5.0.2" yaeti "^0.0.6" +what-input@^5.2.11: + version "5.2.12" + resolved "https://registry.yarnpkg.com/what-input/-/what-input-5.2.12.tgz#6eb5b5d39ebff4e2273df8bf69d8d2fc9a6e060a" + integrity sha512-3yrSa7nGSXGJS6wZeSkO6VNm95pB1mZ9i3wFzC1hhY7mn4/afue/MvXz04OXNdBC8bfo4AB4RRd3Dem9jXM58Q== + whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" From 147a0a9cb52bce7af9656da633b8c6c2b9d6af79 Mon Sep 17 00:00:00 2001 From: Frederico Estrela Gaiva Date: Wed, 15 Nov 2023 14:50:03 +0100 Subject: [PATCH 02/33] PF-1391 - Creating breakout rooms --- examples/breakout-rooms/NOTES.md | 5 +- .../breakout-rooms/src/BreakoutManager.tsx | 318 +++++++++++------- examples/breakout-rooms/src/WaitingRoom.tsx | 24 +- examples/breakout-rooms/src/app.tsx | 8 +- examples/breakout-rooms/src/hooks.tsx | 305 ++++++++++++++--- examples/breakout-rooms/src/styles.css | 56 ++- examples/breakout-rooms/src/types.ts | 18 +- examples/breakout-rooms/src/utils.ts | 6 + 8 files changed, 548 insertions(+), 192 deletions(-) diff --git a/examples/breakout-rooms/NOTES.md b/examples/breakout-rooms/NOTES.md index aeecadec7..3aff257f1 100644 --- a/examples/breakout-rooms/NOTES.md +++ b/examples/breakout-rooms/NOTES.md @@ -1,3 +1,4 @@ -- We don't have capabilitu to enter select mode with the WebSDK. +- We don't have capability to enter select mode with the WebSDK. - We don't return user avatars from the WebSDK. -- We need to release a new types package +- We need to release a new types package. +- We are missing state in the session (if it's already finished) diff --git a/examples/breakout-rooms/src/BreakoutManager.tsx b/examples/breakout-rooms/src/BreakoutManager.tsx index 6da7de257..db0432a3b 100644 --- a/examples/breakout-rooms/src/BreakoutManager.tsx +++ b/examples/breakout-rooms/src/BreakoutManager.tsx @@ -3,21 +3,21 @@ import * as React from "react"; import { DropdownMenu, IconUser } from "@mirohq/design-system"; -import { Room } from "./types"; +import { Participant, Room } from "./types"; import { Frame, + Json, OnlineUserInfo, SelectionUpdateEvent, } from "@mirohq/websdk-types"; import { useBreakout, useOnlineUsers } from "./hooks"; +import { isUser } from "./utils"; export const BreakoutManager: React.FC = () => { - const { session, rooms, ...service } = useBreakout(); + const { breakout, rooms, ...service } = useBreakout(); const onlineUsers = useOnlineUsers(); const [selectedRoom, setSelectedRoom] = React.useState(); - const getSelectedRoom = () => selectedRoom; - const unassignedUsers = React.useMemo(() => { return onlineUsers.filter((user) => rooms.every((room) => @@ -27,7 +27,29 @@ export const BreakoutManager: React.FC = () => { }, [onlineUsers, rooms]); React.useEffect(() => { - const boostrap = () => { + const handleSelectionUpdate = async (event: SelectionUpdateEvent) => { + console.log("handleSelectionUpdate", { event, selectedRoom }); + if (!event.items.length || !selectedRoom) { + return; + } + + const frame = event.items.find((item) => item.type === "frame") as Frame; + + if (frame) { + await service.setRoomTarget(selectedRoom, frame.id); + await miro.board.notifications.showInfo( + `Frame "${frame.title}" has been selected as starting point.`, + ); + await miro.board.deselect({ id: frame.id }); + setSelectedRoom(undefined); + } else { + await miro.board.notifications.showError( + "We only support frames as starting point for now", + ); + } + }; + + const subscribe = () => { miro.board.ui.on("selection:update", handleSelectionUpdate); return () => { @@ -35,37 +57,35 @@ export const BreakoutManager: React.FC = () => { }; }; + return subscribe(); + }, [selectedRoom]); + + React.useEffect(() => { + const boostrap = () => { + const handleNudge = async (currentUser?: Json) => { + if (isUser(currentUser)) { + await miro.board.notifications.showInfo( + `The user "${currentUser?.name}" is waiting for the breakout to start.`, + ); + } + }; + + miro.board.experimental.events.on("nudge-facilitator", handleNudge); + + return () => { + miro.board.experimental.events.off("nudge-facilitator", handleNudge); + }; + }; + return boostrap(); }, []); - const handleSelectionUpdate = async (event: SelectionUpdateEvent) => { - const selectedRoom = getSelectedRoom(); - console.log({ event, selectedRoom }); - if (!event.items.length || !selectedRoom) { - return; - } - - const frame = event.items.find((item) => item.type === "frame") as Frame; - - if (frame) { - await service.setRoomTarget(selectedRoom, frame.id); - await miro.board.notifications.showInfo( - `Frame "${frame.title}" has been selected as starting point.`, - ); - await miro.board.deselect({ id: frame.id }); - setSelectedRoom(undefined); - } else { - await miro.board.notifications.showError( - "We only support frames as starting point for now", - ); - } - }; - const handleAddGroup = async () => { await service.addRoom(); }; - const handleSelectTarget = async (selected: Room) => { + const handleStartSelectTarget = async (selected: Room) => { + await miro.board.deselect(); setSelectedRoom(selected); await miro.board.notifications.showInfo( @@ -82,7 +102,7 @@ export const BreakoutManager: React.FC = () => { const handleRemoveParticipant = async ( selected: Room, - participant: OnlineUserInfo, + participant: Participant, ) => { await service.removeParticipant(selected, participant); }; @@ -91,105 +111,141 @@ export const BreakoutManager: React.FC = () => { await service.removeRoom(selected); }; - console.log({ selectedRoom }); + const handleStartSession = async () => { + await service.startSession(); + }; + + const handleStopSession = async () => { + await service.endSession(); + }; + + const validations: string[] = []; + if (!breakout?.rooms.length) { + validations.push("Add rooms to your breakout"); + } + + const allRoomsWithParticipants = breakout?.rooms.every( + (room) => room.participants.length > 0, + ); + + if (!allRoomsWithParticipants) { + validations.push("Add participants to all of your rooms"); + } + + const allRoomsWithTargets = breakout?.rooms.every((room) => + Boolean(room.targetId), + ); + + if (!allRoomsWithTargets) { + validations.push("Set a starting point to all of your rooms"); + } + + const canStartSession = validations.length < 1; return (
+
{JSON.stringify(breakout, null, 2)}
-
- {rooms.map((room) => ( -
-

{room.name}

- - - - - - - - {room.participants.length ? ( - - {room.participants.map((user) => ( - handleRemoveParticipant(room, user)} - > - - - - {user.name} - - Assigned - - - ))} - - - ) : null} - {unassignedUsers.length ? ( - -
- {unassignedUsers.map((user) => ( +
+
+ {rooms.length < 1 ?

Please create rooms

: null} + + {rooms.map((room) => ( +
+

{room.name}

+ + + + + + + + {room.participants.length ? ( + + {room.participants.map((user) => ( handleAddParticipant(room, user)} + disabled={breakout?.state === "started"} + onSelect={() => handleRemoveParticipant(room, user)} > {user.name} + + {user.state} + ))} -
- - ) : ( -

No unassigned users left

- )} - - - - -
- ))} -
- - + + + ) : null} + {unassignedUsers.length ? ( + +
+ {unassignedUsers.map((user) => ( + handleAddParticipant(room, user)} + > + + + + {user.name} + + ))} +
+
+ ) : ( +

No unassigned users left

+ )} + + -
+ + + ))} + + + + {unassignedUsers.length ? (
@@ -202,13 +258,39 @@ export const BreakoutManager: React.FC = () => {
) : null} - + {validations.length > 0 ? ( +
+

Before starting the session:

+
    + {validations.map((message) => ( +
  • {message}
  • + ))} +
+
+ ) : null} + +
+ +
+ {breakout?.state === "started" ? ( + + ) : ( + + )} +
); }; diff --git a/examples/breakout-rooms/src/WaitingRoom.tsx b/examples/breakout-rooms/src/WaitingRoom.tsx index d3d5e19e6..959a50435 100644 --- a/examples/breakout-rooms/src/WaitingRoom.tsx +++ b/examples/breakout-rooms/src/WaitingRoom.tsx @@ -1,7 +1,29 @@ "use client"; import * as React from "react"; +import { useCurrentUser } from "./hooks"; export const WaitingRoom: React.FC = () => { - return

The facilitator is preparing the breakout rooms

; + const currentUser = useCurrentUser(); + + const handleNudge = () => { + if (!currentUser) { + return; + } + + miro.board.experimental.events.broadcast("nudge-facilitator", currentUser); + }; + return ( +

+ The facilitator is preparing the breakout rooms.{" "} + handleNudge()} + > + Nudge them + + . +

+ ); }; diff --git a/examples/breakout-rooms/src/app.tsx b/examples/breakout-rooms/src/app.tsx index 3c788a48c..acedc3614 100644 --- a/examples/breakout-rooms/src/app.tsx +++ b/examples/breakout-rooms/src/app.tsx @@ -7,13 +7,9 @@ import { WaitingRoom } from "./WaitingRoom"; import { createRoot } from "react-dom/client"; const App: React.FC = () => { - const { isFacilitator, session, state } = useBreakout(); + const { isFacilitator, breakout } = useBreakout(); - if (state === "loading") { - return

Spinneer

; - } - - return isFacilitator || !session ? : ; + return isFacilitator || !breakout ? : ; }; const container = document.getElementById("root")!; diff --git a/examples/breakout-rooms/src/hooks.tsx b/examples/breakout-rooms/src/hooks.tsx index c56be6cc5..319285650 100644 --- a/examples/breakout-rooms/src/hooks.tsx +++ b/examples/breakout-rooms/src/hooks.tsx @@ -1,7 +1,7 @@ import { OnlineUserInfo, UserInfo } from "@mirohq/websdk-types"; import * as React from "react"; import { generateUniqueId } from "./utils"; -import { BreakoutState, Room, Session } from "./types"; +import { Participant, Room, Breakout } from "./types"; const COLLECTION_NAME = "breakout-rooms"; @@ -41,71 +41,85 @@ export const useOnlineUsers = () => { return onlineUsers; }; +const log = (id: string, ...args: unknown[]) => + console.log(id, JSON.stringify(args, null, 2)); + export const useBreakout = () => { - const [session, setSession] = React.useState(); - const [state, setState] = React.useState("idle"); + const [breakout, setBreakout] = React.useState(); const currentUser = useCurrentUser(); React.useEffect(() => { - if (session || !currentUser) { + if (breakout || !currentUser) { return; } const init = () => { - setState("loading"); const breakoutRooms = miro.board.storage.collection(COLLECTION_NAME); - breakoutRooms.get("active").then((activeSession: Session) => { - setState("idle"); - setSession(activeSession); - }); - - const activeValue = (activeSession: Session) => { - console.log("onValue", { activeSession }); - setSession(activeSession); + const activeValue = (activeBreakout: Breakout) => { + log("onValue", { activeBreakout }); + if (activeBreakout.id) { + setBreakout(activeBreakout); + } }; - breakoutRooms.onValue("active", activeValue); + + breakoutRooms.get("active").then(activeValue); + breakoutRooms.onValue("active", activeValue); return () => { - breakoutRooms.offValue("active", activeValue); + breakoutRooms.offValue("active", activeValue); }; }; return init(); - }, [session, currentUser]); + }, [breakout, currentUser]); - const saveSession = async (opts: Pick) => { + const saveBreakout = async ( + breakout?: Breakout, + opts: Partial> = {}, + ) => { if (!currentUser) { throw new Error("Could not fetch current Miro user"); } const breakoutRooms = await miro.board.storage.collection(COLLECTION_NAME); - if (session) { - const payload = { - ...session, - rooms: opts.rooms, - }; - breakoutRooms.set("active", payload); + log("saveBreakout", { breakout, opts }); - console.log("saveSession.update", { payload, opts }); + if (breakout?.id) { + Object.assign(breakout, { + sessionId: opts.sessionId ?? breakout.sessionId ?? "", + state: opts.state ?? breakout.state ?? "idle", + rooms: opts.rooms ?? breakout.rooms ?? [], + }); + breakoutRooms.set("active", breakout); + log("saveBreakout.update", { breakout, opts }); + + return breakout; } else { - const newSession: Session = { + const newBreakout = { id: generateUniqueId(), creator: currentUser, - rooms: opts.rooms, + rooms: opts.rooms ?? [], + state: opts.state ?? "idle", }; - breakoutRooms.set("active", newSession); - console.log("saveSession.new", { newSession, opts }); + log("saveBreakout.new", { newBreakout, opts }); + breakoutRooms.set("active", newBreakout); + + return newBreakout; } }; - const addParticipant = async (room: Room, participant: OnlineUserInfo) => { - const sessionRooms = session?.rooms ?? []; + const addParticipant = async (room: Room, user: OnlineUserInfo) => { + const sessionRooms = breakout?.rooms ?? []; const rooms = sessionRooms.map((r) => { if (r.id === room.id) { + const participant = { + ...user, + state: "Waiting room", + }; const participants = [...r.participants, participant].sort((a, b) => a.name.localeCompare(b.name), ); @@ -118,13 +132,13 @@ export const useBreakout = () => { return r; }); - console.log("addParticipant", { rooms, room, participant }); + log("addParticipant", { rooms, room, user }); - await saveSession({ rooms }); + await saveBreakout(breakout, { rooms }); }; - const removeParticipant = async (room: Room, participant: OnlineUserInfo) => { - const sessionRooms = session?.rooms ?? []; + const removeParticipant = async (room: Room, participant: Participant) => { + const sessionRooms = breakout?.rooms ?? []; const rooms = sessionRooms.map((r) => { if (r.id === room.id) { @@ -137,22 +151,22 @@ export const useBreakout = () => { return r; }); - console.log("removeParticipant", { rooms, room, participant }); + log("removeParticipant", { rooms, room, participant }); - await saveSession({ rooms }); + await saveBreakout(breakout, { rooms }); }; const removeRoom = async (room: Room) => { - const sessionRooms = session?.rooms ?? []; + const sessionRooms = breakout?.rooms ?? []; const rooms = sessionRooms.filter((r) => r.id !== room.id); - console.log("removeRoom", { rooms, room }); - await saveSession({ rooms }); + log("removeRoom", { rooms, room }); + await saveBreakout(breakout, { rooms }); }; const addRoom = async (opts?: Partial) => { - const sessionRooms = session?.rooms ?? []; + const sessionRooms = breakout?.rooms ?? []; const room: Room = { id: generateUniqueId(), @@ -161,38 +175,227 @@ export const useBreakout = () => { ...opts, }; - console.log("addRoom", { room }); + log("addRoom", { room }); - await saveSession({ rooms: [...sessionRooms, room] }); + await saveBreakout(breakout, { rooms: [...sessionRooms, room] }); }; const setRoomTarget = async (room: Room, targetId: string) => { - const sessionRooms = session?.rooms ?? []; + const sessionRooms = breakout?.rooms ?? []; const rooms = sessionRooms.map((r) => ({ ...r, - targetId: r.id === room.id ? targetId : r.targetId, + targetId: r.id === room.id ? targetId : r.targetId ?? "", })); - console.log("setRoomTarget", { room, rooms, targetId }); + log("setRoomTarget", { room, rooms, targetId }); + + await saveBreakout(breakout, { rooms }); + }; + + const updateParticipant = async ( + room: Room, + participant: Participant, + data: Partial, + ) => { + const sessionRooms = breakout?.rooms ?? []; + + const rooms = sessionRooms.map((r) => { + if (r.id === room.id) { + return { + ...r, + participants: r.participants.map((p) => { + if (p.id === participant.id) { + return { + ...p, + ...data, + }; + } + + return p; + }), + }; + } + + return r; + }); + + log("updateParticipant", { rooms, room, participant, data }); + + await saveBreakout(breakout, { rooms }); + }; + + const handleUserJoined = async ({ userId }: { userId: string }) => { + log("handleUserJoined", { userId, breakout }); + if (!breakout) { + return; + } + + let participant: Participant | undefined; + let room: Room | undefined; + + breakout.rooms.some((r) => + r.participants.some((p) => { + if (p.id === userId) { + participant = p; + room = r; + return true; + } + + return false; + }), + ); + + log("handleUserJoined.participant", { room, participant }); + + if (!room || !participant) { + await miro.board.notifications.showError( + `User ${userId} has joined a session but no room was assigned`, + ); + return; + } + + if (!room.targetId) { + await miro.board.notifications.showError( + `Room ${room.name} has no target assigned`, + ); + return; + } + + await updateParticipant(room, participant, { state: "In Session" }); + + const frame = await miro.board.get({ type: "frame", id: room.targetId }); + if (!frame) { + await miro.board.notifications.showError( + `Could not find target with ID: "${room.targetId}"`, + ); + return; + } + + if (participant.id === currentUser?.id) { + await miro.board.viewport.zoomTo(frame); + } else { + await miro.board.collaboration.zoomTo(participant, frame); + } + }; + + const handleUserLeft = async ({ userId }: { userId: string }) => { + log("handleUserLeft", { userId, breakout }); + if (!breakout) { + return; + } + + let participant: Participant | undefined; + let room: Room | undefined; + + breakout.rooms.some((r) => + r.participants.some((p) => { + if (p.id === userId) { + participant = p; + room = r; + return true; + } + + return false; + }), + ); + + log("handleUserLeft.participant", { room, participant }); + + if (!room || !participant) { + return; + } + + await updateParticipant(room, participant, { state: "Waiting room" }); + }; + + const upsertSession = async (breakout: Breakout) => { + let session: Session; + if (breakout.sessionId) { + const sessions = await miro.board.collaboration.getSessions(); + session = sessions.find((s) => s.id === breakout.sessionId); + } + + if (!session) { + session = await miro.board.collaboration.startSession({ + name: `Breakout room - ${breakout.id} - ${breakout.creator.id}`, + }); + + await saveBreakout(breakout, { + sessionId: session.id, + }); + } + + log("upsertSession", { session, breakout }); + + return session; + }; + + const startSession = async () => { + if (!breakout) { + throw new Error("Invalid breakout session"); + } + + log("startSession", breakout); + await saveBreakout(breakout, { state: "started" }); + + const session = await upsertSession(breakout); + + const allParticipants = breakout.rooms + .map((room) => room.participants) + .flat(); + + await session.invite(allParticipants); + + await Promise.all( + breakout.rooms.map((room) => + room.participants.map((participant) => + updateParticipant(room, participant, { state: "Invitation Pending" }), + ), + ), + ); + + session.on("user-joined", handleUserJoined); + session.on("user-left", handleUserLeft); + }; + + const endSession = async () => { + if (!breakout) { + throw new Error("Invalid breakout session"); + } + + const session = await upsertSession(breakout); + if (!session) { + throw new Error(`Breakout ${breakout} doesn't have a Miro session`); + } + + await session.end(); + await saveBreakout(breakout, { state: "ended" }); - await saveSession({ rooms }); + await Promise.all( + breakout.rooms.map((room) => + room.participants.map((participant) => + updateParticipant(room, participant, { state: "Waiting room" }), + ), + ), + ); }; const isFacilitator = - Boolean(session) && session?.creator.id === currentUser?.id; - const rooms = session?.rooms ?? []; + Boolean(breakout) && breakout?.creator.id === currentUser?.id; + const rooms = breakout?.rooms ?? []; return { - session, - state, + breakout, isFacilitator, rooms, - saveSession, + saveBreakout, addRoom, addParticipant, removeParticipant, removeRoom, setRoomTarget, + startSession, + endSession, }; }; diff --git a/examples/breakout-rooms/src/styles.css b/examples/breakout-rooms/src/styles.css index 7969ea9bb..4f984f7af 100644 --- a/examples/breakout-rooms/src/styles.css +++ b/examples/breakout-rooms/src/styles.css @@ -6,10 +6,6 @@ box-sizing: border-box; } -/* body { - display: flex; -} - #root { overflow: auto; padding: var(--space-medium); @@ -20,17 +16,57 @@ img { height: auto; } -main { +.button-selected { + background-color: var(--blue100); +} + +.button-active { + background-color: var(--blue300); +} + +.toolbar { display: flex; flex-direction: column; justify-content: center; +} + +.toolbar .button { + justify-content: center; +} + +.container { + display: flex; + flex-direction: column; + gap: 1em; align-items: center; -} */ +} -.button-selected { - background-color: var(--blue100); +.rooms-container { + display: flex; + flex-direction: column; + max-height: 25em; + min-height: 10em; + gap: 1em; + overflow: auto; + width: 100%; } -.button-active { - background-color: var(--blue300); +.room-container { + display: flex; + align-items: center; + justify-content: space-between; + justify-items: center; + gap: 0.5em; + width: 100%; +} + +.room-container :is(h3, button) { + margin: 0 !important; +} + +.room-container h3 { + flex-basis: 9em; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } diff --git a/examples/breakout-rooms/src/types.ts b/examples/breakout-rooms/src/types.ts index 9be129a41..9fa6cf02b 100644 --- a/examples/breakout-rooms/src/types.ts +++ b/examples/breakout-rooms/src/types.ts @@ -1,18 +1,28 @@ import { OnlineUserInfo, UserInfo } from "@mirohq/websdk-types"; +export type BreakoutState = "idle" | "started" | "ended"; + +export type ParticipantState = + | "Waiting room" + | "In Session" + | "Invitation Pending"; + +export type Participant = OnlineUserInfo & { + state: ParticipantState; +}; + export type Room = { id: string; name: string; targetId?: string; - participants: OnlineUserInfo[]; + participants: Participant[]; selected?: boolean; }; -export type Session = { +export type Breakout = { id: string; creator: UserInfo; sessionId?: string; rooms: Room[]; + state: BreakoutState; }; - -export type BreakoutState = "idle" | "loading" | "started" | "ended"; diff --git a/examples/breakout-rooms/src/utils.ts b/examples/breakout-rooms/src/utils.ts index ed5cb3269..b6605fb22 100644 --- a/examples/breakout-rooms/src/utils.ts +++ b/examples/breakout-rooms/src/utils.ts @@ -1,5 +1,11 @@ +import { OnlineUserInfo } from "@mirohq/websdk-types"; + export function generateUniqueId(): string { const timestamp = new Date().getTime(); const random = Math.floor(Math.random() * 1000); return `${timestamp}${random}`; } + +export const isUser = (data: unknown): data is OnlineUserInfo => + // @ts-expect-error check whether it's a user + data.id && data.name; From 4218f517e49bb7cc1e170c8c926c9b07f13b4264 Mon Sep 17 00:00:00 2001 From: Frederico Estrela Gaiva Date: Thu, 16 Nov 2023 09:44:31 +0100 Subject: [PATCH 03/33] PF-1391 - Initiate timer feature in breakout room --- examples/breakout-rooms/NOTES.md | 4 + examples/breakout-rooms/package.json | 1 + examples/breakout-rooms/src/app.tsx | 4 +- .../src/{ => components}/BreakoutManager.tsx | 154 ++++++------------ .../src/components/RoomConfig.tsx | 113 +++++++++++++ .../breakout-rooms/src/components/Timer.tsx | 94 +++++++++++ .../src/{ => components}/WaitingRoom.tsx | 2 +- examples/breakout-rooms/src/hooks.tsx | 32 +++- examples/breakout-rooms/src/styles.css | 33 +++- yarn.lock | 5 + 10 files changed, 322 insertions(+), 120 deletions(-) rename examples/breakout-rooms/src/{ => components}/BreakoutManager.tsx (54%) create mode 100644 examples/breakout-rooms/src/components/RoomConfig.tsx create mode 100644 examples/breakout-rooms/src/components/Timer.tsx rename examples/breakout-rooms/src/{ => components}/WaitingRoom.tsx (92%) diff --git a/examples/breakout-rooms/NOTES.md b/examples/breakout-rooms/NOTES.md index 3aff257f1..9af109d8b 100644 --- a/examples/breakout-rooms/NOTES.md +++ b/examples/breakout-rooms/NOTES.md @@ -2,3 +2,7 @@ - We don't return user avatars from the WebSDK. - We need to release a new types package. - We are missing state in the session (if it's already finished) +- Constantly getting the following error when working with collections but I have no idea of what it is: "Error: 1# Invalid input - Path: value at responseHandler" +- When calling session.end() the inviations and current sessions modals are not dismissed +- Collection.remove does not trigger onValue +- We don't show the name of the app in the session modals diff --git a/examples/breakout-rooms/package.json b/examples/breakout-rooms/package.json index 48370c83e..51865f4e3 100644 --- a/examples/breakout-rooms/package.json +++ b/examples/breakout-rooms/package.json @@ -21,6 +21,7 @@ "dependencies": { "@mirohq/design-system": "^0.17.19", "@stitches/react": "^1.2.8", + "classnames": "^2.3.2", "mirotone": "5", "react": "^18.2.0", "react-dom": "^18.2.0" diff --git a/examples/breakout-rooms/src/app.tsx b/examples/breakout-rooms/src/app.tsx index acedc3614..089298a43 100644 --- a/examples/breakout-rooms/src/app.tsx +++ b/examples/breakout-rooms/src/app.tsx @@ -2,8 +2,8 @@ import * as React from "react"; import { useBreakout } from "./hooks"; -import { BreakoutManager } from "./BreakoutManager"; -import { WaitingRoom } from "./WaitingRoom"; +import { BreakoutManager } from "./components/BreakoutManager"; +import { WaitingRoom } from "./components/WaitingRoom"; import { createRoot } from "react-dom/client"; const App: React.FC = () => { diff --git a/examples/breakout-rooms/src/BreakoutManager.tsx b/examples/breakout-rooms/src/components/BreakoutManager.tsx similarity index 54% rename from examples/breakout-rooms/src/BreakoutManager.tsx rename to examples/breakout-rooms/src/components/BreakoutManager.tsx index db0432a3b..3b5ff6d22 100644 --- a/examples/breakout-rooms/src/BreakoutManager.tsx +++ b/examples/breakout-rooms/src/components/BreakoutManager.tsx @@ -1,22 +1,30 @@ "use client"; import * as React from "react"; -import { DropdownMenu, IconUser } from "@mirohq/design-system"; -import { Participant, Room } from "./types"; +import { Participant, Room } from "../types"; import { Frame, Json, OnlineUserInfo, SelectionUpdateEvent, } from "@mirohq/websdk-types"; -import { useBreakout, useOnlineUsers } from "./hooks"; -import { isUser } from "./utils"; +import { useBreakout, useOnlineUsers } from "../hooks"; +import { isUser } from "../utils"; +import { RoomConfig } from "./RoomConfig"; +import { Timer } from "./Timer"; export const BreakoutManager: React.FC = () => { - const { breakout, rooms, ...service } = useBreakout(); + const { breakout, rooms, isFacilitator, ...service } = useBreakout(); const onlineUsers = useOnlineUsers(); const [selectedRoom, setSelectedRoom] = React.useState(); + const [time, setTime] = React.useState(); + + const participantIds = rooms + .map((room) => room.participants.map((p) => p.id)) + .flat() + .sort() + .join("-"); const unassignedUsers = React.useMemo(() => { return onlineUsers.filter((user) => @@ -24,7 +32,7 @@ export const BreakoutManager: React.FC = () => { room.participants.every((participant) => participant.id !== user.id), ), ); - }, [onlineUsers, rooms]); + }, [onlineUsers, participantIds]); React.useEffect(() => { const handleSelectionUpdate = async (event: SelectionUpdateEvent) => { @@ -115,6 +123,10 @@ export const BreakoutManager: React.FC = () => { await service.startSession(); }; + const handleReleaseFacilitator = async () => { + await service.releaseSession(); + }; + const handleStopSession = async () => { await service.endSession(); }; @@ -141,99 +153,28 @@ export const BreakoutManager: React.FC = () => { } const canStartSession = validations.length < 1; + const isEditabled = breakout?.state !== "started"; return (
-
{JSON.stringify(breakout, null, 2)}
- +
{rooms.length < 1 ?

Please create rooms

: null} {rooms.map((room) => ( -
-

{room.name}

- - - - - - - - {room.participants.length ? ( - - {room.participants.map((user) => ( - handleRemoveParticipant(room, user)} - > - - - - {user.name} - - {user.state} - - - ))} - - - ) : null} - {unassignedUsers.length ? ( - -
- {unassignedUsers.map((user) => ( - handleAddParticipant(room, user)} - > - - - - {user.name} - - ))} -
-
- ) : ( -

No unassigned users left

- )} -
-
- - -
+ ))}
@@ -249,7 +190,7 @@ export const BreakoutManager: React.FC = () => { {unassignedUsers.length ? (
-

Unassigned users

+
Unassigned users
    {unassignedUsers.map((user) => (
  • {user.name}
  • @@ -258,9 +199,9 @@ export const BreakoutManager: React.FC = () => {
) : null} - {validations.length > 0 ? ( + {isEditabled && validations.length > 0 ? (
-

Before starting the session:

+
Before starting the session:
    {validations.map((message) => (
  • {message}
  • @@ -281,14 +222,25 @@ export const BreakoutManager: React.FC = () => { Stop session ) : ( - + + + {isFacilitator && ( + + )} + )}
diff --git a/examples/breakout-rooms/src/components/RoomConfig.tsx b/examples/breakout-rooms/src/components/RoomConfig.tsx new file mode 100644 index 000000000..023420dfa --- /dev/null +++ b/examples/breakout-rooms/src/components/RoomConfig.tsx @@ -0,0 +1,113 @@ +"use client"; + +import * as React from "react"; +import classnames from "classnames"; +import { DropdownMenu, IconUser } from "@mirohq/design-system"; + +import type { Participant, Room } from "../types"; +import { OnlineUserInfo } from "@mirohq/websdk-types"; + +export type Props = { + room: Room; + isEditable: boolean; + isSelected: boolean; + unassignedUsers: OnlineUserInfo[]; + onSelect: (room: Room) => void; + onRemove: (room: Room) => void; + onAddParticipant: (room: Room, user: OnlineUserInfo) => void; + onRemoveParticipant: (room: Room, participant: Participant) => void; +}; + +export const RoomConfig: React.FunctionComponent = ({ + room, + isEditable, + isSelected, + unassignedUsers, + onSelect, + onRemove, + onAddParticipant, + onRemoveParticipant, +}) => { + return ( +
+

{room.name}

+ + + + + + + + {room.participants.length ? ( + + {room.participants.map((user) => ( + onRemoveParticipant(room, user)} + > + + + + {user.name} + + {user.state} + + + ))} + + + ) : null} + {isEditable && unassignedUsers.length ? ( + +
+ {unassignedUsers.map((user) => ( + onAddParticipant(room, user)} + > + + + + {user.name} + + ))} +
+
+ ) : ( +

No unassigned users left

+ )} +
+
+ + +
+ ); +}; diff --git a/examples/breakout-rooms/src/components/Timer.tsx b/examples/breakout-rooms/src/components/Timer.tsx new file mode 100644 index 000000000..d92203198 --- /dev/null +++ b/examples/breakout-rooms/src/components/Timer.tsx @@ -0,0 +1,94 @@ +"use client"; + +import * as React from "react"; +import { + Button, + DropdownMenu, + IconMinus, + IconPlus, + IconTimer, +} from "@mirohq/design-system"; + +// in seconds +const DEFAULT_TIME = 5 * 60; + +type Props = { + defaultTime?: number; + maxTime?: number; + onSet: (time: number) => void; +}; + +export const Timer: React.FunctionComponent = ({ + defaultTime = DEFAULT_TIME, + maxTime = Infinity, + onSet, +}) => { + const [time, setTime] = React.useState(defaultTime); + const [timeChanged, setTimeChanged] = React.useState(false); + + const minutes = Math.floor(time / 60); + const seconds = Math.floor(time % 60); + + const handleAdd = () => { + setTime((time) => (time <= maxTime ? time + 15 : time)); + }; + + const handleDecrease = () => { + setTime((time) => (time > 0 ? time - 15 : time)); + }; + + const handleSetTime = () => { + onSet(time); + setTimeChanged(true); + }; + + return ( + <> + + + + + +
+
+ +
+ {minutes.toString().padStart(2, "0")}: + {seconds.toString().padStart(2, "0")} +
+ + +
+ +
+
+
+ + ); +}; diff --git a/examples/breakout-rooms/src/WaitingRoom.tsx b/examples/breakout-rooms/src/components/WaitingRoom.tsx similarity index 92% rename from examples/breakout-rooms/src/WaitingRoom.tsx rename to examples/breakout-rooms/src/components/WaitingRoom.tsx index 959a50435..b2fa4e141 100644 --- a/examples/breakout-rooms/src/WaitingRoom.tsx +++ b/examples/breakout-rooms/src/components/WaitingRoom.tsx @@ -1,7 +1,7 @@ "use client"; import * as React from "react"; -import { useCurrentUser } from "./hooks"; +import { useCurrentUser } from "../hooks"; export const WaitingRoom: React.FC = () => { const currentUser = useCurrentUser(); diff --git a/examples/breakout-rooms/src/hooks.tsx b/examples/breakout-rooms/src/hooks.tsx index 319285650..2a6f487ab 100644 --- a/examples/breakout-rooms/src/hooks.tsx +++ b/examples/breakout-rooms/src/hooks.tsx @@ -49,7 +49,7 @@ export const useBreakout = () => { const currentUser = useCurrentUser(); React.useEffect(() => { - if (breakout || !currentUser) { + if (!currentUser) { return; } @@ -58,11 +58,10 @@ export const useBreakout = () => { const activeValue = (activeBreakout: Breakout) => { log("onValue", { activeBreakout }); - if (activeBreakout.id) { - setBreakout(activeBreakout); - } + setBreakout(activeBreakout?.id ? activeBreakout : undefined); }; + log("subscribing to onValue", { breakoutRooms }); breakoutRooms.get("active").then(activeValue); breakoutRooms.onValue("active", activeValue); @@ -72,7 +71,7 @@ export const useBreakout = () => { }; return init(); - }, [breakout, currentUser]); + }, [breakout?.id, currentUser?.id]); const saveBreakout = async ( breakout?: Breakout, @@ -306,7 +305,7 @@ export const useBreakout = () => { return; } - await updateParticipant(room, participant, { state: "Waiting room" }); + await removeParticipant(room, participant); }; const upsertSession = async (breakout: Breakout) => { @@ -318,7 +317,7 @@ export const useBreakout = () => { if (!session) { session = await miro.board.collaboration.startSession({ - name: `Breakout room - ${breakout.id} - ${breakout.creator.id}`, + name: `Breakout room - by ${breakout.creator.name}`, }); await saveBreakout(breakout, { @@ -379,8 +378,26 @@ export const useBreakout = () => { ), ), ); + + await releaseSession(); }; + const releaseSession = async () => { + const breakoutRooms = await miro.board.storage.collection(COLLECTION_NAME); + const pastBreakoutRooms = (await breakoutRooms.get("past")) ?? []; + const historyEntries = [...pastBreakoutRooms, breakout]; + + log("releaseSession", { breakoutRooms, pastBreakoutRooms, breakout }); + + breakoutRooms.set("past", historyEntries); + // Collection.remove does not trigger onValue + // breakoutRooms.set("active", {}); + breakoutRooms.remove("active"); + setBreakout(undefined); + }; + + log("Data", { breakout }); + const isFacilitator = Boolean(breakout) && breakout?.creator.id === currentUser?.id; const rooms = breakout?.rooms ?? []; @@ -397,5 +414,6 @@ export const useBreakout = () => { setRoomTarget, startSession, endSession, + releaseSession, }; }; diff --git a/examples/breakout-rooms/src/styles.css b/examples/breakout-rooms/src/styles.css index 4f984f7af..53b7cf613 100644 --- a/examples/breakout-rooms/src/styles.css +++ b/examples/breakout-rooms/src/styles.css @@ -16,22 +16,16 @@ img { height: auto; } -.button-selected { - background-color: var(--blue100); -} - -.button-active { - background-color: var(--blue300); -} - .toolbar { display: flex; flex-direction: column; justify-content: center; + gap: 1em; } .toolbar .button { justify-content: center; + margin: 0; } .container { @@ -46,7 +40,7 @@ img { flex-direction: column; max-height: 25em; min-height: 10em; - gap: 1em; + gap: 0.5em; overflow: auto; width: 100%; } @@ -57,6 +51,7 @@ img { justify-content: space-between; justify-items: center; gap: 0.5em; + padding: 0.5em; width: 100%; } @@ -70,3 +65,23 @@ img { overflow: hidden; text-overflow: ellipsis; } + +.button-selected { + background-color: var(--blue100); +} + +.button-active { + background-color: var(--blue300); +} + +.timer-display { + display: flex; + gap: 0.5em; +} + +.timer-control { + display: flex; + gap: 0.5em; + padding-right: 0.5em; + border-right: 2px solid var(--indigo400); +} diff --git a/yarn.lock b/yarn.lock index 957ca7259..77cd593ca 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3579,6 +3579,11 @@ chokidar@^3.5.2: optionalDependencies: fsevents "~2.3.2" +classnames@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" + integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== + clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" From 0eac2b65a49d43a02496aba7063560101011f956 Mon Sep 17 00:00:00 2001 From: Frederico Estrela Gaiva Date: Thu, 16 Nov 2023 10:52:38 +0100 Subject: [PATCH 04/33] PF-1391 - Timer UI --- .../breakout-rooms/src/components/Timer.tsx | 23 +++++++++++++++---- examples/breakout-rooms/src/styles.css | 13 +++++++++-- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/examples/breakout-rooms/src/components/Timer.tsx b/examples/breakout-rooms/src/components/Timer.tsx index d92203198..b1d2cd4b2 100644 --- a/examples/breakout-rooms/src/components/Timer.tsx +++ b/examples/breakout-rooms/src/components/Timer.tsx @@ -11,16 +11,26 @@ import { // in seconds const DEFAULT_TIME = 5 * 60; +// 1 minute +const DEFAULT_MIN_TIME = 1 * 60; +// 10 minutes +const DEFAULT_MAX_TIME = 10 * 60; +// 15 seconds +const DEFAULT_STEP = 15; type Props = { defaultTime?: number; + minTime?: number; maxTime?: number; + step?: number; onSet: (time: number) => void; }; export const Timer: React.FunctionComponent = ({ defaultTime = DEFAULT_TIME, - maxTime = Infinity, + minTime = DEFAULT_MIN_TIME, + maxTime = DEFAULT_MAX_TIME, + step = DEFAULT_STEP, onSet, }) => { const [time, setTime] = React.useState(defaultTime); @@ -30,11 +40,11 @@ export const Timer: React.FunctionComponent = ({ const seconds = Math.floor(time % 60); const handleAdd = () => { - setTime((time) => (time <= maxTime ? time + 15 : time)); + setTime((time) => (time <= maxTime ? time + step : time)); }; const handleDecrease = () => { - setTime((time) => (time > 0 ? time - 15 : time)); + setTime((time) => (time > minTime ? time - step : time)); }; const handleSetTime = () => { @@ -55,17 +65,19 @@ export const Timer: React.FunctionComponent = ({ -
+
-
+ +
{minutes.toString().padStart(2, "0")}: {seconds.toString().padStart(2, "0")}
@@ -74,6 +86,7 @@ export const Timer: React.FunctionComponent = ({ variant="solid-prominent" size="small" rounded + disabled={time >= maxTime} onClick={() => handleAdd()} > diff --git a/examples/breakout-rooms/src/styles.css b/examples/breakout-rooms/src/styles.css index 53b7cf613..626798453 100644 --- a/examples/breakout-rooms/src/styles.css +++ b/examples/breakout-rooms/src/styles.css @@ -9,6 +9,8 @@ #root { overflow: auto; padding: var(--space-medium); + /** TODO: Had to hardcode this here since it's not coming from DS for some reason **/ + --shadows-50: 0 4px 16px #05003812; } img { @@ -74,14 +76,21 @@ img { background-color: var(--blue300); } -.timer-display { +.timer-container { display: flex; + align-items: center; gap: 0.5em; + min-height: 4em; } .timer-control { display: flex; + align-items: center; gap: 0.5em; padding-right: 0.5em; - border-right: 2px solid var(--indigo400); + border-right: 1px solid var(--indigo400); +} + +.timer-display { + font-size: 2em; } From dfae4d3e06c5536827c61f02277bd149465c635e Mon Sep 17 00:00:00 2001 From: Frederico Estrela Gaiva Date: Thu, 16 Nov 2023 10:55:16 +0100 Subject: [PATCH 05/33] PF-1391 - Adding TODO in styles --- examples/breakout-rooms/src/hooks.tsx | 15 ++++++++------- examples/breakout-rooms/src/styles.css | 6 ++++++ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/examples/breakout-rooms/src/hooks.tsx b/examples/breakout-rooms/src/hooks.tsx index 2a6f487ab..8ed428341 100644 --- a/examples/breakout-rooms/src/hooks.tsx +++ b/examples/breakout-rooms/src/hooks.tsx @@ -4,6 +4,7 @@ import { generateUniqueId } from "./utils"; import { Participant, Room, Breakout } from "./types"; const COLLECTION_NAME = "breakout-rooms"; +const ACTIVE_ITEM = "active"; export const useCurrentUser = () => { const [userInfo, setUserInfo] = React.useState(); @@ -62,11 +63,11 @@ export const useBreakout = () => { }; log("subscribing to onValue", { breakoutRooms }); - breakoutRooms.get("active").then(activeValue); - breakoutRooms.onValue("active", activeValue); + breakoutRooms.get(ACTIVE_ITEM).then(activeValue); + breakoutRooms.onValue(ACTIVE_ITEM, activeValue); return () => { - breakoutRooms.offValue("active", activeValue); + breakoutRooms.offValue(ACTIVE_ITEM, activeValue); }; }; @@ -91,7 +92,7 @@ export const useBreakout = () => { state: opts.state ?? breakout.state ?? "idle", rooms: opts.rooms ?? breakout.rooms ?? [], }); - breakoutRooms.set("active", breakout); + breakoutRooms.set(ACTIVE_ITEM, breakout); log("saveBreakout.update", { breakout, opts }); return breakout; @@ -104,7 +105,7 @@ export const useBreakout = () => { }; log("saveBreakout.new", { newBreakout, opts }); - breakoutRooms.set("active", newBreakout); + breakoutRooms.set(ACTIVE_ITEM, newBreakout); return newBreakout; } @@ -391,8 +392,8 @@ export const useBreakout = () => { breakoutRooms.set("past", historyEntries); // Collection.remove does not trigger onValue - // breakoutRooms.set("active", {}); - breakoutRooms.remove("active"); + // breakoutRooms.set(ACTIVE_ITEM, {}); + breakoutRooms.remove(ACTIVE_ITEM); setBreakout(undefined); }; diff --git a/examples/breakout-rooms/src/styles.css b/examples/breakout-rooms/src/styles.css index 626798453..1580331c1 100644 --- a/examples/breakout-rooms/src/styles.css +++ b/examples/breakout-rooms/src/styles.css @@ -1,5 +1,11 @@ @import "mirotone/dist/styles.css"; +/** + TODO: Make main scrollable and toolbar sitcky to the bottom of the viewport + TODO: Address typography issues + TODO: Do we need alert component to display messages? +**/ + *, *:before, *:after { From c80949c973da0965127cee79138223dd4d95feeb Mon Sep 17 00:00:00 2001 From: Frederico Estrela Gaiva Date: Fri, 17 Nov 2023 08:56:12 +0000 Subject: [PATCH 06/33] PF-1391 - Implementing ticking time --- examples/breakout-rooms/NOTES.md | 14 ++ examples/breakout-rooms/src/app.tsx | 9 +- .../src/components/BreakoutManager.tsx | 92 ++++++--- .../src/components/ErrorBoundary.tsx | 41 ++++ .../breakout-rooms/src/components/Timer.tsx | 54 +++-- examples/breakout-rooms/src/hooks.tsx | 195 +++++++++++++++++- examples/breakout-rooms/src/types.ts | 29 ++- examples/breakout-rooms/src/utils.ts | 61 ++++++ 8 files changed, 440 insertions(+), 55 deletions(-) create mode 100644 examples/breakout-rooms/src/components/ErrorBoundary.tsx diff --git a/examples/breakout-rooms/NOTES.md b/examples/breakout-rooms/NOTES.md index 9af109d8b..59ba0f65b 100644 --- a/examples/breakout-rooms/NOTES.md +++ b/examples/breakout-rooms/NOTES.md @@ -1,3 +1,5 @@ +# Feedback + - We don't have capability to enter select mode with the WebSDK. - We don't return user avatars from the WebSDK. - We need to release a new types package. @@ -6,3 +8,15 @@ - When calling session.end() the inviations and current sessions modals are not dismissed - Collection.remove does not trigger onValue - We don't show the name of the app in the session modals +- Timer docs are still hidden + +- If the timer is already started in Miro, there's no way for the developer to receive its current state (current time, remaining time, etc), the "experimental:timer:update" doesn't get dispatched, we might need a method like `miro.board.experimental.timer.getCurrent()` + +# TODO + +- [ ] Implement timer and control session with it +- [ ] The room starting point selector might need more love. +- [ ] Should a facilitator be able to zoom to starting point or even remove it? +- [ ] Make main scrollable and toolbar sitcky to the bottom of the viewport +- [ ] Address typography/styles issues +- [ ] Do we need alert component to display messages? diff --git a/examples/breakout-rooms/src/app.tsx b/examples/breakout-rooms/src/app.tsx index 089298a43..0cb4b732d 100644 --- a/examples/breakout-rooms/src/app.tsx +++ b/examples/breakout-rooms/src/app.tsx @@ -5,11 +5,18 @@ import { useBreakout } from "./hooks"; import { BreakoutManager } from "./components/BreakoutManager"; import { WaitingRoom } from "./components/WaitingRoom"; import { createRoot } from "react-dom/client"; +import { ErrorBoundary } from "./components/ErrorBoundary"; const App: React.FC = () => { const { isFacilitator, breakout } = useBreakout(); - return isFacilitator || !breakout ? : ; + const areYouReady = isFacilitator || !breakout; + + return ( + + {areYouReady ? : } + + ); }; const container = document.getElementById("root")!; diff --git a/examples/breakout-rooms/src/components/BreakoutManager.tsx b/examples/breakout-rooms/src/components/BreakoutManager.tsx index 3b5ff6d22..45f85f35a 100644 --- a/examples/breakout-rooms/src/components/BreakoutManager.tsx +++ b/examples/breakout-rooms/src/components/BreakoutManager.tsx @@ -3,22 +3,36 @@ import * as React from "react"; import { Participant, Room } from "../types"; +import { Frame, Json, OnlineUserInfo } from "@mirohq/websdk-types"; import { - Frame, - Json, - OnlineUserInfo, - SelectionUpdateEvent, -} from "@mirohq/websdk-types"; -import { useBreakout, useOnlineUsers } from "../hooks"; -import { isUser } from "../utils"; + useBreakout, + useOnlineUsers, + useSelectedItems, + useTimer, +} from "../hooks"; +import { formatDisplayTime, isUser } from "../utils"; import { RoomConfig } from "./RoomConfig"; -import { Timer } from "./Timer"; +import { DEFAULT_TIME, Timer } from "./Timer"; export const BreakoutManager: React.FC = () => { const { breakout, rooms, isFacilitator, ...service } = useBreakout(); const onlineUsers = useOnlineUsers(); + const selectedItems = useSelectedItems({ + predicate: (item) => item.type === "frame", + }); const [selectedRoom, setSelectedRoom] = React.useState(); - const [time, setTime] = React.useState(); + const [duration, setTimerDuration] = React.useState(DEFAULT_TIME); + const [currentTime, setCurrentTime] = React.useState(0); + + const onTimerStop = React.useCallback(() => { + service.endSession(); + }, [breakout?.id]); + + const timer = useTimer({ + duration, + onStop: () => service.endSession(), + onTick: (timestamp) => setCurrentTime(timestamp), + }); const participantIds = rooms .map((room) => room.participants.map((p) => p.id)) @@ -35,13 +49,12 @@ export const BreakoutManager: React.FC = () => { }, [onlineUsers, participantIds]); React.useEffect(() => { - const handleSelectionUpdate = async (event: SelectionUpdateEvent) => { - console.log("handleSelectionUpdate", { event, selectedRoom }); - if (!event.items.length || !selectedRoom) { + const handleSelectionUpdate = async () => { + if (!selectedItems.length || !selectedRoom) { return; } - const frame = event.items.find((item) => item.type === "frame") as Frame; + const [frame] = selectedItems; if (frame) { await service.setRoomTarget(selectedRoom, frame.id); @@ -57,16 +70,8 @@ export const BreakoutManager: React.FC = () => { } }; - const subscribe = () => { - miro.board.ui.on("selection:update", handleSelectionUpdate); - - return () => { - miro.board.ui.off("selection:update", handleSelectionUpdate); - }; - }; - - return subscribe(); - }, [selectedRoom]); + handleSelectionUpdate(); + }, [selectedRoom, selectedItems]); React.useEffect(() => { const boostrap = () => { @@ -121,6 +126,9 @@ export const BreakoutManager: React.FC = () => { const handleStartSession = async () => { await service.startSession(); + if (duration && timer.state !== "started") { + await timer.start(); + } }; const handleReleaseFacilitator = async () => { @@ -129,6 +137,9 @@ export const BreakoutManager: React.FC = () => { const handleStopSession = async () => { await service.endSession(); + if (timer.state === "started") { + await timer.stop(); + } }; const validations: string[] = []; @@ -157,7 +168,38 @@ export const BreakoutManager: React.FC = () => { return (
- + + + {duration ?
Duration: {formatDisplayTime(duration)}
: null} + {currentTime ?
Timer: {formatDisplayTime(currentTime)}
: null} + +
+ +
+
+ +
+
+ +
@@ -219,7 +261,7 @@ export const BreakoutManager: React.FC = () => { type="button" onClick={() => handleStopSession()} > - Stop session + Stop session ({formatDisplayTime(currentTime)}) ) : ( diff --git a/examples/breakout-rooms/src/components/ErrorBoundary.tsx b/examples/breakout-rooms/src/components/ErrorBoundary.tsx new file mode 100644 index 000000000..a8f518b04 --- /dev/null +++ b/examples/breakout-rooms/src/components/ErrorBoundary.tsx @@ -0,0 +1,41 @@ +"use client"; + +import React, { Component, ErrorInfo, ReactNode } from "react"; + +interface Props { + children?: ReactNode; +} + +interface State { + hasError: boolean; + error?: Error; + errorInfo?: ErrorInfo; +} + +export class ErrorBoundary extends Component { + public state: State = { + hasError: false, + }; + + public static getDerivedStateFromError(_: Error): State { + return { hasError: true }; + } + + public componentDidCatch(error: Error, errorInfo: ErrorInfo) { + console.error("Uncaught error:", error, errorInfo); + } + + public render() { + if (!this.state.error) { + return this.props.children; + } + + return ( +
+

Something went wrong

+
{JSON.stringify(this.state.error, null, 2)}
+
{JSON.stringify(this.state.errorInfo, null, 2)}
+
+ ); + } +} diff --git a/examples/breakout-rooms/src/components/Timer.tsx b/examples/breakout-rooms/src/components/Timer.tsx index b1d2cd4b2..ffb0a65b2 100644 --- a/examples/breakout-rooms/src/components/Timer.tsx +++ b/examples/breakout-rooms/src/components/Timer.tsx @@ -8,21 +8,45 @@ import { IconPlus, IconTimer, } from "@mirohq/design-system"; +import { convertTime, formatDisplayTime, formatTime } from "../utils"; -// in seconds -const DEFAULT_TIME = 5 * 60; -// 1 minute -const DEFAULT_MIN_TIME = 1 * 60; -// 10 minutes -const DEFAULT_MAX_TIME = 10 * 60; -// 15 seconds -const DEFAULT_STEP = 15; +/** + * 5 mins + */ +export const DEFAULT_TIME = convertTime(5, "milliseconds", "minutes"); +/** + * 1 min + */ +export const DEFAULT_MIN_TIME = convertTime(1, "milliseconds", "minutes"); +/** + * 10 mins + */ +export const DEFAULT_MAX_TIME = convertTime(10, "milliseconds", "minutes"); +/** + * 15 seconds + */ +export const DEFAULT_STEP = convertTime(15, "milliseconds", "seconds"); type Props = { + /** + * Default time in milliseconds + */ defaultTime?: number; + /** + * Min time in milliseconds + */ minTime?: number; + /** + * Max time in milliseconds + */ maxTime?: number; + /** + * Inc/Dec step in milliseconds + */ step?: number; + /** + * Set chosen time in milliseconds + */ onSet: (time: number) => void; }; @@ -36,9 +60,6 @@ export const Timer: React.FunctionComponent = ({ const [time, setTime] = React.useState(defaultTime); const [timeChanged, setTimeChanged] = React.useState(false); - const minutes = Math.floor(time / 60); - const seconds = Math.floor(time % 60); - const handleAdd = () => { setTime((time) => (time <= maxTime ? time + step : time)); }; @@ -61,14 +82,14 @@ export const Timer: React.FunctionComponent = ({ type="button" > - {timeChanged ? time : "Set timer"} + {timeChanged ? formatTime(time) : "Set timer"}
-
- {minutes.toString().padStart(2, "0")}: - {seconds.toString().padStart(2, "0")} -
+
{formatDisplayTime(time)}
-
-
- -
-
- -
+
@@ -220,14 +192,16 @@ export const BreakoutManager: React.FC = () => { ))}
- + {breakout?.state !== "started" ? ( + + ) : null}
{unassignedUsers.length ? ( diff --git a/examples/breakout-rooms/src/hooks.tsx b/examples/breakout-rooms/src/hooks.tsx index 041234cd3..e2a03383e 100644 --- a/examples/breakout-rooms/src/hooks.tsx +++ b/examples/breakout-rooms/src/hooks.tsx @@ -431,15 +431,6 @@ export const useBreakout = () => { const releaseSession = async () => { const breakoutRooms = await miro.board.storage.collection(COLLECTION_NAME); - const pastBreakoutRooms = - (await breakoutRooms.get("past")) ?? []; - const historyEntries = [...pastBreakoutRooms, breakout]; - - log("releaseSession", { breakoutRooms, pastBreakoutRooms, breakout }); - - breakoutRooms.set("past", historyEntries); - // Collection.remove does not trigger onValue - // breakoutRooms.set(ACTIVE_ITEM, {}); breakoutRooms.remove(ACTIVE_ITEM); setBreakout(undefined); }; diff --git a/examples/breakout-rooms/src/styles.css b/examples/breakout-rooms/src/styles.css index 1580331c1..257e3297a 100644 --- a/examples/breakout-rooms/src/styles.css +++ b/examples/breakout-rooms/src/styles.css @@ -2,7 +2,6 @@ /** TODO: Make main scrollable and toolbar sitcky to the bottom of the viewport - TODO: Address typography issues TODO: Do we need alert component to display messages? **/ @@ -51,6 +50,11 @@ img { gap: 0.5em; overflow: auto; width: 100%; + height: 100%; +} + +.rooms-container > p { + text-align: center; } .room-container { From 248219b6d67cef647a42c8590a3abb22ce160aa6 Mon Sep 17 00:00:00 2001 From: Frederico Estrela Date: Mon, 20 Nov 2023 11:14:57 +0100 Subject: [PATCH 09/33] Adding demo video --- examples/breakout-rooms/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/breakout-rooms/README.md b/examples/breakout-rooms/README.md index 4c37d42ce..18c65169a 100644 --- a/examples/breakout-rooms/README.md +++ b/examples/breakout-rooms/README.md @@ -4,7 +4,7 @@ This example shows you how leverage collaborative and real-time features, includ # 👨🏻‍💻 App Demo -## TODO add recorded demo +https://github.com/miroapp/app-examples/assets/7162412/62f01445-0d46-42a7-ad93-49ced917cc58 https://github.com/miroapp/app-examples/assets/7162412/46b1708d-fb08-412e-a7b2-31fddf9f4e87 From 70d48317eba55b2ca1b81444c6a929b84ebdca13 Mon Sep 17 00:00:00 2001 From: Frederico Estrela Gaiva Date: Mon, 20 Nov 2023 11:40:19 +0100 Subject: [PATCH 10/33] PF-1391 - Iterating on README with folder structure --- examples/breakout-rooms/README.md | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/examples/breakout-rooms/README.md b/examples/breakout-rooms/README.md index 18c65169a..6828f580b 100644 --- a/examples/breakout-rooms/README.md +++ b/examples/breakout-rooms/README.md @@ -25,6 +25,7 @@ https://github.com/miroapp/app-examples/assets/7162412/46b1708d-fb08-412e-a7b2-3 - [Attention Management](TODO) - [Real-time events](TODO) - [Real-time storage](TODO) +- [Timer](TODO) # 🛠️ Tools and Technologies @@ -91,12 +92,20 @@ scopes: ``` . ├── src -│ └── index.tsx <-- Where the custom actions and icon click handler are defined. -│ └── app.tsx <-- Where the selfie is taken and the image created/updated -├── tsconfig.json <-- typescript configuration file -├── vite.config.ts <-- Vite configuration file -└── index.html <-- The app entry point. This is the value you assign to 'sdkUri' in the app manifest file. -└── capture.html <-- The content displayed in the modal to capture your selfie. +│ ├── components +│ │ ├── BreakoutManager.tsx <-- Main React component displayed in the panel to facilitators +│ │ ├── ErrorBoundary.tsx <-- React error Boundary +│ │ ├── RoomConfig.tsx <-- React component to allow users to configure the rooms. +│ │ ├── Timer.tsx <-- React component to configure the timer. +│ │ └── WaitingRoom.tsx <-- React component displayed to other users in the board but the facilitator creating breakout rooms. +│ ├── app.tsx <-- The app typescript entrypoint used in the panel. +│ ├── hooks.tsx <-- React hooks used in the app, including useCurrentUser, useBreakout, useTimer and some others. +│ ├── index.ts <-- The app main typescript entrypoint, rendered inside the headless iframe. +│ ├── types.ts <-- The app typescript types. +│ └── utils.ts <-- General code utilities, such as formatting and converting time in different units. +├── app.html <-- The app content displayed in the content when user clicks on the app icon on Miro boards. +├── index.html <-- The app entry point. This is the value you assign to 'sdkUri' in the app manifest file. + ``` # 🫱🏻‍🫲🏽 Contributing From 67b4d486c54d6b91a8df3b756038d14d590d6062 Mon Sep 17 00:00:00 2001 From: Frederico Estrela Date: Mon, 20 Nov 2023 11:41:57 +0100 Subject: [PATCH 11/33] Remove video from selfie --- examples/breakout-rooms/README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/examples/breakout-rooms/README.md b/examples/breakout-rooms/README.md index 6828f580b..c677a9569 100644 --- a/examples/breakout-rooms/README.md +++ b/examples/breakout-rooms/README.md @@ -6,8 +6,6 @@ This example shows you how leverage collaborative and real-time features, includ https://github.com/miroapp/app-examples/assets/7162412/62f01445-0d46-42a7-ad93-49ced917cc58 -https://github.com/miroapp/app-examples/assets/7162412/46b1708d-fb08-412e-a7b2-31fddf9f4e87 - # 📒 Table of Contents - [Included Features](#features) From 8e2e56da1bd171754aadaa7b923d9d3a888008b2 Mon Sep 17 00:00:00 2001 From: Frederico Estrela Gaiva Date: Mon, 20 Nov 2023 12:27:11 +0100 Subject: [PATCH 12/33] PF-1391 - Bumping @mirohq/websdk-types@2.9.9 --- README.md | 1 + examples/breakout-rooms/src/hooks.tsx | 20 ++++++++++---------- examples/breakout-rooms/src/types.ts | 6 ++---- yarn.lock | 7 +++++++ 4 files changed, 20 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index c315fa893..ddf98c9c5 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,7 @@ npx create-miro-app@latest | [blob-maker](examples/blob-maker) | This example shows you how to create a drag and drop blobmaker using Miro's Web SDK. | | [youtube-room](examples/youtube-room) | This example shows you how to sync a YouTube player across multiple users through Socket.IO. | | [custom-actions](examples/custom-actions) | This example shows you how register [custom actions](https://developers.miro.com/docs/add-custom-actions-to-your-app) in the item context menu. | +| [breakout-rooms](examples/breakout-rooms) | This example shows you how use collaborative features (real-time storage, events, sessions, etc) |

 

diff --git a/examples/breakout-rooms/src/hooks.tsx b/examples/breakout-rooms/src/hooks.tsx index e2a03383e..b3609aef1 100644 --- a/examples/breakout-rooms/src/hooks.tsx +++ b/examples/breakout-rooms/src/hooks.tsx @@ -6,6 +6,7 @@ import { SelectionUpdateEvent, TimerEvent, UserInfo, + Session, } from "@mirohq/websdk-types"; import { @@ -13,9 +14,9 @@ import { Participant, Room, SelectItemsOpts, - Session, TimerOpts, TimerState, + UserSessionEvent, } from "./types"; import { convertTime, formatDisplayTime, generateUniqueId } from "./utils"; @@ -101,7 +102,7 @@ export const useBreakout = () => { const init = () => { const breakoutRooms = miro.board.storage.collection(COLLECTION_NAME); - const activeValue = (activeBreakout: Breakout) => { + const activeValue = (activeBreakout?: Breakout) => { log("onValue", { activeBreakout }); setBreakout(activeBreakout?.id ? activeBreakout : undefined); }; @@ -269,8 +270,8 @@ export const useBreakout = () => { await saveBreakout(breakout, { rooms }); }; - const handleUserJoined = async ({ userId }: { userId: string }) => { - log("handleUserJoined", { userId, breakout }); + const handleUserJoined = async ({ user }: UserSessionEvent) => { + log("handleUserJoined", { user, breakout }); if (!breakout) { return; } @@ -280,7 +281,7 @@ export const useBreakout = () => { breakout.rooms.some((r) => r.participants.some((p) => { - if (p.id === userId) { + if (p.id === user) { participant = p; room = r; return true; @@ -294,7 +295,7 @@ export const useBreakout = () => { if (!room || !participant) { await miro.board.notifications.showError( - `User ${userId} has joined a session but no room was assigned`, + `User ${user} has joined a session but no room was assigned`, ); return; } @@ -323,8 +324,8 @@ export const useBreakout = () => { } }; - const handleUserLeft = async ({ userId }: { userId: string }) => { - log("handleUserLeft", { userId, breakout }); + const handleUserLeft = async ({ user }: UserSessionEvent) => { + log("handleUserLeft", { user, breakout }); if (!breakout) { return; } @@ -334,7 +335,7 @@ export const useBreakout = () => { breakout.rooms.some((r) => r.participants.some((p) => { - if (p.id === userId) { + if (p.id === user) { participant = p; room = r; return true; @@ -354,7 +355,6 @@ export const useBreakout = () => { }; const upsertSession = async (breakout: Breakout) => { - // TODO replace with actual Session type from @mirohq/websdk-types let session: Session | undefined; if (breakout.sessionId) { const sessions = await miro.board.collaboration.getSessions(); diff --git a/examples/breakout-rooms/src/types.ts b/examples/breakout-rooms/src/types.ts index 94243de94..e9dfbdc0d 100644 --- a/examples/breakout-rooms/src/types.ts +++ b/examples/breakout-rooms/src/types.ts @@ -48,8 +48,6 @@ export type SelectItemsOpts = { predicate?: (items: Item) => boolean; }; -// TODO replace with actual Session type from @mirohq/websdk-types -export type Session = { - id: string; - name: string; +export type UserSessionEvent = { + user: string; }; diff --git a/yarn.lock b/yarn.lock index 77cd593ca..8a57f9e97 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1030,6 +1030,13 @@ node-fetch "^2.6.9" typedoc "0.23.24" +"@mirohq/websdk-types@2.9.9": + version "2.9.9" + resolved "https://registry.yarnpkg.com/@mirohq/websdk-types/-/websdk-types-2.9.9.tgz#d25e5f488c52aa06811b903effbc79129b7de5c4" + integrity sha512-5Q0Q2oFIbzy1qgSqsML7IT/iPmaBDaAM7KsE5HzZQW75HDszCBvrfZVqlVCAA7lp/pERA248PEk3tpDJb7W1eA== + dependencies: + typescript ">=4.6.3 || ~5" + "@mirohq/websdk-types@^2.0.0": version "2.3.0" resolved "https://registry.npmjs.org/@mirohq/websdk-types/-/websdk-types-2.3.0.tgz" From 815f67ef73cf673f56d254bd330de6e4b3939ef6 Mon Sep 17 00:00:00 2001 From: Frederico Estrela Gaiva Date: Wed, 22 Nov 2023 10:26:23 +0100 Subject: [PATCH 13/33] PF-1391 - Using multiple sessions --- .../src/components/BreakoutManager.tsx | 9 +- examples/breakout-rooms/src/hooks.tsx | 101 ++++++++++-------- examples/breakout-rooms/src/types.ts | 4 +- 3 files changed, 64 insertions(+), 50 deletions(-) diff --git a/examples/breakout-rooms/src/components/BreakoutManager.tsx b/examples/breakout-rooms/src/components/BreakoutManager.tsx index e5ac26d25..37b051ffb 100644 --- a/examples/breakout-rooms/src/components/BreakoutManager.tsx +++ b/examples/breakout-rooms/src/components/BreakoutManager.tsx @@ -21,7 +21,7 @@ export const BreakoutManager: React.FC = () => { predicate: (item) => item.type === "frame", }); const [selectedRoom, setSelectedRoom] = React.useState(); - const [duration, setTimerDuration] = React.useState(DEFAULT_TIME); + const [duration, setTimerDuration] = React.useState(); const [currentTime, setCurrentTime] = React.useState(0); const onTimerStop = React.useCallback(() => { @@ -29,7 +29,7 @@ export const BreakoutManager: React.FC = () => { }, [breakout?.id]); const timer = useTimer({ - duration, + duration: duration ?? DEFAULT_TIME, onStop: onTimerStop, onTick: (timestamp) => setCurrentTime(timestamp), }); @@ -235,7 +235,10 @@ export const BreakoutManager: React.FC = () => { type="button" onClick={() => handleStopSession()} > - Stop session ({formatDisplayTime(currentTime)}) + Stop session{" "} + {timer.state === "started" + ? `(${formatDisplayTime(currentTime)})` + : null} ) : ( diff --git a/examples/breakout-rooms/src/hooks.tsx b/examples/breakout-rooms/src/hooks.tsx index b3609aef1..0e735f2ee 100644 --- a/examples/breakout-rooms/src/hooks.tsx +++ b/examples/breakout-rooms/src/hooks.tsx @@ -270,8 +270,8 @@ export const useBreakout = () => { await saveBreakout(breakout, { rooms }); }; - const handleUserJoined = async ({ user }: UserSessionEvent) => { - log("handleUserJoined", { user, breakout }); + const handleUserJoined = async ({ userId, sessionId }: UserSessionEvent) => { + log("handleUserJoined", { userId, sessionId, breakout }); if (!breakout) { return; } @@ -279,23 +279,27 @@ export const useBreakout = () => { let participant: Participant | undefined; let room: Room | undefined; - breakout.rooms.some((r) => - r.participants.some((p) => { - if (p.id === user) { + breakout.rooms.some((r) => { + if (r.sessionId !== sessionId) { + return false; + } + + return r.participants.some((p) => { + if (p.id === userId) { participant = p; room = r; return true; } return false; - }), - ); + }); + }); log("handleUserJoined.participant", { room, participant }); if (!room || !participant) { await miro.board.notifications.showError( - `User ${user} has joined a session but no room was assigned`, + `User ${userId} has joined a session but no room was assigned`, ); return; } @@ -324,8 +328,8 @@ export const useBreakout = () => { } }; - const handleUserLeft = async ({ user }: UserSessionEvent) => { - log("handleUserLeft", { user, breakout }); + const handleUserLeft = async ({ userId, sessionId }: UserSessionEvent) => { + log("handleUserLeft", { userId, sessionId, breakout }); if (!breakout) { return; } @@ -333,17 +337,21 @@ export const useBreakout = () => { let participant: Participant | undefined; let room: Room | undefined; - breakout.rooms.some((r) => - r.participants.some((p) => { - if (p.id === user) { + breakout.rooms.some((r) => { + if (r.sessionId !== sessionId) { + return false; + } + + return r.participants.some((p) => { + if (p.id === userId) { participant = p; room = r; return true; } return false; - }), - ); + }); + }); log("handleUserLeft.participant", { room, participant }); @@ -354,20 +362,24 @@ export const useBreakout = () => { await removeParticipant(room, participant); }; - const upsertSession = async (breakout: Breakout) => { + const upsertSession = async (room: Room) => { let session: Session | undefined; - if (breakout.sessionId) { + if (room.sessionId) { const sessions = await miro.board.collaboration.getSessions(); - session = sessions.find((s) => s.id === breakout.sessionId); + session = sessions.find((s) => s.id === room.sessionId); } if (!session) { session = await miro.board.collaboration.startSession({ - name: `Breakout room - by ${breakout.creator.name}`, + name: room.name, + }); + + const rooms = breakout?.rooms.map((r) => { + return room.id === r.id ? { ...r, sessionId: session!.id } : r; }); await saveBreakout(breakout, { - sessionId: session.id, + rooms, }); } @@ -384,24 +396,20 @@ export const useBreakout = () => { log("startSession", breakout); await saveBreakout(breakout, { state: "started" }); - const session = await upsertSession(breakout); - - const allParticipants = breakout.rooms - .map((room) => room.participants) - .flat(); + await Promise.all( + breakout.rooms.map(async (room) => { + const session = await upsertSession(room); - await session.invite(allParticipants); + await session.invite(room.participants); - await Promise.all( - breakout.rooms.map((room) => room.participants.map((participant) => updateParticipant(room, participant, { state: "Invitation Pending" }), - ), - ), - ); + ); - session.on("user-joined", handleUserJoined); - session.on("user-left", handleUserLeft); + session.on("user-joined", handleUserJoined); + session.on("user-left", handleUserLeft); + }), + ); }; const endSession = async () => { @@ -410,22 +418,22 @@ export const useBreakout = () => { throw new Error("Invalid breakout session"); } - const session = await upsertSession(breakout); - if (!session) { - throw new Error(`Breakout ${breakout} doesn't have a Miro session`); - } + const finishRooms = breakout.rooms.map(async (room) => { + const session = await upsertSession(room); + if (!session) { + throw new Error(`Breakout ${breakout} doesn't have a Miro session`); + } - await session.end(); - await saveBreakout(breakout, { state: "ended" }); + await session.end(); - await Promise.all( - breakout.rooms.map((room) => - room.participants.map((participant) => - updateParticipant(room, participant, { state: "Waiting room" }), - ), - ), - ); + room.participants.map((participant) => + updateParticipant(room, participant, { state: "Waiting room" }), + ); + }); + + await Promise.all(finishRooms); + await saveBreakout(breakout, { state: "ended" }); await releaseSession(); }; @@ -437,6 +445,7 @@ export const useBreakout = () => { const isFacilitator = Boolean(breakout) && breakout?.creator.id === currentUser?.id; + const rooms = breakout?.rooms ?? []; return { diff --git a/examples/breakout-rooms/src/types.ts b/examples/breakout-rooms/src/types.ts index e9dfbdc0d..b356fc1f7 100644 --- a/examples/breakout-rooms/src/types.ts +++ b/examples/breakout-rooms/src/types.ts @@ -16,6 +16,7 @@ export type Room = { name: string; targetId?: string; participants: Participant[]; + sessionId?: string; selected?: boolean; }; @@ -49,5 +50,6 @@ export type SelectItemsOpts = { }; export type UserSessionEvent = { - user: string; + userId: string; + sessionId: string; }; From b3ccb0557defd8ccf5554b7ea6ba48ec64eb4f41 Mon Sep 17 00:00:00 2001 From: Frederico Estrela Gaiva Date: Mon, 27 Nov 2023 12:53:38 +0100 Subject: [PATCH 14/33] UX iterations --- examples/breakout-rooms/package.json | 2 +- .../BreakoutManager/BreakoutManager.css | 55 +++ .../{ => BreakoutManager}/BreakoutManager.tsx | 211 +++++---- .../src/components/BreakoutManager/index.tsx | 1 + .../BreakoutStarter/BreakoutStarter.css | 30 ++ .../BreakoutStarter/BreakoutStarter.tsx | 39 ++ .../src/components/BreakoutStarter/index.tsx | 1 + .../src/components/RoomConfig/RoomConfig.css | 50 +++ .../{ => RoomConfig}/RoomConfig.tsx | 59 +-- .../src/components/RoomConfig/index.tsx | 1 + .../src/components/Timer/Timer.css | 18 + .../src/components/{ => Timer}/Timer.tsx | 19 +- .../src/components/Timer/index.tsx | 1 + .../components/WaitingList/WaitingList.css | 16 + .../components/WaitingList/WaitingList.tsx | 23 + .../src/components/WaitingList/index.tsx | 1 + examples/breakout-rooms/src/styles.css | 88 +--- yarn.lock | 417 +++++++++--------- 18 files changed, 617 insertions(+), 415 deletions(-) create mode 100644 examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.css rename examples/breakout-rooms/src/components/{ => BreakoutManager}/BreakoutManager.tsx (54%) create mode 100644 examples/breakout-rooms/src/components/BreakoutManager/index.tsx create mode 100644 examples/breakout-rooms/src/components/BreakoutStarter/BreakoutStarter.css create mode 100644 examples/breakout-rooms/src/components/BreakoutStarter/BreakoutStarter.tsx create mode 100644 examples/breakout-rooms/src/components/BreakoutStarter/index.tsx create mode 100644 examples/breakout-rooms/src/components/RoomConfig/RoomConfig.css rename examples/breakout-rooms/src/components/{ => RoomConfig}/RoomConfig.tsx (75%) create mode 100644 examples/breakout-rooms/src/components/RoomConfig/index.tsx create mode 100644 examples/breakout-rooms/src/components/Timer/Timer.css rename examples/breakout-rooms/src/components/{ => Timer}/Timer.tsx (87%) create mode 100644 examples/breakout-rooms/src/components/Timer/index.tsx create mode 100644 examples/breakout-rooms/src/components/WaitingList/WaitingList.css create mode 100644 examples/breakout-rooms/src/components/WaitingList/WaitingList.tsx create mode 100644 examples/breakout-rooms/src/components/WaitingList/index.tsx diff --git a/examples/breakout-rooms/package.json b/examples/breakout-rooms/package.json index 51865f4e3..647d55121 100644 --- a/examples/breakout-rooms/package.json +++ b/examples/breakout-rooms/package.json @@ -19,7 +19,7 @@ "serve": "vite preview" }, "dependencies": { - "@mirohq/design-system": "^0.17.19", + "@mirohq/design-system": "^0.18.1", "@stitches/react": "^1.2.8", "classnames": "^2.3.2", "mirotone": "5", diff --git a/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.css b/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.css new file mode 100644 index 000000000..8fbac0b3a --- /dev/null +++ b/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.css @@ -0,0 +1,55 @@ +.breakout-controls { + display: flex; + justify-content: space-between; + align-items: center; +} + +main { + display: flex; + height: 100%; + flex-direction: column; + gap: 1em; +} + +.container { + display: flex; + flex-direction: column; + gap: 1em; + align-items: center; + flex: 1; +} + +.rounded-button button { + border-radius: 100%; +} + +.validation-messages { + background: #f5f5f3; + padding: 1em; +} + +.validation-messages h5 { + font-size: 1em; + font-weight: 600; + line-height: 1em; + margin: 0; + color: #656b81; +} + +.validation-messages ul { + font-size: 0.9em; +} + +.toolbar { + display: flex; + flex-direction: column; + justify-content: center; + gap: 1em; +} + +.toolbar button { + justify-content: center; + margin: 0; + width: 100%; + padding: 1em; +} diff --git a/examples/breakout-rooms/src/components/BreakoutManager.tsx b/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.tsx similarity index 54% rename from examples/breakout-rooms/src/components/BreakoutManager.tsx rename to examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.tsx index 37b051ffb..6be4b2498 100644 --- a/examples/breakout-rooms/src/components/BreakoutManager.tsx +++ b/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.tsx @@ -2,17 +2,29 @@ import * as React from "react"; -import { Participant, Room } from "../types"; +import { Participant, Room } from "../../types"; import { Frame, Json, OnlineUserInfo } from "@mirohq/websdk-types"; import { useBreakout, useOnlineUsers, useSelectedItems, useTimer, -} from "../hooks"; -import { convertTime, formatDisplayTime, isUser } from "../utils"; -import { RoomConfig } from "./RoomConfig"; -import { DEFAULT_TIME, Timer } from "./Timer"; +} from "../../hooks"; +import { convertTime, formatDisplayTime, isUser } from "../../utils"; +import { RoomConfig } from "../RoomConfig/RoomConfig"; +import { DEFAULT_TIME, Timer } from "../Timer/Timer"; +import { + DropdownMenu, + IconButton, + IconPlus, + IconHandFilled, + IconDotsThreeVertical, + Button, +} from "@mirohq/design-system"; + +import "./BreakoutManager.css"; +import { BreakoutStarter } from "../BreakoutStarter"; +import { WaitingList } from "../WaitingList"; export const BreakoutManager: React.FC = () => { const { breakout, rooms, isFacilitator, ...service } = useBreakout(); @@ -23,6 +35,7 @@ export const BreakoutManager: React.FC = () => { const [selectedRoom, setSelectedRoom] = React.useState(); const [duration, setTimerDuration] = React.useState(); const [currentTime, setCurrentTime] = React.useState(0); + const [canUseTimer] = React.useState(false); const onTimerStop = React.useCallback(() => { service.endSession(); @@ -124,11 +137,19 @@ export const BreakoutManager: React.FC = () => { await service.removeRoom(selected); }; + const safeTimerHandler = (cb: () => void) => { + if (canUseTimer) { + cb(); + } + }; + const handleStartSession = async () => { await service.startSession(); - if (duration && timer.state !== "started") { - await timer.start(); - } + safeTimerHandler(async () => { + if (duration && timer.state !== "started") { + await timer.start(); + } + }); }; const handleReleaseFacilitator = async () => { @@ -137,9 +158,11 @@ export const BreakoutManager: React.FC = () => { const handleStopSession = async () => { await service.endSession(); - if (timer.state === "started") { - await timer.stop(); - } + safeTimerHandler(async () => { + if (timer.state === "started") { + await timer.stop(); + } + }); }; const validations: string[] = []; @@ -168,55 +191,72 @@ export const BreakoutManager: React.FC = () => { return (
- - -
-
- {rooms.length < 1 ?

Please create rooms

: null} - - {rooms.map((room) => ( - - ))} -
- - {breakout?.state !== "started" ? ( - - ) : null} -
+ {breakout?.state !== "started" && rooms.length < 1 ? ( + + ) : ( +
+
+ {rooms.map((room) => ( + + ))} +
+
+ + + +
+ + {canUseTimer && ( + + )} + + {isFacilitator && ( + + + + + + <> + handleReleaseFacilitator()} + > + + + + Release facilitator role + + + + + )} +
+
+
+ )} {unassignedUsers.length ? ( -
-
Unassigned users
-
    - {unassignedUsers.map((user) => ( -
  • {user.name}
  • - ))} -
-
+ ) : null} {isEditabled && validations.length > 0 ? ( -
+
Before starting the session:
    {validations.map((message) => ( @@ -224,44 +264,33 @@ export const BreakoutManager: React.FC = () => { ))}
- ) : null} - -
- -
- {breakout?.state === "started" ? ( - - ) : ( - - - {isFacilitator && ( - + ) : ( + + - )} - - )} -
+ Start session + + + )} +
+ )}
); }; diff --git a/examples/breakout-rooms/src/components/BreakoutManager/index.tsx b/examples/breakout-rooms/src/components/BreakoutManager/index.tsx new file mode 100644 index 000000000..903bb62db --- /dev/null +++ b/examples/breakout-rooms/src/components/BreakoutManager/index.tsx @@ -0,0 +1 @@ +export * from "./BreakoutManager"; diff --git a/examples/breakout-rooms/src/components/BreakoutStarter/BreakoutStarter.css b/examples/breakout-rooms/src/components/BreakoutStarter/BreakoutStarter.css new file mode 100644 index 000000000..55b65a7ef --- /dev/null +++ b/examples/breakout-rooms/src/components/BreakoutStarter/BreakoutStarter.css @@ -0,0 +1,30 @@ +.breakout-starter { + display: flex; + flex-direction: column; + align-items: center; + flex: 1; +} + +.starter-action { + background: #f2f4fc; + border-radius: 0.25em; + padding: 1em; + display: flex; + gap: 1em; + align-items: center; + align-self: flex-start; + width: 100%; +} + +.starter-action h5 { + font-size: 1em; + font-weight: 600; + line-height: 1.5em; + text-align: left; + color: #3859ff; + margin: 0; +} + +.starter-icon { + width: 2.5em; +} diff --git a/examples/breakout-rooms/src/components/BreakoutStarter/BreakoutStarter.tsx b/examples/breakout-rooms/src/components/BreakoutStarter/BreakoutStarter.tsx new file mode 100644 index 000000000..758a65e9d --- /dev/null +++ b/examples/breakout-rooms/src/components/BreakoutStarter/BreakoutStarter.tsx @@ -0,0 +1,39 @@ +import { IconButton, IconPlus } from "@mirohq/design-system"; +import React from "react"; + +import "./BreakoutStarter.css"; + +type Props = { + onAddGroup: () => void; +}; + +export const BreakoutStarter: React.FC = ({ onAddGroup }) => { + return ( +
+
+ + + +
Create a room to get started
+
+ + + + +
+ ); +}; diff --git a/examples/breakout-rooms/src/components/BreakoutStarter/index.tsx b/examples/breakout-rooms/src/components/BreakoutStarter/index.tsx new file mode 100644 index 000000000..9b18a6975 --- /dev/null +++ b/examples/breakout-rooms/src/components/BreakoutStarter/index.tsx @@ -0,0 +1 @@ +export * from "./BreakoutStarter"; diff --git a/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.css b/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.css new file mode 100644 index 000000000..60fa833de --- /dev/null +++ b/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.css @@ -0,0 +1,50 @@ +.rooms-container { + display: flex; + flex-direction: column; + max-height: 25em; + min-height: 10em; + gap: 0.5em; + overflow: auto; + width: 100%; + height: 100%; +} + +.rooms-container > p { + text-align: center; +} + +.room-container { + display: flex; + flex-direction: column; + justify-content: center; + background: #eeeded; + border-radius: 0.25em; + gap: 0.5em; + padding: 1em; + width: 100%; + height: 8em; +} + +.room-controls { + display: flex; + justify-content: flex-end; + align-items: center; +} + +.room-container h3 { + margin: 0; + margin-right: auto; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + font-size: 1em; + font-weight: 600; +} + +.button-selected { + background-color: var(--blue100); +} + +.button-active { + background-color: var(--blue300); +} diff --git a/examples/breakout-rooms/src/components/RoomConfig.tsx b/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.tsx similarity index 75% rename from examples/breakout-rooms/src/components/RoomConfig.tsx rename to examples/breakout-rooms/src/components/RoomConfig/RoomConfig.tsx index 023420dfa..bed21c66a 100644 --- a/examples/breakout-rooms/src/components/RoomConfig.tsx +++ b/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.tsx @@ -1,12 +1,19 @@ "use client"; import * as React from "react"; -import classnames from "classnames"; -import { DropdownMenu, IconUser } from "@mirohq/design-system"; - -import type { Participant, Room } from "../types"; +import { + DropdownMenu, + IconButton, + IconFrame, + IconTrash, + IconUser, +} from "@mirohq/design-system"; import { OnlineUserInfo } from "@mirohq/websdk-types"; +import type { Participant, Room } from "../../types"; + +import "./RoomConfig.css"; + export type Props = { room: Room; isEditable: boolean; @@ -21,7 +28,6 @@ export type Props = { export const RoomConfig: React.FunctionComponent = ({ room, isEditable, - isSelected, unassignedUsers, onSelect, onRemove, @@ -30,19 +36,26 @@ export const RoomConfig: React.FunctionComponent = ({ }) => { return (
-

{room.name}

- +
+

{room.name}

+ onSelect(room)} + > + + + + onRemove(room)} + > + + +
@@ -98,16 +111,6 @@ export const RoomConfig: React.FunctionComponent = ({ )} - -
); }; diff --git a/examples/breakout-rooms/src/components/RoomConfig/index.tsx b/examples/breakout-rooms/src/components/RoomConfig/index.tsx new file mode 100644 index 000000000..3f45968a3 --- /dev/null +++ b/examples/breakout-rooms/src/components/RoomConfig/index.tsx @@ -0,0 +1 @@ +export * from "./RoomConfig"; diff --git a/examples/breakout-rooms/src/components/Timer/Timer.css b/examples/breakout-rooms/src/components/Timer/Timer.css new file mode 100644 index 000000000..046f80441 --- /dev/null +++ b/examples/breakout-rooms/src/components/Timer/Timer.css @@ -0,0 +1,18 @@ +.timer-container { + display: flex; + align-items: center; + gap: 0.5em; + min-height: 4em; +} + +.timer-control { + display: flex; + align-items: center; + gap: 0.5em; + padding-right: 0.5em; + border-right: 1px solid var(--indigo400); +} + +.timer-display { + font-size: 2em; +} diff --git a/examples/breakout-rooms/src/components/Timer.tsx b/examples/breakout-rooms/src/components/Timer/Timer.tsx similarity index 87% rename from examples/breakout-rooms/src/components/Timer.tsx rename to examples/breakout-rooms/src/components/Timer/Timer.tsx index ffb0a65b2..c18565c17 100644 --- a/examples/breakout-rooms/src/components/Timer.tsx +++ b/examples/breakout-rooms/src/components/Timer/Timer.tsx @@ -8,7 +8,9 @@ import { IconPlus, IconTimer, } from "@mirohq/design-system"; -import { convertTime, formatDisplayTime, formatTime } from "../utils"; +import { convertTime, formatDisplayTime, formatTime } from "../../utils"; + +import "./Timer.css"; /** * 5 mins @@ -77,13 +79,14 @@ export const Timer: React.FunctionComponent = ({ <> - +
diff --git a/examples/breakout-rooms/src/components/Timer/index.tsx b/examples/breakout-rooms/src/components/Timer/index.tsx new file mode 100644 index 000000000..c8bd02797 --- /dev/null +++ b/examples/breakout-rooms/src/components/Timer/index.tsx @@ -0,0 +1 @@ +export * from "./Timer"; diff --git a/examples/breakout-rooms/src/components/WaitingList/WaitingList.css b/examples/breakout-rooms/src/components/WaitingList/WaitingList.css new file mode 100644 index 000000000..e228c7df2 --- /dev/null +++ b/examples/breakout-rooms/src/components/WaitingList/WaitingList.css @@ -0,0 +1,16 @@ +.waiting-list { + border: 1px solid #d4d4d9; + padding: 1em; + border-radius: 0.25em; + display: flex; + flex-direction: column; + gap: 1em; +} + +.waiting-list h5 { + font-size: 1em; + margin: 0; + font-weight: 600; + line-height: 1.5em; + text-align: left; +} diff --git a/examples/breakout-rooms/src/components/WaitingList/WaitingList.tsx b/examples/breakout-rooms/src/components/WaitingList/WaitingList.tsx new file mode 100644 index 000000000..f4813ba18 --- /dev/null +++ b/examples/breakout-rooms/src/components/WaitingList/WaitingList.tsx @@ -0,0 +1,23 @@ +import { Button, IconUserAdd } from "@mirohq/design-system"; +import { OnlineUserInfo } from "@mirohq/websdk-types"; +import React from "react"; + +import "./WaitingList.css"; + +type Props = { + unassignedUsers: OnlineUserInfo[]; +}; + +export const WaitingList: React.FC = ({ unassignedUsers }) => { + return ( +
+
{unassignedUsers.length} user(s) not in rooms
+ +
+ ); +}; diff --git a/examples/breakout-rooms/src/components/WaitingList/index.tsx b/examples/breakout-rooms/src/components/WaitingList/index.tsx new file mode 100644 index 000000000..044fa5f58 --- /dev/null +++ b/examples/breakout-rooms/src/components/WaitingList/index.tsx @@ -0,0 +1 @@ +export * from "./WaitingList"; diff --git a/examples/breakout-rooms/src/styles.css b/examples/breakout-rooms/src/styles.css index 257e3297a..aa9c874a8 100644 --- a/examples/breakout-rooms/src/styles.css +++ b/examples/breakout-rooms/src/styles.css @@ -1,10 +1,5 @@ @import "mirotone/dist/styles.css"; -/** - TODO: Make main scrollable and toolbar sitcky to the bottom of the viewport - TODO: Do we need alert component to display messages? -**/ - *, *:before, *:after { @@ -16,91 +11,10 @@ padding: var(--space-medium); /** TODO: Had to hardcode this here since it's not coming from DS for some reason **/ --shadows-50: 0 4px 16px #05003812; + height: 100%; } img { max-width: 100%; height: auto; } - -.toolbar { - display: flex; - flex-direction: column; - justify-content: center; - gap: 1em; -} - -.toolbar .button { - justify-content: center; - margin: 0; -} - -.container { - display: flex; - flex-direction: column; - gap: 1em; - align-items: center; -} - -.rooms-container { - display: flex; - flex-direction: column; - max-height: 25em; - min-height: 10em; - gap: 0.5em; - overflow: auto; - width: 100%; - height: 100%; -} - -.rooms-container > p { - text-align: center; -} - -.room-container { - display: flex; - align-items: center; - justify-content: space-between; - justify-items: center; - gap: 0.5em; - padding: 0.5em; - width: 100%; -} - -.room-container :is(h3, button) { - margin: 0 !important; -} - -.room-container h3 { - flex-basis: 9em; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -.button-selected { - background-color: var(--blue100); -} - -.button-active { - background-color: var(--blue300); -} - -.timer-container { - display: flex; - align-items: center; - gap: 0.5em; - min-height: 4em; -} - -.timer-control { - display: flex; - align-items: center; - gap: 0.5em; - padding-right: 0.5em; - border-right: 1px solid var(--indigo400); -} - -.timer-display { - font-size: 2em; -} diff --git a/yarn.lock b/yarn.lock index 8a57f9e97..d40d913e9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -597,169 +597,190 @@ "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" -"@mirohq/design-system-badge@^0.3.22": - version "0.3.22" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-badge/-/design-system-badge-0.3.22.tgz#8446d7e3deb75f9f607fcf5a28e90c22e70ea56f" - integrity sha512-JQTfnJO+EQKZdrBKijIrpgDhi4PFiVUV1PbuWjsrC7P0vn8ffL9+LLhPmm/Wt0aExQ17fwpbbV7Wj7YRotNY/Q== +"@mirohq/design-system-badge@^0.3.26": + version "0.3.26" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-badge/-/design-system-badge-0.3.26.tgz#f727aba5c86c40a6cb88a82c922e6363e0ba1dae" + integrity sha512-vgiHOIwWANUECI+vCciOyPr3ct3FKAr6mL++/BpRzAUIrcRDphF/q/htS1KrLhXUrmiRUV9Gs72m180Fb2Al8w== dependencies: "@mirohq/design-system-primitive" "^1.1.1" - "@mirohq/design-system-stitches" "^2.3.14" + "@mirohq/design-system-stitches" "^2.4.1" "@mirohq/design-system-types" "^0.6.2" -"@mirohq/design-system-base-button@^0.4.24": - version "0.4.24" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-base-button/-/design-system-base-button-0.4.24.tgz#b4a67afb2f91cd5319e880907c31decdc4cf84f1" - integrity sha512-JBLVpZRw4+jHhMaa8CvcY8zhU3MapEftgtye7t8zGz4NQ1hjuH7e/4Sd48Sdcn7VAXq/xmo0QNeOiDSG2xv3Rw== +"@mirohq/design-system-base-button@^0.4.28": + version "0.4.28" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-base-button/-/design-system-base-button-0.4.28.tgz#5eafdcbf74e1ba8ed9eedc7903b85abf7ffe522a" + integrity sha512-uygauti6RazZ3dOs0uBnBnLB++DiYx1xu3XTpsbrwXBYFLuNzaiZP5gV4SiVfEdh/QN2FBwkkc+2iBks9Zfm5A== dependencies: "@mirohq/design-system-primitive" "^1.1.1" - "@mirohq/design-system-stitches" "^2.3.14" + "@mirohq/design-system-stitches" "^2.4.1" "@mirohq/design-system-types" "^0.6.2" "@react-aria/interactions" "^3.13.0" "@react-aria/utils" "^3.13.0" "@react-types/shared" "^3.16.0" -"@mirohq/design-system-base-icon@^0.1.13": - version "0.1.13" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-base-icon/-/design-system-base-icon-0.1.13.tgz#1c5aff564260b8929fd870a624a80ae69c3a6c65" - integrity sha512-VPJJ+RXHClLDQ/qIraU0vg1DR+0F6p46KRxRU3RmWdwRhFfDRCnvWledK08SPbKJ5YQ7kaugJuQ03EjyOPnK/A== +"@mirohq/design-system-base-icon@^0.1.17": + version "0.1.17" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-base-icon/-/design-system-base-icon-0.1.17.tgz#bf775e180c4bb548e611b072db5bc79003a366e5" + integrity sha512-AF+qLCvNPR66vNF80yt9fmNOJWPAjje+u5wu1NSwia2sehAeGGcDrMvTj/XDR0NgqDEGhaJbo+NqEQMoqjnDzg== dependencies: "@mirohq/design-system-primitive" "^1.1.1" - "@mirohq/design-system-stitches" "^2.3.14" + "@mirohq/design-system-stitches" "^2.4.1" + +"@mirohq/design-system-base-input@^0.0.1": + version "0.0.1" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-base-input/-/design-system-base-input-0.0.1.tgz#9f94bb3d04174d48eb69c9f7264df8a53c612a93" + integrity sha512-hlgt6uvJ6cNFzhk51HzEth0RvZmOg8Wg70P2Z18Crmy+StABLcDoHXcwr0eq1CIoupqFtEgO9Jr8JjBw3BLs2w== -"@mirohq/design-system-base-switch@^0.1.12": - version "0.1.12" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-base-switch/-/design-system-base-switch-0.1.12.tgz#76ec64eb07700e28e81825402397bb9e5cd12c68" - integrity sha512-Yec6BWnjF7lyWvmWiSVvysPpVfOk0exnk5MjmqU0BJ9dL75m6Tjc6BcJTDqsCLbXOZcmf/jybVRFR0c87q8uDA== +"@mirohq/design-system-base-switch@^0.1.16": + version "0.1.16" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-base-switch/-/design-system-base-switch-0.1.16.tgz#434008f124a4b27f98c2e12288456feabe4e1a71" + integrity sha512-Iod4f0h2mk7eaynqs6r9oDkBZsxrH0rDKwafxXb1ShKbMisXq0q2rWJSO8wGEZiuQF3emeFi4Vj0lkL4HU0I6A== dependencies: "@mirohq/design-system-primitive" "^1.1.1" - "@mirohq/design-system-stitches" "^2.3.14" + "@mirohq/design-system-stitches" "^2.4.1" -"@mirohq/design-system-box@^2.1.23": - version "2.1.23" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-box/-/design-system-box-2.1.23.tgz#463f15033559ba8c56aedcb630fc00fd9afc1429" - integrity sha512-fafGR1g5g44rCe3D5dkiC/QinVUCTLHxIhykTOoSzZWCn6NRlARyrD8vG0UqnH//syqbXmGflYiDqCjfGdX+Nw== +"@mirohq/design-system-box@^2.1.27": + version "2.1.27" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-box/-/design-system-box-2.1.27.tgz#4820ff3406f7d538acbaf4b571a360216142eae6" + integrity sha512-zAbqyQCkWW7BIOIU02XpA2jC9SPiZNzSLnDiXR0HkpFKIlb5n3LF3ekrpOryl+XnTlLhIHgRVhMNKoy3QuNwVA== dependencies: "@mirohq/design-system-primitive" "^1.1.1" - "@mirohq/design-system-stitches" "^2.3.14" + "@mirohq/design-system-stitches" "^2.4.1" -"@mirohq/design-system-button@^3.1.23": - version "3.1.23" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-button/-/design-system-button-3.1.23.tgz#fc6aba790670a806e9a0209e128323519903c422" - integrity sha512-XZpb2yG52+nXsXOuEYhr9ys/VzDY8p3G36r2MkpTHuJrCKKGXja3f6RNw2hz7A4Yt4ZyeoP7FxkST5eyeMvkgA== +"@mirohq/design-system-button@^3.1.27": + version "3.1.27" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-button/-/design-system-button-3.1.27.tgz#4a930c07231097aa90da168c9683b5f3c9a6f64e" + integrity sha512-W87I135hlypwdSee4qrjQWjRkJqic6RKzLnLEPncQqxY1AnYxLM2/XmSlOPMJZ3XUvNZYQTpMWv8oN5DPKn1fg== dependencies: - "@mirohq/design-system-base-button" "^0.4.24" + "@mirohq/design-system-base-button" "^0.4.28" "@mirohq/design-system-primitive" "^1.1.1" - "@mirohq/design-system-spinner" "^1.1.26" - "@mirohq/design-system-stitches" "^2.3.14" - "@mirohq/design-system-styles" "^1.1.11" + "@mirohq/design-system-spinner" "^1.1.30" + "@mirohq/design-system-stitches" "^2.4.1" + "@mirohq/design-system-styles" "^1.1.15" "@mirohq/design-system-types" "^0.6.2" "@mirohq/design-system-utils" "^0.14.3" "@react-aria/utils" "^3.13.0" -"@mirohq/design-system-calendar@^0.1.37": - version "0.1.37" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-calendar/-/design-system-calendar-0.1.37.tgz#cc01022665bb1a3d946be4fbe8eb49d4370633c2" - integrity sha512-gpZqbMN5Siyz9jLvI2cnP1XSMbfqFmpmmppQUVlE+o6hNR2spzShApP9axkAZdGECXMbgNsRzpbHuvhK6ZUbsQ== +"@mirohq/design-system-calendar@^0.1.42": + version "0.1.42" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-calendar/-/design-system-calendar-0.1.42.tgz#121bff2beb76f8874ca8a74cfa16e02b9f3ceedb" + integrity sha512-/n7hXY795C5TB4Gdu/CNFfcJdOLarVkhDrRSNItLHehU3SBJt/FkpxpxeMGulNmzgaVJfcT0rECDEPMGfI/ALw== dependencies: "@internationalized/date" "^3.3.0" - "@mirohq/design-system-button" "^3.1.23" - "@mirohq/design-system-flex" "^2.1.27" - "@mirohq/design-system-icons" "^0.31.0" + "@mirohq/design-system-button" "^3.1.27" + "@mirohq/design-system-flex" "^2.1.31" + "@mirohq/design-system-icons" "^0.32.3" "@mirohq/design-system-primitive" "^1.1.1" - "@mirohq/design-system-stitches" "^2.3.14" + "@mirohq/design-system-stitches" "^2.4.1" "@react-types/datepicker" "^3.4.0" react-aria "^3.25.0" react-stately "^3.23.0" -"@mirohq/design-system-checkbox@^1.1.54": - version "1.1.54" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-checkbox/-/design-system-checkbox-1.1.54.tgz#4c0ff622916dbea1e6c3f0aec59ac3dbf81c3797" - integrity sha512-kOsmDUHjEJUkrLQ0SPlVb3dhYS8nS+7QZwVDxg25vyrqHKVfTOUUGgm4oucBa6jImc1T/NrX2/tuKTDW4gEvuw== +"@mirohq/design-system-checkbox@^1.1.59": + version "1.1.59" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-checkbox/-/design-system-checkbox-1.1.59.tgz#ed558f9b3430904aea7444acd3e4ab4283cb7210" + integrity sha512-ZutXOiPd4A+bOpONyT5RW+VOnFJucT61w8wZei/pYhBQXrs++yAZUN21NZhpCzK1GVWjH2tHrUPpAe2OSV3K3w== dependencies: - "@mirohq/design-system-icons" "^0.31.0" + "@mirohq/design-system-icons" "^0.32.3" "@mirohq/design-system-primitive" "^1.1.1" - "@mirohq/design-system-stitches" "^2.3.14" + "@mirohq/design-system-stitches" "^2.4.1" "@mirohq/design-system-types" "^0.6.2" "@radix-ui/react-checkbox" "^1.0.0" -"@mirohq/design-system-dropdown-menu@^3.5.18": - version "3.5.18" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-dropdown-menu/-/design-system-dropdown-menu-3.5.18.tgz#7cf9f3d5c83e4f525559c727594fb17e7e36550a" - integrity sha512-C+D4SwcZWKwVBVhl1nfHEHgiK8owpQJXmhau8T1UOScnEqK+TFGahS4hfcWUcYTcmKVEKOqmUDm8Mby1wf1+uQ== +"@mirohq/design-system-dropdown-menu@^3.5.22": + version "3.5.22" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-dropdown-menu/-/design-system-dropdown-menu-3.5.22.tgz#dd943050c43479a7b191e9ababcdf98ba2a243bc" + integrity sha512-2Gm9BnHz970fA+n3X5dzMil2zuDkxnRCguU+VJPhd5Opd+5+MOyQXa2Vi3I75ozVJzud5sSiCFVY8RAS/yjI2g== dependencies: - "@mirohq/design-system-base-icon" "^0.1.13" - "@mirohq/design-system-base-switch" "^0.1.12" + "@mirohq/design-system-base-icon" "^0.1.17" + "@mirohq/design-system-base-switch" "^0.1.16" "@mirohq/design-system-primitive" "^1.1.1" - "@mirohq/design-system-scroll-area" "^0.1.14" - "@mirohq/design-system-stitches" "^2.3.14" - "@mirohq/design-system-styles" "^1.1.11" + "@mirohq/design-system-scroll-area" "^0.1.18" + "@mirohq/design-system-stitches" "^2.4.1" + "@mirohq/design-system-styles" "^1.1.15" "@mirohq/design-system-types" "^0.6.2" "@mirohq/design-system-use-layout-effect" "^0.2.1" "@mirohq/design-system-utils" "^0.14.3" "@radix-ui/react-dropdown-menu" "^2.0.5" "@react-aria/utils" "^3.13.0" -"@mirohq/design-system-flex@^2.1.27": - version "2.1.27" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-flex/-/design-system-flex-2.1.27.tgz#33e60bcd9894e44418f751e4c47e56ec99d8062e" - integrity sha512-jAyELdLhU8sJDB9K17QUoWMsJpvnPpVbz/zpvySdnUSjNXXgbiUZhY6qkeQx67P4SvTWtbtgOVHGq7viq4iRNw== +"@mirohq/design-system-flex@^2.1.31": + version "2.1.31" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-flex/-/design-system-flex-2.1.31.tgz#65b249d266646b235c0bc1a3830a5f5ea93bffb0" + integrity sha512-ZQSA12Cevh09xSrwEfiEFcLqEDdPyRiWqGi/Xv9pBXPb1cs1LfNTV11OMH5GAxkbCs6kcw2Q9/PDL7x62S17dQ== dependencies: "@mirohq/design-system-primitive" "^1.1.1" - "@mirohq/design-system-stitches" "^2.3.14" + "@mirohq/design-system-stitches" "^2.4.1" "@mirohq/design-system-utils" "^0.14.3" -"@mirohq/design-system-grid@^2.1.26": - version "2.1.26" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-grid/-/design-system-grid-2.1.26.tgz#7954ef8769f4dada9da74f533c61933efdc85c38" - integrity sha512-PT/lqtJjWljyTvJj9MLFSRFF8kVmGfh0yp+5Dhv8pgQhwzaZxyQD+zCe5P1kTK1AoZ/8Yst0p1fx06Yb5LDcpQ== +"@mirohq/design-system-grid@^2.1.30": + version "2.1.30" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-grid/-/design-system-grid-2.1.30.tgz#d18b9e201ca3617ef19227f56da331f3c138cc89" + integrity sha512-j72kaKHUE8+HuUukYG69CFyRugTa8+cDBTRoVjShmawTfOdgRh2rSKP288ws9E6q6VseDY5kH6KmmI9UjibyEg== dependencies: "@mirohq/design-system-primitive" "^1.1.1" - "@mirohq/design-system-stitches" "^2.3.14" + "@mirohq/design-system-stitches" "^2.4.1" "@mirohq/design-system-utils" "^0.14.3" -"@mirohq/design-system-icon-button@^1.3.17": - version "1.3.17" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-icon-button/-/design-system-icon-button-1.3.17.tgz#ade3a17498532ab9846b8d7758793751770cd15b" - integrity sha512-XaZgP/xoiqfdAfSK2NZENtx3MMfIe6IH3hxIlSXwnHpDmVPxybzJVy4WyA4OC8/yXmwFiH6GmYvMj5UhFcFCUg== +"@mirohq/design-system-icon-button@^1.3.21": + version "1.3.21" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-icon-button/-/design-system-icon-button-1.3.21.tgz#5f4d14a9ec04b04b4ed7bd3873af62c2b781890c" + integrity sha512-zEy3S4d8+mcg3wibmqyxMyQvFHYipzkNk/9oQEMitMkrDU5/gnxAceOjBZErXVcVaRDnulj6QQyvuR31bsGyIA== dependencies: - "@mirohq/design-system-badge" "^0.3.22" - "@mirohq/design-system-base-button" "^0.4.24" - "@mirohq/design-system-stitches" "^2.3.14" - "@mirohq/design-system-tooltip" "^3.2.29" + "@mirohq/design-system-badge" "^0.3.26" + "@mirohq/design-system-base-button" "^0.4.28" + "@mirohq/design-system-stitches" "^2.4.1" + "@mirohq/design-system-tooltip" "^3.2.33" -"@mirohq/design-system-icons@^0.31.0": - version "0.31.0" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-icons/-/design-system-icons-0.31.0.tgz#77d78befc6b0b92c7c26aa40ffab6d5ed0782dd1" - integrity sha512-eTbFHD0cUYq3dFmxrM4evBfBAO6GTC0P9zYzGz4OfOylA4aud+WdFncrE5feEEx6bvoUt4JpCBTrBE2x8S9k2w== +"@mirohq/design-system-icons@^0.32.3": + version "0.32.3" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-icons/-/design-system-icons-0.32.3.tgz#917aa1ade3c61c87065260ad48507664aa4328ae" + integrity sha512-i6RVNsPT+15hMokU/H3oQBeNjXCUKhI6ehIcH4GyzKosBm9v0WqazpEG7iF3PJnSWZ4EY5KHtg17bT3yGu3mOQ== dependencies: - "@mirohq/design-system-base-icon" "^0.1.13" - "@mirohq/design-system-link" "^1.3.4" + "@mirohq/design-system-base-icon" "^0.1.17" + "@mirohq/design-system-link" "^1.3.8" "@mirohq/design-system-primitive" "^1.1.1" - "@mirohq/design-system-stitches" "^2.3.14" + "@mirohq/design-system-stitches" "^2.4.1" "@mirohq/design-system-utils" "^0.14.3" -"@mirohq/design-system-link@^1.3.4": - version "1.3.4" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-link/-/design-system-link-1.3.4.tgz#10f8ba0fe498abf0e72cf96f0f4b7df16b78b410" - integrity sha512-MZzNsZQMEfDXXvt3BGpZ7GqYTJbS9ZpTS1r36WNB5/tDqH7Qn1BkkeVNhU7GKoQ/cIRxAbwLgMznNIDhlmw1/A== +"@mirohq/design-system-input@^0.0.2": + version "0.0.2" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-input/-/design-system-input-0.0.2.tgz#4c289522d697ddae32351dc0ffc035b3c7a1298e" + integrity sha512-QRwnDFmOMt0IIyqy+ESEujTUitqq6CiIrK4BI3MYzlO0kGnjL29Q3ETZ6eLh5h8o9UGKb7zB8cQkVp5+AUsqUQ== + dependencies: + "@mirohq/design-system-base-button" "^0.4.28" + "@mirohq/design-system-base-icon" "^0.1.17" + "@mirohq/design-system-base-input" "^0.0.1" + "@mirohq/design-system-icon-button" "^1.3.21" + "@mirohq/design-system-icons" "^0.32.3" + "@mirohq/design-system-styles" "^1.1.15" + "@mirohq/design-system-tooltip" "^3.2.33" + "@react-aria/interactions" "^3.13.0" + "@react-aria/utils" "^3.13.0" + "@react-types/shared" "^3.16.0" + +"@mirohq/design-system-link@^1.3.8": + version "1.3.8" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-link/-/design-system-link-1.3.8.tgz#3628e745dd41bf466dafaf541dd362846846b125" + integrity sha512-OiQyQigs0rQwdlZkORgi5MnFVduUKNxZJBpwmen5SU+jyDakhmBruckATw/AtIydoJv9hty+jf5O/vQJExz6Sw== dependencies: "@mirohq/design-system-primitive" "^1.1.1" - "@mirohq/design-system-stitches" "^2.3.14" - "@mirohq/design-system-styles" "^1.1.11" + "@mirohq/design-system-stitches" "^2.4.1" + "@mirohq/design-system-styles" "^1.1.15" "@mirohq/design-system-utils" "^0.14.3" "@react-aria/interactions" "^3.13.0" "@react-aria/utils" "^3.13.0" "@react-types/shared" "^3.16.0" -"@mirohq/design-system-popover@^5.1.2": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-popover/-/design-system-popover-5.1.2.tgz#589c5f389f4712e2613b69c61c01dd775e66d4dc" - integrity sha512-IoDCdMgtNNwz1nPwvTilTT39AQhdNwJJxSeBrpW0Ytvt7KPAs/TIZw9z8+PgaCQaib96WipnSdIpbYCRlxqaVQ== +"@mirohq/design-system-popover@^5.1.7": + version "5.1.7" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-popover/-/design-system-popover-5.1.7.tgz#1ebb0e1140f3bbf5e43acaff60eed359c3f6f072" + integrity sha512-eRsCdn9wiCwzuBPjsB5W24Kkw7tNTKsZDdYbpPJGi/T78NeEd/vXTYh47CStsvld/hX2z/gK81vOdvxdSMRy+A== dependencies: - "@mirohq/design-system-icons" "^0.31.0" + "@mirohq/design-system-icons" "^0.32.3" "@mirohq/design-system-primitive" "^1.1.1" - "@mirohq/design-system-stitches" "^2.3.14" - "@mirohq/design-system-styles" "^1.1.11" + "@mirohq/design-system-stitches" "^2.4.1" + "@mirohq/design-system-styles" "^1.1.15" "@radix-ui/react-popover" "^1.0.0" "@radix-ui/react-use-size" "^1.0.1" @@ -770,105 +791,107 @@ dependencies: "@radix-ui/react-slot" "^1.0.0" -"@mirohq/design-system-scroll-area@^0.1.14": - version "0.1.14" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-scroll-area/-/design-system-scroll-area-0.1.14.tgz#33b871a1492834d0044b8c671346a7cb1f72df9b" - integrity sha512-mh2F8LbI8Y19HXFrNFEQLRyniLxyua9/z9MrI2WaRMVVRl6mXgw/OOmrsI2MPRDlqtN+E58dN8hs9VidLhic/w== +"@mirohq/design-system-scroll-area@^0.1.18": + version "0.1.18" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-scroll-area/-/design-system-scroll-area-0.1.18.tgz#41100c98ef918c8036e1f4dcc3d50fec47a8f1f2" + integrity sha512-eiUnGSnPufN8VSxd+VAcqiDN+FI9LsgANRQkN23e6lMSBJAO0tQc8EoCrMKNSuDyd3SSUwCe93P+nHpQza3OSw== dependencies: - "@mirohq/design-system-stitches" "^2.3.14" + "@mirohq/design-system-stitches" "^2.4.1" "@radix-ui/react-scroll-area" "^1.0.4" -"@mirohq/design-system-select@^0.1.13": - version "0.1.13" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-select/-/design-system-select-0.1.13.tgz#17f82468ca54b0afde25785dfd18baf50a970209" - integrity sha512-j0aSzWgPIl0zZBblWnWdIve3Vzr9UXvwlEqZH2lpXyQHNkzRq5VQ7ouY8AtxoDbGIJ/MjnMT/mSR1P45V6uDLw== +"@mirohq/design-system-select@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-select/-/design-system-select-0.2.2.tgz#a8615565783117ec5b18cfb30499322662e18e31" + integrity sha512-a8C9fTf47PlQbnd03+aVnkg9Sb49OQdpJXdPFJv5LcW7yaR0R0ZTjeSZmJk9K+fYXZa61w60JL5ZfTA2IE3pxA== dependencies: - "@mirohq/design-system-icons" "^0.31.0" + "@mirohq/design-system-icons" "^0.32.3" "@mirohq/design-system-primitive" "^1.1.1" - "@mirohq/design-system-scroll-area" "^0.1.14" - "@mirohq/design-system-stitches" "^2.3.14" + "@mirohq/design-system-scroll-area" "^0.1.18" + "@mirohq/design-system-stitches" "^2.4.1" "@mirohq/design-system-types" "^0.6.2" "@mirohq/design-system-utils" "^0.14.3" "@radix-ui/react-select" "^2.0.0" + "@react-aria/interactions" "^3.13.0" + "@react-types/shared" "^3.16.0" -"@mirohq/design-system-spinner@^1.1.26": - version "1.1.26" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-spinner/-/design-system-spinner-1.1.26.tgz#42207f42f08b2b6b44000f69b211b941380bf129" - integrity sha512-IK/IXnleSsBgWID+y2XhK+oQywJM5KbN3/YIMld0ZQp4H6SP3ObFkdRtZelSfJvyc/HoB3nq/tfP5IXFo2RIPg== +"@mirohq/design-system-spinner@^1.1.30": + version "1.1.30" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-spinner/-/design-system-spinner-1.1.30.tgz#d7bd9cc2bf9842ba1c6db2a1a6e01ef1ef0d62ef" + integrity sha512-1meE9AReZCin+QEAdU9t5F7jKf7JrUmdhGtWjq6uNkXf55GiChiLT0zA8KrngIZsNcFBgcVl7M2ErZVrjCGeHA== dependencies: "@mirohq/design-system-primitive" "^1.1.1" - "@mirohq/design-system-stitches" "^2.3.14" - "@mirohq/design-tokens" "^3.4.1" + "@mirohq/design-system-stitches" "^2.4.1" + "@mirohq/design-tokens" "^3.6.0" -"@mirohq/design-system-stitches@^2.3.14": - version "2.3.14" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-stitches/-/design-system-stitches-2.3.14.tgz#2b77f7985880c6ec970a7e7e165230df26b1445e" - integrity sha512-9vRlPQ20k8h0+Q0FDQEpitElbAdtXNMwWsz3+YDgX/mVHg9wN27Xs3wssISe/y/4Q/uhWs/I+az9O2/wiCcHnA== +"@mirohq/design-system-stitches@^2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-stitches/-/design-system-stitches-2.4.1.tgz#0b51c9eda368019665b2af5046de805d54bd12d7" + integrity sha512-jUJuDK0oc4FmUvA7IKUBEW5P3xX5fws3YTgNx6sKVxTN1lTO5AU7vKNKv4nU40ix7TgMLHUi0XiJRgPk2FnKlA== dependencies: - "@mirohq/design-system-themes" "^0.5.1" + "@mirohq/design-system-themes" "^0.5.4" "@mirohq/design-system-types" "^0.6.2" - "@mirohq/design-tokens" "^3.4.1" + "@mirohq/design-tokens" "^3.6.0" lodash.merge "^4.6.2" -"@mirohq/design-system-styles@^1.1.11": - version "1.1.11" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-styles/-/design-system-styles-1.1.11.tgz#e8e22709bdd437df3e874a1c22bb3e7efd9e82c5" - integrity sha512-Kv3KYYPDsO0EoTHF6aA2o/HH7ngC9FvIFcsBg19dhRVGqUnM23hsLeMKJ7Y//N8ezpYDzZ1ONPyWGS71l83lkQ== +"@mirohq/design-system-styles@^1.1.15": + version "1.1.15" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-styles/-/design-system-styles-1.1.15.tgz#4048f777f2b551d659dd76e968741242a7fcf6d9" + integrity sha512-96WiCcTGFgmdKMykhdNIIwI/Hbe65MW56hkFJ2gEq/9rxRrlX01Bs7pLDcFcHFfmNRZJ2If121WbYY6D4HUbzw== dependencies: - "@mirohq/design-system-stitches" "^2.3.14" - "@mirohq/design-tokens" "^3.4.1" + "@mirohq/design-system-stitches" "^2.4.1" + "@mirohq/design-tokens" "^3.6.0" what-input "^5.2.11" -"@mirohq/design-system-switch@^3.0.20": - version "3.0.20" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-switch/-/design-system-switch-3.0.20.tgz#51bb67c83a04ae7e7d1aac310b5fe9683f111175" - integrity sha512-0+yfDJFtK65Nly1H7qegB+GY91e+RtUbtFPJIaVvvZjL8Rx+4fgZIjS32MNAvmIyW6kk+3ECdFjQPlIvQ9XZZg== +"@mirohq/design-system-switch@^3.0.24": + version "3.0.24" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-switch/-/design-system-switch-3.0.24.tgz#812f12092c8098e2835d8cc93f17c0f224cceb97" + integrity sha512-fuj4+lAf6XJDnm8L5KMNL1Oj63jxVp3q/RhIrIV/sWhVTpCsjg7mUZHIc1KFvEsUdEkhoSDFEkMtCMpWiT3uow== dependencies: - "@mirohq/design-system-base-switch" "^0.1.12" - "@mirohq/design-system-stitches" "^2.3.14" - "@mirohq/design-system-styles" "^1.1.11" + "@mirohq/design-system-base-switch" "^0.1.16" + "@mirohq/design-system-stitches" "^2.4.1" + "@mirohq/design-system-styles" "^1.1.15" "@mirohq/design-system-types" "^0.6.2" "@mirohq/design-system-utils" "^0.14.3" "@radix-ui/react-switch" "^1.0.0" -"@mirohq/design-system-theme-provider@^0.3.4": - version "0.3.4" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-theme-provider/-/design-system-theme-provider-0.3.4.tgz#bd9efe76e66c7a7a4b046954f88438f83693e74a" - integrity sha512-9NIO+E8O4LdbY4OKbfr5h43B/l8+93OzVvTqyLRbHSDJKnMyxyLz9/WarJfR/ggYRlsoEngImg7Ys9ytwYi6Dw== +"@mirohq/design-system-theme-provider@^0.3.8": + version "0.3.8" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-theme-provider/-/design-system-theme-provider-0.3.8.tgz#da40008060a87a23a18615b6fc3460dc7c7c084a" + integrity sha512-VCb9iFTP9mt6Af06TiL39L4KqA/Zh4qqqIA8WAXicez/ifDDj+J/ryafrYww+PcShBsLNzoFH0oWNUfftAkmSg== dependencies: - "@mirohq/design-system-stitches" "^2.3.14" - "@mirohq/design-system-themes" "^0.5.1" + "@mirohq/design-system-stitches" "^2.4.1" + "@mirohq/design-system-themes" "^0.5.4" "@mirohq/design-system-types" "^0.6.2" "@mirohq/design-system-use-theme" "^0.2.10" -"@mirohq/design-system-themes@^0.5.1": - version "0.5.1" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-themes/-/design-system-themes-0.5.1.tgz#c677f8563e059574c565ea1c91cec7b793680f18" - integrity sha512-2WL1C2/7/FAhVLTVnFVPg5/wCUqqMPRSWFDR8yFGqAiPdRLgRKiRWXlfxsribXzUmFLXeOtfYkjjDjrqN7+NrA== +"@mirohq/design-system-themes@^0.5.4": + version "0.5.4" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-themes/-/design-system-themes-0.5.4.tgz#af165a1cacba662ed8339dbc106f31ce4c94382a" + integrity sha512-KwNY76sGcutXxSlay+jlOTS16wmsaWQgOhZGa/Mq24FsMTvrDFVejXRrZFe6/9f5uyD+N+GXaICVtE9HQVtUeg== dependencies: - "@mirohq/design-tokens" "^3.4.1" + "@mirohq/design-tokens" "^3.6.0" -"@mirohq/design-system-toolbar@^2.4.4": - version "2.4.4" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-toolbar/-/design-system-toolbar-2.4.4.tgz#a17c04b4d5bded8837a3ba980284bc935d9b33a2" - integrity sha512-ZO1uELcDh67qmRbW9ggT2hgDDnuzpK21zF9mUi+wefMaUJeVkoZW/icTq1GgO6r9H5mYkaMn7mMzYtAFk0DJXA== +"@mirohq/design-system-toolbar@^2.4.8": + version "2.4.8" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-toolbar/-/design-system-toolbar-2.4.8.tgz#d91be7f90da3977a31efb8515efaba2d18cb9577" + integrity sha512-JYnqxYxaymi+mmDep7c8hCKeSghfPvPA0jQ70qAeexCTXjI49B2fSWSs8khTX7nwnC8lb2JhI8Su/zItsy6efw== dependencies: - "@mirohq/design-system-stitches" "^2.3.14" - "@mirohq/design-system-styles" "^1.1.11" + "@mirohq/design-system-stitches" "^2.4.1" + "@mirohq/design-system-styles" "^1.1.15" "@radix-ui/react-toolbar" "^1.0.0" "@react-aria/interactions" "^3.13.0" "@react-aria/utils" "^3.13.0" "@react-types/shared" "^3.16.0" -"@mirohq/design-system-tooltip@^3.2.29": - version "3.2.29" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-tooltip/-/design-system-tooltip-3.2.29.tgz#dd8597aab7f6aedccb36d8a07fc72f3b49d87065" - integrity sha512-N6gzZnoB0E4hhuWiGiQfhV4UgixT4f5NeAg2H4tL2LoKJwimQYnZSMCZMTh3dxDk7MabMUuhCPwv/ePDJ4eMQA== +"@mirohq/design-system-tooltip@^3.2.33": + version "3.2.33" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-tooltip/-/design-system-tooltip-3.2.33.tgz#04872869b0f2e79a5a324ca6d5b11d7133f6131f" + integrity sha512-f8nFytjUCulAGZjSS9jfsThZ+b+Xi8e0ACnZtbu5nlS4uSK26D6DUtqY444b0u8cphKfJTckcEemvzKkNtHDkw== dependencies: - "@mirohq/design-system-stitches" "^2.3.14" - "@mirohq/design-system-styles" "^1.1.11" + "@mirohq/design-system-stitches" "^2.4.1" + "@mirohq/design-system-styles" "^1.1.15" "@mirohq/design-system-utils" "^0.14.3" - "@mirohq/design-tokens" "^3.4.1" + "@mirohq/design-tokens" "^3.6.0" "@radix-ui/react-tooltip" "^1.0.3" "@mirohq/design-system-types@^0.6.2": @@ -876,13 +899,13 @@ resolved "https://registry.yarnpkg.com/@mirohq/design-system-types/-/design-system-types-0.6.2.tgz#72af4e196803932e57e51db8db39d16bd3da940d" integrity sha512-e/2LJPswOBVCHbV08jIuCXYlb9gTpEGcqH2TQIGikSVCle1vQkQds1lbOF/Xf5vV+mz1fPLTm5UW5jkviESqNw== -"@mirohq/design-system-typography@^0.4.2": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-typography/-/design-system-typography-0.4.2.tgz#1ed54ca15c61bd9413445149e0c9ca4a54de2af7" - integrity sha512-kq0YUfX+BjGVrxKwLgINzeu3DY7rZAkGqFk6SZd+Qtfvrv56iyug5sF4YvvfZ4YZLkZB0YVYnP1ZfAzyxjQtmQ== +"@mirohq/design-system-typography@^0.4.6": + version "0.4.6" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-typography/-/design-system-typography-0.4.6.tgz#c949df9a523cd23a446c2782f1933b2d1d1b155e" + integrity sha512-dZLUO/JIK/4AnF8MHDyUwb38uF79dIV4uihLFjHO8L987pY0+S8wfxoj5nuA5qBqlIQ5kHVu2cAVkVBo63RNBQ== dependencies: "@mirohq/design-system-primitive" "^1.1.1" - "@mirohq/design-system-stitches" "^2.3.14" + "@mirohq/design-system-stitches" "^2.4.1" "@mirohq/design-system-use-clipboard@^0.1.1": version "0.1.1" @@ -958,36 +981,37 @@ dependencies: "@mirohq/design-system-types" "^0.6.2" -"@mirohq/design-system@^0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@mirohq/design-system/-/design-system-0.17.19.tgz#31a248e9923652d01bd0b8c230de302447c4aada" - integrity sha512-dISSTKS+1CRHaxaqve1v+a2Qg/P81zLZtbsvcTzZfzBoLf5a/PKe1yT3yUgfclo3TUberp6rO2Poi96cpjIvvg== - dependencies: - "@mirohq/design-system-badge" "^0.3.22" - "@mirohq/design-system-box" "^2.1.23" - "@mirohq/design-system-button" "^3.1.23" - "@mirohq/design-system-calendar" "^0.1.37" - "@mirohq/design-system-checkbox" "^1.1.54" - "@mirohq/design-system-dropdown-menu" "^3.5.18" - "@mirohq/design-system-flex" "^2.1.27" - "@mirohq/design-system-grid" "^2.1.26" - "@mirohq/design-system-icon-button" "^1.3.17" - "@mirohq/design-system-icons" "^0.31.0" - "@mirohq/design-system-link" "^1.3.4" - "@mirohq/design-system-popover" "^5.1.2" +"@mirohq/design-system@^0.18.1": + version "0.18.1" + resolved "https://registry.yarnpkg.com/@mirohq/design-system/-/design-system-0.18.1.tgz#3e3957a5a240faa6a8b829c73cc544f1fe422805" + integrity sha512-HYvBh+UlRp6Zsb4sBHs5LB+1RItVRonM5vF1xUYHdNiNHb+P3eCEBvODntEtlYIX60O+3lC8R8hNpqlhO0idTQ== + dependencies: + "@mirohq/design-system-badge" "^0.3.26" + "@mirohq/design-system-box" "^2.1.27" + "@mirohq/design-system-button" "^3.1.27" + "@mirohq/design-system-calendar" "^0.1.42" + "@mirohq/design-system-checkbox" "^1.1.59" + "@mirohq/design-system-dropdown-menu" "^3.5.22" + "@mirohq/design-system-flex" "^2.1.31" + "@mirohq/design-system-grid" "^2.1.30" + "@mirohq/design-system-icon-button" "^1.3.21" + "@mirohq/design-system-icons" "^0.32.3" + "@mirohq/design-system-input" "^0.0.2" + "@mirohq/design-system-link" "^1.3.8" + "@mirohq/design-system-popover" "^5.1.7" "@mirohq/design-system-primitive" "^1.1.1" - "@mirohq/design-system-scroll-area" "^0.1.14" - "@mirohq/design-system-select" "^0.1.13" - "@mirohq/design-system-spinner" "^1.1.26" - "@mirohq/design-system-stitches" "^2.3.14" - "@mirohq/design-system-styles" "^1.1.11" - "@mirohq/design-system-switch" "^3.0.20" - "@mirohq/design-system-theme-provider" "^0.3.4" - "@mirohq/design-system-themes" "^0.5.1" - "@mirohq/design-system-toolbar" "^2.4.4" - "@mirohq/design-system-tooltip" "^3.2.29" + "@mirohq/design-system-scroll-area" "^0.1.18" + "@mirohq/design-system-select" "^0.2.2" + "@mirohq/design-system-spinner" "^1.1.30" + "@mirohq/design-system-stitches" "^2.4.1" + "@mirohq/design-system-styles" "^1.1.15" + "@mirohq/design-system-switch" "^3.0.24" + "@mirohq/design-system-theme-provider" "^0.3.8" + "@mirohq/design-system-themes" "^0.5.4" + "@mirohq/design-system-toolbar" "^2.4.8" + "@mirohq/design-system-tooltip" "^3.2.33" "@mirohq/design-system-types" "^0.6.2" - "@mirohq/design-system-typography" "^0.4.2" + "@mirohq/design-system-typography" "^0.4.6" "@mirohq/design-system-use-clipboard" "^0.1.1" "@mirohq/design-system-use-event" "^0.2.1" "@mirohq/design-system-use-event-listener" "^0.3.1" @@ -998,12 +1022,12 @@ "@mirohq/design-system-use-press" "^0.2.1" "@mirohq/design-system-use-theme" "^0.2.10" "@mirohq/design-system-utils" "^0.14.3" - "@mirohq/design-tokens" "^3.4.1" + "@mirohq/design-tokens" "^3.6.0" -"@mirohq/design-tokens@^3.4.1": - version "3.4.1" - resolved "https://registry.yarnpkg.com/@mirohq/design-tokens/-/design-tokens-3.4.1.tgz#1ccf3d8acc45f54bbced6baa6fcc754e7e79ac69" - integrity sha512-eWN2bNWZ2nxhOTrWNO1W8Zp2ktCA4+u5dk8Wve6ZShFe4AL0u49tlIryMf9iFZYVt6eZBzrXec22aFKfm30FWQ== +"@mirohq/design-tokens@^3.6.0": + version "3.6.0" + resolved "https://registry.yarnpkg.com/@mirohq/design-tokens/-/design-tokens-3.6.0.tgz#1bf6988bad249be0eb853ee666e6729358e379b3" + integrity sha512-p4AQPmkpn+T0vtn5wNQRgNeCTcN3C8YqfcWYtXaztmdJQ12j2wZp8oF2ld/iTpFcSO87cbQvx6oKzbTQDWavBw== "@mirohq/miro-api@1.0.2", "@mirohq/miro-api@^1.0.2": version "1.0.2" @@ -1030,13 +1054,6 @@ node-fetch "^2.6.9" typedoc "0.23.24" -"@mirohq/websdk-types@2.9.9": - version "2.9.9" - resolved "https://registry.yarnpkg.com/@mirohq/websdk-types/-/websdk-types-2.9.9.tgz#d25e5f488c52aa06811b903effbc79129b7de5c4" - integrity sha512-5Q0Q2oFIbzy1qgSqsML7IT/iPmaBDaAM7KsE5HzZQW75HDszCBvrfZVqlVCAA7lp/pERA248PEk3tpDJb7W1eA== - dependencies: - typescript ">=4.6.3 || ~5" - "@mirohq/websdk-types@^2.0.0": version "2.3.0" resolved "https://registry.npmjs.org/@mirohq/websdk-types/-/websdk-types-2.3.0.tgz" From f4b81e74fa9cbe3137715fe854f8f6e6d63ab0f9 Mon Sep 17 00:00:00 2001 From: Frederico Estrela Gaiva Date: Mon, 27 Nov 2023 14:13:34 +0100 Subject: [PATCH 15/33] Adjusting styles --- examples/breakout-rooms/src/app.tsx | 2 +- .../BreakoutManager/BreakoutManager.css | 14 +-- .../BreakoutManager/BreakoutManager.tsx | 39 ++++++-- .../BreakoutStarter/BreakoutStarter.css | 9 +- .../BreakoutStarter/BreakoutStarter.tsx | 15 +-- .../src/components/RoomConfig/RoomConfig.css | 21 +++++ .../src/components/RoomConfig/RoomConfig.tsx | 92 ++++++++++--------- .../src/components/WaitingIcon.tsx | 19 ++++ .../components/WaitingList/WaitingList.tsx | 8 +- .../src/components/WaitingRoom.tsx | 29 ------ .../components/WaitingRoom/WaitingRoom.css | 22 +++++ .../components/WaitingRoom/WaitingRoom.tsx | 34 +++++++ .../src/components/WaitingRoom/index.tsx | 1 + examples/breakout-rooms/src/styles.css | 4 + examples/breakout-rooms/src/utils.ts | 8 ++ 15 files changed, 210 insertions(+), 107 deletions(-) create mode 100644 examples/breakout-rooms/src/components/WaitingIcon.tsx delete mode 100644 examples/breakout-rooms/src/components/WaitingRoom.tsx create mode 100644 examples/breakout-rooms/src/components/WaitingRoom/WaitingRoom.css create mode 100644 examples/breakout-rooms/src/components/WaitingRoom/WaitingRoom.tsx create mode 100644 examples/breakout-rooms/src/components/WaitingRoom/index.tsx diff --git a/examples/breakout-rooms/src/app.tsx b/examples/breakout-rooms/src/app.tsx index 0cb4b732d..f44606687 100644 --- a/examples/breakout-rooms/src/app.tsx +++ b/examples/breakout-rooms/src/app.tsx @@ -3,7 +3,7 @@ import * as React from "react"; import { useBreakout } from "./hooks"; import { BreakoutManager } from "./components/BreakoutManager"; -import { WaitingRoom } from "./components/WaitingRoom"; +import { WaitingRoom } from "./components/WaitingRoom/WaitingRoom"; import { createRoot } from "react-dom/client"; import { ErrorBoundary } from "./components/ErrorBoundary"; diff --git a/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.css b/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.css index 8fbac0b3a..eb95ca7b8 100644 --- a/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.css +++ b/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.css @@ -1,10 +1,4 @@ -.breakout-controls { - display: flex; - justify-content: space-between; - align-items: center; -} - -main { +.manager-container { display: flex; height: 100%; flex-direction: column; @@ -23,6 +17,12 @@ main { border-radius: 100%; } +.breakout-controls { + display: flex; + justify-content: space-between; + align-items: center; +} + .validation-messages { background: #f5f5f3; padding: 1em; diff --git a/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.tsx b/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.tsx index 6be4b2498..9a006069e 100644 --- a/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.tsx +++ b/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.tsx @@ -91,7 +91,7 @@ export const BreakoutManager: React.FC = () => { const handleNudge = async (currentUser?: Json) => { if (isUser(currentUser)) { await miro.board.notifications.showInfo( - `The user "${currentUser?.name}" is waiting for the breakout to start.`, + `${currentUser?.name} is waiting to start the session`, ); } }; @@ -133,6 +133,28 @@ export const BreakoutManager: React.FC = () => { await service.removeParticipant(selected, participant); }; + const handleSplitUsers = async () => { + const count = rooms.length; + + // This needs to be only new users + const users = unassignedUsers; + const roomSize = Math.max(Math.floor(users.length / count), 1); + + const usersInRooms: OnlineUserInfo[][] = []; + + for (let i = 0; i < users.length; i += roomSize) { + usersInRooms.push(users.slice(i, i + roomSize)); + } + + for (let i = 0; i < count; ++i) { + const room = rooms[i]; + const participants = usersInRooms[i]; + for (const participant of participants) { + await service.addParticipant(room, participant); + } + } + }; + const handleRemoveRoom = async (selected: Room) => { await service.removeRoom(selected); }; @@ -167,7 +189,7 @@ export const BreakoutManager: React.FC = () => { const validations: string[] = []; if (!breakout?.rooms.length) { - validations.push("Add rooms to your breakout"); + validations.push("Add rooms to your session"); } const allRoomsWithParticipants = breakout?.rooms.every( @@ -175,7 +197,7 @@ export const BreakoutManager: React.FC = () => { ); if (!allRoomsWithParticipants) { - validations.push("Add participants to all of your rooms"); + validations.push("Add users to each room"); } const allRoomsWithTargets = breakout?.rooms.every((room) => @@ -183,14 +205,14 @@ export const BreakoutManager: React.FC = () => { ); if (!allRoomsWithTargets) { - validations.push("Set a starting point to all of your rooms"); + validations.push("Set a frame to each room"); } const canStartSession = validations.length < 1; const isEditabled = breakout?.state !== "started"; return ( -
+
{breakout?.state !== "started" && rooms.length < 1 ? ( ) : ( @@ -251,8 +273,11 @@ export const BreakoutManager: React.FC = () => {
)} - {unassignedUsers.length ? ( - + {rooms.length && unassignedUsers.length ? ( + ) : null} {isEditabled && validations.length > 0 ? ( diff --git a/examples/breakout-rooms/src/components/BreakoutStarter/BreakoutStarter.css b/examples/breakout-rooms/src/components/BreakoutStarter/BreakoutStarter.css index 55b65a7ef..b38921b83 100644 --- a/examples/breakout-rooms/src/components/BreakoutStarter/BreakoutStarter.css +++ b/examples/breakout-rooms/src/components/BreakoutStarter/BreakoutStarter.css @@ -3,6 +3,11 @@ flex-direction: column; align-items: center; flex: 1; + justify-content: space-between; +} + +.breakout-starter .waiting-icon { + margin-bottom: 50%; } .starter-action { @@ -24,7 +29,3 @@ color: #3859ff; margin: 0; } - -.starter-icon { - width: 2.5em; -} diff --git a/examples/breakout-rooms/src/components/BreakoutStarter/BreakoutStarter.tsx b/examples/breakout-rooms/src/components/BreakoutStarter/BreakoutStarter.tsx index 758a65e9d..17847222a 100644 --- a/examples/breakout-rooms/src/components/BreakoutStarter/BreakoutStarter.tsx +++ b/examples/breakout-rooms/src/components/BreakoutStarter/BreakoutStarter.tsx @@ -2,6 +2,7 @@ import { IconButton, IconPlus } from "@mirohq/design-system"; import React from "react"; import "./BreakoutStarter.css"; +import { WaitingIcon } from "../WaitingIcon"; type Props = { onAddGroup: () => void; @@ -21,19 +22,7 @@ export const BreakoutStarter: React.FC = ({ onAddGroup }) => {
Create a room to get started
- - - +
); }; diff --git a/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.css b/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.css index 60fa833de..9f6de3bda 100644 --- a/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.css +++ b/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.css @@ -48,3 +48,24 @@ .button-active { background-color: var(--blue300); } + +.users { + display: flex; + align-items: center; + gap: 1em; +} + +.user-avatar { + border-radius: 100%; + flex-shrink: 0; + background: #817f99; + border: 2px solid #817f99; + width: 32px; + height: 32px; + color: #fff; + display: flex; + justify-content: center; + align-items: center; + font-size: 0.8em; + font-weight: 600; +} diff --git a/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.tsx b/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.tsx index bed21c66a..e89ec9af1 100644 --- a/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.tsx +++ b/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.tsx @@ -7,12 +7,14 @@ import { IconFrame, IconTrash, IconUser, + IconUserAdd, } from "@mirohq/design-system"; import { OnlineUserInfo } from "@mirohq/websdk-types"; import type { Participant, Room } from "../../types"; import "./RoomConfig.css"; +import { initials } from "../../utils"; export type Props = { room: Room; @@ -57,60 +59,62 @@ export const RoomConfig: React.FunctionComponent = ({
- - - - - - {room.participants.length ? ( - - {room.participants.map((user) => ( - onRemoveParticipant(room, user)} - > - - - - {user.name} - - {user.state} - - - ))} - - - ) : null} - {isEditable && unassignedUsers.length ? ( - -
- {unassignedUsers.map((user) => ( +
+ {room.participants.map((participant) => ( +
+ {initials(participant.name)} +
+ ))} + + + + + + + + {room.participants.length ? ( + + {room.participants.map((user) => ( onAddParticipant(room, user)} + onSelect={() => onRemoveParticipant(room, user)} > {user.name} + + {user.state} + ))} -
- - ) : ( -

No unassigned users left

- )} - - + + + ) : null} + {isEditable && unassignedUsers.length ? ( + +
+ {unassignedUsers.map((user) => ( + onAddParticipant(room, user)} + > + + + + {user.name} + + ))} +
+
+ ) : ( +

No unassigned users left

+ )} + + +
); }; diff --git a/examples/breakout-rooms/src/components/WaitingIcon.tsx b/examples/breakout-rooms/src/components/WaitingIcon.tsx new file mode 100644 index 000000000..5c71a64b9 --- /dev/null +++ b/examples/breakout-rooms/src/components/WaitingIcon.tsx @@ -0,0 +1,19 @@ +import React from "react"; + +export const WaitingIcon = () => { + return ( + + + + ); +}; diff --git a/examples/breakout-rooms/src/components/WaitingList/WaitingList.tsx b/examples/breakout-rooms/src/components/WaitingList/WaitingList.tsx index f4813ba18..d1d3c0776 100644 --- a/examples/breakout-rooms/src/components/WaitingList/WaitingList.tsx +++ b/examples/breakout-rooms/src/components/WaitingList/WaitingList.tsx @@ -6,13 +6,17 @@ import "./WaitingList.css"; type Props = { unassignedUsers: OnlineUserInfo[]; + onSplitUsers: () => void; }; -export const WaitingList: React.FC = ({ unassignedUsers }) => { +export const WaitingList: React.FC = ({ + unassignedUsers, + onSplitUsers, +}) => { return (
{unassignedUsers.length} user(s) not in rooms
- +
+ + + ); +}; diff --git a/examples/breakout-rooms/src/components/WaitingRoom/index.tsx b/examples/breakout-rooms/src/components/WaitingRoom/index.tsx new file mode 100644 index 000000000..8397623cc --- /dev/null +++ b/examples/breakout-rooms/src/components/WaitingRoom/index.tsx @@ -0,0 +1 @@ +export * from "./WaitingRoom"; diff --git a/examples/breakout-rooms/src/styles.css b/examples/breakout-rooms/src/styles.css index aa9c874a8..f1e02e887 100644 --- a/examples/breakout-rooms/src/styles.css +++ b/examples/breakout-rooms/src/styles.css @@ -18,3 +18,7 @@ img { max-width: 100%; height: auto; } + +.waiting-icon { + width: 2.5em; +} diff --git a/examples/breakout-rooms/src/utils.ts b/examples/breakout-rooms/src/utils.ts index 8abe602c7..406c9e4c3 100644 --- a/examples/breakout-rooms/src/utils.ts +++ b/examples/breakout-rooms/src/utils.ts @@ -70,3 +70,11 @@ export const formatDisplayTime = ( .map((unit) => unit.toString().padStart(2, "0")) .join(":"); }; + +export const initials = (name: string) => + name + .trim() + .split(" ") + .splice(0, 2) + .map((n) => n[0]) + .join(""); From d056eb6a55be85e58e670c7e59df8203ea7e7586 Mon Sep 17 00:00:00 2001 From: Frederico Estrela Gaiva Date: Mon, 27 Nov 2023 15:24:17 +0100 Subject: [PATCH 16/33] Use avatars --- .../src/components/Avatar/Avatar.css | 16 ++++ .../src/components/Avatar/Avatar.tsx | 52 +++++++++++++ .../src/components/Avatar/index.tsx | 1 + .../BreakoutManager/BreakoutManager.css | 4 - .../BreakoutManager/BreakoutManager.tsx | 17 ++--- .../BreakoutStarter/BreakoutStarter.tsx | 3 +- .../src/components/RoomConfig/RoomConfig.css | 32 +++++--- .../src/components/RoomConfig/RoomConfig.tsx | 73 ++++++++++--------- 8 files changed, 138 insertions(+), 60 deletions(-) create mode 100644 examples/breakout-rooms/src/components/Avatar/Avatar.css create mode 100644 examples/breakout-rooms/src/components/Avatar/Avatar.tsx create mode 100644 examples/breakout-rooms/src/components/Avatar/index.tsx diff --git a/examples/breakout-rooms/src/components/Avatar/Avatar.css b/examples/breakout-rooms/src/components/Avatar/Avatar.css new file mode 100644 index 000000000..080f656fc --- /dev/null +++ b/examples/breakout-rooms/src/components/Avatar/Avatar.css @@ -0,0 +1,16 @@ +.avatar { + border-radius: 100%; + flex-shrink: 0; + background: #817f99; + box-shadow: 0 0 0 6px var(--color, transparent); + outline: 4px solid #fff; + width: 2.2em; + height: 2.2em; + font-size: 14px; + color: #fff; + display: flex; + justify-content: center; + align-items: center; + font-size: 12px; + font-weight: 600; +} diff --git a/examples/breakout-rooms/src/components/Avatar/Avatar.tsx b/examples/breakout-rooms/src/components/Avatar/Avatar.tsx new file mode 100644 index 000000000..2afc77ef5 --- /dev/null +++ b/examples/breakout-rooms/src/components/Avatar/Avatar.tsx @@ -0,0 +1,52 @@ +import * as React from "react"; +import { OnlineUserInfo } from "@mirohq/websdk-types"; +import { initials } from "../../utils"; + +export type Props = { + user: OnlineUserInfo; + color?: string; +}; + +import "./Avatar.css"; + +const colors = [ + "var(--colors-blue-600)", + "var(--colors-green-600)", + "var(--colors-red-600)", + "var(--colors-yellow-600)", +]; +function* colorGenerator(colors: string[]) { + let index = 0; + const totalColors = colors.length; + + while (true) { + yield colors[index]; + index = (index + 1) % totalColors; + } +} + +const getNextColor = colorGenerator(colors); + +const userColors = new Map(); +const getUserColor = (user: OnlineUserInfo): string => { + let color = userColors.get(user.id); + console.log({ userColors, user, color }); + if (!color) { + color = getNextColor.next().value ?? colors[0]; + userColors.set(user.id, color); + } + + return color; +}; + +export const Avatar: React.FC = ({ user }) => { + return ( +
+ {initials(user.name)} +
+ ); +}; diff --git a/examples/breakout-rooms/src/components/Avatar/index.tsx b/examples/breakout-rooms/src/components/Avatar/index.tsx new file mode 100644 index 000000000..8d3d546e7 --- /dev/null +++ b/examples/breakout-rooms/src/components/Avatar/index.tsx @@ -0,0 +1 @@ +export * from "./Avatar"; diff --git a/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.css b/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.css index eb95ca7b8..71ff2b6be 100644 --- a/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.css +++ b/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.css @@ -13,10 +13,6 @@ flex: 1; } -.rounded-button button { - border-radius: 100%; -} - .breakout-controls { display: flex; justify-content: space-between; diff --git a/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.tsx b/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.tsx index 9a006069e..a64081fb5 100644 --- a/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.tsx +++ b/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.tsx @@ -232,15 +232,14 @@ export const BreakoutManager: React.FC = () => { /> ))}
-
- - - -
+ + + {canUseTimer && ( = ({ onAddGroup }) => { return (
-
+
diff --git a/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.css b/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.css index 9f6de3bda..677ab3f70 100644 --- a/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.css +++ b/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.css @@ -52,20 +52,28 @@ .users { display: flex; align-items: center; - gap: 1em; + gap: 0.8em; +} + +.users .list { + /** Overrides DS specific tokens for dropdown **/ + --space-inset-100: 16px; + font-size: 12px; } -.user-avatar { - border-radius: 100%; - flex-shrink: 0; - background: #817f99; - border: 2px solid #817f99; - width: 32px; - height: 32px; - color: #fff; +.users .list .item { display: flex; - justify-content: center; align-items: center; - font-size: 0.8em; - font-weight: 600; + gap: 1em; +} +.users .list .item + div { + padding-left: 3.5em; +} + +.avatars { + display: flex; +} + +.avatars .avatar:not(:first-child) { + margin-left: -0.25em; } diff --git a/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.tsx b/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.tsx index e89ec9af1..7ad75e9c4 100644 --- a/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.tsx +++ b/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.tsx @@ -6,7 +6,6 @@ import { IconButton, IconFrame, IconTrash, - IconUser, IconUserAdd, } from "@mirohq/design-system"; import { OnlineUserInfo } from "@mirohq/websdk-types"; @@ -14,7 +13,7 @@ import { OnlineUserInfo } from "@mirohq/websdk-types"; import type { Participant, Room } from "../../types"; import "./RoomConfig.css"; -import { initials } from "../../utils"; +import { Avatar } from "../Avatar"; export type Props = { room: Room; @@ -60,58 +59,64 @@ export const RoomConfig: React.FunctionComponent = ({
- {room.participants.map((participant) => ( -
- {initials(participant.name)} + {room.participants.length ? ( +
+ {room.participants.map((participant) => ( + + ))}
- ))} + ) : null} - + + {isEditable && unassignedUsers.length ? ( +
+ + Users not in the room + + {unassignedUsers.map((user) => ( + onAddParticipant(room, user)} + > +
+ + {user.name} +
+
+ ))} +
+ ) : null} + {room.participants.length ? ( - +
+ {unassignedUsers.length ? : null} {room.participants.map((user) => ( onRemoveParticipant(room, user)} > - - - - {user.name} +
+ + {user.name} +
{user.state}
))} - - +
) : null} - {isEditable && unassignedUsers.length ? ( - -
- {unassignedUsers.map((user) => ( - onAddParticipant(room, user)} - > - - - - {user.name} - - ))} -
-
- ) : ( -

No unassigned users left

- )}
From 5e7a5dbff3a625a6209cb92bb19b54a667104a33 Mon Sep 17 00:00:00 2001 From: Frederico Estrela Gaiva Date: Mon, 27 Nov 2023 15:33:59 +0100 Subject: [PATCH 17/33] Minor fixes --- .../src/components/BreakoutManager/BreakoutManager.tsx | 1 + .../src/components/RoomConfig/RoomConfig.tsx | 3 ++- .../src/components/WaitingList/WaitingList.tsx | 9 ++++++++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.tsx b/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.tsx index a64081fb5..4507b47ae 100644 --- a/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.tsx +++ b/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.tsx @@ -276,6 +276,7 @@ export const BreakoutManager: React.FC = () => { ) : null} diff --git a/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.tsx b/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.tsx index 7ad75e9c4..73d4dc21a 100644 --- a/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.tsx +++ b/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.tsx @@ -66,6 +66,7 @@ export const RoomConfig: React.FunctionComponent = ({ ))}
) : null} + = ({ - {isEditable && unassignedUsers.length ? ( + {unassignedUsers.length ? (
Users not in the room diff --git a/examples/breakout-rooms/src/components/WaitingList/WaitingList.tsx b/examples/breakout-rooms/src/components/WaitingList/WaitingList.tsx index d1d3c0776..e1a91a103 100644 --- a/examples/breakout-rooms/src/components/WaitingList/WaitingList.tsx +++ b/examples/breakout-rooms/src/components/WaitingList/WaitingList.tsx @@ -7,16 +7,23 @@ import "./WaitingList.css"; type Props = { unassignedUsers: OnlineUserInfo[]; onSplitUsers: () => void; + disabled: boolean; }; export const WaitingList: React.FC = ({ unassignedUsers, onSplitUsers, + disabled, }) => { return (
{unassignedUsers.length} user(s) not in rooms
- diff --git a/yarn.lock b/yarn.lock index d40d913e9..afe3b857e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1054,6 +1054,13 @@ node-fetch "^2.6.9" typedoc "0.23.24" +"@mirohq/websdk-types@2.9.10": + version "2.9.10" + resolved "https://registry.yarnpkg.com/@mirohq/websdk-types/-/websdk-types-2.9.10.tgz#b85c8097b27aa6885642bb957a2c14faf133690c" + integrity sha512-1uLw/SykIoTZf7Pl9eSgzE13puaMtNlVKuB/wRBUEAWAAUkcT3ppSoCHod7EemntDDJhcKEscwRigEmTCJftsw== + dependencies: + typescript ">=4.6.3 || ~5" + "@mirohq/websdk-types@^2.0.0": version "2.3.0" resolved "https://registry.npmjs.org/@mirohq/websdk-types/-/websdk-types-2.3.0.tgz" From 3c98937a4f49e1a875c778c26b29213369202e46 Mon Sep 17 00:00:00 2001 From: Frederico Estrela Gaiva Date: Tue, 28 Nov 2023 09:42:05 +0100 Subject: [PATCH 22/33] PF-1391 - Update README with new folder structured --- examples/breakout-rooms/README.md | 25 +++++++++++-------- .../src/components/Avatar/Avatar.tsx | 7 ++---- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/examples/breakout-rooms/README.md b/examples/breakout-rooms/README.md index 3a0e3793f..078977905 100644 --- a/examples/breakout-rooms/README.md +++ b/examples/breakout-rooms/README.md @@ -19,11 +19,10 @@ https://github.com/miroapp/app-examples/assets/7162412/c4c02dde-6680-4970-a51e-2 # ⚙️ Included Features - [Miro Web SDK](https://developers.miro.com/docs/web-sdk-reference) -- [Collaborative sessions](TODO) -- [Attention Management](TODO) +- [Collaborative sessions](https://developers.miro.com/docs/websdk-reference-session) +- [Attention Management](https://developers.miro.com/docs/websdk-reference-collaboration) - [Real-time events](TODO) -- [Real-time storage](TODO) -- [Timer](TODO) +- [Real-time storage](https://developers.miro.com/docs/websdk-reference-storage) # 🛠️ Tools and Technologies @@ -89,13 +88,17 @@ scopes: ``` . -├── src -│ ├── components -│ │ ├── BreakoutManager.tsx <-- Main React component displayed in the panel to facilitators -│ │ ├── ErrorBoundary.tsx <-- React error Boundary -│ │ ├── RoomConfig.tsx <-- React component to allow users to configure the rooms. -│ │ ├── Timer.tsx <-- React component to configure the timer. -│ │ └── WaitingRoom.tsx <-- React component displayed to other users in the board but the facilitator creating breakout rooms. +├── components +│ ├── Avatar +│ │ ├── Avatar.css +│ │ ├── Avatar.tsx +│ │ └── index.tsx +│ ├── BreakoutManager <-- Main React component displayed in the panel to facilitators +│ ├── BreakoutStarter <-- Component displayed when no rooms were configured +│ ├── RoomConfig <-- Component displayed for each configured room +│ ├── Timer <-- Timer controller component +│ ├── WaitingList <-- Component with unassigned users in the sessiin. +│ ├── WaitingRoom <-- Page displayed to participants while facilitator prepares the session. │ ├── app.tsx <-- The app typescript entrypoint used in the panel. │ ├── hooks.tsx <-- React hooks used in the app, including useCurrentUser, useBreakout, useTimer and some others. │ ├── index.ts <-- The app main typescript entrypoint, rendered inside the headless iframe. diff --git a/examples/breakout-rooms/src/components/Avatar/Avatar.tsx b/examples/breakout-rooms/src/components/Avatar/Avatar.tsx index c1b027da1..b6e170d48 100644 --- a/examples/breakout-rooms/src/components/Avatar/Avatar.tsx +++ b/examples/breakout-rooms/src/components/Avatar/Avatar.tsx @@ -39,12 +39,9 @@ const getUserColor = (user: OnlineUserInfo): string => { }; export const Avatar: React.FC = ({ user }) => { + const style = { "--color": getUserColor(user) } as React.CSSProperties; return ( -
+
{initials(user.name)}
); From 9bdd709826f6a926a0fc05c4e7c8f5b0a0001567 Mon Sep 17 00:00:00 2001 From: Frederico Estrela Gaiva Date: Tue, 28 Nov 2023 10:35:34 +0100 Subject: [PATCH 23/33] PF-1391 - Adding real-time events doc links --- examples/breakout-rooms/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/breakout-rooms/README.md b/examples/breakout-rooms/README.md index 078977905..34229e949 100644 --- a/examples/breakout-rooms/README.md +++ b/examples/breakout-rooms/README.md @@ -21,7 +21,7 @@ https://github.com/miroapp/app-examples/assets/7162412/c4c02dde-6680-4970-a51e-2 - [Miro Web SDK](https://developers.miro.com/docs/web-sdk-reference) - [Collaborative sessions](https://developers.miro.com/docs/websdk-reference-session) - [Attention Management](https://developers.miro.com/docs/websdk-reference-collaboration) -- [Real-time events](TODO) +- [Real-time events](https://developers.miro.com/docs/websdk-reference-events) - [Real-time storage](https://developers.miro.com/docs/websdk-reference-storage) # 🛠️ Tools and Technologies From 8bff2dcf20bac0b5d014093893881d48f35ad031 Mon Sep 17 00:00:00 2001 From: Frederico Estrela Gaiva Date: Tue, 28 Nov 2023 17:12:53 +0100 Subject: [PATCH 24/33] PF-1391 - Bumping @mirohq/sdk-types package to 2.9.10 --- examples/breakout-rooms/README.md | 2 +- examples/breakout-rooms/app-manifest.yaml | 2 +- .../BreakoutManager/BreakoutManager.tsx | 4 +- .../components/WaitingRoom/WaitingRoom.tsx | 2 +- yarn.lock | 166 +++++++++++++++++- 5 files changed, 170 insertions(+), 6 deletions(-) diff --git a/examples/breakout-rooms/README.md b/examples/breakout-rooms/README.md index 34229e949..2ea443bc0 100644 --- a/examples/breakout-rooms/README.md +++ b/examples/breakout-rooms/README.md @@ -75,7 +75,7 @@ https://github.com/miroapp/app-examples/assets/10428517/1e6862de-8617-46ef-b265- ```yaml # See https://developers.miro.com/docs/app-manifest on how to use this -appName: Brekout rooms +appName: Breakout rooms sdkVersion: SDK_V2 sdkUri: http://localhost:3000 scopes: diff --git a/examples/breakout-rooms/app-manifest.yaml b/examples/breakout-rooms/app-manifest.yaml index b0b27a7a0..79079db7d 100644 --- a/examples/breakout-rooms/app-manifest.yaml +++ b/examples/breakout-rooms/app-manifest.yaml @@ -1,5 +1,5 @@ # See https://developers.miro.com/docs/app-manifest on how to use this -appName: Brekout rooms +appName: Breakout rooms sdkVersion: SDK_V2 sdkUri: http://localhost:3000 scopes: diff --git a/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.tsx b/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.tsx index 97969e10b..0b1520b38 100644 --- a/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.tsx +++ b/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.tsx @@ -96,10 +96,10 @@ export const BreakoutManager: React.FC = () => { } }; - miro.board.experimental.events.on("nudge-facilitator", handleNudge); + miro.board.events.on("nudge-facilitator", handleNudge); return () => { - miro.board.experimental.events.off("nudge-facilitator", handleNudge); + miro.board.events.off("nudge-facilitator", handleNudge); }; }; diff --git a/examples/breakout-rooms/src/components/WaitingRoom/WaitingRoom.tsx b/examples/breakout-rooms/src/components/WaitingRoom/WaitingRoom.tsx index 7ef5ec845..28c40dad2 100644 --- a/examples/breakout-rooms/src/components/WaitingRoom/WaitingRoom.tsx +++ b/examples/breakout-rooms/src/components/WaitingRoom/WaitingRoom.tsx @@ -15,7 +15,7 @@ export const WaitingRoom: React.FC = () => { return; } - miro.board.experimental.events.broadcast("nudge-facilitator", currentUser); + miro.board.events.broadcast("nudge-facilitator", currentUser); }; return (
diff --git a/yarn.lock b/yarn.lock index afe3b857e..6eae2cac2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -355,11 +355,21 @@ resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz" integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== +"@esbuild/android-arm@0.15.18": + version "0.15.18" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.18.tgz#266d40b8fdcf87962df8af05b76219bc786b4f80" + integrity sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw== + "@esbuild/linux-loong64@0.14.54": version "0.14.54" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028" integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw== +"@esbuild/linux-loong64@0.15.18": + version "0.15.18" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz#128b76ecb9be48b60cf5cfc1c63a4f00691a3239" + integrity sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ== + "@eslint/eslintrc@^0.4.3": version "0.4.3" resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz" @@ -4074,101 +4084,201 @@ esbuild-android-64@0.14.54: resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be" integrity sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ== +esbuild-android-64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz#20a7ae1416c8eaade917fb2453c1259302c637a5" + integrity sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA== + esbuild-android-arm64@0.14.54: version "0.14.54" resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz#8ce69d7caba49646e009968fe5754a21a9871771" integrity sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg== +esbuild-android-arm64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz#9cc0ec60581d6ad267568f29cf4895ffdd9f2f04" + integrity sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ== + esbuild-darwin-64@0.14.54: version "0.14.54" resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz#24ba67b9a8cb890a3c08d9018f887cc221cdda25" integrity sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug== +esbuild-darwin-64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz#428e1730ea819d500808f220fbc5207aea6d4410" + integrity sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg== + esbuild-darwin-arm64@0.14.54: version "0.14.54" resolved "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz" integrity sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw== +esbuild-darwin-arm64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz#b6dfc7799115a2917f35970bfbc93ae50256b337" + integrity sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA== + esbuild-freebsd-64@0.14.54: version "0.14.54" resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz#09250f997a56ed4650f3e1979c905ffc40bbe94d" integrity sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg== +esbuild-freebsd-64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz#4e190d9c2d1e67164619ae30a438be87d5eedaf2" + integrity sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA== + esbuild-freebsd-arm64@0.14.54: version "0.14.54" resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz#bafb46ed04fc5f97cbdb016d86947a79579f8e48" integrity sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q== +esbuild-freebsd-arm64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz#18a4c0344ee23bd5a6d06d18c76e2fd6d3f91635" + integrity sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA== + esbuild-linux-32@0.14.54: version "0.14.54" resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz#e2a8c4a8efdc355405325033fcebeb941f781fe5" integrity sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw== +esbuild-linux-32@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz#9a329731ee079b12262b793fb84eea762e82e0ce" + integrity sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg== + esbuild-linux-64@0.14.54: version "0.14.54" resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz#de5fdba1c95666cf72369f52b40b03be71226652" integrity sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg== +esbuild-linux-64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz#532738075397b994467b514e524aeb520c191b6c" + integrity sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw== + esbuild-linux-arm64@0.14.54: version "0.14.54" resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz#dae4cd42ae9787468b6a5c158da4c84e83b0ce8b" integrity sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig== +esbuild-linux-arm64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz#5372e7993ac2da8f06b2ba313710d722b7a86e5d" + integrity sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug== + esbuild-linux-arm@0.14.54: version "0.14.54" resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz#a2c1dff6d0f21dbe8fc6998a122675533ddfcd59" integrity sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw== +esbuild-linux-arm@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz#e734aaf259a2e3d109d4886c9e81ec0f2fd9a9cc" + integrity sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA== + esbuild-linux-mips64le@0.14.54: version "0.14.54" resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz#d9918e9e4cb972f8d6dae8e8655bf9ee131eda34" integrity sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw== +esbuild-linux-mips64le@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz#c0487c14a9371a84eb08fab0e1d7b045a77105eb" + integrity sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ== + esbuild-linux-ppc64le@0.14.54: version "0.14.54" resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz#3f9a0f6d41073fb1a640680845c7de52995f137e" integrity sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ== +esbuild-linux-ppc64le@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz#af048ad94eed0ce32f6d5a873f7abe9115012507" + integrity sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w== + esbuild-linux-riscv64@0.14.54: version "0.14.54" resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz#618853c028178a61837bc799d2013d4695e451c8" integrity sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg== +esbuild-linux-riscv64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz#423ed4e5927bd77f842bd566972178f424d455e6" + integrity sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg== + esbuild-linux-s390x@0.14.54: version "0.14.54" resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz#d1885c4c5a76bbb5a0fe182e2c8c60eb9e29f2a6" integrity sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA== +esbuild-linux-s390x@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz#21d21eaa962a183bfb76312e5a01cc5ae48ce8eb" + integrity sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ== + esbuild-netbsd-64@0.14.54: version "0.14.54" resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz#69ae917a2ff241b7df1dbf22baf04bd330349e81" integrity sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w== +esbuild-netbsd-64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz#ae75682f60d08560b1fe9482bfe0173e5110b998" + integrity sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg== + esbuild-openbsd-64@0.14.54: version "0.14.54" resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz#db4c8495287a350a6790de22edea247a57c5d47b" integrity sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw== +esbuild-openbsd-64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz#79591a90aa3b03e4863f93beec0d2bab2853d0a8" + integrity sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ== + esbuild-sunos-64@0.14.54: version "0.14.54" resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz#54287ee3da73d3844b721c21bc80c1dc7e1bf7da" integrity sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw== +esbuild-sunos-64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz#fd528aa5da5374b7e1e93d36ef9b07c3dfed2971" + integrity sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw== + esbuild-windows-32@0.14.54: version "0.14.54" resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz#f8aaf9a5667630b40f0fb3aa37bf01bbd340ce31" integrity sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w== +esbuild-windows-32@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz#0e92b66ecdf5435a76813c4bc5ccda0696f4efc3" + integrity sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ== + esbuild-windows-64@0.14.54: version "0.14.54" resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz#bf54b51bd3e9b0f1886ffdb224a4176031ea0af4" integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ== +esbuild-windows-64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz#0fc761d785414284fc408e7914226d33f82420d0" + integrity sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw== + esbuild-windows-arm64@0.14.54: version "0.14.54" resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982" integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg== +esbuild-windows-arm64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz#5b5bdc56d341d0922ee94965c89ee120a6a86eb7" + integrity sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ== + esbuild@^0.14.27, esbuild@^0.14.47: version "0.14.54" resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz" @@ -4196,6 +4306,34 @@ esbuild@^0.14.27, esbuild@^0.14.47: esbuild-windows-64 "0.14.54" esbuild-windows-arm64 "0.14.54" +esbuild@^0.15.9: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.15.18.tgz#ea894adaf3fbc036d32320a00d4d6e4978a2f36d" + integrity sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q== + optionalDependencies: + "@esbuild/android-arm" "0.15.18" + "@esbuild/linux-loong64" "0.15.18" + esbuild-android-64 "0.15.18" + esbuild-android-arm64 "0.15.18" + esbuild-darwin-64 "0.15.18" + esbuild-darwin-arm64 "0.15.18" + esbuild-freebsd-64 "0.15.18" + esbuild-freebsd-arm64 "0.15.18" + esbuild-linux-32 "0.15.18" + esbuild-linux-64 "0.15.18" + esbuild-linux-arm "0.15.18" + esbuild-linux-arm64 "0.15.18" + esbuild-linux-mips64le "0.15.18" + esbuild-linux-ppc64le "0.15.18" + esbuild-linux-riscv64 "0.15.18" + esbuild-linux-s390x "0.15.18" + esbuild-netbsd-64 "0.15.18" + esbuild-openbsd-64 "0.15.18" + esbuild-sunos-64 "0.15.18" + esbuild-windows-32 "0.15.18" + esbuild-windows-64 "0.15.18" + esbuild-windows-arm64 "0.15.18" + escalade@^3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" @@ -5777,6 +5915,11 @@ nanoid@^3.3.4: resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz" integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== +nanoid@^3.3.6: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" @@ -6199,6 +6342,15 @@ postcss@^8.4.13: picocolors "^1.0.0" source-map-js "^1.0.2" +postcss@^8.4.18: + version "8.4.31" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" @@ -6611,7 +6763,7 @@ rimraf@^3.0.2: optionalDependencies: fsevents "~2.3.2" -rollup@^2.59.0, rollup@^2.75.6: +rollup@^2.59.0, rollup@^2.75.6, rollup@^2.79.1: version "2.79.1" resolved "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz" integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== @@ -7389,6 +7541,18 @@ vite@3.0.3: optionalDependencies: fsevents "~2.3.2" +vite@3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/vite/-/vite-3.2.7.tgz#35a62826bd4d6b778ae5db8766d023bcd4e7bef3" + integrity sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g== + dependencies: + esbuild "^0.15.9" + postcss "^8.4.18" + resolve "^1.22.1" + rollup "^2.79.1" + optionalDependencies: + fsevents "~2.3.2" + vite@^2.9.13: version "2.9.15" resolved "https://registry.npmjs.org/vite/-/vite-2.9.15.tgz" From efe1e9a934ccb697c9623237fc08ed0637a723cb Mon Sep 17 00:00:00 2001 From: Frederico Estrela Date: Wed, 29 Nov 2023 09:55:02 +0100 Subject: [PATCH 25/33] Update examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.tsx Co-authored-by: Mettin Parzinski --- .../src/components/BreakoutManager/BreakoutManager.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.tsx b/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.tsx index 0b1520b38..65bc507ee 100644 --- a/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.tsx +++ b/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.tsx @@ -209,7 +209,7 @@ export const BreakoutManager: React.FC = () => { } const canStartSession = validations.length < 1; - const isEditabled = breakout?.state !== "started"; + const isEditable = breakout?.state !== "started"; return (
From 52d38d624836b96c994c3a0810345d34cb4bf361 Mon Sep 17 00:00:00 2001 From: Frederico Estrela Gaiva Date: Wed, 29 Nov 2023 10:20:01 +0100 Subject: [PATCH 26/33] PF-1391 - Styling using class names --- examples/breakout-rooms/README.md | 20 ++-- .../BreakoutManager/BreakoutManager.css | 4 +- .../BreakoutManager/BreakoutManager.tsx | 80 ++++---------- .../BreakoutStarter/BreakoutStarter.css | 4 +- .../src/components/RoomConfig/RoomConfig.tsx | 6 +- .../components/RoomsManager/RoomsManager.tsx | 100 ++++++++++++++++++ .../src/components/RoomsManager/index.tsx | 1 + .../components/WaitingList/WaitingList.css | 2 +- .../components/WaitingList/WaitingList.tsx | 4 +- .../components/WaitingRoom/WaitingRoom.css | 4 +- 10 files changed, 146 insertions(+), 79 deletions(-) create mode 100644 examples/breakout-rooms/src/components/RoomsManager/RoomsManager.tsx create mode 100644 examples/breakout-rooms/src/components/RoomsManager/index.tsx diff --git a/examples/breakout-rooms/README.md b/examples/breakout-rooms/README.md index 2ea443bc0..4c970b172 100644 --- a/examples/breakout-rooms/README.md +++ b/examples/breakout-rooms/README.md @@ -62,16 +62,7 @@ https://github.com/miroapp/app-examples/assets/7162412/c4c02dde-6680-4970-a51e-2 - `boards:write` - `identity:read` -4. Go back to your app home page, and under the `Permissions` section, you will see a blue button that says `Install app and get OAuth token`. Click that button. Then click on `Add` as shown in the video below. In the video we install a different app, but the process is the same regardless of the app. - -> ⚠️ We recommend to install your app on a [developer team](https://developers.miro.com/docs/create-a-developer-team) while you are developing or testing apps.⚠️ - -https://github.com/miroapp/app-examples/assets/10428517/1e6862de-8617-46ef-b265-97ff1cbfe8bf - -5. Go to your developer team, and open your boards. -6. Click on the app icon on the left sidebar. - -### Example of app yaml +#### Example of app yaml ```yaml # See https://developers.miro.com/docs/app-manifest on how to use this @@ -84,6 +75,15 @@ scopes: - identity:read ``` +4. Go back to your app home page, and under the `Permissions` section, you will see a blue button that says `Install app and get OAuth token`. Click that button. Then click on `Add` as shown in the video below. In the video we install a different app, but the process is the same regardless of the app. + +> ⚠️ We recommend to install your app on a [developer team](https://developers.miro.com/docs/create-a-developer-team) while you are developing or testing apps.⚠️ + +https://github.com/miroapp/app-examples/assets/10428517/1e6862de-8617-46ef-b265-97ff1cbfe8bf + +5. Go to your developer team, and open your boards. +6. Click on the app icon on the left sidebar. + # 🗂️ Folder structure ``` diff --git a/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.css b/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.css index 71ff2b6be..2338cb8e1 100644 --- a/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.css +++ b/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.css @@ -24,7 +24,7 @@ padding: 1em; } -.validation-messages h5 { +.validation-messages .validatino-messages-title { font-size: 1em; font-weight: 600; line-height: 1em; @@ -32,7 +32,7 @@ color: #656b81; } -.validation-messages ul { +.validation-messages .validatino-messages-items { font-size: 0.9em; } diff --git a/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.tsx b/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.tsx index 65bc507ee..42e49682d 100644 --- a/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.tsx +++ b/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.tsx @@ -25,6 +25,7 @@ import { import "./BreakoutManager.css"; import { BreakoutStarter } from "../BreakoutStarter"; import { WaitingList } from "../WaitingList"; +import { RoomsManager } from "../RoomsManager"; export const BreakoutManager: React.FC = () => { const { breakout, rooms, isFacilitator, ...service } = useBreakout(); @@ -216,74 +217,37 @@ export const BreakoutManager: React.FC = () => { {breakout?.state !== "started" && rooms.length < 1 ? ( ) : ( -
-
- {rooms.map((room) => ( - - ))} -
- - - - - {canUseTimer && ( - - )} - - {isFacilitator && ( - - - - - - <> - handleReleaseFacilitator()} - > - - - - Release facilitator role - - - - - )} -
-
-
+ )} {rooms.length && unassignedUsers.length ? ( ) : null} - {isEditabled && validations.length > 0 ? ( + {isEditable && validations.length > 0 ? (
-
Before starting the session:
-
    +
    + Before starting the session: +
    +
      {validations.map((message) => (
    • {message}
    • ))} diff --git a/examples/breakout-rooms/src/components/BreakoutStarter/BreakoutStarter.css b/examples/breakout-rooms/src/components/BreakoutStarter/BreakoutStarter.css index b38921b83..e87f643e6 100644 --- a/examples/breakout-rooms/src/components/BreakoutStarter/BreakoutStarter.css +++ b/examples/breakout-rooms/src/components/BreakoutStarter/BreakoutStarter.css @@ -3,11 +3,11 @@ flex-direction: column; align-items: center; flex: 1; - justify-content: space-between; + justify-content: center; } .breakout-starter .waiting-icon { - margin-bottom: 50%; + margin: auto; } .starter-action { diff --git a/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.tsx b/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.tsx index 73d4dc21a..9951c97c9 100644 --- a/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.tsx +++ b/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.tsx @@ -20,7 +20,7 @@ export type Props = { isEditable: boolean; isSelected: boolean; unassignedUsers: OnlineUserInfo[]; - onSelect: (room: Room) => void; + onSelectTarget: (room: Room) => void; onRemove: (room: Room) => void; onAddParticipant: (room: Room, user: OnlineUserInfo) => void; onRemoveParticipant: (room: Room, participant: Participant) => void; @@ -30,7 +30,7 @@ export const RoomConfig: React.FunctionComponent = ({ room, isEditable, unassignedUsers, - onSelect, + onSelectTarget, onRemove, onAddParticipant, onRemoveParticipant, @@ -43,7 +43,7 @@ export const RoomConfig: React.FunctionComponent = ({ label="Select frame" variant="ghost" disabled={!isEditable} - onClick={() => onSelect(room)} + onClick={() => onSelectTarget(room)} > diff --git a/examples/breakout-rooms/src/components/RoomsManager/RoomsManager.tsx b/examples/breakout-rooms/src/components/RoomsManager/RoomsManager.tsx new file mode 100644 index 000000000..00eea16f7 --- /dev/null +++ b/examples/breakout-rooms/src/components/RoomsManager/RoomsManager.tsx @@ -0,0 +1,100 @@ +import * as React from "react"; +import { OnlineUserInfo } from "@mirohq/websdk-types"; +import { convertTime } from "../../utils"; +import { RoomConfig, Props as RoomConfigProps } from "../RoomConfig"; +import { + DropdownMenu, + IconButton, + IconDotsThreeVertical, + IconHandFilled, + IconPlus, +} from "@mirohq/design-system"; +import { Timer } from "../Timer"; +import { Room } from "../../types"; + +export type Props = { + rooms: Room[]; + selectedRoom?: Room; + isEditable: boolean; + isFacilitator: boolean; + canUseTimer: boolean; + unassignedUsers: OnlineUserInfo[]; + onAddParticipant: RoomConfigProps["onAddParticipant"]; + onSelectTarget: RoomConfigProps["onSelectTarget"]; + onRemove: RoomConfigProps["onRemove"]; + onRemoveParticipant: RoomConfigProps["onRemoveParticipant"]; + onAddGroup: () => void; + onReleaseFacilitator: () => void; + onSetTime: (time: number) => void; +}; + +export const RoomsManager: React.FC = ({ + rooms, + isEditable, + isFacilitator, + canUseTimer, + selectedRoom, + unassignedUsers, + onAddParticipant, + onSelectTarget, + onRemove, + onRemoveParticipant, + onAddGroup, + onSetTime, + onReleaseFacilitator, +}) => { + return ( +
      +
      + {rooms.map((room) => ( + + ))} +
      + + + + + {canUseTimer && ( + + )} + + {isFacilitator && ( + + + + + + <> + onReleaseFacilitator()}> + + + + Release facilitator role + + + + + )} +
      +
      +
      + ); +}; diff --git a/examples/breakout-rooms/src/components/RoomsManager/index.tsx b/examples/breakout-rooms/src/components/RoomsManager/index.tsx new file mode 100644 index 000000000..26291d92f --- /dev/null +++ b/examples/breakout-rooms/src/components/RoomsManager/index.tsx @@ -0,0 +1 @@ +export * from "./RoomsManager"; diff --git a/examples/breakout-rooms/src/components/WaitingList/WaitingList.css b/examples/breakout-rooms/src/components/WaitingList/WaitingList.css index e228c7df2..1716975ae 100644 --- a/examples/breakout-rooms/src/components/WaitingList/WaitingList.css +++ b/examples/breakout-rooms/src/components/WaitingList/WaitingList.css @@ -7,7 +7,7 @@ gap: 1em; } -.waiting-list h5 { +.waiting-list .waiting-list-title { font-size: 1em; margin: 0; font-weight: 600; diff --git a/examples/breakout-rooms/src/components/WaitingList/WaitingList.tsx b/examples/breakout-rooms/src/components/WaitingList/WaitingList.tsx index e1a91a103..f62082f47 100644 --- a/examples/breakout-rooms/src/components/WaitingList/WaitingList.tsx +++ b/examples/breakout-rooms/src/components/WaitingList/WaitingList.tsx @@ -17,7 +17,9 @@ export const WaitingList: React.FC = ({ }) => { return (
      -
      {unassignedUsers.length} user(s) not in rooms
      +
      + {unassignedUsers.length} user(s) not in rooms +
diff --git a/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.css b/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.css index 677ab3f70..2fb38c70b 100644 --- a/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.css +++ b/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.css @@ -1,19 +1,4 @@ -.rooms-container { - display: flex; - flex-direction: column; - max-height: 25em; - min-height: 10em; - gap: 0.5em; - overflow: auto; - width: 100%; - height: 100%; -} - -.rooms-container > p { - text-align: center; -} - -.room-container { +.room { display: flex; flex-direction: column; justify-content: center; @@ -31,7 +16,7 @@ align-items: center; } -.room-container h3 { +.room .room-controls-title { margin: 0; margin-right: auto; white-space: nowrap; diff --git a/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.tsx b/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.tsx index 9951c97c9..3f81c2b36 100644 --- a/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.tsx +++ b/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.tsx @@ -36,9 +36,11 @@ export const RoomConfig: React.FunctionComponent = ({ onRemoveParticipant, }) => { return ( -
+
-

{room.name}

+

+ {room.name} +

= ({ onRemoveParticipant={onRemoveParticipant} /> ))} -
- - - +
+
+ + + - {canUseTimer && ( - - )} + {canUseTimer && ( + + )} - {isFacilitator && ( - - - - - - <> - onReleaseFacilitator()}> - - - - Release facilitator role - - - - - )} -
-
+ {isFacilitator && ( + + + + + + <> + onReleaseFacilitator()}> + + + + Release facilitator role + + + + + )} +
); }; From 6d9b63ad74f6f5678711bfc50635fbed19ec3dd1 Mon Sep 17 00:00:00 2001 From: Frederico Estrela Gaiva Date: Wed, 29 Nov 2023 10:35:38 +0100 Subject: [PATCH 28/33] PF-1391 - Cleaning up imports --- .../BreakoutManager/BreakoutManager.tsx | 17 +++++------------ .../BreakoutStarter/BreakoutStarter.tsx | 3 ++- .../src/components/RoomConfig/RoomConfig.tsx | 2 +- .../components/RoomsManager/RoomsManager.tsx | 1 + 4 files changed, 9 insertions(+), 14 deletions(-) diff --git a/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.tsx b/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.tsx index 42e49682d..109b9590c 100644 --- a/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.tsx +++ b/examples/breakout-rooms/src/components/BreakoutManager/BreakoutManager.tsx @@ -10,23 +10,16 @@ import { useSelectedItems, useTimer, } from "../../hooks"; -import { convertTime, formatDisplayTime, isUser } from "../../utils"; -import { RoomConfig } from "../RoomConfig/RoomConfig"; -import { DEFAULT_TIME, Timer } from "../Timer/Timer"; -import { - DropdownMenu, - IconButton, - IconPlus, - IconHandFilled, - IconDotsThreeVertical, - Button, -} from "@mirohq/design-system"; +import { formatDisplayTime, isUser } from "../../utils"; +import { DEFAULT_TIME } from "../Timer/Timer"; +import { Button } from "@mirohq/design-system"; -import "./BreakoutManager.css"; import { BreakoutStarter } from "../BreakoutStarter"; import { WaitingList } from "../WaitingList"; import { RoomsManager } from "../RoomsManager"; +import "./BreakoutManager.css"; + export const BreakoutManager: React.FC = () => { const { breakout, rooms, isFacilitator, ...service } = useBreakout(); const onlineUsers = useOnlineUsers(); diff --git a/examples/breakout-rooms/src/components/BreakoutStarter/BreakoutStarter.tsx b/examples/breakout-rooms/src/components/BreakoutStarter/BreakoutStarter.tsx index a0fbe5b46..ca98966d1 100644 --- a/examples/breakout-rooms/src/components/BreakoutStarter/BreakoutStarter.tsx +++ b/examples/breakout-rooms/src/components/BreakoutStarter/BreakoutStarter.tsx @@ -1,9 +1,10 @@ import { IconButton, IconPlus } from "@mirohq/design-system"; import React from "react"; -import "./BreakoutStarter.css"; import { WaitingIcon } from "../WaitingIcon"; +import "./BreakoutStarter.css"; + type Props = { onAddGroup: () => void; }; diff --git a/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.tsx b/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.tsx index 3f81c2b36..cc3e7b18a 100644 --- a/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.tsx +++ b/examples/breakout-rooms/src/components/RoomConfig/RoomConfig.tsx @@ -11,9 +11,9 @@ import { import { OnlineUserInfo } from "@mirohq/websdk-types"; import type { Participant, Room } from "../../types"; +import { Avatar } from "../Avatar"; import "./RoomConfig.css"; -import { Avatar } from "../Avatar"; export type Props = { room: Room; diff --git a/examples/breakout-rooms/src/components/RoomsManager/RoomsManager.tsx b/examples/breakout-rooms/src/components/RoomsManager/RoomsManager.tsx index e6d7a497f..eee5e95aa 100644 --- a/examples/breakout-rooms/src/components/RoomsManager/RoomsManager.tsx +++ b/examples/breakout-rooms/src/components/RoomsManager/RoomsManager.tsx @@ -9,6 +9,7 @@ import { IconHandFilled, IconPlus, } from "@mirohq/design-system"; + import { Timer } from "../Timer"; import { Room } from "../../types"; From eb5609161f43e053376a8bd7edc9f4f826c74b72 Mon Sep 17 00:00:00 2001 From: Frederico Estrela Gaiva Date: Wed, 29 Nov 2023 11:18:57 +0100 Subject: [PATCH 29/33] PF-1391 - Treat facilitator differently --- examples/breakout-rooms/src/hooks.tsx | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/examples/breakout-rooms/src/hooks.tsx b/examples/breakout-rooms/src/hooks.tsx index 0e735f2ee..049a6b430 100644 --- a/examples/breakout-rooms/src/hooks.tsx +++ b/examples/breakout-rooms/src/hooks.tsx @@ -24,7 +24,7 @@ const COLLECTION_NAME = "breakout-rooms"; const ACTIVE_ITEM = "active"; const log = (id: string, ...args: unknown[]) => - console.log(id, JSON.stringify(args, null, 2)); + false && console.log(id, JSON.stringify(args, null, 2)); export const useCurrentUser = () => { const [userInfo, setUserInfo] = React.useState(); @@ -400,7 +400,17 @@ export const useBreakout = () => { breakout.rooms.map(async (room) => { const session = await upsertSession(room); - await session.invite(room.participants); + const myself = room.participants.find( + (user) => currentUser?.id === user.id, + ); + const everyoneElse = room.participants.filter( + (user) => currentUser?.id !== user.id, + ); + + if (myself) { + await session.join(); + } + await session.invite(everyoneElse); room.participants.map((participant) => updateParticipant(room, participant, { state: "Invitation Pending" }), From 75caf1ef57a79e972ef7f0d0ac803ff19b532442 Mon Sep 17 00:00:00 2001 From: Frederico Estrela Date: Wed, 29 Nov 2023 11:22:43 +0100 Subject: [PATCH 30/33] Update README.md with video and note about DS --- examples/breakout-rooms/README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/examples/breakout-rooms/README.md b/examples/breakout-rooms/README.md index 4c970b172..378905e3a 100644 --- a/examples/breakout-rooms/README.md +++ b/examples/breakout-rooms/README.md @@ -4,7 +4,9 @@ This example shows you how leverage collaborative and real-time features, includ # 👨🏻‍💻 App Demo -https://github.com/miroapp/app-examples/assets/7162412/c4c02dde-6680-4970-a51e-217866203d4a + +https://github.com/miroapp/app-examples/assets/7162412/e03987e3-f85b-48ab-86b8-f4314c3c5e76 + # 📒 Table of Contents @@ -29,6 +31,9 @@ https://github.com/miroapp/app-examples/assets/7162412/c4c02dde-6680-4970-a51e-2 - [React](https://react.dev/) - [TypeScript](https://www.typescriptlang.org/) - [Vite](https://vitejs.dev/) +- [Miro Design System](https://www.npmjs.com/package/@mirohq/design-system) + +**Note**: Miro Design System can be installed from [npmjs](https://www.npmjs.com/) but it is internally supported only, you can use this example as guidance, but the team is working on public documentation, but with no ETA. Feel free to use [Mirotone](https://www.mirotone.xyz/css) in the meanwhile. # ✅ Prerequisites From 8deaf279bbefc1586323350df87c570770e1bb74 Mon Sep 17 00:00:00 2001 From: Frederico Estrela Gaiva Date: Wed, 29 Nov 2023 11:39:28 +0100 Subject: [PATCH 31/33] PF-1391 - Bump SDK version --- examples/breakout-rooms/package.json | 2 +- yarn.lock | 191 +++++++++++++-------------- 2 files changed, 93 insertions(+), 100 deletions(-) diff --git a/examples/breakout-rooms/package.json b/examples/breakout-rooms/package.json index 647d55121..a6e671428 100644 --- a/examples/breakout-rooms/package.json +++ b/examples/breakout-rooms/package.json @@ -19,7 +19,7 @@ "serve": "vite preview" }, "dependencies": { - "@mirohq/design-system": "^0.18.1", + "@mirohq/design-system": "^0.18.2", "@stitches/react": "^1.2.8", "classnames": "^2.3.2", "mirotone": "5", diff --git a/yarn.lock b/yarn.lock index 6eae2cac2..1a71a914f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -657,57 +657,57 @@ "@mirohq/design-system-primitive" "^1.1.1" "@mirohq/design-system-stitches" "^2.4.1" -"@mirohq/design-system-button@^3.1.27": - version "3.1.27" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-button/-/design-system-button-3.1.27.tgz#4a930c07231097aa90da168c9683b5f3c9a6f64e" - integrity sha512-W87I135hlypwdSee4qrjQWjRkJqic6RKzLnLEPncQqxY1AnYxLM2/XmSlOPMJZ3XUvNZYQTpMWv8oN5DPKn1fg== +"@mirohq/design-system-button@^3.1.28": + version "3.1.28" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-button/-/design-system-button-3.1.28.tgz#52f94e5a2a7c6147799ffa67c0b1ec1e679032c8" + integrity sha512-vQdQH6TdXVzLJppYNPQoeSIarsKG4oszjPEXULP4yAQyXOjnH/5OtRFbE5SRy9NJu5bcd4/2HA3b+tPIZcD48w== dependencies: "@mirohq/design-system-base-button" "^0.4.28" "@mirohq/design-system-primitive" "^1.1.1" "@mirohq/design-system-spinner" "^1.1.30" "@mirohq/design-system-stitches" "^2.4.1" - "@mirohq/design-system-styles" "^1.1.15" + "@mirohq/design-system-styles" "^1.1.16" "@mirohq/design-system-types" "^0.6.2" "@mirohq/design-system-utils" "^0.14.3" "@react-aria/utils" "^3.13.0" -"@mirohq/design-system-calendar@^0.1.42": - version "0.1.42" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-calendar/-/design-system-calendar-0.1.42.tgz#121bff2beb76f8874ca8a74cfa16e02b9f3ceedb" - integrity sha512-/n7hXY795C5TB4Gdu/CNFfcJdOLarVkhDrRSNItLHehU3SBJt/FkpxpxeMGulNmzgaVJfcT0rECDEPMGfI/ALw== +"@mirohq/design-system-calendar@^0.1.43": + version "0.1.43" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-calendar/-/design-system-calendar-0.1.43.tgz#26a3eb11f8bf6374ed01c16bc61d82e8664303a4" + integrity sha512-dxpv41jZy2VIpqLxPIQklY+PkSZGpOHys7HAGbSIOGzlH05IAh9LP0TvOFu3hpNA1jZhE6fd/Mtkbk6RKEyvbA== dependencies: "@internationalized/date" "^3.3.0" - "@mirohq/design-system-button" "^3.1.27" + "@mirohq/design-system-button" "^3.1.28" "@mirohq/design-system-flex" "^2.1.31" - "@mirohq/design-system-icons" "^0.32.3" + "@mirohq/design-system-icons" "^0.32.4" "@mirohq/design-system-primitive" "^1.1.1" "@mirohq/design-system-stitches" "^2.4.1" "@react-types/datepicker" "^3.4.0" react-aria "^3.25.0" react-stately "^3.23.0" -"@mirohq/design-system-checkbox@^1.1.59": - version "1.1.59" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-checkbox/-/design-system-checkbox-1.1.59.tgz#ed558f9b3430904aea7444acd3e4ab4283cb7210" - integrity sha512-ZutXOiPd4A+bOpONyT5RW+VOnFJucT61w8wZei/pYhBQXrs++yAZUN21NZhpCzK1GVWjH2tHrUPpAe2OSV3K3w== +"@mirohq/design-system-checkbox@^1.1.60": + version "1.1.60" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-checkbox/-/design-system-checkbox-1.1.60.tgz#d032a6ed4fb89557dd3ce1528a74d87126f7bd93" + integrity sha512-PUItmlCpnCgeZR8tGvxfJg8fyF8PCxIZ4WjFbOdGQ7BAdeL7+erk8DekIAAdrhy4pWNaA+ZOrUwtYkSEp/Lf3w== dependencies: - "@mirohq/design-system-icons" "^0.32.3" + "@mirohq/design-system-icons" "^0.32.4" "@mirohq/design-system-primitive" "^1.1.1" "@mirohq/design-system-stitches" "^2.4.1" "@mirohq/design-system-types" "^0.6.2" "@radix-ui/react-checkbox" "^1.0.0" -"@mirohq/design-system-dropdown-menu@^3.5.22": - version "3.5.22" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-dropdown-menu/-/design-system-dropdown-menu-3.5.22.tgz#dd943050c43479a7b191e9ababcdf98ba2a243bc" - integrity sha512-2Gm9BnHz970fA+n3X5dzMil2zuDkxnRCguU+VJPhd5Opd+5+MOyQXa2Vi3I75ozVJzud5sSiCFVY8RAS/yjI2g== +"@mirohq/design-system-dropdown-menu@^3.5.23": + version "3.5.23" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-dropdown-menu/-/design-system-dropdown-menu-3.5.23.tgz#94f5102d2a8a36f4f8bae120444b58e8a32bd0d3" + integrity sha512-IsJ5gS4pYqAs3eASRMTFuV7CFN70tm8KjL12IOs48u/NxFaz6ei906SwYqtsg9GZNmb0PL99kpVTGuoty4MZeg== dependencies: "@mirohq/design-system-base-icon" "^0.1.17" "@mirohq/design-system-base-switch" "^0.1.16" "@mirohq/design-system-primitive" "^1.1.1" "@mirohq/design-system-scroll-area" "^0.1.18" "@mirohq/design-system-stitches" "^2.4.1" - "@mirohq/design-system-styles" "^1.1.15" + "@mirohq/design-system-styles" "^1.1.16" "@mirohq/design-system-types" "^0.6.2" "@mirohq/design-system-use-layout-effect" "^0.2.1" "@mirohq/design-system-utils" "^0.14.3" @@ -732,65 +732,65 @@ "@mirohq/design-system-stitches" "^2.4.1" "@mirohq/design-system-utils" "^0.14.3" -"@mirohq/design-system-icon-button@^1.3.21": - version "1.3.21" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-icon-button/-/design-system-icon-button-1.3.21.tgz#5f4d14a9ec04b04b4ed7bd3873af62c2b781890c" - integrity sha512-zEy3S4d8+mcg3wibmqyxMyQvFHYipzkNk/9oQEMitMkrDU5/gnxAceOjBZErXVcVaRDnulj6QQyvuR31bsGyIA== +"@mirohq/design-system-icon-button@^1.3.22": + version "1.3.22" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-icon-button/-/design-system-icon-button-1.3.22.tgz#4ba46c2d4a29acadae4c07b52918e5ad3b3bae53" + integrity sha512-Qs5N+PetyB1hsEMzJAdK/77GQWBr5n1yi8ra8VKEOWlDGxLwi+OR1qvIkxGVDAHBAb4U4CNPn0oM1148gVsR/g== dependencies: "@mirohq/design-system-badge" "^0.3.26" "@mirohq/design-system-base-button" "^0.4.28" "@mirohq/design-system-stitches" "^2.4.1" - "@mirohq/design-system-tooltip" "^3.2.33" + "@mirohq/design-system-tooltip" "^3.2.34" -"@mirohq/design-system-icons@^0.32.3": - version "0.32.3" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-icons/-/design-system-icons-0.32.3.tgz#917aa1ade3c61c87065260ad48507664aa4328ae" - integrity sha512-i6RVNsPT+15hMokU/H3oQBeNjXCUKhI6ehIcH4GyzKosBm9v0WqazpEG7iF3PJnSWZ4EY5KHtg17bT3yGu3mOQ== +"@mirohq/design-system-icons@^0.32.4": + version "0.32.4" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-icons/-/design-system-icons-0.32.4.tgz#e54595be6684d53ea018d7eaa2f540ebdad48219" + integrity sha512-vh4XR2rTRiNFfrKvp34/xHkMk5zy8BBAVugpf+Gghv6bFuyvYBnuUMZtBHRuZNRgDgr5+3MY4poINJ+FkHtFqA== dependencies: "@mirohq/design-system-base-icon" "^0.1.17" - "@mirohq/design-system-link" "^1.3.8" + "@mirohq/design-system-link" "^1.3.9" "@mirohq/design-system-primitive" "^1.1.1" "@mirohq/design-system-stitches" "^2.4.1" "@mirohq/design-system-utils" "^0.14.3" -"@mirohq/design-system-input@^0.0.2": - version "0.0.2" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-input/-/design-system-input-0.0.2.tgz#4c289522d697ddae32351dc0ffc035b3c7a1298e" - integrity sha512-QRwnDFmOMt0IIyqy+ESEujTUitqq6CiIrK4BI3MYzlO0kGnjL29Q3ETZ6eLh5h8o9UGKb7zB8cQkVp5+AUsqUQ== +"@mirohq/design-system-input@^0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-input/-/design-system-input-0.0.3.tgz#0271c74d28c50c0d5527cbe2bae706ea2d7f9637" + integrity sha512-jNftlerEVpnyJgIujcBJ3mR+iaKq3v4X6vGv7ap55+sRd/najjD8ClZ7+WuUDMPDSifFlIFSJbmLIhbIXifXdw== dependencies: "@mirohq/design-system-base-button" "^0.4.28" "@mirohq/design-system-base-icon" "^0.1.17" "@mirohq/design-system-base-input" "^0.0.1" - "@mirohq/design-system-icon-button" "^1.3.21" - "@mirohq/design-system-icons" "^0.32.3" - "@mirohq/design-system-styles" "^1.1.15" - "@mirohq/design-system-tooltip" "^3.2.33" + "@mirohq/design-system-icon-button" "^1.3.22" + "@mirohq/design-system-icons" "^0.32.4" + "@mirohq/design-system-styles" "^1.1.16" + "@mirohq/design-system-tooltip" "^3.2.34" "@react-aria/interactions" "^3.13.0" "@react-aria/utils" "^3.13.0" "@react-types/shared" "^3.16.0" -"@mirohq/design-system-link@^1.3.8": - version "1.3.8" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-link/-/design-system-link-1.3.8.tgz#3628e745dd41bf466dafaf541dd362846846b125" - integrity sha512-OiQyQigs0rQwdlZkORgi5MnFVduUKNxZJBpwmen5SU+jyDakhmBruckATw/AtIydoJv9hty+jf5O/vQJExz6Sw== +"@mirohq/design-system-link@^1.3.9": + version "1.3.9" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-link/-/design-system-link-1.3.9.tgz#7bd5bbb906c8fa40e80368a0adb243d72d5ca575" + integrity sha512-vGR01CZhMahZKg87epr8gWze4UOqBVslVnFNlTuCuq0PzOlSQwfD5vFKzuBvYA3dik62+9uUz56UCxZmNizb/Q== dependencies: "@mirohq/design-system-primitive" "^1.1.1" "@mirohq/design-system-stitches" "^2.4.1" - "@mirohq/design-system-styles" "^1.1.15" + "@mirohq/design-system-styles" "^1.1.16" "@mirohq/design-system-utils" "^0.14.3" "@react-aria/interactions" "^3.13.0" "@react-aria/utils" "^3.13.0" "@react-types/shared" "^3.16.0" -"@mirohq/design-system-popover@^5.1.7": - version "5.1.7" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-popover/-/design-system-popover-5.1.7.tgz#1ebb0e1140f3bbf5e43acaff60eed359c3f6f072" - integrity sha512-eRsCdn9wiCwzuBPjsB5W24Kkw7tNTKsZDdYbpPJGi/T78NeEd/vXTYh47CStsvld/hX2z/gK81vOdvxdSMRy+A== +"@mirohq/design-system-popover@^5.1.8": + version "5.1.8" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-popover/-/design-system-popover-5.1.8.tgz#662079944f65beb7435f9d8bcf3d3596e77cc4d0" + integrity sha512-Ja/mdLtrn+Akt7u8BJmOsViSFbFSvWJz+4Hqt3/ZyvxY7uhWzKlpcFZo6eulIiIMD/nKF3pSWZ55r75X2AsREQ== dependencies: - "@mirohq/design-system-icons" "^0.32.3" + "@mirohq/design-system-icons" "^0.32.4" "@mirohq/design-system-primitive" "^1.1.1" "@mirohq/design-system-stitches" "^2.4.1" - "@mirohq/design-system-styles" "^1.1.15" + "@mirohq/design-system-styles" "^1.1.16" "@radix-ui/react-popover" "^1.0.0" "@radix-ui/react-use-size" "^1.0.1" @@ -809,12 +809,12 @@ "@mirohq/design-system-stitches" "^2.4.1" "@radix-ui/react-scroll-area" "^1.0.4" -"@mirohq/design-system-select@^0.2.2": - version "0.2.2" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-select/-/design-system-select-0.2.2.tgz#a8615565783117ec5b18cfb30499322662e18e31" - integrity sha512-a8C9fTf47PlQbnd03+aVnkg9Sb49OQdpJXdPFJv5LcW7yaR0R0ZTjeSZmJk9K+fYXZa61w60JL5ZfTA2IE3pxA== +"@mirohq/design-system-select@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-select/-/design-system-select-0.2.3.tgz#886157eb618530948eec1dcae973e837d721cd6e" + integrity sha512-EU3cTIOQ9B+KdXSu0yRjFkrnGTpW6nulvzU14uIB16YeIgAYQylluiqoa5N9qcTjrzTShcK4LNFYxbKtP6JMfg== dependencies: - "@mirohq/design-system-icons" "^0.32.3" + "@mirohq/design-system-icons" "^0.32.4" "@mirohq/design-system-primitive" "^1.1.1" "@mirohq/design-system-scroll-area" "^0.1.18" "@mirohq/design-system-stitches" "^2.4.1" @@ -843,23 +843,23 @@ "@mirohq/design-tokens" "^3.6.0" lodash.merge "^4.6.2" -"@mirohq/design-system-styles@^1.1.15": - version "1.1.15" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-styles/-/design-system-styles-1.1.15.tgz#4048f777f2b551d659dd76e968741242a7fcf6d9" - integrity sha512-96WiCcTGFgmdKMykhdNIIwI/Hbe65MW56hkFJ2gEq/9rxRrlX01Bs7pLDcFcHFfmNRZJ2If121WbYY6D4HUbzw== +"@mirohq/design-system-styles@^1.1.16": + version "1.1.16" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-styles/-/design-system-styles-1.1.16.tgz#8d4e66bcd2a601ebd56312a701e8084d27dbd67a" + integrity sha512-qOoRx69dltu6AsZk3JSgXLXob4pxtv28SJyMdxPqzqdhvaGnlU6hqMHifh7vylNzOCQB9z/i6K5GRe0HGNhcWw== dependencies: "@mirohq/design-system-stitches" "^2.4.1" "@mirohq/design-tokens" "^3.6.0" what-input "^5.2.11" -"@mirohq/design-system-switch@^3.0.24": - version "3.0.24" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-switch/-/design-system-switch-3.0.24.tgz#812f12092c8098e2835d8cc93f17c0f224cceb97" - integrity sha512-fuj4+lAf6XJDnm8L5KMNL1Oj63jxVp3q/RhIrIV/sWhVTpCsjg7mUZHIc1KFvEsUdEkhoSDFEkMtCMpWiT3uow== +"@mirohq/design-system-switch@^3.0.25": + version "3.0.25" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-switch/-/design-system-switch-3.0.25.tgz#e30a3e989a7e379b19adca6a0ca3dd44921acc52" + integrity sha512-405WBus8nRBa+xRXuSy5LbROvIyQkTeRqYQrkI7slEDuNiMSSn6azu5rGLAn6HdZ5BF9txflCIL2/aC7SUkUCQ== dependencies: "@mirohq/design-system-base-switch" "^0.1.16" "@mirohq/design-system-stitches" "^2.4.1" - "@mirohq/design-system-styles" "^1.1.15" + "@mirohq/design-system-styles" "^1.1.16" "@mirohq/design-system-types" "^0.6.2" "@mirohq/design-system-utils" "^0.14.3" "@radix-ui/react-switch" "^1.0.0" @@ -881,25 +881,25 @@ dependencies: "@mirohq/design-tokens" "^3.6.0" -"@mirohq/design-system-toolbar@^2.4.8": - version "2.4.8" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-toolbar/-/design-system-toolbar-2.4.8.tgz#d91be7f90da3977a31efb8515efaba2d18cb9577" - integrity sha512-JYnqxYxaymi+mmDep7c8hCKeSghfPvPA0jQ70qAeexCTXjI49B2fSWSs8khTX7nwnC8lb2JhI8Su/zItsy6efw== +"@mirohq/design-system-toolbar@^2.4.9": + version "2.4.9" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-toolbar/-/design-system-toolbar-2.4.9.tgz#841861d1633418893ce8503be876efdb86583647" + integrity sha512-a42YXB1ecC5ntuNG0fTVs3mu8fuKeyehZ+nLlv7qmbx8cGNkXI0AZkfNY7Yx42/FCburUFqvCp3+VG2MkWCSsg== dependencies: "@mirohq/design-system-stitches" "^2.4.1" - "@mirohq/design-system-styles" "^1.1.15" + "@mirohq/design-system-styles" "^1.1.16" "@radix-ui/react-toolbar" "^1.0.0" "@react-aria/interactions" "^3.13.0" "@react-aria/utils" "^3.13.0" "@react-types/shared" "^3.16.0" -"@mirohq/design-system-tooltip@^3.2.33": - version "3.2.33" - resolved "https://registry.yarnpkg.com/@mirohq/design-system-tooltip/-/design-system-tooltip-3.2.33.tgz#04872869b0f2e79a5a324ca6d5b11d7133f6131f" - integrity sha512-f8nFytjUCulAGZjSS9jfsThZ+b+Xi8e0ACnZtbu5nlS4uSK26D6DUtqY444b0u8cphKfJTckcEemvzKkNtHDkw== +"@mirohq/design-system-tooltip@^3.2.34": + version "3.2.34" + resolved "https://registry.yarnpkg.com/@mirohq/design-system-tooltip/-/design-system-tooltip-3.2.34.tgz#af362a6ed017ba786b1b6accf10af69773425428" + integrity sha512-fHHOIp3OwajDP8dTQcI7INXmRLKveov1WahV/quEC5AKkcMlRuHC0YM9Sqa0MEJNO+cGGlKnSIuLrClxkKKyjg== dependencies: "@mirohq/design-system-stitches" "^2.4.1" - "@mirohq/design-system-styles" "^1.1.15" + "@mirohq/design-system-styles" "^1.1.16" "@mirohq/design-system-utils" "^0.14.3" "@mirohq/design-tokens" "^3.6.0" "@radix-ui/react-tooltip" "^1.0.3" @@ -991,35 +991,35 @@ dependencies: "@mirohq/design-system-types" "^0.6.2" -"@mirohq/design-system@^0.18.1": - version "0.18.1" - resolved "https://registry.yarnpkg.com/@mirohq/design-system/-/design-system-0.18.1.tgz#3e3957a5a240faa6a8b829c73cc544f1fe422805" - integrity sha512-HYvBh+UlRp6Zsb4sBHs5LB+1RItVRonM5vF1xUYHdNiNHb+P3eCEBvODntEtlYIX60O+3lC8R8hNpqlhO0idTQ== +"@mirohq/design-system@^0.18.2": + version "0.18.2" + resolved "https://registry.yarnpkg.com/@mirohq/design-system/-/design-system-0.18.2.tgz#923d2b9809f24e6f66c29be864ef74cc7d14b694" + integrity sha512-+Rv5O22DDhU5dhBPgqvy9KsSeGSrzReeYj2XKKMyA5B0d7DKlZTWKPx6hVi7vLB/IWn5C8axqVTf4mnBxBf5ig== dependencies: "@mirohq/design-system-badge" "^0.3.26" "@mirohq/design-system-box" "^2.1.27" - "@mirohq/design-system-button" "^3.1.27" - "@mirohq/design-system-calendar" "^0.1.42" - "@mirohq/design-system-checkbox" "^1.1.59" - "@mirohq/design-system-dropdown-menu" "^3.5.22" + "@mirohq/design-system-button" "^3.1.28" + "@mirohq/design-system-calendar" "^0.1.43" + "@mirohq/design-system-checkbox" "^1.1.60" + "@mirohq/design-system-dropdown-menu" "^3.5.23" "@mirohq/design-system-flex" "^2.1.31" "@mirohq/design-system-grid" "^2.1.30" - "@mirohq/design-system-icon-button" "^1.3.21" - "@mirohq/design-system-icons" "^0.32.3" - "@mirohq/design-system-input" "^0.0.2" - "@mirohq/design-system-link" "^1.3.8" - "@mirohq/design-system-popover" "^5.1.7" + "@mirohq/design-system-icon-button" "^1.3.22" + "@mirohq/design-system-icons" "^0.32.4" + "@mirohq/design-system-input" "^0.0.3" + "@mirohq/design-system-link" "^1.3.9" + "@mirohq/design-system-popover" "^5.1.8" "@mirohq/design-system-primitive" "^1.1.1" "@mirohq/design-system-scroll-area" "^0.1.18" - "@mirohq/design-system-select" "^0.2.2" + "@mirohq/design-system-select" "^0.2.3" "@mirohq/design-system-spinner" "^1.1.30" "@mirohq/design-system-stitches" "^2.4.1" - "@mirohq/design-system-styles" "^1.1.15" - "@mirohq/design-system-switch" "^3.0.24" + "@mirohq/design-system-styles" "^1.1.16" + "@mirohq/design-system-switch" "^3.0.25" "@mirohq/design-system-theme-provider" "^0.3.8" "@mirohq/design-system-themes" "^0.5.4" - "@mirohq/design-system-toolbar" "^2.4.8" - "@mirohq/design-system-tooltip" "^3.2.33" + "@mirohq/design-system-toolbar" "^2.4.9" + "@mirohq/design-system-tooltip" "^3.2.34" "@mirohq/design-system-types" "^0.6.2" "@mirohq/design-system-typography" "^0.4.6" "@mirohq/design-system-use-clipboard" "^0.1.1" @@ -1064,13 +1064,6 @@ node-fetch "^2.6.9" typedoc "0.23.24" -"@mirohq/websdk-types@2.9.10": - version "2.9.10" - resolved "https://registry.yarnpkg.com/@mirohq/websdk-types/-/websdk-types-2.9.10.tgz#b85c8097b27aa6885642bb957a2c14faf133690c" - integrity sha512-1uLw/SykIoTZf7Pl9eSgzE13puaMtNlVKuB/wRBUEAWAAUkcT3ppSoCHod7EemntDDJhcKEscwRigEmTCJftsw== - dependencies: - typescript ">=4.6.3 || ~5" - "@mirohq/websdk-types@^2.0.0": version "2.3.0" resolved "https://registry.npmjs.org/@mirohq/websdk-types/-/websdk-types-2.3.0.tgz" From 8bfb7bd6ddcf7dddba632d2c949c7c09b0210bb3 Mon Sep 17 00:00:00 2001 From: Frederico Estrela Gaiva Date: Wed, 29 Nov 2023 12:01:10 +0100 Subject: [PATCH 32/33] PF-1391 - Runs prettier --- examples/breakout-rooms/README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/examples/breakout-rooms/README.md b/examples/breakout-rooms/README.md index 378905e3a..393d2454d 100644 --- a/examples/breakout-rooms/README.md +++ b/examples/breakout-rooms/README.md @@ -4,10 +4,8 @@ This example shows you how leverage collaborative and real-time features, includ # 👨🏻‍💻 App Demo - https://github.com/miroapp/app-examples/assets/7162412/e03987e3-f85b-48ab-86b8-f4314c3c5e76 - # 📒 Table of Contents - [Included Features](#features) From e2b1502db1a4ea89e0bb61dea02780e1b44f3983 Mon Sep 17 00:00:00 2001 From: Frederico Estrela Gaiva Date: Wed, 29 Nov 2023 12:03:20 +0100 Subject: [PATCH 33/33] PF-1391 - Bump package --- yarn.lock | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/yarn.lock b/yarn.lock index 1a71a914f..945aa782e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1064,6 +1064,13 @@ node-fetch "^2.6.9" typedoc "0.23.24" +"@mirohq/websdk-types@2.9.10": + version "2.9.10" + resolved "https://registry.yarnpkg.com/@mirohq/websdk-types/-/websdk-types-2.9.10.tgz#b85c8097b27aa6885642bb957a2c14faf133690c" + integrity sha512-1uLw/SykIoTZf7Pl9eSgzE13puaMtNlVKuB/wRBUEAWAAUkcT3ppSoCHod7EemntDDJhcKEscwRigEmTCJftsw== + dependencies: + typescript ">=4.6.3 || ~5" + "@mirohq/websdk-types@^2.0.0": version "2.3.0" resolved "https://registry.npmjs.org/@mirohq/websdk-types/-/websdk-types-2.3.0.tgz"