From 099c534daab0cf88d7d25ebbeeeba1b30348024d Mon Sep 17 00:00:00 2001 From: Amit Sharma <74371312+Amit91848@users.noreply.github.com> Date: Thu, 27 Mar 2025 02:36:21 +0530 Subject: [PATCH] feat: dub refer embed (#20258) * feat: dub refer embed * review fix * review fix * @dub/embed-core seems not needed * @dub/embed-core can stay in web * move refer page out of main-nav * update yarn lock * use loading.tsx --------- Co-authored-by: Peer Richelsen Co-authored-by: hbjORbj --- .env.example | 9 +- .../refer/DubReferralsPage.tsx | 71 +++ .../app/(use-page-wrapper)/refer/loading.tsx | 69 +++ .../web/app/(use-page-wrapper)/refer/page.tsx | 24 + .../web/app/api/user/referrals-token/route.ts | 38 ++ apps/web/package.json | 2 + apps/web/public/static/locales/en/common.json | 3 + packages/features/shell/useBottomNavItems.ts | 32 +- packages/lib/constants.ts | 4 + turbo.json | 1 + yarn.lock | 493 +++++++++++++++--- 11 files changed, 634 insertions(+), 112 deletions(-) create mode 100644 apps/web/app/(use-page-wrapper)/refer/DubReferralsPage.tsx create mode 100644 apps/web/app/(use-page-wrapper)/refer/loading.tsx create mode 100644 apps/web/app/(use-page-wrapper)/refer/page.tsx create mode 100644 apps/web/app/api/user/referrals-token/route.ts diff --git a/.env.example b/.env.example index 58d941934a..de49146b26 100644 --- a/.env.example +++ b/.env.example @@ -117,6 +117,11 @@ NEXT_PUBLIC_PLAIN_CHAT_ID= PLAIN_CHAT_HMAC_SECRET_KEY= NEXT_PUBLIC_PLAIN_CHAT_EXCLUDED_PATHS= + +# Dub Config +DUB_API_KEY= +NEXT_PUBLIC_DUB_PROGRAM_ID= + # Zendesk Config NEXT_PUBLIC_ZENDESK_KEY= @@ -429,6 +434,4 @@ NEXT_PUBLIC_QUERY_AVAILABLE_SLOTS_INTERVAL_SECONDS= # Used to invalidate available slots when navigating to booking form NEXT_PUBLIC_INVALIDATE_AVAILABLE_SLOTS_ON_BOOKING_FORM=0 # Used to enable quick availability checks for x% of all visitors -NEXT_PUBLIC_QUICK_AVAILABILITY_ROLLOUT=10 - - +NEXT_PUBLIC_QUICK_AVAILABILITY_ROLLOUT=10 \ No newline at end of file diff --git a/apps/web/app/(use-page-wrapper)/refer/DubReferralsPage.tsx b/apps/web/app/(use-page-wrapper)/refer/DubReferralsPage.tsx new file mode 100644 index 0000000000..97cab29524 --- /dev/null +++ b/apps/web/app/(use-page-wrapper)/refer/DubReferralsPage.tsx @@ -0,0 +1,71 @@ +"use client"; + +import { DubEmbed } from "@dub/embed-react"; +import { useTheme } from "next-themes"; +import { useState, useEffect } from "react"; + +import { IS_DUB_REFERRALS_ENABLED } from "@calcom/lib/constants"; +import { useLocale } from "@calcom/lib/hooks/useLocale"; +import { showToast } from "@calcom/ui/components/toast"; + +const fetchReferralsToken = async () => { + try { + const response = await fetch("/api/user/referrals-token"); + + if (!response.ok) { + const { error } = await response.json(); + showToast(error, "error"); + return null; + } + + const data = await response.json(); + + return data.publicToken; + } catch (error) { + console.error("Error fetching referrals token:", error); + return null; + } +}; + +// The enabled referrals page implementation +export const DubReferralsPage = () => { + const [token, setToken] = useState(null); + const [loading, setLoading] = useState(true); + const { t } = useLocale(); + const { resolvedTheme } = useTheme(); + + useEffect(() => { + const getToken = async () => { + try { + const publicToken = await fetchReferralsToken(); + setToken(publicToken); + } catch (err) { + console.error("Error fetching referrals token:", err); + showToast(t("unexpected_error_try_again"), "error"); + } finally { + setLoading(false); + } + }; + + getToken(); + }, []); + + if (!IS_DUB_REFERRALS_ENABLED || !token) { + return null; + } + + const theme = resolvedTheme === "dark" ? "dark" : "light"; + + return ( + + ); +}; diff --git a/apps/web/app/(use-page-wrapper)/refer/loading.tsx b/apps/web/app/(use-page-wrapper)/refer/loading.tsx new file mode 100644 index 0000000000..a05ce1f0d7 --- /dev/null +++ b/apps/web/app/(use-page-wrapper)/refer/loading.tsx @@ -0,0 +1,69 @@ +"use client"; + +import { + SkeletonAvatar, + SkeletonButton, + SkeletonContainer, + SkeletonText, +} from "@calcom/ui/components/skeleton"; + +export default function Loading() { + return ( + +
+
+ +
+ +
+ + +
+ +
+ +
+ + +
+
+
+ +
+
+
+ {[...Array(9)].map((_, i) => ( +
+ +
+ ))} +
+
+ + +
+
+ +
+
+ +
+
+ + +
+
+ +
+
+ +
+
+ + +
+
+
+
+ ); +} diff --git a/apps/web/app/(use-page-wrapper)/refer/page.tsx b/apps/web/app/(use-page-wrapper)/refer/page.tsx new file mode 100644 index 0000000000..25d7d7d313 --- /dev/null +++ b/apps/web/app/(use-page-wrapper)/refer/page.tsx @@ -0,0 +1,24 @@ +import { getTranslate } from "app/_utils"; + +import Shell from "@calcom/features/shell/Shell"; +import { IS_DUB_REFERRALS_ENABLED } from "@calcom/lib/constants"; + +import { DubReferralsPage } from "./DubReferralsPage"; + +// Export the appropriate component based on the feature flag +export default async function ReferralsPage() { + const t = await getTranslate(); + + return ( + + {IS_DUB_REFERRALS_ENABLED ? ( + + ) : ( +
+

