El punto del mapa ya no lo tapa el pais de al lado

Cada punto se dibujaba dentro del grupo de su pais, y en un SVG no hay
`z-index`: manda el orden en que esta escrito. El relleno del pais siguiente se
pintaba encima y el punto salia mordido por un lado. Ahora hay dos pasadas,
primero todas las tierras y luego todos los puntos, y el que enciende cada uno
se anota en `bajoPuntero` y `conFoco`, porque desde la capa de arriba ningun
selector alcanza al pais de debajo.

De paso, tres cosas que se veian mal y no daban error:

- El radio salia de dividir por el ancho de la caja, pero con `max-height` el
  dibujo se ajusta al alto y en una ventana baja America se pintaba a 0,57 en
  vez de a 0,70. El punto de Mexico media doce pixeles y el de España quince.
  Ahora la escala sale del lado que primero se queda corto.
- De España ya no se dibujan las islas: Canarias caia fuera del recuadro y las
  Baleares eran cuatro pixeles sueltos al este.
- Un solo verde para todo pais con generos. El segundo tono servia para separar
  la cuna de lo adoptado y lo unico que conseguia era que España, que solo
  adopto el bolero, saliera de otro color que el resto. Esa diferencia se
  cuenta en la lista de al lado.

La Peninsula, cuarenta pixeles a la izquierda; en movil no, que ahi su columna
mide noventa y se metia encima de America.

`e2e/mapa.e2e.ts` fija las cuatro: orden de pintado, tamaño del punto, color
unico y España sin islas. Ninguna daba error, el mapa salia igual, solo que
mal.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
master
dev 4 weeks ago
parent b233673eed
commit 174cf828e7

@ -0,0 +1,92 @@
import { expect, test } from '@playwright/test';
/*
* El mapa de la portada de géneros.
*
* Todo lo que se comprueba aquí se ha roto al menos una vez, y ninguna de las
* roturas daba error: el mapa seguía saliendo, solo que mal. Por eso son
* pruebas y no una mirada.
*/
test.describe('Mapa de géneros', () => {
test.beforeEach(async ({ page }) => {
await page.goto('/generos');
});
test('los puntos se pintan después de todas las tierras', async ({ page }) => {
// En un SVG no hay `z-index`: manda el orden en que está escrito. Con el
// punto dentro de su país, el relleno del país siguiente se lo comía por
// un lado y el punto salía mordido.
const mordidos = await page.evaluate(() => {
const fuera: string[] = [];
for (const svg of document.querySelectorAll('svg[role="group"]')) {
const todos = [...svg.querySelectorAll('path, circle.punto')];
const ultimaTierra = todos.findLastIndex((e) => e.tagName === 'path');
const primerPunto = todos.findIndex((e) => e.classList.contains('punto'));
if (primerPunto !== -1 && primerPunto < ultimaTierra) {
fuera.push(svg.getAttribute('aria-label') ?? '?');
}
}
return fuera;
});
expect(mordidos).toEqual([]);
});
test('el punto mide lo mismo en América que en la Península', async ({ page }) => {
// Los dos lienzos se dibujan a anchos muy distintos —seiscientas unidades
// de encuadre uno, ciento diez el otro—, así que un radio en unidades del
// mapa daba en España la mitad de punto.
const medir = async (pais: string) => {
const grupo = page.locator(`g.pais[aria-label^="${pais}"]`).first();
const diana = (await grupo.locator('circle.golpe').boundingBox())!;
await page.mouse.move(diana.x + diana.width / 2, diana.y + diana.height / 2);
const punto = page.locator('circle.punto.visible').first();
await expect(punto).toBeAttached();
return Math.round((await punto.boundingBox())!.width);
};
expect(await medir('España')).toBe(await medir('México'));
});
test('todos los países con géneros llevan el mismo relleno', async ({ page }) => {
// Hubo una versión con dos verdes, uno para la cuna y otro para donde solo
// se adoptó, y España —que solo adoptó el bolero— salía de otro color que
// el resto. Esa diferencia se cuenta en la lista, no en el mapa.
const rellenos = await page
.locator('g.pais:not(.elegido) path.tierra')
.evaluateAll((es) => [...new Set(es.map((e) => getComputedStyle(e).fill))]);
expect(rellenos).toHaveLength(1);
});
test('el punto solo sale en el país señalado', async ({ page }) => {
// En reposo no hay ninguno: el mapa es de países, no de chinchetas.
await expect(page.locator('circle.punto.visible')).toHaveCount(0);
const grupo = page.locator('g.pais[aria-label^="Cuba"]').first();
const diana = (await grupo.locator('circle.golpe').boundingBox())!;
await page.mouse.move(diana.x + diana.width / 2, diana.y + diana.height / 2);
await expect(page.locator('circle.punto.visible')).toHaveCount(1);
});
test('España se dibuja sin islas', async ({ page }) => {
// Canarias caía fuera del recuadro y acababa pintada sobre América;
// las Baleares eran cuatro píxeles sueltos al este.
const trazados = await page
.locator('g.pais[aria-label^="España"] path.tierra')
.first()
.evaluate((e) => (e.getAttribute('d')?.match(/M/g) ?? []).length);
expect(trazados).toBe(1);
});
test('pulsar un país filtra la lista de géneros', async ({ page }) => {
await page.locator('g.pais[aria-label^="Cuba"]').first().click();
await expect(page.getByRole('heading', { name: 'Nació en Cuba' })).toBeVisible();
await expect(page.getByRole('button', { name: /Quitar el filtro de país/ })).toBeVisible();
});
});

