nave-ui-icons
v0.1.0
Published
React icon library for Nave Design System
Readme
nave-ui-icons
Libreria de iconos React para el Design System de Nave.
La libreria se penso para resolver tres cosas:
- centralizar los iconos del sistema en un solo paquete
- exponer una API estable para apps y librerias
- evitar que cada proyecto importe SVGs sueltos o dependa de una implementacion distinta
Que contiene
nave-ui-icons expone dos consumos principales:
nave-ui-iconsUsa iconos estaticos tipo Lucide.nave-ui-icons/iconsUsa los iconos Nebula del Design System.
Para el sistema de producto, el import recomendado es nave-ui-icons/icons.
Como se creo la libreria
La libreria se armo como un paquete independiente dentro de packages/ui-icons.
El flujo fue este:
- Se creo un paquete React separado para que los iconos no vivan mezclados con
ui-library. - Se definio una API unica para los iconos del sistema:
NebulaIcon. - Se tomaron como fuente los iconos de
icons.xmly los SVGs agregados ensrc/figma. - Se genero un catalogo tipado para poder buscar, documentar y renderizar iconos de forma consistente.
- Se dejo el paquete con build ESM, CJS y tipos para poder publicarlo o moverlo a otro proyecto.
Archivos clave:
packages/ui-icons/package.jsonpackages/ui-icons/tsup.config.tspackages/ui-icons/src/icons.tspackages/ui-icons/src/figma/index.tsxpackages/ui-icons/src/catalog.ts
Instalacion
Opcion A: paquete publicado
npm install nave-ui-iconsOpcion B: consumo local dentro de un monorepo
En el package.json del proyecto consumidor:
{
"dependencies": {
"nave-ui-icons": "file:../ui-icons"
}
}Despues:
npm installComo importarla
Import recomendado para iconos del Design System
import { NebulaIcon } from 'nave-ui-icons/icons';Import recomendado si el nombre viaja por props
import { NebulaIcon, type NebulaIconName } from 'nave-ui-icons/icons';Import de iconos estaticos tipo Lucide
import { SearchIcon, ChevronRightIcon } from 'nave-ui-icons';Como usarla
Caso simple
import { NebulaIcon } from 'nave-ui-icons/icons';
export function SearchButton() {
return (
<button className="inline-flex items-center gap-2">
Buscar
<NebulaIcon name="Search" size={18} />
</button>
);
}Caso con props tipadas
import { NebulaIcon, type NebulaIconName } from 'nave-ui-icons/icons';
type ItemProps = {
icon: NebulaIconName;
label: string;
};
export function Item({ icon, label }: ItemProps) {
return (
<div className="inline-flex items-center gap-2">
<NebulaIcon name={icon} size={16} />
<span>{label}</span>
</div>
);
}Color y accesibilidad
import { NebulaIcon } from 'nave-ui-icons/icons';
<NebulaIcon name="Search" size={16} aria-hidden="true" />
<NebulaIcon name="Bell" size={20} color="#652BDF" aria-hidden="true" />
<NebulaIcon name="AlertCircle" size={20} title="Hay alertas pendientes" />Reglas de uso para el equipo
- Si el componente necesita un icono oficial del sistema, importar desde
nave-ui-icons/icons. - No importar SVGs sueltos dentro de una app si ese icono puede vivir en esta libreria.
- Usar
sizepara escala. - Usar
coloroclassNamepara integrarlo al estilo del componente. - Para iconos decorativos, usar
aria-hidden="true". - Para iconos con significado, usar
titleo acompanarlos con texto visible. - Si falta un icono, primero agregarlo a
ui-iconsy despues consumirlo.
Que tener en cuenta al llevarla a otro proyecto
- El proyecto consumidor necesita
react. - El proyecto consumidor tambien debe resolver las dependencias del paquete.
- Si vas a publicar la libreria, conviene mantener el nombre del paquete y sus subpaths estables.
- El import para Nebula debe seguir siendo
nave-ui-icons/iconspara no romper adopcion futura. - Si el otro proyecto no usa el resto del monorepo, esta libreria igual puede funcionar de forma aislada porque sale compilada en
dist.
Build y chequeos
Dentro de packages/ui-icons:
npm run typecheck
npm run buildSalida esperada:
dist/index.*dist/dynamic.*dist/icons.*dist/catalog.*
Resumen rapido
nave-ui-icons= iconos estaticosnave-ui-icons/icons= iconos Nebula del Design SystemNebulaIcon= API recomendada para producto- si falta un icono, se agrega en esta libreria antes de usarlo en otra app
