diff --git a/apps/dashboard/.gitignore b/apps/dashboard/.gitignore index 10872b8..58c155d 100644 --- a/apps/dashboard/.gitignore +++ b/apps/dashboard/.gitignore @@ -1,67 +1,68 @@ -# Generated by Cargo -# will have compiled files and executables -/target/ - -# Generated by Tauri -# will have schema files for capabilities auto-completion -/gen/schemas - - -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# next.js -/.next/ -/out/ - -# production -/build - -# misc -.DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# local env files -.env*.local -.env - -# vercel -.vercel - -# typescript -*.tsbuildinfo -next-env.d.ts - -# Generated by Cargo -# will have compiled files and executables -debug -target - -# These are backup files generated by rustfmt -**/*.rs.bk - -# MSVC Windows builds of rustc generate these, which store debugging information -*.pdb - -# Generated by cargo mutants -# Contains mutation testing data -**/mutants.out*/ - -# RustRover -# JetBrains specific template is maintained in a separate JetBrains.gitignore that can -# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore -# and can be added to the global gitignore or merged into this file. For a more nuclear -# option (not recommended) you can uncomment the following to ignore the entire idea folder. -#.idea/ \ No newline at end of file +# Generated by Cargo +# will have compiled files and executables +/target/ + +# Generated by Tauri +# will have schema files for capabilities auto-completion +/gen/schemas + + +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ +/dist/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local +.env + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +# Generated by Cargo +# will have compiled files and executables +debug +target + +# These are backup files generated by rustfmt +**/*.rs.bk + +# MSVC Windows builds of rustc generate these, which store debugging information +*.pdb + +# Generated by cargo mutants +# Contains mutation testing data +**/mutants.out*/ + +# RustRover +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea \ No newline at end of file diff --git a/apps/dashboard/components.json b/apps/dashboard/components.json index 4ee62ee..ec3a5d5 100644 --- a/apps/dashboard/components.json +++ b/apps/dashboard/components.json @@ -1,11 +1,11 @@ { "$schema": "https://ui.shadcn.com/schema.json", "style": "new-york", - "rsc": true, + "rsc": false, "tsx": true, "tailwind": { "config": "", - "css": "app/globals.css", + "css": "src/globals.css", "baseColor": "neutral", "cssVariables": true, "prefix": "" diff --git a/apps/dashboard/index.html b/apps/dashboard/index.html new file mode 100644 index 0000000..630e2bf --- /dev/null +++ b/apps/dashboard/index.html @@ -0,0 +1,17 @@ + + + + + + + + + + + Mind & Body - Admin Dashboard + + +
+ + + diff --git a/apps/dashboard/next.config.mjs b/apps/dashboard/next.config.mjs deleted file mode 100644 index 7939535..0000000 --- a/apps/dashboard/next.config.mjs +++ /dev/null @@ -1,19 +0,0 @@ -const isProd = process.env.NODE_ENV === "production"; - -const internalHost = process.env.TAURI_DEV_HOST || "localhost"; - -/** @type {import('next').NextConfig} */ -const nextConfig = { - // Ensure Next.js uses SSG instead of SSR - // https://nextjs.org/docs/pages/building-your-application/deploying/static-exports - output: "export", - // Note: This feature is required to use the Next.js Image component in SSG mode. - // See https://nextjs.org/docs/messages/export-image-api for different workarounds. - images: { - unoptimized: true, - }, - // Configure assetPrefix or else the server won't properly resolve your assets. - assetPrefix: isProd ? undefined : `http://${internalHost}:3000`, -}; - -export default nextConfig; diff --git a/apps/dashboard/package.json b/apps/dashboard/package.json index 55219ce..0a6a2eb 100644 --- a/apps/dashboard/package.json +++ b/apps/dashboard/package.json @@ -4,16 +4,17 @@ "version": "0.1.0", "type": "module", "scripts": { - "dev": "next dev", + "dev": "vite", "dev:tauri": "tauri dev", - "build": "next build", + "build": "vite build", + "preview": "vite preview", "tauri": "tauri", "lint": "eslint src/", "typecheck": "tsc --noEmit" }, "dependencies": { "@hookform/resolvers": "^5.4.0", - "@vercel/analytics": "2.0.1", + "@tanstack/react-router": "^1.114.3", "@radix-ui/react-accordion": "1.2.12", "@radix-ui/react-alert-dialog": "1.1.15", "@radix-ui/react-aspect-ratio": "1.1.8", @@ -49,7 +50,6 @@ "embla-carousel-react": "8.6.0", "input-otp": "1.4.2", "lucide-react": "^1.16.0", - "next": "16.2.6", "next-themes": "^0.4.6", "react": "^19", "react-day-picker": "10.0.1", @@ -66,13 +66,16 @@ }, "devDependencies": { "@tailwindcss/postcss": "^4.3.0", + "@tanstack/router-plugin": "^1.114.3", "@types/node": "^25", "@types/react": "^19", "@types/react-dom": "^19", + "@vitejs/plugin-react": "^4.3.4", "postcss": "^8.5", "tailwindcss": "^4.3.0", "tw-animate-css": "1.4.0", "typescript": "6.0.3", + "vite": "^6.1.0", "@tauri-apps/cli": "^2" } } diff --git a/apps/dashboard/src-tauri/tauri.conf.json b/apps/dashboard/src-tauri/tauri.conf.json index d7e7d5f..ce37094 100644 --- a/apps/dashboard/src-tauri/tauri.conf.json +++ b/apps/dashboard/src-tauri/tauri.conf.json @@ -7,7 +7,7 @@ "beforeDevCommand": "pnpm dev", "devUrl": "http://localhost:3000", "beforeBuildCommand": "pnpm build", - "frontendDist": "../out" + "frontendDist": "../dist" }, "app": { "windows": [ diff --git a/apps/dashboard/src/app/globals.css b/apps/dashboard/src/app/globals.css deleted file mode 100644 index 11978f7..0000000 --- a/apps/dashboard/src/app/globals.css +++ /dev/null @@ -1,137 +0,0 @@ -@import 'tailwindcss'; -@import 'tw-animate-css'; - -@custom-variant dark (&:is(.dark *)); - -:root { - --background: oklch(0.13 0.005 260); - --foreground: oklch(0.97 0 0); - --card: oklch(0.17 0.005 260); - --card-foreground: oklch(0.97 0 0); - --popover: oklch(0.17 0.005 260); - --popover-foreground: oklch(0.97 0 0); - --primary: oklch(0.85 0.18 85); - --primary-foreground: oklch(0.13 0.005 260); - --secondary: oklch(0.22 0.005 260); - --secondary-foreground: oklch(0.97 0 0); - --muted: oklch(0.22 0.005 260); - --muted-foreground: oklch(0.65 0 0); - --accent: oklch(0.85 0.18 85); - --accent-foreground: oklch(0.13 0.005 260); - --destructive: oklch(0.55 0.22 25); - --destructive-foreground: oklch(0.97 0 0); - --success: oklch(0.72 0.19 145); - --success-foreground: oklch(0.13 0.005 260); - --warning: oklch(0.75 0.15 55); - --warning-foreground: oklch(0.13 0.005 260); - --border: oklch(0.28 0.005 260); - --input: oklch(0.22 0.005 260); - --ring: oklch(0.85 0.18 85); - --chart-1: oklch(0.85 0.18 85); - --chart-2: oklch(0.72 0.19 145); - --chart-3: oklch(0.65 0.2 260); - --chart-4: oklch(0.75 0.15 55); - --chart-5: oklch(0.55 0.22 25); - --radius: 0.75rem; - --sidebar: oklch(0.10 0.005 260); - --sidebar-foreground: oklch(0.97 0 0); - --sidebar-primary: oklch(0.85 0.18 85); - --sidebar-primary-foreground: oklch(0.13 0.005 260); - --sidebar-accent: oklch(0.20 0.005 260); - --sidebar-accent-foreground: oklch(0.97 0 0); - --sidebar-border: oklch(0.25 0.005 260); - --sidebar-ring: oklch(0.85 0.18 85); -} - -.dark { - --background: oklch(0.13 0.005 260); - --foreground: oklch(0.97 0 0); - --card: oklch(0.17 0.005 260); - --card-foreground: oklch(0.97 0 0); - --popover: oklch(0.17 0.005 260); - --popover-foreground: oklch(0.97 0 0); - --primary: oklch(0.85 0.18 85); - --primary-foreground: oklch(0.13 0.005 260); - --secondary: oklch(0.22 0.005 260); - --secondary-foreground: oklch(0.97 0 0); - --muted: oklch(0.22 0.005 260); - --muted-foreground: oklch(0.65 0 0); - --accent: oklch(0.85 0.18 85); - --accent-foreground: oklch(0.13 0.005 260); - --destructive: oklch(0.55 0.22 25); - --destructive-foreground: oklch(0.97 0 0); - --success: oklch(0.72 0.19 145); - --success-foreground: oklch(0.13 0.005 260); - --warning: oklch(0.75 0.15 55); - --warning-foreground: oklch(0.13 0.005 260); - --border: oklch(0.28 0.005 260); - --input: oklch(0.22 0.005 260); - --ring: oklch(0.85 0.18 85); - --chart-1: oklch(0.85 0.18 85); - --chart-2: oklch(0.72 0.19 145); - --chart-3: oklch(0.65 0.2 260); - --chart-4: oklch(0.75 0.15 55); - --chart-5: oklch(0.55 0.22 25); - --sidebar: oklch(0.10 0.005 260); - --sidebar-foreground: oklch(0.97 0 0); - --sidebar-primary: oklch(0.85 0.18 85); - --sidebar-primary-foreground: oklch(0.13 0.005 260); - --sidebar-accent: oklch(0.20 0.005 260); - --sidebar-accent-foreground: oklch(0.97 0 0); - --sidebar-border: oklch(0.25 0.005 260); - --sidebar-ring: oklch(0.85 0.18 85); -} - -@theme inline { - --font-sans: 'Geist', 'Geist Fallback'; - --font-mono: 'Geist Mono', 'Geist Mono Fallback'; - --color-background: var(--background); - --color-foreground: var(--foreground); - --color-card: var(--card); - --color-card-foreground: var(--card-foreground); - --color-popover: var(--popover); - --color-popover-foreground: var(--popover-foreground); - --color-primary: var(--primary); - --color-primary-foreground: var(--primary-foreground); - --color-secondary: var(--secondary); - --color-secondary-foreground: var(--secondary-foreground); - --color-muted: var(--muted); - --color-muted-foreground: var(--muted-foreground); - --color-accent: var(--accent); - --color-accent-foreground: var(--accent-foreground); - --color-destructive: var(--destructive); - --color-destructive-foreground: var(--destructive-foreground); - --color-success: var(--success); - --color-success-foreground: var(--success-foreground); - --color-warning: var(--warning); - --color-warning-foreground: var(--warning-foreground); - --color-border: var(--border); - --color-input: var(--input); - --color-ring: var(--ring); - --color-chart-1: var(--chart-1); - --color-chart-2: var(--chart-2); - --color-chart-3: var(--chart-3); - --color-chart-4: var(--chart-4); - --color-chart-5: var(--chart-5); - --radius-sm: calc(var(--radius) - 4px); - --radius-md: calc(var(--radius) - 2px); - --radius-lg: var(--radius); - --radius-xl: calc(var(--radius) + 4px); - --color-sidebar: var(--sidebar); - --color-sidebar-foreground: var(--sidebar-foreground); - --color-sidebar-primary: var(--sidebar-primary); - --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); - --color-sidebar-accent: var(--sidebar-accent); - --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); - --color-sidebar-border: var(--sidebar-border); - --color-sidebar-ring: var(--sidebar-ring); -} - -@layer base { - * { - @apply border-border outline-ring/50; - } - body { - @apply bg-background text-foreground; - } -} diff --git a/apps/dashboard/src/app/layout.tsx b/apps/dashboard/src/app/layout.tsx deleted file mode 100644 index b04ded4..0000000 --- a/apps/dashboard/src/app/layout.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import type { Metadata } from 'next'; -import { Analytics } from '@vercel/analytics/next'; -import { Toaster } from 'sonner'; -import './globals.css'; - -export const metadata: Metadata = { - title: 'Mind & Body - Admin Dashboard', - description: 'Sistema de administración para gimnasio Mind & Body', - generator: 'v0.app', - icons: { - icon: [ - { - url: '/icon-light-32x32.png', - media: '(prefers-color-scheme: light)', - }, - { - url: '/icon-dark-32x32.png', - media: '(prefers-color-scheme: dark)', - }, - { - url: '/icon.svg', - type: 'image/svg+xml', - }, - ], - apple: '/apple-icon.png', - }, -}; - -export default function RootLayout({ - children, -}: Readonly<{ - children: React.ReactNode; -}>) { - return ( - - - {children} - - {process.env.NODE_ENV === 'production' && } - - - ); -} diff --git a/apps/dashboard/src/globals.css b/apps/dashboard/src/globals.css index dc2aea1..11978f7 100644 --- a/apps/dashboard/src/globals.css +++ b/apps/dashboard/src/globals.css @@ -4,74 +4,82 @@ @custom-variant dark (&:is(.dark *)); :root { - --background: oklch(1 0 0); - --foreground: oklch(0.145 0 0); - --card: oklch(1 0 0); - --card-foreground: oklch(0.145 0 0); - --popover: oklch(1 0 0); - --popover-foreground: oklch(0.145 0 0); - --primary: oklch(0.205 0 0); - --primary-foreground: oklch(0.985 0 0); - --secondary: oklch(0.97 0 0); - --secondary-foreground: oklch(0.205 0 0); - --muted: oklch(0.97 0 0); - --muted-foreground: oklch(0.556 0 0); - --accent: oklch(0.97 0 0); - --accent-foreground: oklch(0.205 0 0); - --destructive: oklch(0.577 0.245 27.325); - --destructive-foreground: oklch(0.577 0.245 27.325); - --border: oklch(0.922 0 0); - --input: oklch(0.922 0 0); - --ring: oklch(0.708 0 0); - --chart-1: oklch(0.646 0.222 41.116); - --chart-2: oklch(0.6 0.118 184.704); - --chart-3: oklch(0.398 0.07 227.392); - --chart-4: oklch(0.828 0.189 84.429); - --chart-5: oklch(0.769 0.188 70.08); - --radius: 0.625rem; - --sidebar: oklch(0.985 0 0); - --sidebar-foreground: oklch(0.145 0 0); - --sidebar-primary: oklch(0.205 0 0); - --sidebar-primary-foreground: oklch(0.985 0 0); - --sidebar-accent: oklch(0.97 0 0); - --sidebar-accent-foreground: oklch(0.205 0 0); - --sidebar-border: oklch(0.922 0 0); - --sidebar-ring: oklch(0.708 0 0); + --background: oklch(0.13 0.005 260); + --foreground: oklch(0.97 0 0); + --card: oklch(0.17 0.005 260); + --card-foreground: oklch(0.97 0 0); + --popover: oklch(0.17 0.005 260); + --popover-foreground: oklch(0.97 0 0); + --primary: oklch(0.85 0.18 85); + --primary-foreground: oklch(0.13 0.005 260); + --secondary: oklch(0.22 0.005 260); + --secondary-foreground: oklch(0.97 0 0); + --muted: oklch(0.22 0.005 260); + --muted-foreground: oklch(0.65 0 0); + --accent: oklch(0.85 0.18 85); + --accent-foreground: oklch(0.13 0.005 260); + --destructive: oklch(0.55 0.22 25); + --destructive-foreground: oklch(0.97 0 0); + --success: oklch(0.72 0.19 145); + --success-foreground: oklch(0.13 0.005 260); + --warning: oklch(0.75 0.15 55); + --warning-foreground: oklch(0.13 0.005 260); + --border: oklch(0.28 0.005 260); + --input: oklch(0.22 0.005 260); + --ring: oklch(0.85 0.18 85); + --chart-1: oklch(0.85 0.18 85); + --chart-2: oklch(0.72 0.19 145); + --chart-3: oklch(0.65 0.2 260); + --chart-4: oklch(0.75 0.15 55); + --chart-5: oklch(0.55 0.22 25); + --radius: 0.75rem; + --sidebar: oklch(0.10 0.005 260); + --sidebar-foreground: oklch(0.97 0 0); + --sidebar-primary: oklch(0.85 0.18 85); + --sidebar-primary-foreground: oklch(0.13 0.005 260); + --sidebar-accent: oklch(0.20 0.005 260); + --sidebar-accent-foreground: oklch(0.97 0 0); + --sidebar-border: oklch(0.25 0.005 260); + --sidebar-ring: oklch(0.85 0.18 85); } .dark { - --background: oklch(0.145 0 0); - --foreground: oklch(0.985 0 0); - --card: oklch(0.145 0 0); - --card-foreground: oklch(0.985 0 0); - --popover: oklch(0.145 0 0); - --popover-foreground: oklch(0.985 0 0); - --primary: oklch(0.985 0 0); - --primary-foreground: oklch(0.205 0 0); - --secondary: oklch(0.269 0 0); - --secondary-foreground: oklch(0.985 0 0); - --muted: oklch(0.269 0 0); - --muted-foreground: oklch(0.708 0 0); - --accent: oklch(0.269 0 0); - --accent-foreground: oklch(0.985 0 0); - --destructive: oklch(0.396 0.141 25.723); - --destructive-foreground: oklch(0.637 0.237 25.331); - --border: oklch(0.269 0 0); - --input: oklch(0.269 0 0); - --ring: oklch(0.439 0 0); - --chart-1: oklch(0.488 0.243 264.376); - --chart-2: oklch(0.696 0.17 162.48); - --chart-3: oklch(0.769 0.188 70.08); - --chart-4: oklch(0.627 0.265 303.9); - --chart-5: oklch(0.645 0.246 16.439); - --sidebar: oklch(0.205 0 0); - --sidebar-foreground: oklch(0.985 0 0); - --sidebar-primary: oklch(0.488 0.243 264.376); - --sidebar-primary-foreground: oklch(0.985 0 0); - --sidebar-accent: oklch(0.269 0 0); - --sidebar-accent-foreground: oklch(0.985 0 0); - --sidebar-border: oklch(0.269 0 0); - --sidebar-ring: oklch(0.439 0 0); + --background: oklch(0.13 0.005 260); + --foreground: oklch(0.97 0 0); + --card: oklch(0.17 0.005 260); + --card-foreground: oklch(0.97 0 0); + --popover: oklch(0.17 0.005 260); + --popover-foreground: oklch(0.97 0 0); + --primary: oklch(0.85 0.18 85); + --primary-foreground: oklch(0.13 0.005 260); + --secondary: oklch(0.22 0.005 260); + --secondary-foreground: oklch(0.97 0 0); + --muted: oklch(0.22 0.005 260); + --muted-foreground: oklch(0.65 0 0); + --accent: oklch(0.85 0.18 85); + --accent-foreground: oklch(0.13 0.005 260); + --destructive: oklch(0.55 0.22 25); + --destructive-foreground: oklch(0.97 0 0); + --success: oklch(0.72 0.19 145); + --success-foreground: oklch(0.13 0.005 260); + --warning: oklch(0.75 0.15 55); + --warning-foreground: oklch(0.13 0.005 260); + --border: oklch(0.28 0.005 260); + --input: oklch(0.22 0.005 260); + --ring: oklch(0.85 0.18 85); + --chart-1: oklch(0.85 0.18 85); + --chart-2: oklch(0.72 0.19 145); + --chart-3: oklch(0.65 0.2 260); + --chart-4: oklch(0.75 0.15 55); + --chart-5: oklch(0.55 0.22 25); + --sidebar: oklch(0.10 0.005 260); + --sidebar-foreground: oklch(0.97 0 0); + --sidebar-primary: oklch(0.85 0.18 85); + --sidebar-primary-foreground: oklch(0.13 0.005 260); + --sidebar-accent: oklch(0.20 0.005 260); + --sidebar-accent-foreground: oklch(0.97 0 0); + --sidebar-border: oklch(0.25 0.005 260); + --sidebar-ring: oklch(0.85 0.18 85); } @theme inline { @@ -93,6 +101,10 @@ --color-accent-foreground: var(--accent-foreground); --color-destructive: var(--destructive); --color-destructive-foreground: var(--destructive-foreground); + --color-success: var(--success); + --color-success-foreground: var(--success-foreground); + --color-warning: var(--warning); + --color-warning-foreground: var(--warning-foreground); --color-border: var(--border); --color-input: var(--input); --color-ring: var(--ring); diff --git a/apps/dashboard/src/index.html b/apps/dashboard/src/index.html deleted file mode 100644 index ff93803..0000000 --- a/apps/dashboard/src/index.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - Tauri + React + Typescript - - - -
- - - diff --git a/apps/dashboard/src/main.tsx b/apps/dashboard/src/main.tsx new file mode 100644 index 0000000..46e6dc3 --- /dev/null +++ b/apps/dashboard/src/main.tsx @@ -0,0 +1,22 @@ +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; +import { RouterProvider, createRouter } from '@tanstack/react-router'; + +import { routeTree } from './routeTree.gen'; +import './globals.css'; + +const router = createRouter({ + routeTree, + defaultPreload: 'intent', + scrollRestoration: true, +}); + +const rootElement = document.getElementById('root')!; + +if (!rootElement.innerHTML) { + createRoot(rootElement).render( + + + , + ); +} diff --git a/apps/dashboard/src/routeTree.gen.ts b/apps/dashboard/src/routeTree.gen.ts new file mode 100644 index 0000000..6e7d138 --- /dev/null +++ b/apps/dashboard/src/routeTree.gen.ts @@ -0,0 +1,239 @@ +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file was automatically generated by TanStack Router. +// You should NOT make any changes in this file as it will be overwritten. +// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. + +import { Route as rootRouteImport } from './routes/__root'; +import { Route as DashboardRouteRouteImport } from './routes/dashboard/route'; +import { Route as IndexRouteImport } from './routes/index'; +import { Route as DashboardIndexRouteImport } from './routes/dashboard/index'; +import { Route as DashboardUsersRouteImport } from './routes/dashboard/users'; +import { Route as DashboardSettingsRouteImport } from './routes/dashboard/settings'; +import { Route as DashboardReportsRouteImport } from './routes/dashboard/reports'; +import { Route as DashboardCatalogRouteImport } from './routes/dashboard/catalog'; +import { Route as DashboardBackupsRouteImport } from './routes/dashboard/backups'; +import { Route as DashboardAuditRouteImport } from './routes/dashboard/audit'; + +const DashboardRouteRoute = DashboardRouteRouteImport.update({ + id: '/dashboard', + path: '/dashboard', + getParentRoute: () => rootRouteImport, +} as any); +const IndexRoute = IndexRouteImport.update({ + id: '/', + path: '/', + getParentRoute: () => rootRouteImport, +} as any); +const DashboardIndexRoute = DashboardIndexRouteImport.update({ + id: '/', + path: '/', + getParentRoute: () => DashboardRouteRoute, +} as any); +const DashboardUsersRoute = DashboardUsersRouteImport.update({ + id: '/users', + path: '/users', + getParentRoute: () => DashboardRouteRoute, +} as any); +const DashboardSettingsRoute = DashboardSettingsRouteImport.update({ + id: '/settings', + path: '/settings', + getParentRoute: () => DashboardRouteRoute, +} as any); +const DashboardReportsRoute = DashboardReportsRouteImport.update({ + id: '/reports', + path: '/reports', + getParentRoute: () => DashboardRouteRoute, +} as any); +const DashboardCatalogRoute = DashboardCatalogRouteImport.update({ + id: '/catalog', + path: '/catalog', + getParentRoute: () => DashboardRouteRoute, +} as any); +const DashboardBackupsRoute = DashboardBackupsRouteImport.update({ + id: '/backups', + path: '/backups', + getParentRoute: () => DashboardRouteRoute, +} as any); +const DashboardAuditRoute = DashboardAuditRouteImport.update({ + id: '/audit', + path: '/audit', + getParentRoute: () => DashboardRouteRoute, +} as any); + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute; + '/dashboard': typeof DashboardRouteRouteWithChildren; + '/dashboard/audit': typeof DashboardAuditRoute; + '/dashboard/backups': typeof DashboardBackupsRoute; + '/dashboard/catalog': typeof DashboardCatalogRoute; + '/dashboard/reports': typeof DashboardReportsRoute; + '/dashboard/settings': typeof DashboardSettingsRoute; + '/dashboard/users': typeof DashboardUsersRoute; + '/dashboard/': typeof DashboardIndexRoute; +} +export interface FileRoutesByTo { + '/': typeof IndexRoute; + '/dashboard/audit': typeof DashboardAuditRoute; + '/dashboard/backups': typeof DashboardBackupsRoute; + '/dashboard/catalog': typeof DashboardCatalogRoute; + '/dashboard/reports': typeof DashboardReportsRoute; + '/dashboard/settings': typeof DashboardSettingsRoute; + '/dashboard/users': typeof DashboardUsersRoute; + '/dashboard': typeof DashboardIndexRoute; +} +export interface FileRoutesById { + __root__: typeof rootRouteImport; + '/': typeof IndexRoute; + '/dashboard': typeof DashboardRouteRouteWithChildren; + '/dashboard/audit': typeof DashboardAuditRoute; + '/dashboard/backups': typeof DashboardBackupsRoute; + '/dashboard/catalog': typeof DashboardCatalogRoute; + '/dashboard/reports': typeof DashboardReportsRoute; + '/dashboard/settings': typeof DashboardSettingsRoute; + '/dashboard/users': typeof DashboardUsersRoute; + '/dashboard/': typeof DashboardIndexRoute; +} +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath; + fullPaths: + | '/' + | '/dashboard' + | '/dashboard/audit' + | '/dashboard/backups' + | '/dashboard/catalog' + | '/dashboard/reports' + | '/dashboard/settings' + | '/dashboard/users' + | '/dashboard/'; + fileRoutesByTo: FileRoutesByTo; + to: + | '/' + | '/dashboard/audit' + | '/dashboard/backups' + | '/dashboard/catalog' + | '/dashboard/reports' + | '/dashboard/settings' + | '/dashboard/users' + | '/dashboard'; + id: + | '__root__' + | '/' + | '/dashboard' + | '/dashboard/audit' + | '/dashboard/backups' + | '/dashboard/catalog' + | '/dashboard/reports' + | '/dashboard/settings' + | '/dashboard/users' + | '/dashboard/'; + fileRoutesById: FileRoutesById; +} +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute; + DashboardRouteRoute: typeof DashboardRouteRouteWithChildren; +} + +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/dashboard': { + id: '/dashboard'; + path: '/dashboard'; + fullPath: '/dashboard'; + preLoaderRoute: typeof DashboardRouteRouteImport; + parentRoute: typeof rootRouteImport; + }; + '/': { + id: '/'; + path: '/'; + fullPath: '/'; + preLoaderRoute: typeof IndexRouteImport; + parentRoute: typeof rootRouteImport; + }; + '/dashboard/': { + id: '/dashboard/'; + path: '/'; + fullPath: '/dashboard/'; + preLoaderRoute: typeof DashboardIndexRouteImport; + parentRoute: typeof DashboardRouteRoute; + }; + '/dashboard/users': { + id: '/dashboard/users'; + path: '/users'; + fullPath: '/dashboard/users'; + preLoaderRoute: typeof DashboardUsersRouteImport; + parentRoute: typeof DashboardRouteRoute; + }; + '/dashboard/settings': { + id: '/dashboard/settings'; + path: '/settings'; + fullPath: '/dashboard/settings'; + preLoaderRoute: typeof DashboardSettingsRouteImport; + parentRoute: typeof DashboardRouteRoute; + }; + '/dashboard/reports': { + id: '/dashboard/reports'; + path: '/reports'; + fullPath: '/dashboard/reports'; + preLoaderRoute: typeof DashboardReportsRouteImport; + parentRoute: typeof DashboardRouteRoute; + }; + '/dashboard/catalog': { + id: '/dashboard/catalog'; + path: '/catalog'; + fullPath: '/dashboard/catalog'; + preLoaderRoute: typeof DashboardCatalogRouteImport; + parentRoute: typeof DashboardRouteRoute; + }; + '/dashboard/backups': { + id: '/dashboard/backups'; + path: '/backups'; + fullPath: '/dashboard/backups'; + preLoaderRoute: typeof DashboardBackupsRouteImport; + parentRoute: typeof DashboardRouteRoute; + }; + '/dashboard/audit': { + id: '/dashboard/audit'; + path: '/audit'; + fullPath: '/dashboard/audit'; + preLoaderRoute: typeof DashboardAuditRouteImport; + parentRoute: typeof DashboardRouteRoute; + }; + } +} + +interface DashboardRouteRouteChildren { + DashboardAuditRoute: typeof DashboardAuditRoute; + DashboardBackupsRoute: typeof DashboardBackupsRoute; + DashboardCatalogRoute: typeof DashboardCatalogRoute; + DashboardReportsRoute: typeof DashboardReportsRoute; + DashboardSettingsRoute: typeof DashboardSettingsRoute; + DashboardUsersRoute: typeof DashboardUsersRoute; + DashboardIndexRoute: typeof DashboardIndexRoute; +} + +const DashboardRouteRouteChildren: DashboardRouteRouteChildren = { + DashboardAuditRoute: DashboardAuditRoute, + DashboardBackupsRoute: DashboardBackupsRoute, + DashboardCatalogRoute: DashboardCatalogRoute, + DashboardReportsRoute: DashboardReportsRoute, + DashboardSettingsRoute: DashboardSettingsRoute, + DashboardUsersRoute: DashboardUsersRoute, + DashboardIndexRoute: DashboardIndexRoute, +}; + +const DashboardRouteRouteWithChildren = DashboardRouteRoute._addFileChildren( + DashboardRouteRouteChildren, +); + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + DashboardRouteRoute: DashboardRouteRouteWithChildren, +}; +export const routeTree = rootRouteImport + ._addFileChildren(rootRouteChildren) + ._addFileTypes(); diff --git a/apps/dashboard/src/routes/__root.tsx b/apps/dashboard/src/routes/__root.tsx new file mode 100644 index 0000000..8569421 --- /dev/null +++ b/apps/dashboard/src/routes/__root.tsx @@ -0,0 +1,24 @@ +import { createRootRoute, Outlet } from '@tanstack/react-router'; +import { Toaster } from 'sonner'; + +export const Route = createRootRoute({ + component: RootComponent, +}); + +function RootComponent() { + return ( + <> + + + + ); +} diff --git a/apps/dashboard/src/app/(dashboard)/dashboard/audit/page.tsx b/apps/dashboard/src/routes/dashboard/audit.tsx similarity index 98% rename from apps/dashboard/src/app/(dashboard)/dashboard/audit/page.tsx rename to apps/dashboard/src/routes/dashboard/audit.tsx index fa39ede..a4b1634 100644 --- a/apps/dashboard/src/app/(dashboard)/dashboard/audit/page.tsx +++ b/apps/dashboard/src/routes/dashboard/audit.tsx @@ -1,5 +1,4 @@ -'use client'; - +import { createFileRoute } from '@tanstack/react-router'; import { useState, useMemo, useEffect } from 'react'; import { DashboardHeader } from '@/src/features/dashboard/components/dashboard-header'; import { PageHeader } from '@/src/shared/components/page-header'; @@ -25,7 +24,12 @@ const actionColors: Record = { BACKUP: 'bg-muted text-muted-foreground border-muted-foreground/30', }; -export default function AuditPage() { + +export const Route = createFileRoute('/dashboard/audit')({ + component: AuditPage, +}); + +function AuditPage() { const [users, setUsers] = useState([]); const [search, setSearch] = useState(''); const [userFilter, setUserFilter] = useState('all'); diff --git a/apps/dashboard/src/app/(dashboard)/dashboard/backups/page.tsx b/apps/dashboard/src/routes/dashboard/backups.tsx similarity index 99% rename from apps/dashboard/src/app/(dashboard)/dashboard/backups/page.tsx rename to apps/dashboard/src/routes/dashboard/backups.tsx index 7a6722e..4db48dc 100644 --- a/apps/dashboard/src/app/(dashboard)/dashboard/backups/page.tsx +++ b/apps/dashboard/src/routes/dashboard/backups.tsx @@ -1,5 +1,4 @@ -'use client'; - +import { createFileRoute } from '@tanstack/react-router'; import { useState, useRef } from 'react'; import { DashboardHeader } from '@/src/features/dashboard/components/dashboard-header'; import { PageHeader } from '@/src/shared/components/page-header'; @@ -26,7 +25,12 @@ import { import { mockBackups, type Backup } from '@/src/shared/lib/mock-data'; import { toast } from 'sonner'; -export default function BackupsPage() { + +export const Route = createFileRoute('/dashboard/backups')({ + component: BackupsPage, +}); + +function BackupsPage() { const [backups, setBackups] = useState(mockBackups); const [generating, setGenerating] = useState(false); const [progress, setProgress] = useState(0); diff --git a/apps/dashboard/src/app/(dashboard)/dashboard/catalog/page.tsx b/apps/dashboard/src/routes/dashboard/catalog.tsx similarity index 98% rename from apps/dashboard/src/app/(dashboard)/dashboard/catalog/page.tsx rename to apps/dashboard/src/routes/dashboard/catalog.tsx index adc078a..0d678fa 100644 --- a/apps/dashboard/src/app/(dashboard)/dashboard/catalog/page.tsx +++ b/apps/dashboard/src/routes/dashboard/catalog.tsx @@ -1,5 +1,4 @@ -'use client'; - +import { createFileRoute } from '@tanstack/react-router'; import { useState, useMemo } from 'react'; import { DashboardHeader } from '@/src/features/dashboard/components/dashboard-header'; import { PageHeader } from '@/src/shared/components/page-header'; @@ -34,7 +33,12 @@ const typeColors: Record = { service: 'bg-chart-3/20 text-chart-3 border-chart-3/30', }; -export default function CatalogPage() { + +export const Route = createFileRoute('/dashboard/catalog')({ + component: CatalogPage, +}); + +function CatalogPage() { const [items, setItems] = useState(mockCatalogItems); const [search, setSearch] = useState(''); const [activeTab, setActiveTab] = useState('all'); diff --git a/apps/dashboard/src/app/(dashboard)/dashboard/page.tsx b/apps/dashboard/src/routes/dashboard/index.tsx similarity index 92% rename from apps/dashboard/src/app/(dashboard)/dashboard/page.tsx rename to apps/dashboard/src/routes/dashboard/index.tsx index ca2816e..35773eb 100644 --- a/apps/dashboard/src/app/(dashboard)/dashboard/page.tsx +++ b/apps/dashboard/src/routes/dashboard/index.tsx @@ -1,3 +1,4 @@ +import { createFileRoute } from '@tanstack/react-router'; import { DashboardHeader } from '@/src/features/dashboard/components/dashboard-header'; import { PageHeader } from '@/src/shared/components/page-header'; import { KPICard } from '@/src/shared/components/kpi-card'; @@ -10,7 +11,11 @@ import { } from '@/src/features/dashboard/components/dashboard-charts'; import { mockKPIs } from '@/src/shared/lib/mock-data'; -export default function DashboardPage() { +export const Route = createFileRoute('/dashboard/')({ + component: DashboardPage, +}); + +function DashboardPage() { return ( <> diff --git a/apps/dashboard/src/app/(dashboard)/dashboard/reports/page.tsx b/apps/dashboard/src/routes/dashboard/reports.tsx similarity index 99% rename from apps/dashboard/src/app/(dashboard)/dashboard/reports/page.tsx rename to apps/dashboard/src/routes/dashboard/reports.tsx index 8cca515..ecf3704 100644 --- a/apps/dashboard/src/app/(dashboard)/dashboard/reports/page.tsx +++ b/apps/dashboard/src/routes/dashboard/reports.tsx @@ -1,5 +1,4 @@ -'use client'; - +import { createFileRoute } from '@tanstack/react-router'; import { useState } from 'react'; import { DashboardHeader } from '@/src/features/dashboard/components/dashboard-header'; import { PageHeader } from '@/src/shared/components/page-header'; @@ -20,7 +19,12 @@ import { } from '@/src/shared/lib/mock-data'; import { toast } from 'sonner'; -export default function ReportsPage() { + +export const Route = createFileRoute('/dashboard/reports')({ + component: ReportsPage, +}); + +function ReportsPage() { const [selectedReport, setSelectedReport] = useState(''); const [dateFrom, setDateFrom] = useState(''); const [dateTo, setDateTo] = useState(''); diff --git a/apps/dashboard/src/app/(dashboard)/layout.tsx b/apps/dashboard/src/routes/dashboard/route.tsx similarity index 56% rename from apps/dashboard/src/app/(dashboard)/layout.tsx rename to apps/dashboard/src/routes/dashboard/route.tsx index 932e1ed..ebcfac1 100644 --- a/apps/dashboard/src/app/(dashboard)/layout.tsx +++ b/apps/dashboard/src/routes/dashboard/route.tsx @@ -1,11 +1,18 @@ +import { createFileRoute, Outlet } from '@tanstack/react-router'; import { SidebarProvider, SidebarInset } from '@/components/ui/sidebar'; import { AppSidebar } from '@/src/features/dashboard/components/app-sidebar'; -export default function DashboardLayout({ children }: { children: React.ReactNode }) { +export const Route = createFileRoute('/dashboard')({ + component: DashboardLayout, +}); + +function DashboardLayout() { return ( - {children} + + + ); } diff --git a/apps/dashboard/src/app/(dashboard)/dashboard/settings/page.tsx b/apps/dashboard/src/routes/dashboard/settings.tsx similarity index 99% rename from apps/dashboard/src/app/(dashboard)/dashboard/settings/page.tsx rename to apps/dashboard/src/routes/dashboard/settings.tsx index dd02412..c73864c 100644 --- a/apps/dashboard/src/app/(dashboard)/dashboard/settings/page.tsx +++ b/apps/dashboard/src/routes/dashboard/settings.tsx @@ -1,5 +1,4 @@ -'use client'; - +import { createFileRoute } from '@tanstack/react-router'; import { useState } from 'react'; import { DashboardHeader } from '@/src/features/dashboard/components/dashboard-header'; import { PageHeader } from '@/src/shared/components/page-header'; @@ -15,7 +14,12 @@ import { Save, RotateCcw, CheckCircle, Loader2 } from 'lucide-react'; import { mockSettings } from '@/src/shared/lib/mock-data'; import { toast } from 'sonner'; -export default function SettingsPage() { + +export const Route = createFileRoute('/dashboard/settings')({ + component: SettingsPage, +}); + +function SettingsPage() { const [settings, setSettings] = useState(mockSettings); const [loading, setLoading] = useState(false); const [errors, setErrors] = useState>({}); diff --git a/apps/dashboard/src/app/(dashboard)/dashboard/users/page.tsx b/apps/dashboard/src/routes/dashboard/users.tsx similarity index 98% rename from apps/dashboard/src/app/(dashboard)/dashboard/users/page.tsx rename to apps/dashboard/src/routes/dashboard/users.tsx index 4316243..b5577c6 100644 --- a/apps/dashboard/src/app/(dashboard)/dashboard/users/page.tsx +++ b/apps/dashboard/src/routes/dashboard/users.tsx @@ -1,5 +1,4 @@ -'use client'; - +import { createFileRoute } from '@tanstack/react-router'; import { useState, useMemo, useEffect } from 'react'; import { DashboardHeader } from '@/src/features/dashboard/components/dashboard-header'; import { PageHeader } from '@/src/shared/components/page-header'; @@ -14,7 +13,12 @@ import { type User } from '@/src/shared/lib/mock-data'; import { getUsers } from '@/src/shared/lib/tauri-api'; import { toast } from 'sonner'; -export default function UsersPage() { + +export const Route = createFileRoute('/dashboard/users')({ + component: UsersPage, +}); + +function UsersPage() { const [users, setUsers] = useState([]); useEffect(() => { diff --git a/apps/dashboard/src/app/page.tsx b/apps/dashboard/src/routes/index.tsx similarity index 95% rename from apps/dashboard/src/app/page.tsx rename to apps/dashboard/src/routes/index.tsx index e51ae4a..211ccfb 100644 --- a/apps/dashboard/src/app/page.tsx +++ b/apps/dashboard/src/routes/index.tsx @@ -1,8 +1,12 @@ -import Link from 'next/link'; +import { createFileRoute, Link } from '@tanstack/react-router'; import { Dumbbell, ArrowRight, Shield, BarChart3, Users } from 'lucide-react'; import { Button } from '@/components/ui/button'; -export default function LandingPage() { +export const Route = createFileRoute('/')({ + component: LandingPage, +}); + +function LandingPage() { return (
{/* Header */} @@ -18,7 +22,7 @@ export default function LandingPage() { variant="outline" className="border-primary text-primary hover:bg-primary hover:text-primary-foreground" > - + Iniciar Sesión @@ -47,7 +51,7 @@ export default function LandingPage() { size="lg" className="bg-primary text-primary-foreground hover:bg-primary/90 px-8" > - + Acceder al Dashboard diff --git a/apps/dashboard/src/src/features/dashboard/components/app-sidebar.tsx b/apps/dashboard/src/src/features/dashboard/components/app-sidebar.tsx index 03306c5..9348eb8 100644 --- a/apps/dashboard/src/src/features/dashboard/components/app-sidebar.tsx +++ b/apps/dashboard/src/src/features/dashboard/components/app-sidebar.tsx @@ -1,7 +1,6 @@ 'use client'; -import Link from 'next/link'; -import { usePathname } from 'next/navigation'; +import { Link, useLocation } from '@tanstack/react-router'; import { LayoutDashboard, Users, @@ -71,12 +70,12 @@ const adminNavItems = [ ]; export function AppSidebar() { - const pathname = usePathname(); + const pathname = useLocation().pathname; return ( - +
@@ -99,7 +98,7 @@ export function AppSidebar() { {mainNavItems.map((item) => ( - + {item.title} @@ -123,7 +122,7 @@ export function AppSidebar() { isActive={pathname === item.href || pathname.startsWith(item.href + '/')} tooltip={item.title} > - + {item.title} @@ -151,7 +150,7 @@ export function AppSidebar() { - + Cerrar sesión diff --git a/apps/dashboard/src/src/features/dashboard/components/dashboard-header.tsx b/apps/dashboard/src/src/features/dashboard/components/dashboard-header.tsx index 367fd82..f8f900a 100644 --- a/apps/dashboard/src/src/features/dashboard/components/dashboard-header.tsx +++ b/apps/dashboard/src/src/features/dashboard/components/dashboard-header.tsx @@ -1,5 +1,4 @@ -'use client'; - +import { Link } from '@tanstack/react-router'; import { Bell, Search } from 'lucide-react'; import { SidebarTrigger } from '@/components/ui/sidebar'; import { Button } from '@/components/ui/button'; @@ -50,11 +49,8 @@ export function DashboardHeader({ breadcrumbs }: DashboardHeaderProps) { {index > 0 && } {item.href ? ( - - {item.label} + + {item.label} ) : ( diff --git a/apps/dashboard/src/src/features/dashboard/components/quick-actions.tsx b/apps/dashboard/src/src/features/dashboard/components/quick-actions.tsx index b44162a..db1d257 100644 --- a/apps/dashboard/src/src/features/dashboard/components/quick-actions.tsx +++ b/apps/dashboard/src/src/features/dashboard/components/quick-actions.tsx @@ -1,6 +1,6 @@ 'use client'; -import Link from 'next/link'; +import { Link } from '@tanstack/react-router'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Users, ClipboardList, BookOpen, FileBarChart, HardDrive, Settings, ArrowRight } from 'lucide-react'; import { cn } from '@/lib/utils'; @@ -61,7 +61,7 @@ export function QuickActions() { {quickActions.map((action) => (
diff --git a/apps/dashboard/tsconfig.json b/apps/dashboard/tsconfig.json index 7dabcbd..ee1e88a 100644 --- a/apps/dashboard/tsconfig.json +++ b/apps/dashboard/tsconfig.json @@ -28,9 +28,7 @@ "noFallthroughCasesInSwitch": true }, "include": [ - "src", - "next-env.d.ts", - "next.config.mjs" + "src" ], "references": [ { diff --git a/apps/dashboard/tsr.config.json b/apps/dashboard/tsr.config.json new file mode 100644 index 0000000..7313ebb --- /dev/null +++ b/apps/dashboard/tsr.config.json @@ -0,0 +1,8 @@ +{ + "routesDirectory": "./src/routes", + "generatedRouteTree": "./src/routeTree.gen.ts", + "routeFileIgnorePrefix": "-", + "quoteStyle": "single", + "semicolons": true, + "autoCodeSplitting": true +} diff --git a/apps/dashboard/vite.config.ts b/apps/dashboard/vite.config.ts new file mode 100644 index 0000000..37b5314 --- /dev/null +++ b/apps/dashboard/vite.config.ts @@ -0,0 +1,46 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; +import { TanStackRouterVite } from '@tanstack/router-plugin/vite'; +import { fileURLToPath, URL } from 'node:url'; + +const host = process.env.TAURI_DEV_HOST; + +// https://vite.dev/config/ +export default defineConfig(async () => ({ + plugins: [ + TanStackRouterVite({ target: 'react', autoCodeSplitting: true }), + react(), + ], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)), + }, + }, + // Tauri expects a fixed port, fail if that port is not available + clearScreen: false, + server: { + port: 3000, + strictPort: true, + host: host || false, + hmr: host + ? { + protocol: 'ws', + host, + port: 3001, + } + : undefined, + watch: { + // Tell Vite to ignore watching `src-tauri` + ignored: ['**/src-tauri/**'], + }, + }, + publicDir: 'src/public', + build: { + outDir: 'dist', + // Tauri uses Chromium on Windows and WebKit on macOS and Linux + target: process.env.TAURI_ENV_PLATFORM === 'windows' ? 'chrome105' : 'safari13', + // don't minify for debug builds + minify: !process.env.TAURI_ENV_DEBUG ? 'esbuild' : false, + sourcemap: !!process.env.TAURI_ENV_DEBUG, + }, +})); diff --git a/bitacora/2026-05-30-migracion-nextjs-a-vite-tanstack.md b/bitacora/2026-05-30-migracion-nextjs-a-vite-tanstack.md new file mode 100644 index 0000000..4f9c70c --- /dev/null +++ b/bitacora/2026-05-30-migracion-nextjs-a-vite-tanstack.md @@ -0,0 +1,62 @@ +# Bitácora — Migración del dashboard: Next.js → Vite + TanStack Router + +- **Fecha:** 2026-05-30 +- **Autor:** Aarón (mayorgazamoraaaron@gmail.com) +- **Ámbito:** `apps/dashboard` +- **Commit de la migración:** `360c475` + +## Objetivo + +Cambiar el framework de la app `apps/dashboard` de **Next.js (App Router, `output: export`)** +a **Vite + TanStack Router** con enrutado file-based, manteniendo las mismas URLs y la +integración con Tauri. + +## Cambios realizados + +### Configuración +- Nuevo `vite.config.ts` con los plugins `@vitejs/plugin-react` y + `@tanstack/router-plugin` (file-based routing, `autoCodeSplitting`). +- Servidor de desarrollo en el puerto **3000** (`strictPort`) para Tauri. +- Salida de build en `dist/`. +- Nuevo `index.html` en la raíz de la app como punto de entrada. +- `postcss.config.mjs` se mantiene (Tailwind v4). +- `tsr.config.json` para el generador de rutas de TanStack. +- `tsconfig.json`: se elimina `next-env.d.ts`/`next.config.mjs` del `include`. +- Nuevo `src/vite-env.d.ts`. + +### Enrutado +- Se reemplaza `src/app/` (App Router) por `src/routes/` (file-based): + - `src/routes/index.tsx` → landing (`/`) + - `src/routes/dashboard/route.tsx` → layout del dashboard (sidebar) + - `src/routes/dashboard/index.tsx` → `/dashboard` + - `audit`, `backups`, `catalog`, `reports`, `settings`, `users` → `/dashboard/*` + - `src/routes/__root.tsx` → raíz (Outlet + Toaster de sonner) +- `src/routeTree.gen.ts` generado por el CLI de TanStack Router. + +### APIs de Next reemplazadas +- `next/link` → `Link` de `@tanstack/react-router` (`href` → `to`). +- `usePathname` (next/navigation) → `useLocation()` de TanStack Router. +- Breadcrumbs del header ahora navegan client-side (sin recarga). +- Se quita el tipo `Metadata`; título e iconos pasan a `index.html`. + +### Dependencias +- Se eliminan: `next`, `@vercel/analytics` y `next.config.mjs`. +- Se conserva `next-themes` (es agnóstico al framework). +- Se agregan: `@tanstack/react-router`, `@tanstack/router-plugin`, + `@vitejs/plugin-react`, `vite`. + +### Tauri +- `src-tauri/tauri.conf.json`: `frontendDist` `../out` → `../dist`. +- `turbo.json`: se añaden `dist/**` y `out/**` a los outputs de build. +- `.gitignore`: se ignora `/dist`. + +## Verificación +- Se generó y validó `routeTree.gen.ts` (todas las rutas anidan bajo `/dashboard`). +- Se confirmó que no queda ninguna referencia a `next/` en el código fuente. + +## Pendiente / pasos para correr el proyecto +1. Ejecutar `pnpm install` en la raíz (cambiaron dependencias; el `pnpm-lock.yaml` + debe regenerarse). +2. `pnpm dev` para desarrollo web, o `pnpm dev:tauri` para la app de escritorio. +3. Verificar el build con `pnpm build` (no se completó un build real en el entorno + de migración por límites de red al instalar paquetes). diff --git a/turbo.json b/turbo.json index 92cb4ed..beb2237 100644 --- a/turbo.json +++ b/turbo.json @@ -5,7 +5,7 @@ "build": { "dependsOn": ["^build"], "inputs": ["$TURBO_DEFAULT$", ".env*"], - "outputs": [".next/**", "!.next/cache/**"] + "outputs": [".next/**", "!.next/cache/**", "dist/**", "out/**"] }, "lint": { "dependsOn": ["^lint"]