From 19d8db9a20310809fb28ff33ac298e51cf33301c Mon Sep 17 00:00:00 2001 From: swve Date: Mon, 1 Jan 2024 18:13:17 +0100 Subject: [PATCH] feat: add activity ai chatbot UI and functionality --- apps/web/app/layout.tsx | 2 + .../activity/[activityid]/activity.tsx | 39 +-- apps/web/components/AI/AIActivityAsk.tsx | 222 ++++++++++++++++++ apps/web/components/Objects/Menu/Menu.tsx | 2 +- apps/web/package-lock.json | 84 ++----- apps/web/package.json | 1 + apps/web/public/learnhouse_ai_black_logo.png | Bin 0 -> 32914 bytes apps/web/public/learnhouse_ai_simple.png | Bin 0 -> 8699 bytes apps/web/services/ai/ai.ts | 23 ++ apps/web/tailwind.config.js | 4 +- pnpm-lock.yaml | 49 +--- 11 files changed, 312 insertions(+), 114 deletions(-) create mode 100644 apps/web/components/AI/AIActivityAsk.tsx create mode 100644 apps/web/public/learnhouse_ai_black_logo.png create mode 100644 apps/web/public/learnhouse_ai_simple.png create mode 100644 apps/web/services/ai/ai.ts diff --git a/apps/web/app/layout.tsx b/apps/web/app/layout.tsx index 84c73f3a..e4dea8d8 100644 --- a/apps/web/app/layout.tsx +++ b/apps/web/app/layout.tsx @@ -1,6 +1,8 @@ "use client"; import "../styles/globals.css"; import StyledComponentsRegistry from "../components/Utils/libs/styled-registry"; +import { GeistSans } from 'geist/font/sans'; + import { motion } from "framer-motion"; export default function RootLayout({ children }: { children: React.ReactNode }) { diff --git a/apps/web/app/orgs/[orgslug]/(withmenu)/course/[courseuuid]/activity/[activityid]/activity.tsx b/apps/web/app/orgs/[orgslug]/(withmenu)/course/[courseuuid]/activity/[activityid]/activity.tsx index 9a052d06..b490df4d 100644 --- a/apps/web/app/orgs/[orgslug]/(withmenu)/course/[courseuuid]/activity/[activityid]/activity.tsx +++ b/apps/web/app/orgs/[orgslug]/(withmenu)/course/[courseuuid]/activity/[activityid]/activity.tsx @@ -3,7 +3,7 @@ import Link from "next/link"; import { getUriWithOrg } from "@services/config/config"; import Canva from "@components/Objects/Activities/DynamicCanva/DynamicCanva"; import VideoActivity from "@components/Objects/Activities/Video/Video"; -import { Check } from "lucide-react"; +import { Check, MoreVertical } from "lucide-react"; import { markActivityAsComplete } from "@services/courses/activity"; import DocumentPdfActivity from "@components/Objects/Activities/DocumentPdf/DocumentPdf"; import ActivityIndicators from "@components/Pages/Courses/ActivityIndicators"; @@ -13,6 +13,7 @@ import AuthenticatedClientElement from "@components/Security/AuthenticatedClient import { getCourseThumbnailMediaDirectory } from "@services/media/media"; import { useOrg } from "@components/Contexts/OrgContext"; import { CourseProvider } from "@components/Contexts/CourseContext"; +import AIActivityAsk from "@components/AI/AIActivityAsk"; interface ActivityClientProps { activityid: string; @@ -31,14 +32,17 @@ function ActivityClient(props: ActivityClientProps) { const course = props.course; const org = useOrg() as any; - function getChapterName(chapterId: string) { - let chapterName = ""; - course.chapters.forEach((chapter: any) => { - if (chapter.id === chapterId) { - chapterName = chapter.name; + function getChapterNameByActivityId(course: any, activity_id: any) { + for (let i = 0; i < course.chapters.length; i++) { + let chapter = course.chapters[i]; + for (let j = 0; j < chapter.activities.length; j++) { + let activity = chapter.activities[j]; + if (activity.id === activity_id) { + return chapter.name; + } } - }); - return chapterName; + } + return null; // return null if no matching activity is found } @@ -63,13 +67,14 @@ function ActivityClient(props: ActivityClientProps) {
-

Chapter : {getChapterName(activity.coursechapter_id)}

+

Chapter : {getChapterNameByActivityId(course, activity.id)}

{activity.name}

-
+
+ + -
@@ -114,19 +119,19 @@ export function MarkStatus(props: { activity: any, activityid: string, course: a return ( <>{isActivityCompleted() ? ( -
+
- + {" "} - Already completed + Already completed
) : ( -
+
{" "} - + {" "} - Mark as complete + Mark as complete
)} ) diff --git a/apps/web/components/AI/AIActivityAsk.tsx b/apps/web/components/AI/AIActivityAsk.tsx new file mode 100644 index 00000000..75281795 --- /dev/null +++ b/apps/web/components/AI/AIActivityAsk.tsx @@ -0,0 +1,222 @@ +import { useSession } from '@components/Contexts/SessionContext' +import { sendActivityAIChatMessage, startActivityAIChatSession } from '@services/ai/ai'; +import Avvvatars from 'avvvatars-react'; +import { motion, AnimatePresence } from 'framer-motion'; +import { FlaskConical, Keyboard, Sparkle, Sparkles, X } from 'lucide-react' +import Image from 'next/image'; +import { send } from 'process'; +import learnhouseAI_icon from "public/learnhouse_ai_simple.png"; +import learnhouseAI_logo_black from "public/learnhouse_ai_black_logo.png"; +import React, { useEffect, useRef } from 'react' + + +type AIActivityAskProps = { + activity: any; +} + + +function AIActivityAsk(props: AIActivityAskProps) { + const [isAIModalOpen, setIsAIModalOpen] = React.useState(false); + + + return ( +
+ +
setIsAIModalOpen(true)} + style={{ + background: 'conic-gradient(from 32deg at 53.75% 50%, rgb(35, 40, 93) 4deg, rgba(20, 0, 52, 0.95) 59deg, rgba(164, 45, 238, 0.88) 281deg)', + }} + className="rounded-full px-5 drop-shadow-md flex items-center space-x-1 p-2.5 text-sm text-white hover:cursor-pointer transition delay-150 duration-300 ease-in-out hover:scale-105"> + {" "} + + + {" "} + Ask AI +
+
+ ) +} + +type Message = { + sender: string; + message: any; + type: 'ai' | 'user'; +} + +type ActivityChatMessageBoxProps = { + activity: any; + isAIModalOpen?: boolean; + setIsAIModalOpen?: any; +} + +function ActivityChatMessageBox(props: ActivityChatMessageBoxProps) { + const session = useSession() as any; + const [messages, setMessages] = React.useState([]) as [Message[], any]; + const [aichat_uuid, setAichat_uuid] = React.useState(''); + const [isWaitingForResponse, setIsWaitingForResponse] = React.useState(false); + const [chatInputValue, setChatInputValue] = React.useState('') as [string, any]; + + // TODO : come up with a better way to handle this + const inputClass = isWaitingForResponse + ? 'ring-1 ring-inset ring-white/10 bg-transparent w-full rounded-lg outline-none px-4 py-2 text-white text-sm placeholder:text-white/30 opacity-30' + : 'ring-1 ring-inset ring-white/10 bg-transparent w-full rounded-lg outline-none px-4 py-2 text-white text-sm placeholder:text-white/30'; + + React.useEffect(() => { + + }, [session]); + + function handleKeyDown(event: React.KeyboardEvent) { + if (event.key === 'Enter') { + // Perform the sending action here + sendMessage(event.currentTarget.value); + } + } + + const handleChange = (event: React.ChangeEvent) => { + setChatInputValue(event.target.value); + } + + const sendMessage = async (message: string) => { + if (aichat_uuid) { + setMessages((messages: any) => [...messages, { sender: session.user.user_uuid, message: message, type: 'user' }]); + setIsWaitingForResponse(true); + const response = await sendActivityAIChatMessage(message, aichat_uuid, props.activity.activity_uuid) + setIsWaitingForResponse(false); + setChatInputValue(''); + setMessages((messages: any) => [...messages, { sender: 'ai', message: response.message, type: 'ai' }]); + } else { + setMessages((messages: any) => [...messages, { sender: session.user.user_uuid, message: message, type: 'user' }]); + setIsWaitingForResponse(true); + const response = await startActivityAIChatSession(message, props.activity.activity_uuid) + setAichat_uuid(response.aichat_uuid); + setIsWaitingForResponse(false); + setChatInputValue(''); + setMessages((messages: any) => [...messages, { sender: 'ai', message: response.message, type: 'ai' }]); + } + } + + function closeModal() { + props.setIsAIModalOpen(false); + } + + const messagesEndRef = useRef(null); + + useEffect(() => { + if (messagesEndRef.current) { + messagesEndRef.current.scrollIntoView({ behavior: 'smooth' }); + } + + }, [messages, session]); + + + if (props.isAIModalOpen) { + return ( + +
+
+
+ +
+
+ + Learnhouse AI +
+
+ + Experimental +
+ +
+
+ {messages.length > 0 ? ( +
+ {messages.map((message: Message, index: number) => { + return ( + + ) + })} +
+
+ ) : ( + + )} +
+
+ +
+
+ + +
+
+
+ + ) + } +} + +type AIMessageProps = { + message: Message; + animated: boolean; +} + +function AIMessage(props: AIMessageProps) { + const session = useSession() as any; + + const words = props.message.message.split(' '); + + return ( +
+
+ +
+
+

+ + {words.map((word: string, i: number) => ( + + {word + ' '} + + ))} + +

+
+
+ ) +} + +const AIMessagePlaceHolder = () => { + return ( +
+
+ +

How can we help today ?

+
+ Explain in simple examples + Generate flashcards + Break down in concepts +
+
+
+ ) +} + + +export default AIActivityAsk \ No newline at end of file diff --git a/apps/web/components/Objects/Menu/Menu.tsx b/apps/web/components/Objects/Menu/Menu.tsx index 4a933f26..af38aa01 100644 --- a/apps/web/components/Objects/Menu/Menu.tsx +++ b/apps/web/components/Objects/Menu/Menu.tsx @@ -1,5 +1,5 @@ 'use client'; -import React, { use, useEffect } from "react"; +import React, { useEffect } from "react"; import Link from "next/link"; import { getAPIUrl, getUriWithOrg } from "@services/config/config"; import { getOrganizationContextInfo, getOrganizationContextInfoWithoutCredentials } from "@services/organizations/orgs"; diff --git a/apps/web/package-lock.json b/apps/web/package-lock.json index e6daccda..0f9ded12 100644 --- a/apps/web/package-lock.json +++ b/apps/web/package-lock.json @@ -42,6 +42,7 @@ "styled-components": "^6.0.0-beta.9", "swr": "^2.2.4", "tailwind-merge": "^1.14.0", + "tailwind-scrollbar": "^3.0.5", "uuid": "^9.0.0", "y-indexeddb": "^9.0.9", "y-webrtc": "^10.2.3", @@ -77,7 +78,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, "engines": { "node": ">=10" }, @@ -2446,7 +2446,6 @@ "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, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -2459,7 +2458,6 @@ "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, "engines": { "node": ">= 8" } @@ -2468,7 +2466,6 @@ "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, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -4263,14 +4260,12 @@ "node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "devOptional": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -4282,8 +4277,7 @@ "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" }, "node_modules/argparse": { "version": "2.0.1", @@ -4606,7 +4600,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "devOptional": true, "engines": { "node": ">=8" } @@ -4624,7 +4617,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "devOptional": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -4723,7 +4715,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, "engines": { "node": ">= 6" } @@ -4783,7 +4774,6 @@ "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "devOptional": true, "funding": [ { "type": "individual", @@ -4810,7 +4800,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "devOptional": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -4935,7 +4924,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, "bin": { "cssesc": "bin/cssesc" }, @@ -5049,8 +5037,7 @@ "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" }, "node_modules/dir-glob": { "version": "3.0.1", @@ -5067,8 +5054,7 @@ "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" }, "node_modules/doctrine": { "version": "3.0.0", @@ -5704,7 +5690,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -5720,7 +5705,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -5744,7 +5728,6 @@ "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -5765,7 +5748,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "devOptional": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -5937,6 +5919,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/geist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/geist/-/geist-1.2.0.tgz", + "integrity": "sha512-RZsgCkGnSi1IV1Ozg3s6Ou4r/jzLff9+47ChjpJ5yX8ncEC/RwdStGwhdFzDcnSv0xU0+9J/fTX5Kht0NajTXA==", + "peerDependencies": { + "next": "^13.2 || ^14" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -6023,7 +6013,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -6379,7 +6368,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "devOptional": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -6457,7 +6445,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -6493,7 +6480,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "devOptional": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -6526,7 +6512,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "devOptional": true, "engines": { "node": ">=0.12.0" } @@ -6737,7 +6722,6 @@ "version": "1.20.0", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", - "dev": true, "bin": { "jiti": "bin/jiti.js" } @@ -6897,7 +6881,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, "engines": { "node": ">=10" } @@ -6905,8 +6888,7 @@ "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/linkify-it": { "version": "4.0.1", @@ -7079,7 +7061,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, "engines": { "node": ">= 8" } @@ -7088,7 +7069,6 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -7136,7 +7116,6 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", @@ -7240,7 +7219,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -7266,7 +7244,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, "engines": { "node": ">= 6" } @@ -7545,7 +7522,6 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, "engines": { "node": ">= 6" } @@ -7581,7 +7557,6 @@ "version": "15.1.0", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", @@ -7598,7 +7573,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, "dependencies": { "camelcase-css": "^2.0.1" }, @@ -7617,7 +7591,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", - "dev": true, "dependencies": { "lilconfig": "^2.0.5", "yaml": "^2.1.1" @@ -7646,7 +7619,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.11" }, @@ -7665,7 +7637,6 @@ "version": "6.0.13", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dev": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -8173,7 +8144,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, "dependencies": { "pify": "^2.3.0" } @@ -8182,7 +8152,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -8204,7 +8173,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "devOptional": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -8359,7 +8327,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -8424,7 +8391,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "funding": [ { "type": "github", @@ -8841,7 +8807,6 @@ "version": "3.34.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", - "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", @@ -8863,7 +8828,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, "engines": { "node": ">= 6" } @@ -8872,7 +8836,6 @@ "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -8931,11 +8894,21 @@ "url": "https://github.com/sponsors/dcastil" } }, + "node_modules/tailwind-scrollbar": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/tailwind-scrollbar/-/tailwind-scrollbar-3.0.5.tgz", + "integrity": "sha512-0ZwxTivevqq9BY9fRP9zDjHl7Tu+J5giBGbln+0O1R/7nHtBUKnjQcA1aTIhK7Oyjp6Uc/Dj6/dn8Dq58k5Uww==", + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "tailwindcss": "3.x" + } + }, "node_modules/tailwindcss": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", - "dev": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -8987,7 +8960,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, "dependencies": { "any-promise": "^1.0.0" } @@ -8996,7 +8968,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, "dependencies": { "thenify": ">= 3.1.0 < 4" }, @@ -9043,7 +9014,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "devOptional": true, "dependencies": { "is-number": "^7.0.0" }, @@ -9071,8 +9041,7 @@ "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" }, "node_modules/tsconfig-paths": { "version": "3.14.2", @@ -9622,7 +9591,6 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", - "dev": true, "engines": { "node": ">= 14" } diff --git a/apps/web/package.json b/apps/web/package.json index 27561c3e..ac6a098e 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -43,6 +43,7 @@ "styled-components": "^6.0.0-beta.9", "swr": "^2.2.4", "tailwind-merge": "^1.14.0", + "tailwind-scrollbar": "^3.0.5", "uuid": "^9.0.0", "y-indexeddb": "^9.0.9", "y-webrtc": "^10.2.3", diff --git a/apps/web/public/learnhouse_ai_black_logo.png b/apps/web/public/learnhouse_ai_black_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c0685c378c96e903c161fc5d79ec059f0a50d6f6 GIT binary patch literal 32914 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 N002ovPDHLkV1mbm)2aXf literal 0 HcmV?d00001 diff --git a/apps/web/public/learnhouse_ai_simple.png b/apps/web/public/learnhouse_ai_simple.png new file mode 100644 index 0000000000000000000000000000000000000000..3ea2de53c441d225390b0df73a6d4879fb9d5d59 GIT binary patch literal 8699 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'} - dev: true /@ampproject/remapping@2.2.1: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} @@ -1756,12 +1758,10 @@ packages: dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - dev: true /@nodelib/fs.stat@2.0.5: resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} - dev: true /@nodelib/fs.walk@1.2.8: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} @@ -1769,7 +1769,6 @@ packages: dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 - dev: true /@popperjs/core@2.11.8: resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} @@ -3127,7 +3126,6 @@ packages: /any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: true /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} @@ -3138,7 +3136,6 @@ packages: /arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - dev: true /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -3392,7 +3389,6 @@ packages: /camelcase-css@2.0.1: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} - dev: true /camelize@1.0.1: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} @@ -3535,7 +3531,6 @@ packages: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} hasBin: true - dev: true /csstype@3.1.2: resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} @@ -3629,7 +3624,6 @@ packages: /didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - dev: true /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} @@ -3640,7 +3634,6 @@ packages: /dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - dev: true /doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} @@ -4070,7 +4063,6 @@ packages: glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.5 - dev: true /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} @@ -4084,7 +4076,6 @@ packages: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: reusify: 1.0.4 - dev: true /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} @@ -4244,7 +4235,6 @@ packages: engines: {node: '>=10.13.0'} dependencies: is-glob: 4.0.3 - dev: true /glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} @@ -4259,7 +4249,6 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - dev: true /glob@7.1.7: resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} @@ -4660,7 +4649,6 @@ packages: /jiti@1.20.0: resolution: {integrity: sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==} hasBin: true - dev: true /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -4766,11 +4754,9 @@ packages: /lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} - dev: true /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true /linkify-it@4.0.1: resolution: {integrity: sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==} @@ -4887,7 +4873,6 @@ packages: /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - dev: true /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} @@ -4895,7 +4880,6 @@ packages: dependencies: braces: 3.0.2 picomatch: 2.3.1 - dev: true /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -4936,7 +4920,6 @@ packages: any-promise: 1.3.0 object-assign: 4.1.1 thenify-all: 1.6.0 - dev: true /nanoid@3.3.6: resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} @@ -5018,7 +5001,6 @@ packages: /object-hash@3.0.0: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} - dev: true /object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} @@ -5170,7 +5152,6 @@ packages: /pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} - dev: true /pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} @@ -5180,7 +5161,6 @@ packages: /pirates@4.0.6: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} - dev: true /postcss-import@15.1.0(postcss@8.4.31): resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} @@ -5192,7 +5172,6 @@ packages: postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 - dev: true /postcss-js@4.0.1(postcss@8.4.31): resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} @@ -5202,7 +5181,6 @@ packages: dependencies: camelcase-css: 2.0.1 postcss: 8.4.31 - dev: true /postcss-load-config@4.0.1(postcss@8.4.31): resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} @@ -5219,7 +5197,6 @@ packages: lilconfig: 2.1.0 postcss: 8.4.31 yaml: 2.3.2 - dev: true /postcss-nested@6.0.1(postcss@8.4.31): resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} @@ -5229,7 +5206,6 @@ packages: dependencies: postcss: 8.4.31 postcss-selector-parser: 6.0.13 - dev: true /postcss-selector-parser@6.0.13: resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} @@ -5237,7 +5213,6 @@ packages: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - dev: true /postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} @@ -5632,7 +5607,6 @@ packages: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} dependencies: pify: 2.3.0 - dev: true /readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} @@ -5744,7 +5718,6 @@ packages: /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} @@ -5769,7 +5742,6 @@ packages: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 - dev: true /safe-array-concat@1.0.1: resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} @@ -6025,7 +5997,6 @@ packages: mz: 2.7.0 pirates: 4.0.6 ts-interface-checker: 0.1.13 - dev: true /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} @@ -6058,6 +6029,15 @@ packages: resolution: {integrity: sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ==} dev: false + /tailwind-scrollbar@3.0.5(tailwindcss@3.3.3): + resolution: {integrity: sha512-0ZwxTivevqq9BY9fRP9zDjHl7Tu+J5giBGbln+0O1R/7nHtBUKnjQcA1aTIhK7Oyjp6Uc/Dj6/dn8Dq58k5Uww==} + engines: {node: '>=12.13.0'} + peerDependencies: + tailwindcss: 3.x + dependencies: + tailwindcss: 3.3.3 + dev: false + /tailwindcss@3.3.3: resolution: {integrity: sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==} engines: {node: '>=14.0.0'} @@ -6087,7 +6067,6 @@ packages: sucrase: 3.34.0 transitivePeerDependencies: - ts-node - dev: true /tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} @@ -6103,13 +6082,11 @@ packages: engines: {node: '>=0.8'} dependencies: thenify: 3.3.1 - dev: true /thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} dependencies: any-promise: 1.3.0 - dev: true /throttle-debounce@3.0.1: resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} @@ -6156,7 +6133,6 @@ packages: /ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - dev: true /tsconfig-paths@3.14.2: resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} @@ -6573,7 +6549,6 @@ packages: /yaml@2.3.2: resolution: {integrity: sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==} engines: {node: '>= 14'} - dev: true /yjs@13.6.8: resolution: {integrity: sha512-ZPq0hpJQb6f59B++Ngg4cKexDJTvfOgeiv0sBc4sUm8CaBWH7OQC4kcCgrqbjJ/B2+6vO49exvTmYfdlPtcjbg==}