From 8bb193686f9288f180f0819f22742a6ddc576109 Mon Sep 17 00:00:00 2001 From: "devin-ai-integration[bot]" <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Thu, 5 Mar 2026 10:59:42 +0000 Subject: [PATCH 1/7] Add `nextjs-comments-ag-grid` example with AG Grid commenting (#3146) Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: Chris Nicholas --- examples/nextjs-comments-ag-grid/.envrc | 2 + examples/nextjs-comments-ag-grid/.gitignore | 10 + examples/nextjs-comments-ag-grid/.prettierrc | 11 + examples/nextjs-comments-ag-grid/README.md | 43 + .../app/CellThreadContext.tsx | 38 + .../app/CollaborativeApp.tsx | 105 + .../app/CommentCell.tsx | 97 + .../nextjs-comments-ag-grid/app/Loading.tsx | 18 + .../nextjs-comments-ag-grid/app/Providers.tsx | 35 + examples/nextjs-comments-ag-grid/app/Room.tsx | 31 + .../app/api/liveblocks-auth/route.ts | 28 + .../app/api/users/route.ts | 20 + .../app/api/users/search/route.ts | 20 + .../nextjs-comments-ag-grid/app/globals.css | 63 + .../nextjs-comments-ag-grid/app/layout.tsx | 40 + examples/nextjs-comments-ag-grid/app/page.tsx | 10 + examples/nextjs-comments-ag-grid/database.ts | 78 + examples/nextjs-comments-ag-grid/example.ts | 32 + .../liveblocks.config.ts | 19 + .../nextjs-comments-ag-grid/package-lock.json | 3144 +++++++++++++++++ examples/nextjs-comments-ag-grid/package.json | 28 + .../nextjs-comments-ag-grid/tsconfig.json | 37 + 22 files changed, 3909 insertions(+) create mode 100644 examples/nextjs-comments-ag-grid/.envrc create mode 100644 examples/nextjs-comments-ag-grid/.gitignore create mode 100644 examples/nextjs-comments-ag-grid/.prettierrc create mode 100644 examples/nextjs-comments-ag-grid/README.md create mode 100644 examples/nextjs-comments-ag-grid/app/CellThreadContext.tsx create mode 100644 examples/nextjs-comments-ag-grid/app/CollaborativeApp.tsx create mode 100644 examples/nextjs-comments-ag-grid/app/CommentCell.tsx create mode 100644 examples/nextjs-comments-ag-grid/app/Loading.tsx create mode 100644 examples/nextjs-comments-ag-grid/app/Providers.tsx create mode 100644 examples/nextjs-comments-ag-grid/app/Room.tsx create mode 100644 examples/nextjs-comments-ag-grid/app/api/liveblocks-auth/route.ts create mode 100644 examples/nextjs-comments-ag-grid/app/api/users/route.ts create mode 100644 examples/nextjs-comments-ag-grid/app/api/users/search/route.ts create mode 100644 examples/nextjs-comments-ag-grid/app/globals.css create mode 100644 examples/nextjs-comments-ag-grid/app/layout.tsx create mode 100644 examples/nextjs-comments-ag-grid/app/page.tsx create mode 100644 examples/nextjs-comments-ag-grid/database.ts create mode 100644 examples/nextjs-comments-ag-grid/example.ts create mode 100644 examples/nextjs-comments-ag-grid/liveblocks.config.ts create mode 100644 examples/nextjs-comments-ag-grid/package-lock.json create mode 100644 examples/nextjs-comments-ag-grid/package.json create mode 100644 examples/nextjs-comments-ag-grid/tsconfig.json diff --git a/examples/nextjs-comments-ag-grid/.envrc b/examples/nextjs-comments-ag-grid/.envrc new file mode 100644 index 0000000000..4ae3897126 --- /dev/null +++ b/examples/nextjs-comments-ag-grid/.envrc @@ -0,0 +1,2 @@ +source_up +layout node diff --git a/examples/nextjs-comments-ag-grid/.gitignore b/examples/nextjs-comments-ag-grid/.gitignore new file mode 100644 index 0000000000..7aa302d064 --- /dev/null +++ b/examples/nextjs-comments-ag-grid/.gitignore @@ -0,0 +1,10 @@ +.DS_Store +node_modules +.env +.env.* +!.env.example +*.tsbuildinfo +.vercel +.next +out +next-env.d.ts \ No newline at end of file diff --git a/examples/nextjs-comments-ag-grid/.prettierrc b/examples/nextjs-comments-ag-grid/.prettierrc new file mode 100644 index 0000000000..0699872430 --- /dev/null +++ b/examples/nextjs-comments-ag-grid/.prettierrc @@ -0,0 +1,11 @@ +{ + "semi": true, + "tabWidth": 2, + "useTabs": false, + "singleQuote": false, + "jsxSingleQuote": false, + "arrowParens": "always", + "bracketSpacing": true, + "bracketSameLine": false, + "trailingComma": "es5" +} diff --git a/examples/nextjs-comments-ag-grid/README.md b/examples/nextjs-comments-ag-grid/README.md new file mode 100644 index 0000000000..abedb20f7b --- /dev/null +++ b/examples/nextjs-comments-ag-grid/README.md @@ -0,0 +1,43 @@ +

+ + Liveblocks + + + Liveblocks + +

+ +# AG Grid commenting + +

+ React + Next.js +

+ +This example shows how to build AG Grid commenting with [Liveblocks](https://liveblocks.io), [AG Grid](https://www.ag-grid.com/), and [Next.js](https://nextjs.org/). + +## Getting started + +Run the following command to try this example locally: + +```bash +npx create-liveblocks-app@latest --example nextjs-comments-ag-grid --api-key +``` + +This will download the example and ask permission to open your browser, enabling you to automatically get your API key from your [liveblocks.io](https://liveblocks.io) account. + +### Manual setup + +
Read more + +

+ +Alternatively, you can set up your project manually: + +- Install all dependencies with `npm install` +- Create an account on [liveblocks.io](https://liveblocks.io/dashboard) +- Copy your **secret** key from the [dashboard](https://liveblocks.io/dashboard/apikeys) +- Create an `.env.local` file and add your **secret** key as the `LIVEBLOCKS_SECRET_KEY` environment variable +- Run `npm run dev` and go to [http://localhost:3000](http://localhost:3000) + +
diff --git a/examples/nextjs-comments-ag-grid/app/CellThreadContext.tsx b/examples/nextjs-comments-ag-grid/app/CellThreadContext.tsx new file mode 100644 index 0000000000..c53237f40a --- /dev/null +++ b/examples/nextjs-comments-ag-grid/app/CellThreadContext.tsx @@ -0,0 +1,38 @@ +"use client"; + +import { useState, createContext, useContext } from "react"; +import { useThreads } from "@liveblocks/react/suspense"; +import { ThreadData } from "@liveblocks/client"; + +export type OpenCell = { rowId: string; columnId: string } | null; + +type CellThreadContextValue = { + threads: ThreadData[]; + openCell: OpenCell; + setOpenCell: (openCell: OpenCell) => void; +}; + +const CellThreadContext = createContext(null); + +export function CellThreadProvider({ + children, +}: { + children: React.ReactNode; +}) { + const { threads } = useThreads(); + const [openCell, setOpenCell] = useState(null); + + return ( + + {children} + + ); +} + +export function useCellThread(): CellThreadContextValue { + const context = useContext(CellThreadContext); + if (!context) { + throw new Error("useCellThread must be used within CellThreadProvider"); + } + return context; +} diff --git a/examples/nextjs-comments-ag-grid/app/CollaborativeApp.tsx b/examples/nextjs-comments-ag-grid/app/CollaborativeApp.tsx new file mode 100644 index 0000000000..4823db35a1 --- /dev/null +++ b/examples/nextjs-comments-ag-grid/app/CollaborativeApp.tsx @@ -0,0 +1,105 @@ +"use client"; + +import { useState, useMemo } from "react"; +import { AllCommunityModule } from "ag-grid-community"; +import { AgGridProvider, AgGridReact } from "ag-grid-react"; +import { CellThreadProvider } from "./CellThreadContext"; +import { CommentCell } from "./CommentCell"; + +const modules = [AllCommunityModule]; + +type RowData = { + id: string; + name: string; + time: string; + room: string; + duration: string; +}; + +const ROW_DATA: RowData[] = [ + { + id: "1", + name: "Kickoff & roadmap", + time: "9:00 AM", + room: "Main", + duration: "1 hr", + }, + { + id: "2", + name: "Design review", + time: "10:30 AM", + room: "Studio A", + duration: "45 min", + }, + { + id: "3", + name: "Eng standup", + time: "11:00 AM", + room: "Zoom", + duration: "15 min", + }, + { + id: "4", + name: "Customer call", + time: "2:00 PM", + room: "Conference B", + duration: "1 hr", + }, + { + id: "5", + name: "Retrospective", + time: "4:00 PM", + room: "Main", + duration: "1 hr", + }, +]; + +export function CollaborativeApp() { + // Table data + const [rowData, setRowData] = useState(ROW_DATA); + + // Defining the columns + const [colDefs, setColDefs] = useState<{ field: keyof RowData }[]>([ + { field: "name" }, + { field: "time" }, + { field: "room" }, + { field: "duration" }, + ]); + + // Importing our CommentCell component to allow adding comments to cells + const defaultColDef = useMemo( + () => ({ + cellRenderer: CommentCell, + }), + [] + ); + + return ( +
+ + +
+ params.data.id} + /> +
+
+
+
+ ); +} diff --git a/examples/nextjs-comments-ag-grid/app/CommentCell.tsx b/examples/nextjs-comments-ag-grid/app/CommentCell.tsx new file mode 100644 index 0000000000..9e4aa2e547 --- /dev/null +++ b/examples/nextjs-comments-ag-grid/app/CommentCell.tsx @@ -0,0 +1,97 @@ +"use client"; + +import { + Comment, + FloatingComposer, + FloatingThread, +} from "@liveblocks/react-ui"; +import { CustomCellRendererProps } from "ag-grid-react"; +import { useCellThread } from "./CellThreadContext"; + +export function CommentCell(params: CustomCellRendererProps) { + const { threads, openCell, setOpenCell } = useCellThread(); + + const rowId = params.data?.id; + const columnId = params.colDef?.field; + + if (!rowId || !columnId) { + return null; + } + + // Check if there's already a thread for this cell + const thread = threads.find( + ({ metadata }) => metadata.rowId === rowId && metadata.columnId === columnId + ); + + // When a thread is created, open it by default + const defaultOpen = + openCell !== null && + openCell.rowId === rowId && + openCell.columnId === columnId; + + const metadata = { rowId, columnId }; + + return ( +
+ {/* Cell contents */} + {params.value} + + {/* Show thread if it exists, otherwise show thread composer (plus on hover) */} + {!thread ? ( +
+ setOpenCell(metadata)} + style={{ zIndex: 10 }} + > + + +
+ ) : ( + { + if (!isOpen && defaultOpen) { + setOpenCell(null); + } + }} + onComposerSubmit={() => setOpenCell(metadata)} + style={{ zIndex: 10 }} + autoFocus + > + + + )} +
+ ); +} diff --git a/examples/nextjs-comments-ag-grid/app/Loading.tsx b/examples/nextjs-comments-ag-grid/app/Loading.tsx new file mode 100644 index 0000000000..6cdd3e39a8 --- /dev/null +++ b/examples/nextjs-comments-ag-grid/app/Loading.tsx @@ -0,0 +1,18 @@ +export function Loading() { + return ( +
+ Loading +
+ ); +} diff --git a/examples/nextjs-comments-ag-grid/app/Providers.tsx b/examples/nextjs-comments-ag-grid/app/Providers.tsx new file mode 100644 index 0000000000..0524bece50 --- /dev/null +++ b/examples/nextjs-comments-ag-grid/app/Providers.tsx @@ -0,0 +1,35 @@ +"use client"; + +import { LiveblocksProvider } from "@liveblocks/react"; +import { PropsWithChildren } from "react"; + +export function Providers({ children }: PropsWithChildren) { + return ( + { + const searchParams = new URLSearchParams( + userIds.map((userId) => ["userIds", userId]) + ); + const response = await fetch(`/api/users?${searchParams}`); + if (!response.ok) { + throw new Error("Problem resolving users"); + } + const users = await response.json(); + return users; + }} + resolveMentionSuggestions={async ({ text }) => { + const response = await fetch( + `/api/users/search?text=${encodeURIComponent(text)}` + ); + if (!response.ok) { + throw new Error("Problem resolving mention suggestions"); + } + const userIds = await response.json(); + return userIds; + }} + > + {children} + + ); +} diff --git a/examples/nextjs-comments-ag-grid/app/Room.tsx b/examples/nextjs-comments-ag-grid/app/Room.tsx new file mode 100644 index 0000000000..19ce0ec558 --- /dev/null +++ b/examples/nextjs-comments-ag-grid/app/Room.tsx @@ -0,0 +1,31 @@ +"use client"; + +import { ReactNode, useMemo } from "react"; +import { useSearchParams } from "next/navigation"; +import { RoomProvider, ClientSideSuspense } from "@liveblocks/react/suspense"; +import { Loading } from "./Loading"; + +export function Room({ children }: { children: ReactNode }) { + const roomId = useExampleRoomId( + "liveblocks:examples:nextjs-comments-ag-grid" + ); + + return ( + + }>{children} + + ); +} + +/** + * This function is used when deploying an example on liveblocks.io. + * You can ignore it completely if you run the example locally. + */ +function useExampleRoomId(roomId: string) { + const params = useSearchParams(); + const exampleId = params?.get("exampleId"); + + return useMemo(() => { + return exampleId ? `${roomId}-${exampleId}` : roomId; + }, [roomId, exampleId]); +} diff --git a/examples/nextjs-comments-ag-grid/app/api/liveblocks-auth/route.ts b/examples/nextjs-comments-ag-grid/app/api/liveblocks-auth/route.ts new file mode 100644 index 0000000000..4b39020756 --- /dev/null +++ b/examples/nextjs-comments-ag-grid/app/api/liveblocks-auth/route.ts @@ -0,0 +1,28 @@ +import { Liveblocks } from "@liveblocks/node"; +import { getSession } from "../../../example"; + +/** + * Authenticating your Liveblocks application + * https://liveblocks.io/docs/authentication + */ + +const liveblocks = new Liveblocks({ + secret: process.env.LIVEBLOCKS_SECRET_KEY!, +}); + +export async function POST(request: Request) { + // Get the current user's unique id and info from your database + const user = await getSession(request); + + // Create a Liveblocks session for the current user + // userInfo is made available in Liveblocks presence hooks, e.g. useOthers + const session = liveblocks.prepareSession(user.id, { + userInfo: user.info, + }); + + // Use a naming pattern to allow access to rooms with a wildcard + session.allow(`liveblocks:examples:*`, session.FULL_ACCESS); + + const { status, body } = await session.authorize(); + return new Response(body, { status }); +} diff --git a/examples/nextjs-comments-ag-grid/app/api/users/route.ts b/examples/nextjs-comments-ag-grid/app/api/users/route.ts new file mode 100644 index 0000000000..5d55da2c2b --- /dev/null +++ b/examples/nextjs-comments-ag-grid/app/api/users/route.ts @@ -0,0 +1,20 @@ +import { NextRequest, NextResponse } from "next/server"; +import { getUser } from "../../../database"; + +/** + * Returns user info for the given user IDs + * For `resolveUsers` in Room.tsx + */ + +export async function GET(request: NextRequest) { + const { searchParams } = new URL(request.url); + const userIds = searchParams.getAll("userIds"); + + if (!userIds || !Array.isArray(userIds)) { + return new NextResponse("Missing or invalid userIds", { status: 400 }); + } + + return NextResponse.json( + userIds.map((userId) => getUser(userId)?.info ?? null) + ); +} diff --git a/examples/nextjs-comments-ag-grid/app/api/users/search/route.ts b/examples/nextjs-comments-ag-grid/app/api/users/search/route.ts new file mode 100644 index 0000000000..9c649fa86d --- /dev/null +++ b/examples/nextjs-comments-ag-grid/app/api/users/search/route.ts @@ -0,0 +1,20 @@ +import { NextRequest, NextResponse } from "next/server"; +import { getUsers } from "../../../../database"; + +/** + * Returns a list of user IDs from a partial search input + * For `resolveMentionSuggestions` in liveblocks.config.ts + */ + +export async function GET(request: NextRequest) { + const { searchParams } = new URL(request.url); + const text = searchParams.get("text") as string; + + const filteredUserIds = getUsers() + .filter((user) => { + return user.info.name.toLowerCase().includes(text.toLowerCase()); + }) + .map((user) => user.id); + + return NextResponse.json(filteredUserIds); +} diff --git a/examples/nextjs-comments-ag-grid/app/globals.css b/examples/nextjs-comments-ag-grid/app/globals.css new file mode 100644 index 0000000000..177ce92c58 --- /dev/null +++ b/examples/nextjs-comments-ag-grid/app/globals.css @@ -0,0 +1,63 @@ +@import "@liveblocks/react-ui/styles.css"; +@import "@liveblocks/react-ui/styles/dark/media-query.css"; + +html, +body { + background: #f3f3f3; + padding: 0; + margin: 0; + font-family: + -apple-system, + BlinkMacSystemFont, + Segoe UI, + Roboto, + Oxygen, + Ubuntu, + Cantarell, + Fira Sans, + Droid Sans, + Helvetica Neue, + sans-serif; +} + +* { + box-sizing: border-box; +} + +button { + appearance: none; + border: 0; + background: none; +} + +.lb-root { + --lb-accent: var(--ag-accent-color, #2196f3); +} + +/* Comment cell: plus trigger is hidden until row/cell is hovered */ +.comment-cell-trigger { + opacity: 0; + transition: opacity 0.15s ease; +} +.comment-cell:hover .comment-cell-trigger { + opacity: 1; +} + +/* Style the plus (add comment) trigger here */ +.comment-cell-trigger button { + border-radius: 100%; + background: #ddf0ff; + padding-top: 0px; + appearance: none; + height: 28px; + width: 28px; + border: 0; + display: flex; + align-items: center; + justify-content: center; + color: #111c26; +} + +.lb-portal { + z-index: 10; +} diff --git a/examples/nextjs-comments-ag-grid/app/layout.tsx b/examples/nextjs-comments-ag-grid/app/layout.tsx new file mode 100644 index 0000000000..e322d36b96 --- /dev/null +++ b/examples/nextjs-comments-ag-grid/app/layout.tsx @@ -0,0 +1,40 @@ +import "./globals.css"; +import "@liveblocks/react-ui/styles.css"; +import "@liveblocks/react-ui/styles/dark/media-query.css"; +import { Providers } from "./Providers"; +import { Suspense } from "react"; + +export const metadata = { + title: "Liveblocks", +}; + +export default function RootLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( + + + + + + + + + {children} + + + + ); +} diff --git a/examples/nextjs-comments-ag-grid/app/page.tsx b/examples/nextjs-comments-ag-grid/app/page.tsx new file mode 100644 index 0000000000..7e9af5e85f --- /dev/null +++ b/examples/nextjs-comments-ag-grid/app/page.tsx @@ -0,0 +1,10 @@ +import { Room } from "./Room"; +import { CollaborativeApp } from "./CollaborativeApp"; + +export default function Page() { + return ( + + + + ); +} diff --git a/examples/nextjs-comments-ag-grid/database.ts b/examples/nextjs-comments-ag-grid/database.ts new file mode 100644 index 0000000000..940e1d4f19 --- /dev/null +++ b/examples/nextjs-comments-ag-grid/database.ts @@ -0,0 +1,78 @@ +const USER_INFO: Liveblocks["UserMeta"][] = [ + { + id: "charlie.layne@example.com", + info: { + name: "Charlie Layne", + color: "#D583F0", + avatar: "https://liveblocks.io/avatars/avatar-1.png", + }, + }, + { + id: "mislav.abha@example.com", + info: { + name: "Mislav Abha", + color: "#F08385", + avatar: "https://liveblocks.io/avatars/avatar-2.png", + }, + }, + { + id: "tatum.paolo@example.com", + info: { + name: "Tatum Paolo", + color: "#F0D885", + avatar: "https://liveblocks.io/avatars/avatar-3.png", + }, + }, + { + id: "anjali.wanda@example.com", + info: { + name: "Anjali Wanda", + color: "#85EED6", + avatar: "https://liveblocks.io/avatars/avatar-4.png", + }, + }, + { + id: "jody.hekla@example.com", + info: { + name: "Jody Hekla", + color: "#85BBF0", + avatar: "https://liveblocks.io/avatars/avatar-5.png", + }, + }, + { + id: "emil.joyce@example.com", + info: { + name: "Emil Joyce", + color: "#8594F0", + avatar: "https://liveblocks.io/avatars/avatar-6.png", + }, + }, + { + id: "jory.quispe@example.com", + info: { + name: "Jory Quispe", + color: "#85DBF0", + avatar: "https://liveblocks.io/avatars/avatar-7.png", + }, + }, + { + id: "quinn.elton@example.com", + info: { + name: "Quinn Elton", + color: "#87EE85", + avatar: "https://liveblocks.io/avatars/avatar-8.png", + }, + }, +]; + +export function getRandomUser() { + return USER_INFO[Math.floor(Math.random() * 10) % USER_INFO.length]; +} + +export function getUser(id: string) { + return USER_INFO.find((u) => u.id === id) || null; +} + +export function getUsers() { + return USER_INFO; +} diff --git a/examples/nextjs-comments-ag-grid/example.ts b/examples/nextjs-comments-ag-grid/example.ts new file mode 100644 index 0000000000..5cf314ad45 --- /dev/null +++ b/examples/nextjs-comments-ag-grid/example.ts @@ -0,0 +1,32 @@ +import { getUser, getRandomUser } from "./database"; + +/** + * These utilities are used when deploying an example on liveblocks.io. + * You can ignore them completely if you run the example locally. + */ + +export function authWithRandomUser(endpoint: string) { + return async (room?: string) => { + const response = await fetch(endpoint, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ room, userId: getRandomUser().id }), + }); + return await response.json(); + }; +} + +export async function getSession(request: Request) { + const { userId } = (await request.json().catch(() => ({}))) as { + userId?: string; + }; + const user = userId ? getUser(userId) : getRandomUser(); + + if (!user) { + throw new Error("User not found"); + } + + return user; +} diff --git a/examples/nextjs-comments-ag-grid/liveblocks.config.ts b/examples/nextjs-comments-ag-grid/liveblocks.config.ts new file mode 100644 index 0000000000..7cbc46f43e --- /dev/null +++ b/examples/nextjs-comments-ag-grid/liveblocks.config.ts @@ -0,0 +1,19 @@ +declare global { + interface Liveblocks { + // Custom user info set when authenticating with a secret key + UserMeta: { + id: string; + info: { + name: string; + color: string; + avatar: string; + }; + }; + ThreadMetadata: { + rowId: string; + columnId: string; + }; + } +} + +export {}; diff --git a/examples/nextjs-comments-ag-grid/package-lock.json b/examples/nextjs-comments-ag-grid/package-lock.json new file mode 100644 index 0000000000..5525f3cf47 --- /dev/null +++ b/examples/nextjs-comments-ag-grid/package-lock.json @@ -0,0 +1,3144 @@ +{ + "name": "@liveblocks-examples/nextjs-comments-ag-grid", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@liveblocks-examples/nextjs-comments-ag-grid", + "license": "Apache-2.0", + "dependencies": { + "@liveblocks/client": "^3.15.0-rc1", + "@liveblocks/node": "^3.15.0-rc1", + "@liveblocks/react": "^3.15.0-rc1", + "@liveblocks/react-ui": "^3.15.0-rc1", + "ag-grid-community": "^35.1.0", + "ag-grid-react": "^35.1.0", + "next": "^16.1.6", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/node": "^20.0.0", + "@types/react": "^18.3.3", + "prettier": "^3.3.2", + "typescript": "^5.4.5" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", + "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", + "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.5", + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.8.tgz", + "integrity": "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.6" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", + "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", + "license": "MIT" + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@juggle/resize-observer": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", + "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==", + "license": "Apache-2.0" + }, + "node_modules/@liveblocks/client": { + "version": "3.15.0-rc1", + "resolved": "https://registry.npmjs.org/@liveblocks/client/-/client-3.15.0-rc1.tgz", + "integrity": "sha512-SmMpegEmd4XWbPs9CRDniv3GNVkGjXO1FlpVhCP4xZMLCtyWLTMdAIfxgwIRzRHhWQKzSn0W4XryXWNN/Hknzg==", + "license": "Apache-2.0", + "dependencies": { + "@liveblocks/core": "3.15.0-rc1" + } + }, + "node_modules/@liveblocks/core": { + "version": "3.15.0-rc1", + "resolved": "https://registry.npmjs.org/@liveblocks/core/-/core-3.15.0-rc1.tgz", + "integrity": "sha512-B88HJ974l0V1oteSH+fePTGCx3jUHvU2CAEB+pKGQjV4SOr6XcHJkLd5kRULVGLDhl6xBveqzxHhH7UXRK+MHg==", + "license": "Apache-2.0", + "peerDependencies": { + "@types/json-schema": "^7" + } + }, + "node_modules/@liveblocks/node": { + "version": "3.15.0-rc1", + "resolved": "https://registry.npmjs.org/@liveblocks/node/-/node-3.15.0-rc1.tgz", + "integrity": "sha512-hc52BJVkX9nXvtTnqYhSD0H/y4a5p5MSyC0LFpDT061SDQixxZZp5vfHbOT61knhQGE9Q3FoTVliGqUrYPczMA==", + "license": "Apache-2.0", + "dependencies": { + "@liveblocks/core": "3.15.0-rc1", + "@stablelib/base64": "^1.0.1", + "fast-sha256": "^1.3.0", + "node-fetch": "^2.6.1" + } + }, + "node_modules/@liveblocks/react": { + "version": "3.15.0-rc1", + "resolved": "https://registry.npmjs.org/@liveblocks/react/-/react-3.15.0-rc1.tgz", + "integrity": "sha512-F3X3QTH896Kj+ohRjWjbETb82dIYDfApJEsoU5ruwF9Omx/hn9A/PYdb8PQ/vNhVt2R7FtesN/mnA3pJugyq7w==", + "license": "Apache-2.0", + "dependencies": { + "@liveblocks/client": "3.15.0-rc1", + "@liveblocks/core": "3.15.0-rc1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^18 || ^19 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui": { + "version": "3.15.0-rc1", + "resolved": "https://registry.npmjs.org/@liveblocks/react-ui/-/react-ui-3.15.0-rc1.tgz", + "integrity": "sha512-qX7FMROa/vMbjNriWvOFKo3uUAGfCeHssiMeCegkR7CpJNFAL0pUiAZMkrzs5Vf3/AyU9JaKkhu9FujavJlhRA==", + "license": "Apache-2.0", + "dependencies": { + "@floating-ui/react-dom": "^2.1.0", + "@liveblocks/client": "3.15.0-rc1", + "@liveblocks/core": "3.15.0-rc1", + "@liveblocks/react": "3.15.0-rc1", + "frimousse": "^0.2.0", + "marked": "^15.0.11", + "radix-ui": "^1.4.0", + "slate": "^0.110.2", + "slate-history": "^0.110.3", + "slate-hyperscript": "^0.100.0", + "slate-react": "^0.110.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^18 || ^19 || ^19.0.0-rc", + "react-dom": "^18 || ^19 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/radix-ui/-/radix-ui-1.4.3.tgz", + "integrity": "sha512-aWizCQiyeAenIdUbqEpXgRA1ya65P13NKn/W8rWkcN0OPkRDxdBVLWnIEDsS2RpwCK2nobI7oMUSmexzTDyAmA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-accessible-icon": "1.1.7", + "@radix-ui/react-accordion": "1.2.12", + "@radix-ui/react-alert-dialog": "1.1.15", + "@radix-ui/react-arrow": "1.1.7", + "@radix-ui/react-aspect-ratio": "1.1.7", + "@radix-ui/react-avatar": "1.1.10", + "@radix-ui/react-checkbox": "1.3.3", + "@radix-ui/react-collapsible": "1.1.12", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-context-menu": "2.2.16", + "@radix-ui/react-dialog": "1.1.15", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-dropdown-menu": "2.1.16", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-form": "0.1.8", + "@radix-ui/react-hover-card": "1.1.15", + "@radix-ui/react-label": "2.1.7", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-menubar": "1.1.16", + "@radix-ui/react-navigation-menu": "1.2.14", + "@radix-ui/react-one-time-password-field": "0.1.8", + "@radix-ui/react-password-toggle-field": "0.1.3", + "@radix-ui/react-popover": "1.1.15", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-progress": "1.1.7", + "@radix-ui/react-radio-group": "1.3.8", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-scroll-area": "1.2.10", + "@radix-ui/react-select": "2.2.6", + "@radix-ui/react-separator": "1.1.7", + "@radix-ui/react-slider": "1.3.6", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-switch": "1.2.6", + "@radix-ui/react-tabs": "1.1.13", + "@radix-ui/react-toast": "1.2.15", + "@radix-ui/react-toggle": "1.1.10", + "@radix-ui/react-toggle-group": "1.1.11", + "@radix-ui/react-toolbar": "1.1.11", + "@radix-ui/react-tooltip": "1.2.8", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-escape-keydown": "1.1.1", + "@radix-ui/react-use-is-hydrated": "0.1.0", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-size": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-accessible-icon": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accessible-icon/-/react-accessible-icon-1.1.7.tgz", + "integrity": "sha512-XM+E4WXl0OqUJFovy6GjmxxFyx9opfCAIUku4dlKRd5YEPqt4kALOkQOp0Of6reHuUkJuiPBEc5k0o4z4lTC8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-accordion": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.12.tgz", + "integrity": "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collapsible": "1.1.12", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-alert-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.15.tgz", + "integrity": "sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dialog": "1.1.15", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-arrow": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", + "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-aspect-ratio": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.7.tgz", + "integrity": "sha512-Yq6lvO9HQyPwev1onK1daHCHqXVLzPhSVjmsNjCa2Zcxy2f7uJD2itDtxknv6FzAKCwD1qQkeVDmX/cev13n/g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-avatar": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.10.tgz", + "integrity": "sha512-V8piFfWapM5OmNCXTzVQY+E1rDa53zY+MQ4Y7356v4fFz6vqCyUtIz2rUD44ZEdwg78/jKmMJHj07+C/Z/rcog==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-is-hydrated": "0.1.0", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-checkbox": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.3.tgz", + "integrity": "sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-collapsible": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz", + "integrity": "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-collection": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", + "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-context-menu": { + "version": "2.2.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.2.16.tgz", + "integrity": "sha512-O8morBEW+HsVG28gYDZPTrT9UUovQUlJue5YO836tiTJhuIWBm/zQHc7j388sHWtdH/xUZurK9olD2+pcqx5ww==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", + "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", + "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.16.tgz", + "integrity": "sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-form": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-form/-/react-form-0.1.8.tgz", + "integrity": "sha512-QM70k4Zwjttifr5a4sZFts9fn8FzHYvQ5PiB19O2HsYibaHSVt9fH9rzB0XZo/YcM+b7t/p7lYCT/F5eOeF5yQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-label": "2.1.7", + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-hover-card": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.15.tgz", + "integrity": "sha512-qgTkjNT1CfKMoP0rcasmlH2r1DAiYicWsDsufxl940sT2wHNEWWv6FMWIQXWhVdmC1d/HYfbhQx60KYyAtKxjg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-label": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.7.tgz", + "integrity": "sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-menu": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.16.tgz", + "integrity": "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-menubar": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.16.tgz", + "integrity": "sha512-EB1FktTz5xRRi2Er974AUQZWg2yVBb1yjip38/lgwtCVRd3a+maUoGHN/xs9Yv8SY8QwbSEb+YrxGadVWbEutA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-navigation-menu": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.14.tgz", + "integrity": "sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-one-time-password-field": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-one-time-password-field/-/react-one-time-password-field-0.1.8.tgz", + "integrity": "sha512-ycS4rbwURavDPVjCb5iS3aG4lURFDILi6sKI/WITUMZ13gMmn/xGjpLoqBAalhJaDk8I3UbCM5GzKHrnzwHbvg==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-is-hydrated": "0.1.0", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-password-toggle-field": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-password-toggle-field/-/react-password-toggle-field-0.1.3.tgz", + "integrity": "sha512-/UuCrDBWravcaMix4TdT+qlNdVwOM1Nck9kWx/vafXsdfj1ChfhOdfi3cy9SGBpWgTXwYCuboT/oYpJy3clqfw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-is-hydrated": "0.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-popover": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.15.tgz", + "integrity": "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-popper": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", + "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-rect": "1.1.1", + "@radix-ui/react-use-size": "1.1.1", + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-portal": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-presence": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", + "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-progress": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.7.tgz", + "integrity": "sha512-vPdg/tF6YC/ynuBIJlk1mm7Le0VgW6ub6J2UWnTQ7/D23KXcPI1qy+0vBkgKgd38RCMJavBXpB83HPNFMTb0Fg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-radio-group": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.3.8.tgz", + "integrity": "sha512-VBKYIYImA5zsxACdisNQ3BjCBfmbGH3kQlnFVqlWU4tXwjy7cGX8ta80BcrO+WJXIn5iBylEH3K6ZTlee//lgQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", + "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-scroll-area": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.10.tgz", + "integrity": "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-select": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.6.tgz", + "integrity": "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-separator": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.7.tgz", + "integrity": "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-slider": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.3.6.tgz", + "integrity": "sha512-JPYb1GuM1bxfjMRlNLE+BcmBC8onfCi60Blk7OBqi2MLTFdS+8401U4uFjnwkOr49BLmXxLC6JHkvAsx5OJvHw==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-switch": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.2.6.tgz", + "integrity": "sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-tabs": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz", + "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-toast": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.15.tgz", + "integrity": "sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-toggle": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.10.tgz", + "integrity": "sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-toggle-group": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.11.tgz", + "integrity": "sha512-5umnS0T8JQzQT6HbPyO7Hh9dgd82NmS36DQr+X/YJ9ctFNCiiQd6IJAYYZ33LUwm8M+taCz5t2ui29fHZc4Y6Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-toggle": "1.1.10", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-toolbar": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.1.11.tgz", + "integrity": "sha512-4ol06/1bLoFu1nwUqzdD4Y5RZ9oDdKeiHIsntug54Hcr1pgaHiPqHFEaXI1IFP/EsOfROQZ8Mig9VTIRza6Tjg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-separator": "1.1.7", + "@radix-ui/react-toggle-group": "1.1.11" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-tooltip": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.8.tgz", + "integrity": "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-visually-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", + "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/slate-react": { + "version": "0.110.3", + "resolved": "https://registry.npmjs.org/slate-react/-/slate-react-0.110.3.tgz", + "integrity": "sha512-AS8PPjwmsFS3Lq0MOEegLVlFoxhyos68G6zz2nW4sh3WeTXV7pX0exnwtY1a/docn+J3LGQO11aZXTenPXA/kg==", + "license": "MIT", + "dependencies": { + "@juggle/resize-observer": "^3.4.0", + "direction": "^1.0.4", + "is-hotkey": "^0.2.0", + "is-plain-object": "^5.0.0", + "lodash": "^4.17.21", + "scroll-into-view-if-needed": "^3.1.0", + "tiny-invariant": "1.3.1" + }, + "peerDependencies": { + "react": ">=18.2.0", + "react-dom": ">=18.2.0", + "slate": ">=0.99.0" + } + }, + "node_modules/@next/env": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.1.6.tgz", + "integrity": "sha512-N1ySLuZjnAtN3kFnwhAwPvZah8RJxKasD7x1f8shFqhncnWZn4JMfg37diLNuoHsLAlrDfM3g4mawVdtAG8XLQ==", + "license": "MIT" + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.1.6.tgz", + "integrity": "sha512-wTzYulosJr/6nFnqGW7FrG3jfUUlEf8UjGA0/pyypJl42ExdVgC6xJgcXQ+V8QFn6niSG2Pb8+MIG1mZr2vczw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.1.6.tgz", + "integrity": "sha512-BLFPYPDO+MNJsiDWbeVzqvYd4NyuRrEYVB5k2N3JfWncuHAy2IVwMAOlVQDFjj+krkWzhY2apvmekMkfQR0CUQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.1.6.tgz", + "integrity": "sha512-OJYkCd5pj/QloBvoEcJ2XiMnlJkRv9idWA/j0ugSuA34gMT6f5b7vOiCQHVRpvStoZUknhl6/UxOXL4OwtdaBw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.1.6.tgz", + "integrity": "sha512-S4J2v+8tT3NIO9u2q+S0G5KdvNDjXfAv06OhfOzNDaBn5rw84DGXWndOEB7d5/x852A20sW1M56vhC/tRVbccQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.1.6.tgz", + "integrity": "sha512-2eEBDkFlMMNQnkTyPBhQOAyn2qMxyG2eE7GPH2WIDGEpEILcBPI/jdSv4t6xupSP+ot/jkfrCShLAa7+ZUPcJQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.1.6.tgz", + "integrity": "sha512-oicJwRlyOoZXVlxmIMaTq7f8pN9QNbdes0q2FXfRsPhfCi8n8JmOZJm5oo1pwDaFbnnD421rVU409M3evFbIqg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.1.6.tgz", + "integrity": "sha512-gQmm8izDTPgs+DCWH22kcDmuUp7NyiJgEl18bcr8irXA5N2m2O+JQIr6f3ct42GOs9c0h8QF3L5SzIxcYAAXXw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.1.6.tgz", + "integrity": "sha512-NRfO39AIrzBnixKbjuo2YiYhB6o9d8v/ymU9m/Xk8cyVk+k7XylniXkHwjs4s70wedVffc6bQNbufk5v0xEm0A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@radix-ui/number": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", + "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", + "license": "MIT" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", + "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", + "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-is-hydrated": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.0.tgz", + "integrity": "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==", + "license": "MIT", + "dependencies": { + "use-sync-external-store": "^1.5.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", + "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", + "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", + "license": "MIT", + "dependencies": { + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", + "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", + "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", + "license": "MIT" + }, + "node_modules/@stablelib/base64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/base64/-/base64-1.0.1.tgz", + "integrity": "sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==", + "license": "MIT" + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/node": { + "version": "20.19.35", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.35.tgz", + "integrity": "sha512-Uarfe6J91b9HAUXxjvSOdiO2UPOKLm07Q1oh0JHxoZ1y8HoqxDAu3gVrsrOHeiio0kSsoVBt4wFrKOm0dKxVPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.28", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", + "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", + "devOptional": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/ag-charts-types": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/ag-charts-types/-/ag-charts-types-13.1.0.tgz", + "integrity": "sha512-DytRM3CXli+Y013SC1Mr8lQBrhVTACK+11ilDHOhwUM0sRpmGuR51XFGcBKOliW1Vas1AycP31Cm3Pp0jx3hqw==", + "license": "MIT" + }, + "node_modules/ag-grid-community": { + "version": "35.1.0", + "resolved": "https://registry.npmjs.org/ag-grid-community/-/ag-grid-community-35.1.0.tgz", + "integrity": "sha512-yWFQfRNjv3KUBkHHzFdDOYGjPcDMU0B8Up4qG651diFlGRUGEGVs94SK73niWvk1FDZdpV9oWrwq3f30/qAoVg==", + "license": "MIT", + "dependencies": { + "ag-charts-types": "13.1.0" + } + }, + "node_modules/ag-grid-react": { + "version": "35.1.0", + "resolved": "https://registry.npmjs.org/ag-grid-react/-/ag-grid-react-35.1.0.tgz", + "integrity": "sha512-n8pJh4RTpos8stzz91nEhTCZZdLy9bjQYAGxIxJ8ocVagnEsAk9T5Vz/VEKUhOGz36il68n7TVbVWSuUA3a+mg==", + "license": "MIT", + "dependencies": { + "ag-grid-community": "35.1.0", + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", + "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001776", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001776.tgz", + "integrity": "sha512-sg01JDPzZ9jGshqKSckOQthXnYwOEP50jeVFhaSFbZcOy05TiuuaffDOfcwtCisJ9kNQuLBFibYywv2Bgm9osw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/compute-scroll-into-view": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz", + "integrity": "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==", + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/direction": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/direction/-/direction-1.0.4.tgz", + "integrity": "sha512-GYqKi1aH7PJXxdhTeZBFrg8vUBeKXi+cNprXsC1kpJcbcVnV9wBsrOu1cQEdG0WeQwlfHiy3XvnKfIrJ2R0NzQ==", + "license": "MIT", + "bin": { + "direction": "cli.js" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/fast-sha256": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-sha256/-/fast-sha256-1.3.0.tgz", + "integrity": "sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==", + "license": "Unlicense" + }, + "node_modules/frimousse": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/frimousse/-/frimousse-0.2.0.tgz", + "integrity": "sha512-viSrsVQWKR4Q7xzC0lkx3Wu9i1+IHrth0QXn0nlIIJXpltwUnjkGXSTuoW7WHI5aJ4z49WR8E/pyQizFjlNtTA==", + "license": "MIT", + "workspaces": [ + ".", + "site" + ], + "peerDependencies": { + "react": "^18 || ^19" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/immer": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz", + "integrity": "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/is-hotkey": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-hotkey/-/is-hotkey-0.2.0.tgz", + "integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==", + "license": "MIT" + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/marked": { + "version": "15.0.12", + "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", + "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/next": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/next/-/next-16.1.6.tgz", + "integrity": "sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw==", + "license": "MIT", + "dependencies": { + "@next/env": "16.1.6", + "@swc/helpers": "0.5.15", + "baseline-browser-mapping": "^2.8.3", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=20.9.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "16.1.6", + "@next/swc-darwin-x64": "16.1.6", + "@next/swc-linux-arm64-gnu": "16.1.6", + "@next/swc-linux-arm64-musl": "16.1.6", + "@next/swc-linux-x64-gnu": "16.1.6", + "@next/swc-linux-x64-musl": "16.1.6", + "@next/swc-win32-arm64-msvc": "16.1.6", + "@next/swc-win32-x64-msvc": "16.1.6", + "sharp": "^0.34.4" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.51.1", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prettier": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react-remove-scroll": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", + "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/scroll-into-view-if-needed": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", + "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==", + "license": "MIT", + "dependencies": { + "compute-scroll-into-view": "^3.0.2" + } + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/slate": { + "version": "0.110.2", + "resolved": "https://registry.npmjs.org/slate/-/slate-0.110.2.tgz", + "integrity": "sha512-4xGULnyMCiEQ0Ml7JAC1A6HVE6MNpPJU7Eq4cXh1LxlrR0dFXC3XC+rNfQtUJ7chHoPkws57x7DDiWiZAt+PBA==", + "license": "MIT", + "peer": true, + "dependencies": { + "immer": "^10.0.3", + "is-plain-object": "^5.0.0", + "tiny-warning": "^1.0.3" + } + }, + "node_modules/slate-history": { + "version": "0.110.3", + "resolved": "https://registry.npmjs.org/slate-history/-/slate-history-0.110.3.tgz", + "integrity": "sha512-sgdff4Usdflmw5ZUbhDkxFwCBQ2qlDKMMkF93w66KdV48vHOgN2BmLrf+2H8SdX8PYIpP/cTB0w8qWC2GwhDVA==", + "license": "MIT", + "dependencies": { + "is-plain-object": "^5.0.0" + }, + "peerDependencies": { + "slate": ">=0.65.3" + } + }, + "node_modules/slate-hyperscript": { + "version": "0.100.0", + "resolved": "https://registry.npmjs.org/slate-hyperscript/-/slate-hyperscript-0.100.0.tgz", + "integrity": "sha512-fb2KdAYg6RkrQGlqaIi4wdqz3oa0S4zKNBJlbnJbNOwa23+9FLD6oPVx9zUGqCSIpy+HIpOeqXrg0Kzwh/Ii4A==", + "license": "MIT", + "dependencies": { + "is-plain-object": "^5.0.0" + }, + "peerDependencies": { + "slate": ">=0.65.3" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==", + "license": "MIT" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", + "license": "MIT" + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + } + } +} diff --git a/examples/nextjs-comments-ag-grid/package.json b/examples/nextjs-comments-ag-grid/package.json new file mode 100644 index 0000000000..75e0c70978 --- /dev/null +++ b/examples/nextjs-comments-ag-grid/package.json @@ -0,0 +1,28 @@ +{ + "name": "@liveblocks-examples/nextjs-comments-ag-grid", + "description": "This example shows how to build AG Grid commenting with Liveblocks and Next.js.", + "license": "Apache-2.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start" + }, + "dependencies": { + "@liveblocks/client": "^3.15.0-rc1", + "@liveblocks/node": "^3.15.0-rc1", + "@liveblocks/react": "^3.15.0-rc1", + "@liveblocks/react-ui": "^3.15.0-rc1", + "ag-grid-community": "^35.1.0", + "ag-grid-react": "^35.1.0", + "next": "^16.1.6", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/node": "^20.0.0", + "@types/react": "^18.3.3", + "prettier": "^3.3.2", + "typescript": "^5.4.5" + } +} diff --git a/examples/nextjs-comments-ag-grid/tsconfig.json b/examples/nextjs-comments-ag-grid/tsconfig.json new file mode 100644 index 0000000000..5327e1ee98 --- /dev/null +++ b/examples/nextjs-comments-ag-grid/tsconfig.json @@ -0,0 +1,37 @@ +{ + "compilerOptions": { + "target": "es2018", + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "react-jsx", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ] + }, + "include": [ + "next-env.d.ts", + ".next/types/**/*.ts", + "**/*.ts", + "**/*.tsx", + ".next/dev/types/**/*.ts" + ], + "exclude": [ + "node_modules" + ] +} From 7342ca59846d936ac6b3011f6857ea473a6e84d8 Mon Sep 17 00:00:00 2001 From: Vincent Driessen Date: Thu, 5 Mar 2026 12:00:59 +0100 Subject: [PATCH 2/7] Ignore Claude dir (#3150) --- .gitignore | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 0470c41675..7096909c56 100644 --- a/.gitignore +++ b/.gitignore @@ -35,8 +35,7 @@ playwright-report/ .liveblocks/ # Claude Code configs -.claude/cache/ -.claude/*.local.json +.claude/ CLAUDE.local.md .mcp.json From 3a4dbd629cdce1b71d825e186caa3890bc9900e2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Mar 2026 11:01:36 +0000 Subject: [PATCH 3/7] Bump svgo from 3.3.2 to 3.3.3 in /examples/react-native-todo-list (#3148) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../react-native-todo-list/package-lock.json | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/examples/react-native-todo-list/package-lock.json b/examples/react-native-todo-list/package-lock.json index 478ff82f4f..540da0e572 100644 --- a/examples/react-native-todo-list/package-lock.json +++ b/examples/react-native-todo-list/package-lock.json @@ -4519,15 +4519,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "license": "ISC", - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -11485,6 +11476,15 @@ "devOptional": true, "license": "MIT" }, + "node_modules/sax": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.5.0.tgz", + "integrity": "sha512-21IYA3Q5cQf089Z6tgaUTr7lDAyzoTPx5HRtbhsME8Udispad8dC/+sziTNugOEx54ilvatQ9YCzl4KQLPcRHA==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, "node_modules/scheduler": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", @@ -12210,18 +12210,18 @@ "license": "MIT" }, "node_modules/svgo": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", - "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.3.tgz", + "integrity": "sha512-+wn7I4p7YgJhHs38k2TNjy1vCfPIfLIJWR5MnCStsN8WuuTcBnRKcMHQLMM2ijxGZmDoZwNv8ipl5aTTen62ng==", "license": "MIT", "dependencies": { - "@trysound/sax": "0.2.0", "commander": "^7.2.0", "css-select": "^5.1.0", "css-tree": "^2.3.1", "css-what": "^6.1.0", "csso": "^5.0.5", - "picocolors": "^1.0.0" + "picocolors": "^1.0.0", + "sax": "^1.5.0" }, "bin": { "svgo": "bin/svgo" From 686c829dba213d1fef2d1afbab7729bb26218ae8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Mar 2026 11:01:41 +0000 Subject: [PATCH 4/7] Bump svgo from 4.0.0 to 4.0.1 in /examples/nuxtjs-live-avatars (#3147) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- examples/nuxtjs-live-avatars/package-lock.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/examples/nuxtjs-live-avatars/package-lock.json b/examples/nuxtjs-live-avatars/package-lock.json index eecfda9c47..74e3b5ff0b 100644 --- a/examples/nuxtjs-live-avatars/package-lock.json +++ b/examples/nuxtjs-live-avatars/package-lock.json @@ -8953,9 +8953,9 @@ "license": "MIT" }, "node_modules/sax": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.4.tgz", - "integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.5.0.tgz", + "integrity": "sha512-21IYA3Q5cQf089Z6tgaUTr7lDAyzoTPx5HRtbhsME8Udispad8dC/+sziTNugOEx54ilvatQ9YCzl4KQLPcRHA==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -9393,9 +9393,9 @@ } }, "node_modules/svgo": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.0.tgz", - "integrity": "sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.1.tgz", + "integrity": "sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==", "dev": true, "license": "MIT", "dependencies": { @@ -9405,7 +9405,7 @@ "css-what": "^6.1.0", "csso": "^5.0.5", "picocolors": "^1.1.1", - "sax": "^1.4.1" + "sax": "^1.5.0" }, "bin": { "svgo": "bin/svgo.js" From abcdd804409cce747e9720bcb02bd1c48e2296b0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Mar 2026 11:14:56 +0000 Subject: [PATCH 5/7] Bump tar from 7.5.9 to 7.5.10 in /examples/nuxtjs-live-avatars (#3151) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- examples/nuxtjs-live-avatars/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/nuxtjs-live-avatars/package-lock.json b/examples/nuxtjs-live-avatars/package-lock.json index 74e3b5ff0b..f77fe21f34 100644 --- a/examples/nuxtjs-live-avatars/package-lock.json +++ b/examples/nuxtjs-live-avatars/package-lock.json @@ -9453,9 +9453,9 @@ } }, "node_modules/tar": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.9.tgz", - "integrity": "sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==", + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.10.tgz", + "integrity": "sha512-8mOPs1//5q/rlkNSPcCegA6hiHJYDmSLEI8aMH/CdSQJNWztHC9WHNam5zdQlfpTwB9Xp7IBEsHfV5LKMJGVAw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { From 3a75d7c308d7191eef4675f1bbe549742762ad19 Mon Sep 17 00:00:00 2001 From: Marc Bouchenoire Date: Thu, 5 Mar 2026 12:18:12 +0100 Subject: [PATCH 6/7] Release: 3.15 (#3105) Co-authored-by: Vincent Driessen Co-authored-by: Nick Perez Co-authored-by: Chris Nicholas --- CHANGELOG.md | 29 + assets/comments/comment-pin.png | Bin 0 -> 18388 bytes .../floating-composer-comment-pin.png | Bin 0 -> 22054 bytes assets/comments/floating-composer.png | Bin 0 -> 19574 bytes .../comments/floating-thread-comment-pin.png | Bin 0 -> 78072 bytes assets/comments/floating-thread.png | Bin 0 -> 70065 bytes assets/presence/avatar-stack.png | Bin 0 -> 155139 bytes assets/presence/cursor.png | Bin 0 -> 21762 bytes assets/presence/cursors.png | Bin 0 -> 37075 bytes .../liveblocks-react-blocknote.mdx | 56 +- .../liveblocks-react-lexical.mdx | 56 +- .../api-reference/liveblocks-react-tiptap.mdx | 56 +- .../api-reference/liveblocks-react-ui.mdx | 658 +- .../get-started/nextjs-comments-ag-grid.mdx | 413 + .../get-started/nextjs-comments-canvas.mdx | 580 ++ .../get-started/nextjs-comments-table.mdx | 321 + docs/pages/get-started/nextjs-comments.mdx | 3 +- docs/pages/get-started/nextjs-presence.mdx | 229 + docs/pages/get-started/react-comments.mdx | 1 + docs/routes.json | 20 + e2e/next-sandbox/pages/comments/thread.tsx | 122 + e2e/next-sandbox/test/comments/thread.test.ts | 86 + .../nextjs-comments-overlay/package-lock.json | 2200 +++--- examples/nextjs-comments-overlay/package.json | 28 +- .../comments/CommentWithUserAgent.module.css | 39 + .../comments/CommentWithUserAgent.tsx | 52 + .../src/components/comments/Comments.tsx | 1 - .../src/components/comments/NewThread.tsx | 14 +- .../components/comments/NewThreadCursor.tsx | 6 +- .../src/components/comments/PinnedThread.tsx | 27 +- .../src/components/comments/Sidebar.tsx | 26 +- .../src/components/comments/Toolbar.tsx | 14 +- .../src/liveblocks.config.ts | 4 + .../nextjs-comments-video/package-lock.json | 52 +- examples/nextjs-comments-video/package.json | 8 +- .../src/components/Threads.module.css | 13 + .../src/components/Threads.tsx | 78 +- .../src/components/ThreadsTimeline.module.css | 7 +- .../src/components/ThreadsTimeline.tsx | 39 +- .../nextjs-comments-video/src/icons/Eye.tsx | 21 + .../src/liveblocks.config.ts | 4 + .../package-lock.json | 92 +- .../package.json | 12 +- .../src/components/Comments.tsx | 37 +- .../src/components/Presence.tsx | 2 +- guides/guides.json | 7 + ...sers-to-liveblocks-presence-components.mdx | 191 + package-lock.json | 6663 +++++++++-------- .../liveblocks-react-blocknote/package.json | 4 +- .../initialization/liveblocksEditorOptions.ts | 5 +- .../liveblocks-react-lexical/package.json | 5 +- .../src/comments/anchored-threads.tsx | 4 +- .../src/comments/floating-composer.tsx | 4 +- .../src/comments/floating-threads.tsx | 4 +- .../src/toolbar/toolbar.tsx | 3 +- packages/liveblocks-react-tiptap/package.json | 5 +- .../src/comments/AnchoredThreads.tsx | 21 +- .../src/comments/FloatingComposer.tsx | 4 +- .../src/comments/FloatingThreads.tsx | 4 +- .../src/toolbar/Toolbar.tsx | 3 +- packages/liveblocks-react-ui/package.json | 8 +- .../liveblocks-react-ui/src/_private/index.ts | 1 + .../src/components/AiChat.tsx | 11 +- .../src/components/AvatarStack.tsx | 155 + .../src/components/Comment.tsx | 514 +- .../src/components/CommentPin.tsx | 59 + .../src/components/Composer.tsx | 6 +- .../src/components/Cursor.tsx | 48 + .../src/components/Cursors.tsx | 354 + .../src/components/FloatingComposer.tsx | 123 + .../src/components/FloatingThread.tsx | 120 + .../src/components/InboxNotification.tsx | 7 +- .../src/components/Thread.tsx | 178 +- .../src/components/internal/Avatar.tsx | 5 +- .../src/components/internal/Dropdown.tsx | 4 +- .../src/components/internal/EmojiPicker.tsx | 4 +- .../src/components/internal/List.tsx | 4 +- .../src/components/internal/Tooltip.tsx | 4 +- packages/liveblocks-react-ui/src/index.ts | 15 + .../src/primitives/AiComposer/index.tsx | 9 +- .../src/primitives/AiMessage/index.tsx | 4 +- .../src/primitives/Collapsible/index.tsx | 8 +- .../src/primitives/Comment/index.tsx | 8 +- .../src/primitives/Composer/index.tsx | 40 +- .../src/primitives/Duration.tsx | 4 +- .../src/primitives/FileSize.tsx | 4 +- .../src/primitives/Markdown.tsx | 4 +- .../src/primitives/Timestamp.tsx | 4 +- .../src/styles/dark/index.css | 2 +- .../liveblocks-react-ui/src/styles/index.css | 256 +- .../liveblocks-react-ui/src/utils/Portal.tsx | 4 +- .../src/utils/animation-loop.ts | 49 + .../src/utils/use-pre-resolve-user.ts | 22 + .../src/utils/use-stable-component.tsx | 47 + .../liveblocks-react/scripts/check-exports.ts | 43 + .../src/__tests__/index.test.tsx | 14 +- packages/liveblocks-react/src/contexts.ts | 11 +- packages/liveblocks-react/src/index.ts | 6 +- packages/liveblocks-react/src/room.tsx | 1797 ++++- packages/liveblocks-react/src/suspense.ts | 6 +- 100 files changed, 11099 insertions(+), 5196 deletions(-) create mode 100644 assets/comments/comment-pin.png create mode 100644 assets/comments/floating-composer-comment-pin.png create mode 100644 assets/comments/floating-composer.png create mode 100644 assets/comments/floating-thread-comment-pin.png create mode 100644 assets/comments/floating-thread.png create mode 100644 assets/presence/avatar-stack.png create mode 100644 assets/presence/cursor.png create mode 100644 assets/presence/cursors.png create mode 100644 docs/pages/get-started/nextjs-comments-ag-grid.mdx create mode 100644 docs/pages/get-started/nextjs-comments-canvas.mdx create mode 100644 docs/pages/get-started/nextjs-comments-table.mdx create mode 100644 docs/pages/get-started/nextjs-presence.mdx create mode 100644 e2e/next-sandbox/pages/comments/thread.tsx create mode 100644 e2e/next-sandbox/test/comments/thread.test.ts create mode 100644 examples/nextjs-comments-overlay/src/components/comments/CommentWithUserAgent.module.css create mode 100644 examples/nextjs-comments-overlay/src/components/comments/CommentWithUserAgent.tsx create mode 100644 examples/nextjs-comments-video/src/icons/Eye.tsx create mode 100644 guides/pages/how-to-add-users-to-liveblocks-presence-components.mdx create mode 100644 packages/liveblocks-react-ui/src/components/AvatarStack.tsx create mode 100644 packages/liveblocks-react-ui/src/components/CommentPin.tsx create mode 100644 packages/liveblocks-react-ui/src/components/Cursor.tsx create mode 100644 packages/liveblocks-react-ui/src/components/Cursors.tsx create mode 100644 packages/liveblocks-react-ui/src/components/FloatingComposer.tsx create mode 100644 packages/liveblocks-react-ui/src/components/FloatingThread.tsx create mode 100644 packages/liveblocks-react-ui/src/utils/animation-loop.ts create mode 100644 packages/liveblocks-react-ui/src/utils/use-pre-resolve-user.ts create mode 100644 packages/liveblocks-react-ui/src/utils/use-stable-component.tsx diff --git a/CHANGELOG.md b/CHANGELOG.md index b7b0809aa4..e271d397f8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,34 @@ ## vNEXT (not yet released) +## v3.15.0 + +### `@liveblocks/react-ui` + +- Add various new ways to customize `Thread` and `Comment`: + - Comments in `Thread` can now be overridden or customized via the + `components` prop. + - New parts of `Comment` (content, avatar, author, and date) can now be + overridden or customized via the `children`, `additionalContent`, `avatar`, + `author`, and `date` props. +- Fix `commentDropdownItems` prop on `Thread` not working as expected in some + cases. + +### `@liveblocks/react` + +- Each `createRoomContext()` invocation now creates its own isolated context to + allow nesting independent room contexts and their `RoomProvider` components. + +### `@liveblocks/react-blocknote` + +- Support newer BlockNote versions and bump the minimum required version to + v0.43.0. (Thanks @nperez0111 for the contribution!) + +### `@liveblocks/react-ui`, `@liveblocks/react-tiptap`, and `@liveblocks/react-lexical` + +- Improve how inline components passed to `components={{ ... }}` props are + handled by keeping them stable instead of re-mounting them on every render. +- Move `@radix-ui/*` dependencies to the `radix-ui` mono package. + ## v3.14.1 ### `@liveblocks/react` diff --git a/assets/comments/comment-pin.png b/assets/comments/comment-pin.png new file mode 100644 index 0000000000000000000000000000000000000000..c2d3b6857c310741e4f67614b97fd1d84864ec58 GIT binary patch literal 18388 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 literal 0 HcmV?d00001 diff --git a/assets/comments/floating-composer.png b/assets/comments/floating-composer.png new file mode 100644 index 0000000000000000000000000000000000000000..646ed9b40427dd85c6318151b7d894952317cf30 GIT binary patch literal 19574 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 W*$6-EeE~XQjKR~@&t;ucLK6Vik})Iz literal 0 HcmV?d00001 diff --git a/assets/comments/floating-thread-comment-pin.png b/assets/comments/floating-thread-comment-pin.png new file mode 100644 index 0000000000000000000000000000000000000000..f30cd5a9f9bd203f75d34cf59b17a01129118eca GIT binary patch literal 78072 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

1@MS<}Y@6GGkSp%7q9M=K? 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

