refactor: migrate frontend from shadcn/Tailwind to Mantine v9

Reescribe todos los componentes UI para usar Mantine v9 en lugar de shadcn/Tailwind.
Elimina cn(), CVA, components.json, theme_provider custom y globals.css con Tailwind.
Añade 25+ componentes nuevos (AppShell, AuthForm, DatePickerInput, Dropzone, etc.)
y MantineProvider como wrapper estándar del sistema de temas.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-06 23:46:44 +02:00
parent 4b2bb6998a
commit 97a3c84625
163 changed files with 6008 additions and 6310 deletions
+18 -32
View File
@@ -1,5 +1,5 @@
import * as React from 'react'
import { cn } from '../core/cn'
import { SimpleGrid, Paper, Text } from '@mantine/core'
interface DashboardWidget {
id: string
@@ -16,51 +16,37 @@ interface DashboardLayoutProps {
className?: string
}
const gapClasses = { sm: 'gap-2', md: 'gap-4', lg: 'gap-6' }
const spanClasses: Record<number, string> = {
1: 'col-span-1',
2: 'col-span-1 md:col-span-2',
3: 'col-span-1 md:col-span-2 lg:col-span-3',
4: 'col-span-1 md:col-span-2 lg:col-span-4',
}
const rowSpanClasses: Record<number, string> = {
1: 'row-span-1',
2: 'row-span-2',
}
const gapMap = { sm: 'xs', md: 'md', lg: 'lg' } as const
export function dashboardLayout({
widgets,
columns = 4,
gap = 'md',
className,
}: DashboardLayoutProps): React.ReactElement {
const gridCols: Record<number, string> = {
1: 'grid-cols-1',
2: 'grid-cols-1 md:grid-cols-2',
3: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3',
4: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-4',
}
return (
<div className={cn('grid', gridCols[columns], gapClasses[gap], className)}>
<SimpleGrid
cols={{ base: 1, md: Math.min(columns, 2), lg: columns }}
spacing={gapMap[gap]}
>
{widgets.map((widget) => (
<div
<Paper
key={widget.id}
className={cn(
'rounded-xl border bg-card p-4 text-card-foreground shadow-sm',
spanClasses[widget.span || 1],
rowSpanClasses[widget.rowSpan || 1]
)}
p="md"
withBorder
shadow="xs"
radius="md"
style={{
gridColumn: widget.span && widget.span > 1 ? `span ${widget.span}` : undefined,
gridRow: widget.rowSpan === 2 ? 'span 2' : undefined,
}}
>
{widget.title && (
<h3 className="mb-3 text-sm font-medium text-muted-foreground">{widget.title}</h3>
<Text size="sm" fw={500} c="dimmed" mb="sm">{widget.title}</Text>
)}
{widget.content}
</div>
</Paper>
))}
</div>
</SimpleGrid>
)
}