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

framepexls-ui-lib

v2.4.0

Published

Componentes UI de Framepexls para React/Next.

Readme

Framepexls UI Lib

Sistema de diseño compartido para productos React y Next.js del ecosistema Heliip. La librería concentra componentes accesibles, iconografía propia, tokens de tema y animaciones optimizadas para evitar que cada proyecto vuelva a resolver los mismos patrones.

Inicio rápido

import "framepexls-ui-lib/theme.css";
import { Button, FormField, Input, MotionProvider } from "framepexls-ui-lib/core";

export default function App() {
  return (
    <MotionProvider>
      <FormField label="Correo" required hint="Usaremos este correo para avisos importantes.">
        <Input type="email" name="email" autoComplete="email" />
      </FormField>
      <Button type="submit">Guardar</Button>
    </MotionProvider>
  );
}

MotionProvider debe montarse una sola vez cerca de la raíz. Respeta automáticamente prefers-reduced-motion y carga únicamente el paquete de características de Motion elegido.

Imports optimizados

El import raíz se conserva por compatibilidad, pero el código nuevo debe usar la entrada más pequeña que cubra la tarea. Así Next.js puede resolver menos módulos y el bundle final conserva únicamente los componentes, iconos y proveedores que sí se usan.

Cuando una pantalla necesita un solo componente especializado también puede usar su entrada directa:

import DataTable from "framepexls-ui-lib/components/DataTable";
import DateTimeField from "framepexls-ui-lib/components/DateTimeField";