{t("referral_program")}

+

{t("dub_disabled_error_message")}

+
+ )} +
+ ); +} diff --git a/apps/web/app/api/user/referrals-token/route.ts b/apps/web/app/api/user/referrals-token/route.ts new file mode 100644 index 0000000000..5fa49b61e9 --- /dev/null +++ b/apps/web/app/api/user/referrals-token/route.ts @@ -0,0 +1,38 @@ +import { defaultResponderForAppDir } from "app/api/defaultResponderForAppDir"; +import { headers, cookies } from "next/headers"; +import { NextResponse } from "next/server"; + +import { dub } from "@calcom/feature-auth/lib/dub"; +import { getServerSession } from "@calcom/feature-auth/lib/getServerSession"; +import { IS_DUB_REFERRALS_ENABLED } from "@calcom/lib/constants"; + +import { buildLegacyRequest } from "@lib/buildLegacyCtx"; + +export const dynamic = "force-dynamic"; + +const handler = async () => { + // Return early if the feature is disabled + if (!IS_DUB_REFERRALS_ENABLED) { + return NextResponse.json({ error: "Referrals feature is disabled" }, { status: 404 }); + } + + const session = await getServerSession({ req: buildLegacyRequest(await headers(), await cookies()) }); + if (!session) { + return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); + } + const { publicToken } = await dub.embedTokens.referrals({ + programId: process.env.NEXT_PUBLIC_DUB_PROGRAM_ID as string, + tenantId: session.user.id.toString(), + partner: { + name: session?.user.name || session?.user.email || "", + email: session?.user.email || session?.user.name || "", + username: session?.user.username || "", + image: session?.user.image || null, + tenantId: session?.user.id.toString() || "", + }, + }); + + return NextResponse.json({ publicToken }); +}; + +export const GET = defaultResponderForAppDir(handler); diff --git a/apps/web/package.json b/apps/web/package.json index c9873c95d8..b66b344f42 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -45,6 +45,8 @@ "@daily-co/daily-js": "^0.76.0", "@daily-co/daily-react": "^0.22.0", "@dub/analytics": "^0.0.15", + "@dub/embed-core": "^0.0.10", + "@dub/embed-react": "^0.0.10", "@formkit/auto-animate": "1.0.0-beta.5", "@glidejs/glide": "^3.5.2", "@googleapis/admin": "^23.0.0", diff --git a/apps/web/public/static/locales/en/common.json b/apps/web/public/static/locales/en/common.json index 281f1cb7a5..514edf42cf 100644 --- a/apps/web/public/static/locales/en/common.json +++ b/apps/web/public/static/locales/en/common.json @@ -3028,6 +3028,9 @@ "inactive_team_plan": "Inactive team plan", "inactive_team_plan_description": "Your team plan is inactive. Check your subcription or reach out to customer support", "limited_access_trial_mode": "Limited access during trial. Feature available after trial ends.", + "earn_20_percent_affiliate": "20% Referral", + "referral_program": "Referral Program", + "dub_disabled_error_message": "You need a Dub API Key and Program Id to use this page.", "uid": "UID", "link": "Link", "rows_per_page": "rows per page", diff --git a/packages/features/shell/useBottomNavItems.ts b/packages/features/shell/useBottomNavItems.ts index 56a690b416..838c13c8ed 100644 --- a/packages/features/shell/useBottomNavItems.ts +++ b/packages/features/shell/useBottomNavItems.ts @@ -1,8 +1,6 @@ import type { User as UserAuth } from "next-auth"; -import { useState } from "react"; -import { IS_CALCOM } from "@calcom/lib/constants"; -import { useCopy } from "@calcom/lib/hooks/useCopy"; +import { IS_DUB_REFERRALS_ENABLED } from "@calcom/lib/constants"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { showToast } from "@calcom/ui/components/toast"; @@ -20,8 +18,6 @@ export function useBottomNavItems({ user, }: BottomNavItemsProps): NavigationItemType[] { const { t } = useLocale(); - const [isReferalLoading, setIsReferalLoading] = useState(false); - const { fetchAndCopyToClipboard } = useCopy(); return [ { @@ -40,31 +36,11 @@ export function useBottomNavItems({ }, icon: "copy", }, - IS_CALCOM + IS_DUB_REFERRALS_ENABLED ? { - name: "copy_referral_link", - href: "", - onClick: (e: { preventDefault: () => void }) => { - e.preventDefault(); - setIsReferalLoading(true); - // Create an artificial delay to show the loading state so it doesn't flicker if this request is fast - setTimeout(() => { - fetchAndCopyToClipboard( - fetch("/api/generate-referral-link", { - method: "POST", - }) - .then((res) => res.json()) - .then((res) => res.shortLink), - { - onSuccess: () => showToast(t("link_copied"), "success"), - onFailure: () => showToast("Copy to clipboard failed", "error"), - } - ); - setIsReferalLoading(false); - }, 1000); - }, + name: "earn_20_percent_affiliate", + href: "/refer", icon: "gift", - isLoading: isReferalLoading, } : null, isAdmin diff --git a/packages/lib/constants.ts b/packages/lib/constants.ts index 0a8520a28a..06eccea1a4 100644 --- a/packages/lib/constants.ts +++ b/packages/lib/constants.ts @@ -210,4 +210,8 @@ export const DIRECTORY_IDS_TO_LOG = process.env.DIRECTORY_IDS_TO_LOG?.split(",") export const IS_PLAIN_CHAT_ENABLED = !!process.env.NEXT_PUBLIC_PLAIN_CHAT_ID && process.env.NEXT_PUBLIC_PLAIN_CHAT_ID !== ""; + +export const IS_DUB_REFERRALS_ENABLED = + !!process.env.NEXT_PUBLIC_DUB_PROGRAM_ID && process.env.NEXT_PUBLIC_DUB_PROGRAM_ID !== ""; + export const CAL_VIDEO_MEETING_LINK_FOR_TESTING = process.env.CAL_VIDEO_MEETING_LINK_FOR_TESTING; diff --git a/turbo.json b/turbo.json index 3d7a884969..355ab40846 100644 --- a/turbo.json +++ b/turbo.json @@ -278,6 +278,7 @@ "DATABASE_URL", "DEBUG", "DUB_API_KEY", + "NEXT_PUBLIC_DUB_PROGRAM_ID", "E2E_TEST_APPLE_CALENDAR_EMAIL", "E2E_TEST_APPLE_CALENDAR_PASSWORD", "E2E_TEST_CALCOM_QA_EMAIL", diff --git a/yarn.lock b/yarn.lock index 4d3e6e4183..3db63618bc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3765,6 +3765,8 @@ __metadata: "@daily-co/daily-js": ^0.76.0 "@daily-co/daily-react": ^0.22.0 "@dub/analytics": ^0.0.15 + "@dub/embed-core": ^0.0.10 + "@dub/embed-react": ^0.0.10 "@formkit/auto-animate": 1.0.0-beta.5 "@glidejs/glide": ^3.5.2 "@googleapis/admin": ^23.0.0 @@ -4354,6 +4356,28 @@ __metadata: languageName: node linkType: hard +"@dub/embed-core@npm:^0.0.10": + version: 0.0.10 + resolution: "@dub/embed-core@npm:0.0.10" + dependencies: + "@floating-ui/dom": ^1.6.12 + checksum: 6b423707ea296c7d7e958677c3983eeab8131e59d23bd18be3aa90c7016cb2708a94140122194d7b7074766121bde7e53216cf33532e515bb6834b9e889af87b + languageName: node + linkType: hard + +"@dub/embed-react@npm:^0.0.10": + version: 0.0.10 + resolution: "@dub/embed-react@npm:0.0.10" + dependencies: + class-variance-authority: ^0.7.0 + vite: 5.2.9 + peerDependencies: + react: ^18.2.0 + react-dom: ^18.2.0 + checksum: 13cce78ab4c11c5c056832b8e92a4f333cce25f094b9da60c2919a414b49c8fc67ea89458f10cb1cdcbd46053e34e6390b3494803d9214f592e6a88dd155cb66 + languageName: node + linkType: hard + "@emnapi/runtime@npm:^1.2.0": version: 1.3.1 resolution: "@emnapi/runtime@npm:1.3.1" @@ -4514,6 +4538,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/aix-ppc64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/aix-ppc64@npm:0.20.2" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + "@esbuild/aix-ppc64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/aix-ppc64@npm:0.21.5" @@ -4535,6 +4566,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-arm64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/android-arm64@npm:0.20.2" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/android-arm64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/android-arm64@npm:0.21.5" @@ -4556,6 +4594,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-arm@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/android-arm@npm:0.20.2" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + "@esbuild/android-arm@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/android-arm@npm:0.21.5" @@ -4577,6 +4622,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-x64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/android-x64@npm:0.20.2" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + "@esbuild/android-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/android-x64@npm:0.21.5" @@ -4598,6 +4650,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-arm64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/darwin-arm64@npm:0.20.2" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/darwin-arm64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/darwin-arm64@npm:0.21.5" @@ -4619,6 +4678,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-x64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/darwin-x64@npm:0.20.2" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "@esbuild/darwin-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/darwin-x64@npm:0.21.5" @@ -4640,6 +4706,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-arm64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/freebsd-arm64@npm:0.20.2" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/freebsd-arm64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/freebsd-arm64@npm:0.21.5" @@ -4661,6 +4734,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-x64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/freebsd-x64@npm:0.20.2" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/freebsd-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/freebsd-x64@npm:0.21.5" @@ -4682,6 +4762,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/linux-arm64@npm:0.20.2" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/linux-arm64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-arm64@npm:0.21.5" @@ -4703,6 +4790,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/linux-arm@npm:0.20.2" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + "@esbuild/linux-arm@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-arm@npm:0.21.5" @@ -4724,6 +4818,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ia32@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/linux-ia32@npm:0.20.2" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/linux-ia32@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-ia32@npm:0.21.5" @@ -4745,6 +4846,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-loong64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/linux-loong64@npm:0.20.2" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + "@esbuild/linux-loong64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-loong64@npm:0.21.5" @@ -4766,6 +4874,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-mips64el@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/linux-mips64el@npm:0.20.2" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + "@esbuild/linux-mips64el@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-mips64el@npm:0.21.5" @@ -4787,6 +4902,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ppc64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/linux-ppc64@npm:0.20.2" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + "@esbuild/linux-ppc64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-ppc64@npm:0.21.5" @@ -4808,6 +4930,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-riscv64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/linux-riscv64@npm:0.20.2" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + "@esbuild/linux-riscv64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-riscv64@npm:0.21.5" @@ -4829,6 +4958,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-s390x@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/linux-s390x@npm:0.20.2" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + "@esbuild/linux-s390x@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-s390x@npm:0.21.5" @@ -4850,6 +4986,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-x64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/linux-x64@npm:0.20.2" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + "@esbuild/linux-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-x64@npm:0.21.5" @@ -4871,6 +5014,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/netbsd-x64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/netbsd-x64@npm:0.20.2" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/netbsd-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/netbsd-x64@npm:0.21.5" @@ -4892,6 +5042,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/openbsd-x64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/openbsd-x64@npm:0.20.2" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/openbsd-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/openbsd-x64@npm:0.21.5" @@ -4913,6 +5070,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/sunos-x64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/sunos-x64@npm:0.20.2" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + "@esbuild/sunos-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/sunos-x64@npm:0.21.5" @@ -4934,6 +5098,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-arm64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/win32-arm64@npm:0.20.2" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/win32-arm64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/win32-arm64@npm:0.21.5" @@ -4955,6 +5126,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-ia32@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/win32-ia32@npm:0.20.2" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/win32-ia32@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/win32-ia32@npm:0.21.5" @@ -4976,6 +5154,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-x64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/win32-x64@npm:0.20.2" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@esbuild/win32-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/win32-x64@npm:0.21.5" @@ -5061,6 +5246,15 @@ __metadata: languageName: node linkType: hard +"@floating-ui/core@npm:^1.6.0": + version: 1.6.9 + resolution: "@floating-ui/core@npm:1.6.9" + dependencies: + "@floating-ui/utils": ^0.2.9 + checksum: 21cbcac72a40172399570dedf0eb96e4f24b0d829980160e8d14edf08c2955ac6feffb7b94e1530c78fb7944635e52669c9257ad08570e0295efead3b5a9af91 + languageName: node + linkType: hard + "@floating-ui/dom@npm:^1.0.1, @floating-ui/dom@npm:^1.2.1": version: 1.2.6 resolution: "@floating-ui/dom@npm:1.2.6" @@ -5079,6 +5273,16 @@ __metadata: languageName: node linkType: hard +"@floating-ui/dom@npm:^1.6.12": + version: 1.6.13 + resolution: "@floating-ui/dom@npm:1.6.13" + dependencies: + "@floating-ui/core": ^1.6.0 + "@floating-ui/utils": ^0.2.9 + checksum: eabab9d860d3b5beab1c2d6936287efc4d9ab352de99062380589ef62870d59e8730397489c34a96657e128498001b5672330c4a9da0159fe8b2401ac59fe314 + languageName: node + linkType: hard + "@floating-ui/react-dom@npm:^1.3.0": version: 1.3.0 resolution: "@floating-ui/react-dom@npm:1.3.0" @@ -5117,6 +5321,13 @@ __metadata: languageName: node linkType: hard +"@floating-ui/utils@npm:^0.2.9": + version: 0.2.9 + resolution: "@floating-ui/utils@npm:0.2.9" + checksum: d518b80cec5a323e54a069a1dd99a20f8221a4853ed98ac16c75275a0cc22f75de4f8ac5b121b4f8990bd45da7ad1fb015b9a1e4bac27bb1cd62444af84e9784 + languageName: node + linkType: hard + "@formatjs/ecma402-abstract@npm:1.11.4": version: 1.11.4 resolution: "@formatjs/ecma402-abstract@npm:1.11.4" @@ -11853,9 +12064,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.35.0": - version: 4.35.0 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.35.0" +"@rollup/rollup-android-arm-eabi@npm:4.36.0": + version: 4.36.0 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.36.0" conditions: os=android & cpu=arm languageName: node linkType: hard @@ -11874,9 +12085,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.35.0": - version: 4.35.0 - resolution: "@rollup/rollup-android-arm64@npm:4.35.0" +"@rollup/rollup-android-arm64@npm:4.36.0": + version: 4.36.0 + resolution: "@rollup/rollup-android-arm64@npm:4.36.0" conditions: os=android & cpu=arm64 languageName: node linkType: hard @@ -11895,9 +12106,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.35.0": - version: 4.35.0 - resolution: "@rollup/rollup-darwin-arm64@npm:4.35.0" +"@rollup/rollup-darwin-arm64@npm:4.36.0": + version: 4.36.0 + resolution: "@rollup/rollup-darwin-arm64@npm:4.36.0" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard @@ -11916,9 +12127,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.35.0": - version: 4.35.0 - resolution: "@rollup/rollup-darwin-x64@npm:4.35.0" +"@rollup/rollup-darwin-x64@npm:4.36.0": + version: 4.36.0 + resolution: "@rollup/rollup-darwin-x64@npm:4.36.0" conditions: os=darwin & cpu=x64 languageName: node linkType: hard @@ -11930,16 +12141,16 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-freebsd-arm64@npm:4.35.0": - version: 4.35.0 - resolution: "@rollup/rollup-freebsd-arm64@npm:4.35.0" +"@rollup/rollup-freebsd-arm64@npm:4.36.0": + version: 4.36.0 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.36.0" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-freebsd-x64@npm:4.35.0": - version: 4.35.0 - resolution: "@rollup/rollup-freebsd-x64@npm:4.35.0" +"@rollup/rollup-freebsd-x64@npm:4.36.0": + version: 4.36.0 + resolution: "@rollup/rollup-freebsd-x64@npm:4.36.0" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard @@ -11951,9 +12162,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.35.0": - version: 4.35.0 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.35.0" +"@rollup/rollup-linux-arm-gnueabihf@npm:4.36.0": + version: 4.36.0 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.36.0" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard @@ -11972,9 +12183,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-arm-musleabihf@npm:4.35.0": - version: 4.35.0 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.35.0" +"@rollup/rollup-linux-arm-musleabihf@npm:4.36.0": + version: 4.36.0 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.36.0" conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard @@ -11986,9 +12197,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.35.0": - version: 4.35.0 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.35.0" +"@rollup/rollup-linux-arm64-gnu@npm:4.36.0": + version: 4.36.0 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.36.0" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard @@ -12007,9 +12218,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.35.0": - version: 4.35.0 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.35.0" +"@rollup/rollup-linux-arm64-musl@npm:4.36.0": + version: 4.36.0 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.36.0" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard @@ -12021,9 +12232,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-loongarch64-gnu@npm:4.35.0": - version: 4.35.0 - resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.35.0" +"@rollup/rollup-linux-loongarch64-gnu@npm:4.36.0": + version: 4.36.0 + resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.36.0" conditions: os=linux & cpu=loong64 & libc=glibc languageName: node linkType: hard @@ -12035,9 +12246,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-powerpc64le-gnu@npm:4.35.0": - version: 4.35.0 - resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.35.0" +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.36.0": + version: 4.36.0 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.36.0" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard @@ -12049,9 +12260,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.35.0": - version: 4.35.0 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.35.0" +"@rollup/rollup-linux-riscv64-gnu@npm:4.36.0": + version: 4.36.0 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.36.0" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard @@ -12063,9 +12274,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-s390x-gnu@npm:4.35.0": - version: 4.35.0 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.35.0" +"@rollup/rollup-linux-s390x-gnu@npm:4.36.0": + version: 4.36.0 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.36.0" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard @@ -12077,9 +12288,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.35.0": - version: 4.35.0 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.35.0" +"@rollup/rollup-linux-x64-gnu@npm:4.36.0": + version: 4.36.0 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.36.0" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard @@ -12098,9 +12309,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.35.0": - version: 4.35.0 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.35.0" +"@rollup/rollup-linux-x64-musl@npm:4.36.0": + version: 4.36.0 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.36.0" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard @@ -12119,9 +12330,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.35.0": - version: 4.35.0 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.35.0" +"@rollup/rollup-win32-arm64-msvc@npm:4.36.0": + version: 4.36.0 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.36.0" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard @@ -12140,9 +12351,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.35.0": - version: 4.35.0 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.35.0" +"@rollup/rollup-win32-ia32-msvc@npm:4.36.0": + version: 4.36.0 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.36.0" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard @@ -12161,9 +12372,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.35.0": - version: 4.35.0 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.35.0" +"@rollup/rollup-win32-x64-msvc@npm:4.36.0": + version: 4.36.0 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.36.0" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -19380,7 +19591,7 @@ __metadata: languageName: node linkType: hard -"class-variance-authority@npm:^0.7.1": +"class-variance-authority@npm:^0.7.0, class-variance-authority@npm:^0.7.1": version: 0.7.1 resolution: "class-variance-authority@npm:0.7.1" dependencies: @@ -22367,6 +22578,86 @@ __metadata: languageName: node linkType: hard +"esbuild@npm:^0.20.1": + version: 0.20.2 + resolution: "esbuild@npm:0.20.2" + dependencies: + "@esbuild/aix-ppc64": 0.20.2 + "@esbuild/android-arm": 0.20.2 + "@esbuild/android-arm64": 0.20.2 + "@esbuild/android-x64": 0.20.2 + "@esbuild/darwin-arm64": 0.20.2 + "@esbuild/darwin-x64": 0.20.2 + "@esbuild/freebsd-arm64": 0.20.2 + "@esbuild/freebsd-x64": 0.20.2 + "@esbuild/linux-arm": 0.20.2 + "@esbuild/linux-arm64": 0.20.2 + "@esbuild/linux-ia32": 0.20.2 + "@esbuild/linux-loong64": 0.20.2 + "@esbuild/linux-mips64el": 0.20.2 + "@esbuild/linux-ppc64": 0.20.2 + "@esbuild/linux-riscv64": 0.20.2 + "@esbuild/linux-s390x": 0.20.2 + "@esbuild/linux-x64": 0.20.2 + "@esbuild/netbsd-x64": 0.20.2 + "@esbuild/openbsd-x64": 0.20.2 + "@esbuild/sunos-x64": 0.20.2 + "@esbuild/win32-arm64": 0.20.2 + "@esbuild/win32-ia32": 0.20.2 + "@esbuild/win32-x64": 0.20.2 + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: bc88050fc1ca5c1bd03648f9979e514bdefb956a63aa3974373bb7b9cbac0b3aac9b9da1b5bdca0b3490e39d6b451c72815dbd6b7d7f978c91fbe9c9e9aa4e4c + languageName: node + linkType: hard + "esbuild@npm:^0.21.3": version: 0.21.5 resolution: "esbuild@npm:0.21.5" @@ -35684,29 +35975,29 @@ __metadata: languageName: node linkType: hard -"rollup@npm:4.35.0": - version: 4.35.0 - resolution: "rollup@npm:4.35.0" +"rollup@npm:^4.13.0": + version: 4.36.0 + resolution: "rollup@npm:4.36.0" dependencies: - "@rollup/rollup-android-arm-eabi": 4.35.0 - "@rollup/rollup-android-arm64": 4.35.0 - "@rollup/rollup-darwin-arm64": 4.35.0 - "@rollup/rollup-darwin-x64": 4.35.0 - "@rollup/rollup-freebsd-arm64": 4.35.0 - "@rollup/rollup-freebsd-x64": 4.35.0 - "@rollup/rollup-linux-arm-gnueabihf": 4.35.0 - "@rollup/rollup-linux-arm-musleabihf": 4.35.0 - "@rollup/rollup-linux-arm64-gnu": 4.35.0 - "@rollup/rollup-linux-arm64-musl": 4.35.0 - "@rollup/rollup-linux-loongarch64-gnu": 4.35.0 - "@rollup/rollup-linux-powerpc64le-gnu": 4.35.0 - "@rollup/rollup-linux-riscv64-gnu": 4.35.0 - "@rollup/rollup-linux-s390x-gnu": 4.35.0 - "@rollup/rollup-linux-x64-gnu": 4.35.0 - "@rollup/rollup-linux-x64-musl": 4.35.0 - "@rollup/rollup-win32-arm64-msvc": 4.35.0 - "@rollup/rollup-win32-ia32-msvc": 4.35.0 - "@rollup/rollup-win32-x64-msvc": 4.35.0 + "@rollup/rollup-android-arm-eabi": 4.36.0 + "@rollup/rollup-android-arm64": 4.36.0 + "@rollup/rollup-darwin-arm64": 4.36.0 + "@rollup/rollup-darwin-x64": 4.36.0 + "@rollup/rollup-freebsd-arm64": 4.36.0 + "@rollup/rollup-freebsd-x64": 4.36.0 + "@rollup/rollup-linux-arm-gnueabihf": 4.36.0 + "@rollup/rollup-linux-arm-musleabihf": 4.36.0 + "@rollup/rollup-linux-arm64-gnu": 4.36.0 + "@rollup/rollup-linux-arm64-musl": 4.36.0 + "@rollup/rollup-linux-loongarch64-gnu": 4.36.0 + "@rollup/rollup-linux-powerpc64le-gnu": 4.36.0 + "@rollup/rollup-linux-riscv64-gnu": 4.36.0 + "@rollup/rollup-linux-s390x-gnu": 4.36.0 + "@rollup/rollup-linux-x64-gnu": 4.36.0 + "@rollup/rollup-linux-x64-musl": 4.36.0 + "@rollup/rollup-win32-arm64-msvc": 4.36.0 + "@rollup/rollup-win32-ia32-msvc": 4.36.0 + "@rollup/rollup-win32-x64-msvc": 4.36.0 "@types/estree": 1.0.6 fsevents: ~2.3.2 dependenciesMeta: @@ -35752,7 +36043,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 1139d35809d1aa4ac8bff49fd0c819bcce86ce6e8e259fd0cacac086998938b5ad44f523d4414b6565ebc0338e7d2de0ad3efa03e26738fe8bd05f1baf72e980 + checksum: 80a0c2b3641a1204ea90124c89a43f3de279ac2b9e0fc9eee225f04c7657652d255492eb18d987c19d4c819dd8595be766d02daacaf5f6c617e81cd0025258fe languageName: node linkType: hard @@ -40278,6 +40569,46 @@ __metadata: languageName: node linkType: hard +"vite@npm:5.2.9": + version: 5.2.9 + resolution: "vite@npm:5.2.9" + dependencies: + esbuild: ^0.20.1 + fsevents: ~2.3.3 + postcss: ^8.4.38 + rollup: ^4.13.0 + peerDependencies: + "@types/node": ^18.0.0 || >=20.0.0 + less: "*" + lightningcss: ^1.21.0 + sass: "*" + stylus: "*" + sugarss: "*" + terser: ^5.4.0 + dependenciesMeta: + fsevents: + optional: true + peerDependenciesMeta: + "@types/node": + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + bin: + vite: bin/vite.js + checksum: 7a97f9547af8550c55bc2529cc6827c1ef0a043a09e9686cf20b615e8d59305cbe917954e806c5fdad6c33bfb883c1ce51325a9c474b5aa5bc13c377a74805fd + languageName: node + linkType: hard + "vite@npm:^4.1.2": version: 4.5.2 resolution: "vite@npm:4.5.2"