├── .eslintrc.json ├── app ├── favicon.ico ├── fonts │ ├── GeistVF.woff │ └── GeistMonoVF.woff ├── sign-in │ └── [[...sign-in]] │ │ └── page.tsx ├── sign-up │ └── [[...sign-up]] │ │ └── page.tsx ├── layout.tsx ├── page.tsx ├── globals.css ├── groups │ └── page.tsx ├── actions.ts ├── group │ ├── page.tsx │ └── [id] │ │ └── page.tsx └── expense │ └── page.tsx ├── public └── og-image.png ├── next.config.mjs ├── next.config.js ├── .env.example ├── postcss.config.mjs ├── lib └── utils.ts ├── components.json ├── .gitignore ├── middleware.ts ├── tsconfig.json ├── components ├── FeatureCard.tsx ├── ui │ ├── label.tsx │ ├── textarea.tsx │ ├── toaster.tsx │ ├── input.tsx │ ├── button.tsx │ ├── card.tsx │ ├── toast.tsx │ └── select.tsx ├── Banner.tsx └── Navigation.tsx ├── package.json ├── tailwind.config.ts ├── README.md └── hooks └── use-toast.ts /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["next/core-web-vitals", "next/typescript"] 3 | } 4 | -------------------------------------------------------------------------------- /app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kulkarniankita/splitwise-clone-app-ai/HEAD/app/favicon.ico -------------------------------------------------------------------------------- /public/og-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kulkarniankita/splitwise-clone-app-ai/HEAD/public/og-image.png -------------------------------------------------------------------------------- /app/fonts/GeistVF.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kulkarniankita/splitwise-clone-app-ai/HEAD/app/fonts/GeistVF.woff -------------------------------------------------------------------------------- /next.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = {}; 3 | 4 | export default nextConfig; 5 | -------------------------------------------------------------------------------- /app/fonts/GeistMonoVF.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kulkarniankita/splitwise-clone-app-ai/HEAD/app/fonts/GeistMonoVF.woff -------------------------------------------------------------------------------- /next.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = {}; 3 | 4 | module.exports = nextConfig; 5 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY= 2 | CLERK_SECRET_KEY= 3 | NEXT_PUBLIC_CLERK_SIGN_IN_URL= 4 | NEXT_PUBLIC_CLERK_SIGN_UP_URL= 5 | DATABASE_URL= -------------------------------------------------------------------------------- /postcss.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('postcss-load-config').Config} */ 2 | const config = { 3 | plugins: { 4 | tailwindcss: {}, 5 | }, 6 | }; 7 | 8 | export default config; 9 | -------------------------------------------------------------------------------- /lib/utils.ts: -------------------------------------------------------------------------------- 1 | import { clsx, type ClassValue } from "clsx" 2 | import { twMerge } from "tailwind-merge" 3 | 4 | export function cn(...inputs: ClassValue[]) { 5 | return twMerge(clsx(inputs)) 6 | } 7 | -------------------------------------------------------------------------------- /app/sign-in/[[...sign-in]]/page.tsx: -------------------------------------------------------------------------------- 1 | import { SignIn } from '@clerk/nextjs'; 2 | 3 | export default function Page() { 4 | return ( 5 |
{description}
23 |14 | Whether it's a group trip or dinner, Split makes it easy to track 15 | shared expenses and settle up in a single tap. 16 |
17 | 18 | 24 | 25 |38 | {role === 'org:admin' ? 'Admin' : 'Member'} 39 |
40 |81 | View and manage all your groups in one place. You can see the groups 82 | you're a part of, your role in each group, and easily access each 83 | group's details. 84 |
85 |77 | Split expenses with friends, roommates, and more. 78 |
79 | 80 | 141 |Loading...
74 |{groupDescription}
158 | 159 |172 | Owes you ${formatAmount(balance.amount)} 173 |
174 |180 | 🌟 No outstanding balances. Everyone's all squared up! 🎉 181 |
182 | )} 183 | 184 |198 | ${formatAmount(expense.amount)} · 199 | {expense.split_with.map((s) => s.name).join(', ')} 200 |
201 |202 | Split type: Percentage{' '} 203 | {( 204 | (expense.split_with[0]?.splitAmount / expense.amount) * 205 | 100 206 | ).toFixed(2)} 207 | % 208 |
209 |221 | 💸 No expenses yet. Time to split some bills! 🧾 222 |
223 | )} 224 |162 | Record your expenses and split them with your group. 163 |
164 | 165 | 293 |