| Entrada | Úsala para | | --- | --- | | framepexls-ui-lib/core | Controles, formularios, overlays, feedback, navegación básica y movimiento | | framepexls-ui-lib/icons | Iconografía compartida | | framepexls-ui-lib/data | Tablas, páginas de datos, números y fechas relativas | | framepexls-ui-lib/charts | Gráficas y visualización financiera | | framepexls-ui-lib/color | Selector de color; requiere react-colorful | | framepexls-ui-lib/diagrams | Adaptador Mermaid para el editor Markdown | | framepexls-ui-lib/editors | Markdown, documentos, cotizaciones y Word | | framepexls-ui-lib/media | Carga, biblioteca y selección de medios | | framepexls-ui-lib/support | Chat, chatbot, notificaciones y conocimiento | | framepexls-ui-lib/theme | Tema y accesibilidad sin selector de color avanzado | | framepexls-ui-lib/map | Mapas; acompáñalo con framepexls-ui-lib/map.css | | framepexls-ui-lib/qr | Generación de códigos QR | | framepexls-ui-lib/components/* | Un componente concreto con el menor grafo posible |

La distribución es ESM, apunta a ES2022 y deja React, Next, Motion y Recharts como contratos compartidos con la aplicación para evitar runtimes duplicados. El catálogo de iconos se publica con exports estáticos y fábricas puras: importar un icono o un componente no arrastra los otros 1,510 SVG.

Colores propios del proyecto

Un proyecto puede ampliar los colores incluidos sin modificar theme.css. Define el arreglo una sola vez y entrégalo a ThemeScript y ThemeProvider; ThemeController lo obtiene del contexto y lo incorpora al selector. Si solo se proporciona color, la librería calcula un texto legible y un anillo de foco consistente.

import {
  ThemeController,
  ThemeProvider,
  ThemeScript,
  type ThemeAccentDefinition,
} from "framepexls-ui-lib/theme";

const projectAccents = [
  { value: "brand", label: "Marca", color: "#7c3aed" },
  {
    value: "brand-gold",
    label: "Dorado",
    color: "#facc15",
    foreground: "#111827",
  },
] as const satisfies readonly ThemeAccentDefinition[];

// En <head>, evita un cambio de color durante la hidratación.
<ThemeScript strategy="before-hydration" customAccents={projectAccents} defaultAccent="brand" />

<ThemeProvider customAccents={projectAccents} defaultAccent="brand">
  <ThemeController accentOptions={["blue", "brand", "brand-gold"]} />
</ThemeProvider>

value es el identificador persistido y debe comenzar con una letra minúscula; puede contener números, guiones y guiones bajos. Los nombres predefinidos están reservados. Para una marca con requisitos específicos se pueden indicar también foreground y ring mediante cualquier color CSS seguro.

Capacidades opcionales

Mapas, diagramas, QR y selección avanzada de color no se instalan con el núcleo. Agrega únicamente el paquete de la capacidad que realmente use la aplicación:

| Capacidad | Instalar | Importar | | --- | --- | --- | | Mapas | pnpm add maplibre-gl | framepexls-ui-lib/map | | Diagramas Mermaid | pnpm add mermaid | framepexls-ui-lib/diagrams | | Códigos QR | pnpm add qrcode | framepexls-ui-lib/qr | | Selector de color | pnpm add react-colorful | framepexls-ui-lib/color |

El editor Markdown funciona sin Mermaid y conserva el diagrama como un bloque de código legible. Para renderizarlo visualmente, conecta el adaptador opcional:

import { mermaidDiagramRenderer } from "framepexls-ui-lib/diagrams";
import { MarkdownEditor } from "framepexls-ui-lib/editors";

<MarkdownEditor
  value={value}
  onChange={setValue}
  diagramRenderer={mermaidDiagramRenderer}
/>

El import raíz continúa disponible para código existente, pero las aplicaciones nuevas deben preferir las entradas modulares. De esta forma, una aplicación que solo usa core no instala ni resuelve estas capacidades.

Catálogo por nivel

| Nivel | Responsabilidad | Componentes principales | | --- | --- | --- | | Fundamentos | Tema, color, tipografía, foco, espacio, radios, sombra y movimiento | theme.css, MotionProvider, Animations, iconos | | Átomos | Una función clara y composición libre | Button, ActionIconButton, Input, Textarea, Checkbox, Switch, RadioGroup, Badge, Spinner, Skeleton, Progress, Separator, VisuallyHidden | | Moléculas | Átomos conectados por una tarea | FormField, FormGroup, Alert, Collapsible, Accordion, DescriptionList, CopyableField, CodeBlock, Select, ComboSelect, DateTimeField, SearchInput, PasswordField, Pagination, Breadcrumb, SegmentedTabs | | Organismos | Flujos completos reutilizables | Dialog, Drawer, DataTable, PageScaffold, Sidebar, AppTopbar, PeoplePicker, RepeatableFieldset, PricingCard, ProcessShowcase, UsageMeter, CalendarBoard, SelectionTree, GroupedView, KnowledgeBase, MediaLibraryLayout, SupportChatWidget |

El inventario y las reglas completas viven en DESIGN_SYSTEM.md. Las mejoras futuras, su prioridad y sus criterios de aceptación se mantienen en ROADMAP.md.

Formularios

FormField enlaza automáticamente etiqueta, ayuda y error mediante id, aria-describedby, aria-invalid y aria-required.

<FormField
  label="Dominio permitido"
  hint="Escribe el dominio sin rutas adicionales."
  error={errors.domain}
  required
>
  <Input name="domain" placeholder="ejemplo.com" />
</FormField>

Para grupos de controles usa FormGroup; para una opción binaria usa Switch; para una sola elección dentro de una lista usa RadioGroup; para varias elecciones independientes usa Checkbox.

Estados de interfaz

<Alert tone="warning" title="Cuota por terminar" actions={<Button size="sm">Ver planes</Button>}>
  Te quedan 12 solicitudes. La cuota se reinicia el 31 de julio.
</Alert>

<Progress value={88} tone="warning" label="Uso mensual" showValue />
<Skeleton shape="text" lines={3} />
  • Skeleton reserva el espacio del contenido que todavía no existe.
  • Spinner acompaña acciones breves cuyo tamaño no cambia.
  • Progress comunica avance conocido o indeterminado.
  • Alert comunica información persistente y accesible; los Toast son para confirmaciones efímeras.

Patrones de producto

La primera colección de patrones compartidos evita repetir estructura, estados y accesibilidad en las aplicaciones:

| Necesidad | Componente | | --- | --- | | Mostrar atributos de un registro | DescriptionList y DescriptionItem | | Colapsar secciones relacionadas | Accordion y Accordion.Item | | Seleccionar una o varias personas | PeoplePicker | | Editar colecciones repetibles | RepeatableFieldset | | Mostrar y copiar claves o URLs | CopyableField | | Presentar código, JSON o scripts | CodeBlock | | Construir páginas de suscripción | PricingCard, PricingGrid, FeatureList, BillingIntervalSelector y SubscriptionSummary | | Explicar un flujo conectado | ProcessShowcase | | Comunicar cuota o consumo | UsageMeter | | Organizar eventos por año, mes, semana o día | CalendarBoard | | Seleccionar permisos u opciones jerárquicas | SelectionTree o su alias PermissionTree | | Presentar tablas o listas por grupos colapsables | GroupedView y GroupedViewSection |

import {
  BillingIntervalSelector,
  PeoplePicker,
  PricingCard,
  PricingGrid,
  UsageMeter,
} from "framepexls-ui-lib/core";

<PeoplePicker
  label="Responsables"
  options={team}
  value={assigneeIds}
  onChange={setAssigneeIds}
/>

<UsageMeter
  title="Solicitudes mensuales"
  used={820}
  limit={1000}
  resetsAt="el 1 de agosto"
/>

<PricingGrid>
  <PricingCard
    name="Heliip Support"
    price="$999 MXN"
    interval="al mes"
    features={["1,000 solicitudes", "30 solicitudes por minuto"]}
  />
</PricingGrid>

Accordion, PeoplePicker, ProcessShowcase y los controles de planes admiten uso controlado. Los textos predeterminados pueden reemplazarse mediante props cuando el producto necesita otro idioma o vocabulario.

Principios de uso

  • Usa primero un componente existente y compón antes de crear una variante local.
  • Los colores provienen de variables del tema; evita hexadecimales en componentes de producto.
  • Los iconos compartidos se importan exclusivamente desde framepexls-ui-lib y se implementan en src/iconos.
  • Toda interacción debe funcionar con teclado, foco visible y lectores de pantalla.
  • El movimiento explica un cambio de estado; no debe retrasar una tarea ni mover contenido de forma brusca.
  • Los estados loading, vacío, error, deshabilitado y modo oscuro forman parte del componente, no son detalles posteriores.

Calidad

pnpm typecheck
pnpm lint
pnpm test:unit
pnpm test:coverage
pnpm test:hydration
pnpm check:design
pnpm build
pnpm api:check
pnpm size:check
pnpm compat:smoke
pnpm storybook
pnpm test:interactions
pnpm test:a11y
pnpm test:visual
pnpm check:stories
pnpm check:all

lint aplica reglas modernas de TypeScript, hooks y accesibilidad sin permitir que aumente la deuda heredada; los módulos nuevos de lógica usan revisión tipada estricta. test:coverage protege calendario, paginación, documentos, contraseñas, Sidebar, árboles de selección, políticas de ShareAccess, transformaciones de gráficas y formatos numéricos con cobertura V8 y umbrales verificables. test:hydration construye una aplicación Next real y valida en Chromium y WebKit el HTML del servidor, Strict Mode, foco, portales, bloqueo de scroll y controles hidratados. api:check compara las firmas TypeScript y las subrutas públicas con reportes versionados. size:check construye consumidores mínimos con tree-shaking y bloquea aumentos fuera del presupuesto para la raíz, entradas temáticas, un componente directo, un icono y las hojas CSS. check:design protege exports esenciales, tokens, entradas modulares, capacidades opcionales, el sistema de iconos y el uso válido de SVG. pnpm build genera declaraciones, valida el paquete con publint y comprueba sus tipos con Are the Types Wrong. Storybook documenta los estados reales y ejecuta sus flujos de interacción en navegador. La accesibilidad se valida con axe en tema claro, oscuro y colores forzados, además de una matriz de Firefox, WebKit, móvil, inglés y movimiento reducido. test:visual compara el catálogo completo en claro y oscuro, y una selección crítica en 320 px, 390 px, tablet, horizontal, colores forzados, inglés, Firefox y WebKit; todas las capturas verifican que no haya desbordamiento horizontal. test:visual:update renueva explícitamente todas las referencias. La lista de revisión humana está en ACCESSIBILITY.md. compat:smoke renderiza el núcleo con la versión activa de React y valida Next 16. El CI ejecuta además la matriz Node 22/24 con React 18/19. pnpm check valida tipos, lint, cobertura, diseño, API, tamaño, distribución y catálogo; pnpm check:all agrega las pruebas de interacción, hidratación, accesibilidad y regresión visual.