@ -231,6 +231,17 @@ const centro = {};
const principal = {};
let descartados = 0;
/**
* Países de los que solo se dibuja el trozo mayor.
*
* España es la Península más Canarias y Baleares. Canarias cae a mil
* kilómetros al suroeste, fuera del recuadro; las Baleares son cuatro píxeles
* sueltos al este. En un mapa que trata de géneros, ninguna de las dos dice
* nada que no diga ya la Península, y sueltas al borde del encuadre solo
* ensucian.
*/
const SIN_ISLAS = ['es'];
for (const codigo of PAISES) {
const buenos = trozos[codigo].filter((d) => {
const { ancho, alto } = tamano(d);
@ -238,7 +249,6 @@ for (const codigo of PAISES) {
if (!vale) descartados++;
return vale;
});
contorno[codigo] = unaDecimal(unir(buenos));
/*
* Un punto donde agarrar el país.
@ -257,6 +267,8 @@ for (const codigo of PAISES) {
const medio = (ns) => ns.reduce((t, n) => t + n, 0) / ns.length;
centro[codigo] = [medio(xs), medio(ys)].map((n) => Math.round(n * 10) / 10);
principal[codigo] = mayor;
contorno[codigo] = unaDecimal(unir(SIN_ISLAS.includes(codigo) ? [mayor] : buenos));
}
/**
@ -290,8 +302,8 @@ const encuadre = encuadrar(PAISES.filter((c) => !IBERIA.includes(c)));
/*
* El inserto encuadra solo la parte continental. Con Canarias dentro, el
* rectángulo se estiraba mil kilómetros al suroeste y la Península quedaba del
* tamaño de una mota. Las islas se siguen dibujando; lo que cambia es el
* encuadre.
* tamaño de una mota. De España ya no se dibujan las islas; de Portugal sí, y
* Azores y Madeira caen fuera de este rectángulo, que es donde deben caer.
*/
const encuadreIberia = encuadrar(IBERIA, true);

@ -62,8 +62,8 @@
* elige, que es su trabajo en el resto del sitio.
*/
--c-dato: oklch(0.74 0.09 198);
/* El mismo tono, más flojo: «también se canta aquí», no otro dato. */
--c-dato-tenue: oklch(0.55 0.075 198);
/* El mismo tono, un paso por debajo: «también se canta aquí», no otro dato. */
--c-dato-tenue: oklch(0.66 0.085 198);
--c-dato-vacio: oklch(0.29 0.03 255);
--c-danger: oklch(0.72 0.16 22);
@ -215,8 +215,8 @@
/* En claro se invierten: el dato pintado tiene que ser oscuro sobre papel. */
--c-dato: oklch(0.5 0.085 200);
/* El mismo tono, más flojo: «también se canta aquí», no otro dato. */
--c-dato-tenue: oklch(0.68 0.07 200);
/* El mismo tono, un paso por debajo: «también se canta aquí», no otro dato. */
--c-dato-tenue: oklch(0.62 0.08 200);
--c-dato-vacio: oklch(0.93 0.012 255);
--c-danger: oklch(0.5 0.17 25);

@ -51,28 +51,46 @@
return espana ? [espana, ...resto] : resto;
});
/** El ancho de un encuadre, en unidades del mapa. */
const anchoDe = (encuadre: string) => Number(encuadre.split(' ')[2]);
/*
* El radio del punto, en píxeles de pantalla.
*
* No basta con hacerlo proporcional al encuadre: los dos mapas se dibujan a
* anchos distintos —América ocupa una columna y la Península menos de la
* mitad—, así que el mismo porcentaje daba un punto la mitad de grande en
* España. Se mide lo que ocupa cada lienzo y se convierte.
*/
/** Lo que mide el punto en pantalla, de radio. */
const PUNTO_PX = 7;
let anchoAmerica = $state(0);
let altoAmerica = $state(0);
let anchoPeninsula = $state(0);
let altoPeninsula = $state(0);
const radio = (anchoDelEncuadre: number, anchoEnPantalla: number) =>
anchoEnPantalla > 0 ? (PUNTO_PX * anchoDelEncuadre) / anchoEnPantalla : 0;
/**
* El radio del punto en unidades del encuadre, para que salga del mismo
* tamaño en los dos mapas.
*
* Hacen falta las dos medidas de la caja, no solo el ancho: el dibujo se
* ajusta al lado que primero se queda corto, y con `max-height` eso le pasa
* a América en una ventana baja. Ahí la caja seguía midiendo cuatrocientos
* treinta y cuatro píxeles de ancho pero el mapa se pintaba a 0,57 en vez de
* a 0,70, y el punto salía dos píxeles y medio más pequeño que el de España.
*/
function radio(encuadre: string, ancho: number, alto: number): number {
const [, , anchoDelEncuadre, altoDelEncuadre] = encuadre.split(' ').map(Number);
const escala = Math.min(ancho / anchoDelEncuadre, alto / altoDelEncuadre);
return escala > 0 ? PUNTO_PX / escala : 0;
}
const enAmerica = PAISES.filter((p) => !IBERIA.includes(p.codigo));
const enIberia = PAISES.filter((p) => IBERIA.includes(p.codigo));
/*
* Qué país tiene el puntero encima y cuál tiene el foco.
*
* Antes lo resolvía `:hover` a secas, pero el punto ya no vive dentro de su
* país —está en una capa aparte, encima de todas las tierras—, y desde ahí
* ningún selector alcanza al país que lo enciende. Se anota aquí.
*/
let bajoPuntero = $state('');
let conFoco = $state('');
const destacado = (codigo: string) =>
bajoPuntero === codigo || conFoco === codigo || paisElegido === codigo;
/** Lo que lee un lector de pantalla y lo que sale al pasar el ratón. */
function resumen(codigo: string): string {
const suyo = porPais[codigo];
@ -110,10 +128,23 @@
role="group"
aria-label="Géneros por país"
bind:clientWidth={anchoAmerica}
bind:clientHeight={altoAmerica}
>
<!--
Dos pasadas y no una: primero todas las tierras y luego todos los
puntos. En un SVG no hay `z-index`, se pinta en el orden en que está
escrito, así que con el punto dentro de su país el relleno del país
siguiente se le comía el borde.
-->
{#each enAmerica as p (p.codigo)}
{@render pais(p, radio(anchoDe(ENCUADRE), anchoAmerica))}
{@render pais(p, radio(ENCUADRE, anchoAmerica, altoAmerica))}
{/each}
<g class="chinchetas">
{#each enAmerica as p (p.codigo)}
{@render chincheta(p, radio(ENCUADRE, anchoAmerica, altoAmerica))}
{/each}
</g>
</svg>
<!--
@ -130,10 +161,17 @@
role="group"
aria-label="Géneros en la Península"
bind:clientWidth={anchoPeninsula}
bind:clientHeight={altoPeninsula}
>
{#each enIberia as p (p.codigo)}
{@render pais(p, radio(anchoDe(ENCUADRE_IBERIA), anchoPeninsula))}
{@render pais(p, radio(ENCUADRE_IBERIA, anchoPeninsula, altoPeninsula))}
{/each}
<g class="chinchetas">
{#each enIberia as p (p.codigo)}
{@render chincheta(p, radio(ENCUADRE_IBERIA, anchoPeninsula, altoPeninsula))}
{/each}
</g>
</svg>
</div>
@ -175,19 +213,23 @@
{@const suyo = porPais[p.codigo]}
{#if suyo}
<!--
El contorno pinta; el punto de encima es lo que se pulsa y lo que entra
en el orden de tabulación. Hacen falta los dos: Puerto Rico mide cuatro
píxeles y Cuba es tan alargada que apuntar a su centro es apuntar al mar.
El contorno pinta; el círculo del centro recoge el puntero. Hacen falta
los dos: Puerto Rico mide cuatro píxeles y Cuba es tan alargada que
apuntar a su centro es apuntar al mar. Ese círculo no se ve —el que se
ve va en la capa de arriba—, solo se puede pulsar.
-->
<g
class="pais"
class:cuna={suyo.cuna.length > 0}
class:elegido={paisElegido === p.codigo}
role="button"
tabindex="0"
aria-pressed={paisElegido === p.codigo}
aria-label={resumen(p.codigo)}
onclick={() => alElegir(p.codigo)}
onpointerenter={() => (bajoPuntero = p.codigo)}
onpointerleave={() => (bajoPuntero = bajoPuntero === p.codigo ? '' : bajoPuntero)}
onfocusin={() => (conFoco = p.codigo)}
onfocusout={() => (conFoco = conFoco === p.codigo ? '' : conFoco)}
onkeydown={(e) => {
if (e.key === 'Enter' || e.key === ' ') {
e.preventDefault();
@ -197,7 +239,7 @@
>
<title>{resumen(p.codigo)}</title>
<path class="tierra" d={p.d} />
<circle class="punto" cx={p.centro[0]} cy={p.centro[1]} {r} />
<circle class="golpe" cx={p.centro[0]} cy={p.centro[1]} {r} />
</g>
{:else}
<!--
@ -211,6 +253,24 @@
{/if}
{/snippet}
<!--
El punto que sí se ve. Va en la capa de arriba, después de la última tierra,
para que ningún país pueda pintarse encima. No recoge el puntero: eso lo hace
el país de debajo, y así el punto no roba el clic de su vecino.
-->
{#snippet chincheta(p: (typeof PAISES)[number], r: number)}
{#if porPais[p.codigo]}
<circle
class="punto"
class:visible={destacado(p.codigo)}
cx={p.centro[0]}
cy={p.centro[1]}
{r}
aria-hidden="true"
/>
{/if}
{/snippet}
<style>
/*
* El mapa y la lista se reparten la fila. La lista no es decoración: es cómo
@ -240,10 +300,17 @@
justify-items: center;
}
/*
* La Península, cuarenta píxeles a la izquierda de donde la deja la rejilla.
* Es un ajuste a ojo y por eso va en píxeles: el dibujo no llena su caja
* —Portugal deja aire a un lado y el Mediterráneo al otro—, así que centrado
* por rejilla se veía corrido a la derecha.
*/
.peninsula {
display: block;
width: 100%;
height: auto;
transform: translateX(-40px);
}
.listado {
@ -300,6 +367,14 @@
.conjunto {
grid-template-columns: minmax(0, 1fr);
}
/*
* Aquí la Península ocupa unos noventa píxeles de ancho: cuarenta a la
* izquierda la meterían encima de América.
*/
.peninsula {
transform: none;
}
}
/*
@ -353,18 +428,13 @@
}
/*
* Tres estados y no dos: donde nació algo pesa más que donde se adoptó, y
* esa diferencia es lo que el mapa cuenta mejor que una lista.
*
* En verdemar y no en dorado mezclado con el fondo, que daba un marrón
* sucio. El dorado se reserva para el país elegido: así el color del dato y
* el de la acción no son el mismo con dos brillos.
* Un solo color para todo país con géneros. Antes había dos —uno para donde
* nació algo y otro para donde se adoptó— y el resultado era que España,
* que solo adoptó el bolero, salía pintada de un verde distinto al de todos
* los demás. Esa diferencia se cuenta en la lista de al lado y al pulsar un
* país; en el mapa solo enturbiaba.
*/
.pais .tierra {
fill: var(--c-dato-tenue);
}
.pais.cuna .tierra {
fill: var(--c-dato);
}
@ -389,23 +459,35 @@
outline: none;
}
/* Solo se pulsa; lo que se ve es el punto de la capa de arriba. */
.golpe {
fill: transparent;
stroke: none;
}
/* La capa de los puntos no recoge el puntero: lo recoge el país de debajo. */
.chinchetas {
pointer-events: none;
}
/*
* El punto es dos cosas a la vez: el área de golpeo —Puerto Rico mide cuatro
* píxeles— y la señal de que ahí hay algo que abrir. Va en el mismo oro que
* los botones del sitio, con su degradado: es el color de lo que se pulsa.
* El punto solo se pinta cuando dice algo: al pasar por encima, al enfocar
* con el teclado y en el país elegido. Dorado siempre, un mapa de nueve
* chinchetas encima de los países que ya están pintados; el color del sitio
* es el de lo que se pulsa, no el de todo lo que existe.
*/
.punto {
fill: transparent;
stroke: none;
transition: opacity 0.15s var(--suave);
opacity: 0;
}
.punto.visible {
fill: url(#oro-del-mapa);
stroke: color-mix(in oklab, var(--c-accent-sombra) 70%, transparent);
stroke-width: 0.8;
vector-effect: non-scaling-stroke;
transition: opacity 0.15s var(--suave);
opacity: 0.9;
}
.pais:hover .punto,
.pais:focus-visible .punto,
.pais.elegido .punto {
opacity: 1;
}

@ -36,7 +36,7 @@ export const PAISES: PaisDelMapa[] = [
codigo: 'ES',
nombre: 'España',
centro: [1276.1, 346.3],
d: 'M 1244.1,328.1 c 0.1,-0.1 0.2,-0.2 0.2,-0.4 -0.9,0.1 -1,-0.7 -0.7,-1.4 0.4,-1.1 1.2,-0.8 1.8,-1.5 1.3,-1.4 4.1,-0.7 5.9,-1.5 -1.4,0.1 -0.5,-0.4 0,-0.6 -0.3,0.1 -0.6,0.2 -0.9,0.3 -0.2,-0.9 3,-3.4 3,-1.8 0.5,-0.3 1,-0.6 1.4,-0.9 0.1,1.1 4.3,0.6 4.3,2.4 1.3,-1.6 5,-0.4 6.8,-0.6 1.5,-0.2 1.9,-0.3 3.5,0.1 1.7,0.4 3.4,0.8 5.1,1.1 2.3,0.4 4.5,0.2 6.6,-0.3 1.4,-0.3 3,0 4.2,0.7 1.6,1 1.4,-0.4 2.9,-0.3 1.3,0.1 2.6,0.6 3.9,0.9 0.8,0.2 3.3,-0.7 3.7,-0.1 0.4,0.6 2.7,-0.1 2.3,1.3 -0.1,0.3 -0.5,0.7 -0.2,1 0.6,0.7 0.4,-0.1 1.1,0 2.1,0.1 4.8,2 5.6,2.4 0.4,0.2 0.9,-0.2 1.3,-0.1 0.5,0.2 0.9,1 1.4,0.9 1.4,-0.3 3.2,-0.2 4.9,0.2 -0.2,-0.6 0,-1.1 0.4,-1.5 0.9,0 1.5,0.1 3,1 1.3,0 2.5,0.5 2.2,2.6 1.7,-0.3 1.6,-1.5 1.8,-0.7 0.3,0.2 2.1,1.2 2.5,1.1 0.5,-0.2 1,-0.5 1.5,-0.3 1.1,0.4 2.2,0.8 3.1,0.1 0.7,-0.5 1.3,-0.5 2.9,-0.3 0.6,0.1 0.1,1.1 0.9,1 0,0.8 -0.5,0.5 -0.9,0.9 -0.6,0.5 0,1.8 0,2.5 -0.1,1.9 -4.1,3.2 -5.5,3.8 -1,0.4 -1.3,1.4 -2.1,1.8 -1,0.5 -2.4,0.5 -3.5,0.8 -2.7,0.7 -4.3,1.8 -6.4,3.3 1.7,1.3 0.1,1.6 -1,2.2 -1.7,1 -2,3.3 -3.6,4.3 -2.8,1.8 -3.8,6.9 -1.5,9.4 1.4,1.5 2.5,1.9 0.2,3.4 -1.3,0.8 -2.3,1.2 -3.4,2.4 -0.6,0.7 -1.2,1.8 -1.7,2.8 -0.3,0.6 -0.6,1.4 -0.6,2.1 0,0.6 1,1.4 0.4,0 0.9,1.5 -2.8,1.6 -3.5,1.7 -1.7,0.2 -4.1,1.8 -4.6,3.5 -0.4,1.5 -1.6,4.1 -3.2,2.8 -1,-0.8 -1.7,0.3 -2.5,0.6 -1.2,0.5 -2.4,-0.2 -3.6,0 -2.6,0.4 -5.1,0.1 -7.7,0.2 -1.4,0 -1.7,0.3 -2.7,1.2 -1.2,1.1 -2.7,0.6 -4,1.3 -0.7,0.3 -1.3,2.6 -1.9,2.5 -0.7,-0.1 -0.5,1.2 -1.7,1.1 -0.9,0 -1.6,-1.6 -2.5,-1.5 -1,0.1 -1.7,-1.9 -1.9,-2.6 1.3,-0.2 -0.3,-1.1 -0.7,-1.4 -0.9,-0.7 0.2,-1.9 1.1,-2.2 -0.5,-0.2 -0.8,0.1 -0.9,0.6 -0.5,-0.5 -4.3,-3.1 -3.5,-3.9 -1.3,-0.1 0,0.6 -1.4,0.6 -0.6,0 -1.4,0.3 -2,0 -0.9,-0.3 -0.9,-2.6 -0.7,-3.3 0.1,-0.6 0.6,-1.1 1.1,-1.6 0.5,-0.5 0.6,-1.4 1.1,-1.9 1.1,-1.1 1.5,-0.2 2.2,-1.9 -1.4,0.5 -2.5,-1.4 -2.5,-2.5 -0.1,-1.8 2,-2.7 2.5,-4.2 0.3,-0.9 -1.4,-2 -1.7,-2.8 -0.3,-0.6 0,-1 -0.5,-1.6 -0.4,-0.5 -0.9,-1 -1.2,-1.5 0.9,0.3 1.9,0.1 2.8,0.1 1,0 0.7,-0.6 1,-1.2 0.4,-0.7 1.3,-0.8 0.3,-3.1 -0.3,-0.7 1,-1 1.1,-1.1 0.7,-0.3 0.4,-1.2 0.4,-1.8 0,-0.4 0.2,-4.7 -0.4,-4.5 1,-0.2 1.5,-1.3 2.4,-1.9 0.6,-0.4 3,-2.4 2.7,-3 -0.3,-0.7 -2.2,-0.6 -2.3,-1 -0.1,-0.7 0.4,-2.5 -0.3,-1.9 -0.5,0.4 -3.9,-0.5 -3.9,0.1 -0.2,1.2 -2.1,0.8 -2.8,0.5 -1.1,-0.4 -2.2,0.1 -3.2,0.4 -2.1,0.8 -0.8,-1.4 0,-2 -0.6,0.1 -0.9,-0.3 -0.8,-0.9 -0.6,0.6 -1.5,0.6 -2.2,0.8 -1,0.2 -1.6,1 -2.4,1.4 -0.8,-2.1 1.5,-2.3 2,-3.9 -0.4,0.7 -1.1,0.9 -1.9,0.9 0.2,-0.8 0.9,-1.2 1.6,-1.5 -0.7,0.3 -1.6,0.4 -1.6,-0.6 0,-0.7 1.2,-1 1.3,-1.7 -0.6,0.6 -1.6,0.5 -2,1.4 -0.7,-1 0.4,-1.9 1.2,-2.4 -0.7,0.6 -1.7,0.8 -1.9,-0.4 M 1172.2,451.7 c -0.2,0.1 -0.4,0.3 -0.6,0.4 -0.1,-0.7 -1.4,-2.7 -0.1,-3 1.5,-0.3 1.3,1.8 0.7,2.6 M 1180,456.5 c -0.6,-1 -0.9,-2.2 -1.5,-3.2 2.2,-0.5 3.8,-1.2 5.9,-2 -0.7,1.6 -2.7,4.5 -4.4,5.2 M 1188,458.6 c -1.8,-0.3 -2.1,-3.1 -0.2,-3.6 2.8,-0.6 2,2.8 0.3,3.6 M 1197.4,455.9 c -0.2,-0.1 -0.4,-0.3 -0.6,-0.4 2.1,-0.7 2.4,-4 4,-5.4 1,-0.9 0.5,2.7 0.3,3.1 -0.7,1.7 -2.4,1.6 -3.6,2.8 M 1201.9,449.1 c -0.2,-0.1 -0.5,-0.2 -0.7,-0.3 0.3,-0.7 2.6,-3.7 3.2,-2.2 0.5,1.3 -1.8,1.8 -2.4,2.5 M 1315.8,362.7 c -1.4,-0.3 -0.9,-1.6 0.1,-2.1 0.5,-0.2 1.1,-0.3 1.5,0.1 0.7,0.6 -1.2,1.4 -1.5,2 M 1329.5,357.6 c -1.3,1.5 -1.2,0.8 -2.8,0.5 -1.7,-0.3 -0.6,-2.1 -2.5,-1.3 -1.7,0.8 -0.3,-1.4 0.2,-1.7 1.5,-1.1 3.1,-1.6 4.8,-2.2 -0.7,0.2 -1,1.1 -0.3,1.6 0.5,0.4 1.3,-0.1 1.8,0.3 0.7,0.5 -1.1,2.2 -1.1,2.8 M 1333.3,352.6 c 1.3,-1.2 3.5,-0.3 3.6,1.4 -0.9,0.1 -3.1,-0.6 -3.6,-1.4'
d: 'M 1244.1,328.1 c 0.1,-0.1 0.2,-0.2 0.2,-0.4 -0.9,0.1 -1,-0.7 -0.7,-1.4 0.4,-1.1 1.2,-0.8 1.8,-1.5 1.3,-1.4 4.1,-0.7 5.9,-1.5 -1.4,0.1 -0.5,-0.4 0,-0.6 -0.3,0.1 -0.6,0.2 -0.9,0.3 -0.2,-0.9 3,-3.4 3,-1.8 0.5,-0.3 1,-0.6 1.4,-0.9 0.1,1.1 4.3,0.6 4.3,2.4 1.3,-1.6 5,-0.4 6.8,-0.6 1.5,-0.2 1.9,-0.3 3.5,0.1 1.7,0.4 3.4,0.8 5.1,1.1 2.3,0.4 4.5,0.2 6.6,-0.3 1.4,-0.3 3,0 4.2,0.7 1.6,1 1.4,-0.4 2.9,-0.3 1.3,0.1 2.6,0.6 3.9,0.9 0.8,0.2 3.3,-0.7 3.7,-0.1 0.4,0.6 2.7,-0.1 2.3,1.3 -0.1,0.3 -0.5,0.7 -0.2,1 0.6,0.7 0.4,-0.1 1.1,0 2.1,0.1 4.8,2 5.6,2.4 0.4,0.2 0.9,-0.2 1.3,-0.1 0.5,0.2 0.9,1 1.4,0.9 1.4,-0.3 3.2,-0.2 4.9,0.2 -0.2,-0.6 0,-1.1 0.4,-1.5 0.9,0 1.5,0.1 3,1 1.3,0 2.5,0.5 2.2,2.6 1.7,-0.3 1.6,-1.5 1.8,-0.7 0.3,0.2 2.1,1.2 2.5,1.1 0.5,-0.2 1,-0.5 1.5,-0.3 1.1,0.4 2.2,0.8 3.1,0.1 0.7,-0.5 1.3,-0.5 2.9,-0.3 0.6,0.1 0.1,1.1 0.9,1 0,0.8 -0.5,0.5 -0.9,0.9 -0.6,0.5 0,1.8 0,2.5 -0.1,1.9 -4.1,3.2 -5.5,3.8 -1,0.4 -1.3,1.4 -2.1,1.8 -1,0.5 -2.4,0.5 -3.5,0.8 -2.7,0.7 -4.3,1.8 -6.4,3.3 1.7,1.3 0.1,1.6 -1,2.2 -1.7,1 -2,3.3 -3.6,4.3 -2.8,1.8 -3.8,6.9 -1.5,9.4 1.4,1.5 2.5,1.9 0.2,3.4 -1.3,0.8 -2.3,1.2 -3.4,2.4 -0.6,0.7 -1.2,1.8 -1.7,2.8 -0.3,0.6 -0.6,1.4 -0.6,2.1 0,0.6 1,1.4 0.4,0 0.9,1.5 -2.8,1.6 -3.5,1.7 -1.7,0.2 -4.1,1.8 -4.6,3.5 -0.4,1.5 -1.6,4.1 -3.2,2.8 -1,-0.8 -1.7,0.3 -2.5,0.6 -1.2,0.5 -2.4,-0.2 -3.6,0 -2.6,0.4 -5.1,0.1 -7.7,0.2 -1.4,0 -1.7,0.3 -2.7,1.2 -1.2,1.1 -2.7,0.6 -4,1.3 -0.7,0.3 -1.3,2.6 -1.9,2.5 -0.7,-0.1 -0.5,1.2 -1.7,1.1 -0.9,0 -1.6,-1.6 -2.5,-1.5 -1,0.1 -1.7,-1.9 -1.9,-2.6 1.3,-0.2 -0.3,-1.1 -0.7,-1.4 -0.9,-0.7 0.2,-1.9 1.1,-2.2 -0.5,-0.2 -0.8,0.1 -0.9,0.6 -0.5,-0.5 -4.3,-3.1 -3.5,-3.9 -1.3,-0.1 0,0.6 -1.4,0.6 -0.6,0 -1.4,0.3 -2,0 -0.9,-0.3 -0.9,-2.6 -0.7,-3.3 0.1,-0.6 0.6,-1.1 1.1,-1.6 0.5,-0.5 0.6,-1.4 1.1,-1.9 1.1,-1.1 1.5,-0.2 2.2,-1.9 -1.4,0.5 -2.5,-1.4 -2.5,-2.5 -0.1,-1.8 2,-2.7 2.5,-4.2 0.3,-0.9 -1.4,-2 -1.7,-2.8 -0.3,-0.6 0,-1 -0.5,-1.6 -0.4,-0.5 -0.9,-1 -1.2,-1.5 0.9,0.3 1.9,0.1 2.8,0.1 1,0 0.7,-0.6 1,-1.2 0.4,-0.7 1.3,-0.8 0.3,-3.1 -0.3,-0.7 1,-1 1.1,-1.1 0.7,-0.3 0.4,-1.2 0.4,-1.8 0,-0.4 0.2,-4.7 -0.4,-4.5 1,-0.2 1.5,-1.3 2.4,-1.9 0.6,-0.4 3,-2.4 2.7,-3 -0.3,-0.7 -2.2,-0.6 -2.3,-1 -0.1,-0.7 0.4,-2.5 -0.3,-1.9 -0.5,0.4 -3.9,-0.5 -3.9,0.1 -0.2,1.2 -2.1,0.8 -2.8,0.5 -1.1,-0.4 -2.2,0.1 -3.2,0.4 -2.1,0.8 -0.8,-1.4 0,-2 -0.6,0.1 -0.9,-0.3 -0.8,-0.9 -0.6,0.6 -1.5,0.6 -2.2,0.8 -1,0.2 -1.6,1 -2.4,1.4 -0.8,-2.1 1.5,-2.3 2,-3.9 -0.4,0.7 -1.1,0.9 -1.9,0.9 0.2,-0.8 0.9,-1.2 1.6,-1.5 -0.7,0.3 -1.6,0.4 -1.6,-0.6 0,-0.7 1.2,-1 1.3,-1.7 -0.6,0.6 -1.6,0.5 -2,1.4 -0.7,-1 0.4,-1.9 1.2,-2.4 -0.7,0.6 -1.7,0.8 -1.9,-0.4'
},
{
codigo: 'PT',

Loading…
Cancel
Save

Powered by TurnKey Linux.