diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index aad4de720e..4e413c601b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -43,4 +43,5 @@ jobs: GITHUB_TOKEN: ${{ secrets.GH_TOKEN || secrets.GITHUB_TOKEN }} # NPM_TOKEN: ${{ secrets.NPM_TOKEN }} # Uncomment if publishing to npm DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }} + HUSKY: 0 # Skip husky hooks in CI run: npx semantic-release diff --git a/apps/app/package.json b/apps/app/package.json index cc07a1bffc..4d28d56067 100644 --- a/apps/app/package.json +++ b/apps/app/package.json @@ -19,6 +19,7 @@ "@dnd-kit/modifiers": "^9.0.0", "@dnd-kit/sortable": "^10.0.0", "@dnd-kit/utilities": "^3.2.2", + "@dub/embed-react": "^0.0.14", "@hookform/resolvers": "^5.1.1", "@mendable/firecrawl-js": "^1.24.0", "@nangohq/frontend": "^0.53.2", @@ -38,6 +39,7 @@ "@tiptap/extension-table-row": "^2.22.3", "@trigger.dev/react-hooks": "3.3.17", "@trigger.dev/sdk": "3.3.17", + "@types/canvas-confetti": "^1.9.0", "@types/three": "^0.177.0", "@uploadthing/react": "^7.3.0", "@upstash/ratelimit": "^2.0.5", @@ -45,7 +47,9 @@ "ai": "^4.3.16", "axios": "^1.9.0", "better-auth": "^1.2.8", + "canvas-confetti": "^1.9.3", "d3": "^7.9.0", + "dub": "^0.63.5", "framer-motion": "^12.18.1", "geist": "^1.3.1", "motion": "^12.9.2", diff --git a/apps/app/src/app/(app)/[orgId]/layout.tsx b/apps/app/src/app/(app)/[orgId]/layout.tsx index 4b5fa9daf3..fdd8e2a6cc 100644 --- a/apps/app/src/app/(app)/[orgId]/layout.tsx +++ b/apps/app/src/app/(app)/[orgId]/layout.tsx @@ -1,5 +1,6 @@ import { getSubscriptionData } from '@/app/api/stripe/getSubscriptionData'; import { AnimatedLayout } from '@/components/animated-layout'; +import { CheckoutCompleteDialog } from '@/components/dialogs/checkout-complete-dialog'; import { Header } from '@/components/header'; import { AssistantSheet } from '@/components/sheets/assistant-sheet'; import { Sidebar } from '@/components/sidebar'; @@ -10,6 +11,7 @@ import { db } from '@comp/db'; import dynamic from 'next/dynamic'; import { cookies, headers } from 'next/headers'; import { redirect } from 'next/navigation'; +import { Suspense } from 'react'; import { OnboardingTracker } from './components/OnboardingTracker'; const HotKeys = dynamic(() => import('@/components/hot-keys').then((mod) => mod.HotKeys), { @@ -100,6 +102,9 @@ export default async function Layout({ {children} + + + diff --git a/apps/app/src/app/(app)/[orgId]/referrals/components/DubReferral.tsx b/apps/app/src/app/(app)/[orgId]/referrals/components/DubReferral.tsx new file mode 100644 index 0000000000..2187feefd5 --- /dev/null +++ b/apps/app/src/app/(app)/[orgId]/referrals/components/DubReferral.tsx @@ -0,0 +1,25 @@ +'use client'; + +import { DubEmbed } from '@dub/embed-react'; + +export const DubReferral = ({ publicToken }: { publicToken: string | null }) => { + if (!publicToken) { + return ( +
+

+ No token available. Please try refreshing the page. +

