Entrixy — guía de diseño

Un documento vivo. Recoge las calibraciones, el ritmo y los acuerdos sobre la interfaz, y se actualiza cada vez que algo queda decidido.

Contenido
  1. Iconos: tamaños y calibración
  2. Typography
  3. Ritmo y espaciado
  4. Colores y niveles
  5. Controls
  6. Animations
  7. Reglas del texto
  8. Patrones de interacción
  9. Qué no tocar

1. Iconos: tamaños y calibración

El problema

Los iconos Material de androidx.compose.material.icons.outlined.* comparten un tamaño nominal —una rejilla de 24×24— pero la parte dibujada difiere de uno a otro. Dales a todos un simple Modifier.size(24.dp)y unos se verán grandes y pesados (Bolt, Delete) mientras otros parecerán diminutos (Contacts, VpnKey). Hay que calibrarlos a mano.

El método de calibración

  1. Hacer una captura de la pantalla con los iconos en sus círculos de 38 dp: nuestro hueco de aterrizaje.
  2. Con Python, PIL y numpy, medir el rectángulo delimitador del glifo dibujado: su anchura y altura máximas en píxeles.
  3. La fórmula: new_size = 24 × 52 / measured_px, acotado a [18..28].
  4. Después centrarlo en el hueco de 38 dp, en vertical y en horizontal.

52 px es el glifo de referencia, Fingerprint; todo se mide contra él como unidad.

El mapa de tamaños resultante

IconTamañoWhy
Add, Apps, ArrowBack, Close28dplíneas finas, glifo de 36–41 px
AutoMode, Bolt, DeleteOutline, Edit, List, Photo, QrCode, Tune, DriveFileRenameOutline26dpdensidad media, glifo de unos 47 px
LocationOn24dpla chincheta del mapa: no tocar, es una referencia
LocationOff26dpla chincheta tachada: no tocar
ContentCopy, MyLocation, PeopleAlt, Wifi, ExpandMore, ExpandLess22dpanchos o altos, y visualmente pesados
Contacts, VpnKey20dpsobrecargados de detalle interno
No tocar: LocationOn (24), LocationOff (26), ExpandMore y ExpandLess (22). Son los iconos de referencia: se acordaron píxel a píxel y toda la calibración se mide a partir de ellos.

AutoMode

Se usa allí donde antes estaba Bolt: el botón de Automatización en la tarjeta de la clave, el icono de la sección en los ajustes. Tamaño 26 dp, igual que Bolt.

Dónde vive la tabla en el código

IconsDebugSheet.kt — el mapa iconSizeByName. La pantalla de depuración se abre desde SettingsScreen con el botón Iconos UI (depuración): arriba una FlowRow de iconos calibrados y abajo una lista de nombres, tamaños y contextos.

2. Tipografía

Usamos los roles estándar de Material 3, limitados a propósito a cuatro:

RoleTamaño / interlineadoDónde se usa
titleLarge SemiBold22sp/28spEl título de la hoja inferior (Para el invitado · <objeto>)
titleMedium SemiBold16sp/24spEncabezados de regla (Geolocalización, Wi-Fi, Intervalo, Activación) y etiquetas de FieldSection (Coordenadas, Radio, Modo, Redes guardadas)
bodyMedium14sp/20spRótulos de los botones de opción, el texto dentro de los botones píldora, nombres de los segmentos
bodySmall muted12sp/16spEstados y pistas (36540 m hasta el punto, 74 m · máximo, el invitado puede reducirlo, textos de ayuda). Color: onSurfaceVariant
Rule: no mezclar grosores dentro de un rol. Si algo es titleMedium SemiBold, es SemiBold en todas partes: no regular aquí y Semi allá.

3. Ritmo y espaciado

La escala

Acordamos trabajar en múltiplos de 2 / 4 / 8 / 10 / 14 / 16 / 20. Nada de festín o hambruna: los elementos iguales reciben espacios iguales.

Entre tarjetas en el desplazamiento principal

Dentro de una tarjeta (RuleCard)

Dentro de una FieldSection (etiqueta más contenido)

Botones píldora y estados

Los deslizadores son un caso aparte

Un deslizador de Material 3 ocupa unos 48 dp de maquetación por el área táctil mínima, de los cuales la pista visible son solo unos 4 dp en el centro, con unos 22 dp de zona táctil vacía arriba y abajo. De ahí que:

El resultado: la distancia del último elemento visible —píldora, botón de opción o mango del deslizador— al borde inferior de la tarjeta es casi la misma en todas.

4. Colores y niveles

Tres niveles de confianza en el invitado

Cada regla —Geolocalización, Wi-Fi, Tiempo, Autorización, Confirmación— y el bloque de Activación toman uno de tres niveles. El círculo del icono de la tarjeta toma el color correspondiente cuando el interruptor está encendido.

KeyLabelColourDescription
own Decide el invitado #3BA55D (green) El invitado elige él mismo el ajuste
suggest Preset #E5B409 (yellow) El valor está fijado y el invitado puede cambiarlo
force Locked #CC3322 (red) El valor está fijado y el invitado no puede cambiarlo

