diff --git a/.github/assets/examples/comments-table.png b/.github/assets/examples/comments-table.png new file mode 100644 index 0000000000..94e4344058 Binary files /dev/null and b/.github/assets/examples/comments-table.png differ 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 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 0000000000..c2d3b6857c Binary files /dev/null and b/assets/comments/comment-pin.png differ diff --git a/assets/comments/floating-composer-comment-pin.png b/assets/comments/floating-composer-comment-pin.png new file mode 100644 index 0000000000..b709b4a82f Binary files /dev/null and b/assets/comments/floating-composer-comment-pin.png differ diff --git a/assets/comments/floating-composer.png b/assets/comments/floating-composer.png new file mode 100644 index 0000000000..646ed9b404 Binary files /dev/null and b/assets/comments/floating-composer.png differ diff --git a/assets/comments/floating-thread-comment-pin.png b/assets/comments/floating-thread-comment-pin.png new file mode 100644 index 0000000000..f30cd5a9f9 Binary files /dev/null and b/assets/comments/floating-thread-comment-pin.png differ diff --git a/assets/comments/floating-thread.png b/assets/comments/floating-thread.png new file mode 100644 index 0000000000..91bfd04935 Binary files /dev/null and b/assets/comments/floating-thread.png differ diff --git a/assets/presence/avatar-stack.png b/assets/presence/avatar-stack.png new file mode 100644 index 0000000000..1e7fdb7d36 Binary files /dev/null and b/assets/presence/avatar-stack.png differ diff --git a/assets/presence/cursor.png b/assets/presence/cursor.png new file mode 100644 index 0000000000..4e865e641d Binary files /dev/null and b/assets/presence/cursor.png differ diff --git a/assets/presence/cursors.png b/assets/presence/cursors.png new file mode 100644 index 0000000000..d3fb0a032d Binary files /dev/null and b/assets/presence/cursors.png differ diff --git a/docs/pages/api-reference/liveblocks-react-blocknote.mdx b/docs/pages/api-reference/liveblocks-react-blocknote.mdx index fd9b04cdda..16117d1bff 100644 --- a/docs/pages/api-reference/liveblocks-react-blocknote.mdx +++ b/docs/pages/api-reference/liveblocks-react-blocknote.mdx @@ -400,11 +400,14 @@ import { Thread } from "@liveblocks/react-ui"; ``` You can return any custom `ReactNode` here, including anything from a simple -wrapper around `Thread`, up to a full custom `Thread` component built using our +wrapper around [`Thread`][]. You can also use [`Thread`][]'s +[`components`](/docs/api-reference/liveblocks-react-ui#Thread-components) prop +to customize individual comments, or build a fully custom `Thread` component +using our [Comment primitives](/docs/api-reference/liveblocks-react-ui#primitives-Comment). ```tsx -import { Comment } from "@liveblocks/react-ui/primitives"; +import { Comment, Thread } from "@liveblocks/react-ui"; ( // +++ -
- {props.thread.comments.map((comment) => ( - - ))} -
+ ( + + ), + }} + /> // +++ ), }} @@ -656,11 +662,14 @@ import { Thread } from "@liveblocks/react-ui"; ``` You can return any custom `ReactNode` here, including anything from a simple -wrapper around `Thread`, up to a full custom `Thread` component built using our +wrapper around [`Thread`][]. You can also use [`Thread`][]'s +[`components`](/docs/api-reference/liveblocks-react-ui#Thread-components) prop +to customize individual comments, or build a fully custom `Thread` component +using our [Comment primitives](/docs/api-reference/liveblocks-react-ui#primitives-Comment). ```tsx -import { Comment } from "@liveblocks/react-ui/primitives"; +import { Comment, Thread } from "@liveblocks/react-ui"; ( // +++ -
- {props.thread.comments.map((comment) => ( - - ))} -
+ ( + + ), + }} + /> // +++ ), }} diff --git a/docs/pages/api-reference/liveblocks-react-lexical.mdx b/docs/pages/api-reference/liveblocks-react-lexical.mdx index 0868a9f025..f1ef805e18 100644 --- a/docs/pages/api-reference/liveblocks-react-lexical.mdx +++ b/docs/pages/api-reference/liveblocks-react-lexical.mdx @@ -1362,11 +1362,14 @@ import { Thread } from "@liveblocks/react-ui"; ``` You can return any custom `ReactNode` here, including anything from a simple -wrapper around `Thread`, up to a full custom `Thread` component built using our +wrapper around [`Thread`][]. You can also use [`Thread`][]'s +[`components`](/docs/api-reference/liveblocks-react-ui#Thread-components) prop +to customize individual comments, or build a fully custom `Thread` component +using our [Comment primitives](/docs/api-reference/liveblocks-react-ui#primitives-Comment). ```tsx -import { Comment } from "@liveblocks/react-ui/primitives"; +import { Comment, Thread } from "@liveblocks/react-ui"; ( // +++ -
- {props.thread.comments.map((comment) => ( - - ))} -
+ ( + + ), + }} + /> // +++ ), }} @@ -1615,11 +1621,14 @@ import { Thread } from "@liveblocks/react-ui"; ``` You can return any custom `ReactNode` here, including anything from a simple -wrapper around `Thread`, up to a full custom `Thread` component built using our +wrapper around [`Thread`][]. You can also use [`Thread`][]'s +[`components`](/docs/api-reference/liveblocks-react-ui#Thread-components) prop +to customize individual comments, or build a fully custom `Thread` component +using our [Comment primitives](/docs/api-reference/liveblocks-react-ui#primitives-Comment). ```tsx -import { Comment } from "@liveblocks/react-ui/primitives"; +import { Comment, Thread } from "@liveblocks/react-ui"; ( // +++ -
- {props.thread.comments.map((comment) => ( - - ))} -
+ ( + + ), + }} + /> // +++ ), }} diff --git a/docs/pages/api-reference/liveblocks-react-tiptap.mdx b/docs/pages/api-reference/liveblocks-react-tiptap.mdx index 2c07358b90..ce277e87a8 100644 --- a/docs/pages/api-reference/liveblocks-react-tiptap.mdx +++ b/docs/pages/api-reference/liveblocks-react-tiptap.mdx @@ -1300,11 +1300,14 @@ import { Thread } from "@liveblocks/react-ui"; ``` You can return any custom `ReactNode` here, including anything from a simple -wrapper around `Thread`, up to a full custom `Thread` component built using our +wrapper around [`Thread`][]. You can also use [`Thread`][]'s +[`components`](/docs/api-reference/liveblocks-react-ui#Thread-components) prop +to customize individual comments, or build a fully custom `Thread` component +using our [Comment primitives](/docs/api-reference/liveblocks-react-ui#primitives-Comment). ```tsx -import { Comment } from "@liveblocks/react-ui/primitives"; +import { Comment, Thread } from "@liveblocks/react-ui"; ( // +++ -
- {props.thread.comments.map((comment) => ( - - ))} -
+ ( + + ), + }} + /> // +++ ), }} @@ -1563,11 +1569,14 @@ import { Thread } from "@liveblocks/react-ui"; ``` You can return any custom `ReactNode` here, including anything from a simple -wrapper around `Thread`, up to a full custom `Thread` component built using our +wrapper around [`Thread`][]. You can also use [`Thread`][]'s +[`components`](/docs/api-reference/liveblocks-react-ui#Thread-components) prop +to customize individual comments, or build a fully custom `Thread` component +using our [Comment primitives](/docs/api-reference/liveblocks-react-ui#primitives-Comment). ```tsx -import { Comment } from "@liveblocks/react-ui/primitives"; +import { Comment, Thread } from "@liveblocks/react-ui"; ( // +++ -
- {props.thread.comments.map((comment) => ( - - ))} -
+ ( + + ), + }} + /> // +++ ), }} diff --git a/docs/pages/api-reference/liveblocks-react-ui.mdx b/docs/pages/api-reference/liveblocks-react-ui.mdx index 0e183d5a7a..49a9bfc62d 100644 --- a/docs/pages/api-reference/liveblocks-react-ui.mdx +++ b/docs/pages/api-reference/liveblocks-react-ui.mdx @@ -973,7 +973,76 @@ setting `maxVisibleComments` to an object. ``` -##### Custom dropdown items +##### Customize comments + +You can provide a custom `Comment` component via the `components` prop to fully +customize how comments are rendered within a thread. This allows you to render a +fully custom React component in the provided `Comment` slot, however it's often +preferable to insert the default +[`Comment`](/docs/api-reference/liveblocks-react-ui#Comment) component, and use +its customization options instead. + +The `children` prop on `Comment` allows overriding or wrapping the comments’ +content, while the `additionalContent` prop can be useful to render custom +content integrated into the comments’ content, just below the comment body. + +`Comment` also offers `avatar`, `author`, and `date` props to allow overriding +or customizing the comment’s displayed avatar, author, and date respectively. +`Comment.Avatar`, `Comment.Author`, and `Comment.Date` can be used to retain the +default behavior and styles but with more control over them. + +```tsx +import { Comment, Thread } from "@liveblocks/react-ui"; + + ( + + +
+
+ } + author={ + + + Custom label + + } + date={ + + + {props.comment.editedAt && ( + Edited + )} + + } + additionalContent={ +
+ Content below the comment's body (above reactions and attachments) +
+ } + {...props} + > + {({ children }) => ( +
+ {children} +
+ Content below the comment's content (including reactions and + attachments) +
+
+ )} +
+ ), + }} +/>; +``` + +##### Customize dropdown items `Thread` shows a dropdown menu for threads and comments which contains actions related to them: “Subscribe to thread”, “Edit comment”, “Delete comment”, etc. @@ -1196,10 +1265,114 @@ icon next to the item’s label. > Override the component’s strings. + + Override the component’s components. + + + +###### components [#Thread-components] + +Override the component’s components, including providing a custom `Comment` +component. + + + + The component used to display comments. + {/* TODO: Document classes and data attributes */} +#### FloatingThread + +Displays a floating thread attached to a trigger element. + +```tsx + + + +``` + +
+ FloatingThread +
+ +`FloatingThread` can be combined with [`CommentPin`](#CommentPin) in canvas-like +UIs. + +```tsx + + + +``` + +
+ FloatingThread with CommentPin +
+ +##### Props [#FloatingThread-props] + +In addition to all [`Thread`](#Thread-props) props: + + + + The element which opens the floating thread. + + + Whether the floating thread is initially open. + + + Whether the floating thread is currently open. + + + The event handler called when the open state changes. + + + The preferred side of the trigger to render the floating thread on. + + + The side offset in pixels from the trigger. + + + How the floating thread is aligned against its trigger. + + + The alignment offset in pixels. + + + #### Composer Displays a composer for creating threads or comments. @@ -1441,6 +1614,96 @@ Learn more about mutation hooks under +#### FloatingComposer + +Displays a floating composer attached to a trigger element. + +```tsx + + + +``` + +
+ FloatingComposer +
+ +Use `metadata` to attach context to the thread when submitting (for example +canvas coordinates or table cell IDs). + +`FloatingComposer` can be combined with [`CommentPin`](#CommentPin) in +canvas-like UIs. + +```tsx + + + +``` + +
+ FloatingComposer with CommentPin +
+ +##### Props [#FloatingComposer-props] + +In addition to all [`Composer`](#Composer-props) props (except `collapsed`, +`onCollapsedChange`, and `defaultCollapsed`): + + + + The element which opens the floating composer. + + + Whether the floating composer is initially open. + + + Whether the floating composer is currently open. + + + The event handler called when the open state changes. + + + The preferred side of the trigger to render the floating composer on. + + + The side offset in pixels from the trigger. + + + How the floating composer is aligned against its trigger. + + + The alignment offset in pixels. + + + #### Comment Displays a single comment. @@ -1520,6 +1783,18 @@ function Component() { The comment to display. + + The comment’s avatar. Can be combined with `Comment.Avatar` to easily follow + default styles. + + + The comment’s author. Can be combined with `Comment.Author` to easily follow + default styles. + + + The comment’s date. Can be combined with `Comment.Date` to easily follow + default styles, or the `Timestamp` primitive for more control. + Whether to indent the comment’s content. + + Additional content to display below the comment’s body. + Whether to show the comment if it was deleted. If set to `false`, it will render deleted comments as `null`. @@ -1554,6 +1832,14 @@ function Component() { > Add (or change) items to display in the comment’s dropdown. + + Override the comment’s content. Receives the comment data and the default + content as children. + +#### CommentPin + +Displays a comment pin that can be used as a trigger for `FloatingComposer` and +`FloatingThread`, or anywhere else in your UI. + +```tsx + + + +``` + +
+ CommentPin +
+ +Set the `userId` prop to display an avatar inside the pin, for example to +represent the thread’s author. + +```tsx + +``` + +Use the `corner` prop to choose which corner the pin points to, it will move +itself to always point to wherever it is positioned. + +```tsx + +``` + +You can either use the `size` prop or override `--lb-comment-pin-size` with CSS +to change the pin’s size. + +```tsx + + + +``` + +##### Props [#CommentPin-props] + + + + The corner that points to the comment position. + + + The user ID to optionally display an avatar for. + + + The size of the pin. + + + +##### Comment.Avatar [#Comment.Avatar] + +Displays a comment’s avatar. Use this within the `avatar` prop to follow default +styles while customizing the avatar. + +```tsx + + +
+
+ } +/> +``` + +###### Props [#Comment.Avatar-props] + + + + The user ID to display the avatar for. + + + +##### Comment.Author [#Comment.Author] + +Displays a comment’s author. Use this within the `author` prop to follow default +styles while customizing the author. + +```tsx + + + Custom label + + } +/> +``` + +###### Props [#Comment.Author-props] + + + + The user ID to display the author for. + + + +##### Comment.DropdownItem [#Comment.DropdownItem] + +Displays a dropdown item in the comment’s dropdown menu. Use this within the +`dropdownItems` prop to add custom actions. + +```tsx + + console.log("Custom action")} + icon={} + > + Custom action + + + } +/> +``` + +###### Props [#Comment.DropdownItem-props] + + + + An optional icon displayed in this dropdown item. + + + The event handler called when the dropdown item is selected. + + + ### Primitives Primitives are unstyled, headless components that can be used to create fully @@ -3276,6 +3716,220 @@ element. All hooks for Notifications are in [`@liveblocks/react`](/docs/api-reference/liveblocks-react#Notifications). +## Presence + +### Default components [#Presence-Components] + +#### AvatarStack + +Displays a stack of avatars for users currently present in the room. + +```tsx + +``` + +
+ AvatarStack +
+ +You can include additional users (e.g. users who are invited to the room but not +currently present) and control how many avatars are shown before grouping the +rest as `+N`. + +```tsx + +``` + +User IDs (both from Presence and the `userIds` prop) are deduplicated so the +same user present with multiple tabs for example will only be displayed once in +the stack. + +You can either use the `size` prop or override `--lb-avatar-stack-size` with CSS +to change the avatars’ size. + +```tsx + + + +``` + +##### User information + +`AvatarStack` uses +[`resolveUsers`](/docs/api-reference/liveblocks-react#LiveblocksProviderResolveUsers) +to resolve each user’s information and then uses the `name` and `avatar` +properties. + +```tsx + { + // ["stacy@example.com", ...] + console.log(userIds); + + // Get users from your back-end + const users = await __fetchUsers__(userIds); + + // [{ name: "Stacy", avatar: "https://example.com/stacy.png" }, ...] + console.log(users); + + // Return a list of users + return users; + }} + // +++ +> + {/* ... */} + +``` + +##### Props [#AvatarStack-props] + + + + Optional additional user IDs to include in the stack. + + + The maximum number of visible avatars. + + + The size of the avatars. + + + Override the component’s strings. + + + +#### Cursors + +Displays multiplayer cursors for other users in the room while tracking your own +pointer position. + +It works out-of-the-box with best practices built-in: + +- Cursors are positioned relative to the container’s size + - Their coordinates are percentage-based instead of absolute pixels +- Cursors are interpolated with springs to smooth their movement + - Learn more about this in our article about + [animating multiplayer cursors](/blog/how-to-animate-multiplayer-cursors) +- Performance bottlenecks like re-renders or `position: absolute` layout + thrashing are avoided + +```tsx + + + +``` + +
+ Cursors +
+ +By default, cursor coordinates are stored in Presence under `"cursor"`. Use +`presenceKey` to render multiple `Cursors` areas in a single room. + +If you need more control, you can use the single [`Cursor`](#Cursor) component +and handle positioning manually with the Presence hooks in +[`@liveblocks/react`](/docs/api-reference/liveblocks-react#Presence). + +##### User information + +`Cursors` uses +[`resolveUsers`](/docs/api-reference/liveblocks-react#LiveblocksProviderResolveUsers) +to resolve each user’s information and then uses the `name` and `color` +properties. + +```tsx + { + // ["stacy@example.com", ...] + console.log(userIds); + + // Get users from your back-end + const users = await __fetchUsers__(userIds); + + // [{ name: "Stacy", color: "#22c55e", ...] + console.log(users); + + // Return a list of users + return users; + }} + // +++ +> + {/* ... */} + +``` + +##### Props [#Cursors-props] + + + + The key used to store cursor coordinates in users’ Presence. + + + +#### Cursor + +Displays a multiplayer cursor with a color and an optional label. + +```tsx + +``` + +
+ Cursor +
+ +You can either use the `color` prop or override `--lb-cursor-color` with CSS to +change the cursor’s color, by default it’s set to `--lb-accent`. The label’s +text color is dynamically set to contrast with the cursor’s color automatically. + +```tsx + + + +``` + +It’s sized as 0×0px to make it easy to position it either via `transform` or +`top`/`left`. + +##### Props [#Cursor-props] + + + + The color of the cursor. + + + A floating label to display next to the cursor. + + + +### Hooks [#Presence-hooks] + +All hooks for Presence are in +[`@liveblocks/react`](/docs/api-reference/liveblocks-react#Presence). + ## Version History Version history enables you to track and restore versions of your @@ -3286,7 +3940,7 @@ using the [REST API](/docs/api-reference/rest-api-endpoints#post-rooms-roomId-version). These components aid in displaying a list of those versions. -### Default components +### Default components [#Version-History-Components] ### HistoryVersionSummary diff --git a/docs/pages/get-started/nextjs-comments-ag-grid.mdx b/docs/pages/get-started/nextjs-comments-ag-grid.mdx new file mode 100644 index 0000000000..0e0bdea39b --- /dev/null +++ b/docs/pages/get-started/nextjs-comments-ag-grid.mdx @@ -0,0 +1,413 @@ +--- +meta: + title: "Get started with commenting in AG Grid using Liveblocks and Next.js" + parentTitle: "Quickstart" + description: + "Learn how to get started with commenting using Liveblocks and Next.js" +--- + +Liveblocks is a realtime collaboration infrastructure for building performant +collaborative experiences. Follow the following steps to start adding a +commenting experience to your Next.js `/app` directory application using the +hooks from [`@liveblocks/react`](/docs/api-reference/liveblocks-react) and the +components from +[`@liveblocks/react-ui`](/docs/api-reference/liveblocks-react-ui). + +## Quickstart + + + + Install Liveblocks + + + Every package should use the same version. + + ```bash trackEvent="install_liveblocks" + npm install @liveblocks/client @liveblocks/react @liveblocks/react-ui ag-grid-react + ``` + + + + + + Initialize the `liveblocks.config.ts` file + + + We can use this file later to [define types for our application](/docs/api-reference/liveblocks-react#Typing-your-data). + + ```bash + npx create-liveblocks-app@latest --init --framework react + ``` + + + + + + + Define thread metadata + + + Inside the new `liveblocks.config.ts` file, define the metadata shape for threads. + Metadata is used to attach comment threads to table cells. + + ```tsx file="liveblocks.config.ts" + declare global { + interface Liveblocks { + // +++ + ThreadMetadata: { + rowId: string; + columnId: string; + }; + // +++ + } + } + + export {}; + ``` + + + + + + Import default styles + + + The default components come with default styles, you can import them into the + root layout of your app or directly into a CSS file with `@import`. + + ```tsx file="app/layout.tsx" + import "@liveblocks/react-ui/styles.css"; + ``` + + + + + + Create a Liveblocks room + + + Liveblocks uses the concept of rooms, separate virtual spaces where people + collaborate, and to create a realtime experience, multiple users must + be connected to the same room. When using Next.js’ `/app` router, + we recommend creating your room in a `Room.tsx` file in the same directory + as your current route. + + Set up a Liveblocks client with + [`LiveblocksProvider`](/docs/api-reference/liveblocks-react#LiveblocksProvider), + join a room with [`RoomProvider`](/docs/api-reference/liveblocks-react#RoomProvider), + and use [`ClientSideSuspense`](/docs/api-reference/liveblocks-react#ClientSideSuspense) + to add a loading spinner to your app. + + ```tsx file="app/Room.tsx" highlight="12-18" + "use client"; + + import { ReactNode } from "react"; + import { + LiveblocksProvider, + RoomProvider, + ClientSideSuspense, + } from "@liveblocks/react/suspense"; + + export function Room({ children }: { children: ReactNode }) { + return ( + + + Loading…}> + {children} + + + + ); + } + ``` + + + + + + Create thread context for your table + + + Use React context to set up cells and thread state for your table with + [`useThreads`](/docs/api-reference/liveblocks-react#useThreads), + allowing cells to retrieve their comments. + + ```tsx file="app/CellThreadContext.tsx" + "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; + } + ``` + + + + + Create a custom comment cell + + + Create a custom cell renderer for your table that displays comment buttons alongside cell values using + [`FloatingComposer`](/docs/api-reference/liveblocks-react-ui#FloatingComposer), + [`FloatingThread`](/docs/api-reference/liveblocks-react-ui#FloatingThread), and the context we created. + Clicking the buttons opens popovers for creating or viewing comment threads. + + ```tsx file="app/CommentCell.tsx" + "use client"; + + import { 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 */} + {!thread ? ( + setOpenCell(metadata)} + style={{ zIndex: 10 }} + > + + + ) : ( + { + if (!isOpen && defaultOpen) { + setOpenCell(null); + } + }} + onComposerSubmit={() => setOpenCell(metadata)} + style={{ zIndex: 10 }} + autoFocus + > + + + )} +
+ ); + } + ``` +
+
+ + + Use Liveblocks hooks and components with AG Grid + + + Set up AG Grid with `AgGridProvider`, and add your custom `CellThreadProvider` context. + Import your `CommentCell` component into `defaultColDef`, and replace the table data with your own. + Learn more on the [AG Grid website](https://www.ag-grid.com/react-data-grid/getting-started/). + + ```tsx file="app/CollaborativeApp.tsx" + "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; price: number }; + + export function CollaborativeApp() { + const [rowData] = useState([ + { id: "1", name: "Laptop", price: 1000 }, + { id: "2", name: "Phone", price: 500 }, + { id: "3", name: "Tablet", price: 300 }, + ]); + + const [colDefs] = useState<{ field: keyof RowData }[]>([ + { field: "name" }, + { field: "price" }, + ]); + + const defaultColDef = useMemo( + () => ({ + cellRenderer: CommentCell, + }), + [], + ); + + return ( + + +
+ params.data.id} + /> +
+
+
+ ); + } + ``` + +
+ +
+ + Add the Liveblocks room to your page + + + Import + your room into your `page.tsx` file, and place + your collaborative app components inside it. + + ```tsx file="app/page.tsx" highlight="6-8" + import { Room } from "./Room"; + import { CollaborativeApp } from "./CollaborativeApp"; + + export default function Page() { + return ( + + + + ); + } + ``` + + + + + + Next: authenticate and add your users + + + Comments is set up and working now inside AG Grid, but each user is anonymous—the next step is to + authenticate each user as they connect, and attach their name and avatar to their comments. + + + + + +
+ +## What to read next + +Congratulations! You’ve set up the foundation to start building a commenting +experience for your Next.js application. + +- [API Reference](/docs/api-reference/liveblocks-react-ui) +- [Overview](/docs/ready-made-features/comments) +- [How to send email notifications when comments are created](/docs/guides/how-to-send-email-notifications-when-comments-are-created) + +--- + +## Examples using Next.js + + + + + + + diff --git a/docs/pages/get-started/nextjs-comments-canvas.mdx b/docs/pages/get-started/nextjs-comments-canvas.mdx new file mode 100644 index 0000000000..76ab518299 --- /dev/null +++ b/docs/pages/get-started/nextjs-comments-canvas.mdx @@ -0,0 +1,580 @@ +--- +meta: + title: "Get started with draggable comment pins using Liveblocks and Next.js" + parentTitle: "Quickstart" + description: + "Learn how to get started with commenting using Liveblocks and Next.js" +--- + +Liveblocks is a realtime collaboration infrastructure for building performant +collaborative experiences. Follow the following steps to start adding a +commenting experience to your Next.js `/app` directory application using the +hooks from [`@liveblocks/react`](/docs/api-reference/liveblocks-react) and the +components from +[`@liveblocks/react-ui`](/docs/api-reference/liveblocks-react-ui). + +## Quickstart + + + + Install Liveblocks and dnd-kit + + + Every Liveblocks package should use the same version. + + ```bash trackEvent="install_liveblocks" + npm install @liveblocks/client @liveblocks/react @liveblocks/react-ui @dnd-kit/core + ``` + + + + + + Initialize the `liveblocks.config.ts` file + + + We can use this file later to [define types for our application](/docs/api-reference/liveblocks-react#Typing-your-data). + + ```bash + npx create-liveblocks-app@latest --init --framework react + ``` + + + + + + + Define thread metadata + + + Inside the new `liveblocks.config.ts` file, define the metadata shape for threads. + Metadata is used to attach comment threads to X/Y coordinates on the canvas. In this + guide, we’ll use simple X/Y pixel coordinates, measured from the top left of the page. + + ```tsx file="liveblocks.config.ts" + declare global { + interface Liveblocks { + ThreadMetadata: { + x: number; + y: number; + zIndex: number; + }; + } + } + + export {}; + ``` + + + + + + Import default styles + + + The default components come with default styles, you can import them into the + root layout of your app or directly into a CSS file with `@import`. + + ```tsx file="app/layout.tsx" + import "@liveblocks/react-ui/styles.css"; + ``` + + + + + + Create a Liveblocks room + + + Liveblocks uses the concept of rooms, separate virtual spaces where people + collaborate, and to create a realtime experience, multiple users must + be connected to the same room. When using Next.js’ `/app` router, + we recommend creating your room in a `Room.tsx` file in the same directory + as your current route. + + Set up a Liveblocks client with + [`LiveblocksProvider`](/docs/api-reference/liveblocks-react#LiveblocksProvider), + join a room with [`RoomProvider`](/docs/api-reference/liveblocks-react#RoomProvider), + and use [`ClientSideSuspense`](/docs/api-reference/liveblocks-react#ClientSideSuspense) + to add a loading spinner to your app. + + ```tsx file="app/Room.tsx" highlight="12-18" + "use client"; + + import { ReactNode } from "react"; + import { + LiveblocksProvider, + RoomProvider, + ClientSideSuspense, + } from "@liveblocks/react/suspense"; + + export function Room({ children }: { children: ReactNode }) { + return ( + + + Loading…}> + {children} + + + + ); + } + ``` + + + + + + Create a hook for the canvas + + + Create a `hooks.ts` file containing a `useMaxZIndex` hook we'll use in the canvas component, + helpful for setting the `z-index` of comment pins, and preventing overlapping threads. + + ```tsx file="app/hooks.ts" + import { useMemo } from "react"; + import { useThreads } from "@liveblocks/react/suspense"; + + // Returns the highest z-index of all threads + export function useMaxZIndex() { + const { threads } = useThreads(); + + return useMemo(() => { + let max = 0; + for (const thread of threads) { + if (thread.metadata.zIndex > max) { + max = thread.metadata.zIndex; + } + } + return max; + }, [threads]); + } + ``` + + + + + Create a draggable thread component + + + Create a `DraggableThread.tsx` file that displays a thread with draggable pin, + using [`FloatingThread`](/docs/api-reference/liveblocks-react-ui#FloatingThread) + and [`CommentPin`](/docs/api-reference/liveblocks-react-ui#CommentPin). Threads can + be toggled open by clicking on the pin. + + ```tsx file="app/DraggableThread.tsx" + import { useMemo } from "react"; + import { useEditThreadMetadata } from "@liveblocks/react/suspense"; + import { FloatingThread, CommentPin } from "@liveblocks/react-ui"; + import { ThreadData } from "@liveblocks/client"; + import { useDraggable } from "@dnd-kit/core"; + import { useMaxZIndex } from "./hooks"; + + // A draggable thread + export function DraggableThread({ thread }: { thread: ThreadData }) { + // Open threads that have just been created + const defaultOpen = useMemo(() => { + return Number(new Date()) - Number(new Date(thread.createdAt)) <= 100; + }, [thread]); + + // Enable drag + const { isDragging, attributes, listeners, setNodeRef, transform } = + useDraggable({ + id: thread.id, + data: { thread }, // Pass thread to DndContext drag end event + }); + + // If currently dragging, add drag values to current metadata + const x = transform ? transform.x + thread.metadata.x : thread.metadata.x; + const y = transform ? transform.y + thread.metadata.y : thread.metadata.y; + + // Used to set z-index higher than other threads when dragging + const editThreadMetadata = useEditThreadMetadata(); + const maxZIndex = useMaxZIndex(); + + return ( + +
+ editThreadMetadata({ + threadId: thread.id, + metadata: { zIndex: maxZIndex + 1 }, + }) + } + style={{ + position: "absolute", + top: 0, + left: 0, + transform: `translate3d(${x}px, ${y}px, 0)`, + zIndex: thread.metadata?.zIndex || 0, + }} + > + +
+
+ ); + } + ``` +
+ +
+ + Create a button for placing threads + + + Create a `PlaceThreadButton.tsx` file that allows users to place a thread on the 2D canvas. + Clicking the button changes the user’s cursor into a comment pin that can be placed down. + + ```tsx file="app/PlaceThreadButton.tsx" + import { useCallback, useEffect, useState } from "react"; + import { CommentPin, FloatingComposer } from "@liveblocks/react-ui"; + import { useSelf } from "@liveblocks/react"; + import { useMaxZIndex } from "./hooks"; + + export function PlaceThreadButton() { + const [state, setState] = useState<"initial" | "placing" | "placed">( + "initial", + ); + const [coords, setCoords] = useState({ x: 0, y: 0 }); + + const reset = useCallback(() => { + setState("initial"); + setCoords({ x: 0, y: 0 }); + }, []); + + return ( + <> + {/* Allows you to place floating composers */} +
+ +
+ + {/* Overlay that lets you click and cancel placing */} +
{ + e.preventDefault(); + reset(); + }} + /> + + {/* The visible cursor when you're placing */} + {state === "placing" ? ( +
{ + // On click, get coords and place down composer + setCoords({ x: e.clientX, y: e.clientY }); + setState("placed"); + }} + onContextMenu={(e) => { + e.preventDefault(); + reset(); + }} + > + +
+ ) : null} + + {/* When cursor placed, show a composer on the canvas */} + {state === "placed" ? ( + setState("initial")} /> + ) : null} + + ); + } + + function ThreadComposer({ + coords, + onSubmit, + }: { + coords: { x: number; y: number }; + onSubmit: () => void; + }) { + // Get create thread function and the current user + const creatorId = useSelf((me) => me.id); + + // Create thread above other threads + const maxZIndex = useMaxZIndex(); + + return ( + + + + ); + } + + // Render the new thread component over the current user's cursor + function NewThreadCursor() { + const [coords, setCoords] = useState({ + x: -10000, + y: -10000, + }); + + useEffect(() => { + const updatePosition = (e: MouseEvent) => { + setCoords({ + x: e.clientX, + y: e.clientY, + }); + }; + + document.addEventListener("mousemove", updatePosition, false); + document.addEventListener("mouseenter", updatePosition, false); + + return () => { + document.removeEventListener("mousemove", updatePosition); + document.removeEventListener("mouseenter", updatePosition); + }; + }, []); + + return ( + + ); + } + ``` + + + + + Create the canvas + + + Now that the other components are built, we can create the component that displays the threads. + Add [`useThreads`](/docs/api-reference/liveblocks-react#useThreads) to get the threads in the room, + and place down a `DraggableThread` for each inside [`DndContext`](https://dndkit.com/legacy/api-documentation/context-provider/dnd-context). + When a thread is dropped, use + [`useEditThreadMetadata`](/docs/api-reference/liveblocks-react#useEditThreadMetadata) to update + the thread’s metadata with the new X/Y coordinates. + + ```tsx file="app/CollaborativeCanvas.tsx" + import { ThreadData } from "@liveblocks/client"; + import { useThreads, useEditThreadMetadata } from "@liveblocks/react/suspense"; + import { + DataRef, + DndContext, + DragEndEvent, + PointerSensor, + TouchSensor, + useSensor, + useSensors, + } from "@dnd-kit/core"; + import { useCallback } from "react"; + import { PlaceThreadButton } from "./PlaceThreadButton"; + import { DraggableThread } from "./DraggableThread"; + + export function CollaborativeCanvas() { + const { threads } = useThreads(); + const editThreadMetadata = useEditThreadMetadata(); + + // Allow click event on avatar if thread moved less than 3px + const sensors = useSensors( + useSensor(PointerSensor, { + activationConstraint: { + distance: 3, + }, + }), + useSensor(TouchSensor, { + activationConstraint: { + distance: 3, + }, + }), + ); + + // On drag end, update thread metadata with new coords + const handleDragEnd = useCallback( + ({ active, delta }: DragEndEvent) => { + const thread = (active.data as DataRef<{ thread: ThreadData }>).current + ?.thread; + + if (!thread) { + return; + } + + editThreadMetadata({ + threadId: thread.id, + metadata: { + x: thread.metadata.x + delta.x, + y: thread.metadata.y + delta.y, + }, + }); + }, + [editThreadMetadata], + ); + + return ( +
+
+ + {threads.map((thread) => ( + + ))} + +
+ +
+ ); + } + ``` + +
+ +
+ + Add the Liveblocks room to your page + + + To finish off, import your room into your `page.tsx` file, and place + your collaborative app components inside it. + + ```tsx file="app/page.tsx" highlight="6-8" + import { Room } from "./Room"; + import { CollaborativeCanvas } from "./CollaborativeCanvas"; + + export default function Page() { + return ( + + + + ); + } + ``` + + + + + + Next: authenticate and add your users + + + Comments is set up and working now on your canvas, but each user is anonymous—the next step is to + authenticate each user as they connect, and attach their name and avatar to their comments. + + + + + + + +## What to read next + +Congratulations! You’ve set up the foundation to start building a commenting +experience for your Next.js application. + +- [API Reference](/docs/api-reference/liveblocks-react-ui) +- [Overview](/docs/ready-made-features/comments) +- [How to send email notifications when comments are created](/docs/guides/how-to-send-email-notifications-when-comments-are-created) + +--- + +## Examples using Next.js + + + + + + + diff --git a/docs/pages/get-started/nextjs-comments-table.mdx b/docs/pages/get-started/nextjs-comments-table.mdx new file mode 100644 index 0000000000..e1d26a5736 --- /dev/null +++ b/docs/pages/get-started/nextjs-comments-table.mdx @@ -0,0 +1,321 @@ +--- +meta: + title: + "Get started with commenting in an HTML table using Liveblocks and Next.js" + parentTitle: "Quickstart" + description: + "Learn how to get started with commenting using Liveblocks and Next.js" +--- + +Liveblocks is a realtime collaboration infrastructure for building performant +collaborative experiences. Follow the following steps to start adding a +commenting experience to your Next.js `/app` directory application using the +hooks from [`@liveblocks/react`](/docs/api-reference/liveblocks-react) and the +components from +[`@liveblocks/react-ui`](/docs/api-reference/liveblocks-react-ui). + +## Quickstart + + + + Install Liveblocks + + + Every package should use the same version. + + ```bash trackEvent="install_liveblocks" + npm install @liveblocks/client @liveblocks/react @liveblocks/react-ui + ``` + + + + + + Initialize the `liveblocks.config.ts` file + + + We can use this file later to [define types for our application](/docs/api-reference/liveblocks-react#Typing-your-data). + + ```bash + npx create-liveblocks-app@latest --init --framework react + ``` + + + + + + + Define thread metadata + + + Inside the new `liveblocks.config.ts` file, define the metadata shape for threads. + Metadata is used to attach comment threads to table cells. + + ```tsx file="liveblocks.config.ts" + declare global { + interface Liveblocks { + ThreadMetadata: { + rowId: string; + columnId: string; + }; + } + } + + export {}; + ``` + + + + + + Import default styles + + + The default components come with default styles, you can import them into the + root layout of your app or directly into a CSS file with `@import`. + + ```tsx file="app/layout.tsx" + import "@liveblocks/react-ui/styles.css"; + ``` + + + + + + Create a Liveblocks room + + + Liveblocks uses the concept of rooms, separate virtual spaces where people + collaborate, and to create a realtime experience, multiple users must + be connected to the same room. When using Next.js’ `/app` router, + we recommend creating your room in a `Room.tsx` file in the same directory + as your current route. + + Set up a Liveblocks client with + [`LiveblocksProvider`](/docs/api-reference/liveblocks-react#LiveblocksProvider), + join a room with [`RoomProvider`](/docs/api-reference/liveblocks-react#RoomProvider), + and use [`ClientSideSuspense`](/docs/api-reference/liveblocks-react#ClientSideSuspense) + to add a loading spinner to your app. + + ```tsx file="app/Room.tsx" highlight="12-18" + "use client"; + + import { ReactNode } from "react"; + import { + LiveblocksProvider, + RoomProvider, + ClientSideSuspense, + } from "@liveblocks/react/suspense"; + + export function Room({ children }: { children: ReactNode }) { + return ( + + + Loading…
}> + {children} + + + + ); + } + ``` + +
+ +
+ + Add the Liveblocks room to your page + + + After creating your room file, it’s time to join it. Import + your room into your `page.tsx` file, and place + your collaborative app components inside it. + + ```tsx file="app/page.tsx" highlight="6-8" + import { Room } from "./Room"; + import { CollaborativeApp } from "./CollaborativeApp"; + + export default function Page() { + return ( + + + + ); + } + ``` + + + + + + Use the Liveblocks hooks and components + + + Now that we’re connected to a room, we can start using the Liveblocks hooks and components. + Add [`useThreads`](/docs/api-reference/liveblocks-react#useThreads) to get the threads in the room, + and insert them into the table cells using [`FloatingThread`](/docs/api-reference/liveblocks-react-ui#FloatingThread) + and [`FloatingComposer`](/docs/api-reference/liveblocks-react-ui#FloatingComposer). Replace the table data with your own. + + ```tsx file="app/CollaborativeApp.tsx" + "use client"; + + import { useState } from "react"; + import { useThreads } from "@liveblocks/react/suspense"; + import { FloatingComposer, FloatingThread } from "@liveblocks/react-ui"; + + const TABLE_DATA = [ + { id: "1", name: "Laptop", price: 1000 }, + { id: "2", name: "Phone", price: 500 }, + { id: "3", name: "Tablet", price: 300 }, + ]; + + const COLUMNS = [ + { id: "name", label: "Name" }, + { id: "price", label: "Price" }, + ]; + + export function CollaborativeApp() { + const { threads } = useThreads(); + + const [openCell, setOpenCell] = useState<{ + rowId: string; + columnId: string; + } | null>(null); + + return ( + + + {TABLE_DATA.map((row) => ( + + {COLUMNS.map((column) => { + // Check if there's already a thread for this cell + const thread = threads.find( + ({ metadata }) => + metadata.rowId === row.id && metadata.columnId === column.id, + ); + + // When a thread is created, open it by default + const defaultOpen = + openCell !== null && + openCell.rowId === row.id && + openCell.columnId === column.id; + + const metadata = { rowId: row.id, columnId: column.id }; + + return ( + + ); + })} + + ))} + +
+
+ {/* Cell contents */} + {row[column.id as keyof typeof row]} + + {/* Show thread if it exists, otherwise show thread composer */} + {thread ? ( + { + if (!isOpen && defaultOpen) { + setOpenCell(null); + } + }} + autoFocus + > + + + ) : ( + setOpenCell(metadata)} + > + + + )} +
+
+ ); + } + ``` + +
+ +
+ + Next: authenticate and add your users + + + Comments is set up and working now inside your table, but each user is anonymous—the next step is to + authenticate each user as they connect, and attach their name and avatar to their comments. + + + + + +
+ +## What to read next + +Congratulations! You’ve set up the foundation to start building a commenting +experience for your Next.js application. + +- [API Reference](/docs/api-reference/liveblocks-react-ui) +- [Overview](/docs/ready-made-features/comments) +- [How to send email notifications when comments are created](/docs/guides/how-to-send-email-notifications-when-comments-are-created) + +--- + +## Examples using Next.js + + + + + + + diff --git a/docs/pages/get-started/nextjs-comments.mdx b/docs/pages/get-started/nextjs-comments.mdx index 6ba5c114f5..8a785385f9 100644 --- a/docs/pages/get-started/nextjs-comments.mdx +++ b/docs/pages/get-started/nextjs-comments.mdx @@ -160,7 +160,7 @@ components from Comments is set up and working now, but each user is anonymous—the next step is to authenticate each user as they connect, and attach their name and avatar to their comments. - + + + + + +## What to read next + +Congratulations! You now have set up the foundation to start building +collaborative experiences for your React application. + +- [@liveblocks/react API Reference](/docs/api-reference/liveblocks-react) +- [Next.js and React guides](/docs/guides?technologies=nextjs%2Creact) +- [How to use Liveblocks Presence with React](/docs/guides/how-to-use-liveblocks-presence-with-react) +- [How to use Liveblocks Storage with React](/docs/guides/how-to-use-liveblocks-storage-with-react) + +--- + +## Examples using Next.js + + + + + + + diff --git a/docs/pages/get-started/react-comments.mdx b/docs/pages/get-started/react-comments.mdx index 28a51944ae..07bed16f6f 100644 --- a/docs/pages/get-started/react-comments.mdx +++ b/docs/pages/get-started/react-comments.mdx @@ -174,6 +174,7 @@ Congratulations! You’ve set up the foundation to start building a commenting experience for your React application. - [API Reference](/docs/api-reference/liveblocks-react-ui) +- [Overview](/docs/ready-made-features/comments) - [How to send email notifications when comments are created](/docs/guides/how-to-send-email-notifications-when-comments-are-created) --- diff --git a/docs/routes.json b/docs/routes.json index a0f0617a44..97a9268e00 100644 --- a/docs/routes.json +++ b/docs/routes.json @@ -21,6 +21,11 @@ "path": "/get-started/react", "hidden": true }, + { + "title": "Next.js / Presence", + "path": "/get-started/nextjs-presence", + "hidden": true + }, { "title": "AI Copilots", "path": "/get-started/react-ai-chat", @@ -41,6 +46,21 @@ "path": "/get-started/nextjs-comments", "hidden": true }, + { + "title": "Comments / Canvas", + "path": "/get-started/nextjs-comments-canvas", + "hidden": true + }, + { + "title": "Comments / Table", + "path": "/get-started/nextjs-comments-table", + "hidden": true + }, + { + "title": "Comments / AG Grid", + "path": "/get-started/nextjs-comments-ag-grid", + "hidden": true + }, { "title": "Notifications / In-app", "path": "/get-started/react-notifications-in-app", diff --git a/e2e/next-sandbox/pages/comments/thread.tsx b/e2e/next-sandbox/pages/comments/thread.tsx new file mode 100644 index 0000000000..34fbf17688 --- /dev/null +++ b/e2e/next-sandbox/pages/comments/thread.tsx @@ -0,0 +1,122 @@ +import type { ThreadData } from "@liveblocks/core"; +import { ClientSideSuspense, createRoomContext } from "@liveblocks/react"; +import { Comment, Thread } from "@liveblocks/react-ui"; +import type { ComponentProps } from "react"; +import { useMemo } from "react"; + +import { getRoomFromUrl } from "../../utils"; +import { createLiveblocksClient } from "../../utils/createClient"; + +const client = createLiveblocksClient(); + +const { + RoomProvider, + suspense: { useSelf }, +} = createRoomContext(client); + +export default function Home() { + const roomId = getRoomFromUrl(); + + return ( + + + + + + ); +} + +function Sandbox() { + const roomId = getRoomFromUrl(); + const userId = useSelf().id ?? "user"; + const thread = useMemo(() => { + const date = new Date("2026-01-01T00:00:00.000Z"); + + return { + type: "thread", + id: "th_123", + roomId, + createdAt: date, + updatedAt: date, + resolved: false, + metadata: {}, + comments: [ + { + type: "comment", + id: "cm_123", + threadId: "th_123", + roomId, + userId, + createdAt: date, + reactions: [], + attachments: [], + metadata: {}, + body: { + version: 1, + content: [ + { + type: "paragraph", + children: [{ text: "Hello from e2e" }], + }, + ], + }, + }, + ], + }; + }, [roomId, userId]); + + return ( + <> + ( + <> + {children} + { + console.log("Custom dropdown item selected", event); + }} + > + Custom dropdown item for {comment.id} + + + )} + components={{ + Comment: (props: ComponentProps) => ( + + + Custom avatar + + } + author={ + + + Custom author + + } + additionalContent={ +
+ Custom additional +
+ } + > + {({ children }) => ( +
+
Before custom
+ {children} +
After custom
+
+ )} +
+ ), + }} + /> + + ); +} diff --git a/e2e/next-sandbox/test/comments/thread.test.ts b/e2e/next-sandbox/test/comments/thread.test.ts new file mode 100644 index 0000000000..33f922b9e7 --- /dev/null +++ b/e2e/next-sandbox/test/comments/thread.test.ts @@ -0,0 +1,86 @@ +import type { Page } from "@playwright/test"; +import { expect, test } from "@playwright/test"; + +import { genRoomId, preparePage } from "../utils"; + +const TEST_URL = "http://localhost:3007/comments/thread"; + +test.describe("Custom thread comments", () => { + let page: Page; + + test.beforeAll(async ({}, testInfo) => { + const room = genRoomId(testInfo); + page = await preparePage( + `${TEST_URL}?room=${encodeURIComponent(room)}&user=1` + ); + await expect(page.getByText("Hello from e2e")).toBeVisible(); + }); + + test.afterAll(() => page.close()); + + test("renders custom comment content", async () => { + // ➡️ Custom content wrappers are visible + await expect( + page.locator("[data-testid='custom-comment-before']") + ).toBeVisible(); + await expect( + page.locator("[data-testid='custom-comment-after']") + ).toBeVisible(); + }); + + test("renders custom avatar, author, and additional content", async () => { + // ➡️ Custom avatar, author, and additional content are visible + await expect( + page.locator("[data-testid='custom-comment-avatar']") + ).toBeVisible(); + await expect( + page.locator("[data-testid='custom-comment-author']") + ).toBeVisible(); + await expect( + page.locator("[data-testid='custom-comment-additional']") + ).toBeVisible(); + }); + + test("renders custom dropdown items with custom Comment component", async () => { + const commentActions = page + .locator(".lb-comment") + .locator(".lb-comment-actions"); + + // Open the dropdown + const dropdownButton = commentActions.locator("button").last(); + await dropdownButton.click(); + + // ➡️ Custom dropdown item is visible + await expect( + page.locator("[data-testid='custom-dropdown-item']") + ).toBeVisible({ timeout: 2000 }); + await expect( + page.locator("[data-testid='custom-dropdown-item']") + ).toContainText("cm_123"); + }); + + test("preserves default dropdown items when using children in commentDropdownItems", async () => { + const commentActions = page + .locator(".lb-comment") + .locator(".lb-comment-actions"); + + // Open the dropdown + const dropdownButton = commentActions.locator("button").last(); + await dropdownButton.click(); + + const dropdown = page.locator(".lb-dropdown"); + + // ➡️ Default items (Edit and Delete) are present + await expect(dropdown).toBeVisible({ timeout: 2000 }); + await expect(dropdown.getByText("Edit comment")).toBeVisible(); + await expect(dropdown.getByText("Delete comment")).toBeVisible(); + + // ➡️ Custom item is also present + await expect( + page.locator("[data-testid='custom-dropdown-item']") + ).toBeVisible(); + await expect( + page.locator("[data-testid='custom-dropdown-item']") + ).toContainText("cm_123"); + }); +}); 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..7d9cee6472 --- /dev/null +++ b/examples/nextjs-comments-ag-grid/README.md @@ -0,0 +1,62 @@ +

+ + Liveblocks + + + Liveblocks + +

+ +# AG Grid commenting + +

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

+ +

+ React + Next.js +

+ +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 + +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" + ] +} diff --git a/examples/nextjs-comments-overlay/package-lock.json b/examples/nextjs-comments-overlay/package-lock.json index f0def2e42a..139f697780 100644 --- a/examples/nextjs-comments-overlay/package-lock.json +++ b/examples/nextjs-comments-overlay/package-lock.json @@ -8,25 +8,23 @@ "name": "@liveblocks-examples/nextjs-comments-overlay", "version": "0.1.0", "dependencies": { - "@liveblocks/client": "^3.14.0", - "@liveblocks/node": "^3.14.0", - "@liveblocks/react": "^3.14.0", - "@liveblocks/react-ui": "^3.14.0", - "@radix-ui/react-collapsible": "^1.0.3", - "@radix-ui/react-portal": "^1.0.4", - "@radix-ui/react-slot": "^1.0.2", - "@types/node": "20.4.10", - "@types/react-dom": "18.2.25", - "clsx": "^2.0.1", - "framer-motion": "^10.16.16", - "next": "^16.1.6", + "@liveblocks/client": "3.15.0-thread2", + "@liveblocks/node": "3.15.0-thread2", + "@liveblocks/react": "3.15.0-thread2", + "@liveblocks/react-ui": "3.15.0-thread2", + "@types/node": "20.4.5", + "@types/react-dom": "18.2.7", + "clsx": "^2.0.0", + "framer-motion": "^10.16.4", + "next": "14.2.34", + "radix-ui": "^1.4.3", "react": "18.2.0", "react-dom": "18.2.0", - "react-error-boundary": "^4.0.13" + "react-error-boundary": "^4.0.11" }, "devDependencies": { - "@types/react": "^18.3.27", - "prettier": "^3.3.3", + "@types/react": "^18.3.3", + "prettier": "^3.3.2", "typescript": "^5.4.5" } }, @@ -39,16 +37,6 @@ "node": ">=6.9.0" } }, - "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/@emotion/is-prop-valid": { "version": "0.8.8", "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", @@ -67,31 +55,31 @@ "optional": true }, "node_modules/@floating-ui/core": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", - "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.4.tgz", + "integrity": "sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==", "license": "MIT", "dependencies": { "@floating-ui/utils": "^0.2.10" } }, "node_modules/@floating-ui/dom": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", - "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.5.tgz", + "integrity": "sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg==", "license": "MIT", "dependencies": { - "@floating-ui/core": "^1.7.3", + "@floating-ui/core": "^1.7.4", "@floating-ui/utils": "^0.2.10" } }, "node_modules/@floating-ui/react-dom": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz", - "integrity": "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.7.tgz", + "integrity": "sha512-0tLRojf/1Go2JgEVm+3Frg9A3IW8bJgKgdO0BN5RkF//ufuz2joZM63Npau2ff3J6lUVYgDSNzNkR+aH3IVfjg==", "license": "MIT", "dependencies": { - "@floating-ui/dom": "^1.7.4" + "@floating-ui/dom": "^1.7.5" }, "peerDependencies": { "react": ">=16.8.0", @@ -104,521 +92,457 @@ "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", "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==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=18" + "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-thread2", + "resolved": "https://registry.npmjs.org/@liveblocks/client/-/client-3.15.0-thread2.tgz", + "integrity": "sha512-0IzP8Izdb9e7BJYQgj0MMmgJH/wXVRQz/f0pFGJCe0iMsyukQ2Dyl/fU60BJf1bzf6gFWgdRaBHJKlpiaznlyA==", + "license": "Apache-2.0", + "dependencies": { + "@liveblocks/core": "3.15.0-thread2" } }, - "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" - ], + "node_modules/@liveblocks/core": { + "version": "3.15.0-thread2", + "resolved": "https://registry.npmjs.org/@liveblocks/core/-/core-3.15.0-thread2.tgz", + "integrity": "sha512-t5nDCXGKnd52InqjUyuRoihPdhDy44Udaxx7nGDoLd13rfcVvnozl2JSwNWQany9CMz2eilypZrMiwxVAVsKMw==", "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "peerDependencies": { + "@types/json-schema": "^7" + } + }, + "node_modules/@liveblocks/node": { + "version": "3.15.0-thread2", + "resolved": "https://registry.npmjs.org/@liveblocks/node/-/node-3.15.0-thread2.tgz", + "integrity": "sha512-BsnYg75feqELbP8UE+ECmDIXanLeAOfRAV5E7DK9WpulyngzEAsfakUwsbyH8Q0VeJTtVt4FpPvb3gO4/iL5/A==", + "license": "Apache-2.0", + "dependencies": { + "@liveblocks/core": "3.15.0-thread2", + "@stablelib/base64": "^1.0.1", + "fast-sha256": "^1.3.0", + "node-fetch": "^2.6.1" + } + }, + "node_modules/@liveblocks/react": { + "version": "3.15.0-thread2", + "resolved": "https://registry.npmjs.org/@liveblocks/react/-/react-3.15.0-thread2.tgz", + "integrity": "sha512-tY2OHCD43ameVk7uTzDMAC1sUIXHDUSzOpHP6p2RdXcRsPr3dnLmBNWOP0bnH9YsL7XxSvSmtTLpsGa3qD0WiQ==", + "license": "Apache-2.0", + "dependencies": { + "@liveblocks/client": "3.15.0-thread2", + "@liveblocks/core": "3.15.0-thread2" }, - "funding": { - "url": "https://opencollective.com/libvips" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^18 || ^19 || ^19.0.0-rc" }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.2.4" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "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" - ], + "node_modules/@liveblocks/react-ui": { + "version": "3.15.0-thread2", + "resolved": "https://registry.npmjs.org/@liveblocks/react-ui/-/react-ui-3.15.0-thread2.tgz", + "integrity": "sha512-9sQ/lDwHVY32rAy1vosHiEginaT6bFdcvB4Av+H2nUj2SspUSBMlm6kGhORCB3i9ZSr2bi1Gn/2a4BqLKSAAIA==", "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "dependencies": { + "@floating-ui/react-dom": "^2.1.2", + "@liveblocks/client": "3.15.0-thread2", + "@liveblocks/core": "3.15.0-thread2", + "@liveblocks/react": "3.15.0-thread2", + "@radix-ui/react-dropdown-menu": "^2.1.2", + "@radix-ui/react-popover": "^1.1.2", + "@radix-ui/react-slot": "^1.1.0", + "@radix-ui/react-toggle": "^1.1.0", + "@radix-ui/react-tooltip": "^1.1.3", + "frimousse": "^0.2.0", + "marked": "^15.0.11", + "slate": "^0.110.2", + "slate-history": "^0.110.3", + "slate-hyperscript": "^0.100.0", + "slate-react": "^0.110.3" }, - "funding": { - "url": "https://opencollective.com/libvips" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^18 || ^19 || ^19.0.0-rc", + "react-dom": "^18 || ^19 || ^19.0.0-rc" }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.2.4" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "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==", + "node_modules/@next/env": { + "version": "14.2.34", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.34.tgz", + "integrity": "sha512-iuGW/UM+EZbn2dm+aLx+avo1rVap+ASoFr7oLpTBVW2G2DqhD5l8Fme9IsLZ6TTsp0ozVSFswidiHK1NGNO+pg==", + "license": "MIT" + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz", + "integrity": "sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==", "cpu": [ "arm64" ], - "license": "LGPL-3.0-or-later", + "license": "MIT", "optional": true, "os": [ "darwin" ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">= 10" } }, - "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==", + "node_modules/@next/swc-darwin-x64": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.33.tgz", + "integrity": "sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==", "cpu": [ "x64" ], - "license": "LGPL-3.0-or-later", + "license": "MIT", "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" + "engines": { + "node": ">= 10" } }, - "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==", + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.33.tgz", + "integrity": "sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==", "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", + "license": "MIT", "optional": true, "os": [ "linux" ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">= 10" } }, - "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==", + "node_modules/@next/swc-linux-arm64-musl": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.33.tgz", + "integrity": "sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==", "cpu": [ "arm64" ], - "license": "LGPL-3.0-or-later", + "license": "MIT", "optional": true, "os": [ "linux" ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">= 10" } }, - "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==", + "node_modules/@next/swc-linux-x64-gnu": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.33.tgz", + "integrity": "sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==", "cpu": [ "x64" ], - "license": "LGPL-3.0-or-later", + "license": "MIT", "optional": true, "os": [ "linux" ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">= 10" } }, - "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==", + "node_modules/@next/swc-linux-x64-musl": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.33.tgz", + "integrity": "sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==", "cpu": [ - "arm" + "x64" ], - "license": "Apache-2.0", + "license": "MIT", "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": ">= 10" } }, - "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==", + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.33.tgz", + "integrity": "sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==", "cpu": [ "arm64" ], - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "linux" + "win32" ], "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": ">= 10" } }, - "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==", + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.33.tgz", + "integrity": "sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==", "cpu": [ - "ppc64" + "ia32" ], - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "linux" + "win32" ], "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": ">= 10" } }, - "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==", + "node_modules/@next/swc-win32-x64-msvc": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.33.tgz", + "integrity": "sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==", "cpu": [ - "riscv64" + "x64" ], - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "linux" + "win32" ], "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": ">= 10" } }, - "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" + "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-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" }, - "funding": { - "url": "https://opencollective.com/libvips" + "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" }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.2.4" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "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" + "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" }, - "funding": { - "url": "https://opencollective.com/libvips" + "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" }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.4" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "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" + "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" }, - "funding": { - "url": "https://opencollective.com/libvips" + "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" }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "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" + "node_modules/@radix-ui/react-alert-dialog/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" }, - "funding": { - "url": "https://opencollective.com/libvips" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "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, + "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": { - "@emnapi/runtime": "^1.7.0" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "@radix-ui/react-primitive": "2.1.3" }, - "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" + "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" }, - "funding": { - "url": "https://opencollective.com/libvips" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "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" + "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" }, - "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" + "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" }, - "funding": { - "url": "https://opencollective.com/libvips" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "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==", - "license": "Apache-2.0", + "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": { - "@liveblocks/core": "3.14.0" - } - }, - "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==", - "license": "Apache-2.0", + "@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/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==", - "license": "Apache-2.0", - "dependencies": { - "@liveblocks/core": "3.14.0", - "@stablelib/base64": "^1.0.1", - "fast-sha256": "^1.3.0", - "node-fetch": "^2.6.1" + "@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": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@liveblocks/react/-/react-3.14.0.tgz", - "integrity": "sha512-MFX8WotVy+NAJwj9JjbUi0jDMJxDO8n5ZfNFZ8D7cl/2klL+OIyrOkXFIkbNDMRZ9hnpvJllPyeBAhhr0ROokQ==", - "license": "Apache-2.0", + "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": { - "@liveblocks/client": "3.14.0", - "@liveblocks/core": "3.14.0" + "@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": "^18 || ^19 || ^19.0.0-rc" + "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": { @@ -629,33 +553,26 @@ } } }, - "node_modules/@liveblocks/react-ui": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@liveblocks/react-ui/-/react-ui-3.14.0.tgz", - "integrity": "sha512-oFfFrRq+gNhVxqr25nLp1S7pdoRfXvGnga0t40GlD1UUCUBrRMy1YW98V3d6RZbdd3XES2kA0QGqkXnRIRggjQ==", - "license": "Apache-2.0", + "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": { - "@floating-ui/react-dom": "^2.1.2", - "@liveblocks/client": "3.14.0", - "@liveblocks/core": "3.14.0", - "@liveblocks/react": "3.14.0", - "@radix-ui/react-dropdown-menu": "^2.1.2", - "@radix-ui/react-popover": "^1.1.2", - "@radix-ui/react-slot": "^1.1.0", - "@radix-ui/react-toggle": "^1.1.0", - "@radix-ui/react-tooltip": "^1.1.3", - "frimousse": "^0.2.0", - "marked": "^15.0.11", - "slate": "^0.110.2", - "slate-history": "^0.110.3", - "slate-hyperscript": "^0.100.0", - "slate-react": "^0.110.3" + "@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": "^18 || ^19 || ^19.0.0-rc", - "react-dom": "^18 || ^19 || ^19.0.0-rc" + "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": { @@ -666,153 +583,517 @@ } } }, - "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" - ], + "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", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" + "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/@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/@radix-ui/react-collection/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-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/@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", - "optional": true, - "os": [ - "linux" - ], - "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/@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/@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", - "optional": true, - "os": [ - "linux" - ], - "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/@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/@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", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" + "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/@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/@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", - "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-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/@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/@radix-ui/react-dialog/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": [ - "win32" - ], - "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-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-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", - "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/@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-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-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==", + "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/react-primitive": "2.1.3" + "@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-menu/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-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": "*", @@ -829,20 +1110,20 @@ } } }, - "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==", + "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-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" + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-is-hydrated": "0.1.0" }, "peerDependencies": { "@types/react": "*", @@ -859,16 +1140,27 @@ } } }, - "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==", + "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-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": "*", @@ -885,7 +1177,7 @@ } } }, - "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": { + "node_modules/@radix-ui/react-popover/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==", @@ -903,62 +1195,70 @@ } } }, - "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==", + "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", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "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" }, - "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" + "@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==", + "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": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@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-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==", + "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/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" + "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", @@ -975,19 +1275,13 @@ } } }, - "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==", + "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/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" + "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", @@ -1004,11 +1298,14 @@ } } }, - "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==", + "node_modules/@radix-ui/react-primitive/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" @@ -1019,15 +1316,14 @@ } } }, - "node_modules/@radix-ui/react-focus-scope": { + "node_modules/@radix-ui/react-progress": { "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==", + "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-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1" + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", @@ -1044,28 +1340,42 @@ } } }, - "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==", + "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/react-use-layout-effect": "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-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": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@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==", + "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", @@ -1073,19 +1383,10 @@ "@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" + "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", @@ -1102,13 +1403,20 @@ } } }, - "node_modules/@radix-ui/react-menu/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==", + "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": { @@ -1126,43 +1434,31 @@ } } }, - "node_modules/@radix-ui/react-menu/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-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==", + "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-presence": "1.1.5", "@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" }, @@ -1181,64 +1477,64 @@ } } }, - "node_modules/@radix-ui/react-popover/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==", + "node_modules/@radix-ui/react-select/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-primitive": "2.1.3", - "@radix-ui/react-use-layout-effect": "1.1.1" + "@radix-ui/react-compose-refs": "1.1.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" + "react": "^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/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==", + "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-compose-refs": "1.1.2" + "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@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==", + "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": { - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.7", + "@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-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-rect": "1.1.1", - "@radix-ui/react-use-size": "1.1.1", - "@radix-ui/rect": "1.1.1" + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", @@ -1255,37 +1551,37 @@ } } }, - "node_modules/@radix-ui/react-portal": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.10.tgz", - "integrity": "sha512-4kY9IVa6+9nJPsYmngK5Uk2kUmZnv7ChhHAFeQ5oaj8jrR1bIi3xww8nH71pz1/Ve4d/cXO3YxT8eikt1B0a8w==", + "node_modules/@radix-ui/react-slot": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz", + "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.4", - "@radix-ui/react-use-layout-effect": "1.1.1" + "@radix-ui/react-compose-refs": "1.1.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" + "react": "^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/node_modules/@radix-ui/react-primitive": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", - "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", + "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/react-slot": "1.2.4" + "@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": "*", @@ -1302,14 +1598,20 @@ } } }, - "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==", + "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/react-compose-refs": "1.1.2", - "@radix-ui/react-use-layout-effect": "1.1.1" + "@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": "*", @@ -1326,13 +1628,24 @@ } } }, - "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==", + "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/react-slot": "1.2.3" + "@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": "*", @@ -1349,38 +1662,43 @@ } } }, - "node_modules/@radix-ui/react-primitive/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==", + "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/react-compose-refs": "1.1.2" + "@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": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@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": { + "node_modules/@radix-ui/react-toggle-group": { "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==", + "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-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-roving-focus": "1.1.11", + "@radix-ui/react-toggle": "1.1.10", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { @@ -1398,33 +1716,19 @@ } } }, - "node_modules/@radix-ui/react-slot": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz", - "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==", - "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-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==", + "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-use-controllable-state": "1.2.2" + "@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": "*", @@ -1475,30 +1779,6 @@ } } }, - "node_modules/@radix-ui/react-tooltip/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-tooltip/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", @@ -1587,6 +1867,24 @@ } } }, + "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", @@ -1602,6 +1900,21 @@ } } }, + "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", @@ -1673,13 +1986,20 @@ "integrity": "sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==", "license": "MIT" }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "license": "Apache-2.0" + }, "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==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", "license": "Apache-2.0", "dependencies": { - "tslib": "^2.8.0" + "@swc/counter": "^0.1.3", + "tslib": "^2.4.0" } }, "node_modules/@types/json-schema": { @@ -1690,9 +2010,9 @@ "peer": true }, "node_modules/@types/node": { - "version": "20.4.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.10.tgz", - "integrity": "sha512-vwzFiiy8Rn6E0MtA13/Cxxgpan/N6UeNYR9oUu6kuJWxu6zCk98trcDp8CBhbtaeuq9SykCmXkFr2lWLoPcvLg==", + "version": "20.4.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.5.tgz", + "integrity": "sha512-rt40Nk13II9JwQBdeYqmbn2Q6IVTA5uPhvSO+JVqdXw/6/4glI6oR9ezty/A9Hg5u7JH4OmYmuQ+XvjKm0Datg==", "license": "MIT" }, "node_modules/@types/prop-types": { @@ -1702,9 +2022,9 @@ "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==", "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -1712,9 +2032,9 @@ } }, "node_modules/@types/react-dom": { - "version": "18.2.25", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.25.tgz", - "integrity": "sha512-o/V48vf4MQh7juIKZU2QGDfli6p1+OOi5oXx36Hffpc9adsHeXjVp8rHuPkjd8VT8sOJ2Zp05HR7CdpGTIUFUA==", + "version": "18.2.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz", + "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==", "license": "MIT", "dependencies": { "@types/react": "*" @@ -1732,19 +2052,21 @@ "node": ">=10" } }, - "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/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" } }, "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.30001774", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001774.tgz", + "integrity": "sha512-DDdwPGz99nmIEv216hKSgLD+D4ikHQHjBC/seF98N9CPqRX4M5mSxT9eTV6oyisnJcuzxtZy4n17yKKQYmYQOA==", "funding": [ { "type": "opencollective", @@ -1788,16 +2110,6 @@ "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", @@ -1869,6 +2181,12 @@ "node": ">=6" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, "node_modules/immer": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz", @@ -1949,41 +2267,42 @@ } }, "node_modules/next": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/next/-/next-16.1.6.tgz", - "integrity": "sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw==", + "version": "14.2.34", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.34.tgz", + "integrity": "sha512-s7mRraWlkEVRLjHHdu5khn0bSnmUh+U+YtigBc+t2Ge7jJHFIVBZna+W9Jcx7b04HhM7eJWrNJ2A+sQs9gJ3eg==", + "deprecated": "This version has a security vulnerability. Please upgrade to a patched version. See https://nextjs.org/blog/security-update-2025-12-11 for more details.", "license": "MIT", "dependencies": { - "@next/env": "16.1.6", - "@swc/helpers": "0.5.15", - "baseline-browser-mapping": "^2.8.3", + "@next/env": "14.2.34", + "@swc/helpers": "0.5.5", + "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", "postcss": "8.4.31", - "styled-jsx": "5.1.6" + "styled-jsx": "5.1.1" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=20.9.0" + "node": ">=18.17.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" + "@next/swc-darwin-arm64": "14.2.33", + "@next/swc-darwin-x64": "14.2.33", + "@next/swc-linux-arm64-gnu": "14.2.33", + "@next/swc-linux-arm64-musl": "14.2.33", + "@next/swc-linux-x64-gnu": "14.2.33", + "@next/swc-linux-x64-musl": "14.2.33", + "@next/swc-win32-arm64-msvc": "14.2.33", + "@next/swc-win32-ia32-msvc": "14.2.33", + "@next/swc-win32-x64-msvc": "14.2.33" }, "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", + "@playwright/test": "^1.41.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", "sass": "^1.3.0" }, "peerDependenciesMeta": { @@ -1993,9 +2312,6 @@ "@playwright/test": { "optional": true }, - "babel-plugin-react-compiler": { - "optional": true - }, "sass": { "optional": true } @@ -2071,6 +2387,101 @@ "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/radix-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/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -2195,64 +2606,6 @@ "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==", - "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", @@ -2317,10 +2670,18 @@ "node": ">=0.10.0" } }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.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==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", + "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", "license": "MIT", "dependencies": { "client-only": "0.0.1" @@ -2329,7 +2690,7 @@ "node": ">= 12.0.0" }, "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" }, "peerDependenciesMeta": { "@babel/core": { @@ -2421,6 +2782,15 @@ } } }, + "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", diff --git a/examples/nextjs-comments-overlay/package.json b/examples/nextjs-comments-overlay/package.json index 5ae4ea1f7c..7aa508bbd9 100644 --- a/examples/nextjs-comments-overlay/package.json +++ b/examples/nextjs-comments-overlay/package.json @@ -11,25 +11,23 @@ "lint": "next lint" }, "dependencies": { - "@liveblocks/client": "^3.14.0", - "@liveblocks/node": "^3.14.0", - "@liveblocks/react": "^3.14.0", - "@liveblocks/react-ui": "^3.14.0", - "@radix-ui/react-collapsible": "^1.0.3", - "@radix-ui/react-portal": "^1.0.4", - "@radix-ui/react-slot": "^1.0.2", - "@types/node": "20.4.10", - "@types/react-dom": "18.2.25", - "clsx": "^2.0.1", - "framer-motion": "^10.16.16", - "next": "^16.1.6", + "@liveblocks/client": "3.15.0-thread2", + "@liveblocks/node": "3.15.0-thread2", + "@liveblocks/react": "3.15.0-thread2", + "@liveblocks/react-ui": "3.15.0-thread2", + "@types/node": "20.4.5", + "@types/react-dom": "18.2.7", + "clsx": "^2.0.0", + "framer-motion": "^10.16.4", + "next": "14.2.34", + "radix-ui": "^1.4.3", "react": "18.2.0", "react-dom": "18.2.0", - "react-error-boundary": "^4.0.13" + "react-error-boundary": "^4.0.11" }, "devDependencies": { - "@types/react": "^18.3.27", - "prettier": "^3.3.3", + "@types/react": "^18.3.3", + "prettier": "^3.3.2", "typescript": "^5.4.5" } } diff --git a/examples/nextjs-comments-overlay/src/components/comments/CommentWithUserAgent.module.css b/examples/nextjs-comments-overlay/src/components/comments/CommentWithUserAgent.module.css new file mode 100644 index 0000000000..2eb10360e0 --- /dev/null +++ b/examples/nextjs-comments-overlay/src/components/comments/CommentWithUserAgent.module.css @@ -0,0 +1,39 @@ +.commentAuthor { + display: flex; + align-items: center; + gap: var(--space-3); +} + +.userAgentTooltipTrigger { + all: unset; + height: var(--size); + width: var(--size); + cursor: help; + color: rgb(var(--color-gray-500)); +} + +.userAgentTooltipTrigger svg { + height: var(--size); + width: var(--size); +} + +.userAgentTooltipTrigger:hover, +.userAgentTooltipTrigger:focus { + color: rgb(var(--color-gray-700)); +} + +.userAgentTooltipContent { + z-index: var(--z-above-comments-sidemenu); + max-width: 400px; + border-radius: var(--radius-lg); + background: var(--color-surface-elevated); + padding: var(--space-4) var(--space-6); + font-size: var(--size-xs); + font-family: + ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", + "Courier New", monospace; + color: rgb(var(--color-gray-600)); + box-shadow: + 0 0 0 1px rgb(var(--color-black) / 10%), + var(--shadow-xl); +} diff --git a/examples/nextjs-comments-overlay/src/components/comments/CommentWithUserAgent.tsx b/examples/nextjs-comments-overlay/src/components/comments/CommentWithUserAgent.tsx new file mode 100644 index 0000000000..12a63a03cc --- /dev/null +++ b/examples/nextjs-comments-overlay/src/components/comments/CommentWithUserAgent.tsx @@ -0,0 +1,52 @@ +"use client"; + +import { Comment } from "@liveblocks/react-ui"; +import { ComponentPropsWithoutRef } from "react"; +import { Tooltip as TooltipPrimitive } from "radix-ui"; +import styles from "./CommentWithUserAgent.module.css"; + +export function CommentWithUserAgent({ + comment, + ...props +}: ComponentPropsWithoutRef) { + return ( + + + {comment.metadata.userAgent ? ( + + + + + + + + + + + {comment.metadata.userAgent} + + + + ) : null} + + } + /> + ); +} diff --git a/examples/nextjs-comments-overlay/src/components/comments/Comments.tsx b/examples/nextjs-comments-overlay/src/components/comments/Comments.tsx index 105246abc7..39c4c09a00 100644 --- a/examples/nextjs-comments-overlay/src/components/comments/Comments.tsx +++ b/examples/nextjs-comments-overlay/src/components/comments/Comments.tsx @@ -8,7 +8,6 @@ import styles from "./Toolbar.module.css"; export function Comments() { return ( - /* @ts-ignore */ diff --git a/examples/nextjs-comments-overlay/src/components/comments/NewThread.tsx b/examples/nextjs-comments-overlay/src/components/comments/NewThread.tsx index b6c9fce799..ee089e5e39 100644 --- a/examples/nextjs-comments-overlay/src/components/comments/NewThread.tsx +++ b/examples/nextjs-comments-overlay/src/components/comments/NewThread.tsx @@ -8,13 +8,12 @@ import { useRef, useState, } from "react"; -import * as Portal from "@radix-ui/react-portal"; import { useCreateThread, useSelf, useUser } from "@liveblocks/react/suspense"; import { ComposerSubmitComment } from "@liveblocks/react-ui/primitives"; import styles from "./NewThread.module.css"; import { NewThreadCursor } from "@/components/comments/NewThreadCursor"; import { getCoordsFromPointerEvent } from "@/lib/coords"; -import { Slot } from "@radix-ui/react-slot"; +import { Portal as PortalPrimitive, Slot as SlotPrimitive } from "radix-ui"; import { PinnedComposer } from "@/components/comments/PinnedComposer"; import { useMaxZIndex } from "@/lib/useMaxZIndex"; @@ -222,6 +221,9 @@ export function NewThread({ children }: Props) { cursorY, zIndex: maxZIndex + 1, }, + commentMetadata: { + userAgent: navigator.userAgent, + }, }); setComposerCoords(null); @@ -239,7 +241,7 @@ export function NewThread({ children }: Props) { return ( <> - setCreatingCommentState( creatingCommentState !== "complete" ? "complete" : "placing" @@ -248,9 +250,9 @@ export function NewThread({ children }: Props) { style={{ opacity: creatingCommentState !== "complete" ? 0.7 : 1 }} > {children} - + {composerCoords && creatingCommentState === "placed" ? ( - {}} onPointerMove={() => {}} /> - + ) : null} diff --git a/examples/nextjs-comments-overlay/src/components/comments/NewThreadCursor.tsx b/examples/nextjs-comments-overlay/src/components/comments/NewThreadCursor.tsx index 634a1fca38..cadd8d47f6 100644 --- a/examples/nextjs-comments-overlay/src/components/comments/NewThreadCursor.tsx +++ b/examples/nextjs-comments-overlay/src/components/comments/NewThreadCursor.tsx @@ -1,7 +1,7 @@ "use client"; import { useEffect, useState } from "react"; -import * as Portal from "@radix-ui/react-portal"; +import { Portal as PortalPrimitive } from "radix-ui"; import styles from "./NewThreadCursor.module.css"; export function NewThreadCursor({ display }: { display: boolean }) { @@ -42,13 +42,13 @@ export function NewThreadCursor({ display }: { display: boolean }) { } return ( - +
- + ); } diff --git a/examples/nextjs-comments-overlay/src/components/comments/PinnedThread.tsx b/examples/nextjs-comments-overlay/src/components/comments/PinnedThread.tsx index 1ae0df4017..d5c624319b 100644 --- a/examples/nextjs-comments-overlay/src/components/comments/PinnedThread.tsx +++ b/examples/nextjs-comments-overlay/src/components/comments/PinnedThread.tsx @@ -12,6 +12,8 @@ import { import { ThreadData } from "@liveblocks/client"; import { Thread } from "@liveblocks/react-ui"; import { useNearEdge } from "@/lib/useNearEdge"; +import { Tooltip as TooltipPrimitive } from "radix-ui"; +import { CommentWithUserAgent } from "@/components/comments/CommentWithUserAgent"; type Props = { user: Liveblocks["UserMeta"]["info"]; @@ -92,17 +94,20 @@ export function PinnedThread({ />
{!minimized ? ( -
- -
+ +
+ +
+
) : null} ); diff --git a/examples/nextjs-comments-overlay/src/components/comments/Sidebar.tsx b/examples/nextjs-comments-overlay/src/components/comments/Sidebar.tsx index 3af072aef2..968519786d 100644 --- a/examples/nextjs-comments-overlay/src/components/comments/Sidebar.tsx +++ b/examples/nextjs-comments-overlay/src/components/comments/Sidebar.tsx @@ -9,6 +9,8 @@ import { DocumentCompleteIcon } from "@/components/icons/DocumentCompleteIcon"; import { ThreadData } from "@liveblocks/client"; import { CloseIcon } from "@/components/icons/CloseIcon"; import { PlusIcon } from "@/components/icons/PlusIcon"; +import { Tooltip as TooltipPrimitive } from "radix-ui"; +import { CommentWithUserAgent } from "@/components/comments/CommentWithUserAgent"; type Props = { onClose: () => void; @@ -40,15 +42,21 @@ export function Sidebar({ onClose }: Props) {
{threads.length ? ( - threads.sort(sortResolved).map((thread) => ( -
- -
- )) + + {threads.sort(sortResolved).map((thread) => ( +
+ +
+ ))} +
) : ( )} diff --git a/examples/nextjs-comments-overlay/src/components/comments/Toolbar.tsx b/examples/nextjs-comments-overlay/src/components/comments/Toolbar.tsx index 51b441033d..a483c94b96 100644 --- a/examples/nextjs-comments-overlay/src/components/comments/Toolbar.tsx +++ b/examples/nextjs-comments-overlay/src/components/comments/Toolbar.tsx @@ -2,7 +2,7 @@ import { Button } from "./Button"; import { useState } from "react"; -import * as Collapsible from "@radix-ui/react-collapsible"; +import { Collapsible as CollapsiblePrimitive } from "radix-ui"; import { NewThread } from "@/components/comments/NewThread"; import { Sidebar } from "@/components/comments/Sidebar"; import { ToolbarAvatars } from "@/components/comments/ToolbarAvatars"; @@ -15,7 +15,7 @@ export function Toolbar({ ...props }) { const [open, setOpen] = useState(false); return ( -
- + - +
- + setOpen(false)} /> - -
+ + ); } diff --git a/examples/nextjs-comments-overlay/src/liveblocks.config.ts b/examples/nextjs-comments-overlay/src/liveblocks.config.ts index 9df4abc3fd..857bb2f3ae 100644 --- a/examples/nextjs-comments-overlay/src/liveblocks.config.ts +++ b/examples/nextjs-comments-overlay/src/liveblocks.config.ts @@ -32,5 +32,9 @@ declare global { cursorX: AccurateCursorPositions["cursorX"]; cursorY: AccurateCursorPositions["cursorY"]; }; + // Custom metadata set on comments, for useCreateComment, useEditComment, etc. + CommentMetadata: { + userAgent?: string; + }; } } diff --git a/examples/nextjs-comments-video/package-lock.json b/examples/nextjs-comments-video/package-lock.json index 5356a36231..069fb42134 100644 --- a/examples/nextjs-comments-video/package-lock.json +++ b/examples/nextjs-comments-video/package-lock.json @@ -7,10 +7,10 @@ "name": "@liveblocks-examples/nextjs-comments-video", "license": "Apache-2.0", "dependencies": { - "@liveblocks/client": "^3.14.0", - "@liveblocks/node": "^3.14.0", - "@liveblocks/react": "^3.14.0", - "@liveblocks/react-ui": "^3.14.0", + "@liveblocks/client": "3.15.0-thread2", + "@liveblocks/node": "3.15.0-thread2", + "@liveblocks/react": "3.15.0-thread2", + "@liveblocks/react-ui": "3.15.0-thread2", "@radix-ui/react-slider": "^1.1.2", "@radix-ui/react-tooltip": "^1.0.7", "@types/node": "20.3.3", @@ -557,43 +557,43 @@ "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-thread2", + "resolved": "https://registry.npmjs.org/@liveblocks/client/-/client-3.15.0-thread2.tgz", + "integrity": "sha512-0IzP8Izdb9e7BJYQgj0MMmgJH/wXVRQz/f0pFGJCe0iMsyukQ2Dyl/fU60BJf1bzf6gFWgdRaBHJKlpiaznlyA==", "license": "Apache-2.0", "dependencies": { - "@liveblocks/core": "3.14.0" + "@liveblocks/core": "3.15.0-thread2" } }, "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-thread2", + "resolved": "https://registry.npmjs.org/@liveblocks/core/-/core-3.15.0-thread2.tgz", + "integrity": "sha512-t5nDCXGKnd52InqjUyuRoihPdhDy44Udaxx7nGDoLd13rfcVvnozl2JSwNWQany9CMz2eilypZrMiwxVAVsKMw==", "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-thread2", + "resolved": "https://registry.npmjs.org/@liveblocks/node/-/node-3.15.0-thread2.tgz", + "integrity": "sha512-BsnYg75feqELbP8UE+ECmDIXanLeAOfRAV5E7DK9WpulyngzEAsfakUwsbyH8Q0VeJTtVt4FpPvb3gO4/iL5/A==", "license": "Apache-2.0", "dependencies": { - "@liveblocks/core": "3.14.0", + "@liveblocks/core": "3.15.0-thread2", "@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-thread2", + "resolved": "https://registry.npmjs.org/@liveblocks/react/-/react-3.15.0-thread2.tgz", + "integrity": "sha512-tY2OHCD43ameVk7uTzDMAC1sUIXHDUSzOpHP6p2RdXcRsPr3dnLmBNWOP0bnH9YsL7XxSvSmtTLpsGa3qD0WiQ==", "license": "Apache-2.0", "dependencies": { - "@liveblocks/client": "3.14.0", - "@liveblocks/core": "3.14.0" + "@liveblocks/client": "3.15.0-thread2", + "@liveblocks/core": "3.15.0-thread2" }, "peerDependencies": { "@types/react": "*", @@ -610,15 +610,15 @@ } }, "node_modules/@liveblocks/react-ui": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@liveblocks/react-ui/-/react-ui-3.14.0.tgz", - "integrity": "sha512-oFfFrRq+gNhVxqr25nLp1S7pdoRfXvGnga0t40GlD1UUCUBrRMy1YW98V3d6RZbdd3XES2kA0QGqkXnRIRggjQ==", + "version": "3.15.0-thread2", + "resolved": "https://registry.npmjs.org/@liveblocks/react-ui/-/react-ui-3.15.0-thread2.tgz", + "integrity": "sha512-9sQ/lDwHVY32rAy1vosHiEginaT6bFdcvB4Av+H2nUj2SspUSBMlm6kGhORCB3i9ZSr2bi1Gn/2a4BqLKSAAIA==", "license": "Apache-2.0", "dependencies": { "@floating-ui/react-dom": "^2.1.2", - "@liveblocks/client": "3.14.0", - "@liveblocks/core": "3.14.0", - "@liveblocks/react": "3.14.0", + "@liveblocks/client": "3.15.0-thread2", + "@liveblocks/core": "3.15.0-thread2", + "@liveblocks/react": "3.15.0-thread2", "@radix-ui/react-dropdown-menu": "^2.1.2", "@radix-ui/react-popover": "^1.1.2", "@radix-ui/react-slot": "^1.1.0", diff --git a/examples/nextjs-comments-video/package.json b/examples/nextjs-comments-video/package.json index 19a89ea8fc..57de0e5ec7 100644 --- a/examples/nextjs-comments-video/package.json +++ b/examples/nextjs-comments-video/package.json @@ -10,10 +10,10 @@ "lint": "next lint" }, "dependencies": { - "@liveblocks/client": "^3.14.0", - "@liveblocks/node": "^3.14.0", - "@liveblocks/react": "^3.14.0", - "@liveblocks/react-ui": "^3.14.0", + "@liveblocks/client": "3.15.0-thread2", + "@liveblocks/node": "3.15.0-thread2", + "@liveblocks/react": "3.15.0-thread2", + "@liveblocks/react-ui": "3.15.0-thread2", "@radix-ui/react-slider": "^1.1.2", "@radix-ui/react-tooltip": "^1.0.7", "@types/node": "20.3.3", diff --git a/examples/nextjs-comments-video/src/components/Threads.module.css b/examples/nextjs-comments-video/src/components/Threads.module.css index 96838b08d4..9782fad002 100644 --- a/examples/nextjs-comments-video/src/components/Threads.module.css +++ b/examples/nextjs-comments-video/src/components/Threads.module.css @@ -58,3 +58,16 @@ .threadTime:focus { background-color: var(--accent-background-hover); } + +.commentContentWrapper[data-spoiler] { + filter: blur(6px); + opacity: 0.5; + transition: + filter 150ms ease-out, + opacity 150ms ease-out; +} + +.commentContentWrapper[data-spoiler]:hover { + filter: none; + opacity: 1; +} diff --git a/examples/nextjs-comments-video/src/components/Threads.tsx b/examples/nextjs-comments-video/src/components/Threads.tsx index c484e45782..c56a61bbad 100644 --- a/examples/nextjs-comments-video/src/components/Threads.tsx +++ b/examples/nextjs-comments-video/src/components/Threads.tsx @@ -1,8 +1,12 @@ "use client"; -import { useThreads } from "@liveblocks/react/suspense"; +import { + useThreads, + useSelf, + useEditCommentMetadata, +} from "@liveblocks/react/suspense"; import { ClientSideSuspense } from "@liveblocks/react"; -import { Thread } from "@liveblocks/react-ui"; +import { Thread, Comment } from "@liveblocks/react-ui"; import { FormEvent, useCallback, useRef, useState } from "react"; import styles from "./Threads.module.css"; import { @@ -14,6 +18,7 @@ import { import { ThreadData } from "@liveblocks/core"; import { formatTime } from "@/components/Duration"; import { TimeIcon } from "@/icons/Time"; +import { EyeIcon } from "@/icons/Eye"; export function Threads() { return ( @@ -24,6 +29,7 @@ export function Threads() { } function ThreadList() { + const { id: currentUserId } = useSelf(); const { threads } = useThreads(); if (threads.length === 0) { @@ -33,17 +39,28 @@ function ThreadList() { return ( <> {threads.sort(sortThreads).map((thread) => ( - + ))} ); } -function CustomThread({ thread }: { thread: ThreadData }) { +function CustomThread({ + thread, + currentUserId, +}: { + thread: ThreadData; + currentUserId: string; +}) { const ref = useRef(null); const threadHasTime = thread.metadata.timePercentage !== -1; const skipTo = useSkipTo(); const highlightPin = useHighlightPin(thread.id); + const editCommentMetadata = useEditCommentMetadata(); const [highlightedThread, setHighlightedThread] = useState(false); @@ -96,6 +113,59 @@ function CustomThread({ thread }: { thread: ThreadData }) { thread={thread} indentCommentContent={true} onKeyDown={handleKeyDown} + components={{ + Comment: ({ comment, ...props }) => { + return ( + { + // Add "Mark as spoiler" action for users' own comments + if (comment.userId === currentUserId) { + return ( + <> + {children} + } + onSelect={() => { + editCommentMetadata({ + threadId: thread.id, + commentId: comment.id, + metadata: { + spoiler: !comment.metadata.spoiler, + }, + }); + }} + > + {comment.metadata.spoiler + ? "Unmark comment as spoiler" + : "Mark comment as spoiler"} + + + ); + } + + // For other comments, only show the default dropdown items + return children; + }} + > + {({ children }) => { + return ( + // Use a custom wrapper to blur spoilers +
+ {children} +
+ ); + }} +
+ ); + }, + }} />
); diff --git a/examples/nextjs-comments-video/src/components/ThreadsTimeline.module.css b/examples/nextjs-comments-video/src/components/ThreadsTimeline.module.css index 46dc0872de..24d4652d75 100644 --- a/examples/nextjs-comments-video/src/components/ThreadsTimeline.module.css +++ b/examples/nextjs-comments-video/src/components/ThreadsTimeline.module.css @@ -56,7 +56,7 @@ margin-top: 8px; } -.tooltipBody > span { +.tooltipTime { color: var(--accent); } @@ -69,3 +69,8 @@ text-overflow: ellipsis; margin: 0; } + +.tooltipSpoiler { + font-style: italic; + opacity: 0.5; +} diff --git a/examples/nextjs-comments-video/src/components/ThreadsTimeline.tsx b/examples/nextjs-comments-video/src/components/ThreadsTimeline.tsx index 86589e64fd..1d229d004c 100644 --- a/examples/nextjs-comments-video/src/components/ThreadsTimeline.tsx +++ b/examples/nextjs-comments-video/src/components/ThreadsTimeline.tsx @@ -19,7 +19,6 @@ import { useState } from "react"; export function ThreadsTimeline() { return ( - // @ts-ignore Error}> @@ -82,22 +81,28 @@ function PinnedThread({ thread }: { thread: ThreadData }) { {user.name}
- {formatTime(thread.metadata.time) + " "} - ( - - - - ), - Link: (props) => ( - - {props.children} - - ), - }} - /> + + {formatTime(thread.metadata.time) + " "} + + {thread.comments[0].metadata.spoiler ? ( + Spoiler + ) : ( + ( + + + + ), + Link: (props) => ( + + {props.children} + + ), + }} + /> + )}
diff --git a/examples/nextjs-comments-video/src/icons/Eye.tsx b/examples/nextjs-comments-video/src/icons/Eye.tsx new file mode 100644 index 0000000000..cd9954900c --- /dev/null +++ b/examples/nextjs-comments-video/src/icons/Eye.tsx @@ -0,0 +1,21 @@ +import { ComponentProps } from "react"; + +export function EyeIcon(props: ComponentProps<"svg">) { + return ( + + + + + ); +} diff --git a/examples/nextjs-comments-video/src/liveblocks.config.ts b/examples/nextjs-comments-video/src/liveblocks.config.ts index ddce43be49..b6b82b604a 100644 --- a/examples/nextjs-comments-video/src/liveblocks.config.ts +++ b/examples/nextjs-comments-video/src/liveblocks.config.ts @@ -21,5 +21,9 @@ declare global { time: number | -1; timePercentage: number | -1; }; + // Custom metadata set on comments, for useCreateComment, useEditCommentMetadata, etc. + CommentMetadata: { + spoiler?: boolean; + }; } } diff --git a/examples/nextjs-linear-like-issue-tracker/package-lock.json b/examples/nextjs-linear-like-issue-tracker/package-lock.json index 9511ae6f4f..7d5d0d862f 100644 --- a/examples/nextjs-linear-like-issue-tracker/package-lock.json +++ b/examples/nextjs-linear-like-issue-tracker/package-lock.json @@ -8,12 +8,12 @@ "license": "Apache-2.0", "dependencies": { "@lexical/react": "^0.35.0", - "@liveblocks/client": "^3.14.0", - "@liveblocks/node": "^3.14.0", - "@liveblocks/node-lexical": "^3.14.0", - "@liveblocks/react": "^3.14.0", - "@liveblocks/react-lexical": "^3.14.0", - "@liveblocks/react-ui": "^3.14.0", + "@liveblocks/client": "3.15.0-thread2", + "@liveblocks/node": "3.15.0-thread2", + "@liveblocks/node-lexical": "3.15.0-thread2", + "@liveblocks/react": "3.15.0-thread2", + "@liveblocks/react-lexical": "3.15.0-thread2", + "@liveblocks/react-ui": "3.15.0-thread2", "@radix-ui/react-select": "^2.1.7", "@types/node": "20.3.3", "@types/react-dom": "18.2.25", @@ -917,43 +917,43 @@ } }, "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-thread2", + "resolved": "https://registry.npmjs.org/@liveblocks/client/-/client-3.15.0-thread2.tgz", + "integrity": "sha512-0IzP8Izdb9e7BJYQgj0MMmgJH/wXVRQz/f0pFGJCe0iMsyukQ2Dyl/fU60BJf1bzf6gFWgdRaBHJKlpiaznlyA==", "license": "Apache-2.0", "dependencies": { - "@liveblocks/core": "3.14.0" + "@liveblocks/core": "3.15.0-thread2" } }, "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-thread2", + "resolved": "https://registry.npmjs.org/@liveblocks/core/-/core-3.15.0-thread2.tgz", + "integrity": "sha512-t5nDCXGKnd52InqjUyuRoihPdhDy44Udaxx7nGDoLd13rfcVvnozl2JSwNWQany9CMz2eilypZrMiwxVAVsKMw==", "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-thread2", + "resolved": "https://registry.npmjs.org/@liveblocks/node/-/node-3.15.0-thread2.tgz", + "integrity": "sha512-BsnYg75feqELbP8UE+ECmDIXanLeAOfRAV5E7DK9WpulyngzEAsfakUwsbyH8Q0VeJTtVt4FpPvb3gO4/iL5/A==", "license": "Apache-2.0", "dependencies": { - "@liveblocks/core": "3.14.0", + "@liveblocks/core": "3.15.0-thread2", "@stablelib/base64": "^1.0.1", "fast-sha256": "^1.3.0", "node-fetch": "^2.6.1" } }, "node_modules/@liveblocks/node-lexical": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@liveblocks/node-lexical/-/node-lexical-3.14.0.tgz", - "integrity": "sha512-r3vyXTFYJLQekBh6Sjk3ztH8gn+l9fVP3Xvz2hO2CDo0YSy9Z+k2FLyrtiw5+5Wj/cJhZnixOTSUMarKfdI+iQ==", + "version": "3.15.0-thread2", + "resolved": "https://registry.npmjs.org/@liveblocks/node-lexical/-/node-lexical-3.15.0-thread2.tgz", + "integrity": "sha512-6PG/838DrpYJxOA/x16uwezup7K20LGtP9kQ1tKaxXEaRlWQ7OTjwoeSkpsh0+MDED75n2uNZPZ6Y2MMg5kbnQ==", "license": "Apache-2.0", "dependencies": { - "@liveblocks/core": "3.14.0", - "@liveblocks/node": "3.14.0", + "@liveblocks/core": "3.15.0-thread2", + "@liveblocks/node": "3.15.0-thread2", "yjs": "^13.6.18" }, "peerDependencies": { @@ -965,13 +965,13 @@ } }, "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-thread2", + "resolved": "https://registry.npmjs.org/@liveblocks/react/-/react-3.15.0-thread2.tgz", + "integrity": "sha512-tY2OHCD43ameVk7uTzDMAC1sUIXHDUSzOpHP6p2RdXcRsPr3dnLmBNWOP0bnH9YsL7XxSvSmtTLpsGa3qD0WiQ==", "license": "Apache-2.0", "dependencies": { - "@liveblocks/client": "3.14.0", - "@liveblocks/core": "3.14.0" + "@liveblocks/client": "3.15.0-thread2", + "@liveblocks/core": "3.15.0-thread2" }, "peerDependencies": { "@types/react": "*", @@ -988,17 +988,17 @@ } }, "node_modules/@liveblocks/react-lexical": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@liveblocks/react-lexical/-/react-lexical-3.14.0.tgz", - "integrity": "sha512-vIoyivrmcbDQUzpS/PYS7YSxHYiur3BOOVdWqgYK2XaGS4a5NKfUzZwovkhKnLBQKOQWF0QgRJ31L6YHjhX73g==", + "version": "3.15.0-thread2", + "resolved": "https://registry.npmjs.org/@liveblocks/react-lexical/-/react-lexical-3.15.0-thread2.tgz", + "integrity": "sha512-NgdgaNhqRUfYtpDXGegCYGfqxaVDwslHCbNKwqqKJMo/lPUuP+nrPul+vMYTA8nqDomrfCfgWFti48LPDGLz8g==", "license": "Apache-2.0", "dependencies": { "@floating-ui/react-dom": "^2.1.1", - "@liveblocks/client": "3.14.0", - "@liveblocks/core": "3.14.0", - "@liveblocks/react": "3.14.0", - "@liveblocks/react-ui": "3.14.0", - "@liveblocks/yjs": "3.14.0", + "@liveblocks/client": "3.15.0-thread2", + "@liveblocks/core": "3.15.0-thread2", + "@liveblocks/react": "3.15.0-thread2", + "@liveblocks/react-ui": "3.15.0-thread2", + "@liveblocks/yjs": "3.15.0-thread2", "@radix-ui/react-select": "^2.1.2", "@radix-ui/react-toggle": "^1.1.0", "yjs": "^13.6.18" @@ -1025,15 +1025,15 @@ } }, "node_modules/@liveblocks/react-ui": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@liveblocks/react-ui/-/react-ui-3.14.0.tgz", - "integrity": "sha512-oFfFrRq+gNhVxqr25nLp1S7pdoRfXvGnga0t40GlD1UUCUBrRMy1YW98V3d6RZbdd3XES2kA0QGqkXnRIRggjQ==", + "version": "3.15.0-thread2", + "resolved": "https://registry.npmjs.org/@liveblocks/react-ui/-/react-ui-3.15.0-thread2.tgz", + "integrity": "sha512-9sQ/lDwHVY32rAy1vosHiEginaT6bFdcvB4Av+H2nUj2SspUSBMlm6kGhORCB3i9ZSr2bi1Gn/2a4BqLKSAAIA==", "license": "Apache-2.0", "dependencies": { "@floating-ui/react-dom": "^2.1.2", - "@liveblocks/client": "3.14.0", - "@liveblocks/core": "3.14.0", - "@liveblocks/react": "3.14.0", + "@liveblocks/client": "3.15.0-thread2", + "@liveblocks/core": "3.15.0-thread2", + "@liveblocks/react": "3.15.0-thread2", "@radix-ui/react-dropdown-menu": "^2.1.2", "@radix-ui/react-popover": "^1.1.2", "@radix-ui/react-slot": "^1.1.0", @@ -1074,13 +1074,13 @@ } }, "node_modules/@liveblocks/yjs": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@liveblocks/yjs/-/yjs-3.14.0.tgz", - "integrity": "sha512-GDCU6c9i+DYRTM/NQK8RUwSGzdwQ/pPJZG6wcPcy+w7hLmgh3+aHJuBp0ISm1Uzgc+fKWybbJSH67xXcAw/ysA==", + "version": "3.15.0-thread2", + "resolved": "https://registry.npmjs.org/@liveblocks/yjs/-/yjs-3.15.0-thread2.tgz", + "integrity": "sha512-jQPSO6GTNxytl4/KaBJJcmoavYY8uiMlXp012bhUaCtMEsyBXi78275hl7U3UuypXxuNe94BoqP/lOF20XJ9ZQ==", "license": "Apache-2.0", "dependencies": { - "@liveblocks/client": "3.14.0", - "@liveblocks/core": "3.14.0", + "@liveblocks/client": "3.15.0-thread2", + "@liveblocks/core": "3.15.0-thread2", "@noble/hashes": "^1.8.0", "js-base64": "^3.7.7", "y-indexeddb": "^9.0.12" diff --git a/examples/nextjs-linear-like-issue-tracker/package.json b/examples/nextjs-linear-like-issue-tracker/package.json index e3888d79d2..da8154b196 100644 --- a/examples/nextjs-linear-like-issue-tracker/package.json +++ b/examples/nextjs-linear-like-issue-tracker/package.json @@ -11,12 +11,12 @@ }, "dependencies": { "@lexical/react": "^0.35.0", - "@liveblocks/client": "^3.14.0", - "@liveblocks/node": "^3.14.0", - "@liveblocks/node-lexical": "^3.14.0", - "@liveblocks/react": "^3.14.0", - "@liveblocks/react-lexical": "^3.14.0", - "@liveblocks/react-ui": "^3.14.0", + "@liveblocks/client": "3.15.0-thread2", + "@liveblocks/node": "3.15.0-thread2", + "@liveblocks/node-lexical": "3.15.0-thread2", + "@liveblocks/react": "3.15.0-thread2", + "@liveblocks/react-lexical": "3.15.0-thread2", + "@liveblocks/react-ui": "3.15.0-thread2", "@radix-ui/react-select": "^2.1.7", "@types/node": "20.3.3", "@types/react-dom": "18.2.25", diff --git a/examples/nextjs-linear-like-issue-tracker/src/components/Comments.tsx b/examples/nextjs-linear-like-issue-tracker/src/components/Comments.tsx index 172079d7a0..2225fdce07 100644 --- a/examples/nextjs-linear-like-issue-tracker/src/components/Comments.tsx +++ b/examples/nextjs-linear-like-issue-tracker/src/components/Comments.tsx @@ -5,11 +5,45 @@ import { useRoom, ClientSideSuspense, } from "@liveblocks/react/suspense"; +import { useOthers, useSelf } from "@liveblocks/react"; import { ThreadData } from "@liveblocks/client"; import { Composer, Thread, Comment, Icon } from "@liveblocks/react-ui"; -import { useState } from "react"; +import { ComponentPropsWithoutRef, useState } from "react"; import { getIssueId } from "@/config"; +function useUserIdPresence(userId: string) { + const isSelf = useSelf((self) => self.id === userId) ?? false; + const isOther = + useOthers((others) => others.some((other) => other.id === userId)) ?? false; + return isSelf || isOther; +} + +function CommentAvatarWithPresence({ userId }: { userId: string }) { + const isPresent = useUserIdPresence(userId); + + return ( +
+ + {isPresent && ( +
+ )} +
+ ); +} + +function CommentWithPresence({ + comment, + ...props +}: ComponentPropsWithoutRef) { + return ( + } + /> + ); +} + export function Comments() { return ( <> @@ -70,6 +104,7 @@ function CustomThread({ thread }: { thread: ThreadData }) { setOpen(false); } }} + components={{ Comment: CommentWithPresence }} // Adding a custom dropdown item to each comment commentDropdownItems={({ children, comment }) => ( <> diff --git a/examples/nextjs-linear-like-issue-tracker/src/components/Presence.tsx b/examples/nextjs-linear-like-issue-tracker/src/components/Presence.tsx index c6adc21ab6..60d57e7a6f 100644 --- a/examples/nextjs-linear-like-issue-tracker/src/components/Presence.tsx +++ b/examples/nextjs-linear-like-issue-tracker/src/components/Presence.tsx @@ -10,7 +10,7 @@ export function Presence() { return ( +
} > 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" diff --git a/examples/nuxtjs-live-avatars/package-lock.json b/examples/nuxtjs-live-avatars/package-lock.json index eecfda9c47..f77fe21f34 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" @@ -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": { 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" diff --git a/guides/guides.json b/guides/guides.json index 406332e2e4..c758004641 100644 --- a/guides/guides.json +++ b/guides/guides.json @@ -504,5 +504,12 @@ "technologies": ["react", "nodejs"], "date": "2026-02-20", "featured": true + }, + { + "title": "How to add users to Liveblocks presence components", + "path": "/how-to-add-users-to-liveblocks-presence-components", + "topics": ["presence", "tutorials", "data-fetching"], + "technologies": ["react-ui", "react"], + "date": "2026-03-04" } ] diff --git a/guides/pages/how-to-add-users-to-liveblocks-presence-components.mdx b/guides/pages/how-to-add-users-to-liveblocks-presence-components.mdx new file mode 100644 index 0000000000..9f715a6817 --- /dev/null +++ b/guides/pages/how-to-add-users-to-liveblocks-presence-components.mdx @@ -0,0 +1,191 @@ +--- +meta: + title: "How to add users to Liveblocks presence components" + description: + "Learn how to add your user’s avatars and names to Liveblocks avatar stack + and cursors componentsusing the resolver functions." +--- + +After following the get started guide for presence components, you’ll notice +that each user is currently “Anonymous”, and that there’s no way to mention or +tag other users. To enable these features, we need to tell Liveblocks where to +find your users’ information. + +
+ Cursors with resolved users +
+ +## What we’re learning + +In this guide we’ll be modifying +[`LiveblocksProvider`](/docs/api-reference/liveblocks-react#LiveblocksProvider), +learning how to: + +- Authenticate your application with + [`authEndpoint`](/docs/api-reference/liveblocks-react#LiveblocksProviderAuthEndpoint) + and [`identifyUser`](/docs/api-reference/liveblocks-node#id-tokens). +- Add names and avatars to threads and comments with + [`resolveUsers`](/docs/api-reference/liveblocks-react#resolveUsers). + +## Authenticate your application + +The first step is to find an +[authentication guide for your framework](/docs/authentication) and authenticate +your app, as this is necessary for adding users. Here’s an example using ID +token authentication, our recommended method, with an email address as a user’s +ID. + +```ts title="Metadata in ID tokens" +const { status, body } = await liveblocks.identifyUser( + { + userId: "marc@example.com", + + // Optional + // organizationId: "org-id", + // groupIds: ["group-id-1", "group-id-2"], + }, + { + userInfo: { + // Optional, custom metadata + // ... + }, + } +); +``` + +## Resolving users + +To show each user’s name and avatar in the ready-made +[`AvatarStack`](/docs/api-reference/liveblocks-react-ui#AvatarStack) and +[`Cursors`](/docs/api-reference/liveblocks-react-ui#Cursors) components, we need +to use +[`resolveUsers`](https://liveblocks.io/docs/api-reference/liveblocks-client#resolveUsers). + +
+ Avatar stack with resolved users +
+ + + + Add the function to your LiveblocksProvider + + The [`resolveUsers`](/docs/api-reference/liveblocks-react#LiveblocksProviderResolveUsers) function is passed as an option to + [`LiveblocksProvider`](/docs/api-reference/liveblocks-react#LiveblocksProvider)—let’s add it. This function + provides you with `userIds`, an array of user IDs that have interacted with Comments. + These `userIds` match the IDs set when authenticating users in your app. + + ```tsx highlight="2-8" + { + // ["marc@example.com", ...] + console.log(userIds); + + // Return a list of users + // ... + }} + + // ... + />; + ``` + + + + + + Return your users + + `resolveUsers` requires you to return a list of users in + the `UserMeta["info"]` format we set earlier. Remember + that _name_ and _avatar_ are required for the default components, + but you can also use any other metadata in your app. + + ```tsx highlight="7-16" + { + // ["marc@example.com", ...] + console.log(userIds); + + // Return a list of users + return [ + { + name: "Marc", + avatar: "https://example.com/marc.png", + + // Your custom metadata + // ... + }, + // ... + ]; + }} + + // ... + />; + ``` + + We’re only returning one user here, but make sure to return an + array containing each user, in the same order you received the IDs. + + + + + + Real-world example + + In your real application you’ll probably be getting users from your + API endpoint and database via `fetch`. This is how we’d recommend + building out this function. + + ```tsx highlight="3-7" + { + // Get users from your back end + const users = await __fetchUsers__(userIds); + + // Return a list of users + return users; + }} + + // ... + />; + ``` + + + + + + Users are now visible + + After adding this, you should now be able to see your users in threads! + +
+ Avatar stack with resolved users +
+ +
+ +
+
+ +## Next steps + +You’re now ready to start building your multiplayer Liveblocks application! +Here’s where you can learn more: + +- [Overview](/docs/ready-made-features/multiplayer) +- [API reference](/docs/api-reference/liveblocks-react) +- [Examples](/examples/browse/comments) diff --git a/package-lock.json b/package-lock.json index 7fdc3b20bc..307e1c0538 100644 --- a/package-lock.json +++ b/package-lock.json @@ -410,50 +410,6 @@ "playwright": "^1.55.0" } }, - "e2e/next-sandbox/node_modules/@eslint/config-array": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@eslint/object-schema": "^2.1.7", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "e2e/next-sandbox/node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@eslint/core": "^0.17.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "e2e/next-sandbox/node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, "e2e/next-sandbox/node_modules/@eslint/eslintrc": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", @@ -478,35 +434,6 @@ "url": "https://opencollective.com/eslint" } }, - "e2e/next-sandbox/node_modules/@eslint/js": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", - "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "e2e/next-sandbox/node_modules/@eslint/plugin-kit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@eslint/core": "^0.17.0", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, "e2e/next-sandbox/node_modules/@reduxjs/toolkit": { "version": "2.8.2", "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.8.2.tgz", @@ -539,101 +466,6 @@ "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", "license": "MIT" }, - "e2e/next-sandbox/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "e2e/next-sandbox/node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "e2e/next-sandbox/node_modules/eslint": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", - "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.1", - "@eslint/config-helpers": "^0.4.2", - "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.2", - "@eslint/plugin-kit": "^0.4.1", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, "e2e/next-sandbox/node_modules/eslint-config-next": { "version": "16.1.4", "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.1.4.tgz", @@ -725,35 +557,6 @@ "url": "https://opencollective.com/eslint" } }, - "e2e/next-sandbox/node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "e2e/next-sandbox/node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, "e2e/next-sandbox/node_modules/globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", @@ -880,6 +683,31 @@ } } }, + "e2e/nextjs-components-playground": { + "name": "@liveblocks-examples/nextjs-components-playground", + "extraneous": true, + "license": "Apache-2.0", + "dependencies": { + "@liveblocks/client": "file:../../packages/liveblocks-client", + "@liveblocks/node": "file:../../packages/liveblocks-node", + "@liveblocks/react": "file:../../packages/liveblocks-react", + "@liveblocks/react-ui": "file:../../packages/liveblocks-react-ui", + "ag-grid-community": "^35.1.0", + "ag-grid-react": "^35.1.0", + "next": "^16.1.6", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-error-boundary": "^4.0.13" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4.1.18", + "@types/node": "^20.4.10", + "@types/react": "^18.3.27", + "prettier": "^3.3.3", + "tailwindcss": "^4.1.18", + "typescript": "^5.4.5" + } + }, "e2e/node-sandbox": { "version": "1.0.0", "license": "ISC", @@ -946,6 +774,31 @@ "typescript": "^5" } }, + "examples/nextjs-comments-playground": { + "name": "@liveblocks-examples/nextjs-comments-playground", + "extraneous": true, + "license": "Apache-2.0", + "dependencies": { + "@liveblocks/client": "file:../../packages/liveblocks-client", + "@liveblocks/node": "file:../../packages/liveblocks-node", + "@liveblocks/react": "file:../../packages/liveblocks-react", + "@liveblocks/react-ui": "file:../../packages/liveblocks-react-ui", + "ag-grid-community": "^35.1.0", + "ag-grid-react": "^35.1.0", + "next": "^16.1.6", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-error-boundary": "^4.0.13" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4.1.18", + "@types/node": "^20.4.10", + "@types/react": "^18.3.27", + "prettier": "^3.3.3", + "tailwindcss": "^4.1.18", + "typescript": "^5.4.5" + } + }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", "license": "MIT", @@ -1249,17 +1102,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/types": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-compilation-targets": { "version": "7.24.6", "license": "MIT", @@ -1350,45 +1192,6 @@ "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.6", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.2", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, "node_modules/@babel/helper-environment-visitor": { "version": "7.24.6", "license": "MIT", @@ -1471,22 +1274,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.6", - "@babel/helper-environment-visitor": "^7.24.6", - "@babel/helper-wrap-function": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, "node_modules/@babel/helper-replace-supers": { "version": "7.24.6", "license": "MIT", @@ -1553,19 +1340,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-function-name": "^7.24.6", - "@babel/template": "^7.24.6", - "@babel/types": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helpers": { "version": "7.24.6", "license": "MIT", @@ -1660,66 +1434,6 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6", - "@babel/plugin-transform-optional-chaining": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, "node_modules/@babel/plugin-proposal-class-properties": { "version": "7.18.6", "license": "MIT", @@ -1763,17 +1477,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "license": "MIT", @@ -1804,42 +1507,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-flow": { "version": "7.24.6", "license": "MIT", @@ -1853,34 +1520,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", "license": "MIT", @@ -1974,10 +1613,9 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { + "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -1988,11 +1626,11 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.24.6", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -2001,11 +1639,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-typescript": { + "node_modules/@babel/plugin-transform-flow-strip-types": { "version": "7.24.6", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/plugin-syntax-flow": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -2014,27 +1653,29 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.24.6", "license": "MIT", - "peer": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-simple-access": "^7.24.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-arrow-functions": { + "node_modules/@babel/plugin-transform-typescript": { "version": "7.24.6", "license": "MIT", - "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/plugin-syntax-typescript": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -2043,15 +1684,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-async-generator-functions": { + "node_modules/@babel/preset-flow": { "version": "7.24.6", "license": "MIT", - "peer": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.24.6", "@babel/helper-plugin-utils": "^7.24.6", - "@babel/helper-remap-async-to-generator": "^7.24.6", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/helper-validator-option": "^7.24.6", + "@babel/plugin-transform-flow-strip-types": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -2060,14 +1699,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-async-to-generator": { + "node_modules/@babel/preset-typescript": { "version": "7.24.6", "license": "MIT", - "peer": true, "dependencies": { - "@babel/helper-module-imports": "^7.24.6", "@babel/helper-plugin-utils": "^7.24.6", - "@babel/helper-remap-async-to-generator": "^7.24.6" + "@babel/helper-validator-option": "^7.24.6", + "@babel/plugin-syntax-jsx": "^7.24.6", + "@babel/plugin-transform-modules-commonjs": "^7.24.6", + "@babel/plugin-transform-typescript": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -2076,12 +1716,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { + "node_modules/@babel/register": { "version": "7.24.6", "license": "MIT", - "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" + "clone-deep": "^4.0.1", + "find-cache-dir": "^2.0.0", + "make-dir": "^2.1.0", + "pirates": "^4.0.6", + "source-map-support": "^0.5.16" }, "engines": { "node": ">=6.9.0" @@ -2090,1243 +1733,381 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.6", + "node_modules/@babel/register/node_modules/make-dir": { + "version": "2.1.0", "license": "MIT", - "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" + "pify": "^4.0.1", + "semver": "^5.6.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=6" } }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.24.6", + "node_modules/@babel/register/node_modules/pify": { + "version": "4.0.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/register/node_modules/semver": { + "version": "5.7.2", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@babel/register/node_modules/source-map-support": { + "version": "0.5.21", "license": "MIT", - "peer": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.19.4", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.13.4" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-class-static-block": { + "node_modules/@babel/template": { "version": "7.24.6", "license": "MIT", - "peer": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/plugin-syntax-class-static-block": "^7.14.5" + "@babel/code-frame": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" } }, - "node_modules/@babel/plugin-transform-classes": { + "node_modules/@babel/traverse": { "version": "7.24.6", "license": "MIT", - "peer": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.6", - "@babel/helper-compilation-targets": "^7.24.6", + "@babel/code-frame": "^7.24.6", + "@babel/generator": "^7.24.6", "@babel/helper-environment-visitor": "^7.24.6", "@babel/helper-function-name": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/helper-replace-supers": "^7.24.6", + "@babel/helper-hoist-variables": "^7.24.6", "@babel/helper-split-export-declaration": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/types": "^7.24.6", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-classes/node_modules/globals": { + "node_modules/@babel/traverse/node_modules/globals": { "version": "11.12.0", "license": "MIT", - "peer": true, "engines": { "node": ">=4" } }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.6", + "node_modules/@babel/types": { + "version": "7.26.9", "license": "MIT", - "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/template": "^7.24.6" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "license": "MIT" }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.6", - "license": "MIT", + "node_modules/@blocknote/core": { + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/@blocknote/core/-/core-0.47.0.tgz", + "integrity": "sha512-i8QwAA8z/T97ZKPQy/8GTUicy3xBZy7xcR0fH/qA2xQq0xIaE7AZT92nS1sDvohxUsTJVNQBZ/zkpGKGj4Eq8g==", + "license": "MPL-2.0", "peer": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" + "@emoji-mart/data": "^1.2.1", + "@handlewithcare/prosemirror-inputrules": "^0.1.4", + "@shikijs/types": "^3", + "@tanstack/store": "^0.7.7", + "@tiptap/core": "^3.13.0", + "@tiptap/extension-bold": "^3.13.0", + "@tiptap/extension-code": "^3.13.0", + "@tiptap/extension-horizontal-rule": "^3.13.0", + "@tiptap/extension-italic": "^3.13.0", + "@tiptap/extension-link": "^3.13.0", + "@tiptap/extension-paragraph": "^3.13.0", + "@tiptap/extension-strike": "^3.13.0", + "@tiptap/extension-text": "^3.13.0", + "@tiptap/extension-underline": "^3.13.0", + "@tiptap/extensions": "^3.13.0", + "@tiptap/pm": "^3.13.0", + "emoji-mart": "^5.6.0", + "fast-deep-equal": "^3.1.3", + "hast-util-from-dom": "^5.0.1", + "prosemirror-dropcursor": "^1.8.2", + "prosemirror-highlight": "^0.13.0", + "prosemirror-model": "^1.25.4", + "prosemirror-state": "^1.4.4", + "prosemirror-tables": "^1.8.3", + "prosemirror-transform": "^1.10.5", + "prosemirror-view": "^1.41.4", + "rehype-format": "^5.0.1", + "rehype-parse": "^9.0.1", + "rehype-remark": "^10.0.1", + "rehype-stringify": "^10.0.1", + "remark-gfm": "^4.0.1", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.2", + "remark-stringify": "^11.0.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.0.0", + "uuid": "^8.3.2", + "y-prosemirror": "^1.3.7", + "y-protocols": "^1.0.6", + "yjs": "^13.6.27" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@hocuspocus/provider": "^2.15.2 || ^3.0.0" + }, + "peerDependenciesMeta": { + "@hocuspocus/provider": { + "optional": true + } } }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.6", - "license": "MIT", + "node_modules/@blocknote/core/node_modules/highlight.js": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz", + "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==", + "license": "BSD-3-Clause", + "optional": true, "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=12.0.0" } }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.24.6", + "node_modules/@blocknote/core/node_modules/prosemirror-highlight": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/prosemirror-highlight/-/prosemirror-highlight-0.13.1.tgz", + "integrity": "sha512-41EwMJDUeFBxizPP1/msQBjDke1YyaTy40w3CGoc7fjXboDBgyhz2LWThwaygL9LkDvBqn4pwBJg1PNtrNilGg==", "license": "MIT", "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" + "funding": { + "url": "https://github.com/sponsors/ocavue" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@shikijs/types": "^1.29.2 || ^2.0.0 || ^3.0.0", + "@types/hast": "^3.0.0", + "highlight.js": "^11.9.0", + "lowlight": "^3.1.0", + "prosemirror-model": "^1.19.3", + "prosemirror-state": "^1.4.3", + "prosemirror-transform": "^1.8.0", + "prosemirror-view": "^1.32.4", + "refractor": "^5.0.0", + "sugar-high": "^0.6.1 || ^0.7.0 || ^0.8.0 || ^0.9.0" + }, + "peerDependenciesMeta": { + "@shikijs/types": { + "optional": true + }, + "@types/hast": { + "optional": true + }, + "highlight.js": { + "optional": true + }, + "lowlight": { + "optional": true + }, + "prosemirror-model": { + "optional": true + }, + "prosemirror-state": { + "optional": true + }, + "prosemirror-transform": { + "optional": true + }, + "prosemirror-view": { + "optional": true + }, + "refractor": { + "optional": true + }, + "sugar-high": { + "optional": true + } } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.6", - "license": "MIT", + "node_modules/@blocknote/react": { + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/@blocknote/react/-/react-0.47.0.tgz", + "integrity": "sha512-RgLCrccVCVySlnxSKoJfu1nHcJeahpgZQeQrLnVBqLMXicy4nB5vy5QYh5qQGFl7vaRGN3RVduDAZfOp96TF1g==", + "license": "MPL-2.0", "peer": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" + "@blocknote/core": "0.47.0", + "@emoji-mart/data": "^1.2.1", + "@floating-ui/react": "^0.27.16", + "@floating-ui/utils": "0.2.10", + "@tanstack/react-store": "0.7.7", + "@tiptap/core": "^3.13.0", + "@tiptap/pm": "^3.13.0", + "@tiptap/react": "^3.13.0", + "@types/use-sync-external-store": "1.5.0", + "emoji-mart": "^5.6.0", + "fast-deep-equal": "^3.1.3", + "lodash.merge": "^4.6.2", + "react-icons": "^5.5.0", + "use-sync-external-store": "1.6.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "react": "^18.0 || ^19.0 || >= 19.0.0-rc", + "react-dom": "^18.0 || ^19.0 || >= 19.0.0-rc" } }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.24.6", + "node_modules/@blocknote/react/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", "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.24.6", - "license": "MIT", + "node_modules/@bundled-es-modules/cookie": { + "version": "2.0.1", + "dev": true, + "license": "ISC", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/plugin-syntax-flow": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "cookie": "^0.7.2" } }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.6", + "node_modules/@bundled-es-modules/cookie/node_modules/cookie": { + "version": "0.7.2", + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 0.6" } }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.24.6", - "license": "MIT", - "peer": true, + "node_modules/@bundled-es-modules/statuses": { + "version": "1.0.1", + "dev": true, + "license": "ISC", "dependencies": { - "@babel/helper-compilation-targets": "^7.24.6", - "@babel/helper-function-name": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "statuses": "^2.0.1" } }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.24.6", - "license": "MIT", - "peer": true, + "node_modules/@bundled-es-modules/tough-cookie": { + "version": "0.1.6", + "dev": true, + "license": "ISC", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/tough-cookie": "^4.0.5", + "tough-cookie": "^4.1.4" } }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.24.6", + "node_modules/@colors/colors": { + "version": "1.5.0", + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" - }, + "optional": true, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=0.1.90" } }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, + "node_modules/@csstools/color-helpers": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz", + "integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.6", + "node_modules/@csstools/css-parser-algorithms": { + "version": "2.3.1", + "devOptional": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" - }, "engines": { - "node": ">=6.9.0" + "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@csstools/css-tokenizer": "^2.2.0" } }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.6", + "node_modules/@csstools/css-tokenizer": { + "version": "2.2.0", + "devOptional": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^14 || ^16 || >=18" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.6", + "node_modules/@csstools/media-query-list-parser": { + "version": "2.1.4", + "devOptional": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/helper-simple-access": "^7.24.6" - }, "engines": { - "node": ">=6.9.0" + "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-hoist-variables": "^7.24.6", - "@babel/helper-module-transforms": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/helper-validator-identifier": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/helper-replace-supers": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.6", - "@babel/helper-create-class-features-plugin": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", - "regenerator-transform": "^0.15.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.24.6", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.6", - "@babel/helper-create-class-features-plugin": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/plugin-syntax-typescript": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.24.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/compat-data": "^7.24.6", - "@babel/helper-compilation-targets": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/helper-validator-option": "^7.24.6", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.6", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.6", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.6", - "@babel/plugin-syntax-import-attributes": "^7.24.6", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.6", - "@babel/plugin-transform-async-generator-functions": "^7.24.6", - "@babel/plugin-transform-async-to-generator": "^7.24.6", - "@babel/plugin-transform-block-scoped-functions": "^7.24.6", - "@babel/plugin-transform-block-scoping": "^7.24.6", - "@babel/plugin-transform-class-properties": "^7.24.6", - "@babel/plugin-transform-class-static-block": "^7.24.6", - "@babel/plugin-transform-classes": "^7.24.6", - "@babel/plugin-transform-computed-properties": "^7.24.6", - "@babel/plugin-transform-destructuring": "^7.24.6", - "@babel/plugin-transform-dotall-regex": "^7.24.6", - "@babel/plugin-transform-duplicate-keys": "^7.24.6", - "@babel/plugin-transform-dynamic-import": "^7.24.6", - "@babel/plugin-transform-exponentiation-operator": "^7.24.6", - "@babel/plugin-transform-export-namespace-from": "^7.24.6", - "@babel/plugin-transform-for-of": "^7.24.6", - "@babel/plugin-transform-function-name": "^7.24.6", - "@babel/plugin-transform-json-strings": "^7.24.6", - "@babel/plugin-transform-literals": "^7.24.6", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.6", - "@babel/plugin-transform-member-expression-literals": "^7.24.6", - "@babel/plugin-transform-modules-amd": "^7.24.6", - "@babel/plugin-transform-modules-commonjs": "^7.24.6", - "@babel/plugin-transform-modules-systemjs": "^7.24.6", - "@babel/plugin-transform-modules-umd": "^7.24.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.6", - "@babel/plugin-transform-new-target": "^7.24.6", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.6", - "@babel/plugin-transform-numeric-separator": "^7.24.6", - "@babel/plugin-transform-object-rest-spread": "^7.24.6", - "@babel/plugin-transform-object-super": "^7.24.6", - "@babel/plugin-transform-optional-catch-binding": "^7.24.6", - "@babel/plugin-transform-optional-chaining": "^7.24.6", - "@babel/plugin-transform-parameters": "^7.24.6", - "@babel/plugin-transform-private-methods": "^7.24.6", - "@babel/plugin-transform-private-property-in-object": "^7.24.6", - "@babel/plugin-transform-property-literals": "^7.24.6", - "@babel/plugin-transform-regenerator": "^7.24.6", - "@babel/plugin-transform-reserved-words": "^7.24.6", - "@babel/plugin-transform-shorthand-properties": "^7.24.6", - "@babel/plugin-transform-spread": "^7.24.6", - "@babel/plugin-transform-sticky-regex": "^7.24.6", - "@babel/plugin-transform-template-literals": "^7.24.6", - "@babel/plugin-transform-typeof-symbol": "^7.24.6", - "@babel/plugin-transform-unicode-escapes": "^7.24.6", - "@babel/plugin-transform-unicode-property-regex": "^7.24.6", - "@babel/plugin-transform-unicode-regex": "^7.24.6", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.6", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.4", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/preset-flow": { - "version": "7.24.6", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/helper-validator-option": "^7.24.6", - "@babel/plugin-transform-flow-strip-types": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.24.6", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/helper-validator-option": "^7.24.6", - "@babel/plugin-syntax-jsx": "^7.24.6", - "@babel/plugin-transform-modules-commonjs": "^7.24.6", - "@babel/plugin-transform-typescript": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/register": { - "version": "7.24.6", - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "find-cache-dir": "^2.0.0", - "make-dir": "^2.1.0", - "pirates": "^4.0.6", - "source-map-support": "^0.5.16" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/register/node_modules/make-dir": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/register/node_modules/pify": { - "version": "4.0.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/register/node_modules/semver": { - "version": "5.7.2", - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@babel/register/node_modules/source-map-support": { - "version": "0.5.21", - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "license": "MIT", - "peer": true - }, - "node_modules/@babel/runtime": { - "version": "7.19.4", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.24.6", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.24.6", - "@babel/parser": "^7.24.6", - "@babel/types": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.24.6", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.24.6", - "@babel/generator": "^7.24.6", - "@babel/helper-environment-visitor": "^7.24.6", - "@babel/helper-function-name": "^7.24.6", - "@babel/helper-hoist-variables": "^7.24.6", - "@babel/helper-split-export-declaration": "^7.24.6", - "@babel/parser": "^7.24.6", - "@babel/types": "^7.24.6", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/types": { - "version": "7.26.9", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "license": "MIT" - }, - "node_modules/@blocknote/core": { - "version": "0.39.1", - "resolved": "https://registry.npmjs.org/@blocknote/core/-/core-0.39.1.tgz", - "integrity": "sha512-jUFNk8nUZG2soPt10kHi8bAg+SWt4KQ6s/Q5TiwEjboaqDEOd7P+6AOF3W8t1dqzlfnQDVR2L5tpwQkpGkTHVA==", - "license": "MPL-2.0", - "peer": true, - "dependencies": { - "@emoji-mart/data": "^1.2.1", - "@shikijs/types": "3.2.1", - "@tiptap/core": "^3.4.3", - "@tiptap/extension-bold": "^3", - "@tiptap/extension-code": "^3", - "@tiptap/extension-gapcursor": "^3", - "@tiptap/extension-history": "^3", - "@tiptap/extension-horizontal-rule": "^3", - "@tiptap/extension-italic": "^3", - "@tiptap/extension-link": "^3", - "@tiptap/extension-paragraph": "^3", - "@tiptap/extension-strike": "^3", - "@tiptap/extension-text": "^3", - "@tiptap/extension-underline": "^3", - "@tiptap/pm": "^3.4.3", - "emoji-mart": "^5.6.0", - "fast-deep-equal": "^3", - "hast-util-from-dom": "^5.0.1", - "prosemirror-dropcursor": "^1.8.2", - "prosemirror-highlight": "^0.13.0", - "prosemirror-model": "^1.25.3", - "prosemirror-state": "^1.4.3", - "prosemirror-tables": "^1.6.4", - "prosemirror-transform": "^1.10.4", - "prosemirror-view": "^1.40.1", - "rehype-format": "^5.0.1", - "rehype-parse": "^9.0.1", - "rehype-remark": "^10.0.1", - "rehype-stringify": "^10.0.1", - "remark-gfm": "^4.0.1", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.1.2", - "remark-stringify": "^11.0.0", - "unified": "^11.0.5", - "uuid": "^8.3.2", - "y-prosemirror": "^1.3.7", - "y-protocols": "^1.0.6", - "yjs": "^13.6.27" - }, - "peerDependencies": { - "@hocuspocus/provider": "^2.15.2" - }, - "peerDependenciesMeta": { - "@hocuspocus/provider": { - "optional": true - } - } - }, - "node_modules/@blocknote/core/node_modules/@tiptap/extension-history": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-3.4.6.tgz", - "integrity": "sha512-1gsRinRd0Q7kDw/8EpMBR5jy0J4bB3wLBqH9gLAFiTkZ72To1w5yuKBIxSBhUP660oiThi8Y1+c8nLhlGFaqHQ==", - "license": "MIT", - "peer": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/extensions": "^3.4.6" - } - }, - "node_modules/@blocknote/core/node_modules/prosemirror-highlight": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/prosemirror-highlight/-/prosemirror-highlight-0.13.0.tgz", - "integrity": "sha512-GIC2VCTUnukNdsEGLQWWOVpYPl/7/KrVp4xs7XMB48/4rhUrHK8hp8TEog4Irmv+2kmjx24RLnaisGOCP6U8jw==", - "license": "MIT", - "peer": true, - "funding": { - "url": "https://github.com/sponsors/ocavue" - }, - "peerDependencies": { - "@shikijs/types": "^1.29.2 || ^2.0.0 || ^3.0.0", - "@types/hast": "^3.0.0", - "highlight.js": "^11.9.0", - "lowlight": "^3.1.0", - "prosemirror-model": "^1.19.3", - "prosemirror-state": "^1.4.3", - "prosemirror-transform": "^1.8.0", - "prosemirror-view": "^1.32.4", - "refractor": "^5.0.0", - "sugar-high": "^0.6.1 || ^0.7.0 || ^0.8.0 || ^0.9.0" - }, - "peerDependenciesMeta": { - "@shikijs/types": { - "optional": true - }, - "@types/hast": { - "optional": true - }, - "highlight.js": { - "optional": true - }, - "lowlight": { - "optional": true - }, - "prosemirror-model": { - "optional": true - }, - "prosemirror-state": { - "optional": true - }, - "prosemirror-transform": { - "optional": true - }, - "prosemirror-view": { - "optional": true - }, - "refractor": { - "optional": true - }, - "sugar-high": { - "optional": true - } - } - }, - "node_modules/@blocknote/core/node_modules/uuid": { - "version": "8.3.2", - "license": "MIT", - "peer": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@blocknote/react": { - "version": "0.39.1", - "resolved": "https://registry.npmjs.org/@blocknote/react/-/react-0.39.1.tgz", - "integrity": "sha512-MyIcm5f3pZV04goL5bqRjlJhNZ+qadmtds1Sl9qet91GTSwyV9pnGnDErfZFrqDnXhRxudfkzyo/o8Q/FL5PZA==", - "license": "MPL-2.0", - "peer": true, - "dependencies": { - "@blocknote/core": "0.39.1", - "@emoji-mart/data": "^1.2.1", - "@floating-ui/react": "^0.27.16", - "@tiptap/core": "^3.4.3", - "@tiptap/pm": "^3.4.3", - "@tiptap/react": "^3.4.3", - "emoji-mart": "^5.6.0", - "lodash.merge": "^4.6.2", - "react-icons": "^5.2.1" - }, - "peerDependencies": { - "react": "^18.0 || ^19.0 || >= 19.0.0-rc", - "react-dom": "^18.0 || ^19.0 || >= 19.0.0-rc" - } - }, - "node_modules/@bundled-es-modules/cookie": { - "version": "2.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "cookie": "^0.7.2" - } - }, - "node_modules/@bundled-es-modules/cookie/node_modules/cookie": { - "version": "0.7.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@bundled-es-modules/statuses": { - "version": "1.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "statuses": "^2.0.1" - } - }, - "node_modules/@bundled-es-modules/tough-cookie": { - "version": "0.1.6", - "dev": true, - "license": "ISC", - "dependencies": { - "@types/tough-cookie": "^4.0.5", - "tough-cookie": "^4.1.4" - } - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@csstools/color-helpers": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz", - "integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - } - }, - "node_modules/@csstools/css-parser-algorithms": { - "version": "2.3.1", - "devOptional": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "@csstools/css-tokenizer": "^2.2.0" - } - }, - "node_modules/@csstools/css-tokenizer": { - "version": "2.2.0", - "devOptional": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18" - } - }, - "node_modules/@csstools/media-query-list-parser": { - "version": "2.1.4", - "devOptional": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.3.1", - "@csstools/css-tokenizer": "^2.2.0" + "@csstools/css-parser-algorithms": "^2.3.1", + "@csstools/css-tokenizer": "^2.2.0" } }, "node_modules/@csstools/sass-import-resolve": { @@ -3386,6 +2167,8 @@ }, "node_modules/@emoji-mart/data": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emoji-mart/data/-/data-1.2.1.tgz", + "integrity": "sha512-no2pQMWiBy6gpBEiqGeU77/bFejDqUTRY7KX+0+iur13op3bqUsXdnwoZs6Xb1zbv0gAj5VvS1PWoUUckSr5Dw==", "license": "MIT", "peer": true }, @@ -3960,13 +2743,13 @@ } }, "node_modules/@floating-ui/react": { - "version": "0.27.16", - "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.16.tgz", - "integrity": "sha512-9O8N4SeG2z++TSM8QA/KTeKFBVCNEz/AGS7gWPJf6KFRzmRWixFRnCnkPHRDwSVZW6QPDO6uT0P2SpWNKCc9/g==", + "version": "0.27.18", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.18.tgz", + "integrity": "sha512-xJWJxvmy3a05j643gQt+pRbht5XnTlGpsEsAPnMi5F5YTOEEJymA90uZKBD8OvIv5XvZ1qi4GcccSlqT3Bq44Q==", "license": "MIT", "peer": true, "dependencies": { - "@floating-ui/react-dom": "^2.1.6", + "@floating-ui/react-dom": "^2.1.7", "@floating-ui/utils": "^0.2.10", "tabbable": "^6.0.0" }, @@ -3988,9 +2771,9 @@ } }, "node_modules/@floating-ui/react/node_modules/@floating-ui/core": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", - "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.4.tgz", + "integrity": "sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==", "license": "MIT", "peer": true, "dependencies": { @@ -3998,24 +2781,24 @@ } }, "node_modules/@floating-ui/react/node_modules/@floating-ui/dom": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", - "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.5.tgz", + "integrity": "sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg==", "license": "MIT", "peer": true, "dependencies": { - "@floating-ui/core": "^1.7.3", + "@floating-ui/core": "^1.7.4", "@floating-ui/utils": "^0.2.10" } }, "node_modules/@floating-ui/react/node_modules/@floating-ui/react-dom": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz", - "integrity": "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.7.tgz", + "integrity": "sha512-0tLRojf/1Go2JgEVm+3Frg9A3IW8bJgKgdO0BN5RkF//ufuz2joZM63Npau2ff3J6lUVYgDSNzNkR+aH3IVfjg==", "license": "MIT", "peer": true, "dependencies": { - "@floating-ui/dom": "^1.7.4" + "@floating-ui/dom": "^1.7.5" }, "peerDependencies": { "react": ">=16.8.0", @@ -4028,6 +2811,22 @@ "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", "license": "MIT" }, + "node_modules/@handlewithcare/prosemirror-inputrules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@handlewithcare/prosemirror-inputrules/-/prosemirror-inputrules-0.1.4.tgz", + "integrity": "sha512-GMqlBeG2MKM+tXEFd2N+wIv5z4VvJTg8JtfJUrdjvFq2W6v+AW8oTgiWyFw8L3iEQwvtQcVJxU873iB0LXUNNw==", + "license": "MIT", + "peer": true, + "dependencies": { + "prosemirror-history": "^1.4.1", + "prosemirror-transform": "^1.0.0" + }, + "peerDependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-view": "^1.0.0" + } + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -16540,6 +15339,8 @@ }, "node_modules/@remirror/core-constants": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-3.0.0.tgz", + "integrity": "sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==", "license": "MIT", "peer": true }, @@ -16576,9 +15377,9 @@ "license": "MIT" }, "node_modules/@shikijs/types": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.2.1.tgz", - "integrity": "sha512-/NTWAk4KE2M8uac0RhOsIhYQf4pdU0OywQuYDGIGAJ6Mjunxl2cGiuLkvu4HLCMn+OTTLRWkjZITp+aYJv60yA==", + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.22.0.tgz", + "integrity": "sha512-491iAekgKDBFE67z70Ok5a8KBMsQ2IJwOWw3us/7ffQkIBCyOQfm/aNwVMBUriP02QshIfgHCBSIYAl3u2eWjg==", "license": "MIT", "peer": true, "dependencies": { @@ -17489,6 +16290,46 @@ "dev": true, "license": "MIT" }, + "node_modules/@tanstack/react-store": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/@tanstack/react-store/-/react-store-0.7.7.tgz", + "integrity": "sha512-qqT0ufegFRDGSof9D/VqaZgjNgp4tRPHZIJq2+QIHkMUtHjaJ0lYrrXjeIUJvjnTbgPfSD1XgOMEt0lmANn6Zg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@tanstack/store": "0.7.7", + "use-sync-external-store": "^1.5.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "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/@tanstack/react-store/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", + "peer": true, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@tanstack/store": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/@tanstack/store/-/store-0.7.7.tgz", + "integrity": "sha512-xa6pTan1bcaqYDS9BDpSiS63qa6EoDkPN9RsRaxHuDdVDNntzq3xNwR5YKTU/V3SkSyC9T4YVOPh2zRQN0nhIQ==", + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, "node_modules/@testing-library/dom": { "version": "8.20.1", "dev": true, @@ -17590,22 +16431,22 @@ } }, "node_modules/@tiptap/core": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-3.19.0.tgz", - "integrity": "sha512-bpqELwPW+DG8gWiD8iiFtSl4vIBooG5uVJod92Qxn3rA9nFatyXRr4kNbMJmOZ66ezUvmCjXVe/5/G4i5cyzKA==", + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-3.20.0.tgz", + "integrity": "sha512-aC9aROgia/SpJqhsXFiX9TsligL8d+oeoI8W3u00WI45s0VfsqjgeKQLDLF7Tu7hC+7F02teC84SAHuup003VQ==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/pm": "^3.19.0" + "@tiptap/pm": "^3.20.0" } }, "node_modules/@tiptap/extension-blockquote": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-3.19.0.tgz", - "integrity": "sha512-y3UfqY9KD5XwWz3ndiiJ089Ij2QKeiXy/g1/tlAN/F1AaWsnkHEHMLxCP1BIqmMpwsX7rZjMLN7G5Lp7c9682A==", + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-3.20.0.tgz", + "integrity": "sha512-LQzn6aGtL4WXz2+rYshl/7/VnP2qJTpD7fWL96GXAzhqviPEY1bJES7poqJb3MU/gzl8VJUVzVzU1VoVfUKlbA==", "license": "MIT", "peer": true, "funding": { @@ -17613,13 +16454,13 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.19.0" + "@tiptap/core": "^3.20.0" } }, "node_modules/@tiptap/extension-bold": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-3.19.0.tgz", - "integrity": "sha512-UZgb1d0XK4J/JRIZ7jW+s4S6KjuEDT2z1PPM6ugcgofgJkWQvRZelCPbmtSFd3kwsD+zr9UPVgTh9YIuGQ8t+Q==", + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-3.20.0.tgz", + "integrity": "sha512-sQklEWiyf58yDjiHtm5vmkVjfIc/cBuSusmCsQ0q9vGYnEF1iOHKhGpvnCeEXNeqF3fiJQRlquzt/6ymle3Iwg==", "license": "MIT", "peer": true, "funding": { @@ -17627,7 +16468,7 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.19.0" + "@tiptap/core": "^3.20.0" } }, "node_modules/@tiptap/extension-bubble-menu": { @@ -17670,9 +16511,9 @@ } }, "node_modules/@tiptap/extension-bullet-list": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-3.19.0.tgz", - "integrity": "sha512-F9uNnqd0xkJbMmRxVI5RuVxwB9JaCH/xtRqOUNQZnRBt7IdAElCY+Dvb4hMCtiNv+enGM/RFGJuFHR9TxmI7rw==", + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-3.20.0.tgz", + "integrity": "sha512-OcKMeopBbqWzhSi6o8nNz0aayogg1sfOAhto3NxJu3Ya32dwBFqmHXSYM6uW4jOphNvVPyjiq9aNRh3qTdd1dw==", "license": "MIT", "peer": true, "funding": { @@ -17680,13 +16521,13 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extension-list": "^3.19.0" + "@tiptap/extension-list": "^3.20.0" } }, "node_modules/@tiptap/extension-code": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-3.19.0.tgz", - "integrity": "sha512-2kqqQIXBXj2Or+4qeY3WoE7msK+XaHKL6EKOcKlOP2BW8eYqNTPzNSL+PfBDQ3snA7ljZQkTs/j4GYDj90vR1A==", + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-3.20.0.tgz", + "integrity": "sha512-TYDWFeSQ9umiyrqsT6VecbuhL8XIHkUhO+gEk0sVvH67ZLwjFDhAIIgWIr1/dbIGPcvMZM19E7xUUhAdIaXaOQ==", "license": "MIT", "peer": true, "funding": { @@ -17694,13 +16535,13 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.19.0" + "@tiptap/core": "^3.20.0" } }, "node_modules/@tiptap/extension-code-block": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-3.19.0.tgz", - "integrity": "sha512-b/2qR+tMn8MQb+eaFYgVk4qXnLNkkRYmwELQ8LEtEDQPxa5Vl7J3eu8+4OyoIFhZrNDZvvoEp80kHMCP8sI6rg==", + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-3.20.0.tgz", + "integrity": "sha512-lBbmNek14aCjrHcBcq3PRqWfNLvC6bcRa2Osc6e/LtmXlcpype4f6n+Yx+WZ+f2uUh0UmDRCz7BEyUETEsDmlQ==", "license": "MIT", "peer": true, "funding": { @@ -17708,14 +16549,14 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.19.0", - "@tiptap/pm": "^3.19.0" + "@tiptap/core": "^3.20.0", + "@tiptap/pm": "^3.20.0" } }, "node_modules/@tiptap/extension-document": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-3.19.0.tgz", - "integrity": "sha512-AOf0kHKSFO0ymjVgYSYDncRXTITdTcrj1tqxVazrmO60KNl1Rc2dAggDvIVTEBy5NvceF0scc7q3sE/5ZtVV7A==", + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-3.20.0.tgz", + "integrity": "sha512-oJfLIG3vAtZo/wg29WiBcyWt22KUgddpP8wqtCE+kY5Dw8znLR9ehNmVWlSWJA5OJUMO0ntAHx4bBT+I2MBd5w==", "license": "MIT", "peer": true, "funding": { @@ -17723,13 +16564,13 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.19.0" + "@tiptap/core": "^3.20.0" } }, "node_modules/@tiptap/extension-dropcursor": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-3.19.0.tgz", - "integrity": "sha512-sf3dEZXiLvsGqVK2maUIzXY6qtYYCvBumag7+VPTMGQ0D4hiZ1X/4ukt4+6VXDg5R2WP1CoIt/QvUetUjWNhbQ==", + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-3.20.0.tgz", + "integrity": "sha512-d+cxplRlktVgZPwatnc34IArlppM0IFKS1J5wLk+ba1jidizsbMVh45tP/BTK2flhyfRqcNoB5R0TArhUpbkNQ==", "license": "MIT", "peer": true, "funding": { @@ -17737,13 +16578,13 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extensions": "^3.19.0" + "@tiptap/extensions": "^3.20.0" } }, "node_modules/@tiptap/extension-gapcursor": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-3.19.0.tgz", - "integrity": "sha512-w7DACS4oSZaDWjz7gropZHPc9oXqC9yERZTcjWxyORuuIh1JFf0TRYspleK+OK28plK/IftojD/yUDn1MTRhvA==", + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-3.20.0.tgz", + "integrity": "sha512-P/LasfvG9/qFq43ZAlNbAnPnXC+/RJf49buTrhtFvI9Zg0+Lbpjx1oh6oMHB19T88Y28KtrckfFZ8aTSUWDq6w==", "license": "MIT", "peer": true, "funding": { @@ -17751,13 +16592,13 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extensions": "^3.19.0" + "@tiptap/extensions": "^3.20.0" } }, "node_modules/@tiptap/extension-hard-break": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-3.19.0.tgz", - "integrity": "sha512-lAmQraYhPS5hafvCl74xDB5+bLuNwBKIEsVoim35I0sDJj5nTrfhaZgMJ91VamMvT+6FF5f1dvBlxBxAWa8jew==", + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-3.20.0.tgz", + "integrity": "sha512-rqvhMOw4f+XQmEthncbvDjgLH6fz8L9splnKZC7OeS0eX8b0qd7+xI1u5kyxF3KA2Z0BnigES++jjWuecqV6mA==", "license": "MIT", "peer": true, "funding": { @@ -17765,13 +16606,13 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.19.0" + "@tiptap/core": "^3.20.0" } }, "node_modules/@tiptap/extension-heading": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-3.19.0.tgz", - "integrity": "sha512-uLpLlfyp086WYNOc0ekm1gIZNlEDfmzOhKzB0Hbyi6jDagTS+p9mxUNYeYOn9jPUxpFov43+Wm/4E24oY6B+TQ==", + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-3.20.0.tgz", + "integrity": "sha512-JgJhurnCe3eN6a0lEsNQM/46R1bcwzwWWZEFDSb1P9dR8+t1/5v7cMZWsSInpD7R4/74iJn0+M5hcXLwCmBmYA==", "license": "MIT", "peer": true, "funding": { @@ -17779,13 +16620,13 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.19.0" + "@tiptap/core": "^3.20.0" } }, "node_modules/@tiptap/extension-horizontal-rule": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-3.19.0.tgz", - "integrity": "sha512-iqUHmgMGhMgYGwG6L/4JdelVQ5Mstb4qHcgTGd/4dkcUOepILvhdxajPle7OEdf9sRgjQO6uoAU5BVZVC26+ng==", + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-3.20.0.tgz", + "integrity": "sha512-6uvcutFMv+9wPZgptDkbRDjAm3YVxlibmkhWD5GuaWwS9L/yUtobpI3GycujRSUZ8D3q6Q9J7LqpmQtQRTalWA==", "license": "MIT", "peer": true, "funding": { @@ -17793,14 +16634,14 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.19.0", - "@tiptap/pm": "^3.19.0" + "@tiptap/core": "^3.20.0", + "@tiptap/pm": "^3.20.0" } }, "node_modules/@tiptap/extension-italic": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-3.19.0.tgz", - "integrity": "sha512-6GffxOnS/tWyCbDkirWNZITiXRta9wrCmrfa4rh+v32wfaOL1RRQNyqo9qN6Wjyl1R42Js+yXTzTTzZsOaLMYA==", + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-3.20.0.tgz", + "integrity": "sha512-/DhnKQF8yN8RxtuL8abZ28wd5281EaGoE2Oha35zXSOF1vNYnbyt8Ymkv/7u1BcWEWTvRPgaju0YCGXisPRLYw==", "license": "MIT", "peer": true, "funding": { @@ -17808,13 +16649,13 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.19.0" + "@tiptap/core": "^3.20.0" } }, "node_modules/@tiptap/extension-link": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-3.19.0.tgz", - "integrity": "sha512-HEGDJnnCPfr7KWu7Dsq+eRRe/mBCsv6DuI+7fhOCLDJjjKzNgrX2abbo/zG3D/4lCVFaVb+qawgJubgqXR/Smw==", + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-3.20.0.tgz", + "integrity": "sha512-qI/5A+R0ZWBxo/8HxSn1uOyr7odr3xHBZ/gzOR1GUJaZqjlJxkWFX0RtXMbLKEGEvT25o345cF7b0wFznEh8qA==", "license": "MIT", "peer": true, "dependencies": { @@ -17825,14 +16666,14 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.19.0", - "@tiptap/pm": "^3.19.0" + "@tiptap/core": "^3.20.0", + "@tiptap/pm": "^3.20.0" } }, "node_modules/@tiptap/extension-list": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-list/-/extension-list-3.19.0.tgz", - "integrity": "sha512-N6nKbFB2VwMsPlCw67RlAtYSK48TAsAUgjnD+vd3ieSlIufdQnLXDFUP6hFKx9mwoUVUgZGz02RA6bkxOdYyTw==", + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list/-/extension-list-3.20.0.tgz", + "integrity": "sha512-+V0/gsVWAv+7vcY0MAe6D52LYTIicMSHw00wz3ISZgprSb2yQhJ4+4gurOnUrQ4Du3AnRQvxPROaofwxIQ66WQ==", "license": "MIT", "peer": true, "funding": { @@ -17840,14 +16681,14 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.19.0", - "@tiptap/pm": "^3.19.0" + "@tiptap/core": "^3.20.0", + "@tiptap/pm": "^3.20.0" } }, "node_modules/@tiptap/extension-list-item": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-3.19.0.tgz", - "integrity": "sha512-VsSKuJz4/Tb6ZmFkXqWpDYkRzmaLTyE6dNSEpNmUpmZ32sMqo58mt11/huADNwfBFB0Ve7siH/VnFNIJYY3xvg==", + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-3.20.0.tgz", + "integrity": "sha512-qEtjaaGPuqaFB4VpLrGDoIe9RHnckxPfu6d3rc22ap6TAHCDyRv05CEyJogqccnFceG/v5WN4znUBER8RWnWHA==", "license": "MIT", "peer": true, "funding": { @@ -17855,13 +16696,13 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extension-list": "^3.19.0" + "@tiptap/extension-list": "^3.20.0" } }, "node_modules/@tiptap/extension-list-keymap": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-list-keymap/-/extension-list-keymap-3.19.0.tgz", - "integrity": "sha512-bxgmAgA3RzBGA0GyTwS2CC1c+QjkJJq9hC+S6PSOWELGRiTbwDN3MANksFXLjntkTa0N5fOnL27vBHtMStURqw==", + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list-keymap/-/extension-list-keymap-3.20.0.tgz", + "integrity": "sha512-Z4GvKy04Ms4cLFN+CY6wXswd36xYsT2p/YL0V89LYFMZTerOeTjFYlndzn6svqL8NV1PRT5Diw4WTTxJSmcJPA==", "license": "MIT", "peer": true, "funding": { @@ -17869,13 +16710,13 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extension-list": "^3.19.0" + "@tiptap/extension-list": "^3.20.0" } }, "node_modules/@tiptap/extension-ordered-list": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-3.19.0.tgz", - "integrity": "sha512-cxGsINquwHYE1kmhAcLNLHAofmoDEG6jbesR5ybl7tU5JwtKVO7S/xZatll2DU1dsDAXWPWEeeMl4e/9svYjCg==", + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-3.20.0.tgz", + "integrity": "sha512-jVKnJvrizLk7etwBMfyoj6H2GE4M+PD4k7Bwp6Bh1ohBWtfIA1TlngdS842Mx5i1VB2e3UWIwr8ZH46gl6cwMA==", "license": "MIT", "peer": true, "funding": { @@ -17883,13 +16724,13 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extension-list": "^3.19.0" + "@tiptap/extension-list": "^3.20.0" } }, "node_modules/@tiptap/extension-paragraph": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-3.19.0.tgz", - "integrity": "sha512-xWa6gj82l5+AzdYyrSk9P4ynySaDzg/SlR1FarXE5yPXibYzpS95IWaVR0m2Qaz7Rrk+IiYOTGxGRxcHLOelNg==", + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-3.20.0.tgz", + "integrity": "sha512-mM99zK4+RnEXIMCv6akfNATAs0Iija6FgyFA9J9NZ6N4o8y9QiNLLa6HjLpAC+W+VoCgQIekyoF/Q9ftxmAYDQ==", "license": "MIT", "peer": true, "funding": { @@ -17897,13 +16738,13 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.19.0" + "@tiptap/core": "^3.20.0" } }, "node_modules/@tiptap/extension-strike": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-3.19.0.tgz", - "integrity": "sha512-xYpabHsv7PccLUBQaP8AYiFCnYbx6P93RHPd0lgNwhdOjYFd931Zy38RyoxPHAgbYVmhf1iyx7lpuLtBnhS5dA==", + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-3.20.0.tgz", + "integrity": "sha512-0vcTZRRAiDfon3VM1mHBr9EFmTkkUXMhm0Xtdtn0bGe+sIqufyi+hUYTEw93EQOD9XNsPkrud6jzQNYpX2H3AQ==", "license": "MIT", "peer": true, "funding": { @@ -17911,13 +16752,13 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.19.0" + "@tiptap/core": "^3.20.0" } }, "node_modules/@tiptap/extension-text": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-3.19.0.tgz", - "integrity": "sha512-K95+SnbZy0h6hNFtfy23n8t/nOcTFEf69In9TSFVVmwn/Nwlke+IfiESAkqbt1/7sKJeegRXYO7WzFEmFl9Q/g==", + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-3.20.0.tgz", + "integrity": "sha512-tf8bE8tSaOEWabCzPm71xwiUhyMFKqY9jkP5af3Kr1/F45jzZFIQAYZooHI/+zCHRrgJ99MQHKHe1ZNvODrKHQ==", "license": "MIT", "peer": true, "funding": { @@ -17925,13 +16766,13 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.19.0" + "@tiptap/core": "^3.20.0" } }, "node_modules/@tiptap/extension-underline": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-3.19.0.tgz", - "integrity": "sha512-800MGEWfG49j10wQzAFiW/ele1HT04MamcL8iyuPNu7ZbjbGN2yknvdrJlRy7hZlzIrVkZMr/1tz62KN33VHIw==", + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-3.20.0.tgz", + "integrity": "sha512-LzNXuy2jwR/y+ymoUqC72TiGzbOCjioIjsDu0MNYpHuHqTWPK5aV9Mh0nbZcYFy/7fPlV1q0W139EbJeYBZEAQ==", "license": "MIT", "peer": true, "funding": { @@ -17939,13 +16780,13 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.19.0" + "@tiptap/core": "^3.20.0" } }, "node_modules/@tiptap/extensions": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@tiptap/extensions/-/extensions-3.19.0.tgz", - "integrity": "sha512-ZmGUhLbMWaGqnJh2Bry+6V4M6gMpUDYo4D1xNux5Gng/E/eYtc+PMxMZ/6F7tNTAuujLBOQKj6D+4SsSm457jw==", + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@tiptap/extensions/-/extensions-3.20.0.tgz", + "integrity": "sha512-HIsXX942w3nbxEQBlMAAR/aa6qiMBEP7CsSMxaxmTIVAmW35p6yUASw6GdV1u0o3lCZjXq2OSRMTskzIqi5uLg==", "license": "MIT", "peer": true, "funding": { @@ -17953,14 +16794,14 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.19.0", - "@tiptap/pm": "^3.19.0" + "@tiptap/core": "^3.20.0", + "@tiptap/pm": "^3.20.0" } }, "node_modules/@tiptap/pm": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-3.19.0.tgz", - "integrity": "sha512-789zcnM4a8OWzvbD2DL31d0wbSm9BVeO/R7PLQwLIGysDI3qzrcclyZ8yhqOEVuvPitRRwYLq+mY14jz7kY4cw==", + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-3.20.0.tgz", + "integrity": "sha512-jn+2KnQZn+b+VXr8EFOJKsnjVNaA4diAEr6FOazupMt8W8ro1hfpYtZ25JL87Kao/WbMze55sd8M8BDXLUKu1A==", "license": "MIT", "peer": true, "dependencies": { @@ -18047,56 +16888,42 @@ } }, "node_modules/@tiptap/starter-kit": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-3.19.0.tgz", - "integrity": "sha512-dTCkHEz+Y8ADxX7h+xvl6caAj+3nII/wMB1rTQchSuNKqJTOrzyUsCWm094+IoZmLT738wANE0fRIgziNHs/ug==", - "license": "MIT", - "peer": true, - "dependencies": { - "@tiptap/core": "^3.19.0", - "@tiptap/extension-blockquote": "^3.19.0", - "@tiptap/extension-bold": "^3.19.0", - "@tiptap/extension-bullet-list": "^3.19.0", - "@tiptap/extension-code": "^3.19.0", - "@tiptap/extension-code-block": "^3.19.0", - "@tiptap/extension-document": "^3.19.0", - "@tiptap/extension-dropcursor": "^3.19.0", - "@tiptap/extension-gapcursor": "^3.19.0", - "@tiptap/extension-hard-break": "^3.19.0", - "@tiptap/extension-heading": "^3.19.0", - "@tiptap/extension-horizontal-rule": "^3.19.0", - "@tiptap/extension-italic": "^3.19.0", - "@tiptap/extension-link": "^3.19.0", - "@tiptap/extension-list": "^3.19.0", - "@tiptap/extension-list-item": "^3.19.0", - "@tiptap/extension-list-keymap": "^3.19.0", - "@tiptap/extension-ordered-list": "^3.19.0", - "@tiptap/extension-paragraph": "^3.19.0", - "@tiptap/extension-strike": "^3.19.0", - "@tiptap/extension-text": "^3.19.0", - "@tiptap/extension-underline": "^3.19.0", - "@tiptap/extensions": "^3.19.0", - "@tiptap/pm": "^3.19.0" + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-3.20.0.tgz", + "integrity": "sha512-W4+1re35pDNY/7rpXVg+OKo/Fa4Gfrn08Bq3E3fzlJw6gjE3tYU8dY9x9vC2rK9pd9NOp7Af11qCFDaWpohXkw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@tiptap/core": "^3.20.0", + "@tiptap/extension-blockquote": "^3.20.0", + "@tiptap/extension-bold": "^3.20.0", + "@tiptap/extension-bullet-list": "^3.20.0", + "@tiptap/extension-code": "^3.20.0", + "@tiptap/extension-code-block": "^3.20.0", + "@tiptap/extension-document": "^3.20.0", + "@tiptap/extension-dropcursor": "^3.20.0", + "@tiptap/extension-gapcursor": "^3.20.0", + "@tiptap/extension-hard-break": "^3.20.0", + "@tiptap/extension-heading": "^3.20.0", + "@tiptap/extension-horizontal-rule": "^3.20.0", + "@tiptap/extension-italic": "^3.20.0", + "@tiptap/extension-link": "^3.20.0", + "@tiptap/extension-list": "^3.20.0", + "@tiptap/extension-list-item": "^3.20.0", + "@tiptap/extension-list-keymap": "^3.20.0", + "@tiptap/extension-ordered-list": "^3.20.0", + "@tiptap/extension-paragraph": "^3.20.0", + "@tiptap/extension-strike": "^3.20.0", + "@tiptap/extension-text": "^3.20.0", + "@tiptap/extension-underline": "^3.20.0", + "@tiptap/extensions": "^3.20.0", + "@tiptap/pm": "^3.20.0" }, "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" } }, - "node_modules/@tiptap/suggestion": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@tiptap/suggestion/-/suggestion-3.19.0.tgz", - "integrity": "sha512-tUZwMRFqTVPIo566ZmHNRteyZxJy2EE4FA+S3IeIUOOvY6AW0h1imhbpBO7sXV8CeEQvpa+2DWwLvy7L3vmstA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^3.19.0", - "@tiptap/pm": "^3.19.0" - } - }, "node_modules/@tootallnate/once": { "version": "2.0.0", "license": "MIT", @@ -18462,6 +17289,8 @@ }, "node_modules/@types/hast": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "license": "MIT", "peer": true, "dependencies": { @@ -18540,6 +17369,8 @@ }, "node_modules/@types/linkify-it": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", "license": "MIT", "peer": true }, @@ -18550,6 +17381,8 @@ }, "node_modules/@types/markdown-it": { "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", "license": "MIT", "peer": true, "dependencies": { @@ -18569,6 +17402,8 @@ }, "node_modules/@types/mdurl": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", "license": "MIT", "peer": true }, @@ -18678,6 +17513,13 @@ "license": "MIT", "peer": true }, + "node_modules/@types/use-sync-external-store": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", + "integrity": "sha512-5dyB8nLC/qogMrlCizZnYWQTA4lnb/v+It+sqNl5YnSRAPMlIqY/X0Xn+gZw8vOL+TgTTr28VEbn3uf8fUtAkw==", + "license": "MIT", + "peer": true + }, "node_modules/@types/webextension-polyfill": { "version": "0.10.0", "dev": true, @@ -19944,50 +18786,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.11", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.2", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.4", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.1", - "core-js-compat": "^3.36.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.2", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, "node_modules/babel-preset-current-node-syntax": { "version": "1.0.1", "license": "MIT", @@ -21132,49 +19930,6 @@ "node": ">=0.10.0" } }, - "node_modules/core-js-compat": { - "version": "3.37.1", - "license": "MIT", - "peer": true, - "dependencies": { - "browserslist": "^4.23.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-compat/node_modules/browserslist": { - "version": "4.23.0", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "peer": true, - "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, "node_modules/cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", @@ -21284,7 +20039,9 @@ "link": true }, "node_modules/crelt": { - "version": "1.0.5", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", "license": "MIT", "peer": true }, @@ -21647,9 +20404,9 @@ "license": "MIT" }, "node_modules/decode-named-character-reference": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", - "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", "license": "MIT", "peer": true, "dependencies": { @@ -22188,6 +20945,8 @@ }, "node_modules/emoji-mart": { "version": "5.6.0", + "resolved": "https://registry.npmjs.org/emoji-mart/-/emoji-mart-5.6.0.tgz", + "integrity": "sha512-eJp3QRe79pjwa+duv+n7+5YsNhRcMl812EcFVwrnRvYKoNPoQb5qxU8DG6Bgwji0akHdp6D4Ln6tYLG58MFSow==", "license": "MIT", "peer": true }, @@ -24769,6 +23528,8 @@ }, "node_modules/hast-util-embedded": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz", + "integrity": "sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==", "license": "MIT", "peer": true, "dependencies": { @@ -24782,6 +23543,8 @@ }, "node_modules/hast-util-format": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hast-util-format/-/hast-util-format-1.1.0.tgz", + "integrity": "sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==", "license": "MIT", "peer": true, "dependencies": { @@ -24856,6 +23619,8 @@ }, "node_modules/hast-util-has-property": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz", + "integrity": "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==", "license": "MIT", "peer": true, "dependencies": { @@ -24868,6 +23633,8 @@ }, "node_modules/hast-util-is-body-ok-link": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.1.tgz", + "integrity": "sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==", "license": "MIT", "peer": true, "dependencies": { @@ -24880,6 +23647,8 @@ }, "node_modules/hast-util-is-element": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", "license": "MIT", "peer": true, "dependencies": { @@ -24892,6 +23661,8 @@ }, "node_modules/hast-util-minify-whitespace": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hast-util-minify-whitespace/-/hast-util-minify-whitespace-1.0.1.tgz", + "integrity": "sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==", "license": "MIT", "peer": true, "dependencies": { @@ -24922,6 +23693,8 @@ }, "node_modules/hast-util-phrasing": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==", "license": "MIT", "peer": true, "dependencies": { @@ -25006,6 +23779,8 @@ }, "node_modules/hast-util-whitespace": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", "license": "MIT", "peer": true, "dependencies": { @@ -25060,7 +23835,7 @@ }, "node_modules/highlight.js": { "version": "10.7.3", - "devOptional": true, + "dev": true, "license": "BSD-3-Clause", "engines": { "node": "*" @@ -25126,6 +23901,8 @@ }, "node_modules/html-whitespace-sensitive-tag-names": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-whitespace-sensitive-tag-names/-/html-whitespace-sensitive-tag-names-3.0.1.tgz", + "integrity": "sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==", "license": "MIT", "peer": true, "funding": { @@ -27747,6 +26524,8 @@ }, "node_modules/linkify-it": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", "license": "MIT", "peer": true, "dependencies": { @@ -27826,11 +26605,6 @@ "version": "4.3.0", "license": "MIT" }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "license": "MIT", - "peer": true - }, "node_modules/lodash.memoize": { "version": "4.1.2", "license": "MIT" @@ -28003,7 +26777,9 @@ } }, "node_modules/markdown-it": { - "version": "14.1.0", + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz", + "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==", "license": "MIT", "peer": true, "dependencies": { @@ -28158,9 +26934,9 @@ } }, "node_modules/mdast-util-from-markdown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", - "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", + "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", "license": "MIT", "peer": true, "dependencies": { @@ -28305,9 +27081,9 @@ } }, "node_modules/mdast-util-to-hast": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", - "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", "license": "MIT", "peer": true, "dependencies": { @@ -28368,6 +27144,8 @@ }, "node_modules/mdurl": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", "license": "MIT", "peer": true }, @@ -29484,74 +28262,6 @@ "tslib": "^2.8.0" } }, - "node_modules/next/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/next/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "optional": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/next/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/node-addon-api": { "version": "7.0.0", "license": "MIT" @@ -30013,6 +28723,8 @@ }, "node_modules/orderedmap": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz", + "integrity": "sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==", "license": "MIT", "peer": true }, @@ -30929,9 +29641,9 @@ } }, "node_modules/prosemirror-changeset": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.3.1.tgz", - "integrity": "sha512-j0kORIBm8ayJNl3zQvD1TTPHJX3g042et6y/KQhZhnPrruO8exkTgG8X+NRpj7kIyMMEx74Xb3DyMIBtO0IKkQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.4.0.tgz", + "integrity": "sha512-LvqH2v7Q2SF6yxatuPP2e8vSUKS/L+xAU7dPDC4RMyHMhZoGDfBC74mYuyYF4gLqOEG758wajtyhNnsTkuhvng==", "license": "MIT", "peer": true, "dependencies": { @@ -30940,6 +29652,8 @@ }, "node_modules/prosemirror-collab": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/prosemirror-collab/-/prosemirror-collab-1.3.1.tgz", + "integrity": "sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==", "license": "MIT", "peer": true, "dependencies": { @@ -30947,7 +29661,9 @@ } }, "node_modules/prosemirror-commands": { - "version": "1.6.2", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.7.1.tgz", + "integrity": "sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==", "license": "MIT", "peer": true, "dependencies": { @@ -30969,7 +29685,9 @@ } }, "node_modules/prosemirror-gapcursor": { - "version": "1.3.2", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.4.0.tgz", + "integrity": "sha512-z00qvurSdCEWUIulij/isHaqu4uLS8r/Fi61IbjdIPJEonQgggbJsLnstW7Lgdk4zQ68/yr6B6bf7sJXowIgdQ==", "license": "MIT", "peer": true, "dependencies": { @@ -30980,7 +29698,9 @@ } }, "node_modules/prosemirror-history": { - "version": "1.4.1", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.5.0.tgz", + "integrity": "sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==", "license": "MIT", "peer": true, "dependencies": { @@ -30991,7 +29711,9 @@ } }, "node_modules/prosemirror-inputrules": { - "version": "1.4.0", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.5.1.tgz", + "integrity": "sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw==", "license": "MIT", "peer": true, "dependencies": { @@ -31000,7 +29722,9 @@ } }, "node_modules/prosemirror-keymap": { - "version": "1.2.2", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.3.tgz", + "integrity": "sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==", "license": "MIT", "peer": true, "dependencies": { @@ -31009,17 +29733,21 @@ } }, "node_modules/prosemirror-markdown": { - "version": "1.13.1", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.13.4.tgz", + "integrity": "sha512-D98dm4cQ3Hs6EmjK500TdAOew4Z03EV71ajEFiWra3Upr7diytJsjF4mPV2dW+eK5uNectiRj0xFxYI9NLXDbw==", "license": "MIT", "peer": true, "dependencies": { "@types/markdown-it": "^14.0.0", "markdown-it": "^14.0.0", - "prosemirror-model": "^1.20.0" + "prosemirror-model": "^1.25.0" } }, "node_modules/prosemirror-menu": { - "version": "1.2.4", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.3.0.tgz", + "integrity": "sha512-TImyPXCHPcDsSka2/lwJ6WjTASr4re/qWq1yoTTuLOqfXucwF6VcRa2LWCkM/EyTD1UO3CUwiH8qURJoWJRxwg==", "license": "MIT", "peer": true, "dependencies": { @@ -31030,9 +29758,9 @@ } }, "node_modules/prosemirror-model": { - "version": "1.25.3", - "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.3.tgz", - "integrity": "sha512-dY2HdaNXlARknJbrManZ1WyUtos+AP97AmvqdOQtWtrrC5g4mohVX5DTi9rXNFSk09eczLq9GuNTtq3EfMeMGA==", + "version": "1.25.4", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.4.tgz", + "integrity": "sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA==", "license": "MIT", "peer": true, "dependencies": { @@ -31040,11 +29768,13 @@ } }, "node_modules/prosemirror-schema-basic": { - "version": "1.2.3", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.4.tgz", + "integrity": "sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ==", "license": "MIT", "peer": true, "dependencies": { - "prosemirror-model": "^1.19.0" + "prosemirror-model": "^1.25.0" } }, "node_modules/prosemirror-schema-list": { @@ -31060,7 +29790,9 @@ } }, "node_modules/prosemirror-state": { - "version": "1.4.3", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.4.tgz", + "integrity": "sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==", "license": "MIT", "peer": true, "dependencies": { @@ -31070,19 +29802,23 @@ } }, "node_modules/prosemirror-tables": { - "version": "1.6.4", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.8.5.tgz", + "integrity": "sha512-V/0cDCsHKHe/tfWkeCmthNUcEp1IVO3p6vwN8XtwE9PZQLAZJigbw3QoraAdfJPir4NKJtNvOB8oYGKRl+t0Dw==", "license": "MIT", "peer": true, "dependencies": { - "prosemirror-keymap": "^1.2.2", - "prosemirror-model": "^1.24.1", - "prosemirror-state": "^1.4.3", - "prosemirror-transform": "^1.10.2", - "prosemirror-view": "^1.37.2" + "prosemirror-keymap": "^1.2.3", + "prosemirror-model": "^1.25.4", + "prosemirror-state": "^1.4.4", + "prosemirror-transform": "^1.10.5", + "prosemirror-view": "^1.41.4" } }, "node_modules/prosemirror-trailing-node": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prosemirror-trailing-node/-/prosemirror-trailing-node-3.0.0.tgz", + "integrity": "sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==", "license": "MIT", "peer": true, "dependencies": { @@ -31096,9 +29832,9 @@ } }, "node_modules/prosemirror-transform": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.10.4.tgz", - "integrity": "sha512-pwDy22nAnGqNR1feOQKHxoFkkUtepoFAd3r2hbEDsnf4wp57kKA36hXsB3njA9FtONBEwSDnDeCiJe+ItD+ykw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.11.0.tgz", + "integrity": "sha512-4I7Ce4KpygXb9bkiPS3hTEk4dSHorfRw8uI0pE8IhxlK2GXsqv5tIA7JUSxtSu7u8APVOTtbUBxTmnHIxVkIJw==", "license": "MIT", "peer": true, "dependencies": { @@ -31106,9 +29842,9 @@ } }, "node_modules/prosemirror-view": { - "version": "1.41.1", - "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.41.1.tgz", - "integrity": "sha512-cViIhlt1/T5bQMINrmXh43JZcdIgdW1YkOABmIuH5gSt3/HiCZHsLN9d5GvsgzrXn2+zZ8il0kkghisusm7tSA==", + "version": "1.41.6", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.41.6.tgz", + "integrity": "sha512-mxpcDG4hNQa/CPtzxjdlir5bJFDlm0/x5nGBbStB2BWX+XOQ9M8ekEG+ojqB5BcVu2Rc80/jssCMZzSstJuSYg==", "license": "MIT", "peer": true, "dependencies": { @@ -31190,6 +29926,8 @@ }, "node_modules/punycode.js": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", "license": "MIT", "peer": true, "engines": { @@ -32004,7 +30742,9 @@ "license": "MIT" }, "node_modules/react-icons": { - "version": "5.4.0", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.5.0.tgz", + "integrity": "sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==", "license": "MIT", "peer": true, "peerDependencies": { @@ -32329,34 +31069,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regenerate": { - "version": "1.4.2", - "license": "MIT", - "peer": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "license": "MIT", - "peer": true, - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/regenerator-runtime": { "version": "0.13.9", "license": "MIT" }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, "node_modules/regex-not": { "version": "1.0.2", "license": "MIT", @@ -32403,22 +31119,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpu-core": { - "version": "5.3.2", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/registry-auth-token": { "version": "5.0.2", "license": "MIT", @@ -32442,26 +31142,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/regjsparser": { - "version": "0.9.1", - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "peer": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, "node_modules/rehype-format": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/rehype-format/-/rehype-format-5.0.1.tgz", + "integrity": "sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==", "license": "MIT", "peer": true, "dependencies": { @@ -32810,6 +31494,8 @@ }, "node_modules/rope-sequence": { "version": "1.3.4", + "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz", + "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==", "license": "MIT", "peer": true }, @@ -33192,6 +31878,74 @@ "node": ">=8" } }, + "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/sharp/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/sharp/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "license": "MIT", @@ -34555,9 +33309,9 @@ "license": "MIT" }, "node_modules/tabbable": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz", + "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==", "license": "MIT", "peer": true }, @@ -36765,6 +35519,8 @@ }, "node_modules/uc.micro": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "license": "MIT", "peer": true }, @@ -36790,14 +35546,6 @@ "version": "5.26.5", "license": "MIT" }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=4" - } - }, "node_modules/unicode-emoji-modifier-base": { "version": "1.0.0", "dev": true, @@ -36806,34 +35554,6 @@ "node": ">=4" } }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "license": "MIT", - "peer": true, - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=4" - } - }, "node_modules/unified": { "version": "11.0.5", "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", @@ -36916,7 +35636,9 @@ } }, "node_modules/unist-util-is": { - "version": "6.0.0", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", "license": "MIT", "peer": true, "dependencies": { @@ -36956,9 +35678,9 @@ } }, "node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", "license": "MIT", "peer": true, "dependencies": { @@ -36972,7 +35694,9 @@ } }, "node_modules/unist-util-visit-parents": { - "version": "6.0.1", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", "license": "MIT", "peer": true, "dependencies": { @@ -37198,6 +35922,16 @@ "node": ">= 4" } }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "peer": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/v8-to-istanbul": { "version": "9.1.3", "license": "ISC", @@ -37874,113 +36608,567 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "msw": "^2.4.9", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/vitest/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vue": { + "version": "3.3.4", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-sfc": "3.3.4", + "@vue/runtime-dom": "3.3.4", + "@vue/server-renderer": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "license": "MIT", + "peer": true + }, + "node_modules/w3c-xmlserializer": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watskeburt": { + "version": "4.2.2", + "dev": true, + "license": "MIT", + "bin": { + "watskeburt": "dist/run-cli.js" + }, + "engines": { + "node": "^18||>=20" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/weak-lru-cache": { + "version": "1.2.2", + "license": "MIT" + }, + "node_modules/web-encoding": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/web-encoding/-/web-encoding-1.1.5.tgz", + "integrity": "sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "util": "^0.12.3" + }, + "optionalDependencies": { + "@zxing/text-encoding": "0.9.0" + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/webextension-polyfill": { + "version": "0.10.0", + "dev": true, + "license": "MPL-2.0" + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-fetch": { + "version": "3.6.20", + "license": "MIT" + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "11.0.0", + "license": "MIT", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "license": "MIT" + }, + "node_modules/which-collection": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ws": { + "version": "8.17.1", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { - "msw": { + "bufferutil": { "optional": true }, - "vite": { + "utf-8-validate": { "optional": true } } }, - "node_modules/vitest/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "license": "MIT" + }, + "node_modules/xxhash-wasm": { + "version": "0.4.2", + "license": "MIT" + }, + "node_modules/y-indexeddb": { + "version": "9.0.12", "license": "MIT", "dependencies": { - "@types/estree": "^1.0.0" + "lib0": "^0.2.74" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + }, + "peerDependencies": { + "yjs": "^13.0.0" } }, - "node_modules/vitest/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, + "node_modules/y-prosemirror": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/y-prosemirror/-/y-prosemirror-1.3.7.tgz", + "integrity": "sha512-NpM99WSdD4Fx4if5xOMDpPtU3oAmTSjlzh5U4353ABbRHl1HtAFUx6HlebLZfyFxXN9jzKMDkVbcRjqOZVkYQg==", "license": "MIT", + "dependencies": { + "lib0": "^0.2.109" + }, "engines": { - "node": ">=12" + "node": ">=16.0.0", + "npm": ">=8.0.0" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + }, + "peerDependencies": { + "prosemirror-model": "^1.7.1", + "prosemirror-state": "^1.2.3", + "prosemirror-view": "^1.9.10", + "y-protocols": "^1.0.1", + "yjs": "^13.5.38" } }, - "node_modules/vue": { - "version": "3.3.4", + "node_modules/y-protocols": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/y-protocols/-/y-protocols-1.0.7.tgz", + "integrity": "sha512-YSVsLoXxO67J6eE/nV4AtFtT3QEotZf5sK5BHxFBXso7VDUT3Tx07IfA6hsu5Q5OmBdMkQVmFZ9QOA7fikWvnw==", "license": "MIT", + "peer": true, "dependencies": { - "@vue/compiler-dom": "3.3.4", - "@vue/compiler-sfc": "3.3.4", - "@vue/runtime-dom": "3.3.4", - "@vue/server-renderer": "3.3.4", - "@vue/shared": "3.3.4" + "lib0": "^0.2.85" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + }, + "peerDependencies": { + "yjs": "^13.0.0" } }, - "node_modules/w3c-keyname": { - "version": "2.2.6", - "license": "MIT", - "peer": true + "node_modules/y18n": { + "version": "5.0.8", + "license": "ISC", + "engines": { + "node": ">=10" + } }, - "node_modules/w3c-xmlserializer": { - "version": "3.0.0", + "node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.2", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "17.7.2", "license": "MIT", "dependencies": { - "xml-name-validator": "^4.0.0" + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" }, "engines": { "node": ">=12" } }, - "node_modules/walker": { - "version": "1.0.8", - "license": "Apache-2.0", - "dependencies": { - "makeerror": "1.0.12" + "node_modules/yargs-parser": { + "version": "21.1.1", + "license": "ISC", + "engines": { + "node": ">=12" } }, - "node_modules/watskeburt": { - "version": "4.2.2", - "dev": true, + "node_modules/yjs": { + "version": "13.6.27", + "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.27.tgz", + "integrity": "sha512-OIDwaflOaq4wC6YlPBy2L6ceKeKuF7DeTxx+jPzv1FHn9tCZ0ZwSRnUBxD05E3yed46fv/FWJbvR+Ud7x0L7zw==", "license": "MIT", - "bin": { - "watskeburt": "dist/run-cli.js" + "dependencies": { + "lib0": "^0.2.99" }, "engines": { - "node": "^18||>=20" + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" } }, - "node_modules/wcwidth": { - "version": "1.0.1", + "node_modules/yocto-queue": { + "version": "0.1.0", "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/weak-lru-cache": { - "version": "1.2.2", - "license": "MIT" + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/web-encoding": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/web-encoding/-/web-encoding-1.1.5.tgz", - "integrity": "sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==", + "node_modules/zod": { + "version": "3.24.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.4.tgz", + "integrity": "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.24.5", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz", + "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==", "dev": true, + "license": "ISC", + "peerDependencies": { + "zod": "^3.24.1" + } + }, + "node_modules/zustand": { + "version": "4.4.1", "license": "MIT", "dependencies": { - "util": "^0.12.3" + "use-sync-external-store": "1.2.0" }, - "optionalDependencies": { - "@zxing/text-encoding": "0.9.0" + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "@types/react": ">=16.8", + "immer": ">=9.0", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + } } }, - "node_modules/web-namespaces": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", - "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", "license": "MIT", "peer": true, "funding": { @@ -37988,596 +37176,1070 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/webextension-polyfill": { - "version": "0.10.0", + "packages/liveblocks-client": { + "name": "@liveblocks/client", + "version": "3.14.1", + "license": "Apache-2.0", + "dependencies": { + "@liveblocks/core": "3.14.1" + }, + "devDependencies": { + "@liveblocks/eslint-config": "*", + "@liveblocks/vitest-config": "*" + } + }, + "packages/liveblocks-core": { + "name": "@liveblocks/core", + "version": "3.14.1", + "license": "Apache-2.0", + "devDependencies": { + "@liveblocks/eslint-config": "*", + "@liveblocks/query-parser": "^0.1.1", + "@liveblocks/vitest-config": "*", + "@types/ws": "^8.5.10", + "eslint-plugin-rulesdir": "^0.2.2", + "fast-check": "^4.3.0", + "msw": "^2.10.4", + "ws": "^8.17.1" + }, + "peerDependencies": { + "@types/json-schema": "^7" + } + }, + "packages/liveblocks-emails": { + "name": "@liveblocks/emails", + "version": "3.14.1", + "license": "Apache-2.0", + "dependencies": { + "@liveblocks/core": "3.14.1", + "@liveblocks/node": "3.14.1" + }, + "devDependencies": { + "@liveblocks/eslint-config": "*", + "@liveblocks/vitest-config": "*", + "csstype": "3.0.2", + "msw": "^2.10.4" + }, + "peerDependencies": { + "react": "^18 || ^19 || ^19.0.0-rc" + } + }, + "packages/liveblocks-emails/node_modules/csstype": { + "version": "3.0.2", "dev": true, - "license": "MPL-2.0" + "license": "MIT" }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" + "packages/liveblocks-node": { + "name": "@liveblocks/node", + "version": "3.14.1", + "license": "Apache-2.0", + "dependencies": { + "@liveblocks/core": "3.14.1", + "@stablelib/base64": "^1.0.1", + "fast-sha256": "^1.3.0", + "node-fetch": "^2.6.1" + }, + "devDependencies": { + "@liveblocks/eslint-config": "*", + "@liveblocks/vitest-config": "*", + "@types/node-fetch": "^2.6.6", + "msw": "^2.10.4", + "svix": "^0.75.0" } }, - "node_modules/whatwg-encoding": { - "version": "2.0.0", - "license": "MIT", + "packages/liveblocks-node-lexical": { + "name": "@liveblocks/node-lexical", + "version": "3.14.1", + "license": "Apache-2.0", "dependencies": { - "iconv-lite": "0.6.3" + "@liveblocks/core": "3.14.1", + "@liveblocks/node": "3.14.1", + "yjs": "^13.6.18" }, - "engines": { - "node": ">=12" + "devDependencies": { + "@liveblocks/eslint-config": "*", + "@liveblocks/vitest-config": "*" + }, + "peerDependencies": { + "@lexical/headless": "0.35.0", + "@lexical/markdown": "0.35.0", + "@lexical/selection": "0.35.0", + "@lexical/yjs": "0.35.0", + "lexical": "0.35.0" } }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "license": "MIT", + "packages/liveblocks-node-prosemirror": { + "name": "@liveblocks/node-prosemirror", + "version": "3.14.1", + "license": "Apache-2.0", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "@liveblocks/core": "3.14.1", + "@liveblocks/node": "3.14.1", + "yjs": "^13.6.20" }, - "engines": { - "node": ">=0.10.0" + "devDependencies": { + "@liveblocks/eslint-config": "*", + "@liveblocks/vitest-config": "*", + "msw": "^2.10.4" + }, + "peerDependencies": { + "@tiptap/core": "^3.19.0", + "@tiptap/pm": "^3.19.0", + "@tiptap/react": "^3.19.0", + "@tiptap/starter-kit": "^3.19.0", + "prosemirror-markdown": "^1.13.1", + "y-prosemirror": "^1.3.7", + "yjs": "^13.6.20" } }, - "node_modules/whatwg-fetch": { - "version": "3.6.20", - "license": "MIT" + "packages/liveblocks-react": { + "name": "@liveblocks/react", + "version": "3.14.1", + "license": "Apache-2.0", + "dependencies": { + "@liveblocks/client": "3.14.1", + "@liveblocks/core": "3.14.1" + }, + "devDependencies": { + "@liveblocks/eslint-config": "*", + "@liveblocks/jest-config": "*", + "@liveblocks/query-parser": "^0.1.1", + "@testing-library/jest-dom": "6.4.6", + "@testing-library/react": "14.1.2", + "date-fns": "^3.6.0", + "eslint-plugin-react-hooks": "^4.6.2", + "itertools": "^2.3.2", + "msw": "^1.3.5", + "react-error-boundary": "^4.0.13" + }, + "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/whatwg-mimetype": { - "version": "3.0.0", + "packages/liveblocks-react-blocknote": { + "name": "@liveblocks/react-blocknote", + "version": "3.14.1", + "license": "Apache-2.0", + "dependencies": { + "@liveblocks/client": "3.14.1", + "@liveblocks/core": "3.14.1", + "@liveblocks/react": "3.14.1", + "@liveblocks/react-tiptap": "3.14.1", + "@liveblocks/react-ui": "3.14.1", + "@liveblocks/yjs": "3.14.1", + "@tiptap/core": "^3.19.0", + "vitest-tsconfig-paths": "^3.4.1" + }, + "devDependencies": { + "@liveblocks/eslint-config": "*", + "@liveblocks/rollup-config": "*", + "@liveblocks/vitest-config": "*", + "@testing-library/jest-dom": "^5.16.5", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.6.0", + "msw": "^2.10.4", + "stylelint": "^15.10.2", + "stylelint-config-standard": "^34.0.0", + "stylelint-order": "^6.0.3", + "stylelint-plugin-logical-css": "^0.13.2" + }, + "peerDependencies": { + "@blocknote/core": "0.43.0 - 1.0.0", + "@blocknote/react": "0.43.0 - 1.0.0", + "@tiptap/core": "^3.19.0", + "@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 + } + } + }, + "packages/liveblocks-react-lexical": { + "name": "@liveblocks/react-lexical", + "version": "3.14.1", + "license": "Apache-2.0", + "dependencies": { + "@floating-ui/react-dom": "^2.1.0", + "@liveblocks/client": "3.14.1", + "@liveblocks/core": "3.14.1", + "@liveblocks/react": "3.14.1", + "@liveblocks/react-ui": "3.14.1", + "@liveblocks/yjs": "3.14.1", + "radix-ui": "^1.4.0", + "yjs": "^13.6.18" + }, + "devDependencies": { + "@liveblocks/eslint-config": "*", + "@liveblocks/rollup-config": "*", + "@liveblocks/vitest-config": "*", + "@testing-library/jest-dom": "^5.16.5", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.6.0", + "msw": "^2.10.4", + "stylelint": "^15.10.2", + "stylelint-config-standard": "^34.0.0", + "stylelint-order": "^6.0.3", + "stylelint-plugin-logical-css": "^0.13.2" + }, + "peerDependencies": { + "@lexical/react": "0.35.0", + "@lexical/rich-text": "0.35.0", + "@lexical/selection": "0.35.0", + "@lexical/utils": "0.35.0", + "@lexical/yjs": "0.35.0", + "@types/react": "*", + "@types/react-dom": "*", + "lexical": "0.35.0", + "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 + } + } + }, + "packages/liveblocks-react-lexical/node_modules/@floating-ui/core": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.2.tgz", + "integrity": "sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==", "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "@floating-ui/utils": "^0.2.10" } }, - "node_modules/whatwg-url": { - "version": "11.0.0", + "packages/liveblocks-react-lexical/node_modules/@floating-ui/dom": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.2.tgz", + "integrity": "sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==", "license": "MIT", "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" + "@floating-ui/core": "^1.7.2", + "@floating-ui/utils": "^0.2.10" } }, - "node_modules/which": { - "version": "2.0.2", - "license": "ISC", + "packages/liveblocks-react-lexical/node_modules/@floating-ui/react-dom": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.4.tgz", + "integrity": "sha512-JbbpPhp38UmXDDAu60RJmbeme37Jbgsm7NrHGgzYYFKmblzRUh6Pa641dII6LsjwF4XlScDrde2UAzDo/b9KPw==", + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "@floating-ui/dom": "^1.7.2" }, - "engines": { - "node": ">= 8" + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } }, - "node_modules/which-boxed-primitive": { + "packages/liveblocks-react-lexical/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" + }, + "packages/liveblocks-react-lexical/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" + }, + "packages/liveblocks-react-lexical/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": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" + "@radix-ui/react-visually-hidden": "1.2.3" }, - "engines": { - "node": ">= 0.4" + "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" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/which-builtin-type": { - "version": "1.2.1", + "packages/liveblocks-react-lexical/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": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" + "@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" }, - "engines": { - "node": ">= 0.4" + "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" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/which-builtin-type/node_modules/isarray": { - "version": "2.0.5", - "license": "MIT" - }, - "node_modules/which-collection": { - "version": "1.0.2", + "packages/liveblocks-react-lexical/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": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" + "@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" }, - "engines": { - "node": ">= 0.4" + "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" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/which-typed-array": { - "version": "1.1.20", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", - "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "packages/liveblocks-react-lexical/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": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" + "@radix-ui/react-primitive": "2.1.3" }, - "engines": { - "node": ">= 0.4" + "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" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "dev": true, + "packages/liveblocks-react-lexical/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": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" + "@radix-ui/react-primitive": "2.1.3" }, - "bin": { - "why-is-node-running": "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" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/wrap-ansi": { - "version": "7.0.0", + "packages/liveblocks-react-lexical/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": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "@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" }, - "engines": { - "node": ">=10" + "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" }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", + "packages/liveblocks-react-lexical/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": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "@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" }, - "engines": { - "node": ">=10" + "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" }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/wrappy": { - "version": "1.0.2", - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "license": "ISC", + "packages/liveblocks-react-lexical/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": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" + "@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" }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.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/ws": { - "version": "8.17.1", + "packages/liveblocks-react-lexical/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", - "engines": { - "node": ">=10.0.0" + "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": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "@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": { - "bufferutil": { + "@types/react": { "optional": true }, - "utf-8-validate": { + "@types/react-dom": { "optional": true } } }, - "node_modules/xml-name-validator": { - "version": "4.0.0", - "license": "Apache-2.0", - "engines": { - "node": ">=12" + "packages/liveblocks-react-lexical/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/xmlchars": { - "version": "2.2.0", - "license": "MIT" - }, - "node_modules/xxhash-wasm": { - "version": "0.4.2", - "license": "MIT" - }, - "node_modules/y-indexeddb": { - "version": "9.0.12", + "packages/liveblocks-react-lexical/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", - "dependencies": { - "lib0": "^0.2.74" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=8.0.0" - }, - "funding": { - "type": "GitHub Sponsors ❤", - "url": "https://github.com/sponsors/dmonad" - }, "peerDependencies": { - "yjs": "^13.0.0" + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/y-prosemirror": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/y-prosemirror/-/y-prosemirror-1.3.7.tgz", - "integrity": "sha512-NpM99WSdD4Fx4if5xOMDpPtU3oAmTSjlzh5U4353ABbRHl1HtAFUx6HlebLZfyFxXN9jzKMDkVbcRjqOZVkYQg==", + "packages/liveblocks-react-lexical/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": { - "lib0": "^0.2.109" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=8.0.0" - }, - "funding": { - "type": "GitHub Sponsors ❤", - "url": "https://github.com/sponsors/dmonad" + "@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": { - "prosemirror-model": "^1.7.1", - "prosemirror-state": "^1.2.3", - "prosemirror-view": "^1.9.10", - "y-protocols": "^1.0.1", - "yjs": "^13.5.38" + "@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/y-protocols": { - "version": "1.0.6", + "packages/liveblocks-react-lexical/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", - "peer": true, "dependencies": { - "lib0": "^0.2.85" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=8.0.0" - }, - "funding": { - "type": "GitHub Sponsors ❤", - "url": "https://github.com/sponsors/dmonad" + "@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": { - "yjs": "^13.0.0" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "license": "ISC", - "engines": { - "node": ">=10" + "@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/yallist": { - "version": "4.0.0", - "license": "ISC" - }, - "node_modules/yaml": { - "version": "1.10.2", - "license": "ISC", - "engines": { - "node": ">= 6" + "packages/liveblocks-react-lexical/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/yargs": { - "version": "17.7.2", + "packages/liveblocks-react-lexical/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": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "@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" }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "license": "ISC", - "engines": { - "node": ">=12" + "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/yjs": { - "version": "13.6.27", - "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.27.tgz", - "integrity": "sha512-OIDwaflOaq4wC6YlPBy2L6ceKeKuF7DeTxx+jPzv1FHn9tCZ0ZwSRnUBxD05E3yed46fv/FWJbvR+Ud7x0L7zw==", + "packages/liveblocks-react-lexical/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": { - "lib0": "^0.2.99" + "@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" }, - "engines": { - "node": ">=16.0.0", - "npm": ">=8.0.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" }, - "funding": { - "type": "GitHub Sponsors ❤", - "url": "https://github.com/sponsors/dmonad" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/yocto-queue": { - "version": "0.1.0", + "packages/liveblocks-react-lexical/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", - "engines": { - "node": ">=10" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "packages/liveblocks-react-lexical/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/yoctocolors-cjs": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", - "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "packages/liveblocks-react-lexical/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", - "engines": { - "node": ">=18" + "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" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "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/zod": { - "version": "3.24.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.4.tgz", - "integrity": "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==", - "dev": true, + "packages/liveblocks-react-lexical/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", - "funding": { - "url": "https://github.com/sponsors/colinhacks" + "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/zod-to-json-schema": { - "version": "3.24.5", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz", - "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==", - "dev": true, - "license": "ISC", + "packages/liveblocks-react-lexical/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": { - "zod": "^3.24.1" + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/zustand": { - "version": "4.4.1", + "packages/liveblocks-react-lexical/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": { - "use-sync-external-store": "1.2.0" - }, - "engines": { - "node": ">=12.7.0" + "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { - "@types/react": ">=16.8", - "immer": ">=9.0", - "react": ">=16.8" + "@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 }, - "immer": { - "optional": true - }, - "react": { + "@types/react-dom": { "optional": true } } }, - "node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "packages/liveblocks-react-lexical/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", - "peer": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "packages/liveblocks-client": { - "name": "@liveblocks/client", - "version": "3.14.1", - "license": "Apache-2.0", "dependencies": { - "@liveblocks/core": "3.14.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-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" }, - "devDependencies": { - "@liveblocks/eslint-config": "*", - "@liveblocks/vitest-config": "*" + "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 + } } }, - "packages/liveblocks-core": { - "name": "@liveblocks/core", - "version": "3.14.1", - "license": "Apache-2.0", - "devDependencies": { - "@liveblocks/eslint-config": "*", - "@liveblocks/query-parser": "^0.1.1", - "@liveblocks/vitest-config": "*", - "@types/ws": "^8.5.10", - "eslint-plugin-rulesdir": "^0.2.2", - "fast-check": "^4.3.0", - "msw": "^2.10.4", - "ws": "^8.17.1" + "packages/liveblocks-react-lexical/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/json-schema": "^7" + "@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 + } } }, - "packages/liveblocks-emails": { - "name": "@liveblocks/emails", - "version": "3.14.1", - "license": "Apache-2.0", + "packages/liveblocks-react-lexical/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": { - "@liveblocks/core": "3.14.1", - "@liveblocks/node": "3.14.1" - }, - "devDependencies": { - "@liveblocks/eslint-config": "*", - "@liveblocks/vitest-config": "*", - "csstype": "3.0.2", - "msw": "^2.10.4" + "@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": { - "react": "^18 || ^19 || ^19.0.0-rc" + "@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 + } } }, - "packages/liveblocks-emails/node_modules/csstype": { - "version": "3.0.2", - "dev": true, - "license": "MIT" - }, - "packages/liveblocks-node": { - "name": "@liveblocks/node", - "version": "3.14.1", - "license": "Apache-2.0", + "packages/liveblocks-react-lexical/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": { - "@liveblocks/core": "3.14.1", - "@stablelib/base64": "^1.0.1", - "fast-sha256": "^1.3.0", - "node-fetch": "^2.6.1" + "@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" }, - "devDependencies": { - "@liveblocks/eslint-config": "*", - "@liveblocks/vitest-config": "*", - "@types/node-fetch": "^2.6.6", - "msw": "^2.10.4", - "svix": "^0.75.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 + } } }, - "packages/liveblocks-node-lexical": { - "name": "@liveblocks/node-lexical", - "version": "3.14.1", - "license": "Apache-2.0", + "packages/liveblocks-react-lexical/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": { - "@liveblocks/core": "3.14.1", - "@liveblocks/node": "3.14.1", - "yjs": "^13.6.18" - }, - "devDependencies": { - "@liveblocks/eslint-config": "*", - "@liveblocks/vitest-config": "*" + "@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": { - "@lexical/headless": "0.35.0", - "@lexical/markdown": "0.35.0", - "@lexical/selection": "0.35.0", - "@lexical/yjs": "0.35.0", - "lexical": "0.35.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": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "packages/liveblocks-node-prosemirror": { - "name": "@liveblocks/node-prosemirror", - "version": "3.14.1", - "license": "Apache-2.0", + "packages/liveblocks-react-lexical/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": { - "@liveblocks/core": "3.14.1", - "@liveblocks/node": "3.14.1", - "yjs": "^13.6.20" - }, - "devDependencies": { - "@liveblocks/eslint-config": "*", - "@liveblocks/vitest-config": "*", - "msw": "^2.10.4" + "@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": { - "@tiptap/core": "^3.19.0", - "@tiptap/pm": "^3.19.0", - "@tiptap/react": "^3.19.0", - "@tiptap/starter-kit": "^3.19.0", - "prosemirror-markdown": "^1.13.1", - "y-prosemirror": "^1.3.7", - "yjs": "^13.6.20" + "@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 + } } }, - "packages/liveblocks-react": { - "name": "@liveblocks/react", - "version": "3.14.1", - "license": "Apache-2.0", + "packages/liveblocks-react-lexical/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": { - "@liveblocks/client": "3.14.1", - "@liveblocks/core": "3.14.1" - }, - "devDependencies": { - "@liveblocks/eslint-config": "*", - "@liveblocks/jest-config": "*", - "@liveblocks/query-parser": "^0.1.1", - "@testing-library/jest-dom": "6.4.6", - "@testing-library/react": "14.1.2", - "date-fns": "^3.6.0", - "eslint-plugin-react-hooks": "^4.6.2", - "itertools": "^2.3.2", - "msw": "^1.3.5", - "react-error-boundary": "^4.0.13" + "@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": "^18 || ^19 || ^19.0.0-rc" + "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": { @@ -38588,41 +38250,20 @@ } } }, - "packages/liveblocks-react-blocknote": { - "name": "@liveblocks/react-blocknote", - "version": "3.14.1", - "license": "Apache-2.0", + "packages/liveblocks-react-lexical/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": { - "@liveblocks/client": "3.14.1", - "@liveblocks/core": "3.14.1", - "@liveblocks/react": "3.14.1", - "@liveblocks/react-tiptap": "3.14.1", - "@liveblocks/react-ui": "3.14.1", - "@liveblocks/yjs": "3.14.1", - "@tiptap/core": "^3.19.0", - "vitest-tsconfig-paths": "^3.4.1" - }, - "devDependencies": { - "@liveblocks/eslint-config": "*", - "@liveblocks/rollup-config": "*", - "@liveblocks/vitest-config": "*", - "@testing-library/jest-dom": "^5.16.5", - "eslint-plugin-react": "^7.33.2", - "eslint-plugin-react-hooks": "^4.6.0", - "msw": "^2.10.4", - "stylelint": "^15.10.2", - "stylelint-config-standard": "^34.0.0", - "stylelint-order": "^6.0.3", - "stylelint-plugin-logical-css": "^0.13.2" + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { - "@blocknote/core": "0.39.1 - 1.0.0", - "@blocknote/react": "0.39.1 - 1.0.0", - "@tiptap/core": "^3.19.0", "@types/react": "*", "@types/react-dom": "*", - "react": "^18 || ^19 || ^19.0.0-rc", - "react-dom": "^18 || ^19 || ^19.0.0-rc" + "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": { @@ -38633,45 +38274,20 @@ } } }, - "packages/liveblocks-react-lexical": { - "name": "@liveblocks/react-lexical", - "version": "3.14.1", - "license": "Apache-2.0", + "packages/liveblocks-react-lexical/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": { - "@floating-ui/react-dom": "^2.1.1", - "@liveblocks/client": "3.14.1", - "@liveblocks/core": "3.14.1", - "@liveblocks/react": "3.14.1", - "@liveblocks/react-ui": "3.14.1", - "@liveblocks/yjs": "3.14.1", - "@radix-ui/react-select": "^2.1.2", - "@radix-ui/react-toggle": "^1.1.0", - "yjs": "^13.6.18" - }, - "devDependencies": { - "@liveblocks/eslint-config": "*", - "@liveblocks/rollup-config": "*", - "@liveblocks/vitest-config": "*", - "@testing-library/jest-dom": "^5.16.5", - "eslint-plugin-react": "^7.33.2", - "eslint-plugin-react-hooks": "^4.6.0", - "msw": "^2.10.4", - "stylelint": "^15.10.2", - "stylelint-config-standard": "^34.0.0", - "stylelint-order": "^6.0.3", - "stylelint-plugin-logical-css": "^0.13.2" + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { - "@lexical/react": "0.35.0", - "@lexical/rich-text": "0.35.0", - "@lexical/selection": "0.35.0", - "@lexical/utils": "0.35.0", - "@lexical/yjs": "0.35.0", "@types/react": "*", "@types/react-dom": "*", - "lexical": "0.35.0", - "react": "^18 || ^19 || ^19.0.0-rc", - "react-dom": "^18 || ^19 || ^19.0.0-rc" + "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": { @@ -38682,51 +38298,100 @@ } } }, - "packages/liveblocks-react-lexical/node_modules/@floating-ui/core": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.2.tgz", - "integrity": "sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==", + "packages/liveblocks-react-lexical/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": { - "@floating-ui/utils": "^0.2.10" + "@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 + } } }, - "packages/liveblocks-react-lexical/node_modules/@floating-ui/dom": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.2.tgz", - "integrity": "sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==", + "packages/liveblocks-react-lexical/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": { - "@floating-ui/core": "^1.7.2", - "@floating-ui/utils": "^0.2.10" + "@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 + } } }, - "packages/liveblocks-react-lexical/node_modules/@floating-ui/react-dom": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.4.tgz", - "integrity": "sha512-JbbpPhp38UmXDDAu60RJmbeme37Jbgsm7NrHGgzYYFKmblzRUh6Pa641dII6LsjwF4XlScDrde2UAzDo/b9KPw==", + "packages/liveblocks-react-lexical/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": { - "@floating-ui/dom": "^1.7.2" + "@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": { - "react": ">=16.8.0", - "react-dom": ">=16.8.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": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "packages/liveblocks-react-lexical/node_modules/@radix-ui/number": { - "version": "1.1.0", - "license": "MIT" - }, - "packages/liveblocks-react-lexical/node_modules/@radix-ui/primitive": { - "version": "1.1.1", - "license": "MIT" - }, - "packages/liveblocks-react-lexical/node_modules/@radix-ui/react-arrow": { - "version": "1.1.1", + "packages/liveblocks-react-lexical/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/react-primitive": "2.0.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-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": "*", @@ -38743,14 +38408,21 @@ } } }, - "packages/liveblocks-react-lexical/node_modules/@radix-ui/react-collection": { - "version": "1.1.1", + "packages/liveblocks-react-lexical/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/react-compose-refs": "1.1.1", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-primitive": "2.0.1", - "@radix-ui/react-slot": "1.1.1" + "@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": "*", @@ -38767,54 +38439,89 @@ } } }, - "packages/liveblocks-react-lexical/node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.1", + "packages/liveblocks-react-lexical/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", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "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" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/liveblocks-react-lexical/node_modules/@radix-ui/react-context": { - "version": "1.1.1", - "license": "MIT", "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@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 } } }, - "packages/liveblocks-react-lexical/node_modules/@radix-ui/react-direction": { - "version": "1.1.0", + "packages/liveblocks-react-lexical/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": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@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 } } }, - "packages/liveblocks-react-lexical/node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.3", + "packages/liveblocks-react-lexical/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/primitive": "1.1.1", - "@radix-ui/react-compose-refs": "1.1.1", - "@radix-ui/react-primitive": "2.0.1", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-escape-keydown": "1.1.0" + "@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": "*", @@ -38831,9 +38538,14 @@ } } }, - "packages/liveblocks-react-lexical/node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.1", + "packages/liveblocks-react-lexical/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" @@ -38844,13 +38556,19 @@ } } }, - "packages/liveblocks-react-lexical/node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.1", + "packages/liveblocks-react-lexical/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/react-compose-refs": "1.1.1", - "@radix-ui/react-primitive": "2.0.1", - "@radix-ui/react-use-callback-ref": "1.1.0" + "@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": "*", @@ -38867,36 +38585,54 @@ } } }, - "packages/liveblocks-react-lexical/node_modules/@radix-ui/react-id": { - "version": "1.1.0", + "packages/liveblocks-react-lexical/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/react-use-layout-effect": "1.1.0" + "@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": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@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 } } }, - "packages/liveblocks-react-lexical/node_modules/@radix-ui/react-popper": { - "version": "1.2.1", + "packages/liveblocks-react-lexical/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": { - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.1", - "@radix-ui/react-compose-refs": "1.1.1", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-primitive": "2.0.1", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0", - "@radix-ui/react-use-rect": "1.1.0", - "@radix-ui/react-use-size": "1.1.0", - "@radix-ui/rect": "1.1.0" + "@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": "*", @@ -38913,12 +38649,15 @@ } } }, - "packages/liveblocks-react-lexical/node_modules/@radix-ui/react-portal": { - "version": "1.1.3", + "packages/liveblocks-react-lexical/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/react-primitive": "2.0.1", - "@radix-ui/react-use-layout-effect": "1.1.0" + "@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": "*", @@ -38935,11 +38674,19 @@ } } }, - "packages/liveblocks-react-lexical/node_modules/@radix-ui/react-primitive": { - "version": "2.0.1", + "packages/liveblocks-react-lexical/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/react-slot": "1.1.1" + "@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": "*", @@ -38956,31 +38703,19 @@ } } }, - "packages/liveblocks-react-lexical/node_modules/@radix-ui/react-select": { - "version": "2.1.4", + "packages/liveblocks-react-lexical/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/number": "1.1.0", - "@radix-ui/primitive": "1.1.1", - "@radix-ui/react-collection": "1.1.1", - "@radix-ui/react-compose-refs": "1.1.1", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-dismissable-layer": "1.1.3", - "@radix-ui/react-focus-guards": "1.1.1", - "@radix-ui/react-focus-scope": "1.1.1", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-popper": "1.2.1", - "@radix-ui/react-portal": "1.1.3", - "@radix-ui/react-primitive": "2.0.1", - "@radix-ui/react-slot": "1.1.1", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0", - "@radix-ui/react-use-previous": "1.1.0", - "@radix-ui/react-visually-hidden": "1.1.1", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "^2.6.1" + "@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": "*", @@ -38997,24 +38732,44 @@ } } }, - "packages/liveblocks-react-lexical/node_modules/@radix-ui/react-slot": { - "version": "1.1.1", + "packages/liveblocks-react-lexical/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/react-compose-refs": "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-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": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@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 } } }, "packages/liveblocks-react-lexical/node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.0", + "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": "*", @@ -39027,10 +38782,13 @@ } }, "packages/liveblocks-react-lexical/node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.1.0", + "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-callback-ref": "1.1.0" + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", @@ -39043,10 +38801,12 @@ } }, "packages/liveblocks-react-lexical/node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.0", + "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.0" + "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", @@ -39059,7 +38819,9 @@ } }, "packages/liveblocks-react-lexical/node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.0", + "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": "*", @@ -39072,7 +38834,9 @@ } }, "packages/liveblocks-react-lexical/node_modules/@radix-ui/react-use-previous": { - "version": "1.1.0", + "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": "*", @@ -39085,10 +38849,12 @@ } }, "packages/liveblocks-react-lexical/node_modules/@radix-ui/react-use-rect": { - "version": "1.1.0", + "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.0" + "@radix-ui/rect": "1.1.1" }, "peerDependencies": { "@types/react": "*", @@ -39101,10 +38867,12 @@ } }, "packages/liveblocks-react-lexical/node_modules/@radix-ui/react-use-size": { - "version": "1.1.0", + "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.0" + "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", @@ -39117,10 +38885,12 @@ } }, "packages/liveblocks-react-lexical/node_modules/@radix-ui/react-visually-hidden": { - "version": "1.1.1", + "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.0.1" + "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", @@ -39138,9 +38908,88 @@ } }, "packages/liveblocks-react-lexical/node_modules/@radix-ui/rect": { - "version": "1.1.0", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", + "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", "license": "MIT" }, + "packages/liveblocks-react-lexical/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 + } + } + }, "packages/liveblocks-react-lexical/node_modules/react-remove-scroll": { "version": "2.6.3", "license": "MIT", @@ -39169,18 +39018,17 @@ "version": "3.14.1", "license": "Apache-2.0", "dependencies": { - "@floating-ui/react-dom": "^2.1.2", + "@floating-ui/react-dom": "^2.1.0", "@liveblocks/client": "3.14.1", "@liveblocks/core": "3.14.1", "@liveblocks/react": "3.14.1", "@liveblocks/react-ui": "3.14.1", "@liveblocks/yjs": "3.14.1", - "@radix-ui/react-select": "^2.1.2", - "@radix-ui/react-toggle": "^1.1.0", "@tiptap/core": "^3.19.0", "@tiptap/react": "^3.19.0", "@tiptap/suggestion": "^3.19.0", "cmdk": "^1.0.4", + "radix-ui": "^1.4.0", "y-prosemirror": "^1.3.7", "yjs": "^13.6.18" }, @@ -39246,18 +39094,24 @@ "license": "MIT" }, "packages/liveblocks-react-tiptap/node_modules/@radix-ui/number": { - "version": "1.1.0", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", + "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", "license": "MIT" }, "packages/liveblocks-react-tiptap/node_modules/@radix-ui/primitive": { - "version": "1.1.1", + "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" }, - "packages/liveblocks-react-tiptap/node_modules/@radix-ui/react-arrow": { - "version": "1.1.1", + "packages/liveblocks-react-tiptap/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-primitive": "2.0.1" + "@radix-ui/react-visually-hidden": "1.2.3" }, "peerDependencies": { "@types/react": "*", @@ -39274,14 +39128,21 @@ } } }, - "packages/liveblocks-react-tiptap/node_modules/@radix-ui/react-collection": { - "version": "1.1.1", + "packages/liveblocks-react-tiptap/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/react-compose-refs": "1.1.1", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-primitive": "2.0.1", - "@radix-ui/react-slot": "1.1.1" + "@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": "*", @@ -39298,54 +39159,18 @@ } } }, - "packages/liveblocks-react-tiptap/node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.1", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/liveblocks-react-tiptap/node_modules/@radix-ui/react-context": { - "version": "1.1.1", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/liveblocks-react-tiptap/node_modules/@radix-ui/react-direction": { - "version": "1.1.0", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/liveblocks-react-tiptap/node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.3", + "packages/liveblocks-react-tiptap/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.1", - "@radix-ui/react-compose-refs": "1.1.1", - "@radix-ui/react-primitive": "2.0.1", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-escape-keydown": "1.1.0" + "@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": "*", @@ -39362,26 +39187,13 @@ } } }, - "packages/liveblocks-react-tiptap/node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.1", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/liveblocks-react-tiptap/node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.1", + "packages/liveblocks-react-tiptap/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-compose-refs": "1.1.1", - "@radix-ui/react-primitive": "2.0.1", - "@radix-ui/react-use-callback-ref": "1.1.0" + "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", @@ -39398,36 +39210,13 @@ } } }, - "packages/liveblocks-react-tiptap/node_modules/@radix-ui/react-id": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/liveblocks-react-tiptap/node_modules/@radix-ui/react-popper": { - "version": "1.2.1", + "packages/liveblocks-react-tiptap/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": { - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.1", - "@radix-ui/react-compose-refs": "1.1.1", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-primitive": "2.0.1", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0", - "@radix-ui/react-use-rect": "1.1.0", - "@radix-ui/react-use-size": "1.1.0", - "@radix-ui/rect": "1.1.0" + "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", @@ -39444,12 +39233,17 @@ } } }, - "packages/liveblocks-react-tiptap/node_modules/@radix-ui/react-portal": { - "version": "1.1.3", + "packages/liveblocks-react-tiptap/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-primitive": "2.0.1", - "@radix-ui/react-use-layout-effect": "1.1.0" + "@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": "*", @@ -39466,11 +39260,20 @@ } } }, - "packages/liveblocks-react-tiptap/node_modules/@radix-ui/react-primitive": { - "version": "2.0.1", + "packages/liveblocks-react-tiptap/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/react-slot": "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-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": "*", @@ -39487,31 +39290,20 @@ } } }, - "packages/liveblocks-react-tiptap/node_modules/@radix-ui/react-select": { - "version": "2.1.4", + "packages/liveblocks-react-tiptap/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/number": "1.1.0", - "@radix-ui/primitive": "1.1.1", - "@radix-ui/react-collection": "1.1.1", - "@radix-ui/react-compose-refs": "1.1.1", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-dismissable-layer": "1.1.3", - "@radix-ui/react-focus-guards": "1.1.1", - "@radix-ui/react-focus-scope": "1.1.1", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-popper": "1.2.1", - "@radix-ui/react-portal": "1.1.3", - "@radix-ui/react-primitive": "2.0.1", - "@radix-ui/react-slot": "1.1.1", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0", - "@radix-ui/react-use-previous": "1.1.0", - "@radix-ui/react-visually-hidden": "1.1.1", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "^2.6.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-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": "*", @@ -39528,99 +39320,37 @@ } } }, - "packages/liveblocks-react-tiptap/node_modules/@radix-ui/react-slot": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/liveblocks-react-tiptap/node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.0", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/liveblocks-react-tiptap/node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/liveblocks-react-tiptap/node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.0", + "packages/liveblocks-react-tiptap/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-use-callback-ref": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@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" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/liveblocks-react-tiptap/node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.0", - "license": "MIT", "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@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 - } - } - }, - "packages/liveblocks-react-tiptap/node_modules/@radix-ui/react-use-previous": { - "version": "1.1.0", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { + }, + "@types/react-dom": { "optional": true } } }, - "packages/liveblocks-react-tiptap/node_modules/@radix-ui/react-use-rect": { - "version": "1.1.0", + "packages/liveblocks-react-tiptap/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", - "dependencies": { - "@radix-ui/rect": "1.1.0" - }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -39631,12 +39361,11 @@ } } }, - "packages/liveblocks-react-tiptap/node_modules/@radix-ui/react-use-size": { - "version": "1.1.0", + "packages/liveblocks-react-tiptap/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", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.0" - }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -39647,11 +39376,18 @@ } } }, - "packages/liveblocks-react-tiptap/node_modules/@radix-ui/react-visually-hidden": { - "version": "1.1.1", + "packages/liveblocks-react-tiptap/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/react-primitive": "2.0.1" + "@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": "*", @@ -39668,72 +39404,32 @@ } } }, - "packages/liveblocks-react-tiptap/node_modules/@radix-ui/rect": { - "version": "1.1.0", - "license": "MIT" - }, - "packages/liveblocks-react-tiptap/node_modules/react-remove-scroll": { - "version": "2.6.3", + "packages/liveblocks-react-tiptap/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": { - "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 - } - } - }, - "packages/liveblocks-react-ui": { - "name": "@liveblocks/react-ui", - "version": "3.14.1", - "license": "Apache-2.0", - "dependencies": { - "@floating-ui/react-dom": "^2.1.2", - "@liveblocks/client": "3.14.1", - "@liveblocks/core": "3.14.1", - "@liveblocks/react": "3.14.1", - "@radix-ui/react-dropdown-menu": "^2.1.2", - "@radix-ui/react-popover": "^1.1.2", - "@radix-ui/react-slot": "^1.1.0", - "@radix-ui/react-toggle": "^1.1.0", - "@radix-ui/react-tooltip": "^1.1.3", - "frimousse": "^0.2.0", - "marked": "^15.0.11", - "slate": "^0.110.2", - "slate-history": "^0.110.3", - "slate-hyperscript": "^0.100.0", - "slate-react": "^0.110.3" - }, - "devDependencies": { - "@liveblocks/eslint-config": "*", - "@liveblocks/rollup-config": "*", - "@liveblocks/vitest-config": "*", - "@testing-library/jest-dom": "^6.4.6", - "@testing-library/react": "^13.1.1", - "eslint-plugin-react": "^7.33.2", - "eslint-plugin-react-hooks": "^4.6.0", - "stylelint": "^15.10.2", - "stylelint-config-standard": "^34.0.0", - "stylelint-order": "^6.0.3", - "stylelint-plugin-logical-css": "^0.13.2" + "@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": "^18 || ^19 || ^19.0.0-rc", - "react-dom": "^18 || ^19 || ^19.0.0-rc" + "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": { @@ -39744,68 +39440,81 @@ } } }, - "packages/liveblocks-react-ui/node_modules/@floating-ui/core": { - "version": "1.6.2", - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.0" - } - }, - "packages/liveblocks-react-ui/node_modules/@floating-ui/dom": { - "version": "1.6.5", - "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.0.0", - "@floating-ui/utils": "^0.2.0" - } - }, - "packages/liveblocks-react-ui/node_modules/@floating-ui/react-dom": { - "version": "2.1.2", + "packages/liveblocks-react-tiptap/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", - "dependencies": { - "@floating-ui/dom": "^1.0.0" - }, "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "packages/liveblocks-react-ui/node_modules/@floating-ui/utils": { - "version": "0.2.2", - "license": "MIT" - }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/primitive": { - "version": "1.1.0", - "license": "MIT" - }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.0", + "packages/liveblocks-react-tiptap/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": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@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 } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-context": { - "version": "1.1.1", + "packages/liveblocks-react-tiptap/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": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@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 } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-direction": { - "version": "1.1.0", + "packages/liveblocks-react-tiptap/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": "*", @@ -39817,17 +39526,15 @@ } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-dropdown-menu": { - "version": "2.1.2", + "packages/liveblocks-react-tiptap/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/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-menu": "2.1.2", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-controllable-state": "1.1.0" + "@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": "*", @@ -39844,28 +39551,18 @@ } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-menu": { - "version": "2.1.2", + "packages/liveblocks-react-tiptap/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.0", - "@radix-ui/react-collection": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-dismissable-layer": "1.1.1", - "@radix-ui/react-focus-guards": "1.1.1", - "@radix-ui/react-focus-scope": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-popper": "1.2.0", - "@radix-ui/react-portal": "1.1.2", - "@radix-ui/react-presence": "1.1.1", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-roving-focus": "1.1.0", - "@radix-ui/react-slot": "1.1.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.6.0" + "@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": "*", @@ -39882,14 +39579,21 @@ } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-collection": { - "version": "1.1.0", + "packages/liveblocks-react-tiptap/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/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-slot": "1.1.0" + "@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": "*", @@ -39906,9 +39610,14 @@ } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-context": { - "version": "1.1.0", + "packages/liveblocks-react-tiptap/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" @@ -39919,15 +39628,13 @@ } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.1", + "packages/liveblocks-react-tiptap/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/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-escape-keydown": "1.1.0" + "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", @@ -39944,13 +39651,30 @@ } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.0", + "packages/liveblocks-react-tiptap/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/react-compose-refs": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0" + "@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": "*", @@ -39967,20 +39691,22 @@ } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-popper": { - "version": "1.2.0", + "packages/liveblocks-react-tiptap/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": { - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0", - "@radix-ui/react-use-rect": "1.1.0", - "@radix-ui/react-use-size": "1.1.0", - "@radix-ui/rect": "1.1.0" + "@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": "*", @@ -39997,11 +39723,26 @@ } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-arrow": { - "version": "1.1.0", + "packages/liveblocks-react-tiptap/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/react-primitive": "2.0.0" + "@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": "*", @@ -40018,25 +39759,54 @@ } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-context": { - "version": "1.1.0", + "packages/liveblocks-react-tiptap/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": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@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 } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-portal": { - "version": "1.1.2", + "packages/liveblocks-react-tiptap/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/react-primitive": "2.0.0", - "@radix-ui/react-use-layout-effect": "1.1.0" + "@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": "*", @@ -40053,12 +39823,27 @@ } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-presence": { - "version": "1.1.1", + "packages/liveblocks-react-tiptap/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/react-compose-refs": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0" + "@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": "*", @@ -40075,19 +39860,22 @@ } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-roving-focus": { - "version": "1.1.0", + "packages/liveblocks-react-tiptap/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": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-collection": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0" + "@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": "*", @@ -40104,24 +39892,38 @@ } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-context": { - "version": "1.1.0", + "packages/liveblocks-react-tiptap/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": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@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 } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-primitive": { - "version": "2.0.0", + "packages/liveblocks-react-tiptap/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-slot": "1.1.0" + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", @@ -40138,54 +39940,69 @@ } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.1", + "packages/liveblocks-react-tiptap/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": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@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 } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-id": { - "version": "1.1.0", + "packages/liveblocks-react-tiptap/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-use-layout-effect": "1.1.0" + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@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 } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-popover": { - "version": "1.1.2", + "packages/liveblocks-react-tiptap/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.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.1", - "@radix-ui/react-focus-guards": "1.1.1", - "@radix-ui/react-focus-scope": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-popper": "1.2.0", - "@radix-ui/react-portal": "1.1.2", - "@radix-ui/react-presence": "1.1.1", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-slot": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.6.0" + "@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": "*", @@ -40202,15 +40019,21 @@ } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.1", + "packages/liveblocks-react-tiptap/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.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-escape-keydown": "1.1.0" + "@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": "*", @@ -40227,13 +40050,21 @@ } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.0", + "packages/liveblocks-react-tiptap/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/react-compose-refs": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0" + "@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": "*", @@ -40250,20 +40081,33 @@ } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-popper": { - "version": "1.2.0", + "packages/liveblocks-react-tiptap/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": { - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0", - "@radix-ui/react-use-rect": "1.1.0", - "@radix-ui/react-use-size": "1.1.0", - "@radix-ui/rect": "1.1.0" + "@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": "*", @@ -40280,11 +40124,13 @@ } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-arrow": { - "version": "1.1.0", + "packages/liveblocks-react-tiptap/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.0.0" + "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", @@ -40301,47 +40147,70 @@ } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-context": { - "version": "1.1.0", + "packages/liveblocks-react-tiptap/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": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@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 } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-portal": { - "version": "1.1.2", + "packages/liveblocks-react-tiptap/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-primitive": "2.0.0", - "@radix-ui/react-use-layout-effect": "1.1.0" + "@radix-ui/react-compose-refs": "1.1.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" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true - }, - "@types/react-dom": { - "optional": true } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-presence": { - "version": "1.1.1", + "packages/liveblocks-react-tiptap/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/react-compose-refs": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0" + "@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": "*", @@ -40358,11 +40227,20 @@ } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-primitive": { - "version": "2.0.0", + "packages/liveblocks-react-tiptap/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/react-slot": "1.1.0" + "@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": "*", @@ -40379,38 +40257,49 @@ } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-slot": { - "version": "1.1.0", + "packages/liveblocks-react-tiptap/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/react-compose-refs": "1.1.0" + "@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": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@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 } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-tooltip": { - "version": "1.1.3", + "packages/liveblocks-react-tiptap/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.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.1", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-popper": "1.2.0", - "@radix-ui/react-portal": "1.1.2", - "@radix-ui/react-presence": "1.1.1", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-slot": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-visually-hidden": "1.1.0" + "@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": "*", @@ -40427,15 +40316,19 @@ } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.1", + "packages/liveblocks-react-tiptap/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.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-escape-keydown": "1.1.0" + "@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": "*", @@ -40452,20 +40345,19 @@ } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-popper": { - "version": "1.2.0", + "packages/liveblocks-react-tiptap/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": { - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0", - "@radix-ui/react-use-rect": "1.1.0", - "@radix-ui/react-use-size": "1.1.0", - "@radix-ui/rect": "1.1.0" + "@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": "*", @@ -40482,11 +40374,24 @@ } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-arrow": { - "version": "1.1.0", + "packages/liveblocks-react-tiptap/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/react-primitive": "2.0.0" + "@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": "*", @@ -40503,8 +40408,10 @@ } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-context": { - "version": "1.1.0", + "packages/liveblocks-react-tiptap/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": "*", @@ -40516,95 +40423,81 @@ } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-portal": { - "version": "1.1.2", + "packages/liveblocks-react-tiptap/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-primitive": "2.0.0", - "@radix-ui/react-use-layout-effect": "1.1.0" + "@radix-ui/react-use-effect-event": "0.0.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" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true - }, - "@types/react-dom": { - "optional": true } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-presence": { + "packages/liveblocks-react-tiptap/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-compose-refs": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0" + "@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" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true - }, - "@types/react-dom": { - "optional": true } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-primitive": { - "version": "2.0.0", + "packages/liveblocks-react-tiptap/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", - "dependencies": { - "@radix-ui/react-slot": "1.1.0" - }, "peerDependencies": { "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true - }, - "@types/react-dom": { - "optional": true } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-visually-hidden": { - "version": "1.1.0", + "packages/liveblocks-react-tiptap/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": { - "@radix-ui/react-primitive": "2.0.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" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true - }, - "@types/react-dom": { - "optional": true } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.0", + "packages/liveblocks-react-tiptap/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" @@ -40615,11 +40508,13 @@ } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.1.0", + "packages/liveblocks-react-tiptap/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-callback-ref": "1.1.0" + "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", @@ -40631,44 +40526,142 @@ } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.0", + "packages/liveblocks-react-tiptap/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-use-callback-ref": "1.1.0" + "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@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 } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.0", + "packages/liveblocks-react-tiptap/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" + }, + "packages/liveblocks-react-tiptap/node_modules/@tiptap/suggestion": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@tiptap/suggestion/-/suggestion-3.20.0.tgz", + "integrity": "sha512-OA9Fe+1Q/Ex0ivTcpRcVFiLnNsVdIBmiEoctt/gu4H2ayCYmZ906veioXNdc1m/3MtVVUIuEnvwwsrOZXlfDEw==", "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^3.20.0", + "@tiptap/pm": "^3.20.0" + } + }, + "packages/liveblocks-react-tiptap/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": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@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 } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-use-rect": { - "version": "1.1.0", + "packages/liveblocks-react-tiptap/node_modules/react-remove-scroll": { + "version": "2.6.3", "license": "MIT", "dependencies": { - "@radix-ui/rect": "1.1.0" + "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 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { @@ -40676,24 +40669,79 @@ } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/react-use-size": { - "version": "1.1.0", - "license": "MIT", + "packages/liveblocks-react-ui": { + "name": "@liveblocks/react-ui", + "version": "3.14.1", + "license": "Apache-2.0", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.0" + "@floating-ui/react-dom": "^2.1.0", + "@liveblocks/client": "3.14.1", + "@liveblocks/core": "3.14.1", + "@liveblocks/react": "3.14.1", + "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" + }, + "devDependencies": { + "@liveblocks/eslint-config": "*", + "@liveblocks/rollup-config": "*", + "@liveblocks/vitest-config": "*", + "@testing-library/jest-dom": "^6.4.6", + "@testing-library/react": "^13.1.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.6.0", + "stylelint": "^15.10.2", + "stylelint-config-standard": "^34.0.0", + "stylelint-order": "^6.0.3", + "stylelint-plugin-logical-css": "^0.13.2" }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@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 } } }, - "packages/liveblocks-react-ui/node_modules/@radix-ui/rect": { - "version": "1.1.0", + "packages/liveblocks-react-ui/node_modules/@floating-ui/core": { + "version": "1.6.2", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.0" + } + }, + "packages/liveblocks-react-ui/node_modules/@floating-ui/dom": { + "version": "1.6.5", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" + } + }, + "packages/liveblocks-react-ui/node_modules/@floating-ui/react-dom": { + "version": "2.1.2", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "packages/liveblocks-react-ui/node_modules/@floating-ui/utils": { + "version": "0.2.2", "license": "MIT" }, "packages/liveblocks-react-ui/node_modules/@testing-library/jest-dom": { @@ -40743,29 +40791,6 @@ "dev": true, "license": "ISC" }, - "packages/liveblocks-react-ui/node_modules/react-remove-scroll": { - "version": "2.6.0", - "license": "MIT", - "dependencies": { - "react-remove-scroll-bar": "^2.3.6", - "react-style-singleton": "^2.2.1", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.0", - "use-sidecar": "^1.1.2" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "packages/liveblocks-react/node_modules/@mswjs/interceptors": { "version": "0.17.10", "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.17.10.tgz", diff --git a/packages/liveblocks-react-blocknote/package.json b/packages/liveblocks-react-blocknote/package.json index 1bde37f556..443b5582cb 100644 --- a/packages/liveblocks-react-blocknote/package.json +++ b/packages/liveblocks-react-blocknote/package.json @@ -54,8 +54,8 @@ "vitest-tsconfig-paths": "^3.4.1" }, "peerDependencies": { - "@blocknote/core": "0.39.1 - 1.0.0", - "@blocknote/react": "0.39.1 - 1.0.0", + "@blocknote/core": "0.43.0 - 1.0.0", + "@blocknote/react": "0.43.0 - 1.0.0", "@tiptap/core": "^3.19.0", "@types/react": "*", "@types/react-dom": "*", diff --git a/packages/liveblocks-react-blocknote/src/initialization/liveblocksEditorOptions.ts b/packages/liveblocks-react-blocknote/src/initialization/liveblocksEditorOptions.ts index cd4c52c1ce..767acb5feb 100644 --- a/packages/liveblocks-react-blocknote/src/initialization/liveblocksEditorOptions.ts +++ b/packages/liveblocks-react-blocknote/src/initialization/liveblocksEditorOptions.ts @@ -1,7 +1,7 @@ import { type BlockNoteEditorOptions, type BlockSchema, - createBlockNoteExtension, + createExtension, type DefaultBlockSchema, type DefaultInlineContentSchema, type DefaultStyleSchema, @@ -37,7 +37,8 @@ export const withLiveblocksEditorOptions = < // add the liveblocks extension extensions: [ - createBlockNoteExtension({ + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + createExtension({ key: "liveblocksExtension", tiptapExtensions: [liveblocksExtension], }), diff --git a/packages/liveblocks-react-lexical/package.json b/packages/liveblocks-react-lexical/package.json index 2ebe2be498..8c12949e3b 100644 --- a/packages/liveblocks-react-lexical/package.json +++ b/packages/liveblocks-react-lexical/package.json @@ -44,14 +44,13 @@ "test:watch": "NODE_OPTIONS=\"--no-deprecation\" vitest" }, "dependencies": { - "@floating-ui/react-dom": "^2.1.1", + "@floating-ui/react-dom": "^2.1.0", "@liveblocks/client": "3.14.1", "@liveblocks/core": "3.14.1", "@liveblocks/react": "3.14.1", "@liveblocks/react-ui": "3.14.1", "@liveblocks/yjs": "3.14.1", - "@radix-ui/react-select": "^2.1.2", - "@radix-ui/react-toggle": "^1.1.0", + "radix-ui": "^1.4.0", "yjs": "^13.6.18" }, "peerDependencies": { diff --git a/packages/liveblocks-react-lexical/src/comments/anchored-threads.tsx b/packages/liveblocks-react-lexical/src/comments/anchored-threads.tsx index 5d65fdbf3f..3811fc42de 100644 --- a/packages/liveblocks-react-lexical/src/comments/anchored-threads.tsx +++ b/packages/liveblocks-react-lexical/src/comments/anchored-threads.tsx @@ -6,7 +6,7 @@ import { Thread as DefaultThread, type ThreadProps, } from "@liveblocks/react-ui"; -import { cn } from "@liveblocks/react-ui/_private"; +import { cn, useStableComponent } from "@liveblocks/react-ui/_private"; import { $getNodeByKey } from "lexical"; import type { ComponentPropsWithoutRef, ComponentType } from "react"; import { @@ -74,7 +74,7 @@ export function AnchoredThreads({ ...props }: AnchoredThreadsProps) { const [editor] = useLexicalComposerContext(); - const Thread = components?.Thread ?? DefaultThread; + const Thread = useStableComponent(components?.Thread, DefaultThread); const containerRef = useRef(null); const activeThreads = useActiveThreads(); diff --git a/packages/liveblocks-react-lexical/src/comments/floating-composer.tsx b/packages/liveblocks-react-lexical/src/comments/floating-composer.tsx index a6e1df47bc..28434613cf 100644 --- a/packages/liveblocks-react-lexical/src/comments/floating-composer.tsx +++ b/packages/liveblocks-react-lexical/src/comments/floating-composer.tsx @@ -19,6 +19,7 @@ import type { ComposerSubmitComment, } from "@liveblocks/react-ui"; import { Composer as DefaultComposer } from "@liveblocks/react-ui"; +import { Portal, useStableComponent } from "@liveblocks/react-ui/_private"; import type { LexicalCommand } from "lexical"; import { $getSelection, @@ -27,7 +28,6 @@ import { COMMAND_PRIORITY_EDITOR, createCommand, } from "lexical"; -import { Portal } from "@liveblocks/react-ui/_private"; import type { ComponentType, FormEvent, KeyboardEvent, ReactNode } from "react"; import { forwardRef, useCallback, useEffect, useState } from "react"; @@ -164,7 +164,7 @@ const FloatingComposerImpl = forwardRef< components, ...composerProps } = props; - const Composer = components?.Composer ?? DefaultComposer; + const Composer = useStableComponent(components?.Composer, DefaultComposer); const [editor] = useLexicalComposerContext(); const createThread = useCreateThread(); diff --git a/packages/liveblocks-react-lexical/src/comments/floating-threads.tsx b/packages/liveblocks-react-lexical/src/comments/floating-threads.tsx index 43c38ec8b9..1f0ffc1359 100644 --- a/packages/liveblocks-react-lexical/src/comments/floating-threads.tsx +++ b/packages/liveblocks-react-lexical/src/comments/floating-threads.tsx @@ -16,7 +16,7 @@ import { Thread as DefaultThread, type ThreadProps, } from "@liveblocks/react-ui"; -import { cn, Portal } from "@liveblocks/react-ui/_private"; +import { cn, Portal, useStableComponent } from "@liveblocks/react-ui/_private"; import { $getSelection, COMMAND_PRIORITY_HIGH, @@ -67,7 +67,7 @@ export function FloatingThreads({ }: FloatingThreadsProps) { const activeThreads = useActiveThreads(); - const Thread = components?.Thread ?? DefaultThread; + const Thread = useStableComponent(components?.Thread, DefaultThread); const [editor] = useLexicalComposerContext(); const nodes = useThreadToNodes(); // A map of thread ids to a set of thread mark nodes associated with the thread diff --git a/packages/liveblocks-react-lexical/src/toolbar/toolbar.tsx b/packages/liveblocks-react-lexical/src/toolbar/toolbar.tsx index 901947716c..10859078fe 100644 --- a/packages/liveblocks-react-lexical/src/toolbar/toolbar.tsx +++ b/packages/liveblocks-react-lexical/src/toolbar/toolbar.tsx @@ -28,8 +28,6 @@ import { UndoIcon, useLiveblocksUiConfig, } from "@liveblocks/react-ui/_private"; -import * as SelectPrimitive from "@radix-ui/react-select"; -import * as TogglePrimitive from "@radix-ui/react-toggle"; import { $createParagraphNode, $getSelection, @@ -44,6 +42,7 @@ import { REDO_COMMAND, UNDO_COMMAND, } from "lexical"; +import { Select as SelectPrimitive, Toggle as TogglePrimitive } from "radix-ui"; import type { ComponentProps, ComponentType, diff --git a/packages/liveblocks-react-tiptap/package.json b/packages/liveblocks-react-tiptap/package.json index e3176c0268..ed46f7a1c1 100644 --- a/packages/liveblocks-react-tiptap/package.json +++ b/packages/liveblocks-react-tiptap/package.json @@ -44,18 +44,17 @@ "test:watch": "NODE_OPTIONS=\"--no-deprecation\" vitest" }, "dependencies": { - "@floating-ui/react-dom": "^2.1.2", + "@floating-ui/react-dom": "^2.1.0", "@liveblocks/client": "3.14.1", "@liveblocks/core": "3.14.1", "@liveblocks/react": "3.14.1", "@liveblocks/react-ui": "3.14.1", "@liveblocks/yjs": "3.14.1", - "@radix-ui/react-select": "^2.1.2", - "@radix-ui/react-toggle": "^1.1.0", "@tiptap/core": "^3.19.0", "@tiptap/react": "^3.19.0", "@tiptap/suggestion": "^3.19.0", "cmdk": "^1.0.4", + "radix-ui": "^1.4.0", "y-prosemirror": "^1.3.7", "yjs": "^13.6.18" }, diff --git a/packages/liveblocks-react-tiptap/src/comments/AnchoredThreads.tsx b/packages/liveblocks-react-tiptap/src/comments/AnchoredThreads.tsx index bbbd453651..9820be6e47 100644 --- a/packages/liveblocks-react-tiptap/src/comments/AnchoredThreads.tsx +++ b/packages/liveblocks-react-tiptap/src/comments/AnchoredThreads.tsx @@ -4,7 +4,7 @@ import { Thread as DefaultThread, type ThreadProps, } from "@liveblocks/react-ui"; -import { cn } from "@liveblocks/react-ui/_private"; +import { cn, useStableComponent } from "@liveblocks/react-ui/_private"; import { type Editor, useEditorState } from "@tiptap/react"; import type { ComponentPropsWithoutRef, ComponentType } from "react"; import { useCallback, useEffect, useRef, useState } from "react"; @@ -51,7 +51,7 @@ export function AnchoredThreads({ editor, ...props }: AnchoredThreadsProps) { - const Thread = components?.Thread ?? DefaultThread; + const Thread = useStableComponent(components?.Thread, DefaultThread); const containerRef = useRef(null); const [orderedThreads, setOrderedThreads] = useState< { position: { from: number; to: number }; thread: ThreadData }[] @@ -81,7 +81,14 @@ export function AnchoredThreads({ // TODO: lexical supoprts multiple threads being active, should probably do that here as well const handlePositionThreads = useCallback(() => { const container = containerRef.current; - if (container === null || !editor || !editor.view) return; + if ( + container === null || + !editor || + !editor.view || + editor.view.isDestroyed + ) { + return; + } const activeIndex = orderedThreads.findIndex( ({ thread }) => thread.id === pluginState?.selectedThreadId @@ -209,17 +216,15 @@ export function AnchoredThreads({ > {orderedThreads.map(({ thread, position }) => { // In blocknote, it's possible for this to be undefined - if (!editor.view) { + if (!editor.view || editor.view.isDestroyed) { return null; } const coords = editor.view.coordsAtPos( Math.min(position.from, editor.state.doc.content.size - 1) ); const rect = getRectFromCoords(coords); - let offset = 0; - if (editor.options.element instanceof HTMLElement) { - offset = editor.options.element.getBoundingClientRect().top; - } + + const offset = editor.view.dom.getBoundingClientRect().top ?? 0; let top = rect.top - offset; diff --git a/packages/liveblocks-react-tiptap/src/comments/FloatingComposer.tsx b/packages/liveblocks-react-tiptap/src/comments/FloatingComposer.tsx index d6e951b6a9..cf1400709c 100644 --- a/packages/liveblocks-react-tiptap/src/comments/FloatingComposer.tsx +++ b/packages/liveblocks-react-tiptap/src/comments/FloatingComposer.tsx @@ -18,7 +18,7 @@ import type { ComposerSubmitComment, } from "@liveblocks/react-ui"; import { Composer as DefaultComposer } from "@liveblocks/react-ui"; -import { Portal } from "@liveblocks/react-ui/_private"; +import { Portal, useStableComponent } from "@liveblocks/react-ui/_private"; import { type Editor, useEditorState } from "@tiptap/react"; import type { ComponentType, @@ -72,7 +72,7 @@ export const FloatingComposer = forwardRef< { editor, onComposerSubmit, onKeyDown, onClick, components, ...props }, forwardedRef ) { - const Composer = components?.Composer ?? DefaultComposer; + const Composer = useStableComponent(components?.Composer, DefaultComposer); const createThread = useCreateThread(); const pendingCommentSelection = useEditorState({ diff --git a/packages/liveblocks-react-tiptap/src/comments/FloatingThreads.tsx b/packages/liveblocks-react-tiptap/src/comments/FloatingThreads.tsx index e3ab25909d..547cad1368 100644 --- a/packages/liveblocks-react-tiptap/src/comments/FloatingThreads.tsx +++ b/packages/liveblocks-react-tiptap/src/comments/FloatingThreads.tsx @@ -14,7 +14,7 @@ import { Thread as DefaultThread, type ThreadProps, } from "@liveblocks/react-ui"; -import { cn, Portal } from "@liveblocks/react-ui/_private"; +import { cn, Portal, useStableComponent } from "@liveblocks/react-ui/_private"; import { type Editor, useEditorState } from "@tiptap/react"; import { type ComponentType, @@ -58,7 +58,7 @@ export function FloatingThreads({ editor, ...props }: FloatingThreadsProps) { - const Thread = components?.Thread ?? DefaultThread; + const Thread = useStableComponent(components?.Thread, DefaultThread); const { pluginState } = useEditorState({ editor, diff --git a/packages/liveblocks-react-tiptap/src/toolbar/Toolbar.tsx b/packages/liveblocks-react-tiptap/src/toolbar/Toolbar.tsx index acc2de58d2..72b4b8f321 100644 --- a/packages/liveblocks-react-tiptap/src/toolbar/Toolbar.tsx +++ b/packages/liveblocks-react-tiptap/src/toolbar/Toolbar.tsx @@ -24,9 +24,8 @@ import { UndoIcon, useLiveblocksUiConfig, } from "@liveblocks/react-ui/_private"; -import * as SelectPrimitive from "@radix-ui/react-select"; -import * as TogglePrimitive from "@radix-ui/react-toggle"; import { type Editor, useEditorState } from "@tiptap/react"; +import { Select as SelectPrimitive, Toggle as TogglePrimitive } from "radix-ui"; import type { ComponentProps, ComponentType, diff --git a/packages/liveblocks-react-ui/package.json b/packages/liveblocks-react-ui/package.json index f13be80445..2b570e8c0f 100644 --- a/packages/liveblocks-react-ui/package.json +++ b/packages/liveblocks-react-ui/package.json @@ -77,17 +77,13 @@ "test:watch": "vitest" }, "dependencies": { - "@floating-ui/react-dom": "^2.1.2", + "@floating-ui/react-dom": "^2.1.0", "@liveblocks/client": "3.14.1", "@liveblocks/core": "3.14.1", "@liveblocks/react": "3.14.1", - "@radix-ui/react-dropdown-menu": "^2.1.2", - "@radix-ui/react-popover": "^1.1.2", - "@radix-ui/react-slot": "^1.1.0", - "@radix-ui/react-toggle": "^1.1.0", - "@radix-ui/react-tooltip": "^1.1.3", "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", diff --git a/packages/liveblocks-react-ui/src/_private/index.ts b/packages/liveblocks-react-ui/src/_private/index.ts index 23ea88fa03..45cb8216af 100644 --- a/packages/liveblocks-react-ui/src/_private/index.ts +++ b/packages/liveblocks-react-ui/src/_private/index.ts @@ -19,6 +19,7 @@ export { cn } from "../utils/cn"; export { Portal } from "../utils/Portal"; export { useInitial } from "../utils/use-initial"; export { useRefs } from "../utils/use-refs"; +export { useStableComponent } from "../utils/use-stable-component"; // Private primitives (which will be exported from @liveblocks/react-ui/primitives when/if made public) diff --git a/packages/liveblocks-react-ui/src/components/AiChat.tsx b/packages/liveblocks-react-ui/src/components/AiChat.tsx index af68c4584f..f95feea608 100644 --- a/packages/liveblocks-react-ui/src/components/AiChat.tsx +++ b/packages/liveblocks-react-ui/src/components/AiChat.tsx @@ -21,6 +21,7 @@ import { useState, } from "react"; +import { useStableComponent } from "../_private"; import type { GlobalComponents } from "../components"; import { ArrowDownIcon } from "../icons/ArrowDown"; import { SpinnerIcon } from "../icons/Spinner"; @@ -521,8 +522,14 @@ export const AiChat = forwardRef( useState(null); const $ = useOverrides(overrides); - const Empty = components?.Empty ?? defaultComponents.Empty; - const Loading = components?.Loading ?? defaultComponents.Loading; + const Empty = useStableComponent( + components?.Empty, + defaultComponents.Empty + ); + const Loading = useStableComponent( + components?.Loading, + defaultComponents.Loading + ); const containerRef = useRef(null); const messagesRef = useRef(null); diff --git a/packages/liveblocks-react-ui/src/components/AvatarStack.tsx b/packages/liveblocks-react-ui/src/components/AvatarStack.tsx new file mode 100644 index 0000000000..7546cf0530 --- /dev/null +++ b/packages/liveblocks-react-ui/src/components/AvatarStack.tsx @@ -0,0 +1,155 @@ +"use client"; + +import { useOthers, useSelf } from "@liveblocks/react"; +import type { ComponentPropsWithoutRef, CSSProperties } from "react"; +import { forwardRef, useMemo } from "react"; + +import { + FLOATING_ELEMENT_COLLISION_PADDING, + FLOATING_ELEMENT_SIDE_OFFSET, +} from "../constants"; +import type { GlobalOverrides } from "../overrides"; +import { useOverrides } from "../overrides"; +import { cn } from "../utils/cn"; +import { Avatar } from "./internal/Avatar"; +import { Tooltip, TooltipProvider } from "./internal/Tooltip"; +import { User } from "./internal/User"; + +export interface AvatarStackProps extends ComponentPropsWithoutRef<"div"> { + /** + * Optional additional user IDs to include in the stack. + */ + userIds?: string[]; + + /** + * The maximum number of visible avatars. + * Defaults to 3, set to `undefined` to show all avatars. + */ + max?: number; + + /** + * The size of the avatars. + */ + size?: string | number; + + /** + * Override the component's strings. + */ + overrides?: Partial; +} + +/** + * Displays a stack of avatars for the users currently present in the room. + */ +export const AvatarStack = forwardRef( + ( + { + userIds: additionalUserIds = [], + max = 3, + size, + overrides, + className, + style, + ...props + }, + forwardedRef + ) => { + const $ = useOverrides(overrides); + const otherIds = useOthers((others) => others.map((user) => user.id)); + const selfId = useSelf((self) => self.id); + const userIds = useMemo(() => { + const uniqueUserIds = new Set([ + selfId, + ...otherIds, + ...additionalUserIds, + ]); + + return [...uniqueUserIds]; + }, [selfId, otherIds, additionalUserIds]); + const maxAvatars = Math.max(1, Math.floor(max)); + const visibleUserIds = userIds.slice(0, maxAvatars); + const hiddenUserIds = userIds.slice(visibleUserIds.length); + const remainingUsersCount = hiddenUserIds.length; + const visibleItemsCount = + visibleUserIds.length + Number(remainingUsersCount > 0); + + if (userIds.length === 0) { + return null; + } + + return ( + +
+ {visibleUserIds.map((userId, index) => { + if (!userId) { + return null; + } + + return ( + } + sideOffset={FLOATING_ELEMENT_SIDE_OFFSET} + collisionPadding={FLOATING_ELEMENT_COLLISION_PADDING} + side="top" + align="center" + > + + + ); + })} + {remainingUsersCount > 0 ? ( + + {hiddenUserIds.map((userId) => + userId ? ( +
  • + + +
  • + ) : null + )} + + } + 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 = ( + + +
    + )} + + ) : ( +
    +

    {$.COMMENT_DELETED}

    +
    ); + content = + typeof children === "function" + ? children({ comment, children: content }) + : (children ?? content); + } + return ( - {autoMarkReadThreadId && ( - - )}
    - - - + {avatar} +
    + ) : ( + - - + {author ? ( + + {author} + + ) : ( + - {comment.editedAt && comment.body && ( - <> - {" "} - - {$.COMMENT_EDITED} - - - )} - + )} + {date ? ( + {date} + ) : ( + + + {comment.editedAt && comment.body && ( + <> + {" "} + + {$.COMMENT_EDITED} + + + )} + + )}
    {showActions && !isEditing && ( @@ -905,145 +1120,34 @@ export const Comment = Object.assign(
    )}
    -
    - {isEditing ? ( - - -
    - )} - - ) : ( -
    -

    {$.COMMENT_DELETED}

    -
    - )} - +
    {content}
    ); } - ), + ) as ( + props: CommentProps & RefAttributes + ) => JSX.Element, { /** * Displays a dropdown item in the comment's dropdown. */ DropdownItem: CommentDropdownItem, + + /** + * Displays a comment's avatar. + */ + Avatar: CommentAvatar, + + /** + * Displays a comment's author. + */ + Author: CommentAuthor, + + /** + * Displays a comment's date. + */ + Date: CommentDate, } ); diff --git a/packages/liveblocks-react-ui/src/components/CommentPin.tsx b/packages/liveblocks-react-ui/src/components/CommentPin.tsx new file mode 100644 index 0000000000..10fa26f76b --- /dev/null +++ b/packages/liveblocks-react-ui/src/components/CommentPin.tsx @@ -0,0 +1,59 @@ +"use client"; + +import type { ComponentPropsWithoutRef, CSSProperties } from "react"; +import { forwardRef } from "react"; + +import { cn } from "../utils/cn"; +import { Avatar } from "./internal/Avatar"; + +export interface CommentPinProps extends ComponentPropsWithoutRef<"button"> { + /** + * The corner that points to the comment position. + * Defaults to the bottom left corner. + */ + corner?: "top-left" | "top-right" | "bottom-right" | "bottom-left"; + + /** + * The user ID to optionally display an avatar for. + */ + userId?: string; + + /** + * The size of the pin. + */ + size?: string | number; +} + +/** + * Displays a comment pin that can be used as a trigger + * for `FloatingComposer` and `FloatingThread`. + */ +export const CommentPin = forwardRef( + ( + { + corner = "bottom-left", + userId, + size, + type = "button", + className, + style, + ...props + }, + forwardedRef + ) => { + return ( + + ); + } +); 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,