npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@stone_djjh/react-ui

v0.1.0

Published

Librería de componentes UI autónoma, moderna y accesible en React 19 con CSS Modules para el ecosistema SaaS y E-commerce

Readme

@stone_djjh/react-ui

Librería de componentes UI moderna, autónoma y accesible para React 19 construida con TypeScript y CSS Modules.

  • Cero Dependencias de Frameworks CSS: Estilos scoped en CSS Modules puros gobernados por tokens CSS nativos (tokens.css). Sin Tailwind ni librerías CSS-in-JS en runtime.
  • Arquitectura Desacoplada y Autónoma: Cada componente opera con sus propios estilos, contratos de tipos e internacionalización modular (ES / EN).
  • Mobile-First y Accesible: Cumplimiento con estándares WCAG y WAI-ARIA, áreas táctiles mínimas de 44px para móviles y navegación completa por teclado.

License: MIT React TypeScript Vite Tests


📦 Instalación

npm install @stone_djjh/react-ui

Importación de Estilos

Importa la hoja de estilos unificada una sola vez en el punto de entrada de tu aplicación (main.tsx o index.tsx):

import '@stone_djjh/react-ui/style.css';

🎨 Catálogo de Componentes

1. Elementos Base y Formularios

  • Button: Variantes semánticas (primary, secondary, outline, ghost, danger), tamaños (sm, md, lg), estado de carga animado (loading) e iconos adjuntos (iconLeft, iconRight).
  • Input: Campo de entrada con etiquetas flotantes accesibles (label), mensajes de validación reactivos (error), textos de ayuda (helperText) e iconos contextuales (leadingIcon, trailingIcon).
  • Card: Contenedor modular con subcomponentes compuestos (Card.Header, Card.Body, Card.Footer).
  • Badge: Etiquetas de estado semánticas (primary, neutral, success, danger, outline) y tamaños (sm, md).

2. Layouts y Estructura de Aplicación

  • DashboardLayout: Shell administrativo con barra superior, selector de tema, soporte responsivo y sidebar colapsable.
  • SidebarNav: Navegación jerárquica con control de acceso por roles (RBAC recursivo), submenús anidados tipo acordeón y menús flotantes emergentes (flyouts) en modo colapsado.
  • EcommerceLayout: Estructura de tienda digital con catálogo en rejilla fluida, panel de filtros y carrito drawer accesible con cálculo de subtotal.
  • AuthLayout: Vistas completas y centradas/divididas para inicio de sesión, registro y recuperación de contraseña con i18n nativo.
  • ErrorPage: Páginas de estado y error para códigos HTTP 404, 403, 401 y 500, disponibles tanto en modo pantalla completa (full) como embebidas dentro de dashboards (embedded).

3. Diálogos, Notificaciones y Feedback

  • ToastProvider / useToast / toast: Sistema de notificaciones en tiempo real a 60/120fps (requestAnimationFrame), pausa en hover, halo semántico y API programática directa.
  • Alert: Banners de notificación en línea con 5 variantes semánticas y cierre accesible.
  • ConfirmDialog / useConfirm: Diálogo de confirmación modal controlado por Promesas asíncronas (const ok = await confirm({ ... })) con halos luminosos semánticos.
  • Modal / Dialog: Ventana modal accesible compuesta (Modal.Header, Modal.Body, Modal.Footer), portal directo a document.body, atajo de teclado Escape y bloqueo dinámico de scroll.

4. Navegación, Datos y Multimedia

  • DataTable: Tabla de datos tipada genérica (<TData>) con ordenamiento interactivo por columnas, selección de filas con casillas checkbox, estados de carga esqueleto (skeleton shimmer) y estado vacío personalizable.
  • Pagination: Paginación con cálculo algorítmico inteligente de elipsis (...), selector de registros por página, resumen informativo y soporte bilingüe (ES/EN).
  • Dropdown: Menú flotante contextual de tres puntos (⋮) o triggers personalizados con asChild, atajos de teclado (shortcut), variantes destructivas (danger) y elevación con desenfoque de fondo.
  • Carousel: Carrusel y galería multimedia con soporte táctil (swipe), autoplay con pausa al pasar el cursor (pauseOnHover), indicadores de puntos, flechas laterales y modo galería con miniaturas.
  • Timeline: Línea de tiempo secuencial con orientación vertical y horizontal (stepper de seguimiento para tracking de pedidos en vivo), badges de estado y animación de pulso luminosa.
  • ProductCard: Tarjeta de producto comercial con proporción 1:1, badges de stock trifásicos, metadatos, rating, precios tachados y cálculo automático de porcentaje de ahorro.

