diff --git a/apps/web/app/admin.dub.co/(dashboard)/revenue/client.tsx b/apps/web/app/admin.dub.co/(dashboard)/revenue/client.tsx
index ebc9c4a81bb..50d00fb9a7e 100644
--- a/apps/web/app/admin.dub.co/(dashboard)/revenue/client.tsx
+++ b/apps/web/app/admin.dub.co/(dashboard)/revenue/client.tsx
@@ -1,9 +1,6 @@
"use client";
-import Areas from "@/ui/charts/areas";
-import TimeSeriesChart from "@/ui/charts/time-series-chart";
-import XAxis from "@/ui/charts/x-axis";
-import YAxis from "@/ui/charts/y-axis";
+import { Areas, TimeSeriesChart, XAxis, YAxis } from "@dub/ui/charts";
import { currencyFormatter } from "@dub/utils";
import { Fragment } from "react";
diff --git a/apps/web/app/app.dub.co/(auth)/invites/[code]/page.tsx b/apps/web/app/app.dub.co/(auth)/invites/[code]/page.tsx
index eb2a0fccc1c..538c09c3862 100644
--- a/apps/web/app/app.dub.co/(auth)/invites/[code]/page.tsx
+++ b/apps/web/app/app.dub.co/(auth)/invites/[code]/page.tsx
@@ -2,7 +2,7 @@ import { getSession } from "@/lib/auth";
import EmptyState from "@/ui/shared/empty-state";
import { prisma } from "@dub/prisma";
import { LoadingSpinner } from "@dub/ui";
-import { LinkBroken, Users6 } from "@dub/ui/src/icons";
+import { LinkBroken, Users6 } from "@dub/ui/icons";
import { APP_NAME } from "@dub/utils";
import { redirect } from "next/navigation";
import { Suspense } from "react";
diff --git a/apps/web/app/app.dub.co/(auth)/oauth/authorize/authorize-form.tsx b/apps/web/app/app.dub.co/(auth)/oauth/authorize/authorize-form.tsx
index db95326babf..cd0d5a7e823 100644
--- a/apps/web/app/app.dub.co/(auth)/oauth/authorize/authorize-form.tsx
+++ b/apps/web/app/app.dub.co/(auth)/oauth/authorize/authorize-form.tsx
@@ -5,7 +5,7 @@ import z from "@/lib/zod";
import { authorizeRequestSchema } from "@/lib/zod/schemas/oauth";
import { useAddWorkspaceModal } from "@/ui/modals/add-workspace-modal";
import { Button, InputSelect, InputSelectItemProps } from "@dub/ui";
-import { OfficeBuilding } from "@dub/ui/src/icons";
+import { OfficeBuilding } from "@dub/ui/icons";
import { DICEBEAR_AVATAR_URL } from "@dub/utils";
import { useSession } from "next-auth/react";
import { useEffect, useMemo, useState } from "react";
diff --git a/apps/web/app/app.dub.co/(auth)/oauth/authorize/page.tsx b/apps/web/app/app.dub.co/(auth)/oauth/authorize/page.tsx
index 22879b43ea3..4a88fc5e186 100644
--- a/apps/web/app/app.dub.co/(auth)/oauth/authorize/page.tsx
+++ b/apps/web/app/app.dub.co/(auth)/oauth/authorize/page.tsx
@@ -4,7 +4,7 @@ import z from "@/lib/zod";
import { authorizeRequestSchema } from "@/lib/zod/schemas/oauth";
import EmptyState from "@/ui/shared/empty-state";
import { BlurImage, Logo } from "@dub/ui";
-import { CircleWarning, CubeSettings } from "@dub/ui/src/icons";
+import { CircleWarning, CubeSettings } from "@dub/ui/icons";
import { HOME_DOMAIN, constructMetadata } from "@dub/utils";
import { ArrowLeftRight } from "lucide-react";
import { redirect } from "next/navigation";
diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/page-client.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/page-client.tsx
index f5198804fc9..b60c46721c8 100644
--- a/apps/web/app/app.dub.co/(dashboard)/[slug]/page-client.tsx
+++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/page-client.tsx
@@ -21,7 +21,7 @@ import {
TooltipContent,
useMediaQuery,
} from "@dub/ui";
-import { Download, Globe, TableIcon, Tag } from "@dub/ui/src/icons";
+import { Download, Globe, TableIcon, Tag } from "@dub/ui/icons";
import { useSession } from "next-auth/react";
import { useRouter } from "next/navigation";
import posthog from "posthog-js";
diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/branding/page-client.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/branding/page-client.tsx
index 787dcd84de5..eef9d443882 100644
--- a/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/branding/page-client.tsx
+++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/branding/page-client.tsx
@@ -1,7 +1,7 @@
"use client";
import { AnimatedEmptyState } from "@/ui/shared/animated-empty-state";
-import { Palette2, Photo, Post } from "@dub/ui/src/icons";
+import { Palette2, Photo, Post } from "@dub/ui/icons";
const emptyStateIcons = [Post, Palette2, Photo];
diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/overview-chart.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/overview-chart.tsx
index 23c969b6449..cc4a1512f4a 100644
--- a/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/overview-chart.tsx
+++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/overview-chart.tsx
@@ -1,14 +1,16 @@
import { IntervalOptions } from "@/lib/analytics/types";
import useProgramAnalytics from "@/lib/swr/use-program-analytics";
import useProgramMetrics from "@/lib/swr/use-program-metrics";
-import Areas from "@/ui/charts/areas";
-import { ChartContext } from "@/ui/charts/chart-context";
-import TimeSeriesChart from "@/ui/charts/time-series-chart";
-import XAxis from "@/ui/charts/x-axis";
-import YAxis from "@/ui/charts/y-axis";
import SimpleDateRangePicker from "@/ui/shared/simple-date-range-picker";
import { useRouterStuff } from "@dub/ui";
-import { LoadingSpinner } from "@dub/ui/src/icons";
+import {
+ Areas,
+ ChartContext,
+ TimeSeriesChart,
+ XAxis,
+ YAxis,
+} from "@dub/ui/charts";
+import { LoadingSpinner } from "@dub/ui/icons";
import { currencyFormatter, formatDate } from "@dub/utils";
import NumberFlow from "@number-flow/react";
import { LinearGradient } from "@visx/gradient";
diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/partners/invites-table-link.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/partners/invites-table-link.tsx
index 11b32eadb16..d096ac69501 100644
--- a/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/partners/invites-table-link.tsx
+++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/partners/invites-table-link.tsx
@@ -1,8 +1,7 @@
"use client";
-import { buttonVariants } from "@dub/ui";
-import { EnvelopeArrowRight } from "@dub/ui/src/icons";
-import { Tooltip } from "@dub/ui/src/tooltip";
+import { buttonVariants, Tooltip } from "@dub/ui";
+import { EnvelopeArrowRight } from "@dub/ui/icons";
import { cn } from "@dub/utils";
import Link from "next/link";
import { useParams } from "next/navigation";
diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/partners/invites/page-client.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/partners/invites/page-client.tsx
index 9fc5dbc507f..d0e4550f952 100644
--- a/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/partners/invites/page-client.tsx
+++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/partners/invites/page-client.tsx
@@ -13,12 +13,7 @@ import {
useRouterStuff,
useTable,
} from "@dub/ui";
-import {
- Dots,
- EnvelopeArrowRight,
- LoadingSpinner,
- Users,
-} from "@dub/ui/src/icons";
+import { Dots, EnvelopeArrowRight, LoadingSpinner, Users } from "@dub/ui/icons";
import {
cn,
DICEBEAR_AVATAR_URL,
diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/partners/partner-stats.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/partners/partner-stats.tsx
index a728745bdf6..a2120da1930 100644
--- a/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/partners/partner-stats.tsx
+++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/partners/partner-stats.tsx
@@ -4,7 +4,7 @@ import usePartnersCount from "@/lib/swr/use-partners-count";
import { PartnerStatusBadges } from "@/ui/partners/partner-status-badges";
import { ProgramStatsFilter } from "@/ui/partners/program-stats-filter";
import { useRouterStuff } from "@dub/ui";
-import { ChartLine, Users } from "@dub/ui/src/icons";
+import { ChartLine, Users } from "@dub/ui/icons";
import { useParams } from "next/navigation";
interface PartnerCount {
diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/partners/partner-table.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/partners/partner-table.tsx
index ac843ff8362..a1d1ec4347c 100644
--- a/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/partners/partner-table.tsx
+++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/partners/partner-table.tsx
@@ -21,7 +21,7 @@ import {
useRouterStuff,
useTable,
} from "@dub/ui";
-import { Dots, Users } from "@dub/ui/src/icons";
+import { Dots, Users } from "@dub/ui/icons";
import {
cn,
COUNTRIES,
diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/partners/use-partner-filters.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/partners/use-partner-filters.tsx
index b07d879332c..b477e64c91b 100644
--- a/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/partners/use-partner-filters.tsx
+++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/partners/use-partner-filters.tsx
@@ -2,7 +2,7 @@ import usePartnersCount from "@/lib/swr/use-partners-count";
import useWorkspace from "@/lib/swr/use-workspace";
import { PartnerStatusBadges } from "@/ui/partners/partner-status-badges";
import { useRouterStuff } from "@dub/ui";
-import { CircleDotted, FlagWavy } from "@dub/ui/src/icons";
+import { CircleDotted, FlagWavy } from "@dub/ui/icons";
import { cn, COUNTRIES, nFormatter } from "@dub/utils";
import { useMemo } from "react";
diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/payouts/payout-settings-link.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/payouts/payout-settings-link.tsx
index 5f18cde28d8..9e12df3f02b 100644
--- a/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/payouts/payout-settings-link.tsx
+++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/payouts/payout-settings-link.tsx
@@ -1,8 +1,7 @@
"use client";
-import { buttonVariants } from "@dub/ui";
-import { GreekTemple } from "@dub/ui/src/icons";
-import { Tooltip } from "@dub/ui/src/tooltip";
+import { buttonVariants, Tooltip } from "@dub/ui";
+import { GreekTemple } from "@dub/ui/icons";
import { cn } from "@dub/utils";
import Link from "next/link";
import { useParams } from "next/navigation";
diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/payouts/payout-table.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/payouts/payout-table.tsx
index d9c6f0f0f01..b53e46f28cf 100644
--- a/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/payouts/payout-table.tsx
+++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/payouts/payout-table.tsx
@@ -19,7 +19,7 @@ import {
useRouterStuff,
useTable,
} from "@dub/ui";
-import { Dots, MoneyBill2, MoneyBills2 } from "@dub/ui/src/icons";
+import { Dots, MoneyBill2, MoneyBills2 } from "@dub/ui/icons";
import {
cn,
currencyFormatter,
diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/payouts/use-payout-filters.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/payouts/use-payout-filters.tsx
index 270529830e2..17b5086e4f6 100644
--- a/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/payouts/use-payout-filters.tsx
+++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/payouts/use-payout-filters.tsx
@@ -6,7 +6,7 @@ import { EnrolledPartnerProps } from "@/lib/types";
import { PARTNERS_MAX_PAGE_SIZE } from "@/lib/zod/schemas/partners";
import { PayoutStatusBadges } from "@/ui/partners/payout-status-badges";
import { useRouterStuff } from "@dub/ui";
-import { CircleDotted, Users } from "@dub/ui/src/icons";
+import { CircleDotted, Users } from "@dub/ui/icons";
import { cn, DICEBEAR_AVATAR_URL, nFormatter } from "@dub/utils";
import { useMemo, useState } from "react";
import { useDebounce } from "use-debounce";
diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/program-metrics.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/program-metrics.tsx
index e6418a6e477..c31d5998fc1 100644
--- a/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/program-metrics.tsx
+++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/program-metrics.tsx
@@ -1,6 +1,6 @@
import useProgramMetrics from "@/lib/swr/use-program-metrics";
import { Icon } from "@dub/ui";
-import { Check2, CurrencyDollar, MoneyBills2, Users } from "@dub/ui/src/icons";
+import { Check2, CurrencyDollar, MoneyBills2, Users } from "@dub/ui/icons";
import { currencyFormatter, nFormatter } from "@dub/utils";
import Link from "next/link";
import { useParams } from "next/navigation";
diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/resources/page-client.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/resources/page-client.tsx
index 0b0fb068ade..ddc9e7b8b58 100644
--- a/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/resources/page-client.tsx
+++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/resources/page-client.tsx
@@ -1,7 +1,7 @@
"use client";
import { AnimatedEmptyState } from "@/ui/shared/animated-empty-state";
-import { FileZip2, Palette2, Post } from "@dub/ui/src/icons";
+import { FileZip2, Palette2, Post } from "@dub/ui/icons";
const emptyStateIcons = [Post, Palette2, FileZip2];
diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/sales/sale-stats.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/sales/sale-stats.tsx
index 3d40774446c..84e6709fae3 100644
--- a/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/sales/sale-stats.tsx
+++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/sales/sale-stats.tsx
@@ -4,7 +4,7 @@ import useSalesCount from "@/lib/swr/use-sales-count";
import { ProgramStatsFilter } from "@/ui/partners/program-stats-filter";
import { SaleStatusBadges } from "@/ui/partners/sale-status-badges";
import { useRouterStuff } from "@dub/ui";
-import { Users } from "@dub/ui/src/icons";
+import { Users } from "@dub/ui/icons";
import { useParams } from "next/navigation";
export function SaleStats() {
diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/sales/sale-table.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/sales/sale-table.tsx
index f4575d77031..91a1ee24555 100644
--- a/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/sales/sale-table.tsx
+++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/sales/sale-table.tsx
@@ -17,7 +17,7 @@ import {
useRouterStuff,
useTable,
} from "@dub/ui";
-import { MoneyBill2 } from "@dub/ui/src/icons";
+import { MoneyBill2 } from "@dub/ui/icons";
import {
currencyFormatter,
DICEBEAR_AVATAR_URL,
diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/sales/use-sale-filters.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/sales/use-sale-filters.tsx
index 87a923ab872..c02220a5000 100644
--- a/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/sales/use-sale-filters.tsx
+++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/sales/use-sale-filters.tsx
@@ -8,7 +8,7 @@ import { CUSTOMERS_MAX_PAGE_SIZE } from "@/lib/zod/schemas/customers";
import { PARTNERS_MAX_PAGE_SIZE } from "@/lib/zod/schemas/partners";
import { SaleStatusBadges } from "@/ui/partners/sale-status-badges";
import { CircleDotted, useRouterStuff } from "@dub/ui";
-import { User, Users } from "@dub/ui/src/icons";
+import { User, Users } from "@dub/ui/icons";
import { cn, DICEBEAR_AVATAR_URL, nFormatter } from "@dub/utils";
import { useMemo, useState } from "react";
import { useDebounce } from "use-debounce";
diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/settings/program-settings.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/settings/program-settings.tsx
index 319aed8dcca..6376994a5ae 100644
--- a/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/settings/program-settings.tsx
+++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/settings/program-settings.tsx
@@ -7,7 +7,7 @@ import { ProgramProps } from "@/lib/types";
import { EmbedDocsSheet } from "@/ui/partners/embed-docs-sheet";
import { ProgramCommissionDescription } from "@/ui/partners/program-commission-description";
import { AnimatedSizeContainer, Button } from "@dub/ui";
-import { CircleCheckFill, Code, LoadingSpinner } from "@dub/ui/src/icons";
+import { CircleCheckFill, Code, LoadingSpinner } from "@dub/ui/icons";
import { cn, pluralize } from "@dub/utils";
import { useAction } from "next-safe-action/hooks";
import { useState } from "react";
diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/settings/tracking-settings.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/settings/tracking-settings.tsx
index 3ff504344d0..717c9762b50 100644
--- a/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/settings/tracking-settings.tsx
+++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/settings/tracking-settings.tsx
@@ -6,7 +6,7 @@ import useProgram from "@/lib/swr/use-program";
import useWorkspace from "@/lib/swr/use-workspace";
import { ProgramProps } from "@/lib/types";
import { Badge, Button } from "@dub/ui";
-import { CircleCheckFill, LoadingSpinner } from "@dub/ui/src/icons";
+import { CircleCheckFill, LoadingSpinner } from "@dub/ui/icons";
import { cn } from "@dub/utils";
import { useAction } from "next-safe-action/hooks";
import { useForm } from "react-hook-form";
diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/billing/page-client.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/billing/page-client.tsx
index 71b8cca4914..dec897413a6 100644
--- a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/billing/page-client.tsx
+++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/billing/page-client.tsx
@@ -12,7 +12,7 @@ import {
ProgressBar,
useRouterStuff,
} from "@dub/ui";
-import { CircleDollar, CursorRays, Hyperlink } from "@dub/ui/src/icons";
+import { CircleDollar, CursorRays, Hyperlink } from "@dub/ui/icons";
import { cn, getFirstAndLastDay, nFormatter } from "@dub/utils";
import NumberFlow from "@number-flow/react";
import Link from "next/link";
diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/billing/usage-chart.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/billing/usage-chart.tsx
index 0c92f5568c1..22c7936c787 100644
--- a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/billing/usage-chart.tsx
+++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/billing/usage-chart.tsx
@@ -1,10 +1,7 @@
import useUsage from "@/lib/swr/use-usage";
-import { Bars } from "@/ui/charts/bars";
-import TimeSeriesChart from "@/ui/charts/time-series-chart";
-import XAxis from "@/ui/charts/x-axis";
-import YAxis from "@/ui/charts/y-axis";
import { EmptyState, LoadingSpinner } from "@dub/ui";
-import { CircleDollar, CursorRays, Hyperlink } from "@dub/ui/src/icons";
+import { Bars, TimeSeriesChart, XAxis, YAxis } from "@dub/ui/charts";
+import { CircleDollar, CursorRays, Hyperlink } from "@dub/ui/icons";
import { formatDate, nFormatter } from "@dub/utils";
import { LinearGradient } from "@visx/gradient";
import { useSearchParams } from "next/navigation";
diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/domains/default-domains.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/domains/default-domains.tsx
index 1dd6ac15807..bc5470ce9f0 100644
--- a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/domains/default-domains.tsx
+++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/domains/default-domains.tsx
@@ -14,7 +14,7 @@ import {
GitHubEnhanced,
GoogleEnhanced,
Spotify,
-} from "@dub/ui/src/icons";
+} from "@dub/ui/icons";
import { DUB_DOMAINS } from "@dub/utils";
import Link from "next/link";
import { useEffect, useState } from "react";
diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/integrations/[integrationSlug]/page-client.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/integrations/[integrationSlug]/page-client.tsx
index a6d18d5c0a7..49b035eaf9e 100644
--- a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/integrations/[integrationSlug]/page-client.tsx
+++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/integrations/[integrationSlug]/page-client.tsx
@@ -26,7 +26,7 @@ import {
Globe,
OfficeBuilding,
ShieldCheck,
-} from "@dub/ui/src/icons";
+} from "@dub/ui/icons";
import {
cn,
formatDate,
diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/library/tags/page-client.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/library/tags/page-client.tsx
index 64bb0944399..aa97f583b77 100644
--- a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/library/tags/page-client.tsx
+++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/library/tags/page-client.tsx
@@ -13,7 +13,7 @@ import {
usePagination,
useRouterStuff,
} from "@dub/ui";
-import { Tag } from "@dub/ui/src/icons";
+import { Tag } from "@dub/ui/icons";
import { createContext, Dispatch, SetStateAction, useState } from "react";
import { TagCard } from "./tag-card";
import { TagCardPlaceholder } from "./tag-card-placeholder";
diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/library/tags/tag-card.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/library/tags/tag-card.tsx
index 5036ed4278c..4d5a7d2720f 100644
--- a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/library/tags/tag-card.tsx
+++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/library/tags/tag-card.tsx
@@ -12,12 +12,7 @@ import {
useCopyToClipboard,
useKeyboardShortcut,
} from "@dub/ui";
-import {
- CircleCheck,
- Copy,
- LoadingSpinner,
- PenWriting,
-} from "@dub/ui/src/icons";
+import { CircleCheck, Copy, LoadingSpinner, PenWriting } from "@dub/ui/icons";
import { cn, nFormatter, pluralize } from "@dub/utils";
import Link from "next/link";
import { useContext, useState } from "react";
diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/library/utm/template-card.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/library/utm/template-card.tsx
index 11256098dc7..cdd60ba1a74 100644
--- a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/library/utm/template-card.tsx
+++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/library/utm/template-card.tsx
@@ -13,11 +13,7 @@ import {
useKeyboardShortcut,
UTM_PARAMETERS,
} from "@dub/ui";
-import {
- DiamondTurnRight,
- LoadingSpinner,
- PenWriting,
-} from "@dub/ui/src/icons";
+import { DiamondTurnRight, LoadingSpinner, PenWriting } from "@dub/ui/icons";
import { cn, formatDate } from "@dub/utils";
import { Fragment, useContext, useState } from "react";
import { toast } from "sonner";
diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/notifications/page-client.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/notifications/page-client.tsx
index d9b8ea32489..d4fb33e6148 100644
--- a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/notifications/page-client.tsx
+++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/notifications/page-client.tsx
@@ -3,7 +3,7 @@
import { updateNotificationPreference } from "@/lib/actions/update-notification-preference";
import useWorkspace from "@/lib/swr/use-workspace";
import { Switch, useOptimisticUpdate } from "@dub/ui";
-import { Globe, Hyperlink } from "@dub/ui/src/icons";
+import { Globe, Hyperlink } from "@dub/ui/icons";
import { useAction } from "next-safe-action/hooks";
type PreferenceType = "linkUsageSummary" | "domainConfigurationUpdates";
diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/oauth-apps/page-client.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/oauth-apps/page-client.tsx
index c62457a4d94..80af41cc864 100644
--- a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/oauth-apps/page-client.tsx
+++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/oauth-apps/page-client.tsx
@@ -6,8 +6,7 @@ import { OAuthAppProps } from "@/lib/types";
import OAuthAppCard from "@/ui/oauth-apps/oauth-app-card";
import OAuthAppPlaceholder from "@/ui/oauth-apps/oauth-app-placeholder";
import EmptyState from "@/ui/shared/empty-state";
-import { Button, Cube, TooltipContent } from "@dub/ui";
-import { InfoTooltip } from "@dub/ui/src/tooltip";
+import { Button, Cube, InfoTooltip, TooltipContent } from "@dub/ui";
import { fetcher } from "@dub/utils";
import { useRouter } from "next/navigation";
import useSWR from "swr";
diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/payouts/page-client.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/payouts/page-client.tsx
index b941353bb04..b42875fe33a 100644
--- a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/payouts/page-client.tsx
+++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/payouts/page-client.tsx
@@ -4,7 +4,7 @@ import useWorkspace from "@/lib/swr/use-workspace";
import { useAddBankAccountModal } from "@/ui/modals/add-bank-account-modal";
import { AnimatedEmptyState } from "@/ui/shared/animated-empty-state";
import { Button } from "@dub/ui";
-import { BadgeCheck, GreekTemple } from "@dub/ui/src/icons";
+import { BadgeCheck, GreekTemple } from "@dub/ui/icons";
import { truncate } from "@dub/utils";
import { WorkspaceDepositActivity } from "./activity";
import { BankAccount } from "./bank-account";
diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/tokens/page-client.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/tokens/page-client.tsx
index 56599a0f222..682ea4beb20 100644
--- a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/tokens/page-client.tsx
+++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/tokens/page-client.tsx
@@ -17,7 +17,7 @@ import {
TokenAvatar,
Tooltip,
} from "@dub/ui";
-import { Key } from "@dub/ui/src/icons";
+import { Key } from "@dub/ui/icons";
import { fetcher, timeAgo } from "@dub/utils";
import { Edit3, MoreVertical } from "lucide-react";
import { useState } from "react";
diff --git a/apps/web/app/app.dub.co/(dashboard)/account/settings/referrals/page.tsx b/apps/web/app/app.dub.co/(dashboard)/account/settings/referrals/page.tsx
index aa5e67f4427..5d39813daf5 100644
--- a/apps/web/app/app.dub.co/(dashboard)/account/settings/referrals/page.tsx
+++ b/apps/web/app/app.dub.co/(dashboard)/account/settings/referrals/page.tsx
@@ -3,12 +3,7 @@ import { dub } from "@/lib/dub";
import LayoutLoader from "@/ui/layout/layout-loader";
import { AnimatedEmptyState } from "@/ui/shared/animated-empty-state";
import { DubWidget } from "@dub/embed-react";
-import {
- CursorRays,
- Hyperlink,
- InvoiceDollar,
- UserCheck,
-} from "@dub/ui/src/icons";
+import { CursorRays, Hyperlink, InvoiceDollar, UserCheck } from "@dub/ui/icons";
import { Suspense } from "react";
export const dynamic = "auto";
diff --git a/apps/web/app/app.dub.co/(onboarding)/onboarding/(steps)/domain/custom/page.tsx b/apps/web/app/app.dub.co/(onboarding)/onboarding/(steps)/domain/custom/page.tsx
index 20a7c763eca..93dd08317b3 100644
--- a/apps/web/app/app.dub.co/(onboarding)/onboarding/(steps)/domain/custom/page.tsx
+++ b/apps/web/app/app.dub.co/(onboarding)/onboarding/(steps)/domain/custom/page.tsx
@@ -1,4 +1,4 @@
-import { Globe } from "@dub/ui/src/icons";
+import { Globe } from "@dub/ui/icons";
import { StepPage } from "../../step-page";
import { Form } from "./form";
diff --git a/apps/web/app/app.dub.co/(onboarding)/onboarding/(steps)/domain/domain-selector.tsx b/apps/web/app/app.dub.co/(onboarding)/onboarding/(steps)/domain/domain-selector.tsx
index bd032af050c..48ddbf92648 100644
--- a/apps/web/app/app.dub.co/(onboarding)/onboarding/(steps)/domain/domain-selector.tsx
+++ b/apps/web/app/app.dub.co/(onboarding)/onboarding/(steps)/domain/domain-selector.tsx
@@ -4,7 +4,7 @@ import useLinks from "@/lib/swr/use-links";
import useWorkspace from "@/lib/swr/use-workspace";
import { CheckCircleFill } from "@/ui/shared/icons";
import { Button } from "@dub/ui";
-import { Globe2, LoadingSpinner } from "@dub/ui/src/icons";
+import { Globe2, LoadingSpinner } from "@dub/ui/icons";
import { cn } from "@dub/utils";
import { Crown } from "lucide-react";
import { ReactNode, useEffect, useState } from "react";
diff --git a/apps/web/app/app.dub.co/(onboarding)/onboarding/(steps)/domain/page.tsx b/apps/web/app/app.dub.co/(onboarding)/onboarding/(steps)/domain/page.tsx
index 491a45ec478..a817deea6b4 100644
--- a/apps/web/app/app.dub.co/(onboarding)/onboarding/(steps)/domain/page.tsx
+++ b/apps/web/app/app.dub.co/(onboarding)/onboarding/(steps)/domain/page.tsx
@@ -1,4 +1,4 @@
-import { Globe } from "@dub/ui/src/icons";
+import { Globe } from "@dub/ui/icons";
import { StepPage } from "../step-page";
import { DomainSelector } from "./domain-selector";
diff --git a/apps/web/app/app.dub.co/(onboarding)/onboarding/(steps)/domain/register/page.tsx b/apps/web/app/app.dub.co/(onboarding)/onboarding/(steps)/domain/register/page.tsx
index 1a66106ccc7..018daa2554c 100644
--- a/apps/web/app/app.dub.co/(onboarding)/onboarding/(steps)/domain/register/page.tsx
+++ b/apps/web/app/app.dub.co/(onboarding)/onboarding/(steps)/domain/register/page.tsx
@@ -1,4 +1,4 @@
-import { Globe } from "@dub/ui/src/icons";
+import { Globe } from "@dub/ui/icons";
import { StepPage } from "../../step-page";
import { Form } from "./form";
diff --git a/apps/web/app/app.dub.co/(onboarding)/onboarding/(steps)/exit-button.tsx b/apps/web/app/app.dub.co/(onboarding)/onboarding/(steps)/exit-button.tsx
index 0af1c16e832..ba3ac8c4ece 100644
--- a/apps/web/app/app.dub.co/(onboarding)/onboarding/(steps)/exit-button.tsx
+++ b/apps/web/app/app.dub.co/(onboarding)/onboarding/(steps)/exit-button.tsx
@@ -1,6 +1,6 @@
"use client";
-import { ExpandingArrow, LoadingSpinner } from "@dub/ui/src/icons";
+import { ExpandingArrow, LoadingSpinner } from "@dub/ui/icons";
import { useOnboardingProgress } from "../use-onboarding-progress";
export function ExitButton() {
diff --git a/apps/web/app/app.dub.co/(onboarding)/onboarding/(steps)/invite/page.tsx b/apps/web/app/app.dub.co/(onboarding)/onboarding/(steps)/invite/page.tsx
index 0e949685cfd..76ba7f2ad74 100644
--- a/apps/web/app/app.dub.co/(onboarding)/onboarding/(steps)/invite/page.tsx
+++ b/apps/web/app/app.dub.co/(onboarding)/onboarding/(steps)/invite/page.tsx
@@ -1,4 +1,4 @@
-import { Users } from "@dub/ui/src/icons";
+import { Users } from "@dub/ui/icons";
import { StepPage } from "../step-page";
import { Form } from "./form";
diff --git a/apps/web/app/app.dub.co/(onboarding)/onboarding/(steps)/link/form.tsx b/apps/web/app/app.dub.co/(onboarding)/onboarding/(steps)/link/form.tsx
index 0747389ccbd..0cf3450d87a 100644
--- a/apps/web/app/app.dub.co/(onboarding)/onboarding/(steps)/link/form.tsx
+++ b/apps/web/app/app.dub.co/(onboarding)/onboarding/(steps)/link/form.tsx
@@ -6,7 +6,7 @@ import { ShortLinkInput } from "@/ui/links/short-link-input";
import { useAvailableDomains } from "@/ui/links/use-available-domains";
import { UpgradeRequiredToast } from "@/ui/shared/upgrade-required-toast";
import { Button } from "@dub/ui";
-import { LoadingCircle, Photo } from "@dub/ui/src/icons";
+import { LoadingCircle, Photo } from "@dub/ui/icons";
import { getUrlWithoutUTMParams } from "@dub/utils";
import posthog from "posthog-js";
import { useEffect, useState } from "react";
diff --git a/apps/web/app/app.dub.co/(onboarding)/onboarding/(steps)/link/page.tsx b/apps/web/app/app.dub.co/(onboarding)/onboarding/(steps)/link/page.tsx
index 6c6df319293..74b46fc794e 100644
--- a/apps/web/app/app.dub.co/(onboarding)/onboarding/(steps)/link/page.tsx
+++ b/apps/web/app/app.dub.co/(onboarding)/onboarding/(steps)/link/page.tsx
@@ -1,4 +1,4 @@
-import { LinkBroken } from "@dub/ui/src/icons";
+import { LinkBroken } from "@dub/ui/icons";
import { StepPage } from "../step-page";
import { Form } from "./form";
diff --git a/apps/web/app/app.dub.co/(onboarding)/onboarding/(steps)/workspace/page.tsx b/apps/web/app/app.dub.co/(onboarding)/onboarding/(steps)/workspace/page.tsx
index 182f4c69f00..4388fabf001 100644
--- a/apps/web/app/app.dub.co/(onboarding)/onboarding/(steps)/workspace/page.tsx
+++ b/apps/web/app/app.dub.co/(onboarding)/onboarding/(steps)/workspace/page.tsx
@@ -1,4 +1,4 @@
-import { GridPlus } from "@dub/ui/src/icons";
+import { GridPlus } from "@dub/ui/icons";
import { StepPage } from "../step-page";
import { Form } from "./form";
diff --git a/apps/web/app/app.dub.co/(onboarding)/onboarding/later-button.tsx b/apps/web/app/app.dub.co/(onboarding)/onboarding/later-button.tsx
index 4462118d485..a4371646dc3 100644
--- a/apps/web/app/app.dub.co/(onboarding)/onboarding/later-button.tsx
+++ b/apps/web/app/app.dub.co/(onboarding)/onboarding/later-button.tsx
@@ -1,7 +1,7 @@
"use client";
import { OnboardingStep } from "@/lib/onboarding/types";
-import { LoadingSpinner } from "@dub/ui/src/icons";
+import { LoadingSpinner } from "@dub/ui/icons";
import { cn } from "@dub/utils";
import { PropsWithChildren } from "react";
import { useOnboardingProgress } from "./use-onboarding-progress";
diff --git a/apps/web/app/app.dub.co/embed/loading.tsx b/apps/web/app/app.dub.co/embed/loading.tsx
index 479406107d7..c500943e90a 100644
--- a/apps/web/app/app.dub.co/embed/loading.tsx
+++ b/apps/web/app/app.dub.co/embed/loading.tsx
@@ -1,4 +1,4 @@
-import { LoadingSpinner } from "@dub/ui/src/icons";
+import { LoadingSpinner } from "@dub/ui/icons";
export default function EmbedLoading() {
return (
diff --git a/apps/web/app/app.dub.co/embed/widget/page-client.tsx b/apps/web/app/app.dub.co/embed/widget/page-client.tsx
index 18b8ff51fb7..86a64fc9aba 100644
--- a/apps/web/app/app.dub.co/embed/widget/page-client.tsx
+++ b/apps/web/app/app.dub.co/embed/widget/page-client.tsx
@@ -18,7 +18,7 @@ import {
LinkedIn,
QRCode,
Twitter,
-} from "@dub/ui/src/icons";
+} from "@dub/ui/icons";
import { cn, fetcher, getPrettyUrl } from "@dub/utils";
import { motion } from "framer-motion";
import { CSSProperties, useState } from "react";
diff --git a/apps/web/app/expired/[domain]/page.tsx b/apps/web/app/expired/[domain]/page.tsx
index 39e006a1726..69ac5fa9656 100644
--- a/apps/web/app/expired/[domain]/page.tsx
+++ b/apps/web/app/expired/[domain]/page.tsx
@@ -1,6 +1,6 @@
import { getDomainViaEdge } from "@/lib/planetscale/get-domain-via-edge";
import { Background, Footer, Nav, NavMobile } from "@dub/ui";
-import { CircleHalfDottedClock } from "@dub/ui/src/icons";
+import { CircleHalfDottedClock } from "@dub/ui/icons";
import { constructMetadata } from "@dub/utils";
import { redirect } from "next/navigation";
diff --git a/apps/web/app/partners.dub.co/(apply)/apply/[programSlug]/application/success/page.tsx b/apps/web/app/partners.dub.co/(apply)/apply/[programSlug]/application/success/page.tsx
index 5faf9800b72..4f634a77e83 100644
--- a/apps/web/app/partners.dub.co/(apply)/apply/[programSlug]/application/success/page.tsx
+++ b/apps/web/app/partners.dub.co/(apply)/apply/[programSlug]/application/success/page.tsx
@@ -1,7 +1,7 @@
import { getProgram } from "@/lib/fetchers/get-program";
import { prisma } from "@dub/prisma";
import { Logo } from "@dub/ui";
-import { BoltFill, CursorRays, LinesY, MoneyBills2 } from "@dub/ui/src/icons";
+import { BoltFill, CursorRays, LinesY, MoneyBills2 } from "@dub/ui/icons";
import { DICEBEAR_AVATAR_URL } from "@dub/utils";
import { subDays } from "date-fns";
import { Store } from "lucide-react";
diff --git a/apps/web/app/partners.dub.co/(apply)/apply/[programSlug]/details-grid.tsx b/apps/web/app/partners.dub.co/(apply)/apply/[programSlug]/details-grid.tsx
index dc14f36c2d0..c0a5f72e65f 100644
--- a/apps/web/app/partners.dub.co/(apply)/apply/[programSlug]/details-grid.tsx
+++ b/apps/web/app/partners.dub.co/(apply)/apply/[programSlug]/details-grid.tsx
@@ -1,5 +1,5 @@
import { Program } from "@dub/prisma/client";
-import { Calendar6, MoneyBills2 } from "@dub/ui/src/icons";
+import { Calendar6, MoneyBills2 } from "@dub/ui/icons";
import { cn, currencyFormatter } from "@dub/utils";
export function DetailsGrid({
diff --git a/apps/web/app/partners.dub.co/(auth)/page-client.tsx b/apps/web/app/partners.dub.co/(auth)/page-client.tsx
index b733b210d20..a12f2c2b071 100644
--- a/apps/web/app/partners.dub.co/(auth)/page-client.tsx
+++ b/apps/web/app/partners.dub.co/(auth)/page-client.tsx
@@ -1,7 +1,7 @@
"use client";
import { buttonVariants } from "@dub/ui";
-import { LinkedIn, Twitter } from "@dub/ui/src/icons";
+import { LinkedIn, Twitter } from "@dub/ui/icons";
import { cn } from "@dub/utils";
import Link from "next/link";
diff --git a/apps/web/app/partners.dub.co/(dashboard)/marketplace/page.tsx b/apps/web/app/partners.dub.co/(dashboard)/marketplace/page.tsx
index 6c813bb0a40..1e66f8167e6 100644
--- a/apps/web/app/partners.dub.co/(dashboard)/marketplace/page.tsx
+++ b/apps/web/app/partners.dub.co/(dashboard)/marketplace/page.tsx
@@ -1,7 +1,7 @@
import { PageContent } from "@/ui/layout/page-content";
import { AnimatedEmptyState } from "@/ui/shared/animated-empty-state";
import { MaxWidthWrapper } from "@dub/ui";
-import { Folder, Globe } from "@dub/ui/src/icons";
+import { Folder, Globe } from "@dub/ui/icons";
export default function MarketplacePage() {
return (
diff --git a/apps/web/app/partners.dub.co/(dashboard)/programs/[programSlug]/page-client.tsx b/apps/web/app/partners.dub.co/(dashboard)/programs/[programSlug]/page-client.tsx
index 19319dae27e..fef237563a6 100644
--- a/apps/web/app/partners.dub.co/(dashboard)/programs/[programSlug]/page-client.tsx
+++ b/apps/web/app/partners.dub.co/(dashboard)/programs/[programSlug]/page-client.tsx
@@ -3,11 +3,6 @@
import { IntervalOptions } from "@/lib/analytics/types";
import usePartnerAnalytics from "@/lib/swr/use-partner-analytics";
import useProgramEnrollment from "@/lib/swr/use-program-enrollment";
-import Areas from "@/ui/charts/areas";
-import { ChartContext } from "@/ui/charts/chart-context";
-import TimeSeriesChart from "@/ui/charts/time-series-chart";
-import XAxis from "@/ui/charts/x-axis";
-import YAxis from "@/ui/charts/y-axis";
import { HeroBackground } from "@/ui/partners/hero-background";
import { ProgramCommissionDescription } from "@/ui/partners/program-commission-description";
import SimpleDateRangePicker from "@/ui/shared/simple-date-range-picker";
@@ -19,7 +14,14 @@ import {
useCopyToClipboard,
useRouterStuff,
} from "@dub/ui";
-import { Check, Copy, LoadingSpinner, MoneyBill2 } from "@dub/ui/src/icons";
+import {
+ Areas,
+ ChartContext,
+ TimeSeriesChart,
+ XAxis,
+ YAxis,
+} from "@dub/ui/charts";
+import { Check, Copy, LoadingSpinner, MoneyBill2 } from "@dub/ui/icons";
import { cn, currencyFormatter, formatDate, getPrettyUrl } from "@dub/utils";
import NumberFlow, { NumberFlowGroup } from "@number-flow/react";
import { LinearGradient } from "@visx/gradient";
diff --git a/apps/web/app/partners.dub.co/(dashboard)/programs/[programSlug]/payouts/payout-table.tsx b/apps/web/app/partners.dub.co/(dashboard)/programs/[programSlug]/payouts/payout-table.tsx
index e6633f20a39..b912c880383 100644
--- a/apps/web/app/partners.dub.co/(dashboard)/programs/[programSlug]/payouts/payout-table.tsx
+++ b/apps/web/app/partners.dub.co/(dashboard)/programs/[programSlug]/payouts/payout-table.tsx
@@ -12,7 +12,7 @@ import {
useRouterStuff,
useTable,
} from "@dub/ui";
-import { MoneyBill2 } from "@dub/ui/src/icons";
+import { MoneyBill2 } from "@dub/ui/icons";
import { currencyFormatter, formatDate } from "@dub/utils";
import { fetcher } from "@dub/utils/src/functions/fetcher";
import { useEffect, useState } from "react";
diff --git a/apps/web/app/partners.dub.co/(dashboard)/programs/[programSlug]/payouts/payouts-settings-link.tsx b/apps/web/app/partners.dub.co/(dashboard)/programs/[programSlug]/payouts/payouts-settings-link.tsx
index f99cbc9a6c7..a5636b975ff 100644
--- a/apps/web/app/partners.dub.co/(dashboard)/programs/[programSlug]/payouts/payouts-settings-link.tsx
+++ b/apps/web/app/partners.dub.co/(dashboard)/programs/[programSlug]/payouts/payouts-settings-link.tsx
@@ -1,6 +1,6 @@
"use client";
import { buttonVariants } from "@dub/ui";
-import { Gear } from "@dub/ui/src/icons";
+import { Gear } from "@dub/ui/icons";
import { cn } from "@dub/utils";
import Link from "next/link";
diff --git a/apps/web/app/partners.dub.co/(dashboard)/programs/[programSlug]/resources/page-client.tsx b/apps/web/app/partners.dub.co/(dashboard)/programs/[programSlug]/resources/page-client.tsx
index 05a25615df5..bc61e681884 100644
--- a/apps/web/app/partners.dub.co/(dashboard)/programs/[programSlug]/resources/page-client.tsx
+++ b/apps/web/app/partners.dub.co/(dashboard)/programs/[programSlug]/resources/page-client.tsx
@@ -2,7 +2,7 @@
import { AnimatedEmptyState } from "@/ui/shared/animated-empty-state";
import { MaxWidthWrapper } from "@dub/ui";
-import { FileZip2, Palette2, Post } from "@dub/ui/src/icons";
+import { FileZip2, Palette2, Post } from "@dub/ui/icons";
const emptyStateIcons = [Post, Palette2, FileZip2];
diff --git a/apps/web/app/partners.dub.co/(dashboard)/programs/[programSlug]/sales/sale-table.tsx b/apps/web/app/partners.dub.co/(dashboard)/programs/[programSlug]/sales/sale-table.tsx
index 5fe931b7485..5bfef912653 100644
--- a/apps/web/app/partners.dub.co/(dashboard)/programs/[programSlug]/sales/sale-table.tsx
+++ b/apps/web/app/partners.dub.co/(dashboard)/programs/[programSlug]/sales/sale-table.tsx
@@ -12,7 +12,7 @@ import {
useRouterStuff,
useTable,
} from "@dub/ui";
-import { CircleDollar } from "@dub/ui/src/icons";
+import { CircleDollar } from "@dub/ui/icons";
import { currencyFormatter, fetcher, formatDate } from "@dub/utils";
import useSWR from "swr";
diff --git a/apps/web/app/partners.dub.co/(dashboard)/programs/page-client.tsx b/apps/web/app/partners.dub.co/(dashboard)/programs/page-client.tsx
index 0349f5e989b..20222fbd701 100644
--- a/apps/web/app/partners.dub.co/(dashboard)/programs/page-client.tsx
+++ b/apps/web/app/partners.dub.co/(dashboard)/programs/page-client.tsx
@@ -6,7 +6,7 @@ import { ProgramCard, ProgramCardSkeleton } from "@/ui/partners/program-card";
import { ProgramInviteCard } from "@/ui/partners/program-invite-card";
import { AnimatedEmptyState } from "@/ui/shared/animated-empty-state";
import { MaxWidthWrapper } from "@dub/ui";
-import { CircleDollar, GridIcon } from "@dub/ui/src/icons";
+import { CircleDollar, GridIcon } from "@dub/ui/icons";
export function PartnersDashboardPageClient() {
const { programEnrollments, isLoading } = useProgramEnrollments();
diff --git a/apps/web/app/partners.dub.co/(dashboard)/settings/wallet/page-client.tsx b/apps/web/app/partners.dub.co/(dashboard)/settings/wallet/page-client.tsx
index f499ddf3016..73be6e794f1 100644
--- a/apps/web/app/partners.dub.co/(dashboard)/settings/wallet/page-client.tsx
+++ b/apps/web/app/partners.dub.co/(dashboard)/settings/wallet/page-client.tsx
@@ -9,7 +9,7 @@ import { usePayoutWithdrawSheet } from "@/ui/partners/payout-withdraw-sheet";
import { AnimatedEmptyState } from "@/ui/shared/animated-empty-state";
import { CheckCircleFill, X } from "@/ui/shared/icons";
import { Button, Modal, Note, SimpleTooltipContent, Tooltip } from "@dub/ui";
-import { GiftFill, GreekTemple, MobilePhone } from "@dub/ui/src/icons";
+import { GiftFill, GreekTemple, MobilePhone } from "@dub/ui/icons";
import {
cn,
currencyFormatter,
diff --git a/apps/web/app/partners.dub.co/(onboarding)/onboarding/page.tsx b/apps/web/app/partners.dub.co/(onboarding)/onboarding/page.tsx
index badb512597a..e660df5eb99 100644
--- a/apps/web/app/partners.dub.co/(onboarding)/onboarding/page.tsx
+++ b/apps/web/app/partners.dub.co/(onboarding)/onboarding/page.tsx
@@ -1,4 +1,4 @@
-import { ConnectedDots4 } from "@dub/ui/src/icons";
+import { ConnectedDots4 } from "@dub/ui/icons";
import { OnboardingForm } from "./onboarding-form";
export default function Onboarding() {
diff --git a/apps/web/app/partners.dub.co/(onboarding)/onboarding/verify/page.tsx b/apps/web/app/partners.dub.co/(onboarding)/onboarding/verify/page.tsx
index eb1e5e5c7dd..3806292c9ff 100644
--- a/apps/web/app/partners.dub.co/(onboarding)/onboarding/verify/page.tsx
+++ b/apps/web/app/partners.dub.co/(onboarding)/onboarding/verify/page.tsx
@@ -1,4 +1,4 @@
-import { ConnectedDots4 } from "@dub/ui/src/icons";
+import { ConnectedDots4 } from "@dub/ui/icons";
import { VerificationForm } from "./verification-form";
export default function OnboardingVerify() {
diff --git a/apps/web/app/partners.dub.co/(onboarding)/onboarding/verify/verification-form.tsx b/apps/web/app/partners.dub.co/(onboarding)/onboarding/verify/verification-form.tsx
index ce5a693fe66..51571ec465d 100644
--- a/apps/web/app/partners.dub.co/(onboarding)/onboarding/verify/verification-form.tsx
+++ b/apps/web/app/partners.dub.co/(onboarding)/onboarding/verify/verification-form.tsx
@@ -5,7 +5,7 @@ import { verifyPartnerAction } from "@/lib/actions/partners/verify-partner";
import useDotsUser from "@/lib/swr/use-dots-user";
import useRefreshSession from "@/lib/swr/use-refresh-session";
import { Button, LoadingSpinner, useMediaQuery } from "@dub/ui";
-import { MobilePhone } from "@dub/ui/src/icons";
+import { MobilePhone } from "@dub/ui/icons";
import { cn } from "@dub/utils/src/functions";
import { OTPInput } from "input-otp";
import { useAction } from "next-safe-action/hooks";
diff --git a/apps/web/package.json b/apps/web/package.json
index e73225da9b7..2e8ed638156 100644
--- a/apps/web/package.json
+++ b/apps/web/package.json
@@ -43,10 +43,7 @@
"@vercel/edge-config": "^0.4.1",
"@vercel/functions": "^1.4.2",
"@vercel/og": "^0.6.3",
- "@visx/axis": "^2.14.0",
- "@visx/clip-path": "^3.3.0",
"@visx/curve": "^3.3.0",
- "@visx/event": "^2.6.0",
"@visx/geo": "^2.10.0",
"@visx/gradient": "^3.3.0",
"@visx/grid": "^2.12.2",
@@ -55,7 +52,6 @@
"@visx/scale": "^3.3.0",
"@visx/shape": "^2.12.2",
"@visx/text": "^3.3.0",
- "@visx/tooltip": "^2.16.0",
"ai": "^3.4.8",
"aws4fetch": "^1.0.19",
"bcryptjs": "^2.4.3",
@@ -64,7 +60,6 @@
"cobe": "^0.6.3",
"concurrently": "^8.0.1",
"csv-parse": "^5.5.6",
- "d3-array": "^3.2.4",
"date-fns": "^3.6.0",
"dub": "^0.46.1",
"framer-motion": "^10.16.16",
diff --git a/apps/web/ui/analytics/analytics-area-chart.tsx b/apps/web/ui/analytics/analytics-area-chart.tsx
index 0cb240f7bd4..da364bf8c46 100644
--- a/apps/web/ui/analytics/analytics-area-chart.tsx
+++ b/apps/web/ui/analytics/analytics-area-chart.tsx
@@ -1,12 +1,9 @@
import { EventType } from "@/lib/analytics/types";
import { editQueryString } from "@/lib/analytics/utils";
+import { Areas, TimeSeriesChart, XAxis, YAxis } from "@dub/ui/charts";
import { cn, fetcher, getDaysDifference, nFormatter } from "@dub/utils";
import { Fragment, useCallback, useContext, useMemo } from "react";
import useSWR from "swr";
-import Areas from "../charts/areas";
-import TimeSeriesChart from "../charts/time-series-chart";
-import XAxis from "../charts/x-axis";
-import YAxis from "../charts/y-axis";
import { AnalyticsLoadingSpinner } from "./analytics-loading-spinner";
import { AnalyticsContext } from "./analytics-provider";
diff --git a/apps/web/ui/analytics/analytics-card.tsx b/apps/web/ui/analytics/analytics-card.tsx
index 85e5efc6913..774a64bf406 100644
--- a/apps/web/ui/analytics/analytics-card.tsx
+++ b/apps/web/ui/analytics/analytics-card.tsx
@@ -1,6 +1,6 @@
import { EventType } from "@/lib/analytics/types";
import { Button, Modal, Popover, TabSelect, useMediaQuery } from "@dub/ui";
-import { CursorRays, InvoiceDollar, UserCheck } from "@dub/ui/src/icons";
+import { CursorRays, InvoiceDollar, UserCheck } from "@dub/ui/icons";
import { cn } from "@dub/utils";
import { ChevronsUpDown } from "lucide-react";
import {
diff --git a/apps/web/ui/analytics/analytics-funnel-chart.tsx b/apps/web/ui/analytics/analytics-funnel-chart.tsx
index c0ef3830aaa..486f2b03c56 100644
--- a/apps/web/ui/analytics/analytics-funnel-chart.tsx
+++ b/apps/web/ui/analytics/analytics-funnel-chart.tsx
@@ -1,243 +1,45 @@
-import { useMediaQuery } from "@dub/ui";
-import { cn, nFormatter } from "@dub/utils";
-import { curveBasis } from "@visx/curve";
-import { ParentSize } from "@visx/responsive";
-import { scaleLinear } from "@visx/scale";
-import { Area } from "@visx/shape";
-import { Text } from "@visx/text";
-import { motion } from "framer-motion";
-import { Fragment, useCallback, useContext, useMemo, useState } from "react";
+import { FunnelChart } from "@dub/ui/charts";
+import { useContext, useMemo } from "react";
import { AnalyticsLoadingSpinner } from "./analytics-loading-spinner";
import { AnalyticsContext } from "./analytics-provider";
-const steps = [
- {
- id: "clicks",
- label: "Clicks",
- colorClassName: "text-blue-600",
- },
- {
- id: "leads",
- label: "Leads",
- colorClassName: "text-violet-600",
- },
- {
- id: "sales",
- label: "Sales",
- colorClassName: "text-teal-400",
- },
-];
-
-const layers = [
- {
- opacity: 1,
- padding: 0,
- },
- {
- opacity: 0.3,
- padding: 8,
- },
- {
- opacity: 0.15,
- padding: 16,
- },
-];
-
-const maxLayerPadding = 16;
-const chartPadding = 40;
-
export function AnalyticsFunnelChart() {
- return (
- // p-5 pt-10 sm:p-10
-
-
- {({ width, height }) =>
- width && height ? (
-
- ) : null
- }
-
-
- );
-}
-
-export function AnalyticsFunnelChartInner({
- width,
- height,
-}: {
- width: number;
- height: number;
-}) {
const { totalEvents } = useContext(AnalyticsContext);
- const { isMobile } = useMediaQuery();
-
- const [tooltip, setTooltip] = useState(null);
- const tooltipStep = steps.find(({ id }) => id === tooltip);
-
- const stepValue = useCallback(
- (step: string) => totalEvents?.[step] ?? 0,
+ const steps = useMemo(
+ () => [
+ {
+ id: "clicks",
+ label: "Clicks",
+ value: totalEvents?.clicks ?? 0,
+ colorClassName: "text-blue-600",
+ },
+ {
+ id: "leads",
+ label: "Leads",
+ value: totalEvents?.leads ?? 0,
+ colorClassName: "text-violet-600",
+ },
+ {
+ id: "sales",
+ label: "Sales",
+ value: totalEvents?.sales ?? 0,
+ additionalValue: totalEvents?.saleAmount ?? 0,
+ colorClassName: "text-teal-400",
+ },
+ ],
[totalEvents],
);
- const data = useMemo(() => {
- return Object.fromEntries(
- steps.map(({ id }, idx) => {
- const current = stepValue(id);
- const next = stepValue(
- steps[idx + 1]?.id ?? steps[steps.length - 1].id,
- );
- return [id, interpolate(current, next)];
- }),
- );
- }, [stepValue]);
-
- const zeroData = useMemo(() => interpolate(0, 0), [steps]);
-
- const maxValue = useMemo(
- () => Math.max(...steps.map((step) => stepValue(step.id))),
- [stepValue],
- );
-
- const xScale = scaleLinear({
- domain: [0, steps.length],
- range: [0, width],
- });
-
- const yScale = scaleLinear({
- domain: [maxValue, -maxValue],
- range: [
- height - maxLayerPadding - chartPadding,
- maxLayerPadding + chartPadding,
- ],
- });
-
- return totalEvents ? (
-
-
- {tooltipStep && (
-
id === tooltipStep.id)),
- width: width / steps.length,
- }}
- >
-
-
- {tooltipStep.label}
-
-
-
-
-
- {formatPercentage(
- (stepValue(tooltipStep.id) / maxValue) * 100,
- ) + "%"}
-
-
-
- {nFormatter(stepValue(tooltipStep.id), { full: true })}
- {tooltipStep.id === "sales" && (
-
- {" "}
- (${nFormatter(totalEvents.saleAmount / 100)})
-
- )}
-
-
-
+ return (
+
+ {totalEvents ? (
+
+ ) : (
+
)}
- ) : (
-
);
}
-
-const formatPercentage = (value: number) => {
- return value > 0 && value < 0.01
- ? "< 0.01"
- : nFormatter(value, { digits: 2 });
-};
-
-const interpolate = (from: number, to: number) => [
- { x: 0, y: from },
- { x: 0.3, y: from },
- { x: 0.5, y: (from + to) / 2 },
- { x: 0.7, y: to },
- { x: 1, y: to },
-];
diff --git a/apps/web/ui/analytics/continent-icon.tsx b/apps/web/ui/analytics/continent-icon.tsx
index d4c28f752dc..f1886ae0614 100644
--- a/apps/web/ui/analytics/continent-icon.tsx
+++ b/apps/web/ui/analytics/continent-icon.tsx
@@ -6,7 +6,7 @@ import {
NorthAmerica,
Oceania,
SouthAmerica,
-} from "@dub/ui/src/icons";
+} from "@dub/ui/icons";
export default function ContinentIcon({
display,
diff --git a/apps/web/ui/analytics/device-icon.tsx b/apps/web/ui/analytics/device-icon.tsx
index 6fc0bd03d92..0512322d327 100644
--- a/apps/web/ui/analytics/device-icon.tsx
+++ b/apps/web/ui/analytics/device-icon.tsx
@@ -10,7 +10,7 @@ import {
TV,
Tablet,
Watch,
-} from "@dub/ui/src/icons";
+} from "@dub/ui/icons";
export default function DeviceIcon({
display,
diff --git a/apps/web/ui/analytics/devices.tsx b/apps/web/ui/analytics/devices.tsx
index d16663df923..9dd5962480b 100644
--- a/apps/web/ui/analytics/devices.tsx
+++ b/apps/web/ui/analytics/devices.tsx
@@ -4,7 +4,7 @@ import {
} from "@/lib/analytics/constants";
import { DeviceTabs } from "@/lib/analytics/types";
import { useRouterStuff } from "@dub/ui";
-import { Cube, CursorRays, MobilePhone, Window } from "@dub/ui/src/icons";
+import { Cube, CursorRays, MobilePhone, Window } from "@dub/ui/icons";
import { useContext, useState } from "react";
import { AnalyticsCard } from "./analytics-card";
import { AnalyticsLoadingSpinner } from "./analytics-loading-spinner";
diff --git a/apps/web/ui/analytics/events/events-table.tsx b/apps/web/ui/analytics/events/events-table.tsx
index 008f6705afa..41fc206e42a 100644
--- a/apps/web/ui/analytics/events/events-table.tsx
+++ b/apps/web/ui/analytics/events/events-table.tsx
@@ -17,7 +17,7 @@ import {
useRouterStuff,
useTable,
} from "@dub/ui";
-import { CursorRays, Globe, Magnifier, QRCode } from "@dub/ui/src/icons";
+import { CursorRays, Globe, Magnifier, QRCode } from "@dub/ui/icons";
import {
CONTINENTS,
COUNTRIES,
diff --git a/apps/web/ui/analytics/events/filter-button.tsx b/apps/web/ui/analytics/events/filter-button.tsx
index 1a6c7d437ef..d745f32fbf6 100644
--- a/apps/web/ui/analytics/events/filter-button.tsx
+++ b/apps/web/ui/analytics/events/filter-button.tsx
@@ -1,5 +1,5 @@
import { useRouterStuff } from "@dub/ui";
-import { FilterBars } from "@dub/ui/src/icons";
+import { FilterBars } from "@dub/ui/icons";
import Link from "next/link";
export default function FilterButton({ set }: { set: Record
}) {
diff --git a/apps/web/ui/analytics/events/index.tsx b/apps/web/ui/analytics/events/index.tsx
index 6d33b9341d9..82a7a9a762c 100644
--- a/apps/web/ui/analytics/events/index.tsx
+++ b/apps/web/ui/analytics/events/index.tsx
@@ -2,7 +2,7 @@
import useWorkspace from "@/lib/swr/use-workspace";
import EmptyState from "@/ui/shared/empty-state";
-import { Menu3 } from "@dub/ui/src/icons";
+import { Menu3 } from "@dub/ui/icons";
import { useContext } from "react";
import AnalyticsProvider, { AnalyticsContext } from "../analytics-provider";
import Toggle from "../toggle";
diff --git a/apps/web/ui/analytics/events/row-menu-button.tsx b/apps/web/ui/analytics/events/row-menu-button.tsx
index 24655a57abb..d6046a4485a 100644
--- a/apps/web/ui/analytics/events/row-menu-button.tsx
+++ b/apps/web/ui/analytics/events/row-menu-button.tsx
@@ -1,5 +1,5 @@
import { Button, Icon, Popover, useCopyToClipboard } from "@dub/ui";
-import { Copy, Dots } from "@dub/ui/src/icons";
+import { Copy, Dots } from "@dub/ui/icons";
import { cn } from "@dub/utils";
import { Row } from "@tanstack/react-table";
import { Command } from "cmdk";
diff --git a/apps/web/ui/analytics/export-button.tsx b/apps/web/ui/analytics/export-button.tsx
index b4d8b6a7f54..24d1cca62b3 100644
--- a/apps/web/ui/analytics/export-button.tsx
+++ b/apps/web/ui/analytics/export-button.tsx
@@ -1,5 +1,5 @@
import { Button } from "@dub/ui";
-import { Download } from "@dub/ui/src/icons";
+import { Download } from "@dub/ui/icons";
import { Dispatch, SetStateAction, useContext, useState } from "react";
import { toast } from "sonner";
import { AnalyticsContext } from "./analytics-provider";
diff --git a/apps/web/ui/analytics/link-preview.tsx b/apps/web/ui/analytics/link-preview.tsx
index 8f651b10f56..fcaad2e5908 100644
--- a/apps/web/ui/analytics/link-preview.tsx
+++ b/apps/web/ui/analytics/link-preview.tsx
@@ -1,6 +1,6 @@
import { LinkProps } from "@/lib/types";
import { CopyButton, LinkLogo } from "@dub/ui";
-import { ArrowTurnRight2 } from "@dub/ui/src/icons";
+import { ArrowTurnRight2 } from "@dub/ui/icons";
import { getApexDomain, getPrettyUrl, linkConstructor } from "@dub/utils";
export default function LinkPreviewTooltip({ data }: { data: LinkProps }) {
diff --git a/apps/web/ui/analytics/locations.tsx b/apps/web/ui/analytics/locations.tsx
index 22d0df4d525..e20540a7310 100644
--- a/apps/web/ui/analytics/locations.tsx
+++ b/apps/web/ui/analytics/locations.tsx
@@ -5,7 +5,7 @@ import {
LocationPin,
MapPosition,
OfficeBuilding,
-} from "@dub/ui/src/icons";
+} from "@dub/ui/icons";
import { CONTINENTS, COUNTRIES, REGIONS } from "@dub/utils";
import { useContext, useState } from "react";
import { AnalyticsCard } from "./analytics-card";
diff --git a/apps/web/ui/analytics/main.tsx b/apps/web/ui/analytics/main.tsx
index e011bc27818..6d348a70149 100644
--- a/apps/web/ui/analytics/main.tsx
+++ b/apps/web/ui/analytics/main.tsx
@@ -1,6 +1,6 @@
import { EventType } from "@/lib/analytics/types";
import { Button, Tooltip, useRouterStuff } from "@dub/ui";
-import { ChartLine, Filter2 } from "@dub/ui/src/icons";
+import { ChartLine, Filter2 } from "@dub/ui/icons";
import { cn } from "@dub/utils";
import NumberFlow, { NumberFlowGroup } from "@number-flow/react";
import { ChevronRight, Lock } from "lucide-react";
diff --git a/apps/web/ui/analytics/referer.tsx b/apps/web/ui/analytics/referer.tsx
index e122eb98054..ab29b6ac229 100644
--- a/apps/web/ui/analytics/referer.tsx
+++ b/apps/web/ui/analytics/referer.tsx
@@ -1,6 +1,6 @@
import { SINGULAR_ANALYTICS_ENDPOINTS } from "@/lib/analytics/constants";
import { BlurImage, useRouterStuff } from "@dub/ui";
-import { ReferredVia } from "@dub/ui/src/icons";
+import { ReferredVia } from "@dub/ui/icons";
import { getApexDomain, GOOGLE_FAVICON_URL } from "@dub/utils";
import { Link2 } from "lucide-react";
import { useContext, useState } from "react";
diff --git a/apps/web/ui/analytics/toggle.tsx b/apps/web/ui/analytics/toggle.tsx
index 04126877246..5f4f053f0ae 100644
--- a/apps/web/ui/analytics/toggle.tsx
+++ b/apps/web/ui/analytics/toggle.tsx
@@ -45,7 +45,7 @@ import {
ReferredVia,
Tag,
Window,
-} from "@dub/ui/src/icons";
+} from "@dub/ui/icons";
import {
APP_DOMAIN,
CONTINENTS,
diff --git a/apps/web/ui/analytics/top-links.tsx b/apps/web/ui/analytics/top-links.tsx
index 0263e8d91b6..cf2c5908a20 100644
--- a/apps/web/ui/analytics/top-links.tsx
+++ b/apps/web/ui/analytics/top-links.tsx
@@ -1,5 +1,5 @@
import { LinkLogo, useRouterStuff } from "@dub/ui";
-import { Globe, Hyperlink } from "@dub/ui/src/icons";
+import { Globe, Hyperlink } from "@dub/ui/icons";
import { getApexDomain } from "@dub/utils";
import { useContext, useState } from "react";
import { AnalyticsCard } from "./analytics-card";
diff --git a/apps/web/ui/auth/login/email-sign-in.tsx b/apps/web/ui/auth/login/email-sign-in.tsx
index 136c46c2ea6..d8709445eae 100644
--- a/apps/web/ui/auth/login/email-sign-in.tsx
+++ b/apps/web/ui/auth/login/email-sign-in.tsx
@@ -1,6 +1,6 @@
import { emailSchema } from "@/lib/zod/schemas/auth";
import { Button, Input, useMediaQuery } from "@dub/ui";
-import { InputPassword } from "@dub/ui/src/icons";
+import { InputPassword } from "@dub/ui/icons";
import { cn } from "@dub/utils";
import { Mail } from "lucide-react";
import { signIn } from "next-auth/react";
diff --git a/apps/web/ui/auth/login/google-button.tsx b/apps/web/ui/auth/login/google-button.tsx
index cedd04caa9f..108eba1b1c8 100644
--- a/apps/web/ui/auth/login/google-button.tsx
+++ b/apps/web/ui/auth/login/google-button.tsx
@@ -1,5 +1,5 @@
import { Button } from "@dub/ui";
-import { Google } from "@dub/ui/src/icons";
+import { Google } from "@dub/ui/icons";
import { signIn } from "next-auth/react";
import { useSearchParams } from "next/navigation";
import { useContext } from "react";
diff --git a/apps/web/ui/domains/domain-card-title-column.tsx b/apps/web/ui/domains/domain-card-title-column.tsx
index 1343339f98b..40550963376 100644
--- a/apps/web/ui/domains/domain-card-title-column.tsx
+++ b/apps/web/ui/domains/domain-card-title-column.tsx
@@ -1,4 +1,4 @@
-import { ArrowTurnRight2, Flag2, Globe } from "@dub/ui/src/icons";
+import { ArrowTurnRight2, Flag2, Globe } from "@dub/ui/icons";
import { cn, getPrettyUrl, punycode } from "@dub/utils";
import { Star } from "lucide-react";
diff --git a/apps/web/ui/domains/domain-card.tsx b/apps/web/ui/domains/domain-card.tsx
index a4ab8b8b647..af247ccd438 100644
--- a/apps/web/ui/domains/domain-card.tsx
+++ b/apps/web/ui/domains/domain-card.tsx
@@ -28,7 +28,7 @@ import {
Globe,
Hyperlink,
PenWriting,
-} from "@dub/ui/src/icons";
+} from "@dub/ui/icons";
import { cn, DEFAULT_LINK_PROPS, fetcher, nFormatter } from "@dub/utils";
import { motion } from "framer-motion";
import { Archive, ChevronDown, FolderInput, QrCode } from "lucide-react";
diff --git a/apps/web/ui/domains/free-dot-link-banner.tsx b/apps/web/ui/domains/free-dot-link-banner.tsx
index a0fc6c415b1..4d48cd76edb 100644
--- a/apps/web/ui/domains/free-dot-link-banner.tsx
+++ b/apps/web/ui/domains/free-dot-link-banner.tsx
@@ -1,6 +1,6 @@
import useWorkspace from "@/lib/swr/use-workspace";
import { Grid, useLocalStorage } from "@dub/ui";
-import { LinkBroken } from "@dub/ui/src/icons";
+import { LinkBroken } from "@dub/ui/icons";
import { useRegisterDomainModal } from "../modals/register-domain-modal";
import { X } from "../shared/icons";
diff --git a/apps/web/ui/domains/register-domain-form.tsx b/apps/web/ui/domains/register-domain-form.tsx
index d7649f601a9..b3e5b8c2a53 100644
--- a/apps/web/ui/domains/register-domain-form.tsx
+++ b/apps/web/ui/domains/register-domain-form.tsx
@@ -7,7 +7,7 @@ import {
TooltipContent,
useMediaQuery,
} from "@dub/ui";
-import { LoadingSpinner } from "@dub/ui/src/icons";
+import { LoadingSpinner } from "@dub/ui/icons";
import { cn, truncate } from "@dub/utils";
import { CircleCheck, Star } from "lucide-react";
import Link from "next/link";
diff --git a/apps/web/ui/dots/platforms.tsx b/apps/web/ui/dots/platforms.tsx
index cf9e0c25aba..4257d7e83b8 100644
--- a/apps/web/ui/dots/platforms.tsx
+++ b/apps/web/ui/dots/platforms.tsx
@@ -6,7 +6,7 @@ import {
Payoneer,
Paypal,
Venmo,
-} from "@dub/ui/src/icons";
+} from "@dub/ui/icons";
export const DOTS_PAYOUT_PLATFORMS = [
{
diff --git a/apps/web/ui/integrations/integration-card.tsx b/apps/web/ui/integrations/integration-card.tsx
index 99e9db65fc1..25c45ec0382 100644
--- a/apps/web/ui/integrations/integration-card.tsx
+++ b/apps/web/ui/integrations/integration-card.tsx
@@ -9,7 +9,7 @@ import {
Download,
OfficeBuilding,
ShieldCheck,
-} from "@dub/ui/src/icons";
+} from "@dub/ui/icons";
import { pluralize } from "@dub/utils";
import Link from "next/link";
diff --git a/apps/web/ui/layout/sidebar/app-sidebar-nav.tsx b/apps/web/ui/layout/sidebar/app-sidebar-nav.tsx
index ec13a0330c7..6692bf86652 100644
--- a/apps/web/ui/layout/sidebar/app-sidebar-nav.tsx
+++ b/apps/web/ui/layout/sidebar/app-sidebar-nav.tsx
@@ -19,7 +19,7 @@ import {
ShieldCheck,
Users6,
Webhook,
-} from "@dub/ui/src/icons";
+} from "@dub/ui/icons";
import { Session } from "next-auth";
import { useSession } from "next-auth/react";
import { useParams, usePathname } from "next/navigation";
diff --git a/apps/web/ui/layout/sidebar/partner-program-dropdown.tsx b/apps/web/ui/layout/sidebar/partner-program-dropdown.tsx
index 0f7b156297e..9f1800bcd9d 100644
--- a/apps/web/ui/layout/sidebar/partner-program-dropdown.tsx
+++ b/apps/web/ui/layout/sidebar/partner-program-dropdown.tsx
@@ -4,7 +4,7 @@ import usePartnerProfile from "@/lib/swr/use-partner-profile";
import useProgramEnrollments from "@/lib/swr/use-program-enrollments";
import { PartnerProps, ProgramProps } from "@/lib/types";
import { BlurImage, Popover, useScrollProgress } from "@dub/ui";
-import { Check2, Gear } from "@dub/ui/src/icons";
+import { Check2, Gear } from "@dub/ui/icons";
import { cn, DICEBEAR_AVATAR_URL } from "@dub/utils";
import { ChevronsUpDown } from "lucide-react";
import Link from "next/link";
diff --git a/apps/web/ui/layout/sidebar/partners-sidebar-nav.tsx b/apps/web/ui/layout/sidebar/partners-sidebar-nav.tsx
index 7a657c9b340..7bf0774d58b 100644
--- a/apps/web/ui/layout/sidebar/partners-sidebar-nav.tsx
+++ b/apps/web/ui/layout/sidebar/partners-sidebar-nav.tsx
@@ -20,7 +20,7 @@ import {
User,
UserCheck,
Users,
-} from "@dub/ui/src/icons";
+} from "@dub/ui/icons";
import { cn, currencyFormatter } from "@dub/utils";
import { Store } from "lucide-react";
import Link from "next/link";
diff --git a/apps/web/ui/layout/sidebar/refer-button.tsx b/apps/web/ui/layout/sidebar/refer-button.tsx
index 648f0d1804c..f9d0a9d2ff9 100644
--- a/apps/web/ui/layout/sidebar/refer-button.tsx
+++ b/apps/web/ui/layout/sidebar/refer-button.tsx
@@ -1,7 +1,7 @@
"use client";
import { DubWidget } from "@dub/embed-react";
-import { Gift } from "@dub/ui/src/icons";
+import { Gift } from "@dub/ui/icons";
import { cn, fetcher } from "@dub/utils";
import { AnimatePresence, motion } from "framer-motion";
import useSWRImmutable from "swr/immutable";
diff --git a/apps/web/ui/layout/sidebar/usage.tsx b/apps/web/ui/layout/sidebar/usage.tsx
index 7e4cc2b0f35..ff3084c67bb 100644
--- a/apps/web/ui/layout/sidebar/usage.tsx
+++ b/apps/web/ui/layout/sidebar/usage.tsx
@@ -3,7 +3,7 @@
import useWorkspace from "@/lib/swr/use-workspace";
import ManageSubscriptionButton from "@/ui/workspaces/manage-subscription-button";
import { AnimatedSizeContainer, Icon, buttonVariants } from "@dub/ui";
-import { CursorRays, Hyperlink } from "@dub/ui/src/icons";
+import { CursorRays, Hyperlink } from "@dub/ui/icons";
import { cn, getFirstAndLastDay, getNextPlan, nFormatter } from "@dub/utils";
import { AnimatePresence, motion } from "framer-motion";
import { ChevronRight } from "lucide-react";
diff --git a/apps/web/ui/layout/sidebar/workspace-dropdown.tsx b/apps/web/ui/layout/sidebar/workspace-dropdown.tsx
index d36fb01f337..cd73769b0fc 100644
--- a/apps/web/ui/layout/sidebar/workspace-dropdown.tsx
+++ b/apps/web/ui/layout/sidebar/workspace-dropdown.tsx
@@ -9,7 +9,7 @@ import {
Popover,
useScrollProgress,
} from "@dub/ui";
-import { Book2, Check2, Plus } from "@dub/ui/src/icons";
+import { Book2, Check2, Plus } from "@dub/ui/icons";
import { cn, DICEBEAR_AVATAR_URL } from "@dub/utils";
import { ChevronsUpDown, HelpCircle } from "lucide-react";
import { useSession } from "next-auth/react";
diff --git a/apps/web/ui/layout/toolbar/onboarding/onboarding-button.tsx b/apps/web/ui/layout/toolbar/onboarding/onboarding-button.tsx
index 82d4807b71e..9e774a05b69 100644
--- a/apps/web/ui/layout/toolbar/onboarding/onboarding-button.tsx
+++ b/apps/web/ui/layout/toolbar/onboarding/onboarding-button.tsx
@@ -5,7 +5,7 @@ import useLinksCount from "@/lib/swr/use-links-count";
import useUsers from "@/lib/swr/use-users";
import { CheckCircleFill, ThreeDots } from "@/ui/shared/icons";
import { Button, Popover, useLocalStorage, useMediaQuery } from "@dub/ui";
-import { CircleDotted, ExpandingArrow } from "@dub/ui/src/icons";
+import { CircleDotted, ExpandingArrow } from "@dub/ui/icons";
import { ChevronDown } from "lucide-react";
import Link from "next/link";
import { useParams } from "next/navigation";
diff --git a/apps/web/ui/layout/user-survey/survey-form.tsx b/apps/web/ui/layout/user-survey/survey-form.tsx
index 1e42e4b87b5..dca17bda335 100644
--- a/apps/web/ui/layout/user-survey/survey-form.tsx
+++ b/apps/web/ui/layout/user-survey/survey-form.tsx
@@ -11,7 +11,7 @@ import {
useMediaQuery,
Wordmark,
} from "@dub/ui";
-import { Globe } from "@dub/ui/src/icons";
+import { Globe } from "@dub/ui/icons";
import { cn } from "@dub/utils";
import { ChevronRight } from "lucide-react";
import { useContext, useState } from "react";
diff --git a/apps/web/ui/links/archived-links-hint.tsx b/apps/web/ui/links/archived-links-hint.tsx
index 6530150f137..2c76592a86a 100644
--- a/apps/web/ui/links/archived-links-hint.tsx
+++ b/apps/web/ui/links/archived-links-hint.tsx
@@ -1,6 +1,6 @@
import useLinksCount from "@/lib/swr/use-links-count";
import { Button, Tooltip } from "@dub/ui";
-import { BoxArchive } from "@dub/ui/src/icons";
+import { BoxArchive } from "@dub/ui/icons";
import { pluralize } from "@dub/utils";
import { useSearchParams } from "next/navigation";
import { useContext } from "react";
diff --git a/apps/web/ui/links/link-controls.tsx b/apps/web/ui/links/link-controls.tsx
index 884b4e29e16..6673d2197b9 100644
--- a/apps/web/ui/links/link-controls.tsx
+++ b/apps/web/ui/links/link-controls.tsx
@@ -10,7 +10,7 @@ import {
useCopyToClipboard,
useKeyboardShortcut,
} from "@dub/ui";
-import { BoxArchive, CircleCheck, Copy, QRCode } from "@dub/ui/src/icons";
+import { BoxArchive, CircleCheck, Copy, QRCode } from "@dub/ui/icons";
import { cn, isDubDomain, nanoid, punycode } from "@dub/utils";
import { CopyPlus, Delete, FolderInput } from "lucide-react";
import { useParams } from "next/navigation";
diff --git a/apps/web/ui/links/link-details-column.tsx b/apps/web/ui/links/link-details-column.tsx
index 7f1203e892f..fd0a16f39af 100644
--- a/apps/web/ui/links/link-details-column.tsx
+++ b/apps/web/ui/links/link-details-column.tsx
@@ -11,7 +11,7 @@ import {
UserCheck,
useRouterStuff,
} from "@dub/ui";
-import { ReferredVia } from "@dub/ui/src/icons";
+import { ReferredVia } from "@dub/ui/icons";
import {
APP_DOMAIN,
cn,
diff --git a/apps/web/ui/links/link-display.tsx b/apps/web/ui/links/link-display.tsx
index ef61a51138e..eff4b5a8883 100644
--- a/apps/web/ui/links/link-display.tsx
+++ b/apps/web/ui/links/link-display.tsx
@@ -11,7 +11,7 @@ import {
GridLayoutRows,
Sliders,
TableRows2,
-} from "@dub/ui/src/icons";
+} from "@dub/ui/icons";
import { cn } from "@dub/utils";
import { AnimatePresence, motion } from "framer-motion";
import { ChevronDown } from "lucide-react";
diff --git a/apps/web/ui/links/link-title-column.tsx b/apps/web/ui/links/link-title-column.tsx
index 5a7433875e0..9b39123e80b 100644
--- a/apps/web/ui/links/link-title-column.tsx
+++ b/apps/web/ui/links/link-title-column.tsx
@@ -24,7 +24,7 @@ import {
InputPassword,
Page2,
Robot,
-} from "@dub/ui/src/icons";
+} from "@dub/ui/icons";
import {
cn,
fetcher,
diff --git a/apps/web/ui/links/links-container.tsx b/apps/web/ui/links/links-container.tsx
index 8189c5c0654..b8f2f6bc4cc 100644
--- a/apps/web/ui/links/links-container.tsx
+++ b/apps/web/ui/links/links-container.tsx
@@ -9,7 +9,7 @@ import {
PaginationControls,
usePagination,
} from "@dub/ui";
-import { CursorRays, Hyperlink, LoadingSpinner } from "@dub/ui/src/icons";
+import { CursorRays, Hyperlink, LoadingSpinner } from "@dub/ui/icons";
import { cn } from "@dub/utils";
import { useSearchParams } from "next/navigation";
import {
diff --git a/apps/web/ui/links/short-link-input.tsx b/apps/web/ui/links/short-link-input.tsx
index 89ebd8d5eb0..f22baef1436 100644
--- a/apps/web/ui/links/short-link-input.tsx
+++ b/apps/web/ui/links/short-link-input.tsx
@@ -15,7 +15,7 @@ import {
Twitter,
useKeyboardShortcut,
} from "@dub/ui";
-import { ArrowTurnRight2 } from "@dub/ui/src/icons";
+import { ArrowTurnRight2 } from "@dub/ui/icons";
import {
cn,
DUB_DOMAINS,
diff --git a/apps/web/ui/modals/import-csv-modal/field-mapping.tsx b/apps/web/ui/modals/import-csv-modal/field-mapping.tsx
index 456d06f4ddf..b41aad3f66d 100644
--- a/apps/web/ui/modals/import-csv-modal/field-mapping.tsx
+++ b/apps/web/ui/modals/import-csv-modal/field-mapping.tsx
@@ -8,7 +8,7 @@ import {
LoadingSpinner,
TableIcon,
Xmark,
-} from "@dub/ui/src/icons";
+} from "@dub/ui/icons";
import {
cn,
formatDate,
diff --git a/apps/web/ui/modals/import-csv-modal/index.tsx b/apps/web/ui/modals/import-csv-modal/index.tsx
index 7f03d9f0ff6..92a4b0ca1f2 100644
--- a/apps/web/ui/modals/import-csv-modal/index.tsx
+++ b/apps/web/ui/modals/import-csv-modal/index.tsx
@@ -8,7 +8,7 @@ import {
Modal,
useRouterStuff,
} from "@dub/ui";
-import { TableIcon } from "@dub/ui/src/icons";
+import { TableIcon } from "@dub/ui/icons";
import { ArrowRight } from "lucide-react";
import { useParams, useRouter, useSearchParams } from "next/navigation";
import {
diff --git a/apps/web/ui/modals/invite-teammate-modal.tsx b/apps/web/ui/modals/invite-teammate-modal.tsx
index e8441e69db9..a441fb8b068 100644
--- a/apps/web/ui/modals/invite-teammate-modal.tsx
+++ b/apps/web/ui/modals/invite-teammate-modal.tsx
@@ -1,7 +1,7 @@
import useWorkspace from "@/lib/swr/use-workspace";
import { Invite } from "@/lib/zod/schemas/invites";
import { BlurImage, Logo, Modal } from "@dub/ui";
-import { LoadingSpinner } from "@dub/ui/src/icons";
+import { LoadingSpinner } from "@dub/ui/icons";
import { fetcher } from "@dub/utils";
import {
Dispatch,
diff --git a/apps/web/ui/modals/link-builder/constants.ts b/apps/web/ui/modals/link-builder/constants.ts
index e9bf3184136..39e70d15567 100644
--- a/apps/web/ui/modals/link-builder/constants.ts
+++ b/apps/web/ui/modals/link-builder/constants.ts
@@ -6,7 +6,7 @@ import {
InputPassword,
SquareChart,
WindowSearch,
-} from "@dub/ui/src/icons";
+} from "@dub/ui/icons";
import { UseFormSetValue } from "react-hook-form";
import { LinkFormData } from ".";
import { getExpirationLabel } from "./expiration-modal";
diff --git a/apps/web/ui/modals/link-builder/draft-controls.tsx b/apps/web/ui/modals/link-builder/draft-controls.tsx
index 0d317f4c266..acd1bb4bcb5 100644
--- a/apps/web/ui/modals/link-builder/draft-controls.tsx
+++ b/apps/web/ui/modals/link-builder/draft-controls.tsx
@@ -1,11 +1,6 @@
import { ExpandedLinkProps } from "@/lib/types";
import { AnimatedSizeContainer, Button, Popover, useMediaQuery } from "@dub/ui";
-import {
- CircleCheck,
- CircleInfo,
- LoadingCircle,
- Xmark,
-} from "@dub/ui/src/icons";
+import { CircleCheck, CircleInfo, LoadingCircle, Xmark } from "@dub/ui/icons";
import { cn, nanoid, punycode, timeAgo, truncate } from "@dub/utils";
import { ChevronDown } from "lucide-react";
import {
diff --git a/apps/web/ui/modals/link-builder/expiration-modal.tsx b/apps/web/ui/modals/link-builder/expiration-modal.tsx
index 35c4b45848f..08cec972a03 100644
--- a/apps/web/ui/modals/link-builder/expiration-modal.tsx
+++ b/apps/web/ui/modals/link-builder/expiration-modal.tsx
@@ -8,7 +8,7 @@ import {
useKeyboardShortcut,
useMediaQuery,
} from "@dub/ui";
-import { CircleHalfDottedClock } from "@dub/ui/src/icons";
+import { CircleHalfDottedClock } from "@dub/ui/icons";
import {
cn,
formatDateTime,
diff --git a/apps/web/ui/modals/link-builder/link-preview.tsx b/apps/web/ui/modals/link-builder/link-preview.tsx
index 36bd58abc7d..296c755bf81 100644
--- a/apps/web/ui/modals/link-builder/link-preview.tsx
+++ b/apps/web/ui/modals/link-builder/link-preview.tsx
@@ -16,7 +16,7 @@ import {
NucleoPhoto,
Pen2,
Twitter,
-} from "@dub/ui/src/icons";
+} from "@dub/ui/icons";
import { cn, getDomainWithoutWWW, resizeImage } from "@dub/utils";
import {
ChangeEvent,
diff --git a/apps/web/ui/modals/link-builder/more-dropdown.tsx b/apps/web/ui/modals/link-builder/more-dropdown.tsx
index ef9ce5974be..f7925725781 100644
--- a/apps/web/ui/modals/link-builder/more-dropdown.tsx
+++ b/apps/web/ui/modals/link-builder/more-dropdown.tsx
@@ -6,7 +6,7 @@ import {
useKeyboardShortcut,
useMediaQuery,
} from "@dub/ui";
-import { Dots } from "@dub/ui/src/icons";
+import { Dots } from "@dub/ui/icons";
import { cn } from "@dub/utils";
import { Settings } from "lucide-react";
import { useContext, useMemo, useState } from "react";
diff --git a/apps/web/ui/modals/link-builder/og-modal.tsx b/apps/web/ui/modals/link-builder/og-modal.tsx
index 4e09bc36513..b8b1d83bd72 100644
--- a/apps/web/ui/modals/link-builder/og-modal.tsx
+++ b/apps/web/ui/modals/link-builder/og-modal.tsx
@@ -11,7 +11,7 @@ import {
SimpleTooltipContent,
Tooltip,
} from "@dub/ui";
-import { LoadingCircle, Magic, Unsplash } from "@dub/ui/src/icons";
+import { LoadingCircle, Magic, Unsplash } from "@dub/ui/icons";
import { resizeImage } from "@dub/utils";
import { useCompletion } from "ai/react";
import posthog from "posthog-js";
diff --git a/apps/web/ui/modals/link-builder/options-list.tsx b/apps/web/ui/modals/link-builder/options-list.tsx
index 9302f6f999b..2a570622577 100644
--- a/apps/web/ui/modals/link-builder/options-list.tsx
+++ b/apps/web/ui/modals/link-builder/options-list.tsx
@@ -1,6 +1,6 @@
import { AlertCircleFill, CheckCircleFill, X } from "@/ui/shared/icons";
import { Tooltip, useMediaQuery } from "@dub/ui";
-import { LoadingSpinner } from "@dub/ui/src/icons";
+import { LoadingSpinner } from "@dub/ui/icons";
import { cn, fetcher, isValidUrl as isValidUrlFn } from "@dub/utils";
import { AnimatePresence, motion } from "framer-motion";
import { ReactNode, useMemo } from "react";
diff --git a/apps/web/ui/modals/link-builder/password-modal.tsx b/apps/web/ui/modals/link-builder/password-modal.tsx
index 9de5c3dd114..1233598ce82 100644
--- a/apps/web/ui/modals/link-builder/password-modal.tsx
+++ b/apps/web/ui/modals/link-builder/password-modal.tsx
@@ -8,7 +8,7 @@ import {
useKeyboardShortcut,
useMediaQuery,
} from "@dub/ui";
-import { Eye, EyeSlash, InputPassword, Shuffle } from "@dub/ui/src/icons";
+import { Eye, EyeSlash, InputPassword, Shuffle } from "@dub/ui/icons";
import { cn, nanoid } from "@dub/utils";
import {
Dispatch,
diff --git a/apps/web/ui/modals/link-builder/qr-code-preview.tsx b/apps/web/ui/modals/link-builder/qr-code-preview.tsx
index 36469ce496e..5ecece14ad0 100644
--- a/apps/web/ui/modals/link-builder/qr-code-preview.tsx
+++ b/apps/web/ui/modals/link-builder/qr-code-preview.tsx
@@ -8,7 +8,7 @@ import {
useLocalStorage,
useMediaQuery,
} from "@dub/ui";
-import { Pen2, QRCode as QRCodeIcon } from "@dub/ui/src/icons";
+import { Pen2, QRCode as QRCodeIcon } from "@dub/ui/icons";
import { DUB_QR_LOGO, linkConstructor } from "@dub/utils";
import { AnimatePresence, motion } from "framer-motion";
import { useMemo } from "react";
diff --git a/apps/web/ui/modals/link-builder/targeting-modal.tsx b/apps/web/ui/modals/link-builder/targeting-modal.tsx
index 701d786a0a3..c2b700efe87 100644
--- a/apps/web/ui/modals/link-builder/targeting-modal.tsx
+++ b/apps/web/ui/modals/link-builder/targeting-modal.tsx
@@ -8,7 +8,7 @@ import {
useKeyboardShortcut,
UTM_PARAMETERS,
} from "@dub/ui";
-import { Crosshairs3, Trash } from "@dub/ui/src/icons";
+import { Crosshairs3, Trash } from "@dub/ui/icons";
import {
cn,
constructURLFromUTMParams,
diff --git a/apps/web/ui/modals/link-builder/utm-templates-button.tsx b/apps/web/ui/modals/link-builder/utm-templates-button.tsx
index aa7cf700156..30f33f78b2a 100644
--- a/apps/web/ui/modals/link-builder/utm-templates-button.tsx
+++ b/apps/web/ui/modals/link-builder/utm-templates-button.tsx
@@ -8,7 +8,7 @@ import {
Popover,
useMediaQuery,
} from "@dub/ui";
-import { DiamondTurnRight, LoadingSpinner, Note } from "@dub/ui/src/icons";
+import { DiamondTurnRight, LoadingSpinner, Note } from "@dub/ui/icons";
import { fetcher } from "@dub/utils";
import { useState } from "react";
import { useFormContext } from "react-hook-form";
diff --git a/apps/web/ui/modals/link-qr-modal.tsx b/apps/web/ui/modals/link-qr-modal.tsx
index a8cecb0c4d3..c6a673f7830 100644
--- a/apps/web/ui/modals/link-qr-modal.tsx
+++ b/apps/web/ui/modals/link-qr-modal.tsx
@@ -19,14 +19,7 @@ import {
useLocalStorage,
useMediaQuery,
} from "@dub/ui";
-import {
- Check,
- Check2,
- Copy,
- Download,
- Hyperlink,
- Photo,
-} from "@dub/ui/src/icons";
+import { Check, Check2, Copy, Download, Hyperlink, Photo } from "@dub/ui/icons";
import { API_DOMAIN, cn, DUB_QR_LOGO, linkConstructor } from "@dub/utils";
import { AnimatePresence, motion } from "framer-motion";
import {
diff --git a/apps/web/ui/modals/share-dashboard-modal.tsx b/apps/web/ui/modals/share-dashboard-modal.tsx
index a1559a5490b..54d345eb780 100644
--- a/apps/web/ui/modals/share-dashboard-modal.tsx
+++ b/apps/web/ui/modals/share-dashboard-modal.tsx
@@ -13,7 +13,7 @@ import {
Tick,
useCopyToClipboard,
} from "@dub/ui";
-import { ArrowTurnRight2, Globe } from "@dub/ui/src/icons";
+import { ArrowTurnRight2, Globe } from "@dub/ui/icons";
import {
APP_DOMAIN,
fetcher,
diff --git a/apps/web/ui/partners/earnings-chart.tsx b/apps/web/ui/partners/earnings-chart.tsx
index c7d28d8eb93..d0903514855 100644
--- a/apps/web/ui/partners/earnings-chart.tsx
+++ b/apps/web/ui/partners/earnings-chart.tsx
@@ -1,13 +1,15 @@
"use client";
import { IntervalOptions } from "@/lib/analytics/types";
-import Areas from "@/ui/charts/areas";
-import { ChartContext } from "@/ui/charts/chart-context";
-import TimeSeriesChart from "@/ui/charts/time-series-chart";
-import XAxis from "@/ui/charts/x-axis";
-import YAxis from "@/ui/charts/y-axis";
import SimpleDateRangePicker from "@/ui/shared/simple-date-range-picker";
-import { LoadingSpinner } from "@dub/ui/src/icons";
+import {
+ Areas,
+ ChartContext,
+ TimeSeriesChart,
+ XAxis,
+ YAxis,
+} from "@dub/ui/charts";
+import { LoadingSpinner } from "@dub/ui/icons";
import { cn, currencyFormatter, formatDate } from "@dub/utils";
import { LinearGradient } from "@visx/gradient";
import { createContext, useId, useMemo } from "react";
diff --git a/apps/web/ui/partners/lander-blocks/FilesBlock.tsx b/apps/web/ui/partners/lander-blocks/FilesBlock.tsx
index 4b417daabd3..c78e30179d7 100644
--- a/apps/web/ui/partners/lander-blocks/FilesBlock.tsx
+++ b/apps/web/ui/partners/lander-blocks/FilesBlock.tsx
@@ -1,5 +1,5 @@
import { programLanderFilesBlockSchema } from "@/lib/zod/schemas/program-lander";
-import { ArrowUpRight, Download } from "@dub/ui/src/icons";
+import { ArrowUpRight, Download } from "@dub/ui/icons";
import { z } from "zod";
import { BlockTitle } from "./BlockTitle";
diff --git a/apps/web/ui/partners/partner-details-sheet.tsx b/apps/web/ui/partners/partner-details-sheet.tsx
index ac691f55035..3308f212760 100644
--- a/apps/web/ui/partners/partner-details-sheet.tsx
+++ b/apps/web/ui/partners/partner-details-sheet.tsx
@@ -18,7 +18,7 @@ import {
useTable,
useTablePagination,
} from "@dub/ui";
-import { GreekTemple, LinesY } from "@dub/ui/src/icons";
+import { GreekTemple, LinesY } from "@dub/ui/icons";
import {
cn,
COUNTRIES,
diff --git a/apps/web/ui/partners/partner-link-selector.tsx b/apps/web/ui/partners/partner-link-selector.tsx
index b90cced129d..b5aab8a2633 100644
--- a/apps/web/ui/partners/partner-link-selector.tsx
+++ b/apps/web/ui/partners/partner-link-selector.tsx
@@ -2,7 +2,7 @@ import useLink from "@/lib/swr/use-link";
import useLinks from "@/lib/swr/use-links";
import { LinkProps } from "@/lib/types";
import { Combobox, LinkLogo } from "@dub/ui";
-import { ArrowTurnRight2 } from "@dub/ui/src/icons";
+import { ArrowTurnRight2 } from "@dub/ui/icons";
import { cn, getApexDomain, linkConstructor } from "@dub/utils";
import { useMemo, useState } from "react";
import { useDebounce } from "use-debounce";
diff --git a/apps/web/ui/partners/partner-status-badges.ts b/apps/web/ui/partners/partner-status-badges.ts
index 30fe8850b3b..ccda2cda4cd 100644
--- a/apps/web/ui/partners/partner-status-badges.ts
+++ b/apps/web/ui/partners/partner-status-badges.ts
@@ -1,8 +1,4 @@
-import {
- CircleCheck,
- CircleHalfDottedClock,
- CircleXmark,
-} from "@dub/ui/src/icons";
+import { CircleCheck, CircleHalfDottedClock, CircleXmark } from "@dub/ui/icons";
export const PartnerStatusBadges = {
approved: {
diff --git a/apps/web/ui/partners/payout-status-badges.tsx b/apps/web/ui/partners/payout-status-badges.tsx
index 947148c38c3..725b05f5cff 100644
--- a/apps/web/ui/partners/payout-status-badges.tsx
+++ b/apps/web/ui/partners/payout-status-badges.tsx
@@ -2,7 +2,7 @@ import {
CircleCheck,
CircleHalfDottedClock,
CircleWarning,
-} from "@dub/ui/src/icons";
+} from "@dub/ui/icons";
export const PayoutStatusBadges = {
pending: {
diff --git a/apps/web/ui/partners/payout-type-badge.tsx b/apps/web/ui/partners/payout-type-badge.tsx
index fe5e688c997..5d025e7c7ae 100644
--- a/apps/web/ui/partners/payout-type-badge.tsx
+++ b/apps/web/ui/partners/payout-type-badge.tsx
@@ -3,7 +3,7 @@ import {
InvoiceDollar,
MoneyBill2,
UserCheck,
-} from "@dub/ui/src/icons";
+} from "@dub/ui/icons";
import { capitalize } from "@dub/utils/src/functions";
export const PayoutTypeBadge = ({
diff --git a/apps/web/ui/partners/sale-row-menu.tsx b/apps/web/ui/partners/sale-row-menu.tsx
index 6c08e8ce256..d3c862fbb6a 100644
--- a/apps/web/ui/partners/sale-row-menu.tsx
+++ b/apps/web/ui/partners/sale-row-menu.tsx
@@ -7,7 +7,7 @@ import {
Dots,
Duplicate,
ShieldAlert,
-} from "@dub/ui/src/icons";
+} from "@dub/ui/icons";
import { cn } from "@dub/utils";
import { Row } from "@tanstack/react-table";
import { Command } from "cmdk";
diff --git a/apps/web/ui/partners/sale-status-badges.tsx b/apps/web/ui/partners/sale-status-badges.tsx
index 6f45fb32413..18a8e99d0cd 100644
--- a/apps/web/ui/partners/sale-status-badges.tsx
+++ b/apps/web/ui/partners/sale-status-badges.tsx
@@ -4,7 +4,7 @@ import {
CircleXmark,
Duplicate,
ShieldAlert,
-} from "@dub/ui/src/icons";
+} from "@dub/ui/icons";
export const SaleStatusBadges = {
pending: {
diff --git a/apps/web/ui/partners/stat-card.tsx b/apps/web/ui/partners/stat-card.tsx
index 295791fe991..a7ed9924491 100644
--- a/apps/web/ui/partners/stat-card.tsx
+++ b/apps/web/ui/partners/stat-card.tsx
@@ -1,5 +1,5 @@
import { MiniAreaChart } from "@dub/ui";
-import { LoadingSpinner } from "@dub/ui/src/icons";
+import { LoadingSpinner } from "@dub/ui/icons";
import { currencyFormatter, nFormatter } from "@dub/utils";
import Link from "next/link";
diff --git a/apps/web/ui/shared/search-box.tsx b/apps/web/ui/shared/search-box.tsx
index 1efeb688f08..ac9d7603e31 100644
--- a/apps/web/ui/shared/search-box.tsx
+++ b/apps/web/ui/shared/search-box.tsx
@@ -1,5 +1,5 @@
import { LoadingSpinner, useRouterStuff } from "@dub/ui";
-import { CircleXmark, Magnifier } from "@dub/ui/src/icons";
+import { CircleXmark, Magnifier } from "@dub/ui/icons";
import { cn } from "@dub/utils";
import {
forwardRef,
diff --git a/apps/web/ui/webhooks/webhook-events.tsx b/apps/web/ui/webhooks/webhook-events.tsx
index eee7cf82ebf..a0967515bea 100644
--- a/apps/web/ui/webhooks/webhook-events.tsx
+++ b/apps/web/ui/webhooks/webhook-events.tsx
@@ -9,7 +9,7 @@ import {
useCopyToClipboard,
useMediaQuery,
} from "@dub/ui";
-import { CircleCheck, CircleHalfDottedClock, Copy } from "@dub/ui/src/icons";
+import { CircleCheck, CircleHalfDottedClock, Copy } from "@dub/ui/icons";
import { PropsWithChildren, useEffect, useState } from "react";
import { Highlighter } from "shiki";
import { toast } from "sonner";
diff --git a/apps/web/ui/workspaces/invite-teammates-form.tsx b/apps/web/ui/workspaces/invite-teammates-form.tsx
index f37cf265ad0..61fa56310d5 100644
--- a/apps/web/ui/workspaces/invite-teammates-form.tsx
+++ b/apps/web/ui/workspaces/invite-teammates-form.tsx
@@ -2,7 +2,7 @@ import useWorkspace from "@/lib/swr/use-workspace";
import { Role, roles } from "@/lib/types";
import { Invite } from "@/lib/zod/schemas/invites";
import { Button, useMediaQuery } from "@dub/ui";
-import { Trash } from "@dub/ui/src/icons";
+import { Trash } from "@dub/ui/icons";
import { capitalize, cn, pluralize } from "@dub/utils";
import { Plus } from "lucide-react";
import posthog from "posthog-js";
diff --git a/packages/ui/package.json b/packages/ui/package.json
index 37f867dad26..7f04b2de5c8 100644
--- a/packages/ui/package.json
+++ b/packages/ui/package.json
@@ -9,6 +9,23 @@
"files": [
"dist/**"
],
+ "exports": {
+ ".": {
+ "types": "./dist/index.d.ts",
+ "import": "./dist/index.mjs",
+ "require": "./dist/index.js"
+ },
+ "./icons": {
+ "types": "./dist/icons/index.d.ts",
+ "import": "./dist/icons/index.mjs",
+ "require": "./dist/icons/index.js"
+ },
+ "./charts": {
+ "types": "./dist/charts/index.d.ts",
+ "import": "./dist/charts/index.mjs",
+ "require": "./dist/charts/index.js"
+ }
+ },
"scripts": {
"build": "tsup",
"lint": "eslint src/",
@@ -23,6 +40,7 @@
"devDependencies": {
"@dub/tailwind-config": "workspace:*",
"@dub/utils": "workspace:*",
+ "@types/d3-array": "^3.2.1",
"@types/js-cookie": "^3.0.6",
"@types/react": "^18.2.47",
"@types/react-dom": "^18.2.14",
@@ -52,14 +70,20 @@
"@react-aria/datepicker": "^3.10.0",
"@react-stately/datepicker": "^3.9.3",
"@tanstack/react-table": "^8.17.3",
+ "@visx/axis": "^2.14.0",
+ "@visx/clip-path": "^3.3.0",
"@visx/curve": "^3.3.0",
+ "@visx/event": "^2.6.0",
"@visx/gradient": "^3.3.0",
"@visx/group": "^3.3.0",
"@visx/responsive": "^2.10.0",
"@visx/scale": "^3.3.0",
"@visx/shape": "^2.12.2",
+ "@visx/text": "^3.3.0",
+ "@visx/tooltip": "^2.16.0",
"class-variance-authority": "^0.7.0",
"cmdk": "^0.2.0",
+ "d3-array": "^3.2.4",
"date-fns": "^3.6.0",
"embla-carousel-autoplay": "^8.1.7",
"embla-carousel-react": "^8.1.7",
diff --git a/apps/web/ui/charts/areas.tsx b/packages/ui/src/charts/areas.tsx
similarity index 99%
rename from apps/web/ui/charts/areas.tsx
rename to packages/ui/src/charts/areas.tsx
index 9526a4422c8..ab1dfe0731e 100644
--- a/apps/web/ui/charts/areas.tsx
+++ b/packages/ui/src/charts/areas.tsx
@@ -6,7 +6,7 @@ import { AnimatePresence, motion } from "framer-motion";
import { useMemo } from "react";
import { useChartContext, useChartTooltipContext } from "./chart-context";
-export default function Areas({
+export function Areas({
seriesStyles,
}: {
seriesStyles?: {
diff --git a/apps/web/ui/charts/bars.tsx b/packages/ui/src/charts/bars.tsx
similarity index 100%
rename from apps/web/ui/charts/bars.tsx
rename to packages/ui/src/charts/bars.tsx
diff --git a/apps/web/ui/charts/chart-context.ts b/packages/ui/src/charts/chart-context.ts
similarity index 100%
rename from apps/web/ui/charts/chart-context.ts
rename to packages/ui/src/charts/chart-context.ts
diff --git a/packages/ui/src/charts/funnel-chart.tsx b/packages/ui/src/charts/funnel-chart.tsx
new file mode 100644
index 00000000000..8b52b4eee68
--- /dev/null
+++ b/packages/ui/src/charts/funnel-chart.tsx
@@ -0,0 +1,234 @@
+import { cn, nFormatter } from "@dub/utils";
+import { curveBasis } from "@visx/curve";
+import { ParentSize } from "@visx/responsive";
+import { scaleLinear } from "@visx/scale";
+import { Area } from "@visx/shape";
+import { Text } from "@visx/text";
+import { motion } from "framer-motion";
+import { Fragment, useMemo, useState } from "react";
+import { useMediaQuery } from "../hooks";
+
+const layers = [
+ {
+ opacity: 1,
+ padding: 0,
+ },
+ {
+ opacity: 0.3,
+ padding: 8,
+ },
+ {
+ opacity: 0.15,
+ padding: 16,
+ },
+];
+
+const maxLayerPadding = 16;
+const chartPadding = 40;
+
+type FunnelChartProps = {
+ steps: {
+ id: string;
+ label: string;
+ value: number;
+ additionalValue?: number;
+ colorClassName: string;
+ }[];
+ persistentPercentages?: boolean;
+ defaultTooltipStepId?: string;
+};
+
+export function FunnelChart(props: FunnelChartProps) {
+ return (
+
+
+ {({ width, height }) =>
+ width && height ? (
+
+ ) : null
+ }
+
+
+ );
+}
+
+function FunnelChartInner({
+ width,
+ height,
+ steps,
+ persistentPercentages = true,
+ defaultTooltipStepId,
+}: {
+ width: number;
+ height: number;
+} & FunnelChartProps) {
+ const { isMobile } = useMediaQuery();
+
+ const [tooltip, setTooltip] = useState(
+ defaultTooltipStepId ?? null,
+ );
+ const tooltipStep = steps.find(({ id }) => id === tooltip);
+
+ const data = useMemo(() => {
+ return Object.fromEntries(
+ steps.map(({ id, value }, idx) => [
+ id,
+ interpolate(
+ value,
+ steps[idx + 1]?.value ?? steps[steps.length - 1].value,
+ ),
+ ]),
+ );
+ }, [steps]);
+
+ const zeroData = useMemo(() => interpolate(0, 0), [steps]);
+
+ const maxValue = useMemo(
+ () => Math.max(...steps.map((step) => step.value)),
+ [steps],
+ );
+
+ const xScale = scaleLinear({
+ domain: [0, steps.length],
+ range: [0, width],
+ });
+
+ const yScale = scaleLinear({
+ domain: [maxValue, -maxValue],
+ range: [
+ height - maxLayerPadding - chartPadding,
+ maxLayerPadding + chartPadding,
+ ],
+ });
+
+ return (
+
+
+ {tooltipStep && (
+
id === tooltipStep.id)),
+ width: width / steps.length,
+ }}
+ >
+
+
+ {tooltipStep.label}
+
+
+
+
+
+ {formatPercentage((tooltipStep.value / maxValue) * 100) + "%"}
+
+
+
+ {nFormatter(tooltipStep.value, { full: true })}
+ {tooltipStep.additionalValue !== undefined && (
+
+ {" "}
+ (${nFormatter(tooltipStep.additionalValue / 100)})
+
+ )}
+
+
+
+
+ )}
+
+ );
+}
+
+const formatPercentage = (value: number) => {
+ return value > 0 && value < 0.01
+ ? "< 0.01"
+ : nFormatter(value, { digits: 2 });
+};
+
+const interpolate = (from: number, to: number) => [
+ { x: 0, y: from },
+ { x: 0.3, y: from },
+ { x: 0.5, y: (from + to) / 2 },
+ { x: 0.7, y: to },
+ { x: 1, y: to },
+];
diff --git a/packages/ui/src/charts/index.ts b/packages/ui/src/charts/index.ts
new file mode 100644
index 00000000000..528aa9e7a63
--- /dev/null
+++ b/packages/ui/src/charts/index.ts
@@ -0,0 +1,7 @@
+export * from "./areas";
+export * from "./bars";
+export * from "./chart-context";
+export * from "./funnel-chart";
+export * from "./time-series-chart";
+export * from "./x-axis";
+export * from "./y-axis";
diff --git a/apps/web/ui/charts/time-series-chart.tsx b/packages/ui/src/charts/time-series-chart.tsx
similarity index 97%
rename from apps/web/ui/charts/time-series-chart.tsx
rename to packages/ui/src/charts/time-series-chart.tsx
index a9a625215be..bca2b83c070 100644
--- a/apps/web/ui/charts/time-series-chart.tsx
+++ b/packages/ui/src/charts/time-series-chart.tsx
@@ -14,7 +14,7 @@ import { useTooltip } from "./useTooltip";
type TimeSeriesChartProps = PropsWithChildren>;
-export default function TimeSeriesChart(
+export function TimeSeriesChart(
props: TimeSeriesChartProps,
) {
return (
@@ -40,6 +40,7 @@ function TimeSeriesChartInner({
series,
tooltipContent = (d) => series[0].valueAccessor(d).toString(),
tooltipClassName = "",
+ defaultTooltipIndex = null,
margin: marginProp = {
top: 12,
right: 4,
@@ -125,7 +126,7 @@ function TimeSeriesChartInner({
series,
startDate,
endDate,
- xScale,
+ xScale: xScale as any,
yScale,
minY,
maxY,
@@ -133,6 +134,7 @@ function TimeSeriesChartInner({
padding,
tooltipContent,
tooltipClassName,
+ defaultTooltipIndex,
leftAxisMargin,
setLeftAxisMargin,
};
@@ -140,6 +142,7 @@ function TimeSeriesChartInner({
const tooltipContext = useTooltip({
seriesId: series[0].id,
chartContext,
+ defaultIndex: defaultTooltipIndex ?? undefined,
});
const {
diff --git a/apps/web/ui/charts/types.ts b/packages/ui/src/charts/types.ts
similarity index 98%
rename from apps/web/ui/charts/types.ts
rename to packages/ui/src/charts/types.ts
index c5ea5c8a8a1..285ae9a7f0a 100644
--- a/apps/web/ui/charts/types.ts
+++ b/packages/ui/src/charts/types.ts
@@ -33,6 +33,7 @@ type ChartOptionalProps = {
type?: "area" | "bar";
tooltipContent?: (datum: TimeSeriesDatum) => ReactElement | string;
tooltipClassName?: string;
+ defaultTooltipIndex?: number | null;
/**
* Absolute pixel values for margins around the chart area.
diff --git a/apps/web/ui/charts/useTooltip.ts b/packages/ui/src/charts/useTooltip.ts
similarity index 62%
rename from apps/web/ui/charts/useTooltip.ts
rename to packages/ui/src/charts/useTooltip.ts
index 277639a5326..a1674257803 100644
--- a/apps/web/ui/charts/useTooltip.ts
+++ b/packages/ui/src/charts/useTooltip.ts
@@ -5,7 +5,7 @@ import {
useTooltip as useVisxTooltip,
} from "@visx/tooltip";
import { bisector } from "d3-array";
-import { useCallback } from "react";
+import { useCallback, useMemo } from "react";
import {
ChartContext,
ChartTooltipContext,
@@ -22,6 +22,7 @@ export type TooltipOptions = {
renderInPortal?: boolean;
snapToX?: boolean;
snapToY?: boolean;
+ defaultIndex?: number;
};
export function useTooltip({
@@ -30,6 +31,7 @@ export function useTooltip({
renderInPortal = false,
snapToY = false,
snapToX = true,
+ defaultIndex,
}: TooltipOptions): ChartTooltipContext {
const { series, data, xScale, yScale, margin } = chartContext;
@@ -39,7 +41,30 @@ export function useTooltip({
debounce: 200,
});
- const visxTooltip = useVisxTooltip>();
+ const defaultTooltipDatum =
+ defaultIndex !== undefined ? data[defaultIndex] : undefined;
+
+ const defaultTooltipData = useMemo(
+ () =>
+ defaultTooltipDatum !== undefined
+ ? {
+ tooltipData: defaultTooltipDatum,
+ tooltipLeft: snapToX ? xScale(defaultTooltipDatum.date) : 0,
+ tooltipTop: snapToY
+ ? yScale(
+ series
+ .find((s) => s.id === seriesId)!
+ .valueAccessor(defaultTooltipDatum),
+ )
+ : 0,
+ }
+ : undefined,
+ [defaultTooltipDatum, snapToX, snapToY, xScale, yScale, series, seriesId],
+ );
+
+ const visxTooltip = useVisxTooltip>(
+ defaultTooltipData ?? undefined,
+ );
const handleTooltip = useCallback(
(
@@ -57,7 +82,9 @@ export function useTooltip({
] as Date | undefined);
if (x0 === undefined) {
- visxTooltip.hideTooltip();
+ console.log("x0 is undefined", { defaultTooltipData });
+ if (defaultTooltipData) visxTooltip.showTooltip(defaultTooltipData);
+ else visxTooltip.hideTooltip();
return;
}
const index = bisectDate(data, x0, 1);
@@ -78,7 +105,15 @@ export function useTooltip({
: 0,
});
},
- [seriesId, data, xScale, yScale, series, visxTooltip.showTooltip],
+ [
+ seriesId,
+ data,
+ xScale,
+ yScale,
+ series,
+ defaultTooltipData,
+ visxTooltip.showTooltip,
+ ],
);
const TooltipWrapper = renderInPortal
@@ -90,5 +125,9 @@ export function useTooltip({
TooltipWrapper,
containerRef: visxTooltipInPortal.containerRef,
...visxTooltip,
+ hideTooltip: () =>
+ defaultTooltipData
+ ? visxTooltip.showTooltip(defaultTooltipData)
+ : visxTooltip.hideTooltip(),
};
}
diff --git a/apps/web/ui/charts/utils.ts b/packages/ui/src/charts/utils.ts
similarity index 100%
rename from apps/web/ui/charts/utils.ts
rename to packages/ui/src/charts/utils.ts
diff --git a/apps/web/ui/charts/x-axis.tsx b/packages/ui/src/charts/x-axis.tsx
similarity index 98%
rename from apps/web/ui/charts/x-axis.tsx
rename to packages/ui/src/charts/x-axis.tsx
index 7a634a992e8..acfd9438e31 100644
--- a/apps/web/ui/charts/x-axis.tsx
+++ b/packages/ui/src/charts/x-axis.tsx
@@ -27,7 +27,7 @@ export type XAxisProps = {
tickFormat?: (date: Date) => string;
};
-export default function XAxis({
+export function XAxis({
maxTicks: maxTicksProp,
showGridLines = false,
highlightLast = true,
diff --git a/apps/web/ui/charts/y-axis.tsx b/packages/ui/src/charts/y-axis.tsx
similarity index 98%
rename from apps/web/ui/charts/y-axis.tsx
rename to packages/ui/src/charts/y-axis.tsx
index 0a24b3a7200..6dd08fe3c18 100644
--- a/apps/web/ui/charts/y-axis.tsx
+++ b/packages/ui/src/charts/y-axis.tsx
@@ -37,7 +37,7 @@ export type YAxisProps = {
tickAxisSpacing?: number;
};
-export default function YAxis({
+export function YAxis({
numTicks: numTicksProp,
showGridLines = false,
integerTicks = false,
diff --git a/packages/ui/tsup.config.ts b/packages/ui/tsup.config.ts
index 6a8a1e5cb02..9eb078d4240 100644
--- a/packages/ui/tsup.config.ts
+++ b/packages/ui/tsup.config.ts
@@ -1,7 +1,12 @@
import { defineConfig, Options } from "tsup";
export default defineConfig((options: Options) => ({
- entry: ["src/**/*.tsx"],
+ entry: {
+ index: "src/index.tsx",
+ "icons/index": "src/icons/index.tsx",
+ "charts/index": "src/charts/index.ts",
+ },
+
format: ["esm"],
esbuildOptions(options) {
options.banner = {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 0d675064006..382bf22baa0 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -126,18 +126,9 @@ importers:
'@vercel/og':
specifier: ^0.6.3
version: 0.6.3
- '@visx/axis':
- specifier: ^2.14.0
- version: 2.14.0(react@18.2.0)
- '@visx/clip-path':
- specifier: ^3.3.0
- version: 3.3.0(react@18.2.0)
'@visx/curve':
specifier: ^3.3.0
version: 3.3.0
- '@visx/event':
- specifier: ^2.6.0
- version: 2.6.0
'@visx/geo':
specifier: ^2.10.0
version: 2.10.0(react@18.2.0)
@@ -162,9 +153,6 @@ importers:
'@visx/text':
specifier: ^3.3.0
version: 3.3.0(react@18.2.0)
- '@visx/tooltip':
- specifier: ^2.16.0
- version: 2.16.0(react-dom@18.2.0)(react@18.2.0)
ai:
specifier: ^3.4.8
version: 3.4.8(react@18.2.0)(svelte@4.2.14)(vue@3.4.21)(zod@3.22.4)
@@ -189,9 +177,6 @@ importers:
csv-parse:
specifier: ^5.5.6
version: 5.5.6
- d3-array:
- specifier: ^3.2.4
- version: 3.2.4
date-fns:
specifier: ^3.6.0
version: 3.6.0
@@ -663,9 +648,18 @@ importers:
'@tanstack/react-table':
specifier: ^8.17.3
version: 8.17.3(react-dom@18.2.0)(react@18.2.0)
+ '@visx/axis':
+ specifier: ^2.14.0
+ version: 2.14.0(react@18.2.0)
+ '@visx/clip-path':
+ specifier: ^3.3.0
+ version: 3.3.0(react@18.2.0)
'@visx/curve':
specifier: ^3.3.0
version: 3.3.0
+ '@visx/event':
+ specifier: ^2.6.0
+ version: 2.6.0
'@visx/gradient':
specifier: ^3.3.0
version: 3.3.0(react@18.2.0)
@@ -681,12 +675,21 @@ importers:
'@visx/shape':
specifier: ^2.12.2
version: 2.12.2(react@18.2.0)
+ '@visx/text':
+ specifier: ^3.3.0
+ version: 3.3.0(react@18.2.0)
+ '@visx/tooltip':
+ specifier: ^2.16.0
+ version: 2.16.0(react-dom@18.2.0)(react@18.2.0)
class-variance-authority:
specifier: ^0.7.0
version: 0.7.0
cmdk:
specifier: ^0.2.0
version: 0.2.0(@types/react-dom@18.2.14)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
+ d3-array:
+ specifier: ^3.2.4
+ version: 3.2.4
date-fns:
specifier: ^3.6.0
version: 3.6.0
@@ -739,6 +742,9 @@ importers:
'@dub/utils':
specifier: workspace:*
version: link:../utils
+ '@types/d3-array':
+ specifier: ^3.2.1
+ version: 3.2.1
'@types/js-cookie':
specifier: ^3.0.6
version: 3.0.6
@@ -9503,6 +9509,10 @@ packages:
resolution: {integrity: sha512-Reoy+pKnvsksN0lQUlcH6dOGjRZ/3WRwXR//m+/8lt1BXeI4xyaUZoqULNjyXXRuh0Mj4LNpkCvhUpQlY3X5xQ==}
dev: false
+ /@types/d3-array@3.2.1:
+ resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==}
+ dev: true
+
/@types/d3-color@1.4.3:
resolution: {integrity: sha512-jcHMwBcuuQ1LPt43jdbOhdOFczfDfhzvAZ1+1L0KiXPv4VqGsWAltxfxUDvtSuIMsvTZ2eeua+tOtxI6qqxYUg==}
dev: false