Fundamentos
Tokens de diseño
Una referencia tipada de la paleta, dimensiones y valores de movimiento de la biblioteca.
Qué cambia un token
NeuTokens expone 28 propiedades de tema. NeuThemeComponent también genera 45 variables CSS a partir del tema resuelto. Las propiedades y las variables permiten utilizar las mismas decisiones de diseño; no son catálogos independientes. Utiliza Partial<NeuTokens> para personalizar solo las propiedades que necesites.
Los tokens afectan a los componentes y estilos que los utilizan. No sobrescriben universalmente todas las primitivas nativas. Por ejemplo, spacing controla el padding de Card y tus estilos que usan --neu-spacing; no sustituye todos los gaps y paddings fijos de la biblioteca.
Tokens de color: valores predeterminados exactos
Todas las propiedades de color son strings. Estos son los valores claros y oscuros distribuidos con Neural Native 0.1.0. Personaliza conjuntamente las parejas semánticas y revisa el contraste del texto en ambos modos.
| Token | Claro | Oscuro | Función |
|---|---|---|---|
| accent | #006ee6 | #b5c4ff | Acciones principales y estados seleccionados. |
| onAccent | #ffffff | #172955 | Texto e iconos sobre un fondo accent. |
| surface | #ffffff | #1b2230 | Fondos de tarjetas y controles. |
| canvas | #f4f5f7 | #111722 | Fondo del contenedor del tema. |
| text | #172033 | #edf1fa | Texto principal y etiquetas. |
| muted | #596477 | #b4bed0 | Texto secundario, ayudas y placeholders. |
| border | #a5afbf | #6c7a92 | Bordes funcionales de inputs y otros controles. |
| tonal | #eff6ff | #293756 | Fondo suave para acciones tonales. |
| danger | #dc2626 | #ffb4ab | Errores y mensajes de acciones destructivas. |
| success | #15803d | #8fdeb1 | Estados positivos y confirmaciones. |
| warning | #f59e0b | #efd48f | Avisos que requieren atención. |
| warningText | #92400e | #efd48f | Texto de advertencia legible en botones transparentes o tonales. |
| onWarning | #111827 | #111722 | Texto e indicadores de carga sobre un botón warning sólido. |
| info | #0064d1 | #7dd3fc | Mensajes y acciones informativas. |
Las variables de estilo utilizan el prefijo --neu-: --neu-accent, --neu-surface, --neu-canvas, --neu-text, --neu-muted, --neu-border, --neu-tonal, --neu-danger, --neu-success, --neu-info y --neu-warning. La propiedad onAccent pasa a llamarse --neu-on-accent.
Texto semántico, superficies y visores de imágenes
Estas propiedades opcionales de NeuTokens también forman parte de la API pública del tema. Los objetos predeterminados proporcionan los valores de superficies y del visor de imágenes. Si se omite una personalización de texto semántico, la biblioteca resuelve un color de texto legible para ese tono.
| Propiedad | Claro | Oscuro | Función |
|---|---|---|---|
| accentText | Automático | Automático | Texto de marca legible; se resuelve automáticamente si se omite. |
| dangerText | Automático | Automático | Texto destructivo legible; se resuelve automáticamente si se omite. |
| successText | Automático | Automático | Texto de confirmación legible; se resuelve automáticamente si se omite. |
| infoText | Automático | Automático | Texto informativo legible; se resuelve automáticamente si se omite. |
| surfaceBorder | #e1e6ed | #354052 | Bordes decorativos de superficies, independientes de los bordes de controles. |
| divider | #e7ebf0 | #303b4c | Separadores entre contenidos relacionados. |
| surfaceSecondary | #eef1f5 | #222d3f | Superficies secundarias dentro de una composición. |
| mediaCanvas | #111722 | #111722 | Fondo de imágenes a pantalla completa, independiente del tema de la aplicación. |
| mediaText | #edf1fa | #edf1fa | Controles legibles del visor sobre el fondo de imágenes. |
| mediaBarStyle | light | light | Contenido claro u oscuro de las barras del sistema en el visor: light o dark. |
Dimensiones, tipografía y movimiento
| Token | Claro | Oscuro | Uso y unidad |
|---|---|---|---|
| radius | 12 | 12 | Radio de esquinas. Número convertido a px en --neu-radius. |
| spacing | 16 | 16 | Espacio base utilizado por consumidores como el padding de Card. Se convierte a px. |
| fontSize | 16 | 16 | Tamaño de fuente en controles que usan --neu-font-size. Se convierte a px. |
| duration | 120 | 120 | Duración de transiciones donde se utiliza. Se convierte a ms; no controla globalmente las animaciones. |
Estas cuatro propiedades son números. Pasa radius: 16, no radius: "16px". El layout nativo resuelve px según las unidades del framework; no los interpretes como píxeles físicos de la pantalla.
El tema deriva de fontSize los tamaños e interlineados de ayudas, etiquetas, filas, encabezados y métricas; los componentes utilizan esas variables donde corresponde. No selecciona una familia de fuente ni sustituye todos los tamaños fijos. Comprueba la ampliación del texto del sistema. El token duration no desactiva todas las animaciones: el movimiento reducido también depende del componente y del framework.
Referencia CSS completa del tema
Las siguientes variables se generan en neu-theme. Utilízalas en tus estilos nativos para compartir su paleta y escala. Para cambiar el tema de forma coherente, pasa las propiedades correspondientes de NeuTokens mediante [tokens]; una personalización CSS local no actualiza el valor inyectado de NEU_THEME ni los componentes que calculan sus colores a partir de él.
| Variable CSS | Claro | Oscuro | Origen en el tema resuelto |
|---|---|---|---|
| --neu-accent | #006ee6 | #b5c4ff | accent |
| --neu-accent-ink | #006bdf | #b5c4ff | accentText, o el color semántico de texto resuelto |
| --neu-danger-ink | #ca2323 | #ffb4ab | dangerText, o el color semántico de texto resuelto |
| --neu-success-ink | #147a3a | #8fdeb1 | successText, o el color semántico de texto resuelto |
| --neu-info-ink | #0064d1 | #7dd3fc | infoText, o el color semántico de texto resuelto |
| --neu-on-accent | #ffffff | #172955 | onAccent |
| --neu-surface | #ffffff | #1b2230 | surface |
| --neu-canvas | #f4f5f7 | #111722 | canvas |
| --neu-text | #172033 | #edf1fa | text |
| --neu-muted | #596477 | #b4bed0 | muted |
| --neu-border | #a5afbf | #6c7a92 | border |
| --neu-surface-border | #e1e6ed | #354052 | surfaceBorder |
| --neu-divider | #e7ebf0 | #303b4c | divider |
| --neu-surface-secondary | #eef1f5 | #222d3f | surfaceSecondary |
| --neu-control-radius | 10px | 10px | radius × 5 / 6 px |
| --neu-surface-radius | 16px | 16px | radius × 4 / 3 px |
| --neu-overlay-radius | 16px | 16px | radius × 4 / 3 px |
| --neu-dialog-radius | 24px | 24px | radius × 2 px |
| --neu-caption-size | 13px | 13px | fontSize × 0.8125 px |
| --neu-label-size | 14px | 14px | fontSize × 0.875 px |
| --neu-row-size | 15px | 15px | fontSize × 0.9375 px |
| --neu-heading-size | 18px | 18px | fontSize × 1.125 px |
| --neu-metric-size | 32px | 32px | fontSize × 2 px |
| --neu-space-4 | 4px | 4px | spacing × 0.25 px |
| --neu-space-6 | 6px | 6px | spacing × 0.375 px |
| --neu-space-8 | 8px | 8px | spacing × 0.5 px |
| --neu-space-10 | 10px | 10px | spacing × 0.625 px |
| --neu-space-12 | 12px | 12px | spacing × 0.75 px |
| --neu-space-16 | 16px | 16px | spacing × 1 px |
| --neu-space-20 | 20px | 20px | spacing × 1.25 px |
| --neu-space-24 | 24px | 24px | spacing × 1.5 px |
| --neu-tonal | #eff6ff | #293756 | tonal |
| --neu-danger | #dc2626 | #ffb4ab | danger |
| --neu-success | #15803d | #8fdeb1 | success |
| --neu-warning | #f59e0b | #efd48f | warning |
| --neu-info | #0064d1 | #7dd3fc | info |
| --neu-radius | 12px | 12px | radius px |
| --neu-spacing | 16px | 16px | spacing px |
| --neu-font-size | 16px | 16px | fontSize px |
| --neu-caption-line | 18px | 18px | fontSize × 1.125 px |
| --neu-label-line | 20px | 20px | fontSize × 1.25 px |
| --neu-row-line | 21px | 21px | fontSize × 1.3125 px |
| --neu-heading-line | 24px | 24px | fontSize × 1.5 px |
| --neu-metric-line | 38px | 38px | fontSize × 2.375 px |
| --neu-duration | 120ms | 120ms | duration ms |
En las variables numéricas, la columna de origen indica el multiplicador y la unidad resultante. Los radios, tamaños, interlineados y espacios utilizan px; duration utiliza ms. Las variables de texto semántico pueden calcularse a partir del tema en lugar de copiar directamente un color de acento.
Conserva los tokens personalizados en un archivo tipado
Crea src/app/theme-tokens.ts y exporta las personalizaciones que utilizará el tema raíz. El operador satisfies comprueba nombres y tipos sin perder la inferencia de TypeScript. Este ejemplo distingue el texto de controles, las superficies decorativas y el fondo de imágenes a pantalla completa.
import type { NeuTokens } from '@neural-ui/native/foundation';
export const brandLight = {
accent: '#3B5BDB',
accentText: '#3048A5',
onAccent: '#FFFFFF',
tonal: '#EBEFFF',
surfaceBorder: '#D8DEEB',
divider: '#E8ECF3',
surfaceSecondary: '#F0F3FA',
mediaCanvas: '#101828',
mediaText: '#F1F5F9',
mediaBarStyle: 'light',
radius: 16,
} satisfies Partial<NeuTokens>;
export const brandDark = {
accent: '#B8C6FF',
accentText: '#C6D0FF',
onAccent: '#172955',
tonal: '#293756',
surfaceBorder: '#3B4863',
divider: '#33405A',
surfaceSecondary: '#263249',
mediaCanvas: '#101828',
mediaText: '#F1F5F9',
mediaBarStyle: 'light',
radius: 16,
} satisfies Partial<NeuTokens>;Los cuatro colores opcionales de texto semántico son personalizaciones explícitas: si los proporcionas, se utilizan tal cual. Comprueba su contraste con tus superficies. Los valores de mediaBarStyle son light y dark en ambos idiomas; describen el contenido de las barras del sistema, no el tema de la aplicación.
Si necesitas una paleta completa, combina el valor predeterminado exportado en lugar de mutarlo. Los valores predeterminados son objetos readonly congelados. El siguiente src/app/complete-tokens.ts es una alternativa a los objetos parciales anteriores, útil cuando un servicio necesita un valor NeuTokens completo.
import {
NEU_LIGHT_TOKENS,
NEU_DARK_TOKENS,
type NeuTokens,
} from '@neural-ui/native/foundation';
export const completeLight: Readonly<NeuTokens> = {
...NEU_LIGHT_TOKENS,
accent: '#3B5BDB',
onAccent: '#FFFFFF',
};
export const completeDark: Readonly<NeuTokens> = {
...NEU_DARK_TOKENS,
accent: '#B8C6FF',
onAccent: '#172955',
};Utiliza tokens en tus componentes nativos
Crea src/app/summary.component.ts y coloca app-summary dentro del neu-theme raíz. Las variables --neu-* permiten que los estilos nativos compartan la paleta. Para propiedades calculadas en TypeScript o enlaces de estilo, inyecta NEU_THEME y lee su signal. Un valor computed sigue los cambios del tema sin guardar una copia desactualizada.
import { Component, computed, inject } from '@angular/core';
import { Text, View } from '@ng-native/components';
import { NEU_THEME } from '@neural-ui/native/foundation';
@Component({
selector: 'app-summary',
imports: [Text, View],
template: `
<view class="panel" [style.borderColor]="borderColor()">
<text class="title">Your workspace</text>
<text class="description">Shared with your team</text>
</view>
`,
styles: `
.panel {
padding: var(--neu-space-20);
gap: var(--neu-space-8);
background-color: var(--neu-surface);
border-width: 1px;
border-radius: var(--neu-surface-radius);
}
.title { color: var(--neu-text); font-size: var(--neu-heading-size); line-height: var(--neu-heading-line); font-weight: 600; }
.description { color: var(--neu-muted); font-size: var(--neu-caption-size); line-height: var(--neu-caption-line); }
`,
})
export class SummaryComponent {
private readonly theme = inject(NEU_THEME);
readonly borderColor = computed(() => this.theme().surfaceBorder ?? this.theme().border);
}Este ejemplo necesita un tema antecesor porque inyecta NEU_THEME directamente. Conserva los estilos de tokens nativos dentro de la app o playground nativo. La documentación utiliza Neural UI v2 y su propio tema web; no apliques sus estilos web al preview Native.