diff --git a/.changeset/silent-crabs-bow.md b/.changeset/silent-crabs-bow.md new file mode 100644 index 0000000000..942d631954 --- /dev/null +++ b/.changeset/silent-crabs-bow.md @@ -0,0 +1,5 @@ +--- +"shadcn": patch +--- + +add style rhea diff --git a/.gitignore b/.gitignore index 58ebd7be60..8e9abde081 100644 --- a/.gitignore +++ b/.gitignore @@ -43,5 +43,6 @@ tsconfig.tsbuildinfo .notes .playwright-mcp +.playwright-cli shadcn-workspace .codex-artifacts diff --git a/apps/v4/app/(app)/(root)/cards/account-access.tsx b/apps/v4/app/(app)/(root)/cards/account-access.tsx new file mode 100644 index 0000000000..2cfebec880 --- /dev/null +++ b/apps/v4/app/(app)/(root)/cards/account-access.tsx @@ -0,0 +1,94 @@ +import { + AlertCircleIcon, + ArrowRight01Icon, + SquareLock02Icon, +} from "@hugeicons/core-free-icons" +import { HugeiconsIcon } from "@hugeicons/react" + +import { Button } from "@/styles/base-rhea/ui/button" +import { + Card, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} from "@/styles/base-rhea/ui/card" +import { Field, FieldGroup, FieldLabel } from "@/styles/base-rhea/ui/field" +import { Input } from "@/styles/base-rhea/ui/input" +import { + Item, + ItemContent, + ItemDescription, + ItemMedia, + ItemTitle, +} from "@/styles/base-rhea/ui/item" + +export function AccountAccess() { + return ( + + + Account Access + + Update your credentials or re-authenticate. + + + + + + Email Address + + + +
+ + Current Password + + + Forgot? + +
+ +
+
+
+ + + }> + + + + + Danger Zone + + Archive account and remove catalog + + + + + +
+ ) +} diff --git a/apps/v4/app/(app)/(root)/cards/analytics-card.tsx b/apps/v4/app/(app)/(root)/cards/analytics-card.tsx new file mode 100644 index 0000000000..68584c8b93 --- /dev/null +++ b/apps/v4/app/(app)/(root)/cards/analytics-card.tsx @@ -0,0 +1,46 @@ +import { Badge } from "@/styles/base-rhea/ui/badge" +import { Button } from "@/styles/base-rhea/ui/button" +import { + Card, + CardAction, + CardDescription, + CardHeader, + CardTitle, +} from "@/styles/base-rhea/ui/card" + +const areaPath = "M0 52L18 40L36 46L54 70L72 50L100 49V86H0Z" +const strokePath = "M0 52L18 40L36 46L54 70L72 50L100 49" + +export function AnalyticsCard() { + return ( + + + Analytics + + 418.2K Visitors +10% + + + + + + + + + + + ) +} diff --git a/apps/v4/app/(app)/(root)/cards/claimable-balance.tsx b/apps/v4/app/(app)/(root)/cards/claimable-balance.tsx new file mode 100644 index 0000000000..60bc96c612 --- /dev/null +++ b/apps/v4/app/(app)/(root)/cards/claimable-balance.tsx @@ -0,0 +1,75 @@ +import { Badge } from "@/styles/base-rhea/ui/badge" +import { + Card, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} from "@/styles/base-rhea/ui/card" +import { Item, ItemContent } from "@/styles/base-rhea/ui/item" +import { Separator } from "@/styles/base-rhea/ui/separator" + +const netRoyalties = 1248.75 +const processingFee = 37.46 +const totalClaimable = netRoyalties - processingFee + +const formatCurrency = (amount: number) => + amount.toLocaleString("en-US", { + minimumFractionDigits: 2, + maximumFractionDigits: 2, + }) + +export function ClaimableBalance() { + return ( + + + Claimable Balance + + ${formatCurrency(totalClaimable)} + + + + Pending Setup + + + + + +
+ + Net Royalties + + + ${formatCurrency(netRoyalties)} + +
+
+ + Processing Fee + + + -${formatCurrency(processingFee)} + +
+ +
+ + Total Ready to Claim + + + ${formatCurrency(totalClaimable)} USD + +
+
+
+
+ + + Once your bank is connected, balances over $10.00 are automatically + eligible for monthly distribution on the 15th of each month. + + +
+ ) +} diff --git a/apps/v4/app/(app)/(root)/cards/contribution-history.tsx b/apps/v4/app/(app)/(root)/cards/contribution-history.tsx new file mode 100644 index 0000000000..33a9eba8d3 --- /dev/null +++ b/apps/v4/app/(app)/(root)/cards/contribution-history.tsx @@ -0,0 +1,88 @@ +import { Badge } from "@/styles/base-rhea/ui/badge" +import { Button } from "@/styles/base-rhea/ui/button" +import { + Card, + CardAction, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} from "@/styles/base-rhea/ui/card" +import { Item, ItemContent, ItemDescription } from "@/styles/base-rhea/ui/item" + +const chartData = [ + { month: "Dec", amount: 800 }, + { month: "Jan", amount: 1100 }, + { month: "Feb", amount: 900 }, + { month: "Mar", amount: 1300 }, + { month: "Apr", amount: 750 }, + { month: "May", amount: 1400 }, +] + +export function ContributionHistory() { + const maxAmount = Math.max(...chartData.map((item) => item.amount)) + + return ( + + + Contribution History + Last 6 months of activity + + +
+ {chartData.map((item) => ( +
+
+ + {item.month} + +
+ ))} +
+ + +
+ + + + Upcoming + + + May 2024 + + Scheduled + + + + + + Savings Plan + + + Accelerated + + Recurring + + +
+
+ + + + + ) +} diff --git a/apps/v4/app/(app)/(root)/cards/dividend-income.tsx b/apps/v4/app/(app)/(root)/cards/dividend-income.tsx new file mode 100644 index 0000000000..056a00580f --- /dev/null +++ b/apps/v4/app/(app)/(root)/cards/dividend-income.tsx @@ -0,0 +1,116 @@ +import { Cancel01Icon } from "@hugeicons/core-free-icons" +import { HugeiconsIcon } from "@hugeicons/react" + +import { Button } from "@/styles/base-rhea/ui/button" +import { + Card, + CardAction, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/styles/base-rhea/ui/card" +import { + Item, + ItemContent, + ItemDescription, + ItemGroup, + ItemTitle, +} from "@/styles/base-rhea/ui/item" + +const HOLDINGS = [ + { + name: "Vanguard", + shares: "450 Shares", + amount: "$1,842.10", + data: [ + { q: "Q1", value: 380 }, + { q: "Q2", value: 420 }, + { q: "Q3", value: 390 }, + { q: "Q4", value: 652 }, + ], + }, + { + name: "S&P 500 VOO", + shares: "112 Shares", + amount: "$928.40", + data: [ + { q: "Q1", value: 180 }, + { q: "Q2", value: 210 }, + { q: "Q3", value: 320 }, + { q: "Q4", value: 218 }, + ], + }, + { + name: "Apple AAPL", + shares: "85 Shares", + amount: "$340.00", + data: [ + { q: "Q1", value: 60 }, + { q: "Q2", value: 70 }, + { q: "Q3", value: 120 }, + { q: "Q4", value: 90 }, + ], + }, + { + name: "Realty Income", + shares: "320 Shares", + amount: "$1,139.50", + data: [ + { q: "Q1", value: 240 }, + { q: "Q2", value: 260 }, + { q: "Q3", value: 280 }, + { q: "Q4", value: 360 }, + ], + }, +] + +export function DividendIncome() { + return ( + + + Q2 Dividend Income + + Quarterly dividend payouts across your portfolio holdings. + + + + + + + + {HOLDINGS.map((holding) => ( + + + {holding.name} + {holding.shares} + +
+ {holding.data.map((item) => ( +
point.value))) * 100}%`, + }} + /> + ))} +
+ + ))} + + + + ) +} diff --git a/apps/v4/app/(app)/(root)/cards/empty-distribute-track.tsx b/apps/v4/app/(app)/(root)/cards/empty-distribute-track.tsx new file mode 100644 index 0000000000..1f5e0ff504 --- /dev/null +++ b/apps/v4/app/(app)/(root)/cards/empty-distribute-track.tsx @@ -0,0 +1,37 @@ +import { Add01Icon } from "@hugeicons/core-free-icons" +import { HugeiconsIcon } from "@hugeicons/react" + +import { Button } from "@/styles/base-rhea/ui/button" +import { Card, CardContent } from "@/styles/base-rhea/ui/card" +import { + Empty, + EmptyContent, + EmptyDescription, + EmptyHeader, + EmptyMedia, + EmptyTitle, +} from "@/styles/base-rhea/ui/empty" + +export function EmptyDistributeTrack() { + return ( + + + + + + + + Distribute Track + + Upload your first master to start reaching listeners on Spotify, + Apple Music, and more. + + + + + + + + + ) +} diff --git a/apps/v4/app/(app)/(root)/cards/index.tsx b/apps/v4/app/(app)/(root)/cards/index.tsx new file mode 100644 index 0000000000..3a97c04ecf --- /dev/null +++ b/apps/v4/app/(app)/(root)/cards/index.tsx @@ -0,0 +1,117 @@ +import { AccountAccess } from "./account-access" +import { AnalyticsCard } from "./analytics-card" +import { ClaimableBalance } from "./claimable-balance" +import { ContributionHistory } from "./contribution-history" +import { DividendIncome } from "./dividend-income" +import { EmptyDistributeTrack } from "./empty-distribute-track" +import { NewMilestone } from "./new-milestone" +import { NotificationSettings } from "./notification-settings" +import { Payments } from "./payments" +import { PayoutThreshold } from "./payout-threshold" +import { PowerUsage } from "./power-usage" +import { QrConnect } from "./qr-connect" +import { SavingsTargets } from "./savings-targets" +import { SidebarNav } from "./sidebar-nav" +import { AccountAccess as SkeletonAccountAccess } from "./skeleton/account-access" +import { AnalyticsCard as SkeletonAnalyticsCard } from "./skeleton/analytics-card" +import { ClaimableBalance as SkeletonClaimableBalance } from "./skeleton/claimable-balance" +import { ContributionHistory as SkeletonContributionHistory } from "./skeleton/contribution-history" +import { DividendIncome as SkeletonDividendIncome } from "./skeleton/dividend-income" +import { EmptyDistributeTrack as SkeletonEmptyDistributeTrack } from "./skeleton/empty-distribute-track" +import { NewMilestone as SkeletonNewMilestone } from "./skeleton/new-milestone" +import { NotificationSettings as SkeletonNotificationSettings } from "./skeleton/notification-settings" +import { Payments as SkeletonPayments } from "./skeleton/payments" +import { PayoutThreshold as SkeletonPayoutThreshold } from "./skeleton/payout-threshold" +import { PowerUsage as SkeletonPowerUsage } from "./skeleton/power-usage" +import { QrConnect as SkeletonQrConnect } from "./skeleton/qr-connect" +import { SavingsTargets as SkeletonSavingsTargets } from "./skeleton/savings-targets" +import { TransferFunds as SkeletonTransferFunds } from "./skeleton/transfer-funds" +import { UIElements as SkeletonUIElements } from "./skeleton/ui-elements" +import { TransferFunds } from "./transfer-funds" +import { UIElements } from "./ui-elements" + +function CardsSkeletonRails() { + return ( + + ) +} + +export function CardsDemo() { + return ( +
+ +
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + + + +
+
+
+
+
+ ) +} diff --git a/apps/v4/app/(app)/(root)/cards/new-milestone.tsx b/apps/v4/app/(app)/(root)/cards/new-milestone.tsx new file mode 100644 index 0000000000..d1bf86a7a6 --- /dev/null +++ b/apps/v4/app/(app)/(root)/cards/new-milestone.tsx @@ -0,0 +1,52 @@ +import { Button } from "@/styles/base-rhea/ui/button" +import { + Card, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} from "@/styles/base-rhea/ui/card" +import { Field, FieldGroup, FieldLabel } from "@/styles/base-rhea/ui/field" +import { Input } from "@/styles/base-rhea/ui/input" + +export function NewMilestone() { + return ( + + + Set a new milestone + + Define your financial target and we'll help you pace your + savings. + + + + + + Goal Name + + +
+ + Target Amount + + + + Target Date + + +
+
+
+ + + + +
+ ) +} diff --git a/apps/v4/app/(app)/(root)/cards/notification-settings.tsx b/apps/v4/app/(app)/(root)/cards/notification-settings.tsx new file mode 100644 index 0000000000..dcff8031f0 --- /dev/null +++ b/apps/v4/app/(app)/(root)/cards/notification-settings.tsx @@ -0,0 +1,76 @@ +import { Button } from "@/styles/base-rhea/ui/button" +import { + Card, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} from "@/styles/base-rhea/ui/card" +import { Checkbox } from "@/styles/base-rhea/ui/checkbox" +import { + Field, + FieldContent, + FieldDescription, + FieldGroup, + FieldLabel, +} from "@/styles/base-rhea/ui/field" + +const NOTIFICATIONS = [ + { + id: "transactions", + label: "Transaction alerts", + description: "Deposits, withdrawals, and transfers.", + defaultChecked: true, + }, + { + id: "security", + label: "Security alerts", + description: "Login attempts and account changes.", + defaultChecked: true, + }, + { + id: "goals", + label: "Goal milestones", + description: "Updates at 25%, 50%, 75%, and 100%.", + defaultChecked: false, + }, + { + id: "market", + label: "Market updates", + description: "Daily portfolio summary and price alerts.", + defaultChecked: false, + }, +] + +export function NotificationSettings() { + return ( + + + Notifications + + Choose which email and push alerts you want to receive. + + + + + {NOTIFICATIONS.map((n) => ( + + + + {n.label} + {n.description} + + + ))} + + + + + + + ) +} diff --git a/apps/v4/app/(app)/(root)/cards/payments.tsx b/apps/v4/app/(app)/(root)/cards/payments.tsx new file mode 100644 index 0000000000..7102f33d9a --- /dev/null +++ b/apps/v4/app/(app)/(root)/cards/payments.tsx @@ -0,0 +1,139 @@ +import { + ArrowRight01Icon, + Calendar03Icon, + MoreHorizontalCircle01Icon, + RefreshIcon, + Settings01Icon, +} from "@hugeicons/core-free-icons" +import { HugeiconsIcon } from "@hugeicons/react" + +import { + Breadcrumb, + BreadcrumbItem, + BreadcrumbLink, + BreadcrumbList, + BreadcrumbPage, + BreadcrumbSeparator, +} from "@/styles/base-rhea/ui/breadcrumb" +import { Button } from "@/styles/base-rhea/ui/button" +import { Card, CardContent, CardHeader } from "@/styles/base-rhea/ui/card" +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@/styles/base-rhea/ui/dropdown-menu" +import { + Item, + ItemContent, + ItemDescription, + ItemGroup, + ItemMedia, + ItemTitle, +} from "@/styles/base-rhea/ui/item" + +export function Payments() { + return ( + + + + + + Home + + + + + + } + > + + Account options + + + + Profile + Statements + Documents + + + + + + + Payments + + + + + + +
+ }> + + + + + Change transfer limit + + Adjust how much you can send from your balance. + + + + +
+
+ }> + + + + + Scheduled transfers + + Set up a transfer to send at a later date. + + + + +
+
+ }> + + + + + Recurring card payments + + Manage your repeated card transactions. + + + + +
+
+
+
+ ) +} diff --git a/apps/v4/app/(app)/(root)/cards/payout-threshold.tsx b/apps/v4/app/(app)/(root)/cards/payout-threshold.tsx new file mode 100644 index 0000000000..2df21ad581 --- /dev/null +++ b/apps/v4/app/(app)/(root)/cards/payout-threshold.tsx @@ -0,0 +1,112 @@ +import { Cancel01Icon } from "@hugeicons/core-free-icons" +import { HugeiconsIcon } from "@hugeicons/react" + +import { Button } from "@/styles/base-rhea/ui/button" +import { + Card, + CardAction, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} from "@/styles/base-rhea/ui/card" +import { + Field, + FieldDescription, + FieldGroup, + FieldLabel, +} from "@/styles/base-rhea/ui/field" +import { Progress } from "@/styles/base-rhea/ui/progress" +import { + Select, + SelectContent, + SelectGroup, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/styles/base-rhea/ui/select" +import { Textarea } from "@/styles/base-rhea/ui/textarea" + +const CURRENCIES = [ + { label: "USD — United States Dollar", value: "usd" }, + { label: "EUR — Euro", value: "eur" }, + { label: "GBP — British Pound", value: "gbp" }, + { label: "JPY — Japanese Yen", value: "jpy" }, +] + +export function PayoutThreshold() { + return ( + + + Payout Threshold + + Set the minimum balance required before a payout is triggered. + + + + + + + + + + Preferred Currency + + + + +
+ + Minimum Payout Amount + + + $2500.00 + +
+ +
+ $50 (MIN) + $10,000 (MAX) +
+
+ + Notes +