+
+ ); + } + + return ( + + ); +}; diff --git a/apps/app/src/app/(app)/[orgId]/referrals/lib/dub.ts b/apps/app/src/app/(app)/[orgId]/referrals/lib/dub.ts new file mode 100644 index 0000000000..ba7c44f4f7 --- /dev/null +++ b/apps/app/src/app/(app)/[orgId]/referrals/lib/dub.ts @@ -0,0 +1,6 @@ +import { env } from '@/env.mjs'; +import { Dub } from 'dub'; + +export const dub = new Dub({ + token: env.DUB_API_KEY, +}); diff --git a/apps/app/src/app/(app)/[orgId]/referrals/page.tsx b/apps/app/src/app/(app)/[orgId]/referrals/page.tsx new file mode 100644 index 0000000000..310874e7a3 --- /dev/null +++ b/apps/app/src/app/(app)/[orgId]/referrals/page.tsx @@ -0,0 +1,36 @@ +import { env } from '@/env.mjs'; +import { auth } from '@/utils/auth'; +import { headers } from 'next/headers'; +import { redirect } from 'next/navigation'; +import { DubReferral } from './components/DubReferral'; +import { dub } from './lib/dub'; + +export default async function ReferralsPage() { + const publicToken = await createPublicToken(); + + return ; +} + +async function createPublicToken() { + const session = await auth.api.getSession({ headers: await headers() }); + + if (!session) { + redirect('/'); + } + + if (!env.DUB_PROGRAM_ID || !env.DUB_API_KEY) { + return null; + } + + const { publicToken } = await dub.embedTokens.referrals({ + programId: env.DUB_PROGRAM_ID, + partner: { + tenantId: session.user.id, + name: session.user.name || '', + email: session.user.email || '', + image: session.user.image || '', + }, + }); + + return publicToken; +} diff --git a/apps/app/src/app/(app)/setup/components/AnimatedGradientBackgroundWrapper.tsx b/apps/app/src/app/(app)/setup/components/AnimatedGradientBackgroundWrapper.tsx index fe92333669..ec681815ee 100644 --- a/apps/app/src/app/(app)/setup/components/AnimatedGradientBackgroundWrapper.tsx +++ b/apps/app/src/app/(app)/setup/components/AnimatedGradientBackgroundWrapper.tsx @@ -7,21 +7,6 @@ export function AnimatedGradientBackgroundWrapper() { const [scale, setScale] = useState(0.7); useEffect(() => { - // Function to calculate scale from localStorage - const updateScale = () => { - if (typeof window !== 'undefined') { - const stepIndex = parseInt(localStorage.getItem('onboarding-step-index') || '0'); - const totalSteps = parseInt(localStorage.getItem('onboarding-total-steps') || '9'); - - // Calculate scale based on step progress (0.7 to 1.5) - const progressScale = 0.7 + (stepIndex / (totalSteps - 1)) * 0.8; - setScale(progressScale); - } - }; - - // Initial load - updateScale(); - // Listen for step changes const handleStepChange = (event: Event) => { const customEvent = event as CustomEvent; diff --git a/apps/app/src/app/(app)/setup/components/OrganizationSetupForm.tsx b/apps/app/src/app/(app)/setup/components/OrganizationSetupForm.tsx index 9c40a454e3..08bba2ebf1 100644 --- a/apps/app/src/app/(app)/setup/components/OrganizationSetupForm.tsx +++ b/apps/app/src/app/(app)/setup/components/OrganizationSetupForm.tsx @@ -62,12 +62,11 @@ export function OrganizationSetupForm({ const hasExistingOrgs = existingOrganizations.length > 0; - // Save step progress to localStorage + // Dispatch custom event for background animation when step changes useEffect(() => { if (typeof window !== 'undefined') { if (isFinalizing) { // Set to max scale when finalizing - localStorage.setItem('onboarding-progress', '1'); window.dispatchEvent( new CustomEvent('onboarding-step-change', { detail: { stepIndex: steps.length - 1, totalSteps: steps.length, progress: 1 }, @@ -75,10 +74,6 @@ export function OrganizationSetupForm({ ); } else { const progress = stepIndex / (steps.length - 1); - localStorage.setItem('onboarding-step-index', stepIndex.toString()); - localStorage.setItem('onboarding-total-steps', steps.length.toString()); - localStorage.setItem('onboarding-progress', progress.toString()); - // Dispatch custom event to notify the background wrapper window.dispatchEvent( new CustomEvent('onboarding-step-change', { diff --git a/apps/app/src/app/(app)/setup/hooks/useOnboardingForm.ts b/apps/app/src/app/(app)/setup/hooks/useOnboardingForm.ts index 1259d21c53..7189a54ff7 100644 --- a/apps/app/src/app/(app)/setup/hooks/useOnboardingForm.ts +++ b/apps/app/src/app/(app)/setup/hooks/useOnboardingForm.ts @@ -11,10 +11,9 @@ import { z } from 'zod'; import { createOrganization } from '../actions/create-organization'; import { createOrganizationMinimal } from '../actions/create-organization-minimal'; import type { OnboardingFormFields } from '../components/OnboardingStepInput'; -import { STORAGE_KEY, companyDetailsSchema, steps } from '../lib/constants'; +import { companyDetailsSchema, steps } from '../lib/constants'; import { updateSetupSession } from '../lib/setup-session'; import type { CompanyDetails } from '../lib/types'; -import { useLocalStorage } from './useLocalStorage'; interface UseOnboardingFormProps { setupId?: string; @@ -29,9 +28,8 @@ export function useOnboardingForm({ }: UseOnboardingFormProps = {}) { const router = useRouter(); - // If we have a setupId, use the initialData from KV, otherwise use localStorage - const [savedAnswers, setSavedAnswers] = useLocalStorage>( - STORAGE_KEY, + // Use state instead of localStorage - initialized from KV data if setupId exists + const [savedAnswers, setSavedAnswers] = useState>( setupId && initialData ? initialData : {}, ); @@ -108,6 +106,7 @@ export function useOnboardingForm({ // Organization created, now redirect to plans page router.push(`/upgrade/${data.organizationId}`); + // Clear answers after successful creation setSavedAnswers({}); } else { toast.error('Failed to create organization'); diff --git a/apps/app/src/app/(app)/upgrade/[orgId]/components/BookingDialog.tsx b/apps/app/src/app/(app)/upgrade/[orgId]/components/BookingDialog.tsx new file mode 100644 index 0000000000..d5d13963cc --- /dev/null +++ b/apps/app/src/app/(app)/upgrade/[orgId]/components/BookingDialog.tsx @@ -0,0 +1,42 @@ +'use client'; + +import CalendarEmbed from '@/components/calendar-embed'; +import { Button } from '@comp/ui/button'; +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, + DialogTrigger, +} from '@comp/ui/dialog'; +import { Phone } from 'lucide-react'; + +export function BookingDialog() { + return ( + + + + + +
+ + + Schedule a Call with Our Compliance Experts + + + Have questions about our plans? Want to learn how we can help you achieve compliance + in 14 days? Book a call with our team. + + +
+ +
+
+
+
+ ); +} diff --git a/apps/app/src/app/(app)/upgrade/[orgId]/pricing-cards.tsx b/apps/app/src/app/(app)/upgrade/[orgId]/pricing-cards.tsx index 7aed20e2b8..68e2840dc8 100644 --- a/apps/app/src/app/(app)/upgrade/[orgId]/pricing-cards.tsx +++ b/apps/app/src/app/(app)/upgrade/[orgId]/pricing-cards.tsx @@ -19,6 +19,7 @@ import { useAction } from 'next-safe-action/hooks'; import { useRouter } from 'next/navigation'; import { useState } from 'react'; import { toast } from 'sonner'; +import { BookingDialog } from './components/BookingDialog'; interface PricingCardsProps { organizationId: string; @@ -196,6 +197,7 @@ const paidFeatures = [ 'Dedicated Success Team', '24x7x365 Support & SLA', 'Slack Channel with Comp AI', + '12-month minimum term', ]; export function PricingCards({ organizationId, priceDetails }: PricingCardsProps) { @@ -218,7 +220,7 @@ export function PricingCards({ organizationId, priceDetails }: PricingCardsProps chooseSelfServeAction, { onSuccess: () => { - router.push(`/${organizationId}`); + router.push(`/${organizationId}?checkoutComplete=starter`); }, onError: ({ error }) => { toast.error(error.serverError || 'Failed to set up free plan'); @@ -250,7 +252,7 @@ export function PricingCards({ organizationId, priceDetails }: PricingCardsProps organizationId, mode: 'subscription', priceId, - successUrl: `${baseUrl}/${organizationId}/settings/billing?success=true`, + successUrl: `${baseUrl}/api/stripe/success?organizationId=${organizationId}&planType=done-for-you`, cancelUrl: `${baseUrl}/upgrade/${organizationId}`, allowPromotionCodes: true, metadata: { @@ -446,6 +448,16 @@ export function PricingCards({ organizationId, priceDetails }: PricingCardsProps + + {/* Help Section */} + + +

+ Have questions? We're here to help +

+ +
+
diff --git a/apps/app/src/app/api/stripe/success/route.ts b/apps/app/src/app/api/stripe/success/route.ts index 9294d3bc34..3e3dcfd8a0 100644 --- a/apps/app/src/app/api/stripe/success/route.ts +++ b/apps/app/src/app/api/stripe/success/route.ts @@ -7,9 +7,10 @@ import { syncStripeDataToKV } from '../syncStripeDataToKv'; export async function GET(req: Request) { const { user } = await getServersideSession(req); - // Extract organizationId from query parameters + // Extract organizationId and planType from query parameters const url = new URL(req.url); const organizationId = url.searchParams.get('organizationId'); + const planType = url.searchParams.get('planType') || 'done-for-you'; // Default to done-for-you for backwards compatibility if (!organizationId) { return redirect('/'); @@ -29,9 +30,10 @@ export async function GET(req: Request) { const stripeCustomerId = await client.get(`stripe:organization:${organizationId}`); if (!stripeCustomerId) { - return redirect('/'); + return redirect(`/${organizationId}`); } await syncStripeDataToKV(stripeCustomerId as string); - return redirect('/'); + // Redirect with the plan type from query parameters + return redirect(`/${organizationId}/frameworks?checkoutComplete=${planType}`); } diff --git a/apps/app/src/components/calendar-embed.tsx b/apps/app/src/components/calendar-embed.tsx index 98e98ee331..4337b2c596 100644 --- a/apps/app/src/components/calendar-embed.tsx +++ b/apps/app/src/components/calendar-embed.tsx @@ -12,11 +12,6 @@ export default function CalendarEmbed() { }, []); return ( - + ); } diff --git a/apps/app/src/components/dialogs/checkout-complete-dialog.tsx b/apps/app/src/components/dialogs/checkout-complete-dialog.tsx new file mode 100644 index 0000000000..56f1ad6010 --- /dev/null +++ b/apps/app/src/components/dialogs/checkout-complete-dialog.tsx @@ -0,0 +1,267 @@ +'use client'; + +import { Badge } from '@comp/ui/badge'; +import { Button } from '@comp/ui/button'; +import { Card } from '@comp/ui/card'; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from '@comp/ui/dialog'; +import confetti from 'canvas-confetti'; +import { + Brain, + CheckCircle2, + FileText, + Headphones, + LucideIcon, + MessageSquare, + Rocket, + Shield, + Sparkles, + Users, + Zap, +} from 'lucide-react'; +import { useQueryState } from 'nuqs'; +import { useEffect, useState } from 'react'; + +type PlanType = 'starter' | 'done-for-you'; + +interface Feature { + icon: LucideIcon; + title: string; + description: string; +} + +interface PlanContent { + title: string; + description: string; + badge: string; + badgeDescription: string; + badgeClass: string; + cardClass: string; + iconClass: string; + iconColor: string; + features: Feature[]; + buttonText: string; + footerText: string; +} + +export function CheckoutCompleteDialog() { + const [checkoutComplete, setCheckoutComplete] = useQueryState('checkoutComplete', { + defaultValue: '', + clearOnDefault: true, + }); + const [open, setOpen] = useState(false); + const [planType, setPlanType] = useState(null); + + useEffect(() => { + if (checkoutComplete === 'starter' || checkoutComplete === 'done-for-you') { + const detectedPlanType = checkoutComplete as PlanType; + + // Store the plan type before clearing the query param + setPlanType(detectedPlanType); + + // Show the dialog + setOpen(true); + + // Trigger confetti animation + const duration = 3 * 1000; + const animationEnd = Date.now() + duration; + const defaults = { startVelocity: 30, spread: 360, ticks: 60, zIndex: 0 }; + + function randomInRange(min: number, max: number) { + return Math.random() * (max - min) + min; + } + + const interval: any = setInterval(function () { + const timeLeft = animationEnd - Date.now(); + + if (timeLeft <= 0) { + return clearInterval(interval); + } + + const particleCount = 50 * (timeLeft / duration); + // Use different colors based on plan type + const colors = + detectedPlanType === 'done-for-you' + ? ['#10b981', '#34d399', '#6ee7b7', '#a7f3d0', '#d1fae5'] // Green for paid + : ['#3b82f6', '#60a5fa', '#93bbfc', '#bfdbfe', '#dbeafe']; // Blue for starter + + confetti({ + ...defaults, + particleCount, + origin: { x: randomInRange(0.1, 0.3), y: Math.random() - 0.2 }, + colors, + }); + confetti({ + ...defaults, + particleCount, + origin: { x: randomInRange(0.7, 0.9), y: Math.random() - 0.2 }, + colors, + }); + }, 250); + + // Clear the query parameter immediately so it doesn't linger in the URL + setCheckoutComplete(''); + } + }, [checkoutComplete, setCheckoutComplete]); + + const handleClose = () => { + setOpen(false); + }; + + // Different content based on plan type + const content: Record = { + 'done-for-you': { + title: 'Welcome to Done For You!', + description: 'Your subscription is active and your compliance journey begins now.', + badge: '14 Day Money Back Guarantee', + badgeDescription: "If you're not completely satisfied, we'll refund you in full", + badgeClass: 'bg-green-100 text-green-700 dark:bg-green-900 dark:text-green-300', + cardClass: 'bg-green-50/50 dark:bg-green-950/20 border-green-200 dark:border-green-900/50', + iconClass: 'bg-green-100 dark:bg-green-900/30', + iconColor: 'text-green-600 dark:text-green-400', + features: [ + { + icon: Shield, + title: 'SOC 2 or ISO 27001 Done For You', + description: 'Complete compliance in 14 days or less', + }, + { + icon: Users, + title: 'Dedicated Success Team', + description: 'Your compliance experts are ready to help', + }, + { + icon: Sparkles, + title: '3rd Party Audit Included', + description: 'No hidden fees or surprise costs', + }, + { + icon: Headphones, + title: '24x7x365 Support & SLA', + description: 'Priority support with guaranteed response times', + }, + ], + buttonText: 'Get Started', + footerText: 'Your success team will reach out within 24 hours', + }, + starter: { + title: 'Welcome to Starter!', + description: + "Everything you need to get compliant, fast. Let's begin your DIY compliance journey!", + badge: 'DIY (Do It Yourself) Compliance', + badgeDescription: 'Build your compliance program at your own pace', + badgeClass: 'bg-blue-100 text-blue-700 dark:bg-blue-900 dark:text-blue-300', + cardClass: 'bg-blue-50/50 dark:bg-blue-950/20 border-blue-200 dark:border-blue-900/50', + iconClass: 'bg-blue-100 dark:bg-blue-900/30', + iconColor: 'text-blue-600 dark:text-blue-400', + features: [ + { + icon: Rocket, + title: 'Access to all frameworks', + description: 'SOC 2, ISO 27001, HIPAA, GDPR, and more', + }, + { + icon: Brain, + title: 'AI Vendor & Risk Management', + description: 'Streamline your vendor assessments and risk tracking', + }, + { + icon: FileText, + title: 'Trust & Security Portal', + description: 'Share your compliance status with customers', + }, + { + icon: Zap, + title: 'Unlimited team members', + description: 'Collaborate with your entire team at no extra cost', + }, + ], + buttonText: 'Start Building', + footerText: 'Upgrade to Done For You anytime for expert assistance', + }, + }; + + // Only render content if we have a valid plan type stored + if (!planType) { + return null; + } + + const currentContent = content[planType]; + + return ( + + + +
+ +
+ + {currentContent.title} + + + {currentContent.description} + +
+ +
+ +
+ {currentContent.badge} +

+ {currentContent.badgeDescription} +

+
+
+ +
+

+ {planType === 'starter' ? 'What you get:' : "What's included:"} +

+
+ {currentContent.features.map((feature: Feature) => { + const Icon = feature.icon; + return ( +
+
+
+ +
+
+
+

{feature.title}

+

{feature.description}

+
+
+ ); + })} +
+
+ + {planType === 'starter' && ( +
+

+ + Join our community for support • Pay for your audit when ready +

+
+ )} +
+ + + +

{currentContent.footerText}

+
+
+
+ ); +} diff --git a/apps/app/src/components/main-menu.tsx b/apps/app/src/components/main-menu.tsx index 784f0a7941..2da92edd69 100644 --- a/apps/app/src/components/main-menu.tsx +++ b/apps/app/src/components/main-menu.tsx @@ -126,6 +126,14 @@ export function MainMenu({ organizationId, isCollapsed = false, onItemClick }: P variant: 'secondary', }, }, + // { + // id: 'referrals', + // path: '/:organizationId/referrals', + // name: 'Referrals', + // disabled: false, + // icon: Gift, + // protected: false, + // }, { id: 'settings', path: '/:organizationId/settings', diff --git a/apps/app/src/env.mjs b/apps/app/src/env.mjs index cbd8ab54e3..dafc2f360a 100644 --- a/apps/app/src/env.mjs +++ b/apps/app/src/env.mjs @@ -36,6 +36,8 @@ export const env = createEnv({ ZAPIER_HUBSPOT_WEBHOOK_URL: z.string().optional(), FLEET_URL: z.string().optional(), FLEET_TOKEN: z.string().optional(), + DUB_API_KEY: z.string().optional(), + DUB_PROGRAM_ID: z.string().optional(), }, client: { @@ -87,6 +89,8 @@ export const env = createEnv({ process.env.NEXT_PUBLIC_STRIPE_SUBSCRIPTION_MANAGED_MONTHLY_PRICE_ID, NEXT_PUBLIC_STRIPE_SUBSCRIPTION_MANAGED_YEARLY_PRICE_ID: process.env.NEXT_PUBLIC_STRIPE_SUBSCRIPTION_MANAGED_YEARLY_PRICE_ID, + DUB_API_KEY: process.env.DUB_API_KEY, + DUB_PROGRAM_ID: process.env.DUB_PROGRAM_ID, }, skipValidation: !!process.env.CI || !!process.env.SKIP_ENV_VALIDATION, diff --git a/bun.lock b/bun.lock index ad3464a40e..f7badfba01 100644 --- a/bun.lock +++ b/bun.lock @@ -76,6 +76,7 @@ "@dnd-kit/modifiers": "^9.0.0", "@dnd-kit/sortable": "^10.0.0", "@dnd-kit/utilities": "^3.2.2", + "@dub/embed-react": "^0.0.14", "@hookform/resolvers": "^5.1.1", "@mendable/firecrawl-js": "^1.24.0", "@nangohq/frontend": "^0.53.2", @@ -95,6 +96,7 @@ "@tiptap/extension-table-row": "^2.22.3", "@trigger.dev/react-hooks": "3.3.17", "@trigger.dev/sdk": "3.3.17", + "@types/canvas-confetti": "^1.9.0", "@types/three": "^0.177.0", "@uploadthing/react": "^7.3.0", "@upstash/ratelimit": "^2.0.5", @@ -102,7 +104,9 @@ "ai": "^4.3.16", "axios": "^1.9.0", "better-auth": "^1.2.8", + "canvas-confetti": "^1.9.3", "d3": "^7.9.0", + "dub": "^0.63.5", "framer-motion": "^12.18.1", "geist": "^1.3.1", "motion": "^12.9.2", @@ -673,6 +677,10 @@ "@dnd-kit/utilities": ["@dnd-kit/utilities@3.2.2", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg=="], + "@dub/embed-core": ["@dub/embed-core@0.0.14", "", { "dependencies": { "@floating-ui/dom": "^1.6.12" } }, "sha512-2oD8NOlpysa4XgF70+gvJbHyysm+QboujTmD93tvQ2Dt+br7lUV+3cx51+Ho0WTZ06+DnFYQJ5fG/dtXSmyHrg=="], + + "@dub/embed-react": ["@dub/embed-react@0.0.14", "", { "dependencies": { "@dub/embed-core": "^0.0.14", "class-variance-authority": "^0.7.0", "vite": "5.2.9" }, "peerDependencies": { "react": "^18.2.0", "react-dom": "^18.2.0" } }, "sha512-qJg08k8GE5ElduCpWxKHlpPsDQYfWu4n+n1p+bChdTNxX2BvFnyqQl3LTxBYKqJ7RwXxSSW7GARpFgajvXVJCA=="], + "@effect/platform": ["@effect/platform@0.81.0", "", { "dependencies": { "find-my-way-ts": "^0.1.5", "msgpackr": "^1.11.2", "multipasta": "^0.2.5" }, "peerDependencies": { "effect": "^3.14.21" } }, "sha512-RZ0pqpSUET0Ab3CBjOhJ12C2/vWLQsy+SLJbGNxjcOm9xZAwQowggWCs4S3ZXhdnNTR5WJHH02WlAWHJDaMKhA=="], "@electric-sql/client": ["@electric-sql/client@1.0.0-beta.1", "", { "optionalDependencies": { "@rollup/rollup-darwin-arm64": "^4.18.1" } }, "sha512-Ei9jN3pDoGzc+a/bGqnB5ajb52IvSv7/n2btuyzUlcOHIR2kM9fqtYTJXPwZYKLkGZlHWlpHgWyRtrinkP2nHg=="], @@ -1607,6 +1615,8 @@ "@types/bun": ["@types/bun@1.2.16", "", { "dependencies": { "bun-types": "1.2.16" } }, "sha512-1aCZJ/6nSiViw339RsaNhkNoEloLaPzZhxMOYEa7OzRzO41IGg5n/7I43/ZIAW/c+Q6cT12Vf7fOZOoVIzb5BQ=="], + "@types/canvas-confetti": ["@types/canvas-confetti@1.9.0", "", {}, "sha512-aBGj/dULrimR1XDZLtG9JwxX1b4HPRF6CX9Yfwh3NvstZEm1ZL7RBnel4keCPSqs1ANRu1u2Aoz9R+VmtjYuTg=="], + "@types/connect": ["@types/connect@3.4.38", "", { "dependencies": { "@types/node": "*" } }, "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug=="], "@types/conventional-commits-parser": ["@types/conventional-commits-parser@5.0.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ=="], @@ -2057,6 +2067,8 @@ "caniuse-lite": ["caniuse-lite@1.0.30001723", "", {}, "sha512-1R/elMjtehrFejxwmexeXAtae5UO9iSyFn6G/I806CYC/BLyyBk1EPhrKBkWhy6wM6Xnm47dSJQec+tLJ39WHw=="], + "canvas-confetti": ["canvas-confetti@1.9.3", "", {}, "sha512-rFfTURMvmVEX1gyXFgn5QMn81bYk70qa0HLzcIOSVEyl57n6o9ItHeBtUSWdvKAPY0xlvBHno4/v3QPrT83q9g=="], + "caseless": ["caseless@0.12.0", "", {}, "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="], "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], @@ -2361,6 +2373,8 @@ "draco3d": ["draco3d@1.5.7", "", {}, "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ=="], + "dub": ["dub@0.63.5", "", { "peerDependencies": { "@modelcontextprotocol/sdk": ">=1.5.0 <1.10.0", "zod": ">= 3" }, "optionalPeers": ["@modelcontextprotocol/sdk"], "bin": { "mcp": "bin/mcp-server.js" } }, "sha512-p9ygOnYpZ89jV/rXJrG4yTa9E0VE8itwV/EmnydO27hFhRa9Hj3m6Ue0PLEIykYEGaROPjGIYKjXPOysShEhKQ=="], + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], "duplexer2": ["duplexer2@0.1.4", "", { "dependencies": { "readable-stream": "^2.0.2" } }, "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA=="], @@ -4171,6 +4185,8 @@ "victory-vendor": ["victory-vendor@36.9.2", "", { "dependencies": { "@types/d3-array": "^3.0.3", "@types/d3-ease": "^3.0.0", "@types/d3-interpolate": "^3.0.1", "@types/d3-scale": "^4.0.2", "@types/d3-shape": "^3.1.0", "@types/d3-time": "^3.0.0", "@types/d3-timer": "^3.0.0", "d3-array": "^3.1.6", "d3-ease": "^3.0.1", "d3-interpolate": "^3.0.1", "d3-scale": "^4.0.2", "d3-shape": "^3.1.0", "d3-time": "^3.0.0", "d3-timer": "^3.0.1" } }, "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ=="], + "vite": ["vite@5.2.9", "", { "dependencies": { "esbuild": "^0.20.1", "postcss": "^8.4.38", "rollup": "^4.13.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" }, "optionalPeers": ["@types/node", "less", "lightningcss", "sass", "stylus", "sugarss", "terser"], "bin": { "vite": "bin/vite.js" } }, "sha512-uOQWfuZBlc6Y3W/DTuQ1Sr+oIXWvqljLvS881SVmAj00d5RdgShLcuXWxseWPd4HXwiYBFW/vXHfKFeqj9uQnw=="], + "w3c-keyname": ["w3c-keyname@2.2.8", "", {}, "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ=="], "web-streams-polyfill": ["web-streams-polyfill@4.0.0-beta.3", "", {}, "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug=="], @@ -5079,6 +5095,8 @@ "verror/core-util-is": ["core-util-is@1.0.2", "", {}, "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="], + "vite/esbuild": ["esbuild@0.20.2", "", { "optionalDependencies": { "@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" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g=="], + "which-builtin-type/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], "wrap-ansi/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], @@ -5487,6 +5505,52 @@ "type-is/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + "vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.20.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g=="], + + "vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.20.2", "", { "os": "android", "cpu": "arm" }, "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w=="], + + "vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.20.2", "", { "os": "android", "cpu": "arm64" }, "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg=="], + + "vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.20.2", "", { "os": "android", "cpu": "x64" }, "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg=="], + + "vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.20.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA=="], + + "vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.20.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA=="], + + "vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.20.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw=="], + + "vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.20.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw=="], + + "vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.20.2", "", { "os": "linux", "cpu": "arm" }, "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg=="], + + "vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.20.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A=="], + + "vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.20.2", "", { "os": "linux", "cpu": "ia32" }, "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig=="], + + "vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.20.2", "", { "os": "linux", "cpu": "none" }, "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ=="], + + "vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.20.2", "", { "os": "linux", "cpu": "none" }, "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA=="], + + "vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.20.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg=="], + + "vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.20.2", "", { "os": "linux", "cpu": "none" }, "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg=="], + + "vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.20.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ=="], + + "vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.20.2", "", { "os": "linux", "cpu": "x64" }, "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw=="], + + "vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.20.2", "", { "os": "none", "cpu": "x64" }, "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ=="], + + "vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.20.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ=="], + + "vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.20.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w=="], + + "vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.20.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ=="], + + "vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.20.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ=="], + + "vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.20.2", "", { "os": "win32", "cpu": "x64" }, "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ=="], + "wrap-ansi-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], "wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], diff --git a/turbo.json b/turbo.json index ae6d138d76..16f3c13064 100644 --- a/turbo.json +++ b/turbo.json @@ -46,7 +46,9 @@ "FLEET_DEVICE_PATH_MAC", "FLEET_AGENT_BUCKET_NAME", "FLEET_DEVICE_PATH_WINDOWS", - "LOGO_DEV" + "LOGO_DEV", + "DUB_API_KEY", + "DUB_PROGRAM_ID" ], "inputs": ["$TURBO_DEFAULT$", ".env"], "dependsOn": ["^build", "^db:generate", "^auth:build"], diff --git a/yarn.lock b/yarn.lock index cf81eaff99..35d825863b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1191,14 +1191,14 @@ "@types/conventional-commits-parser" "^5.0.0" chalk "^5.3.0" -"@comp/analytics@packages/analytics": +"@comp/analytics@^workspace:packages/analytics": version "workspace:packages/analytics" resolved "workspace:packages/analytics" dependencies: posthog-js "^1.236.6" posthog-node "^4.14.0" -"@comp/app@apps/app", "@comp/app@workspace:*": +"@comp/app@^workspace:apps/app", "@comp/app@workspace:*": version "workspace:apps/app" resolved "workspace:apps/app" devDependencies: @@ -1226,12 +1226,15 @@ "@browserbasehq/sdk" "^2.5.0" "@calcom/atoms" "^1.0.102-framer" "@calcom/embed-react" "^1.5.3" + dependencies: "@comp/db" "workspace:*" + dependencies: "@date-fns/tz" "^1.2.0" "@dnd-kit/core" "^6.3.1" "@dnd-kit/modifiers" "^9.0.0" "@dnd-kit/sortable" "^10.0.0" "@dnd-kit/utilities" "^3.2.2" + "@dub/embed-react" "^0.0.14" "@hookform/resolvers" "^5.1.1" "@mendable/firecrawl-js" "^1.24.0" "@nangohq/frontend" "^0.53.2" @@ -1251,6 +1254,7 @@ "@tiptap/extension-table-row" "^2.22.3" "@trigger.dev/react-hooks" "3.3.17" "@trigger.dev/sdk" "3.3.17" + "@types/canvas-confetti" "^1.9.0" "@types/three" "^0.177.0" "@uploadthing/react" "^7.3.0" "@upstash/ratelimit" "^2.0.5" @@ -1258,7 +1262,9 @@ ai "^4.3.16" axios "^1.9.0" better-auth "^1.2.8" + canvas-confetti "^1.9.3" d3 "^7.9.0" + dub "^0.63.5" framer-motion "^12.18.1" geist "^1.3.1" motion "^12.9.2" @@ -1290,18 +1296,19 @@ xml2js "^0.6.2" zustand "^5.0.3" -"@comp/db@packages/db", "@comp/db@workspace:*": +"@comp/db@^workspace:packages/db", "@comp/db@workspace:*": version "workspace:packages/db" resolved "workspace:packages/db" devDependencies: "@comp/tsconfig" "workspace:*" + devDependencies: prisma "^6.9.0" ts-node "^10.9.2" typescript "^5.8.3" dependencies: "@prisma/client" "6.9.0" -"@comp/email@packages/email": +"@comp/email@^workspace:packages/email": version "workspace:packages/email" resolved "workspace:packages/email" devDependencies: @@ -1312,6 +1319,7 @@ dependencies: "@comp/ui" "workspace:*" "@comp/utils" "workspace:*" + dependencies: "@react-email/components" "^0.0.41" "@react-email/render" "^1.1.2" "@react-email/tailwind" "1.0.5" @@ -1320,7 +1328,7 @@ react-email "^4.0.15" responsive-react-email "^0.0.5" -"@comp/framework-editor@apps/framework-editor": +"@comp/framework-editor@^workspace:apps/framework-editor": version "workspace:apps/framework-editor" resolved "workspace:apps/framework-editor" devDependencies: @@ -1350,7 +1358,7 @@ tippy.js "^6.3.7" zod "3.25.67" -"@comp/integrations@packages/integrations": +"@comp/integrations@^workspace:packages/integrations": version "workspace:packages/integrations" resolved "workspace:packages/integrations" devDependencies: @@ -1373,14 +1381,14 @@ stoppable "^1.1.0" zod "3.25.67" -"@comp/kv@packages/kv": +"@comp/kv@^workspace:packages/kv": version "workspace:packages/kv" resolved "workspace:packages/kv" dependencies: "@upstash/redis" "^1.34.2" server-only "0.0.1" -"@comp/portal@apps/portal": +"@comp/portal@^workspace:apps/portal": version "workspace:apps/portal" resolved "workspace:apps/portal" devDependencies: @@ -1411,7 +1419,7 @@ next "15.4.0-canary.85" react-email "^4.0.15" -"@comp/trust@apps/trust": +"@comp/trust@^workspace:apps/trust": version "workspace:apps/trust" resolved "workspace:apps/trust" devDependencies: @@ -1432,11 +1440,11 @@ lucide-react "^0.518.0" next "15.4.0-canary.85" -"@comp/tsconfig@packages/tsconfig", "@comp/tsconfig@workspace:*": +"@comp/tsconfig@^workspace:packages/tsconfig", "@comp/tsconfig@workspace:*": version "workspace:packages/tsconfig" resolved "workspace:packages/tsconfig" -"@comp/ui@packages/ui", "@comp/ui@workspace:*": +"@comp/ui@^workspace:packages/ui", "@comp/ui@workspace:*": version "workspace:packages/ui" resolved "workspace:packages/ui" devDependencies: @@ -1519,7 +1527,7 @@ use-debounce "^10.0.4" vaul "^0.9.6" -"@comp/utils@packages/utils", "@comp/utils@workspace:*": +"@comp/utils@^workspace:packages/utils", "@comp/utils@workspace:*": version "workspace:packages/utils" resolved "workspace:packages/utils" devDependencies: @@ -1646,6 +1654,22 @@ dependencies: tslib "^2.0.0" +"@dub/embed-core@^0.0.14": + version "0.0.14" + resolved "https://registry.npmjs.org/@dub/embed-core/-/embed-core-0.0.14.tgz" + integrity sha512-2oD8NOlpysa4XgF70+gvJbHyysm+QboujTmD93tvQ2Dt+br7lUV+3cx51+Ho0WTZ06+DnFYQJ5fG/dtXSmyHrg== + dependencies: + "@floating-ui/dom" "^1.6.12" + +"@dub/embed-react@^0.0.14": + version "0.0.14" + resolved "https://registry.npmjs.org/@dub/embed-react/-/embed-react-0.0.14.tgz" + integrity sha512-qJg08k8GE5ElduCpWxKHlpPsDQYfWu4n+n1p+bChdTNxX2BvFnyqQl3LTxBYKqJ7RwXxSSW7GARpFgajvXVJCA== + dependencies: + "@dub/embed-core" "^0.0.14" + class-variance-authority "^0.7.0" + vite "5.2.9" + "@effect/platform@0.81.0": version "0.81.0" resolved "https://registry.npmjs.org/@effect/platform/-/platform-0.81.0.tgz" @@ -1772,86 +1796,171 @@ resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz" integrity sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg== +"@esbuild/aix-ppc64@0.20.2": + version "0.20.2" + resolved "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz" + integrity sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g== + "@esbuild/aix-ppc64@0.25.5": version "0.25.5" resolved "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz" integrity sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA== +"@esbuild/android-arm@0.20.2": + version "0.20.2" + resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz" + integrity sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w== + "@esbuild/android-arm@0.25.5": version "0.25.5" resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz" integrity sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA== +"@esbuild/android-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz" + integrity sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg== + "@esbuild/android-arm64@0.25.5": version "0.25.5" resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz" integrity sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg== +"@esbuild/android-x64@0.20.2": + version "0.20.2" + resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz" + integrity sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg== + "@esbuild/android-x64@0.25.5": version "0.25.5" resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz" integrity sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw== +"@esbuild/darwin-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz" + integrity sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA== + "@esbuild/darwin-arm64@0.25.5": version "0.25.5" resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz" integrity sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ== +"@esbuild/darwin-x64@0.20.2": + version "0.20.2" + resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz" + integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA== + "@esbuild/darwin-x64@0.25.5": version "0.25.5" resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz" integrity sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ== +"@esbuild/freebsd-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz" + integrity sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw== + "@esbuild/freebsd-arm64@0.25.5": version "0.25.5" resolved "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz" integrity sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw== +"@esbuild/freebsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz" + integrity sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw== + "@esbuild/freebsd-x64@0.25.5": version "0.25.5" resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz" integrity sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw== +"@esbuild/linux-arm@0.20.2": + version "0.20.2" + resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz" + integrity sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg== + "@esbuild/linux-arm@0.25.5": version "0.25.5" resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz" integrity sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw== +"@esbuild/linux-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz" + integrity sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A== + "@esbuild/linux-arm64@0.25.5": version "0.25.5" resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz" integrity sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg== +"@esbuild/linux-ia32@0.20.2": + version "0.20.2" + resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz" + integrity sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig== + "@esbuild/linux-ia32@0.25.5": version "0.25.5" resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz" integrity sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA== +"@esbuild/linux-loong64@0.20.2": + version "0.20.2" + resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz" + integrity sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ== + "@esbuild/linux-loong64@0.25.5": version "0.25.5" resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz" integrity sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg== +"@esbuild/linux-mips64el@0.20.2": + version "0.20.2" + resolved "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz" + integrity sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA== + "@esbuild/linux-mips64el@0.25.5": version "0.25.5" resolved "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz" integrity sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg== +"@esbuild/linux-ppc64@0.20.2": + version "0.20.2" + resolved "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz" + integrity sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg== + "@esbuild/linux-ppc64@0.25.5": version "0.25.5" resolved "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz" integrity sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ== +"@esbuild/linux-riscv64@0.20.2": + version "0.20.2" + resolved "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz" + integrity sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg== + "@esbuild/linux-riscv64@0.25.5": version "0.25.5" resolved "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz" integrity sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA== +"@esbuild/linux-s390x@0.20.2": + version "0.20.2" + resolved "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz" + integrity sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ== + "@esbuild/linux-s390x@0.25.5": version "0.25.5" resolved "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz" integrity sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ== +"@esbuild/linux-x64@0.20.2": + version "0.20.2" + resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz" + integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw== + "@esbuild/linux-x64@0.25.5": version "0.25.5" resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz" @@ -1862,6 +1971,11 @@ resolved "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz" integrity sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw== +"@esbuild/netbsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz" + integrity sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ== + "@esbuild/netbsd-x64@0.25.5": version "0.25.5" resolved "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz" @@ -1872,26 +1986,51 @@ resolved "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz" integrity sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw== +"@esbuild/openbsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz" + integrity sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ== + "@esbuild/openbsd-x64@0.25.5": version "0.25.5" resolved "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz" integrity sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg== +"@esbuild/sunos-x64@0.20.2": + version "0.20.2" + resolved "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz" + integrity sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w== + "@esbuild/sunos-x64@0.25.5": version "0.25.5" resolved "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz" integrity sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA== +"@esbuild/win32-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz" + integrity sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ== + "@esbuild/win32-arm64@0.25.5": version "0.25.5" resolved "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz" integrity sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw== +"@esbuild/win32-ia32@0.20.2": + version "0.20.2" + resolved "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz" + integrity sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ== + "@esbuild/win32-ia32@0.25.5": version "0.25.5" resolved "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz" integrity sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ== +"@esbuild/win32-x64@0.20.2": + version "0.20.2" + resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz" + integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ== + "@esbuild/win32-x64@0.25.5": version "0.25.5" resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz" @@ -1977,7 +2116,7 @@ dependencies: "@floating-ui/utils" "^0.2.9" -"@floating-ui/dom@^1.0.0", "@floating-ui/dom@^1.0.1": +"@floating-ui/dom@^1.0.0", "@floating-ui/dom@^1.0.1", "@floating-ui/dom@^1.6.12": version "1.7.1" resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.1.tgz" integrity sha512-cwsmW/zyw5ltYTUeeYJ60CnQuPqmGwuGVhG9w0PRaRKkAyi38BT5CKrpIbb+jtahSwUl04cWzSx9ZOIxeS6RsQ== @@ -5728,6 +5867,11 @@ dependencies: bun-types "1.2.16" +"@types/canvas-confetti@^1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@types/canvas-confetti/-/canvas-confetti-1.9.0.tgz" + integrity sha512-aBGj/dULrimR1XDZLtG9JwxX1b4HPRF6CX9Yfwh3NvstZEm1ZL7RBnel4keCPSqs1ANRu1u2Aoz9R+VmtjYuTg== + "@types/connect@*": version "3.4.38" resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz" @@ -6113,7 +6257,7 @@ dependencies: undici-types "~5.26.4" -"@types/node@*", "@types/node@>= 12", "@types/node@>=10.0.0", "@types/node@>=12", "@types/node@>=13.7.0", "@types/node@>=18.0.0", "@types/node@^24.0.3": +"@types/node@*", "@types/node@>= 12", "@types/node@>=10.0.0", "@types/node@>=12", "@types/node@>=13.7.0", "@types/node@>=18.0.0", "@types/node@^18.0.0 || >=20.0.0", "@types/node@^24.0.3": version "24.0.3" resolved "https://registry.npmjs.org/@types/node/-/node-24.0.3.tgz" integrity sha512-R4I/kzCYAdRLzfiCabn9hxWfbuHS573x+r0dJMkkzThEa7pbrcDWK+9zu3e7aBOouf+rQAciqPFMnxwr0aWgKg== @@ -7403,6 +7547,11 @@ caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001702, caniuse-lite@^1.0.300017 resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001723.tgz" integrity sha512-1R/elMjtehrFejxwmexeXAtae5UO9iSyFn6G/I806CYC/BLyyBk1EPhrKBkWhy6wM6Xnm47dSJQec+tLJ39WHw== +canvas-confetti@^1.9.3: + version "1.9.3" + resolved "https://registry.npmjs.org/canvas-confetti/-/canvas-confetti-1.9.3.tgz" + integrity sha512-rFfTURMvmVEX1gyXFgn5QMn81bYk70qa0HLzcIOSVEyl57n6o9ItHeBtUSWdvKAPY0xlvBHno4/v3QPrT83q9g== + caseless@~0.12.0: version "0.12.0" resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" @@ -8608,6 +8757,11 @@ draco3d@^1.4.1: resolved "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz" integrity sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ== +dub@^0.63.5: + version "0.63.5" + resolved "https://registry.npmjs.org/dub/-/dub-0.63.5.tgz" + integrity sha512-p9ygOnYpZ89jV/rXJrG4yTa9E0VE8itwV/EmnydO27hFhRa9Hj3m6Ue0PLEIykYEGaROPjGIYKjXPOysShEhKQ== + dunder-proto@^1.0.0, dunder-proto@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz" @@ -8958,6 +9112,35 @@ es-to-primitive@^1.3.0: is-date-object "^1.0.5" is-symbol "^1.0.4" +esbuild@^0.20.1: + version "0.20.2" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz" + integrity sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g== + optionalDependencies: + "@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" + esbuild@>=0.18, esbuild@^0.25.0: version "0.25.5" resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz" @@ -9813,7 +9996,7 @@ fs.realpath@^1.0.0: resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@~2.3.2: +fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== @@ -11405,7 +11588,7 @@ lie@^3.0.2, lie@~3.3.0: dependencies: immediate "~3.0.5" -lightningcss@1.30.1: +lightningcss@1.30.1, lightningcss@^1.21.0: version "1.30.1" resolved "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz" integrity sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg== @@ -13708,7 +13891,7 @@ postcss@8.4.31: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@>=8.0.9, postcss@^8.0.0, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.4.12, postcss@^8.4.21, postcss@^8.4.41, postcss@^8.4.47, postcss@^8.5.4: +postcss@>=8.0.9, postcss@^8.0.0, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.4.12, postcss@^8.4.21, postcss@^8.4.38, postcss@^8.4.41, postcss@^8.4.47, postcss@^8.5.4: version "8.5.6" resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz" integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== @@ -14287,7 +14470,7 @@ rc@^1.2.8: minimist "^1.2.0" strip-json-comments "~2.0.1" -react@*, react@18.x, "react@>= 16.14", "react@>= 16.8 || 18.0.0", "react@>= 16.8.0", "react@>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0", "react@>= 18.2.0", react@>=16, react@>=16.13, react@>=16.6.0, react@>=16.8, "react@>=16.8.0 || ^17.0.0 || ^18", react@>=17.0, react@>=18, "react@>=18.2.0 || ^19.0.0-0", "react@^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react@^16.8 || ^17.0 || ^18.0", "react@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react@^16.8.0 || ^17 || ^18 || ^19", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.x || ^17.x || ^18.x || ^19.0.0 || ^19.0.0-rc", "react@^17.0.0 || ^18.0.0 || ^19.0.0", "react@^17.0.2 || ^18.0.0 || ^19.0.0", "react@^18 || ^19", "react@^18 || ^19 || ^19.0.0-rc", "react@^18.0 || ^19.0", "react@^18.0 || ^19.0 || ^19.0.0-rc", "react@^18.0.0 || ^19.0.0", "react@^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react@^18.2.0 || ^19.0.0", react@^19, react@^19.1.0: +react@*, react@18.x, "react@>= 16.14", "react@>= 16.8 || 18.0.0", "react@>= 16.8.0", "react@>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0", "react@>= 18.2.0", react@>=16, react@>=16.13, react@>=16.6.0, react@>=16.8, "react@>=16.8.0 || ^17.0.0 || ^18", react@>=17.0, react@>=18, "react@>=18.2.0 || ^19.0.0-0", "react@^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react@^16.8 || ^17.0 || ^18.0", "react@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react@^16.8.0 || ^17 || ^18 || ^19", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.x || ^17.x || ^18.x || ^19.0.0 || ^19.0.0-rc", "react@^17.0.0 || ^18.0.0 || ^19.0.0", "react@^17.0.2 || ^18.0.0 || ^19.0.0", "react@^18 || ^19", "react@^18 || ^19 || ^19.0.0-rc", "react@^18.0 || ^19.0", "react@^18.0 || ^19.0 || ^19.0.0-rc", "react@^18.0.0 || ^19.0.0", "react@^18.0.0 || ^19.0.0 || ^19.0.0-rc", react@^18.2.0, "react@^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react@^18.2.0 || ^19.0.0", react@^19, react@^19.1.0: version "19.1.0" resolved "https://registry.npmjs.org/react/-/react-19.1.0.tgz" integrity sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg== @@ -14326,7 +14509,7 @@ react-dnd-html5-backend@^16.0.1: dependencies: dnd-core "^16.0.1" -react-dom@*, "react-dom@>= 18.2.0", react-dom@>=16.13, react-dom@>=16.6.0, react-dom@>=16.8, react-dom@>=18.0.0, "react-dom@^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^16.0.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom@^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom@^16.8 || ^17.0 || ^18.0", "react-dom@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^18 || ^19", "react-dom@^18 || ^19 || ^19.0.0-rc", "react-dom@^18.0.0 || ^19.0.0", "react-dom@^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom@^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom@^18.2.0 || ^19.0.0", react-dom@^19, react-dom@^19.1.0: +react-dom@*, "react-dom@>= 18.2.0", react-dom@>=16.13, react-dom@>=16.6.0, react-dom@>=16.8, react-dom@>=18.0.0, "react-dom@^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^16.0.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom@^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom@^16.8 || ^17.0 || ^18.0", "react-dom@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^18 || ^19", "react-dom@^18 || ^19 || ^19.0.0-rc", "react-dom@^18.0.0 || ^19.0.0", "react-dom@^18.0.0 || ^19.0.0 || ^19.0.0-rc", react-dom@^18.2.0, "react-dom@^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom@^18.2.0 || ^19.0.0", react-dom@^19, react-dom@^19.1.0: version "19.1.0" resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz" integrity sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g== @@ -14889,7 +15072,7 @@ robust-predicates@^3.0.2: resolved "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz" integrity sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg== -rollup@^4.34.8: +rollup@^4.13.0, rollup@^4.34.8: version "4.43.0" resolved "https://registry.npmjs.org/rollup/-/rollup-4.43.0.tgz" integrity sha512-wdN2Kd3Twh8MAEOEJZsuxuLKCsBEo4PVNLK6tQWAn10VhsVewQLzcucMgLolRlhFybGxfclbPeEYBaP6RvUFGg== @@ -16996,6 +17179,17 @@ victory-vendor@^36.6.8: d3-time "^3.0.0" d3-timer "^3.0.1" +vite@5.2.9: + version "5.2.9" + resolved "https://registry.npmjs.org/vite/-/vite-5.2.9.tgz" + integrity sha512-uOQWfuZBlc6Y3W/DTuQ1Sr+oIXWvqljLvS881SVmAj00d5RdgShLcuXWxseWPd4HXwiYBFW/vXHfKFeqj9uQnw== + optionalDependencies: + fsevents "~2.3.3" + dependencies: + esbuild "^0.20.1" + postcss "^8.4.38" + rollup "^4.13.0" + w3c-keyname@^2.2.0: version "2.2.8" resolved "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz"