diff --git a/app/panel/inspect/server/[id]/page.tsx b/app/panel/inspect/server/[id]/page.tsx
index 1dd8cba..1f675e7 100644
--- a/app/panel/inspect/server/[id]/page.tsx
+++ b/app/panel/inspect/server/[id]/page.tsx
@@ -3,6 +3,8 @@ import { ServerCard } from "@/components/cards/ServerCard";
import { UserCard } from "@/components/cards/UserCard";
import { NavigationToolbar } from "@/components/common/NavigationToolbar";
import { RecentMessages } from "@/components/inspector/RecentMessages";
+import { ServerActions } from "@/components/inspector/ServerActions";
+import { Card, CardHeader } from "@/components/ui/card";
import { Separator } from "@/components/ui/separator";
import { fetchServerById, fetchUserById } from "@/lib/db";
import Link from "next/link";
@@ -18,6 +20,14 @@ export default async function Server({ params }: { params: { id: string } }) {
Inspecting Server
+
+ {server.description && (
+
+
+ {server.description}
+
+
+ )}
diff --git a/app/panel/inspect/user/[id]/page.tsx b/app/panel/inspect/user/[id]/page.tsx
index be6c7fc..5e406cd 100644
--- a/app/panel/inspect/user/[id]/page.tsx
+++ b/app/panel/inspect/user/[id]/page.tsx
@@ -10,6 +10,7 @@ import { Card, CardHeader } from "@/components/ui/card";
import { Separator } from "@/components/ui/separator";
import { PLATFORM_MOD_ID } from "@/lib/constants";
import {
+ fetchBotById,
fetchBotsByUser,
fetchMembershipsByUser,
fetchMessages,
@@ -23,6 +24,7 @@ import {
} from "@/lib/db";
import Link from "next/link";
import { notFound } from "next/navigation";
+import { Bot } from "revolt-api";
export default async function User({
params,
@@ -32,6 +34,7 @@ export default async function User({
const user = await fetchUserById(params.id);
if (!user) return notFound();
+ const bot = user.bot ? await fetchBotById(user._id) : undefined;
const botOwner = user.bot ? await fetchUserById(user.bot.owner) : undefined;
// Fetch strikes
@@ -86,16 +89,7 @@ export default async function User({
Inspecting User
-
x.status === "Outgoing" || x.status === "Incoming"
- ).length ?? 0,
- all: user.relations?.length ?? 0,
- }}
- />
+
{user.profile?.content && (
diff --git a/components/inspector/ServerActions.tsx b/components/inspector/ServerActions.tsx
new file mode 100644
index 0000000..4a24e2c
--- /dev/null
+++ b/components/inspector/ServerActions.tsx
@@ -0,0 +1,138 @@
+"use client";
+
+import { Server } from "revolt-api";
+import { Button } from "../ui/button";
+import {
+ Command,
+ CommandEmpty,
+ CommandGroup,
+ CommandInput,
+ CommandItem,
+} from "@/components/ui/command";
+import {
+ Popover,
+ PopoverContent,
+ PopoverTrigger,
+} from "@/components/ui/popover";
+import { Check, ChevronsUpDown } from "lucide-react";
+import { cn } from "@/lib/utils";
+import { useState } from "react";
+import { updateServerDiscoverability, updateServerFlags } from "@/lib/actions";
+import { useToast } from "../ui/use-toast";
+
+export function ServerActions({ server }: { server: Server }) {
+ const [selectBadges, setSelectBadges] = useState(false);
+ const [serverDraft, setDraft] = useState(server);
+ const { toast } = useToast();
+
+ return (
+
+ {serverDraft.discoverable ? (
+
+ ) : (
+
+ )}
+
+
+
+
+
+
+
+
+ {[
+ { value: 0, label: "No Badge" },
+ { value: 1, label: "Official" },
+ { value: 2, label: "Verified" },
+ ].map((flag) => (
+ {
+ setSelectBadges(false);
+
+ try {
+ await updateServerFlags(server._id, flag.value);
+ setDraft((server) => ({ ...server, flags: flag.value }));
+ toast({
+ title: "Updated server flags",
+ });
+ } catch (err) {
+ toast({
+ title: "Failed to update server flags",
+ description: "" + err,
+ variant: "destructive",
+ });
+ }
+ }}
+ >
+
+ {flag.label}
+
+ ))}
+
+
+
+
+
+
+ );
+}
diff --git a/components/inspector/UserActions.tsx b/components/inspector/UserActions.tsx
index d948cf8..d8a1abf 100644
--- a/components/inspector/UserActions.tsx
+++ b/components/inspector/UserActions.tsx
@@ -20,28 +20,76 @@ import {
AlertDialogTrigger,
} from "../ui/alert-dialog";
import { Input } from "../ui/input";
-import { banUser, sendAlert, suspendUser } from "@/lib/actions";
-import { useRef } from "react";
+import {
+ banUser,
+ sendAlert,
+ suspendUser,
+ updateBotDiscoverability,
+} from "@/lib/actions";
+import { useRef, useState } from "react";
import { useToast } from "../ui/use-toast";
+import { Bot, User } from "revolt-api";
-export function UserActions({
- id,
- counts,
-}: {
- id: string;
- counts: { pending: number; all: number };
-}) {
+export function UserActions({ user, bot }: { user: User; bot?: Bot }) {
const alertMessage = useRef("");
const { toast } = useToast();
+ const [botDraft, setBotDraft] = useState(bot);
+
return (
-
- Account
-
+ {bot ? (
+ botDraft!.discoverable ? (
+
+ ) : (
+
+ )
+ ) : (
+
+ Account
+
+ )}
@@ -59,7 +107,7 @@ export function UserActions({
Cancel
- suspendUser(id)
+ suspendUser(user._id)
.then(() => toast({ title: "Suspended user" }))
.catch((err) =>
toast({
@@ -92,7 +140,7 @@ export function UserActions({
Cancel
- banUser(id)
+ banUser(user._id)
.then(() => toast({ title: "Banned user" }))
.catch((err) =>
toast({
@@ -150,7 +198,7 @@ export function UserActions({
if (!alertMessage.current) return;
alertMessage.current = "";
- sendAlert(id, alertMessage.current)
+ sendAlert(user._id, alertMessage.current)
.then(() => toast({ title: "Sent Alert" }))
.catch((err) =>
toast({
diff --git a/components/ui/command.tsx b/components/ui/command.tsx
new file mode 100644
index 0000000..6e83af0
--- /dev/null
+++ b/components/ui/command.tsx
@@ -0,0 +1,155 @@
+"use client"
+
+import * as React from "react"
+import { DialogProps } from "@radix-ui/react-dialog"
+import { Command as CommandPrimitive } from "cmdk"
+import { Search } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+import { Dialog, DialogContent } from "@/components/ui/dialog"
+
+const Command = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+Command.displayName = CommandPrimitive.displayName
+
+interface CommandDialogProps extends DialogProps {}
+
+const CommandDialog = ({ children, ...props }: CommandDialogProps) => {
+ return (
+
+ )
+}
+
+const CommandInput = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+
+))
+
+CommandInput.displayName = CommandPrimitive.Input.displayName
+
+const CommandList = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+
+CommandList.displayName = CommandPrimitive.List.displayName
+
+const CommandEmpty = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>((props, ref) => (
+
+))
+
+CommandEmpty.displayName = CommandPrimitive.Empty.displayName
+
+const CommandGroup = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+
+CommandGroup.displayName = CommandPrimitive.Group.displayName
+
+const CommandSeparator = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+CommandSeparator.displayName = CommandPrimitive.Separator.displayName
+
+const CommandItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+
+CommandItem.displayName = CommandPrimitive.Item.displayName
+
+const CommandShortcut = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => {
+ return (
+
+ )
+}
+CommandShortcut.displayName = "CommandShortcut"
+
+export {
+ Command,
+ CommandDialog,
+ CommandInput,
+ CommandList,
+ CommandEmpty,
+ CommandGroup,
+ CommandItem,
+ CommandShortcut,
+ CommandSeparator,
+}
diff --git a/components/ui/dialog.tsx b/components/ui/dialog.tsx
new file mode 100644
index 0000000..2f33766
--- /dev/null
+++ b/components/ui/dialog.tsx
@@ -0,0 +1,123 @@
+"use client"
+
+import * as React from "react"
+import * as DialogPrimitive from "@radix-ui/react-dialog"
+import { X } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+const Dialog = DialogPrimitive.Root
+
+const DialogTrigger = DialogPrimitive.Trigger
+
+const DialogPortal = ({
+ className,
+ ...props
+}: DialogPrimitive.DialogPortalProps) => (
+
+)
+DialogPortal.displayName = DialogPrimitive.Portal.displayName
+
+const DialogOverlay = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+DialogOverlay.displayName = DialogPrimitive.Overlay.displayName
+
+const DialogContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+
+
+ {children}
+
+
+ Close
+
+
+
+))
+DialogContent.displayName = DialogPrimitive.Content.displayName
+
+const DialogHeader = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => (
+
+)
+DialogHeader.displayName = "DialogHeader"
+
+const DialogFooter = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => (
+
+)
+DialogFooter.displayName = "DialogFooter"
+
+const DialogTitle = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+DialogTitle.displayName = DialogPrimitive.Title.displayName
+
+const DialogDescription = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+DialogDescription.displayName = DialogPrimitive.Description.displayName
+
+export {
+ Dialog,
+ DialogTrigger,
+ DialogContent,
+ DialogHeader,
+ DialogFooter,
+ DialogTitle,
+ DialogDescription,
+}
diff --git a/lib/actions.ts b/lib/actions.ts
index 7ddaf91..e3af849 100644
--- a/lib/actions.ts
+++ b/lib/actions.ts
@@ -15,9 +15,11 @@ import { publishMessage, sendChatMessage } from "./redis";
import { ulid } from "ulid";
import {
AccountInfo,
+ Bot,
File,
Member,
Message,
+ Server,
SessionInfo,
User,
} from "revolt-api";
@@ -176,3 +178,62 @@ export async function wipeUser(userId: string, flags = 4) {
export async function banUser(userId: string) {
return await wipeUser(userId, 4);
}
+
+export async function updateServerFlags(serverId: string, flags: number) {
+ await mongo().db("revolt").collection("servers").updateOne(
+ {
+ _id: serverId,
+ },
+ {
+ $set: {
+ flags,
+ },
+ }
+ );
+
+ await publishMessage(serverId, {
+ type: "ServerUpdate",
+ id: serverId,
+ data: {
+ flags,
+ },
+ clear: [],
+ });
+}
+
+export async function updateServerDiscoverability(
+ serverId: string,
+ state: boolean
+) {
+ await mongo()
+ .db("revolt")
+ .collection("servers")
+ .updateOne(
+ {
+ _id: serverId,
+ },
+ {
+ $set: {
+ analytics: state,
+ discoverable: state,
+ },
+ }
+ );
+}
+
+export async function updateBotDiscoverability(botId: string, state: boolean) {
+ await mongo()
+ .db("revolt")
+ .collection("bots")
+ .updateOne(
+ {
+ _id: botId,
+ },
+ {
+ $set: {
+ analytics: state,
+ discoverable: state,
+ },
+ }
+ );
+}
diff --git a/lib/db.ts b/lib/db.ts
index 6607f4e..0f2cc24 100644
--- a/lib/db.ts
+++ b/lib/db.ts
@@ -26,6 +26,13 @@ function mongo() {
export default mongo;
+export async function fetchBotById(id: string) {
+ return await mongo()
+ .db("revolt")
+ .collection("bots")
+ .findOne({ _id: id });
+}
+
export async function fetchUserById(id: string) {
return await mongo()
.db("revolt")
diff --git a/package.json b/package.json
index 46df035..01ab5b0 100644
--- a/package.json
+++ b/package.json
@@ -11,6 +11,7 @@
"dependencies": {
"@radix-ui/react-alert-dialog": "^1.0.4",
"@radix-ui/react-avatar": "^1.0.3",
+ "@radix-ui/react-dialog": "^1.0.4",
"@radix-ui/react-dropdown-menu": "^2.0.5",
"@radix-ui/react-label": "^2.0.2",
"@radix-ui/react-popover": "^1.0.6",
@@ -23,6 +24,7 @@
"autoprefixer": "10.4.14",
"class-variance-authority": "^0.7.0",
"clsx": "^2.0.0",
+ "cmdk": "^0.2.0",
"dayjs": "^1.11.9",
"eslint": "8.45.0",
"eslint-config-next": "13.4.12",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index cbc5415..429977c 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -7,6 +7,9 @@ dependencies:
'@radix-ui/react-avatar':
specifier: ^1.0.3
version: 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-dialog':
+ specifier: ^1.0.4
+ version: 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-dropdown-menu':
specifier: ^2.0.5
version: 2.0.5(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0)
@@ -43,6 +46,9 @@ dependencies:
clsx:
specifier: ^2.0.0
version: 2.0.0
+ cmdk:
+ specifier: ^0.2.0
+ version: 0.2.0(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0)
dayjs:
specifier: ^1.11.9
version: 1.11.9
@@ -382,6 +388,12 @@ packages:
tslib: 2.6.0
dev: false
+ /@radix-ui/primitive@1.0.0:
+ resolution: {integrity: sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==}
+ dependencies:
+ '@babel/runtime': 7.22.6
+ dev: false
+
/@radix-ui/primitive@1.0.1:
resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==}
dependencies:
@@ -483,6 +495,15 @@ packages:
react-dom: 18.2.0(react@18.2.0)
dev: false
+ /@radix-ui/react-compose-refs@1.0.0(react@18.2.0):
+ resolution: {integrity: sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==}
+ peerDependencies:
+ react: ^16.8 || ^17.0 || ^18.0
+ dependencies:
+ '@babel/runtime': 7.22.6
+ react: 18.2.0
+ dev: false
+
/@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.15)(react@18.2.0):
resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==}
peerDependencies:
@@ -497,6 +518,15 @@ packages:
react: 18.2.0
dev: false
+ /@radix-ui/react-context@1.0.0(react@18.2.0):
+ resolution: {integrity: sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==}
+ peerDependencies:
+ react: ^16.8 || ^17.0 || ^18.0
+ dependencies:
+ '@babel/runtime': 7.22.6
+ react: 18.2.0
+ dev: false
+
/@radix-ui/react-context@1.0.1(@types/react@18.2.15)(react@18.2.0):
resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==}
peerDependencies:
@@ -511,6 +541,33 @@ packages:
react: 18.2.0
dev: false
+ /@radix-ui/react-dialog@1.0.0(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-Yn9YU+QlHYLWwV1XfKiqnGVpWYWk6MeBVM6x/bcoyPvxgjQGoeT35482viLPctTMWoMw0PoHgqfSox7Ig+957Q==}
+ peerDependencies:
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@radix-ui/primitive': 1.0.0
+ '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0)
+ '@radix-ui/react-context': 1.0.0(react@18.2.0)
+ '@radix-ui/react-dismissable-layer': 1.0.0(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-focus-guards': 1.0.0(react@18.2.0)
+ '@radix-ui/react-focus-scope': 1.0.0(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-id': 1.0.0(react@18.2.0)
+ '@radix-ui/react-portal': 1.0.0(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-presence': 1.0.0(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-slot': 1.0.0(react@18.2.0)
+ '@radix-ui/react-use-controllable-state': 1.0.0(react@18.2.0)
+ aria-hidden: 1.2.3
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ react-remove-scroll: 2.5.4(@types/react@18.2.15)(react@18.2.0)
+ transitivePeerDependencies:
+ - '@types/react'
+ dev: false
+
/@radix-ui/react-dialog@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-hJtRy/jPULGQZceSAP2Re6/4NpKo8im6V8P2hUqZsdFiSL8l35kYsw3qbRI6Ay5mQd2+wlLqje770eq+RJ3yZg==}
peerDependencies:
@@ -559,6 +616,22 @@ packages:
react: 18.2.0
dev: false
+ /@radix-ui/react-dismissable-layer@1.0.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-n7kDRfx+LB1zLueRDvZ1Pd0bxdJWDUZNQ/GWoxDn2prnuJKRdxsjulejX/ePkOsLi2tTm6P24mDqlMSgQpsT6g==}
+ peerDependencies:
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@radix-ui/primitive': 1.0.0
+ '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0)
+ '@radix-ui/react-use-escape-keydown': 1.0.0(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
/@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==}
peerDependencies:
@@ -611,6 +684,15 @@ packages:
react-dom: 18.2.0(react@18.2.0)
dev: false
+ /@radix-ui/react-focus-guards@1.0.0(react@18.2.0):
+ resolution: {integrity: sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ==}
+ peerDependencies:
+ react: ^16.8 || ^17.0 || ^18.0
+ dependencies:
+ '@babel/runtime': 7.22.6
+ react: 18.2.0
+ dev: false
+
/@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.15)(react@18.2.0):
resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==}
peerDependencies:
@@ -625,6 +707,20 @@ packages:
react: 18.2.0
dev: false
+ /@radix-ui/react-focus-scope@1.0.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-C4SWtsULLGf/2L4oGeIHlvWQx7Rf+7cX/vKOAD2dXW0A1b5QXwi3wWeaEgW+wn+SEVrraMUk05vLU9fZZz5HbQ==}
+ peerDependencies:
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
/@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==}
peerDependencies:
@@ -648,6 +744,16 @@ packages:
react-dom: 18.2.0(react@18.2.0)
dev: false
+ /@radix-ui/react-id@1.0.0(react@18.2.0):
+ resolution: {integrity: sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==}
+ peerDependencies:
+ react: ^16.8 || ^17.0 || ^18.0
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@radix-ui/react-use-layout-effect': 1.0.0(react@18.2.0)
+ react: 18.2.0
+ dev: false
+
/@radix-ui/react-id@1.0.1(@types/react@18.2.15)(react@18.2.0):
resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==}
peerDependencies:
@@ -787,6 +893,18 @@ packages:
react-dom: 18.2.0(react@18.2.0)
dev: false
+ /@radix-ui/react-portal@1.0.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA==}
+ peerDependencies:
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
/@radix-ui/react-portal@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==}
peerDependencies:
@@ -808,6 +926,19 @@ packages:
react-dom: 18.2.0(react@18.2.0)
dev: false
+ /@radix-ui/react-presence@1.0.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==}
+ peerDependencies:
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0)
+ '@radix-ui/react-use-layout-effect': 1.0.0(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
/@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==}
peerDependencies:
@@ -830,6 +961,18 @@ packages:
react-dom: 18.2.0(react@18.2.0)
dev: false
+ /@radix-ui/react-primitive@1.0.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==}
+ peerDependencies:
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@radix-ui/react-slot': 1.0.0(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
/@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==}
peerDependencies:
@@ -901,6 +1044,16 @@ packages:
react-dom: 18.2.0(react@18.2.0)
dev: false
+ /@radix-ui/react-slot@1.0.0(react@18.2.0):
+ resolution: {integrity: sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==}
+ peerDependencies:
+ react: ^16.8 || ^17.0 || ^18.0
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0)
+ react: 18.2.0
+ dev: false
+
/@radix-ui/react-slot@1.0.2(@types/react@18.2.15)(react@18.2.0):
resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==}
peerDependencies:
@@ -948,6 +1101,15 @@ packages:
react-dom: 18.2.0(react@18.2.0)
dev: false
+ /@radix-ui/react-use-callback-ref@1.0.0(react@18.2.0):
+ resolution: {integrity: sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==}
+ peerDependencies:
+ react: ^16.8 || ^17.0 || ^18.0
+ dependencies:
+ '@babel/runtime': 7.22.6
+ react: 18.2.0
+ dev: false
+
/@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.15)(react@18.2.0):
resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==}
peerDependencies:
@@ -962,6 +1124,16 @@ packages:
react: 18.2.0
dev: false
+ /@radix-ui/react-use-controllable-state@1.0.0(react@18.2.0):
+ resolution: {integrity: sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==}
+ peerDependencies:
+ react: ^16.8 || ^17.0 || ^18.0
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0)
+ react: 18.2.0
+ dev: false
+
/@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.15)(react@18.2.0):
resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==}
peerDependencies:
@@ -977,6 +1149,16 @@ packages:
react: 18.2.0
dev: false
+ /@radix-ui/react-use-escape-keydown@1.0.0(react@18.2.0):
+ resolution: {integrity: sha512-JwfBCUIfhXRxKExgIqGa4CQsiMemo1Xt0W/B4ei3fpzpvPENKpMKQ8mZSB6Acj3ebrAEgi2xiQvcI1PAAodvyg==}
+ peerDependencies:
+ react: ^16.8 || ^17.0 || ^18.0
+ dependencies:
+ '@babel/runtime': 7.22.6
+ '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0)
+ react: 18.2.0
+ dev: false
+
/@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.15)(react@18.2.0):
resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==}
peerDependencies:
@@ -992,6 +1174,15 @@ packages:
react: 18.2.0
dev: false
+ /@radix-ui/react-use-layout-effect@1.0.0(react@18.2.0):
+ resolution: {integrity: sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==}
+ peerDependencies:
+ react: ^16.8 || ^17.0 || ^18.0
+ dependencies:
+ '@babel/runtime': 7.22.6
+ react: 18.2.0
+ dev: false
+
/@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.15)(react@18.2.0):
resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==}
peerDependencies:
@@ -1572,6 +1763,20 @@ packages:
engines: {node: '>=0.10.0'}
dev: false
+ /cmdk@0.2.0(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-JQpKvEOb86SnvMZbYaFKYhvzFntWBeSZdyii0rZPhKJj9uwJBxu4DaVYDrRN7r3mPop56oPhRw+JYWTKs66TYw==}
+ peerDependencies:
+ react: ^18.0.0
+ react-dom: ^18.0.0
+ dependencies:
+ '@radix-ui/react-dialog': 1.0.0(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0)
+ command-score: 0.1.2
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ transitivePeerDependencies:
+ - '@types/react'
+ dev: false
+
/color-convert@2.0.1:
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
engines: {node: '>=7.0.0'}
@@ -1583,6 +1788,10 @@ packages:
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
dev: false
+ /command-score@0.1.2:
+ resolution: {integrity: sha512-VtDvQpIJBvBatnONUsPzXYFVKQQAhuf3XTNOAsdBxCNO/QCtUUd8LSgjn0GVarBkCad6aJCZfXgrjYbl/KRr7w==}
+ dev: false
+
/commander@4.1.1:
resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
engines: {node: '>= 6'}
@@ -3359,6 +3568,25 @@ packages:
tslib: 2.6.0
dev: false
+ /react-remove-scroll@2.5.4(@types/react@18.2.15)(react@18.2.0):
+ resolution: {integrity: sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA==}
+ 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
+ dependencies:
+ '@types/react': 18.2.15
+ react: 18.2.0
+ react-remove-scroll-bar: 2.3.4(@types/react@18.2.15)(react@18.2.0)
+ react-style-singleton: 2.2.1(@types/react@18.2.15)(react@18.2.0)
+ tslib: 2.6.0
+ use-callback-ref: 1.3.0(@types/react@18.2.15)(react@18.2.0)
+ use-sidecar: 1.1.2(@types/react@18.2.15)(react@18.2.0)
+ dev: false
+
/react-remove-scroll@2.5.5(@types/react@18.2.15)(react@18.2.0):
resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==}
engines: {node: '>=10'}