diff --git a/src/components/asignaturas/detalle/BibliographyItem.tsx b/src/components/asignaturas/detalle/BibliographyItem.tsx
new file mode 100644
index 0000000..21c5bde
--- /dev/null
+++ b/src/components/asignaturas/detalle/BibliographyItem.tsx
@@ -0,0 +1,84 @@
+import { useState } from 'react'
+import { Textarea } from '@/components/ui/textarea'
+import { Button } from '@/components/ui/button'
+import { Pencil, BookOpen } from 'lucide-react'
+import { cn } from '@/lib/utils'
+
+type Props = {
+ value: string
+ onSave: (value: string) => void
+}
+
+export function BibliographyItem({ value, onSave }: Props) {
+ const [isEditing, setIsEditing] = useState(false)
+ const [draft, setDraft] = useState(value)
+
+ function handleCancel() {
+ setDraft(value)
+ setIsEditing(false)
+ }
+
+ function handleSave() {
+ onSave(draft)
+ setIsEditing(false)
+ }
+
+ return (
+
+
+
+
+
+ {!isEditing ? (
+ <>
+
{value}
+
+
+ >
+ ) : (
+ <>
+
+
+
+ )
+}
diff --git a/src/components/asignaturas/detalle/ContenidoTematico.tsx b/src/components/asignaturas/detalle/ContenidoTematico.tsx
new file mode 100644
index 0000000..efc1e57
--- /dev/null
+++ b/src/components/asignaturas/detalle/ContenidoTematico.tsx
@@ -0,0 +1,40 @@
+import { Button } from '@/components/ui/button'
+import { UnidadCard } from './contenido-tematico/UnidadCard'
+
+
+export function ContenidoTematico() {
+ return (
+
+
+
+
Contenido Temático
+
+ Unidades, temas y subtemas de la materia
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/src/components/asignaturas/detalle/MateriaDetailPage.tsx b/src/components/asignaturas/detalle/MateriaDetailPage.tsx
new file mode 100644
index 0000000..52ba7a0
--- /dev/null
+++ b/src/components/asignaturas/detalle/MateriaDetailPage.tsx
@@ -0,0 +1,227 @@
+import { createFileRoute, Link } from '@tanstack/react-router'
+import { Tabs, TabsList, TabsTrigger, TabsContent } from '@/components/ui/tabs'
+import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'
+import { Badge } from '@/components/ui/badge'
+import { Button } from '@/components/ui/button'
+import { Separator } from '@/components/ui/separator'
+import {
+ ArrowLeft,
+ GraduationCap,
+
+} from 'lucide-react'
+import { ContenidoTematico } from './ContenidoTematico'
+import { BibliographyItem } from './BibliographyItem'
+
+export default function MateriaDetailPage() {
+
+
+ return (
+
+ {/* ================= HEADER ================= */}
+
+
+
+
+ Volver al plan
+
+
+
+
+
+ IA-401
+
+
+
+ Inteligencia Artificial Aplicada
+
+
+
+
+
+ Ingeniería en Sistemas Computacionales
+
+
+ Facultad de Ingeniería
+
+
+
+ Pertenece al plan:{' '}
+
+ Licenciatura en Ingeniería en Sistemas Computacionales 2024
+
+
+
+
+
+ 8 créditos
+ 7° semestre
+ Sistemas Inteligentes
+
+
+
+
+
+ {/* ================= TABS ================= */}
+
+
+
+
+ Datos generales
+ Contenido temático
+ Bibliografía
+ IA de la materia
+ Documento SEP
+ Historial
+
+
+
+
+ {/* ================= TAB: DATOS GENERALES ================= */}
+
+
+
+
+
+
+
+
+
+ {
+ console.log('Guardar en API:', newValue)
+ }}
+ />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+/* ================= TAB CONTENT ================= */
+
+function DatosGenerales() {
+ return (
+
+
+
+
+
+
+ Diseñar algoritmos de machine learning
+ Implementar redes neuronales profundas
+ Evaluar modelos de IA considerando métricas
+ Aplicar principios éticos en sistemas inteligentes
+
+ }
+ />
+
+
+
+
+
+
+ Aprendizaje basado en proyectos
+ Talleres prácticos con datasets reales
+ Estudios de caso
+
+ }
+ />
+
+
+ Exámenes parciales: 30%
+ Proyecto integrador: 35%
+ Prácticas de laboratorio: 20%
+ Participación: 15%
+
+ }
+ />
+
+
+
+ )
+}
+
+function HeaderTab() {
+ return (
+
+
+
Datos Generales
+
+ Información basada en la plantilla SEP Licenciatura
+
+
+
+
+
+ )
+}
+
+function InfoCard({
+ title,
+ content,
+}: {
+ title: string
+ content: React.ReactNode
+}) {
+ return (
+
+
+
+ {title}
+ Obligatorio
+
+
+
+
+ {content}
+
+
+ )
+}
+
+function EmptyTab({ title }: { title: string }) {
+ return (
+
+ {title} (pendiente)
+
+ )
+}
diff --git a/src/components/asignaturas/detalle/contenido-tematico/EditTemaDialog.tsx b/src/components/asignaturas/detalle/contenido-tematico/EditTemaDialog.tsx
new file mode 100644
index 0000000..4ff57ba
--- /dev/null
+++ b/src/components/asignaturas/detalle/contenido-tematico/EditTemaDialog.tsx
@@ -0,0 +1,61 @@
+import {
+ Dialog,
+ DialogContent,
+ DialogHeader,
+ DialogTitle,
+ DialogFooter,
+} from '@/components/ui/dialog'
+import { Textarea } from '@/components/ui/textarea'
+import { Button } from '@/components/ui/button'
+import { useState } from 'react'
+
+export function EditTemaDialog({
+ children,
+ temaId,
+ defaultValue,
+ horas,
+}: {
+ children: React.ReactNode
+ temaId: string
+ defaultValue: string
+ horas: number
+}) {
+ const [open, setOpen] = useState(false)
+ const [value, setValue] = useState(defaultValue)
+
+ function handleSave() {
+ console.log('Guardar tema', temaId, value)
+ setOpen(false)
+ }
+
+ return (
+
+ )
+}
diff --git a/src/components/asignaturas/detalle/contenido-tematico/TemaItem.tsx b/src/components/asignaturas/detalle/contenido-tematico/TemaItem.tsx
new file mode 100644
index 0000000..78fb2a5
--- /dev/null
+++ b/src/components/asignaturas/detalle/contenido-tematico/TemaItem.tsx
@@ -0,0 +1,28 @@
+import { Pencil } from 'lucide-react'
+import { EditTemaDialog } from './EditTemaDialog'
+
+export function TemaItem({
+ id,
+ titulo,
+ horas,
+}: {
+ id: string
+ titulo: string
+ horas: number
+}) {
+ return (
+
+
+
+ )
+}
diff --git a/src/components/asignaturas/detalle/contenido-tematico/UnidadCard.tsx b/src/components/asignaturas/detalle/contenido-tematico/UnidadCard.tsx
new file mode 100644
index 0000000..215c9b0
--- /dev/null
+++ b/src/components/asignaturas/detalle/contenido-tematico/UnidadCard.tsx
@@ -0,0 +1,34 @@
+import { Card, CardContent } from '@/components/ui/card'
+import { Badge } from '@/components/ui/badge'
+import { TemaItem } from './TemaItem'
+
+export function UnidadCard({
+ numero,
+ titulo,
+ temas,
+}: {
+ numero: number
+ titulo: string
+ temas: {
+ id: string
+ titulo: string
+ horas: number
+ }[]
+}) {
+ return (
+
+
+
+ Unidad {numero}
+
{titulo}
+
+
+
+ {temas.map((tema) => (
+
+ ))}
+
+
+
+ )
+}
diff --git a/src/routes/planes/$planId/asignaturas/$asignaturaId/route.tsx b/src/routes/planes/$planId/asignaturas/$asignaturaId/route.tsx
index b001a97..53d85fa 100644
--- a/src/routes/planes/$planId/asignaturas/$asignaturaId/route.tsx
+++ b/src/routes/planes/$planId/asignaturas/$asignaturaId/route.tsx
@@ -1,3 +1,4 @@
+import MateriaDetailPage from '@/components/asignaturas/detalle/MateriaDetailPage'
import { createFileRoute } from '@tanstack/react-router'
export const Route = createFileRoute(
@@ -7,12 +8,11 @@ export const Route = createFileRoute(
})
function RouteComponent() {
- const { planId, asignaturaId } = Route.useParams()
+ //const { planId, asignaturaId } = Route.useParams()
return (
- Plan: {planId}
- Asignatura: {asignaturaId}
+
)
}