# Guía de marca Astroline para contenido hecho con IA

> Versión pública · 2026-11-04 · Equipo Astroline · www.astroline.com/marca
>
> Esta guía sirve para dos cosas: **como contexto para cualquier herramienta de IA** (Claude, v0, Lovable, Cursor, Higgsfield, Midjourney, Runway, Veo, ElevenLabs…) que produzca algo en nombre de Astroline, y **como lista de revisión** para la persona que lo publica.
>
> La fuente de verdad es la web en producción (www.astroline.com, rediseño de octubre de 2026) y su código. Todos los valores de este documento salen del código de la web. Si el código cambia, esta guía se actualiza con él.

---

## 1. Cómo usar esta guía

Todo lo que se haga con IA en nombre de Astroline tiene que parecer hecho por el mismo equipo que hizo www.astroline.com, y nunca «hecho por una IA».

**Aplica a:** webs y landings, plataformas y paneles, vídeos y animaciones, imágenes y creatividades, posts de redes y del blog, correos, presentaciones y cualquier texto de cara a clientes.

**Cómo pasársela a una IA:**

1. Pega la guía entera como instrucciones del proyecto o contexto del sistema, no resumida. Para herramientas con poco contexto, pega como mínimo las secciones 2–8, 11 y el prompt base que toque.
2. Añade el prompt base de la [sección 26](#26-prompts-base) (web, imagen, vídeo o texto) y luego tu encargo.
3. Di siempre el **mercado** (México, España, Reino Unido o resto de Europa, EE. UU.): cambia lo que se puede decir.
4. Revisa el resultado con la [checklist](#27-checklist-antes-de-publicar). Si falla un punto marcado **Nunca**, no se publica.

**Prioridades:**

- Si la herramienta propone algo que choca con la guía, gana la guía.
- **Nunca** y **Siempre** no se negocian; el resto son criterios por defecto que se pueden justificar.
- Ante la duda, copia lo que ya hace la home.

---

## 2. Quién es Astroline

Astroline es un operador de voz (carrier) para operaciones de mucho volumen, y todo lo que hagamos tiene que contar una sola idea: **con Astroline, más llamadas acaban en conversación.** Somos la red de operador *AI-first*, para campañas con agentes de IA y con personas.

**A quién le hablamos:** contact centers, equipos de ventas y de cobranza que hacen millones de llamadas al mes, e integradores de plataformas de contact center (Genesys, inConcert, Voximplant). Son perfiles técnicos y de operación: valoran datos, rapidez y que no se les prometa humo.

**Mercados y versión de la web:**

| Mercado | Ruta | Idioma | Trato |
| --- | --- | --- | --- |
| México | `/mx` | Español de México | Usted |
| España | `/es` | Español de España | Tú |
| Reino Unido y resto de Europa | `/en` | Inglés británico | You |
| EE. UU. | `/us` | Inglés americano | You |

### Qué vendemos y dónde se puede contar

| Producto o capacidad | Qué es, en una línea | Mercados |
| --- | --- | --- |
| SIP Trunk | Troncal SIP de máxima calidad sobre red privada multicloud, redundada de extremo a extremo | Todos |
| Voz global | Voz en más de 85 países sobre nuestra red privada | Todos |
| Numeración | Números locales e internacionales, con prefijo local | Todos |
| Numeración 400 | Numeración con la que tienen que salir las llamadas comerciales en España (no la cobranza, la atención a clientes ni la selección de personal) | Solo España |
| VHunter | Detección de buzones en el early media, por frecuencia, antes del descuelgue | Todos |
| WhatsApp Calling | Llamadas de voz sobre WhatsApp Business | Todos |
| Detección de spam | Detectamos cuándo un número entra en spam | Solo México |
| Rotación de numeración | Reparto de llamadas entre los números del cliente | Solo México |
| SMS | Seguimiento por SMS | Solo México |
| ASR Vooster | Empujón a la contactación | Solo México |
| Marcación omnicanal | Tecnología de marcación predictiva, progresiva y power que integramos | Todos |
| Agentes IA | Agentes conversacionales de voz, WhatsApp y redes sociales que integramos o implementamos | Todos |
| Astra AI | Nuestro agente de WhatsApp para hablar con Astroline | Todos |

Las páginas «Rotación de numeración» y «ASR Vooster» solo existen en `/mx`; en los demás idiomas redirigen con 307 (`next.config.mjs`, `src/lib/mercados.js` → `SOLO_MEXICO`).

### Datos que se pueden usar tal cual

- Voz en **más de 85 países**.
- POPs en **Madrid, Ámsterdam, Virginia, Monterrey, Bogotá, Lima y São Paulo**.
- Certificación **ISO 27001:2022**.
- Astra AI por WhatsApp: **+34 910 88 86 20** (España y web en inglés) y **+52 1 55 9990 7556** (México y EE. UU.) — `src/lib/astra.js`.

**Sin confirmar, no usar todavía:** el uptime (99,99 % o 99,999 %), el número total de POPs (11 o 7) y la ISO 27701. Tampoco sirven de fuente `public/llms.txt` ni la web antigua: cuentan el posicionamiento anterior, centrado en Microsoft Teams.

### Nombres que se escriben siempre igual

- **VHunter**, junto y con V y H mayúsculas.
- **ASR Vooster**, nunca «Booster».
- **SIP Trunk**, **WhatsApp Calling**, **Astra AI**, **Astroline** (nunca ASTROLINE ni «astroline» en un texto; el logotipo va en minúsculas, el nombre no).

### Marcas de terceros

- **Nunca** nombrar ni mostrar PulseDial, 008 Agent ni 008 Engage como producto nuestro. Se habla del concepto: «marcación omnicanal», «agentes IA de voz», «agentes IA de WhatsApp». Solo salen en la página de Partners, como un partner más, al nivel de Genesys.
- Microsoft y Teams no protagonizan nada: solo aparecen en la página de telefonía corporativa.
- Los logos de integraciones (Genesys, Salesforce, HubSpot, Zendesk, Zoho, Five9, Talkdesk, Sprinklr, Avaya, NiCE, Voximplant, inConcert, Vapi, Retell, ElevenLabs, Pipedrive, Freshdesk) siempre en su versión oficial, de `public/images/marcas`, a través de `src/lib/marcas.js` y el componente `<Marca>`. Sin recolorear ni redibujar. De NiCE se usa el logo, nunca su «smile» suelto.

---

## 3. Voz y tono

Astroline habla como un ingeniero de red que sabe vender: concreto, seguro y sin adornos. El dato va antes que el adjetivo, y solo se promete lo que la red cumple.

### Cinco principios

| Principio | Así sí | Así no |
| --- | --- | --- |
| Concreto antes que bonito | «Detectamos el buzón antes del descuelgue.» | «Revolucionamos la detección con IA de última generación.» |
| El resultado del cliente | «Y cuida tu tasa de contacto.» | «Nuestra plataforma ofrece múltiples funcionalidades.» |
| Promesas que se cumplen | «Alta tasa de efectividad», «gran ahorro en buzones» | «100 % de buzones detectados», «nunca», «siempre», «garantizado» |
| Seguro, no grandilocuente | «Más que un operador.» | «El operador líder del mercado», «el mejor del mundo» |
| Técnico pero legible | «Reconocemos el buzón por la frecuencia de la señal, no por patrones del saludo.» | Siglas sin explicar o párrafos de especificaciones |

### El titular en dos tiempos

Es la firma de la marca. Cada titular tiene dos frases cortas, cada una con su punto: la primera dice el hecho y la segunda, lo que gana el cliente. En pantalla, la primera va en gris (`--soft` #5c5c68) y la segunda en negro (`--text` #0b0b10, dentro de `<em>`), seguidas en la misma línea, sin salto. Solo en el bloque de cierre cada frase va en su línea.

- «Millones de llamadas al mes. *Con la máxima contactación.*» (México)
- «La red de operador AI-first. *Para campañas con IA y personas.*» (España)
- «Sabe cuándo un número entra en spam. *Y cuida tu tasa de contacto.*»
- «Detectamos el buzón antes del descuelgue. *Y el contacto sigue por WhatsApp.*»
- «Tu voz, sobre una red privada. *SIP Trunk de máxima calidad.*»
- «Tu operación está en España. *Tu voz llega a más de 85 países.*»
- «Más que un operador. *La tecnología para sacarle partido.*»
- «Hablemos de tu operación. *Y de cómo contactar a más clientes.*»

Las palabras con guion («AI-first») no se parten nunca (`.hr-sin-corte { white-space: nowrap }`, helper `sinCortes` en `HeroContactacion.jsx`).

### Tratamiento por pieza

| Pieza | España (es) | México (mx) | Inglés (en, us) |
| --- | --- | --- | --- |
| Web y plataformas | Tú («Habla con un experto») | Usted («Hable con un experto», «Sepa cuándo…») | You, directo («Talk to an expert») |
| Blog y LinkedIn | Tú | Tú | You |
| Correos a leads | Tú | Usted (criterio por defecto, por coherencia con la web) | You |
| Vídeos y anuncios | Tú | Usted (criterio por defecto) | You |

El inglés de `/en` es británico (*dialling*, *optimise*, *dialler*) y el de `/us`, americano (*dialing*, *optimize*, *dialer*). México usa el español de México: «celular», no «móvil», cuando se habla del teléfono de la persona; «lada» para el prefijo local.

### Qué se cuenta en cada mercado

| Mercado | Mensaje principal | Nunca |
| --- | --- | --- |
| México | Millones de llamadas con la máxima contactación: SIP Trunk, detección de spam y de buzones, rotación de numeración y SMS. Voz en 85 países como extra | «Número quemado», «numeración siempre limpia» |
| España | Red de operador AI-first: SIP Trunk en España, numeración 400 para campañas comerciales, buzones antes del descuelgue y voz en 85 países sobre red privada | Spam, antispam, rotación de numeración, SMS |
| Reino Unido y Europa | SIP Trunk en el Reino Unido, marcación omnicanal, detección de buzones y voz en 85 países | Spam, rotación (Ofcom la considera uso indebido), SMS |
| EE. UU. | Lo mismo que Reino Unido, con SIP Trunk en EE. UU. | Spam, rotación (la FCC estudia restringirla), SMS |

Fuera de México, los filtros del flujo de contactación son «Red privada», «Enrutamiento» y «Buzones», y el evento es «Ruta óptima». Lo que no contesta sigue por WhatsApp; el SMS solo existe en México. En código: `conAntispam(locale)` y `numero400()` en `src/lib/mercados.js`, bandera `antispam` en `home-components/rediseno/region.js`.

### Las dos reglas que nunca se rompen

1. **Buzones:** nunca decir que los buzones «no se facturan», «no cuestan» ni «llamada no facturada». Sí: «gran ahorro en buzones» y «alta tasa de efectividad en la detección».
2. **Spam:** nunca prometer marcar «siempre con numeración limpia» ni «sustituir los números en spam por otros limpios». Sí: «detectamos cuándo un número entra en spam» y, solo en México, «rotación de numeración», sin ligarla a «limpio».

Estas dos reglas valen también para lo que no parece texto: etiquetas de eventos en animaciones, estados de un panel, rótulos de vídeo y locuciones.

---

## 4. Reglas de redacción

### Mayúsculas

- Titulares, botones, etiquetas, badges y antetítulos van con **mayúscula inicial** y el resto en minúscula: «Agente IA de voz», «Antispam», «Habla con un experto». También en inglés: «Talk to an expert», nunca *Title Case*.
- **Nunca** etiquetas todo en minúscula («antispam») ni palabras enteras en mayúsculas («NO facturada», «GRATIS»), ni `text-transform: uppercase`. Las siglas sí: IA, SIP, SMS, POP, ASR, CRM.

### Puntuación y signos

| Caso | Regla | Ejemplo |
| --- | --- | --- |
| Titulares | Cada parte termina en punto | «Más que un operador. La tecnología para sacarle partido.» |
| Botones, etiquetas, estados | Sin punto final | «Ver todos los casos», «Conectada» |
| Citas y mensajes de ejemplo | Comillas angulares en español, curvas en inglés | «…te confirmo la cita del jueves.» / “…” |
| Flujos y resultados | Flecha → con espacios | «Buzón detectado → WhatsApp» |
| Datos en una etiqueta | Punto medio · con espacios | «Prefijo local · 8 provincias» |
| Algo en curso | Puntos suspensivos de un solo carácter (…) | «Llamando…» |
| Incisos | Comas o paréntesis; guion largo, como mucho uno por pieza | — |

### Cifras, horas y teléfonos

| Dato | España | México | Inglés |
| --- | --- | --- | --- |
| Miles y decimales | 1.250.000 · 3,4 kHz | 1,250,000 · 3.4 kHz | 1,250,000 · 3.4 kHz |
| Porcentaje | 99,99 % (con espacio) | 99.99% | 99.99% |
| Cobertura | «más de 85 países» | «más de 85 países» | «85+ countries» |
| Hora | 24 h: 10:00, 17:00 | 24 h: 10:00, 17:00 | 10:00 (en), 10:00 a.m. (us) |
| Teléfonos | +34 910 88 86 20 | +52 1 55 9990 7556 | +44 20 7946 0482 |

- En código, las cifras se formatean siempre con `toLocaleString(locale)` del mercado (`region.formato` en `region.js`), nunca a mano.
- En un texto corrido, los números del uno al nueve van con letra si no son datos («tres correos»); los datos, siempre con cifra («85 países», «8 provincias»).
- Los números que cambian en pantalla llevan cifras de ancho fijo (`font-variant-numeric: tabular-nums`).
- **En ejemplos y creatividades, nunca un teléfono real de una persona.** Se usan números enmascarados («+52 55 ··· 4821», «+34 91 ··· 2273») o rangos de ficción (Reino Unido: 020 7946 0xxx; EE. UU.: 555-01xx). En España, las campañas salientes de ejemplo salen con `+34 400 …` (`numero400()`).
- Los ejemplos de conversación usan nombres de pila comunes (en la web, «Ana») y casos reales del sector: confirmar una cita, recordar un pago, retomar una llamada perdida.

### Longitudes

| Pieza | Máximo |
| --- | --- |
| Cada parte del titular | 8 palabras |
| Subtítulo o entradilla | 40 palabras, 2 frases |
| Título de una ventaja o tarjeta | 6 palabras |
| Texto de una ventaja o tarjeta | 1 frase, 20 palabras |
| Etiqueta, badge o estado | 3 palabras |
| Botón | 4 palabras, empieza por verbo |
| Rótulo de vídeo | 7 palabras en pantalla a la vez |

### Llamadas a la acción

| Uso | España | México | Inglés |
| --- | --- | --- | --- |
| Principal (demo con el equipo, va a `/contacto`) | Habla con un experto | Hable con un experto | Talk to an expert |
| Secundaria (WhatsApp con Astra AI) | Habla con Astra AI | Hable con Astra AI | Chat with Astra AI |
| Enlace a un producto | Conocer el + producto («Conocer el marcador omnicanal») | Igual | Discover + producto («Discover the omnichannel dialler») |
| Listado | Ver todos los + objeto | Igual | See all + objeto («See all case studies») |

Los botones solo llevan a agendar una demo o a hablar con Astra; para ir a otra página se usa un enlace de texto con flecha (`.hr-enlace`), que no compite con los CTA. Nunca «Solicita información», «Empieza gratis», «Descubre más» ni «Haz clic aquí».

### Vocabulario

| Usamos | En vez de |
| --- | --- |
| Contactación, tasa de contacto | Alcance, engagement |
| Buzón, detección de buzones | Contestador, voicemail (en español) |
| Antes del descuelgue, early media | En tiempo real (sin más) |
| Agente IA de voz, agente IA de WhatsApp | Bot, robot, asistente virtual, chatbot |
| Marcación omnicanal, marcador predictivo | Nombres de marca de terceros |
| Red privada multicloud | La nube, infraestructura de última generación |
| Operación, campañas | Negocio, soluciones (en abstracto) |
| IA (en español) | AI, salvo en «AI-first» |

**Palabras y giros prohibidos** (delatan un texto de IA o prometen de más): revolucionario, disruptivo, de vanguardia, de última generación, potenciar, desbloquear, sin fisuras, holístico, sinergia, líder, «en el mundo actual», «no es solo X, es Y», «imagina…», «¿y si te dijera…?», «el futuro ya está aquí», listas de tres adjetivos seguidos, y emojis en cualquier pieza de marca.

---

## 5. Logotipo

El logotipo es la palabra «astroline» en minúsculas con una cuña de color al pie de la «a»; se usa siempre desde el archivo oficial y **nunca lo dibuja una IA**.

### Versiones

| Versión | Archivo | Letras | Cuña | Cuándo |
| --- | --- | --- | --- | --- |
| Logotipo para fondo claro | `public/images/logo-black.svg` | #242424 | Morado #8331A7 | Por defecto: blanco, #fafafa, grises claros |
| Logotipo para fondo oscuro | `public/images/logo-white.svg` | #FFFFFF | Menta #3FCEA6 | Negro #0b0b10 y degradados oscuros (tinta, titanio, noche, grafito) |
| Símbolo para fondo claro | `public/images/astro-white-icon.svg` | #242424 | Morado #8331A7 | Favicon, avatar, marca de agua, sello dentro de una ilustración |
| Símbolo para fondo oscuro | `public/images/astro-black-icon.svg` | #FFFFFF | Menta #6CD1B0 | Lo mismo sobre oscuro |
| Favicon | `src/app/[locale]/favicon.ico`, `public/favicon.ico` (512 px) | #242424 | Morado | Pestaña del navegador |
| Firma de correo | `public/images/logos-astroline/logo_firmas.webp` / `.png` | #242424 | Morado | Firmas y plantillas de correo |

Ojo: los nombres de los símbolos están al revés. `astro-white-icon` es el oscuro (para fondo blanco) y `astro-black-icon`, el blanco (para fondo negro).

**Obsoletos, no usar en piezas nuevas:** `public/images/astroline.svg` (la «A» con degradado rosa #FE00E5/#FD51E2, morado y azul #3F87A6) y `public/images/black.svg` / `public/images/favicon.svg` (círculo morado con puntos menta). Todavía aparecen en componentes antiguos (`AstrolineServices.jsx`, `Testimonials.jsx`).

### Medidas

- `viewBox` del logotipo: 2224 × 448 → proporción 4,96 : 1. En la web: 109 × 22 px en el menú (`.hn-logo img { height: 22px }`) y 129 × 26 px en el pie.
- Tamaño mínimo: 88 px de ancho en pantalla y 25 mm en impresión. Por debajo, el símbolo, que aguanta hasta 16 px (13–14 px como sello dentro de paneles).
- Área de respeto: alrededor del logotipo, como mínimo la altura de la «a» libre de texto, bordes y otros logos.
- En vídeo: logotipo en el cierre, centrado, a un 25–30 % del ancho del encuadre en 16:9 y a un 45–50 % en 9:16.
- En HTML: siempre `<img src="/images/logo-black.svg" alt="Astroline">` (o `next/image` con `alt="Astroline"`), nunca el texto maquetado con una fuente.

### Usos incorrectos

- Generarlo, redibujarlo o «mejorarlo» con IA o con una tipografía. Los modelos de imagen y de vídeo deforman las letras: el logo se pone siempre después, encima, desde el SVG.
- Cambiar el color de las letras o de la cuña, ponerle degradado, sombra, brillo, contorno o efecto 3D.
- Estirarlo, girarlo, inclinarlo o separar la cuña de la «a».
- Ponerlo en mayúsculas o escribir «Astroline» como texto en lugar del logo.
- Ponerlo sobre una zona con detalle (foto con ruido, la parte intensa de un degradado) o sobre verdes donde la cuña menta desaparece.
- Meterlo en una caja, una pastilla o un círculo de color.

### Junto a otras marcas

Con un partner o un cliente, los dos logos a la misma altura óptica, separados por una línea vertical de 1 px en #e6e6ea y con el área de respeto a cada lado. Astroline va primero, salvo en piezas del partner. En los listados de integraciones, los logos ajenos van en su versión oficial, a la misma altura (18–22 px) y en una sola fila o rejilla regular. En la cinta de logos de clientes, los logos blancos se pasan a negro con `filter: brightness(0); opacity: .75`.

---

## 6. Color

Astroline es una marca en claro: fondos blancos y grises, texto casi negro, el morado #8331A7 **solo en detalles** y el color fuerte reservado a los degradados intensos de las ilustraciones. Cuando algo tiene que destacar, se hace con negro, nunca con morado.

### Neutros y texto

| Token | Hex | Uso |
| --- | --- | --- |
| `--bg` | #fafafa | Fondo de página |
| Blanco | #ffffff | Tarjetas con texto, etiquetas, botones secundarios |
| `--panel` | #f2f2f4 | Paneles grandes de los bloques: gris plano, sin degradado |
| Franja | #f3f3f5 | Fondo de las secciones «franja» y de la tira superior (`--panel` pasa a #fafafa dentro) |
| Franja sobre rejilla | rgba(236, 236, 241, 0.6) | Franja dentro de `.hr-pagina`, para que se vean los puntos |
| `--line` | #e6e6ea | Líneas de la rejilla y separadores |
| Línea interior | #f0f0f3 | Separadores dentro de tarjetas, pista de las pestañas |
| `--edge` | #e4e4e8 | Borde de tarjetas, etiquetas y fichas |
| Borde de botón claro | #dcdce2 (hover #b9b9c2) | Botón secundario |
| `--cross` | #b4b4bd | Cruces en los vértices de la rejilla; modos inactivos |
| Punto apagado | #c4c4cc | Punto de estado inactivo |
| Hover | #f4f4f6 | Fondo de un elemento de lista al pasar el ratón; burbuja entrante |
| Destacado de menú | #f7f7f9 | Tarjetas destacadas del menú |
| `--text` | #0b0b10 | Texto principal, segunda parte del titular, botón principal, estados activos, burbuja saliente (hover #2a2a33) |
| Texto de etiqueta | #3a3a44 | Texto dentro de etiquetas, badges y burbujas |
| `--soft` | #5c5c68 | Primera parte del titular, entradillas, cuerpo |
| `--muted` | #8a8a96 | Datos secundarios y pies. No sirve para texto de lectura (contraste 3,3 : 1 sobre #fafafa) |
| Logotipo | #242424 | Solo las letras del logo |

### Acento y colores de estado

| Color | Hex | Uso | Nunca |
| --- | --- | --- | --- |
| Morado Astroline | #8331A7 | Iconos de etiquetas, antetítulos y ventajas; puntos de estado, barras de progreso de 3 px, pods de 10 px, barras de onda de 3 px; bordes finos (al 35–45 %); anillo de foco (al 14 %); pulsos de la rejilla; piezas destacadas en 3D; arcos del globo | Fondo de sección, botón, burbuja, pastilla activa, bloque, tarjeta, tinte suave o lavanda |
| Menta | #3FCEA6 / #6CD1B0 | Solo la cuña del logotipo sobre oscuro | Como color de interfaz |
| Rojo de estado | #e5484d | Spam detectado, incidencia, error | Decoración |
| Verde de estado | #30a46c | Conectada, rotación, todo bien | Decoración |
| Ámbar de estado | #e8a33c | Buzón detectado, aviso | Decoración |

**Regla operativa del morado:** como relleno, solo en **marcas de datos y señales**: puntos de estado (5–6 px), pods (10 px), barras de onda (2–3 px), barras de progreso (2–3 px), barras de gráfico (hasta unos 14 px de ancho) y la banda que destaca en un espectro. Nunca en **superficies**: fondos, botones, burbujas, pastillas, pestañas, tarjetas o bloques. En todo lo demás, el morado solo puede ser trazo, borde, icono o texto de un icono.

Fondos de estado sobre claro: alerta #fff6f6 (borde rgba(229,72,77,.55)), ok #f3fbf6 (borde rgba(48,164,108,.55)), aviso #fffaf0 (borde rgba(232,163,60,.6)). Sobre degradado, el evento se rellena del color de su estado: rgba(229,72,77,.92), rgba(36,158,98,.92), rgba(222,140,30,.94), con texto blanco.

### Degradados intensos («vivos»)

Todas las ilustraciones, escenarios de hero y portadas usan el mismo esquema: **dos focos radiales en esquinas opuestas sobre un color base, con grano encima.** Cada tarjeta lleva una paleta distinta de la de al lado, y cada página, un escenario propio ligado a lo que cuenta. El código completo está en la [sección 17](#17-degradados-vivos-y-grano-en-código).

**Paletas de tarjetas** (se alternan en este orden con `nth-child(6n + k)`):

| Paleta | Foco 1 | Foco 2 | Base |
| --- | --- | --- | --- |
| Fuego (`--vivo-1`) | #ffd23f arriba izq. | #ff2e4d abajo dcha. | #ff7a1a |
| Océano (`--vivo-2`) | #43f0ff arriba dcha. | #0031e0 abajo izq. | #1672ff |
| Lima (`--vivo-3`) | #e6ff3d arriba izq. | #009c63 abajo dcha. | #32cc72 |
| Rosa (`--vivo-4`) | #ffc29a arriba dcha. | #ff1f68 abajo izq. | #ff5c7c |
| Turquesa (`--vivo-5`) | #2dffcb abajo izq. | #0a7cff arriba dcha. | #00bfb3 |
| Tinta (`--vivo-6`) | #2a5cff abajo izq. | #ff6a2b arriba dcha. | #0e0f16 |

**Escenarios por tema** (uno por página, sin repetir):

| Tema | Escenario | Foco 1 · Foco 2 · Base |
| --- | --- | --- |
| Home | Océano | `--vivo-2` |
| Marcador omnicanal | Rosa | `--vivo-4` |
| Contact center | Fuego | `--vivo-1` |
| Rotación | Turquesa | `--vivo-5` |
| Contacto | Tinta | `--vivo-6` |
| WhatsApp | Verdes de WhatsApp | #c8ffd8 · #075e54 · #25d366 |
| SIP Trunk | Titanio | #2ee6ff · #05070c · #1d2635 |
| Numeración | Amanecer | #1f6dff · #ff7a59 · #58adff |
| VHunter (buzones) | Ámbar | #f06a00 · #ffd23f · #ff9f1a |
| ASR Vooster | Lima ácida | #f4ff5a · #0f8a3c · #8fdc2a |
| Agentes IA de voz | Tinta con rosa | #2a5cff · #f02f65 · #0e0f16 (`--vivo-008`) |
| Agentes IA de WhatsApp | Noche con aurora | #1de9b6 · #ffd23f · #0d1117 (`--vivo-aurora-noche`) |
| Ventas | Carmín | #ffb199 · #b8002e · #ff3b3b |
| Cobranza | Marino y oro | #ffcf4a · #04103a · #0f2f7a |
| Telefonía corporativa | Pizarra | #a5dcff · #111827 · #4b5d75 |
| Educación | Cuaderno | #ffe14d · #0038c7 · #2f7dff |
| Servicios profesionales | Petróleo | #ff9a5a · #022b33 · #0c6170 |
| Energía | Voltio | #ffe600 · #9dff3a · #16171c |
| Turismo | Caribe | #ff9c6b · #007a8a · #18c6c0 |
| Otros sectores | Arena | #ffd9a3 · #a83a16 · #e2803c |
| Sobre nosotros | Grafito | #8ec5ff · #2a1d17 · #23262f |
| Partners | Aurora | #2de2ff · #c6ff3d · #0f9c86 |
| Infraestructura | Noche | #1fb6ff · #000000 · #0a1430 |

Para un tema nuevo, se crea un escenario nuevo con el mismo esquema y un color que se asocie a lo que cuenta (el dinero que vuelve, la red de noche, el buzón en ámbar).

### Reglas del degradado

- **Ningún degradado puede dar morado ni lavanda.** Por eso no se mezcla rosa sobre azul.
- Nada de mallas pastel (lila, amarillo suave, cielo, crema): se ven planas y «de IA».
- Siempre con grano (ver [sección 17](#17-degradados-vivos-y-grano-en-código)).
- Lo que va suelto encima (texto, barras, líneas) pasa a blanco: texto a rgba(255,255,255,.92), barras secundarias a rgba(255,255,255,.5), líneas base a rgba(255,255,255,.55) y la barra que destaca en blanco pleno. En los degradados claros (lima, amarillos), el texto suelto va en negro.
- El degradado llena el escenario de borde a borde; nunca una caja con degradado dentro de otra.

### Proporción en una pieza

Como referencia: un 70 % de neutros claros, un 20 % de color vivo en ilustraciones, un 9 % de negro (texto y botón) y un 1 % de morado. Las secciones enteras en negro están descartadas: se probaron (globo en negro, cinta negra de eventos) y no encajan.

---

## 7. Tipografía

Todo va en **General Sans**, una sola familia para titulares, cuerpo, botones, etiquetas, números y código. Mezclar tipografías (una monoespaciada para cifras, una serif de adorno) es la señal más clara de diseño hecho con IA y está prohibido.

- **Archivo:** `src/fonts/GeneralSans-Variable.woff2` (variable, ejes de peso 200–700). Fuera de la web: General Sans de Fontshare (Indian Type Foundry), gratuita para uso comercial.
- **Alternativa** si la herramienta no deja cargar fuentes: Inter o `system-ui`, nunca Poppins (la de la web antigua) ni una serif.
- **Números:** siempre con cifras de ancho fijo (`tabular-nums`), en la misma General Sans. Los `<code>`, `<kbd>` y `<samp>` heredan la fuente.

### Pesos

| Peso | Uso |
| --- | --- |
| 400 Regular | Cuerpo, entradillas, subtítulos |
| 500 Medium | Titulares de todos los niveles, botones, etiquetas, antetítulos, cifras grandes, menú |
| 600 Semibold | Solo para resaltar un nombre de marca dentro de un texto (`.hr-marca b`, `.hr-producto-marca b`) |
| 700 Bold | No se usa. Los titulares de Astroline son medios, no negritas |

### Escala

| Elemento | Escritorio | ≤ 1100 px | ≤ 760 px | Peso | Interlineado | Espaciado | Color |
| --- | --- | --- | --- | --- | --- | --- | --- |
| Titular de hero (`.hr-h1`) | 46 px | 40 px | 34 px | 500 | 1,04 | −0,025 em | soft + text |
| Titular de cierre | 52 px | 52 px | 34 px | 500 | 1,04 | −0,025 em | soft + text |
| Titular de sección (`.hr-h2`) | 42 px | 42 px | 31 px | 500 | 1,08 | −0,02 em | soft + text |
| Titular de FAQ | 36 px | 36 px | 28 px | 500 | 1,08 | −0,02 em | text |
| Cifra destacada (`.hr-caso-dato b`) | 56 px | 56 px | 44 px | 500 | 1,0 | −0,03 em | text |
| Título de tarjeta de caso | 21 px | — | — | 500 | 1,3 | −0,01 em | text |
| Título de tarjeta de producto | 18 px | — | — | 500 | — | −0,01 em | text |
| Subtítulo del hero (`.hr-sub`) | 18 px | 18 px | 17 px | 400 | 1,45 | — | soft |
| Entradilla (`.hr-lead`) | 18 px | — | — | 400 | 1,5 | — | soft |
| Pregunta de FAQ | 16,5 px | — | 15,5 px | 500 | — | — | text |
| Título de ventaja (`.hr-feat h3`) | 15,5 px | — | — | 500 | — | — | text |
| Cuerpo y respuestas | 15 px | — | — | 400 | 1,6 | — | soft |
| Texto de ventaja y tarjeta | 14,5 px | — | — | 400 | 1,55 | — | soft |
| Menú (disparadores) | 14,5 px | — | — | 500 | — | — | soft → text |
| Antetítulo (`.hr-kicker`) | 14 px | — | — | 500 | — | — | soft |
| Botón | 15 px (14 px en el menú) | — | — | 500 | — | — | — |
| Etiqueta (`.hr-tag`) | 13 px | — | — | 500 | — | — | #3a3a44 |
| Badge flotante (`.hr-flota`) | 12 px (12,5 px en eventos) | — | — | 500 | — | — | #3a3a44 |
| Micro (ejes, estados, fichas) | 10,5–12 px | — | — | 400–500 | — | — | muted |

### Jerarquía y composición

- Ancho de línea: subtítulos hasta 440 px, entradillas hasta 480 px (560 px en el cierre).
- Alineación a la izquierda. Centrado solo en el bloque de cierre y en el cierre de un vídeo.
- Nada de cursivas para destacar (`em` va con `font-style: normal`), subrayados decorativos, texto con degradado, contornos ni sombras.
- En diapositivas y vídeo se mantiene la misma relación: titular en 500 con espaciado negativo y un único peso de apoyo (400).

---

## 8. Iconografía

Los iconos son de **Lucide** (`lucide-react` en la web, lucide.dev para cualquier otra herramienta), de trazo, en morado #8331A7 y **sueltos, sin caja**: nunca dentro de un cuadrado, círculo o pastilla de color.

| Regla | Valor |
| --- | --- |
| Familia | Solo Lucide. Nada de mezclar con Heroicons, Material, Font Awesome, iconos rellenos ni emojis |
| Trazo | 2 px por defecto (el de Lucide); 1,5 px en iconos grandes de ilustración |
| Tamaño en badge flotante | 13 px |
| Tamaño en etiqueta | 14 px |
| Tamaño en antetítulo y enlaces | 15 px |
| Tamaño en título de ventaja | 16 px |
| Tamaño en título de tarjeta de producto | 20 px |
| Separación con el texto | 6–9 px |
| Color | Morado #8331A7 en etiquetas, antetítulos, ventajas y enlaces; blanco sobre degradado; `--muted` en chevrons del menú |
| Contenedor | Ninguno: ni caja, ni círculo, ni fondo, ni sombra |

### Iconos de referencia

| Concepto | Icono Lucide |
| --- | --- |
| Agente IA (genérico, en lugar de cualquier marca) | `Bot` |
| Voz, audio | `AudioLines` |
| Red privada | `Network` |
| Enrutamiento | `Route` |
| Seguridad, antispam | `ShieldCheck` |
| Rotación, reparto | `Split` |
| Llamada saliente | `PhoneOutgoing` |
| Integración | `Plug` |
| Capas | `Layers` |
| Cobertura global | `Globe` |
| Numeración | `Hash` |
| Infraestructura | `Server` |
| Contact center | `Headset` |
| Persona | `UserRound` |
| Seguridad de datos | `Lock` |
| Sectores | `GraduationCap`, `Hotel`, `Landmark` |
| Pregunta | `MessageCircleQuestion` |
| Abrir FAQ | `Plus` (gira 45° al abrir) |
| Enlace o siguiente paso | `ArrowRight` (se desplaza 2 px en hover) |

### El agente IA en las creatividades

Se representa con el icono `Bot` suelto, en morado y sin caja (componente `home-components/rediseno/IconoIA.jsx`, prop `lado` en px, 18 por defecto). **Nunca** con el logo de una tecnología concreta, con una cara humana generada ni con un robot 3D de catálogo. Para señalar «esto lo hace Astroline» dentro de un panel o una animación, se usa el símbolo `astro-white-icon.svg` a 13–14 px.

---

## 9. Imagen, ilustración y 3D

Las imágenes de Astroline enseñan el producto funcionando (llamadas que fluyen, eventos, números, la red) sobre degradados intensos con grano o como piezas 3D de cristal esmerilado y arcilla blanca. No usamos fotos de stock ni ilustraciones planas.

### Qué usar, por orden de preferencia

1. **Creatividad de producto:** la interfaz o el flujo en marcha, con datos realistas (panel de buzones, muro de numeración, conversación de WhatsApp, contadores de llamadas).
2. **Escena 3D** de cristal y arcilla: puertas que filtran, bloques de destino, tubos por los que viajan las llamadas, nodos de la red, el globo.
3. **Escenario de degradado con grano**, como fondo de cualquiera de las anteriores o de un titular.
4. **Fotografía real:** solo de personas, oficinas y eventos reales de Astroline o de clientes con permiso.

### Composición de una creatividad

- El degradado llena el panel a sangre; encima, piezas blancas (tarjetas con borde de 1 px y radio de 9–16 px) o piezas de cristal.
- Sobre fondo claro, los badges son pastillas blancas (rgba(255,255,255,.96)) con borde `--edge`, icono morado de 13–14 px y texto de 12–13 px en 500. Sobre degradado, son de «cristal»: fondo rgba(255,255,255,.2), borde de 1 px rgba(255,255,255,.42) (0,5 px al 70 % en pantallas 2x), texto e icono blancos y sombra 0 6px 18px rgba(8,24,72,.12), **sin `backdrop-filter`** porque la escena de debajo se mueve. Sobre un degradado quieto, la pastilla de cristal sí lleva `blur(16px) saturate(150%)`.
- Las cifras vivas van en pastillas arriba a la izquierda («2.461.208 llamadas hoy», «3.214 simultáneas»).
- Cada evento usa su color de estado: rojo para spam, verde para conectada o rotada y ámbar para buzón.
- Los teléfonos van enmascarados o de ficción, y los retratos, pequeños (18–24 px), circulares, con anillo de 1 px `--edge`, como acompañamiento. Los retratos de la web son ficticios (`public/images/avatares/cliente-1…8.webp`).
- Mucho aire: como máximo tres o cuatro elementos que se lean de un vistazo.

### Estilo 3D

- Material principal: cristal esmerilado blanco, translúcido, con barniz que recoge reflejos y deja ver el degradado detrás.
- Material secundario: arcilla blanca mate para volúmenes (servidores, nodos, bloques, el globo).
- Acentos: morado con brillo propio suave solo en piezas destacadas; rojo, verde y ámbar de estado.
- Luz: una direccional blanca desde arriba a la izquierda y un entorno de estudio suave; sombras suaves y muy tenues sobre un suelo invisible.
- Cámara ortográfica, sin perspectiva, casi frontal y algo elevada.
- Las piezas quedan quietas; se mueven los puntos, las ondas y un vaivén lento de cámara.
- **Fuera del estilo:** metal cromado, neón, bloom, partículas brillantes, fondos espaciales, texturas realistas, lentes con mucha perspectiva y robots humanoides.

### Lo que no se usa nunca

- Fotos de stock: teleoperadores sonriendo con cascos, apretones de manos, gente señalando una pantalla.
- Personas generadas con IA presentadas como clientes, empleados o testimonios. Los testimonios, solo con foto y nombre reales.
- Ilustraciones planas de estilo corporativo (personajes de brazos largos), isometrías genéricas de servidores y nubes.
- La iconografía cliché de la IA: cerebros, redes neuronales brillantes, hologramas, circuitos, ojos robóticos, chispas mágicas.
- Globos de neón y mapas con arcos brillantes. El globo de Astroline es claro, de arcilla, con llamadas en morado.
- Texto dentro de imágenes generadas. El texto se pone después, encima, en General Sans.

### Blog, portadas e infografías

- Las portadas del blog son piezas 3D de las secciones de la web sobre un escenario de degradado con grano; cada post, con una variante distinta.
- Las infografías siguen la misma paleta: fondo claro, tarjetas blancas, cifras en 500 y acentos morados finos.
- Los textos del blog los firma el autor genérico «Equipo Astroline»: un texto hecho con IA nunca se firma con el nombre de una persona real.
- Cada post lleva su campo `mercados`, para que lo de México (antispam, rotación, SMS) no salga en `/es`.

---

## 10. Vídeo y movimiento

El movimiento de Astroline es tranquilo y funcional: enseña llamadas que fluyen, eventos que aparecen y cifras que suben, con curvas suaves y sin efectos. Un vídeo de marca se parece a la home en marcha, no a un anuncio de plantilla.

### Movimiento en interfaz

| Movimiento | Duración | Curva |
| --- | --- | --- |
| Menú desplegable | 0,16 s, baja 4 px | ease |
| Hover (color, borde, fondo) | 0,15–0,2 s | ease |
| Cambio de color de un texto de estado | 0,3 s | ease |
| Aparición de un evento o una tarjeta | 0,4 s, sube 6 px con fundido | ease |
| Ficha del muro que llama | 0,5 s (sube 18 px en Z) | ease |
| Barra de reparto | 0,6 s | ease |
| Onda de voz | 1,1 s, alterna | ease-in-out |
| Filtro 3D que se enciende | 1,3 s | ease-in-out cuadrática |
| Un evento nuevo en el flujo | cada 2,3 s | — |
| Ciclo de demostración (modos, estados) | 6 s, piezas escalonadas cada 2 s | — |
| Burbujas de conversación | 7,5 s, escalonadas cada 1,2 s | — |
| Avance de un caso de éxito | 8 s | lineal |
| Cinta de logos | 70 s por vuelta | lineal |

La curva de referencia es la *ease-in-out* cuadrática: `k < .5 ? 2k² : 1 − (−2k + 2)² / 2`. **Nunca** rebotes, elásticos, giros, zooms bruscos, parpadeos ni *glitch*.

### Formatos de vídeo

| Uso | Formato | Resolución | Duración |
| --- | --- | --- | --- |
| Web, YouTube, LinkedIn horizontal | 16:9 | 1920 × 1080 | 45–90 s explicativo; hasta 3 min en demos |
| Feed de LinkedIn e Instagram | 4:5 o 1:1 | 1080 × 1350 / 1080 × 1080 | 15–30 s |
| Reels, TikTok, Shorts, stories | 9:16 | 1080 × 1920 | 6, 15 o 30 s |
| Anuncios | Los tres | — | 6, 15 y 30 s |

A 30 fps (25 si se emite por televisión en Europa). En 9:16, nada importante en el 14 % de arriba ni en el 20 % de abajo.

### Estructura

1. **Gancho (0–2 s):** un dato real o un problema concreto del contact center, con el titular en dos tiempos. Nunca cifras inventadas.
2. **El producto en acción:** la creatividad de producto o la escena 3D, un solo mensaje por plano.
3. **Resultado:** lo que gana el cliente (más contactación, ahorro en buzones, voz en 85 países).
4. **Cierre (2–3 s):** logotipo oficial, la llamada a la acción del mercado y www.astroline.com.

### Imagen en vídeo

- Fondos #fafafa o escenarios de degradado con grano; la interfaz, la real o recreada al píxel.
- Cámara lenta: desplazamientos laterales, acercamientos lentos y un vaivén leve sobre escenas ortográficas. Sin giros de 360° ni vuelos de dron.
- Transiciones: corte limpio o fundido corto (6–8 fotogramas). Nada de transiciones de plantilla.
- Rojo, verde y ámbar solo para estados; el morado, en el detalle que se quiere señalar.

### Rótulos y subtítulos

| Elemento | Especificación |
| --- | --- |
| Rótulo principal | General Sans 500, mayúscula inicial, espaciado −0,02 em, máximo 7 palabras; en dos tiempos (#5c5c68 + #0b0b10 sobre claro; blanco al 70 % + blanco sobre degradado) |
| Tamaño de referencia | 1080p: titular 72–96 px; apoyo 36–44 px |
| Posición | Alineado a la izquierda, en el tercio izquierdo o inferior; margen de seguridad del 5 % |
| Entrada | Fundido y subida de 0,4 s; salida, fundido de 0,3 s |
| Subtítulos | Siempre. General Sans 500, 42–48 px en 1080p, blanco sobre pastilla #0b0b10 al 80 %, hasta 2 líneas y 32 caracteres por línea |
| Cifras en pantalla | Con su formato de mercado y cifras de ancho fijo |

### Voz y sonido

- **Locución:** natural, cercana y segura, a unas 150 palabras por minuto, con el acento del mercado.
- **Voces sintéticas:** se pueden usar. Nunca se clona la voz de una persona real sin su consentimiento por escrito, ni se imita a nadie conocido.
- **Agentes IA en pantalla:** si un vídeo enseña una llamada con un agente de IA, se ve la etiqueta «Agente IA». Nunca se hace pasar a la IA por una persona.
- **Música:** electrónica mínima o ambiental técnica, de 90 a 110 BPM, con licencia. Ni épica, ni ukelele corporativo. Mezclada 18–20 dB por debajo de la voz.
- **Efectos:** pocos y reales: tono de llamada, descuelgue, notificación de WhatsApp.

### Vídeo generado con IA

- Vale para planos de ambiente y escenas abstractas en el estilo 3D de la marca.
- No vale para interfaces con texto, logotipos, personas que hablan como clientes o empleados, ni presentadores sintéticos.
- Revisión fotograma a fotograma: texto deformado, manos, objetos que cambian de forma, parpadeos y colores que viran a morado o lavanda.
- Si un contenido realista está generado o retocado con IA, se marca como tal donde la plataforma lo pida. En la UE, el Reglamento de IA obliga desde agosto de 2026 a identificar los contenidos sintéticos realistas.

---

## 11. Señales de «hecho con IA» que hay que evitar

### En el diseño

| Señal | En su lugar |
| --- | --- |
| Dos o más tipografías, o una monoespaciada para cifras y etiquetas | Solo General Sans, con `tabular-nums` |
| Iconos dentro de cuadrados, círculos o pastillas de color | Iconos Lucide sueltos, en morado |
| Mallas de degradado pastel (lila, melocotón, cielo, crema) | Degradados vivos con dos focos y grano |
| Fondos morados o violetas, degradados de morado a azul | Neutros claros; para destacar, negro |
| *Glassmorphism* (`backdrop-filter` en tarjetas), brillos, sombras de color, bordes que brillan | Tarjetas blancas con borde de 1 px y sombra casi nula |
| Rejilla de tres tarjetas idénticas con icono, título y texto | Bloques de dos columnas con una creatividad viva; tarjetas con ilustración distinta cada una |
| Hero centrado con un titular enorme y una captura flotando en perspectiva | Hero de dos columnas con la creatividad llenando su panel |
| Titulares con texto en degradado (`background-clip: text`) | Titular en dos tiempos, gris y negro |
| El icono de chispas (`Sparkles`, ✨) para todo lo que es IA | `Bot` o, mejor, enseñar lo que hace |
| Esquinas de 20 px o más, bordes gruesos de color | Radios de 9–16 px y bordes de 1 px neutros |
| Esferas, blobs y formas 3D brillantes sin significado | Piezas 3D que representan algo del producto |
| Texto deformado, manos raras, logos inventados en imágenes | Imagen sin texto y el texto encima, en General Sans |
| Emojis como iconos o viñetas | Lucide o nada |
| Clases de Tailwind por defecto sin tocar (`rounded-2xl shadow-xl bg-gradient-to-r from-purple-500 to-indigo-600`) | Los tokens de la [sección 20](#20-tailwind) |

### En el texto

| Señal | En su lugar |
| --- | --- |
| «No es solo X, es Y», «Imagina…», «En el mundo actual…» | Empezar por el dato o por el hecho |
| Tres adjetivos seguidos («rápida, segura y escalable») | Una afirmación con su dato |
| Guiones largos en cada frase | Comas, puntos y frases cortas |
| Title Case, palabras en mayúsculas, exclamaciones | Mayúscula inicial y punto |
| Cifras redondas inventadas («10x más contactos», «300 % de mejora») | Solo datos reales de Astroline o de un caso con permiso |
| Testimonios, clientes o logos inventados | Solo casos reales de Contentful |
| «AI» en español, anglicismos innecesarios | «IA» y la palabra en español |
| Traducciones literales del inglés | Reescribir en el idioma del mercado |
| Listas de viñetas donde basta una frase | Prosa breve |

### En el vídeo

| Señal | En su lugar |
| --- | --- |
| Presentadores o avatares sintéticos | Producto en acción o personas reales |
| Voz plana, sin pausas, con pronunciación de otro país | Voz con el acento del mercado y pausas naturales |
| Música épica de stock y «whoosh» en cada corte | Electrónica mínima y efectos reales |
| Objetos que cambian de forma, parpadeos, cámaras que vuelan | Planos quietos o movimientos lentos de cámara |
| Transiciones de plantilla | Corte limpio o fundido corto |

---

## 13. Tokens CSS

### Tokens definidos en el código

```css
/* rediseno.css — raíz de todas las secciones */
.hr {
  --bg: #fafafa;      /* fondo de página */
  --line: #e6e6ea;    /* guías de la rejilla y separadores */
  --edge: #e4e4e8;    /* borde de tarjetas, etiquetas y fichas */
  --cross: #b4b4bd;   /* cruces de los vértices */
  --text: #0b0b10;    /* texto principal, botón principal, estados activos */
  --soft: #5c5c68;    /* primera parte del titular, cuerpo */
  --muted: #8a8a96;   /* datos secundarios (no para texto de lectura) */
  --acc: #8331a7;     /* morado: solo detalles */
  --panel: #f2f2f4;   /* paneles grandes, gris plano */
  background: var(--bg);
  color: var(--text);
  font-family: var(--font-general-sans), system-ui, sans-serif;
  -webkit-font-smoothing: antialiased;
  border-top: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
  overflow-x: clip;   /* recorta las cruces sin crear contenedor de scroll */
}
.hr *, .hr *::before, .hr *::after { box-sizing: border-box; }

/* franja: sección con fondo algo más oscuro y paneles más claros */
.hr.hr-franja { --panel: #fafafa; background: #f3f3f5; }
```

`navegacion.css` repite los mismos tokens (`--bg`, `--line`, `--edge`, `--text`, `--soft`, `--muted`, `--acc`) en `.hn-tira, .hn, .hn-pie`.

### Hoja de tokens completa para proyectos nuevos

Para una web, plataforma o prototipo fuera de este repositorio, se parte de esta hoja. Junta los tokens del código con los valores que el código usa sueltos (sin variable), para que nadie tenga que inventarse un gris.

```css
/* astroline-tokens.css */
:root {
  /* — Neutros — */
  --ast-bg: #fafafa;
  --ast-white: #ffffff;
  --ast-panel: #f2f2f4;
  --ast-franja: #f3f3f5;
  --ast-franja-rejilla: rgba(236, 236, 241, 0.6);
  --ast-line: #e6e6ea;
  --ast-line-in: #f0f0f3;        /* separadores dentro de tarjetas */
  --ast-edge: #e4e4e8;
  --ast-btn-edge: #dcdce2;
  --ast-btn-edge-hover: #b9b9c2;
  --ast-cross: #b4b4bd;
  --ast-off: #c4c4cc;            /* punto de estado apagado */
  --ast-track: #efeff2;          /* pista de barras de progreso */
  --ast-hover: #f4f4f6;          /* hover de listas, burbuja entrante */
  --ast-destacado: #f7f7f9;      /* tarjetas destacadas del menú */

  /* — Texto — */
  --ast-text: #0b0b10;
  --ast-text-hover: #2a2a33;
  --ast-label: #3a3a44;
  --ast-soft: #5c5c68;
  --ast-muted: #8a8a96;
  --ast-logo: #242424;

  /* — Acento (solo detalles: iconos, trazos, bordes y marcas de datos; nunca superficies) — */
  --ast-acc: #8331a7;
  --ast-acc-borde: rgba(131, 49, 167, 0.45);
  --ast-acc-borde-suave: rgba(131, 49, 167, 0.35);
  --ast-acc-anillo: rgba(131, 49, 167, 0.14);

  /* — Estados — */
  --ast-rojo: #e5484d;   --ast-rojo-fondo: #fff6f6;  --ast-rojo-borde: rgba(229, 72, 77, 0.55);  --ast-rojo-vivo: rgba(229, 72, 77, 0.92);
  --ast-verde: #30a46c;  --ast-verde-fondo: #f3fbf6; --ast-verde-borde: rgba(48, 164, 108, 0.55); --ast-verde-vivo: rgba(36, 158, 98, 0.92);
  --ast-ambar: #e8a33c;  --ast-ambar-fondo: #fffaf0; --ast-ambar-borde: rgba(232, 163, 60, 0.6);  --ast-ambar-vivo: rgba(222, 140, 30, 0.94);

  /* — Sobre degradado — */
  --ast-sobre-texto: rgba(255, 255, 255, 0.92);
  --ast-sobre-secundario: rgba(255, 255, 255, 0.78);
  --ast-sobre-apagado: rgba(255, 255, 255, 0.55);
  --ast-sobre-barra: rgba(255, 255, 255, 0.5);
  --ast-cristal-fondo: rgba(255, 255, 255, 0.2);
  --ast-cristal-borde: rgba(255, 255, 255, 0.42);
  --ast-guia: rgba(255, 255, 255, 0.75);   /* líneas discontinuas guía */

  /* — Tipografía — */
  --ast-font: "General Sans", var(--font-general-sans), system-ui, sans-serif;
  --ast-fs-h1: 46px;   --ast-lh-h1: 1.04; --ast-ls-h1: -0.025em;
  --ast-fs-cierre: 52px;
  --ast-fs-h2: 42px;   --ast-lh-h2: 1.08; --ast-ls-h2: -0.02em;
  --ast-fs-dato: 56px; --ast-ls-dato: -0.03em;
  --ast-fs-h3-caso: 21px;
  --ast-fs-h3-producto: 18px;
  --ast-fs-lead: 18px; --ast-lh-lead: 1.5;
  --ast-fs-feat: 15.5px;
  --ast-fs-body: 15px; --ast-lh-body: 1.6;
  --ast-fs-small: 14.5px; --ast-lh-small: 1.55;
  --ast-fs-kicker: 14px;
  --ast-fs-btn: 15px;
  --ast-fs-tag: 13px;
  --ast-fs-flota: 12px;
  --ast-fs-micro: 11px;

  /* — Radios — */
  --ast-r-pill: 999px;
  --ast-r-panel-menu: 14px;   /* paneles del menú, pista de pestañas */
  --ast-r-escenario: 16px;    /* escenario del hero, tarjeta sobre escenario */
  --ast-r-card: 12px;
  --ast-r-pieza: 10px;        /* burbujas, filas, pestaña activa, items del menú */
  --ast-r-ficha: 9px;         /* fichas del muro, iconos de redes */
  --ast-r-mini: 2px;          /* barras de 2–3 px */

  /* — Sombras (neutras, siempre muy suaves) — */
  --ast-sh-card: 0 1px 2px rgba(16, 16, 24, 0.04), 0 8px 24px rgba(16, 16, 24, 0.05);
  --ast-sh-flota: 0 6px 18px rgba(16, 16, 24, 0.08);
  --ast-sh-deteccion: 0 4px 14px rgba(16, 16, 24, 0.08);
  --ast-sh-ficha: 0 12px 26px rgba(16, 16, 24, 0.09);
  --ast-sh-pestana: 0 1px 2px rgba(16, 16, 24, 0.06), 0 4px 14px rgba(16, 16, 24, 0.06);
  --ast-sh-menu: 0 16px 40px rgba(16, 16, 24, 0.1);
  --ast-sh-desplegable: 0 12px 32px rgba(16, 16, 24, 0.1);
  --ast-sh-barra: 0 4px 18px rgba(16, 16, 24, 0.05);
  --ast-sh-escena: 0 1px 2px rgba(16, 16, 24, 0.08), 0 24px 60px rgba(16, 16, 24, 0.22);
  --ast-sh-cristal: 0 6px 18px rgba(8, 24, 72, 0.12);

  /* — Layout — */
  --ast-site: 1440px;
  --ast-gutter: 24px;
  --ast-section-y: 96px;   /* 72 px ≤ 1100, 60 px ≤ 760 */
  --ast-gap-cols: 64px;    /* 44 px ≤ 1100 */
  --ast-dot-step: 30px;

  /* — Movimiento — */
  --ast-ease: ease;
  --ast-t-hover: 0.2s;
  --ast-t-menu: 0.16s;
  --ast-t-sube: 0.4s;
}
```

Los degradados (`--vivo-*`) y el grano (`--grano`) están en la [sección 17](#17-degradados-vivos-y-grano-en-código).

---

## 17. Degradados vivos y grano en código

### Grano

```css
.hr {
  --grano: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23g)' opacity='.5'/%3E%3C/svg%3E");
}
```

Ruido fractal (`feTurbulence fractalNoise`, `baseFrequency .85`, `numOctaves 3`, `stitchTiles stitch`), desaturado (`feColorMatrix saturate 0`), al 50 % de opacidad, en tesela de 180 × 180 px. Se aplica **siempre** como primera capa con `background-blend-mode: overlay`.

### Cómo se aplica

```css
.elemento-con-degradado {
  background: var(--grano), var(--vivo, var(--vivo-1));
  background-blend-mode: overlay, normal, normal;   /* grano · foco 1 · foco 2 (la base no cuenta) */
}
/* cada página elige su escenario redefiniendo --vivo en su raíz, p. ej. vhunter.css: */
.vh { --vivo: var(--vivo-ambar); }
```

Esquema de cada paleta: dos `radial-gradient` de 110–120 % en esquinas opuestas que se desvanecen a `transparent` entre el 55 % y el 64 %, sobre un color base sólido.

### Paletas de tarjetas

```css
.hr {
  /* fuego: amarillo, naranja y rojo */
  --vivo-1:
    radial-gradient(110% 110% at 0% 0%, #ffd23f 0%, transparent 58%),
    radial-gradient(120% 120% at 100% 100%, #ff2e4d 0%, transparent 62%), #ff7a1a;
  /* océano: cian sobre azul eléctrico */
  --vivo-2:
    radial-gradient(110% 110% at 100% 0%, #43f0ff 0%, transparent 56%),
    radial-gradient(120% 120% at 0% 100%, #0031e0 0%, transparent 62%), #1672ff;
  /* lima: verde ácido sobre esmeralda */
  --vivo-3:
    radial-gradient(110% 110% at 0% 0%, #e6ff3d 0%, transparent 58%),
    radial-gradient(120% 120% at 100% 100%, #009c63 0%, transparent 62%), #32cc72;
  /* rosa: melocotón y rosa intenso */
  --vivo-4:
    radial-gradient(110% 110% at 100% 0%, #ffc29a 0%, transparent 56%),
    radial-gradient(120% 120% at 0% 100%, #ff1f68 0%, transparent 62%), #ff5c7c;
  /* turquesa: menta sobre azul */
  --vivo-5:
    radial-gradient(110% 110% at 0% 100%, #2dffcb 0%, transparent 58%),
    radial-gradient(120% 120% at 100% 0%, #0a7cff 0%, transparent 62%), #00bfb3;
  /* tinta: casi negro con un foco azul y otro naranja */
  --vivo-6:
    radial-gradient(90% 90% at 0% 100%, #2a5cff 0%, transparent 60%),
    radial-gradient(80% 80% at 100% 0%, #ff6a2b 0%, transparent 55%), #0e0f16;
}
```

### Escenarios por página

```css
.hr {
  --vivo-whatsapp:      radial-gradient(110% 110% at 100% 0%, #c8ffd8 0%, transparent 55%), radial-gradient(120% 120% at 0% 100%, #075e54 0%, transparent 64%), #25d366;
  --vivo-titanio:       radial-gradient(110% 110% at 100% 0%, #2ee6ff 0%, transparent 55%), radial-gradient(120% 120% at 0% 100%, #05070c 0%, transparent 62%), #1d2635;
  --vivo-amanecer:      radial-gradient(110% 110% at 0% 0%, #1f6dff 0%, transparent 58%),   radial-gradient(120% 120% at 100% 100%, #ff7a59 0%, transparent 60%), #58adff;
  --vivo-ambar:         radial-gradient(110% 110% at 0% 0%, #f06a00 0%, transparent 58%),   radial-gradient(120% 120% at 100% 100%, #ffd23f 0%, transparent 62%), #ff9f1a;
  --vivo-lima:          radial-gradient(110% 110% at 100% 0%, #f4ff5a 0%, transparent 56%), radial-gradient(120% 120% at 0% 100%, #0f8a3c 0%, transparent 62%), #8fdc2a;
  --vivo-008:           radial-gradient(90% 90% at 0% 100%, #2a5cff 0%, transparent 60%),   radial-gradient(85% 85% at 100% 0%, #f02f65 0%, transparent 56%), #0e0f16;
  --vivo-aurora-noche:  radial-gradient(95% 95% at 0% 100%, #1de9b6 0%, transparent 60%),   radial-gradient(85% 85% at 100% 0%, #ffd23f 0%, transparent 55%), #0d1117;
  --vivo-carmin:        radial-gradient(110% 110% at 100% 0%, #ffb199 0%, transparent 56%), radial-gradient(120% 120% at 0% 100%, #b8002e 0%, transparent 62%), #ff3b3b;
  --vivo-marino:        radial-gradient(100% 100% at 100% 0%, #ffcf4a 0%, transparent 55%), radial-gradient(120% 120% at 0% 100%, #04103a 0%, transparent 62%), #0f2f7a;
  --vivo-pizarra:       radial-gradient(110% 110% at 100% 0%, #a5dcff 0%, transparent 56%), radial-gradient(120% 120% at 0% 100%, #111827 0%, transparent 62%), #4b5d75;
  --vivo-cuaderno:      radial-gradient(100% 100% at 100% 0%, #ffe14d 0%, transparent 55%), radial-gradient(120% 120% at 0% 100%, #0038c7 0%, transparent 62%), #2f7dff;
  --vivo-petroleo:      radial-gradient(100% 100% at 100% 0%, #ff9a5a 0%, transparent 55%), radial-gradient(120% 120% at 0% 100%, #022b33 0%, transparent 62%), #0c6170;
  --vivo-voltio:        radial-gradient(120% 120% at 100% 0%, #ffe600 0%, transparent 58%), radial-gradient(80% 80% at 0% 100%, #9dff3a 0%, transparent 55%), #16171c;
  --vivo-caribe:        radial-gradient(110% 110% at 100% 0%, #ff9c6b 0%, transparent 56%), radial-gradient(120% 120% at 0% 100%, #007a8a 0%, transparent 62%), #18c6c0;
  --vivo-arena:         radial-gradient(100% 100% at 0% 0%, #ffd9a3 0%, transparent 50%),   radial-gradient(120% 120% at 100% 100%, #a83a16 0%, transparent 64%), #e2803c;
  --vivo-grafito:       radial-gradient(100% 100% at 100% 0%, #8ec5ff 0%, transparent 55%), radial-gradient(120% 120% at 0% 100%, #2a1d17 0%, transparent 62%), #23262f;
  --vivo-aurora:        radial-gradient(90% 90% at 0% 0%, #2de2ff 0%, transparent 58%),     radial-gradient(110% 110% at 100% 100%, #c6ff3d 0%, transparent 60%), #0f9c86;
  --vivo-noche:         radial-gradient(100% 100% at 100% 0%, #1fb6ff 0%, transparent 55%), radial-gradient(120% 120% at 0% 100%, #000 0%, transparent 62%), #0a1430;
}
```

| Página | Archivo | Escenario |
| --- | --- | --- |
| Home | `HeroContactacion.jsx` | `--vivo-2` |
| Contact center | `soluciones/contact-center/componentes/HeroContactCenter.jsx` | `--vivo-1` |
| Marcador omnicanal | `marcador-omnicanal/componentes/HeroPulseDial.jsx` | `--vivo-4` |
| Agentes IA de voz | `agentes-ia-voz/componentes/HeroAgente.jsx` | `--vivo-008` |
| Agentes IA de WhatsApp | `agentes-ia-whatsapp/engage.css` | `--vivo-aurora-noche` |
| WhatsApp Calling | `whatsapp-business-calling/whatsapp.css` | `--vivo-whatsapp` |
| SIP Trunk | `smart-sip-trunk/sip.css` | `--vivo-titanio` |
| Numeración | `numeracion/numeracion.css` | `--vivo-amanecer` |
| Rotación (solo mx) | `rotacion-de-numeracion/rotacion.css` | `--vivo-5` |
| VHunter | `vhunter/vhunter.css` | `--vivo-ambar` |
| ASR Vooster (solo mx) | `asr-vooster/asr-vooster.css` | `--vivo-lima` |
| Ventas | `soluciones/ventas/ventas.css` | `--vivo-carmin` |
| Cobranza | `soluciones/cobranza/cobranza.css` | `--vivo-marino` |
| Telefonía corporativa | `soluciones/corporate/corporativa.css` | `--vivo-pizarra` |
| Sectores | `soluciones/sectores-comun/sectores.css` | `--vivo-cuaderno` (educación), `--vivo-petroleo` (servicios), `--vivo-voltio` (energía), `--vivo-caribe` (turismo), `--vivo-arena` (otros) |
| Sobre nosotros | `sobre-nosotros/sobre-nosotros.css` | `--vivo-grafito` |
| Partners | `partners/partners.css` | `--vivo-aurora` |
| Infraestructura | `infraestructura/infraestructura.css` | `--vivo-noche` |
| Contacto | `contacto/contacto.css` | `--vivo-6` |

### Rotación en las rejillas de tarjetas

```css
/* las ilustraciones de cada rejilla rotan por las seis paletas */
.hr :is(.cc-capa-ilu, .st-capa-ilu, .rn-regla-ilu, .vh-salida-ilu, .ag-caso-ilu, .eg-tarjeta-ilu, .pd-cap-ilu, .wc-ventaja-ilu, .hr-producto-ilu, .rc-img.libro) {
  background: var(--grano), var(--vivo, var(--vivo-1));
  background-blend-mode: overlay, normal, normal;
}
.hr :nth-child(6n + 1) > :is(…ilustraciones…) { --vivo: var(--vivo-1); }
.hr :nth-child(6n + 2) > :is(…) { --vivo: var(--vivo-2); }
.hr :nth-child(6n + 3) > :is(…) { --vivo: var(--vivo-3); }
.hr :nth-child(6n + 4) > :is(…) { --vivo: var(--vivo-4); }
.hr :nth-child(6n + 5) > :is(…) { --vivo: var(--vivo-5); }
.hr :nth-child(6n)     > :is(…) { --vivo: var(--vivo-6); }
/* las tarjetas de producto empiezan en otro punto de la rueda para no repetir con la rejilla vecina */
.hr :nth-child(3n + 1) > .hr-producto-ilu { --vivo: var(--vivo-5); }
.hr :nth-child(3n + 2) > .hr-producto-ilu { --vivo: var(--vivo-6); }
.hr :nth-child(3n)     > .hr-producto-ilu { --vivo: var(--vivo-1); }
```

### Lo que va encima del degradado

```css
/* textos sueltos */
.hr :is(…ilustraciones…) :is(small, .etiqueta-suelta) { color: rgba(255, 255, 255, 0.92); }
/* barras secundarias */
.hr :is(…) .barras i { background: rgba(255, 255, 255, 0.5); }
/* la barra que destaca */
.hr :is(…) .barras i.firma { background: #fff; opacity: 1; }
/* líneas base de los gráficos */
.hr :is(…) .barras { border-bottom-color: rgba(255, 255, 255, 0.55); }
/* cajas de contorno */
.hr .rn-regla-ilu .rn-ilu-caja.reserva { border-color: rgba(255, 255, 255, 0.7); }
/* textos del marcador sobre el escenario */
.hr-escenario .hr-h3-marcador small { color: rgba(255, 255, 255, 0.78); }
.hr-escenario .hr-h3-marcador i { color: rgba(255, 255, 255, 0.55); }
.hr-escenario .hr-h3-marcador i.activo { color: #fff; }
```

Animación de una barra que «se enciende» sobre degradado (de blanco translúcido a blanco, nunca a morado):

```css
@keyframes hr-firma-vivo {
  0%, 20%, 100% { transform: scaleY(0.25); background: rgba(255, 255, 255, 0.5); }
  45%, 90%      { transform: scaleY(1);    background: #fff; }
}
```

---

## 20. Tailwind

### Lo que hay hoy

El rediseño **no usa Tailwind**: todo es CSS plano con las clases `.hr-*`, `.hn-*` y los prefijos de cada página. `tailwind.config.js` (Tailwind 3.3) es de la web antigua y sus tokens **no** son los de la marca actual:

```js
// tailwind.config.js (LEGACY — no usar para nada nuevo)
colors: {
  main: "#8331A7",       // el morado, pensado como color principal (hoy solo es acento)
  green: "#3FCEA6",      // la menta del logo, usada como color de UI (hoy prohibido)
  black: "#000000",      // hoy el negro de marca es #0b0b10
  carbono: "#191919",
  gris: "#e5e7eb",
  white: "#ffffff",
  "green-offer": "#00bd82",
  whatsapp: "#25D366",
  bg: "#F7F8FC",         // hoy el fondo es #fafafa
},
animation: { "text-gradient", "background-shine", "pulse-slow", "border-width", "loop-scroll", "text-slide" }
```

`text-gradient` y `background-shine` (texto con degradado y brillos) son justo los recursos que la marca actual prohíbe.

### Preset para proyectos nuevos con Tailwind 3

Para herramientas que generan Tailwind (v0, Lovable, Bolt, Cursor), usa este preset. Incluye los tokens del rediseño y **deja fuera a propósito** lo que no se debe poder escribir: no hay `bg-acc` grande, ni sombras de color, ni radios de más de 16 px.

```js
// tailwind.preset.astroline.js
/** @type {import('tailwindcss').Config} */
module.exports = {
  theme: {
    // se reemplazan (no se extienden) radios y sombras para que no existan los de Tailwind por defecto
    borderRadius: {
      none: "0",
      mini: "2px",
      DEFAULT: "9px",
      ficha: "9px",
      pieza: "10px",
      card: "12px",
      menu: "14px",
      escenario: "16px",
      full: "999px",
    },
    boxShadow: {
      none: "none",
      card: "0 1px 2px rgba(16,16,24,.04), 0 8px 24px rgba(16,16,24,.05)",
      flota: "0 6px 18px rgba(16,16,24,.08)",
      deteccion: "0 4px 14px rgba(16,16,24,.08)",
      ficha: "0 12px 26px rgba(16,16,24,.09)",
      pestana: "0 1px 2px rgba(16,16,24,.06), 0 4px 14px rgba(16,16,24,.06)",
      menu: "0 16px 40px rgba(16,16,24,.1)",
      desplegable: "0 12px 32px rgba(16,16,24,.1)",
      barra: "0 4px 18px rgba(16,16,24,.05)",
      escena: "0 1px 2px rgba(16,16,24,.08), 0 24px 60px rgba(16,16,24,.22)",
      cristal: "0 6px 18px rgba(8,24,72,.12)",
      anillo: "0 0 0 3px rgba(131,49,167,.14)",
    },
    fontFamily: {
      sans: ["var(--font-general-sans)", "General Sans", "system-ui", "sans-serif"],
    },
    // la web trabaja de escritorio hacia abajo
    screens: {
      portatil: { max: "1100px" },
      menu: { max: "1099px" },
      tablet: { max: "760px" },
      movil: { max: "600px" },
      mini: { max: "560px" },
    },
    extend: {
      colors: {
        ast: {
          bg: "#fafafa",
          panel: "#f2f2f4",
          franja: "#f3f3f5",
          line: "#e6e6ea",
          "line-in": "#f0f0f3",
          edge: "#e4e4e8",
          "btn-edge": "#dcdce2",
          "btn-edge-hover": "#b9b9c2",
          cross: "#b4b4bd",
          off: "#c4c4cc",
          track: "#efeff2",
          hover: "#f4f4f6",
          destacado: "#f7f7f9",
          text: "#0b0b10",
          "text-hover": "#2a2a33",
          label: "#3a3a44",
          soft: "#5c5c68",
          muted: "#8a8a96",
          rojo: "#e5484d",
          "rojo-fondo": "#fff6f6",
          verde: "#30a46c",
          "verde-fondo": "#f3fbf6",
          ambar: "#e8a33c",
          "ambar-fondo": "#fffaf0",
        },
      },
      // el morado solo existe para texto, iconos, bordes, trazos y rellenos de puntos
      textColor: { "ast-acc": "#8331a7" },
      borderColor: {
        "ast-acc": "#8331a7",
        "ast-acc-45": "rgba(131,49,167,.45)",
        "ast-acc-35": "rgba(131,49,167,.35)",
      },
      fill: { "ast-acc": "#8331a7" },
      stroke: { "ast-acc": "#8331a7" },
      // para marcas de datos: puntos, pods, barras de onda, progreso y gráfico. Nunca en superficies
      backgroundColor: { "ast-acc-punto": "#8331a7" },
      fontSize: {
        "ast-h1": ["46px", { lineHeight: "1.04", letterSpacing: "-0.025em", fontWeight: "500" }],
        "ast-cierre": ["52px", { lineHeight: "1.04", letterSpacing: "-0.025em", fontWeight: "500" }],
        "ast-h2": ["42px", { lineHeight: "1.08", letterSpacing: "-0.02em", fontWeight: "500" }],
        "ast-dato": ["56px", { lineHeight: "1", letterSpacing: "-0.03em", fontWeight: "500" }],
        "ast-h3": ["21px", { lineHeight: "1.3", letterSpacing: "-0.01em", fontWeight: "500" }],
        "ast-h3-producto": ["18px", { letterSpacing: "-0.01em", fontWeight: "500" }],
        "ast-lead": ["18px", { lineHeight: "1.5" }],
        "ast-sub": ["18px", { lineHeight: "1.45" }],
        "ast-feat": ["15.5px", { fontWeight: "500" }],
        "ast-body": ["15px", { lineHeight: "1.6" }],
        "ast-small": ["14.5px", { lineHeight: "1.55" }],
        "ast-kicker": ["14px", { fontWeight: "500" }],
        "ast-btn": ["15px", { fontWeight: "500" }],
        "ast-tag": ["13px", { fontWeight: "500" }],
        "ast-flota": ["12px", { fontWeight: "500" }],
        "ast-micro": ["11px", { fontWeight: "500" }],
      },
      maxWidth: { site: "1440px", sub: "440px", lead: "480px", "lead-cierre": "560px" },
      spacing: { gutter: "24px", seccion: "96px", "seccion-portatil": "72px", "seccion-tablet": "60px", cols: "64px" },
      keyframes: {
        sube: { from: { opacity: "0", transform: "translateY(6px)" } },
        late: { "50%": { opacity: ".35" } },
        onda: { from: { transform: "scaleY(.3)" }, to: { transform: "scaleY(1)" } },
        progreso: { from: { transform: "scaleX(0)" }, to: { transform: "scaleX(1)" } },
        cinta: { to: { transform: "translateX(calc(-50% - 28px))" } },
        burbuja: {
          "0%": { opacity: "0", transform: "translateY(6px)" },
          "8%, 80%": { opacity: "1", transform: "none" },
          "90%, 100%": { opacity: "0" },
        },
      },
      animation: {
        sube: "sube .4s ease both",
        late: "late 1s ease-in-out infinite",
        onda: "onda 1.1s ease-in-out infinite alternate",
        progreso: "progreso 8s linear both",
        cinta: "cinta 70s linear infinite",
        burbuja: "burbuja 7.5s infinite both",
      },
      transitionDuration: { hover: "200ms", menu: "160ms", lista: "150ms" },
      backgroundImage: {
        grano: "url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23g)' opacity='.5'/%3E%3C/svg%3E\")",
      },
    },
  },
  plugins: [
    // .vivo-1 … .vivo-6 y escenarios: grano + degradado + mezcla, en una clase
    function ({ addUtilities }) {
      const grano = "url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23g)' opacity='.5'/%3E%3C/svg%3E\")";
      const vivos = {
        1: "radial-gradient(110% 110% at 0% 0%, #ffd23f 0%, transparent 58%), radial-gradient(120% 120% at 100% 100%, #ff2e4d 0%, transparent 62%), #ff7a1a",
        2: "radial-gradient(110% 110% at 100% 0%, #43f0ff 0%, transparent 56%), radial-gradient(120% 120% at 0% 100%, #0031e0 0%, transparent 62%), #1672ff",
        3: "radial-gradient(110% 110% at 0% 0%, #e6ff3d 0%, transparent 58%), radial-gradient(120% 120% at 100% 100%, #009c63 0%, transparent 62%), #32cc72",
        4: "radial-gradient(110% 110% at 100% 0%, #ffc29a 0%, transparent 56%), radial-gradient(120% 120% at 0% 100%, #ff1f68 0%, transparent 62%), #ff5c7c",
        5: "radial-gradient(110% 110% at 0% 100%, #2dffcb 0%, transparent 58%), radial-gradient(120% 120% at 100% 0%, #0a7cff 0%, transparent 62%), #00bfb3",
        6: "radial-gradient(90% 90% at 0% 100%, #2a5cff 0%, transparent 60%), radial-gradient(80% 80% at 100% 0%, #ff6a2b 0%, transparent 55%), #0e0f16",
      };
      const utilidades = {};
      for (const [k, v] of Object.entries(vivos)) {
        utilidades[`.vivo-${k}`] = { background: `${grano}, ${v}`, backgroundBlendMode: "overlay, normal, normal" };
      }
      addUtilities(utilidades);
    },
  ],
};
```

Uso:

```js
// tailwind.config.js de un proyecto nuevo
module.exports = { presets: [require("./tailwind.preset.astroline.js")], content: ["./src/**/*.{js,jsx,ts,tsx}"] };
```

### Equivalencias de componentes en Tailwind

Las clases `size-*` necesitan Tailwind 3.4 o posterior.

| Componente | Clases |
| --- | --- |
| Página | `bg-ast-bg text-ast-text font-sans antialiased` |
| Contenedor | `relative mx-auto max-w-site border-x border-ast-line` |
| Bloque | `grid grid-cols-[1fr_1.05fr] items-center gap-cols px-gutter py-seccion portatil:grid-cols-1 portatil:gap-11 portatil:px-8 portatil:py-seccion-portatil tablet:px-gutter tablet:py-seccion-tablet` |
| Antetítulo | `flex items-center gap-2 text-ast-kicker text-ast-soft` + icono `size-[15px] text-ast-acc` |
| H2 | `mt-3.5 text-ast-h2 text-ast-soft tablet:text-[31px]` + `<em class="not-italic text-ast-text">` |
| Entradilla | `mt-4 max-w-lead text-ast-lead text-ast-soft` |
| Botón principal | `inline-flex items-center justify-center gap-2 rounded-full bg-ast-text px-[18px] py-2.5 text-ast-btn text-white transition-colors duration-hover hover:bg-ast-text-hover` |
| Botón secundario | `inline-flex items-center justify-center gap-2 rounded-full border border-ast-btn-edge bg-white px-[18px] py-2.5 text-ast-btn text-ast-text transition-colors duration-hover hover:border-ast-btn-edge-hover` |
| Etiqueta | `inline-flex items-center gap-[7px] self-start rounded-full border border-ast-edge bg-white py-1.5 pl-[9px] pr-[11px] text-ast-tag text-ast-label` + icono `size-3.5 text-ast-acc` |
| Tarjeta | `rounded-card border border-ast-edge bg-white shadow-card` |
| Panel | `relative aspect-[1/0.92] overflow-hidden rounded-card border border-ast-edge bg-ast-panel` |
| Escenario | `vivo-2 rounded-escenario` (o el escenario de la página) |
| Punto de estado vivo | `size-1.5 rounded-full bg-ast-acc-punto animate-late` |

### Tailwind 4 (`@theme`)

```css
@import "tailwindcss";

@theme {
  --font-sans: var(--font-general-sans), "General Sans", system-ui, sans-serif;

  --color-ast-bg: #fafafa;
  --color-ast-panel: #f2f2f4;
  --color-ast-franja: #f3f3f5;
  --color-ast-line: #e6e6ea;
  --color-ast-line-in: #f0f0f3;
  --color-ast-edge: #e4e4e8;
  --color-ast-btn-edge: #dcdce2;
  --color-ast-btn-edge-hover: #b9b9c2;
  --color-ast-cross: #b4b4bd;
  --color-ast-hover: #f4f4f6;
  --color-ast-text: #0b0b10;
  --color-ast-text-hover: #2a2a33;
  --color-ast-label: #3a3a44;
  --color-ast-soft: #5c5c68;
  --color-ast-muted: #8a8a96;
  --color-ast-acc: #8331a7;        /* SOLO text-, border-, fill-, stroke- y marcas de datos; nunca bg- de superficies */
  --color-ast-rojo: #e5484d;
  --color-ast-verde: #30a46c;
  --color-ast-ambar: #e8a33c;

  --radius-ficha: 9px;
  --radius-pieza: 10px;
  --radius-card: 12px;
  --radius-menu: 14px;
  --radius-escenario: 16px;

  --shadow-card: 0 1px 2px rgba(16,16,24,.04), 0 8px 24px rgba(16,16,24,.05);
  --shadow-flota: 0 6px 18px rgba(16,16,24,.08);
  --shadow-menu: 0 16px 40px rgba(16,16,24,.1);
  --shadow-escena: 0 1px 2px rgba(16,16,24,.08), 0 24px 60px rgba(16,16,24,.22);

  --text-ast-h1: 46px;   --text-ast-h1--line-height: 1.04; --text-ast-h1--letter-spacing: -0.025em;
  --text-ast-h2: 42px;   --text-ast-h2--line-height: 1.08; --text-ast-h2--letter-spacing: -0.02em;
  --text-ast-dato: 56px; --text-ast-dato--line-height: 1;  --text-ast-dato--letter-spacing: -0.03em;
  --text-ast-lead: 18px; --text-ast-lead--line-height: 1.5;
  --text-ast-body: 15px; --text-ast-body--line-height: 1.6;
  --text-ast-tag: 13px;

  --container-site: 1440px;

  --animate-sube: sube .4s ease both;
  @keyframes sube { from { opacity: 0; transform: translateY(6px); } }
}

@utility vivo-2 {
  background:
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23g)' opacity='.5'/%3E%3C/svg%3E"),
    radial-gradient(110% 110% at 100% 0%, #43f0ff 0%, transparent 56%),
    radial-gradient(120% 120% at 0% 100%, #0031e0 0%, transparent 62%),
    #1672ff;
  background-blend-mode: overlay, normal, normal;
}
/* …una @utility por paleta, con los valores de la sección 17 */
```

En Tailwind 4, para que no existan los radios y sombras por defecto, añade `--radius-*: initial;` y `--shadow-*: initial;` al principio del `@theme`.

### Clases de Tailwind que no se usan nunca

`bg-gradient-to-*` con morados o índigos, `from-purple-*`, `to-indigo-*`, `bg-purple-*`, `bg-violet-*`, `rounded-2xl`/`rounded-3xl`, `shadow-lg`/`shadow-xl`/`shadow-2xl`, `backdrop-blur-*` en tarjetas, `uppercase`, `tracking-widest`, `font-bold` en titulares, `font-mono`, `bg-clip-text text-transparent`, `animate-bounce`, `animate-spin` decorativo, `animate-pulse` en bloques grandes.

---

## 26. Prompts base

Copia el prompt que toque, rellena lo que va entre corchetes y añade el encargo debajo. Los de imagen y vídeo van en inglés porque los modelos lo siguen mejor; el texto que salga en pantalla se escribe aparte, en el idioma del mercado.

### Reglas por mercado (para pegar donde pone [MERCADO])

| Mercado | Texto para pegar |
| --- | --- |
| México | Español de México, trato de usted. Se puede hablar de detección de spam, rotación de numeración, SMS y SIP Trunk para México. Cifras con coma de miles y punto decimal. CTA: «Hable con un experto». |
| España | Español de España, trato de tú. Prohibido hablar de spam, antispam, rotación de numeración o SMS. Sí: numeración 400 para llamadas comerciales, SIP Trunk en España, red privada, buzones antes del descuelgue. Cifras con punto de miles y coma decimal. CTA: «Habla con un experto». |
| Reino Unido | British English. Never mention spam, number rotation or SMS. Focus: SIP Trunk in the UK, omnichannel dialling, voicemail detection, voice in 85+ countries. CTA: “Talk to an expert”. |
| EE. UU. | American English. Never mention spam, number rotation or SMS. Focus: SIP Trunk in the US, omnichannel dialing, voicemail detection, voice in 85+ countries. CTA: “Talk to an expert”. |

### Web, landing o plataforma (CSS o Tailwind)

```text
Eres diseñador y desarrollador front-end de Astroline, un operador de voz (carrier) para contact centers de mucho volumen. Diseña [PIEZA] siguiendo estas reglas sin excepción. Tienes adjunta la guía de marca: sus valores mandan sobre tus valores por defecto.

MERCADO: [MERCADO]

CÓDIGO: [CSS plano con la hoja de tokens de la sección 13 / Tailwind con el preset de la sección 20]. No uses los colores, radios ni sombras por defecto de Tailwind.

ESTILO: claro y técnico, como www.astroline.com. Fondo #fafafa. Contenedor de 1440 px con guías verticales de 1 px #e6e6ea y cruces de 11 px #b4b4bd en los vértices. Rejilla de puntos grises de fondo cada 30 px. Bloques de dos columnas (1fr 1.05fr: texto y creatividad), 96 px de relleno vertical, 64 px de separación; a una columna por debajo de 1100 px.

TIPOGRAFÍA: solo General Sans (400 cuerpo; 500 titulares, botones y etiquetas; nunca 700). Cifras con font-variant-numeric: tabular-nums. Ninguna otra fuente, tampoco monoespaciada. H1 46px/1.04/-0.025em; H2 42px/1.08/-0.02em; entradilla 18px/1.5 máx. 480 px; cuerpo 15px/1.6.

TITULARES EN DOS TIEMPOS: dos frases cortas con punto; la primera en #5c5c68 y la segunda dentro de <em> (sin cursiva) en #0b0b10, seguidas en la misma línea.

COLOR: texto #0b0b10; secundario #5c5c68; bordes #e4e4e8; paneles grandes #f2f2f4 planos; tarjetas blancas. Morado #8331A7 SOLO en iconos, trazos, bordes finos y marcas de datos (puntos, barras de onda, progreso y gráfico): nunca de fondo, ni en botones, ni en estados activos, ni en tintes. Para destacar, negro #0b0b10. Estados: rojo #e5484d, verde #30a46c, ámbar #e8a33c.

ILUSTRACIONES: degradados intensos a sangre con dos radial-gradient en esquinas opuestas sobre un color base y grano encima (feTurbulence fractalNoise .85, 3 octavas, desaturado, opacidad .5, tesela 180 px, background-blend-mode overlay). Paletas: fuego (#ffd23f, #ff2e4d, base #ff7a1a), océano (#43f0ff, #0031e0, base #1672ff), lima (#e6ff3d, #009c63, base #32cc72), rosa (#ffc29a, #ff1f68, base #ff5c7c), turquesa (#2dffcb, #0a7cff, base #00bfb3), tinta (#2a5cff, #ff6a2b, base #0e0f16). Una distinta en cada tarjeta. Ninguna puede dar morado ni lavanda. Nada pastel. Lo que va encima del degradado, en blanco (texto al 92 %, barras secundarias al 50 %).

ICONOS: lucide-react, trazo 2, 13-16 px, en morado, sueltos, nunca dentro de una caja o círculo.

COMPONENTES: botón principal pastilla #0b0b10 con texto blanco 15px/500, relleno 10×18 (hover #2a2a33); secundario pastilla blanca con borde #dcdce2 (hover #b9b9c2). Etiquetas: pastilla blanca, borde #e4e4e8, 13px/500, texto #3a3a44, icono morado de 14 px. Tarjetas blancas, radio 12 px, borde de 1 px, sombra 0 1px 2px rgba(16,16,24,.04), 0 8px 24px rgba(16,16,24,.05) o ninguna. Escenarios de hero con radio 16 px. Pestañas como control segmentado: pista #f0f0f3, activa en blanco con sombra suave. Radios permitidos: 999, 16, 14, 12, 10, 9 y 2 px.

MOVIMIENTO: solo transform y opacity; hover 0,2 s ease; aparición 0,4 s subiendo 6 px. Todo se apaga con prefers-reduced-motion.

TEXTO: mayúscula inicial en etiquetas y botones; nunca palabras enteras en mayúsculas ni text-transform: uppercase. Sin emojis ni exclamaciones. Prohibido: revolucionario, de vanguardia, última generación, potenciar, desbloquear, sin fisuras, «no es solo X, es Y». No inventes cifras, clientes ni testimonios.

COMUNICACIÓN: nunca digas que los buzones no se facturan o no cuestan; di «gran ahorro en buzones». Nunca prometas numeración siempre limpia. No nombres PulseDial ni 008: di «marcación omnicanal» y «agentes IA de voz y de WhatsApp». El agente IA se representa con el icono Bot de Lucide.

ACCESIBILIDAD: contraste mínimo 4,5:1, foco visible, alternativa 2D a cualquier 3D, sin scroll horizontal en móvil (margen de 24 px).

EVITA: glassmorphism y backdrop-filter en tarjetas, sombras de color, brillos, texto con degradado, hero centrado con captura en perspectiva, tres tarjetas idénticas con icono en caja, el icono Sparkles, radios de 20 px o más, bg-gradient-to-r from-purple.
```

### Escena three.js

```text
Crea una escena three.js (r186, ES modules) en el estilo 3D de Astroline. Sigue esta receta: WebGLRenderer con antialias y alpha, clearColor transparente, outputColorSpace SRGB, NeutralToneMapping, PMREM de RoomEnvironment como entorno, una DirectionalLight blanca desde arriba a la izquierda con sombra suave, cámara ortográfica casi frontal y algo elevada, un suelo invisible con ShadowMaterial muy tenue, y piezas de cristal esmerilado (MeshPhysicalMaterial blanco, roughness .18, clearcoat 1, opacidad 0,46) y arcilla blanca mate. Morado #8331A7 solo en la pieza destacada, con emisivo suave. Colores de estado: rojo #e5484d, verde #30a46c, ámbar #e8a33c.
Las piezas no se mueven: se mueven los puntos que viajan y un vaivén lento de cámara. Curva ease-in-out cuadrática.
Fondo: el canvas es transparente y va encima de un escenario con degradado vivo y grano hecho en CSS.
Etiquetas: en HTML encima del canvas, proyectando la posición 3D a pantalla en cada fotograma (transform translate), con el estilo de badge de cristal de la sección 9.
Rendimiento: pixelRatio máximo 1,5, sombras con autoUpdate false, render solo cuando el canvas es visible y la pestaña está activa, liberar geometrías y materiales al desmontar. Con prefers-reduced-motion, un fotograma quieto. Sin WebGL, alternativa 2D.
Escena: [DESCRIPCIÓN].
```

### Imagen o ilustración 3D

```text
Minimal 3D product illustration for a voice carrier brand. Subject: [SUBJECT, e.g. three frosted-glass gates filtering a stream of small white dots that flow left to right into three white blocks].
Materials: white frosted glass with a clear-coat sheen, semi-translucent (opacity about 0.46), and matte white clay.
Lighting: one soft white key light from the upper left, soft studio environment, very soft contact shadows at low opacity.
Camera: orthographic, near-frontal, slightly elevated, rotated about 17 degrees, no perspective distortion.
Background: full-bleed intense gradient, [PALETTE, e.g. electric blue #1672ff base with a cyan #43f0ff glow top-right and deep blue #0031e0 bottom-left], with fine monochrome film grain.
Accent: a small purple #8331A7 glow on one highlighted element only.
Mood: calm, precise, premium, lots of negative space, 3 to 4 elements at most.
Negative: no text, no letters, no numbers, no logos, no people, no faces, no robots, no brains, no circuits, no holograms, no neon, no bloom, no lens flare, no chrome, no purple or lavender background, no pastel colors.
```

### Plano de vídeo generado

```text
[6]-second shot, [16:9 / 9:16], 30 fps. Scene: [SAME SCENE AS THE IMAGE PROMPT].
Camera: very slow lateral dolly of a few degrees, orthographic look, no rotation, no zoom.
Motion: small white dots travel along glass tubes at constant speed; one gate lights up [amber #e8a33c / red #e5484d / green #30a46c] for about one second as a dot passes. Every object keeps its exact shape and position.
Lighting and background: as above, with fine film grain.
Negative: no text, no logos, no people, no cuts, no flicker, no morphing, no camera shake, no color shift toward purple or lavender.
```

### Textos (web, posts, correos, guiones)

```text
Escribe [PIEZA] para Astroline, operador de voz para contact centers, equipos de ventas y de cobranza que hacen millones de llamadas al mes.

MERCADO: [MERCADO]

TONO: concreto, seguro y sin adornos. El dato va antes que el adjetivo. Frases de menos de 20 palabras.
TITULAR EN DOS TIEMPOS: hecho + lo que gana el cliente, cada parte con su punto y de 8 palabras como máximo. Ejemplo: «Detectamos el buzón antes del descuelgue. Y el contacto sigue por WhatsApp.»
LONGITUDES: subtítulo de 40 palabras como máximo; ventajas con título de hasta 6 palabras y una frase de hasta 20.
FORMATO: mayúscula inicial; sin palabras enteras en mayúsculas, sin emojis, sin exclamaciones. Comillas «» en español.
PROHIBIDO: revolucionario, disruptivo, de vanguardia, última generación, potenciar, desbloquear, sin fisuras, «no es solo X, es Y», «imagina», tres adjetivos seguidos, cifras inventadas, «líder».
NUNCA: decir que los buzones no se facturan; prometer numeración siempre limpia; nombrar PulseDial o 008.
DATOS PERMITIDOS: voz en más de 85 países; POPs en Madrid, Ámsterdam, Virginia, Monterrey, Bogotá, Lima y São Paulo; ISO 27001:2022; detección de buzones en el early media, por frecuencia, antes del descuelgue.

Dame tres opciones de titular y explica en una línea qué tiene cada una.
```

---

## 27. Checklist antes de publicar

Una persona del equipo repasa esta lista con la pieza delante; si falla un punto marcado **Nunca**, la pieza no sale.

### Mensaje

- [ ] Cuenta una sola idea y se resume en «más llamadas que acaban en conversación».
- [ ] Está hecha para un mercado concreto y respeta lo que allí se puede decir (spam, rotación y SMS, solo en México; numeración 400, solo en España).
- [ ] **Nunca:** dice que los buzones no se facturan o no cuestan.
- [ ] **Nunca:** promete numeración siempre limpia ni sustituir números en spam.
- [ ] **Nunca:** nombra ni enseña PulseDial, 008 Agent o 008 Engage como producto nuestro.
- [ ] Todas las cifras son reales y están en la lista de datos permitidos.

### Texto

- [ ] El titular va en dos tiempos, con punto en cada parte.
- [ ] Tiene el trato del mercado (tú, usted o you) y la ortografía correcta (en-GB o en-US).
- [ ] Etiquetas y botones con mayúscula inicial; ninguna palabra entera en mayúsculas.
- [ ] Ninguna palabra de la lista prohibida, ningún emoji, ninguna exclamación.
- [ ] Los nombres de producto están bien escritos (VHunter, ASR Vooster, SIP Trunk, WhatsApp Calling).
- [ ] Los teléfonos de ejemplo son de ficción o están enmascarados.

### Diseño

- [ ] Una sola tipografía: General Sans, sin pesos 700.
- [ ] **Nunca:** morado de fondo, en botones, en estados activos ni en tintes (como relleno, solo en marcas de datos).
- [ ] Ningún degradado pastel ni que dé morado o lavanda; todos con grano.
- [ ] Iconos Lucide, sueltos y sin caja.
- [ ] Tarjetas blancas con borde de 1 px, radios de la lista y paneles grandes en gris plano.
- [ ] Ninguna de las señales de «hecho con IA».

### Código

- [ ] Usa los tokens de la sección 13 o el preset de Tailwind de la sección 20; ningún color, radio o sombra inventados.
- [ ] Cifras formateadas con `toLocaleString` del mercado y `tabular-nums`.
- [ ] Solo se animan `transform` y `opacity`; nada de `backdrop-filter` sobre escenas en movimiento.
- [ ] Todo se para con `prefers-reduced-motion`.
- [ ] El 3D tiene alternativa en 2D, pixel ratio limitado y libera memoria al desmontar.
- [ ] Contraste de 4,5 : 1 en el texto de lectura, foco visible y sin scroll horizontal en móvil.
- [ ] Cada idioma lleva sus textos y su `lang`.

### Logotipo

- [ ] Es el SVG oficial, en la versión correcta para el fondo.
- [ ] Respeta el tamaño mínimo y el área de respeto.
- [ ] **Nunca:** generado, redibujado, recoloreado ni con efectos.

### Imágenes, vídeo y voz generados

- [ ] No hay texto, logos ni caras generadas dentro de la imagen.
- [ ] Ninguna persona generada se presenta como cliente, empleado o testimonio.
- [ ] Revisado fotograma a fotograma: sin deformaciones, parpadeos ni virajes de color.
- [ ] Subtítulos puestos y logotipo de cierre con la llamada a la acción del mercado.
- [ ] La voz no imita a una persona real sin su consentimiento por escrito.
- [ ] Si es contenido sintético realista, está marcado donde la plataforma o la ley lo piden.