+ } + sideOffset={FLOATING_ELEMENT_SIDE_OFFSET} + collisionPadding={FLOATING_ELEMENT_COLLISION_PADDING} + side="top" + align="center" + className="lb-users-tooltip" + > +
+ + +{remainingUsersCount} + +
+ + ) : null} + + + ); + } +); diff --git a/packages/liveblocks-react-ui/src/components/Comment.tsx b/packages/liveblocks-react-ui/src/components/Comment.tsx index 4780554f0d..1b3c0be89e 100644 --- a/packages/liveblocks-react-ui/src/components/Comment.tsx +++ b/packages/liveblocks-react-ui/src/components/Comment.tsx @@ -2,9 +2,11 @@ import { assertNever, + type BaseMetadata, type CommentAttachment, type CommentData, type CommentReaction as CommentReactionData, + type DCM, type GroupMentionData, MENTION_CHARACTER, type MentionData, @@ -14,12 +16,11 @@ import { useAddRoomCommentReaction, useDeleteRoomComment, useEditRoomComment, - useMarkRoomThreadAsRead, useRemoveRoomCommentReaction, useRoomAttachmentUrl, useRoomPermissions, } from "@liveblocks/react/_private"; -import * as TogglePrimitive from "@radix-ui/react-toggle"; +import { Toggle as TogglePrimitive } from "radix-ui"; import type { ComponentProps, ComponentPropsWithoutRef, @@ -27,7 +28,7 @@ import type { MouseEvent, PropsWithChildren, ReactNode, - RefObject, + RefAttributes, SyntheticEvent, } from "react"; import { @@ -72,8 +73,6 @@ import { cn } from "../utils/cn"; import { download } from "../utils/download"; import { useIsGroupMentionMember } from "../utils/use-group-mention"; import { useRefs } from "../utils/use-refs"; -import { useIntersectionCallback } from "../utils/use-visible"; -import { useWindowFocus } from "../utils/use-window-focus"; import type { ComposerProps } from "./Composer"; import { Composer } from "./Composer"; import { @@ -93,11 +92,31 @@ import { User } from "./internal/User"; const REACTIONS_TRUNCATE = 5; -export interface CommentProps extends ComponentPropsWithoutRef<"div"> { +export interface CommentProps + extends Omit, "children"> { /** * The comment to display. */ - comment: CommentData; + comment: CommentData; + + /** + * The comment's avatar. + * Can be combined with `Comment.Avatar` to easily follow default styles. + */ + avatar?: ReactNode; + + /** + * The comment's author. + * Can be combined with `Comment.Author` to easily follow default styles. + */ + author?: ReactNode; + + /** + * The comment's date. + * Can be combined with `Comment.Date` to easily follow default styles, + * or the `Timestamp` primitive for more control. + */ + date?: ReactNode; /** * How to show or hide the actions. @@ -129,6 +148,11 @@ export interface CommentProps extends ComponentPropsWithoutRef<"div"> { */ indentContent?: boolean; + /** + * Additional content to display below the comment's body. + */ + additionalContent?: ReactNode; + /** * The event handler called when the comment is edited. */ @@ -165,7 +189,14 @@ export interface CommentProps extends ComponentPropsWithoutRef<"div"> { */ dropdownItems?: | ReactNode - | ((props: PropsWithChildren<{ comment: CommentData }>) => ReactNode); + | ((props: PropsWithChildren<{ comment: CommentData }>) => ReactNode); + + /** + * Override the comment's content. + */ + children?: + | ReactNode + | ((props: PropsWithChildren<{ comment: CommentData }>) => ReactNode); /** * Override the component's strings. @@ -180,17 +211,65 @@ export interface CommentProps extends ComponentPropsWithoutRef<"div"> { /** * @internal */ - autoMarkReadThreadId?: string; + actions?: ReactNode; /** * @internal */ - actions?: ReactNode; + actionsClassName?: string; /** * @internal */ - actionsClassName?: string; + internalDropdownItems?: ReactNode; +} + +export interface CommentAvatarProps + extends Omit, "children"> { + /** + * The user ID to display the avatar for. + */ + userId: string; +} + +export interface CommentAuthorProps + extends Omit, "children"> { + /** + * The user ID to display the author for. + */ + userId: string; +} + +export interface CommentDateProps + extends Omit, "children"> { + /** + * The date to display. + */ + date: Date | string | number; + + /** + * The locale used when formatting the date. + */ + locale?: string; +} + +function CommentAvatar(props: CommentAvatarProps) { + return ; +} + +function CommentAuthor(props: CommentAuthorProps) { + return ; +} + +function CommentDate({ locale, date, className, ...props }: CommentDateProps) { + return ( + , "children" | "title">)} + /> + ); } export interface CommentDropdownItemProps @@ -551,38 +630,6 @@ export function CommentNonInteractiveFileAttachment({ ); } -// A void component (which doesn't render anything) responsible for marking a thread -// as read when the comment it's used in becomes visible. -// Moving this logic into a separate component allows us to use the visibility -// and focus hooks "conditionally" by conditionally rendering this component. -function AutoMarkReadThreadIdHandler({ - threadId, - roomId, - commentRef, -}: { - threadId: string; - roomId: string; - commentRef: RefObject; -}) { - const markThreadAsRead = useMarkRoomThreadAsRead(roomId); - const isWindowFocused = useWindowFocus(); - - useIntersectionCallback( - commentRef, - (isIntersecting) => { - if (isIntersecting) { - markThreadAsRead(threadId); - } - }, - { - // The underlying IntersectionObserver is only enabled when the window is focused - enabled: isWindowFocused, - } - ); - - return null; -} - const CommentDropdownItem = forwardRef< HTMLDivElement, CommentDropdownItemProps @@ -640,14 +687,20 @@ export const Comment = Object.assign( dropdownItems, overrides, components, + additionalContent, + avatar, + author, + date, className, actions, actionsClassName, - autoMarkReadThreadId, + internalDropdownItems, + children, ...props }, forwardedRef ) => { + const bodyId = `${comment.id}:body`; const ref = useRef(null); const mergedRefs = useRefs(forwardedRef, ref); const currentUserId = useCurrentUserId(); @@ -782,7 +835,7 @@ export const Comment = Object.assign( return null; } - const defaultDropdownItems = + const commentDropdownItems = comment.userId === currentUserId ? ( <> }> @@ -793,28 +846,167 @@ export const Comment = Object.assign( ) : null; + const defaultDropdownItems = + internalDropdownItems || commentDropdownItems ? ( + <> + {internalDropdownItems} + {commentDropdownItems} + + ) : null; const dropdownContent = typeof dropdownItems === "function" ? ( dropdownItems({ children: defaultDropdownItems, comment }) - ) : ( + ) : defaultDropdownItems || dropdownItems ? ( <> {defaultDropdownItems} {dropdownItems} + ) : null; + + let content: ReactNode; + + if (isEditing) { + content = ( + + + + ); + } +); diff --git a/packages/liveblocks-react-ui/src/components/Composer.tsx b/packages/liveblocks-react-ui/src/components/Composer.tsx index 92aae0767b..d6aacbc785 100644 --- a/packages/liveblocks-react-ui/src/components/Composer.tsx +++ b/packages/liveblocks-react-ui/src/components/Composer.tsx @@ -99,7 +99,7 @@ interface MarkToggleProps extends ComposerMarkToggleProps { shortcut?: string; } -type ComposerCreateThreadProps< +export type ComposerCreateThreadProps< TM extends BaseMetadata, CM extends BaseMetadata, > = { @@ -118,7 +118,7 @@ type ComposerCreateThreadProps< commentMetadata?: CM; }; -type ComposerCreateCommentProps = { +export type ComposerCreateCommentProps = { /** * The ID of the thread to reply to. */ @@ -134,7 +134,7 @@ type ComposerCreateCommentProps = { commentMetadata?: CM; }; -type ComposerEditCommentProps = { +export type ComposerEditCommentProps = { /** * The ID of the thread to edit a comment in. */ diff --git a/packages/liveblocks-react-ui/src/components/Cursor.tsx b/packages/liveblocks-react-ui/src/components/Cursor.tsx new file mode 100644 index 0000000000..b1049810ad --- /dev/null +++ b/packages/liveblocks-react-ui/src/components/Cursor.tsx @@ -0,0 +1,48 @@ +import type { ComponentPropsWithoutRef, CSSProperties, ReactNode } from "react"; +import { forwardRef } from "react"; + +import { cn } from "../utils/cn"; + +export interface CursorProps extends ComponentPropsWithoutRef<"div"> { + /** + * A floating label to display next to the cursor. + */ + label?: ReactNode; + + /** + * The color of the cursor. + */ + color?: string; +} + +/** + * Displays a multiplayer cursor. + */ +export const Cursor = forwardRef( + ({ className, label, color, style, ...props }, forwardedRef) => { + return ( +
+ + + + {label ? ( +
+ {label} +
+ ) : null} +
+ ); + } +); diff --git a/packages/liveblocks-react-ui/src/components/Cursors.tsx b/packages/liveblocks-react-ui/src/components/Cursors.tsx new file mode 100644 index 0000000000..9971a1ac1f --- /dev/null +++ b/packages/liveblocks-react-ui/src/components/Cursors.tsx @@ -0,0 +1,354 @@ +import type { EventSource } from "@liveblocks/core"; +import { isPlainObject, makeEventSource } from "@liveblocks/core"; +import { + useOther, + useOthersConnectionIds, + useRoom, + useUpdateMyPresence, + useUser, +} from "@liveblocks/react"; +import { useLayoutEffect } from "@liveblocks/react/_private"; +import type { + ComponentPropsWithoutRef, + MutableRefObject, + PointerEvent, +} from "react"; +import { + forwardRef, + useCallback, + useEffect, + useImperativeHandle, + useRef, + useState, +} from "react"; + +import { type Animatable, makeAnimationLoop } from "../utils/animation-loop"; +import { cn } from "../utils/cn"; +import { useWindowFocus } from "../utils/use-window-focus"; +import { Cursor } from "./Cursor"; + +const STIFFNESS = 320; +const DAMPING = 32; +const EPSILON = 0.01; + +const DEFAULT_PRESENCE_KEY = "cursor"; + +export interface CursorsProps extends ComponentPropsWithoutRef<"div"> { + /** + * The key used to store the cursors in users' Presence. + * This can be used to have multiple `Cursors` in a single room. + */ + presenceKey?: string; +} + +type Coordinates = { + x: number; + y: number; +}; + +type Size = { + width: number; + height: number; +}; + +function $string(value: unknown): string | undefined { + return typeof value === "string" ? value : undefined; +} + +function $coordinates(value: unknown): Coordinates | undefined { + if ( + isPlainObject(value) && + typeof value.x === "number" && + typeof value.y === "number" + ) { + return value as Coordinates; + } + + return undefined; +} + +// Use a shared animation loop for all (active) springs. +const loop = makeAnimationLoop(); + +function makeCoordinatesSpring() { + const updates = makeEventSource(); + let value: Coordinates | null = null; + let target: Coordinates | null = null; + const velocity = { x: 0, y: 0 }; + + const spring: Animatable = { + active: false, + step(dt: number) { + if (value === null || target === null) { + spring.active = false; + return; + } + + const k = STIFFNESS; + const d = DAMPING; + const dx = value.x - target.x; + const dy = value.y - target.y; + + velocity.x += (-k * dx - d * velocity.x) * dt; + velocity.y += (-k * dy - d * velocity.y) * dt; + + const nx = value.x + velocity.x * dt; + const ny = value.y + velocity.y * dt; + + if (nx !== value.x || ny !== value.y) { + value.x = nx; + value.y = ny; + updates.notify(value); + } + + if ( + Math.abs(velocity.x) < EPSILON && + Math.abs(velocity.y) < EPSILON && + Math.abs(target.x - value.x) < EPSILON && + Math.abs(target.y - value.y) < EPSILON + ) { + if (value.x !== target.x || value.y !== target.y) { + value.x = target.x; + value.y = target.y; + updates.notify(value); + } + + velocity.x = 0; + velocity.y = 0; + spring.active = false; + } + }, + }; + + return { + get() { + return value; + }, + set(point: Coordinates | null) { + if (point === null) { + value = null; + target = null; + velocity.x = 0; + velocity.y = 0; + spring.active = false; + loop.remove(spring); + updates.notify(null); + return; + } + + if (value === null) { + value = { x: point.x, y: point.y }; + target = point; + velocity.x = 0; + velocity.y = 0; + updates.notify(value); + return; + } + + target = point; + + if (!spring.active && (value.x !== target.x || value.y !== target.y)) { + spring.active = true; + loop.add(spring); + } + }, + subscribe: updates.subscribe, + dispose() { + spring.active = false; + loop.remove(spring); + updates.dispose(); + }, + }; +} + +function PresenceCursor({ + connectionId, + presenceKey, + sizeRef, + sizeEvents, +}: { + connectionId: number; + presenceKey: string; + sizeRef: MutableRefObject; + sizeEvents: EventSource; +}) { + const room = useRoom(); + const cursorRef = useRef(null); + const userId = useOther(connectionId, (other) => $string(other.id)); + const { user, isLoading } = useUser(userId ?? ""); + const hasUserInfo = userId !== undefined && !isLoading; + const color = $string(user?.color); + const name = $string(user?.name); + + useLayoutEffect(() => { + const spring = makeCoordinatesSpring(); + + function update() { + const element = cursorRef.current; + const coordinates = spring.get(); + + if (!element) { + return; + } + + if (!hasUserInfo || coordinates === null) { + element.style.transform = "translate3d(0, 0, 0)"; + element.style.display = "none"; + return; + } + + if (sizeRef.current) { + element.style.transform = `translate3d(${coordinates.x * sizeRef.current.width}px, ${coordinates.y * sizeRef.current.height}px, 0)`; + } + + element.style.display = ""; + } + + const unsubscribeSpring = spring.subscribe(update); + const unsubscribeSize = sizeEvents.subscribe(update); + update(); + + const unsubscribeOther = room.events.others.subscribe(({ others }) => { + const other = others.find((other) => other.connectionId === connectionId); + const cursor = $coordinates(other?.presence[presenceKey]); + + spring.set(cursor ?? null); + }); + + return () => { + spring.dispose(); + unsubscribeSpring(); + unsubscribeSize(); + unsubscribeOther(); + }; + }, [room, connectionId, presenceKey, sizeRef, sizeEvents, hasUserInfo]); + + return ( + + ); +} + +/** + * Displays multiplayer cursors. + */ +export const Cursors = forwardRef( + ( + { className, children, presenceKey = DEFAULT_PRESENCE_KEY, ...props }, + forwardedRef + ) => { + const ref = useRef(null); + const updateMyPresence = useUpdateMyPresence(); + const othersConnectionIds = useOthersConnectionIds(); + const sizeRef = useRef(null); + const [sizeEvents] = useState(() => makeEventSource()); + const isWindowFocused = useWindowFocus(); + + useEffect(() => { + const element = ref.current; + + if (!element) { + return; + } + + function setSize(size: Size) { + sizeRef.current = size; + sizeEvents.notify(); + } + + const observer = new ResizeObserver((entries) => { + for (const entry of entries) { + if (entry.target === element) { + setSize({ + width: entry.contentRect.width, + height: entry.contentRect.height, + }); + } + } + }); + + setSize({ + width: element.clientWidth, + height: element.clientHeight, + }); + + observer.observe(element); + + return () => { + observer.disconnect(); + }; + }, [sizeEvents]); + + const handlePointerMove = useCallback( + (event: PointerEvent) => { + const element = ref.current; + + if (!element) { + return; + } + + const bounds = element.getBoundingClientRect(); + + if (bounds.width === 0 || bounds.height === 0) { + return; + } + + updateMyPresence({ + [presenceKey]: { + x: (event.clientX - bounds.left) / bounds.width, + y: (event.clientY - bounds.top) / bounds.height, + }, + }); + }, + [updateMyPresence, presenceKey] + ); + + const handlePointerLeave = useCallback(() => { + updateMyPresence({ + [presenceKey]: null, + }); + }, [updateMyPresence, presenceKey]); + + useEffect(() => { + if (!isWindowFocused) { + updateMyPresence({ + [presenceKey]: null, + }); + } + }, [isWindowFocused, updateMyPresence, presenceKey]); + + useImperativeHandle( + forwardedRef, + () => ref.current, + [] + ); + + return ( +
+
+ {othersConnectionIds.map((connectionId) => ( + + ))} +
+ + {children} +
+ ); + } +); diff --git a/packages/liveblocks-react-ui/src/components/FloatingComposer.tsx b/packages/liveblocks-react-ui/src/components/FloatingComposer.tsx new file mode 100644 index 0000000000..5d798fbfe3 --- /dev/null +++ b/packages/liveblocks-react-ui/src/components/FloatingComposer.tsx @@ -0,0 +1,123 @@ +"use client"; + +import type { BaseMetadata, DCM, DTM, Relax } from "@liveblocks/core"; +import { Popover as PopoverPrimitive } from "radix-ui"; +import { + type ForwardedRef, + forwardRef, + type ReactNode, + type RefAttributes, +} from "react"; + +import { useLiveblocksUiConfig } from "../config"; +import { + FLOATING_ELEMENT_COLLISION_PADDING, + FLOATING_ELEMENT_SIDE_OFFSET, +} from "../constants"; +import { useOverrides } from "../overrides"; +import { cn } from "../utils/cn"; +import { useControllableState } from "../utils/use-controllable-state"; +import type { ComposerProps } from "./Composer"; +import { Composer } from "./Composer"; + +export interface FloatingComposerProps< + TM extends BaseMetadata = DTM, + CM extends BaseMetadata = DCM, +> extends Omit< + ComposerProps, + "collapsed" | "onCollapsedChange" | "defaultCollapsed" + >, + Relax< + Pick< + PopoverPrimitive.PopoverProps, + "defaultOpen" | "open" | "onOpenChange" + > & + Pick< + PopoverPrimitive.PopoverContentProps, + "side" | "sideOffset" | "align" | "alignOffset" + > + > { + /** + * The element which opens the floating composer. + */ + children: ReactNode; +} + +/** + * Displays a floating composer attached to a trigger element. + */ +export const FloatingComposer = forwardRef( + ( + { + children, + defaultOpen, + open, + onOpenChange, + side = "right", + sideOffset = FLOATING_ELEMENT_SIDE_OFFSET, + align = "start", + alignOffset, + overrides, + className, + ...props + }: FloatingComposerProps, + forwardedRef: ForwardedRef + ) => { + const $ = useOverrides(overrides); + const { portalContainer } = useLiveblocksUiConfig(); + const [isOpen, setIsOpen] = useControllableState( + defaultOpen ?? false, + open, + onOpenChange + ); + + return ( + + {children} + + { + if (event.defaultPrevented) { + return; + } + + setIsOpen(false); + + // Prevent further parent layers from closing + event.preventDefault(); + }} + onInteractOutside={(event) => { + // Prevent closing when interacting with elements inside portals + // (e.g., emoji picker, dropdowns) + const target = event.target as HTMLElement; + if (target.closest(".lb-portal")) { + event.preventDefault(); + } + }} + asChild + > + )} + /> + + + + ); + } +) as ( + props: FloatingComposerProps & RefAttributes +) => JSX.Element; diff --git a/packages/liveblocks-react-ui/src/components/FloatingThread.tsx b/packages/liveblocks-react-ui/src/components/FloatingThread.tsx new file mode 100644 index 0000000000..cd2ac763a4 --- /dev/null +++ b/packages/liveblocks-react-ui/src/components/FloatingThread.tsx @@ -0,0 +1,120 @@ +"use client"; + +import type { BaseMetadata, DCM, DTM, Relax } from "@liveblocks/core"; +import { Popover as PopoverPrimitive } from "radix-ui"; +import { + type ForwardedRef, + forwardRef, + type ReactNode, + type RefAttributes, +} from "react"; + +import { useLiveblocksUiConfig } from "../config"; +import { + FLOATING_ELEMENT_COLLISION_PADDING, + FLOATING_ELEMENT_SIDE_OFFSET, +} from "../constants"; +import { useOverrides } from "../overrides"; +import { cn } from "../utils/cn"; +import { useControllableState } from "../utils/use-controllable-state"; +import type { ThreadProps } from "./Thread"; +import { Thread } from "./Thread"; + +export interface FloatingThreadProps< + TM extends BaseMetadata = DTM, + CM extends BaseMetadata = DCM, +> extends ThreadProps, + Relax< + Pick< + PopoverPrimitive.PopoverProps, + "defaultOpen" | "open" | "onOpenChange" + > & + Pick< + PopoverPrimitive.PopoverContentProps, + "side" | "sideOffset" | "align" | "alignOffset" + > + > { + /** + * The element which opens the floating thread. + */ + children: ReactNode; +} + +/** + * Displays a floating thread attached to a trigger element. + */ +export const FloatingThread = forwardRef( + ( + { + thread, + children, + defaultOpen, + open, + onOpenChange, + side = "right", + sideOffset = FLOATING_ELEMENT_SIDE_OFFSET, + align = "start", + alignOffset, + overrides, + className, + ...props + }: FloatingThreadProps, + forwardedRef: ForwardedRef + ) => { + const $ = useOverrides(overrides); + const { portalContainer } = useLiveblocksUiConfig(); + const [isOpen, setIsOpen] = useControllableState( + defaultOpen ?? false, + open, + onOpenChange + ); + + return ( + + {children} + + { + if (event.defaultPrevented) { + return; + } + + setIsOpen(false); + + // Prevent further parent layers from closing + event.preventDefault(); + }} + onInteractOutside={(event) => { + // Prevent closing when interacting with elements inside portals + // (e.g., emoji picker, dropdowns) + const target = event.target as HTMLElement; + if (target.closest(".lb-portal")) { + event.preventDefault(); + } + }} + asChild + > + + + + + ); + } +) as ( + props: FloatingThreadProps & RefAttributes +) => JSX.Element; diff --git a/packages/liveblocks-react-ui/src/components/InboxNotification.tsx b/packages/liveblocks-react-ui/src/components/InboxNotification.tsx index 0397f6aca8..6a0538a231 100644 --- a/packages/liveblocks-react-ui/src/components/InboxNotification.tsx +++ b/packages/liveblocks-react-ui/src/components/InboxNotification.tsx @@ -21,8 +21,7 @@ import { useRoomInfo, } from "@liveblocks/react"; import { useRoomThreadSubscription } from "@liveblocks/react/_private"; -import { Slot } from "@radix-ui/react-slot"; -import { TooltipProvider } from "@radix-ui/react-tooltip"; +import { Slot as SlotPrimitive } from "radix-ui"; import type { ComponentProps, ComponentPropsWithoutRef, @@ -63,7 +62,7 @@ import { } from "./internal/InboxNotificationThread"; import { List } from "./internal/List"; import { Room } from "./internal/Room"; -import { Tooltip } from "./internal/Tooltip"; +import { Tooltip, TooltipProvider } from "./internal/Tooltip"; import { User } from "./internal/User"; type ComponentTypeWithRef< @@ -278,7 +277,7 @@ const InboxNotificationLayout = forwardRef< ) => { const $ = useOverrides(overrides); const { Anchor } = useComponents(components); - const Component = asChild ? Slot : Anchor; + const Component = asChild ? SlotPrimitive.Slot : Anchor; const [isMoreActionOpen, setMoreActionOpen] = useState(false); const markInboxNotificationAsRead = useMarkInboxNotificationAsRead(); const deleteInboxNotification = useDeleteInboxNotification(); diff --git a/packages/liveblocks-react-ui/src/components/Thread.tsx b/packages/liveblocks-react-ui/src/components/Thread.tsx index 733ee92f40..09c79c5234 100644 --- a/packages/liveblocks-react-ui/src/components/Thread.tsx +++ b/packages/liveblocks-react-ui/src/components/Thread.tsx @@ -5,31 +5,32 @@ import { type CommentData, type DCM, type DTM, + findLastIndex, Permission, type ThreadData, } from "@liveblocks/core"; -import { findLastIndex } from "@liveblocks/core"; import { + useMarkRoomThreadAsRead, useMarkRoomThreadAsResolved, useMarkRoomThreadAsUnresolved, useRoomPermissions, useRoomThreadSubscription, } from "@liveblocks/react/_private"; -import * as TogglePrimitive from "@radix-ui/react-toggle"; -import type { - ComponentPropsWithoutRef, - ForwardedRef, - PropsWithChildren, - ReactNode, - RefAttributes, - SyntheticEvent, -} from "react"; +import { Toggle as TogglePrimitive } from "radix-ui"; import { + type ComponentPropsWithoutRef, + type ComponentType, + type ForwardedRef, forwardRef, Fragment, + type PropsWithChildren, + type ReactNode, + type RefAttributes, + type SyntheticEvent, useCallback, useEffect, useMemo, + useRef, useState, } from "react"; @@ -47,13 +48,56 @@ import type { } from "../overrides"; import { useOverrides } from "../overrides"; import { cn } from "../utils/cn"; -import type { CommentProps } from "./Comment"; -import { Comment } from "./Comment"; -import type { ComposerProps } from "./Composer"; -import { Composer } from "./Composer"; +import { useStableComponent } from "../utils/use-stable-component"; +import { useIntersectionCallback } from "../utils/use-visible"; +import { useWindowFocus } from "../utils/use-window-focus"; +import { Comment as DefaultComment, type CommentProps } from "./Comment"; +import { Composer, type ComposerProps } from "./Composer"; import { Button } from "./internal/Button"; import { Tooltip, TooltipProvider } from "./internal/Tooltip"; +// An invisible marker used to mark a thread as read only when it becomes visible. +function MarkThreadAsReadMarker({ thread }: { thread: ThreadData }) { + const { id: threadId, roomId } = thread; + const ref = useRef(null); + const markThreadAsRead = useMarkRoomThreadAsRead(roomId); + const isWindowFocused = useWindowFocus(); + + useIntersectionCallback( + ref, + (isIntersecting) => { + if (isIntersecting) { + markThreadAsRead(threadId); + } + }, + { + // The underlying IntersectionObserver is only enabled when the window is focused + enabled: isWindowFocused, + } + ); + + return ( +
+ ); +} + +export interface ThreadComponents< + // Future components might reference thread metadata so we declare it + // already to respect the `TM` → `CM` order used everywhere else. + _TM extends BaseMetadata = DTM, + CM extends BaseMetadata = DCM, +> { + /** + * The component used to display comments. + */ + Comment: ComponentType>; +} + export interface ThreadProps< TM extends BaseMetadata = DTM, CM extends BaseMetadata = DCM, @@ -93,7 +137,7 @@ export interface ThreadProps< */ commentDropdownItems?: | ReactNode - | ((props: PropsWithChildren<{ comment: CommentData }>) => ReactNode); + | ((props: PropsWithChildren<{ comment: CommentData }>) => ReactNode); /** * The maximum number of comments to show. @@ -177,6 +221,11 @@ export interface ThreadProps< */ onComposerSubmit?: ComposerProps["onComposerSubmit"]; + /** + * Whether to focus the composer on mount. + */ + autoFocus?: ComposerProps["autoFocus"]; + /** * Override the component's strings. */ @@ -187,7 +236,7 @@ export interface ThreadProps< /** * Override the component's components. */ - components?: Partial; + components?: Partial>; } /** @@ -224,6 +273,7 @@ export const Thread = forwardRef( onAttachmentClick, onComposerSubmit, blurComposerOnSubmit, + autoFocus, overrides, components, className, @@ -231,6 +281,7 @@ export const Thread = forwardRef( }: ThreadProps, forwardedRef: ForwardedRef ) => { + const Comment = useStableComponent(components?.Comment, DefaultComment); const markThreadAsResolved = useMarkRoomThreadAsResolved(thread.roomId); const markThreadAsUnresolved = useMarkRoomThreadAsUnresolved(thread.roomId); const $ = useOverrides(overrides); @@ -245,6 +296,11 @@ export const Thread = forwardRef( ? thread.comments.length - 1 : findLastIndex(thread.comments, (comment) => Boolean(comment.body)); }, [showDeletedComments, thread.comments]); + const commentsCount = useMemo(() => { + return showDeletedComments + ? thread.comments.length + : thread.comments.filter((comment) => comment.body).length; + }, [showDeletedComments, thread.comments]); const hiddenComments = useMemo(() => { const maxVisibleCommentsCount = typeof maxVisibleComments === "number" @@ -429,6 +485,8 @@ export const Thread = forwardRef( } }, [subscriptionStatus, subscribe, unsubscribe]); + let currentCommentIndex = 0; + return (
-
+
{thread.comments.map((comment, index) => { + const isNonDeletedComment = showDeletedComments || comment.body; const isFirstComment = index === firstCommentIndex; const isUnread = unreadIndex !== undefined && index >= unreadIndex; @@ -452,13 +511,15 @@ export const Thread = forwardRef( hiddenComments && index >= hiddenComments.firstIndex && index <= hiddenComments.lastIndex; + const isHiddenBecauseDeleted = + !showDeletedComments && !comment.body; const isFirstHiddenComment = isHidden && index === hiddenComments.firstIndex; if (isFirstHiddenComment) { return (
+ {unreadIndex !== undefined && ( + + )} {showComposer && ( )}
diff --git a/packages/liveblocks-react-ui/src/components/internal/Avatar.tsx b/packages/liveblocks-react-ui/src/components/internal/Avatar.tsx index c44a98f30d..de0f0a72cd 100644 --- a/packages/liveblocks-react-ui/src/components/internal/Avatar.tsx +++ b/packages/liveblocks-react-ui/src/components/internal/Avatar.tsx @@ -55,8 +55,9 @@ function AvatarLayout({ data-loading={isLoading ? "" : undefined} {...props} > - {src && {name}} - {nameInitials ? ( + {src ? ( + {name} + ) : nameInitials ? ( {nameInitials} diff --git a/packages/liveblocks-react-ui/src/components/internal/Dropdown.tsx b/packages/liveblocks-react-ui/src/components/internal/Dropdown.tsx index be42b4ea06..17e560ce64 100644 --- a/packages/liveblocks-react-ui/src/components/internal/Dropdown.tsx +++ b/packages/liveblocks-react-ui/src/components/internal/Dropdown.tsx @@ -1,6 +1,6 @@ "use client"; -import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"; +import { DropdownMenu as DropdownMenuPrimitive } from "radix-ui"; import type { ReactNode } from "react"; import { forwardRef } from "react"; @@ -85,4 +85,4 @@ export const DropdownItem = forwardRef( } ); -export { DropdownMenuTrigger as DropdownTrigger } from "@radix-ui/react-dropdown-menu"; +export const DropdownTrigger = DropdownMenuPrimitive.Trigger; diff --git a/packages/liveblocks-react-ui/src/components/internal/EmojiPicker.tsx b/packages/liveblocks-react-ui/src/components/internal/EmojiPicker.tsx index 4289d203eb..3b60cc2a1a 100644 --- a/packages/liveblocks-react-ui/src/components/internal/EmojiPicker.tsx +++ b/packages/liveblocks-react-ui/src/components/internal/EmojiPicker.tsx @@ -1,4 +1,3 @@ -import * as PopoverPrimitive from "@radix-ui/react-popover"; import { type Emoji as FrimousseEmoji, EmojiPicker as EmojiPickerPrimitive, @@ -7,6 +6,7 @@ import { type EmojiPickerListRowProps, type Locale, } from "frimousse"; +import { Popover as PopoverPrimitive } from "radix-ui"; import type { ComponentPropsWithoutRef, SyntheticEvent } from "react"; import { forwardRef, useCallback, useState } from "react"; @@ -179,4 +179,4 @@ export const EmojiPicker = forwardRef( } ); -export { PopoverTrigger as EmojiPickerTrigger } from "@radix-ui/react-popover"; +export const EmojiPickerTrigger = PopoverPrimitive.Trigger; diff --git a/packages/liveblocks-react-ui/src/components/internal/List.tsx b/packages/liveblocks-react-ui/src/components/internal/List.tsx index 22da82bc51..2254c109d2 100644 --- a/packages/liveblocks-react-ui/src/components/internal/List.tsx +++ b/packages/liveblocks-react-ui/src/components/internal/List.tsx @@ -1,4 +1,4 @@ -import { Slot } from "@radix-ui/react-slot"; +import { Slot as SlotPrimitive } from "radix-ui"; import type { ReactNode } from "react"; import { forwardRef, useMemo } from "react"; @@ -19,7 +19,7 @@ export const List = forwardRef( { values, formatRemaining, truncate, locale, className, asChild, ...props }, forwardedRef ) => { - const Component = asChild ? Slot : "span"; + const Component = asChild ? SlotPrimitive.Slot : "span"; const $ = useOverrides(); const formatRemainingWithDefault = formatRemaining ?? $.LIST_REMAINING; const formattedList = useMemo(() => { diff --git a/packages/liveblocks-react-ui/src/components/internal/Tooltip.tsx b/packages/liveblocks-react-ui/src/components/internal/Tooltip.tsx index efab5edea5..72fda01e84 100644 --- a/packages/liveblocks-react-ui/src/components/internal/Tooltip.tsx +++ b/packages/liveblocks-react-ui/src/components/internal/Tooltip.tsx @@ -1,6 +1,6 @@ "use client"; -import * as TooltipPrimitive from "@radix-ui/react-tooltip"; +import { Tooltip as TooltipPrimitive } from "radix-ui"; import type { ComponentProps, ReactNode } from "react"; import { forwardRef, useMemo } from "react"; @@ -139,4 +139,4 @@ function ShortcutTooltipKey({ name, ...props }: ShortcutTooltipKeyProps) { ); } -export { TooltipProvider } from "@radix-ui/react-tooltip"; +export const TooltipProvider = TooltipPrimitive.Provider; diff --git a/packages/liveblocks-react-ui/src/index.ts b/packages/liveblocks-react-ui/src/index.ts index 8a7eb41b36..75e3efb765 100644 --- a/packages/liveblocks-react-ui/src/index.ts +++ b/packages/liveblocks-react-ui/src/index.ts @@ -13,13 +13,28 @@ export type { export { AiChat } from "./components/AiChat"; export type { AiToolIconProps, AiToolProps } from "./components/AiTool"; export { AiTool } from "./components/AiTool"; +export type { AvatarStackProps } from "./components/AvatarStack"; +export { AvatarStack } from "./components/AvatarStack"; export type { + CommentAuthorProps, + CommentAvatarProps, + CommentDateProps, CommentDropdownItemProps, CommentProps, } from "./components/Comment"; export { Comment } from "./components/Comment"; +export type { CommentPinProps } from "./components/CommentPin"; +export { CommentPin } from "./components/CommentPin"; export type { ComposerProps } from "./components/Composer"; export { Composer } from "./components/Composer"; +export type { CursorProps } from "./components/Cursor"; +export { Cursor } from "./components/Cursor"; +export type { CursorsProps } from "./components/Cursors"; +export { Cursors } from "./components/Cursors"; +export type { FloatingComposerProps } from "./components/FloatingComposer"; +export { FloatingComposer } from "./components/FloatingComposer"; +export type { FloatingThreadProps } from "./components/FloatingThread"; +export { FloatingThread } from "./components/FloatingThread"; export type { HistoryVersionSummaryProps } from "./components/HistoryVersionSummary"; export { HistoryVersionSummary } from "./components/HistoryVersionSummary"; export type { HistoryVersionSummaryListProps } from "./components/HistoryVersionSummaryList"; diff --git a/packages/liveblocks-react-ui/src/primitives/AiComposer/index.tsx b/packages/liveblocks-react-ui/src/primitives/AiComposer/index.tsx index 34372b7022..79239b27cc 100644 --- a/packages/liveblocks-react-ui/src/primitives/AiComposer/index.tsx +++ b/packages/liveblocks-react-ui/src/primitives/AiComposer/index.tsx @@ -6,7 +6,7 @@ import { } from "@liveblocks/core"; import { useClient } from "@liveblocks/react"; import { useLayoutEffect, useSignal } from "@liveblocks/react/_private"; -import { Slot } from "@radix-ui/react-slot"; +import { Slot as SlotPrimitive } from "radix-ui"; import type { FocusEvent, FormEvent, KeyboardEvent, MouseEvent } from "react"; import { forwardRef, @@ -101,7 +101,7 @@ export const AiComposerForm = forwardRef( }, forwardedRef ) => { - const Component = asChild ? Slot : "form"; + const Component = asChild ? SlotPrimitive.Slot : "form"; const client = useClient(); const formRef = useRef(null); const editor = useInitial(() => @@ -451,6 +451,7 @@ const AiComposerEditor = forwardRef( > (({ disabled, asChild, ...props }, forwardedRef) => { - const Component = asChild ? Slot : "button"; + const Component = asChild ? SlotPrimitive.Slot : "button"; const { isDisabled: isComposerDisabled, canSubmit } = useAiComposer(); const isDisabled = isComposerDisabled || disabled || !canSubmit; @@ -511,7 +512,7 @@ export const AiComposerAbort = forwardRef< HTMLButtonElement, AiComposerSubmitProps >(({ disabled, onClick, asChild, ...props }, forwardedRef) => { - const Component = asChild ? Slot : "button"; + const Component = asChild ? SlotPrimitive.Slot : "button"; const { isDisabled: isComposerDisabled, canAbort, abort } = useAiComposer(); const isDisabled = isComposerDisabled || disabled || !canAbort; diff --git a/packages/liveblocks-react-ui/src/primitives/AiMessage/index.tsx b/packages/liveblocks-react-ui/src/primitives/AiMessage/index.tsx index e71395cc9a..77a62f9767 100644 --- a/packages/liveblocks-react-ui/src/primitives/AiMessage/index.tsx +++ b/packages/liveblocks-react-ui/src/primitives/AiMessage/index.tsx @@ -1,5 +1,5 @@ import type { AiAssistantMessage } from "@liveblocks/core"; -import { Slot } from "@radix-ui/react-slot"; +import { Slot as SlotPrimitive } from "radix-ui"; import { forwardRef, useMemo } from "react"; import { ErrorBoundary } from "../../utils/ErrorBoundary"; @@ -43,7 +43,7 @@ const defaultMessageContentComponents: AiMessageContentComponents = { */ const AiMessageContent = forwardRef( ({ message, components, asChild, ...props }, forwardedRef) => { - const Component = asChild ? Slot : "div"; + const Component = asChild ? SlotPrimitive.Slot : "div"; const { ReasoningPart, RetrievalPart, diff --git a/packages/liveblocks-react-ui/src/primitives/Collapsible/index.tsx b/packages/liveblocks-react-ui/src/primitives/Collapsible/index.tsx index a9334293cd..54584b8174 100644 --- a/packages/liveblocks-react-ui/src/primitives/Collapsible/index.tsx +++ b/packages/liveblocks-react-ui/src/primitives/Collapsible/index.tsx @@ -1,4 +1,4 @@ -import { Slot } from "@radix-ui/react-slot"; +import { Slot as SlotPrimitive } from "radix-ui"; import { createContext, forwardRef, @@ -44,7 +44,7 @@ const CollapsibleRoot = forwardRef( controlledOpen, controlledOnOpenChange ); - const Component = asChild ? Slot : "div"; + const Component = asChild ? SlotPrimitive.Slot : "div"; const id = useId(); return ( @@ -68,7 +68,7 @@ const CollapsibleRoot = forwardRef( const CollapsibleTrigger = forwardRef( ({ onClick, asChild, ...props }, forwardedRef) => { - const Component = asChild ? Slot : "button"; + const Component = asChild ? SlotPrimitive.Slot : "button"; const context = useContext(CollapsibleContext); if (!context) { @@ -104,7 +104,7 @@ const CollapsibleTrigger = forwardRef( const CollapsibleContent = forwardRef( ({ asChild, ...props }, forwardedRef) => { - const Component = asChild ? Slot : "div"; + const Component = asChild ? SlotPrimitive.Slot : "div"; const context = useContext(CollapsibleContext); const divRef = useRef(null); diff --git a/packages/liveblocks-react-ui/src/primitives/Comment/index.tsx b/packages/liveblocks-react-ui/src/primitives/Comment/index.tsx index b75aad2266..1a2b4cf948 100644 --- a/packages/liveblocks-react-ui/src/primitives/Comment/index.tsx +++ b/packages/liveblocks-react-ui/src/primitives/Comment/index.tsx @@ -4,7 +4,7 @@ import { MENTION_CHARACTER, sanitizeUrl, } from "@liveblocks/core"; -import { Slot } from "@radix-ui/react-slot"; +import { Slot as SlotPrimitive } from "radix-ui"; import type { ReactNode } from "react"; import { forwardRef, useMemo } from "react"; @@ -27,7 +27,7 @@ const COMMENT_LINK_NAME = "CommentLink"; */ const CommentMention = forwardRef( ({ children, asChild, ...props }, forwardedRef) => { - const Component = asChild ? Slot : "span"; + const Component = asChild ? SlotPrimitive.Slot : "span"; return ( @@ -45,7 +45,7 @@ const CommentMention = forwardRef( */ const CommentLink = forwardRef( ({ children, asChild, ...props }, forwardedRef) => { - const Component = asChild ? Slot : "a"; + const Component = asChild ? SlotPrimitive.Slot : "a"; return ( ( ({ body, components, style, asChild, ...props }, forwardedRef) => { - const Component = asChild ? Slot : "div"; + const Component = asChild ? SlotPrimitive.Slot : "div"; const { Mention, Link } = useMemo( () => ({ ...defaultBodyComponents, ...components }), [components] diff --git a/packages/liveblocks-react-ui/src/primitives/Composer/index.tsx b/packages/liveblocks-react-ui/src/primitives/Composer/index.tsx index 35320d0813..cef2fa8649 100644 --- a/packages/liveblocks-react-ui/src/primitives/Composer/index.tsx +++ b/packages/liveblocks-react-ui/src/primitives/Composer/index.tsx @@ -19,8 +19,7 @@ import { useResolveMentionSuggestions, useSyncSource, } from "@liveblocks/react/_private"; -import { Slot, Slottable } from "@radix-ui/react-slot"; -import * as TogglePrimitive from "@radix-ui/react-toggle"; +import { Slot as SlotPrimitive, Toggle as TogglePrimitive } from "radix-ui"; import type { AriaAttributes, ChangeEvent, @@ -68,6 +67,7 @@ import { withReact, } from "slate-react"; +import { useCurrentUserId } from "../../shared"; import type { ComposerBody as ComposerBodyData, ComposerBodyAutoLink, @@ -84,6 +84,7 @@ import { requestSubmit } from "../../utils/request-submit"; import { useIndex } from "../../utils/use-index"; import { useInitial } from "../../utils/use-initial"; import { useObservable } from "../../utils/use-observable"; +import { usePreResolveUser } from "../../utils/use-pre-resolve-user"; import { useRefs } from "../../utils/use-refs"; import { withEmptyClearFormatting } from "../slate/plugins/empty-clear-formatting"; import { withNormalize } from "../slate/plugins/normalize"; @@ -480,7 +481,7 @@ const ComposerFloatingToolbar = forwardRef< () => getSideAndAlignFromFloatingPlacement(placement), [placement] ); - const Component = asChild ? Slot : "div"; + const Component = asChild ? SlotPrimitive.Slot : "div"; useAnimationPersist(ref); const handlePointerDown = useCallback( @@ -601,7 +602,7 @@ function ComposerEditorPlaceholder({ */ const ComposerMention = forwardRef( ({ children, asChild, ...props }, forwardedRef) => { - const Component = asChild ? Slot : "span"; + const Component = asChild ? SlotPrimitive.Slot : "span"; const isSelected = useSelected(); return ( @@ -624,7 +625,7 @@ const ComposerMention = forwardRef( */ const ComposerLink = forwardRef( ({ children, asChild, ...props }, forwardedRef) => { - const Component = asChild ? Slot : "a"; + const Component = asChild ? SlotPrimitive.Slot : "a"; return ( getSideAndAlignFromFloatingPlacement(placement), [placement] ); - const Component = asChild ? Slot : "div"; + const Component = asChild ? SlotPrimitive.Slot : "div"; useAnimationPersist(ref); return ( @@ -699,7 +700,7 @@ const ComposerSuggestionsList = forwardRef< ComposerSuggestionsListProps >(({ children, asChild, ...props }, forwardedRef) => { const { id } = useComposerSuggestionsContext(COMPOSER_SUGGESTIONS_LIST_NAME); - const Component = asChild ? Slot : "ul"; + const Component = asChild ? SlotPrimitive.Slot : "ul"; return ( selectedValue === value, [selectedValue, value] @@ -871,6 +872,8 @@ const ComposerEditor = forwardRef( isDisabled: isComposerDisabled, isFocused, } = useComposer(); + const currentUserId = useCurrentUserId(); + const preResolveUser = usePreResolveUser(); const isDisabled = isComposerDisabled || disabled; const initialBody = useInitial(defaultValue ?? emptyCommentBody); const initialEditorValue = useMemo(() => { @@ -1070,9 +1073,15 @@ const ComposerEditor = forwardRef( if (!event.isDefaultPrevented()) { setFocused(true); + + // Pre-resolve the current user's info the first time + // they focus a composer editor. + if (currentUserId) { + preResolveUser(currentUserId); + } } }, - [onFocus, setFocused] + [onFocus, setFocused, currentUserId, preResolveUser] ); const handleBlur = useCallback( @@ -1174,6 +1183,7 @@ const ComposerEditor = forwardRef( > ( }, forwardedRef ) => { - const Component = asChild ? Slot : "form"; + const Component = asChild ? SlotPrimitive.Slot : "form"; const [isEmpty, setEmpty] = useState(true); const [isSubmitting, setSubmitting] = useState(false); const [isFocused, setFocused] = useState(false); @@ -1616,7 +1626,7 @@ const ComposerForm = forwardRef( tabIndex={-1} style={{ display: "none" }} /> - {children} + {children} @@ -1633,7 +1643,7 @@ const ComposerForm = forwardRef( */ const ComposerSubmit = forwardRef( ({ children, disabled, asChild, ...props }, forwardedRef) => { - const Component = asChild ? Slot : "button"; + const Component = asChild ? SlotPrimitive.Slot : "button"; const { canSubmit, isDisabled: isComposerDisabled } = useComposer(); const isDisabled = isComposerDisabled || disabled || !canSubmit; @@ -1660,7 +1670,7 @@ const ComposerAttachFiles = forwardRef< HTMLButtonElement, ComposerAttachFilesProps >(({ children, onClick, disabled, asChild, ...props }, forwardedRef) => { - const Component = asChild ? Slot : "button"; + const Component = asChild ? SlotPrimitive.Slot : "button"; const { hasMaxAttachments } = useComposerAttachmentsContext(); const { isDisabled: isComposerDisabled, attachFiles } = useComposer(); const isDisabled = isComposerDisabled || hasMaxAttachments || disabled; @@ -1713,7 +1723,7 @@ const ComposerAttachmentsDropArea = forwardRef< }, forwardedRef ) => { - const Component = asChild ? Slot : "div"; + const Component = asChild ? SlotPrimitive.Slot : "div"; const { isDisabled: isComposerDisabled } = useComposer(); const isDisabled = isComposerDisabled || disabled; const [, dropAreaProps] = useComposerAttachmentsDropArea({ @@ -1759,7 +1769,7 @@ const ComposerMarkToggle = forwardRef< }, forwardedRef ) => { - const Component = asChild ? Slot : "button"; + const Component = asChild ? SlotPrimitive.Slot : "button"; const { marks, toggleMark } = useComposer(); const handlePointerDown = useCallback( diff --git a/packages/liveblocks-react-ui/src/primitives/Duration.tsx b/packages/liveblocks-react-ui/src/primitives/Duration.tsx index 8bdbdc0b7f..4ce5fd4d7d 100644 --- a/packages/liveblocks-react-ui/src/primitives/Duration.tsx +++ b/packages/liveblocks-react-ui/src/primitives/Duration.tsx @@ -1,7 +1,7 @@ "use client"; import type { Relax } from "@liveblocks/core"; -import { Slot } from "@radix-ui/react-slot"; +import { Slot as SlotPrimitive } from "radix-ui"; import { forwardRef, type ReactNode, useMemo } from "react"; import type { ComponentPropsWithSlot } from "../types"; @@ -305,7 +305,7 @@ export const Duration = forwardRef( }, forwardedRef ) => { - const Component = asChild ? Slot : "time"; + const Component = asChild ? SlotPrimitive.Slot : "time"; const [rerender, key] = useRerender(); const resolvedDuration = useMemo(() => { if (duration !== undefined) { diff --git a/packages/liveblocks-react-ui/src/primitives/FileSize.tsx b/packages/liveblocks-react-ui/src/primitives/FileSize.tsx index ab26a9508c..4c500c3f1b 100644 --- a/packages/liveblocks-react-ui/src/primitives/FileSize.tsx +++ b/packages/liveblocks-react-ui/src/primitives/FileSize.tsx @@ -1,6 +1,6 @@ "use client"; -import { Slot } from "@radix-ui/react-slot"; +import { Slot as SlotPrimitive } from "radix-ui"; import type { ReactNode } from "react"; import { forwardRef, useMemo } from "react"; @@ -44,7 +44,7 @@ export const FileSize = forwardRef( }, forwardedRef ) => { - const Component = asChild ? Slot : "span"; + const Component = asChild ? SlotPrimitive.Slot : "span"; const children = useMemo( () => typeof renderChildren === "function" diff --git a/packages/liveblocks-react-ui/src/primitives/Markdown.tsx b/packages/liveblocks-react-ui/src/primitives/Markdown.tsx index 025664e9a7..a2811e5de3 100644 --- a/packages/liveblocks-react-ui/src/primitives/Markdown.tsx +++ b/packages/liveblocks-react-ui/src/primitives/Markdown.tsx @@ -1,11 +1,11 @@ import { assertNever, isUrl, type Relax, sanitizeUrl } from "@liveblocks/core"; -import { Slot } from "@radix-ui/react-slot"; import { Lexer, type MarkedToken, type Token as DefaultToken, type Tokens, } from "marked"; +import { Slot as SlotPrimitive } from "radix-ui"; import { type ComponentType, forwardRef, @@ -437,7 +437,7 @@ const defaultComponents: MarkdownComponents = { export const Markdown = forwardRef( ({ content, partial, components, asChild, ...props }, forwardedRef) => { - const Component = asChild ? Slot : "div"; + const Component = asChild ? SlotPrimitive.Slot : "div"; const tokens = useMemo(() => { if (!content) { return []; diff --git a/packages/liveblocks-react-ui/src/primitives/Timestamp.tsx b/packages/liveblocks-react-ui/src/primitives/Timestamp.tsx index e67c7a0f16..0e22d3a364 100644 --- a/packages/liveblocks-react-ui/src/primitives/Timestamp.tsx +++ b/packages/liveblocks-react-ui/src/primitives/Timestamp.tsx @@ -1,6 +1,6 @@ "use client"; -import { Slot } from "@radix-ui/react-slot"; +import { Slot as SlotPrimitive } from "radix-ui"; import type { ReactNode } from "react"; import { forwardRef, useMemo } from "react"; @@ -175,7 +175,7 @@ export const Timestamp = forwardRef( }, forwardedRef ) => { - const Component = asChild ? Slot : "time"; + const Component = asChild ? SlotPrimitive.Slot : "time"; const [rerender, key] = useRerender(); const parsedDate = useMemo(() => new Date(date), [date]); const normalizedDate = useMemo( diff --git a/packages/liveblocks-react-ui/src/styles/dark/index.css b/packages/liveblocks-react-ui/src/styles/dark/index.css index b0f0f030e3..ee576feec3 100644 --- a/packages/liveblocks-react-ui/src/styles/dark/index.css +++ b/packages/liveblocks-react-ui/src/styles/dark/index.css @@ -23,7 +23,7 @@ color-scheme: dark; - &:where(.lb-elevation, .lb-tooltip) { + &:where(.lb-elevation, .lb-tooltip, .lb-comment-pin) { --lb-background: #333; --lb-foreground-contrast: 10%; } diff --git a/packages/liveblocks-react-ui/src/styles/index.css b/packages/liveblocks-react-ui/src/styles/index.css index bc48505e42..a01037d4db 100644 --- a/packages/liveblocks-react-ui/src/styles/index.css +++ b/packages/liveblocks-react-ui/src/styles/index.css @@ -1346,6 +1346,7 @@ padding: var(--lb-spacing); background: var(--lb-dynamic-background); color: var(--lb-foreground); + outline: none; font-weight: 400; scroll-margin: var(--lb-spacing); @@ -1371,7 +1372,7 @@ --lb-dynamic-background: var(--lb-background-accent-faint); } - &:where([data-editing]) { + &:where([data-editing], :focus-visible) { --lb-dynamic-background: var(--lb-background-foreground-faint); } } @@ -1651,6 +1652,239 @@ } } +/************************************* + * Floating Thread * + *************************************/ + +.lb-floating-thread { + --lb-floating-thread-size: 350px; + + inline-size: var(--lb-floating-thread-size); +} + +/************************************* + * Floating Thread Composer * + *************************************/ + +.lb-floating-thread-composer { + --lb-floating-thread-composer-size: 350px; + + inline-size: var(--lb-floating-thread-composer-size); + + :where(.lb-thread, .lb-composer) { + inline-size: 100%; + } +} + +/************************************* + * Floating Composer * + *************************************/ + +.lb-floating-composer { + --lb-floating-composer-size: 350px; + + inline-size: var(--lb-floating-composer-size); +} + +/************************************* + * Comment Pin * + *************************************/ + +.lb-comment-pin { + --lb-comment-pin-size: 32px; + --lb-comment-pin-padding: 4px; + + @include button; + + position: relative; + display: flex; + justify-content: center; + align-items: center; + inline-size: var(--lb-comment-pin-size); + block-size: var(--lb-comment-pin-size); + padding: var(--lb-comment-pin-padding); + border-radius: $lb-radius-full; + background: var(--lb-background); + box-shadow: var(--lb-elevation-shadow); + isolation: isolate; + + &::after { + content: ""; + position: absolute; + inset: 0; + z-index: 1; + border-radius: inherit; + box-shadow: var(--lb-inset-shadow); + pointer-events: none; + } + + &:where([data-corner="top-left"]) { + border-start-start-radius: 2px; + transform: translate(0, 0); + } + + &:where([data-corner="top-right"]) { + border-start-end-radius: 2px; + transform: translate(-100%, 0); + } + + &:where([data-corner="bottom-right"]) { + border-end-end-radius: 2px; + transform: translate(-100%, -100%); + } + + &:where([data-corner="bottom-left"]) { + border-end-start-radius: 2px; + transform: translate(0, -100%); + } +} + +.lb-comment-pin-avatar { + inline-size: 100%; + block-size: 100%; +} + +/************************************* + * Avatar Stack * + *************************************/ + +.lb-avatar-stack { + --lb-avatar-stack-size: 24px; + --lb-avatar-stack-overlap: calc(0.25 * var(--lb-avatar-stack-size)); + --lb-avatar-stack-gap: 2px; + + display: flex; + flex-direction: row; + isolation: isolate; +} + +.lb-avatar-stack-avatar { + position: relative; + z-index: calc( + var(--lb-avatar-stack-count) - var(--lb-avatar-stack-avatar-index) + ); + inline-size: var(--lb-avatar-stack-size); + block-size: var(--lb-avatar-stack-size); + margin-inline-end: calc(-1 * var(--lb-avatar-stack-overlap)); + border-radius: $lb-radius-full; + + &:where(:not(:first-child)) { + --lb-avatar-stack-mask-size: calc( + var(--lb-avatar-stack-size) / 2 + var(--lb-avatar-stack-gap) + ); + + mask-image: radial-gradient( + circle at + calc(var(--lb-avatar-stack-overlap) - var(--lb-avatar-stack-size) / 2) + 50%, + transparent var(--lb-avatar-stack-mask-size), + black calc(var(--lb-avatar-stack-mask-size) + 0.375px) + ); + } +} + +/************************************* + * Users Tooltip * + *************************************/ + +.lb-users-tooltip-list { + --lb-users-tooltip-avatar-size: 1rem; + + display: flex; + flex-direction: column; + gap: calc(0.625 * var(--lb-spacing)); + margin: 0; + padding-inline: 0; + padding-block: calc(0.75 * var(--lb-spacing)); + list-style: none; +} + +.lb-users-tooltip-list-item { + display: flex; + gap: calc(0.625 * var(--lb-spacing)); + align-items: center; + + :where(.lb-avatar) { + inline-size: var(--lb-users-tooltip-avatar-size); + block-size: var(--lb-users-tooltip-avatar-size); + } +} + +/************************************* + * Cursor * + *************************************/ + +.lb-cursor { + --lb-cursor-color: var(--lb-accent); + --lb-cursor-pointer-size: 1rem; + + position: relative; + inline-size: 0; + block-size: 0; + color: var(--lb-cursor-color); + filter: drop-shadow(0 2px 6px rgb(0 0 0 / 5%)) + drop-shadow(0 8px 26px rgb(0 0 0 / 6%)); + pointer-events: none; + isolation: isolate; +} + +.lb-cursor-pointer { + position: absolute; + inset-inline-start: 0; + inset-block-start: 0; + inline-size: var(--lb-cursor-pointer-size); + block-size: var(--lb-cursor-pointer-size); +} + +.lb-cursor-bubble { + position: absolute; + inset-inline-start: calc(0.8125 * var(--lb-cursor-pointer-size)); + inset-block-start: calc(0.8125 * var(--lb-cursor-pointer-size)); + padding: calc(0.375 * var(--lb-spacing)) calc(0.6875 * var(--lb-spacing)); + border-radius: $lb-radius-full; + background: currentcolor; + font-size: 0.8125rem; + will-change: transform; +} + +.lb-cursor-bubble-label { + font-weight: 500; + line-height: 1; + white-space: nowrap; + + /* Use relative color to derive a text color legible against the background. */ + @supports (color: oklch(from black l c h)) { + color: oklch( + from var(--lb-cursor-color) clamp(0, (l / 0.623 - 1) * -infinity, 1) 0 h + ); + } + + /* Use a filter trick if relative color is not supported. */ + @supports not (color: oklch(from black l c h)) { + opacity: 0.95; + filter: invert(1) grayscale(1) brightness(1.3) contrast(9000); + mix-blend-mode: luminosity; + } +} + +/************************************* + * Cursors * + *************************************/ + +.lb-cursors { + position: relative; + overflow: clip; + isolation: isolate; +} + +.lb-cursors-container { + position: absolute; + inset: 0; + z-index: 1; + pointer-events: none; + isolation: isolate; +} + /************************************* * Attachments * *************************************/ @@ -2252,6 +2486,7 @@ border-radius: var(--lb-radius); background: var(--lb-dynamic-background); box-shadow: var(--lb-elevation-shadow); + isolation: isolate; &::after { content: ""; @@ -2332,7 +2567,10 @@ .lb-composer-suggestions, .lb-composer-floating-toolbar, .lb-tooltip, -.lb-emoji-picker { +.lb-emoji-picker, +.lb-floating-thread, +.lb-floating-composer, +.lb-floating-thread-composer { animation-duration: var(--lb-transition-duration); animation-timing-function: var(--lb-transition-easing); will-change: transform, opacity; @@ -2354,12 +2592,19 @@ } } +:is(.lb-floating-thread, .lb-floating-composer, .lb-floating-thread-composer) { + animation-name: lb-animation-appear; +} + :is( .lb-dropdown, .lb-emoji-picker, .lb-tooltip, .lb-composer-suggestions, - .lb-composer-floating-toolbar + .lb-composer-floating-toolbar, + .lb-floating-thread, + .lb-floating-composer, + .lb-floating-thread-composer ) { &:where([data-state="closed"]) { animation-name: lb-animation-disappear; @@ -2370,7 +2615,10 @@ .lb-dropdown:where(:not([data-state="closed"])), .lb-emoji-picker:where(:not([data-state="closed"])), .lb-tooltip:where([data-state="delayed-open"]:not([data-state="closed"])), - .lb-composer-suggestions:where(:not([data-state="closed"])) { + .lb-composer-suggestions:where(:not([data-state="closed"])), + .lb-floating-thread:where(:not([data-state="closed"])), + .lb-floating-composer:where(:not([data-state="closed"])), + .lb-floating-thread-composer:where(:not([data-state="closed"])) { animation-name: lb-animation-appear; } } diff --git a/packages/liveblocks-react-ui/src/utils/Portal.tsx b/packages/liveblocks-react-ui/src/utils/Portal.tsx index 17c7611d8e..3263d5d885 100644 --- a/packages/liveblocks-react-ui/src/utils/Portal.tsx +++ b/packages/liveblocks-react-ui/src/utils/Portal.tsx @@ -1,6 +1,6 @@ "use client"; -import { Slot } from "@radix-ui/react-slot"; +import { Slot as SlotPrimitive } from "radix-ui"; import { forwardRef } from "react"; import { createPortal } from "react-dom"; @@ -13,7 +13,7 @@ const Portal = forwardRef>( ({ asChild, ...props }, forwardedRef) => { const { portalContainer } = useLiveblocksUiConfig(); const container = portalContainer ?? document?.body; - const Component = asChild ? Slot : "div"; + const Component = asChild ? SlotPrimitive.Slot : "div"; return container ? createPortal( diff --git a/packages/liveblocks-react-ui/src/utils/animation-loop.ts b/packages/liveblocks-react-ui/src/utils/animation-loop.ts new file mode 100644 index 0000000000..127c4605e0 --- /dev/null +++ b/packages/liveblocks-react-ui/src/utils/animation-loop.ts @@ -0,0 +1,49 @@ +const MAX_DELTA_TIME = 0.05; + +export type Animatable = { active: boolean; step(deltaTime: number): void }; + +export function makeAnimationLoop() { + const items = new Set(); + let animationFrame: number | null = null; + let lastTime = 0; + + function tick(currentTime: number) { + const deltaTime = Math.min((currentTime - lastTime) / 1000, MAX_DELTA_TIME); + lastTime = currentTime; + + for (const item of items) { + item.step(deltaTime); + } + + for (const item of items) { + if (!item.active) { + items.delete(item); + } + } + + if (items.size > 0) { + animationFrame = requestAnimationFrame(tick); + } else { + animationFrame = null; + } + } + + return { + add(item: Animatable) { + items.add(item); + + if (animationFrame === null) { + lastTime = performance.now(); + animationFrame = requestAnimationFrame(tick); + } + }, + remove(item: Animatable) { + items.delete(item); + + if (items.size === 0 && animationFrame !== null) { + cancelAnimationFrame(animationFrame); + animationFrame = null; + } + }, + }; +} diff --git a/packages/liveblocks-react-ui/src/utils/use-pre-resolve-user.ts b/packages/liveblocks-react-ui/src/utils/use-pre-resolve-user.ts new file mode 100644 index 0000000000..990850f998 --- /dev/null +++ b/packages/liveblocks-react-ui/src/utils/use-pre-resolve-user.ts @@ -0,0 +1,22 @@ +import { kInternal } from "@liveblocks/core"; +import { useClient } from "@liveblocks/react"; +import { useCallback } from "react"; + +/** + * Returns a function that resolves a user ID ahead of time to + * make subsequent calls to `useUser` cached. This is useful for + * known scenarios like resolving the current user's info + * before they post a comment. + * + * This function is a no-op if the user ID is already resolved. + */ +export function usePreResolveUser() { + const client = useClient(); + + return useCallback( + (userId: string) => { + void client[kInternal].usersStore.enqueue(userId); + }, + [client] + ); +} diff --git a/packages/liveblocks-react-ui/src/utils/use-stable-component.tsx b/packages/liveblocks-react-ui/src/utils/use-stable-component.tsx new file mode 100644 index 0000000000..11bd057a10 --- /dev/null +++ b/packages/liveblocks-react-ui/src/utils/use-stable-component.tsx @@ -0,0 +1,47 @@ +import { + type ComponentClass, + type ComponentType, + type FunctionComponent, + useMemo, + useRef, +} from "react"; + +function isClassComponent

( + Component: ComponentType

+): Component is ComponentClass

{ + return Boolean( + Component.prototype && "isReactComponent" in Component.prototype + ); +} + +/** + * Stabilizes a component by creating a stable wrapper that will not be remounted + * when the component changes. + */ +export function useStableComponent< + P extends object, + D extends ComponentType

, +>(Component: ComponentType

| undefined, DefaultComponent: D): D { + const Default: ComponentType

= DefaultComponent; + const ref = useRef(Component); + ref.current = Component; + + const Stable = useMemo>( + () => (props) => { + const Component = ref.current; + + if (!Component) { + return ; + } + + if (isClassComponent(Component)) { + return ; + } + + return Component(props); + }, + [Default] + ); + + return Stable as D; +} diff --git a/packages/liveblocks-react/scripts/check-exports.ts b/packages/liveblocks-react/scripts/check-exports.ts index f040d5723a..47c0aa3d47 100755 --- a/packages/liveblocks-react/scripts/check-exports.ts +++ b/packages/liveblocks-react/scripts/check-exports.ts @@ -376,6 +376,49 @@ for (const name of intersection(suspenseNames, classicNames)) { } } +// Ensure the bundle object in createRoomContext() always wires +// _withBoundRoomContext versions (not the global hooks). +{ + const roomProject = new Project({ tsConfigFilePath: "tsconfig.json" }); + const roomSource = roomProject.addSourceFileAtPath("src/room.tsx"); + const fn = roomSource.getFunctionOrThrow("createRoomContext"); + let hasIssue = false; + + for (const prop of fn.getDescendantsOfKind(SyntaxKind.PropertyAssignment)) { + const key = prop.getName(); + if (!key.startsWith("use")) continue; + + const isSuspense = prop + .getAncestors() + .some((a) => Node.isPropertyAssignment(a) && a.getName() === "suspense"); + const variant = isSuspense ? "suspense" : "classic"; + + let initializer = prop.getInitializerOrThrow(); + if (Node.isAsExpression(initializer)) { + initializer = initializer.getExpression(); + } + + const value = initializer.getText(); + if (!value.endsWith("_withBoundRoomContext")) { + hasIssue = true; + warn( + blue(key), + magenta(`[${variant}]`), + "is not using a", + yellow("_withBoundRoomContext"), + "version", + "⚠️" + ); + } + } + + if (hasIssue) { + console.warn( + `Hooks returned from ${blue("createRoomContext()")} should always use their bound room context.` + ); + } +} + if (numIssues > 0) { console.log(`Found ${numIssues} issue${numIssues !== 1 ? "s" : ""}`); process.exit(2); diff --git a/packages/liveblocks-react/src/__tests__/index.test.tsx b/packages/liveblocks-react/src/__tests__/index.test.tsx index dfe8598f81..3c880c5ad0 100644 --- a/packages/liveblocks-react/src/__tests__/index.test.tsx +++ b/packages/liveblocks-react/src/__tests__/index.test.tsx @@ -4,7 +4,7 @@ import { render } from "@testing-library/react"; import { rest } from "msw"; import { setupServer } from "msw/node"; -import { createRoomContext } from "../room"; +import { createRoomContext, useRoom as useRoomGlobal } from "../room"; import { useCanRedo, useCanUndo, @@ -85,10 +85,7 @@ describe("RoomProvider", () => { expect(authEndpointMock).toHaveBeenCalled(); }); - // TODO: This behavior is a bug that should be fixed. Each createRoomContext() - // call should create its own isolated React context, allowing nested providers - // from different contexts to coexist independently. - test("nested providers from different contexts share the same React context", () => { + test("nested providers from different contexts should return their respective rooms", () => { const client = createClient({ authEndpoint: "/api/auth" }); const contextA = createRoomContext(client); @@ -97,10 +94,12 @@ describe("RoomProvider", () => { function TestComponent() { const roomA = contextA.useRoom(); const roomB = contextB.useRoom(); + const innermost = useRoomGlobal(); return (

{roomA.id} {roomB.id} + {innermost.id}
); } @@ -121,10 +120,9 @@ describe("RoomProvider", () => { ); - // All contexts share the same underlying RoomContext, so the innermost - // provider wins and both hooks return the same room - expect(getByTestId("room-a").textContent).toBe("room-b"); // TODO: Should be "room-a" once fixed + expect(getByTestId("room-a").textContent).toBe("room-a"); expect(getByTestId("room-b").textContent).toBe("room-b"); + expect(getByTestId("innermost").textContent).toBe("room-b"); }); }); diff --git a/packages/liveblocks-react/src/contexts.ts b/packages/liveblocks-react/src/contexts.ts index af176610a2..420501e11f 100644 --- a/packages/liveblocks-react/src/contexts.ts +++ b/packages/liveblocks-react/src/contexts.ts @@ -9,7 +9,7 @@ import type { } from "@liveblocks/client"; import type { OpaqueClient, OpaqueRoom } from "@liveblocks/core"; import { raise } from "@liveblocks/core"; -import { createContext, useContext } from "react"; +import { type Context, createContext, useContext } from "react"; /** * Raw access to the React context where the LiveblocksProvider stores the @@ -41,8 +41,11 @@ export function useClient() { * room. Exposed for advanced use cases only. * * @private This is a private/advanced API. Do not rely on it. + * + * This context is exported publicly as `import { RoomContext } from "@liveblocks/react"`, + * not `GlobalRoomContext`. */ -export const RoomContext = createContext(null); +export const GlobalRoomContext = createContext(null); /** @private */ export function useRoomOrNull< @@ -52,7 +55,9 @@ export function useRoomOrNull< E extends Json, TM extends BaseMetadata, CM extends BaseMetadata, ->(): Room | null { +>( + RoomContext: Context = GlobalRoomContext +): Room | null { return useContext(RoomContext) as Room | null; } diff --git a/packages/liveblocks-react/src/index.ts b/packages/liveblocks-react/src/index.ts index cdd1493952..19d5108237 100644 --- a/packages/liveblocks-react/src/index.ts +++ b/packages/liveblocks-react/src/index.ts @@ -23,7 +23,11 @@ export type { RegisterAiKnowledgeProps, RegisterAiToolProps, } from "./types/ai"; -export { ClientContext, RoomContext, useClient } from "./contexts"; +export { + ClientContext, + GlobalRoomContext as RoomContext, + useClient, +} from "./contexts"; export { createLiveblocksContext, LiveblocksProvider, diff --git a/packages/liveblocks-react/src/room.tsx b/packages/liveblocks-react/src/room.tsx index 6d882dad35..a59892128f 100644 --- a/packages/liveblocks-react/src/room.tsx +++ b/packages/liveblocks-react/src/room.tsx @@ -31,6 +31,7 @@ import type { LiveblocksErrorContext, MentionData, OpaqueClient, + OpaqueRoom, RoomEventMessage, RoomSubscriptionSettings, SignalType, @@ -54,6 +55,7 @@ import { } from "@liveblocks/core"; import type { Context } from "react"; import { + createContext, useCallback, useEffect, useMemo, @@ -65,7 +67,7 @@ import { import { config } from "./config"; import { - RoomContext, + GlobalRoomContext, useClient, useIsInsideRoom, useRoomOrNull, @@ -186,33 +188,6 @@ const _extras = new WeakMap< OpaqueClient, ReturnType >(); -const _bundles = new WeakMap< - OpaqueClient, - RoomContextBundle< - JsonObject, - LsonObject, - BaseUserMeta, - Json, - BaseMetadata, - BaseMetadata - > ->(); - -function getOrCreateRoomContextBundle< - P extends JsonObject, - S extends LsonObject, - U extends BaseUserMeta, - E extends Json, - TM extends BaseMetadata, - CM extends BaseMetadata, ->(client: OpaqueClient): RoomContextBundle { - let bundle = _bundles.get(client); - if (!bundle) { - bundle = makeRoomContextBundle(client); - _bundles.set(client, bundle); - } - return bundle as unknown as RoomContextBundle; -} // TODO: Likely a better / more clear name for this helper will arise. I'll // rename this later. All of these are implementation details to support inbox @@ -348,166 +323,6 @@ type RoomLeavePair< leave: () => void; }; -function makeRoomContextBundle< - P extends JsonObject, - S extends LsonObject, - U extends BaseUserMeta, - E extends Json, - TM extends BaseMetadata, - CM extends BaseMetadata, ->(client: Client): RoomContextBundle { - type TRoom = Room; - - function RoomProvider_withImplicitLiveblocksProvider( - props: RoomProviderProps - ) { - // NOTE: Normally, nesting LiveblocksProvider is not allowed. This - // factory-bound version of the RoomProvider will create an implicit - // LiveblocksProvider. This means that if an end user nests this - // RoomProvider under a LiveblocksProvider context, that would be an error. - // However, we'll allow that nesting only in this specific situation, and - // only because this wrapper will keep the Liveblocks context and the Room - // context consistent internally. - return ( - - {/* @ts-expect-error {...props} is the same type as props */} - - - ); - } - - const shared = createSharedContext(client); - - const bundle: RoomContextBundle = { - RoomContext: RoomContext as Context, - RoomProvider: RoomProvider_withImplicitLiveblocksProvider, - - useRoom, - useStatus, - - useBroadcastEvent, - useOthersListener, - useLostConnectionListener, - useEventListener, - - useHistory, - useUndo, - useRedo, - useCanRedo, - useCanUndo, - - useStorageRoot, - useStorage, - - useSelf, - useMyPresence, - useUpdateMyPresence, - useOthers, - useOthersMapped, - useOthersConnectionIds, - useOther, - - // prettier-ignore - useMutation: useMutation as RoomContextBundle["useMutation"], - - useThreads, - useSearchComments, - - // prettier-ignore - useCreateThread: useCreateThread as RoomContextBundle["useCreateThread"], - - useDeleteThread, - useEditThreadMetadata, - useMarkThreadAsResolved, - useMarkThreadAsUnresolved, - useSubscribeToThread, - useUnsubscribeFromThread, - useCreateComment, - useEditComment, - useEditCommentMetadata, - useDeleteComment, - useAddReaction, - useRemoveReaction, - useMarkThreadAsRead, - useThreadSubscription, - useAttachmentUrl, - - useHistoryVersions, - useHistoryVersionData, - - useRoomSubscriptionSettings, - useUpdateRoomSubscriptionSettings, - - ...shared.classic, - - suspense: { - RoomContext: RoomContext as Context, - RoomProvider: RoomProvider_withImplicitLiveblocksProvider, - - useRoom, - useStatus, - - useBroadcastEvent, - useOthersListener, - useLostConnectionListener, - useEventListener, - - useHistory, - useUndo, - useRedo, - useCanRedo, - useCanUndo, - - useStorageRoot, - useStorage: useStorageSuspense, - - useSelf: useSelfSuspense, - useMyPresence, - useUpdateMyPresence, - useOthers: useOthersSuspense, - useOthersMapped: useOthersMappedSuspense, - useOthersConnectionIds: useOthersConnectionIdsSuspense, - useOther: useOtherSuspense, - - // prettier-ignore - useMutation: useMutation as RoomContextBundle["suspense"]["useMutation"], - - useThreads: useThreadsSuspense, - - // prettier-ignore - useCreateThread: useCreateThread as RoomContextBundle["suspense"]["useCreateThread"], - - useDeleteThread, - useEditThreadMetadata, - useMarkThreadAsResolved, - useMarkThreadAsUnresolved, - useSubscribeToThread, - useUnsubscribeFromThread, - useCreateComment, - useEditComment, - useEditCommentMetadata, - useDeleteComment, - useAddReaction, - useRemoveReaction, - useMarkThreadAsRead, - useThreadSubscription, - useAttachmentUrl: useAttachmentUrlSuspense, - - // TODO: useHistoryVersionData: useHistoryVersionDataSuspense, - useHistoryVersions: useHistoryVersionsSuspense, - - useRoomSubscriptionSettings: useRoomSubscriptionSettingsSuspense, - useUpdateRoomSubscriptionSettings, - - ...shared.suspense, - }, - }; - - return Object.defineProperty(bundle, kInternal, { - enumerable: false, - }); -} - function RoomProvider< P extends JsonObject, S extends LsonObject, @@ -515,7 +330,12 @@ function RoomProvider< E extends Json, TM extends BaseMetadata, CM extends BaseMetadata, ->(props: RoomProviderProps) { +>( + props: RoomProviderProps & { + /** @internal */ + BoundRoomContext: Context; + } +) { const client = useClient(); const [cache] = useState( () => new Map>() @@ -597,10 +417,11 @@ function RoomProviderInner< >( props: RoomProviderProps & { stableEnterRoom: EnterRoomType; + BoundRoomContext?: Context; } ) { const client = useClient(); - const { id: roomId, stableEnterRoom } = props; + const { id: roomId, stableEnterRoom, BoundRoomContext } = props; if (process.env.NODE_ENV !== "production") { if (!roomId) { @@ -726,10 +547,63 @@ function RoomProviderInner< }, [roomId, frozenProps, stableEnterRoom]); return ( - {props.children} + + {BoundRoomContext ? ( + + {props.children} + + ) : ( + props.children + )} + ); } +/** + * @internal + */ +function useRoom_withRoomContext< + P extends JsonObject = DP, + S extends LsonObject = DS, + U extends BaseUserMeta = DU, + E extends Json = DE, + TM extends BaseMetadata = DTM, + CM extends BaseMetadata = DCM, +>( + RoomContext: Context, + options?: { allowOutsideRoom: false } +): Room; +function useRoom_withRoomContext< + P extends JsonObject = DP, + S extends LsonObject = DS, + U extends BaseUserMeta = DU, + E extends Json = DE, + TM extends BaseMetadata = DTM, + CM extends BaseMetadata = DCM, +>( + RoomContext: Context, + options?: { allowOutsideRoom: boolean } +): Room | null; +function useRoom_withRoomContext< + P extends JsonObject = DP, + S extends LsonObject = DS, + U extends BaseUserMeta = DU, + E extends Json = DE, + TM extends BaseMetadata = DTM, + CM extends BaseMetadata = DCM, +>( + RoomContext: Context, + options?: { allowOutsideRoom: boolean } +): Room | null { + const room = useRoomOrNull(RoomContext); + + if (room === null && !options?.allowOutsideRoom) { + throw new Error("RoomProvider is missing from the React tree."); + } + + return room; +} + function useRoom< P extends JsonObject = DP, S extends LsonObject = DS, @@ -754,25 +628,33 @@ function useRoom< TM extends BaseMetadata = DTM, CM extends BaseMetadata = DCM, >(options?: { allowOutsideRoom: boolean }): Room | null { - const room = useRoomOrNull(); - if (room === null && !options?.allowOutsideRoom) { - throw new Error("RoomProvider is missing from the React tree."); - } - return room; + return useRoom_withRoomContext( + GlobalRoomContext, + options + ); } /** - * Returns the current connection status for the Room, and triggers - * a re-render whenever it changes. Can be used to render a status badge. + * @internal */ -function useStatus(): Status { - const room = useRoom(); +function useStatus_withRoomContext( + RoomContext: Context +): Status { + const room = useRoom_withRoomContext(RoomContext); const subscribe = room.events.status.subscribe; const getSnapshot = room.getStatus; const getServerSnapshot = room.getStatus; return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot); } +/** + * Returns the current connection status for the Room, and triggers + * a re-render whenever it changes. Can be used to render a status badge. + */ +function useStatus(): Status { + return useStatus_withRoomContext(GlobalRoomContext); +} + /** @private - Internal API, do not rely on it. */ function useReportTextEditor(editor: TextEditorType, rootKey: string): void { const isReported = useRef(false); @@ -862,11 +744,15 @@ function useMentionSuggestionsCache() { return client[kInternal].mentionSuggestionsCache; } -function useBroadcastEvent(): ( - event: E, - options?: BroadcastOptions -) => void { - const room = useRoom(); +/** + * @internal + */ +function useBroadcastEvent_withRoomContext( + RoomContext: Context +): (event: E, options?: BroadcastOptions) => void { + const room = useRoom_withRoomContext( + RoomContext + ); return useCallback( ( event: E, @@ -878,10 +764,26 @@ function useBroadcastEvent(): ( ); } -function useOthersListener

( +function useBroadcastEvent(): ( + event: E, + options?: BroadcastOptions +) => void { + return useBroadcastEvent_withRoomContext(GlobalRoomContext); +} + +/** + * @internal + */ +function useOthersListener_withRoomContext< + P extends JsonObject, + U extends BaseUserMeta, +>( + RoomContext: Context, callback: (event: OthersEvent) => void ) { - const room = useRoom(); + const room = useRoom_withRoomContext( + RoomContext + ); const savedCallback = useLatest(callback); useEffect( () => room.events.others.subscribe((event) => savedCallback.current(event)), @@ -889,6 +791,30 @@ function useOthersListener

( ); } +function useOthersListener

( + callback: (event: OthersEvent) => void +) { + return useOthersListener_withRoomContext(GlobalRoomContext, callback); +} + +/** + * @internal + */ +function useLostConnectionListener_withRoomContext( + RoomContext: Context, + callback: (event: LostConnectionEvent) => void +): void { + const room = useRoom_withRoomContext(RoomContext); + const savedCallback = useLatest(callback); + useEffect( + () => + room.events.lostConnection.subscribe((event) => + savedCallback.current(event) + ), + [room, savedCallback] + ); +} + /** * Get informed when reconnecting to the Liveblocks servers is taking * longer than usual. This typically is a sign of a client that has lost @@ -912,23 +838,23 @@ function useOthersListener

( function useLostConnectionListener( callback: (event: LostConnectionEvent) => void ): void { - const room = useRoom(); - const savedCallback = useLatest(callback); - useEffect( - () => - room.events.lostConnection.subscribe((event) => - savedCallback.current(event) - ), - [room, savedCallback] - ); + return useLostConnectionListener_withRoomContext(GlobalRoomContext, callback); } -function useEventListener< +/** + * @internal + */ +function useEventListener_withRoomContext< P extends JsonObject, U extends BaseUserMeta, E extends Json, ->(callback: (data: RoomEventMessage) => void): void { - const room = useRoom(); +>( + RoomContext: Context, + callback: (data: RoomEventMessage) => void +): void { + const room = useRoom_withRoomContext( + RoomContext + ); const savedCallback = useLatest(callback); useEffect(() => { const listener = (eventData: RoomEventMessage) => { @@ -939,11 +865,37 @@ function useEventListener< }, [room, savedCallback]); } +function useEventListener< + P extends JsonObject, + U extends BaseUserMeta, + E extends Json, +>(callback: (data: RoomEventMessage) => void): void { + return useEventListener_withRoomContext(GlobalRoomContext, callback); +} + +/** + * @internal + */ +function useHistory_withRoomContext( + RoomContext: Context +): History { + return useRoom_withRoomContext(RoomContext).history; +} + /** * Returns the room.history */ function useHistory(): History { - return useRoom().history; + return useHistory_withRoomContext(GlobalRoomContext); +} + +/** + * @internal + */ +function useUndo_withRoomContext( + RoomContext: Context +): () => void { + return useHistory_withRoomContext(RoomContext).undo; } /** @@ -951,7 +903,16 @@ function useHistory(): History { * client. It does not impact operations made by other clients. */ function useUndo(): () => void { - return useHistory().undo; + return useUndo_withRoomContext(GlobalRoomContext); +} + +/** + * @internal + */ +function useRedo_withRoomContext( + RoomContext: Context +): () => void { + return useHistory_withRoomContext(RoomContext).redo; } /** @@ -959,45 +920,77 @@ function useUndo(): () => void { * client. It does not impact operations made by other clients. */ function useRedo(): () => void { - return useHistory().redo; + return useRedo_withRoomContext(GlobalRoomContext); } /** - * Returns whether there are any operations to undo. + * @internal */ -function useCanUndo(): boolean { - const room = useRoom(); +function useCanUndo_withRoomContext( + RoomContext: Context +): boolean { + const room = useRoom_withRoomContext(RoomContext); const subscribe = room.events.history.subscribe; const canUndo = room.history.canUndo; return useSyncExternalStore(subscribe, canUndo, canUndo); } /** - * Returns whether there are any operations to redo. + * Returns whether there are any operations to undo. */ -function useCanRedo(): boolean { - const room = useRoom(); +function useCanUndo(): boolean { + return useCanUndo_withRoomContext(GlobalRoomContext); +} + +/** + * @internal + */ +function useCanRedo_withRoomContext( + RoomContext: Context +): boolean { + const room = useRoom_withRoomContext(RoomContext); const subscribe = room.events.history.subscribe; const canRedo = room.history.canRedo; return useSyncExternalStore(subscribe, canRedo, canRedo); } -function useSelf

(): User< - P, - U -> | null; -function useSelf

( +/** + * Returns whether there are any operations to redo. + */ +function useCanRedo(): boolean { + return useCanRedo_withRoomContext(GlobalRoomContext); +} + +/** + * @internal + */ +function useSelf_withRoomContext

( + RoomContext: Context +): User | null; +function useSelf_withRoomContext< + P extends JsonObject, + U extends BaseUserMeta, + T, +>( + RoomContext: Context, selector: (me: User) => T, isEqual?: (prev: T | null, curr: T | null) => boolean ): T | null; -function useSelf

( +function useSelf_withRoomContext< + P extends JsonObject, + U extends BaseUserMeta, + T, +>( + RoomContext: Context, maybeSelector?: (me: User) => T, isEqual?: (prev: T | null, curr: T | null) => boolean ): T | User | null { type Snapshot = User | null; type Selection = T | null; - const room = useRoom(); + const room = useRoom_withRoomContext( + RoomContext + ); const subscribe = room.events.self.subscribe; const getSnapshot: () => Snapshot = room.getSelf; @@ -1018,11 +1011,34 @@ function useSelf

( ); } -function useMyPresence

(): [ +function useSelf

(): User< P, - (patch: Partial

, options?: { addToHistory: boolean }) => void, -] { - const room = useRoom(); + U +> | null; +function useSelf

( + selector: (me: User) => T, + isEqual?: (prev: T | null, curr: T | null) => boolean +): T | null; +function useSelf

( + maybeSelector?: (me: User) => T, + isEqual?: (prev: T | null, curr: T | null) => boolean +): T | User | null { + return useSelf_withRoomContext( + GlobalRoomContext, + maybeSelector as (me: User) => T, + isEqual + ); +} + +/** + * @internal + */ +function useMyPresence_withRoomContext

( + RoomContext: Context +): [P, (patch: Partial

, options?: { addToHistory: boolean }) => void] { + const room = useRoom_withRoomContext( + RoomContext + ); const subscribe = room.events.myPresence.subscribe; const getSnapshot = room.getPresence; const presence = useSyncExternalStore(subscribe, getSnapshot, getSnapshot); @@ -1030,26 +1046,59 @@ function useMyPresence

(): [ return [presence, setPresence]; } +function useMyPresence

(): [ + P, + (patch: Partial

, options?: { addToHistory: boolean }) => void, +] { + return useMyPresence_withRoomContext

(GlobalRoomContext); +} + +/** + * @internal + */ +function useUpdateMyPresence_withRoomContext

( + RoomContext: Context +): (patch: Partial

, options?: { addToHistory: boolean }) => void { + return useRoom_withRoomContext( + RoomContext + ).updatePresence; +} + function useUpdateMyPresence

(): ( patch: Partial

, options?: { addToHistory: boolean } ) => void { - return useRoom().updatePresence; + return useUpdateMyPresence_withRoomContext

(GlobalRoomContext); } -function useOthers< +/** + * @internal + */ +function useOthers_withRoomContext< P extends JsonObject, U extends BaseUserMeta, ->(): readonly User[]; -function useOthers

( +>(RoomContext: Context): readonly User[]; +function useOthers_withRoomContext< + P extends JsonObject, + U extends BaseUserMeta, + T, +>( + RoomContext: Context, selector: (others: readonly User[]) => T, isEqual?: (prev: T, curr: T) => boolean ): T; -function useOthers

( +function useOthers_withRoomContext< + P extends JsonObject, + U extends BaseUserMeta, + T, +>( + RoomContext: Context, selector?: (others: readonly User[]) => T, isEqual?: (prev: T, curr: T) => boolean ): T | readonly User[] { - const room = useRoom(); + const room = useRoom_withRoomContext( + RoomContext + ); const subscribe = room.events.others.subscribe; const getSnapshot = room.getOthers; const getServerSnapshot = alwaysEmptyList; @@ -1062,7 +1111,34 @@ function useOthers

( ); } -function useOthersMapped

( +function useOthers< + P extends JsonObject, + U extends BaseUserMeta, +>(): readonly User[]; +function useOthers

( + selector: (others: readonly User[]) => T, + isEqual?: (prev: T, curr: T) => boolean +): T; +function useOthers

( + selector?: (others: readonly User[]) => T, + isEqual?: (prev: T, curr: T) => boolean +): T | readonly User[] { + return useOthers_withRoomContext( + GlobalRoomContext, + selector as (others: readonly User[]) => T, + isEqual + ); +} + +/** + * @internal + */ +function useOthersMapped_withRoomContext< + P extends JsonObject, + U extends BaseUserMeta, + T, +>( + RoomContext: Context, itemSelector: (other: User) => T, itemIsEqual?: (prev: T, curr: T) => boolean ): ReadonlyArray { @@ -1090,7 +1166,35 @@ function useOthersMapped

( [itemIsEqual] ); - return useOthers(wrappedSelector, wrappedIsEqual); + return useOthers_withRoomContext>( + RoomContext, + wrappedSelector, + wrappedIsEqual + ); +} + +function useOthersMapped

( + itemSelector: (other: User) => T, + itemIsEqual?: (prev: T, curr: T) => boolean +): ReadonlyArray { + return useOthersMapped_withRoomContext( + GlobalRoomContext, + itemSelector, + itemIsEqual + ); +} + +/** + * @internal + */ +function useOthersConnectionIds_withRoomContext( + RoomContext: Context +): readonly number[] { + return useOthers_withRoomContext( + RoomContext, + selectorFor_useOthersConnectionIds, + shallow + ); } /** @@ -1108,14 +1212,22 @@ function useOthersMapped

( * // [2, 4, 7] */ function useOthersConnectionIds(): readonly number[] { - return useOthers(selectorFor_useOthersConnectionIds, shallow); + return useOthersConnectionIds_withRoomContext(GlobalRoomContext); } const NOT_FOUND = Symbol(); type NotFound = typeof NOT_FOUND; -function useOther

( +/** + * @internal + */ +function useOther_withRoomContext< + P extends JsonObject, + U extends BaseUserMeta, + T, +>( + RoomContext: Context, connectionId: number, selector: (other: User) => T, isEqual?: (prev: T, curr: T) => boolean @@ -1141,7 +1253,11 @@ function useOther

( [isEqual] ); - const other = useOthers(wrappedSelector, wrappedIsEqual); + const other = useOthers_withRoomContext( + RoomContext, + wrappedSelector, + wrappedIsEqual + ); if (other === NOT_FOUND) { throw new Error( `No such other user with connection id ${connectionId} exists` @@ -1151,29 +1267,63 @@ function useOther

( return other; } -/** @internal */ -function useMutableStorageRoot(): LiveObject | null { - const room = useRoom(); +function useOther

( + connectionId: number, + selector: (other: User) => T, + isEqual?: (prev: T, curr: T) => boolean +): T { + return useOther_withRoomContext( + GlobalRoomContext, + connectionId, + selector, + isEqual + ); +} + +/** + * @internal + */ +function useMutableStorageRoot_withRoomContext( + RoomContext: Context +): LiveObject | null { + const room = useRoom_withRoomContext( + RoomContext + ); const subscribe = room.events.storageDidLoad.subscribeOnce; const getSnapshot = room.getStorageSnapshot; const getServerSnapshot = alwaysNull; return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot); } +/** + * @internal + */ +function useStorageRoot_withRoomContext( + RoomContext: Context +): [root: LiveObject | null] { + return [useMutableStorageRoot_withRoomContext(RoomContext)]; +} + // NOTE: This API exists for backward compatible reasons function useStorageRoot(): [root: LiveObject | null] { - return [useMutableStorageRoot()]; + return useStorageRoot_withRoomContext(GlobalRoomContext); } -function useStorage( +/** + * @internal + */ +function useStorage_withRoomContext( + RoomContext: Context, selector: (root: ToImmutable) => T, isEqual?: (prev: T | null, curr: T | null) => boolean ): T | null { type Snapshot = ToImmutable | null; type Selection = T | null; - const room = useRoom(); - const rootOrNull = useMutableStorageRoot(); + const room = useRoom_withRoomContext( + RoomContext + ); + const rootOrNull = useMutableStorageRoot_withRoomContext(RoomContext); const wrappedSelector = useCallback( (rootOrNull: Snapshot): Selection => @@ -1210,7 +1360,17 @@ function useStorage( ); } -function useMutation< +function useStorage( + selector: (root: ToImmutable) => T, + isEqual?: (prev: T | null, curr: T | null) => boolean +): T | null { + return useStorage_withRoomContext(GlobalRoomContext, selector, isEqual); +} + +/** + * @internal + */ +function useMutation_withRoomContext< P extends JsonObject, S extends LsonObject, U extends BaseUserMeta, @@ -1218,8 +1378,12 @@ function useMutation< TM extends BaseMetadata, CM extends BaseMetadata, F extends (context: MutationContext, ...args: any[]) => any, ->(callback: F, deps: readonly unknown[]): OmitFirstArg { - const room = useRoom(); +>( + RoomContext: Context, + callback: F, + deps: readonly unknown[] +): OmitFirstArg { + const room = useRoom_withRoomContext(RoomContext); return useMemo( () => { return ((...args) => @@ -1238,13 +1402,36 @@ function useMutation< ); } -function useThreads( +function useMutation< + P extends JsonObject, + S extends LsonObject, + U extends BaseUserMeta, + E extends Json, + TM extends BaseMetadata, + CM extends BaseMetadata, + F extends (context: MutationContext, ...args: any[]) => any, +>(callback: F, deps: readonly unknown[]): OmitFirstArg { + return useMutation_withRoomContext( + GlobalRoomContext, + callback, + deps + ); +} + +/** + * @internal + */ +function useThreads_withRoomContext< + TM extends BaseMetadata, + CM extends BaseMetadata, +>( + RoomContext: Context, options: UseThreadsOptions = {} ): ThreadsAsyncResult { const { scrollOnLoad = true } = options; const client = useClient(); - const room = useRoom(); + const room = useRoom_withRoomContext(RoomContext); const { store, getOrCreateThreadsPollerForRoomId } = getRoomExtrasForClient< TM, CM @@ -1283,7 +1470,17 @@ function useThreads( return result; } -function useSearchComments( +function useThreads( + options: UseThreadsOptions = {} +): ThreadsAsyncResult { + return useThreads_withRoomContext(GlobalRoomContext, options); +} + +/** + * @internal + */ +function useSearchComments_withRoomContext( + RoomContext: Context, options: UseSearchCommentsOptions ): SearchCommentsAsyncResult { const [result, setResult] = useState({ @@ -1298,7 +1495,7 @@ function useSearchComments( const timeout = useRef(null); const client = useClient(); - const room = useRoom(); + const room = useRoom_withRoomContext(RoomContext); const queryKey = stableStringify([room.id, options.query]); @@ -1367,10 +1564,28 @@ function useSearchComments( return result; } +function useSearchComments( + options: UseSearchCommentsOptions +): SearchCommentsAsyncResult { + return useSearchComments_withRoomContext(GlobalRoomContext, options); +} + +/** + * @internal + */ +function useCreateThread_withRoomContext< + TM extends BaseMetadata, + CM extends BaseMetadata, +>( + RoomContext: Context +): (options: CreateThreadOptions) => ThreadData { + return useCreateRoomThread(useRoom_withRoomContext(RoomContext).id); +} + function useCreateThread(): ( options: CreateThreadOptions ) => ThreadData { - return useCreateRoomThread(useRoom().id); + return useCreateThread_withRoomContext(GlobalRoomContext); } /** @@ -1461,8 +1676,17 @@ function useCreateRoomThread( ); } +/** + * @internal + */ +function useDeleteThread_withRoomContext( + RoomContext: Context +): (threadId: string) => void { + return useDeleteRoomThread(useRoom_withRoomContext(RoomContext).id); +} + function useDeleteThread(): (threadId: string) => void { - return useDeleteRoomThread(useRoom().id); + return useDeleteThread_withRoomContext(GlobalRoomContext); } function useDeleteRoomThread(roomId: string): (threadId: string) => void { @@ -1502,8 +1726,17 @@ function useDeleteRoomThread(roomId: string): (threadId: string) => void { ); } +/** + * @internal + */ +function useEditThreadMetadata_withRoomContext( + RoomContext: Context +) { + return useEditRoomThreadMetadata(useRoom_withRoomContext(RoomContext).id); +} + function useEditThreadMetadata() { - return useEditRoomThreadMetadata(useRoom().id); + return useEditThreadMetadata_withRoomContext(GlobalRoomContext); } function useEditRoomThreadMetadata(roomId: string) { @@ -1549,8 +1782,19 @@ function useEditRoomThreadMetadata(roomId: string) { ); } +/** + * @internal + */ +function useEditCommentMetadata_withRoomContext( + RoomContext: Context +) { + return useEditRoomCommentMetadata( + useRoom_withRoomContext(RoomContext).id + ); +} + function useEditCommentMetadata() { - return useEditRoomCommentMetadata(useRoom().id); + return useEditCommentMetadata_withRoomContext(GlobalRoomContext); } function useEditRoomCommentMetadata(roomId: string) { @@ -1605,6 +1849,15 @@ function useEditRoomCommentMetadata(roomId: string) { ); } +/** + * @internal + */ +function useCreateComment_withRoomContext( + RoomContext: Context +): (options: CreateCommentOptions) => CommentData { + return useCreateRoomComment(useRoom_withRoomContext(RoomContext).id); +} + /** * Returns a function that adds a comment to a thread. * @@ -1615,7 +1868,7 @@ function useEditRoomCommentMetadata(roomId: string) { function useCreateComment(): ( options: CreateCommentOptions ) => CommentData { - return useCreateRoomComment(useRoom().id); + return useCreateComment_withRoomContext(GlobalRoomContext); } /** @@ -1689,6 +1942,15 @@ function useCreateRoomComment( ); } +/** + * @internal + */ +function useEditComment_withRoomContext( + RoomContext: Context +): (options: EditCommentOptions) => void { + return useEditRoomComment(useRoom_withRoomContext(RoomContext).id); +} + /** * Returns a function that edits a comment. * @@ -1699,7 +1961,7 @@ function useCreateRoomComment( function useEditComment(): ( options: EditCommentOptions ) => void { - return useEditRoomComment(useRoom().id); + return useEditComment_withRoomContext(GlobalRoomContext); } /** @@ -1794,6 +2056,15 @@ function useEditRoomComment( ); } +/** + * @internal + */ +function useDeleteComment_withRoomContext( + RoomContext: Context +) { + return useDeleteRoomComment(useRoom_withRoomContext(RoomContext).id); +} + /** * Returns a function that deletes a comment. * If it is the last non-deleted comment, the thread also gets deleted. @@ -1803,7 +2074,7 @@ function useEditRoomComment( * deleteComment({ threadId: "th_xxx", commentId: "cm_xxx" }) */ function useDeleteComment() { - return useDeleteRoomComment(useRoom().id); + return useDeleteComment_withRoomContext(GlobalRoomContext); } /** @@ -1845,8 +2116,17 @@ function useDeleteRoomComment(roomId: string) { ); } +/** + * @internal + */ +function useAddReaction_withRoomContext( + RoomContext: Context +) { + return useAddRoomCommentReaction(useRoom_withRoomContext(RoomContext).id); +} + function useAddReaction() { - return useAddRoomCommentReaction(useRoom().id); + return useAddReaction_withRoomContext(GlobalRoomContext); } /** @@ -1903,6 +2183,15 @@ function useAddRoomCommentReaction(roomId: string) { ); } +/** + * @internal + */ +function useRemoveReaction_withRoomContext( + RoomContext: Context +) { + return useRemoveRoomCommentReaction(useRoom_withRoomContext(RoomContext).id); +} + /** * Returns a function that removes a reaction on a comment. * @@ -1911,7 +2200,7 @@ function useAddRoomCommentReaction(roomId: string) { * removeReaction({ threadId: "th_xxx", commentId: "cm_xxx", emoji: "👍" }) */ function useRemoveReaction() { - return useRemoveRoomCommentReaction(useRoom().id); + return useRemoveReaction_withRoomContext(GlobalRoomContext); } /** @@ -1966,16 +2255,6 @@ function useRemoveRoomCommentReaction(roomId: string) { [client, roomId] ); } -/** - * Returns a function that marks a thread as read. - * - * @example - * const markThreadAsRead = useMarkThreadAsRead(); - * markThreadAsRead("th_xxx"); - */ -function useMarkThreadAsRead() { - return useMarkRoomThreadAsRead(useRoom().id); -} /** * @private @@ -2035,6 +2314,36 @@ function useMarkRoomThreadAsRead(roomId: string) { ); } +/** + * @internal + */ +function useMarkThreadAsRead_withRoomContext( + RoomContext: Context +) { + const room = useRoom_withRoomContext(RoomContext); + return useMarkRoomThreadAsRead(room.id); +} + +/** + * Returns a function that marks a thread as read. + * + * @example + * const markThreadAsRead = useMarkThreadAsRead(); + * markThreadAsRead("th_xxx"); + */ +function useMarkThreadAsRead() { + return useMarkThreadAsRead_withRoomContext(GlobalRoomContext); +} + +/** + * @internal + */ +function useMarkThreadAsResolved_withRoomContext( + RoomContext: Context +) { + return useMarkRoomThreadAsResolved(useRoom_withRoomContext(RoomContext).id); +} + /** * Returns a function that marks a thread as resolved. * @@ -2043,7 +2352,7 @@ function useMarkRoomThreadAsRead(roomId: string) { * markThreadAsResolved("th_xxx"); */ function useMarkThreadAsResolved() { - return useMarkRoomThreadAsResolved(useRoom().id); + return useMarkThreadAsResolved_withRoomContext(GlobalRoomContext); } /** @@ -2086,6 +2395,15 @@ function useMarkRoomThreadAsResolved(roomId: string) { ); } +/** + * @internal + */ +function useMarkThreadAsUnresolved_withRoomContext( + RoomContext: Context +) { + return useMarkRoomThreadAsUnresolved(useRoom_withRoomContext(RoomContext).id); +} + /** * Returns a function that marks a thread as unresolved. * @@ -2094,7 +2412,7 @@ function useMarkRoomThreadAsResolved(roomId: string) { * markThreadAsUnresolved("th_xxx"); */ function useMarkThreadAsUnresolved() { - return useMarkRoomThreadAsUnresolved(useRoom().id); + return useMarkThreadAsUnresolved_withRoomContext(GlobalRoomContext); } /** @@ -2137,6 +2455,15 @@ function useMarkRoomThreadAsUnresolved(roomId: string) { ); } +/** + * @internal + */ +function useSubscribeToThread_withRoomContext( + RoomContext: Context +) { + return useSubscribeToRoomThread(useRoom_withRoomContext(RoomContext).id); +} + /** * Returns a function that subscribes the user to a thread. * @@ -2145,7 +2472,7 @@ function useMarkRoomThreadAsUnresolved(roomId: string) { * subscribeToThread("th_xxx"); */ function useSubscribeToThread() { - return useSubscribeToRoomThread(useRoom().id); + return useSubscribeToThread_withRoomContext(GlobalRoomContext); } /** @@ -2181,6 +2508,15 @@ function useSubscribeToRoomThread(roomId: string) { ); } +/** + * @internal + */ +function useUnsubscribeFromThread_withRoomContext( + RoomContext: Context +) { + return useUnsubscribeFromRoomThread(useRoom_withRoomContext(RoomContext).id); +} + /** * Returns a function that unsubscribes the user from a thread. * @@ -2189,7 +2525,7 @@ function useSubscribeToRoomThread(roomId: string) { * unsubscribeFromThread("th_xxx"); */ function useUnsubscribeFromThread() { - return useUnsubscribeFromRoomThread(useRoom().id); + return useUnsubscribeFromThread_withRoomContext(GlobalRoomContext); } /** @@ -2230,6 +2566,19 @@ function useUnsubscribeFromRoomThread(roomId: string) { ); } +/** + * @internal + */ +function useThreadSubscription_withRoomContext( + RoomContext: Context, + threadId: string +): ThreadSubscription { + return useRoomThreadSubscription( + useRoom_withRoomContext(RoomContext).id, + threadId + ); +} + /** * Returns the subscription status of a thread, methods to update it, and when * the thread was last read. @@ -2238,7 +2587,7 @@ function useUnsubscribeFromRoomThread(roomId: string) { * const { status, subscribe, unsubscribe, unreadSince } = useThreadSubscription("th_xxx"); */ function useThreadSubscription(threadId: string): ThreadSubscription { - return useRoomThreadSubscription(useRoom().id, threadId); + return useThreadSubscription_withRoomContext(GlobalRoomContext, threadId); } /** @@ -2294,19 +2643,18 @@ function useRoomThreadSubscription( } /** - * Returns the user's subscription settings for the current room - * and a function to update them. - * - * @example - * const [{ settings }, updateSettings] = useRoomSubscriptionSettings(); + * @internal */ -function useRoomSubscriptionSettings(): [ +function useRoomSubscriptionSettings_withRoomContext( + RoomContext: Context +): [ RoomSubscriptionSettingsAsyncResult, (settings: Partial) => void, ] { - const updateRoomSubscriptionSettings = useUpdateRoomSubscriptionSettings(); + const updateRoomSubscriptionSettings = + useUpdateRoomSubscriptionSettings_withRoomContext(RoomContext); const client = useClient(); - const room = useRoom(); + const room = useRoom_withRoomContext(RoomContext); const { store, getOrCreateSubscriptionSettingsPollerForRoomId } = getRoomExtrasForClient(client); @@ -2352,7 +2700,19 @@ function useRoomSubscriptionSettings(): [ * @example * const [{ settings }, updateSettings] = useRoomSubscriptionSettings(); */ -function useRoomSubscriptionSettingsSuspense(): [ +function useRoomSubscriptionSettings(): [ + RoomSubscriptionSettingsAsyncResult, + (settings: Partial) => void, +] { + return useRoomSubscriptionSettings_withRoomContext(GlobalRoomContext); +} + +/** + * @internal + */ +function useRoomSubscriptionSettingsSuspense_withRoomContext( + RoomContext: Context +): [ RoomSubscriptionSettingsAsyncSuccess, (settings: Partial) => void, ] { @@ -2361,7 +2721,7 @@ function useRoomSubscriptionSettingsSuspense(): [ const client = useClient(); const store = getRoomExtrasForClient(client).store; - const room = useRoom(); + const room = useRoom_withRoomContext(RoomContext); // Suspend until there are at least some inbox notifications use( @@ -2373,7 +2733,7 @@ function useRoomSubscriptionSettingsSuspense(): [ // We're in a Suspense world here, and as such, the useRoomSubscriptionSettings() // hook is expected to only return success results when we're here. const [settings, updateRoomSubscriptionSettings] = - useRoomSubscriptionSettings(); + useRoomSubscriptionSettings_withRoomContext(RoomContext); assert(!settings.error, "Did not expect error"); assert(!settings.isLoading, "Did not expect loading"); @@ -2383,18 +2743,30 @@ function useRoomSubscriptionSettingsSuspense(): [ } /** - * Returns the version data bianry for a given version + * Returns the user's subscription settings for the current room + * and a function to update them. * * @example - * const {data} = useHistoryVersionData(versionId); + * const [{ settings }, updateSettings] = useRoomSubscriptionSettings(); */ -function useHistoryVersionData( +function useRoomSubscriptionSettingsSuspense(): [ + RoomSubscriptionSettingsAsyncSuccess, + (settings: Partial) => void, +] { + return useRoomSubscriptionSettingsSuspense_withRoomContext(GlobalRoomContext); +} + +/** + * @internal + */ +function useHistoryVersionData_withRoomContext( + RoomContext: Context, versionId: string ): HistoryVersionDataAsyncResult { const [state, setState] = useState({ isLoading: true, }); - const room = useRoom(); + const room = useRoom_withRoomContext(RoomContext); useEffect(() => { setState({ isLoading: true }); const load = async () => { @@ -2424,14 +2796,25 @@ function useHistoryVersionData( } /** - * (Private beta) Returns a history of versions of the current room. + * Returns the version data bianry for a given version * * @example - * const { versions, error, isLoading } = useHistoryVersions(); + * const {data} = useHistoryVersionData(versionId); */ -function useHistoryVersions(): HistoryVersionsAsyncResult { +function useHistoryVersionData( + versionId: string +): HistoryVersionDataAsyncResult { + return useHistoryVersionData_withRoomContext(GlobalRoomContext, versionId); +} + +/** + * @internal + */ +function useHistoryVersions_withRoomContext( + RoomContext: Context +): HistoryVersionsAsyncResult { const client = useClient(); - const room = useRoom(); + const room = useRoom_withRoomContext(RoomContext); const { store, getOrCreateVersionsPollerForRoomId } = getRoomExtrasForClient(client); @@ -2465,35 +2848,51 @@ function useHistoryVersions(): HistoryVersionsAsyncResult { * (Private beta) Returns a history of versions of the current room. * * @example - * const { versions } = useHistoryVersions(); + * const { versions, error, isLoading } = useHistoryVersions(); */ -function useHistoryVersionsSuspense(): HistoryVersionsAsyncSuccess { +function useHistoryVersions(): HistoryVersionsAsyncResult { + return useHistoryVersions_withRoomContext(GlobalRoomContext); +} + +/** + * @internal + */ +function useHistoryVersionsSuspense_withRoomContext( + RoomContext: Context +): HistoryVersionsAsyncSuccess { // Throw error if we're calling this hook server side ensureNotServerSide(); const client = useClient(); - const room = useRoom(); + const room = useRoom_withRoomContext(RoomContext); const store = getRoomExtrasForClient(client).store; use(store.outputs.versionsByRoomId.getOrCreate(room.id).waitUntilLoaded()); - const result = useHistoryVersions(); + const result = useHistoryVersions_withRoomContext(RoomContext); assert(!result.error, "Did not expect error"); assert(!result.isLoading, "Did not expect loading"); return result; } /** - * Returns a function that updates the user's subscription settings - * for the current room. + * (Private beta) Returns a history of versions of the current room. * * @example - * const updateRoomSubscriptionSettings = useUpdateRoomSubscriptionSettings(); - * updateRoomSubscriptionSettings({ threads: "all" }); + * const { versions } = useHistoryVersions(); */ -function useUpdateRoomSubscriptionSettings() { +function useHistoryVersionsSuspense(): HistoryVersionsAsyncSuccess { + return useHistoryVersionsSuspense_withRoomContext(GlobalRoomContext); +} + +/** + * @internal + */ +function useUpdateRoomSubscriptionSettings_withRoomContext( + RoomContext: Context +) { const client = useClient(); - const room = useRoom(); + const room = useRoom_withRoomContext(RoomContext); return useCallback( (settings: Partial) => { const { store, onMutationFailure, pollThreadsForRoomId } = @@ -2535,14 +2934,64 @@ function useUpdateRoomSubscriptionSettings() { ); } -function useSuspendUntilPresenceReady(): void { +/** + * Returns a function that updates the user's subscription settings + * for the current room. + * + * @example + * const updateRoomSubscriptionSettings = useUpdateRoomSubscriptionSettings(); + * updateRoomSubscriptionSettings({ threads: "all" }); + */ +function useUpdateRoomSubscriptionSettings() { + return useUpdateRoomSubscriptionSettings_withRoomContext(GlobalRoomContext); +} + +/** + * @internal + */ +function useSuspendUntilPresenceReady_withRoomContext( + RoomContext: Context +): void { // Throw error if we're calling this hook server side ensureNotServerSide(); - const room = useRoom(); + const room = useRoom_withRoomContext(RoomContext); use(room.waitUntilPresenceReady()); } +/** + * @internal + */ +function useSelfSuspense_withRoomContext< + P extends JsonObject, + U extends BaseUserMeta, +>(RoomContext: Context): User; +function useSelfSuspense_withRoomContext< + P extends JsonObject, + U extends BaseUserMeta, + T, +>( + RoomContext: Context, + selector: (me: User) => T, + isEqual?: (prev: T, curr: T) => boolean +): T; +function useSelfSuspense_withRoomContext< + P extends JsonObject, + U extends BaseUserMeta, + T, +>( + RoomContext: Context, + selector?: (me: User) => T, + isEqual?: (prev: T, curr: T) => boolean +): T | User { + useSuspendUntilPresenceReady_withRoomContext(RoomContext); + return useSelf_withRoomContext( + RoomContext, + selector as (me: User) => T, + isEqual as (prev: T | null, curr: T | null) => boolean + ) as T | User; +} + function useSelfSuspense

(): User< P, U @@ -2555,11 +3004,44 @@ function useSelfSuspense

( selector?: (me: User) => T, isEqual?: (prev: T, curr: T) => boolean ): T | User { - useSuspendUntilPresenceReady(); - return useSelf( + return useSelfSuspense_withRoomContext( + GlobalRoomContext, selector as (me: User) => T, - isEqual as (prev: T | null, curr: T | null) => boolean - ) as T | User; + isEqual + ); +} + +/** + * @internal + */ +function useOthersSuspense_withRoomContext< + P extends JsonObject, + U extends BaseUserMeta, +>(RoomContext: Context): readonly User[]; +function useOthersSuspense_withRoomContext< + P extends JsonObject, + U extends BaseUserMeta, + T, +>( + RoomContext: Context, + selector: (others: readonly User[]) => T, + isEqual?: (prev: T, curr: T) => boolean +): T; +function useOthersSuspense_withRoomContext< + P extends JsonObject, + U extends BaseUserMeta, + T, +>( + RoomContext: Context, + selector?: (others: readonly User[]) => T, + isEqual?: (prev: T, curr: T) => boolean +): T | readonly User[] { + useSuspendUntilPresenceReady_withRoomContext(RoomContext); + return useOthers_withRoomContext( + RoomContext, + selector as (others: readonly User[]) => T, + isEqual as (prev: T, curr: T) => boolean + ) as T | readonly User[]; } function useOthersSuspense< @@ -2574,11 +3056,21 @@ function useOthersSuspense

( selector?: (others: readonly User[]) => T, isEqual?: (prev: T, curr: T) => boolean ): T | readonly User[] { - useSuspendUntilPresenceReady(); - return useOthers( + return useOthersSuspense_withRoomContext( + GlobalRoomContext, selector as (others: readonly User[]) => T, - isEqual as (prev: T, curr: T) => boolean - ) as T | readonly User[]; + isEqual + ); +} + +/** + * @internal + */ +function useOthersConnectionIdsSuspense_withRoomContext( + RoomContext: Context +): readonly number[] { + useSuspendUntilPresenceReady_withRoomContext(RoomContext); + return useOthersConnectionIds_withRoomContext(RoomContext); } /** @@ -2596,8 +3088,27 @@ function useOthersSuspense

( * // [2, 4, 7] */ function useOthersConnectionIdsSuspense(): readonly number[] { - useSuspendUntilPresenceReady(); - return useOthersConnectionIds(); + return useOthersConnectionIdsSuspense_withRoomContext(GlobalRoomContext); +} + +/** + * @internal + */ +function useOthersMappedSuspense_withRoomContext< + P extends JsonObject, + U extends BaseUserMeta, + T, +>( + RoomContext: Context, + itemSelector: (other: User) => T, + itemIsEqual?: (prev: T, curr: T) => boolean +): ReadonlyArray { + useSuspendUntilPresenceReady_withRoomContext(RoomContext); + return useOthersMapped_withRoomContext( + RoomContext, + itemSelector, + itemIsEqual + ); } function useOthersMappedSuspense< @@ -2608,8 +3119,33 @@ function useOthersMappedSuspense< itemSelector: (other: User) => T, itemIsEqual?: (prev: T, curr: T) => boolean ): ReadonlyArray { - useSuspendUntilPresenceReady(); - return useOthersMapped(itemSelector, itemIsEqual); + return useOthersMappedSuspense_withRoomContext( + GlobalRoomContext, + itemSelector, + itemIsEqual + ); +} + +/** + * @internal + */ +function useOtherSuspense_withRoomContext< + P extends JsonObject, + U extends BaseUserMeta, + T, +>( + RoomContext: Context, + connectionId: number, + selector: (other: User) => T, + isEqual?: (prev: T, curr: T) => boolean +): T { + useSuspendUntilPresenceReady_withRoomContext(RoomContext); + return useOther_withRoomContext( + RoomContext, + connectionId, + selector, + isEqual + ); } function useOtherSuspense

( @@ -2617,49 +3153,87 @@ function useOtherSuspense

( selector: (other: User) => T, isEqual?: (prev: T, curr: T) => boolean ): T { - useSuspendUntilPresenceReady(); - return useOther(connectionId, selector, isEqual); + return useOtherSuspense_withRoomContext( + GlobalRoomContext, + connectionId, + selector, + isEqual + ); } -function useSuspendUntilStorageReady(): void { +/** + * @internal + */ +function useSuspendUntilStorageReady_withRoomContext( + RoomContext: Context +): void { // Throw error if we're calling this hook server side ensureNotServerSide(); - const room = useRoom(); + const room = useRoom_withRoomContext(RoomContext); use(room.waitUntilStorageReady()); } -function useStorageSuspense( +/** + * @internal + */ +function useStorageSuspense_withRoomContext( + RoomContext: Context, selector: (root: ToImmutable) => T, isEqual?: (prev: T, curr: T) => boolean ): T { - useSuspendUntilStorageReady(); - return useStorage( + useSuspendUntilStorageReady_withRoomContext(RoomContext); + return useStorage_withRoomContext( + RoomContext, selector, isEqual as (prev: T | null, curr: T | null) => boolean ) as T; } -function useThreadsSuspense( +function useStorageSuspense( + selector: (root: ToImmutable) => T, + isEqual?: (prev: T, curr: T) => boolean +): T { + return useStorageSuspense_withRoomContext( + GlobalRoomContext, + selector, + isEqual + ); +} + +/** + * @internal + */ +function useThreadsSuspense_withRoomContext< + TM extends BaseMetadata, + CM extends BaseMetadata, +>( + RoomContext: Context, options: UseThreadsOptions = {} ): ThreadsAsyncSuccess { // Throw error if we're calling this hook server side ensureNotServerSide(); const client = useClient(); - const room = useRoom(); + const room = useRoom_withRoomContext(RoomContext); const { store } = getRoomExtrasForClient(client); const queryKey = makeRoomThreadsQueryKey(room.id, options.query); use(store.outputs.loadingRoomThreads.getOrCreate(queryKey).waitUntilLoaded()); - const result = useThreads(options); + const result = useThreads_withRoomContext(RoomContext, options); assert(!result.error, "Did not expect error"); assert(!result.isLoading, "Did not expect loading"); return result; } +function useThreadsSuspense( + options: UseThreadsOptions = {} +): ThreadsAsyncSuccess { + return useThreadsSuspense_withRoomContext(GlobalRoomContext, options); +} + function selectorFor_useAttachmentUrl( state: AsyncResult | undefined ): AttachmentUrlAsyncResult { @@ -2683,6 +3257,17 @@ function selectorFor_useAttachmentUrl( }; } +/** + * @internal + */ +function useAttachmentUrl_withRoomContext( + RoomContext: Context, + attachmentId: string +): AttachmentUrlAsyncResult { + const room = useRoom_withRoomContext(RoomContext); + return useRoomAttachmentUrl(attachmentId, room.id); +} + /** * Returns a presigned URL for an attachment by its ID. * @@ -2690,8 +3275,7 @@ function selectorFor_useAttachmentUrl( * const { url, error, isLoading } = useAttachmentUrl("at_xxx"); */ function useAttachmentUrl(attachmentId: string): AttachmentUrlAsyncResult { - const room = useRoom(); - return useRoomAttachmentUrl(attachmentId, room.id); + return useAttachmentUrl_withRoomContext(GlobalRoomContext, attachmentId); } /** @@ -2724,13 +3308,13 @@ function useRoomAttachmentUrl( } /** - * Returns a presigned URL for an attachment by its ID. - * - * @example - * const { url } = useAttachmentUrl("at_xxx"); + * @internal */ -function useAttachmentUrlSuspense(attachmentId: string) { - const room = useRoom(); +function useAttachmentUrlSuspense_withRoomContext( + RoomContext: Context, + attachmentId: string +) { + const room = useRoom_withRoomContext(RoomContext); const { attachmentUrlsStore } = room[kInternal]; const getAttachmentUrlState = useCallback( @@ -2762,6 +3346,19 @@ function useAttachmentUrlSuspense(attachmentId: string) { } as const; } +/** + * Returns a presigned URL for an attachment by its ID. + * + * @example + * const { url } = useAttachmentUrl("at_xxx"); + */ +function useAttachmentUrlSuspense(attachmentId: string) { + return useAttachmentUrlSuspense_withRoomContext( + GlobalRoomContext, + attachmentId + ); +} + /** * @private For internal use only. Do not rely on this hook. */ @@ -2784,7 +3381,507 @@ export function createRoomContext< TM extends BaseMetadata = DTM, CM extends BaseMetadata = DCM, >(client: OpaqueClient): RoomContextBundle { - return getOrCreateRoomContextBundle(client); + type TRoom = Room; + type TRoomBundle = RoomContextBundle; + + const BoundRoomContext = createContext(null); + + function RoomProvider_withImplicitLiveblocksProviderAndBoundRoomContext( + props: RoomProviderProps + ) { + // NOTE: Normally, nesting LiveblocksProvider is not allowed. This + // factory-bound version of the RoomProvider will create an implicit + // LiveblocksProvider. This means that if an end user nests this + // RoomProvider under a LiveblocksProvider context, that would be an error. + // However, we'll allow that nesting only in this specific situation, and + // only because this wrapper will keep the Liveblocks context and the Room + // context consistent internally. + return ( + + {/* @ts-expect-error {...props} is the same type as props */} + + + ); + } + + function useRoom_withBoundRoomContext( + ...args: Parameters> + ) { + return useRoom_withRoomContext( + BoundRoomContext, + ...args + ); + } + + function useStatus_withBoundRoomContext() { + return useStatus_withRoomContext(BoundRoomContext); + } + + function useBroadcastEvent_withBoundRoomContext() { + return useBroadcastEvent_withRoomContext(BoundRoomContext); + } + + function useOthersListener_withBoundRoomContext( + ...args: Parameters> + ) { + return useOthersListener_withRoomContext(BoundRoomContext, ...args); + } + + function useLostConnectionListener_withBoundRoomContext( + ...args: Parameters + ) { + return useLostConnectionListener_withRoomContext(BoundRoomContext, ...args); + } + + function useEventListener_withBoundRoomContext( + ...args: Parameters> + ) { + return useEventListener_withRoomContext(BoundRoomContext, ...args); + } + + function useMarkThreadAsRead_withBoundRoomContext() { + return useMarkThreadAsRead_withRoomContext(BoundRoomContext); + } + + function useHistory_withBoundRoomContext() { + return useHistory_withRoomContext(BoundRoomContext); + } + + function useUndo_withBoundRoomContext() { + return useUndo_withRoomContext(BoundRoomContext); + } + + function useRedo_withBoundRoomContext() { + return useRedo_withRoomContext(BoundRoomContext); + } + + function useCanUndo_withBoundRoomContext() { + return useCanUndo_withRoomContext(BoundRoomContext); + } + + function useCanRedo_withBoundRoomContext() { + return useCanRedo_withRoomContext(BoundRoomContext); + } + + function useStorageRoot_withBoundRoomContext() { + return useStorageRoot_withRoomContext(BoundRoomContext); + } + + function useStorage_withBoundRoomContext( + ...args: Parameters> + ) { + return useStorage_withRoomContext(BoundRoomContext, ...args); + } + + function useStorageSuspense_withBoundRoomContext( + ...args: Parameters> + ) { + return useStorageSuspense_withRoomContext(BoundRoomContext, ...args); + } + + function useSelf_withBoundRoomContext( + ...args: Parameters> + ) { + return useSelf_withRoomContext(BoundRoomContext, ...args); + } + + function useMyPresence_withBoundRoomContext() { + return useMyPresence_withRoomContext

(BoundRoomContext); + } + + function useUpdateMyPresence_withBoundRoomContext() { + return useUpdateMyPresence_withRoomContext

(BoundRoomContext); + } + + function useOthers_withBoundRoomContext( + ...args: Parameters> + ) { + return useOthers_withRoomContext(BoundRoomContext, ...args); + } + + function useOthersMapped_withBoundRoomContext( + ...args: Parameters> + ) { + return useOthersMapped_withRoomContext(BoundRoomContext, ...args); + } + + function useOthersConnectionIds_withBoundRoomContext() { + return useOthersConnectionIds_withRoomContext(BoundRoomContext); + } + + function useOther_withBoundRoomContext( + ...args: Parameters> + ) { + return useOther_withRoomContext(BoundRoomContext, ...args); + } + + function useSelfSuspense_withBoundRoomContext( + ...args: Parameters> + ) { + return useSelfSuspense_withRoomContext(BoundRoomContext, ...args); + } + + function useOthersSuspense_withBoundRoomContext( + ...args: Parameters> + ) { + return useOthersSuspense_withRoomContext( + BoundRoomContext, + ...args + ); + } + + function useOthersMappedSuspense_withBoundRoomContext( + ...args: Parameters> + ) { + return useOthersMappedSuspense_withRoomContext( + BoundRoomContext, + ...args + ); + } + + function useOthersConnectionIdsSuspense_withBoundRoomContext() { + return useOthersConnectionIdsSuspense_withRoomContext(BoundRoomContext); + } + + function useOtherSuspense_withBoundRoomContext( + ...args: Parameters> + ) { + return useOtherSuspense_withRoomContext(BoundRoomContext, ...args); + } + + function useMutation_withBoundRoomContext< + F extends (context: MutationContext, ...args: any[]) => any, + >(...args: Parameters>) { + return useMutation_withRoomContext( + BoundRoomContext, + ...args + ); + } + + function useThreads_withBoundRoomContext( + ...args: Parameters> + ) { + return useThreads_withRoomContext(BoundRoomContext, ...args); + } + + function useCreateThread_withBoundRoomContext() { + return useCreateThread_withRoomContext(BoundRoomContext); + } + + function useDeleteThread_withBoundRoomContext() { + return useDeleteThread_withRoomContext(BoundRoomContext); + } + + function useEditThreadMetadata_withBoundRoomContext() { + return useEditThreadMetadata_withRoomContext(BoundRoomContext); + } + + function useMarkThreadAsResolved_withBoundRoomContext() { + return useMarkThreadAsResolved_withRoomContext(BoundRoomContext); + } + + function useMarkThreadAsUnresolved_withBoundRoomContext() { + return useMarkThreadAsUnresolved_withRoomContext(BoundRoomContext); + } + + function useThreadsSuspense_withBoundRoomContext( + ...args: Parameters> + ) { + return useThreadsSuspense_withRoomContext( + BoundRoomContext, + ...args + ); + } + + function useSubscribeToThread_withBoundRoomContext() { + return useSubscribeToThread_withRoomContext(BoundRoomContext); + } + + function useUnsubscribeFromThread_withBoundRoomContext() { + return useUnsubscribeFromThread_withRoomContext(BoundRoomContext); + } + + function useCreateComment_withBoundRoomContext() { + return useCreateComment_withRoomContext(BoundRoomContext); + } + + function useEditComment_withBoundRoomContext() { + return useEditComment_withRoomContext(BoundRoomContext); + } + + function useEditCommentMetadata_withBoundRoomContext() { + return useEditCommentMetadata_withRoomContext(BoundRoomContext); + } + + function useDeleteComment_withBoundRoomContext() { + return useDeleteComment_withRoomContext(BoundRoomContext); + } + + function useAddReaction_withBoundRoomContext() { + return useAddReaction_withRoomContext(BoundRoomContext); + } + + function useRemoveReaction_withBoundRoomContext() { + return useRemoveReaction_withRoomContext(BoundRoomContext); + } + + function useThreadSubscription_withBoundRoomContext( + ...args: Parameters + ) { + return useThreadSubscription_withRoomContext(BoundRoomContext, ...args); + } + + function useAttachmentUrl_withBoundRoomContext( + ...args: Parameters + ) { + return useAttachmentUrl_withRoomContext(BoundRoomContext, ...args); + } + + function useAttachmentUrlSuspense_withBoundRoomContext( + ...args: Parameters + ) { + return useAttachmentUrlSuspense_withRoomContext(BoundRoomContext, ...args); + } + + function useSearchComments_withBoundRoomContext( + ...args: Parameters> + ) { + return useSearchComments_withRoomContext(BoundRoomContext, ...args); + } + + function useHistoryVersions_withBoundRoomContext() { + return useHistoryVersions_withRoomContext(BoundRoomContext); + } + + function useHistoryVersionsSuspense_withBoundRoomContext() { + return useHistoryVersionsSuspense_withRoomContext(BoundRoomContext); + } + + function useHistoryVersionData_withBoundRoomContext( + ...args: Parameters + ) { + return useHistoryVersionData_withRoomContext(BoundRoomContext, ...args); + } + + function useRoomSubscriptionSettings_withBoundRoomContext() { + return useRoomSubscriptionSettings_withRoomContext(BoundRoomContext); + } + + function useRoomSubscriptionSettingsSuspense_withBoundRoomContext() { + return useRoomSubscriptionSettingsSuspense_withRoomContext( + BoundRoomContext + ); + } + + function useUpdateRoomSubscriptionSettings_withBoundRoomContext() { + return useUpdateRoomSubscriptionSettings_withRoomContext(BoundRoomContext); + } + + const shared = createSharedContext(client as Client); + const bundle: RoomContextBundle = { + RoomContext: BoundRoomContext as Context, + RoomProvider: + RoomProvider_withImplicitLiveblocksProviderAndBoundRoomContext, + + // prettier-ignore + useRoom: useRoom_withBoundRoomContext as TRoomBundle["useRoom"], + // prettier-ignore + useStatus: useStatus_withBoundRoomContext as TRoomBundle["useStatus"], + // prettier-ignore + useBroadcastEvent: useBroadcastEvent_withBoundRoomContext as TRoomBundle["useBroadcastEvent"], + // prettier-ignore + useOthersListener: useOthersListener_withBoundRoomContext as TRoomBundle["useOthersListener"], + // prettier-ignore + useLostConnectionListener: useLostConnectionListener_withBoundRoomContext as TRoomBundle["useLostConnectionListener"], + // prettier-ignore + useEventListener: useEventListener_withBoundRoomContext as TRoomBundle["useEventListener"], + + // prettier-ignore + useHistory: useHistory_withBoundRoomContext as TRoomBundle["useHistory"], + // prettier-ignore + useUndo: useUndo_withBoundRoomContext as TRoomBundle["useUndo"], + // prettier-ignore + useRedo: useRedo_withBoundRoomContext as TRoomBundle["useRedo"], + // prettier-ignore + useCanUndo: useCanUndo_withBoundRoomContext as TRoomBundle["useCanUndo"], + // prettier-ignore + useCanRedo: useCanRedo_withBoundRoomContext as TRoomBundle["useCanRedo"], + + // prettier-ignore + useStorageRoot: useStorageRoot_withBoundRoomContext as TRoomBundle["useStorageRoot"], + // prettier-ignore + useStorage: useStorage_withBoundRoomContext as TRoomBundle["useStorage"], + // prettier-ignore + useMutation: useMutation_withBoundRoomContext as TRoomBundle["useMutation"], + + // prettier-ignore + useSelf: useSelf_withBoundRoomContext as TRoomBundle["useSelf"], + // prettier-ignore + useMyPresence: useMyPresence_withBoundRoomContext as TRoomBundle["useMyPresence"], + // prettier-ignore + useUpdateMyPresence: useUpdateMyPresence_withBoundRoomContext as TRoomBundle["useUpdateMyPresence"], + // prettier-ignore + useOthers: useOthers_withBoundRoomContext as TRoomBundle["useOthers"], + // prettier-ignore + useOthersMapped: useOthersMapped_withBoundRoomContext as TRoomBundle["useOthersMapped"], + // prettier-ignore + useOthersConnectionIds: useOthersConnectionIds_withBoundRoomContext as TRoomBundle["useOthersConnectionIds"], + // prettier-ignore + useOther: useOther_withBoundRoomContext as TRoomBundle["useOther"], + + // prettier-ignore + useThreads: useThreads_withBoundRoomContext as TRoomBundle["useThreads"], + // prettier-ignore + useCreateThread: useCreateThread_withBoundRoomContext as TRoomBundle["useCreateThread"], + // prettier-ignore + useDeleteThread: useDeleteThread_withBoundRoomContext as TRoomBundle["useDeleteThread"], + // prettier-ignore + useEditThreadMetadata: useEditThreadMetadata_withBoundRoomContext as TRoomBundle["useEditThreadMetadata"], + // prettier-ignore + useMarkThreadAsResolved: useMarkThreadAsResolved_withBoundRoomContext as TRoomBundle["useMarkThreadAsResolved"], + // prettier-ignore + useMarkThreadAsUnresolved: useMarkThreadAsUnresolved_withBoundRoomContext as TRoomBundle["useMarkThreadAsUnresolved"], + // prettier-ignore + useSubscribeToThread: useSubscribeToThread_withBoundRoomContext as TRoomBundle["useSubscribeToThread"], + // prettier-ignore + useUnsubscribeFromThread: useUnsubscribeFromThread_withBoundRoomContext as TRoomBundle["useUnsubscribeFromThread"], + // prettier-ignore + useCreateComment: useCreateComment_withBoundRoomContext as TRoomBundle["useCreateComment"], + // prettier-ignore + useEditComment: useEditComment_withBoundRoomContext as TRoomBundle["useEditComment"], + // prettier-ignore + useEditCommentMetadata: useEditCommentMetadata_withBoundRoomContext as TRoomBundle["useEditCommentMetadata"], + // prettier-ignore + useDeleteComment: useDeleteComment_withBoundRoomContext as TRoomBundle["useDeleteComment"], + // prettier-ignore + useAddReaction: useAddReaction_withBoundRoomContext as TRoomBundle["useAddReaction"], + // prettier-ignore + useRemoveReaction: useRemoveReaction_withBoundRoomContext as TRoomBundle["useRemoveReaction"], + // prettier-ignore + useMarkThreadAsRead: useMarkThreadAsRead_withBoundRoomContext as TRoomBundle["useMarkThreadAsRead"], + // prettier-ignore + useThreadSubscription: useThreadSubscription_withBoundRoomContext as TRoomBundle["useThreadSubscription"], + // prettier-ignore + useAttachmentUrl: useAttachmentUrl_withBoundRoomContext as TRoomBundle["useAttachmentUrl"], + // prettier-ignore + useSearchComments: useSearchComments_withBoundRoomContext as TRoomBundle["useSearchComments"], + + // prettier-ignore + useHistoryVersions: useHistoryVersions_withBoundRoomContext as TRoomBundle["useHistoryVersions"], + // prettier-ignore + useHistoryVersionData: useHistoryVersionData_withBoundRoomContext as TRoomBundle["useHistoryVersionData"], + + // prettier-ignore + useRoomSubscriptionSettings: useRoomSubscriptionSettings_withBoundRoomContext as TRoomBundle["useRoomSubscriptionSettings"], + // prettier-ignore + useUpdateRoomSubscriptionSettings: useUpdateRoomSubscriptionSettings_withBoundRoomContext as TRoomBundle["useUpdateRoomSubscriptionSettings"], + + ...shared.classic, + + suspense: { + RoomContext: BoundRoomContext as Context, + RoomProvider: + RoomProvider_withImplicitLiveblocksProviderAndBoundRoomContext, + + // prettier-ignore + useRoom: useRoom_withBoundRoomContext as TRoomBundle["suspense"]["useRoom"], + // prettier-ignore + useStatus: useStatus_withBoundRoomContext as TRoomBundle["suspense"]["useStatus"], + // prettier-ignore + useBroadcastEvent: useBroadcastEvent_withBoundRoomContext as TRoomBundle["suspense"]["useBroadcastEvent"], + // prettier-ignore + useOthersListener: useOthersListener_withBoundRoomContext as TRoomBundle["suspense"]["useOthersListener"], + // prettier-ignore + useLostConnectionListener: useLostConnectionListener_withBoundRoomContext as TRoomBundle["suspense"]["useLostConnectionListener"], + // prettier-ignore + useEventListener: useEventListener_withBoundRoomContext as TRoomBundle["suspense"]["useEventListener"], + + // prettier-ignore + useHistory: useHistory_withBoundRoomContext as TRoomBundle["suspense"]["useHistory"], + // prettier-ignore + useUndo: useUndo_withBoundRoomContext as TRoomBundle["suspense"]["useUndo"], + // prettier-ignore + useRedo: useRedo_withBoundRoomContext as TRoomBundle["suspense"]["useRedo"], + // prettier-ignore + useCanUndo: useCanUndo_withBoundRoomContext as TRoomBundle["suspense"]["useCanUndo"], + // prettier-ignore + useCanRedo: useCanRedo_withBoundRoomContext as TRoomBundle["suspense"]["useCanRedo"], + + // prettier-ignore + useStorageRoot: useStorageRoot_withBoundRoomContext as TRoomBundle["suspense"]["useStorageRoot"], + // prettier-ignore + useStorage: useStorageSuspense_withBoundRoomContext as TRoomBundle["suspense"]["useStorage"], + // prettier-ignore + useMutation: useMutation_withBoundRoomContext as TRoomBundle["suspense"]["useMutation"], + + // prettier-ignore + useSelf: useSelfSuspense_withBoundRoomContext as TRoomBundle["suspense"]["useSelf"], + // prettier-ignore + useMyPresence: useMyPresence_withBoundRoomContext as TRoomBundle["suspense"]["useMyPresence"], + // prettier-ignore + useUpdateMyPresence: useUpdateMyPresence_withBoundRoomContext as TRoomBundle["suspense"]["useUpdateMyPresence"], + // prettier-ignore + useOthers: useOthersSuspense_withBoundRoomContext as TRoomBundle["suspense"]["useOthers"], + // prettier-ignore + useOthersMapped: useOthersMappedSuspense_withBoundRoomContext as TRoomBundle["suspense"]["useOthersMapped"], + // prettier-ignore + useOthersConnectionIds: useOthersConnectionIdsSuspense_withBoundRoomContext as TRoomBundle["suspense"]["useOthersConnectionIds"], + // prettier-ignore + useOther: useOtherSuspense_withBoundRoomContext as TRoomBundle["suspense"]["useOther"], + + // prettier-ignore + useThreads: useThreadsSuspense_withBoundRoomContext as TRoomBundle["suspense"]["useThreads"], + // prettier-ignore + useCreateThread: useCreateThread_withBoundRoomContext as TRoomBundle["suspense"]["useCreateThread"], + // prettier-ignore + useDeleteThread: useDeleteThread_withBoundRoomContext as TRoomBundle["suspense"]["useDeleteThread"], + // prettier-ignore + useEditThreadMetadata: useEditThreadMetadata_withBoundRoomContext as TRoomBundle["suspense"]["useEditThreadMetadata"], + // prettier-ignore + useMarkThreadAsResolved: useMarkThreadAsResolved_withBoundRoomContext as TRoomBundle["suspense"]["useMarkThreadAsResolved"], + // prettier-ignore + useMarkThreadAsUnresolved: useMarkThreadAsUnresolved_withBoundRoomContext as TRoomBundle["suspense"]["useMarkThreadAsUnresolved"], + // prettier-ignore + useSubscribeToThread: useSubscribeToThread_withBoundRoomContext as TRoomBundle["suspense"]["useSubscribeToThread"], + // prettier-ignore + useUnsubscribeFromThread: useUnsubscribeFromThread_withBoundRoomContext as TRoomBundle["suspense"]["useUnsubscribeFromThread"], + // prettier-ignore + useCreateComment: useCreateComment_withBoundRoomContext as TRoomBundle["suspense"]["useCreateComment"], + // prettier-ignore + useEditComment: useEditComment_withBoundRoomContext as TRoomBundle["suspense"]["useEditComment"], + // prettier-ignore + useEditCommentMetadata: useEditCommentMetadata_withBoundRoomContext as TRoomBundle["suspense"]["useEditCommentMetadata"], + // prettier-ignore + useDeleteComment: useDeleteComment_withBoundRoomContext as TRoomBundle["suspense"]["useDeleteComment"], + // prettier-ignore + useAddReaction: useAddReaction_withBoundRoomContext as TRoomBundle["suspense"]["useAddReaction"], + // prettier-ignore + useRemoveReaction: useRemoveReaction_withBoundRoomContext as TRoomBundle["suspense"]["useRemoveReaction"], + // prettier-ignore + useMarkThreadAsRead: useMarkThreadAsRead_withBoundRoomContext as TRoomBundle["suspense"]["useMarkThreadAsRead"], + // prettier-ignore + useThreadSubscription: useThreadSubscription_withBoundRoomContext as TRoomBundle["suspense"]["useThreadSubscription"], + // prettier-ignore + useAttachmentUrl: useAttachmentUrlSuspense_withBoundRoomContext as TRoomBundle["suspense"]["useAttachmentUrl"], + + // prettier-ignore + useHistoryVersions: useHistoryVersionsSuspense_withBoundRoomContext as TRoomBundle["suspense"]["useHistoryVersions"], + + // prettier-ignore + useRoomSubscriptionSettings: useRoomSubscriptionSettingsSuspense_withBoundRoomContext as TRoomBundle["suspense"]["useRoomSubscriptionSettings"], + // prettier-ignore + useUpdateRoomSubscriptionSettings: useUpdateRoomSubscriptionSettings_withBoundRoomContext as TRoomBundle["suspense"]["useUpdateRoomSubscriptionSettings"], + + // No Suspense version: useSearchComments + // No Suspense version: useHistoryVersionData + + ...shared.suspense, + }, + }; + + return Object.defineProperty(bundle, kInternal, { + enumerable: false, + }); } type TypedBundle = RoomContextBundle; diff --git a/packages/liveblocks-react/src/suspense.ts b/packages/liveblocks-react/src/suspense.ts index cdb162484e..5f38ff63f9 100644 --- a/packages/liveblocks-react/src/suspense.ts +++ b/packages/liveblocks-react/src/suspense.ts @@ -17,7 +17,11 @@ export type { Json, JsonObject } from "@liveblocks/client"; export { shallow, isNotificationChannelEnabled } from "@liveblocks/client"; // Export all the top-level hooks -export { ClientContext, RoomContext, useClient } from "./contexts"; +export { + ClientContext, + GlobalRoomContext as RoomContext, + useClient, +} from "./contexts"; export { RegisterAiKnowledge, RegisterAiTool } from "./ai"; export type { AiChatStatus, From ac1c9c2a054932cb44aa972ea7b43dc818d78e3f Mon Sep 17 00:00:00 2001 From: Chris Nicholas Date: Thu, 5 Mar 2026 12:10:20 +0000 Subject: [PATCH 7/7] Example: Update avatars/cursors to use high-level components (#3145) --- .github/assets/examples/comments-table.png | Bin 0 -> 397372 bytes examples/nextjs-comments-ag-grid/README.md | 27 +- .../nextjs-live-avatars/app/Providers.tsx | 27 + .../app/api/liveblocks-auth/route.ts | 32 + .../app/api/users/route.ts | 19 + examples/nextjs-live-avatars/app/layout.tsx | 37 + examples/nextjs-live-avatars/app/page.tsx | 47 + .../components/Avatar.module.css | 37 - .../nextjs-live-avatars/components/Avatar.tsx | 27 - examples/nextjs-live-avatars/database.ts | 78 + .../nextjs-live-avatars/liveblocks.config.ts | 2 +- .../nextjs-live-avatars/package-lock.json | 2324 ++++++++++++++-- examples/nextjs-live-avatars/package.json | 7 +- .../pages/api/liveblocks-auth.ts | 45 - .../pages/index.module.css | 14 - examples/nextjs-live-avatars/pages/index.tsx | 69 - examples/nextjs-live-avatars/tsconfig.json | 3 +- .../nextjs-live-cursors/app/Providers.tsx | 27 + .../app/api/liveblocks-auth/route.ts | 32 + .../app/api/users/route.ts | 19 + .../app/layout.tsx} | 26 +- .../index.module.css => app/page.module.css} | 6 +- examples/nextjs-live-cursors/app/page.tsx | 58 + .../nextjs-live-cursors/components/Cursor.tsx | 30 - examples/nextjs-live-cursors/database.ts | 78 + .../nextjs-live-cursors/liveblocks.config.ts | 9 + .../nextjs-live-cursors/package-lock.json | 2371 +++++++++++++++-- examples/nextjs-live-cursors/package.json | 6 +- examples/nextjs-live-cursors/pages/_app.tsx | 14 - .../nextjs-live-cursors/pages/_document.tsx | 20 - examples/nextjs-live-cursors/pages/index.tsx | 130 - .../nextjs-live-cursors/styles/globals.css | 2 + examples/nextjs-live-cursors/tsconfig.json | 3 +- 33 files changed, 4863 insertions(+), 763 deletions(-) create mode 100644 .github/assets/examples/comments-table.png create mode 100644 examples/nextjs-live-avatars/app/Providers.tsx create mode 100644 examples/nextjs-live-avatars/app/api/liveblocks-auth/route.ts create mode 100644 examples/nextjs-live-avatars/app/api/users/route.ts create mode 100644 examples/nextjs-live-avatars/app/layout.tsx create mode 100644 examples/nextjs-live-avatars/app/page.tsx delete mode 100644 examples/nextjs-live-avatars/components/Avatar.module.css delete mode 100644 examples/nextjs-live-avatars/components/Avatar.tsx create mode 100644 examples/nextjs-live-avatars/database.ts delete mode 100644 examples/nextjs-live-avatars/pages/api/liveblocks-auth.ts delete mode 100644 examples/nextjs-live-avatars/pages/index.module.css delete mode 100644 examples/nextjs-live-avatars/pages/index.tsx create mode 100644 examples/nextjs-live-cursors/app/Providers.tsx create mode 100644 examples/nextjs-live-cursors/app/api/liveblocks-auth/route.ts create mode 100644 examples/nextjs-live-cursors/app/api/users/route.ts rename examples/{nextjs-live-avatars/pages/_app.tsx => nextjs-live-cursors/app/layout.tsx} (60%) rename examples/nextjs-live-cursors/{pages/index.module.css => app/page.module.css} (77%) create mode 100644 examples/nextjs-live-cursors/app/page.tsx delete mode 100644 examples/nextjs-live-cursors/components/Cursor.tsx create mode 100644 examples/nextjs-live-cursors/database.ts delete mode 100644 examples/nextjs-live-cursors/pages/_app.tsx delete mode 100644 examples/nextjs-live-cursors/pages/_document.tsx delete mode 100644 examples/nextjs-live-cursors/pages/index.tsx diff --git a/.github/assets/examples/comments-table.png b/.github/assets/examples/comments-table.png new file mode 100644 index 0000000000000000000000000000000000000000..94e43440588f4265d09b5b00339ecd67cac01a01 GIT binary patch literal 397372 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 z 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

j4ZjMq7{G0nf3$6MQ|i&Gu2Luy2Lh zeyc@{_ki|>@aQAz-tp_MWEvWTT*27x zWQbN_VkP;>gJ}8TY#IF>tZXzn0SVBa2W1;KanRpp%XbsXYYayiDED6RzSqa;3WDY@ zmziA+fQ&nEe)3wd2MMyukthFq-wKRzR%x9&#pwsb_;ZPa`@|4Cfu`aI{x{>{IH6`) zIHlyAu4A5|ULBZ28U8kXp0p0!=Q^`iub1E__zwM6S5Dn<{Qf=1_Rbg#Xk~uhJFxrp z^%{JD-yo-EeP%#@z=eSZ}|z{eX&~U3i(XtOq2!b zda|^40PkIGdfoJ@(;jFOMcW^cxm{@pdKmn?l%vRi{MObvhvaa+9flFXEItAUPrGEzi9>WAhyPwyAy6PMqgfvxmP04vB+tJ7 z|5M$7YBnM~c>>I)6`YXrowCd4QA#FBznmVp@q*#!>0`AmcnSVfT@)j~_UroeQ#MYP z^#6X?w|a>>Zg(ZBxnitoG95nIisC)Dw*m&<3!O7#NLTAq4n-VYF3 zm#g|Gj8PcPf_tnq$N}@e9 zdP|Uw%J1Lbw%$KI!|wUh%lVkTT%EMZd76FnPcLrt@G&al-%jS= zzJ46^!QU?E^AErOY0Urd<-(jp{Rp^}5CU;wo~8HL2YHQFN?AbjoQY$sluk3FLQ!4yXP}hS)WuRdH?K#;qXw$z@Edqy+d*F@MXrN=g&l4ihe*0i@0>_SuvoOCU{;xOVlc&S_pF=;Ix

_5+VNbQg4(X>e6{oy=@XD4c&i^x? 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 VSnfkR&+h;L002ovPDHLkV1h%gMW+A& literal 0 HcmV?d00001 diff --git a/examples/nextjs-comments-ag-grid/README.md b/examples/nextjs-comments-ag-grid/README.md index abedb20f7b..7d9cee6472 100644 --- a/examples/nextjs-comments-ag-grid/README.md +++ b/examples/nextjs-comments-ag-grid/README.md @@ -9,12 +9,27 @@ # AG Grid commenting + +

React Next.js

-This example shows how to build AG Grid commenting with [Liveblocks](https://liveblocks.io), [AG Grid](https://www.ag-grid.com/), and [Next.js](https://nextjs.org/). +This example shows how to build commenting to your +[AG Grid](https://www.ag-grid.com/) table with +[Liveblocks](https://liveblocks.io) and [Next.js](https://nextjs.org/). + +Collaborative Text Editor ## Getting started @@ -24,7 +39,9 @@ Run the following command to try this example locally: npx create-liveblocks-app@latest --example nextjs-comments-ag-grid --api-key ``` -This will download the example and ask permission to open your browser, enabling you to automatically get your API key from your [liveblocks.io](https://liveblocks.io) account. +This will download the example and ask permission to open your browser, enabling +you to automatically get your API key from your +[liveblocks.io](https://liveblocks.io) account. ### Manual setup @@ -36,8 +53,10 @@ Alternatively, you can set up your project manually: - Install all dependencies with `npm install` - Create an account on [liveblocks.io](https://liveblocks.io/dashboard) -- Copy your **secret** key from the [dashboard](https://liveblocks.io/dashboard/apikeys) -- Create an `.env.local` file and add your **secret** key as the `LIVEBLOCKS_SECRET_KEY` environment variable +- Copy your **secret** key from the + [dashboard](https://liveblocks.io/dashboard/apikeys) +- Create an `.env.local` file and add your **secret** key as the + `LIVEBLOCKS_SECRET_KEY` environment variable - Run `npm run dev` and go to [http://localhost:3000](http://localhost:3000) diff --git a/examples/nextjs-live-avatars/app/Providers.tsx b/examples/nextjs-live-avatars/app/Providers.tsx new file mode 100644 index 0000000000..7476ab86c3 --- /dev/null +++ b/examples/nextjs-live-avatars/app/Providers.tsx @@ -0,0 +1,27 @@ +"use client"; + +import { LiveblocksProvider } from "@liveblocks/react"; +import { PropsWithChildren } from "react"; + +export function Providers({ children }: PropsWithChildren) { + return ( + { + const searchParams = new URLSearchParams( + userIds.map((userId) => ["userIds", userId]) + ); + const response = await fetch(`/api/users?${searchParams}`); + + if (!response.ok) { + throw new Error("Problem resolving users"); + } + + const users = await response.json(); + return users; + }} + > + {children} + + ); +} diff --git a/examples/nextjs-live-avatars/app/api/liveblocks-auth/route.ts b/examples/nextjs-live-avatars/app/api/liveblocks-auth/route.ts new file mode 100644 index 0000000000..068e5a19c9 --- /dev/null +++ b/examples/nextjs-live-avatars/app/api/liveblocks-auth/route.ts @@ -0,0 +1,32 @@ +import { Liveblocks } from "@liveblocks/node"; +import { NextRequest } from "next/server"; + +import { getRandomUser, getUser } from "../../../database"; + +/** + * Authenticating your Liveblocks application + * https://liveblocks.io/docs/authentication + */ + +const liveblocks = new Liveblocks({ + secret: process.env.LIVEBLOCKS_SECRET_KEY!, +}); + +export async function POST(request: NextRequest) { + const body = await request.json().catch(() => ({})); + const userId = body.userId as string | undefined; + const user = userId ? getUser(userId) : getRandomUser(); + + if (!user) { + return new Response(null, { status: 401 }); + } + + const session = liveblocks.prepareSession(user.id, { + userInfo: user.info, + }); + + session.allow(`liveblocks:examples:*`, session.FULL_ACCESS); + + const { status, body: responseBody } = await session.authorize(); + return new Response(responseBody, { status }); +} diff --git a/examples/nextjs-live-avatars/app/api/users/route.ts b/examples/nextjs-live-avatars/app/api/users/route.ts new file mode 100644 index 0000000000..7663c3a4d3 --- /dev/null +++ b/examples/nextjs-live-avatars/app/api/users/route.ts @@ -0,0 +1,19 @@ +import { NextRequest, NextResponse } from "next/server"; + +import { getUser } from "../../../database"; + +export async function GET(request: NextRequest) { + const { searchParams } = new URL(request.url); + const userIds = searchParams.getAll("userIds"); + + if (!userIds.length) { + return NextResponse.json( + { error: "Missing or invalid userIds" }, + { status: 400 } + ); + } + + return NextResponse.json( + userIds.map((userId) => getUser(userId)?.info ?? null) + ); +} diff --git a/examples/nextjs-live-avatars/app/layout.tsx b/examples/nextjs-live-avatars/app/layout.tsx new file mode 100644 index 0000000000..ff154ef0f6 --- /dev/null +++ b/examples/nextjs-live-avatars/app/layout.tsx @@ -0,0 +1,37 @@ +import "../styles/globals.css"; +import { Providers } from "./Providers"; +import "@liveblocks/react-ui/styles.css"; +import { Suspense } from "react"; + +export default function RootLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( + + + Liveblocks + + + + + + + + {children} + + + + ); +} diff --git a/examples/nextjs-live-avatars/app/page.tsx b/examples/nextjs-live-avatars/app/page.tsx new file mode 100644 index 0000000000..f11dccef71 --- /dev/null +++ b/examples/nextjs-live-avatars/app/page.tsx @@ -0,0 +1,47 @@ +"use client"; + +import { useMemo } from "react"; +import { useSearchParams } from "next/navigation"; +import { RoomProvider } from "@liveblocks/react"; +import { AvatarStack } from "@liveblocks/react-ui"; + +function Example() { + return ( +
+ +
+ ); +} + +export default function Page() { + const roomId = useExampleRoomId("liveblocks:examples:nextjs-live-avatars"); + + return ( + + + + ); +} + +/** + * This function is used when deploying an example on liveblocks.io. + * You can ignore it completely if you run the example locally. + */ +function useExampleRoomId(roomId: string) { + const searchParams = useSearchParams(); + const exampleId = searchParams?.get("exampleId"); + + const exampleRoomId = useMemo(() => { + return exampleId ? `${roomId}-${exampleId}` : roomId; + }, [roomId, exampleId]); + + return exampleRoomId; +} diff --git a/examples/nextjs-live-avatars/components/Avatar.module.css b/examples/nextjs-live-avatars/components/Avatar.module.css deleted file mode 100644 index 2f9df80ee8..0000000000 --- a/examples/nextjs-live-avatars/components/Avatar.module.css +++ /dev/null @@ -1,37 +0,0 @@ -.avatar { - display: flex; - place-content: center; - position: relative; - border: 4px solid #fff; - border-radius: 9999px; - width: 56px; - height: 56px; - background-color: #9ca3af; - margin-left: -0.75rem; -} - -.avatar:before { - content: attr(data-tooltip); - position: absolute; - bottom: 100%; - opacity: 0; - transition: opacity 0.15s ease; - padding: 5px 10px; - color: white; - font-size: 0.75rem; - border-radius: 8px; - margin-bottom: 10px; - z-index: 1; - background: black; - white-space: nowrap; -} - -.avatar:hover:before { - opacity: 1; -} - -.avatar_picture { - width: 100%; - height: 100%; - border-radius: 9999px; -} diff --git a/examples/nextjs-live-avatars/components/Avatar.tsx b/examples/nextjs-live-avatars/components/Avatar.tsx deleted file mode 100644 index dba29adb75..0000000000 --- a/examples/nextjs-live-avatars/components/Avatar.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import React from "react"; -import styles from "./Avatar.module.css"; - -/** - * This file shows how to add live avatars like you can see them at the top right of a Google Doc or a Figma file. - * https://liveblocks.io/docs/examples/live-avatars - * - * The users avatar and name are not set via the `useMyPresence` hook like the cursors. - * They are set from the authentication endpoint. - * - * See pages/api/liveblocks-auth.ts and https://liveblocks.io/docs/api-reference/liveblocks-node#authorize for more information - */ - -const IMAGE_SIZE = 48; - -export function Avatar({ src, name }: { src: string; name: string }) { - return ( -
- -
- ); -} diff --git a/examples/nextjs-live-avatars/database.ts b/examples/nextjs-live-avatars/database.ts new file mode 100644 index 0000000000..940e1d4f19 --- /dev/null +++ b/examples/nextjs-live-avatars/database.ts @@ -0,0 +1,78 @@ +const USER_INFO: Liveblocks["UserMeta"][] = [ + { + id: "charlie.layne@example.com", + info: { + name: "Charlie Layne", + color: "#D583F0", + avatar: "https://liveblocks.io/avatars/avatar-1.png", + }, + }, + { + id: "mislav.abha@example.com", + info: { + name: "Mislav Abha", + color: "#F08385", + avatar: "https://liveblocks.io/avatars/avatar-2.png", + }, + }, + { + id: "tatum.paolo@example.com", + info: { + name: "Tatum Paolo", + color: "#F0D885", + avatar: "https://liveblocks.io/avatars/avatar-3.png", + }, + }, + { + id: "anjali.wanda@example.com", + info: { + name: "Anjali Wanda", + color: "#85EED6", + avatar: "https://liveblocks.io/avatars/avatar-4.png", + }, + }, + { + id: "jody.hekla@example.com", + info: { + name: "Jody Hekla", + color: "#85BBF0", + avatar: "https://liveblocks.io/avatars/avatar-5.png", + }, + }, + { + id: "emil.joyce@example.com", + info: { + name: "Emil Joyce", + color: "#8594F0", + avatar: "https://liveblocks.io/avatars/avatar-6.png", + }, + }, + { + id: "jory.quispe@example.com", + info: { + name: "Jory Quispe", + color: "#85DBF0", + avatar: "https://liveblocks.io/avatars/avatar-7.png", + }, + }, + { + id: "quinn.elton@example.com", + info: { + name: "Quinn Elton", + color: "#87EE85", + avatar: "https://liveblocks.io/avatars/avatar-8.png", + }, + }, +]; + +export function getRandomUser() { + return USER_INFO[Math.floor(Math.random() * 10) % USER_INFO.length]; +} + +export function getUser(id: string) { + return USER_INFO.find((u) => u.id === id) || null; +} + +export function getUsers() { + return USER_INFO; +} diff --git a/examples/nextjs-live-avatars/liveblocks.config.ts b/examples/nextjs-live-avatars/liveblocks.config.ts index b7a0475e00..51d9174d19 100644 --- a/examples/nextjs-live-avatars/liveblocks.config.ts +++ b/examples/nextjs-live-avatars/liveblocks.config.ts @@ -4,8 +4,8 @@ declare global { UserMeta: { id: string; info: { - // Example properties, for useSelf, useUser, useOthers, etc. name: string; + color: string; avatar: string; }; }; diff --git a/examples/nextjs-live-avatars/package-lock.json b/examples/nextjs-live-avatars/package-lock.json index 43927f8270..86c621bb72 100644 --- a/examples/nextjs-live-avatars/package-lock.json +++ b/examples/nextjs-live-avatars/package-lock.json @@ -7,9 +7,10 @@ "name": "@liveblocks-examples/nextjs-live-avatars", "license": "Apache-2.0", "dependencies": { - "@liveblocks/client": "^3.14.0", - "@liveblocks/node": "^3.14.0", - "@liveblocks/react": "^3.14.0", + "@liveblocks/client": "^3.15.0-rc1", + "@liveblocks/node": "^3.15.0-rc1", + "@liveblocks/react": "^3.15.0-rc1", + "@liveblocks/react-ui": "^3.15.0-rc1", "next": "^16.1.6", "react": "^18.3.1", "react-dom": "^18.3.1" @@ -48,10 +49,48 @@ "tslib": "^2.4.0" } }, + "node_modules/@floating-ui/core": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", + "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", + "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.5", + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.8.tgz", + "integrity": "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.6" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", + "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", + "license": "MIT" + }, "node_modules/@img/colour": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", - "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", "license": "MIT", "optional": true, "engines": { @@ -553,44 +592,50 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@juggle/resize-observer": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", + "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==", + "license": "Apache-2.0" + }, "node_modules/@liveblocks/client": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@liveblocks/client/-/client-3.14.0.tgz", - "integrity": "sha512-+2VukE9iaVDaSTwMCQMBtIBwpn0t2PVfIVGLydT8O/nHGiA84ew2bV0pZc+Z+G4WQuFnAYcSBhddmZrdiQJyIQ==", + "version": "3.15.0-rc1", + "resolved": "https://registry.npmjs.org/@liveblocks/client/-/client-3.15.0-rc1.tgz", + "integrity": "sha512-SmMpegEmd4XWbPs9CRDniv3GNVkGjXO1FlpVhCP4xZMLCtyWLTMdAIfxgwIRzRHhWQKzSn0W4XryXWNN/Hknzg==", "license": "Apache-2.0", "dependencies": { - "@liveblocks/core": "3.14.0" + "@liveblocks/core": "3.15.0-rc1" } }, "node_modules/@liveblocks/core": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@liveblocks/core/-/core-3.14.0.tgz", - "integrity": "sha512-U57xnMLBv3O271YS/RiL9Wj/E1F28D2rmVPpWorlHyEytXeodmibWM4oLgmoRBF/GPSCpCJGMcCTSRKFOcTLPg==", + "version": "3.15.0-rc1", + "resolved": "https://registry.npmjs.org/@liveblocks/core/-/core-3.15.0-rc1.tgz", + "integrity": "sha512-B88HJ974l0V1oteSH+fePTGCx3jUHvU2CAEB+pKGQjV4SOr6XcHJkLd5kRULVGLDhl6xBveqzxHhH7UXRK+MHg==", "license": "Apache-2.0", "peerDependencies": { "@types/json-schema": "^7" } }, "node_modules/@liveblocks/node": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@liveblocks/node/-/node-3.14.0.tgz", - "integrity": "sha512-iGNMpiQDfuEI9YwsvVriIhFQrBITTwhH9Jdg91+xvYglvSWxSR30cOoYsBXKQvkBTNWMMcD/+DtH/gOMRTK5Aw==", + "version": "3.15.0-rc1", + "resolved": "https://registry.npmjs.org/@liveblocks/node/-/node-3.15.0-rc1.tgz", + "integrity": "sha512-hc52BJVkX9nXvtTnqYhSD0H/y4a5p5MSyC0LFpDT061SDQixxZZp5vfHbOT61knhQGE9Q3FoTVliGqUrYPczMA==", "license": "Apache-2.0", "dependencies": { - "@liveblocks/core": "3.14.0", + "@liveblocks/core": "3.15.0-rc1", "@stablelib/base64": "^1.0.1", "fast-sha256": "^1.3.0", "node-fetch": "^2.6.1" } }, "node_modules/@liveblocks/react": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@liveblocks/react/-/react-3.14.0.tgz", - "integrity": "sha512-MFX8WotVy+NAJwj9JjbUi0jDMJxDO8n5ZfNFZ8D7cl/2klL+OIyrOkXFIkbNDMRZ9hnpvJllPyeBAhhr0ROokQ==", + "version": "3.15.0-rc1", + "resolved": "https://registry.npmjs.org/@liveblocks/react/-/react-3.15.0-rc1.tgz", + "integrity": "sha512-F3X3QTH896Kj+ohRjWjbETb82dIYDfApJEsoU5ruwF9Omx/hn9A/PYdb8PQ/vNhVt2R7FtesN/mnA3pJugyq7w==", "license": "Apache-2.0", "dependencies": { - "@liveblocks/client": "3.14.0", - "@liveblocks/core": "3.14.0" + "@liveblocks/client": "3.15.0-rc1", + "@liveblocks/core": "3.15.0-rc1" }, "peerDependencies": { "@types/react": "*", @@ -606,178 +651,1786 @@ } } }, - "node_modules/@next/env": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@next/env/-/env-16.1.6.tgz", - "integrity": "sha512-N1ySLuZjnAtN3kFnwhAwPvZah8RJxKasD7x1f8shFqhncnWZn4JMfg37diLNuoHsLAlrDfM3g4mawVdtAG8XLQ==", - "license": "MIT" + "node_modules/@liveblocks/react-ui": { + "version": "3.15.0-rc1", + "resolved": "https://registry.npmjs.org/@liveblocks/react-ui/-/react-ui-3.15.0-rc1.tgz", + "integrity": "sha512-qX7FMROa/vMbjNriWvOFKo3uUAGfCeHssiMeCegkR7CpJNFAL0pUiAZMkrzs5Vf3/AyU9JaKkhu9FujavJlhRA==", + "license": "Apache-2.0", + "dependencies": { + "@floating-ui/react-dom": "^2.1.0", + "@liveblocks/client": "3.15.0-rc1", + "@liveblocks/core": "3.15.0-rc1", + "@liveblocks/react": "3.15.0-rc1", + "frimousse": "^0.2.0", + "marked": "^15.0.11", + "radix-ui": "^1.4.0", + "slate": "^0.110.2", + "slate-history": "^0.110.3", + "slate-hyperscript": "^0.100.0", + "slate-react": "^0.110.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^18 || ^19 || ^19.0.0-rc", + "react-dom": "^18 || ^19 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } }, - "node_modules/@next/swc-darwin-arm64": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.1.6.tgz", - "integrity": "sha512-wTzYulosJr/6nFnqGW7FrG3jfUUlEf8UjGA0/pyypJl42ExdVgC6xJgcXQ+V8QFn6niSG2Pb8+MIG1mZr2vczw==", - "cpu": [ - "arm64" - ], + "node_modules/@liveblocks/react-ui/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@next/swc-darwin-x64": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.1.6.tgz", - "integrity": "sha512-BLFPYPDO+MNJsiDWbeVzqvYd4NyuRrEYVB5k2N3JfWncuHAy2IVwMAOlVQDFjj+krkWzhY2apvmekMkfQR0CUQ==", - "cpu": [ - "x64" - ], + "node_modules/@liveblocks/react-ui/node_modules/radix-ui": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/radix-ui/-/radix-ui-1.4.3.tgz", + "integrity": "sha512-aWizCQiyeAenIdUbqEpXgRA1ya65P13NKn/W8rWkcN0OPkRDxdBVLWnIEDsS2RpwCK2nobI7oMUSmexzTDyAmA==", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-accessible-icon": "1.1.7", + "@radix-ui/react-accordion": "1.2.12", + "@radix-ui/react-alert-dialog": "1.1.15", + "@radix-ui/react-arrow": "1.1.7", + "@radix-ui/react-aspect-ratio": "1.1.7", + "@radix-ui/react-avatar": "1.1.10", + "@radix-ui/react-checkbox": "1.3.3", + "@radix-ui/react-collapsible": "1.1.12", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-context-menu": "2.2.16", + "@radix-ui/react-dialog": "1.1.15", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-dropdown-menu": "2.1.16", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-form": "0.1.8", + "@radix-ui/react-hover-card": "1.1.15", + "@radix-ui/react-label": "2.1.7", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-menubar": "1.1.16", + "@radix-ui/react-navigation-menu": "1.2.14", + "@radix-ui/react-one-time-password-field": "0.1.8", + "@radix-ui/react-password-toggle-field": "0.1.3", + "@radix-ui/react-popover": "1.1.15", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-progress": "1.1.7", + "@radix-ui/react-radio-group": "1.3.8", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-scroll-area": "1.2.10", + "@radix-ui/react-select": "2.2.6", + "@radix-ui/react-separator": "1.1.7", + "@radix-ui/react-slider": "1.3.6", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-switch": "1.2.6", + "@radix-ui/react-tabs": "1.1.13", + "@radix-ui/react-toast": "1.2.15", + "@radix-ui/react-toggle": "1.1.10", + "@radix-ui/react-toggle-group": "1.1.11", + "@radix-ui/react-toolbar": "1.1.11", + "@radix-ui/react-tooltip": "1.2.8", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-escape-keydown": "1.1.1", + "@radix-ui/react-use-is-hydrated": "0.1.0", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-size": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.1.6.tgz", - "integrity": "sha512-OJYkCd5pj/QloBvoEcJ2XiMnlJkRv9idWA/j0ugSuA34gMT6f5b7vOiCQHVRpvStoZUknhl6/UxOXL4OwtdaBw==", - "cpu": [ - "arm64" - ], + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-accessible-icon": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accessible-icon/-/react-accessible-icon-1.1.7.tgz", + "integrity": "sha512-XM+E4WXl0OqUJFovy6GjmxxFyx9opfCAIUku4dlKRd5YEPqt4kALOkQOp0Of6reHuUkJuiPBEc5k0o4z4lTC8A==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.1.6.tgz", - "integrity": "sha512-S4J2v+8tT3NIO9u2q+S0G5KdvNDjXfAv06OhfOzNDaBn5rw84DGXWndOEB7d5/x852A20sW1M56vhC/tRVbccQ==", - "cpu": [ - "arm64" - ], + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-accordion": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.12.tgz", + "integrity": "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collapsible": "1.1.12", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.1.6.tgz", - "integrity": "sha512-2eEBDkFlMMNQnkTyPBhQOAyn2qMxyG2eE7GPH2WIDGEpEILcBPI/jdSv4t6xupSP+ot/jkfrCShLAa7+ZUPcJQ==", - "cpu": [ - "x64" - ], + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-alert-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.15.tgz", + "integrity": "sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dialog": "1.1.15", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.1.6.tgz", - "integrity": "sha512-oicJwRlyOoZXVlxmIMaTq7f8pN9QNbdes0q2FXfRsPhfCi8n8JmOZJm5oo1pwDaFbnnD421rVU409M3evFbIqg==", - "cpu": [ - "x64" - ], + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-arrow": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", + "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.1.6.tgz", - "integrity": "sha512-gQmm8izDTPgs+DCWH22kcDmuUp7NyiJgEl18bcr8irXA5N2m2O+JQIr6f3ct42GOs9c0h8QF3L5SzIxcYAAXXw==", - "cpu": [ - "arm64" - ], + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-aspect-ratio": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.7.tgz", + "integrity": "sha512-Yq6lvO9HQyPwev1onK1daHCHqXVLzPhSVjmsNjCa2Zcxy2f7uJD2itDtxknv6FzAKCwD1qQkeVDmX/cev13n/g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-avatar": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.10.tgz", + "integrity": "sha512-V8piFfWapM5OmNCXTzVQY+E1rDa53zY+MQ4Y7356v4fFz6vqCyUtIz2rUD44ZEdwg78/jKmMJHj07+C/Z/rcog==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-is-hydrated": "0.1.0", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-checkbox": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.3.tgz", + "integrity": "sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-collapsible": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz", + "integrity": "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-collection": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", + "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-context-menu": { + "version": "2.2.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.2.16.tgz", + "integrity": "sha512-O8morBEW+HsVG28gYDZPTrT9UUovQUlJue5YO836tiTJhuIWBm/zQHc7j388sHWtdH/xUZurK9olD2+pcqx5ww==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", + "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", + "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.16.tgz", + "integrity": "sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-form": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-form/-/react-form-0.1.8.tgz", + "integrity": "sha512-QM70k4Zwjttifr5a4sZFts9fn8FzHYvQ5PiB19O2HsYibaHSVt9fH9rzB0XZo/YcM+b7t/p7lYCT/F5eOeF5yQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-label": "2.1.7", + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-hover-card": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.15.tgz", + "integrity": "sha512-qgTkjNT1CfKMoP0rcasmlH2r1DAiYicWsDsufxl940sT2wHNEWWv6FMWIQXWhVdmC1d/HYfbhQx60KYyAtKxjg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-label": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.7.tgz", + "integrity": "sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-menu": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.16.tgz", + "integrity": "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-menubar": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.16.tgz", + "integrity": "sha512-EB1FktTz5xRRi2Er974AUQZWg2yVBb1yjip38/lgwtCVRd3a+maUoGHN/xs9Yv8SY8QwbSEb+YrxGadVWbEutA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-navigation-menu": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.14.tgz", + "integrity": "sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-one-time-password-field": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-one-time-password-field/-/react-one-time-password-field-0.1.8.tgz", + "integrity": "sha512-ycS4rbwURavDPVjCb5iS3aG4lURFDILi6sKI/WITUMZ13gMmn/xGjpLoqBAalhJaDk8I3UbCM5GzKHrnzwHbvg==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-is-hydrated": "0.1.0", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-password-toggle-field": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-password-toggle-field/-/react-password-toggle-field-0.1.3.tgz", + "integrity": "sha512-/UuCrDBWravcaMix4TdT+qlNdVwOM1Nck9kWx/vafXsdfj1ChfhOdfi3cy9SGBpWgTXwYCuboT/oYpJy3clqfw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-is-hydrated": "0.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-popover": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.15.tgz", + "integrity": "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-popper": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", + "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-rect": "1.1.1", + "@radix-ui/react-use-size": "1.1.1", + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-portal": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-presence": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", + "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-progress": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.7.tgz", + "integrity": "sha512-vPdg/tF6YC/ynuBIJlk1mm7Le0VgW6ub6J2UWnTQ7/D23KXcPI1qy+0vBkgKgd38RCMJavBXpB83HPNFMTb0Fg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-radio-group": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.3.8.tgz", + "integrity": "sha512-VBKYIYImA5zsxACdisNQ3BjCBfmbGH3kQlnFVqlWU4tXwjy7cGX8ta80BcrO+WJXIn5iBylEH3K6ZTlee//lgQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", + "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-scroll-area": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.10.tgz", + "integrity": "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-select": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.6.tgz", + "integrity": "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-separator": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.7.tgz", + "integrity": "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-slider": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.3.6.tgz", + "integrity": "sha512-JPYb1GuM1bxfjMRlNLE+BcmBC8onfCi60Blk7OBqi2MLTFdS+8401U4uFjnwkOr49BLmXxLC6JHkvAsx5OJvHw==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-switch": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.2.6.tgz", + "integrity": "sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-tabs": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz", + "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-toast": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.15.tgz", + "integrity": "sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-toggle": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.10.tgz", + "integrity": "sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-toggle-group": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.11.tgz", + "integrity": "sha512-5umnS0T8JQzQT6HbPyO7Hh9dgd82NmS36DQr+X/YJ9ctFNCiiQd6IJAYYZ33LUwm8M+taCz5t2ui29fHZc4Y6Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-toggle": "1.1.10", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-toolbar": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.1.11.tgz", + "integrity": "sha512-4ol06/1bLoFu1nwUqzdD4Y5RZ9oDdKeiHIsntug54Hcr1pgaHiPqHFEaXI1IFP/EsOfROQZ8Mig9VTIRza6Tjg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-separator": "1.1.7", + "@radix-ui/react-toggle-group": "1.1.11" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-tooltip": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.8.tgz", + "integrity": "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@liveblocks/react-ui/node_modules/radix-ui/node_modules/@radix-ui/react-visually-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", + "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@next/env": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.1.6.tgz", + "integrity": "sha512-N1ySLuZjnAtN3kFnwhAwPvZah8RJxKasD7x1f8shFqhncnWZn4JMfg37diLNuoHsLAlrDfM3g4mawVdtAG8XLQ==", + "license": "MIT" + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.1.6.tgz", + "integrity": "sha512-wTzYulosJr/6nFnqGW7FrG3jfUUlEf8UjGA0/pyypJl42ExdVgC6xJgcXQ+V8QFn6niSG2Pb8+MIG1mZr2vczw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.1.6.tgz", + "integrity": "sha512-BLFPYPDO+MNJsiDWbeVzqvYd4NyuRrEYVB5k2N3JfWncuHAy2IVwMAOlVQDFjj+krkWzhY2apvmekMkfQR0CUQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.1.6.tgz", + "integrity": "sha512-OJYkCd5pj/QloBvoEcJ2XiMnlJkRv9idWA/j0ugSuA34gMT6f5b7vOiCQHVRpvStoZUknhl6/UxOXL4OwtdaBw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.1.6.tgz", + "integrity": "sha512-S4J2v+8tT3NIO9u2q+S0G5KdvNDjXfAv06OhfOzNDaBn5rw84DGXWndOEB7d5/x852A20sW1M56vhC/tRVbccQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.1.6.tgz", + "integrity": "sha512-2eEBDkFlMMNQnkTyPBhQOAyn2qMxyG2eE7GPH2WIDGEpEILcBPI/jdSv4t6xupSP+ot/jkfrCShLAa7+ZUPcJQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.1.6.tgz", + "integrity": "sha512-oicJwRlyOoZXVlxmIMaTq7f8pN9QNbdes0q2FXfRsPhfCi8n8JmOZJm5oo1pwDaFbnnD421rVU409M3evFbIqg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.1.6.tgz", + "integrity": "sha512-gQmm8izDTPgs+DCWH22kcDmuUp7NyiJgEl18bcr8irXA5N2m2O+JQIr6f3ct42GOs9c0h8QF3L5SzIxcYAAXXw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.1.6.tgz", + "integrity": "sha512-NRfO39AIrzBnixKbjuo2YiYhB6o9d8v/ymU9m/Xk8cyVk+k7XylniXkHwjs4s70wedVffc6bQNbufk5v0xEm0A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@radix-ui/number": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", + "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", + "license": "MIT" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", + "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", + "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-is-hydrated": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.0.tgz", + "integrity": "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "use-sync-external-store": "^1.5.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.1.6.tgz", - "integrity": "sha512-NRfO39AIrzBnixKbjuo2YiYhB6o9d8v/ymU9m/Xk8cyVk+k7XylniXkHwjs4s70wedVffc6bQNbufk5v0xEm0A==", - "cpu": [ - "x64" - ], + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", + "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "engines": { - "node": ">= 8" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", + "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", "license": "MIT", - "engines": { - "node": ">= 8" + "dependencies": { + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", + "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", "license": "MIT", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@radix-ui/react-use-layout-effect": "1.1.1" }, - "engines": { - "node": ">= 8" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, + "node_modules/@radix-ui/rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", + "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", + "license": "MIT" + }, "node_modules/@stablelib/base64": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@stablelib/base64/-/base64-1.0.1.tgz", @@ -815,11 +2468,12 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.27", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.27.tgz", - "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", + "version": "18.3.28", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", + "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.2.2" @@ -853,10 +2507,22 @@ "dev": true, "license": "MIT" }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/autoprefixer": { - "version": "10.4.23", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz", - "integrity": "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==", + "version": "10.4.27", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.27.tgz", + "integrity": "sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==", "dev": true, "funding": [ { @@ -875,7 +2541,7 @@ "license": "MIT", "dependencies": { "browserslist": "^4.28.1", - "caniuse-lite": "^1.0.30001760", + "caniuse-lite": "^1.0.30001774", "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" @@ -891,12 +2557,15 @@ } }, "node_modules/baseline-browser-mapping": { - "version": "2.9.18", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.18.tgz", - "integrity": "sha512-e23vBV1ZLfjb9apvfPk4rHVu2ry6RIr2Wfs+O324okSidrX7pTAnEJPCh/O5BtRlr7QtZI7ktOP3vsqr7Z5XoA==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", + "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==", "license": "Apache-2.0", "bin": { - "baseline-browser-mapping": "dist/cli.js" + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/binary-extensions": { @@ -945,6 +2614,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -970,9 +2640,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001766", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz", - "integrity": "sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==", + "version": "1.0.30001776", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001776.tgz", + "integrity": "sha512-sg01JDPzZ9jGshqKSckOQthXnYwOEP50jeVFhaSFbZcOy05TiuuaffDOfcwtCisJ9kNQuLBFibYywv2Bgm9osw==", "funding": [ { "type": "opencollective", @@ -1043,6 +2713,12 @@ "node": ">= 6" } }, + "node_modules/compute-scroll-into-view": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz", + "integrity": "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==", + "license": "MIT" + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -1073,6 +2749,12 @@ "node": ">=8" } }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -1080,6 +2762,19 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/direction": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/direction/-/direction-1.0.4.tgz", + "integrity": "sha512-GYqKi1aH7PJXxdhTeZBFrg8vUBeKXi+cNprXsC1kpJcbcVnV9wBsrOu1cQEdG0WeQwlfHiy3XvnKfIrJ2R0NzQ==", + "license": "MIT", + "bin": { + "direction": "cli.js" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", @@ -1088,9 +2783,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.278", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.278.tgz", - "integrity": "sha512-dQ0tM1svDRQOwxnXxm+twlGTjr9Upvt8UFWAgmLsxEzFQxhbti4VwxmMjsDxVC51Zo84swW7FVCXEV+VAkhuPw==", + "version": "1.5.307", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.307.tgz", + "integrity": "sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==", "dev": true, "license": "ISC" }, @@ -1177,6 +2872,19 @@ "url": "https://github.com/sponsors/rawify" } }, + "node_modules/frimousse": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/frimousse/-/frimousse-0.2.0.tgz", + "integrity": "sha512-viSrsVQWKR4Q7xzC0lkx3Wu9i1+IHrth0QXn0nlIIJXpltwUnjkGXSTuoW7WHI5aJ4z49WR8E/pyQizFjlNtTA==", + "license": "MIT", + "workspaces": [ + ".", + "site" + ], + "peerDependencies": { + "react": "^18 || ^19" + } + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -1202,6 +2910,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -1228,6 +2945,16 @@ "node": ">= 0.4" } }, + "node_modules/immer": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz", + "integrity": "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -1280,6 +3007,12 @@ "node": ">=0.10.0" } }, + "node_modules/is-hotkey": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-hotkey/-/is-hotkey-0.2.0.tgz", + "integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==", + "license": "MIT" + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -1290,12 +3023,22 @@ "node": ">=0.12.0" } }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/jiti": { "version": "1.21.7", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "dev": true, "license": "MIT", + "peer": true, "bin": { "jiti": "bin/jiti.js" } @@ -1326,6 +3069,12 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "license": "MIT" + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -1338,6 +3087,18 @@ "loose-envify": "cli.js" } }, + "node_modules/marked": { + "version": "15.0.12", + "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", + "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -1577,9 +3338,9 @@ } }, "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", "dev": true, "funding": [ { @@ -1596,6 +3357,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -1745,6 +3507,7 @@ "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -1856,6 +3619,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -1868,6 +3632,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -1876,6 +3641,75 @@ "react": "^18.3.1" } }, + "node_modules/react-remove-scroll": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", + "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -1964,10 +3798,19 @@ "loose-envify": "^1.1.0" } }, + "node_modules/scroll-into-view-if-needed": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", + "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==", + "license": "MIT", + "dependencies": { + "compute-scroll-into-view": "^3.0.2" + } + }, "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "license": "ISC", "optional": true, "bin": { @@ -2022,6 +3865,62 @@ "@img/sharp-win32-x64": "0.34.5" } }, + "node_modules/slate": { + "version": "0.110.2", + "resolved": "https://registry.npmjs.org/slate/-/slate-0.110.2.tgz", + "integrity": "sha512-4xGULnyMCiEQ0Ml7JAC1A6HVE6MNpPJU7Eq4cXh1LxlrR0dFXC3XC+rNfQtUJ7chHoPkws57x7DDiWiZAt+PBA==", + "license": "MIT", + "peer": true, + "dependencies": { + "immer": "^10.0.3", + "is-plain-object": "^5.0.0", + "tiny-warning": "^1.0.3" + } + }, + "node_modules/slate-history": { + "version": "0.110.3", + "resolved": "https://registry.npmjs.org/slate-history/-/slate-history-0.110.3.tgz", + "integrity": "sha512-sgdff4Usdflmw5ZUbhDkxFwCBQ2qlDKMMkF93w66KdV48vHOgN2BmLrf+2H8SdX8PYIpP/cTB0w8qWC2GwhDVA==", + "license": "MIT", + "dependencies": { + "is-plain-object": "^5.0.0" + }, + "peerDependencies": { + "slate": ">=0.65.3" + } + }, + "node_modules/slate-hyperscript": { + "version": "0.100.0", + "resolved": "https://registry.npmjs.org/slate-hyperscript/-/slate-hyperscript-0.100.0.tgz", + "integrity": "sha512-fb2KdAYg6RkrQGlqaIi4wdqz3oa0S4zKNBJlbnJbNOwa23+9FLD6oPVx9zUGqCSIpy+HIpOeqXrg0Kzwh/Ii4A==", + "license": "MIT", + "dependencies": { + "is-plain-object": "^5.0.0" + }, + "peerDependencies": { + "slate": ">=0.65.3" + } + }, + "node_modules/slate-react": { + "version": "0.110.3", + "resolved": "https://registry.npmjs.org/slate-react/-/slate-react-0.110.3.tgz", + "integrity": "sha512-AS8PPjwmsFS3Lq0MOEegLVlFoxhyos68G6zz2nW4sh3WeTXV7pX0exnwtY1a/docn+J3LGQO11aZXTenPXA/kg==", + "license": "MIT", + "dependencies": { + "@juggle/resize-observer": "^3.4.0", + "direction": "^1.0.4", + "is-hotkey": "^0.2.0", + "is-plain-object": "^5.0.0", + "lodash": "^4.17.21", + "scroll-into-view-if-needed": "^3.1.0", + "tiny-invariant": "1.3.1" + }, + "peerDependencies": { + "react": ">=18.2.0", + "react-dom": ">=18.2.0", + "slate": ">=0.99.0" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -2151,6 +4050,18 @@ "node": ">=0.8" } }, + "node_modules/tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==", + "license": "MIT" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", + "license": "MIT" + }, "node_modules/tinyglobby": { "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", @@ -2192,6 +4103,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -2276,6 +4188,58 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", diff --git a/examples/nextjs-live-avatars/package.json b/examples/nextjs-live-avatars/package.json index 05f2e5f2c5..42dbed496b 100644 --- a/examples/nextjs-live-avatars/package.json +++ b/examples/nextjs-live-avatars/package.json @@ -9,9 +9,10 @@ "start": "next start" }, "dependencies": { - "@liveblocks/client": "^3.14.0", - "@liveblocks/node": "^3.14.0", - "@liveblocks/react": "^3.14.0", + "@liveblocks/client": "^3.15.0-rc1", + "@liveblocks/node": "^3.15.0-rc1", + "@liveblocks/react": "^3.15.0-rc1", + "@liveblocks/react-ui": "^3.15.0-rc1", "next": "^16.1.6", "react": "^18.3.1", "react-dom": "^18.3.1" diff --git a/examples/nextjs-live-avatars/pages/api/liveblocks-auth.ts b/examples/nextjs-live-avatars/pages/api/liveblocks-auth.ts deleted file mode 100644 index 081c55eba8..0000000000 --- a/examples/nextjs-live-avatars/pages/api/liveblocks-auth.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { Liveblocks } from "@liveblocks/node"; -import { NextApiRequest, NextApiResponse } from "next"; - -/** - * Authenticating your Liveblocks application - * https://liveblocks.io/docs/authentication - */ - -const liveblocks = new Liveblocks({ - secret: process.env.LIVEBLOCKS_SECRET_KEY!, -}); - -export default async function auth(req: NextApiRequest, res: NextApiResponse) { - // We're generating random users and avatars here. - // In a real-world scenario, this is where you'd assign the - // user based on their real identity from your auth provider. - const userIndex = Math.floor(Math.random() * NAMES.length); - - // Create a session for the current user (access token auth) - const session = liveblocks.prepareSession(`user-${userIndex}`, { - userInfo: { - name: NAMES[userIndex], - avatar: `https://liveblocks.io/avatars/avatar-${Math.floor( - Math.random() * 30 - )}.png`, - }, - }); - - // Use a naming pattern to allow access to rooms with a wildcard - session.allow(`liveblocks:examples:*`, session.FULL_ACCESS); - - const { status, body } = await session.authorize(); - res.status(status).end(body); -} - -const NAMES = [ - "Charlie Layne", - "Mislav Abha", - "Tatum Paolo", - "Anjali Wanda", - "Jody Hekla", - "Emil Joyce", - "Jory Quispe", - "Quinn Elton", -]; diff --git a/examples/nextjs-live-avatars/pages/index.module.css b/examples/nextjs-live-avatars/pages/index.module.css deleted file mode 100644 index 9add289f93..0000000000 --- a/examples/nextjs-live-avatars/pages/index.module.css +++ /dev/null @@ -1,14 +0,0 @@ -.more { - border-width: 4px; - border-radius: 9999px; - border-color: white; - background-color: #9ca3af; - min-width: 56px; - width: 56px; - height: 56px; - margin-left: -0.75rem; - display: flex; - justify-content: center; - align-items: center; - color: white; -} diff --git a/examples/nextjs-live-avatars/pages/index.tsx b/examples/nextjs-live-avatars/pages/index.tsx deleted file mode 100644 index c201679aa7..0000000000 --- a/examples/nextjs-live-avatars/pages/index.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import React, { useMemo } from "react"; -import { Avatar } from "../components/Avatar"; -import { RoomProvider, useOthers, useSelf } from "@liveblocks/react"; -import { useRouter } from "next/router"; -import styles from "./index.module.css"; - -function Example() { - const users = useOthers(); - const currentUser = useSelf(); - const hasMoreUsers = users.length > 3; - - return ( -
-
- {users.slice(0, 3).map(({ connectionId, info }) => { - return ( - - ); - })} - - {hasMoreUsers &&
+{users.length - 3}
} - - {currentUser && ( -
- -
- )} -
-
- ); -} - -export default function Page() { - const roomId = useExampleRoomId("liveblocks:examples:nextjs-live-avatars"); - - return ( - - - - ); -} - -export async function getStaticProps() { - const API_KEY = process.env.LIVEBLOCKS_SECRET_KEY; - const API_KEY_WARNING = process.env.CODESANDBOX_SSE - ? `Add your secret key from https://liveblocks.io/dashboard/apikeys as the \`LIVEBLOCKS_SECRET_KEY\` secret in CodeSandbox.\n` + - `Learn more: https://github.com/liveblocks/liveblocks/tree/main/examples/nextjs-live-avatars#codesandbox.` - : `Create an \`.env.local\` file and add your secret key from https://liveblocks.io/dashboard/apikeys as the \`LIVEBLOCKS_SECRET_KEY\` environment variable.\n` + - `Learn more: https://github.com/liveblocks/liveblocks/tree/main/examples/nextjs-live-avatars#getting-started.`; - - if (!API_KEY) { - console.warn(API_KEY_WARNING); - } - - return { props: {} }; -} - -/** - * This function is used when deploying an example on liveblocks.io. - * You can ignore it completely if you run the example locally. - */ -function useExampleRoomId(roomId: string) { - const { query } = useRouter(); - const exampleRoomId = useMemo(() => { - return query?.exampleId ? `${roomId}-${query.exampleId}` : roomId; - }, [query, roomId]); - - return exampleRoomId; -} diff --git a/examples/nextjs-live-avatars/tsconfig.json b/examples/nextjs-live-avatars/tsconfig.json index 9adb694dc6..5327e1ee98 100644 --- a/examples/nextjs-live-avatars/tsconfig.json +++ b/examples/nextjs-live-avatars/tsconfig.json @@ -28,7 +28,8 @@ "next-env.d.ts", ".next/types/**/*.ts", "**/*.ts", - "**/*.tsx" + "**/*.tsx", + ".next/dev/types/**/*.ts" ], "exclude": [ "node_modules" diff --git a/examples/nextjs-live-cursors/app/Providers.tsx b/examples/nextjs-live-cursors/app/Providers.tsx new file mode 100644 index 0000000000..7476ab86c3 --- /dev/null +++ b/examples/nextjs-live-cursors/app/Providers.tsx @@ -0,0 +1,27 @@ +"use client"; + +import { LiveblocksProvider } from "@liveblocks/react"; +import { PropsWithChildren } from "react"; + +export function Providers({ children }: PropsWithChildren) { + return ( + { + const searchParams = new URLSearchParams( + userIds.map((userId) => ["userIds", userId]) + ); + const response = await fetch(`/api/users?${searchParams}`); + + if (!response.ok) { + throw new Error("Problem resolving users"); + } + + const users = await response.json(); + return users; + }} + > + {children} + + ); +} diff --git a/examples/nextjs-live-cursors/app/api/liveblocks-auth/route.ts b/examples/nextjs-live-cursors/app/api/liveblocks-auth/route.ts new file mode 100644 index 0000000000..068e5a19c9 --- /dev/null +++ b/examples/nextjs-live-cursors/app/api/liveblocks-auth/route.ts @@ -0,0 +1,32 @@ +import { Liveblocks } from "@liveblocks/node"; +import { NextRequest } from "next/server"; + +import { getRandomUser, getUser } from "../../../database"; + +/** + * Authenticating your Liveblocks application + * https://liveblocks.io/docs/authentication + */ + +const liveblocks = new Liveblocks({ + secret: process.env.LIVEBLOCKS_SECRET_KEY!, +}); + +export async function POST(request: NextRequest) { + const body = await request.json().catch(() => ({})); + const userId = body.userId as string | undefined; + const user = userId ? getUser(userId) : getRandomUser(); + + if (!user) { + return new Response(null, { status: 401 }); + } + + const session = liveblocks.prepareSession(user.id, { + userInfo: user.info, + }); + + session.allow(`liveblocks:examples:*`, session.FULL_ACCESS); + + const { status, body: responseBody } = await session.authorize(); + return new Response(responseBody, { status }); +} diff --git a/examples/nextjs-live-cursors/app/api/users/route.ts b/examples/nextjs-live-cursors/app/api/users/route.ts new file mode 100644 index 0000000000..7663c3a4d3 --- /dev/null +++ b/examples/nextjs-live-cursors/app/api/users/route.ts @@ -0,0 +1,19 @@ +import { NextRequest, NextResponse } from "next/server"; + +import { getUser } from "../../../database"; + +export async function GET(request: NextRequest) { + const { searchParams } = new URL(request.url); + const userIds = searchParams.getAll("userIds"); + + if (!userIds.length) { + return NextResponse.json( + { error: "Missing or invalid userIds" }, + { status: 400 } + ); + } + + return NextResponse.json( + userIds.map((userId) => getUser(userId)?.info ?? null) + ); +} diff --git a/examples/nextjs-live-avatars/pages/_app.tsx b/examples/nextjs-live-cursors/app/layout.tsx similarity index 60% rename from examples/nextjs-live-avatars/pages/_app.tsx rename to examples/nextjs-live-cursors/app/layout.tsx index cf1ff739db..8deb699469 100644 --- a/examples/nextjs-live-avatars/pages/_app.tsx +++ b/examples/nextjs-live-cursors/app/layout.tsx @@ -1,12 +1,15 @@ -import { AppProps } from "next/app"; -import Head from "next/head"; import "../styles/globals.css"; -import { LiveblocksProvider } from "@liveblocks/react"; +import { Providers } from "./Providers"; +import { Suspense } from "react"; -function App({ Component, pageProps }: AppProps) { +export default function RootLayout({ + children, +}: { + children: React.ReactNode; +}) { return ( - - + + Liveblocks @@ -22,9 +25,12 @@ function App({ Component, pageProps }: AppProps) { sizes="16x16" type="image/png" /> - - - + + + + {children} + + + ); } -export default App; diff --git a/examples/nextjs-live-cursors/pages/index.module.css b/examples/nextjs-live-cursors/app/page.module.css similarity index 77% rename from examples/nextjs-live-cursors/pages/index.module.css rename to examples/nextjs-live-cursors/app/page.module.css index 57b1140bec..5d76d826b0 100644 --- a/examples/nextjs-live-cursors/pages/index.module.css +++ b/examples/nextjs-live-cursors/app/page.module.css @@ -1,9 +1,9 @@ .container { - position: absolute; + position: fixed; top: 0; left: 0; - width: 100vw; - height: 100vh; + right: 0; + bottom: 0; display: flex; place-content: center; place-items: center; diff --git a/examples/nextjs-live-cursors/app/page.tsx b/examples/nextjs-live-cursors/app/page.tsx new file mode 100644 index 0000000000..0f2f7764b4 --- /dev/null +++ b/examples/nextjs-live-cursors/app/page.tsx @@ -0,0 +1,58 @@ +"use client"; + +import { useMemo } from "react"; +import { useSearchParams } from "next/navigation"; +import { RoomProvider, useMyPresence } from "@liveblocks/react"; +import { Cursors } from "@liveblocks/react-ui"; +import styles from "./page.module.css"; + +/** + * This file shows how to add basic live cursors using the component from @liveblocks/react-ui. + */ + +function Example() { + const [{ cursor }] = useMyPresence(); + + return ( + +
+ {cursor + ? `${cursor.x} × ${cursor.y}` + : "Move your cursor to broadcast its position to other people in the room."} +
+
+ ); +} + +export default function Page() { + const roomId = useExampleRoomId("liveblocks:examples:nextjs-live-cursors"); + + return ( + + + + ); +} + +/** + * This function is used when deploying an example on liveblocks.io. + * You can ignore it completely if you run the example locally. + */ +function useExampleRoomId(roomId: string) { + const searchParams = useSearchParams(); + const exampleId = searchParams?.get("exampleId"); + + const exampleRoomId = useMemo(() => { + return exampleId ? `${roomId}-${exampleId}` : roomId; + }, [roomId, exampleId]); + + return exampleRoomId; +} diff --git a/examples/nextjs-live-cursors/components/Cursor.tsx b/examples/nextjs-live-cursors/components/Cursor.tsx deleted file mode 100644 index 0a34c37b5d..0000000000 --- a/examples/nextjs-live-cursors/components/Cursor.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import React from "react"; - -type Props = { - color: string; - x: number; - y: number; -}; - -export default function Cursor({ color, x, y }: Props) { - return ( - - - - ); -} diff --git a/examples/nextjs-live-cursors/database.ts b/examples/nextjs-live-cursors/database.ts new file mode 100644 index 0000000000..940e1d4f19 --- /dev/null +++ b/examples/nextjs-live-cursors/database.ts @@ -0,0 +1,78 @@ +const USER_INFO: Liveblocks["UserMeta"][] = [ + { + id: "charlie.layne@example.com", + info: { + name: "Charlie Layne", + color: "#D583F0", + avatar: "https://liveblocks.io/avatars/avatar-1.png", + }, + }, + { + id: "mislav.abha@example.com", + info: { + name: "Mislav Abha", + color: "#F08385", + avatar: "https://liveblocks.io/avatars/avatar-2.png", + }, + }, + { + id: "tatum.paolo@example.com", + info: { + name: "Tatum Paolo", + color: "#F0D885", + avatar: "https://liveblocks.io/avatars/avatar-3.png", + }, + }, + { + id: "anjali.wanda@example.com", + info: { + name: "Anjali Wanda", + color: "#85EED6", + avatar: "https://liveblocks.io/avatars/avatar-4.png", + }, + }, + { + id: "jody.hekla@example.com", + info: { + name: "Jody Hekla", + color: "#85BBF0", + avatar: "https://liveblocks.io/avatars/avatar-5.png", + }, + }, + { + id: "emil.joyce@example.com", + info: { + name: "Emil Joyce", + color: "#8594F0", + avatar: "https://liveblocks.io/avatars/avatar-6.png", + }, + }, + { + id: "jory.quispe@example.com", + info: { + name: "Jory Quispe", + color: "#85DBF0", + avatar: "https://liveblocks.io/avatars/avatar-7.png", + }, + }, + { + id: "quinn.elton@example.com", + info: { + name: "Quinn Elton", + color: "#87EE85", + avatar: "https://liveblocks.io/avatars/avatar-8.png", + }, + }, +]; + +export function getRandomUser() { + return USER_INFO[Math.floor(Math.random() * 10) % USER_INFO.length]; +} + +export function getUser(id: string) { + return USER_INFO.find((u) => u.id === id) || null; +} + +export function getUsers() { + return USER_INFO; +} diff --git a/examples/nextjs-live-cursors/liveblocks.config.ts b/examples/nextjs-live-cursors/liveblocks.config.ts index 87b13006d3..02429db96a 100644 --- a/examples/nextjs-live-cursors/liveblocks.config.ts +++ b/examples/nextjs-live-cursors/liveblocks.config.ts @@ -4,6 +4,15 @@ declare global { Presence: { cursor: { x: number; y: number } | null; }; + // Custom user info set when authenticating with a secret key + UserMeta: { + id: string; + info: { + name: string; + color: string; + avatar: string; + }; + }; } } diff --git a/examples/nextjs-live-cursors/package-lock.json b/examples/nextjs-live-cursors/package-lock.json index b15732c992..5da0cc8717 100644 --- a/examples/nextjs-live-cursors/package-lock.json +++ b/examples/nextjs-live-cursors/package-lock.json @@ -7,8 +7,10 @@ "name": "@liveblocks-examples/nextjs-live-cusors", "license": "Apache-2.0", "dependencies": { - "@liveblocks/client": "^3.14.0", - "@liveblocks/react": "^3.14.0", + "@liveblocks/client": "^3.15.0-rc1", + "@liveblocks/node": "^3.15.0-rc1", + "@liveblocks/react": "^3.15.0-rc1", + "@liveblocks/react-ui": "^3.15.0-rc1", "@next/font": "^13.5.11", "@types/node": "^18.11.19", "@types/react": "^18.3.27", @@ -32,10 +34,48 @@ "tslib": "^2.4.0" } }, + "node_modules/@floating-ui/core": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", + "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", + "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.5", + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.8.tgz", + "integrity": "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.6" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", + "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", + "license": "MIT" + }, "node_modules/@img/colour": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", - "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", "license": "MIT", "optional": true, "engines": { @@ -498,32 +538,50 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@juggle/resize-observer": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", + "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==", + "license": "Apache-2.0" + }, "node_modules/@liveblocks/client": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@liveblocks/client/-/client-3.14.0.tgz", - "integrity": "sha512-+2VukE9iaVDaSTwMCQMBtIBwpn0t2PVfIVGLydT8O/nHGiA84ew2bV0pZc+Z+G4WQuFnAYcSBhddmZrdiQJyIQ==", + "version": "3.15.0-rc1", + "resolved": "https://registry.npmjs.org/@liveblocks/client/-/client-3.15.0-rc1.tgz", + "integrity": "sha512-SmMpegEmd4XWbPs9CRDniv3GNVkGjXO1FlpVhCP4xZMLCtyWLTMdAIfxgwIRzRHhWQKzSn0W4XryXWNN/Hknzg==", "license": "Apache-2.0", "dependencies": { - "@liveblocks/core": "3.14.0" + "@liveblocks/core": "3.15.0-rc1" } }, "node_modules/@liveblocks/core": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@liveblocks/core/-/core-3.14.0.tgz", - "integrity": "sha512-U57xnMLBv3O271YS/RiL9Wj/E1F28D2rmVPpWorlHyEytXeodmibWM4oLgmoRBF/GPSCpCJGMcCTSRKFOcTLPg==", + "version": "3.15.0-rc1", + "resolved": "https://registry.npmjs.org/@liveblocks/core/-/core-3.15.0-rc1.tgz", + "integrity": "sha512-B88HJ974l0V1oteSH+fePTGCx3jUHvU2CAEB+pKGQjV4SOr6XcHJkLd5kRULVGLDhl6xBveqzxHhH7UXRK+MHg==", "license": "Apache-2.0", "peerDependencies": { "@types/json-schema": "^7" } }, + "node_modules/@liveblocks/node": { + "version": "3.15.0-rc1", + "resolved": "https://registry.npmjs.org/@liveblocks/node/-/node-3.15.0-rc1.tgz", + "integrity": "sha512-hc52BJVkX9nXvtTnqYhSD0H/y4a5p5MSyC0LFpDT061SDQixxZZp5vfHbOT61knhQGE9Q3FoTVliGqUrYPczMA==", + "license": "Apache-2.0", + "dependencies": { + "@liveblocks/core": "3.15.0-rc1", + "@stablelib/base64": "^1.0.1", + "fast-sha256": "^1.3.0", + "node-fetch": "^2.6.1" + } + }, "node_modules/@liveblocks/react": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@liveblocks/react/-/react-3.14.0.tgz", - "integrity": "sha512-MFX8WotVy+NAJwj9JjbUi0jDMJxDO8n5ZfNFZ8D7cl/2klL+OIyrOkXFIkbNDMRZ9hnpvJllPyeBAhhr0ROokQ==", + "version": "3.15.0-rc1", + "resolved": "https://registry.npmjs.org/@liveblocks/react/-/react-3.15.0-rc1.tgz", + "integrity": "sha512-F3X3QTH896Kj+ohRjWjbETb82dIYDfApJEsoU5ruwF9Omx/hn9A/PYdb8PQ/vNhVt2R7FtesN/mnA3pJugyq7w==", "license": "Apache-2.0", "dependencies": { - "@liveblocks/client": "3.14.0", - "@liveblocks/core": "3.14.0" + "@liveblocks/client": "3.15.0-rc1", + "@liveblocks/core": "3.15.0-rc1" }, "peerDependencies": { "@types/react": "*", @@ -539,6 +597,39 @@ } } }, + "node_modules/@liveblocks/react-ui": { + "version": "3.15.0-rc1", + "resolved": "https://registry.npmjs.org/@liveblocks/react-ui/-/react-ui-3.15.0-rc1.tgz", + "integrity": "sha512-qX7FMROa/vMbjNriWvOFKo3uUAGfCeHssiMeCegkR7CpJNFAL0pUiAZMkrzs5Vf3/AyU9JaKkhu9FujavJlhRA==", + "license": "Apache-2.0", + "dependencies": { + "@floating-ui/react-dom": "^2.1.0", + "@liveblocks/client": "3.15.0-rc1", + "@liveblocks/core": "3.15.0-rc1", + "@liveblocks/react": "3.15.0-rc1", + "frimousse": "^0.2.0", + "marked": "^15.0.11", + "radix-ui": "^1.4.0", + "slate": "^0.110.2", + "slate-history": "^0.110.3", + "slate-hyperscript": "^0.100.0", + "slate-react": "^0.110.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^18 || ^19 || ^19.0.0-rc", + "react-dom": "^18 || ^19 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@next/env": { "version": "16.1.6", "resolved": "https://registry.npmjs.org/@next/env/-/env-16.1.6.tgz", @@ -679,198 +770,1835 @@ "node": ">= 10" } }, - "node_modules/@swc/helpers": { - "version": "0.5.15", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", - "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.8.0" - } + "node_modules/@radix-ui/number": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", + "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", + "license": "MIT" }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "license": "MIT", - "peer": true + "node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" }, - "node_modules/@types/node": { - "version": "18.19.130", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", - "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", + "node_modules/@radix-ui/react-accessible-icon": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accessible-icon/-/react-accessible-icon-1.1.7.tgz", + "integrity": "sha512-XM+E4WXl0OqUJFovy6GjmxxFyx9opfCAIUku4dlKRd5YEPqt4kALOkQOp0Of6reHuUkJuiPBEc5k0o4z4lTC8A==", "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@types/prop-types": { - "version": "15.7.15", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", - "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "18.3.27", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.27.tgz", - "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", + "node_modules/@radix-ui/react-accordion": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.12.tgz", + "integrity": "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==", "license": "MIT", "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.2.2" + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collapsible": "1.1.12", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@types/react-dom": { - "version": "18.3.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", - "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "node_modules/@radix-ui/react-alert-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.15.tgz", + "integrity": "sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw==", "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dialog": "1.1.15", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, "peerDependencies": { - "@types/react": "^18.0.0" - } - }, - "node_modules/baseline-browser-mapping": { - "version": "2.9.18", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.18.tgz", - "integrity": "sha512-e23vBV1ZLfjb9apvfPk4rHVu2ry6RIr2Wfs+O324okSidrX7pTAnEJPCh/O5BtRlr7QtZI7ktOP3vsqr7Z5XoA==", - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.js" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001766", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz", - "integrity": "sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" + "@types/react-dom": { + "optional": true } - ], - "license": "CC-BY-4.0" - }, - "node_modules/client-only": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", - "license": "MIT" - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT" - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=8" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", + "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", "license": "MIT", "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" + "@radix-ui/react-primitive": "2.1.3" }, - "bin": { - "loose-envify": "cli.js" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/@radix-ui/react-aspect-ratio": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.7.tgz", + "integrity": "sha512-Yq6lvO9HQyPwev1onK1daHCHqXVLzPhSVjmsNjCa2Zcxy2f7uJD2itDtxknv6FzAKCwD1qQkeVDmX/cev13n/g==", "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/next": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/next/-/next-16.1.6.tgz", - "integrity": "sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw==", + "node_modules/@radix-ui/react-avatar": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.10.tgz", + "integrity": "sha512-V8piFfWapM5OmNCXTzVQY+E1rDa53zY+MQ4Y7356v4fFz6vqCyUtIz2rUD44ZEdwg78/jKmMJHj07+C/Z/rcog==", "license": "MIT", "dependencies": { - "@next/env": "16.1.6", - "@swc/helpers": "0.5.15", - "baseline-browser-mapping": "^2.8.3", - "caniuse-lite": "^1.0.30001579", - "postcss": "8.4.31", - "styled-jsx": "5.1.6" - }, - "bin": { - "next": "dist/bin/next" - }, - "engines": { - "node": ">=20.9.0" - }, - "optionalDependencies": { - "@next/swc-darwin-arm64": "16.1.6", - "@next/swc-darwin-x64": "16.1.6", - "@next/swc-linux-arm64-gnu": "16.1.6", - "@next/swc-linux-arm64-musl": "16.1.6", - "@next/swc-linux-x64-gnu": "16.1.6", - "@next/swc-linux-x64-musl": "16.1.6", - "@next/swc-win32-arm64-msvc": "16.1.6", - "@next/swc-win32-x64-msvc": "16.1.6", - "sharp": "^0.34.4" + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-is-hydrated": "0.1.0", + "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { - "@opentelemetry/api": "^1.1.0", - "@playwright/test": "^1.51.1", - "babel-plugin-react-compiler": "*", - "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", - "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", - "sass": "^1.3.0" + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { - "@opentelemetry/api": { + "@types/react": { "optional": true }, - "@playwright/test": { + "@types/react-dom": { "optional": true - }, - "babel-plugin-react-compiler": { + } + } + }, + "node_modules/@radix-ui/react-checkbox": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.3.tgz", + "integrity": "sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { "optional": true }, - "sass": { + "@types/react-dom": { "optional": true } } }, - "node_modules/picocolors": { - "version": "1.1.1", + "node_modules/@radix-ui/react-collapsible": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz", + "integrity": "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", + "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context-menu": { + "version": "2.2.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.2.16.tgz", + "integrity": "sha512-O8morBEW+HsVG28gYDZPTrT9UUovQUlJue5YO836tiTJhuIWBm/zQHc7j388sHWtdH/xUZurK9olD2+pcqx5ww==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", + "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", + "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", + "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.16.tgz", + "integrity": "sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", + "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-form": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-form/-/react-form-0.1.8.tgz", + "integrity": "sha512-QM70k4Zwjttifr5a4sZFts9fn8FzHYvQ5PiB19O2HsYibaHSVt9fH9rzB0XZo/YcM+b7t/p7lYCT/F5eOeF5yQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-label": "2.1.7", + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-hover-card": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.15.tgz", + "integrity": "sha512-qgTkjNT1CfKMoP0rcasmlH2r1DAiYicWsDsufxl940sT2wHNEWWv6FMWIQXWhVdmC1d/HYfbhQx60KYyAtKxjg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-label": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.7.tgz", + "integrity": "sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.16.tgz", + "integrity": "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menubar": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.16.tgz", + "integrity": "sha512-EB1FktTz5xRRi2Er974AUQZWg2yVBb1yjip38/lgwtCVRd3a+maUoGHN/xs9Yv8SY8QwbSEb+YrxGadVWbEutA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-navigation-menu": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.14.tgz", + "integrity": "sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-one-time-password-field": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-one-time-password-field/-/react-one-time-password-field-0.1.8.tgz", + "integrity": "sha512-ycS4rbwURavDPVjCb5iS3aG4lURFDILi6sKI/WITUMZ13gMmn/xGjpLoqBAalhJaDk8I3UbCM5GzKHrnzwHbvg==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-is-hydrated": "0.1.0", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-password-toggle-field": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-password-toggle-field/-/react-password-toggle-field-0.1.3.tgz", + "integrity": "sha512-/UuCrDBWravcaMix4TdT+qlNdVwOM1Nck9kWx/vafXsdfj1ChfhOdfi3cy9SGBpWgTXwYCuboT/oYpJy3clqfw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-is-hydrated": "0.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.15.tgz", + "integrity": "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", + "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-rect": "1.1.1", + "@radix-ui/react-use-size": "1.1.1", + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", + "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-progress": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.7.tgz", + "integrity": "sha512-vPdg/tF6YC/ynuBIJlk1mm7Le0VgW6ub6J2UWnTQ7/D23KXcPI1qy+0vBkgKgd38RCMJavBXpB83HPNFMTb0Fg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-radio-group": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.3.8.tgz", + "integrity": "sha512-VBKYIYImA5zsxACdisNQ3BjCBfmbGH3kQlnFVqlWU4tXwjy7cGX8ta80BcrO+WJXIn5iBylEH3K6ZTlee//lgQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", + "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-scroll-area": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.10.tgz", + "integrity": "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.6.tgz", + "integrity": "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-separator": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.7.tgz", + "integrity": "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slider": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.3.6.tgz", + "integrity": "sha512-JPYb1GuM1bxfjMRlNLE+BcmBC8onfCi60Blk7OBqi2MLTFdS+8401U4uFjnwkOr49BLmXxLC6JHkvAsx5OJvHw==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.2.6.tgz", + "integrity": "sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz", + "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toast": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.15.tgz", + "integrity": "sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.10.tgz", + "integrity": "sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle-group": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.11.tgz", + "integrity": "sha512-5umnS0T8JQzQT6HbPyO7Hh9dgd82NmS36DQr+X/YJ9ctFNCiiQd6IJAYYZ33LUwm8M+taCz5t2ui29fHZc4Y6Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-toggle": "1.1.10", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toolbar": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.1.11.tgz", + "integrity": "sha512-4ol06/1bLoFu1nwUqzdD4Y5RZ9oDdKeiHIsntug54Hcr1pgaHiPqHFEaXI1IFP/EsOfROQZ8Mig9VTIRza6Tjg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-separator": "1.1.7", + "@radix-ui/react-toggle-group": "1.1.11" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.8.tgz", + "integrity": "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-is-hydrated": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.0.tgz", + "integrity": "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==", + "license": "MIT", + "dependencies": { + "use-sync-external-store": "^1.5.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", + "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", + "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", + "license": "MIT", + "dependencies": { + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", + "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", + "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", + "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", + "license": "MIT" + }, + "node_modules/@stablelib/base64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/base64/-/base64-1.0.1.tgz", + "integrity": "sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==", + "license": "MIT" + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/node": { + "version": "18.19.130", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", + "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.28", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", + "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", + "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001776", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001776.tgz", + "integrity": "sha512-sg01JDPzZ9jGshqKSckOQthXnYwOEP50jeVFhaSFbZcOy05TiuuaffDOfcwtCisJ9kNQuLBFibYywv2Bgm9osw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/compute-scroll-into-view": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz", + "integrity": "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==", + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/direction": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/direction/-/direction-1.0.4.tgz", + "integrity": "sha512-GYqKi1aH7PJXxdhTeZBFrg8vUBeKXi+cNprXsC1kpJcbcVnV9wBsrOu1cQEdG0WeQwlfHiy3XvnKfIrJ2R0NzQ==", + "license": "MIT", + "bin": { + "direction": "cli.js" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/fast-sha256": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-sha256/-/fast-sha256-1.3.0.tgz", + "integrity": "sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==", + "license": "Unlicense" + }, + "node_modules/frimousse": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/frimousse/-/frimousse-0.2.0.tgz", + "integrity": "sha512-viSrsVQWKR4Q7xzC0lkx3Wu9i1+IHrth0QXn0nlIIJXpltwUnjkGXSTuoW7WHI5aJ4z49WR8E/pyQizFjlNtTA==", + "license": "MIT", + "workspaces": [ + ".", + "site" + ], + "peerDependencies": { + "react": "^18 || ^19" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/immer": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz", + "integrity": "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/is-hotkey": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-hotkey/-/is-hotkey-0.2.0.tgz", + "integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==", + "license": "MIT" + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/marked": { + "version": "15.0.12", + "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", + "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/next": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/next/-/next-16.1.6.tgz", + "integrity": "sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw==", + "license": "MIT", + "dependencies": { + "@next/env": "16.1.6", + "@swc/helpers": "0.5.15", + "baseline-browser-mapping": "^2.8.3", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=20.9.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "16.1.6", + "@next/swc-darwin-x64": "16.1.6", + "@next/swc-linux-arm64-gnu": "16.1.6", + "@next/swc-linux-arm64-musl": "16.1.6", + "@next/swc-linux-x64-gnu": "16.1.6", + "@next/swc-linux-x64-musl": "16.1.6", + "@next/swc-win32-arm64-msvc": "16.1.6", + "@next/swc-win32-x64-msvc": "16.1.6", + "sharp": "^0.34.4" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.51.1", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/picocolors": { + "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "license": "ISC" @@ -919,11 +2647,89 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/radix-ui": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/radix-ui/-/radix-ui-1.4.3.tgz", + "integrity": "sha512-aWizCQiyeAenIdUbqEpXgRA1ya65P13NKn/W8rWkcN0OPkRDxdBVLWnIEDsS2RpwCK2nobI7oMUSmexzTDyAmA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-accessible-icon": "1.1.7", + "@radix-ui/react-accordion": "1.2.12", + "@radix-ui/react-alert-dialog": "1.1.15", + "@radix-ui/react-arrow": "1.1.7", + "@radix-ui/react-aspect-ratio": "1.1.7", + "@radix-ui/react-avatar": "1.1.10", + "@radix-ui/react-checkbox": "1.3.3", + "@radix-ui/react-collapsible": "1.1.12", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-context-menu": "2.2.16", + "@radix-ui/react-dialog": "1.1.15", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-dropdown-menu": "2.1.16", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-form": "0.1.8", + "@radix-ui/react-hover-card": "1.1.15", + "@radix-ui/react-label": "2.1.7", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-menubar": "1.1.16", + "@radix-ui/react-navigation-menu": "1.2.14", + "@radix-ui/react-one-time-password-field": "0.1.8", + "@radix-ui/react-password-toggle-field": "0.1.3", + "@radix-ui/react-popover": "1.1.15", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-progress": "1.1.7", + "@radix-ui/react-radio-group": "1.3.8", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-scroll-area": "1.2.10", + "@radix-ui/react-select": "2.2.6", + "@radix-ui/react-separator": "1.1.7", + "@radix-ui/react-slider": "1.3.6", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-switch": "1.2.6", + "@radix-ui/react-tabs": "1.1.13", + "@radix-ui/react-toast": "1.2.15", + "@radix-ui/react-toggle": "1.1.10", + "@radix-ui/react-toggle-group": "1.1.11", + "@radix-ui/react-toolbar": "1.1.11", + "@radix-ui/react-tooltip": "1.2.8", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-escape-keydown": "1.1.1", + "@radix-ui/react-use-is-hydrated": "0.1.0", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-size": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -936,6 +2742,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -944,6 +2751,75 @@ "react": "^18.3.1" } }, + "node_modules/react-remove-scroll": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", + "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/scheduler": { "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", @@ -953,10 +2829,19 @@ "loose-envify": "^1.1.0" } }, + "node_modules/scroll-into-view-if-needed": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", + "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==", + "license": "MIT", + "dependencies": { + "compute-scroll-into-view": "^3.0.2" + } + }, "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "license": "ISC", "optional": true, "bin": { @@ -1011,6 +2896,62 @@ "@img/sharp-win32-x64": "0.34.5" } }, + "node_modules/slate": { + "version": "0.110.2", + "resolved": "https://registry.npmjs.org/slate/-/slate-0.110.2.tgz", + "integrity": "sha512-4xGULnyMCiEQ0Ml7JAC1A6HVE6MNpPJU7Eq4cXh1LxlrR0dFXC3XC+rNfQtUJ7chHoPkws57x7DDiWiZAt+PBA==", + "license": "MIT", + "peer": true, + "dependencies": { + "immer": "^10.0.3", + "is-plain-object": "^5.0.0", + "tiny-warning": "^1.0.3" + } + }, + "node_modules/slate-history": { + "version": "0.110.3", + "resolved": "https://registry.npmjs.org/slate-history/-/slate-history-0.110.3.tgz", + "integrity": "sha512-sgdff4Usdflmw5ZUbhDkxFwCBQ2qlDKMMkF93w66KdV48vHOgN2BmLrf+2H8SdX8PYIpP/cTB0w8qWC2GwhDVA==", + "license": "MIT", + "dependencies": { + "is-plain-object": "^5.0.0" + }, + "peerDependencies": { + "slate": ">=0.65.3" + } + }, + "node_modules/slate-hyperscript": { + "version": "0.100.0", + "resolved": "https://registry.npmjs.org/slate-hyperscript/-/slate-hyperscript-0.100.0.tgz", + "integrity": "sha512-fb2KdAYg6RkrQGlqaIi4wdqz3oa0S4zKNBJlbnJbNOwa23+9FLD6oPVx9zUGqCSIpy+HIpOeqXrg0Kzwh/Ii4A==", + "license": "MIT", + "dependencies": { + "is-plain-object": "^5.0.0" + }, + "peerDependencies": { + "slate": ">=0.65.3" + } + }, + "node_modules/slate-react": { + "version": "0.110.3", + "resolved": "https://registry.npmjs.org/slate-react/-/slate-react-0.110.3.tgz", + "integrity": "sha512-AS8PPjwmsFS3Lq0MOEegLVlFoxhyos68G6zz2nW4sh3WeTXV7pX0exnwtY1a/docn+J3LGQO11aZXTenPXA/kg==", + "license": "MIT", + "dependencies": { + "@juggle/resize-observer": "^3.4.0", + "direction": "^1.0.4", + "is-hotkey": "^0.2.0", + "is-plain-object": "^5.0.0", + "lodash": "^4.17.21", + "scroll-into-view-if-needed": "^3.1.0", + "tiny-invariant": "1.3.1" + }, + "peerDependencies": { + "react": ">=18.2.0", + "react-dom": ">=18.2.0", + "slate": ">=0.99.0" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -1043,6 +2984,24 @@ } } }, + "node_modules/tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==", + "license": "MIT" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", + "license": "MIT" + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -1068,6 +3027,74 @@ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "license": "MIT" + }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } } } } diff --git a/examples/nextjs-live-cursors/package.json b/examples/nextjs-live-cursors/package.json index 8791994edf..77bb16796e 100644 --- a/examples/nextjs-live-cursors/package.json +++ b/examples/nextjs-live-cursors/package.json @@ -9,8 +9,10 @@ "lint": "next lint" }, "dependencies": { - "@liveblocks/client": "^3.14.0", - "@liveblocks/react": "^3.14.0", + "@liveblocks/client": "^3.15.0-rc1", + "@liveblocks/node": "^3.15.0-rc1", + "@liveblocks/react": "^3.15.0-rc1", + "@liveblocks/react-ui": "^3.15.0-rc1", "@next/font": "^13.5.11", "@types/node": "^18.11.19", "@types/react": "^18.3.27", diff --git a/examples/nextjs-live-cursors/pages/_app.tsx b/examples/nextjs-live-cursors/pages/_app.tsx deleted file mode 100644 index c707142ebd..0000000000 --- a/examples/nextjs-live-cursors/pages/_app.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import "@/styles/globals.css"; -import { LiveblocksProvider } from "@liveblocks/react"; -import type { AppProps } from "next/app"; - -export default function App({ Component, pageProps }: AppProps) { - return ( - - - - ); -} diff --git a/examples/nextjs-live-cursors/pages/_document.tsx b/examples/nextjs-live-cursors/pages/_document.tsx deleted file mode 100644 index 05b1a41732..0000000000 --- a/examples/nextjs-live-cursors/pages/_document.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { Html, Head, Main, NextScript } from "next/document"; - -export default function Document() { - return ( - - - - - -
- - - - ); -} diff --git a/examples/nextjs-live-cursors/pages/index.tsx b/examples/nextjs-live-cursors/pages/index.tsx deleted file mode 100644 index ca08df7c0a..0000000000 --- a/examples/nextjs-live-cursors/pages/index.tsx +++ /dev/null @@ -1,130 +0,0 @@ -import React, { useMemo } from "react"; -import { useRouter } from "next/router"; -import { RoomProvider, useOthers, useMyPresence } from "@liveblocks/react"; -import Cursor from "../components/Cursor"; -import styles from "./index.module.css"; - -/** - * This file shows how to add basic live cursors on your product. - */ - -const COLORS = [ - "#E57373", - "#9575CD", - "#4FC3F7", - "#81C784", - "#FFF176", - "#FF8A65", - "#F06292", - "#7986CB", -]; - -function Example() { - /** - * useMyPresence returns the presence of the current user and a function to update it. - * updateMyPresence is different than the setState function returned by the useState hook from React. - * You don't need to pass the full presence object to update it. - * See https://liveblocks.io/docs/api-reference/liveblocks-react#useMyPresence for more information - */ - const [{ cursor }, updateMyPresence] = useMyPresence(); - - /** - * Return all the other users in the room and their presence (a cursor position in this case) - */ - const others = useOthers(); - - return ( -
{ - // Update the user cursor position on every pointer move - updateMyPresence({ - cursor: { - x: Math.round(event.clientX), - y: Math.round(event.clientY), - }, - }); - }} - onPointerLeave={() => - // When the pointer goes out, set cursor to null - updateMyPresence({ - cursor: null, - }) - } - > -
- {cursor - ? `${cursor.x} × ${cursor.y}` - : "Move your cursor to broadcast its position to other people in the room."} -
- - { - /** - * Iterate over other users and display a cursor based on their presence - */ - others.map(({ connectionId, presence }) => { - if (presence.cursor === null) { - return null; - } - - return ( - - ); - }) - } -
- ); -} - -export default function Page() { - const roomId = useExampleRoomId("nextjs-live-cursors"); - - return ( - - - - ); -} - -export async function getStaticProps() { - const API_KEY = process.env.NEXT_PUBLIC_LIVEBLOCKS_PUBLIC_KEY; - const API_KEY_WARNING = process.env.CODESANDBOX_SSE - ? `Add your public key from https://liveblocks.io/dashboard/apikeys as the \`NEXT_PUBLIC_LIVEBLOCKS_PUBLIC_KEY\` secret in CodeSandbox.\n` + - `Learn more: https://github.com/liveblocks/liveblocks/tree/main/examples/nextjs-live-cursors#codesandbox.` - : `Create an \`.env.local\` file and add your public key from https://liveblocks.io/dashboard/apikeys as the \`NEXT_PUBLIC_LIVEBLOCKS_PUBLIC_KEY\` environment variable.\n` + - `Learn more: https://github.com/liveblocks/liveblocks/tree/main/examples/nextjs-live-cursors#getting-started.`; - - if (!API_KEY) { - console.warn(API_KEY_WARNING); - } - - return { props: {} }; -} - -/** - * This function is used when deploying an example on liveblocks.io. - * You can ignore it completely if you run the example locally. - */ -function useExampleRoomId(roomId: string) { - const { query } = useRouter(); - const exampleRoomId = useMemo(() => { - return query?.exampleId ? `${roomId}-${query.exampleId}` : roomId; - }, [query, roomId]); - - return exampleRoomId; -} diff --git a/examples/nextjs-live-cursors/styles/globals.css b/examples/nextjs-live-cursors/styles/globals.css index c595d0ffa1..15ac41e6bb 100644 --- a/examples/nextjs-live-cursors/styles/globals.css +++ b/examples/nextjs-live-cursors/styles/globals.css @@ -1,3 +1,5 @@ +@import "@liveblocks/react-ui/styles.css"; + html { font-family: -apple-system, diff --git a/examples/nextjs-live-cursors/tsconfig.json b/examples/nextjs-live-cursors/tsconfig.json index 07d2f3eb62..9e0311a8de 100644 --- a/examples/nextjs-live-cursors/tsconfig.json +++ b/examples/nextjs-live-cursors/tsconfig.json @@ -33,7 +33,8 @@ "next-env.d.ts", ".next/types/**/*.ts", "**/*.ts", - "**/*.tsx" + "**/*.tsx", + ".next/dev/types/**/*.ts" ], "exclude": [ "node_modules"

+ + Live Preview + + + Open in CodeSandbox + + React + Next.js +