diff --git a/biome.json b/biome.json index 3a50816..9f08c83 100644 --- a/biome.json +++ b/biome.json @@ -32,6 +32,9 @@ "correctness": { "noUnusedImports": "error", "noUndeclaredVariables": "error" + }, + "nursery": { + "useSortedClasses": "error" } } }, diff --git a/src/app/(protected)/dashboard/page.tsx b/src/app/(protected)/dashboard/page.tsx index 88ef91d..a6ae3d0 100644 --- a/src/app/(protected)/dashboard/page.tsx +++ b/src/app/(protected)/dashboard/page.tsx @@ -1,8 +1,8 @@ export default function Dashboard() { return ( -
-

Welcome here!

-

+
+

Welcome here!

+

If you see this, you successfully authenticated.

diff --git a/src/app/(protected)/layout.tsx b/src/app/(protected)/layout.tsx index ac808c5..84db903 100644 --- a/src/app/(protected)/layout.tsx +++ b/src/app/(protected)/layout.tsx @@ -18,8 +18,8 @@ export default async function Layout({ return ( -
-
+
+
{children}
diff --git a/src/app/(protected)/settings/page.tsx b/src/app/(protected)/settings/page.tsx index 21d4b76..a6d3283 100644 --- a/src/app/(protected)/settings/page.tsx +++ b/src/app/(protected)/settings/page.tsx @@ -23,7 +23,7 @@ export default async function SettingsPage() { const hasPassword = Boolean(user?.password); return ( -
+
Settings diff --git a/src/app/(public)/layout.tsx b/src/app/(public)/layout.tsx index a77f506..2128329 100644 --- a/src/app/(public)/layout.tsx +++ b/src/app/(public)/layout.tsx @@ -13,11 +13,11 @@ export default async function Layout({ const session = await auth(); return ( -
-
+
+
Catalyst Catalyst @@ -36,7 +36,7 @@ export default async function Layout({ )}
{children} -
+
diff --git a/src/app/(public)/page.tsx b/src/app/(public)/page.tsx index 8ec765e..93a2453 100644 --- a/src/app/(public)/page.tsx +++ b/src/app/(public)/page.tsx @@ -84,37 +84,37 @@ export default function Home() { ]; return ( -
+
{/* Hero Section */}
-
+
- + Production Ready -

+

Ship{" "} - + Faster {" "} With - Catalyst + Catalyst

-

+

A modern, full-stack Next.js starter kit with authentication, payments, database, and everything you need to build your next project.

-
- +
+ TypeScript - + tRPC - + Server Components - + Server Actions
@@ -128,14 +128,14 @@ export default function Home() { {/* Integrations section with diagonal borders */}
-
-

Built with the best tools

+
+

Built with the best tools

Pre-configured and ready to use. Spend less time on setup, more on shipping.

-
+
{integrations.map((integration) => { const Icon = integration.icon; return ( @@ -144,8 +144,8 @@ export default function Home() {
-
- +
+
{integration.category} @@ -175,17 +175,17 @@ export default function Home() {
{/* Features Section */} -
-
+
+
-
+
-
- +
+
-

Type-Safe

+

Type-Safe

End-to-end type safety with TypeScript, tRPC, Zod validation, and Prisma ORM. @@ -195,13 +195,13 @@ export default function Home() { -

+
-
- +
+
-

Lightning Fast

+

Lightning Fast

Built on Next.js 15 with React Server Components and powered by Bun.js.

@@ -210,13 +210,13 @@ export default function Home() { -
+
-
- +
+
-

Developer Experience

+

Developer Experience

Pre-configured tooling with Biome, Husky, and best practices out of the box. diff --git a/src/app/(public)/privacy-policy/page.tsx b/src/app/(public)/privacy-policy/page.tsx index 5f80f59..13b4e0f 100644 --- a/src/app/(public)/privacy-policy/page.tsx +++ b/src/app/(public)/privacy-policy/page.tsx @@ -22,8 +22,8 @@ export const metadata: Metadata = { export default function PrivacyPolicy() { return ( -

-

Privacy Policy

+
+

Privacy Policy

Last updated: May 18, 2025

This Privacy Policy describes Our policies and procedures on the collection, use @@ -35,16 +35,16 @@ export default function PrivacyPolicy() { Service, You agree to the collection and use of information in accordance with this Privacy Policy.

-

Interpretation and Definitions

-

Interpretation

+

Interpretation and Definitions

+

Interpretation

The words of which the initial letter is capitalized have meanings defined under the following conditions. The following definitions shall have the same meaning regardless of whether they appear in singular or in plural.

-

Definitions

+

Definitions

For the purposes of this Privacy Policy:

-
    +
    • Account means a unique account created for You to access our @@ -143,15 +143,15 @@ export default function PrivacyPolicy() {

    -

    Collecting and Using Your Personal Data

    -

    Types of Data Collected

    -

    Personal Data

    +

    Collecting and Using Your Personal Data

    +

    Types of Data Collected

    +

    Personal Data

    While using Our Service, We may ask You to provide Us with certain personally identifiable information that can be used to contact or identify You. Personally identifiable information may include, but is not limited to:

    -
      +
      • Email address

      • @@ -162,7 +162,7 @@ export default function PrivacyPolicy() {

        Usage Data

      -

      Usage Data

      +

      Usage Data

      Usage Data is collected automatically when using the Service.

      Usage Data may include information such as Your Device's Internet Protocol address @@ -181,14 +181,14 @@ export default function PrivacyPolicy() { We may also collect information that Your browser sends whenever You visit our Service or when You access the Service by or through a mobile device.

      -

      +

      Information from Third-Party Social Media Services

      The Company allows You to create an account and log in to use the Service through the following Third-party Social Media Services:

      -
        +
        • Google

        @@ -204,14 +204,14 @@ export default function PrivacyPolicy() { giving the Company permission to use, share, and store it in a manner consistent with this Privacy Policy.

        -

        Tracking Technologies and Cookies

        +

        Tracking Technologies and Cookies

        We use Cookies and similar tracking technologies to track the activity on Our Service and store certain information. Tracking technologies used are beacons, tags, and scripts to collect and track information and to improve and analyze Our Service. The technologies We use may include:

        -
          +
          • Cookies or Browser Cookies. A cookie is a small file placed on Your Device. You can instruct Your browser to refuse all Cookies or to indicate @@ -234,7 +234,7 @@ export default function PrivacyPolicy() { while Session Cookies are deleted as soon as You close Your web browser.

            We use both Session and Persistent Cookies for the purposes set out below:

            -
              +
              • Necessary / Essential Cookies @@ -279,9 +279,9 @@ export default function PrivacyPolicy() { For more information about the cookies we use and your choices regarding cookies, please visit our Cookies Policy or the Cookies section of our Privacy Policy.

                -

                Use of Your Personal Data

                +

                Use of Your Personal Data

                The Company may use Personal Data for the following purposes:

                -
                  +
                  • To provide and maintain our Service, including to monitor the @@ -347,7 +347,7 @@ export default function PrivacyPolicy() {

                  We may share Your personal information in the following situations:

                  -
                    +
                    • With Service Providers: We may share Your personal information with Service Providers to monitor and analyze the use of our Service, to contact @@ -385,7 +385,7 @@ export default function PrivacyPolicy() { for any other purpose with Your consent.
                    -

                    Retention of Your Personal Data

                    +

                    Retention of Your Personal Data

                    The Company will retain Your Personal Data only for as long as is necessary for the purposes set out in this Privacy Policy. We will retain and use Your Personal @@ -399,7 +399,7 @@ export default function PrivacyPolicy() { to strengthen the security or to improve the functionality of Our Service, or We are legally obligated to retain this data for longer time periods.

                    -

                    Transfer of Your Personal Data

                    +

                    Transfer of Your Personal Data

                    Your information, including Personal Data, is processed at the Company's operating offices and in any other places where the parties involved in the processing are @@ -419,7 +419,7 @@ export default function PrivacyPolicy() { are adequate controls in place including the security of Your data and other personal information.

                    -

                    Delete Your Personal Data

                    +

                    Delete Your Personal Data

                    You have the right to delete or request that We assist in deleting the Personal Data that We have collected about You. @@ -439,39 +439,39 @@ export default function PrivacyPolicy() { Please note, however, that We may need to retain certain information when we have a legal obligation or lawful basis to do so.

                    -

                    Disclosure of Your Personal Data

                    -

                    Business Transactions

                    +

                    Disclosure of Your Personal Data

                    +

                    Business Transactions

                    If the Company is involved in a merger, acquisition or asset sale, Your Personal Data may be transferred. We will provide notice before Your Personal Data is transferred and becomes subject to a different Privacy Policy.

                    -

                    Law enforcement

                    +

                    Law enforcement

                    Under certain circumstances, the Company may be required to disclose Your Personal Data if required to do so by law or in response to valid requests by public authorities (e.g. a court or a government agency).

                    -

                    Other legal requirements

                    +

                    Other legal requirements

                    The Company may disclose Your Personal Data in the good faith belief that such action is necessary to:

                    -
) : ( -

No notifications

+

No notifications

)} diff --git a/src/components/settings/delete-account-form.tsx b/src/components/settings/delete-account-form.tsx index a353fea..433d66c 100644 --- a/src/components/settings/delete-account-form.tsx +++ b/src/components/settings/delete-account-form.tsx @@ -34,8 +34,8 @@ export default function DeleteAccountForm() { return (
-

Delete Account

-

+

Delete Account

+

This action is irreversible. All your data will be permanently deleted.

diff --git a/src/components/settings/password-form.tsx b/src/components/settings/password-form.tsx index 09dcc81..f2f73c6 100644 --- a/src/components/settings/password-form.tsx +++ b/src/components/settings/password-form.tsx @@ -69,7 +69,7 @@ export default function PasswordForm({ hasPassword }: { hasPassword: boolean }) {errors.currentPassword && ( - + {errors.currentPassword.message} )} @@ -79,14 +79,14 @@ export default function PasswordForm({ hasPassword }: { hasPassword: boolean }) {errors.newPassword && ( - {errors.newPassword.message} + {errors.newPassword.message} )}
{errors.confirmPassword && ( - + {errors.confirmPassword.message} )} diff --git a/src/components/sidebar/app-sidebar.tsx b/src/components/sidebar/app-sidebar.tsx index 2f60a59..cb216e6 100644 --- a/src/components/sidebar/app-sidebar.tsx +++ b/src/components/sidebar/app-sidebar.tsx @@ -23,7 +23,7 @@ export async function AppSidebar() { return ( - + Catalyst Catalyst diff --git a/src/components/sidebar/profile-menu.tsx b/src/components/sidebar/profile-menu.tsx index 628e87c..c97e027 100644 --- a/src/components/sidebar/profile-menu.tsx +++ b/src/components/sidebar/profile-menu.tsx @@ -31,21 +31,22 @@ export default function ProfileMenu() { My Account {billingPortalUrl && ( - + Billing )} - + isMobile && setOpenMobile(false)} > @@ -53,11 +54,11 @@ export default function ProfileMenu() { - + isMobile && setOpenMobile(false)} rel="noopener" > diff --git a/src/components/top-menu.tsx b/src/components/top-menu.tsx index 15bb0ef..8838eab 100644 --- a/src/components/top-menu.tsx +++ b/src/components/top-menu.tsx @@ -3,7 +3,7 @@ import NotificationMenu from "./notification-menu"; export default function TopMenu() { return ( -
+
diff --git a/src/components/ui/alert-dialog.tsx b/src/components/ui/alert-dialog.tsx index 9c6ddc1..3e8a753 100644 --- a/src/components/ui/alert-dialog.tsx +++ b/src/components/ui/alert-dialog.tsx @@ -20,7 +20,7 @@ function AlertDialogOverlay({ ); @@ -96,7 +96,7 @@ function AlertDialogDescription({ return ( ); diff --git a/src/components/ui/card.tsx b/src/components/ui/card.tsx index ca75787..1be86fe 100644 --- a/src/components/ui/card.tsx +++ b/src/components/ui/card.tsx @@ -29,7 +29,7 @@ function CardTitle({ className, ...props }: React.HTMLAttributes ); @@ -42,7 +42,7 @@ function CardDescription({ return (

); diff --git a/src/components/ui/diagonal-edge.tsx b/src/components/ui/diagonal-edge.tsx index 325c082..52b7a6a 100644 --- a/src/components/ui/diagonal-edge.tsx +++ b/src/components/ui/diagonal-edge.tsx @@ -85,7 +85,7 @@ export function DiagonalEdge({ return (

); diff --git a/src/components/ui/dropdown-menu.tsx b/src/components/ui/dropdown-menu.tsx index dd53125..b4e6ea6 100644 --- a/src/components/ui/dropdown-menu.tsx +++ b/src/components/ui/dropdown-menu.tsx @@ -50,7 +50,7 @@ function DropdownMenuSubContent({ ); diff --git a/src/components/ui/input.tsx b/src/components/ui/input.tsx index 3974566..65b5b2f 100644 --- a/src/components/ui/input.tsx +++ b/src/components/ui/input.tsx @@ -8,7 +8,7 @@ function Input({ className, type, ...props }: React.ComponentProps<"input">) { data-slot="input" type={type} className={cn( - "flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", + "flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background file:border-0 file:bg-transparent file:font-medium file:text-foreground file:text-sm placeholder:text-muted-foreground focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", className )} {...props} diff --git a/src/components/ui/popover.tsx b/src/components/ui/popover.tsx index 3706e65..6bdd532 100644 --- a/src/components/ui/popover.tsx +++ b/src/components/ui/popover.tsx @@ -22,7 +22,7 @@ function PopoverContent({ align={align} sideOffset={sideOffset} className={cn( - "z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-hidden data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", + "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-hidden data-[state=closed]:animate-out data-[state=open]:animate-in", className )} {...props} diff --git a/src/components/ui/sheet.tsx b/src/components/ui/sheet.tsx index f37d434..daa3edd 100644 --- a/src/components/ui/sheet.tsx +++ b/src/components/ui/sheet.tsx @@ -23,7 +23,7 @@ function SheetOverlay({ {children} - + Close @@ -108,7 +108,7 @@ function SheetTitle({ return ( ); @@ -121,7 +121,7 @@ function SheetDescription({ return ( ); diff --git a/src/components/ui/shiny-border.tsx b/src/components/ui/shiny-border.tsx index 8cf50a2..3839eb3 100644 --- a/src/components/ui/shiny-border.tsx +++ b/src/components/ui/shiny-border.tsx @@ -11,14 +11,14 @@ export function ShinyBorder({ className?: string; }) { return ( -
+
{/* Gray border always visible */} -
+
{/* Rotating steel gradient on hover - blurred light particle */} -
+
{/* Content */} -
{children}
+
{children}
); } diff --git a/src/components/ui/sidebar.tsx b/src/components/ui/sidebar.tsx index 1cbdfea..d90a022 100644 --- a/src/components/ui/sidebar.tsx +++ b/src/components/ui/sidebar.tsx @@ -197,7 +197,7 @@ function Sidebar({ return (