🚀 Ejemplos Rápidos de Uso

DataTable con Paginación y Dropdown

import React, { useState } from 'react';
import { DataTable, Pagination, Dropdown, ColumnDef } from '@stone_djjh/react-ui';

interface Product {
  id: string;
  sku: string;
  name: string;
  price: number;
}

export const InventoryTable = () => {
  const [data] = useState<Product[]>([
    { id: '1', sku: 'BRK-001', name: 'Pastillas Brembo', price: 68.5 },
    { id: '2', sku: 'CLT-042', name: 'Kit Embrague Luk', price: 145.0 },
  ]);

  const columns: ColumnDef<Product>[] = [
    { key: 'sku', header: 'SKU', sortable: true },
    { key: 'name', header: 'Producto', sortable: true },
    {
      key: 'price',
      header: 'Precio',
      align: 'right',
      render: (row) => `$${row.price.toFixed(2)}`,
    },
    {
      key: 'actions',
      header: 'Acciones',
      align: 'center',
      render: (row) => (
        <Dropdown align="end">
          <Dropdown.Trigger asChild>
            <button type="button">⋮</button>
          </Dropdown.Trigger>
          <Dropdown.Menu>
            <Dropdown.Item icon="✏️" onClick={() => console.log('Editar', row.id)}>
              Editar
            </Dropdown.Item>
            <Dropdown.Divider />
            <Dropdown.Item variant="danger" icon="🗑️" onClick={() => console.log('Borrar', row.id)}>
              Eliminar
            </Dropdown.Item>
          </Dropdown.Menu>
        </Dropdown>
      ),
    },
  ];

  return (
    <div>
      <DataTable
        columns={columns}
        data={data}
        selectable
        striped
        hoverable
      />
      <Pagination
        currentPage={1}
        totalPages={10}
        totalItems={100}
        pageSize={10}
        showSummary
      />
    </div>
  );
};

Diálogo Modal Compuesto

import React, { useState } from 'react';
import { Modal, Button, Input } from '@stone_djjh/react-ui';

export const CreateBrandModal = () => {
  const [isOpen, setIsOpen] = useState(false);

  return (
    <>
      <Button onClick={() => setIsOpen(true)}>Crear Fabricante</Button>

      <Modal isOpen={isOpen} onClose={() => setIsOpen(false)} size="md">
        <Modal.Header
          title="Nuevo Fabricante"
          description="Ingresa los datos del fabricante autorizado."
        />
        <Modal.Body>
          <Input label="Nombre de la Marca" placeholder="Ej: Bosch" />
        </Modal.Body>
        <Modal.Footer align="end">
          <Button variant="ghost" onClick={() => setIsOpen(false)}>Cancelar</Button>
          <Button variant="primary" onClick={() => setIsOpen(false)}>Guardar</Button>
        </Modal.Footer>
      </Modal>
    </>
  );
};

🎨 Personalización con Tokens CSS

La librería se adapta a cualquier identidad visual mediante variables nativas CSS (tokens.css). Puedes sobreescribirlas en tu hoja de estilos principal:

:root {
  --rui-primary: #6366f1;
  --rui-primary-hover: #4f46e5;
  --rui-surface: #0f172a;
  --rui-surface-card: #1e293b;
  --rui-border: rgba(255, 255, 255, 0.12);
  --rui-text: #f8fafc;
  --rui-text-muted: #94a3b8;
  --rui-radius: 0.75rem;
}

🧪 Pruebas y Calidad de Código

Toda la librería cuenta con una suite completa de pruebas unitarias escritas con Vitest:

npm test

Salida actual:

Test Files  17 passed (17)
     Tests  64 passed (64)

📄 Licencia

Distribuido bajo la Licencia MIT. Consulta LICENSE para más información.