UNPKG

@gambito-corp/mbs-library

Version:

Librería de componentes React reutilizables - Sistema de diseño modular y escalable

318 lines (313 loc) 10.2 kB
import Button from './Button.jsx'; import { BUTTON_VARIANTS, BUTTON_SIZES } from './Button.constants.js'; export const ButtonConfig = { component: Button, name: 'Button', category: 'atoms', description: 'Componente de botón versátil con múltiples variantes, tamaños, estados y soporte para iconos. Basado en metodología BEM con contraste automático de texto.', props: { children: { type: 'ReactNode', required: false, description: 'Contenido del botón (texto, elementos, etc.)' }, type: { type: 'string', required: false, default: 'button', options: ['button', 'submit', 'reset'], description: 'Tipo de botón HTML' }, variant: { type: 'string', required: false, default: 'primary', options: Object.keys(BUTTON_VARIANTS), description: 'Variante visual del botón' }, size: { type: 'string', required: false, default: 'medium', options: Object.keys(BUTTON_SIZES), description: 'Tamaño del botón' }, icon: { type: 'string', required: false, description: 'Nombre del icono FontAwesome a mostrar' }, iconPosition: { type: 'string', required: false, default: 'left', options: ['left', 'right', 'top', 'bottom'], description: 'Posición del icono relativa al texto' }, loading: { type: 'boolean', required: false, default: false, description: 'Estado de carga con spinner' }, disabled: { type: 'boolean', required: false, default: false, description: 'Estado deshabilitado' }, fullWidth: { type: 'boolean', required: false, default: false, description: 'Ocupa todo el ancho disponible' }, as: { type: 'string', required: false, default: 'button', options: ['button', 'a', 'link', 'div'], description: 'Elemento HTML a renderizar' }, href: { type: 'string', required: false, description: 'URL cuando se usa como enlace (as="a")' }, textColor: { type: 'string', required: false, description: 'Color personalizado del texto (sobrescribe el automático)' }, iconColor: { type: 'string', required: false, description: 'Color personalizado del icono' }, onClick: { type: 'function', required: false, description: 'Función ejecutada al hacer click', signature: '(event) => void' } }, variants: [ { name: '🎯 Botones básicos', description: 'Variantes principales del sistema', code: `<div style={{display: 'flex', gap: '12px', flexWrap: 'wrap'}}> <Button variant="primary">Primario</Button> <Button variant="gradient">Degradado</Button> <Button variant="secondary">Secundario</Button> <Button variant="outline">Outline</Button> <Button variant="ghost">Fantasma</Button> </div>`, props: { variant: 'primary', children: 'Primario' } }, { name: '🎨 Variantes de estado', description: 'Botones para diferentes estados', code: `<div style={{display: 'flex', gap: '12px', flexWrap: 'wrap'}}> <Button variant="success">Éxito</Button> <Button variant="danger">Peligro</Button> <Button variant="warning">Advertencia</Button> </div>`, props: { variant: 'success', children: 'Éxito' } }, { name: '📏 Tamaños disponibles', description: 'Diferentes tamaños de botones', code: `<div style={{display: 'flex', flexDirection: 'column', gap: '12px', alignItems: 'flex-start'}}> <Button variant="primary" size="xs">Extra pequeño</Button> <Button variant="primary" size="small">Pequeño</Button> <Button variant="primary" size="medium">Mediano</Button> <Button variant="primary" size="large">Grande</Button> <Button variant="primary" size="xlarge">Extra grande</Button> </div>`, props: { variant: 'primary', size: 'medium', children: 'Mediano' } }, { name: '🎮 Botones de juego', description: 'Variantes especiales para juegos', code: `<div style={{display: 'flex', flexDirection: 'column', gap: '12px'}}> <Button variant="gameReveal" size="game" fullWidth={true}> REVELAR RESPUESTA </Button> <Button variant="gameCorrect" size="game" fullWidth={true}> ¡CORRECTO! </Button> <Button variant="gameIncorrect" size="game" fullWidth={true}> INCORRECTO </Button> <div style={{display: 'flex', gap: '12px'}}> <Button variant="gameRestart">Reiniciar</Button> <Button variant="gameExit">Salir</Button> </div> </div>`, props: { variant: 'gameReveal', size: 'game', fullWidth: true, children: 'REVELAR RESPUESTA' } }, { name: '🔄 Estados interactivos', description: 'Estados de carga y deshabilitado', code: `<div style={{display: 'flex', gap: '12px', flexWrap: 'wrap'}}> <Button variant="primary" loading={true}> Cargando... </Button> <Button variant="primary" disabled={true}> Deshabilitado </Button> <Button variant="success" loading={true}> Guardando... </Button> </div>`, props: { variant: 'primary', loading: true, children: 'Cargando...' } }, { name: '🎯 Botones con iconos', description: 'Diferentes posiciones de iconos', code: `<div style={{display: 'flex', flexDirection: 'column', gap: '12px', alignItems: 'flex-start'}}> <Button variant="primary" icon="heart" iconPosition="left"> Icono izquierda </Button> <Button variant="success" icon="arrow-right" iconPosition="right"> Icono derecha </Button> <Button variant="gradient" icon="star" iconPosition="top"> Icono arriba </Button> <Button variant="secondary" icon="download" iconPosition="bottom"> Icono abajo </Button> </div>`, props: { variant: 'primary', icon: 'heart', iconPosition: 'left', children: 'Icono izquierda' } }, { name: '📐 Botón ancho completo', description: 'Botón que ocupa todo el ancho disponible', code: `<div style={{display: 'flex', flexDirection: 'column', gap: '12px'}}> <Button variant="primary" fullWidth={true} size="large"> Botón Ancho Completo </Button> <Button variant="gradient" fullWidth={true} icon="download" iconPosition="left"> Descargar Archivo </Button> </div>`, props: { variant: 'primary', fullWidth: true, size: 'large', children: 'Botón Ancho Completo' } }, { name: '🔗 Botón como enlace', description: 'Botón renderizado como elemento de enlace', code: `<div style={{display: 'flex', gap: '12px', flexWrap: 'wrap'}}> <Button as="a" href="#" variant="primary" icon="external-link-alt" iconPosition="right" > Enlace externo </Button> <Button as="a" href="#" variant="outline" icon="link" iconPosition="left" > Ir al enlace </Button> </div>`, props: { as: 'a', href: '#', variant: 'primary', icon: 'external-link-alt', iconPosition: 'right', children: 'Enlace externo' } }, { name: '🎨 Colores personalizados', description: 'Botones con colores de texto e icono personalizados', code: `<div style={{display: 'flex', gap: '12px', flexWrap: 'wrap'}}> <Button variant="ghost" textColor="#e11d48" icon="heart" iconColor="#e11d48" > Texto rosa </Button> <Button variant="outline" textColor="#7c3aed" iconColor="#7c3aed" icon="star" > Texto púrpura </Button> <Button variant="ghost" textColor="#059669" iconColor="#f59e0b" icon="bell" > Colores mixtos </Button> </div>`, props: { variant: 'ghost', textColor: '#e11d48', iconColor: '#e11d48', icon: 'heart', children: 'Texto rosa' } }, { name: '🎯 Solo iconos', description: 'Botones que contienen únicamente iconos', code: `<div style={{display: 'flex', gap: '12px', alignItems: 'center'}}> <Button variant="primary" icon="plus" size="small" /> <Button variant="danger" icon="trash" size="medium" /> <Button variant="success" icon="check" size="large" /> <Button variant="outline" icon="edit" size="medium" /> <Button variant="ghost" icon="heart" size="large" /> </div>`, props: { variant: 'primary', icon: 'plus', size: 'small' } } ] }; export default ButtonConfig;