diff --git a/src/app/(components)/styles/page.tsx b/src/app/(components)/styles/page.tsx index a5cb65a..2f6330a 100644 --- a/src/app/(components)/styles/page.tsx +++ b/src/app/(components)/styles/page.tsx @@ -10,8 +10,8 @@ export default function Page() { items={[ { id: "box", label: "Box" }, { id: "gradients", label: "Gradientes" }, - { id: "scale-hover", label: "Escala al pasar el cursor" }, - { id: "hover-bg", label: "Color de fondo al pasar el cursor" }, + { id: "scale-hover", label: "Escala al pasar el cursor" }, + { id: "hover-bg", label: "Color de fondo al pasar el cursor" }, ]} />
@@ -44,6 +44,36 @@ export default function Page() {
+ +

div con className .box

+`} + > +
+

+ div con className .box .active +

+
+
+ + +

div con className .box

+`} + > +
+

+ div con className .box .disabled +

+
+
+ + + +
+

+ 🧩 Componente: Tabs +

+ +

+ El componente <Tabs /> permite organizar contenido + en pestañas, ofreciendo opciones de estilos y soporte para pestañas + desactivadas. +
+ El tiempo de animacion de las pestañas es de 0.3s. pero se puede + modificar en el archivo src/styles/sass/_tabs.scss +

+ + + +
+ + Contenido de inicio

}, + { id: "profile", title: "Perfil", content:

Contenido del perfil

}, + { id: "settings", title: "Configuraciones", content:

Contenido de configuraciones

}, + ] +/>`} + > + Contenido de inicio

, + }, + { + id: "profile-1", + title: "Perfil", + content:

Contenido del perfil

, + }, + { + id: "settings-1", + title: "Configuraciones", + content:

Contenido de configuraciones

, + }, + ]} + /> +
+ + Contenido de inicio

}, + { id: "disabled", title: "Desactivado", content:

No seleccionable

, disabled: true }, + ] +/>`} + > + Contenido de inicio

, + }, + { + id: "disabled-2", + title: "Desactivado", + content:

No seleccionable

, + disabled: true, + }, + ]} + /> +
+ + Contenido de inicio

}, + { id: "profile", title: "Perfil", content:

Contenido del perfil

}, + ] + style="box" +/>`} + > + Contenido de inicio

, + }, + { + id: "profile-3", + title: "Perfil", + content:

Contenido del perfil

, + }, + { + id: "settings-3", + title: "Configuraciones", + content:

Contenido del perfil

, + disabled: true, + }, + ]} + /> +
+ + {/* PROPS */} +
+

⚙️ Props del componente

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropTipoDescripción
+ tabs + + Tab[] + Lista de pestañas con ID, título y contenido.
+ style? + + "default" | "box" + Estilo de las pestañas.
+ className? + + + {"{ container?: string; tab?: string; content?: string; }"} + + + Clases CSS personalizables para diferentes partes del + componente. +
+ Tab.id + + string + Identificador único de la pestaña.
+ Tab.title + + string | JSX.Element + Título de la pestaña.
+ Tab.content + + JSX.Element + Contenido dentro de la pestaña.
+ Tab.disabled? + + boolean + Si la pestaña debe estar deshabilitada.
+
+
+ + ); +} diff --git a/src/app/page.tsx b/src/app/page.tsx index 3f4affd..3211773 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -94,6 +94,12 @@ import BootstrapClient from "@/components/bootstrap-client";`}
+
+ +
+
+ +
diff --git a/src/components/tabs.tsx b/src/components/tabs.tsx new file mode 100644 index 0000000..2be6821 --- /dev/null +++ b/src/components/tabs.tsx @@ -0,0 +1,74 @@ +import React, { useState, JSX } from "react"; + +interface Tab { + id: string; + title: string | JSX.Element; + content: JSX.Element; + disabled?: boolean; +} + +interface TabsProps { + tabs: Tab[]; + style?: "default" | "box"; + className?: { + container?: string; + tab?: string; + content?: string; + }; +} + +export default function Tabs({ + tabs, + style = "default", + className, +}: TabsProps) { + const [activeTab, setActiveTab] = useState(tabs[0]?.id || ""); + + return ( + <> + +
+ {tabs.map((tab) => ( +
+ {activeTab === tab.id && tab.content} +
+ ))} +
+ + ); +} diff --git a/src/styles/sass/_extends.scss b/src/styles/sass/_extends.scss index e2d4d70..e326d1a 100644 --- a/src/styles/sass/_extends.scss +++ b/src/styles/sass/_extends.scss @@ -9,6 +9,11 @@ @extend .bg-opacity-75; @extend .text-white; } + + &.disabled { + @extend .text-muted; + cursor: not-allowed !important; + } } .unlink { diff --git a/src/styles/sass/_tabs.scss b/src/styles/sass/_tabs.scss new file mode 100644 index 0000000..b864ca3 --- /dev/null +++ b/src/styles/sass/_tabs.scss @@ -0,0 +1,16 @@ +.tab-pane.fade { + transition: opacity 10s linear !important; +} + +.nav-tabs.style-box { + border-bottom: 0cap; + gap: 0.8rem; + .nav-item .nav-link { + @extend .box; + @extend .py-2; + @extend .text-black; + + margin: 0 !important; + border: 0; + } +} diff --git a/src/styles/sass/bootstrap.scss b/src/styles/sass/bootstrap.scss index 4cf44c9..2da8cbe 100644 --- a/src/styles/sass/bootstrap.scss +++ b/src/styles/sass/bootstrap.scss @@ -26,6 +26,7 @@ $theme-colors: map-merge($theme-colors, $custom-colors); @import "utilities"; @import 'sidebar'; @import 'hover'; +@import 'tabs'; //Add additional custom code here