diff --git a/apps/www/next.config.mjs b/apps/www/next.config.mjs index 91c22be..43e5dd9 100644 --- a/apps/www/next.config.mjs +++ b/apps/www/next.config.mjs @@ -41,6 +41,10 @@ const nextConfig = { { protocol: "https", hostname: "avatars.githubusercontent.com" + }, + { + protocol: "https", + hostname: "cdn.discordapp.com" } ], }, diff --git a/apps/www/package.json b/apps/www/package.json index 892e4c5..1b9dd74 100644 --- a/apps/www/package.json +++ b/apps/www/package.json @@ -21,6 +21,11 @@ "@clerk/nextjs": "^6.9.2", "@emotion/is-prop-valid": "^1.3.0", "@linear/sdk": "^31.0.0", + "@milkdown/plugin-history": "^7.9.0", + "@milkdown/plugin-listener": "^7.9.0", + "@milkdown/preset-commonmark": "^7.9.0", + "@milkdown/react": "^7.9.0", + "@milkdown/theme-nord": "^7.9.0", "@monaco-editor/react": "^4.6.0", "@number-flow/react": "^0.5.7", "@radix-ui/react-aspect-ratio": "1.1.1", diff --git a/apps/www/src/app/(main)/misc/see-waitlist-codes/page.tsx b/apps/www/src/app/(main)/misc/see-waitlist-codes/page.tsx new file mode 100644 index 0000000..e69de29 diff --git a/apps/www/src/config/affiliates.ts b/apps/www/src/app/(main)/waitlist/oauth-need-discord/page.tsx similarity index 85% rename from apps/www/src/config/affiliates.ts rename to apps/www/src/app/(main)/waitlist/oauth-need-discord/page.tsx index bbbbdce..181cccd 100644 --- a/apps/www/src/config/affiliates.ts +++ b/apps/www/src/app/(main)/waitlist/oauth-need-discord/page.tsx @@ -28,15 +28,8 @@ * OTHER DEALINGS IN THE SOFTWARE. */ -import { SVGProps } from "react"; +import { WaitlistDiscordNeeded } from "@/components/feat/waitlist/waitlist-discord-needed"; -export const affiliates: { - name: string; - shop: string; - line: string; - mode: string[]; - otherLinks: { - name: string; - icon: (props: SVGProps) => JSX.Element; - }[]; -}[] = []; +export default function OAuthNeedDiscord() { + return +} \ No newline at end of file diff --git a/apps/www/src/app/(main)/waitlist/page.tsx b/apps/www/src/app/(main)/waitlist/page.tsx new file mode 100644 index 0000000..b523ba8 --- /dev/null +++ b/apps/www/src/app/(main)/waitlist/page.tsx @@ -0,0 +1,35 @@ +/* + * MHSF, Minehut Server List + * All external content is rather licensed under the ECA Agreement + * located here: https://mhsf.app/docs/legal/external-content-agreement + * + * All code under MHSF is licensed under the MIT License + * by open source contributors + * + * Copyright (c) 2025 dvelo + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +import { WaitlistPage } from "@/components/feat/waitlist/waitlist-page"; + +export default function Waitlist() { + return +} \ No newline at end of file diff --git a/apps/www/src/app/(main)/waitlist/ref/page.tsx b/apps/www/src/app/(main)/waitlist/ref/page.tsx new file mode 100644 index 0000000..c790dce --- /dev/null +++ b/apps/www/src/app/(main)/waitlist/ref/page.tsx @@ -0,0 +1,35 @@ +/* + * MHSF, Minehut Server List + * All external content is rather licensed under the ECA Agreement + * located here: https://mhsf.app/docs/legal/external-content-agreement + * + * All code under MHSF is licensed under the MIT License + * by open source contributors + * + * Copyright (c) 2025 dvelo + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +import { WaitlistReferralBeta } from "@/components/feat/waitlist/waitlist-referral-beta"; + +export default function ReferralBeta() { + return +} \ No newline at end of file diff --git a/apps/www/src/app/(sl-modification-frame)/servers/embedded/sl-modification-frame/category/[category]/modification/[mod]/page.tsx b/apps/www/src/app/(sl-modification-frame)/servers/embedded/sl-modification-frame/category/[category]/modification/[mod]/page.tsx index 9815bc8..b398466 100644 --- a/apps/www/src/app/(sl-modification-frame)/servers/embedded/sl-modification-frame/category/[category]/modification/[mod]/page.tsx +++ b/apps/www/src/app/(sl-modification-frame)/servers/embedded/sl-modification-frame/category/[category]/modification/[mod]/page.tsx @@ -38,6 +38,7 @@ import { ArrowLeft } from "lucide-react"; import { useQueryState } from "nuqs"; import { use } from "react"; import Markdown from "react-markdown"; +import { invertHex } from "../../page"; export default function ModificationPage({ params, @@ -48,7 +49,6 @@ export default function ModificationPage({ const [backRoute] = useQueryState("b", { defaultValue: "/servers/embedded/sl-modification-frame", }); - console.log(mod); const categoryObj = serverModDB.find( (c) => c.displayTitle === atob(decodeURIComponent(category)) ); @@ -65,7 +65,7 @@ export default function ModificationPage({ style={{ backgroundColor: modObj?.color }} > - + diff --git a/apps/www/src/app/(sl-modification-frame)/servers/embedded/sl-modification-frame/category/[category]/modification/custom/[custom-mod]/page.tsx b/apps/www/src/app/(sl-modification-frame)/servers/embedded/sl-modification-frame/category/[category]/modification/custom/[custom-mod]/page.tsx index 612c050..68f39bd 100644 --- a/apps/www/src/app/(sl-modification-frame)/servers/embedded/sl-modification-frame/category/[category]/modification/custom/[custom-mod]/page.tsx +++ b/apps/www/src/app/(sl-modification-frame)/servers/embedded/sl-modification-frame/category/[category]/modification/custom/[custom-mod]/page.tsx @@ -65,6 +65,7 @@ import { useQueryState } from "nuqs"; import { use } from "react"; import Markdown from "react-markdown"; import { toast } from "sonner"; +import { invertHex } from "../../../page"; export default function ModificationPage({ params, @@ -78,7 +79,6 @@ export default function ModificationPage({ const [backRoute] = useQueryState("b", { defaultValue: "/servers/embedded/sl-modification-frame", }); - console.log(mod); const modIndex = ( (user?.unsafeMetadata .activatedModifications as ClerkCustomActivatedModification[]) ?? [] @@ -109,7 +109,7 @@ export default function ModificationPage({ style={{ backgroundColor: modObj?.color }} > - + @@ -120,22 +120,27 @@ export default function ModificationPage({ you proud?)
- diff --git a/apps/www/src/app/(sl-modification-frame)/servers/embedded/sl-modification-frame/category/[category]/page.tsx b/apps/www/src/app/(sl-modification-frame)/servers/embedded/sl-modification-frame/category/[category]/page.tsx index aad2733..56f388d 100644 --- a/apps/www/src/app/(sl-modification-frame)/servers/embedded/sl-modification-frame/category/[category]/page.tsx +++ b/apps/www/src/app/(sl-modification-frame)/servers/embedded/sl-modification-frame/category/[category]/page.tsx @@ -51,7 +51,6 @@ export default async function ServerListCategoryFrame({ const categoryObj = serverModDB.find( (c) => c.displayTitle === atob(decodeURIComponent(category)), ); -`` return (

@@ -78,7 +77,10 @@ export default async function ServerListCategoryFrame({ )} style={{ backgroundColor: m.color }} > - +

{m.name} @@ -95,3 +97,27 @@ export default async function ServerListCategoryFrame({ ); } + +export function invertHex(hex: string) { + if (hex.indexOf("#") === 0) { + hex = hex.slice(1); + } + // convert 3-digit hex to 6-digits. + if (hex.length === 3) { + hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2]; + } + if (hex.length !== 6) { + throw new Error("Invalid HEX color."); + } + // invert color components + const r = (255 - parseInt(hex.slice(0, 2), 16)).toString(16), + g = (255 - parseInt(hex.slice(2, 4), 16)).toString(16), + b = (255 - parseInt(hex.slice(4, 6), 16)).toString(16); + // pad each with zeros and return + return "#" + padZero(r) + padZero(g) + padZero(b); +} +function padZero(str: string, len: number) { + len = len || 2; + const zeros = new Array(len).join("0"); + return (zeros + str).slice(-len); +} diff --git a/apps/www/src/app/(sl-modification-frame)/servers/embedded/sl-modification-frame/page.tsx b/apps/www/src/app/(sl-modification-frame)/servers/embedded/sl-modification-frame/page.tsx index 56ca594..2cd3a97 100644 --- a/apps/www/src/app/(sl-modification-frame)/servers/embedded/sl-modification-frame/page.tsx +++ b/apps/www/src/app/(sl-modification-frame)/servers/embedded/sl-modification-frame/page.tsx @@ -39,6 +39,7 @@ import { Button } from "@/components/ui/button"; import { useRouter } from "@/lib/useRouter"; import { SignedIn, useUser } from "@clerk/nextjs"; import { ClerkCustomActivatedModification } from "@/components/feat/server-list/modification/modification-file-creation-dialog"; +import { invertHex } from "./category/[category]/page"; export default function ServerListModificationFrame() { const router = useRouter(); @@ -81,7 +82,7 @@ export default function ServerListModificationFrame() {
- {c.entries.map((m) => ( + {c.entries.slice(0, 6).map((m) => ( - +
{m.name} @@ -124,7 +128,10 @@ export default function ServerListModificationFrame() { className="w-full h-[40px] mb-2 rounded-lg items-center text-center justify-center" style={{ backgroundColor: m.color }} > - + {m.friendlyName} diff --git a/apps/www/src/app/globals.css b/apps/www/src/app/globals.css index 69e5e1e..ca8e366 100644 --- a/apps/www/src/app/globals.css +++ b/apps/www/src/app/globals.css @@ -72,13 +72,6 @@ --sidebar-border: 220 13% 91%; --sidebar-ring: 217.2 91.2% 59.8%; - *, - ::before, - ::after { - /* Workaround for Tailwind being stupid */ - border-color: hsl(214.3 31.8% 91.4%); - } - --sidebar: hsl(0 0% 98%); } @@ -241,6 +234,19 @@ } } +::selection { + background: #7f600060 + +} + +.rainbow-tag { + background: linear-gradient(45deg, rgba(255, 0, 0, 1) 0%, rgba(255, 154, 0, 1) 10%, rgba(208, 222, 33, 1) 20%, rgba(79, 220, 74, 1) 30%, rgba(63, 218, 216, 1) 40%, rgba(47, 201, 226, 1) 50%, rgba(28, 127, 238, 1) 60%, rgba(95, 21, 242, 1) 70%, rgba(186, 12, 248, 1) 80%, rgba(251, 7, 217, 1) 90%, rgba(255, 0, 0, 1) 100%) +} + +.shiki { + @apply min-w-full +} + .loading-shimmer { -webkit-text-fill-color: transparent; animation-duration: 2s; diff --git a/apps/www/src/app/layout.tsx b/apps/www/src/app/layout.tsx index 3b5d3dc..3241fd1 100644 --- a/apps/www/src/app/layout.tsx +++ b/apps/www/src/app/layout.tsx @@ -52,7 +52,7 @@ export default function RootLayout({ title="JavaScript is required for MHSF" description="MHSF cannot grab servers or do other external requests without JavaScript." > - + diff --git a/apps/www/src/components/feat/embeds/embed.tsx b/apps/www/src/components/feat/embeds/embed.tsx index 78cfc93..20bb017 100644 --- a/apps/www/src/components/feat/embeds/embed.tsx +++ b/apps/www/src/components/feat/embeds/embed.tsx @@ -99,9 +99,7 @@ export default function Embed({ params }: { params: { server: string } }) {
diff --git a/apps/www/src/components/feat/footer/footer.tsx b/apps/www/src/components/feat/footer/footer.tsx index ad126be..bfd9ccf 100644 --- a/apps/www/src/components/feat/footer/footer.tsx +++ b/apps/www/src/components/feat/footer/footer.tsx @@ -58,7 +58,7 @@ export function Footer() { - + Minehut @@ -67,7 +67,7 @@ export function Footer() { - + @@ -78,7 +78,7 @@ export function Footer() { - + @@ -89,7 +89,7 @@ export function Footer() {
- + MHSF is an open-source project licensed under the MIT license. MHSF is not officially affiliated with with Minehut, Super League Enterprise, diff --git a/apps/www/src/components/feat/footer/status.tsx b/apps/www/src/components/feat/footer/status.tsx index 8106e79..daf8086 100644 --- a/apps/www/src/components/feat/footer/status.tsx +++ b/apps/www/src/components/feat/footer/status.tsx @@ -27,7 +27,7 @@ export function FooterStatus() { return ( diff --git a/apps/www/src/components/feat/server-list/modification/modification-frame.tsx b/apps/www/src/components/feat/server-list/modification/modification-frame.tsx index 092bdf8..347094f 100644 --- a/apps/www/src/components/feat/server-list/modification/modification-frame.tsx +++ b/apps/www/src/components/feat/server-list/modification/modification-frame.tsx @@ -42,6 +42,7 @@ export function ModificationFrame() { communication.toIframe.send("ping", {from: "top-layer"}) }) communication.toIframe.handle("rerender-servers", (c) => { + window.dispatchEvent(new Event("start-loading-server-view")) window.dispatchEvent(new Event("update-modification-stack")) }) }, [ref]) diff --git a/apps/www/src/components/feat/server-list/server-card.tsx b/apps/www/src/components/feat/server-list/server-card.tsx index a395ab8..0767e44 100644 --- a/apps/www/src/components/feat/server-list/server-card.tsx +++ b/apps/www/src/components/feat/server-list/server-card.tsx @@ -39,7 +39,7 @@ import { import { toast } from "sonner"; import { useEffectOnce } from "@/lib/useEffectOnce"; import { allTags } from "@/config/tags"; -import { type ReactNode, useState } from "react"; +import { type ReactNode, useEffect, useState } from "react"; import { Badge } from "@/components/ui/badge"; import { Dialog, @@ -176,6 +176,7 @@ export function TagShower(props: { useEffectOnce(() => { if (loading) { + // biome-ignore lint/complexity/noForEach: no. allTags.forEach((tag) => { if (!tag.condition) { tag.name({ online: props.server }).then((n) => { @@ -246,7 +247,7 @@ export function TagShower(props: { {'"'} - {t.docsName == undefined ? t.name : t.docsName} + {t.docsName === undefined ? t.name : t.docsName} {'"'} documentation -

- Statistics -

- - -

- Servers -

-
- - - - - {filterCount} modification(s) enabled - - +

+ Statistics +

+ -
- {filterLoading ? ( - - - - ) : ( - - -
- } - > -
- {data.map((c) => ( - - ))} -
- - )} + +

+ Servers +

+
+ + + + + + + {filterCount} modification(s) enabled + + + +
+ {tagStrings.map((c) => ( + + {c} + + ))} +
+
+ + + + + + Servers + + window.dispatchEvent(new Event("open-random-server")) + } + className="flex items-center gap-2" + > + + Pick random server + + refresh()} + > + + Reload + + Share + { + const data = { url: "https://mhsf.app", text: "Check out MHSF, the modern server finder!" }; + if (navigator.canShare(data)) + navigator.share(data) + else { + clipboard.writeText("https://mhsf.app") + toast.success("Sent to clipboard!") + } + }} + > + + Share MHSF! + + + +
+ {filterLoading ? ( + + + + ) : ( + + +
+ } + > +
+ {data.map((c) => ( + + ))} +
+ + )} + ); } diff --git a/apps/www/src/config/docs.ts b/apps/www/src/components/feat/server-list/server-random-server-provider.tsx similarity index 52% rename from apps/www/src/config/docs.ts rename to apps/www/src/components/feat/server-list/server-random-server-provider.tsx index 5823d5e..a06d527 100644 --- a/apps/www/src/config/docs.ts +++ b/apps/www/src/components/feat/server-list/server-random-server-provider.tsx @@ -28,61 +28,40 @@ * OTHER DEALINGS IN THE SOFTWARE. */ -export const allFolders: DocsFolder[] = [ - { - name: "General", - docs: [ - { - title: "Getting Started", - url: "/docs/getting-started", - }, - { - title: "Reading", - url: "/docs/reading", - }, - ], - }, - { - name: "Guides", - docs: [ - { - title: "Linking", - url: "/docs/guides/linking", - }, - { - title: "Owning a Server", - url: "/docs/guides/owning-a-server", - }, - { - title: "Server Customization", - url: "/docs/guides/customization", - }, - { title: "Reporting a server", url: "/docs/guides/reporting-server" }, - ], - }, - { - name: "Advanced", - docs: [ - { title: "Tech Stack", url: "/docs/advanced/tech-stack" }, - { title: "Using the Command-bar", url: "/docs/advanced/command-bar" }, - { title: "Tips with external servers", url: "/docs/advanced/external" }, - { title: "Achievements", url: "/docs/advanced/achievements" }, - ], - }, - { - name: "Legal", - docs: [ - { title: "ECA Agreement", url: "/docs/legal/external-content-agreement" }, - ], - }, -]; +"use client"; -export type Docs = { - title: string; - url: string; -}; +import { Dialog, DialogContent, DialogTitle } from "@/components/ui/dialog"; +import type { OnlineServer } from "@/lib/types/mh-server"; +import { type ReactNode, useEffect, useState } from "react"; +import { MOTDRenderer } from "../server-page/motd/motd-renderer"; +import IconDisplay from "../icons/minecraft-icon-display"; +import ServerCard, { TagShower } from "./server-card"; -export type DocsFolder = { - name: string; - docs: Array; -}; +export function ServerRandomServerProvider({ + servers, + children, +}: { servers: OnlineServer[]; children: ReactNode | ReactNode[] }) { + const [open, setOpen] = useState(false); + const [selectedServer, setSelectedServer] = useState(); + + useEffect(() => { + if (servers.length !== 0) + window.addEventListener("open-random-server", () => { + setSelectedServer(servers[Math.floor(Math.random() * servers.length)]); + setOpen(true); + }); + }, [servers]); + + return ( + <> + + + {selectedServer !== null && selectedServer !== undefined && ( + + )} + + + {children} + + ); +} diff --git a/apps/www/src/components/feat/server-list/statistics.tsx b/apps/www/src/components/feat/server-list/statistics.tsx index 5da1e4d..fd984c6 100644 --- a/apps/www/src/components/feat/server-list/statistics.tsx +++ b/apps/www/src/components/feat/server-list/statistics.tsx @@ -73,7 +73,6 @@ export function Statistics({ setAverages(fetchJson); })(); } catch (e) { - console.log(e); setError(true); } }, []); diff --git a/apps/www/src/components/feat/server-page/achievements/achievements.tsx b/apps/www/src/components/feat/server-page/achievements/achievements.tsx new file mode 100644 index 0000000..65a6a28 --- /dev/null +++ b/apps/www/src/components/feat/server-page/achievements/achievements.tsx @@ -0,0 +1,104 @@ +/* + * MHSF, Minehut Server List + * All external content is rather licensed under the ECA Agreement + * located here: https://mhsf.app/docs/legal/external-content-agreement + * + * All code under MHSF is licensed under the MIT License + * by open source contributors + * + * Copyright (c) 2025 dvelo + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +import { Material } from "@/components/ui/material"; +import { Placeholder } from "@/components/ui/placeholder"; +import { Separator } from "@/components/ui/separator"; +import { formalNames } from "@/config/achievements"; +import type { useMHSFServer } from "@/lib/hooks/use-mhsf-server"; +import type { Achievement } from "@/lib/types/achievement"; +import type { ServerResponse } from "@/lib/types/mh-server"; +import { X } from "lucide-react"; + +export function AchievementsView({ + server, + mhsfData, +}: { server: ServerResponse; mhsfData: ReturnType }) { + return ( + + + Achievements + + + +
+ {mhsfData.server?.achievements.currently.filter( + (value, index, array) => listify(array).indexOf(value.type) === index, + ).length === 0 && ( + } + title="We couldn't find any achievements" + description="Maybe shake the box harder?" + className="mt-4" + /> + )} + {mhsfData.server?.achievements.currently + .filter( + (value, index, array) => + listify(array).indexOf(value.type) === index, + ) + .map((c, i) => { + const Icon = formalNames[c.type].icon; + + return ( +
+ + + + +

{formalNames[c.type].description}

+ + Achieved on {new Date(c.date).getMonth()}/ + {new Date(c.date).getDate()}/{new Date(c.date).getFullYear()}{" "} + + {new Date(c.date).toLocaleTimeString()} + + +
+ ); + })} +
+
+ ); +} +const listify = (list: Achievement[]) => { + const newL: Array = []; + + list.forEach((c) => newL.push(c.type)); + + return newL; +}; diff --git a/apps/www/src/components/feat/server-page/afilliate/affilliate-row.tsx b/apps/www/src/components/feat/server-page/afilliate/affilliate-row.tsx new file mode 100644 index 0000000..f70a902 --- /dev/null +++ b/apps/www/src/components/feat/server-page/afilliate/affilliate-row.tsx @@ -0,0 +1,55 @@ +/* + * MHSF, Minehut Server List + * All external content is rather licensed under the ECA Agreement + * located here: https://mhsf.app/docs/legal/external-content-agreement + * + * All code under MHSF is licensed under the MIT License + * by open source contributors + * + * Copyright (c) 2025 dvelo + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +import { Material } from "@/components/ui/material"; +import { Ripple } from "../../home-page/ripple"; + +const PARTNER_HERO = "This server is partnered with MHSF."; +const PARTNER_DESCRIPTION = + "This server and its staff support the future of MHSF"; +const PARTNER_DESCRIPTION_2 = + "and a portion of users on MHSF may come from this server"; +const PARTNER_DESCRIPTION_3 = "or it's communication standards."; + +export function AffiliateRow() { + return ( + + +

+ {PARTNER_HERO} +

+

+ {PARTNER_DESCRIPTION}
{PARTNER_DESCRIPTION_2}
{PARTNER_DESCRIPTION_3} +

+
+ +
+ ); +} diff --git a/apps/www/src/components/feat/server-page/embeds/embed-creator.tsx b/apps/www/src/components/feat/server-page/embeds/embed-creator.tsx new file mode 100644 index 0000000..e9b8c6f --- /dev/null +++ b/apps/www/src/components/feat/server-page/embeds/embed-creator.tsx @@ -0,0 +1,241 @@ +/* + * MHSF, Minehut Server List + * All external content is rather licensed under the ECA Agreement + * located here: https://mhsf.app/docs/legal/external-content-agreement + * + * All code under MHSF is licensed under the MIT License + * by open source contributors + * + * Copyright (c) 2025 dvelo + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +import { Button } from "@/components/ui/button"; +import { + DropdownMenu, + DropdownMenuCheckboxItem, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuRadioGroup, + DropdownMenuRadioItem, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; +import { Material } from "@/components/ui/material"; +import { Separator } from "@/components/ui/separator"; +import { useEmbedGenerator } from "@/lib/hooks/use-embed-generator"; +import { cn } from "@/lib/utils"; +import { EllipsisVertical } from "lucide-react"; +import { useEffect, useState } from "react"; +import { ShikiRenderer } from "./embed-shiki-renderer"; +import { codeToHtml } from "shiki"; +import { useTheme } from "@/lib/hooks/use-theme"; +import useClipboard from "@/lib/useClipboard"; +import { toast } from "sonner"; + +export function EmbedCreatorRow({ serverName }: { serverName: string }) { + const embedCreator = useEmbedGenerator(serverName); + const clipboard = useClipboard(); + const { resolvedTheme } = useTheme(); + const [tab, setTab] = useState<"preview" | "code">("preview"); + const [highlightedHtml, setHighlightedHtml] = useState(""); + const [highlightedJsx, setHighlightedJsx] = useState(""); + const [codeTab, setCodeTab] = useState<"html" | "jsx">("html"); + + useEffect(() => { + const selectedTheme = + resolvedTheme === "dark" ? "poimandres" : "vitesse-light"; + async function highlightCode() { + const jsx = await codeToHtml(embedCreator.out.jsxCode ?? "", { + lang: "jsx", + theme: selectedTheme, + }); + const html = await codeToHtml(embedCreator.out.htmlCode ?? "", { + lang: "html", + theme: selectedTheme, + }); + setHighlightedHtml(html); + setHighlightedJsx(jsx); + } + + highlightCode(); + }); + + return ( + + + + + Embed Creator + + + + + + + + + General + + Static embed + + + Remove Minehut branding + + Theme + + embedCreator.in.setTheme(c as "light" | "dark") + } + > + + Light Mode + + + Dark Mode + + + Copy + {tab === "code" ? ( + { + clipboard.writeText( + embedCreator.out[ + codeTab === "html" ? "htmlCode" : "jsxCode" + ] as string, + ); + toast.success(`Copied ${codeTab.toLocaleUpperCase()} code!`) + }} + > + Copy code + + ) : ( + <> + { + clipboard.writeText(embedCreator.out.jsxCode as string); + toast.success("Copied!"); + }} + > + Copy JSX + + { + clipboard.writeText(embedCreator.out.htmlCode as string); + toast.success("Copied!"); + }} + > + Copy HTML + + + )} + + + + + + + {tab === "preview" && ( + ` + +export function useEmbedGenerator(name: string) { + // In parameters + const [theme, setTheme] = useState<"light" | "dark">("light"); + const [removeMinehutBranding, setRMHB] = useState(false); + const [staticMode, setStatic] = useState(false); + + // Out parameters + const [jsxCode, setJSX] = useState(); + const [htmlCode, setHTML] = useState(); + const [finalURL, setFinalURL] = useState(); + + useEffect(() => { + const baseUrl = `${window.location.protocol}//${window.location.host}`; + const url = new URL(`/embed/${name}`, baseUrl); + + url.searchParams.set("theme", theme); + if (removeMinehutBranding) + url.searchParams.set("branding", "false"); + if (staticMode) + url.searchParams.set("static", "true") + + setJSX(JSX_INSERTS.replaceAll("{{ embed }}", url.toString())); + setHTML(HTML_INSERTS.replaceAll("{{ embed }}", url.toString())); + setFinalURL(url.toString()); + }, [theme, removeMinehutBranding, staticMode, name]) + + return { + in: { + theme, setTheme, + removeMinehutBranding, setRMHB, + staticMode, setStatic + }, + out: { + jsxCode, + htmlCode, + finalURL + } + } +} \ No newline at end of file diff --git a/apps/www/src/lib/hooks/use-filters.tsx b/apps/www/src/lib/hooks/use-filters.tsx index 46827c0..408163d 100644 --- a/apps/www/src/lib/hooks/use-filters.tsx +++ b/apps/www/src/lib/hooks/use-filters.tsx @@ -37,7 +37,7 @@ import { transpileTypeScript } from "@/app/(sl-modification-frame)/servers/embed import { useUser } from "@clerk/nextjs"; import type { ClerkCustomActivatedModification } from "@/components/feat/server-list/modification/modification-file-creation-dialog"; import { ClerkEmbeddedFilter } from "@/components/feat/server-list/modification/modification-action"; -import { supportedFilters } from "../types/filter"; +import { supportedFilters } from "../types/supportedFilters"; type EmbeddedFilter = { identifier: string; @@ -56,6 +56,7 @@ export function useFilters(data: OnlineServer[]) { const [testModeLoading, setTestModeLoading] = useState(true); const [loading, setLoading] = useState(true); const [filters, setFilters] = useState([]); + const [tagStrings, setTagStrings] = useState([]); const [sort, setSort] = useState | null>(null); const { user, isSignedIn } = useUser(); @@ -68,8 +69,6 @@ export function useFilters(data: OnlineServer[]) { ); const sortedData = sort === null ? resultData : resultData.sort(sort); - console.log({ sortedData, modificationMap, resultData, data, newFilters }); - if (sortedData.length !== 0) setFilteredData(sortedData); }; @@ -167,11 +166,6 @@ export function useFilters(data: OnlineServer[]) { if (type === "sort") { newServers = data.sort((a, b) => filterFunc(a, b)); setTestModeStatus(`Sorted ${newServers.length} servers.`); - console.log( - newServers, - data.sort((a, b) => filterFunc(a, b)), - ); - console.log(filterFunc); setFilteredData(() => [...newServers]); } @@ -209,15 +203,16 @@ export function useFilters(data: OnlineServer[]) { // biome-ignore lint: I'm gonna turn this off :sob: useEffect(() => { + window.addEventListener("start-loading-server-view", () => setLoading(true)) if (!t) window.addEventListener("update-modification-stack", async () => { await user?.reload(); - setLoading(true); let newFilters: EmbeddedFilter[] = []; const filters = ((isSignedIn ? user.unsafeMetadata.filters : JSON.parse(localStorage.getItem("mhsf__filters") ?? "[]")) as Array< ClerkEmbeddedFilter >) ?? []; + setTagStrings([]); if (isSignedIn) { const activatedModifications = @@ -309,15 +304,13 @@ export function useFilters(data: OnlineServer[]) { newFilters.push({ identifier: filterType?.ns + (Math.random() * Math.random() * Math.random()).toString(), functionFilter: (server: OnlineServer) => parsedFilter?.applyToServer({ online: server }) ?? true - }) + }); + setTagStrings((c) => [...c, ...(parsedFilter?.getTagStrings() as string[])]) }); - console.log(newFilters); - await updateServers(newFilters); }); }, [data]); - console.log(filters); return { filteredData, @@ -328,5 +321,6 @@ export function useFilters(data: OnlineServer[]) { filters.filter((item, index, array) => array.indexOf(item) === index) .length + (sort === null ? 1 : 0), loading, + tagStrings }; } diff --git a/apps/www/src/lib/hooks/use-icons.tsx b/apps/www/src/lib/hooks/use-icons.tsx new file mode 100644 index 0000000..f3b426d --- /dev/null +++ b/apps/www/src/lib/hooks/use-icons.tsx @@ -0,0 +1,42 @@ +/* + * MHSF, Minehut Server List + * All external content is rather licensed under the ECA Agreement + * located here: https://mhsf.app/docs/legal/external-content-agreement + * + * All code under MHSF is licensed under the MIT License + * by open source contributors + * + * Copyright (c) 2025 dvelo + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +import { useEffect, useState } from "react"; +import { getMinehutIcons, MinehutIcon } from "../types/server-icon"; + +export function useIcons() { + const [icons, setIcons] = useState(); + + useEffect(() => { + getMinehutIcons().then((i) => setIcons(i)); + }, []) + + return { icons }; +} \ No newline at end of file diff --git a/apps/www/src/lib/hooks/use-mhsf-server.tsx b/apps/www/src/lib/hooks/use-mhsf-server.tsx index ac6bc84..b11965d 100644 --- a/apps/www/src/lib/hooks/use-mhsf-server.tsx +++ b/apps/www/src/lib/hooks/use-mhsf-server.tsx @@ -40,8 +40,6 @@ export function useMHSFServer(id: string) { const response = await fetch("/api/v1/server/get/" + id); const json = await response.json(); - console.log(json.server); - setServer(json.server); })(); }, [id]); diff --git a/apps/www/src/lib/hooks/use-server.tsx b/apps/www/src/lib/hooks/use-server.tsx index 3d65176..4fd7abc 100644 --- a/apps/www/src/lib/hooks/use-server.tsx +++ b/apps/www/src/lib/hooks/use-server.tsx @@ -14,7 +14,6 @@ export function useServer(serverSpecifier: { id?: string; name?: string }) { `https://api.minehut.com/server/${serverSpecifier.id || serverSpecifier.name}${serverSpecifier.name ? "?byName=true" : ""}` ); const json = await res.json(); - console.log(json); if (json.server === null) throw new Error("Server not found"); setServer(json.server); diff --git a/apps/www/src/lib/hooks/use-servers.tsx b/apps/www/src/lib/hooks/use-servers.tsx index 0fb557d..62a00f2 100644 --- a/apps/www/src/lib/hooks/use-servers.tsx +++ b/apps/www/src/lib/hooks/use-servers.tsx @@ -61,6 +61,23 @@ export function useServers() { serverCount, loading, error, + refresh: () => { + setLoading(true); + try { + (async () => { + const serversFetch = await fetch("https://api.minehut.com/servers"); + const serversJson: ServersAPIResponse = await serversFetch.json(); + + setPlayerCount(serversJson.total_players); + setServerCount(serversJson.total_servers); + setServers(serversJson.servers); + setLoading(false); + })(); + } catch (e) { + console.error(e); + setError(true); + } + } }; } diff --git a/apps/www/src/lib/types/filter-registry.ts b/apps/www/src/lib/types/filter-registry.ts new file mode 100644 index 0000000..4aa68a4 --- /dev/null +++ b/apps/www/src/lib/types/filter-registry.ts @@ -0,0 +1,13 @@ +import { FilterIdentifier, Filter } from "./filter"; +import { CategoryFilter } from "./filters/category-filter"; +import { CombinationFilter } from "./filters/combination-filter"; +import { PlayerRangeFilter } from "./filters/player-range-filter"; +import { TagFilter } from "./filters/tag-filter"; + +export const filterRegistry = new Map Filter>(); + +// Register filters +filterRegistry.set("app.mhsf.filter.util.combinationFilter", (identifier: FilterIdentifier) => new CombinationFilter([]).fromIdentifier(identifier)); +filterRegistry.set("app.mhsf.filter.tagFilter", (identifier: FilterIdentifier) => new TagFilter(0, false).fromIdentifier(identifier)); +filterRegistry.set("app.mhsf.filter.categoryFilter", (identifier: FilterIdentifier) => new CategoryFilter(0).fromIdentifier(identifier)); +filterRegistry.set("app.mhsf.filter.playerRangeFilter", (identifier: FilterIdentifier) => new PlayerRangeFilter(0, 0).fromIdentifier(identifier)); \ No newline at end of file diff --git a/apps/www/src/lib/types/filter.ts b/apps/www/src/lib/types/filter.ts index 16df18c..0a915ca 100644 --- a/apps/www/src/lib/types/filter.ts +++ b/apps/www/src/lib/types/filter.ts @@ -31,36 +31,22 @@ import { allTags } from "@/config/tags"; import type { OnlineServer, ServerResponse } from "./mh-server"; import type { MHSFData } from "./data"; -import { TagFilter } from "./filters/tag-filter"; -import { CategoryFilter } from "./filters/category-filter"; + +export type FilterIdentifier = { + [key: string]: string | number | boolean | null | Array | FilterIdentifier +} /* Any filter that can be converted back and forth from a string or a Filter object */ export interface Filter { type(): "filter"; - toIdentifier(): { [key: string]: string | number | boolean }; + toIdentifier(): FilterIdentifier; getSpecificFilterId(): string; - fromIdentifier(identifier: { - [key: string]: string | number | boolean; - }): Filter; + fromIdentifier(identifier: FilterIdentifier): Filter; applyToServer(server: { online?: OnlineServer; server?: ServerResponse; mhsfData?: MHSFData; }): Promise; + getTagStrings(): string[]; } -export const supportedFilters: { - ns: string; - fi: (identifier: { - [key: string]: string | number | boolean; - }) => Filter; -}[] = [ - { - ns: "app.mhsf.filter.tagFilter", - fi: new TagFilter(0, false).fromIdentifier - }, - { - ns: "app.mhsf.filter.categoryFilter", - fi: new CategoryFilter(0).fromIdentifier - } -]; diff --git a/apps/www/src/lib/types/filters/category-filter.ts b/apps/www/src/lib/types/filters/category-filter.ts index a5b558a..3d73278 100644 --- a/apps/www/src/lib/types/filters/category-filter.ts +++ b/apps/www/src/lib/types/filters/category-filter.ts @@ -30,7 +30,7 @@ import { allCategories } from "@/config/tags"; import type { MHSFData } from "../data"; -import type { Filter } from "../filter"; +import type { Filter, FilterIdentifier } from "../filter"; import type { OnlineServer, ServerResponse } from "../mh-server"; export class CategoryFilter implements Filter { @@ -40,11 +40,11 @@ export class CategoryFilter implements Filter { return "filter"; } - toIdentifier(): { [key: string]: string | number | boolean } { + toIdentifier(): FilterIdentifier { return { categoryIndex: this.categoryIndex }; } - fromIdentifier(identifier: { [key: string]: string | number | boolean; }): Filter { + fromIdentifier(identifier: FilterIdentifier): Filter { return new CategoryFilter(identifier.categoryIndex as number); } @@ -61,4 +61,8 @@ export class CategoryFilter implements Filter { constructor(categoryIndex: number) { this.categoryIndex = categoryIndex; } + + getTagStrings(): string[] { + return [`Server is a ${allCategories[this.categoryIndex].name} server`] + } } \ No newline at end of file diff --git a/apps/www/src/lib/types/filters/combination-filter.ts b/apps/www/src/lib/types/filters/combination-filter.ts new file mode 100644 index 0000000..9a07ea5 --- /dev/null +++ b/apps/www/src/lib/types/filters/combination-filter.ts @@ -0,0 +1,80 @@ +/* + * MHSF, Minehut Server List + * All external content is rather licensed under the ECA Agreement + * located here: https://mhsf.app/docs/legal/external-content-agreement + * + * All code under MHSF is licensed under the MIT License + * by open source contributors + * + * Copyright (c) 2025 dvelo + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +import type { MHSFData } from "../data"; +import { type Filter, type FilterIdentifier } from "../filter"; +import { filterRegistry } from "../filter-registry"; +import type { OnlineServer, ServerResponse } from "../mh-server"; + +export class CombinationFilter implements Filter { + filters: Filter[]; + + fromIdentifier(identifier: FilterIdentifier): Filter { + return new CombinationFilter((identifier.filters as Array<{type: string, metadata: { [key: string]: string | number | boolean }}>).map((c) => { + const factory = filterRegistry.get(c.type); + return factory ? factory(c.metadata) : undefined; + }).filter((v) => v !== undefined)) + } + + toIdentifier(): FilterIdentifier { + return { + filters: this.filters.map((c) => { + return { type: c.getSpecificFilterId(), metadata: c.toIdentifier() }; + }), + }; + } + + getSpecificFilterId(): string { + return "app.mhsf.filter.util.combinationFilter"; + } + + type(): "filter" { + return "filter"; + } + + async applyToServer(server: { + online?: OnlineServer; + server?: ServerResponse; + mhsfData?: MHSFData; + }): Promise { + const map = this.filters.map((c) => c.applyToServer(server)); + const asynced = await Promise.all(map); + + return !asynced.includes(false); + } + + constructor(filters: Filter[]) { + this.filters = filters; + } + + getTagStrings(): string[] { + return this.filters.flatMap((c) => c.getTagStrings()); + } +} diff --git a/apps/www/src/lib/types/filters/player-range-filter.ts b/apps/www/src/lib/types/filters/player-range-filter.ts new file mode 100644 index 0000000..a73629f --- /dev/null +++ b/apps/www/src/lib/types/filters/player-range-filter.ts @@ -0,0 +1,91 @@ +/* + * MHSF, Minehut Server List + * All external content is rather licensed under the ECA Agreement + * located here: https://mhsf.app/docs/legal/external-content-agreement + * + * All code under MHSF is licensed under the MIT License + * by open source contributors + * + * Copyright (c) 2025 dvelo + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIE + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +import { MHSFData } from "../data"; +import type { Filter, FilterIdentifier } from "../filter"; +import { OnlineServer, ServerResponse } from "../mh-server"; + +export class PlayerRangeFilter implements Filter { + min: number | null; + max: number | null; + + type(): "filter" { + return "filter"; + } + + getSpecificFilterId(): string { + return "app.mhsf.filter.playerRangeFilter"; + } + + constructor(min: number | null, max: number | null) { + this.min = min; + this.max = max; + } + + fromIdentifier(identifier: FilterIdentifier): Filter { + return new PlayerRangeFilter(identifier.min as number | null, identifier.max as number | null); + } + + toIdentifier(): FilterIdentifier { + return {min: this.min, max: this.max}; + } + + applyToServer(server: { + online?: OnlineServer; + server?: ServerResponse; + mhsfData?: MHSFData; + }): Promise { + if (this.max === null && this.min === null) + return new Promise((r) => r(true)); + + if (this.max === null) + return new Promise((r) => r((server.online?.playerData.playerCount ?? 0) >= (this.min ?? 0))) + + if (this.min === null) + return new Promise((r) => r((server.online?.playerData.playerCount ?? 0) <= (this.max ?? 0))) + + return new Promise((r) => + r( + (server.online?.playerData.playerCount ?? 0) <= (this.max ?? 0) && + (server.online?.playerData.playerCount ?? 0) >= (this.min ?? 0), + ), + ); + } + getTagStrings(): string[] { + const tagArray = []; + + if (this.max !== null) + tagArray.push(`${this.max} maximum players`) + if (this.min !== null) + tagArray.push(`${this.min} minimum players`) + + return tagArray; + } +} diff --git a/apps/www/src/lib/types/filters/tag-filter.ts b/apps/www/src/lib/types/filters/tag-filter.ts index ae6a73b..1cbcdb5 100644 --- a/apps/www/src/lib/types/filters/tag-filter.ts +++ b/apps/www/src/lib/types/filters/tag-filter.ts @@ -31,7 +31,7 @@ import { allTags } from "@/config/tags"; import type { MHSFData } from "../data"; import type { OnlineServer, ServerResponse } from "../mh-server"; -import type { Filter } from "../filter"; +import type { Filter, FilterIdentifier } from "../filter"; export class TagFilter implements Filter { tagId: string; @@ -41,7 +41,7 @@ export class TagFilter implements Filter { return "filter"; } - toIdentifier(): { [key: string]: string | number | boolean } { + toIdentifier(): FilterIdentifier { return { tagId: this.tagId, opposite: this.opposite }; } @@ -49,9 +49,7 @@ export class TagFilter implements Filter { return "app.mhsf.filter.tagFilter"; } - fromIdentifier(identifier: { - [key: string]: string | number | boolean; - }): Filter { + fromIdentifier(identifier: FilterIdentifier): Filter { return new TagFilter(identifier.tagId as string, identifier.opposite as boolean); } @@ -74,12 +72,6 @@ export class TagFilter implements Filter { ).condition ?? (() => true) )(server); - console.log(result, server.online?.name, ( - allTags.find((c) => btoa(c.docsName) === this.tagId) ?? { - condition: () => true, - } - )); - if (typeof result === "boolean") return new Promise((r) => r(this.opposite ? !result : result)) @@ -87,4 +79,10 @@ export class TagFilter implements Filter { result.then((c) => r(this.opposite ? !c : c)) }); } + + getTagStrings(): string[] { + if (this.opposite) + return [`Server does not have the '${allTags.find((c) => btoa(c.docsName) === this.tagId)?.docsName}' filter`] + return [`Server has the '${allTags.find((c) => btoa(c.docsName) === this.tagId)?.docsName}' filter`] + } } diff --git a/apps/www/src/lib/types/server-icon.ts b/apps/www/src/lib/types/server-icon.ts index 177b780..07f9d85 100644 --- a/apps/www/src/lib/types/server-icon.ts +++ b/apps/www/src/lib/types/server-icon.ts @@ -30,7 +30,6 @@ export async function getMinehutIcons(): Promise { const icons = await fetch("https://api.minehut.com/servers/icons"); - console.log(icons); if (!icons.ok) return undefined; return await icons.json(); } diff --git a/apps/www/src/lib/types/sort.ts b/apps/www/src/lib/types/sort.ts index 1b05c5d..dacb37c 100644 --- a/apps/www/src/lib/types/sort.ts +++ b/apps/www/src/lib/types/sort.ts @@ -38,4 +38,5 @@ export interface Sort { [key: string]: string | number | boolean; }): Sort; sortToServers(serverA: OnlineServer, serverB: OnlineServer): number; + getTagStrings(): string[]; } \ No newline at end of file diff --git a/apps/www/src/lib/types/supportedFilters.ts b/apps/www/src/lib/types/supportedFilters.ts new file mode 100644 index 0000000..af418fe --- /dev/null +++ b/apps/www/src/lib/types/supportedFilters.ts @@ -0,0 +1,7 @@ +import { FilterIdentifier, Filter } from "./filter"; +import { filterRegistry } from "./filter-registry"; + +export const supportedFilters = Array.from(filterRegistry.entries()).map(([ns, fi]) => ({ + ns, + fi +})); diff --git a/apps/www/src/middleware.ts b/apps/www/src/middleware.ts index 0bc8822..2f22131 100644 --- a/apps/www/src/middleware.ts +++ b/apps/www/src/middleware.ts @@ -43,7 +43,11 @@ const isOldServerRoute = createRouteMatcher([ "/server/:serverName", "/server/:serverName/statistics", ]); -const apiRoute = createRouteMatcher(["/api/(.*)"]); +const isWaitlistPage = createRouteMatcher(["/waitlist", "/waitlist(.*)"]); +const apiWaitlistPage = createRouteMatcher([ + "/api/v1/user/waitlist(.*)", + "/api/v1/get-status", +]); export default process.env.NEXT_PUBLIC_IS_AUTH === "true" ? clerkMiddleware(async (auth, req) => { @@ -52,6 +56,19 @@ export default process.env.NEXT_PUBLIC_IS_AUTH === "true" const requestHeaders = new Headers(req.headers); requestHeaders.set("x-url", req.url); + if (!isWaitlistPage(req) && !apiWaitlistPage(req)) { + if (process.env.NEXT_PUBLIC_WAITLIST_ENABLED === "true") { + if (authRes.userId === null) + return NextResponse.redirect(new URL("/waitlist", req.url)); + + const metadata = (await client.users.getUser(authRes.userId)) + .publicMetadata; + if (metadata.v2allowed !== true) + return NextResponse.redirect(new URL("/waitlist", req.url)); + } + } + + if (isRootRoute(req)) { switch (authRes.userId === null) { case false: @@ -72,7 +89,7 @@ export default process.env.NEXT_PUBLIC_IS_AUTH === "true" new URL(`/server/v2/minehut/${minehutRes.server._id}`, req.url), ); } - + return NextResponse.next({ request: { headers: requestHeaders, diff --git a/apps/www/src/pages/api/inngest.ts b/apps/www/src/pages/api/inngest.ts index 77370d6..717f98d 100644 --- a/apps/www/src/pages/api/inngest.ts +++ b/apps/www/src/pages/api/inngest.ts @@ -95,7 +95,6 @@ export default serve({ server: server.name, date: new Date(), }); - console.log(i, mh.servers.length); }); return true; }); diff --git a/apps/www/src/pages/api/v1/server/get/[server]/history/daily-data.ts b/apps/www/src/pages/api/v1/server/get/[server]/history/daily-data.ts index 8299225..f734b45 100644 --- a/apps/www/src/pages/api/v1/server/get/[server]/history/daily-data.ts +++ b/apps/www/src/pages/api/v1/server/get/[server]/history/daily-data.ts @@ -95,7 +95,6 @@ export default async function handler( res.send({ result: dailyAverages }); } catch (error) { - console.log(error); res.status(500).json({ message: "An error occurred while fetching data" }); } finally { await client.close(); diff --git a/apps/www/src/pages/api/v1/server/get/[server]/history/relative-data.ts b/apps/www/src/pages/api/v1/server/get/[server]/history/relative-data.ts index 185749d..2c37202 100644 --- a/apps/www/src/pages/api/v1/server/get/[server]/history/relative-data.ts +++ b/apps/www/src/pages/api/v1/server/get/[server]/history/relative-data.ts @@ -114,7 +114,6 @@ export default async function handler( res.send({ data }); } catch (error) { - console.log(error); res.status(500).json({ message: "An error occurred while fetching data" }); } finally { await client.close(); diff --git a/apps/www/src/pages/api/v1/server/get/[server]/index.ts b/apps/www/src/pages/api/v1/server/get/[server]/index.ts index 9a0cd3b..ed45e0e 100644 --- a/apps/www/src/pages/api/v1/server/get/[server]/index.ts +++ b/apps/www/src/pages/api/v1/server/get/[server]/index.ts @@ -30,6 +30,7 @@ import { getBackendProcedure } from "@/lib/backend-procedure"; import type { MHSFData } from "@/lib/types/data"; +import { clerkClient, getAuth } from "@clerk/nextjs/server"; import { MongoClient } from "mongodb"; import type { NextApiRequest, NextApiResponse } from "next"; @@ -83,17 +84,17 @@ export default async function handler( await mongo.connect(); const db = mongo.db(process.env.CUSTOM_MONGO_DB ?? "mhsf"); const stats = mongo.db("mhsf") - const userId = req.cookies.userId; + const {userId} = getAuth(req); // Run queries in parallel const [favoriteData, customizationData, playerData, achievements] = await Promise.all([ - findFavoriteData(serverData.name, userId, stats, { + findFavoriteData(serverData.name, userId ?? undefined, stats, { maxFavoriteEntries, favoriteTimespanStart, favoriteTimespanEnd, }), - findCustomizationData(serverData.name, userId, db), + findCustomizationData(serverData.name, userId ?? undefined, stats), findPlayerData(serverData.name, stats, { maxPlayerEntries, playerTimespanStart, @@ -147,6 +148,7 @@ async function findCustomizationData( isOwned: boolean; isOwnedByUser: boolean; }> { + const clerk = await clerkClient(); // Run queries in parallel const [customizationData, ownedServerData] = await Promise.all([ db.collection("customization").findOne({ server: serverName }), @@ -160,6 +162,7 @@ async function findCustomizationData( ...(customizationData as any), isOwned: true, isOwnedByUser: ownedServerData?.author === userId, + userProfilePicture: userId ? (await clerk.users.getUser(ownedServerData?.author)).imageUrl : 'no user' }; } diff --git a/apps/www/src/pages/api/v1/user/waitlist/check-waitlist-eligibility.ts b/apps/www/src/pages/api/v1/user/waitlist/check-waitlist-eligibility.ts new file mode 100644 index 0000000..c723624 --- /dev/null +++ b/apps/www/src/pages/api/v1/user/waitlist/check-waitlist-eligibility.ts @@ -0,0 +1,127 @@ +/* + * MHSF, Minehut Server List + * All external content is rather licensed under the ECA Agreement + * located here: https://mhsf.app/docs/legal/external-content-agreement + * + * All code under MHSF is licensed under the MIT License + * by open source contributors + * + * Copyright (c) 2025 dvelo + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +import { clerkClient, getAuth } from "@clerk/nextjs/server"; +import { MongoClient } from "mongodb"; +import type { NextApiRequest, NextApiResponse } from "next"; + +export default async function handler( + req: NextApiRequest, + res: NextApiResponse, +) { + const { userId } = getAuth(req); + if (!userId) { + return res.json({ message: "User not found" }); + } + + // Get the OAuth access token for the user + const provider = "discord"; + + const client = await clerkClient(); + + const clerkResponse = await client.users.getUserOauthAccessToken( + userId, + provider, + ); + + const accessToken = clerkResponse.data[0]?.token || ""; + + if (!accessToken) { + return res.status(401).json({ message: "Access token not found" }); + } + + const response = await fetch("https://discord.com/api/users/@me", { + headers: { Authorization: `Bearer ${accessToken}` }, + }); + const json: DiscordUser = await response.json() + const mongo = new MongoClient(process.env.MONGO_DB as string); + const db = mongo.db("mhsf").collection('waitlist-approved'); + const refs = mongo.db("mhsf").collection('waitlist-refs'); + + const entry = await db.findOneAndDelete({ + user: json.username + }) + + if (entry === null) { + return res.status(400).send({message: "You are unfortunately not eligible."}) + } + + const rand = crypto.randomUUID(); + await refs.insertOne({ + usersRemaining: 2, + id: rand, + userAssociatedTo: json.username + }) + + const user = await client.users.getUser(userId); + + await client.users.updateUserMetadata(userId, { + publicMetadata: { + ...user.publicMetadata, + v2allowed: true + } + }); + + return res.send({message: "You are eligible!", refUUID: rand}) +} + +export interface DiscordUser { + id: string + username: string + avatar: string + discriminator: string + public_flags: number + flags: number + accent_color: number + global_name: string + banner_color: string + clan: Clan + primary_guild: PrimaryGuild + mfa_enabled: boolean + locale: string + premium_type: number + email: string + verified: boolean + } + + export interface Clan { + identity_guild_id: string + identity_enabled: boolean + tag: string + badge: string + } + + export interface PrimaryGuild { + identity_guild_id: string + identity_enabled: boolean + tag: string + badge: string + } + \ No newline at end of file diff --git a/apps/www/src/pages/api/v1/user/waitlist/get-discord-details.ts b/apps/www/src/pages/api/v1/user/waitlist/get-discord-details.ts new file mode 100644 index 0000000..7535c6b --- /dev/null +++ b/apps/www/src/pages/api/v1/user/waitlist/get-discord-details.ts @@ -0,0 +1,36 @@ +import { clerkClient, getAuth } from "@clerk/nextjs/server"; +import type { NextApiRequest, NextApiResponse } from "next"; + +export default async function handler( + req: NextApiRequest, + res: NextApiResponse, +) { + const { userId } = getAuth(req); + if (!userId) { + return res.json({ message: "User not found" }); + } + + // Get the OAuth access token for the user + const provider = "discord"; + + const client = await clerkClient(); + + const clerkResponse = await client.users.getUserOauthAccessToken( + userId, + provider, + ); + + const accessToken = clerkResponse.data[0]?.token || ""; + + if (!accessToken) { + return res.status(401).json({ message: "Access token not found" }); + } + + const response = await fetch("https://discord.com/api/users/@me", { + headers: { Authorization: `Bearer ${accessToken}` }, + }); + const json = await response.json() + + res.send({ discordData: json }); + +} diff --git a/apps/www/src/pages/api/v1/user/waitlist/ref-waitlist-eligibility.ts b/apps/www/src/pages/api/v1/user/waitlist/ref-waitlist-eligibility.ts new file mode 100644 index 0000000..f2eed8b --- /dev/null +++ b/apps/www/src/pages/api/v1/user/waitlist/ref-waitlist-eligibility.ts @@ -0,0 +1,92 @@ +/* + * MHSF, Minehut Server List + * All external content is rather licensed under the ECA Agreement + * located here: https://mhsf.app/docs/legal/external-content-agreement + * + * All code under MHSF is licensed under the MIT License + * by open source contributors + * + * Copyright (c) 2025 dvelo + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +import { clerkClient, getAuth } from "@clerk/nextjs/server"; +import { MongoClient } from "mongodb"; +import type { NextApiRequest, NextApiResponse } from "next"; + +export default async function handler( + req: NextApiRequest, + res: NextApiResponse, +) { + const client = await clerkClient(); + const { userId } = getAuth(req); + if (!userId) { + return res.status(400).json({ message: "User not found" }); + } + + const user = await client.users.getUser(userId); + if (user.publicMetadata.v2allowed === true) { + return res.status(400).json({ message: "v2 already allowed." }); + } + + const { id } = req.body; + if (!id) { + return res.status(400).json({ message: "ID not specified" }); + } + + const uuidTested = + /^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test( + id, + ); + if (uuidTested === false) + return res.status(400).json({ message: "UUID not valid" }); + + const mongo = new MongoClient(process.env.MONGO_DB as string); + const refs = mongo.db("mhsf").collection("waitlist-refs"); + + const ref = await refs.findOne({ + id, + }); + if (ref !== undefined && ref !== null) { + if (ref.usersRemaining !== 0) { + await refs.findOneAndUpdate( + { + id, + }, + { + $inc: { usersRemaining: -1 }, + }, + ); + + await client.users.updateUserMetadata(userId, { + publicMetadata: { + ...user.publicMetadata, + v2allowed: true, + }, + }); + + return res.send({ message: "You are eligible!" }); + } + return res.status(400).json({ message: "No users left" }); + } + return res.status(400).json({ message: "Unknown ID" }); + +} diff --git a/yarn.lock b/yarn.lock index 12dadc3..34c5f15 100644 --- a/yarn.lock +++ b/yarn.lock @@ -82,11 +82,21 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== +"@babel/helper-string-parser@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" + integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== + "@babel/helper-validator-identifier@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== +"@babel/helper-validator-identifier@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" + integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== + "@babel/parser@^7.23.9", "@babel/parser@^7.24.7", "@babel/parser@^7.24.8", "@babel/parser@^7.27.0": version "7.27.0" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.27.0.tgz#3d7d6ee268e41d2600091cbd4e145ffee85a44ec" @@ -94,6 +104,13 @@ dependencies: "@babel/types" "^7.27.0" +"@babel/parser@^7.25.3": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.27.1.tgz#c55d5bed74449d1223701f1869b9ee345cc94cc9" + integrity sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ== + dependencies: + "@babel/types" "^7.27.1" + "@babel/runtime@^7.13.10", "@babel/runtime@^7.16.3", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": version "7.27.0" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.27.0.tgz#fbee7cf97c709518ecc1f590984481d5460d4762" @@ -131,6 +148,14 @@ "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" +"@babel/types@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.27.1.tgz#9defc53c16fc899e46941fc6901a9eea1c9d8560" + integrity sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + "@biomejs/biome@^1.9.4": version "1.9.4" resolved "https://registry.yarnpkg.com/@biomejs/biome/-/biome-1.9.4.tgz#89766281cbc3a0aae865a7ff13d6aaffea2842bf" @@ -277,6 +302,341 @@ dependencies: csstype "3.1.3" +"@codemirror/autocomplete@^6.0.0", "@codemirror/autocomplete@^6.3.2", "@codemirror/autocomplete@^6.7.1": + version "6.18.6" + resolved "https://registry.yarnpkg.com/@codemirror/autocomplete/-/autocomplete-6.18.6.tgz#de26e864a1ec8192a1b241eb86addbb612964ddb" + integrity sha512-PHHBXFomUs5DF+9tCOM/UoW6XQ4R44lLNNhRaW9PKPTU0D7lIjRg3ElxaJnTwsl/oHiR93WSXDBrekhoUGCPtg== + dependencies: + "@codemirror/language" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.17.0" + "@lezer/common" "^1.0.0" + +"@codemirror/commands@^6.0.0", "@codemirror/commands@^6.2.4": + version "6.8.1" + resolved "https://registry.yarnpkg.com/@codemirror/commands/-/commands-6.8.1.tgz#639f5559d2f33f2582a2429c58cb0c1b925c7a30" + integrity sha512-KlGVYufHMQzxbdQONiLyGQDUW0itrLZwq3CcY7xpv9ZLRHqzkBSoteocBHtMCoY7/Ci4xhzSrToIeLg7FxHuaw== + dependencies: + "@codemirror/language" "^6.0.0" + "@codemirror/state" "^6.4.0" + "@codemirror/view" "^6.27.0" + "@lezer/common" "^1.1.0" + +"@codemirror/lang-angular@^0.1.0": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@codemirror/lang-angular/-/lang-angular-0.1.4.tgz#5b9e940786ba201a9a42eab6db9501fa3fe2292a" + integrity sha512-oap+gsltb/fzdlTQWD6BFF4bSLKcDnlxDsLdePiJpCVNKWXSTAbiiQeYI3UmES+BLAdkmIC1WjyztC1pi/bX4g== + dependencies: + "@codemirror/lang-html" "^6.0.0" + "@codemirror/lang-javascript" "^6.1.2" + "@codemirror/language" "^6.0.0" + "@lezer/common" "^1.2.0" + "@lezer/highlight" "^1.0.0" + "@lezer/lr" "^1.3.3" + +"@codemirror/lang-cpp@^6.0.0": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@codemirror/lang-cpp/-/lang-cpp-6.0.2.tgz#076c98340c3beabde016d7d83e08eebe17254ef9" + integrity sha512-6oYEYUKHvrnacXxWxYa6t4puTlbN3dgV662BDfSH8+MfjQjVmP697/KYTDOqpxgerkvoNm7q5wlFMBeX8ZMocg== + dependencies: + "@codemirror/language" "^6.0.0" + "@lezer/cpp" "^1.0.0" + +"@codemirror/lang-css@^6.0.0", "@codemirror/lang-css@^6.2.0": + version "6.3.1" + resolved "https://registry.yarnpkg.com/@codemirror/lang-css/-/lang-css-6.3.1.tgz#763ca41aee81bb2431be55e3cfcc7cc8e91421a3" + integrity sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg== + dependencies: + "@codemirror/autocomplete" "^6.0.0" + "@codemirror/language" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@lezer/common" "^1.0.2" + "@lezer/css" "^1.1.7" + +"@codemirror/lang-go@^6.0.0": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@codemirror/lang-go/-/lang-go-6.0.1.tgz#598222c90f56eae28d11069c612ca64d0306b057" + integrity sha512-7fNvbyNylvqCphW9HD6WFnRpcDjr+KXX/FgqXy5H5ZS0eC5edDljukm/yNgYkwTsgp2busdod50AOTIy6Jikfg== + dependencies: + "@codemirror/autocomplete" "^6.0.0" + "@codemirror/language" "^6.6.0" + "@codemirror/state" "^6.0.0" + "@lezer/common" "^1.0.0" + "@lezer/go" "^1.0.0" + +"@codemirror/lang-html@^6.0.0": + version "6.4.9" + resolved "https://registry.yarnpkg.com/@codemirror/lang-html/-/lang-html-6.4.9.tgz#d586f2cc9c341391ae07d1d7c545990dfa069727" + integrity sha512-aQv37pIMSlueybId/2PVSP6NPnmurFDVmZwzc7jszd2KAF8qd4VBbvNYPXWQq90WIARjsdVkPbw29pszmHws3Q== + dependencies: + "@codemirror/autocomplete" "^6.0.0" + "@codemirror/lang-css" "^6.0.0" + "@codemirror/lang-javascript" "^6.0.0" + "@codemirror/language" "^6.4.0" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.17.0" + "@lezer/common" "^1.0.0" + "@lezer/css" "^1.1.0" + "@lezer/html" "^1.3.0" + +"@codemirror/lang-java@^6.0.0": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@codemirror/lang-java/-/lang-java-6.0.1.tgz#03bd06334da7c8feb9dff6db01ac6d85bd2e48bb" + integrity sha512-OOnmhH67h97jHzCuFaIEspbmsT98fNdhVhmA3zCxW0cn7l8rChDhZtwiwJ/JOKXgfm4J+ELxQihxaI7bj7mJRg== + dependencies: + "@codemirror/language" "^6.0.0" + "@lezer/java" "^1.0.0" + +"@codemirror/lang-javascript@^6.0.0", "@codemirror/lang-javascript@^6.1.2": + version "6.2.3" + resolved "https://registry.yarnpkg.com/@codemirror/lang-javascript/-/lang-javascript-6.2.3.tgz#d705c359dc816afcd3bcdf120a559f83d31d4cda" + integrity sha512-8PR3vIWg7pSu7ur8A07pGiYHgy3hHj+mRYRCSG8q+mPIrl0F02rgpGv+DsQTHRTc30rydOsf5PZ7yjKFg2Ackw== + dependencies: + "@codemirror/autocomplete" "^6.0.0" + "@codemirror/language" "^6.6.0" + "@codemirror/lint" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.17.0" + "@lezer/common" "^1.0.0" + "@lezer/javascript" "^1.0.0" + +"@codemirror/lang-json@^6.0.0": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@codemirror/lang-json/-/lang-json-6.0.1.tgz#0a0be701a5619c4b0f8991f9b5e95fe33f462330" + integrity sha512-+T1flHdgpqDDlJZ2Lkil/rLiRy684WMLc74xUnjJH48GQdfJo/pudlTRreZmKwzP8/tGdKf83wlbAdOCzlJOGQ== + dependencies: + "@codemirror/language" "^6.0.0" + "@lezer/json" "^1.0.0" + +"@codemirror/lang-less@^6.0.0": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@codemirror/lang-less/-/lang-less-6.0.2.tgz#2e3d82a3ddb8710e6409689cd4a28c66558d0cb8" + integrity sha512-EYdQTG22V+KUUk8Qq582g7FMnCZeEHsyuOJisHRft/mQ+ZSZ2w51NupvDUHiqtsOy7It5cHLPGfHQLpMh9bqpQ== + dependencies: + "@codemirror/lang-css" "^6.2.0" + "@codemirror/language" "^6.0.0" + "@lezer/common" "^1.2.0" + "@lezer/highlight" "^1.0.0" + "@lezer/lr" "^1.0.0" + +"@codemirror/lang-liquid@^6.0.0": + version "6.2.3" + resolved "https://registry.yarnpkg.com/@codemirror/lang-liquid/-/lang-liquid-6.2.3.tgz#cbdb38cbf2c59bc334292420401f88aa6c4b4b27" + integrity sha512-yeN+nMSrf/lNii3FJxVVEGQwFG0/2eDyH6gNOj+TGCa0hlNO4bhQnoO5ISnd7JOG+7zTEcI/GOoyraisFVY7jQ== + dependencies: + "@codemirror/autocomplete" "^6.0.0" + "@codemirror/lang-html" "^6.0.0" + "@codemirror/language" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.0.0" + "@lezer/common" "^1.0.0" + "@lezer/highlight" "^1.0.0" + "@lezer/lr" "^1.3.1" + +"@codemirror/lang-markdown@^6.0.0": + version "6.3.2" + resolved "https://registry.yarnpkg.com/@codemirror/lang-markdown/-/lang-markdown-6.3.2.tgz#841a922c9305c035678600de5187c1b7a80f6c21" + integrity sha512-c/5MYinGbFxYl4itE9q/rgN/sMTjOr8XL5OWnC+EaRMLfCbVUmmubTJfdgpfcSS2SCaT7b+Q+xi3l6CgoE+BsA== + dependencies: + "@codemirror/autocomplete" "^6.7.1" + "@codemirror/lang-html" "^6.0.0" + "@codemirror/language" "^6.3.0" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.0.0" + "@lezer/common" "^1.2.1" + "@lezer/markdown" "^1.0.0" + +"@codemirror/lang-php@^6.0.0": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@codemirror/lang-php/-/lang-php-6.0.1.tgz#fa34cc75562178325861a5731f79bd621f57ffaa" + integrity sha512-ublojMdw/PNWa7qdN5TMsjmqkNuTBD3k6ndZ4Z0S25SBAiweFGyY68AS3xNcIOlb6DDFDvKlinLQ40vSLqf8xA== + dependencies: + "@codemirror/lang-html" "^6.0.0" + "@codemirror/language" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@lezer/common" "^1.0.0" + "@lezer/php" "^1.0.0" + +"@codemirror/lang-python@^6.0.0": + version "6.2.0" + resolved "https://registry.yarnpkg.com/@codemirror/lang-python/-/lang-python-6.2.0.tgz#c9502ef53cfd9520e24796975235d1ba6363ca3d" + integrity sha512-+oLTR88uLib84tvb4XmOBBq/dgrctvPXueP3Wjotu4zmHLM2KW2wfswJ6r1BKlfJNcGgdWX1AgUeGEf3E2H5LA== + dependencies: + "@codemirror/autocomplete" "^6.3.2" + "@codemirror/language" "^6.8.0" + "@codemirror/state" "^6.0.0" + "@lezer/common" "^1.2.1" + "@lezer/python" "^1.1.4" + +"@codemirror/lang-rust@^6.0.0": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@codemirror/lang-rust/-/lang-rust-6.0.1.tgz#d6829fc7baa39a15bcd174a41a9e0a1bf7cf6ba8" + integrity sha512-344EMWFBzWArHWdZn/NcgkwMvZIWUR1GEBdwG8FEp++6o6vT6KL9V7vGs2ONsKxxFUPXKI0SPcWhyYyl2zPYxQ== + dependencies: + "@codemirror/language" "^6.0.0" + "@lezer/rust" "^1.0.0" + +"@codemirror/lang-sass@^6.0.0": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@codemirror/lang-sass/-/lang-sass-6.0.2.tgz#38c1b0a1326cc9f5cb2741d2cd51cfbcd7abc0b2" + integrity sha512-l/bdzIABvnTo1nzdY6U+kPAC51czYQcOErfzQ9zSm9D8GmNPD0WTW8st/CJwBTPLO8jlrbyvlSEcN20dc4iL0Q== + dependencies: + "@codemirror/lang-css" "^6.2.0" + "@codemirror/language" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@lezer/common" "^1.0.2" + "@lezer/sass" "^1.0.0" + +"@codemirror/lang-sql@^6.0.0": + version "6.8.0" + resolved "https://registry.yarnpkg.com/@codemirror/lang-sql/-/lang-sql-6.8.0.tgz#1ae68ad49f378605ff88a4cc428ba667ce056068" + integrity sha512-aGLmY4OwGqN3TdSx3h6QeA1NrvaYtF7kkoWR/+W7/JzB0gQtJ+VJxewlnE3+VImhA4WVlhmkJr109PefOOhjLg== + dependencies: + "@codemirror/autocomplete" "^6.0.0" + "@codemirror/language" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@lezer/common" "^1.2.0" + "@lezer/highlight" "^1.0.0" + "@lezer/lr" "^1.0.0" + +"@codemirror/lang-vue@^0.1.1": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@codemirror/lang-vue/-/lang-vue-0.1.3.tgz#bf79b9152cc18b4903d64c1f67e186ae045c8a97" + integrity sha512-QSKdtYTDRhEHCfo5zOShzxCmqKJvgGrZwDQSdbvCRJ5pRLWBS7pD/8e/tH44aVQT6FKm0t6RVNoSUWHOI5vNug== + dependencies: + "@codemirror/lang-html" "^6.0.0" + "@codemirror/lang-javascript" "^6.1.2" + "@codemirror/language" "^6.0.0" + "@lezer/common" "^1.2.0" + "@lezer/highlight" "^1.0.0" + "@lezer/lr" "^1.3.1" + +"@codemirror/lang-wast@^6.0.0": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@codemirror/lang-wast/-/lang-wast-6.0.2.tgz#d2b14175e5e80d7878cbbb29e20ec90dc12d3a2b" + integrity sha512-Imi2KTpVGm7TKuUkqyJ5NRmeFWF7aMpNiwHnLQe0x9kmrxElndyH0K6H/gXtWwY6UshMRAhpENsgfpSwsgmC6Q== + dependencies: + "@codemirror/language" "^6.0.0" + "@lezer/common" "^1.2.0" + "@lezer/highlight" "^1.0.0" + "@lezer/lr" "^1.0.0" + +"@codemirror/lang-xml@^6.0.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@codemirror/lang-xml/-/lang-xml-6.1.0.tgz#e3e786e1a89fdc9520efe75c1d6d3de1c40eb91c" + integrity sha512-3z0blhicHLfwi2UgkZYRPioSgVTo9PV5GP5ducFH6FaHy0IAJRg+ixj5gTR1gnT/glAIC8xv4w2VL1LoZfs+Jg== + dependencies: + "@codemirror/autocomplete" "^6.0.0" + "@codemirror/language" "^6.4.0" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.0.0" + "@lezer/common" "^1.0.0" + "@lezer/xml" "^1.0.0" + +"@codemirror/lang-yaml@^6.0.0": + version "6.1.2" + resolved "https://registry.yarnpkg.com/@codemirror/lang-yaml/-/lang-yaml-6.1.2.tgz#c84280c68fa7af456a355d91183b5e537e9b7038" + integrity sha512-dxrfG8w5Ce/QbT7YID7mWZFKhdhsaTNOYjOkSIMt1qmC4VQnXSDSYVHHHn8k6kJUfIhtLo8t1JJgltlxWdsITw== + dependencies: + "@codemirror/autocomplete" "^6.0.0" + "@codemirror/language" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@lezer/common" "^1.2.0" + "@lezer/highlight" "^1.2.0" + "@lezer/lr" "^1.0.0" + "@lezer/yaml" "^1.0.0" + +"@codemirror/language-data@^6.3.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@codemirror/language-data/-/language-data-6.5.1.tgz#5cb9413d5225ef27a577c23781bbc0b36c58bb67" + integrity sha512-0sWxeUSNlBr6OmkqybUTImADFUP0M3P0IiSde4nc24bz/6jIYzqYSgkOSLS+CBIoW1vU8Q9KUWXscBXeoMVC9w== + dependencies: + "@codemirror/lang-angular" "^0.1.0" + "@codemirror/lang-cpp" "^6.0.0" + "@codemirror/lang-css" "^6.0.0" + "@codemirror/lang-go" "^6.0.0" + "@codemirror/lang-html" "^6.0.0" + "@codemirror/lang-java" "^6.0.0" + "@codemirror/lang-javascript" "^6.0.0" + "@codemirror/lang-json" "^6.0.0" + "@codemirror/lang-less" "^6.0.0" + "@codemirror/lang-liquid" "^6.0.0" + "@codemirror/lang-markdown" "^6.0.0" + "@codemirror/lang-php" "^6.0.0" + "@codemirror/lang-python" "^6.0.0" + "@codemirror/lang-rust" "^6.0.0" + "@codemirror/lang-sass" "^6.0.0" + "@codemirror/lang-sql" "^6.0.0" + "@codemirror/lang-vue" "^0.1.1" + "@codemirror/lang-wast" "^6.0.0" + "@codemirror/lang-xml" "^6.0.0" + "@codemirror/lang-yaml" "^6.0.0" + "@codemirror/language" "^6.0.0" + "@codemirror/legacy-modes" "^6.4.0" + +"@codemirror/language@^6.0.0", "@codemirror/language@^6.10.1", "@codemirror/language@^6.3.0", "@codemirror/language@^6.4.0", "@codemirror/language@^6.6.0", "@codemirror/language@^6.8.0": + version "6.11.0" + resolved "https://registry.yarnpkg.com/@codemirror/language/-/language-6.11.0.tgz#5ae90972601497f4575f30811519d720bf7232c9" + integrity sha512-A7+f++LodNNc1wGgoRDTt78cOwWm9KVezApgjOMp1W4hM0898nsqBXwF+sbePE7ZRcjN7Sa1Z5m2oN27XkmEjQ== + dependencies: + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.23.0" + "@lezer/common" "^1.1.0" + "@lezer/highlight" "^1.0.0" + "@lezer/lr" "^1.0.0" + style-mod "^4.0.0" + +"@codemirror/legacy-modes@^6.4.0": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@codemirror/legacy-modes/-/legacy-modes-6.5.1.tgz#6bd13fac94f67a825e5420017e0d2f3c35d09342" + integrity sha512-DJYQQ00N1/KdESpZV7jg9hafof/iBNp9h7TYo1SLMk86TWl9uDsVdho2dzd81K+v4retmK6mdC7WpuOQDytQqw== + dependencies: + "@codemirror/language" "^6.0.0" + +"@codemirror/lint@^6.0.0": + version "6.8.5" + resolved "https://registry.yarnpkg.com/@codemirror/lint/-/lint-6.8.5.tgz#9edaa808e764e28e07665b015951934c8ec3a418" + integrity sha512-s3n3KisH7dx3vsoeGMxsbRAgKe4O1vbrnKBClm99PU0fWxmxsx5rR2PfqQgIt+2MMJBHbiJ5rfIdLYfB9NNvsA== + dependencies: + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.35.0" + crelt "^1.0.5" + +"@codemirror/search@^6.0.0": + version "6.5.10" + resolved "https://registry.yarnpkg.com/@codemirror/search/-/search-6.5.10.tgz#7367bfc88094d078b91c752bc74140fb565b55ee" + integrity sha512-RMdPdmsrUf53pb2VwflKGHEe1XVM07hI7vV2ntgw1dmqhimpatSJKva4VA9h4TLUDOD4EIF02201oZurpnEFsg== + dependencies: + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.0.0" + crelt "^1.0.5" + +"@codemirror/state@^6.0.0", "@codemirror/state@^6.4.0", "@codemirror/state@^6.4.1", "@codemirror/state@^6.5.0": + version "6.5.2" + resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-6.5.2.tgz#8eca3a64212a83367dc85475b7d78d5c9b7076c6" + integrity sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA== + dependencies: + "@marijn/find-cluster-break" "^1.0.0" + +"@codemirror/theme-one-dark@^6.1.2": + version "6.1.2" + resolved "https://registry.yarnpkg.com/@codemirror/theme-one-dark/-/theme-one-dark-6.1.2.tgz#fcef9f9cfc17a07836cb7da17c9f6d7231064df8" + integrity sha512-F+sH0X16j/qFLMAfbciKTxVOwkdAS336b7AXTKOZhy8BR3eH/RelsnLgLFINrpST63mmN2OuwUt0W2ndUgYwUA== + dependencies: + "@codemirror/language" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.0.0" + "@lezer/highlight" "^1.0.0" + +"@codemirror/view@^6.0.0", "@codemirror/view@^6.16.0", "@codemirror/view@^6.17.0", "@codemirror/view@^6.23.0", "@codemirror/view@^6.27.0", "@codemirror/view@^6.35.0": + version "6.36.7" + resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.36.7.tgz#f3711d3fea457a3eec1c09a76b8a132f98df17b1" + integrity sha512-kCWGW/chWGPgZqfZ36Um9Iz0X2IVpmCjg1P/qY6B6a2ecXtWRRAigmpJ6YgUQ5lTWXMyyVdfmpzhLZmsZQMbtg== + dependencies: + "@codemirror/state" "^6.5.0" + style-mod "^4.1.0" + w3c-keyname "^2.2.4" + "@contentlayer/cli@0.3.4": version "0.3.4" resolved "https://registry.yarnpkg.com/@contentlayer/cli/-/cli-0.3.4.tgz#a3b322aa30cd2c5db09c69b530928e80aebddae4" @@ -962,6 +1322,13 @@ dependencies: "@floating-ui/utils" "^0.2.9" +"@floating-ui/core@^1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.7.0.tgz#1aff27a993ea1b254a586318c29c3b16ea0f4d0a" + integrity sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA== + dependencies: + "@floating-ui/utils" "^0.2.9" + "@floating-ui/dom@^1.0.0": version "1.6.13" resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.13.tgz#a8a938532aea27a95121ec16e667a7cbe8c59e34" @@ -970,6 +1337,14 @@ "@floating-ui/core" "^1.6.0" "@floating-ui/utils" "^0.2.9" +"@floating-ui/dom@^1.5.1": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.7.0.tgz#f9f83ee4fee78ac23ad9e65b128fc11a27857532" + integrity sha512-lGTor4VlXcesUMh1cupTUTDoCxMb0V6bm3CnxHzQcw8Eaf1jQbgQX4i02fYgT0vJ82tb5MZ4CZk1LRGkktJCzg== + dependencies: + "@floating-ui/core" "^1.7.0" + "@floating-ui/utils" "^0.2.9" + "@floating-ui/react-dom@^2.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.1.2.tgz#a1349bbf6a0e5cb5ded55d023766f20a4d439a31" @@ -1505,6 +1880,150 @@ resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1" integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw== +"@lezer/common@^1.0.0", "@lezer/common@^1.0.2", "@lezer/common@^1.1.0", "@lezer/common@^1.2.0", "@lezer/common@^1.2.1": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@lezer/common/-/common-1.2.3.tgz#138fcddab157d83da557554851017c6c1e5667fd" + integrity sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA== + +"@lezer/cpp@^1.0.0": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@lezer/cpp/-/cpp-1.1.3.tgz#3029a542f4624fba0ed28f96511b34b8e7906352" + integrity sha512-ykYvuFQKGsRi6IcE+/hCSGUhb/I4WPjd3ELhEblm2wS2cOznDFzO+ubK2c+ioysOnlZ3EduV+MVQFCPzAIoY3w== + dependencies: + "@lezer/common" "^1.2.0" + "@lezer/highlight" "^1.0.0" + "@lezer/lr" "^1.0.0" + +"@lezer/css@^1.1.0", "@lezer/css@^1.1.7": + version "1.1.11" + resolved "https://registry.yarnpkg.com/@lezer/css/-/css-1.1.11.tgz#f73ac747e44f89d729cc421f829681a85b994766" + integrity sha512-FuAnusbLBl1SEAtfN8NdShxYJiESKw9LAFysfea1T96jD3ydBn12oYjaSG1a04BQRIUd93/0D8e5CV1cUMkmQg== + dependencies: + "@lezer/common" "^1.2.0" + "@lezer/highlight" "^1.0.0" + "@lezer/lr" "^1.0.0" + +"@lezer/go@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@lezer/go/-/go-1.0.0.tgz#26cd2463f8583e630f52e714dca6d7420c5f7d7e" + integrity sha512-co9JfT3QqX1YkrMmourYw2Z8meGC50Ko4d54QEcQbEYpvdUvN4yb0NBZdn/9ertgvjsySxHsKzH3lbm3vqJ4Jw== + dependencies: + "@lezer/common" "^1.2.0" + "@lezer/highlight" "^1.0.0" + "@lezer/lr" "^1.0.0" + +"@lezer/highlight@^1.0.0", "@lezer/highlight@^1.1.3", "@lezer/highlight@^1.2.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@lezer/highlight/-/highlight-1.2.1.tgz#596fa8f9aeb58a608be0a563e960c373cbf23f8b" + integrity sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA== + dependencies: + "@lezer/common" "^1.0.0" + +"@lezer/html@^1.3.0": + version "1.3.10" + resolved "https://registry.yarnpkg.com/@lezer/html/-/html-1.3.10.tgz#1be9a029a6fe835c823b20a98a449a630416b2af" + integrity sha512-dqpT8nISx/p9Do3AchvYGV3qYc4/rKr3IBZxlHmpIKam56P47RSHkSF5f13Vu9hebS1jM0HmtJIwLbWz1VIY6w== + dependencies: + "@lezer/common" "^1.2.0" + "@lezer/highlight" "^1.0.0" + "@lezer/lr" "^1.0.0" + +"@lezer/java@^1.0.0": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@lezer/java/-/java-1.1.3.tgz#9efd6a29b4142d07f211076a6fb5e8061c85e147" + integrity sha512-yHquUfujwg6Yu4Fd1GNHCvidIvJwi/1Xu2DaKl/pfWIA2c1oXkVvawH3NyXhCaFx4OdlYBVX5wvz2f7Aoa/4Xw== + dependencies: + "@lezer/common" "^1.2.0" + "@lezer/highlight" "^1.0.0" + "@lezer/lr" "^1.0.0" + +"@lezer/javascript@^1.0.0": + version "1.5.1" + resolved "https://registry.yarnpkg.com/@lezer/javascript/-/javascript-1.5.1.tgz#2a424a6ec29f1d4ef3c34cbccc5447e373618ad8" + integrity sha512-ATOImjeVJuvgm3JQ/bpo2Tmv55HSScE2MTPnKRMRIPx2cLhHGyX2VnqpHhtIV1tVzIjZDbcWQm+NCTF40ggZVw== + dependencies: + "@lezer/common" "^1.2.0" + "@lezer/highlight" "^1.1.3" + "@lezer/lr" "^1.3.0" + +"@lezer/json@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@lezer/json/-/json-1.0.3.tgz#e773a012ad0088fbf07ce49cfba875cc9e5bc05f" + integrity sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ== + dependencies: + "@lezer/common" "^1.2.0" + "@lezer/highlight" "^1.0.0" + "@lezer/lr" "^1.0.0" + +"@lezer/lr@^1.0.0", "@lezer/lr@^1.1.0", "@lezer/lr@^1.3.0", "@lezer/lr@^1.3.1", "@lezer/lr@^1.3.3", "@lezer/lr@^1.4.0": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@lezer/lr/-/lr-1.4.2.tgz#931ea3dea8e9de84e90781001dae30dea9ff1727" + integrity sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA== + dependencies: + "@lezer/common" "^1.0.0" + +"@lezer/markdown@^1.0.0": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@lezer/markdown/-/markdown-1.4.3.tgz#a742ed5e782ac4913a621dfd1e6a8e409f4dd589" + integrity sha512-kfw+2uMrQ/wy/+ONfrH83OkdFNM0ye5Xq96cLlaCy7h5UT9FO54DU4oRoIc0CSBh5NWmWuiIJA7NGLMJbQ+Oxg== + dependencies: + "@lezer/common" "^1.0.0" + "@lezer/highlight" "^1.0.0" + +"@lezer/php@^1.0.0": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@lezer/php/-/php-1.0.2.tgz#7c291631fc1e7f7efe99977522bc48bdc732658a" + integrity sha512-GN7BnqtGRpFyeoKSEqxvGvhJQiI4zkgmYnDk/JIyc7H7Ifc1tkPnUn/R2R8meH3h/aBf5rzjvU8ZQoyiNDtDrA== + dependencies: + "@lezer/common" "^1.2.0" + "@lezer/highlight" "^1.0.0" + "@lezer/lr" "^1.1.0" + +"@lezer/python@^1.1.4": + version "1.1.18" + resolved "https://registry.yarnpkg.com/@lezer/python/-/python-1.1.18.tgz#fa02fbf492741c82dc2dc98a0a042bd0d4d7f1d3" + integrity sha512-31FiUrU7z9+d/ElGQLJFXl+dKOdx0jALlP3KEOsGTex8mvj+SoE1FgItcHWK/axkxCHGUSpqIHt6JAWfWu9Rhg== + dependencies: + "@lezer/common" "^1.2.0" + "@lezer/highlight" "^1.0.0" + "@lezer/lr" "^1.0.0" + +"@lezer/rust@^1.0.0": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@lezer/rust/-/rust-1.0.2.tgz#cc9a75605d67182a0e799ac40b1965a61dcc6ef0" + integrity sha512-Lz5sIPBdF2FUXcWeCu1//ojFAZqzTQNRga0aYv6dYXqJqPfMdCAI0NzajWUd4Xijj1IKJLtjoXRPMvTKWBcqKg== + dependencies: + "@lezer/common" "^1.2.0" + "@lezer/highlight" "^1.0.0" + "@lezer/lr" "^1.0.0" + +"@lezer/sass@^1.0.0": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@lezer/sass/-/sass-1.0.7.tgz#e90066b1d386eee6160edc88a39293844e4ba106" + integrity sha512-8HLlOkuX/SMHOggI2DAsXUw38TuURe+3eQ5hiuk9QmYOUyC55B1dYEIMkav5A4IELVaW4e1T4P9WRiI5ka4mdw== + dependencies: + "@lezer/common" "^1.2.0" + "@lezer/highlight" "^1.0.0" + "@lezer/lr" "^1.0.0" + +"@lezer/xml@^1.0.0": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@lezer/xml/-/xml-1.0.6.tgz#908c203923288f854eb8e2f4d9b06c437e8610b9" + integrity sha512-CdDwirL0OEaStFue/66ZmFSeppuL6Dwjlk8qk153mSQwiSH/Dlri4GNymrNWnUmPl2Um7QfV1FO9KFUyX3Twww== + dependencies: + "@lezer/common" "^1.2.0" + "@lezer/highlight" "^1.0.0" + "@lezer/lr" "^1.0.0" + +"@lezer/yaml@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@lezer/yaml/-/yaml-1.0.3.tgz#b23770ab42b390056da6b187d861b998fd60b1ff" + integrity sha512-GuBLekbw9jDBDhGur82nuwkxKQ+a3W5H0GfaAthDXcAu+XdpS43VlnxA9E9hllkpSP5ellRDKjLLj7Lu9Wr6xA== + dependencies: + "@lezer/common" "^1.2.0" + "@lezer/highlight" "^1.0.0" + "@lezer/lr" "^1.4.0" + "@linear/sdk@^31.0.0": version "31.0.0" resolved "https://registry.yarnpkg.com/@linear/sdk/-/sdk-31.0.0.tgz#05faac8bbb9ebd7b530760e9535f5bd7fe2f3618" @@ -1514,6 +2033,11 @@ graphql "^15.4.0" isomorphic-unfetch "^3.1.0" +"@marijn/find-cluster-break@^1.0.0": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz#775374306116d51c0c500b8c4face0f9a04752d8" + integrity sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g== + "@mdx-js/esbuild@^2.0.0": version "2.3.0" resolved "https://registry.yarnpkg.com/@mdx-js/esbuild/-/esbuild-2.3.0.tgz#97f2f1b854d904c50bcd0a219b3664657f4fe8c3" @@ -1583,6 +2107,331 @@ dependencies: "@types/mdx" "^2.0.0" +"@milkdown/components@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@milkdown/components/-/components-7.9.0.tgz#0dbb11ab8241865b8849262ce471f98946aacee6" + integrity sha512-2TzazW5hK2pNC0UozolIvEYhjLCzDHZ+vrW1QhTqac69Mma4ieK2qwsClmhrWzkhQF9tgob1A3sCyTpsHV2s2w== + dependencies: + "@floating-ui/dom" "^1.5.1" + "@milkdown/core" "7.9.0" + "@milkdown/ctx" "7.9.0" + "@milkdown/exception" "7.9.0" + "@milkdown/plugin-tooltip" "7.9.0" + "@milkdown/preset-commonmark" "7.9.0" + "@milkdown/preset-gfm" "7.9.0" + "@milkdown/prose" "7.9.0" + "@milkdown/transformer" "7.9.0" + "@milkdown/utils" "7.9.0" + "@types/lodash.debounce" "^4.0.7" + "@types/lodash.throttle" "^4.1.9" + clsx "^2.0.0" + dompurify "^3.2.5" + lodash.debounce "^4.0.8" + lodash.throttle "^4.1.1" + nanoid "^5.0.9" + tslib "^2.8.1" + unist-util-visit "^5.0.0" + vue "^3.5.13" + +"@milkdown/core@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@milkdown/core/-/core-7.9.0.tgz#2be0c8eebed5faadbecaa9ca9dde57f8aa4e7bd6" + integrity sha512-NfPo2EC9kgFGn2Qm8aKa+Ja6RHae7HKMRMSCWg6p61PJRhqTlu2tEJDEz+R07p8gkiQia91O9TU6iXADqqLbXw== + dependencies: + "@milkdown/ctx" "7.9.0" + "@milkdown/exception" "7.9.0" + "@milkdown/prose" "7.9.0" + "@milkdown/transformer" "7.9.0" + remark-parse "^11.0.0" + remark-stringify "^11.0.0" + tslib "^2.8.1" + unified "^11.0.3" + +"@milkdown/crepe@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@milkdown/crepe/-/crepe-7.9.0.tgz#f089439fe6add2dd56d68583533676162824d290" + integrity sha512-fu+KV4Jw/yPz4c4jkOjV5YHoGpQSi5ajlztg6mpzJmvWev0owgxWkWtIG3GWO3o8ya237q5vwbLAwixMyOt4UQ== + dependencies: + "@codemirror/commands" "^6.2.4" + "@codemirror/language" "^6.10.1" + "@codemirror/language-data" "^6.3.1" + "@codemirror/state" "^6.4.1" + "@codemirror/theme-one-dark" "^6.1.2" + "@codemirror/view" "^6.16.0" + "@milkdown/kit" "7.9.0" + clsx "^2.0.0" + codemirror "^6.0.1" + katex "^0.16.0" + nanoid "^5.0.9" + prosemirror-virtual-cursor "^0.4.2" + remark-math "^6.0.0" + tslib "^2.8.1" + unist-util-visit "^5.0.0" + vue "^3.5.13" + +"@milkdown/ctx@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@milkdown/ctx/-/ctx-7.9.0.tgz#1e0d7b8d242feeec161bc39127ff402be819ef0d" + integrity sha512-zuYerdPTqV6VYCGTHmBaLsFilkObiGapRnM4GcAVckwMoPS2kPm5hyF9LRw5OCqeUphAPYUpiVZoZncXZahENA== + dependencies: + "@milkdown/exception" "7.9.0" + tslib "^2.8.1" + +"@milkdown/exception@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@milkdown/exception/-/exception-7.9.0.tgz#eeeb18f7c675d8c1f2f0582af60e3530b2df94a8" + integrity sha512-F5bxlHFtlI6q5fhKrGbtDvIlmTx7bdFWMWYHdSAPkJsiTIIT4hmAGOx/j8fFczQZ6hg3vWi/CtvYhF1MUpIEjQ== + dependencies: + tslib "^2.8.1" + +"@milkdown/kit@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@milkdown/kit/-/kit-7.9.0.tgz#68a0de3fae20f1a5c99aa69da05f754eabc630c7" + integrity sha512-q8pbYM6BtQOAtaKvhyemwvwi2btX8YDFaV1aaYg6wvX10j76L2mfQ2CUCLxiNAXSyC6ohA4pmDvVTB5H4uRkpw== + dependencies: + "@milkdown/components" "7.9.0" + "@milkdown/core" "7.9.0" + "@milkdown/ctx" "7.9.0" + "@milkdown/plugin-block" "7.9.0" + "@milkdown/plugin-clipboard" "7.9.0" + "@milkdown/plugin-cursor" "7.9.0" + "@milkdown/plugin-history" "7.9.0" + "@milkdown/plugin-indent" "7.9.0" + "@milkdown/plugin-listener" "7.9.0" + "@milkdown/plugin-slash" "7.9.0" + "@milkdown/plugin-tooltip" "7.9.0" + "@milkdown/plugin-trailing" "7.9.0" + "@milkdown/plugin-upload" "7.9.0" + "@milkdown/preset-commonmark" "7.9.0" + "@milkdown/preset-gfm" "7.9.0" + "@milkdown/prose" "7.9.0" + "@milkdown/transformer" "7.9.0" + "@milkdown/utils" "7.9.0" + tslib "^2.8.1" + +"@milkdown/plugin-block@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@milkdown/plugin-block/-/plugin-block-7.9.0.tgz#50dc82fba94f3473c00a3a2a3f32152cc1134c5b" + integrity sha512-k0dHsS7ZCG0wzUxsunFqIs5s5HcBfvYGnqyLWj7BGd1vGtIWrbhIm6+hx9K9kuyOgw876/PHHX6yxMyg0leu0A== + dependencies: + "@floating-ui/dom" "^1.5.1" + "@milkdown/core" "7.9.0" + "@milkdown/ctx" "7.9.0" + "@milkdown/exception" "7.9.0" + "@milkdown/prose" "7.9.0" + "@milkdown/utils" "7.9.0" + "@types/lodash.throttle" "^4.1.9" + lodash.throttle "^4.1.1" + tslib "^2.8.1" + +"@milkdown/plugin-clipboard@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@milkdown/plugin-clipboard/-/plugin-clipboard-7.9.0.tgz#7c4eab6eaa718826dc5a9e46ec116786b32271c1" + integrity sha512-qwaNC6mK91m+QRuldLIiQEADCGoYDcDv4CwPyzFkIL1PDp6hY4PcmHLwXMF+LhsD8cJ/A5vXePcVTq0r6qHQJg== + dependencies: + "@milkdown/core" "7.9.0" + "@milkdown/ctx" "7.9.0" + "@milkdown/prose" "7.9.0" + "@milkdown/utils" "7.9.0" + tslib "^2.8.1" + +"@milkdown/plugin-cursor@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@milkdown/plugin-cursor/-/plugin-cursor-7.9.0.tgz#e4f89c4ee6f80b5cf766b834e3dad1c2feb118c0" + integrity sha512-zu/hQh8XS2d3rK0AcnnqqXE24veBxUAaj9L9dJ2/fbcooHul3Ardd9NP1hQ+LGiAN/q/v90TgAjajYEdwm30Sg== + dependencies: + "@milkdown/core" "7.9.0" + "@milkdown/ctx" "7.9.0" + "@milkdown/prose" "7.9.0" + "@milkdown/utils" "7.9.0" + tslib "^2.8.1" + +"@milkdown/plugin-history@7.9.0", "@milkdown/plugin-history@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@milkdown/plugin-history/-/plugin-history-7.9.0.tgz#15a80d9d8e29798576815cb0fd6c3f5cb2590054" + integrity sha512-HxVkayRVsFqZKOvJ97uDael3SVFw7ZB24eKrq9BAIliYC3qfNiv/JxQclZGiZdldk3mTGHrgC5KVSBiwXiIVAA== + dependencies: + "@milkdown/core" "7.9.0" + "@milkdown/ctx" "7.9.0" + "@milkdown/prose" "7.9.0" + "@milkdown/utils" "7.9.0" + tslib "^2.8.1" + +"@milkdown/plugin-indent@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@milkdown/plugin-indent/-/plugin-indent-7.9.0.tgz#b31ba7e82966027904927f02cebb6dff335e2936" + integrity sha512-7BfjriLSc0JtDgBvjOijkBHNUbc3nB/0pYf+KIXw+g+uLcsxEPidhwAxUR4RdYZfobuR7yxmmlNeMERGyMJrqg== + dependencies: + "@milkdown/core" "7.9.0" + "@milkdown/ctx" "7.9.0" + "@milkdown/prose" "7.9.0" + "@milkdown/utils" "7.9.0" + tslib "^2.8.1" + +"@milkdown/plugin-listener@7.9.0", "@milkdown/plugin-listener@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@milkdown/plugin-listener/-/plugin-listener-7.9.0.tgz#42c307ce79dfff33643c7d749de7290a605f5c7d" + integrity sha512-yZ1FAqeI4g3W8Npmn0rjuFzPsSDccZ4aK+IDS1oN8NeFLkf4Y8Tk9qjr49mnYx2Rg87+kdynBUk8yCLC/o9/ew== + dependencies: + "@milkdown/core" "7.9.0" + "@milkdown/ctx" "7.9.0" + "@milkdown/prose" "7.9.0" + "@milkdown/utils" "7.9.0" + "@types/lodash.debounce" "^4.0.7" + lodash.debounce "^4.0.8" + tslib "^2.8.1" + +"@milkdown/plugin-slash@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@milkdown/plugin-slash/-/plugin-slash-7.9.0.tgz#249a36a0457ea16da582fc3ea5d6bfe3b70705d9" + integrity sha512-9M4cw4F0nBPKU0tVitYPBYHzFI7y7tw81Z+PCaNgguCVtznhuwZFwiG8dGvFfxAvE9Ior0uMXCAz4jEDO0Iu0g== + dependencies: + "@floating-ui/dom" "^1.5.1" + "@milkdown/core" "7.9.0" + "@milkdown/ctx" "7.9.0" + "@milkdown/exception" "7.9.0" + "@milkdown/prose" "7.9.0" + "@milkdown/utils" "7.9.0" + "@types/lodash.debounce" "^4.0.7" + lodash.debounce "^4.0.8" + tslib "^2.8.1" + +"@milkdown/plugin-tooltip@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@milkdown/plugin-tooltip/-/plugin-tooltip-7.9.0.tgz#301b784ee0122a8348bc00fe81a95f702ef8dd8d" + integrity sha512-49yZNeESw5oMDs1LexUqMugR4PjlEpX9nNWd3mr15BkQVNZG5vXUKQQKW5Rxd6yKzA6Yhd49vNmtGI6+B9o/DA== + dependencies: + "@floating-ui/dom" "^1.5.1" + "@milkdown/core" "7.9.0" + "@milkdown/ctx" "7.9.0" + "@milkdown/exception" "7.9.0" + "@milkdown/prose" "7.9.0" + "@milkdown/utils" "7.9.0" + "@types/lodash.throttle" "^4.1.9" + lodash.throttle "^4.1.1" + tslib "^2.8.1" + +"@milkdown/plugin-trailing@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@milkdown/plugin-trailing/-/plugin-trailing-7.9.0.tgz#e246ae3a74e7c3fff152b5fc8b61a88ab389cb5d" + integrity sha512-tlitJLde4OXw+BirGhDeiOJUL24eSwWKrOnKeJXJs9nZ6MYk4DVc6DZamLaPLLNkzj3/UqbXLTF43jpY+M25eA== + dependencies: + "@milkdown/core" "7.9.0" + "@milkdown/ctx" "7.9.0" + "@milkdown/prose" "7.9.0" + "@milkdown/utils" "7.9.0" + tslib "^2.8.1" + +"@milkdown/plugin-upload@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@milkdown/plugin-upload/-/plugin-upload-7.9.0.tgz#2c0f59f19ce016e9ce305cf65720ac60fb32f945" + integrity sha512-6gWqCGpSx7PnSuMGgtTRFi8HE2Hqo4jpLco++39cvWY7M9YRykahGrHvaLZWwxsYwOx7KbnUL9jXUyydf7S0EA== + dependencies: + "@milkdown/core" "7.9.0" + "@milkdown/ctx" "7.9.0" + "@milkdown/exception" "7.9.0" + "@milkdown/prose" "7.9.0" + "@milkdown/utils" "7.9.0" + tslib "^2.8.1" + +"@milkdown/preset-commonmark@7.9.0", "@milkdown/preset-commonmark@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@milkdown/preset-commonmark/-/preset-commonmark-7.9.0.tgz#a82e96644db58f1814c5faca0499a45e29340cd3" + integrity sha512-LK8spdAuC2xbjf6eXDrLbmTWWgEy45Y3BkUiqAqwQtnxuhkHVc7zZFhHV76TosnM3UEPihbqzTxJrQe4hvUBnw== + dependencies: + "@milkdown/core" "7.9.0" + "@milkdown/ctx" "7.9.0" + "@milkdown/exception" "7.9.0" + "@milkdown/prose" "7.9.0" + "@milkdown/transformer" "7.9.0" + "@milkdown/utils" "7.9.0" + remark-inline-links "^7.0.0" + tslib "^2.8.1" + unist-util-visit "^5.0.0" + +"@milkdown/preset-gfm@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@milkdown/preset-gfm/-/preset-gfm-7.9.0.tgz#8699b5d7b36d8d674d5ce91730b28df75bff0f75" + integrity sha512-WRuKaeFaJziLsgf+60gwKlM8G0At9zAocumNnqrlP8RznXgJzy5ptwLN4+XN0JUcjse9ujEIZRVfpXWHUr2UFg== + dependencies: + "@milkdown/core" "7.9.0" + "@milkdown/ctx" "7.9.0" + "@milkdown/exception" "7.9.0" + "@milkdown/preset-commonmark" "7.9.0" + "@milkdown/prose" "7.9.0" + "@milkdown/transformer" "7.9.0" + "@milkdown/utils" "7.9.0" + prosemirror-safari-ime-span "^1.0.1" + remark-gfm "^4.0.0" + tslib "^2.8.1" + +"@milkdown/prose@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@milkdown/prose/-/prose-7.9.0.tgz#0d0abf0fae1406f42085b142fd71efbd1b7c910d" + integrity sha512-UfbQwZxZUulB7JM4GfqQx3vI3ASJMfk8joPvVT4vBeEFI9sIIAMd00OuHBoJL5ZVtUJIAiG68PGIerzbedHcMw== + dependencies: + "@milkdown/exception" "7.9.0" + prosemirror-changeset "^2.2.1" + prosemirror-commands "^1.6.2" + prosemirror-dropcursor "^1.8.1" + prosemirror-gapcursor "^1.3.2" + prosemirror-history "^1.4.1" + prosemirror-inputrules "^1.4.0" + prosemirror-keymap "^1.2.2" + prosemirror-model "^1.24.1" + prosemirror-schema-list "^1.5.0" + prosemirror-state "^1.4.3" + prosemirror-tables "^1.7.0" + prosemirror-transform "^1.10.2" + prosemirror-view "^1.37.1" + tslib "^2.8.1" + +"@milkdown/react@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@milkdown/react/-/react-7.9.0.tgz#2527d767c6e498c97dc7fe1d88a3d6cf36470521" + integrity sha512-PwafWuBz5XtdFQyWDi2CqJCjYrtjq5MUmkcmxPd5yfadHpB9gRfcC1SsVfER0w9bJaW89+uuLzbC6kF7rhc/Mg== + dependencies: + "@milkdown/crepe" "7.9.0" + "@milkdown/kit" "7.9.0" + tslib "^2.8.1" + +"@milkdown/theme-nord@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@milkdown/theme-nord/-/theme-nord-7.9.0.tgz#f50a8876f3c25e46018ab9e8d73288fed5aca639" + integrity sha512-t7w92bKU1lt6HJGKlA/EhQnN1VmQfsKdnchk7wPkxLIiOiiQlYDhYhqjHP1bdqm1wkROBQhfzsxtxcK6672FHA== + dependencies: + "@milkdown/core" "7.9.0" + "@milkdown/ctx" "7.9.0" + "@milkdown/prose" "7.9.0" + clsx "^2.0.0" + tslib "^2.8.1" + +"@milkdown/transformer@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@milkdown/transformer/-/transformer-7.9.0.tgz#74d0d27d211341a019867bdcc08c09bfbb0b9285" + integrity sha512-lBFXYuA116l3O8an76GsmpBA3abJgkqVgxNu9v92miQCFmLUlg3YIeEeeECiwaPAwUE51Vq9ygBOTmyYyGRKNQ== + dependencies: + "@milkdown/exception" "7.9.0" + "@milkdown/prose" "7.9.0" + remark "^15.0.1" + remark-parse "^11.0.0" + remark-stringify "^11.0.0" + tslib "^2.8.1" + unified "^11.0.3" + +"@milkdown/utils@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@milkdown/utils/-/utils-7.9.0.tgz#4d2162b9c1c9d80d6d63819ab421075e2cab3162" + integrity sha512-hw+HUXgBcIT8SmMhhUP0LNcJfp8LHXq3FoqV7g1RcUf19wdXMxcsM0SwiIzqRr2nejQTIg7tyet7+bs9InGAsw== + dependencies: + "@milkdown/core" "7.9.0" + "@milkdown/ctx" "7.9.0" + "@milkdown/exception" "7.9.0" + "@milkdown/prose" "7.9.0" + "@milkdown/transformer" "7.9.0" + nanoid "^5.0.9" + tslib "^2.8.1" + "@mintlify/cli@4.0.496": version "4.0.496" resolved "https://registry.yarnpkg.com/@mintlify/cli/-/cli-4.0.496.tgz#a79f3eb3f6633b17fb2b45fe821b5bbcecf44de0" @@ -3948,7 +4797,21 @@ resolved "https://registry.yarnpkg.com/@types/katex/-/katex-0.16.7.tgz#03ab680ab4fa4fbc6cb46ecf987ecad5d8019868" integrity sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ== -"@types/lodash@^4.17.16": +"@types/lodash.debounce@^4.0.7": + version "4.0.9" + resolved "https://registry.yarnpkg.com/@types/lodash.debounce/-/lodash.debounce-4.0.9.tgz#0f5f21c507bce7521b5e30e7a24440975ac860a5" + integrity sha512-Ma5JcgTREwpLRwMM+XwBR7DaWe96nC38uCBDFKZWbNKD+osjVzdpnUSwBcqCptrp16sSOLBAUb50Car5I0TCsQ== + dependencies: + "@types/lodash" "*" + +"@types/lodash.throttle@^4.1.9": + version "4.1.9" + resolved "https://registry.yarnpkg.com/@types/lodash.throttle/-/lodash.throttle-4.1.9.tgz#f17a6ae084f7c0117bd7df145b379537bc9615c5" + integrity sha512-PCPVfpfueguWZQB7pJQK890F2scYKoDUL3iM522AptHWn7d5NQmeS/LTEHIcLr5PaTzl3dK2Z0xSUHHTHwaL5g== + dependencies: + "@types/lodash" "*" + +"@types/lodash@*", "@types/lodash@^4.17.16": version "4.17.16" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.16.tgz#94ae78fab4a38d73086e962d0b65c30d816bfb0a" integrity sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g== @@ -4081,6 +4944,11 @@ "@types/node" "*" "@types/send" "*" +"@types/trusted-types@^2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" + integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== + "@types/unist@*", "@types/unist@^3.0.0", "@types/unist@^3.0.3": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.3.tgz#acaab0f919ce69cce629c2d4ed2eb4adc1b6c20c" @@ -4482,6 +5350,86 @@ resolved "https://registry.yarnpkg.com/@vladfrangu/async_event_emitter/-/async_event_emitter-2.4.6.tgz#508b6c45b03f917112a9008180b308ba0e4d1805" integrity sha512-RaI5qZo6D2CVS6sTHFKg1v5Ohq/+Bo2LZ5gzUEwZ/WkHhwtGTCB/sVLw8ijOkAUxasZ+WshN/Rzj4ywsABJ5ZA== +"@vue/compiler-core@3.5.13": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.5.13.tgz#b0ae6c4347f60c03e849a05d34e5bf747c9bda05" + integrity sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q== + dependencies: + "@babel/parser" "^7.25.3" + "@vue/shared" "3.5.13" + entities "^4.5.0" + estree-walker "^2.0.2" + source-map-js "^1.2.0" + +"@vue/compiler-dom@3.5.13": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz#bb1b8758dbc542b3658dda973b98a1c9311a8a58" + integrity sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA== + dependencies: + "@vue/compiler-core" "3.5.13" + "@vue/shared" "3.5.13" + +"@vue/compiler-sfc@3.5.13": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz#461f8bd343b5c06fac4189c4fef8af32dea82b46" + integrity sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ== + dependencies: + "@babel/parser" "^7.25.3" + "@vue/compiler-core" "3.5.13" + "@vue/compiler-dom" "3.5.13" + "@vue/compiler-ssr" "3.5.13" + "@vue/shared" "3.5.13" + estree-walker "^2.0.2" + magic-string "^0.30.11" + postcss "^8.4.48" + source-map-js "^1.2.0" + +"@vue/compiler-ssr@3.5.13": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz#e771adcca6d3d000f91a4277c972a996d07f43ba" + integrity sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA== + dependencies: + "@vue/compiler-dom" "3.5.13" + "@vue/shared" "3.5.13" + +"@vue/reactivity@3.5.13": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.5.13.tgz#b41ff2bb865e093899a22219f5b25f97b6fe155f" + integrity sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg== + dependencies: + "@vue/shared" "3.5.13" + +"@vue/runtime-core@3.5.13": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.5.13.tgz#1fafa4bf0b97af0ebdd9dbfe98cd630da363a455" + integrity sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw== + dependencies: + "@vue/reactivity" "3.5.13" + "@vue/shared" "3.5.13" + +"@vue/runtime-dom@3.5.13": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz#610fc795de9246300e8ae8865930d534e1246215" + integrity sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog== + dependencies: + "@vue/reactivity" "3.5.13" + "@vue/runtime-core" "3.5.13" + "@vue/shared" "3.5.13" + csstype "^3.1.3" + +"@vue/server-renderer@3.5.13": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.5.13.tgz#429ead62ee51de789646c22efe908e489aad46f7" + integrity sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA== + dependencies: + "@vue/compiler-ssr" "3.5.13" + "@vue/shared" "3.5.13" + +"@vue/shared@3.5.13": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.5.13.tgz#87b309a6379c22b926e696893237826f64339b6f" + integrity sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ== + "@xstate/react@^4.1.1": version "4.1.3" resolved "https://registry.yarnpkg.com/@xstate/react/-/react-4.1.3.tgz#d3db7102ad950584d15f5a07fc17d52a127f3c68" @@ -5305,6 +6253,19 @@ cmdk@^1.0.0: "@radix-ui/react-id" "^1.1.0" "@radix-ui/react-primitive" "^2.0.2" +codemirror@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-6.0.1.tgz#62b91142d45904547ee3e0e0e4c1a79158035a29" + integrity sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg== + dependencies: + "@codemirror/autocomplete" "^6.0.0" + "@codemirror/commands" "^6.0.0" + "@codemirror/language" "^6.0.0" + "@codemirror/lint" "^6.0.0" + "@codemirror/search" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.0.0" + collapse-white-space@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-2.1.0.tgz#640257174f9f42c740b40f3b55ee752924feefca" @@ -5460,6 +6421,11 @@ cosmiconfig@^9.0.0: js-yaml "^4.1.0" parse-json "^5.2.0" +crelt@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.6.tgz#7cc898ea74e190fb6ef9dae57f8f81cf7302df72" + integrity sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g== + cron@^3.1.7: version "3.5.0" resolved "https://registry.yarnpkg.com/cron/-/cron-3.5.0.tgz#e8caa384e998ed275e19598df4dbd0e8578c35d9" @@ -5934,6 +6900,13 @@ domhandler@^5.0.2, domhandler@^5.0.3: dependencies: domelementtype "^2.3.0" +dompurify@^3.2.5: + version "3.2.5" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.2.5.tgz#11b108656a5fb72b24d916df17a1421663d7129c" + integrity sha512-mLPd29uoRe9HpvwP2TxClGQBzGXeEC/we/q+bFlmPPmj2p2Ugl3r6ATu/UU1v77DXNcehiBg9zsr1dREyA/dJQ== + optionalDependencies: + "@types/trusted-types" "^2.0.7" + domutils@^3.1.0, domutils@^3.2.1: version "3.2.2" resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.2.2.tgz#edbfe2b668b0c1d97c24baf0f1062b132221bc78" @@ -8763,6 +9736,11 @@ lodash.castarray@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.castarray/-/lodash.castarray-4.4.0.tgz#c02513515e309daddd4c24c60cfddcf5976d9115" integrity sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q== +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + lodash.includes@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" @@ -8808,6 +9786,11 @@ lodash.snakecase@4.1.1: resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" integrity sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== +lodash.throttle@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" + integrity sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ== + lodash.topath@^4.5.2: version "4.5.2" resolved "https://registry.yarnpkg.com/lodash.topath/-/lodash.topath-4.5.2.tgz#3616351f3bba61994a0931989660bd03254fd009" @@ -8943,6 +9926,15 @@ mdast-util-definitions@^5.0.0: "@types/unist" "^2.0.0" unist-util-visit "^4.0.0" +mdast-util-definitions@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz#c1bb706e5e76bb93f9a09dd7af174002ae69ac24" + integrity sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ== + dependencies: + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + unist-util-visit "^5.0.0" + mdast-util-find-and-replace@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz#70a3174c894e14df722abf43bc250cbae44b11df" @@ -10241,6 +11233,11 @@ nanoid@^3.3.6, nanoid@^3.3.8: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== +nanoid@^5.0.9: + version "5.1.5" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-5.1.5.tgz#f7597f9d9054eb4da9548cdd53ca70f1790e87de" + integrity sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw== + napi-postinstall@^0.1.1: version "0.1.5" resolved "https://registry.yarnpkg.com/napi-postinstall/-/napi-postinstall-0.1.5.tgz#aba2cc64897c7a061e2f985fd24abe9a183ad979" @@ -10624,6 +11621,11 @@ ora@^6.1.2: strip-ansi "^7.0.1" wcwidth "^1.0.1" +orderedmap@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/orderedmap/-/orderedmap-2.1.1.tgz#61481269c44031c449915497bf5a4ad273c512d2" + integrity sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g== + os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -10979,7 +11981,7 @@ postcss@8.4.31: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8, postcss@^8.4.23, postcss@^8.4.38, postcss@^8.4.39, postcss@^8.4.40, postcss@^8.4.41, postcss@^8.4.47: +postcss@^8, postcss@^8.4.23, postcss@^8.4.38, postcss@^8.4.39, postcss@^8.4.40, postcss@^8.4.41, postcss@^8.4.47, postcss@^8.4.48: version "8.5.3" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb" integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A== @@ -11022,6 +12024,132 @@ property-information@^7.0.0: resolved "https://registry.yarnpkg.com/property-information/-/property-information-7.0.0.tgz#3508a6d6b0b8eb3ca6eb2c6623b164d2ed2ab112" integrity sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg== +prosemirror-changeset@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/prosemirror-changeset/-/prosemirror-changeset-2.2.1.tgz#dae94b63aec618fac7bb9061648e6e2a79988383" + integrity sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ== + dependencies: + prosemirror-transform "^1.0.0" + +prosemirror-commands@^1.6.2: + version "1.7.1" + resolved "https://registry.yarnpkg.com/prosemirror-commands/-/prosemirror-commands-1.7.1.tgz#d101fef85618b1be53d5b99ea17bee5600781b38" + integrity sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w== + dependencies: + prosemirror-model "^1.0.0" + prosemirror-state "^1.0.0" + prosemirror-transform "^1.10.2" + +prosemirror-dropcursor@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.2.tgz#2ed30c4796109ddeb1cf7282372b3850528b7228" + integrity sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw== + dependencies: + prosemirror-state "^1.0.0" + prosemirror-transform "^1.1.0" + prosemirror-view "^1.1.0" + +prosemirror-gapcursor@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.2.tgz#5fa336b83789c6199a7341c9493587e249215cb4" + integrity sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ== + dependencies: + prosemirror-keymap "^1.0.0" + prosemirror-model "^1.0.0" + prosemirror-state "^1.0.0" + prosemirror-view "^1.0.0" + +prosemirror-history@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/prosemirror-history/-/prosemirror-history-1.4.1.tgz#cc370a46fb629e83a33946a0e12612e934ab8b98" + integrity sha512-2JZD8z2JviJrboD9cPuX/Sv/1ChFng+xh2tChQ2X4bB2HeK+rra/bmJ3xGntCcjhOqIzSDG6Id7e8RJ9QPXLEQ== + dependencies: + prosemirror-state "^1.2.2" + prosemirror-transform "^1.0.0" + prosemirror-view "^1.31.0" + rope-sequence "^1.3.0" + +prosemirror-inputrules@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/prosemirror-inputrules/-/prosemirror-inputrules-1.5.0.tgz#e22bfaf1d6ea4fe240ad447c184af3d520d43c37" + integrity sha512-K0xJRCmt+uSw7xesnHmcn72yBGTbY45vm8gXI4LZXbx2Z0jwh5aF9xrGQgrVPu0WbyFVFF3E/o9VhJYz6SQWnA== + dependencies: + prosemirror-state "^1.0.0" + prosemirror-transform "^1.0.0" + +prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/prosemirror-keymap/-/prosemirror-keymap-1.2.2.tgz#14a54763a29c7b2704f561088ccf3384d14eb77e" + integrity sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ== + dependencies: + prosemirror-state "^1.0.0" + w3c-keyname "^2.2.0" + +prosemirror-model@^1.0.0, prosemirror-model@^1.20.0, prosemirror-model@^1.21.0, prosemirror-model@^1.24.1, prosemirror-model@^1.25.0: + version "1.25.1" + resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.25.1.tgz#aeae9f1ec79fcaa76f6fc619800d91fbcf726870" + integrity sha512-AUvbm7qqmpZa5d9fPKMvH1Q5bqYQvAZWOGRvxsB6iFLyycvC9MwNemNVjHVrWgjaoxAfY8XVg7DbvQ/qxvI9Eg== + dependencies: + orderedmap "^2.0.0" + +prosemirror-safari-ime-span@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/prosemirror-safari-ime-span/-/prosemirror-safari-ime-span-1.0.2.tgz#20c9dcb33dfd68b2e59de8923b6506f9dc07c356" + integrity sha512-QJqD8s1zE/CuK56kDsUhndh5hiHh/gFnAuPOA9ytva2s85/ZEt2tNWeALTJN48DtWghSKOmiBsvVn2OlnJ5H2w== + dependencies: + prosemirror-state "^1.4.3" + prosemirror-view "^1.33.8" + +prosemirror-schema-list@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/prosemirror-schema-list/-/prosemirror-schema-list-1.5.1.tgz#5869c8f749e8745c394548bb11820b0feb1e32f5" + integrity sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q== + dependencies: + prosemirror-model "^1.0.0" + prosemirror-state "^1.0.0" + prosemirror-transform "^1.7.3" + +prosemirror-state@^1.0.0, prosemirror-state@^1.2.2, prosemirror-state@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/prosemirror-state/-/prosemirror-state-1.4.3.tgz#94aecf3ffd54ec37e87aa7179d13508da181a080" + integrity sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q== + dependencies: + prosemirror-model "^1.0.0" + prosemirror-transform "^1.0.0" + prosemirror-view "^1.27.0" + +prosemirror-tables@^1.7.0: + version "1.7.1" + resolved "https://registry.yarnpkg.com/prosemirror-tables/-/prosemirror-tables-1.7.1.tgz#df2507f285c6c7563097b4904cb7c4b9e0cd724b" + integrity sha512-eRQ97Bf+i9Eby99QbyAiyov43iOKgWa7QCGly+lrDt7efZ1v8NWolhXiB43hSDGIXT1UXgbs4KJN3a06FGpr1Q== + dependencies: + prosemirror-keymap "^1.2.2" + prosemirror-model "^1.25.0" + prosemirror-state "^1.4.3" + prosemirror-transform "^1.10.3" + prosemirror-view "^1.39.1" + +prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transform@^1.10.2, prosemirror-transform@^1.10.3, prosemirror-transform@^1.7.3: + version "1.10.4" + resolved "https://registry.yarnpkg.com/prosemirror-transform/-/prosemirror-transform-1.10.4.tgz#56419eac14f9f56612c806ae46f9238648f3f02e" + integrity sha512-pwDy22nAnGqNR1feOQKHxoFkkUtepoFAd3r2hbEDsnf4wp57kKA36hXsB3njA9FtONBEwSDnDeCiJe+ItD+ykw== + dependencies: + prosemirror-model "^1.21.0" + +prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.27.0, prosemirror-view@^1.31.0, prosemirror-view@^1.33.8, prosemirror-view@^1.37.1, prosemirror-view@^1.39.1: + version "1.39.2" + resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.39.2.tgz#178743c9694fec5ed498d48e46d4a31bc1ef0936" + integrity sha512-BmOkml0QWNob165gyUxXi5K5CVUgVPpqMEAAml/qzgKn9boLUWVPzQ6LtzXw8Cn1GtRQX4ELumPxqtLTDaAKtg== + dependencies: + prosemirror-model "^1.20.0" + prosemirror-state "^1.0.0" + prosemirror-transform "^1.1.0" + +prosemirror-virtual-cursor@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/prosemirror-virtual-cursor/-/prosemirror-virtual-cursor-0.4.2.tgz#b79825a05d9c9ac78b2dd690c2d9eb67450fb42d" + integrity sha512-pUMKnIuOhhnMcgIJUjhIQTVJruBEGxfMBVQSrK0g2qhGPDm1i12KdsVaFw15dYk+29tZcxjMeR7P5VDKwmbwJg== + protobufjs@^7.2.2, protobufjs@^7.2.5: version "7.5.0" resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.5.0.tgz#a317ad80713e9db43c8e55afa8636a9aa76bb630" @@ -11579,6 +12707,15 @@ remark-gfm@^4.0.0: remark-stringify "^11.0.0" unified "^11.0.0" +remark-inline-links@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/remark-inline-links/-/remark-inline-links-7.0.0.tgz#77fbff8061abc3d0ec34187ab71678a710df05e1" + integrity sha512-4uj1pPM+F495ySZhTIB6ay2oSkTsKgmYaKk/q5HIdhX2fuyLEegpjWa0VdJRJ01sgOqAFo7MBKdDUejIYBMVMQ== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-definitions "^6.0.0" + unist-util-visit "^5.0.0" + remark-math@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/remark-math/-/remark-math-6.0.0.tgz#0acdf74675f1c195fea6efffa78582f7ed7fc0d7" @@ -11823,6 +12960,11 @@ rimraf@^6.0.1: glob "^11.0.0" package-json-from-dist "^1.0.0" +rope-sequence@^1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/rope-sequence/-/rope-sequence-1.3.4.tgz#df85711aaecd32f1e756f76e43a415171235d425" + integrity sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ== + run-async@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-3.0.0.tgz#42a432f6d76c689522058984384df28be379daad" @@ -12246,7 +13388,7 @@ sonner@^1.7.0, sonner@^1.7.2, sonner@^1.7.3: resolved "https://registry.yarnpkg.com/sonner/-/sonner-1.7.4.tgz#4c39820db86623800a17115c8970796aa862133a" integrity sha512-DIS8z4PfJRbIyfVFDVnK9rO3eYDtse4Omcm6bt0oEr5/jtLgysmjuBl1frJ9E/EQZrFmKx2A8m/s5s9CRXIzhw== -source-map-js@^1.0.1, source-map-js@^1.0.2, source-map-js@^1.2.1: +source-map-js@^1.0.1, source-map-js@^1.0.2, source-map-js@^1.2.0, source-map-js@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== @@ -12512,6 +13654,11 @@ stripe-gradient@^1.0.1: resolved "https://registry.yarnpkg.com/stripe-gradient/-/stripe-gradient-1.0.1.tgz#27f90ac9c3a90cb3a2771bb43407951aca16bad2" integrity sha512-ttxSoPcJDXoYBPF7yG2TPC9ZZC1bc/ITxP8g0Yx5jo07dFT/wMcGn6CbjbHOtC0NBu8zZgJwJulCpK21WyRJEg== +style-mod@^4.0.0, style-mod@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/style-mod/-/style-mod-4.1.2.tgz#ca238a1ad4786520f7515a8539d5a63691d7bf67" + integrity sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw== + style-to-js@^1.0.0: version "1.1.16" resolved "https://registry.yarnpkg.com/style-to-js/-/style-to-js-1.1.16.tgz#e6bd6cd29e250bcf8fa5e6591d07ced7575dbe7a" @@ -13129,7 +14276,7 @@ unified@^10.0.0, unified@^10.1.2: trough "^2.0.0" vfile "^5.0.0" -unified@^11.0.0, unified@^11.0.4, unified@^11.0.5: +unified@^11.0.0, unified@^11.0.3, unified@^11.0.4, unified@^11.0.5: version "11.0.5" resolved "https://registry.yarnpkg.com/unified/-/unified-11.0.5.tgz#f66677610a5c0a9ee90cab2b8d4d66037026d9e1" integrity sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA== @@ -13521,6 +14668,22 @@ victory-vendor@^36.6.8: d3-time "^3.0.0" d3-timer "^3.0.1" +vue@^3.5.13: + version "3.5.13" + resolved "https://registry.yarnpkg.com/vue/-/vue-3.5.13.tgz#9f760a1a982b09c0c04a867903fc339c9f29ec0a" + integrity sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ== + dependencies: + "@vue/compiler-dom" "3.5.13" + "@vue/compiler-sfc" "3.5.13" + "@vue/runtime-dom" "3.5.13" + "@vue/server-renderer" "3.5.13" + "@vue/shared" "3.5.13" + +w3c-keyname@^2.2.0, w3c-keyname@^2.2.4: + version "2.2.8" + resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.8.tgz#7b17c8c6883d4e8b86ac8aba79d39e880f8869c5" + integrity sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ== + wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"