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 (
+
+ );
+}
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 (
+
+ );
+}
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"