From e24f3bbc8fb349e4d724055a2a7b980651c428f0 Mon Sep 17 00:00:00 2001 From: Josh Donnell Date: Sun, 15 Mar 2026 09:17:50 +0000 Subject: [PATCH 01/19] feat: add vite plus and move over oxlint and oxfmt prs --- .prettierrc | 25 ---- app/Http/Middleware/HandleInertiaRequests.php | 2 + app/Models/User.php | 2 + composer.json | 10 +- package.json | 120 +++++++++--------- resources/js/app.tsx | 3 +- resources/js/components/alert-error.tsx | 2 +- resources/js/components/app-content.tsx | 2 +- resources/js/components/app-header.tsx | 4 +- resources/js/components/app-shell.tsx | 2 +- resources/js/components/app-sidebar.tsx | 4 +- .../js/components/appearance-dropdown.tsx | 4 +- resources/js/components/appearance-tabs.tsx | 4 +- resources/js/components/breadcrumbs.tsx | 4 +- resources/js/components/delete-user.tsx | 4 +- resources/js/components/icon.tsx | 2 +- resources/js/components/input-error.tsx | 2 +- resources/js/components/nav-footer.tsx | 2 +- resources/js/components/nav-main.tsx | 2 +- resources/js/components/nav-user.tsx | 4 +- resources/js/components/text-link.tsx | 2 +- .../components/two-factor-recovery-codes.tsx | 8 +- .../js/components/two-factor-setup-modal.tsx | 10 +- resources/js/components/user-menu-content.tsx | 4 +- resources/js/hooks/use-two-factor-auth.ts | 2 +- resources/js/layouts/app-layout.tsx | 2 +- .../js/layouts/app/app-header-layout.tsx | 2 +- .../js/layouts/app/app-sidebar-layout.tsx | 2 +- .../js/layouts/auth/auth-card-layout.tsx | 4 +- .../js/layouts/auth/auth-simple-layout.tsx | 4 +- .../js/layouts/auth/auth-split-layout.tsx | 4 +- resources/js/layouts/settings/layout.tsx | 4 +- resources/js/pages/appearance/update.tsx | 4 +- resources/js/pages/dashboard.tsx | 2 +- resources/js/pages/session/create.tsx | 4 +- .../user-email-reset-notification/create.tsx | 7 +- .../create.tsx | 7 +- .../user-password-confirmation/create.tsx | 4 +- resources/js/pages/user-password/create.tsx | 3 +- resources/js/pages/user-password/edit.tsx | 11 +- resources/js/pages/user-profile/edit.tsx | 7 +- .../show.tsx | 6 +- .../user-two-factor-authentication/show.tsx | 6 +- resources/js/pages/user/create.tsx | 5 +- resources/js/pages/welcome.tsx | 2 +- tsconfig.json | 2 +- vite.config.ts | 73 ++++++++--- 47 files changed, 204 insertions(+), 191 deletions(-) delete mode 100644 .prettierrc diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 1d21a94dc..000000000 --- a/.prettierrc +++ /dev/null @@ -1,25 +0,0 @@ -{ - "semi": true, - "singleQuote": true, - "singleAttributePerLine": false, - "htmlWhitespaceSensitivity": "css", - "printWidth": 80, - "plugins": [ - "prettier-plugin-organize-imports", - "prettier-plugin-tailwindcss" - ], - "tailwindFunctions": [ - "clsx", - "cn" - ], - "tailwindStylesheet": "resources/css/app.css", - "tabWidth": 4, - "overrides": [ - { - "files": "**/*.yml", - "options": { - "tabWidth": 2 - } - } - ] -} diff --git a/app/Http/Middleware/HandleInertiaRequests.php b/app/Http/Middleware/HandleInertiaRequests.php index 6ac19bd29..49aa4405f 100644 --- a/app/Http/Middleware/HandleInertiaRequests.php +++ b/app/Http/Middleware/HandleInertiaRequests.php @@ -6,6 +6,7 @@ use Illuminate\Http\Request; use Inertia\Middleware; +use Override; final class HandleInertiaRequests extends Middleware { @@ -14,6 +15,7 @@ final class HandleInertiaRequests extends Middleware * * @var string */ + #[Override] protected $rootView = 'app'; /** diff --git a/app/Models/User.php b/app/Models/User.php index b4f575b84..9d96ab742 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -12,6 +12,7 @@ use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Laravel\Fortify\TwoFactorAuthenticatable; +use Override; /** * @property-read string $id @@ -38,6 +39,7 @@ final class User extends Authenticatable implements MustVerifyEmail /** * @var list */ + #[Override] protected $hidden = [ 'password', 'remember_token', diff --git a/composer.json b/composer.json index 97f430b6b..d0252cfea 100644 --- a/composer.json +++ b/composer.json @@ -11,8 +11,8 @@ "require": { "php": "^8.5.0", "inertiajs/inertia-laravel": "^2.0.21", - "laravel/fortify": "^1.35.0", - "laravel/framework": "^12.53.0", + "laravel/fortify": "^1.36.1", + "laravel/framework": "^12.54.1", "laravel/wayfinder": "^0.1.14", "nunomaduro/essentials": "^1.2.0" }, @@ -20,12 +20,12 @@ "driftingly/rector-laravel": "^2.1.12", "fakerphp/faker": "^1.24.1", "larastan/larastan": "^3.9.3", - "laravel/boost": "^1.8.11", + "laravel/boost": "^1.8.12", "laravel/pail": "^1.2.6", - "laravel/pint": "^1.27.1", + "laravel/pint": "^1.29.0", "mockery/mockery": "^1.6.12", "nunomaduro/collision": "^8.9.1", - "pestphp/pest": "^4.4.1", + "pestphp/pest": "^4.4.2", "pestphp/pest-plugin-browser": "^4.3.0", "pestphp/pest-plugin-laravel": "^4.1.0", "pestphp/pest-plugin-type-coverage": "^4.0.3", diff --git a/package.json b/package.json index 5508f14a6..4c1d77bf2 100644 --- a/package.json +++ b/package.json @@ -1,61 +1,63 @@ { - "private": true, - "type": "module", - "scripts": { - "build": "vite build", - "build:ssr": "vite build && vite build --ssr", - "dev": "vite", - "lint": "oxlint --fix && prettier --write resources/", - "test:lint": "oxlint && prettier --check resources/", - "test:types": "tsc --noEmit" - }, - "devDependencies": { - "@laravel/vite-plugin-wayfinder": "^0.1.7", - "@types/node": "^25.4.0", - "npm-check-updates": "^19.6.3", - "oxlint": "^1.51.0", - "playwright": "^1.58.2", - "prettier": "^3.8.1", - "prettier-plugin-organize-imports": "^4.3.0", - "prettier-plugin-tailwindcss": "^0.7.2" - }, - "dependencies": { - "@headlessui/react": "^2.2.9", - "@inertiajs/react": "^2.3.17", - "@radix-ui/react-avatar": "^1.1.11", - "@radix-ui/react-checkbox": "^1.3.3", - "@radix-ui/react-collapsible": "^1.1.12", - "@radix-ui/react-dialog": "^1.1.15", - "@radix-ui/react-dropdown-menu": "^2.1.16", - "@radix-ui/react-label": "^2.1.8", - "@radix-ui/react-navigation-menu": "^1.2.14", - "@radix-ui/react-select": "^2.2.6", - "@radix-ui/react-separator": "^1.1.8", - "@radix-ui/react-slot": "^1.2.4", - "@radix-ui/react-toggle": "^1.1.10", - "@radix-ui/react-toggle-group": "^1.1.11", - "@radix-ui/react-tooltip": "^1.2.8", - "@tailwindcss/vite": "^4.2.1", - "@types/react": "^19.2.14", - "@types/react-dom": "^19.2.3", - "@vitejs/plugin-react": "^5.1.4", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "concurrently": "^9.2.1", - "input-otp": "^1.4.2", - "laravel-vite-plugin": "^2.1.0", - "lucide-react": "^0.577.0", - "react": "^19.2.4", - "react-dom": "^19.2.4", - "tailwind-merge": "^3.5.0", - "tailwindcss": "^4.2.1", - "tailwindcss-animate": "^1.0.7", - "typescript": "^5.9.3", - "vite": "^7.3.1" - }, - "optionalDependencies": { - "@rollup/rollup-linux-x64-gnu": "4.59.0", - "@tailwindcss/oxide-linux-x64-gnu": "^4.2.1", - "lightningcss-linux-x64-gnu": "^1.32.0" - } + "private": true, + "type": "module", + "scripts": { + "build": "vp build", + "build:ssr": "vp build && vp build --ssr", + "dev": "vp dev", + "lint": "vp lint --fix && vp fmt resources/", + "test:lint": "vp lint --type-aware && vp fmt --check resources/", + "test:types": "tsc --noEmit" + }, + "devDependencies": { + "@laravel/vite-plugin-wayfinder": "^0.1.7", + "@types/node": "^25.5.0", + "npm-check-updates": "^19.6.3", + "playwright": "^1.58.2", + "vite-plus": "latest" + }, + "dependencies": { + "@headlessui/react": "^2.2.9", + "@inertiajs/react": "^2.3.18", + "@radix-ui/react-avatar": "^1.1.11", + "@radix-ui/react-checkbox": "^1.3.3", + "@radix-ui/react-collapsible": "^1.1.12", + "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-dropdown-menu": "^2.1.16", + "@radix-ui/react-label": "^2.1.8", + "@radix-ui/react-navigation-menu": "^1.2.14", + "@radix-ui/react-select": "^2.2.6", + "@radix-ui/react-separator": "^1.1.8", + "@radix-ui/react-slot": "^1.2.4", + "@radix-ui/react-toggle": "^1.1.10", + "@radix-ui/react-toggle-group": "^1.1.11", + "@radix-ui/react-tooltip": "^1.2.8", + "@tailwindcss/vite": "^4.2.1", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "concurrently": "^9.2.1", + "input-otp": "^1.4.2", + "laravel-vite-plugin": "^2.1.0", + "lucide-react": "^0.577.0", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "tailwind-merge": "^3.5.0", + "tailwindcss": "^4.2.1", + "tailwindcss-animate": "^1.0.7", + "typescript": "^5.9.3", + "vite": "npm:@voidzero-dev/vite-plus-core@latest" + }, + "optionalDependencies": { + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@tailwindcss/oxide-linux-x64-gnu": "^4.2.1", + "lightningcss-linux-x64-gnu": "^1.32.0" + }, + "packageManager": "pnpm@10.32.1", + "overrides": { + "vite": "npm:@voidzero-dev/vite-plus-core@latest", + "vitest": "npm:@voidzero-dev/vite-plus-test@latest" + } } diff --git a/resources/js/app.tsx b/resources/js/app.tsx index 13c6673dd..722acfcfc 100644 --- a/resources/js/app.tsx +++ b/resources/js/app.tsx @@ -1,5 +1,4 @@ import '../css/app.css'; - import { createInertiaApp } from '@inertiajs/react'; import { resolvePageComponent } from 'laravel-vite-plugin/inertia-helpers'; import { createRoot } from 'react-dom/client'; @@ -7,7 +6,7 @@ import { initializeTheme } from './hooks/use-appearance'; const appName = import.meta.env.VITE_APP_NAME || 'Laravel'; -createInertiaApp({ +void createInertiaApp({ title: (title) => (title ? `${title} - ${appName}` : appName), resolve: (name) => resolvePageComponent( diff --git a/resources/js/components/alert-error.tsx b/resources/js/components/alert-error.tsx index 8cc228bd4..a9eacd313 100644 --- a/resources/js/components/alert-error.tsx +++ b/resources/js/components/alert-error.tsx @@ -1,5 +1,5 @@ -import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'; import { AlertCircleIcon } from 'lucide-react'; +import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'; export default function AlertError({ errors, diff --git a/resources/js/components/app-content.tsx b/resources/js/components/app-content.tsx index 995dcaa37..5f5834cbd 100644 --- a/resources/js/components/app-content.tsx +++ b/resources/js/components/app-content.tsx @@ -1,5 +1,5 @@ -import { SidebarInset } from '@/components/ui/sidebar'; import * as React from 'react'; +import { SidebarInset } from '@/components/ui/sidebar'; interface AppContentProps extends React.ComponentProps<'main'> { variant?: 'header' | 'sidebar'; diff --git a/resources/js/components/app-header.tsx b/resources/js/components/app-header.tsx index 6f3ab8fb6..1a7d8f779 100644 --- a/resources/js/components/app-header.tsx +++ b/resources/js/components/app-header.tsx @@ -1,3 +1,5 @@ +import { Link, usePage } from '@inertiajs/react'; +import { BookOpen, Folder, LayoutGrid, Menu, Search } from 'lucide-react'; import { Breadcrumbs } from '@/components/breadcrumbs'; import { Icon } from '@/components/icon'; import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; @@ -31,8 +33,6 @@ import { useInitials } from '@/hooks/use-initials'; import { cn } from '@/lib/utils'; import { dashboard } from '@/routes'; import { type BreadcrumbItem, type NavItem, type SharedData } from '@/types'; -import { Link, usePage } from '@inertiajs/react'; -import { BookOpen, Folder, LayoutGrid, Menu, Search } from 'lucide-react'; import AppLogo from './app-logo'; import AppLogoIcon from './app-logo-icon'; diff --git a/resources/js/components/app-shell.tsx b/resources/js/components/app-shell.tsx index f91fc4a43..ea4b259f8 100644 --- a/resources/js/components/app-shell.tsx +++ b/resources/js/components/app-shell.tsx @@ -1,6 +1,6 @@ +import { usePage } from '@inertiajs/react'; import { SidebarProvider } from '@/components/ui/sidebar'; import { SharedData } from '@/types'; -import { usePage } from '@inertiajs/react'; interface AppShellProps { children: React.ReactNode; diff --git a/resources/js/components/app-sidebar.tsx b/resources/js/components/app-sidebar.tsx index a7930ea2e..6f8226efe 100644 --- a/resources/js/components/app-sidebar.tsx +++ b/resources/js/components/app-sidebar.tsx @@ -1,3 +1,5 @@ +import { Link } from '@inertiajs/react'; +import { BookOpen, Folder, LayoutGrid } from 'lucide-react'; import { NavFooter } from '@/components/nav-footer'; import { NavMain } from '@/components/nav-main'; import { NavUser } from '@/components/nav-user'; @@ -12,8 +14,6 @@ import { } from '@/components/ui/sidebar'; import { dashboard } from '@/routes'; import { type NavItem } from '@/types'; -import { Link } from '@inertiajs/react'; -import { BookOpen, Folder, LayoutGrid } from 'lucide-react'; import AppLogo from './app-logo'; const mainNavItems: NavItem[] = [ diff --git a/resources/js/components/appearance-dropdown.tsx b/resources/js/components/appearance-dropdown.tsx index da87bb4a8..55dc92e3d 100644 --- a/resources/js/components/appearance-dropdown.tsx +++ b/resources/js/components/appearance-dropdown.tsx @@ -1,3 +1,5 @@ +import { Monitor, Moon, Sun } from 'lucide-react'; +import { HTMLAttributes } from 'react'; import { Button } from '@/components/ui/button'; import { DropdownMenu, @@ -6,8 +8,6 @@ import { DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { useAppearance } from '@/hooks/use-appearance'; -import { Monitor, Moon, Sun } from 'lucide-react'; -import { HTMLAttributes } from 'react'; export default function AppearanceToggleDropdown({ className = '', diff --git a/resources/js/components/appearance-tabs.tsx b/resources/js/components/appearance-tabs.tsx index 1a1e271f2..aa4efe0b8 100644 --- a/resources/js/components/appearance-tabs.tsx +++ b/resources/js/components/appearance-tabs.tsx @@ -1,7 +1,7 @@ -import { Appearance, useAppearance } from '@/hooks/use-appearance'; -import { cn } from '@/lib/utils'; import { LucideIcon, Monitor, Moon, Sun } from 'lucide-react'; import { HTMLAttributes } from 'react'; +import { Appearance, useAppearance } from '@/hooks/use-appearance'; +import { cn } from '@/lib/utils'; export default function AppearanceToggleTab({ className = '', diff --git a/resources/js/components/breadcrumbs.tsx b/resources/js/components/breadcrumbs.tsx index ef3aeb133..1e317cafd 100644 --- a/resources/js/components/breadcrumbs.tsx +++ b/resources/js/components/breadcrumbs.tsx @@ -1,3 +1,5 @@ +import { Link } from '@inertiajs/react'; +import { Fragment } from 'react'; import { Breadcrumb, BreadcrumbItem, @@ -7,8 +9,6 @@ import { BreadcrumbSeparator, } from '@/components/ui/breadcrumb'; import { type BreadcrumbItem as BreadcrumbItemType } from '@/types'; -import { Link } from '@inertiajs/react'; -import { Fragment } from 'react'; export function Breadcrumbs({ breadcrumbs, diff --git a/resources/js/components/delete-user.tsx b/resources/js/components/delete-user.tsx index 46cdd3522..4f4f9426c 100644 --- a/resources/js/components/delete-user.tsx +++ b/resources/js/components/delete-user.tsx @@ -1,3 +1,5 @@ +import { Form } from '@inertiajs/react'; +import { useRef } from 'react'; import UserController from '@/actions/App/Http/Controllers/UserController'; import HeadingSmall from '@/components/heading-small'; import InputError from '@/components/input-error'; @@ -13,8 +15,6 @@ import { } from '@/components/ui/dialog'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; -import { Form } from '@inertiajs/react'; -import { useRef } from 'react'; export default function DeleteUser() { const passwordInput = useRef(null); diff --git a/resources/js/components/icon.tsx b/resources/js/components/icon.tsx index 9724e7a1e..75194a710 100644 --- a/resources/js/components/icon.tsx +++ b/resources/js/components/icon.tsx @@ -1,6 +1,6 @@ -import { cn } from '@/lib/utils'; import { type LucideProps } from 'lucide-react'; import { type ComponentType } from 'react'; +import { cn } from '@/lib/utils'; interface IconProps extends Omit { iconNode: ComponentType; diff --git a/resources/js/components/input-error.tsx b/resources/js/components/input-error.tsx index 37ef38c37..1e56ed75c 100644 --- a/resources/js/components/input-error.tsx +++ b/resources/js/components/input-error.tsx @@ -1,5 +1,5 @@ -import { cn } from '@/lib/utils'; import { type HTMLAttributes } from 'react'; +import { cn } from '@/lib/utils'; export default function InputError({ message, diff --git a/resources/js/components/nav-footer.tsx b/resources/js/components/nav-footer.tsx index 1f21036d8..acae2c675 100644 --- a/resources/js/components/nav-footer.tsx +++ b/resources/js/components/nav-footer.tsx @@ -1,3 +1,4 @@ +import { type ComponentPropsWithoutRef } from 'react'; import { Icon } from '@/components/icon'; import { SidebarGroup, @@ -7,7 +8,6 @@ import { SidebarMenuItem, } from '@/components/ui/sidebar'; import { type NavItem } from '@/types'; -import { type ComponentPropsWithoutRef } from 'react'; export function NavFooter({ items, diff --git a/resources/js/components/nav-main.tsx b/resources/js/components/nav-main.tsx index a1c574cac..bf8bc30e3 100644 --- a/resources/js/components/nav-main.tsx +++ b/resources/js/components/nav-main.tsx @@ -1,3 +1,4 @@ +import { Link, usePage } from '@inertiajs/react'; import { SidebarGroup, SidebarGroupLabel, @@ -6,7 +7,6 @@ import { SidebarMenuItem, } from '@/components/ui/sidebar'; import { type NavItem } from '@/types'; -import { Link, usePage } from '@inertiajs/react'; export function NavMain({ items = [] }: { items: NavItem[] }) { const page = usePage(); diff --git a/resources/js/components/nav-user.tsx b/resources/js/components/nav-user.tsx index 9301230f2..89d4f04b0 100644 --- a/resources/js/components/nav-user.tsx +++ b/resources/js/components/nav-user.tsx @@ -1,3 +1,5 @@ +import { usePage } from '@inertiajs/react'; +import { ChevronsUpDown } from 'lucide-react'; import { DropdownMenu, DropdownMenuContent, @@ -13,8 +15,6 @@ import { UserInfo } from '@/components/user-info'; import { UserMenuContent } from '@/components/user-menu-content'; import { useIsMobile } from '@/hooks/use-mobile'; import { type SharedData } from '@/types'; -import { usePage } from '@inertiajs/react'; -import { ChevronsUpDown } from 'lucide-react'; export function NavUser() { const { auth } = usePage().props; diff --git a/resources/js/components/text-link.tsx b/resources/js/components/text-link.tsx index dea4a8d86..705c7016c 100644 --- a/resources/js/components/text-link.tsx +++ b/resources/js/components/text-link.tsx @@ -1,6 +1,6 @@ -import { cn } from '@/lib/utils'; import { Link } from '@inertiajs/react'; import { ComponentProps } from 'react'; +import { cn } from '@/lib/utils'; type LinkProps = ComponentProps; diff --git a/resources/js/components/two-factor-recovery-codes.tsx b/resources/js/components/two-factor-recovery-codes.tsx index 918208113..c92c4797d 100644 --- a/resources/js/components/two-factor-recovery-codes.tsx +++ b/resources/js/components/two-factor-recovery-codes.tsx @@ -1,3 +1,6 @@ +import { Form } from '@inertiajs/react'; +import { Eye, EyeOff, LockKeyhole, RefreshCw } from 'lucide-react'; +import { useCallback, useEffect, useRef, useState } from 'react'; import { Button } from '@/components/ui/button'; import { Card, @@ -7,9 +10,6 @@ import { CardTitle, } from '@/components/ui/card'; import { regenerateRecoveryCodes } from '@/routes/two-factor'; -import { Form } from '@inertiajs/react'; -import { Eye, EyeOff, LockKeyhole, RefreshCw } from 'lucide-react'; -import { useCallback, useEffect, useRef, useState } from 'react'; import AlertError from './alert-error'; interface TwoFactorRecoveryCodesProps { @@ -46,7 +46,7 @@ export default function TwoFactorRecoveryCodes({ useEffect(() => { if (!recoveryCodesList.length) { - fetchRecoveryCodes(); + void fetchRecoveryCodes(); } }, [recoveryCodesList.length, fetchRecoveryCodes]); diff --git a/resources/js/components/two-factor-setup-modal.tsx b/resources/js/components/two-factor-setup-modal.tsx index 7f1a4754c..d47af381b 100644 --- a/resources/js/components/two-factor-setup-modal.tsx +++ b/resources/js/components/two-factor-setup-modal.tsx @@ -1,3 +1,7 @@ +import { Form } from '@inertiajs/react'; +import { REGEXP_ONLY_DIGITS } from 'input-otp'; +import { Check, Copy, Loader2, ScanLine } from 'lucide-react'; +import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import InputError from '@/components/input-error'; import { Button } from '@/components/ui/button'; import { @@ -15,10 +19,6 @@ import { import { useClipboard } from '@/hooks/use-clipboard'; import { OTP_MAX_LENGTH } from '@/hooks/use-two-factor-auth'; import { confirm } from '@/routes/two-factor'; -import { Form } from '@inertiajs/react'; -import { REGEXP_ONLY_DIGITS } from 'input-otp'; -import { Check, Copy, Loader2, ScanLine } from 'lucide-react'; -import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import AlertError from './alert-error'; function GridScanIcon() { @@ -292,7 +292,7 @@ export default function TwoFactorSetupModal({ } if (!qrCodeSvg) { - fetchSetupData(); + void fetchSetupData(); } }, [isOpen, qrCodeSvg, fetchSetupData, resetModalState]); diff --git a/resources/js/components/user-menu-content.tsx b/resources/js/components/user-menu-content.tsx index 48846e805..3cc5ecf6f 100644 --- a/resources/js/components/user-menu-content.tsx +++ b/resources/js/components/user-menu-content.tsx @@ -1,3 +1,5 @@ +import { Link, router } from '@inertiajs/react'; +import { LogOut, Settings } from 'lucide-react'; import { DropdownMenuGroup, DropdownMenuItem, @@ -9,8 +11,6 @@ import { useMobileNavigation } from '@/hooks/use-mobile-navigation'; import { logout } from '@/routes'; import { edit } from '@/routes/user-profile'; import { type User } from '@/types'; -import { Link, router } from '@inertiajs/react'; -import { LogOut, Settings } from 'lucide-react'; interface UserMenuContentProps { user: User; diff --git a/resources/js/hooks/use-two-factor-auth.ts b/resources/js/hooks/use-two-factor-auth.ts index 384e20625..18620bcaf 100644 --- a/resources/js/hooks/use-two-factor-auth.ts +++ b/resources/js/hooks/use-two-factor-auth.ts @@ -1,5 +1,5 @@ -import { qrCode, recoveryCodes, secretKey } from '@/routes/two-factor'; import { useCallback, useMemo, useState } from 'react'; +import { qrCode, recoveryCodes, secretKey } from '@/routes/two-factor'; interface TwoFactorSetupData { svg: string; diff --git a/resources/js/layouts/app-layout.tsx b/resources/js/layouts/app-layout.tsx index 1457c51ee..f0a3339da 100644 --- a/resources/js/layouts/app-layout.tsx +++ b/resources/js/layouts/app-layout.tsx @@ -1,6 +1,6 @@ +import { type ReactNode } from 'react'; import AppLayoutTemplate from '@/layouts/app/app-sidebar-layout'; import { type BreadcrumbItem } from '@/types'; -import { type ReactNode } from 'react'; interface AppLayoutProps { children: ReactNode; diff --git a/resources/js/layouts/app/app-header-layout.tsx b/resources/js/layouts/app/app-header-layout.tsx index acfcd4d89..15d13d21f 100644 --- a/resources/js/layouts/app/app-header-layout.tsx +++ b/resources/js/layouts/app/app-header-layout.tsx @@ -1,8 +1,8 @@ +import type { PropsWithChildren } from 'react'; import { AppContent } from '@/components/app-content'; import { AppHeader } from '@/components/app-header'; import { AppShell } from '@/components/app-shell'; import { type BreadcrumbItem } from '@/types'; -import type { PropsWithChildren } from 'react'; export default function AppHeaderLayout({ children, diff --git a/resources/js/layouts/app/app-sidebar-layout.tsx b/resources/js/layouts/app/app-sidebar-layout.tsx index 113aa4f78..93fb2d5d2 100644 --- a/resources/js/layouts/app/app-sidebar-layout.tsx +++ b/resources/js/layouts/app/app-sidebar-layout.tsx @@ -1,9 +1,9 @@ +import { type PropsWithChildren } from 'react'; import { AppContent } from '@/components/app-content'; import { AppShell } from '@/components/app-shell'; import { AppSidebar } from '@/components/app-sidebar'; import { AppSidebarHeader } from '@/components/app-sidebar-header'; import { type BreadcrumbItem } from '@/types'; -import { type PropsWithChildren } from 'react'; export default function AppSidebarLayout({ children, diff --git a/resources/js/layouts/auth/auth-card-layout.tsx b/resources/js/layouts/auth/auth-card-layout.tsx index d13af0e46..7b29a8c82 100644 --- a/resources/js/layouts/auth/auth-card-layout.tsx +++ b/resources/js/layouts/auth/auth-card-layout.tsx @@ -1,3 +1,5 @@ +import { Link } from '@inertiajs/react'; +import { type PropsWithChildren } from 'react'; import AppLogoIcon from '@/components/app-logo-icon'; import { Card, @@ -7,8 +9,6 @@ import { CardTitle, } from '@/components/ui/card'; import { home } from '@/routes'; -import { Link } from '@inertiajs/react'; -import { type PropsWithChildren } from 'react'; export default function AuthCardLayout({ children, diff --git a/resources/js/layouts/auth/auth-simple-layout.tsx b/resources/js/layouts/auth/auth-simple-layout.tsx index 1955992c7..cce7065b1 100644 --- a/resources/js/layouts/auth/auth-simple-layout.tsx +++ b/resources/js/layouts/auth/auth-simple-layout.tsx @@ -1,7 +1,7 @@ -import AppLogoIcon from '@/components/app-logo-icon'; -import { home } from '@/routes'; import { Link } from '@inertiajs/react'; import { type PropsWithChildren } from 'react'; +import AppLogoIcon from '@/components/app-logo-icon'; +import { home } from '@/routes'; interface AuthLayoutProps { name?: string; diff --git a/resources/js/layouts/auth/auth-split-layout.tsx b/resources/js/layouts/auth/auth-split-layout.tsx index 68b800293..3cc79aa64 100644 --- a/resources/js/layouts/auth/auth-split-layout.tsx +++ b/resources/js/layouts/auth/auth-split-layout.tsx @@ -1,8 +1,8 @@ +import { Link, usePage } from '@inertiajs/react'; +import { type PropsWithChildren } from 'react'; import AppLogoIcon from '@/components/app-logo-icon'; import { home } from '@/routes'; import { type SharedData } from '@/types'; -import { Link, usePage } from '@inertiajs/react'; -import { type PropsWithChildren } from 'react'; interface AuthLayoutProps { title?: string; diff --git a/resources/js/layouts/settings/layout.tsx b/resources/js/layouts/settings/layout.tsx index aa9cd6a11..69f28e051 100644 --- a/resources/js/layouts/settings/layout.tsx +++ b/resources/js/layouts/settings/layout.tsx @@ -1,3 +1,5 @@ +import { Link } from '@inertiajs/react'; +import { type PropsWithChildren } from 'react'; import Heading from '@/components/heading'; import { Button } from '@/components/ui/button'; import { Separator } from '@/components/ui/separator'; @@ -7,8 +9,6 @@ import { edit as editPassword } from '@/routes/password'; import { show } from '@/routes/two-factor'; import { edit } from '@/routes/user-profile'; import { type NavItem } from '@/types'; -import { Link } from '@inertiajs/react'; -import { type PropsWithChildren } from 'react'; const sidebarNavItems: NavItem[] = [ { diff --git a/resources/js/pages/appearance/update.tsx b/resources/js/pages/appearance/update.tsx index c147f1e33..14c1de5dc 100644 --- a/resources/js/pages/appearance/update.tsx +++ b/resources/js/pages/appearance/update.tsx @@ -1,12 +1,10 @@ import { Head } from '@inertiajs/react'; - import AppearanceTabs from '@/components/appearance-tabs'; import HeadingSmall from '@/components/heading-small'; -import { type BreadcrumbItem } from '@/types'; - import AppLayout from '@/layouts/app-layout'; import SettingsLayout from '@/layouts/settings/layout'; import { edit as editAppearance } from '@/routes/appearance'; +import { type BreadcrumbItem } from '@/types'; const breadcrumbs: BreadcrumbItem[] = [ { diff --git a/resources/js/pages/dashboard.tsx b/resources/js/pages/dashboard.tsx index 288f976b0..571924b95 100644 --- a/resources/js/pages/dashboard.tsx +++ b/resources/js/pages/dashboard.tsx @@ -1,8 +1,8 @@ +import { Head } from '@inertiajs/react'; import { PlaceholderPattern } from '@/components/ui/placeholder-pattern'; import AppLayout from '@/layouts/app-layout'; import { dashboard } from '@/routes'; import { type BreadcrumbItem } from '@/types'; -import { Head } from '@inertiajs/react'; const breadcrumbs: BreadcrumbItem[] = [ { diff --git a/resources/js/pages/session/create.tsx b/resources/js/pages/session/create.tsx index 523437f59..d54af238d 100644 --- a/resources/js/pages/session/create.tsx +++ b/resources/js/pages/session/create.tsx @@ -1,3 +1,5 @@ +import { Form, Head } from '@inertiajs/react'; +import { LoaderCircle } from 'lucide-react'; import SessionController from '@/actions/App/Http/Controllers/SessionController'; import InputError from '@/components/input-error'; import TextLink from '@/components/text-link'; @@ -8,8 +10,6 @@ import { Label } from '@/components/ui/label'; import AuthLayout from '@/layouts/auth-layout'; import { register } from '@/routes'; import { request } from '@/routes/password'; -import { Form, Head } from '@inertiajs/react'; -import { LoaderCircle } from 'lucide-react'; interface LoginProps { status?: string; diff --git a/resources/js/pages/user-email-reset-notification/create.tsx b/resources/js/pages/user-email-reset-notification/create.tsx index 9af294cb2..25d176b42 100644 --- a/resources/js/pages/user-email-reset-notification/create.tsx +++ b/resources/js/pages/user-email-reset-notification/create.tsx @@ -1,15 +1,14 @@ -// Components -import UserEmailResetNotificationController from '@/actions/App/Http/Controllers/UserEmailResetNotificationController'; -import { login } from '@/routes'; import { Form, Head } from '@inertiajs/react'; import { LoaderCircle } from 'lucide-react'; - +// Components +import UserEmailResetNotificationController from '@/actions/App/Http/Controllers/UserEmailResetNotificationController'; import InputError from '@/components/input-error'; import TextLink from '@/components/text-link'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import AuthLayout from '@/layouts/auth-layout'; +import { login } from '@/routes'; export default function ForgotPassword({ status }: { status?: string }) { return ( diff --git a/resources/js/pages/user-email-verification-notification/create.tsx b/resources/js/pages/user-email-verification-notification/create.tsx index 005849013..7dd89b408 100644 --- a/resources/js/pages/user-email-verification-notification/create.tsx +++ b/resources/js/pages/user-email-verification-notification/create.tsx @@ -1,12 +1,11 @@ -// Components -import UserEmailVerificationNotificationController from '@/actions/App/Http/Controllers/UserEmailVerificationNotificationController'; -import { logout } from '@/routes'; import { Form, Head } from '@inertiajs/react'; import { LoaderCircle } from 'lucide-react'; - +// Components +import UserEmailVerificationNotificationController from '@/actions/App/Http/Controllers/UserEmailVerificationNotificationController'; import TextLink from '@/components/text-link'; import { Button } from '@/components/ui/button'; import AuthLayout from '@/layouts/auth-layout'; +import { logout } from '@/routes'; export default function VerifyEmail({ status }: { status?: string }) { return ( diff --git a/resources/js/pages/user-password-confirmation/create.tsx b/resources/js/pages/user-password-confirmation/create.tsx index 519286d25..5789c05c1 100644 --- a/resources/js/pages/user-password-confirmation/create.tsx +++ b/resources/js/pages/user-password-confirmation/create.tsx @@ -1,11 +1,11 @@ +import { Form, Head } from '@inertiajs/react'; +import { LoaderCircle } from 'lucide-react'; import InputError from '@/components/input-error'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import AuthLayout from '@/layouts/auth-layout'; import { store } from '@/routes/password/confirm'; -import { Form, Head } from '@inertiajs/react'; -import { LoaderCircle } from 'lucide-react'; export default function Create() { return ( diff --git a/resources/js/pages/user-password/create.tsx b/resources/js/pages/user-password/create.tsx index 58fc33e47..4fdde618b 100644 --- a/resources/js/pages/user-password/create.tsx +++ b/resources/js/pages/user-password/create.tsx @@ -1,7 +1,6 @@ -import UserPasswordController from '@/actions/App/Http/Controllers/UserPasswordController'; import { Form, Head } from '@inertiajs/react'; import { LoaderCircle } from 'lucide-react'; - +import UserPasswordController from '@/actions/App/Http/Controllers/UserPasswordController'; import InputError from '@/components/input-error'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; diff --git a/resources/js/pages/user-password/edit.tsx b/resources/js/pages/user-password/edit.tsx index 5be5e173f..0f6ed4854 100644 --- a/resources/js/pages/user-password/edit.tsx +++ b/resources/js/pages/user-password/edit.tsx @@ -1,17 +1,16 @@ -import UserPasswordController from '@/actions/App/Http/Controllers/UserPasswordController'; -import InputError from '@/components/input-error'; -import AppLayout from '@/layouts/app-layout'; -import SettingsLayout from '@/layouts/settings/layout'; -import { type BreadcrumbItem } from '@/types'; import { Transition } from '@headlessui/react'; import { Form, Head } from '@inertiajs/react'; import { useRef } from 'react'; - +import UserPasswordController from '@/actions/App/Http/Controllers/UserPasswordController'; import HeadingSmall from '@/components/heading-small'; +import InputError from '@/components/input-error'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; +import AppLayout from '@/layouts/app-layout'; +import SettingsLayout from '@/layouts/settings/layout'; import { edit } from '@/routes/password'; +import { type BreadcrumbItem } from '@/types'; const breadcrumbs: BreadcrumbItem[] = [ { diff --git a/resources/js/pages/user-profile/edit.tsx b/resources/js/pages/user-profile/edit.tsx index 7dcb80c06..5eb97198c 100644 --- a/resources/js/pages/user-profile/edit.tsx +++ b/resources/js/pages/user-profile/edit.tsx @@ -1,9 +1,6 @@ -import UserProfileController from '@/actions/App/Http/Controllers/UserProfileController'; -import { send } from '@/routes/verification'; -import { type BreadcrumbItem, type SharedData } from '@/types'; import { Transition } from '@headlessui/react'; import { Form, Head, Link, usePage } from '@inertiajs/react'; - +import UserProfileController from '@/actions/App/Http/Controllers/UserProfileController'; import DeleteUser from '@/components/delete-user'; import HeadingSmall from '@/components/heading-small'; import InputError from '@/components/input-error'; @@ -13,6 +10,8 @@ import { Label } from '@/components/ui/label'; import AppLayout from '@/layouts/app-layout'; import SettingsLayout from '@/layouts/settings/layout'; import userProfile from '@/routes/user-profile'; +import { send } from '@/routes/verification'; +import { type BreadcrumbItem, type SharedData } from '@/types'; const breadcrumbs: BreadcrumbItem[] = [ { diff --git a/resources/js/pages/user-two-factor-authentication-challenge/show.tsx b/resources/js/pages/user-two-factor-authentication-challenge/show.tsx index d53af9379..7c124bf09 100644 --- a/resources/js/pages/user-two-factor-authentication-challenge/show.tsx +++ b/resources/js/pages/user-two-factor-authentication-challenge/show.tsx @@ -1,3 +1,6 @@ +import { Form, Head } from '@inertiajs/react'; +import { REGEXP_ONLY_DIGITS } from 'input-otp'; +import { useMemo, useState } from 'react'; import InputError from '@/components/input-error'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; @@ -9,9 +12,6 @@ import { import { OTP_MAX_LENGTH } from '@/hooks/use-two-factor-auth'; import AuthLayout from '@/layouts/auth-layout'; import { store } from '@/routes/two-factor/login'; -import { Form, Head } from '@inertiajs/react'; -import { REGEXP_ONLY_DIGITS } from 'input-otp'; -import { useMemo, useState } from 'react'; export default function Show() { const [showRecoveryInput, setShowRecoveryInput] = useState(false); diff --git a/resources/js/pages/user-two-factor-authentication/show.tsx b/resources/js/pages/user-two-factor-authentication/show.tsx index e205b9123..8ec9fdd09 100644 --- a/resources/js/pages/user-two-factor-authentication/show.tsx +++ b/resources/js/pages/user-two-factor-authentication/show.tsx @@ -1,3 +1,6 @@ +import { Form, Head } from '@inertiajs/react'; +import { ShieldBan, ShieldCheck } from 'lucide-react'; +import { useState } from 'react'; import HeadingSmall from '@/components/heading-small'; import TwoFactorRecoveryCodes from '@/components/two-factor-recovery-codes'; import TwoFactorSetupModal from '@/components/two-factor-setup-modal'; @@ -8,9 +11,6 @@ import AppLayout from '@/layouts/app-layout'; import SettingsLayout from '@/layouts/settings/layout'; import { disable, enable, show } from '@/routes/two-factor'; import { type BreadcrumbItem } from '@/types'; -import { Form, Head } from '@inertiajs/react'; -import { ShieldBan, ShieldCheck } from 'lucide-react'; -import { useState } from 'react'; interface TwoFactorProps { twoFactorEnabled?: boolean; diff --git a/resources/js/pages/user/create.tsx b/resources/js/pages/user/create.tsx index 391202015..886c7ca9f 100644 --- a/resources/js/pages/user/create.tsx +++ b/resources/js/pages/user/create.tsx @@ -1,14 +1,13 @@ -import UserController from '@/actions/App/Http/Controllers/UserController'; -import { login } from '@/routes'; import { Form, Head } from '@inertiajs/react'; import { LoaderCircle } from 'lucide-react'; - +import UserController from '@/actions/App/Http/Controllers/UserController'; import InputError from '@/components/input-error'; import TextLink from '@/components/text-link'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import AuthLayout from '@/layouts/auth-layout'; +import { login } from '@/routes'; export default function Register() { return ( diff --git a/resources/js/pages/welcome.tsx b/resources/js/pages/welcome.tsx index c7383063b..32d210a8b 100644 --- a/resources/js/pages/welcome.tsx +++ b/resources/js/pages/welcome.tsx @@ -1,6 +1,6 @@ +import { Head, Link, usePage } from '@inertiajs/react'; import { dashboard, login, register } from '@/routes'; import { type SharedData } from '@/types'; -import { Head, Link, usePage } from '@inertiajs/react'; export default function Welcome() { const { auth } = usePage().props; diff --git a/tsconfig.json b/tsconfig.json index 42777d464..e6397376c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -107,7 +107,7 @@ /* Completeness */ // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ "skipLibCheck": true /* Skip type checking all .d.ts files. */, - "baseUrl": ".", + // "baseUrl": ".", "paths": { "@/*": ["./resources/js/*"] }, diff --git a/vite.config.ts b/vite.config.ts index 218357544..01eae3fd4 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -2,22 +2,63 @@ import { wayfinder } from '@laravel/vite-plugin-wayfinder'; import tailwindcss from '@tailwindcss/vite'; import react from '@vitejs/plugin-react'; import laravel from 'laravel-vite-plugin'; -import { defineConfig } from 'vite'; +import { defineConfig } from 'vite-plus'; export default defineConfig({ - plugins: [ - laravel({ - input: ['resources/css/app.css', 'resources/js/app.tsx'], - ssr: 'resources/js/ssr.tsx', - refresh: true, - }), - react(), - tailwindcss(), - wayfinder({ - formVariants: true, - }), - ], - esbuild: { - jsx: 'automatic', - }, + lint: { + "options": { + "typeAware":true, + "typeCheck":true + }, + "plugins": ["eslint", "typescript", "unicorn", "oxc", "react"] + }, + fmt: { + "printWidth": 80, + "tabWidth": 4, + "useTabs": false, + "semi": true, + "singleQuote": true, + "overrides": [ + { + "files": ["**/*.yml"], + "options": { + "tabWidth": 2 + } + } + ], + "sortTailwindcss": { + "functions": ["clsx", "cn"], + "stylesheet": "resources/css/app.css" + }, + "sortImports": { + "groups": [ + "builtin", + "external", + "internal", + "parent", + "sibling", + "index" + ], + "newlinesBetween": false + }, + "ignorePatterns": [ + "resources/js/components/ui/*", + "resources/views/mail/*", + "resources/js/actions/*", + "resources/js/routes/*", + "resources/js/wayfinder/*" + ], + }, + plugins: [ + laravel({ + input: ["resources/css/app.css", "resources/js/app.tsx"], + ssr: "resources/js/ssr.tsx", + refresh: true, + }), + react(), + tailwindcss(), + wayfinder({ + formVariants: true, + }), + ], }); From 571e2ba43909399fc9b5dc0021e57a3a03e067b5 Mon Sep 17 00:00:00 2001 From: Josh Donnell Date: Sun, 15 Mar 2026 11:16:55 +0000 Subject: [PATCH 02/19] fix: linting --- vite.config.ts | 66 +++++++++++++++++++++++++------------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/vite.config.ts b/vite.config.ts index 01eae3fd4..fd01eaaef 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -6,53 +6,53 @@ import { defineConfig } from 'vite-plus'; export default defineConfig({ lint: { - "options": { - "typeAware":true, - "typeCheck":true + options: { + typeAware:true, + typeCheck:true }, - "plugins": ["eslint", "typescript", "unicorn", "oxc", "react"] + plugins: ['eslint', 'typescript', 'unicorn', 'oxc', 'react'] }, fmt: { - "printWidth": 80, - "tabWidth": 4, - "useTabs": false, - "semi": true, - "singleQuote": true, - "overrides": [ + printWidth: 80, + tabWidth: 4, + useTabs: false, + semi: true, + singleQuote: true, + overrides: [ { - "files": ["**/*.yml"], - "options": { - "tabWidth": 2 + files: ['**/*.yml'], + options: { + 'tabWidth': 2 } } ], - "sortTailwindcss": { - "functions": ["clsx", "cn"], - "stylesheet": "resources/css/app.css" + sortTailwindcss: { + functions: ['clsx', 'cn'], + stylesheet: 'resources/css/app.css' }, - "sortImports": { - "groups": [ - "builtin", - "external", - "internal", - "parent", - "sibling", - "index" + sortImports: { + groups: [ + 'builtin', + 'external', + 'internal', + 'parent', + 'sibling', + 'index' ], - "newlinesBetween": false + newlinesBetween: false }, - "ignorePatterns": [ - "resources/js/components/ui/*", - "resources/views/mail/*", - "resources/js/actions/*", - "resources/js/routes/*", - "resources/js/wayfinder/*" + ignorePatterns: [ + 'resources/js/components/ui/*', + 'resources/views/mail/*', + 'resources/js/actions/*', + 'resources/js/routes/*', + 'resources/js/wayfinder/*' ], }, plugins: [ laravel({ - input: ["resources/css/app.css", "resources/js/app.tsx"], - ssr: "resources/js/ssr.tsx", + input: ['resources/css/app.css', 'resources/js/app.tsx'], + ssr: 'resources/js/ssr.tsx', refresh: true, }), react(), From 99c52fc0ef04442be668636d2f1cd862a1be7e6a Mon Sep 17 00:00:00 2001 From: Josh Donnell Date: Sun, 15 Mar 2026 11:42:06 +0000 Subject: [PATCH 03/19] fix: remove defined package manager from package.json --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index 4c1d77bf2..7dd9497e3 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,6 @@ "@tailwindcss/oxide-linux-x64-gnu": "^4.2.1", "lightningcss-linux-x64-gnu": "^1.32.0" }, - "packageManager": "pnpm@10.32.1", "overrides": { "vite": "npm:@voidzero-dev/vite-plus-core@latest", "vitest": "npm:@voidzero-dev/vite-plus-test@latest" From cc73fafba80628d027571a6aa96dc2fc59b04c0f Mon Sep 17 00:00:00 2001 From: Josh Donnell Date: Sun, 15 Mar 2026 11:59:08 +0000 Subject: [PATCH 04/19] fix: lint and fix bun issue with vite --- package.json | 4 +- vite.config.ts | 112 ++++++++++++++++++++++++------------------------- 2 files changed, 58 insertions(+), 58 deletions(-) diff --git a/package.json b/package.json index 7dd9497e3..9e6f7d1e4 100644 --- a/package.json +++ b/package.json @@ -5,8 +5,8 @@ "build": "vp build", "build:ssr": "vp build && vp build --ssr", "dev": "vp dev", - "lint": "vp lint --fix && vp fmt resources/", - "test:lint": "vp lint --type-aware && vp fmt --check resources/", + "lint": "bun ./node_modules/oxlint/bin/oxlint --fix && vp fmt resources/", + "test:lint": "bun ./node_modules/oxlint/bin/oxlint --type-aware && vp fmt --check resources/", "test:types": "tsc --noEmit" }, "devDependencies": { diff --git a/vite.config.ts b/vite.config.ts index fd01eaaef..e293182e1 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -5,60 +5,60 @@ import laravel from 'laravel-vite-plugin'; import { defineConfig } from 'vite-plus'; export default defineConfig({ - lint: { - options: { - typeAware:true, - typeCheck:true - }, - plugins: ['eslint', 'typescript', 'unicorn', 'oxc', 'react'] - }, - fmt: { - printWidth: 80, - tabWidth: 4, - useTabs: false, - semi: true, - singleQuote: true, - overrides: [ - { - files: ['**/*.yml'], - options: { - 'tabWidth': 2 - } - } - ], - sortTailwindcss: { - functions: ['clsx', 'cn'], - stylesheet: 'resources/css/app.css' - }, - sortImports: { - groups: [ - 'builtin', - 'external', - 'internal', - 'parent', - 'sibling', - 'index' - ], - newlinesBetween: false - }, - ignorePatterns: [ - 'resources/js/components/ui/*', - 'resources/views/mail/*', - 'resources/js/actions/*', - 'resources/js/routes/*', - 'resources/js/wayfinder/*' - ], - }, - plugins: [ - laravel({ - input: ['resources/css/app.css', 'resources/js/app.tsx'], - ssr: 'resources/js/ssr.tsx', - refresh: true, - }), - react(), - tailwindcss(), - wayfinder({ - formVariants: true, - }), - ], + lint: { + options: { + typeAware: true, + typeCheck: true, + }, + plugins: ['eslint', 'typescript', 'unicorn', 'oxc', 'react'], + }, + fmt: { + printWidth: 80, + tabWidth: 4, + useTabs: false, + semi: true, + singleQuote: true, + overrides: [ + { + files: ['**/*.yml'], + options: { + tabWidth: 2, + }, + }, + ], + sortTailwindcss: { + functions: ['clsx', 'cn'], + stylesheet: 'resources/css/app.css', + }, + sortImports: { + groups: [ + 'builtin', + 'external', + 'internal', + 'parent', + 'sibling', + 'index', + ], + newlinesBetween: false, + }, + ignorePatterns: [ + 'resources/js/components/ui/*', + 'resources/views/mail/*', + 'resources/js/actions/*', + 'resources/js/routes/*', + 'resources/js/wayfinder/*', + ], + }, + plugins: [ + laravel({ + input: ['resources/css/app.css', 'resources/js/app.tsx'], + ssr: 'resources/js/ssr.tsx', + refresh: true, + }), + react(), + tailwindcss(), + wayfinder({ + formVariants: true, + }), + ], }); From 9b7d76aeab89aca9bf42f93f7bc6249ea47c256a Mon Sep 17 00:00:00 2001 From: Josh Donnell Date: Sun, 15 Mar 2026 12:08:00 +0000 Subject: [PATCH 05/19] fix: incude correct version of node for oxlint --- .github/workflows/tests.yml | 5 +++++ package.json | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index c5c4e06e6..1ae8a64ee 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -31,6 +31,11 @@ jobs: - name: Setup Bun uses: oven-sh/setup-bun@v2 + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 24 + - name: Cache Composer Dependencies uses: actions/cache@v4 with: diff --git a/package.json b/package.json index 9e6f7d1e4..7dd9497e3 100644 --- a/package.json +++ b/package.json @@ -5,8 +5,8 @@ "build": "vp build", "build:ssr": "vp build && vp build --ssr", "dev": "vp dev", - "lint": "bun ./node_modules/oxlint/bin/oxlint --fix && vp fmt resources/", - "test:lint": "bun ./node_modules/oxlint/bin/oxlint --type-aware && vp fmt --check resources/", + "lint": "vp lint --fix && vp fmt resources/", + "test:lint": "vp lint --type-aware && vp fmt --check resources/", "test:types": "tsc --noEmit" }, "devDependencies": { From a35678d57d78d0bfc05fd89df8be1662e324941a Mon Sep 17 00:00:00 2001 From: Josh Donnell Date: Sun, 15 Mar 2026 14:19:22 +0000 Subject: [PATCH 06/19] ci: update to use the vite+ installer --- .github/workflows/tests.yml | 4 ++-- README.md | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 1ae8a64ee..5d3ae3576 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -31,8 +31,8 @@ jobs: - name: Setup Bun uses: oven-sh/setup-bun@v2 - - name: Setup Node - uses: actions/setup-node@v4 + - name: Setup Vite+ + uses: voidzero-dev/setup-vp@v1 with: node-version: 24 diff --git a/README.md b/README.md index 887f4fe50..5e0796614 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Modern PHP has evolved into a mature, type-safe language, yet many Laravel proje - **Fully Actions-Oriented Architecture**: Every operation is encapsulated in a single-action class - **Cruddy by Design**: Standardized CRUD operations for all controllers, actions, and Inertia & React pages - **100% Type Coverage**: Every method, property, and parameter is explicitly typed -- **Zero Tolerance for Code Smells**: Rector, PHPStan, OxLint, and Prettier at maximum strictness catch issues before they become bugs +- **Zero Tolerance for Code Smells**: Rector, PHPStan, OxLint, and Oxfmt at maximum strictness catch issues before they become bugs - **Immutable-First Architecture**: Data structures favor immutability to prevent unexpected mutations - **Fail-Fast Philosophy**: Errors are caught at compile-time, not runtime - **Automated Code Quality**: Pre-configured tools ensure consistent, pristine code across your entire team @@ -80,10 +80,10 @@ You should see 100% test coverage and all quality checks passing. ## Available Tooling ### Development -- `composer dev` - Starts Laravel server, queue worker, log monitoring, and Vite dev server concurrently +- `composer dev` - Starts Laravel server, queue worker, log monitoring, and Vite+ dev server concurrently ### Code Quality -- `composer lint` - Runs Rector (refactoring), Pint (PHP formatting), and Prettier (JS/TS formatting) +- `composer lint` - Runs Rector (refactoring), Pint (PHP formatting), and Oxfmt (JS/TS formatting) - `composer test:lint` - Dry-run mode for CI/CD pipelines ### Testing From 6304444c9a8c2790473717a14ac5e3cf1cd79515 Mon Sep 17 00:00:00 2001 From: Josh Donnell Date: Thu, 19 Mar 2026 20:48:31 +0000 Subject: [PATCH 07/19] chore: deps update --- package.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 7dd9497e3..691dc0ac7 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@laravel/vite-plugin-wayfinder": "^0.1.7", "@types/node": "^25.5.0", - "npm-check-updates": "^19.6.3", + "npm-check-updates": "^19.6.5", "playwright": "^1.58.2", "vite-plus": "latest" }, @@ -32,7 +32,7 @@ "@radix-ui/react-toggle": "^1.1.10", "@radix-ui/react-toggle-group": "^1.1.11", "@radix-ui/react-tooltip": "^1.2.8", - "@tailwindcss/vite": "^4.2.1", + "@tailwindcss/vite": "^4.2.2", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", "@vitejs/plugin-react": "^6.0.1", @@ -40,19 +40,19 @@ "clsx": "^2.1.1", "concurrently": "^9.2.1", "input-otp": "^1.4.2", - "laravel-vite-plugin": "^2.1.0", + "laravel-vite-plugin": "^3.0.0", "lucide-react": "^0.577.0", "react": "^19.2.4", "react-dom": "^19.2.4", "tailwind-merge": "^3.5.0", - "tailwindcss": "^4.2.1", + "tailwindcss": "^4.2.2", "tailwindcss-animate": "^1.0.7", "typescript": "^5.9.3", "vite": "npm:@voidzero-dev/vite-plus-core@latest" }, "optionalDependencies": { "@rollup/rollup-linux-x64-gnu": "4.59.0", - "@tailwindcss/oxide-linux-x64-gnu": "^4.2.1", + "@tailwindcss/oxide-linux-x64-gnu": "^4.2.2", "lightningcss-linux-x64-gnu": "^1.32.0" }, "overrides": { From 316fcc77aeda2d6f9eeeec378e0ce14158e2e196 Mon Sep 17 00:00:00 2001 From: Josh Donnell Date: Thu, 19 Mar 2026 20:50:53 +0000 Subject: [PATCH 08/19] fix: remove overrides on the methods --- app/Http/Middleware/HandleInertiaRequests.php | 2 -- app/Models/User.php | 2 -- 2 files changed, 4 deletions(-) diff --git a/app/Http/Middleware/HandleInertiaRequests.php b/app/Http/Middleware/HandleInertiaRequests.php index 49aa4405f..6ac19bd29 100644 --- a/app/Http/Middleware/HandleInertiaRequests.php +++ b/app/Http/Middleware/HandleInertiaRequests.php @@ -6,7 +6,6 @@ use Illuminate\Http\Request; use Inertia\Middleware; -use Override; final class HandleInertiaRequests extends Middleware { @@ -15,7 +14,6 @@ final class HandleInertiaRequests extends Middleware * * @var string */ - #[Override] protected $rootView = 'app'; /** diff --git a/app/Models/User.php b/app/Models/User.php index 9d96ab742..b4f575b84 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -12,7 +12,6 @@ use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Laravel\Fortify\TwoFactorAuthenticatable; -use Override; /** * @property-read string $id @@ -39,7 +38,6 @@ final class User extends Authenticatable implements MustVerifyEmail /** * @var list */ - #[Override] protected $hidden = [ 'password', 'remember_token', From 03f4a0b5f2d588702a6e2669492b27e43cbaae2d Mon Sep 17 00:00:00 2001 From: Josh Donnell Date: Thu, 19 Mar 2026 21:14:13 +0000 Subject: [PATCH 09/19] fix: tests issue with frozen lockfiles --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 5d3ae3576..ae48d53ca 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -60,7 +60,7 @@ jobs: run: php artisan key:generate - name: Install Bun Dependencies - run: bun install --frozen-lockfile + run: bun install - name: Build Assets run: bun run build From 1388a9bbbd69c160e1ecc5ee3d6ead7c5f1c4bc1 Mon Sep 17 00:00:00 2001 From: Josh Donnell Date: Sat, 21 Mar 2026 11:30:13 +0000 Subject: [PATCH 10/19] feat: update files from main for vite + update --- resources/js/app.tsx | 19 +- resources/js/components/app-content.tsx | 13 +- resources/js/components/app-header.tsx | 114 +-- resources/js/components/app-logo-icon.tsx | 2 +- resources/js/components/app-logo.tsx | 2 +- resources/js/components/app-shell.tsx | 15 +- .../js/components/app-sidebar-header.tsx | 2 +- resources/js/components/app-sidebar.tsx | 8 +- .../js/components/appearance-dropdown.tsx | 67 -- resources/js/components/appearance-tabs.tsx | 8 +- resources/js/components/breadcrumbs.tsx | 2 +- resources/js/components/delete-user.tsx | 10 +- resources/js/components/heading-small.tsx | 16 - resources/js/components/heading.tsx | 16 +- resources/js/components/icon.tsx | 15 - resources/js/components/input-error.tsx | 2 +- resources/js/components/nav-footer.tsx | 17 +- resources/js/components/nav-main.tsx | 14 +- resources/js/components/nav-user.tsx | 3 +- resources/js/components/password-input.tsx | 37 + resources/js/components/text-link.tsx | 6 +- .../components/two-factor-recovery-codes.tsx | 16 +- .../js/components/two-factor-setup-modal.tsx | 60 +- resources/js/components/ui/alert.tsx | 2 +- resources/js/components/ui/avatar.tsx | 2 +- resources/js/components/ui/badge.tsx | 2 +- resources/js/components/ui/breadcrumb.tsx | 2 +- resources/js/components/ui/button.tsx | 2 +- resources/js/components/ui/checkbox.tsx | 2 +- resources/js/components/ui/dialog.tsx | 2 +- resources/js/components/ui/dropdown-menu.tsx | 2 +- resources/js/components/ui/icon.tsx | 2 +- resources/js/components/ui/input-otp.tsx | 2 +- resources/js/components/ui/label.tsx | 2 +- .../js/components/ui/navigation-menu.tsx | 2 +- resources/js/components/ui/select.tsx | 26 +- resources/js/components/ui/separator.tsx | 2 +- resources/js/components/ui/sheet.tsx | 2 +- resources/js/components/ui/sidebar.tsx | 76 +- resources/js/components/ui/spinner.tsx | 16 + resources/js/components/ui/toggle-group.tsx | 4 +- resources/js/components/ui/toggle.tsx | 2 +- resources/js/components/ui/tooltip.tsx | 8 +- resources/js/components/user-info.tsx | 2 +- resources/js/components/user-menu-content.tsx | 13 +- resources/js/hooks/use-appearance.tsx | 107 ++- resources/js/hooks/use-clipboard.ts | 14 +- resources/js/hooks/use-current-url.ts | 83 ++ resources/js/hooks/use-initials.tsx | 13 +- resources/js/hooks/use-mobile-navigation.ts | 4 +- resources/js/hooks/use-mobile.tsx | 42 +- resources/js/hooks/use-two-factor-auth.ts | 55 +- resources/js/layouts/app-layout.tsx | 8 +- .../js/layouts/app/app-header-layout.tsx | 9 +- .../js/layouts/app/app-sidebar-layout.tsx | 5 +- .../js/layouts/auth/auth-card-layout.tsx | 2 +- .../js/layouts/auth/auth-simple-layout.tsx | 10 +- .../js/layouts/auth/auth-split-layout.tsx | 23 +- resources/js/layouts/settings/layout.tsx | 28 +- resources/js/lib/utils.ts | 8 +- resources/js/pages/appearance/update.tsx | 11 +- resources/js/pages/dashboard.tsx | 4 +- resources/js/pages/session/create.tsx | 39 +- .../user-email-reset-notification/create.tsx | 4 +- .../create.tsx | 13 +- .../user-password-confirmation/create.tsx | 11 +- resources/js/pages/user-password/create.tsx | 23 +- resources/js/pages/user-password/edit.tsx | 18 +- resources/js/pages/user-profile/edit.tsx | 70 +- .../show.tsx | 6 +- .../user-two-factor-authentication/show.tsx | 172 ++-- resources/js/pages/user/create.tsx | 17 +- resources/js/pages/welcome.tsx | 773 +++++------------- resources/js/ssr.tsx | 10 +- resources/js/types/auth.ts | 24 + resources/js/types/global.d.ts | 12 + resources/js/types/index.d.ts | 42 - resources/js/types/index.ts | 3 + resources/js/types/navigation.ts | 14 + resources/js/types/ui.ts | 16 + 80 files changed, 1023 insertions(+), 1309 deletions(-) delete mode 100644 resources/js/components/appearance-dropdown.tsx delete mode 100644 resources/js/components/heading-small.tsx delete mode 100644 resources/js/components/icon.tsx create mode 100644 resources/js/components/password-input.tsx create mode 100644 resources/js/components/ui/spinner.tsx create mode 100644 resources/js/hooks/use-current-url.ts create mode 100644 resources/js/types/auth.ts create mode 100644 resources/js/types/global.d.ts delete mode 100644 resources/js/types/index.d.ts create mode 100644 resources/js/types/index.ts create mode 100644 resources/js/types/navigation.ts create mode 100644 resources/js/types/ui.ts diff --git a/resources/js/app.tsx b/resources/js/app.tsx index 722acfcfc..cab78007e 100644 --- a/resources/js/app.tsx +++ b/resources/js/app.tsx @@ -1,22 +1,31 @@ -import '../css/app.css'; import { createInertiaApp } from '@inertiajs/react'; import { resolvePageComponent } from 'laravel-vite-plugin/inertia-helpers'; +import type { ComponentType } from 'react'; +import { StrictMode } from 'react'; import { createRoot } from 'react-dom/client'; -import { initializeTheme } from './hooks/use-appearance'; +import { TooltipProvider } from '@/components/ui/tooltip'; +import { initializeTheme } from '@/hooks/use-appearance'; +import '../css/app.css'; const appName = import.meta.env.VITE_APP_NAME || 'Laravel'; void createInertiaApp({ title: (title) => (title ? `${title} - ${appName}` : appName), resolve: (name) => - resolvePageComponent( + resolvePageComponent( `./pages/${name}.tsx`, - import.meta.glob('./pages/**/*.tsx'), + import.meta.glob('./pages/**/*.tsx'), ), setup({ el, App, props }) { const root = createRoot(el); - root.render(); + root.render( + + + + + , + ); }, progress: { color: '#4B5563', diff --git a/resources/js/components/app-content.tsx b/resources/js/components/app-content.tsx index 5f5834cbd..5a04c696a 100644 --- a/resources/js/components/app-content.tsx +++ b/resources/js/components/app-content.tsx @@ -1,15 +1,12 @@ import * as React from 'react'; import { SidebarInset } from '@/components/ui/sidebar'; +import type { AppVariant } from '@/types'; -interface AppContentProps extends React.ComponentProps<'main'> { - variant?: 'header' | 'sidebar'; -} +type Props = React.ComponentProps<'main'> & { + variant?: AppVariant; +}; -export function AppContent({ - variant = 'header', - children, - ...props -}: AppContentProps) { +export function AppContent({ variant = 'sidebar', children, ...props }: Props) { if (variant === 'sidebar') { return {children}; } diff --git a/resources/js/components/app-header.tsx b/resources/js/components/app-header.tsx index 1a7d8f779..0aac91a72 100644 --- a/resources/js/components/app-header.tsx +++ b/resources/js/components/app-header.tsx @@ -1,7 +1,8 @@ import { Link, usePage } from '@inertiajs/react'; import { BookOpen, Folder, LayoutGrid, Menu, Search } from 'lucide-react'; +import AppLogo from '@/components/app-logo'; +import AppLogoIcon from '@/components/app-logo-icon'; import { Breadcrumbs } from '@/components/breadcrumbs'; -import { Icon } from '@/components/icon'; import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; import { Button } from '@/components/ui/button'; import { @@ -25,16 +26,18 @@ import { import { Tooltip, TooltipContent, - TooltipProvider, TooltipTrigger, } from '@/components/ui/tooltip'; import { UserMenuContent } from '@/components/user-menu-content'; +import { useCurrentUrl } from '@/hooks/use-current-url'; import { useInitials } from '@/hooks/use-initials'; -import { cn } from '@/lib/utils'; +import { cn, toUrl } from '@/lib/utils'; import { dashboard } from '@/routes'; -import { type BreadcrumbItem, type NavItem, type SharedData } from '@/types'; -import AppLogo from './app-logo'; -import AppLogoIcon from './app-logo-icon'; +import type { BreadcrumbItem, NavItem } from '@/types'; + +type Props = { + breadcrumbs?: BreadcrumbItem[]; +}; const mainNavItems: NavItem[] = [ { @@ -60,14 +63,12 @@ const rightNavItems: NavItem[] = [ const activeItemStyles = 'text-neutral-900 dark:bg-neutral-800 dark:text-neutral-100'; -interface AppHeaderProps { - breadcrumbs?: BreadcrumbItem[]; -} - -export function AppHeader({ breadcrumbs = [] }: AppHeaderProps) { - const page = usePage(); +export function AppHeader({ breadcrumbs = [] }: Props) { + const page = usePage(); const { auth } = page.props; const getInitials = useInitials(); + const { isCurrentUrl, whenCurrentUrl } = useCurrentUrl(); + return ( <>
@@ -89,7 +90,7 @@ export function AppHeader({ breadcrumbs = [] }: AppHeaderProps) { className="flex h-full w-64 flex-col items-stretch justify-between bg-sidebar" > - Navigation Menu + Navigation menu @@ -104,10 +105,7 @@ export function AppHeader({ breadcrumbs = [] }: AppHeaderProps) { className="flex items-center space-x-2 font-medium" > {item.icon && ( - + )} {item.title} @@ -118,21 +116,13 @@ export function AppHeader({ breadcrumbs = [] }: AppHeaderProps) { {rightNavItems.map((item) => ( {item.icon && ( - + )} {item.title} @@ -165,24 +155,19 @@ export function AppHeader({ breadcrumbs = [] }: AppHeaderProps) { href={item.href} className={cn( navigationMenuTriggerStyle(), - page.url === - (typeof item.href === - 'string' - ? item.href - : item.href.url) && + whenCurrentUrl( + item.href, activeItemStyles, + ), 'h-9 cursor-pointer px-3', )} > {item.icon && ( - + )} {item.title} - {page.url === item.href && ( + {isCurrentUrl(item.href) && (
)} @@ -200,41 +185,28 @@ export function AppHeader({ breadcrumbs = [] }: AppHeaderProps) { > -
+
{rightNavItems.map((item) => ( - - - - - - {item.title} - - {item.icon && ( - - )} - - - -

{item.title}

-
-
-
+ + + + + {item.title} + + {item.icon && ( + + )} + + + +

{item.title}

+
+
))}
diff --git a/resources/js/components/app-logo-icon.tsx b/resources/js/components/app-logo-icon.tsx index 9bd62ad84..0c3121533 100644 --- a/resources/js/components/app-logo-icon.tsx +++ b/resources/js/components/app-logo-icon.tsx @@ -1,4 +1,4 @@ -import { SVGAttributes } from 'react'; +import type { SVGAttributes } from 'react'; export default function AppLogoIcon(props: SVGAttributes) { return ( diff --git a/resources/js/components/app-logo.tsx b/resources/js/components/app-logo.tsx index 42d998fdb..e786232a9 100644 --- a/resources/js/components/app-logo.tsx +++ b/resources/js/components/app-logo.tsx @@ -1,4 +1,4 @@ -import AppLogoIcon from './app-logo-icon'; +import AppLogoIcon from '@/components/app-logo-icon'; export default function AppLogo() { return ( diff --git a/resources/js/components/app-shell.tsx b/resources/js/components/app-shell.tsx index ea4b259f8..f51a9dbf6 100644 --- a/resources/js/components/app-shell.tsx +++ b/resources/js/components/app-shell.tsx @@ -1,14 +1,15 @@ import { usePage } from '@inertiajs/react'; +import type { ReactNode } from 'react'; import { SidebarProvider } from '@/components/ui/sidebar'; -import { SharedData } from '@/types'; +import type { AppVariant } from '@/types'; -interface AppShellProps { - children: React.ReactNode; - variant?: 'header' | 'sidebar'; -} +type Props = { + children: ReactNode; + variant?: AppVariant; +}; -export function AppShell({ children, variant = 'header' }: AppShellProps) { - const isOpen = usePage().props.sidebarOpen; +export function AppShell({ children, variant = 'sidebar' }: Props) { + const isOpen = usePage().props.sidebarOpen; if (variant === 'header') { return ( diff --git a/resources/js/components/app-sidebar-header.tsx b/resources/js/components/app-sidebar-header.tsx index a779df7f1..9d53d6c91 100644 --- a/resources/js/components/app-sidebar-header.tsx +++ b/resources/js/components/app-sidebar-header.tsx @@ -1,6 +1,6 @@ import { Breadcrumbs } from '@/components/breadcrumbs'; import { SidebarTrigger } from '@/components/ui/sidebar'; -import { type BreadcrumbItem as BreadcrumbItemType } from '@/types'; +import type { BreadcrumbItem as BreadcrumbItemType } from '@/types'; export function AppSidebarHeader({ breadcrumbs = [], diff --git a/resources/js/components/app-sidebar.tsx b/resources/js/components/app-sidebar.tsx index 6f8226efe..a38aa1d91 100644 --- a/resources/js/components/app-sidebar.tsx +++ b/resources/js/components/app-sidebar.tsx @@ -1,5 +1,6 @@ import { Link } from '@inertiajs/react'; -import { BookOpen, Folder, LayoutGrid } from 'lucide-react'; +import { BookOpen, FolderGit2, LayoutGrid } from 'lucide-react'; +import AppLogo from '@/components/app-logo'; import { NavFooter } from '@/components/nav-footer'; import { NavMain } from '@/components/nav-main'; import { NavUser } from '@/components/nav-user'; @@ -13,8 +14,7 @@ import { SidebarMenuItem, } from '@/components/ui/sidebar'; import { dashboard } from '@/routes'; -import { type NavItem } from '@/types'; -import AppLogo from './app-logo'; +import type { NavItem } from '@/types'; const mainNavItems: NavItem[] = [ { @@ -28,7 +28,7 @@ const footerNavItems: NavItem[] = [ { title: 'Repository', href: 'https://github.com/laravel/react-starter-kit', - icon: Folder, + icon: FolderGit2, }, { title: 'Documentation', diff --git a/resources/js/components/appearance-dropdown.tsx b/resources/js/components/appearance-dropdown.tsx deleted file mode 100644 index 55dc92e3d..000000000 --- a/resources/js/components/appearance-dropdown.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import { Monitor, Moon, Sun } from 'lucide-react'; -import { HTMLAttributes } from 'react'; -import { Button } from '@/components/ui/button'; -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuTrigger, -} from '@/components/ui/dropdown-menu'; -import { useAppearance } from '@/hooks/use-appearance'; - -export default function AppearanceToggleDropdown({ - className = '', - ...props -}: HTMLAttributes) { - const { appearance, updateAppearance } = useAppearance(); - - const getCurrentIcon = () => { - switch (appearance) { - case 'dark': - return ; - case 'light': - return ; - default: - return ; - } - }; - - return ( -
- - - - - - updateAppearance('light')}> - - - Light - - - updateAppearance('dark')}> - - - Dark - - - updateAppearance('system')} - > - - - System - - - - -
- ); -} diff --git a/resources/js/components/appearance-tabs.tsx b/resources/js/components/appearance-tabs.tsx index aa4efe0b8..b01386248 100644 --- a/resources/js/components/appearance-tabs.tsx +++ b/resources/js/components/appearance-tabs.tsx @@ -1,6 +1,8 @@ -import { LucideIcon, Monitor, Moon, Sun } from 'lucide-react'; -import { HTMLAttributes } from 'react'; -import { Appearance, useAppearance } from '@/hooks/use-appearance'; +import type { LucideIcon } from 'lucide-react'; +import { Monitor, Moon, Sun } from 'lucide-react'; +import type { HTMLAttributes } from 'react'; +import type { Appearance } from '@/hooks/use-appearance'; +import { useAppearance } from '@/hooks/use-appearance'; import { cn } from '@/lib/utils'; export default function AppearanceToggleTab({ diff --git a/resources/js/components/breadcrumbs.tsx b/resources/js/components/breadcrumbs.tsx index 1e317cafd..95414f215 100644 --- a/resources/js/components/breadcrumbs.tsx +++ b/resources/js/components/breadcrumbs.tsx @@ -8,7 +8,7 @@ import { BreadcrumbPage, BreadcrumbSeparator, } from '@/components/ui/breadcrumb'; -import { type BreadcrumbItem as BreadcrumbItemType } from '@/types'; +import type { BreadcrumbItem as BreadcrumbItemType } from '@/types'; export function Breadcrumbs({ breadcrumbs, diff --git a/resources/js/components/delete-user.tsx b/resources/js/components/delete-user.tsx index 4f4f9426c..f0f8e3338 100644 --- a/resources/js/components/delete-user.tsx +++ b/resources/js/components/delete-user.tsx @@ -1,8 +1,9 @@ import { Form } from '@inertiajs/react'; import { useRef } from 'react'; import UserController from '@/actions/App/Http/Controllers/UserController'; -import HeadingSmall from '@/components/heading-small'; +import Heading from '@/components/heading'; import InputError from '@/components/input-error'; +import PasswordInput from '@/components/password-input'; import { Button } from '@/components/ui/button'; import { Dialog, @@ -13,7 +14,6 @@ import { DialogTitle, DialogTrigger, } from '@/components/ui/dialog'; -import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; export default function DeleteUser() { @@ -21,7 +21,8 @@ export default function DeleteUser() { return (
- @@ -72,9 +73,8 @@ export default function DeleteUser() { Password - -

{title}

- {description && ( -

{description}

- )} - - ); -} diff --git a/resources/js/components/heading.tsx b/resources/js/components/heading.tsx index a4a6e23a3..515242df2 100644 --- a/resources/js/components/heading.tsx +++ b/resources/js/components/heading.tsx @@ -1,16 +1,26 @@ export default function Heading({ title, description, + variant = 'default', }: { title: string; description?: string; + variant?: 'default' | 'small'; }) { return ( -
-

{title}

+
+

+ {title} +

{description && (

{description}

)} -
+ ); } diff --git a/resources/js/components/icon.tsx b/resources/js/components/icon.tsx deleted file mode 100644 index 75194a710..000000000 --- a/resources/js/components/icon.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { type LucideProps } from 'lucide-react'; -import { type ComponentType } from 'react'; -import { cn } from '@/lib/utils'; - -interface IconProps extends Omit { - iconNode: ComponentType; -} - -export function Icon({ - iconNode: IconComponent, - className, - ...props -}: IconProps) { - return ; -} diff --git a/resources/js/components/input-error.tsx b/resources/js/components/input-error.tsx index 1e56ed75c..f323cee94 100644 --- a/resources/js/components/input-error.tsx +++ b/resources/js/components/input-error.tsx @@ -1,4 +1,4 @@ -import { type HTMLAttributes } from 'react'; +import type { HTMLAttributes } from 'react'; import { cn } from '@/lib/utils'; export default function InputError({ diff --git a/resources/js/components/nav-footer.tsx b/resources/js/components/nav-footer.tsx index acae2c675..8430e495b 100644 --- a/resources/js/components/nav-footer.tsx +++ b/resources/js/components/nav-footer.tsx @@ -1,5 +1,4 @@ -import { type ComponentPropsWithoutRef } from 'react'; -import { Icon } from '@/components/icon'; +import type { ComponentPropsWithoutRef } from 'react'; import { SidebarGroup, SidebarGroupContent, @@ -7,7 +6,8 @@ import { SidebarMenuButton, SidebarMenuItem, } from '@/components/ui/sidebar'; -import { type NavItem } from '@/types'; +import { toUrl } from '@/lib/utils'; +import type { NavItem } from '@/types'; export function NavFooter({ items, @@ -30,19 +30,12 @@ export function NavFooter({ className="text-neutral-600 hover:text-neutral-800 dark:text-neutral-300 dark:hover:text-neutral-100" > {item.icon && ( - + )} {item.title} diff --git a/resources/js/components/nav-main.tsx b/resources/js/components/nav-main.tsx index bf8bc30e3..54095ac73 100644 --- a/resources/js/components/nav-main.tsx +++ b/resources/js/components/nav-main.tsx @@ -1,4 +1,4 @@ -import { Link, usePage } from '@inertiajs/react'; +import { Link } from '@inertiajs/react'; import { SidebarGroup, SidebarGroupLabel, @@ -6,10 +6,12 @@ import { SidebarMenuButton, SidebarMenuItem, } from '@/components/ui/sidebar'; -import { type NavItem } from '@/types'; +import { useCurrentUrl } from '@/hooks/use-current-url'; +import type { NavItem } from '@/types'; export function NavMain({ items = [] }: { items: NavItem[] }) { - const page = usePage(); + const { isCurrentUrl } = useCurrentUrl(); + return ( Platform @@ -18,11 +20,7 @@ export function NavMain({ items = [] }: { items: NavItem[] }) { diff --git a/resources/js/components/nav-user.tsx b/resources/js/components/nav-user.tsx index 89d4f04b0..4075d17a0 100644 --- a/resources/js/components/nav-user.tsx +++ b/resources/js/components/nav-user.tsx @@ -14,10 +14,9 @@ import { import { UserInfo } from '@/components/user-info'; import { UserMenuContent } from '@/components/user-menu-content'; import { useIsMobile } from '@/hooks/use-mobile'; -import { type SharedData } from '@/types'; export function NavUser() { - const { auth } = usePage().props; + const { auth } = usePage().props; const { state } = useSidebar(); const isMobile = useIsMobile(); diff --git a/resources/js/components/password-input.tsx b/resources/js/components/password-input.tsx new file mode 100644 index 000000000..081e5cd97 --- /dev/null +++ b/resources/js/components/password-input.tsx @@ -0,0 +1,37 @@ +import { Eye, EyeOff } from 'lucide-react'; +import type { ComponentProps, Ref } from 'react'; +import { useState } from 'react'; +import { Input } from '@/components/ui/input'; +import { cn } from '@/lib/utils'; + +export default function PasswordInput({ + className, + ref, + ...props +}: Omit, 'type'> & { ref?: Ref }) { + const [showPassword, setShowPassword] = useState(false); + + return ( +
+ + +
+ ); +} diff --git a/resources/js/components/text-link.tsx b/resources/js/components/text-link.tsx index 705c7016c..08ad2694e 100644 --- a/resources/js/components/text-link.tsx +++ b/resources/js/components/text-link.tsx @@ -1,14 +1,14 @@ import { Link } from '@inertiajs/react'; -import { ComponentProps } from 'react'; +import type { ComponentProps } from 'react'; import { cn } from '@/lib/utils'; -type LinkProps = ComponentProps; +type Props = ComponentProps; export default function TextLink({ className = '', children, ...props -}: LinkProps) { +}: Props) { return ( Promise; errors: string[]; -} +}; export default function TwoFactorRecoveryCodes({ recoveryCodesList, fetchRecoveryCodes, errors, -}: TwoFactorRecoveryCodesProps) { +}: Props) { const [codesAreVisible, setCodesAreVisible] = useState(false); const codesSectionRef = useRef(null); const canRegenerateCodes = recoveryCodesList.length > 0 && codesAreVisible; @@ -57,7 +57,7 @@ export default function TwoFactorRecoveryCodes({ Recovery codes let you regain access if you lose your 2FA @@ -76,7 +76,7 @@ export default function TwoFactorRecoveryCodes({ className="size-4" aria-hidden="true" /> - {codesAreVisible ? 'Hide' : 'View'} Recovery Codes + {codesAreVisible ? 'Hide' : 'View'} recovery codes {canRegenerateCodes && ( @@ -92,7 +92,7 @@ export default function TwoFactorRecoveryCodes({ disabled={processing} aria-describedby="regenerate-warning" > - Regenerate Codes + Regenerate codes )} @@ -149,7 +149,7 @@ export default function TwoFactorRecoveryCodes({ access your account and will be removed after use. If you need more, click{' '} - Regenerate Codes + Regenerate codes {' '} above.

diff --git a/resources/js/components/two-factor-setup-modal.tsx b/resources/js/components/two-factor-setup-modal.tsx index d47af381b..4b48c60ad 100644 --- a/resources/js/components/two-factor-setup-modal.tsx +++ b/resources/js/components/two-factor-setup-modal.tsx @@ -1,7 +1,8 @@ import { Form } from '@inertiajs/react'; import { REGEXP_ONLY_DIGITS } from 'input-otp'; -import { Check, Copy, Loader2, ScanLine } from 'lucide-react'; +import { Check, Copy, ScanLine } from 'lucide-react'; import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import AlertError from '@/components/alert-error'; import InputError from '@/components/input-error'; import { Button } from '@/components/ui/button'; import { @@ -16,10 +17,11 @@ import { InputOTPGroup, InputOTPSlot, } from '@/components/ui/input-otp'; +import { Spinner } from '@/components/ui/spinner'; +import { useAppearance } from '@/hooks/use-appearance'; import { useClipboard } from '@/hooks/use-clipboard'; import { OTP_MAX_LENGTH } from '@/hooks/use-two-factor-auth'; import { confirm } from '@/routes/two-factor'; -import AlertError from './alert-error'; function GridScanIcon() { return ( @@ -60,6 +62,7 @@ function TwoFactorSetupStep({ onNextStep: () => void; errors: string[]; }) { + const { resolvedAppearance } = useAppearance(); const [copiedText, copy] = useClipboard(); const IconComponent = copiedText === manualSetupKey ? Check : Copy; @@ -74,12 +77,19 @@ function TwoFactorSetupStep({
{qrCodeSvg ? (
) : ( - + )}
@@ -102,7 +112,7 @@ function TwoFactorSetupStep({
{!manualSetupKey ? (
- +
) : ( <> @@ -218,27 +228,29 @@ function TwoFactorVerificationStep({ ); } -interface TwoFactorSetupModalProps { +type Props = { isOpen: boolean; onClose: () => void; + requiresConfirmation: boolean; twoFactorEnabled: boolean; qrCodeSvg: string | null; manualSetupKey: string | null; clearSetupData: () => void; fetchSetupData: () => Promise; errors: string[]; -} +}; export default function TwoFactorSetupModal({ isOpen, onClose, + requiresConfirmation, twoFactorEnabled, qrCodeSvg, manualSetupKey, clearSetupData, fetchSetupData, errors, -}: TwoFactorSetupModalProps) { +}: Props) { const [showVerificationStep, setShowVerificationStep] = useState(false); @@ -249,7 +261,7 @@ export default function TwoFactorSetupModal({ }>(() => { if (twoFactorEnabled) { return { - title: 'Two-Factor Authentication Enabled', + title: 'Two-factor authentication enabled', description: 'Two-factor authentication is now enabled. Scan the QR code or enter the setup key in your authenticator app.', buttonText: 'Close', @@ -258,7 +270,7 @@ export default function TwoFactorSetupModal({ if (showVerificationStep) { return { - title: 'Verify Authentication Code', + title: 'Verify authentication code', description: 'Enter the 6-digit code from your authenticator app', buttonText: 'Continue', @@ -266,7 +278,7 @@ export default function TwoFactorSetupModal({ } return { - title: 'Enable Two-Factor Authentication', + title: 'Enable two-factor authentication', description: 'To finish enabling two-factor authentication, scan the QR code or enter the setup key in your authenticator app', buttonText: 'Continue', @@ -274,30 +286,36 @@ export default function TwoFactorSetupModal({ }, [twoFactorEnabled, showVerificationStep]); const handleModalNextStep = useCallback(() => { - setShowVerificationStep(true); - }, []); + if (requiresConfirmation) { + setShowVerificationStep(true); + return; + } + + clearSetupData(); + onClose(); + }, [requiresConfirmation, clearSetupData, onClose]); const resetModalState = useCallback(() => { setShowVerificationStep(false); + if (twoFactorEnabled) { clearSetupData(); } }, [twoFactorEnabled, clearSetupData]); useEffect(() => { - if (!isOpen) { - resetModalState(); - - return; - } - - if (!qrCodeSvg) { + if (isOpen && !qrCodeSvg) { void fetchSetupData(); } - }, [isOpen, qrCodeSvg, fetchSetupData, resetModalState]); + }, [isOpen, qrCodeSvg, fetchSetupData]); + + const handleClose = useCallback(() => { + resetModalState(); + onClose(); + }, [onClose, resetModalState]); return ( - !open && onClose()}> + !open && handleClose()}> diff --git a/resources/js/components/ui/alert.tsx b/resources/js/components/ui/alert.tsx index 3b8ee79eb..6e6727ad9 100644 --- a/resources/js/components/ui/alert.tsx +++ b/resources/js/components/ui/alert.tsx @@ -1,5 +1,5 @@ -import * as React from "react" import { cva, type VariantProps } from "class-variance-authority" +import * as React from "react" import { cn } from "@/lib/utils" diff --git a/resources/js/components/ui/avatar.tsx b/resources/js/components/ui/avatar.tsx index b7224f001..5a6986a25 100644 --- a/resources/js/components/ui/avatar.tsx +++ b/resources/js/components/ui/avatar.tsx @@ -1,5 +1,5 @@ -import * as React from "react" import * as AvatarPrimitive from "@radix-ui/react-avatar" +import * as React from "react" import { cn } from "@/lib/utils" diff --git a/resources/js/components/ui/badge.tsx b/resources/js/components/ui/badge.tsx index 02054139a..58294afe6 100644 --- a/resources/js/components/ui/badge.tsx +++ b/resources/js/components/ui/badge.tsx @@ -1,6 +1,6 @@ -import * as React from "react" 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" diff --git a/resources/js/components/ui/breadcrumb.tsx b/resources/js/components/ui/breadcrumb.tsx index eb88f3212..12a631e99 100644 --- a/resources/js/components/ui/breadcrumb.tsx +++ b/resources/js/components/ui/breadcrumb.tsx @@ -1,6 +1,6 @@ -import * as React from "react" import { Slot } from "@radix-ui/react-slot" import { ChevronRight, MoreHorizontal } from "lucide-react" +import * as React from "react" import { cn } from "@/lib/utils" diff --git a/resources/js/components/ui/button.tsx b/resources/js/components/ui/button.tsx index 761d2fe9f..30d0ac088 100644 --- a/resources/js/components/ui/button.tsx +++ b/resources/js/components/ui/button.tsx @@ -1,6 +1,6 @@ -import * as React from "react" 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" diff --git a/resources/js/components/ui/checkbox.tsx b/resources/js/components/ui/checkbox.tsx index eac008bc2..357d1b483 100644 --- a/resources/js/components/ui/checkbox.tsx +++ b/resources/js/components/ui/checkbox.tsx @@ -1,6 +1,6 @@ -import * as React from "react" import * as CheckboxPrimitive from "@radix-ui/react-checkbox" import { CheckIcon } from "lucide-react" +import * as React from "react" import { cn } from "@/lib/utils" diff --git a/resources/js/components/ui/dialog.tsx b/resources/js/components/ui/dialog.tsx index 1b608b21e..5f5e1c28a 100644 --- a/resources/js/components/ui/dialog.tsx +++ b/resources/js/components/ui/dialog.tsx @@ -1,6 +1,6 @@ -import * as React from "react" import * as DialogPrimitive from "@radix-ui/react-dialog" import { XIcon } from "lucide-react" +import * as React from "react" import { cn } from "@/lib/utils" diff --git a/resources/js/components/ui/dropdown-menu.tsx b/resources/js/components/ui/dropdown-menu.tsx index 1d8da1e74..86cb1b14b 100644 --- a/resources/js/components/ui/dropdown-menu.tsx +++ b/resources/js/components/ui/dropdown-menu.tsx @@ -1,6 +1,6 @@ -import * as React from "react" import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu" import { CheckIcon, ChevronRightIcon, CircleIcon } from "lucide-react" +import * as React from "react" import { cn } from "@/lib/utils" diff --git a/resources/js/components/ui/icon.tsx b/resources/js/components/ui/icon.tsx index bb8b3a068..b9bd3b265 100644 --- a/resources/js/components/ui/icon.tsx +++ b/resources/js/components/ui/icon.tsx @@ -1,4 +1,4 @@ -import { LucideIcon } from 'lucide-react'; +import type { LucideIcon } from 'lucide-react'; interface IconProps { iconNode?: LucideIcon | null; diff --git a/resources/js/components/ui/input-otp.tsx b/resources/js/components/ui/input-otp.tsx index f7891c9cc..195f3e973 100644 --- a/resources/js/components/ui/input-otp.tsx +++ b/resources/js/components/ui/input-otp.tsx @@ -1,6 +1,6 @@ -import * as React from "react" import { OTPInput, OTPInputContext } from "input-otp" import { Minus } from "lucide-react" +import * as React from "react" import { cn } from "@/lib/utils" diff --git a/resources/js/components/ui/label.tsx b/resources/js/components/ui/label.tsx index a43fd7f2b..d33035057 100644 --- a/resources/js/components/ui/label.tsx +++ b/resources/js/components/ui/label.tsx @@ -1,5 +1,5 @@ -import * as React from "react" import * as LabelPrimitive from "@radix-ui/react-label" +import * as React from "react" import { cn } from "@/lib/utils" diff --git a/resources/js/components/ui/navigation-menu.tsx b/resources/js/components/ui/navigation-menu.tsx index 1dd90ad49..53bbeebc0 100644 --- a/resources/js/components/ui/navigation-menu.tsx +++ b/resources/js/components/ui/navigation-menu.tsx @@ -1,7 +1,7 @@ -import * as React from "react" import * as NavigationMenuPrimitive from "@radix-ui/react-navigation-menu" import { cva } from "class-variance-authority" import { ChevronDownIcon } from "lucide-react" +import * as React from "react" import { cn } from "@/lib/utils" diff --git a/resources/js/components/ui/select.tsx b/resources/js/components/ui/select.tsx index 4b720baa1..265565978 100644 --- a/resources/js/components/ui/select.tsx +++ b/resources/js/components/ui/select.tsx @@ -1,6 +1,6 @@ -import * as React from "react" import * as SelectPrimitive from "@radix-ui/react-select" import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from "lucide-react" +import * as React from "react" import { cn } from "@/lib/utils" @@ -24,14 +24,18 @@ function SelectValue({ function SelectTrigger({ className, + size = "default", children, ...props -}: React.ComponentProps) { +}: React.ComponentProps & { + size?: "sm" | "default" +}) { return ( span]:line-clamp-1", + "border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between gap-2 rounded-md border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className )} {...props} @@ -48,6 +52,9 @@ function SelectContent({ className, children, position = "popper", + side = "bottom", + sideOffset = 4, + align = "center", ...props }: React.ComponentProps) { return ( @@ -55,12 +62,16 @@ function SelectContent({ @@ -86,7 +97,7 @@ function SelectLabel({ return ( ) @@ -106,7 +117,10 @@ function SelectItem({ )} {...props} > - + diff --git a/resources/js/components/ui/separator.tsx b/resources/js/components/ui/separator.tsx index 3cf4f89b4..c18404c88 100644 --- a/resources/js/components/ui/separator.tsx +++ b/resources/js/components/ui/separator.tsx @@ -1,5 +1,5 @@ -import * as React from "react" import * as SeparatorPrimitive from "@radix-ui/react-separator" +import * as React from "react" import { cn } from "@/lib/utils" diff --git a/resources/js/components/ui/sheet.tsx b/resources/js/components/ui/sheet.tsx index afc6f5efb..ccc11c46c 100644 --- a/resources/js/components/ui/sheet.tsx +++ b/resources/js/components/ui/sheet.tsx @@ -1,6 +1,6 @@ -import * as React from "react" import * as SheetPrimitive from "@radix-ui/react-dialog" import { XIcon } from "lucide-react" +import * as React from "react" import { cn } from "@/lib/utils" diff --git a/resources/js/components/ui/sidebar.tsx b/resources/js/components/ui/sidebar.tsx index ac6bd635f..c28aa2e28 100644 --- a/resources/js/components/ui/sidebar.tsx +++ b/resources/js/components/ui/sidebar.tsx @@ -1,10 +1,9 @@ -import * as React from "react" import { Slot } from "@radix-ui/react-slot" -import { VariantProps, cva } from "class-variance-authority" -import { PanelLeftIcon } from "lucide-react" +import type { VariantProps} from "class-variance-authority"; +import { cva } from "class-variance-authority" +import { PanelLeftCloseIcon, PanelLeftOpenIcon } from "lucide-react" +import * as React from "react" -import { useIsMobile } from "@/hooks/use-mobile" -import { cn } from "@/lib/utils" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Separator } from "@/components/ui/separator" @@ -19,9 +18,10 @@ import { Skeleton } from "@/components/ui/skeleton" import { Tooltip, TooltipContent, - TooltipProvider, TooltipTrigger, } from "@/components/ui/tooltip" +import { useIsMobile } from "@/hooks/use-mobile" +import { cn } from "@/lib/utils" const SIDEBAR_COOKIE_NAME = "sidebar_state" const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7 @@ -126,25 +126,23 @@ function SidebarProvider({ return ( - -
- {children} -
-
+
+ {children} +
) } @@ -253,7 +251,7 @@ function SidebarTrigger({ onClick, ...props }: React.ComponentProps) { - const { toggleSidebar } = useSidebar() + const { toggleSidebar, isMobile, state } = useSidebar() return ( ) } @@ -281,10 +279,10 @@ function SidebarRail({ className, ...props }: React.ComponentProps<"button">) {
-
- Don't have an account?{' '} - - Sign up - -
+ {canRegister && ( +
+ Don't have an account?{' '} + + Sign up + +
+ )} )} diff --git a/resources/js/pages/user-email-reset-notification/create.tsx b/resources/js/pages/user-email-reset-notification/create.tsx index 25d176b42..335258884 100644 --- a/resources/js/pages/user-email-reset-notification/create.tsx +++ b/resources/js/pages/user-email-reset-notification/create.tsx @@ -1,7 +1,6 @@ import { Form, Head } from '@inertiajs/react'; import { LoaderCircle } from 'lucide-react'; // Components -import UserEmailResetNotificationController from '@/actions/App/Http/Controllers/UserEmailResetNotificationController'; import InputError from '@/components/input-error'; import TextLink from '@/components/text-link'; import { Button } from '@/components/ui/button'; @@ -9,6 +8,7 @@ import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import AuthLayout from '@/layouts/auth-layout'; import { login } from '@/routes'; +import { email } from '@/routes/password'; export default function ForgotPassword({ status }: { status?: string }) { return ( @@ -25,7 +25,7 @@ export default function ForgotPassword({ status }: { status?: string }) { )}
-
+ {({ processing, errors }) => ( <>
diff --git a/resources/js/pages/user-email-verification-notification/create.tsx b/resources/js/pages/user-email-verification-notification/create.tsx index 7dd89b408..bafbe7d6c 100644 --- a/resources/js/pages/user-email-verification-notification/create.tsx +++ b/resources/js/pages/user-email-verification-notification/create.tsx @@ -1,11 +1,11 @@ import { Form, Head } from '@inertiajs/react'; -import { LoaderCircle } from 'lucide-react'; // Components -import UserEmailVerificationNotificationController from '@/actions/App/Http/Controllers/UserEmailVerificationNotificationController'; import TextLink from '@/components/text-link'; import { Button } from '@/components/ui/button'; +import { Spinner } from '@/components/ui/spinner'; import AuthLayout from '@/layouts/auth-layout'; import { logout } from '@/routes'; +import { send } from '@/routes/verification'; export default function VerifyEmail({ status }: { status?: string }) { return ( @@ -22,16 +22,11 @@ export default function VerifyEmail({ status }: { status?: string }) {
)} - + {({ processing }) => ( <> diff --git a/resources/js/pages/user-password-confirmation/create.tsx b/resources/js/pages/user-password-confirmation/create.tsx index 5789c05c1..153fc9765 100644 --- a/resources/js/pages/user-password-confirmation/create.tsx +++ b/resources/js/pages/user-password-confirmation/create.tsx @@ -1,9 +1,9 @@ import { Form, Head } from '@inertiajs/react'; -import { LoaderCircle } from 'lucide-react'; import InputError from '@/components/input-error'; +import PasswordInput from '@/components/password-input'; import { Button } from '@/components/ui/button'; -import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; +import { Spinner } from '@/components/ui/spinner'; import AuthLayout from '@/layouts/auth-layout'; import { store } from '@/routes/password/confirm'; @@ -20,9 +20,8 @@ export default function Create() {
- - {processing && ( - - )} + {processing && } Confirm password
diff --git a/resources/js/pages/user-password/create.tsx b/resources/js/pages/user-password/create.tsx index 4fdde618b..95f423cf0 100644 --- a/resources/js/pages/user-password/create.tsx +++ b/resources/js/pages/user-password/create.tsx @@ -1,18 +1,19 @@ import { Form, Head } from '@inertiajs/react'; -import { LoaderCircle } from 'lucide-react'; -import UserPasswordController from '@/actions/App/Http/Controllers/UserPasswordController'; import InputError from '@/components/input-error'; +import PasswordInput from '@/components/password-input'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; +import { Spinner } from '@/components/ui/spinner'; import AuthLayout from '@/layouts/auth-layout'; +import { update } from '@/routes/password'; -interface ResetPasswordProps { +type Props = { token: string; email: string; -} +}; -export default function ResetPassword({ token, email }: ResetPasswordProps) { +export default function ResetPassword({ token, email }: Props) { return ( ({ ...data, token, email })} resetOnSuccess={['password', 'password_confirmation']} > @@ -46,9 +47,8 @@ export default function ResetPassword({ token, email }: ResetPasswordProps) {
- Confirm password - - {processing && ( - - )} + {processing && } Reset password
diff --git a/resources/js/pages/user-password/edit.tsx b/resources/js/pages/user-password/edit.tsx index 0f6ed4854..1b3747c8a 100644 --- a/resources/js/pages/user-password/edit.tsx +++ b/resources/js/pages/user-password/edit.tsx @@ -2,15 +2,15 @@ import { Transition } from '@headlessui/react'; import { Form, Head } from '@inertiajs/react'; import { useRef } from 'react'; import UserPasswordController from '@/actions/App/Http/Controllers/UserPasswordController'; -import HeadingSmall from '@/components/heading-small'; +import Heading from '@/components/heading'; import InputError from '@/components/input-error'; +import PasswordInput from '@/components/password-input'; import { Button } from '@/components/ui/button'; -import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import AppLayout from '@/layouts/app-layout'; import SettingsLayout from '@/layouts/settings/layout'; import { edit } from '@/routes/password'; -import { type BreadcrumbItem } from '@/types'; +import type { BreadcrumbItem } from '@/types'; const breadcrumbs: BreadcrumbItem[] = [ { @@ -29,7 +29,8 @@ export default function Password() {
- @@ -63,11 +64,10 @@ export default function Password() { Current password - - - ().props; +export default function Edit({ + mustVerifyEmail, + status, +}: { + mustVerifyEmail: boolean; + status?: string; +}) { + const { auth } = usePage().props; return ( +

Profile settings

+
- @@ -82,29 +91,32 @@ export default function Edit({ status }: { status?: string }) { />
- {auth.user.email_verified_at === null && ( -
-

- Your email address is unverified.{' '} - - Click here to resend the - verification email. - -

+ {mustVerifyEmail && + auth.user.email_verified_at === null && ( +
+

+ Your email address is + unverified.{' '} + + Click here to resend the + verification email. + +

- {status === - 'verification-link-sent' && ( -
- A new verification link has been - sent to your email address. -
- )} -
- )} + {status === + 'verification-link-sent' && ( +
+ A new verification link has + been sent to your email + address. +
+ )} +
+ )}
- )} - -
-
- ) : ( -
- Disabled -

- When you enable two-factor authentication, you - will be prompted for a secure pin during login. - This pin can be retrieved from a TOTP-supported - application on your phone. -

+ {canManageTwoFactor && ( +
+ + {twoFactorEnabled ? ( +
+

+ You will be prompted for a secure, random + pin during login, which you can retrieve + from the TOTP-supported application on your + phone. +

-
- {hasSetupData ? ( - - ) : ( -
- setShowSetupModal(true) - } - > +
+ {({ processing }) => ( )} - )} +
+ + +
+ ) : ( +
+

+ When you enable two-factor authentication, + you will be prompted for a secure pin during + login. This pin can be retrieved from a + TOTP-supported application on your phone. +

+ +
+ {hasSetupData ? ( + + ) : ( +
+ setShowSetupModal(true) + } + > + {({ processing }) => ( + + )} +
+ )} +
-
- )} + )} - setShowSetupModal(false)} - twoFactorEnabled={twoFactorEnabled} - qrCodeSvg={qrCodeSvg} - manualSetupKey={manualSetupKey} - clearSetupData={clearSetupData} - fetchSetupData={fetchSetupData} - errors={errors} - /> -
+ setShowSetupModal(false)} + requiresConfirmation={requiresConfirmation} + twoFactorEnabled={twoFactorEnabled} + qrCodeSvg={qrCodeSvg} + manualSetupKey={manualSetupKey} + clearSetupData={clearSetupData} + fetchSetupData={fetchSetupData} + errors={errors} + /> +
+ )}
); diff --git a/resources/js/pages/user/create.tsx b/resources/js/pages/user/create.tsx index 886c7ca9f..61254139f 100644 --- a/resources/js/pages/user/create.tsx +++ b/resources/js/pages/user/create.tsx @@ -1,13 +1,14 @@ import { Form, Head } from '@inertiajs/react'; -import { LoaderCircle } from 'lucide-react'; -import UserController from '@/actions/App/Http/Controllers/UserController'; import InputError from '@/components/input-error'; +import PasswordInput from '@/components/password-input'; import TextLink from '@/components/text-link'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; +import { Spinner } from '@/components/ui/spinner'; import AuthLayout from '@/layouts/auth-layout'; import { login } from '@/routes'; +import { store } from '@/routes/register'; export default function Register() { return ( @@ -17,7 +18,7 @@ export default function Register() { >
- Confirm password - - {processing && ( - - )} + {processing && } Create account
diff --git a/resources/js/pages/welcome.tsx b/resources/js/pages/welcome.tsx index 32d210a8b..baebd3db7 100644 --- a/resources/js/pages/welcome.tsx +++ b/resources/js/pages/welcome.tsx @@ -1,9 +1,12 @@ import { Head, Link, usePage } from '@inertiajs/react'; import { dashboard, login, register } from '@/routes'; -import { type SharedData } from '@/types'; -export default function Welcome() { - const { auth } = usePage().props; +export default function Welcome({ + canRegister = true, +}: { + canRegister?: boolean; +}) { + const { auth } = usePage().props; return ( <> @@ -32,12 +35,14 @@ export default function Welcome() { > Log in - - Register - + {canRegister && ( + + Register + + )} )} @@ -129,9 +134,10 @@ export default function Welcome() {
-
+
+ {/* Laravel Logo */} + + {/* 13 */} - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + > + + + + - - - - - - - + - - + > + + + + - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + - + + + + + + + - - -
+
diff --git a/resources/js/ssr.tsx b/resources/js/ssr.tsx index a868a5c68..bddcb8599 100644 --- a/resources/js/ssr.tsx +++ b/resources/js/ssr.tsx @@ -1,7 +1,9 @@ import { createInertiaApp } from '@inertiajs/react'; import createServer from '@inertiajs/react/server'; import { resolvePageComponent } from 'laravel-vite-plugin/inertia-helpers'; +import type { ComponentType } from 'react'; import ReactDOMServer from 'react-dom/server'; +import { TooltipProvider } from '@/components/ui/tooltip'; const appName = import.meta.env.VITE_APP_NAME || 'Laravel'; @@ -13,10 +15,14 @@ createServer((page) => resolve: (name) => resolvePageComponent( `./pages/${name}.tsx`, - import.meta.glob('./pages/**/*.tsx'), + import.meta.glob('./pages/**/*.tsx'), ), setup: ({ App, props }) => { - return ; + return ( + + + + ); }, }), ); diff --git a/resources/js/types/auth.ts b/resources/js/types/auth.ts new file mode 100644 index 000000000..5ffc370b0 --- /dev/null +++ b/resources/js/types/auth.ts @@ -0,0 +1,24 @@ +export type User = { + id: number; + name: string; + email: string; + avatar?: string; + email_verified_at: string | null; + two_factor_enabled?: boolean; + created_at: string; + updated_at: string; + [key: string]: unknown; +}; + +export type Auth = { + user: User; +}; + +export type TwoFactorSetupData = { + svg: string; + url: string; +}; + +export type TwoFactorSecretKey = { + secretKey: string; +}; diff --git a/resources/js/types/global.d.ts b/resources/js/types/global.d.ts new file mode 100644 index 000000000..bd4459ee3 --- /dev/null +++ b/resources/js/types/global.d.ts @@ -0,0 +1,12 @@ +import type { Auth } from '@/types/auth'; + +declare module '@inertiajs/core' { + export interface InertiaConfig { + sharedPageProps: { + name: string; + auth: Auth; + sidebarOpen: boolean; + [key: string]: unknown; + }; + } +} diff --git a/resources/js/types/index.d.ts b/resources/js/types/index.d.ts deleted file mode 100644 index 5c7bc2e1b..000000000 --- a/resources/js/types/index.d.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { InertiaLinkProps } from '@inertiajs/react'; -import { LucideIcon } from 'lucide-react'; - -export interface Auth { - user: User; -} - -export interface BreadcrumbItem { - title: string; - href: string; -} - -export interface NavGroup { - title: string; - items: NavItem[]; -} - -export interface NavItem { - title: string; - href: NonNullable; - icon?: LucideIcon | null; - isActive?: boolean; -} - -export interface SharedData { - name: string; - auth: Auth; - sidebarOpen: boolean; - [key: string]: unknown; -} - -export interface User { - id: number; - name: string; - email: string; - avatar?: string; - email_verified_at: string | null; - two_factor_enabled?: boolean; - created_at: string; - updated_at: string; - [key: string]: unknown; // This allows for additional properties... -} diff --git a/resources/js/types/index.ts b/resources/js/types/index.ts new file mode 100644 index 000000000..b1f0ee68c --- /dev/null +++ b/resources/js/types/index.ts @@ -0,0 +1,3 @@ +export type * from './auth'; +export type * from './navigation'; +export type * from './ui'; diff --git a/resources/js/types/navigation.ts b/resources/js/types/navigation.ts new file mode 100644 index 000000000..dbf6f83fe --- /dev/null +++ b/resources/js/types/navigation.ts @@ -0,0 +1,14 @@ +import type { InertiaLinkProps } from '@inertiajs/react'; +import type { LucideIcon } from 'lucide-react'; + +export type BreadcrumbItem = { + title: string; + href: NonNullable; +}; + +export type NavItem = { + title: string; + href: NonNullable; + icon?: LucideIcon | null; + isActive?: boolean; +}; diff --git a/resources/js/types/ui.ts b/resources/js/types/ui.ts new file mode 100644 index 000000000..98e45be63 --- /dev/null +++ b/resources/js/types/ui.ts @@ -0,0 +1,16 @@ +import type { ReactNode } from 'react'; +import type { BreadcrumbItem } from '@/types/navigation'; + +export type AppLayoutProps = { + children: ReactNode; + breadcrumbs?: BreadcrumbItem[]; +}; + +export type AppVariant = 'header' | 'sidebar'; + +export type AuthLayoutProps = { + children?: ReactNode; + name?: string; + title?: string; + description?: string; +}; From d82160c773b543afcf81c9ef4e126cbc348e3e9f Mon Sep 17 00:00:00 2001 From: Josh Donnell Date: Sat, 21 Mar 2026 11:41:02 +0000 Subject: [PATCH 11/19] fix: update for composer and updates for linting --- composer.json | 2 +- package.json | 4 ++-- resources/js/app.tsx | 6 +++--- resources/js/components/app-content.tsx | 2 +- resources/js/components/app-header.tsx | 4 ++-- resources/js/components/app-shell.tsx | 4 ++-- resources/js/components/app-sidebar.tsx | 4 ++-- resources/js/components/appearance-tabs.tsx | 6 +++--- resources/js/components/breadcrumbs.tsx | 4 ++-- resources/js/components/input-error.tsx | 2 +- resources/js/components/nav-footer.tsx | 2 +- resources/js/components/nav-main.tsx | 2 +- resources/js/components/nav-user.tsx | 4 ++-- resources/js/components/password-input.tsx | 4 ++-- resources/js/components/text-link.tsx | 2 +- resources/js/components/two-factor-recovery-codes.tsx | 8 ++++---- resources/js/components/two-factor-setup-modal.tsx | 10 +++++----- resources/js/components/user-menu-content.tsx | 4 ++-- resources/js/hooks/use-current-url.ts | 2 +- resources/js/hooks/use-two-factor-auth.ts | 2 +- resources/js/layouts/auth/auth-card-layout.tsx | 4 ++-- resources/js/layouts/auth/auth-simple-layout.tsx | 2 +- resources/js/layouts/auth/auth-split-layout.tsx | 2 +- resources/js/layouts/settings/layout.tsx | 4 ++-- resources/js/pages/appearance/update.tsx | 2 +- resources/js/pages/dashboard.tsx | 2 +- resources/js/pages/session/create.tsx | 2 +- .../js/pages/user-email-reset-notification/create.tsx | 4 ++-- .../user-email-verification-notification/create.tsx | 2 +- .../js/pages/user-password-confirmation/create.tsx | 2 +- resources/js/pages/user-password/create.tsx | 2 +- resources/js/pages/user-password/edit.tsx | 6 +++--- resources/js/pages/user-profile/edit.tsx | 4 ++-- .../js/pages/user-two-factor-authentication/show.tsx | 6 +++--- resources/js/pages/user/create.tsx | 2 +- resources/js/pages/welcome.tsx | 2 +- resources/js/ssr.tsx | 1 - resources/js/types/ui.ts | 2 +- 38 files changed, 64 insertions(+), 65 deletions(-) diff --git a/composer.json b/composer.json index 09fa3d517..145a5ebf9 100644 --- a/composer.json +++ b/composer.json @@ -23,7 +23,7 @@ "laravel/boost": "^v2.3.4", "laravel/pail": "^1.2.6", "laravel/pint": "^1.29.0", - "laravel/tinker": "^2.11.1", + "laravel/tinker": "^v3.0.0", "mockery/mockery": "^1.6.12", "nunomaduro/collision": "^8.9.1", "pestphp/pest": "^4.4.2", diff --git a/package.json b/package.json index 691dc0ac7..814fb7b6b 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "@tailwindcss/vite": "^4.2.2", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", - "@vitejs/plugin-react": "^6.0.1", + "@vitejs/plugin-react": "^5.2.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "concurrently": "^9.2.1", @@ -51,7 +51,7 @@ "vite": "npm:@voidzero-dev/vite-plus-core@latest" }, "optionalDependencies": { - "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.1", "@tailwindcss/oxide-linux-x64-gnu": "^4.2.2", "lightningcss-linux-x64-gnu": "^1.32.0" }, diff --git a/resources/js/app.tsx b/resources/js/app.tsx index 5e7169292..cab78007e 100644 --- a/resources/js/app.tsx +++ b/resources/js/app.tsx @@ -1,15 +1,15 @@ -import { TooltipProvider } from '@/components/ui/tooltip'; -import { initializeTheme } from '@/hooks/use-appearance'; import { createInertiaApp } from '@inertiajs/react'; import { resolvePageComponent } from 'laravel-vite-plugin/inertia-helpers'; import type { ComponentType } from 'react'; import { StrictMode } from 'react'; import { createRoot } from 'react-dom/client'; +import { TooltipProvider } from '@/components/ui/tooltip'; +import { initializeTheme } from '@/hooks/use-appearance'; import '../css/app.css'; const appName = import.meta.env.VITE_APP_NAME || 'Laravel'; -createInertiaApp({ +void createInertiaApp({ title: (title) => (title ? `${title} - ${appName}` : appName), resolve: (name) => resolvePageComponent( diff --git a/resources/js/components/app-content.tsx b/resources/js/components/app-content.tsx index 3f67a8d7c..5a04c696a 100644 --- a/resources/js/components/app-content.tsx +++ b/resources/js/components/app-content.tsx @@ -1,6 +1,6 @@ +import * as React from 'react'; import { SidebarInset } from '@/components/ui/sidebar'; import type { AppVariant } from '@/types'; -import * as React from 'react'; type Props = React.ComponentProps<'main'> & { variant?: AppVariant; diff --git a/resources/js/components/app-header.tsx b/resources/js/components/app-header.tsx index 9372a9545..0aac91a72 100644 --- a/resources/js/components/app-header.tsx +++ b/resources/js/components/app-header.tsx @@ -1,3 +1,5 @@ +import { Link, usePage } from '@inertiajs/react'; +import { BookOpen, Folder, LayoutGrid, Menu, Search } from 'lucide-react'; import AppLogo from '@/components/app-logo'; import AppLogoIcon from '@/components/app-logo-icon'; import { Breadcrumbs } from '@/components/breadcrumbs'; @@ -32,8 +34,6 @@ import { useInitials } from '@/hooks/use-initials'; import { cn, toUrl } from '@/lib/utils'; import { dashboard } from '@/routes'; import type { BreadcrumbItem, NavItem } from '@/types'; -import { Link, usePage } from '@inertiajs/react'; -import { BookOpen, Folder, LayoutGrid, Menu, Search } from 'lucide-react'; type Props = { breadcrumbs?: BreadcrumbItem[]; diff --git a/resources/js/components/app-shell.tsx b/resources/js/components/app-shell.tsx index a50870015..f51a9dbf6 100644 --- a/resources/js/components/app-shell.tsx +++ b/resources/js/components/app-shell.tsx @@ -1,7 +1,7 @@ -import { SidebarProvider } from '@/components/ui/sidebar'; -import type { AppVariant } from '@/types'; import { usePage } from '@inertiajs/react'; import type { ReactNode } from 'react'; +import { SidebarProvider } from '@/components/ui/sidebar'; +import type { AppVariant } from '@/types'; type Props = { children: ReactNode; diff --git a/resources/js/components/app-sidebar.tsx b/resources/js/components/app-sidebar.tsx index d83fdad6f..a38aa1d91 100644 --- a/resources/js/components/app-sidebar.tsx +++ b/resources/js/components/app-sidebar.tsx @@ -1,3 +1,5 @@ +import { Link } from '@inertiajs/react'; +import { BookOpen, FolderGit2, LayoutGrid } from 'lucide-react'; import AppLogo from '@/components/app-logo'; import { NavFooter } from '@/components/nav-footer'; import { NavMain } from '@/components/nav-main'; @@ -13,8 +15,6 @@ import { } from '@/components/ui/sidebar'; import { dashboard } from '@/routes'; import type { NavItem } from '@/types'; -import { Link } from '@inertiajs/react'; -import { BookOpen, FolderGit2, LayoutGrid } from 'lucide-react'; const mainNavItems: NavItem[] = [ { diff --git a/resources/js/components/appearance-tabs.tsx b/resources/js/components/appearance-tabs.tsx index 0a30d23d8..b01386248 100644 --- a/resources/js/components/appearance-tabs.tsx +++ b/resources/js/components/appearance-tabs.tsx @@ -1,9 +1,9 @@ -import type { Appearance } from '@/hooks/use-appearance'; -import { useAppearance } from '@/hooks/use-appearance'; -import { cn } from '@/lib/utils'; import type { LucideIcon } from 'lucide-react'; import { Monitor, Moon, Sun } from 'lucide-react'; import type { HTMLAttributes } from 'react'; +import type { Appearance } from '@/hooks/use-appearance'; +import { useAppearance } from '@/hooks/use-appearance'; +import { cn } from '@/lib/utils'; export default function AppearanceToggleTab({ className = '', diff --git a/resources/js/components/breadcrumbs.tsx b/resources/js/components/breadcrumbs.tsx index 43ea0a9e8..95414f215 100644 --- a/resources/js/components/breadcrumbs.tsx +++ b/resources/js/components/breadcrumbs.tsx @@ -1,3 +1,5 @@ +import { Link } from '@inertiajs/react'; +import { Fragment } from 'react'; import { Breadcrumb, BreadcrumbItem, @@ -7,8 +9,6 @@ import { BreadcrumbSeparator, } from '@/components/ui/breadcrumb'; import type { BreadcrumbItem as BreadcrumbItemType } from '@/types'; -import { Link } from '@inertiajs/react'; -import { Fragment } from 'react'; export function Breadcrumbs({ breadcrumbs, diff --git a/resources/js/components/input-error.tsx b/resources/js/components/input-error.tsx index 9b36b312f..f323cee94 100644 --- a/resources/js/components/input-error.tsx +++ b/resources/js/components/input-error.tsx @@ -1,5 +1,5 @@ -import { cn } from '@/lib/utils'; import type { HTMLAttributes } from 'react'; +import { cn } from '@/lib/utils'; export default function InputError({ message, diff --git a/resources/js/components/nav-footer.tsx b/resources/js/components/nav-footer.tsx index b19d1596e..8430e495b 100644 --- a/resources/js/components/nav-footer.tsx +++ b/resources/js/components/nav-footer.tsx @@ -1,3 +1,4 @@ +import type { ComponentPropsWithoutRef } from 'react'; import { SidebarGroup, SidebarGroupContent, @@ -7,7 +8,6 @@ import { } from '@/components/ui/sidebar'; import { toUrl } from '@/lib/utils'; import type { NavItem } from '@/types'; -import type { ComponentPropsWithoutRef } from 'react'; export function NavFooter({ items, diff --git a/resources/js/components/nav-main.tsx b/resources/js/components/nav-main.tsx index 018410d97..54095ac73 100644 --- a/resources/js/components/nav-main.tsx +++ b/resources/js/components/nav-main.tsx @@ -1,3 +1,4 @@ +import { Link } from '@inertiajs/react'; import { SidebarGroup, SidebarGroupLabel, @@ -7,7 +8,6 @@ import { } from '@/components/ui/sidebar'; import { useCurrentUrl } from '@/hooks/use-current-url'; import type { NavItem } from '@/types'; -import { Link } from '@inertiajs/react'; export function NavMain({ items = [] }: { items: NavItem[] }) { const { isCurrentUrl } = useCurrentUrl(); diff --git a/resources/js/components/nav-user.tsx b/resources/js/components/nav-user.tsx index 91330ea81..4075d17a0 100644 --- a/resources/js/components/nav-user.tsx +++ b/resources/js/components/nav-user.tsx @@ -1,3 +1,5 @@ +import { usePage } from '@inertiajs/react'; +import { ChevronsUpDown } from 'lucide-react'; import { DropdownMenu, DropdownMenuContent, @@ -12,8 +14,6 @@ import { import { UserInfo } from '@/components/user-info'; import { UserMenuContent } from '@/components/user-menu-content'; import { useIsMobile } from '@/hooks/use-mobile'; -import { usePage } from '@inertiajs/react'; -import { ChevronsUpDown } from 'lucide-react'; export function NavUser() { const { auth } = usePage().props; diff --git a/resources/js/components/password-input.tsx b/resources/js/components/password-input.tsx index d478b5dcd..081e5cd97 100644 --- a/resources/js/components/password-input.tsx +++ b/resources/js/components/password-input.tsx @@ -1,8 +1,8 @@ -import { Input } from '@/components/ui/input'; -import { cn } from '@/lib/utils'; import { Eye, EyeOff } from 'lucide-react'; import type { ComponentProps, Ref } from 'react'; import { useState } from 'react'; +import { Input } from '@/components/ui/input'; +import { cn } from '@/lib/utils'; export default function PasswordInput({ className, diff --git a/resources/js/components/text-link.tsx b/resources/js/components/text-link.tsx index 78d06b397..08ad2694e 100644 --- a/resources/js/components/text-link.tsx +++ b/resources/js/components/text-link.tsx @@ -1,6 +1,6 @@ -import { cn } from '@/lib/utils'; import { Link } from '@inertiajs/react'; import type { ComponentProps } from 'react'; +import { cn } from '@/lib/utils'; type Props = ComponentProps; diff --git a/resources/js/components/two-factor-recovery-codes.tsx b/resources/js/components/two-factor-recovery-codes.tsx index 12a6a3baf..8b1fc928a 100644 --- a/resources/js/components/two-factor-recovery-codes.tsx +++ b/resources/js/components/two-factor-recovery-codes.tsx @@ -1,3 +1,6 @@ +import { Form } from '@inertiajs/react'; +import { Eye, EyeOff, LockKeyhole, RefreshCw } from 'lucide-react'; +import { useCallback, useEffect, useRef, useState } from 'react'; import AlertError from '@/components/alert-error'; import { Button } from '@/components/ui/button'; import { @@ -8,9 +11,6 @@ import { CardTitle, } from '@/components/ui/card'; import { regenerateRecoveryCodes } from '@/routes/two-factor'; -import { Form } from '@inertiajs/react'; -import { Eye, EyeOff, LockKeyhole, RefreshCw } from 'lucide-react'; -import { useCallback, useEffect, useRef, useState } from 'react'; type Props = { recoveryCodesList: string[]; @@ -46,7 +46,7 @@ export default function TwoFactorRecoveryCodes({ useEffect(() => { if (!recoveryCodesList.length) { - fetchRecoveryCodes(); + void fetchRecoveryCodes(); } }, [recoveryCodesList.length, fetchRecoveryCodes]); diff --git a/resources/js/components/two-factor-setup-modal.tsx b/resources/js/components/two-factor-setup-modal.tsx index fadddd3d3..4b48c60ad 100644 --- a/resources/js/components/two-factor-setup-modal.tsx +++ b/resources/js/components/two-factor-setup-modal.tsx @@ -1,3 +1,7 @@ +import { Form } from '@inertiajs/react'; +import { REGEXP_ONLY_DIGITS } from 'input-otp'; +import { Check, Copy, ScanLine } from 'lucide-react'; +import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import AlertError from '@/components/alert-error'; import InputError from '@/components/input-error'; import { Button } from '@/components/ui/button'; @@ -18,10 +22,6 @@ import { useAppearance } from '@/hooks/use-appearance'; import { useClipboard } from '@/hooks/use-clipboard'; import { OTP_MAX_LENGTH } from '@/hooks/use-two-factor-auth'; import { confirm } from '@/routes/two-factor'; -import { Form } from '@inertiajs/react'; -import { REGEXP_ONLY_DIGITS } from 'input-otp'; -import { Check, Copy, ScanLine } from 'lucide-react'; -import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; function GridScanIcon() { return ( @@ -305,7 +305,7 @@ export default function TwoFactorSetupModal({ useEffect(() => { if (isOpen && !qrCodeSvg) { - fetchSetupData(); + void fetchSetupData(); } }, [isOpen, qrCodeSvg, fetchSetupData]); diff --git a/resources/js/components/user-menu-content.tsx b/resources/js/components/user-menu-content.tsx index bfaa728b4..bef259b42 100644 --- a/resources/js/components/user-menu-content.tsx +++ b/resources/js/components/user-menu-content.tsx @@ -1,3 +1,5 @@ +import { Link, router } from '@inertiajs/react'; +import { LogOut, Settings } from 'lucide-react'; import { DropdownMenuGroup, DropdownMenuItem, @@ -9,8 +11,6 @@ import { useMobileNavigation } from '@/hooks/use-mobile-navigation'; import { logout } from '@/routes'; import { edit } from '@/routes/user-profile'; import type { User } from '@/types'; -import { Link, router } from '@inertiajs/react'; -import { LogOut, Settings } from 'lucide-react'; type Props = { user: User; diff --git a/resources/js/hooks/use-current-url.ts b/resources/js/hooks/use-current-url.ts index 0fe856b4a..ee8cd2baf 100644 --- a/resources/js/hooks/use-current-url.ts +++ b/resources/js/hooks/use-current-url.ts @@ -1,6 +1,6 @@ -import { toUrl } from '@/lib/utils'; import type { InertiaLinkProps } from '@inertiajs/react'; import { usePage } from '@inertiajs/react'; +import { toUrl } from '@/lib/utils'; export type IsCurrentUrlFn = ( urlToCheck: NonNullable, diff --git a/resources/js/hooks/use-two-factor-auth.ts b/resources/js/hooks/use-two-factor-auth.ts index 393c8af67..d39276949 100644 --- a/resources/js/hooks/use-two-factor-auth.ts +++ b/resources/js/hooks/use-two-factor-auth.ts @@ -1,6 +1,6 @@ +import { useState } from 'react'; import { qrCode, recoveryCodes, secretKey } from '@/routes/two-factor'; import type { TwoFactorSecretKey, TwoFactorSetupData } from '@/types'; -import { useState } from 'react'; export type UseTwoFactorAuthReturn = { qrCodeSvg: string | null; diff --git a/resources/js/layouts/auth/auth-card-layout.tsx b/resources/js/layouts/auth/auth-card-layout.tsx index f8aad9523..851ac5f63 100644 --- a/resources/js/layouts/auth/auth-card-layout.tsx +++ b/resources/js/layouts/auth/auth-card-layout.tsx @@ -1,3 +1,5 @@ +import { Link } from '@inertiajs/react'; +import type { PropsWithChildren } from 'react'; import AppLogoIcon from '@/components/app-logo-icon'; import { Card, @@ -7,8 +9,6 @@ import { CardTitle, } from '@/components/ui/card'; import { home } from '@/routes'; -import { Link } from '@inertiajs/react'; -import type { PropsWithChildren } from 'react'; export default function AuthCardLayout({ children, diff --git a/resources/js/layouts/auth/auth-simple-layout.tsx b/resources/js/layouts/auth/auth-simple-layout.tsx index a81715bde..b1396ae8b 100644 --- a/resources/js/layouts/auth/auth-simple-layout.tsx +++ b/resources/js/layouts/auth/auth-simple-layout.tsx @@ -1,7 +1,7 @@ +import { Link } from '@inertiajs/react'; import AppLogoIcon from '@/components/app-logo-icon'; import { home } from '@/routes'; import type { AuthLayoutProps } from '@/types'; -import { Link } from '@inertiajs/react'; export default function AuthSimpleLayout({ children, diff --git a/resources/js/layouts/auth/auth-split-layout.tsx b/resources/js/layouts/auth/auth-split-layout.tsx index c45dafb5d..a567729f3 100644 --- a/resources/js/layouts/auth/auth-split-layout.tsx +++ b/resources/js/layouts/auth/auth-split-layout.tsx @@ -1,7 +1,7 @@ +import { Link, usePage } from '@inertiajs/react'; import AppLogoIcon from '@/components/app-logo-icon'; import { home } from '@/routes'; import type { AuthLayoutProps } from '@/types'; -import { Link, usePage } from '@inertiajs/react'; export default function AuthSplitLayout({ children, diff --git a/resources/js/layouts/settings/layout.tsx b/resources/js/layouts/settings/layout.tsx index ee6a56a55..379899bfb 100644 --- a/resources/js/layouts/settings/layout.tsx +++ b/resources/js/layouts/settings/layout.tsx @@ -1,3 +1,5 @@ +import { Link } from '@inertiajs/react'; +import type { PropsWithChildren } from 'react'; import Heading from '@/components/heading'; import { Button } from '@/components/ui/button'; import { Separator } from '@/components/ui/separator'; @@ -8,8 +10,6 @@ import { edit as editPassword } from '@/routes/password'; import { show as showTwoFactor } from '@/routes/two-factor'; import { edit } from '@/routes/user-profile'; import type { NavItem } from '@/types'; -import { Link } from '@inertiajs/react'; -import type { PropsWithChildren } from 'react'; const sidebarNavItems: NavItem[] = [ { diff --git a/resources/js/pages/appearance/update.tsx b/resources/js/pages/appearance/update.tsx index a9855b7af..12329920d 100644 --- a/resources/js/pages/appearance/update.tsx +++ b/resources/js/pages/appearance/update.tsx @@ -1,10 +1,10 @@ +import { Head } from '@inertiajs/react'; import AppearanceTabs from '@/components/appearance-tabs'; import Heading from '@/components/heading'; import AppLayout from '@/layouts/app-layout'; import SettingsLayout from '@/layouts/settings/layout'; import { edit as editAppearance } from '@/routes/appearance'; import type { BreadcrumbItem } from '@/types'; -import { Head } from '@inertiajs/react'; const breadcrumbs: BreadcrumbItem[] = [ { diff --git a/resources/js/pages/dashboard.tsx b/resources/js/pages/dashboard.tsx index 091114781..408eb5e5c 100644 --- a/resources/js/pages/dashboard.tsx +++ b/resources/js/pages/dashboard.tsx @@ -1,8 +1,8 @@ +import { Head } from '@inertiajs/react'; import { PlaceholderPattern } from '@/components/ui/placeholder-pattern'; import AppLayout from '@/layouts/app-layout'; import { dashboard } from '@/routes'; import type { BreadcrumbItem } from '@/types'; -import { Head } from '@inertiajs/react'; const breadcrumbs: BreadcrumbItem[] = [ { diff --git a/resources/js/pages/session/create.tsx b/resources/js/pages/session/create.tsx index 1f0e3ff9f..7bde9129f 100644 --- a/resources/js/pages/session/create.tsx +++ b/resources/js/pages/session/create.tsx @@ -1,3 +1,4 @@ +import { Form, Head } from '@inertiajs/react'; import InputError from '@/components/input-error'; import PasswordInput from '@/components/password-input'; import TextLink from '@/components/text-link'; @@ -10,7 +11,6 @@ import AuthLayout from '@/layouts/auth-layout'; import { register } from '@/routes'; import { store } from '@/routes/login'; import { request } from '@/routes/password'; -import { Form, Head } from '@inertiajs/react'; type Props = { status?: string; diff --git a/resources/js/pages/user-email-reset-notification/create.tsx b/resources/js/pages/user-email-reset-notification/create.tsx index 811624058..335258884 100644 --- a/resources/js/pages/user-email-reset-notification/create.tsx +++ b/resources/js/pages/user-email-reset-notification/create.tsx @@ -1,3 +1,5 @@ +import { Form, Head } from '@inertiajs/react'; +import { LoaderCircle } from 'lucide-react'; // Components import InputError from '@/components/input-error'; import TextLink from '@/components/text-link'; @@ -7,8 +9,6 @@ import { Label } from '@/components/ui/label'; import AuthLayout from '@/layouts/auth-layout'; import { login } from '@/routes'; import { email } from '@/routes/password'; -import { Form, Head } from '@inertiajs/react'; -import { LoaderCircle } from 'lucide-react'; export default function ForgotPassword({ status }: { status?: string }) { return ( diff --git a/resources/js/pages/user-email-verification-notification/create.tsx b/resources/js/pages/user-email-verification-notification/create.tsx index 03ac55793..bafbe7d6c 100644 --- a/resources/js/pages/user-email-verification-notification/create.tsx +++ b/resources/js/pages/user-email-verification-notification/create.tsx @@ -1,3 +1,4 @@ +import { Form, Head } from '@inertiajs/react'; // Components import TextLink from '@/components/text-link'; import { Button } from '@/components/ui/button'; @@ -5,7 +6,6 @@ import { Spinner } from '@/components/ui/spinner'; import AuthLayout from '@/layouts/auth-layout'; import { logout } from '@/routes'; import { send } from '@/routes/verification'; -import { Form, Head } from '@inertiajs/react'; export default function VerifyEmail({ status }: { status?: string }) { return ( diff --git a/resources/js/pages/user-password-confirmation/create.tsx b/resources/js/pages/user-password-confirmation/create.tsx index b445bbf7f..153fc9765 100644 --- a/resources/js/pages/user-password-confirmation/create.tsx +++ b/resources/js/pages/user-password-confirmation/create.tsx @@ -1,3 +1,4 @@ +import { Form, Head } from '@inertiajs/react'; import InputError from '@/components/input-error'; import PasswordInput from '@/components/password-input'; import { Button } from '@/components/ui/button'; @@ -5,7 +6,6 @@ import { Label } from '@/components/ui/label'; import { Spinner } from '@/components/ui/spinner'; import AuthLayout from '@/layouts/auth-layout'; import { store } from '@/routes/password/confirm'; -import { Form, Head } from '@inertiajs/react'; export default function Create() { return ( diff --git a/resources/js/pages/user-password/create.tsx b/resources/js/pages/user-password/create.tsx index 1da3669e7..95f423cf0 100644 --- a/resources/js/pages/user-password/create.tsx +++ b/resources/js/pages/user-password/create.tsx @@ -1,3 +1,4 @@ +import { Form, Head } from '@inertiajs/react'; import InputError from '@/components/input-error'; import PasswordInput from '@/components/password-input'; import { Button } from '@/components/ui/button'; @@ -6,7 +7,6 @@ import { Label } from '@/components/ui/label'; import { Spinner } from '@/components/ui/spinner'; import AuthLayout from '@/layouts/auth-layout'; import { update } from '@/routes/password'; -import { Form, Head } from '@inertiajs/react'; type Props = { token: string; diff --git a/resources/js/pages/user-password/edit.tsx b/resources/js/pages/user-password/edit.tsx index 2c196b129..1b3747c8a 100644 --- a/resources/js/pages/user-password/edit.tsx +++ b/resources/js/pages/user-password/edit.tsx @@ -1,3 +1,6 @@ +import { Transition } from '@headlessui/react'; +import { Form, Head } from '@inertiajs/react'; +import { useRef } from 'react'; import UserPasswordController from '@/actions/App/Http/Controllers/UserPasswordController'; import Heading from '@/components/heading'; import InputError from '@/components/input-error'; @@ -8,9 +11,6 @@ import AppLayout from '@/layouts/app-layout'; import SettingsLayout from '@/layouts/settings/layout'; import { edit } from '@/routes/password'; import type { BreadcrumbItem } from '@/types'; -import { Transition } from '@headlessui/react'; -import { Form, Head } from '@inertiajs/react'; -import { useRef } from 'react'; const breadcrumbs: BreadcrumbItem[] = [ { diff --git a/resources/js/pages/user-profile/edit.tsx b/resources/js/pages/user-profile/edit.tsx index 81ba1c545..042ff4480 100644 --- a/resources/js/pages/user-profile/edit.tsx +++ b/resources/js/pages/user-profile/edit.tsx @@ -1,3 +1,5 @@ +import { Transition } from '@headlessui/react'; +import { Form, Head, Link, usePage } from '@inertiajs/react'; import UserProfileController from '@/actions/App/Http/Controllers/UserProfileController'; import DeleteUser from '@/components/delete-user'; import Heading from '@/components/heading'; @@ -10,8 +12,6 @@ import SettingsLayout from '@/layouts/settings/layout'; import { edit } from '@/routes/user-profile'; import { send } from '@/routes/verification'; import type { BreadcrumbItem } from '@/types'; -import { Transition } from '@headlessui/react'; -import { Form, Head, Link, usePage } from '@inertiajs/react'; const breadcrumbs: BreadcrumbItem[] = [ { diff --git a/resources/js/pages/user-two-factor-authentication/show.tsx b/resources/js/pages/user-two-factor-authentication/show.tsx index 3f6096b85..a6228ddc2 100644 --- a/resources/js/pages/user-two-factor-authentication/show.tsx +++ b/resources/js/pages/user-two-factor-authentication/show.tsx @@ -1,3 +1,6 @@ +import { Form, Head } from '@inertiajs/react'; +import { ShieldCheck } from 'lucide-react'; +import { useState } from 'react'; import Heading from '@/components/heading'; import TwoFactorRecoveryCodes from '@/components/two-factor-recovery-codes'; import TwoFactorSetupModal from '@/components/two-factor-setup-modal'; @@ -7,9 +10,6 @@ import AppLayout from '@/layouts/app-layout'; import SettingsLayout from '@/layouts/settings/layout'; import { disable, enable, show } from '@/routes/two-factor'; import type { BreadcrumbItem } from '@/types'; -import { Form, Head } from '@inertiajs/react'; -import { ShieldCheck } from 'lucide-react'; -import { useState } from 'react'; type Props = { canManageTwoFactor?: boolean; diff --git a/resources/js/pages/user/create.tsx b/resources/js/pages/user/create.tsx index c0a3a897a..61254139f 100644 --- a/resources/js/pages/user/create.tsx +++ b/resources/js/pages/user/create.tsx @@ -1,3 +1,4 @@ +import { Form, Head } from '@inertiajs/react'; import InputError from '@/components/input-error'; import PasswordInput from '@/components/password-input'; import TextLink from '@/components/text-link'; @@ -8,7 +9,6 @@ import { Spinner } from '@/components/ui/spinner'; import AuthLayout from '@/layouts/auth-layout'; import { login } from '@/routes'; import { store } from '@/routes/register'; -import { Form, Head } from '@inertiajs/react'; export default function Register() { return ( diff --git a/resources/js/pages/welcome.tsx b/resources/js/pages/welcome.tsx index 7cdc1b15f..baebd3db7 100644 --- a/resources/js/pages/welcome.tsx +++ b/resources/js/pages/welcome.tsx @@ -1,5 +1,5 @@ -import { dashboard, login, register } from '@/routes'; import { Head, Link, usePage } from '@inertiajs/react'; +import { dashboard, login, register } from '@/routes'; export default function Welcome({ canRegister = true, diff --git a/resources/js/ssr.tsx b/resources/js/ssr.tsx index 92192f9b2..bddcb8599 100644 --- a/resources/js/ssr.tsx +++ b/resources/js/ssr.tsx @@ -1,4 +1,3 @@ -import { TooltipProvider } from '@/components/ui/tooltip'; import { createInertiaApp } from '@inertiajs/react'; import createServer from '@inertiajs/react/server'; import { resolvePageComponent } from 'laravel-vite-plugin/inertia-helpers'; diff --git a/resources/js/types/ui.ts b/resources/js/types/ui.ts index 8eaafe777..98e45be63 100644 --- a/resources/js/types/ui.ts +++ b/resources/js/types/ui.ts @@ -1,5 +1,5 @@ -import type { BreadcrumbItem } from '@/types/navigation'; import type { ReactNode } from 'react'; +import type { BreadcrumbItem } from '@/types/navigation'; export type AppLayoutProps = { children: ReactNode; From 01a7f2b5e38618985b0abfa8c8bdf3368cc34314 Mon Sep 17 00:00:00 2001 From: Josh Donnell Date: Sat, 21 Mar 2026 11:46:00 +0000 Subject: [PATCH 12/19] fix: add missing dep --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 814fb7b6b..11fd4580f 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "@types/node": "^25.5.0", "npm-check-updates": "^19.6.5", "playwright": "^1.58.2", + "tw-animate-css": "^1.4.0", "vite-plus": "latest" }, "dependencies": { From c7b5cb70338c3e70cbac7010cf0e959c2a281ce7 Mon Sep 17 00:00:00 2001 From: Josh Donnell Date: Sat, 21 Mar 2026 11:57:46 +0000 Subject: [PATCH 13/19] chore: fix for CI with babel and react --- package.json | 2 +- vite.config.ts | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 11fd4580f..2ae98afc9 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "@tailwindcss/vite": "^4.2.2", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", - "@vitejs/plugin-react": "^5.2.0", + "@vitejs/plugin-react": "5.2.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "concurrently": "^9.2.1", diff --git a/vite.config.ts b/vite.config.ts index 5e161dd46..6fef3a7f3 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,5 +1,6 @@ import { wayfinder } from '@laravel/vite-plugin-wayfinder'; import tailwindcss from '@tailwindcss/vite'; +import type { Options } from '@vitejs/plugin-react'; import react from '@vitejs/plugin-react'; import laravel from 'laravel-vite-plugin'; import { defineConfig } from 'vite-plus'; @@ -59,7 +60,7 @@ export default defineConfig({ babel: { plugins: ['babel-plugin-react-compiler'], }, - }), + } as Options), tailwindcss(), wayfinder({ formVariants: true, From e083785346b9414e0794ac1741f0cb343aa68bb6 Mon Sep 17 00:00:00 2001 From: Josh Donnell Date: Sat, 21 Mar 2026 12:32:44 +0000 Subject: [PATCH 14/19] fix: issue with babel as no longer required --- package.json | 2 +- vite.config.ts | 7 +------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 2ae98afc9..2f7ca48b4 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "@tailwindcss/vite": "^4.2.2", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", - "@vitejs/plugin-react": "5.2.0", + "@vitejs/plugin-react": "6.0.1", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "concurrently": "^9.2.1", diff --git a/vite.config.ts b/vite.config.ts index 6fef3a7f3..e293182e1 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,6 +1,5 @@ import { wayfinder } from '@laravel/vite-plugin-wayfinder'; import tailwindcss from '@tailwindcss/vite'; -import type { Options } from '@vitejs/plugin-react'; import react from '@vitejs/plugin-react'; import laravel from 'laravel-vite-plugin'; import { defineConfig } from 'vite-plus'; @@ -56,11 +55,7 @@ export default defineConfig({ ssr: 'resources/js/ssr.tsx', refresh: true, }), - react({ - babel: { - plugins: ['babel-plugin-react-compiler'], - }, - } as Options), + react(), tailwindcss(), wayfinder({ formVariants: true, From 2af0d05d2ae4d7e6f9c92e20d642db0c7c635551 Mon Sep 17 00:00:00 2001 From: Josh Donnell Date: Sat, 21 Mar 2026 13:04:44 +0000 Subject: [PATCH 15/19] fix: ordering for imports --- resources/js/app.tsx | 4 ++-- resources/js/components/alert-error.tsx | 2 +- resources/js/components/app-content.tsx | 2 +- resources/js/components/app-header.tsx | 4 ++-- resources/js/components/app-shell.tsx | 4 ++-- resources/js/components/app-sidebar.tsx | 4 ++-- resources/js/components/appearance-tabs.tsx | 6 +++--- resources/js/components/breadcrumbs.tsx | 4 ++-- resources/js/components/delete-user.tsx | 4 ++-- resources/js/components/input-error.tsx | 2 +- resources/js/components/nav-footer.tsx | 2 +- resources/js/components/nav-main.tsx | 2 +- resources/js/components/nav-user.tsx | 4 ++-- resources/js/components/password-input.tsx | 4 ++-- resources/js/components/text-link.tsx | 2 +- resources/js/components/two-factor-recovery-codes.tsx | 6 +++--- resources/js/components/two-factor-setup-modal.tsx | 8 ++++---- resources/js/components/user-menu-content.tsx | 4 ++-- resources/js/hooks/use-current-url.ts | 2 +- resources/js/hooks/use-two-factor-auth.ts | 2 +- resources/js/layouts/auth/auth-card-layout.tsx | 4 ++-- resources/js/layouts/auth/auth-simple-layout.tsx | 2 +- resources/js/layouts/auth/auth-split-layout.tsx | 2 +- resources/js/layouts/settings/layout.tsx | 4 ++-- resources/js/pages/appearance/update.tsx | 2 +- resources/js/pages/dashboard.tsx | 2 +- resources/js/pages/session/create.tsx | 2 +- .../js/pages/user-email-reset-notification/create.tsx | 4 ++-- .../pages/user-email-verification-notification/create.tsx | 2 +- resources/js/pages/user-password-confirmation/create.tsx | 2 +- resources/js/pages/user-password/create.tsx | 2 +- resources/js/pages/user-password/edit.tsx | 6 +++--- resources/js/pages/user-profile/edit.tsx | 4 ++-- .../user-two-factor-authentication-challenge/show.tsx | 6 +++--- .../js/pages/user-two-factor-authentication/show.tsx | 6 +++--- resources/js/pages/user/create.tsx | 2 +- resources/js/pages/welcome.tsx | 2 +- resources/js/ssr.tsx | 2 +- resources/js/types/ui.ts | 2 +- vite.config.ts | 1 + 40 files changed, 66 insertions(+), 65 deletions(-) diff --git a/resources/js/app.tsx b/resources/js/app.tsx index cab78007e..be6a22f5b 100644 --- a/resources/js/app.tsx +++ b/resources/js/app.tsx @@ -1,10 +1,10 @@ +import { TooltipProvider } from '@/components/ui/tooltip'; +import { initializeTheme } from '@/hooks/use-appearance'; import { createInertiaApp } from '@inertiajs/react'; import { resolvePageComponent } from 'laravel-vite-plugin/inertia-helpers'; import type { ComponentType } from 'react'; import { StrictMode } from 'react'; import { createRoot } from 'react-dom/client'; -import { TooltipProvider } from '@/components/ui/tooltip'; -import { initializeTheme } from '@/hooks/use-appearance'; import '../css/app.css'; const appName = import.meta.env.VITE_APP_NAME || 'Laravel'; diff --git a/resources/js/components/alert-error.tsx b/resources/js/components/alert-error.tsx index a9eacd313..8cc228bd4 100644 --- a/resources/js/components/alert-error.tsx +++ b/resources/js/components/alert-error.tsx @@ -1,5 +1,5 @@ -import { AlertCircleIcon } from 'lucide-react'; import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'; +import { AlertCircleIcon } from 'lucide-react'; export default function AlertError({ errors, diff --git a/resources/js/components/app-content.tsx b/resources/js/components/app-content.tsx index 5a04c696a..3f67a8d7c 100644 --- a/resources/js/components/app-content.tsx +++ b/resources/js/components/app-content.tsx @@ -1,6 +1,6 @@ -import * as React from 'react'; import { SidebarInset } from '@/components/ui/sidebar'; import type { AppVariant } from '@/types'; +import * as React from 'react'; type Props = React.ComponentProps<'main'> & { variant?: AppVariant; diff --git a/resources/js/components/app-header.tsx b/resources/js/components/app-header.tsx index 0aac91a72..9372a9545 100644 --- a/resources/js/components/app-header.tsx +++ b/resources/js/components/app-header.tsx @@ -1,5 +1,3 @@ -import { Link, usePage } from '@inertiajs/react'; -import { BookOpen, Folder, LayoutGrid, Menu, Search } from 'lucide-react'; import AppLogo from '@/components/app-logo'; import AppLogoIcon from '@/components/app-logo-icon'; import { Breadcrumbs } from '@/components/breadcrumbs'; @@ -34,6 +32,8 @@ import { useInitials } from '@/hooks/use-initials'; import { cn, toUrl } from '@/lib/utils'; import { dashboard } from '@/routes'; import type { BreadcrumbItem, NavItem } from '@/types'; +import { Link, usePage } from '@inertiajs/react'; +import { BookOpen, Folder, LayoutGrid, Menu, Search } from 'lucide-react'; type Props = { breadcrumbs?: BreadcrumbItem[]; diff --git a/resources/js/components/app-shell.tsx b/resources/js/components/app-shell.tsx index f51a9dbf6..a50870015 100644 --- a/resources/js/components/app-shell.tsx +++ b/resources/js/components/app-shell.tsx @@ -1,7 +1,7 @@ -import { usePage } from '@inertiajs/react'; -import type { ReactNode } from 'react'; import { SidebarProvider } from '@/components/ui/sidebar'; import type { AppVariant } from '@/types'; +import { usePage } from '@inertiajs/react'; +import type { ReactNode } from 'react'; type Props = { children: ReactNode; diff --git a/resources/js/components/app-sidebar.tsx b/resources/js/components/app-sidebar.tsx index a38aa1d91..d83fdad6f 100644 --- a/resources/js/components/app-sidebar.tsx +++ b/resources/js/components/app-sidebar.tsx @@ -1,5 +1,3 @@ -import { Link } from '@inertiajs/react'; -import { BookOpen, FolderGit2, LayoutGrid } from 'lucide-react'; import AppLogo from '@/components/app-logo'; import { NavFooter } from '@/components/nav-footer'; import { NavMain } from '@/components/nav-main'; @@ -15,6 +13,8 @@ import { } from '@/components/ui/sidebar'; import { dashboard } from '@/routes'; import type { NavItem } from '@/types'; +import { Link } from '@inertiajs/react'; +import { BookOpen, FolderGit2, LayoutGrid } from 'lucide-react'; const mainNavItems: NavItem[] = [ { diff --git a/resources/js/components/appearance-tabs.tsx b/resources/js/components/appearance-tabs.tsx index b01386248..0a30d23d8 100644 --- a/resources/js/components/appearance-tabs.tsx +++ b/resources/js/components/appearance-tabs.tsx @@ -1,9 +1,9 @@ -import type { LucideIcon } from 'lucide-react'; -import { Monitor, Moon, Sun } from 'lucide-react'; -import type { HTMLAttributes } from 'react'; import type { Appearance } from '@/hooks/use-appearance'; import { useAppearance } from '@/hooks/use-appearance'; import { cn } from '@/lib/utils'; +import type { LucideIcon } from 'lucide-react'; +import { Monitor, Moon, Sun } from 'lucide-react'; +import type { HTMLAttributes } from 'react'; export default function AppearanceToggleTab({ className = '', diff --git a/resources/js/components/breadcrumbs.tsx b/resources/js/components/breadcrumbs.tsx index 95414f215..43ea0a9e8 100644 --- a/resources/js/components/breadcrumbs.tsx +++ b/resources/js/components/breadcrumbs.tsx @@ -1,5 +1,3 @@ -import { Link } from '@inertiajs/react'; -import { Fragment } from 'react'; import { Breadcrumb, BreadcrumbItem, @@ -9,6 +7,8 @@ import { BreadcrumbSeparator, } from '@/components/ui/breadcrumb'; import type { BreadcrumbItem as BreadcrumbItemType } from '@/types'; +import { Link } from '@inertiajs/react'; +import { Fragment } from 'react'; export function Breadcrumbs({ breadcrumbs, diff --git a/resources/js/components/delete-user.tsx b/resources/js/components/delete-user.tsx index f0f8e3338..6d8e2aa95 100644 --- a/resources/js/components/delete-user.tsx +++ b/resources/js/components/delete-user.tsx @@ -1,5 +1,3 @@ -import { Form } from '@inertiajs/react'; -import { useRef } from 'react'; import UserController from '@/actions/App/Http/Controllers/UserController'; import Heading from '@/components/heading'; import InputError from '@/components/input-error'; @@ -15,6 +13,8 @@ import { DialogTrigger, } from '@/components/ui/dialog'; import { Label } from '@/components/ui/label'; +import { Form } from '@inertiajs/react'; +import { useRef } from 'react'; export default function DeleteUser() { const passwordInput = useRef(null); diff --git a/resources/js/components/input-error.tsx b/resources/js/components/input-error.tsx index f323cee94..9b36b312f 100644 --- a/resources/js/components/input-error.tsx +++ b/resources/js/components/input-error.tsx @@ -1,5 +1,5 @@ -import type { HTMLAttributes } from 'react'; import { cn } from '@/lib/utils'; +import type { HTMLAttributes } from 'react'; export default function InputError({ message, diff --git a/resources/js/components/nav-footer.tsx b/resources/js/components/nav-footer.tsx index 8430e495b..b19d1596e 100644 --- a/resources/js/components/nav-footer.tsx +++ b/resources/js/components/nav-footer.tsx @@ -1,4 +1,3 @@ -import type { ComponentPropsWithoutRef } from 'react'; import { SidebarGroup, SidebarGroupContent, @@ -8,6 +7,7 @@ import { } from '@/components/ui/sidebar'; import { toUrl } from '@/lib/utils'; import type { NavItem } from '@/types'; +import type { ComponentPropsWithoutRef } from 'react'; export function NavFooter({ items, diff --git a/resources/js/components/nav-main.tsx b/resources/js/components/nav-main.tsx index 54095ac73..018410d97 100644 --- a/resources/js/components/nav-main.tsx +++ b/resources/js/components/nav-main.tsx @@ -1,4 +1,3 @@ -import { Link } from '@inertiajs/react'; import { SidebarGroup, SidebarGroupLabel, @@ -8,6 +7,7 @@ import { } from '@/components/ui/sidebar'; import { useCurrentUrl } from '@/hooks/use-current-url'; import type { NavItem } from '@/types'; +import { Link } from '@inertiajs/react'; export function NavMain({ items = [] }: { items: NavItem[] }) { const { isCurrentUrl } = useCurrentUrl(); diff --git a/resources/js/components/nav-user.tsx b/resources/js/components/nav-user.tsx index 4075d17a0..91330ea81 100644 --- a/resources/js/components/nav-user.tsx +++ b/resources/js/components/nav-user.tsx @@ -1,5 +1,3 @@ -import { usePage } from '@inertiajs/react'; -import { ChevronsUpDown } from 'lucide-react'; import { DropdownMenu, DropdownMenuContent, @@ -14,6 +12,8 @@ import { import { UserInfo } from '@/components/user-info'; import { UserMenuContent } from '@/components/user-menu-content'; import { useIsMobile } from '@/hooks/use-mobile'; +import { usePage } from '@inertiajs/react'; +import { ChevronsUpDown } from 'lucide-react'; export function NavUser() { const { auth } = usePage().props; diff --git a/resources/js/components/password-input.tsx b/resources/js/components/password-input.tsx index 081e5cd97..d478b5dcd 100644 --- a/resources/js/components/password-input.tsx +++ b/resources/js/components/password-input.tsx @@ -1,8 +1,8 @@ +import { Input } from '@/components/ui/input'; +import { cn } from '@/lib/utils'; import { Eye, EyeOff } from 'lucide-react'; import type { ComponentProps, Ref } from 'react'; import { useState } from 'react'; -import { Input } from '@/components/ui/input'; -import { cn } from '@/lib/utils'; export default function PasswordInput({ className, diff --git a/resources/js/components/text-link.tsx b/resources/js/components/text-link.tsx index 08ad2694e..78d06b397 100644 --- a/resources/js/components/text-link.tsx +++ b/resources/js/components/text-link.tsx @@ -1,6 +1,6 @@ +import { cn } from '@/lib/utils'; import { Link } from '@inertiajs/react'; import type { ComponentProps } from 'react'; -import { cn } from '@/lib/utils'; type Props = ComponentProps; diff --git a/resources/js/components/two-factor-recovery-codes.tsx b/resources/js/components/two-factor-recovery-codes.tsx index 8b1fc928a..cc76ea9a6 100644 --- a/resources/js/components/two-factor-recovery-codes.tsx +++ b/resources/js/components/two-factor-recovery-codes.tsx @@ -1,6 +1,3 @@ -import { Form } from '@inertiajs/react'; -import { Eye, EyeOff, LockKeyhole, RefreshCw } from 'lucide-react'; -import { useCallback, useEffect, useRef, useState } from 'react'; import AlertError from '@/components/alert-error'; import { Button } from '@/components/ui/button'; import { @@ -11,6 +8,9 @@ import { CardTitle, } from '@/components/ui/card'; import { regenerateRecoveryCodes } from '@/routes/two-factor'; +import { Form } from '@inertiajs/react'; +import { Eye, EyeOff, LockKeyhole, RefreshCw } from 'lucide-react'; +import { useCallback, useEffect, useRef, useState } from 'react'; type Props = { recoveryCodesList: string[]; diff --git a/resources/js/components/two-factor-setup-modal.tsx b/resources/js/components/two-factor-setup-modal.tsx index 4b48c60ad..3a66ca6a5 100644 --- a/resources/js/components/two-factor-setup-modal.tsx +++ b/resources/js/components/two-factor-setup-modal.tsx @@ -1,7 +1,3 @@ -import { Form } from '@inertiajs/react'; -import { REGEXP_ONLY_DIGITS } from 'input-otp'; -import { Check, Copy, ScanLine } from 'lucide-react'; -import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import AlertError from '@/components/alert-error'; import InputError from '@/components/input-error'; import { Button } from '@/components/ui/button'; @@ -22,6 +18,10 @@ import { useAppearance } from '@/hooks/use-appearance'; import { useClipboard } from '@/hooks/use-clipboard'; import { OTP_MAX_LENGTH } from '@/hooks/use-two-factor-auth'; import { confirm } from '@/routes/two-factor'; +import { Form } from '@inertiajs/react'; +import { REGEXP_ONLY_DIGITS } from 'input-otp'; +import { Check, Copy, ScanLine } from 'lucide-react'; +import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; function GridScanIcon() { return ( diff --git a/resources/js/components/user-menu-content.tsx b/resources/js/components/user-menu-content.tsx index bef259b42..bfaa728b4 100644 --- a/resources/js/components/user-menu-content.tsx +++ b/resources/js/components/user-menu-content.tsx @@ -1,5 +1,3 @@ -import { Link, router } from '@inertiajs/react'; -import { LogOut, Settings } from 'lucide-react'; import { DropdownMenuGroup, DropdownMenuItem, @@ -11,6 +9,8 @@ import { useMobileNavigation } from '@/hooks/use-mobile-navigation'; import { logout } from '@/routes'; import { edit } from '@/routes/user-profile'; import type { User } from '@/types'; +import { Link, router } from '@inertiajs/react'; +import { LogOut, Settings } from 'lucide-react'; type Props = { user: User; diff --git a/resources/js/hooks/use-current-url.ts b/resources/js/hooks/use-current-url.ts index ee8cd2baf..0fe856b4a 100644 --- a/resources/js/hooks/use-current-url.ts +++ b/resources/js/hooks/use-current-url.ts @@ -1,6 +1,6 @@ +import { toUrl } from '@/lib/utils'; import type { InertiaLinkProps } from '@inertiajs/react'; import { usePage } from '@inertiajs/react'; -import { toUrl } from '@/lib/utils'; export type IsCurrentUrlFn = ( urlToCheck: NonNullable, diff --git a/resources/js/hooks/use-two-factor-auth.ts b/resources/js/hooks/use-two-factor-auth.ts index d39276949..393c8af67 100644 --- a/resources/js/hooks/use-two-factor-auth.ts +++ b/resources/js/hooks/use-two-factor-auth.ts @@ -1,6 +1,6 @@ -import { useState } from 'react'; import { qrCode, recoveryCodes, secretKey } from '@/routes/two-factor'; import type { TwoFactorSecretKey, TwoFactorSetupData } from '@/types'; +import { useState } from 'react'; export type UseTwoFactorAuthReturn = { qrCodeSvg: string | null; diff --git a/resources/js/layouts/auth/auth-card-layout.tsx b/resources/js/layouts/auth/auth-card-layout.tsx index 851ac5f63..f8aad9523 100644 --- a/resources/js/layouts/auth/auth-card-layout.tsx +++ b/resources/js/layouts/auth/auth-card-layout.tsx @@ -1,5 +1,3 @@ -import { Link } from '@inertiajs/react'; -import type { PropsWithChildren } from 'react'; import AppLogoIcon from '@/components/app-logo-icon'; import { Card, @@ -9,6 +7,8 @@ import { CardTitle, } from '@/components/ui/card'; import { home } from '@/routes'; +import { Link } from '@inertiajs/react'; +import type { PropsWithChildren } from 'react'; export default function AuthCardLayout({ children, diff --git a/resources/js/layouts/auth/auth-simple-layout.tsx b/resources/js/layouts/auth/auth-simple-layout.tsx index b1396ae8b..a81715bde 100644 --- a/resources/js/layouts/auth/auth-simple-layout.tsx +++ b/resources/js/layouts/auth/auth-simple-layout.tsx @@ -1,7 +1,7 @@ -import { Link } from '@inertiajs/react'; import AppLogoIcon from '@/components/app-logo-icon'; import { home } from '@/routes'; import type { AuthLayoutProps } from '@/types'; +import { Link } from '@inertiajs/react'; export default function AuthSimpleLayout({ children, diff --git a/resources/js/layouts/auth/auth-split-layout.tsx b/resources/js/layouts/auth/auth-split-layout.tsx index a567729f3..c45dafb5d 100644 --- a/resources/js/layouts/auth/auth-split-layout.tsx +++ b/resources/js/layouts/auth/auth-split-layout.tsx @@ -1,7 +1,7 @@ -import { Link, usePage } from '@inertiajs/react'; import AppLogoIcon from '@/components/app-logo-icon'; import { home } from '@/routes'; import type { AuthLayoutProps } from '@/types'; +import { Link, usePage } from '@inertiajs/react'; export default function AuthSplitLayout({ children, diff --git a/resources/js/layouts/settings/layout.tsx b/resources/js/layouts/settings/layout.tsx index 379899bfb..ee6a56a55 100644 --- a/resources/js/layouts/settings/layout.tsx +++ b/resources/js/layouts/settings/layout.tsx @@ -1,5 +1,3 @@ -import { Link } from '@inertiajs/react'; -import type { PropsWithChildren } from 'react'; import Heading from '@/components/heading'; import { Button } from '@/components/ui/button'; import { Separator } from '@/components/ui/separator'; @@ -10,6 +8,8 @@ import { edit as editPassword } from '@/routes/password'; import { show as showTwoFactor } from '@/routes/two-factor'; import { edit } from '@/routes/user-profile'; import type { NavItem } from '@/types'; +import { Link } from '@inertiajs/react'; +import type { PropsWithChildren } from 'react'; const sidebarNavItems: NavItem[] = [ { diff --git a/resources/js/pages/appearance/update.tsx b/resources/js/pages/appearance/update.tsx index 12329920d..a9855b7af 100644 --- a/resources/js/pages/appearance/update.tsx +++ b/resources/js/pages/appearance/update.tsx @@ -1,10 +1,10 @@ -import { Head } from '@inertiajs/react'; import AppearanceTabs from '@/components/appearance-tabs'; import Heading from '@/components/heading'; import AppLayout from '@/layouts/app-layout'; import SettingsLayout from '@/layouts/settings/layout'; import { edit as editAppearance } from '@/routes/appearance'; import type { BreadcrumbItem } from '@/types'; +import { Head } from '@inertiajs/react'; const breadcrumbs: BreadcrumbItem[] = [ { diff --git a/resources/js/pages/dashboard.tsx b/resources/js/pages/dashboard.tsx index 408eb5e5c..091114781 100644 --- a/resources/js/pages/dashboard.tsx +++ b/resources/js/pages/dashboard.tsx @@ -1,8 +1,8 @@ -import { Head } from '@inertiajs/react'; import { PlaceholderPattern } from '@/components/ui/placeholder-pattern'; import AppLayout from '@/layouts/app-layout'; import { dashboard } from '@/routes'; import type { BreadcrumbItem } from '@/types'; +import { Head } from '@inertiajs/react'; const breadcrumbs: BreadcrumbItem[] = [ { diff --git a/resources/js/pages/session/create.tsx b/resources/js/pages/session/create.tsx index 7bde9129f..1f0e3ff9f 100644 --- a/resources/js/pages/session/create.tsx +++ b/resources/js/pages/session/create.tsx @@ -1,4 +1,3 @@ -import { Form, Head } from '@inertiajs/react'; import InputError from '@/components/input-error'; import PasswordInput from '@/components/password-input'; import TextLink from '@/components/text-link'; @@ -11,6 +10,7 @@ import AuthLayout from '@/layouts/auth-layout'; import { register } from '@/routes'; import { store } from '@/routes/login'; import { request } from '@/routes/password'; +import { Form, Head } from '@inertiajs/react'; type Props = { status?: string; diff --git a/resources/js/pages/user-email-reset-notification/create.tsx b/resources/js/pages/user-email-reset-notification/create.tsx index 335258884..811624058 100644 --- a/resources/js/pages/user-email-reset-notification/create.tsx +++ b/resources/js/pages/user-email-reset-notification/create.tsx @@ -1,5 +1,3 @@ -import { Form, Head } from '@inertiajs/react'; -import { LoaderCircle } from 'lucide-react'; // Components import InputError from '@/components/input-error'; import TextLink from '@/components/text-link'; @@ -9,6 +7,8 @@ import { Label } from '@/components/ui/label'; import AuthLayout from '@/layouts/auth-layout'; import { login } from '@/routes'; import { email } from '@/routes/password'; +import { Form, Head } from '@inertiajs/react'; +import { LoaderCircle } from 'lucide-react'; export default function ForgotPassword({ status }: { status?: string }) { return ( diff --git a/resources/js/pages/user-email-verification-notification/create.tsx b/resources/js/pages/user-email-verification-notification/create.tsx index bafbe7d6c..03ac55793 100644 --- a/resources/js/pages/user-email-verification-notification/create.tsx +++ b/resources/js/pages/user-email-verification-notification/create.tsx @@ -1,4 +1,3 @@ -import { Form, Head } from '@inertiajs/react'; // Components import TextLink from '@/components/text-link'; import { Button } from '@/components/ui/button'; @@ -6,6 +5,7 @@ import { Spinner } from '@/components/ui/spinner'; import AuthLayout from '@/layouts/auth-layout'; import { logout } from '@/routes'; import { send } from '@/routes/verification'; +import { Form, Head } from '@inertiajs/react'; export default function VerifyEmail({ status }: { status?: string }) { return ( diff --git a/resources/js/pages/user-password-confirmation/create.tsx b/resources/js/pages/user-password-confirmation/create.tsx index 153fc9765..b445bbf7f 100644 --- a/resources/js/pages/user-password-confirmation/create.tsx +++ b/resources/js/pages/user-password-confirmation/create.tsx @@ -1,4 +1,3 @@ -import { Form, Head } from '@inertiajs/react'; import InputError from '@/components/input-error'; import PasswordInput from '@/components/password-input'; import { Button } from '@/components/ui/button'; @@ -6,6 +5,7 @@ import { Label } from '@/components/ui/label'; import { Spinner } from '@/components/ui/spinner'; import AuthLayout from '@/layouts/auth-layout'; import { store } from '@/routes/password/confirm'; +import { Form, Head } from '@inertiajs/react'; export default function Create() { return ( diff --git a/resources/js/pages/user-password/create.tsx b/resources/js/pages/user-password/create.tsx index 95f423cf0..1da3669e7 100644 --- a/resources/js/pages/user-password/create.tsx +++ b/resources/js/pages/user-password/create.tsx @@ -1,4 +1,3 @@ -import { Form, Head } from '@inertiajs/react'; import InputError from '@/components/input-error'; import PasswordInput from '@/components/password-input'; import { Button } from '@/components/ui/button'; @@ -7,6 +6,7 @@ import { Label } from '@/components/ui/label'; import { Spinner } from '@/components/ui/spinner'; import AuthLayout from '@/layouts/auth-layout'; import { update } from '@/routes/password'; +import { Form, Head } from '@inertiajs/react'; type Props = { token: string; diff --git a/resources/js/pages/user-password/edit.tsx b/resources/js/pages/user-password/edit.tsx index 1b3747c8a..2c196b129 100644 --- a/resources/js/pages/user-password/edit.tsx +++ b/resources/js/pages/user-password/edit.tsx @@ -1,6 +1,3 @@ -import { Transition } from '@headlessui/react'; -import { Form, Head } from '@inertiajs/react'; -import { useRef } from 'react'; import UserPasswordController from '@/actions/App/Http/Controllers/UserPasswordController'; import Heading from '@/components/heading'; import InputError from '@/components/input-error'; @@ -11,6 +8,9 @@ import AppLayout from '@/layouts/app-layout'; import SettingsLayout from '@/layouts/settings/layout'; import { edit } from '@/routes/password'; import type { BreadcrumbItem } from '@/types'; +import { Transition } from '@headlessui/react'; +import { Form, Head } from '@inertiajs/react'; +import { useRef } from 'react'; const breadcrumbs: BreadcrumbItem[] = [ { diff --git a/resources/js/pages/user-profile/edit.tsx b/resources/js/pages/user-profile/edit.tsx index 042ff4480..81ba1c545 100644 --- a/resources/js/pages/user-profile/edit.tsx +++ b/resources/js/pages/user-profile/edit.tsx @@ -1,5 +1,3 @@ -import { Transition } from '@headlessui/react'; -import { Form, Head, Link, usePage } from '@inertiajs/react'; import UserProfileController from '@/actions/App/Http/Controllers/UserProfileController'; import DeleteUser from '@/components/delete-user'; import Heading from '@/components/heading'; @@ -12,6 +10,8 @@ import SettingsLayout from '@/layouts/settings/layout'; import { edit } from '@/routes/user-profile'; import { send } from '@/routes/verification'; import type { BreadcrumbItem } from '@/types'; +import { Transition } from '@headlessui/react'; +import { Form, Head, Link, usePage } from '@inertiajs/react'; const breadcrumbs: BreadcrumbItem[] = [ { diff --git a/resources/js/pages/user-two-factor-authentication-challenge/show.tsx b/resources/js/pages/user-two-factor-authentication-challenge/show.tsx index 1f5252b9b..cdd6af308 100644 --- a/resources/js/pages/user-two-factor-authentication-challenge/show.tsx +++ b/resources/js/pages/user-two-factor-authentication-challenge/show.tsx @@ -1,6 +1,3 @@ -import { Form, Head } from '@inertiajs/react'; -import { REGEXP_ONLY_DIGITS } from 'input-otp'; -import { useMemo, useState } from 'react'; import InputError from '@/components/input-error'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; @@ -12,6 +9,9 @@ import { import { OTP_MAX_LENGTH } from '@/hooks/use-two-factor-auth'; import AuthLayout from '@/layouts/auth-layout'; import { store } from '@/routes/two-factor/login'; +import { Form, Head } from '@inertiajs/react'; +import { REGEXP_ONLY_DIGITS } from 'input-otp'; +import { useMemo, useState } from 'react'; export default function Show() { const [showRecoveryInput, setShowRecoveryInput] = useState(false); diff --git a/resources/js/pages/user-two-factor-authentication/show.tsx b/resources/js/pages/user-two-factor-authentication/show.tsx index a6228ddc2..3f6096b85 100644 --- a/resources/js/pages/user-two-factor-authentication/show.tsx +++ b/resources/js/pages/user-two-factor-authentication/show.tsx @@ -1,6 +1,3 @@ -import { Form, Head } from '@inertiajs/react'; -import { ShieldCheck } from 'lucide-react'; -import { useState } from 'react'; import Heading from '@/components/heading'; import TwoFactorRecoveryCodes from '@/components/two-factor-recovery-codes'; import TwoFactorSetupModal from '@/components/two-factor-setup-modal'; @@ -10,6 +7,9 @@ import AppLayout from '@/layouts/app-layout'; import SettingsLayout from '@/layouts/settings/layout'; import { disable, enable, show } from '@/routes/two-factor'; import type { BreadcrumbItem } from '@/types'; +import { Form, Head } from '@inertiajs/react'; +import { ShieldCheck } from 'lucide-react'; +import { useState } from 'react'; type Props = { canManageTwoFactor?: boolean; diff --git a/resources/js/pages/user/create.tsx b/resources/js/pages/user/create.tsx index 61254139f..c0a3a897a 100644 --- a/resources/js/pages/user/create.tsx +++ b/resources/js/pages/user/create.tsx @@ -1,4 +1,3 @@ -import { Form, Head } from '@inertiajs/react'; import InputError from '@/components/input-error'; import PasswordInput from '@/components/password-input'; import TextLink from '@/components/text-link'; @@ -9,6 +8,7 @@ import { Spinner } from '@/components/ui/spinner'; import AuthLayout from '@/layouts/auth-layout'; import { login } from '@/routes'; import { store } from '@/routes/register'; +import { Form, Head } from '@inertiajs/react'; export default function Register() { return ( diff --git a/resources/js/pages/welcome.tsx b/resources/js/pages/welcome.tsx index baebd3db7..7cdc1b15f 100644 --- a/resources/js/pages/welcome.tsx +++ b/resources/js/pages/welcome.tsx @@ -1,5 +1,5 @@ -import { Head, Link, usePage } from '@inertiajs/react'; import { dashboard, login, register } from '@/routes'; +import { Head, Link, usePage } from '@inertiajs/react'; export default function Welcome({ canRegister = true, diff --git a/resources/js/ssr.tsx b/resources/js/ssr.tsx index bddcb8599..98ecf01cf 100644 --- a/resources/js/ssr.tsx +++ b/resources/js/ssr.tsx @@ -1,9 +1,9 @@ +import { TooltipProvider } from '@/components/ui/tooltip'; import { createInertiaApp } from '@inertiajs/react'; import createServer from '@inertiajs/react/server'; import { resolvePageComponent } from 'laravel-vite-plugin/inertia-helpers'; import type { ComponentType } from 'react'; import ReactDOMServer from 'react-dom/server'; -import { TooltipProvider } from '@/components/ui/tooltip'; const appName = import.meta.env.VITE_APP_NAME || 'Laravel'; diff --git a/resources/js/types/ui.ts b/resources/js/types/ui.ts index 98e45be63..8eaafe777 100644 --- a/resources/js/types/ui.ts +++ b/resources/js/types/ui.ts @@ -1,5 +1,5 @@ -import type { ReactNode } from 'react'; import type { BreadcrumbItem } from '@/types/navigation'; +import type { ReactNode } from 'react'; export type AppLayoutProps = { children: ReactNode; diff --git a/vite.config.ts b/vite.config.ts index e293182e1..2bed82904 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -39,6 +39,7 @@ export default defineConfig({ 'sibling', 'index', ], + internalPattern: [], // try clearing it newlinesBetween: false, }, ignorePatterns: [ From 8929810a04d5b6594dbcf3b0ad32cf4de5c2bfb5 Mon Sep 17 00:00:00 2001 From: Josh Donnell Date: Sat, 21 Mar 2026 13:15:34 +0000 Subject: [PATCH 16/19] fix: revert change --- resources/js/app.tsx | 4 ++-- resources/js/components/alert-error.tsx | 2 +- resources/js/components/app-content.tsx | 2 +- resources/js/components/app-header.tsx | 4 ++-- resources/js/components/app-shell.tsx | 4 ++-- resources/js/components/app-sidebar.tsx | 4 ++-- resources/js/components/appearance-tabs.tsx | 6 +++--- resources/js/components/breadcrumbs.tsx | 4 ++-- resources/js/components/delete-user.tsx | 4 ++-- resources/js/components/input-error.tsx | 2 +- resources/js/components/nav-footer.tsx | 2 +- resources/js/components/nav-main.tsx | 2 +- resources/js/components/nav-user.tsx | 4 ++-- resources/js/components/password-input.tsx | 4 ++-- resources/js/components/text-link.tsx | 2 +- resources/js/components/two-factor-recovery-codes.tsx | 6 +++--- resources/js/components/two-factor-setup-modal.tsx | 8 ++++---- resources/js/components/user-menu-content.tsx | 4 ++-- resources/js/hooks/use-current-url.ts | 2 +- resources/js/hooks/use-two-factor-auth.ts | 2 +- resources/js/layouts/auth/auth-card-layout.tsx | 4 ++-- resources/js/layouts/auth/auth-simple-layout.tsx | 2 +- resources/js/layouts/auth/auth-split-layout.tsx | 2 +- resources/js/layouts/settings/layout.tsx | 4 ++-- resources/js/pages/appearance/update.tsx | 2 +- resources/js/pages/dashboard.tsx | 2 +- resources/js/pages/session/create.tsx | 2 +- .../js/pages/user-email-reset-notification/create.tsx | 4 ++-- .../pages/user-email-verification-notification/create.tsx | 2 +- resources/js/pages/user-password-confirmation/create.tsx | 2 +- resources/js/pages/user-password/create.tsx | 2 +- resources/js/pages/user-password/edit.tsx | 6 +++--- resources/js/pages/user-profile/edit.tsx | 4 ++-- .../user-two-factor-authentication-challenge/show.tsx | 6 +++--- .../js/pages/user-two-factor-authentication/show.tsx | 6 +++--- resources/js/pages/user/create.tsx | 2 +- resources/js/pages/welcome.tsx | 2 +- resources/js/ssr.tsx | 2 +- resources/js/types/ui.ts | 2 +- vite.config.ts | 1 - 40 files changed, 65 insertions(+), 66 deletions(-) diff --git a/resources/js/app.tsx b/resources/js/app.tsx index be6a22f5b..cab78007e 100644 --- a/resources/js/app.tsx +++ b/resources/js/app.tsx @@ -1,10 +1,10 @@ -import { TooltipProvider } from '@/components/ui/tooltip'; -import { initializeTheme } from '@/hooks/use-appearance'; import { createInertiaApp } from '@inertiajs/react'; import { resolvePageComponent } from 'laravel-vite-plugin/inertia-helpers'; import type { ComponentType } from 'react'; import { StrictMode } from 'react'; import { createRoot } from 'react-dom/client'; +import { TooltipProvider } from '@/components/ui/tooltip'; +import { initializeTheme } from '@/hooks/use-appearance'; import '../css/app.css'; const appName = import.meta.env.VITE_APP_NAME || 'Laravel'; diff --git a/resources/js/components/alert-error.tsx b/resources/js/components/alert-error.tsx index 8cc228bd4..a9eacd313 100644 --- a/resources/js/components/alert-error.tsx +++ b/resources/js/components/alert-error.tsx @@ -1,5 +1,5 @@ -import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'; import { AlertCircleIcon } from 'lucide-react'; +import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'; export default function AlertError({ errors, diff --git a/resources/js/components/app-content.tsx b/resources/js/components/app-content.tsx index 3f67a8d7c..5a04c696a 100644 --- a/resources/js/components/app-content.tsx +++ b/resources/js/components/app-content.tsx @@ -1,6 +1,6 @@ +import * as React from 'react'; import { SidebarInset } from '@/components/ui/sidebar'; import type { AppVariant } from '@/types'; -import * as React from 'react'; type Props = React.ComponentProps<'main'> & { variant?: AppVariant; diff --git a/resources/js/components/app-header.tsx b/resources/js/components/app-header.tsx index 9372a9545..0aac91a72 100644 --- a/resources/js/components/app-header.tsx +++ b/resources/js/components/app-header.tsx @@ -1,3 +1,5 @@ +import { Link, usePage } from '@inertiajs/react'; +import { BookOpen, Folder, LayoutGrid, Menu, Search } from 'lucide-react'; import AppLogo from '@/components/app-logo'; import AppLogoIcon from '@/components/app-logo-icon'; import { Breadcrumbs } from '@/components/breadcrumbs'; @@ -32,8 +34,6 @@ import { useInitials } from '@/hooks/use-initials'; import { cn, toUrl } from '@/lib/utils'; import { dashboard } from '@/routes'; import type { BreadcrumbItem, NavItem } from '@/types'; -import { Link, usePage } from '@inertiajs/react'; -import { BookOpen, Folder, LayoutGrid, Menu, Search } from 'lucide-react'; type Props = { breadcrumbs?: BreadcrumbItem[]; diff --git a/resources/js/components/app-shell.tsx b/resources/js/components/app-shell.tsx index a50870015..f51a9dbf6 100644 --- a/resources/js/components/app-shell.tsx +++ b/resources/js/components/app-shell.tsx @@ -1,7 +1,7 @@ -import { SidebarProvider } from '@/components/ui/sidebar'; -import type { AppVariant } from '@/types'; import { usePage } from '@inertiajs/react'; import type { ReactNode } from 'react'; +import { SidebarProvider } from '@/components/ui/sidebar'; +import type { AppVariant } from '@/types'; type Props = { children: ReactNode; diff --git a/resources/js/components/app-sidebar.tsx b/resources/js/components/app-sidebar.tsx index d83fdad6f..a38aa1d91 100644 --- a/resources/js/components/app-sidebar.tsx +++ b/resources/js/components/app-sidebar.tsx @@ -1,3 +1,5 @@ +import { Link } from '@inertiajs/react'; +import { BookOpen, FolderGit2, LayoutGrid } from 'lucide-react'; import AppLogo from '@/components/app-logo'; import { NavFooter } from '@/components/nav-footer'; import { NavMain } from '@/components/nav-main'; @@ -13,8 +15,6 @@ import { } from '@/components/ui/sidebar'; import { dashboard } from '@/routes'; import type { NavItem } from '@/types'; -import { Link } from '@inertiajs/react'; -import { BookOpen, FolderGit2, LayoutGrid } from 'lucide-react'; const mainNavItems: NavItem[] = [ { diff --git a/resources/js/components/appearance-tabs.tsx b/resources/js/components/appearance-tabs.tsx index 0a30d23d8..b01386248 100644 --- a/resources/js/components/appearance-tabs.tsx +++ b/resources/js/components/appearance-tabs.tsx @@ -1,9 +1,9 @@ -import type { Appearance } from '@/hooks/use-appearance'; -import { useAppearance } from '@/hooks/use-appearance'; -import { cn } from '@/lib/utils'; import type { LucideIcon } from 'lucide-react'; import { Monitor, Moon, Sun } from 'lucide-react'; import type { HTMLAttributes } from 'react'; +import type { Appearance } from '@/hooks/use-appearance'; +import { useAppearance } from '@/hooks/use-appearance'; +import { cn } from '@/lib/utils'; export default function AppearanceToggleTab({ className = '', diff --git a/resources/js/components/breadcrumbs.tsx b/resources/js/components/breadcrumbs.tsx index 43ea0a9e8..95414f215 100644 --- a/resources/js/components/breadcrumbs.tsx +++ b/resources/js/components/breadcrumbs.tsx @@ -1,3 +1,5 @@ +import { Link } from '@inertiajs/react'; +import { Fragment } from 'react'; import { Breadcrumb, BreadcrumbItem, @@ -7,8 +9,6 @@ import { BreadcrumbSeparator, } from '@/components/ui/breadcrumb'; import type { BreadcrumbItem as BreadcrumbItemType } from '@/types'; -import { Link } from '@inertiajs/react'; -import { Fragment } from 'react'; export function Breadcrumbs({ breadcrumbs, diff --git a/resources/js/components/delete-user.tsx b/resources/js/components/delete-user.tsx index 6d8e2aa95..f0f8e3338 100644 --- a/resources/js/components/delete-user.tsx +++ b/resources/js/components/delete-user.tsx @@ -1,3 +1,5 @@ +import { Form } from '@inertiajs/react'; +import { useRef } from 'react'; import UserController from '@/actions/App/Http/Controllers/UserController'; import Heading from '@/components/heading'; import InputError from '@/components/input-error'; @@ -13,8 +15,6 @@ import { DialogTrigger, } from '@/components/ui/dialog'; import { Label } from '@/components/ui/label'; -import { Form } from '@inertiajs/react'; -import { useRef } from 'react'; export default function DeleteUser() { const passwordInput = useRef(null); diff --git a/resources/js/components/input-error.tsx b/resources/js/components/input-error.tsx index 9b36b312f..f323cee94 100644 --- a/resources/js/components/input-error.tsx +++ b/resources/js/components/input-error.tsx @@ -1,5 +1,5 @@ -import { cn } from '@/lib/utils'; import type { HTMLAttributes } from 'react'; +import { cn } from '@/lib/utils'; export default function InputError({ message, diff --git a/resources/js/components/nav-footer.tsx b/resources/js/components/nav-footer.tsx index b19d1596e..8430e495b 100644 --- a/resources/js/components/nav-footer.tsx +++ b/resources/js/components/nav-footer.tsx @@ -1,3 +1,4 @@ +import type { ComponentPropsWithoutRef } from 'react'; import { SidebarGroup, SidebarGroupContent, @@ -7,7 +8,6 @@ import { } from '@/components/ui/sidebar'; import { toUrl } from '@/lib/utils'; import type { NavItem } from '@/types'; -import type { ComponentPropsWithoutRef } from 'react'; export function NavFooter({ items, diff --git a/resources/js/components/nav-main.tsx b/resources/js/components/nav-main.tsx index 018410d97..54095ac73 100644 --- a/resources/js/components/nav-main.tsx +++ b/resources/js/components/nav-main.tsx @@ -1,3 +1,4 @@ +import { Link } from '@inertiajs/react'; import { SidebarGroup, SidebarGroupLabel, @@ -7,7 +8,6 @@ import { } from '@/components/ui/sidebar'; import { useCurrentUrl } from '@/hooks/use-current-url'; import type { NavItem } from '@/types'; -import { Link } from '@inertiajs/react'; export function NavMain({ items = [] }: { items: NavItem[] }) { const { isCurrentUrl } = useCurrentUrl(); diff --git a/resources/js/components/nav-user.tsx b/resources/js/components/nav-user.tsx index 91330ea81..4075d17a0 100644 --- a/resources/js/components/nav-user.tsx +++ b/resources/js/components/nav-user.tsx @@ -1,3 +1,5 @@ +import { usePage } from '@inertiajs/react'; +import { ChevronsUpDown } from 'lucide-react'; import { DropdownMenu, DropdownMenuContent, @@ -12,8 +14,6 @@ import { import { UserInfo } from '@/components/user-info'; import { UserMenuContent } from '@/components/user-menu-content'; import { useIsMobile } from '@/hooks/use-mobile'; -import { usePage } from '@inertiajs/react'; -import { ChevronsUpDown } from 'lucide-react'; export function NavUser() { const { auth } = usePage().props; diff --git a/resources/js/components/password-input.tsx b/resources/js/components/password-input.tsx index d478b5dcd..081e5cd97 100644 --- a/resources/js/components/password-input.tsx +++ b/resources/js/components/password-input.tsx @@ -1,8 +1,8 @@ -import { Input } from '@/components/ui/input'; -import { cn } from '@/lib/utils'; import { Eye, EyeOff } from 'lucide-react'; import type { ComponentProps, Ref } from 'react'; import { useState } from 'react'; +import { Input } from '@/components/ui/input'; +import { cn } from '@/lib/utils'; export default function PasswordInput({ className, diff --git a/resources/js/components/text-link.tsx b/resources/js/components/text-link.tsx index 78d06b397..08ad2694e 100644 --- a/resources/js/components/text-link.tsx +++ b/resources/js/components/text-link.tsx @@ -1,6 +1,6 @@ -import { cn } from '@/lib/utils'; import { Link } from '@inertiajs/react'; import type { ComponentProps } from 'react'; +import { cn } from '@/lib/utils'; type Props = ComponentProps; diff --git a/resources/js/components/two-factor-recovery-codes.tsx b/resources/js/components/two-factor-recovery-codes.tsx index cc76ea9a6..8b1fc928a 100644 --- a/resources/js/components/two-factor-recovery-codes.tsx +++ b/resources/js/components/two-factor-recovery-codes.tsx @@ -1,3 +1,6 @@ +import { Form } from '@inertiajs/react'; +import { Eye, EyeOff, LockKeyhole, RefreshCw } from 'lucide-react'; +import { useCallback, useEffect, useRef, useState } from 'react'; import AlertError from '@/components/alert-error'; import { Button } from '@/components/ui/button'; import { @@ -8,9 +11,6 @@ import { CardTitle, } from '@/components/ui/card'; import { regenerateRecoveryCodes } from '@/routes/two-factor'; -import { Form } from '@inertiajs/react'; -import { Eye, EyeOff, LockKeyhole, RefreshCw } from 'lucide-react'; -import { useCallback, useEffect, useRef, useState } from 'react'; type Props = { recoveryCodesList: string[]; diff --git a/resources/js/components/two-factor-setup-modal.tsx b/resources/js/components/two-factor-setup-modal.tsx index 3a66ca6a5..4b48c60ad 100644 --- a/resources/js/components/two-factor-setup-modal.tsx +++ b/resources/js/components/two-factor-setup-modal.tsx @@ -1,3 +1,7 @@ +import { Form } from '@inertiajs/react'; +import { REGEXP_ONLY_DIGITS } from 'input-otp'; +import { Check, Copy, ScanLine } from 'lucide-react'; +import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import AlertError from '@/components/alert-error'; import InputError from '@/components/input-error'; import { Button } from '@/components/ui/button'; @@ -18,10 +22,6 @@ import { useAppearance } from '@/hooks/use-appearance'; import { useClipboard } from '@/hooks/use-clipboard'; import { OTP_MAX_LENGTH } from '@/hooks/use-two-factor-auth'; import { confirm } from '@/routes/two-factor'; -import { Form } from '@inertiajs/react'; -import { REGEXP_ONLY_DIGITS } from 'input-otp'; -import { Check, Copy, ScanLine } from 'lucide-react'; -import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; function GridScanIcon() { return ( diff --git a/resources/js/components/user-menu-content.tsx b/resources/js/components/user-menu-content.tsx index bfaa728b4..bef259b42 100644 --- a/resources/js/components/user-menu-content.tsx +++ b/resources/js/components/user-menu-content.tsx @@ -1,3 +1,5 @@ +import { Link, router } from '@inertiajs/react'; +import { LogOut, Settings } from 'lucide-react'; import { DropdownMenuGroup, DropdownMenuItem, @@ -9,8 +11,6 @@ import { useMobileNavigation } from '@/hooks/use-mobile-navigation'; import { logout } from '@/routes'; import { edit } from '@/routes/user-profile'; import type { User } from '@/types'; -import { Link, router } from '@inertiajs/react'; -import { LogOut, Settings } from 'lucide-react'; type Props = { user: User; diff --git a/resources/js/hooks/use-current-url.ts b/resources/js/hooks/use-current-url.ts index 0fe856b4a..ee8cd2baf 100644 --- a/resources/js/hooks/use-current-url.ts +++ b/resources/js/hooks/use-current-url.ts @@ -1,6 +1,6 @@ -import { toUrl } from '@/lib/utils'; import type { InertiaLinkProps } from '@inertiajs/react'; import { usePage } from '@inertiajs/react'; +import { toUrl } from '@/lib/utils'; export type IsCurrentUrlFn = ( urlToCheck: NonNullable, diff --git a/resources/js/hooks/use-two-factor-auth.ts b/resources/js/hooks/use-two-factor-auth.ts index 393c8af67..d39276949 100644 --- a/resources/js/hooks/use-two-factor-auth.ts +++ b/resources/js/hooks/use-two-factor-auth.ts @@ -1,6 +1,6 @@ +import { useState } from 'react'; import { qrCode, recoveryCodes, secretKey } from '@/routes/two-factor'; import type { TwoFactorSecretKey, TwoFactorSetupData } from '@/types'; -import { useState } from 'react'; export type UseTwoFactorAuthReturn = { qrCodeSvg: string | null; diff --git a/resources/js/layouts/auth/auth-card-layout.tsx b/resources/js/layouts/auth/auth-card-layout.tsx index f8aad9523..851ac5f63 100644 --- a/resources/js/layouts/auth/auth-card-layout.tsx +++ b/resources/js/layouts/auth/auth-card-layout.tsx @@ -1,3 +1,5 @@ +import { Link } from '@inertiajs/react'; +import type { PropsWithChildren } from 'react'; import AppLogoIcon from '@/components/app-logo-icon'; import { Card, @@ -7,8 +9,6 @@ import { CardTitle, } from '@/components/ui/card'; import { home } from '@/routes'; -import { Link } from '@inertiajs/react'; -import type { PropsWithChildren } from 'react'; export default function AuthCardLayout({ children, diff --git a/resources/js/layouts/auth/auth-simple-layout.tsx b/resources/js/layouts/auth/auth-simple-layout.tsx index a81715bde..b1396ae8b 100644 --- a/resources/js/layouts/auth/auth-simple-layout.tsx +++ b/resources/js/layouts/auth/auth-simple-layout.tsx @@ -1,7 +1,7 @@ +import { Link } from '@inertiajs/react'; import AppLogoIcon from '@/components/app-logo-icon'; import { home } from '@/routes'; import type { AuthLayoutProps } from '@/types'; -import { Link } from '@inertiajs/react'; export default function AuthSimpleLayout({ children, diff --git a/resources/js/layouts/auth/auth-split-layout.tsx b/resources/js/layouts/auth/auth-split-layout.tsx index c45dafb5d..a567729f3 100644 --- a/resources/js/layouts/auth/auth-split-layout.tsx +++ b/resources/js/layouts/auth/auth-split-layout.tsx @@ -1,7 +1,7 @@ +import { Link, usePage } from '@inertiajs/react'; import AppLogoIcon from '@/components/app-logo-icon'; import { home } from '@/routes'; import type { AuthLayoutProps } from '@/types'; -import { Link, usePage } from '@inertiajs/react'; export default function AuthSplitLayout({ children, diff --git a/resources/js/layouts/settings/layout.tsx b/resources/js/layouts/settings/layout.tsx index ee6a56a55..379899bfb 100644 --- a/resources/js/layouts/settings/layout.tsx +++ b/resources/js/layouts/settings/layout.tsx @@ -1,3 +1,5 @@ +import { Link } from '@inertiajs/react'; +import type { PropsWithChildren } from 'react'; import Heading from '@/components/heading'; import { Button } from '@/components/ui/button'; import { Separator } from '@/components/ui/separator'; @@ -8,8 +10,6 @@ import { edit as editPassword } from '@/routes/password'; import { show as showTwoFactor } from '@/routes/two-factor'; import { edit } from '@/routes/user-profile'; import type { NavItem } from '@/types'; -import { Link } from '@inertiajs/react'; -import type { PropsWithChildren } from 'react'; const sidebarNavItems: NavItem[] = [ { diff --git a/resources/js/pages/appearance/update.tsx b/resources/js/pages/appearance/update.tsx index a9855b7af..12329920d 100644 --- a/resources/js/pages/appearance/update.tsx +++ b/resources/js/pages/appearance/update.tsx @@ -1,10 +1,10 @@ +import { Head } from '@inertiajs/react'; import AppearanceTabs from '@/components/appearance-tabs'; import Heading from '@/components/heading'; import AppLayout from '@/layouts/app-layout'; import SettingsLayout from '@/layouts/settings/layout'; import { edit as editAppearance } from '@/routes/appearance'; import type { BreadcrumbItem } from '@/types'; -import { Head } from '@inertiajs/react'; const breadcrumbs: BreadcrumbItem[] = [ { diff --git a/resources/js/pages/dashboard.tsx b/resources/js/pages/dashboard.tsx index 091114781..408eb5e5c 100644 --- a/resources/js/pages/dashboard.tsx +++ b/resources/js/pages/dashboard.tsx @@ -1,8 +1,8 @@ +import { Head } from '@inertiajs/react'; import { PlaceholderPattern } from '@/components/ui/placeholder-pattern'; import AppLayout from '@/layouts/app-layout'; import { dashboard } from '@/routes'; import type { BreadcrumbItem } from '@/types'; -import { Head } from '@inertiajs/react'; const breadcrumbs: BreadcrumbItem[] = [ { diff --git a/resources/js/pages/session/create.tsx b/resources/js/pages/session/create.tsx index 1f0e3ff9f..7bde9129f 100644 --- a/resources/js/pages/session/create.tsx +++ b/resources/js/pages/session/create.tsx @@ -1,3 +1,4 @@ +import { Form, Head } from '@inertiajs/react'; import InputError from '@/components/input-error'; import PasswordInput from '@/components/password-input'; import TextLink from '@/components/text-link'; @@ -10,7 +11,6 @@ import AuthLayout from '@/layouts/auth-layout'; import { register } from '@/routes'; import { store } from '@/routes/login'; import { request } from '@/routes/password'; -import { Form, Head } from '@inertiajs/react'; type Props = { status?: string; diff --git a/resources/js/pages/user-email-reset-notification/create.tsx b/resources/js/pages/user-email-reset-notification/create.tsx index 811624058..335258884 100644 --- a/resources/js/pages/user-email-reset-notification/create.tsx +++ b/resources/js/pages/user-email-reset-notification/create.tsx @@ -1,3 +1,5 @@ +import { Form, Head } from '@inertiajs/react'; +import { LoaderCircle } from 'lucide-react'; // Components import InputError from '@/components/input-error'; import TextLink from '@/components/text-link'; @@ -7,8 +9,6 @@ import { Label } from '@/components/ui/label'; import AuthLayout from '@/layouts/auth-layout'; import { login } from '@/routes'; import { email } from '@/routes/password'; -import { Form, Head } from '@inertiajs/react'; -import { LoaderCircle } from 'lucide-react'; export default function ForgotPassword({ status }: { status?: string }) { return ( diff --git a/resources/js/pages/user-email-verification-notification/create.tsx b/resources/js/pages/user-email-verification-notification/create.tsx index 03ac55793..bafbe7d6c 100644 --- a/resources/js/pages/user-email-verification-notification/create.tsx +++ b/resources/js/pages/user-email-verification-notification/create.tsx @@ -1,3 +1,4 @@ +import { Form, Head } from '@inertiajs/react'; // Components import TextLink from '@/components/text-link'; import { Button } from '@/components/ui/button'; @@ -5,7 +6,6 @@ import { Spinner } from '@/components/ui/spinner'; import AuthLayout from '@/layouts/auth-layout'; import { logout } from '@/routes'; import { send } from '@/routes/verification'; -import { Form, Head } from '@inertiajs/react'; export default function VerifyEmail({ status }: { status?: string }) { return ( diff --git a/resources/js/pages/user-password-confirmation/create.tsx b/resources/js/pages/user-password-confirmation/create.tsx index b445bbf7f..153fc9765 100644 --- a/resources/js/pages/user-password-confirmation/create.tsx +++ b/resources/js/pages/user-password-confirmation/create.tsx @@ -1,3 +1,4 @@ +import { Form, Head } from '@inertiajs/react'; import InputError from '@/components/input-error'; import PasswordInput from '@/components/password-input'; import { Button } from '@/components/ui/button'; @@ -5,7 +6,6 @@ import { Label } from '@/components/ui/label'; import { Spinner } from '@/components/ui/spinner'; import AuthLayout from '@/layouts/auth-layout'; import { store } from '@/routes/password/confirm'; -import { Form, Head } from '@inertiajs/react'; export default function Create() { return ( diff --git a/resources/js/pages/user-password/create.tsx b/resources/js/pages/user-password/create.tsx index 1da3669e7..95f423cf0 100644 --- a/resources/js/pages/user-password/create.tsx +++ b/resources/js/pages/user-password/create.tsx @@ -1,3 +1,4 @@ +import { Form, Head } from '@inertiajs/react'; import InputError from '@/components/input-error'; import PasswordInput from '@/components/password-input'; import { Button } from '@/components/ui/button'; @@ -6,7 +7,6 @@ import { Label } from '@/components/ui/label'; import { Spinner } from '@/components/ui/spinner'; import AuthLayout from '@/layouts/auth-layout'; import { update } from '@/routes/password'; -import { Form, Head } from '@inertiajs/react'; type Props = { token: string; diff --git a/resources/js/pages/user-password/edit.tsx b/resources/js/pages/user-password/edit.tsx index 2c196b129..1b3747c8a 100644 --- a/resources/js/pages/user-password/edit.tsx +++ b/resources/js/pages/user-password/edit.tsx @@ -1,3 +1,6 @@ +import { Transition } from '@headlessui/react'; +import { Form, Head } from '@inertiajs/react'; +import { useRef } from 'react'; import UserPasswordController from '@/actions/App/Http/Controllers/UserPasswordController'; import Heading from '@/components/heading'; import InputError from '@/components/input-error'; @@ -8,9 +11,6 @@ import AppLayout from '@/layouts/app-layout'; import SettingsLayout from '@/layouts/settings/layout'; import { edit } from '@/routes/password'; import type { BreadcrumbItem } from '@/types'; -import { Transition } from '@headlessui/react'; -import { Form, Head } from '@inertiajs/react'; -import { useRef } from 'react'; const breadcrumbs: BreadcrumbItem[] = [ { diff --git a/resources/js/pages/user-profile/edit.tsx b/resources/js/pages/user-profile/edit.tsx index 81ba1c545..042ff4480 100644 --- a/resources/js/pages/user-profile/edit.tsx +++ b/resources/js/pages/user-profile/edit.tsx @@ -1,3 +1,5 @@ +import { Transition } from '@headlessui/react'; +import { Form, Head, Link, usePage } from '@inertiajs/react'; import UserProfileController from '@/actions/App/Http/Controllers/UserProfileController'; import DeleteUser from '@/components/delete-user'; import Heading from '@/components/heading'; @@ -10,8 +12,6 @@ import SettingsLayout from '@/layouts/settings/layout'; import { edit } from '@/routes/user-profile'; import { send } from '@/routes/verification'; import type { BreadcrumbItem } from '@/types'; -import { Transition } from '@headlessui/react'; -import { Form, Head, Link, usePage } from '@inertiajs/react'; const breadcrumbs: BreadcrumbItem[] = [ { diff --git a/resources/js/pages/user-two-factor-authentication-challenge/show.tsx b/resources/js/pages/user-two-factor-authentication-challenge/show.tsx index cdd6af308..1f5252b9b 100644 --- a/resources/js/pages/user-two-factor-authentication-challenge/show.tsx +++ b/resources/js/pages/user-two-factor-authentication-challenge/show.tsx @@ -1,3 +1,6 @@ +import { Form, Head } from '@inertiajs/react'; +import { REGEXP_ONLY_DIGITS } from 'input-otp'; +import { useMemo, useState } from 'react'; import InputError from '@/components/input-error'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; @@ -9,9 +12,6 @@ import { import { OTP_MAX_LENGTH } from '@/hooks/use-two-factor-auth'; import AuthLayout from '@/layouts/auth-layout'; import { store } from '@/routes/two-factor/login'; -import { Form, Head } from '@inertiajs/react'; -import { REGEXP_ONLY_DIGITS } from 'input-otp'; -import { useMemo, useState } from 'react'; export default function Show() { const [showRecoveryInput, setShowRecoveryInput] = useState(false); diff --git a/resources/js/pages/user-two-factor-authentication/show.tsx b/resources/js/pages/user-two-factor-authentication/show.tsx index 3f6096b85..a6228ddc2 100644 --- a/resources/js/pages/user-two-factor-authentication/show.tsx +++ b/resources/js/pages/user-two-factor-authentication/show.tsx @@ -1,3 +1,6 @@ +import { Form, Head } from '@inertiajs/react'; +import { ShieldCheck } from 'lucide-react'; +import { useState } from 'react'; import Heading from '@/components/heading'; import TwoFactorRecoveryCodes from '@/components/two-factor-recovery-codes'; import TwoFactorSetupModal from '@/components/two-factor-setup-modal'; @@ -7,9 +10,6 @@ import AppLayout from '@/layouts/app-layout'; import SettingsLayout from '@/layouts/settings/layout'; import { disable, enable, show } from '@/routes/two-factor'; import type { BreadcrumbItem } from '@/types'; -import { Form, Head } from '@inertiajs/react'; -import { ShieldCheck } from 'lucide-react'; -import { useState } from 'react'; type Props = { canManageTwoFactor?: boolean; diff --git a/resources/js/pages/user/create.tsx b/resources/js/pages/user/create.tsx index c0a3a897a..61254139f 100644 --- a/resources/js/pages/user/create.tsx +++ b/resources/js/pages/user/create.tsx @@ -1,3 +1,4 @@ +import { Form, Head } from '@inertiajs/react'; import InputError from '@/components/input-error'; import PasswordInput from '@/components/password-input'; import TextLink from '@/components/text-link'; @@ -8,7 +9,6 @@ import { Spinner } from '@/components/ui/spinner'; import AuthLayout from '@/layouts/auth-layout'; import { login } from '@/routes'; import { store } from '@/routes/register'; -import { Form, Head } from '@inertiajs/react'; export default function Register() { return ( diff --git a/resources/js/pages/welcome.tsx b/resources/js/pages/welcome.tsx index 7cdc1b15f..baebd3db7 100644 --- a/resources/js/pages/welcome.tsx +++ b/resources/js/pages/welcome.tsx @@ -1,5 +1,5 @@ -import { dashboard, login, register } from '@/routes'; import { Head, Link, usePage } from '@inertiajs/react'; +import { dashboard, login, register } from '@/routes'; export default function Welcome({ canRegister = true, diff --git a/resources/js/ssr.tsx b/resources/js/ssr.tsx index 98ecf01cf..bddcb8599 100644 --- a/resources/js/ssr.tsx +++ b/resources/js/ssr.tsx @@ -1,9 +1,9 @@ -import { TooltipProvider } from '@/components/ui/tooltip'; import { createInertiaApp } from '@inertiajs/react'; import createServer from '@inertiajs/react/server'; import { resolvePageComponent } from 'laravel-vite-plugin/inertia-helpers'; import type { ComponentType } from 'react'; import ReactDOMServer from 'react-dom/server'; +import { TooltipProvider } from '@/components/ui/tooltip'; const appName = import.meta.env.VITE_APP_NAME || 'Laravel'; diff --git a/resources/js/types/ui.ts b/resources/js/types/ui.ts index 8eaafe777..98e45be63 100644 --- a/resources/js/types/ui.ts +++ b/resources/js/types/ui.ts @@ -1,5 +1,5 @@ -import type { BreadcrumbItem } from '@/types/navigation'; import type { ReactNode } from 'react'; +import type { BreadcrumbItem } from '@/types/navigation'; export type AppLayoutProps = { children: ReactNode; diff --git a/vite.config.ts b/vite.config.ts index 2bed82904..e293182e1 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -39,7 +39,6 @@ export default defineConfig({ 'sibling', 'index', ], - internalPattern: [], // try clearing it newlinesBetween: false, }, ignorePatterns: [ From 615cc453eaeda65689b40db4b5a59b3afe8aeb1f Mon Sep 17 00:00:00 2001 From: Josh Donnell Date: Sat, 21 Mar 2026 13:22:18 +0000 Subject: [PATCH 17/19] fix: vite config post merge --- vite.config.ts | 24 +++++++----------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/vite.config.ts b/vite.config.ts index a16385627..47365e55c 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,8 +1,8 @@ -import { wayfinder } from '@laravel/vite-plugin-wayfinder'; +import {wayfinder} from '@laravel/vite-plugin-wayfinder'; import tailwindcss from '@tailwindcss/vite'; import react from '@vitejs/plugin-react'; import laravel from 'laravel-vite-plugin'; -import { defineConfig } from 'vite-plus'; +import {defineConfig} from 'vite-plus'; export default defineConfig({ lint: { @@ -41,20 +41,6 @@ export default defineConfig({ ], newlinesBetween: false, }, - ignorePatterns: [ - 'resources/js/components/ui/*', - 'resources/views/mail/*', - 'resources/js/actions/*', - 'resources/js/routes/*', - 'resources/js/wayfinder/*', - ], - functions: ["clsx", "cn"], - stylesheet: "resources/css/app.css", - }, - sortImports: { - groups: ["builtin", "external", "internal", "parent", "sibling", "index"], - newlinesBetween: false, - }, }, plugins: [ laravel({ @@ -62,7 +48,11 @@ export default defineConfig({ ssr: 'resources/js/ssr.tsx', refresh: true, }), - react(), + react({ + babel: { + plugins: ['babel-plugin-react-compiler'], + }, + }), tailwindcss(), wayfinder({ formVariants: true, From 12c25ffffb3b633524826c36ed53d395955dca47 Mon Sep 17 00:00:00 2001 From: Josh Donnell Date: Sat, 21 Mar 2026 13:27:47 +0000 Subject: [PATCH 18/19] fix: add ignore list --- vite.config.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/vite.config.ts b/vite.config.ts index 47365e55c..778044df4 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -41,6 +41,13 @@ export default defineConfig({ ], newlinesBetween: false, }, + ignorePatterns: [ + 'resources/js/components/ui/*', + 'resources/views/mail/*', + 'resources/js/actions/*', + 'resources/js/routes/*', + 'resources/js/wayfinder/*', + ], }, plugins: [ laravel({ From ed303751bd1fee9c3e264afbf4d323276d00d3ee Mon Sep 17 00:00:00 2001 From: Josh Donnell Date: Sat, 21 Mar 2026 13:30:17 +0000 Subject: [PATCH 19/19] fix: remove babel as no longer include in v6 vite plugin --- vite.config.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/vite.config.ts b/vite.config.ts index 778044df4..80ad237b0 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -55,11 +55,7 @@ export default defineConfig({ ssr: 'resources/js/ssr.tsx', refresh: true, }), - react({ - babel: { - plugins: ['babel-plugin-react-compiler'], - }, - }), + react(), tailwindcss(), wayfinder({ formVariants: true,