diff --git a/.eslintrc.json b/.eslintrc.json
new file mode 100644
index 0000000..25b0abf
--- /dev/null
+++ b/.eslintrc.json
@@ -0,0 +1,27 @@
+{
+ "$schema": "https://json.schemastore.org/eslintrc",
+ "root": true,
+ "extends": [
+ "next/core-web-vitals",
+ "prettier",
+ "plugin:tailwindcss/recommended"
+ ],
+ "plugins": ["tailwindcss"],
+ "rules": {
+ "tailwindcss/no-custom-classname": "off",
+ "tailwindcss/classnames-order": "off",
+ "tailwindcss/enforces-shorthand": "off"
+ },
+ "settings": {
+ "tailwindcss": {
+ "callees": ["cn", "cva"],
+ "config": "tailwind.config.js"
+ }
+ },
+ "overrides": [
+ {
+ "files": ["*.ts", "*.tsx"],
+ "parser": "@typescript-eslint/parser"
+ }
+ ]
+}
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index ccbba65..f3130e5 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -2,7 +2,7 @@ name: CI
on:
push:
- branches: ["main"]
+ branches: ['main']
pull_request:
types: [opened, synchronize]
@@ -11,11 +11,6 @@ jobs:
name: Build and Test
timeout-minutes: 15
runs-on: ubuntu-latest
- # To use Remote Caching, uncomment the next lines and follow the steps below.
- # env:
- # TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
- # TURBO_TEAM: ${{ vars.TURBO_TEAM }}
-
steps:
- name: Check out code
uses: actions/checkout@v4
@@ -30,7 +25,7 @@ jobs:
uses: actions/setup-node@v4
with:
node-version: 20
- cache: "pnpm"
+ cache: 'pnpm'
- name: Install dependencies
run: pnpm install
diff --git a/.gitignore b/.gitignore
index 96fab4f..fd3dbb5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,38 +1,36 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
-# Dependencies
-node_modules
-.pnp
+# dependencies
+/node_modules
+/.pnp
.pnp.js
+.yarn/install-state.gz
-# Local env files
-.env
-.env.local
-.env.development.local
-.env.test.local
-.env.production.local
+# testing
+/coverage
-# Testing
-coverage
+# next.js
+/.next/
+/out/
-# Turbo
-.turbo
-
-# Vercel
-.vercel
-
-# Build Outputs
-.next/
-out/
-build
-dist
+# production
+/build
+# misc
+.DS_Store
+*.pem
-# Debug
+# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
-# Misc
-.DS_Store
-*.pem
+# local env files
+.env*.local
+
+# vercel
+.vercel
+
+# typescript
+*.tsbuildinfo
+next-env.d.ts
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 9caca5e..a11d86d 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -3,27 +3,6 @@
Thank you for considering contributing to Swolo! This document outlines the
process for contributing to this project.
-## About this repository
-
-This repository is a monorepo.
-
-- [pnpm](https://pnpm.io) and [`workspaces`](https://pnpm.io/workspaces) are used for development.
-- [Turborepo](https://turbo.build/repo) is the build system, with `@repo` for internal packages.
-- (_planned_) [changesets](https://github.com/changesets/changesets) will be used for managing releases.
-
-## Structure
-
-This repository is structured as follows:
-
-| Path | Description |
-| ----------------------------- | ------------------------------------------------------------------------------------ |
-| `apps/web` | The Next.js application for the Swolo website |
-| `packages/core` | Core functionality, such as routes, shared by the applications |
-| `packages/ui` | A React component library shared by the applications |
-| `packages/eslint-config` | `eslint` configurations (includes `eslint-config-next` and `eslint-config-prettier`) |
-| `packages/tailwind-config` | `tailwind.config` for importing into presets of local `tailwind.config.ts` files |
-| `packages/typescript-config ` | `tsconfig.json`s used throughout the monorepo |
-
## Development
### Clone on your local machine
@@ -53,22 +32,7 @@ The `pnpm dev:` scripts are used to start the development process for a workspac
To run the Swolo website:
```bash
-pnpm dev:web
-```
-
-### Managing dependencies
-
-When adding dependencies, follow Turbo's [Best practices for dependency installation](https://turbo.build/repo/docs/crafting-your-repository/managing-dependencies#best-practices-for-dependency-installation):
-
-> Install dependencies where they're used. When you install a dependency in your repository, you should install it directly in the package that uses it. The package's package.json will have every dependency that the package needs. This is true for both external and internal dependencies.
-
-### Versioning dependencies
-
-As a rule, keep dependencies on the same version across all packages. Use
-`pnpm up` to update dependency versions in one command. For example:
-
-```bash
-pnpm up --recursive typescript@latest
+pnpm dev
```
## Commit convention
diff --git a/README.md b/README.md
index 723a0d7..06db85f 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
Inspired by the
[Getting Things Done](https://en.wikipedia.org/wiki/Getting_Things_Done)
-methodology and Ben Solo's iconic shirtless scene, Swolo is a cross-platform
+methodology and Ben Solo's iconic shirtless scene, Swolo is a
**project management and note-taking app** designed for a party of one.
Capture tasks, manage projects, and take notes with confidence — just like Ben,
@@ -12,10 +12,12 @@ you're swol enough to handle anything your workload throws at you.
## Guiding principles
-- **Effortless capture** — Quickly capture tasks and ideas, clearing your mind of distractions for later processing.
-- **Work anywhere** — Access your content seamlessly from the web or desktop, whether you're online or offline.
-- **Frictionless task setup** — Start tasks from anywhere, even while taking notes, to keep your workflow smooth.
-- **Label all the things** — Tag your tasks and notes for easy searching and organization.
+- **Effortless capture** — Quickly capture tasks and ideas, clearing your mind
+ of distractions for later processing.
+- **Frictionless task setup** — Start tasks from anywhere, even while taking
+ notes, to keep your workflow smooth.
+- **Label all the things** — Tag your tasks and notes for easy searching and
+ organization.
- **Full data control** — Export your data at anytime.
## Contributing
@@ -40,4 +42,4 @@ Licensed under the [MIT license](https://github.com/shadcn/ui/blob/main/LICENSE.
-![Ben Swolo meme](./img/do-you-even.png)
+![Ben Swolo meme](./docs/img/do-you-even.png)
diff --git a/apps/web/app/_fonts/GeistMonoVF.woff b/app/_fonts/GeistMonoVF.woff
similarity index 100%
rename from apps/web/app/_fonts/GeistMonoVF.woff
rename to app/_fonts/GeistMonoVF.woff
diff --git a/apps/web/app/_fonts/GeistVF.woff b/app/_fonts/GeistVF.woff
similarity index 100%
rename from apps/web/app/_fonts/GeistVF.woff
rename to app/_fonts/GeistVF.woff
diff --git a/apps/web/app/favicon.ico b/app/favicon.ico
similarity index 100%
rename from apps/web/app/favicon.ico
rename to app/favicon.ico
diff --git a/app/globals.css b/app/globals.css
new file mode 100644
index 0000000..1dcb0fc
--- /dev/null
+++ b/app/globals.css
@@ -0,0 +1,78 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+body {
+ font-family: Arial, Helvetica, sans-serif;
+}
+
+@layer utilities {
+ .text-balance {
+ text-wrap: balance;
+ }
+}
+
+@layer base {
+ :root {
+ --background: 0 0% 100%;
+ --foreground: 0 0% 3.9%;
+ --card: 0 0% 100%;
+ --card-foreground: 0 0% 3.9%;
+ --popover: 0 0% 100%;
+ --popover-foreground: 0 0% 3.9%;
+ --primary: 0 0% 9%;
+ --primary-foreground: 0 0% 98%;
+ --secondary: 0 0% 96.1%;
+ --secondary-foreground: 0 0% 9%;
+ --muted: 0 0% 96.1%;
+ --muted-foreground: 0 0% 45.1%;
+ --accent: 0 0% 96.1%;
+ --accent-foreground: 0 0% 9%;
+ --destructive: 0 84.2% 60.2%;
+ --destructive-foreground: 0 0% 98%;
+ --border: 0 0% 89.8%;
+ --input: 0 0% 89.8%;
+ --ring: 0 0% 3.9%;
+ --chart-1: 12 76% 61%;
+ --chart-2: 173 58% 39%;
+ --chart-3: 197 37% 24%;
+ --chart-4: 43 74% 66%;
+ --chart-5: 27 87% 67%;
+ --radius: 0.5rem;
+ }
+ .dark {
+ --background: 0 0% 3.9%;
+ --foreground: 0 0% 98%;
+ --card: 0 0% 3.9%;
+ --card-foreground: 0 0% 98%;
+ --popover: 0 0% 3.9%;
+ --popover-foreground: 0 0% 98%;
+ --primary: 0 0% 98%;
+ --primary-foreground: 0 0% 9%;
+ --secondary: 0 0% 14.9%;
+ --secondary-foreground: 0 0% 98%;
+ --muted: 0 0% 14.9%;
+ --muted-foreground: 0 0% 63.9%;
+ --accent: 0 0% 14.9%;
+ --accent-foreground: 0 0% 98%;
+ --destructive: 0 62.8% 30.6%;
+ --destructive-foreground: 0 0% 98%;
+ --border: 0 0% 14.9%;
+ --input: 0 0% 14.9%;
+ --ring: 0 0% 83.1%;
+ --chart-1: 220 70% 50%;
+ --chart-2: 160 60% 45%;
+ --chart-3: 30 80% 55%;
+ --chart-4: 280 65% 60%;
+ --chart-5: 340 75% 55%;
+ }
+}
+
+@layer base {
+ * {
+ @apply border-border;
+ }
+ body {
+ @apply bg-background text-foreground;
+ }
+}
diff --git a/apps/web/app/inbox/page.tsx b/app/inbox/page.tsx
similarity index 100%
rename from apps/web/app/inbox/page.tsx
rename to app/inbox/page.tsx
diff --git a/app/layout.tsx b/app/layout.tsx
new file mode 100644
index 0000000..a09a36a
--- /dev/null
+++ b/app/layout.tsx
@@ -0,0 +1,38 @@
+'use client';
+
+import { ActionBar } from '@/components/ui/shell/action-bar';
+import { Main } from '@/components/ui/shell/main';
+import { Shell } from '@/components/ui/shell/shell';
+import { Toolbar } from '@/components/ui/toolbar';
+import localFont from 'next/font/local';
+import { useRouter } from 'next/navigation';
+import './globals.css';
+
+const geistSans = localFont({
+ src: './_fonts/GeistVF.woff',
+ variable: '--font-geist-sans',
+});
+const geistMono = localFont({
+ src: './_fonts/GeistMonoVF.woff',
+ variable: '--font-geist-mono',
+});
+
+export default function RootLayout({
+ children,
+}: Readonly<{
+ children: React.ReactNode;
+}>) {
+ const router = useRouter();
+
+ return (
+
+
+
+
+ router.push(path)}>
+ {children}
+
+
+
+ );
+}
diff --git a/apps/web/app/page.tsx b/app/page.tsx
similarity index 100%
rename from apps/web/app/page.tsx
rename to app/page.tsx
diff --git a/apps/web/app/pages/page.tsx b/app/pages/page.tsx
similarity index 100%
rename from apps/web/app/pages/page.tsx
rename to app/pages/page.tsx
diff --git a/apps/web/app/projects/page.tsx b/app/projects/page.tsx
similarity index 100%
rename from apps/web/app/projects/page.tsx
rename to app/projects/page.tsx
diff --git a/apps/web/app/settings/page.tsx b/app/settings/page.tsx
similarity index 100%
rename from apps/web/app/settings/page.tsx
rename to app/settings/page.tsx
diff --git a/apps/web/app/tasks/page.tsx b/app/tasks/page.tsx
similarity index 100%
rename from apps/web/app/tasks/page.tsx
rename to app/tasks/page.tsx
diff --git a/apps/web/.eslintrc.js b/apps/web/.eslintrc.js
deleted file mode 100644
index 7d644a4..0000000
--- a/apps/web/.eslintrc.js
+++ /dev/null
@@ -1,9 +0,0 @@
-/** @type {import("eslint").Linter.Config} */
-module.exports = {
- root: true,
- extends: ["@repo/eslint-config/next.js"],
- parser: "@typescript-eslint/parser",
- parserOptions: {
- project: true,
- },
-};
diff --git a/apps/web/.gitignore b/apps/web/.gitignore
deleted file mode 100644
index f886745..0000000
--- a/apps/web/.gitignore
+++ /dev/null
@@ -1,36 +0,0 @@
-# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
-
-# dependencies
-/node_modules
-/.pnp
-.pnp.js
-.yarn/install-state.gz
-
-# testing
-/coverage
-
-# next.js
-/.next/
-/out/
-
-# production
-/build
-
-# misc
-.DS_Store
-*.pem
-
-# debug
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-
-# env files (can opt-in for commiting if needed)
-.env*
-
-# vercel
-.vercel
-
-# typescript
-*.tsbuildinfo
-next-env.d.ts
diff --git a/apps/web/README.md b/apps/web/README.md
deleted file mode 100644
index a98bfa8..0000000
--- a/apps/web/README.md
+++ /dev/null
@@ -1,36 +0,0 @@
-This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/create-next-app).
-
-## Getting Started
-
-First, run the development server:
-
-```bash
-npm run dev
-# or
-yarn dev
-# or
-pnpm dev
-# or
-bun dev
-```
-
-Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
-
-You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
-
-This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load Inter, a custom Google Font.
-
-## Learn More
-
-To learn more about Next.js, take a look at the following resources:
-
-- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
-- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
-
-You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
-
-## Deploy on Vercel
-
-The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
-
-Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
diff --git a/apps/web/app/globals.css b/apps/web/app/globals.css
deleted file mode 100644
index 1f32c2e..0000000
--- a/apps/web/app/globals.css
+++ /dev/null
@@ -1,104 +0,0 @@
-@tailwind base;
-@tailwind components;
-@tailwind utilities;
-
-@layer base {
- :root {
- --background: 0 0% 100%;
- --foreground: 240 10% 3.9%;
- --card: 0 0% 100%;
- --card-foreground: 240 10% 3.9%;
- --popover: 0 0% 100%;
- --popover-foreground: 240 10% 3.9%;
- --primary: 240 5.9% 10%;
- --primary-foreground: 0 0% 98%;
- --secondary: 240 4.8% 95.9%;
- --secondary-foreground: 240 5.9% 10%;
- --muted: 240 4.8% 95.9%;
- --muted-foreground: 240 3.8% 46.1%;
- --accent: 240 4.8% 95.9%;
- --accent-foreground: 240 5.9% 10%;
- --destructive: 0 72.22% 50.59%;
- --destructive-foreground: 0 0% 98%;
- --border: 240 5.9% 90%;
- --input: 240 5.9% 90%;
- --ring: 240 5% 64.9%;
- --radius: 0.5rem;
-
- --chart-1: 12 76% 61%;
- --chart-2: 173 58% 39%;
- --chart-3: 197 37% 24%;
- --chart-4: 43 74% 66%;
- --chart-5: 27 87% 67%;
- }
-
- .dark {
- --background: 240 10% 3.9%;
- --foreground: 0 0% 98%;
- --card: 240 10% 3.9%;
- --card-foreground: 0 0% 98%;
- --popover: 240 10% 3.9%;
- --popover-foreground: 0 0% 98%;
- --primary: 0 0% 98%;
- --primary-foreground: 240 5.9% 10%;
- --secondary: 240 3.7% 15.9%;
- --secondary-foreground: 0 0% 98%;
- --muted: 240 3.7% 15.9%;
- --muted-foreground: 240 5% 64.9%;
- --accent: 240 3.7% 15.9%;
- --accent-foreground: 0 0% 98%;
- --destructive: 0 62.8% 30.6%;
- --destructive-foreground: 0 85.7% 97.3%;
- --border: 240 3.7% 15.9%;
- --input: 240 3.7% 15.9%;
- --ring: 240 4.9% 83.9%;
-
- --chart-1: 220 70% 50%;
- --chart-2: 160 60% 45%;
- --chart-3: 30 80% 55%;
- --chart-4: 280 65% 60%;
- --chart-5: 340 75% 55%;
- }
-}
-
-@layer base {
- * {
- @apply border-border;
- }
- html {
- @apply scroll-smooth;
- }
- body {
- @apply bg-background text-foreground;
- /* font-feature-settings: "rlig" 1, "calt" 1; */
- font-synthesis-weight: none;
- text-rendering: optimizeLegibility;
- }
-}
-
-@layer utilities {
- .step {
- counter-increment: step;
- }
-
- .step:before {
- @apply absolute w-9 h-9 bg-muted rounded-full font-mono font-medium text-center text-base inline-flex items-center justify-center -indent-px border-4 border-background;
- @apply ml-[-50px] mt-[-4px];
- content: counter(step);
- }
-
- .chunk-container {
- @apply shadow-none;
- }
-
- .chunk-container::after {
- content: "";
- @apply absolute -inset-4 shadow-xl rounded-xl border;
- }
-}
-
-@media (max-width: 640px) {
- .container {
- @apply px-4;
- }
-}
\ No newline at end of file
diff --git a/apps/web/app/layout.tsx b/apps/web/app/layout.tsx
deleted file mode 100644
index b311af9..0000000
--- a/apps/web/app/layout.tsx
+++ /dev/null
@@ -1,41 +0,0 @@
-"use client";
-
-import { useRouter } from "next/navigation";
-import localFont from "next/font/local";
-import "./globals.css";
-import "@repo/ui/styles.css";
-import { Shell } from "@repo/ui/shell/shell";
-import { ActionBar } from "@repo/ui/shell/action-bar";
-// import { HeaderBar } from "@repo/ui/shell/header-bar";
-import { Main } from "@repo/ui/shell/main";
-import { Toolbar } from "@repo/ui/toolbar";
-
-const geistSans = localFont({
- src: "./_fonts/GeistVF.woff",
- variable: "--font-geist-sans",
-});
-const geistMono = localFont({
- src: "./_fonts/GeistMonoVF.woff",
- variable: "--font-geist-mono",
-});
-
-export default function RootLayout({
- children,
-}: Readonly<{
- children: React.ReactNode;
-}>) {
- const router = useRouter();
-
- return (
-
-
-
- {/* Header */}
-
- router.push(path)}>
- {children}
-
-
-
- );
-}
diff --git a/apps/web/package.json b/apps/web/package.json
deleted file mode 100644
index 6d5339b..0000000
--- a/apps/web/package.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "name": "web",
- "version": "0.1.0",
- "private": true,
- "scripts": {
- "dev": "next dev --turbo",
- "build": "next build",
- "start": "next start",
- "lint": "next lint"
- },
- "dependencies": {
- "@repo/core": "workspace:*",
- "@repo/ui": "workspace:*",
- "clsx": "^2.1.1",
- "next": "14.2.6",
- "react": "18.3.1",
- "react-dom": "18.3.1",
- "tailwind-merge": "^2.5.3"
- },
- "devDependencies": {
- "@repo/eslint-config": "workspace:*",
- "@repo/tailwind-config": "workspace:*",
- "@repo/typescript-config": "workspace:*",
- "@types/node": "^20",
- "@types/react": "^18",
- "@types/react-dom": "^18",
- "autoprefixer": "^10.4.20",
- "eslint": "^8",
- "eslint-config-next": "14.2.6",
- "postcss": "^8.4.47",
- "tailwindcss": "^3.4.1",
- "tailwindcss-animate": "^1.0.7",
- "typescript": "^5.6.2",
- "typescript-plugin-css-modules": "^5.1.0"
- }
-}
diff --git a/apps/web/postcss.config.js b/apps/web/postcss.config.js
deleted file mode 100644
index 07aa434..0000000
--- a/apps/web/postcss.config.js
+++ /dev/null
@@ -1,9 +0,0 @@
-// If you want to use other PostCSS plugins, see the following:
-// https://tailwindcss.com/docs/using-with-preprocessors
-
-module.exports = {
- plugins: {
- tailwindcss: {},
- autoprefixer: {},
- },
-};
diff --git a/apps/web/public/file-text.svg b/apps/web/public/file-text.svg
deleted file mode 100644
index 9cfb3c9..0000000
--- a/apps/web/public/file-text.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
diff --git a/apps/web/public/globe.svg b/apps/web/public/globe.svg
deleted file mode 100644
index 4230a3d..0000000
--- a/apps/web/public/globe.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-
diff --git a/apps/web/public/next.svg b/apps/web/public/next.svg
deleted file mode 100644
index 5174b28..0000000
--- a/apps/web/public/next.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/apps/web/public/vercel.svg b/apps/web/public/vercel.svg
deleted file mode 100644
index 0164ddc..0000000
--- a/apps/web/public/vercel.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-
diff --git a/apps/web/public/window.svg b/apps/web/public/window.svg
deleted file mode 100644
index bbc7800..0000000
--- a/apps/web/public/window.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
diff --git a/apps/web/tailwind.config.ts b/apps/web/tailwind.config.ts
deleted file mode 100644
index 2e8c725..0000000
--- a/apps/web/tailwind.config.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-// tailwind config is required for editor support
-
-import type { Config } from "tailwindcss";
-import sharedConfig from "@repo/tailwind-config";
-
-const config: Pick = {
- content: ["./app/**/*.tsx", "../../packages/ui/src/**/*{.js,.ts,.jsx,.tsx}"],
- presets: [sharedConfig],
-};
-
-export default config;
diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json
deleted file mode 100644
index df3ff5e..0000000
--- a/apps/web/tsconfig.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "extends": "@repo/typescript-config/nextjs.json",
- "compilerOptions": {
- "plugins": [
- {
- "name": "next"
- }
- ]
- },
- "include": [
- "next-env.d.ts",
- "next.config.mjs",
- "tailwind.config.ts",
- "**/*.ts",
- "**/*.tsx",
- ".next/types/**/*.ts"
- ],
- "exclude": ["node_modules"]
-}
diff --git a/components.json b/components.json
new file mode 100644
index 0000000..bcec1f9
--- /dev/null
+++ b/components.json
@@ -0,0 +1,20 @@
+{
+ "$schema": "https://ui.shadcn.com/schema.json",
+ "style": "new-york",
+ "rsc": true,
+ "tsx": true,
+ "tailwind": {
+ "config": "tailwind.config.ts",
+ "css": "app/globals.css",
+ "baseColor": "neutral",
+ "cssVariables": true,
+ "prefix": ""
+ },
+ "aliases": {
+ "components": "@/components",
+ "utils": "@/lib/utils",
+ "ui": "@/components/ui",
+ "lib": "@/lib",
+ "hooks": "@/hooks"
+ }
+}
\ No newline at end of file
diff --git a/components/ui/button.tsx b/components/ui/button.tsx
new file mode 100644
index 0000000..35a75ae
--- /dev/null
+++ b/components/ui/button.tsx
@@ -0,0 +1,57 @@
+import { Slot } from '@radix-ui/react-slot';
+import { cva, type VariantProps } from 'class-variance-authority';
+import * as React from 'react';
+
+import { cn } from '@/lib/utils';
+
+const buttonVariants = cva(
+ 'inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50',
+ {
+ variants: {
+ variant: {
+ default:
+ 'bg-primary text-primary-foreground shadow hover:bg-primary/90',
+ destructive:
+ 'bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90',
+ outline:
+ 'border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground',
+ secondary:
+ 'bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80',
+ ghost: 'hover:bg-accent hover:text-accent-foreground',
+ link: 'text-primary underline-offset-4 hover:underline',
+ },
+ size: {
+ default: 'h-9 px-4 py-2',
+ sm: 'h-8 rounded-md px-3 text-xs',
+ lg: 'h-10 rounded-md px-8',
+ icon: 'h-9 w-9',
+ },
+ },
+ defaultVariants: {
+ variant: 'default',
+ size: 'default',
+ },
+ },
+);
+
+export interface ButtonProps
+ extends React.ButtonHTMLAttributes,
+ VariantProps {
+ asChild?: boolean;
+}
+
+const Button = React.forwardRef(
+ ({ className, variant, size, asChild = false, ...props }, ref) => {
+ const Comp = asChild ? Slot : 'button';
+ return (
+
+ );
+ },
+);
+Button.displayName = 'Button';
+
+export { Button, buttonVariants };
diff --git a/packages/ui/src/dialog.tsx b/components/ui/dialog.tsx
similarity index 68%
rename from packages/ui/src/dialog.tsx
rename to components/ui/dialog.tsx
index 7b76a9d..ef4d836 100644
--- a/packages/ui/src/dialog.tsx
+++ b/components/ui/dialog.tsx
@@ -1,18 +1,18 @@
-"use client"
+'use client';
-import * as React from "react"
-import * as DialogPrimitive from "@radix-ui/react-dialog"
-import { X } from "lucide-react"
+import * as DialogPrimitive from '@radix-ui/react-dialog';
+import { Cross2Icon } from '@radix-ui/react-icons';
+import * as React from 'react';
-import { cn } from "@repo/ui/lib/utils";
+import { cn } from '@/lib/utils';
-const Dialog = DialogPrimitive.Root
+const Dialog = DialogPrimitive.Root;
-const DialogTrigger = DialogPrimitive.Trigger
+const DialogTrigger = DialogPrimitive.Trigger;
-const DialogPortal = DialogPrimitive.Portal
+const DialogPortal = DialogPrimitive.Portal;
-const DialogClose = DialogPrimitive.Close
+const DialogClose = DialogPrimitive.Close;
const DialogOverlay = React.forwardRef<
React.ElementRef,
@@ -21,13 +21,13 @@ const DialogOverlay = React.forwardRef<
-))
-DialogOverlay.displayName = DialogPrimitive.Overlay.displayName
+));
+DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
const DialogContent = React.forwardRef<
React.ElementRef,
@@ -38,20 +38,20 @@ const DialogContent = React.forwardRef<
{children}
-
+
Close
-))
-DialogContent.displayName = DialogPrimitive.Content.displayName
+));
+DialogContent.displayName = DialogPrimitive.Content.displayName;
const DialogHeader = ({
className,
@@ -59,13 +59,13 @@ const DialogHeader = ({
}: React.HTMLAttributes) => (
-)
-DialogHeader.displayName = "DialogHeader"
+);
+DialogHeader.displayName = 'DialogHeader';
const DialogFooter = ({
className,
@@ -73,13 +73,13 @@ const DialogFooter = ({
}: React.HTMLAttributes) => (
-)
-DialogFooter.displayName = "DialogFooter"
+);
+DialogFooter.displayName = 'DialogFooter';
const DialogTitle = React.forwardRef<
React.ElementRef,
@@ -88,13 +88,13 @@ const DialogTitle = React.forwardRef<
-))
-DialogTitle.displayName = DialogPrimitive.Title.displayName
+));
+DialogTitle.displayName = DialogPrimitive.Title.displayName;
const DialogDescription = React.forwardRef<
React.ElementRef,
@@ -102,21 +102,21 @@ const DialogDescription = React.forwardRef<
>(({ className, ...props }, ref) => (
-))
-DialogDescription.displayName = DialogPrimitive.Description.displayName
+));
+DialogDescription.displayName = DialogPrimitive.Description.displayName;
export {
Dialog,
- DialogPortal,
- DialogOverlay,
DialogClose,
- DialogTrigger,
DialogContent,
- DialogHeader,
+ DialogDescription,
DialogFooter,
+ DialogHeader,
+ DialogOverlay,
+ DialogPortal,
DialogTitle,
- DialogDescription,
-}
+ DialogTrigger,
+};
diff --git a/components/ui/input.tsx b/components/ui/input.tsx
new file mode 100644
index 0000000..501e8d9
--- /dev/null
+++ b/components/ui/input.tsx
@@ -0,0 +1,25 @@
+import * as React from 'react';
+
+import { cn } from '@/lib/utils';
+
+export interface InputProps
+ extends React.InputHTMLAttributes {}
+
+const Input = React.forwardRef(
+ ({ className, type, ...props }, ref) => {
+ return (
+
+ );
+ },
+);
+Input.displayName = 'Input';
+
+export { Input };
diff --git a/packages/ui/src/label.tsx b/components/ui/label.tsx
similarity index 50%
rename from packages/ui/src/label.tsx
rename to components/ui/label.tsx
index f0a97d8..9575458 100644
--- a/packages/ui/src/label.tsx
+++ b/components/ui/label.tsx
@@ -1,14 +1,14 @@
-"use client"
+'use client';
-import * as React from "react"
-import * as LabelPrimitive from "@radix-ui/react-label"
-import { cva, type VariantProps } from "class-variance-authority"
+import * as LabelPrimitive from '@radix-ui/react-label';
+import { cva, type VariantProps } from 'class-variance-authority';
+import * as React from 'react';
-import { cn } from "@repo/ui/lib/utils"
+import { cn } from '@/lib/utils';
const labelVariants = cva(
- "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
-)
+ 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70',
+);
const Label = React.forwardRef<
React.ElementRef,
@@ -20,7 +20,7 @@ const Label = React.forwardRef<
className={cn(labelVariants(), className)}
{...props}
/>
-))
-Label.displayName = LabelPrimitive.Root.displayName
+));
+Label.displayName = LabelPrimitive.Root.displayName;
-export { Label }
+export { Label };
diff --git a/packages/ui/src/menubar.tsx b/components/ui/menubar.tsx
similarity index 65%
rename from packages/ui/src/menubar.tsx
rename to components/ui/menubar.tsx
index 6021115..2fbc525 100644
--- a/packages/ui/src/menubar.tsx
+++ b/components/ui/menubar.tsx
@@ -1,17 +1,24 @@
-"use client"
+'use client';
-import * as React from "react"
-import * as MenubarPrimitive from "@radix-ui/react-menubar"
-import { Check, ChevronRight, Circle } from "lucide-react"
+import {
+ CheckIcon,
+ ChevronRightIcon,
+ DotFilledIcon,
+} from '@radix-ui/react-icons';
+import * as MenubarPrimitive from '@radix-ui/react-menubar';
+import * as React from 'react';
-import { cn } from "@repo/ui/lib/utils"
+import { cn } from '@/lib/utils';
-// Explicitly annotate the types
-const MenubarMenu: typeof MenubarPrimitive.Menu = MenubarPrimitive.Menu;
-const MenubarGroup: typeof MenubarPrimitive.Group = MenubarPrimitive.Group;
-const MenubarPortal: typeof MenubarPrimitive.Portal = MenubarPrimitive.Portal;
-const MenubarSub: typeof MenubarPrimitive.Sub = MenubarPrimitive.Sub;
-const MenubarRadioGroup: typeof MenubarPrimitive.RadioGroup = MenubarPrimitive.RadioGroup;
+const MenubarMenu = MenubarPrimitive.Menu;
+
+const MenubarGroup = MenubarPrimitive.Group;
+
+const MenubarPortal = MenubarPrimitive.Portal;
+
+const MenubarSub = MenubarPrimitive.Sub;
+
+const MenubarRadioGroup = MenubarPrimitive.RadioGroup;
const Menubar = React.forwardRef<
React.ElementRef,
@@ -20,13 +27,13 @@ const Menubar = React.forwardRef<
-))
-Menubar.displayName = MenubarPrimitive.Root.displayName
+));
+Menubar.displayName = MenubarPrimitive.Root.displayName;
const MenubarTrigger = React.forwardRef<
React.ElementRef,
@@ -35,34 +42,34 @@ const MenubarTrigger = React.forwardRef<
-))
-MenubarTrigger.displayName = MenubarPrimitive.Trigger.displayName
+));
+MenubarTrigger.displayName = MenubarPrimitive.Trigger.displayName;
const MenubarSubTrigger = React.forwardRef<
React.ElementRef,
React.ComponentPropsWithoutRef & {
- inset?: boolean
+ inset?: boolean;
}
>(({ className, inset, children, ...props }, ref) => (
{children}
-
+
-))
-MenubarSubTrigger.displayName = MenubarPrimitive.SubTrigger.displayName
+));
+MenubarSubTrigger.displayName = MenubarPrimitive.SubTrigger.displayName;
const MenubarSubContent = React.forwardRef<
React.ElementRef,
@@ -71,21 +78,21 @@ const MenubarSubContent = React.forwardRef<
-))
-MenubarSubContent.displayName = MenubarPrimitive.SubContent.displayName
+));
+MenubarSubContent.displayName = MenubarPrimitive.SubContent.displayName;
const MenubarContent = React.forwardRef<
React.ElementRef,
React.ComponentPropsWithoutRef
>(
(
- { className, align = "start", alignOffset = -4, sideOffset = 8, ...props },
- ref
+ { className, align = 'start', alignOffset = -4, sideOffset = 8, ...props },
+ ref,
) => (
- )
-)
-MenubarContent.displayName = MenubarPrimitive.Content.displayName
+ ),
+);
+MenubarContent.displayName = MenubarPrimitive.Content.displayName;
const MenubarItem = React.forwardRef<
React.ElementRef,
React.ComponentPropsWithoutRef & {
- inset?: boolean
+ inset?: boolean;
}
>(({ className, inset, ...props }, ref) => (
-))
-MenubarItem.displayName = MenubarPrimitive.Item.displayName
+));
+MenubarItem.displayName = MenubarPrimitive.Item.displayName;
const MenubarCheckboxItem = React.forwardRef<
React.ElementRef,
@@ -129,21 +136,21 @@ const MenubarCheckboxItem = React.forwardRef<
-
+
{children}
-))
-MenubarCheckboxItem.displayName = MenubarPrimitive.CheckboxItem.displayName
+));
+MenubarCheckboxItem.displayName = MenubarPrimitive.CheckboxItem.displayName;
const MenubarRadioItem = React.forwardRef<
React.ElementRef,
@@ -152,38 +159,38 @@ const MenubarRadioItem = React.forwardRef<
-
+
{children}
-))
-MenubarRadioItem.displayName = MenubarPrimitive.RadioItem.displayName
+));
+MenubarRadioItem.displayName = MenubarPrimitive.RadioItem.displayName;
const MenubarLabel = React.forwardRef<
React.ElementRef,
React.ComponentPropsWithoutRef & {
- inset?: boolean
+ inset?: boolean;
}
>(({ className, inset, ...props }, ref) => (
-))
-MenubarLabel.displayName = MenubarPrimitive.Label.displayName
+));
+MenubarLabel.displayName = MenubarPrimitive.Label.displayName;
const MenubarSeparator = React.forwardRef<
React.ElementRef,
@@ -191,11 +198,11 @@ const MenubarSeparator = React.forwardRef<
>(({ className, ...props }, ref) => (
-))
-MenubarSeparator.displayName = MenubarPrimitive.Separator.displayName
+));
+MenubarSeparator.displayName = MenubarPrimitive.Separator.displayName;
const MenubarShortcut = ({
className,
@@ -204,30 +211,30 @@ const MenubarShortcut = ({
return (
- )
-}
-MenubarShortcut.displayname = "MenubarShortcut"
+ );
+};
+MenubarShortcut.displayname = 'MenubarShortcut';
export {
Menubar,
- MenubarMenu,
- MenubarTrigger,
+ MenubarCheckboxItem,
MenubarContent,
+ MenubarGroup,
MenubarItem,
- MenubarSeparator,
MenubarLabel,
- MenubarCheckboxItem,
+ MenubarMenu,
+ MenubarPortal,
MenubarRadioGroup,
MenubarRadioItem,
- MenubarPortal,
+ MenubarSeparator,
+ MenubarShortcut,
+ MenubarSub,
MenubarSubContent,
MenubarSubTrigger,
- MenubarGroup,
- MenubarSub,
- MenubarShortcut,
-}
+ MenubarTrigger,
+};
diff --git a/packages/ui/src/new-project-dialog.tsx b/components/ui/new-project-dialog.tsx
similarity index 51%
rename from packages/ui/src/new-project-dialog.tsx
rename to components/ui/new-project-dialog.tsx
index 14e9c9e..f3e16b7 100644
--- a/packages/ui/src/new-project-dialog.tsx
+++ b/components/ui/new-project-dialog.tsx
@@ -1,32 +1,42 @@
-'use client'
+'use client';
-import { ArrowUp, FolderKanban } from 'lucide-react';
-import { Button } from "@repo/ui/button";
-import { Input } from "@repo/ui/input";
-import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from "@repo/ui/dialog"
+import { Button } from '@/components/ui/button';
+import {
+ Dialog,
+ DialogContent,
+ DialogDescription,
+ DialogHeader,
+ DialogTitle,
+} from '@/components/ui/dialog';
+import { Input } from '@/components/ui/input';
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
-} from "@repo/ui/select"
+} from '@/components/ui/select';
+import * as VisuallyHidden from '@radix-ui/react-visually-hidden';
+import { ArrowUp, FolderKanban } from 'lucide-react';
type NewProjectDialogProps = {
onOpenChange: () => void;
-}
-const NewProjectDialog = ({onOpenChange}:NewProjectDialogProps) => {
+};
+const NewProjectDialog = ({ onOpenChange }: NewProjectDialogProps) => {
return (
-