Con el interruptor apagado el círculo se vuelve gris (#9AA0A6), sea cual sea el nivel elegido.

El sentido del máximo y el mínimo: in yellow (Predefinido) el valor del radio es un máximo y el invitado solo puede bajarlo. Con el número de redes Wi-Fi —el umbral de coincidencia— ocurre al revés: es un mínimo que el invitado solo puede subir. La dirección de la libertad se invierte, y los textos de estado lo dicen sin rodeos: máximo, el invitado puede reducirlo / mínimo, el invitado puede aumentarlo.

Reglas para las descripciones de los niveles

5. Controles

El círculo de color con icono (38 dp)

Un único hueco de aterrizaje de 38 dp en toda la aplicación:

Botones de opción

Envolverlos en Box(Modifier.size(38.dp), contentAlignment=Center) { RadioButton(...) } para que el centro del círculo del botón coincida con el centro del círculo de color de arriba. Sin la envoltura el botón se desplaza en horizontal, porque RadioButton se dibuja con sus propios rellenos.

Entre el botón de opción y su texto: Spacer(14.dp). Entre filas de botones de opción de un grupo: Column(spacedBy(4.dp)).

El área táctil mínima está desactivada: CompositionLocalProvider(LocalMinimumInteractiveComponentEnforcement provides false) — si no, cada fila de opción se hincha hasta 48 dp y rompe el ritmo.

Switch

Un interruptor estándar de Material 3, a la derecha del título de la tarjeta. Apaga la regla entera y entonces no se muestra el color del nivel: el círculo queda gris.

Fila segmentada

Un control propio para cambiar de modo dentro de una regla, hoy solo en Wi-Fi: Por una red concreta / Por las redes de alrededor. Dos elementos en una Row, cada uno con weight(1f):

Botones píldora

Un contorno, un icono y texto, del todo redondeados. Para acciones secundarias: Usar la posición actual, Capturar las redes de alrededor. Cuando están desactivados, el contorno y el texto bajan a alpha=0.4.

Slider

Véase la sección 3 sobre offset(y=-16.dp) y sliderTrim(). Antes de un deslizador siempre va un StatusLine con texto de estado (bodySmall, atenuado): 74 m · máximo, el invitado puede reducirlo.

El desplegable de niveles

Se abre tocando la fila de título de la tarjeta: toda la Row salvo el interruptor. Aparece justo bajo la cabecera, a todo el ancho del contenido de la tarjeta. Para eso:

Los elementos del desplegable respiran en vez de ser filas planas: un marcador de color a la izquierda, la etiqueta en negrita y debajo la descripción en letra pequeña y atenuada. Se alinean en vertical por la primera línea, la etiqueta.

6. Animaciones

El círculo pulsante de Activación

A diferencia de los círculos de color normales de las reglas, el círculo de la cabecera de Activación late.

No tocar la fórmula de la opacidad. Costó varias iteraciones, y cualquier simplificación —lineal (1−p) o ease-out— produce un tirón visible.

7. Reglas del texto

Punctuation

Una sola frase en una cadena de la interfaz no lleva punto. Los puntos aparecen solo cuando hay dos frases o más, para separarlas. Vale para toda descripción, pista, estado, indicación emergente, encabezado y frase suelta.

En qué voz escribimos

Elegir entre un máximo y un valor exacto

En los estados del deslizador en modo amarillo (Predefinido) indicamos sin rodeos la dirección de la libertad:

En rojo (Bloqueado): 74 m · exactamente / 5 de 7 · exactamente.

Los nombres de los niveles están asentados

Decide el invitado / Predefinido / Bloqueado han cuajado; no los cambiamos.

8. Patrones de interacción

Un interruptor o una opción de radio no seleccionado

Si una regla tiene estado apagado, exprésalo con un interruptor y no con una opción de radio del tipo No hace falta / No / Apagado. Si no, el usuario tiene dos maneras de apagar lo mismo, y eso confunde.

Examples:

Las coordenadas y las acciones a la derecha

En el bloque de Coordenadas los iconos de copiar y borrar están a la derecha a la altura de ambas líneas (la etiqueta y el estado). Implementado como Row { Column(weight=1f) { label; status }; CopyIcon; DeleteIcon }. Los iconos se centran en vertical respecto al par completo.

Mostrar y ocultar el cuerpo de una tarjeta

El cuerpo se despliega solo cuando:

Animation: expandVertically(tween(220)) + fadeIn(tween(220)) al abrir, shrinkVertically(tween(180)) + fadeOut(tween(120)) al cerrar.

Cuándo mostrar el diálogo Clave añadida

Al recibir una clave de invitado, solo si la aplicación está en pantalla y la clave es nueva y no repetida. Si no, la guardamos en silencio.

9. Qué no tocar

Documentos relacionados

Última actualización: 18 de abril de 2026 · versión del documento 2.07