El criterio · tres kits ajenos auditados en agosto de 2026
El código de otro no entra como está
Traer un componente de una galería pública parece gratis. No lo es: de once piezas que entraron al kit desde un repositorio de seis mil estrellas, once tenían al menos un defecto real — de accesibilidad, de compatibilidad o de dependencias. Ninguno de estilo. Esta página es la lista que salió de ahí, con el caso concreto que produjo cada regla.
- Evaluados
- 33
- Portados
- 11
- Sin defectos
- 0
- Descartados
- 22
Las tres fuentes
Antes de decidir que un repositorio es bueno, se corren sus propias reglas contra su propio código. Medir separa el principio real del aspiracional, marca dónde la fuente está peor que uno — y a veces destapa un error propio que la comparación hace visible. Las tres fuentes están fijadas por commit: dentro de seis meses habrán cambiado, y lo que se midió va a seguir siendo lo que dice acá.
| Fuente | Licencia | Medido sobre | Lo que apareció al medir |
|---|---|---|---|
ibelick/motion-primitives | MIT | 92586e6 · 19 mar 2026 | 0 de 33 componentes respetan «movimiento reducido». Tres de ellos son loops infinitos que no paran nunca. |
WatermelonCorp/watermelon-platform | MIT | dcd525d · 17 ago 2026 | Publica sus principios de diseño como norma y los incumple 695 veces en su propio repositorio. |
bklit | MIT (charts) · propietaria (Studio) | 17 ago 2026 | Comparar su theming contra el nuestro destapó un bug NUESTRO: 5 de 7 colores de gráficos apuntaban a variables que no existían. |
La licencia se lee antes que el código
Antes de abrir un archivo. Permisiva se porta citando el origen; propietaria no se toca, ni «para inspirarse en el código». Un mismo repositorio puede tener licencias distintas por carpeta: bklit tiene los gráficos abiertos y el resto cerrado. La idea se copia, el código no.
Los ocho defectos
Cada uno con el caso real que lo destapó. Ninguno es hipotético, y ninguno se ve en una captura de pantalla — que es exactamente por qué un catálogo de componentes se elige mirando el código y no la demo.
Color escrito a mano, y otra vez para el tema oscuro
El texto con brillo fijaba un gris a mano y repetía la definición completa del degradado para modo oscuro. Dos copias de la misma expresión: la primera vez que alguien toca una, el tema queda partido.
Cero respeto por «movimiento reducido»
Ninguno de los 33 componentes lo menciona, en ninguna forma. No es que delegue la decisión en el ancestro: la preferencia no aparece en el repositorio. Para quien tiene vértigo o migraña, tres de esos componentes son una animación que no para.
Una dependencia que no hace falta
El contador deslizante traía una librería entera de medición para averiguar un alto que la unidad tipográfica ya define. Se portó sin ella y funciona igual.
Motor de animación para algo que era CSS
El desenfoque progresivo montaba capas de la librería de movimiento que no animaban absolutamente nada. Peso de runtime para un degradado quieto.
Accesibilidad que parece puesta y no funciona
El diálogo declara qué elemento lo nombra apuntando a un identificador que su propio título nunca escribe. El lector de pantalla anuncia un diálogo sin nombre. En el mismo archivo ocurre dos veces: la descripción tiene el mismo error y no estaba registrado en ningún lado.
Efecto secundario sobre un nodo ajeno
El foco de luz escribe el estilo de posicionamiento de su elemento padre desde un efecto. Un componente que modifica un nodo que no es suyo rompe al que lo monta, no a sí mismo.
Una API de CSS con soporte parcial que falla callada
El borde animado usa una función de recorte que no está en todos los navegadores. Donde falta, el indicador de progreso se queda quieto: no da error, no avisa. Simplemente miente sobre el estado del proceso.
Reimplementa infraestructura que ya existía
El diálogo reescribe el bloqueo de scroll y la trampa de foco desde cero, peor que los que ya estaban en el kit. Dos caminos para lo mismo y nadie sabe cuál es el bueno.
Los ocho son tres causas
Los defectos 01, 02 y 05 comparten una: el autor no tiene consumidores. Nadie le reportó que el brillo es invisible en su tema, que la animación no para, o que el diálogo no se anuncia. Los defectos 03, 04 y 08 comparten otra: el autor distribuye archivos sueltos, así que no puede apoyarse en infraestructura y termina reimplementándola o importándola. El 06 y el 07 son de otra clase: fallan en silencio, en un subconjunto de entornos, y por eso sobreviven a la revisión del propio autor.
Buscar por causa y no por síntoma es lo que convierte ocho anécdotas en algo que sirve para auditar el noveno repositorio.
Las cinco adaptaciones
Portar no es copiar: es traducir. El código de galería está escrito para un proyecto genérico que no existe — sin sistema de diseño, sin decisiones registradas, sin consumidores. El nuestro tiene las tres cosas. Un archivo que entra sin traducirse no es velocidad: es deuda con la firma de otro.
El color entra por variable, nunca por valor
Todo color pasa por el preset. El bloque duplicado para tema oscuro desaparece: la variable ya sabe seguir al tema. Lo verifica un gate, no una revisión.
«Movimiento reducido», en el componente
Heredarlo del ancestro no alcanza: la configuración global neutraliza desplazamientos, pero no una altura que crece, ni un degradado que viaja, ni una animación escrita en CSS. Cada pieza se apaga sola o no está terminada.
Los tiempos también son variables
Duraciones, curvas y escalonados salen del vocabulario de movimiento del sistema. Un número suelto es una pieza que se mueve distinto que las otras siete.
Primero se busca en casa
Antes de aceptar el bloqueo de scroll, la trampa de foco o el detector de clic afuera que trae el original: buscarlo en el kit. Suele estar, y suele estar mejor, porque el nuestro tiene consumidores que reportan.
La dependencia se justifica o no entra
Nativo antes que librería. Una dependencia nueva por un port es la forma más cara que existe de ahorrar veinte líneas.
El corolario práctico es el que se usa como control: si un port terminó y no cambió nada, no se auditó. En once componentes, cero entraron sin cambios.
Un control en verde no es un paquete auditado
El defecto estaba en el control, no en el paquete
Un paquete de layouts pasó el control de movimiento con cero hallazgos teniendo un panel lateral que cruza 288 píxeles y una hoja inferior que sube el alto completo de la pantalla, ninguno de los dos apagable. El control sólo miraba animaciones en bucle. Un checker es una hipótesis sobre dónde está el daño, y el primer paquete que audita una regla nueva no es el que la cumple: es el que la escribe.
Una regla que marca lo correcto se apaga sola
La primera versión de la regla de movimiento devolvió 347 hallazgos y la enorme mayoría era código correcto. Afilada a lo que realmente es decorativo, la misma regla devolvió 3 — y los 3 eran reales. Una regla ruidosa no se cumple: alguien la saca del build, y se lleva puestas también las que sí servían.
El atajo que ahorra la mitad de las pasadas: buscar la magnitud, no la propiedad. Un desplazamiento de 8 píxeles acompañando un fundido no le hace daño a nadie; uno del 100% del elemento, sí. Cuando lo que distingue el caso malo del bueno es un número, la regla va sobre el número.
Una regla nueva sobre código viejo: línea de base, no amnistía
Una regla escrita después que el código encuentra deuda que nadie pudo haber evitado. Metida en el build tal cual, el desenlace no es que la arreglen: es que alguien saca el control entero. Lo heredado se congela en una lista con nombre y línea, falla sólo lo nuevo, y la lista se regenera cuando alguien resuelve uno. Lo que no se hace nunca es bajar la severidad para que no moleste: un aviso que nadie mira es una regla apagada con pasos extra.
El punto ciego que se asume siempre
Tres auditorías independientes, sobre tres fuentes distintas, en la misma tanda. Dos aterrizaron en lo mismo por caminos separados: el respeto por «movimiento reducido» es el punto ciego estándar del ecosistema. La postura operativa que sale de ahí es asumir que lo que venga de afuera no lo respeta, y verificarlo antes de creer lo contrario.
La tercera enseña algo distinto y también repetible: comparar contra una fuente externa audita el código propio de rebote. La auditoría de bklit no terminó portando nada; terminó encontrando que cinco de los siete colores de nuestros gráficos apuntaban a variables inexistentes. Si una comparación no destapó nada propio, hay que mirar de nuevo.
Qué no se porta, nunca
El motor. Cambiar la librería de gráficos o la de movimiento no es un port: es una migración, y necesita su propia decisión.
Lo que ya existe con otro nombre. El costo de un componente duplicado no es el archivo: es que ahora hay dos caminos para lo mismo.
Lo que no encaja con el producto. Un menú estilo macOS y un cursor personalizado son excelentes y no van a aparecer nunca en una aplicación de gestión.
Lo que tiene licencia restrictiva. Sin excepciones ni matices.
Para qué sirve esta lista
Para la próxima vez. Cuando aparezca el repositorio número cuatro —y va a aparecer, porque siempre hay una galería nueva que resuelve algo que nos falta— esta página es lo que evita empezar de cero: la licencia se mira antes que el código, los ocho defectos son la checklist, y las cinco adaptaciones son el mínimo para dar un port por terminado.
Y la lista de lo que quedó afuera vale tanto como la de lo que entró. Sin ella, dentro de tres meses alguien vuelve a evaluar los mismos 22 componentes descartados y llega a la misma conclusión, pagando el mismo tiempo dos veces.
Auditorías de agosto de 2026 sobre commits fijados · cada regla se conserva como procedimiento ejecutable, no como documento · los controles que salieron de acá corren sobre cmp-packages en cada commit.
La pregunta de al lado: qué le falta al kit
Esta página es sobre lo que llega de afuera. La otra mitad del criterio es lo que no está adentro, y también se mide en vez de opinarse: si con las piezas del kit se puede rearmar una copia de un producto real, el kit está completo. El criterio de completitud es esa medición sobre GestorSalon — 252 símbolos del kit en uso, 113 que existían y esta galería no mostraba, y los siete huecos que quedan.