@import './fuentes.css'; /* * --------------------------------------------------------------------------- * DIRECCIÓN VISUAL * --------------------------------------------------------------------------- * Los colores de marca: azul marino oscuro aterciopelado y dorado. * * El marino lleva croma de verdad (0,04) en lugar de ser un gris azulado: eso * es lo que le da el aspecto de terciopelo en vez de el de pizarra. Todos los * fondos comparten el mismo tono, así que la profundidad la marca la claridad, * nunca un cambio de color. * * El dorado es el único acento y lo llevan las cosas accionables; nada más lo * usa, que es lo que hace que se note. * * Se compromete con un solo modo, sin variante clara: la portada es un fondo a * sangre con texto encima y esa composición no sobrevive a un fondo blanco sin * rehacerla entera. `color-scheme: dark` avisa al navegador para que sus * controles vayan a juego. * --------------------------------------------------------------------------- */ :root { color-scheme: dark; /* Marino, del más hondo al más cercano. Mismo tono, distinta claridad. */ --c-bg: oklch(0.16 0.042 264); --c-bg-raised: oklch(0.21 0.046 264); --c-bg-sunken: oklch(0.26 0.05 264); --c-border: oklch(0.33 0.045 264); /* Blancos apenas teñidos: por encima de 0,02 de croma dejarían de leerse como blancos y competirían con el dorado. */ --c-text: oklch(0.96 0.012 255); --c-text-muted: oklch(0.74 0.022 258); /* * El oro. El plano de antes tiraba a amarillo; este baja de claridad y sube * de croma, que es lo que separa un metal de un color de rotulador. */ --c-accent: oklch(0.8 0.145 84); --c-accent-text: oklch(0.16 0.042 264); /* * El dorado como superficie va aparte del dorado como texto, porque no * pueden ser el mismo valor: relleno necesita ser claro para que encima se * lea el marino, y escrito necesita ser oscuro para leerse sobre el fondo. * En el tema oscuro coinciden; en el claro no, y por eso existe la * distinción. */ --c-accent-superficie: oklch(0.8 0.145 84); /* Los dos extremos del reflejo: la luz que lo cruza y la sombra del canto. */ --c-accent-brillo: oklch(0.94 0.095 96); --c-accent-sombra: oklch(0.63 0.13 72); /* * El verdemar: el tercer color de la paleta, para datos. * * El mapa necesitaba dos intensidades de algo que no fuera el dorado, y * mezclarlo con el fondo marino daba barro —literalmente un marrón sucio—. * Este es de la misma familia que el marino, un paso hacia el verde, así que * conviven sin pelearse; y deja el dorado para lo que se pulsa y lo que se * elige, que es su trabajo en el resto del sitio. */ --c-dato: oklch(0.74 0.09 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); --c-focus: oklch(0.84 0.12 88); /* * Dos familias: una serif con carácter para los títulos y para la letra de * las canciones —que es texto para leer despacio— y una sans de rejilla * para interfaz, datos y navegación. */ --font-display: 'Newsreader', 'Iowan Old Style', Georgia, serif; --font-body: 'Archivo', ui-sans-serif, system-ui, sans-serif; --font-versos: var(--font-display); --font-mono: ui-monospace, 'SFMono-Regular', 'Cascadia Mono', Consolas, monospace; /* Escala amplia: el salto entre texto y titular es parte del carácter. */ --fs-xs: 0.75rem; --fs-sm: 0.875rem; --fs-base: 1rem; --fs-lg: 1.1875rem; --fs-xl: 1.5rem; --fs-2xl: 2.125rem; --fs-3xl: 3rem; --fs-4xl: clamp(3.25rem, 9vw, 6rem); --sp-1: 0.25rem; --sp-2: 0.5rem; --sp-3: 0.75rem; --sp-4: 1rem; --sp-5: 1.5rem; --sp-6: 2rem; --sp-7: 3rem; --sp-8: 5rem; /* * El oro de una superficie no es un color plano: un metal refleja, y lo que * lo hace parecer metal es la banda de luz que lo cruza. Cinco paradas —de * la sombra del canto al brillo y otra vez a la sombra— bastan para * sugerirlo sin que parezca un tubo de cromo. * * El fondo se pinta más alto que el elemento a propósito: así, al acercar el * puntero, se desplaza y la luz recorre la pieza en vez de limitarse a * aclararla. Es la diferencia entre algo que se ilumina y algo que gira. */ --oro: linear-gradient( 166deg, var(--c-accent-sombra) 0%, var(--c-accent-superficie) 24%, var(--c-accent-brillo) 46%, var(--c-accent-superficie) 64%, var(--c-accent-sombra) 100% ); /* * El mismo metal, pero para recortarlo sobre unas letras. * * El dorado hace dos trabajos y no puede ser el mismo valor en los dos: de * relleno tiene que ser claro para que encima se lea el marino, y escrito * tiene que ser hondo para leerse sobre el fondo. Sobre marino las cinco * paradas de `--oro` valen —la peor da 5,4 de contraste—, así que aquí es * literalmente el mismo. En claro no: ahí el brillo se queda en 1,26 y la * marca desaparece, y por eso el tema claro lo redefine. */ --oro-escrito: var(--oro); /* * Dos radios y no más, para que nada se vea de otra familia: * * - `--radius-boton` para lo que se pulsa o se escribe: botones, campos, * pastillas. * - `--radius-tarjeta` para las superficies: tarjetas, paneles, portadas. * * Un canto muy redondo tira a aplicación de móvil, y esto es una web de * letras: la esquina corta acompaña mejor a una serif. */ --radius-boton: 6px; /* * Los botones. Un solo tamaño y un solo relleno, porque antes convivían tres * —el dorado a 16px con relleno 8/16, el de al lado a 14px con 12/24— y dos * botones juntos con distinta letra se ven como un descuido. * * 15px es el mismo cuerpo del menú: lo pulsable se lee igual en todas * partes. */ --boton-texto: 0.9375rem; --boton-relleno: var(--sp-3) var(--sp-5); /* La versión reducida, para las esquinas de una tarjeta o una fila. */ --boton-texto-corto: 0.8125rem; --boton-relleno-corto: var(--sp-2) var(--sp-3); --radius-tarjeta: 8px; /* * Curvas del movimiento. `--sal` sale rápido y frena largo, que es como se * mueve algo que pesa; `--suave` es para lo que solo cambia de color o de * opacidad y no tiene inercia que fingir. Nada usa `ease`, que es la curva * por defecto y hace que todo se parezca. */ --sal: cubic-bezier(0.16, 1, 0.3, 1); --suave: cubic-bezier(0.4, 0, 0.2, 1); /* * El ancho útil: 1184px. Se probó a subirlo a 88rem (1408px) para aprovechar * los monitores anchos y salió al revés: la prosa tiene una medida de * lectura y no crece con el contenedor, así que lo único que se ensanchó * fue el hueco a su derecha. En la página legal se veía a la legua. * * Si algún día se ensancha, hay que dar antes a cada texto una columna que * crezca con él; sin eso, más ancho es más vacío. */ --container: 74rem; /* Alto de la barra del reproductor: lo usa el padding inferior del layout. */ --player-height: 88px; /* * Altura aproximada de la cabecera, que ahora es pegajosa. No la mide nadie: * es una referencia para separar de ella las anclas y las barras laterales * que también se quedan fijas. Si cambia el espaciado de la cabecera, este * número la sigue. */ --altura-cabecera: 4.75rem; } /* * La inversión clara, y SOLO cuando se pide. * * El marino es el modo por defecto se pida lo que se pida al sistema, y no es * un descuido: es la marca. Un sitio cuyo color forma parte de lo que cuenta no * puede salir en blanco porque el portátil de quien entra venga configurado * así; y al revés que en una herramienta de trabajo, aquí nadie va a pasar ocho * horas seguidas leyendo. Antes esto seguía a `prefers-color-scheme` y llevaba * a que media parte de las visitas viera una versión que no es la del sitio. * * El claro sigue entero y a un clic, en el botón de la cabecera, y la elección * se recuerda. Lo que se deja de hacer es decidirlo por nadie a partir de una * preferencia que se configuró pensando en otra cosa. * * Es una inversión de verdad, no un fondo blanco con lo mismo encima: el texto * pasa a ser el propio marino y los fondos, blancos apenas teñidos de él. Así * los dos modos son la misma marca vista de dos maneras. * * El dorado tiene que bajar de claridad aquí. El de 0,82 se lee bien sobre * marino y desaparece sobre blanco, así que este es un dorado más hondo, casi * bronce, que mantiene el contraste como texto. */ :root[data-tema='claro'] { color-scheme: light; --c-bg: oklch(0.98 0.008 264); --c-bg-raised: oklch(0.955 0.011 264); --c-bg-sunken: oklch(0.915 0.016 264); --c-border: oklch(0.86 0.02 264); --c-text: oklch(0.24 0.055 264); --c-text-muted: oklch(0.48 0.038 264); --c-accent: oklch(0.52 0.125 74); --c-accent-superficie: oklch(0.76 0.13 82); --c-accent-text: oklch(0.24 0.055 264); --c-accent-brillo: oklch(0.9 0.1 92); --c-accent-sombra: oklch(0.6 0.12 74); /* * El oro escrito, sobre papel. * * Aquí la banda va al revés que en el botón: el punto más claro es el propio * `--c-accent` y los extremos se oscurecen. Medido contra este fondo, el * acento da 5,29 de contraste y las tres paradas del oro de relleno dan * 1,26, 2,05 y 3,79 —las tres por debajo del mínimo—, así que un degradado * que subiera del acento dejaría el centro de las letras ilegible. * * Sigue pareciendo metal porque lo que hace el efecto es la banda que cruza, * no que llegue a brillar. */ --oro-escrito: linear-gradient( 166deg, color-mix(in oklab, var(--c-accent) 68%, black) 0%, color-mix(in oklab, var(--c-accent) 84%, black) 24%, var(--c-accent) 46%, color-mix(in oklab, var(--c-accent) 84%, black) 64%, color-mix(in oklab, var(--c-accent) 68%, black) 100% ); /* En claro se invierten: el dato pintado tiene que ser oscuro sobre papel. */ --c-dato: oklch(0.5 0.085 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); --c-focus: oklch(0.5 0.13 264); } *, *::before, *::after { box-sizing: border-box; } html { -webkit-text-size-adjust: 100%; /* * Sin esto, un enlace a un ancla dejaría su destino debajo de la cabecera * pegajosa. Vale para los saltos con teclado y para el enlace de saltar al * contenido, no solo para los `#` escritos a mano. */ scroll-padding-top: calc(var(--altura-cabecera) + var(--sp-4)); } body { margin: 0; background: var(--c-bg); color: var(--c-text); font-family: var(--font-body); font-size: var(--fs-base); line-height: 1.65; -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; } h1, h2, h3, h4 { font-family: var(--font-display); line-height: 1.1; margin: 0 0 var(--sp-3); font-weight: 400; letter-spacing: -0.015em; text-wrap: balance; } h1 { font-size: var(--fs-3xl); } h2 { font-size: var(--fs-2xl); } h3 { font-size: var(--fs-xl); } p { margin: 0 0 var(--sp-4); text-wrap: pretty; } a { color: inherit; text-underline-offset: 0.2em; transition: color 0.2s var(--suave); } /* * Todo enlace responde al puntero. Antes no había ninguna regla global, así que * los enlaces sin estilo propio —el del feed, los del pie— no daban ninguna * señal de ser pulsables. El dorado es el color de lo accionable en esta web, * así que es el que corresponde. * * Los componentes que ya deciden su propio color al pasar por encima ganan por * especificidad: esto es el suelo, no una imposición. */ a:hover { color: var(--c-accent); } @media (prefers-reduced-motion: reduce) { a { transition: none; } } img { max-width: 100%; height: auto; display: block; } ul, ol { margin: 0 0 var(--sp-4); padding-left: var(--sp-5); } button { font: inherit; color: inherit; } :where(a, button, input, textarea, select, [tabindex]):focus-visible { outline: 2px solid var(--c-focus); outline-offset: 2px; border-radius: 2px; } /* --- primitivas de layout ------------------------------------------------ */ .container { width: 100%; max-width: var(--container); margin-inline: auto; padding-inline: var(--sp-4); } .stack > * + * { margin-top: var(--sp-4); } .muted { color: var(--c-text-muted); } .eyebrow { font-size: var(--fs-xs); letter-spacing: 0.08em; text-transform: uppercase; color: var(--c-text-muted); margin: 0 0 var(--sp-2); } .visually-hidden { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; } .btn { display: inline-flex; align-items: center; gap: var(--sp-2); padding: var(--boton-relleno); border: 1px solid var(--c-border); border-radius: var(--radius-boton); /* * `background-color` y no el atajo `background`: el atajo reinicia también * `background-image`, así que una variante con degradado —el botón dorado— * lo perdía en cuanto esta regla o la de `:hover` se aplicaban, y se quedaba * en un rectángulo oscuro con el borde de oro. */ background-color: transparent; font-size: var(--boton-texto); letter-spacing: 0.01em; cursor: pointer; text-decoration: none; line-height: 1.2; transition: background-color 0.2s var(--suave), border-color 0.2s var(--suave); } /* * El botón secundario acusa el puntero con el fondo y el canto, no con el * color del texto: teñirlo de dorado además sería una señal doble, y encima * competiría con el botón dorado que suele tener al lado. El color se declara * aquí para ganarle a la regla general de los enlaces, ya que muchos de estos * botones lo son. */ .btn:hover { background-color: var(--c-bg-raised); border-color: var(--c-text-muted); color: inherit; } /* * El aspecto dorado, aparte del botón que lo estrenó. * * Lo lleva también el conmutador de vista de la página de música, que no es un * `.btn` —va dentro de una barra y no puede tener canto ni esquinas propias— * pero sí tiene que ser el mismo oro. Copiarlo era garantizar que un día uno de * los dos se quedara plano. */ .btn--primary, .oro { /* El color plano queda de reserva: si el degradado no se pintara, el botón sigue siendo dorado y legible, no transparente. */ background-color: var(--c-accent-superficie); background-image: var(--oro); background-size: 100% 240%; background-position: 0 22%; color: var(--c-accent-text); /* El filo de luz de arriba. Sin él, el degradado se ve pintado, no biselado. */ box-shadow: inset 0 1px 0 color-mix(in oklab, white 45%, transparent); transition: background-position 0.6s var(--sal), border-color 0.2s var(--suave); } /* El canto sí es del botón: dentro de una barra no hay borde que teñir. */ .btn--primary { border-color: var(--c-accent-sombra); } /* * Al acercar el puntero, la luz recorre la pieza. El color de fondo se repite * aquí porque `.btn:hover` lo cambia por el gris de los botones normales: sin * esto, un dorado que no llegara a pintar el degradado se vería oscuro. */ .btn--primary:hover, .oro:hover { background-color: var(--c-accent-superficie); background-position: 0 78%; border-color: var(--c-accent); /* * El color se repite aquí porque `.btn:hover` lo pone en `inherit` —para * que la regla general de los enlaces no tiña de dorado los secundarios— y * le gana por especificidad. Sin esta línea, el texto del botón dorado se * aclaraba al pasar el puntero y quedaba en 1,67 de contraste sobre el oro. */ color: var(--c-accent-text); } @media (prefers-reduced-motion: reduce) { .btn--primary, .oro { transition: none; } } /* --- etiquetas ----------------------------------------------------------- * * La pastilla de una etiqueta. Estaba repetida en cinco sitios con cinco copias * del mismo borde redondeado, y se escribe una vez. * * Va aquí y no en un componente porque a veces es un enlace —lleva a lo que * agrupa— y a veces es solo texto: dentro de una tarjeta que ya es clicable, * meter enlaces dentro de otro enlace deja una zona donde el clic hace una cosa * distinta según el píxel exacto. */ .chips { display: flex; flex-wrap: wrap; gap: var(--sp-2); list-style: none; margin: 0; padding: 0; } .chip { display: inline-block; padding: 0.2em 0.7em; border: 1px solid var(--c-border); border-radius: var(--radius-boton); font-size: var(--fs-xs); color: var(--c-text-muted); text-decoration: none; transition: border-color 0.3s var(--suave), color 0.3s var(--suave); } a.chip:hover, a.chip:focus-visible { border-color: var(--c-accent); color: var(--c-text); } @media (prefers-reduced-motion: reduce) { .chip { transition: none; } } /* --- tarjetas ------------------------------------------------------------ */ /* * El comportamiento de las tarjetas (aparición al entrar en pantalla y * respuesta al puntero) vive aquí y no en cada componente: son tres tipos de * tarjeta —estilo, álbum y canción— y tenían que moverse igual. Al ser CSS * global no hace falta pelearse con el ámbito de Svelte para los atributos que * escribe la acción `revelar` en tiempo de ejecución. * * Sobre el movimiento: nada usa `ease`, que es la curva por defecto y se nota * como tal —arranca y frena igual, y todo acaba pareciéndose—. Aquí se sale * rápido y se frena largo, que es como se mueve algo que pesa. */ .tarjeta { position: relative; display: flex; flex-direction: column; height: 100%; border: 1px solid var(--c-border); border-radius: var(--radius-tarjeta); background: var(--c-bg-raised); overflow: hidden; isolation: isolate; transition: transform 0.55s var(--sal), border-color 0.4s var(--suave), box-shadow 0.55s var(--sal); } /* * El reflejo. Nace donde está el puntero —lo escribe la acción `brillo` en * `--mx` y `--my`— y por eso no se lee como un efecto enlatado. Sin JavaScript * las variables no existen y cae arriba en el centro, que es un valor * razonable, no un fallo. */ .tarjeta::before { content: ''; position: absolute; inset: 0; z-index: 0; pointer-events: none; opacity: 0; background: radial-gradient( 20rem 20rem at var(--mx, 50%) var(--my, 0%), color-mix(in oklab, var(--c-accent) 20%, transparent), transparent 70% ); transition: opacity 0.45s var(--suave); } .tarjeta:hover::before, .tarjeta:focus-within::before { opacity: 1; } /* * Aparición al entrar en pantalla, para cualquier elemento con la acción * `revelar`. Vive aquí y no en cada componente por dos motivos: lo usan las * tarjetas y también las listas del taller, y sobre todo porque el atributo lo * escribe la acción en tiempo de ejecución, así que el compilador de Svelte no * lo ve en el marcado y podaría la regla como si no se usara. * * El estado oculto lo pone la acción, nunca el CSS por su cuenta: sin * JavaScript no hay atributo y todo se ve directamente. */ [data-revelar='oculto'] { opacity: 0; transform: translateY(18px) scale(0.985); } [data-revelar='visible'] { animation: revelarse 0.8s var(--sal) var(--retraso-revelado, 0ms) both; } @keyframes revelarse { from { opacity: 0; transform: translateY(18px) scale(0.985); filter: blur(6px); } to { opacity: 1; transform: none; filter: blur(0); } } /* * Al acercarse, la tarjeta sube y se le enciende el borde en dorado. La sombra * va en dos capas —una corta y densa, otra larga y difusa—: una sola sombra * grande se ve como una mancha, y en dos parece que hay algo debajo. */ .tarjeta:hover, .tarjeta:focus-within { transform: translateY(-6px); border-color: color-mix(in oklab, var(--c-accent) 55%, var(--c-border)); box-shadow: 0 2px 8px -4px rgb(0 0 0 / 0.5), 0 24px 48px -28px rgb(0 0 0 / 0.85); } /* Al pulsar, la tarjeta cede. Sin esto el clic no se siente en ninguna parte. */ .tarjeta:active { transform: translateY(-2px) scale(0.994); transition-duration: 0.12s; } .tarjeta__medio { position: relative; aspect-ratio: 1; overflow: hidden; background: var(--c-bg-sunken); } .tarjeta__medio--ancho { aspect-ratio: 16 / 10; } /* * En reposo la portada está un punto apagada y vuelve a su color al acercarse. * Es lo que hace destacar a la tarjeta señalada sin tener que atenuar el resto. */ .tarjeta__medio img { /* * En una variable por lo mismo que el desenfoque de la cabecera: escrito * directamente, el minificador deja `saturate(.85)brightness(.92)` sin el * espacio que separa las dos funciones, y eso no es CSS válido. */ --apagado: saturate(0.85) brightness(0.92); width: 100%; height: 100%; object-fit: cover; filter: var(--apagado); transform: scale(1.01); transition: transform 0.7s var(--sal), filter 0.5s var(--suave); } .tarjeta:hover .tarjeta__medio img, .tarjeta:focus-within .tarjeta__medio img { filter: none; transform: scale(1.06); } /* Sombra al pie de la portada, para que el cuerpo no arranque de golpe. */ .tarjeta__medio::after { content: ''; position: absolute; inset: auto 0 0; height: 45%; pointer-events: none; background: linear-gradient( to top, color-mix(in oklab, var(--c-bg) 70%, transparent), transparent ); opacity: 0.7; transition: opacity 0.45s var(--suave); } .tarjeta:hover .tarjeta__medio::after, .tarjeta:focus-within .tarjeta__medio::after { opacity: 1; } .tarjeta__cuerpo { position: relative; z-index: 1; display: flex; flex-direction: column; gap: var(--sp-2); flex: 1; padding: var(--sp-4); } /* * Hace clicable la tarjeta entera sin envolverla en un enlace, que dejaría los * botones dentro de él: ni sería HTML válido ni se podría usar con teclado. */ .tarjeta__enlace::after { content: ''; position: absolute; inset: 0; z-index: 1; } /* * El subrayado del título crece desde la izquierda en vez de aparecer entero. * Va con el fondo y no con un borde para poder animar el ancho sin que la línea * cambie de sitio ni empuje al texto. */ .tarjeta__enlace { background-image: linear-gradient(var(--c-accent), var(--c-accent)); background-repeat: no-repeat; background-position: 0 100%; background-size: 0 1px; transition: background-size 0.45s var(--sal), color 0.3s var(--suave); } .tarjeta:hover .tarjeta__enlace, .tarjeta:focus-within .tarjeta__enlace { color: var(--c-accent); background-size: 100% 1px; } /* Lo que va sobre la imagen (el botón de reproducir) y aparece al acercarse. */ .tarjeta__flotante { position: absolute; right: var(--sp-3); bottom: var(--sp-3); z-index: 2; opacity: 0; transform: translateY(10px) scale(0.7); transition: opacity 0.25s var(--suave), transform 0.5s var(--sal); } .tarjeta:hover .tarjeta__flotante, .tarjeta:focus-within .tarjeta__flotante { opacity: 1; transform: none; } /* * El botón de una tarjeta va a su propio tamaño, y no al de los botones de * página. Medía 48px sobre portadas de 280 —casi una quinta parte de la * imagen— y encima cambiaba de proporción según la tarjeta fuera cuadrada o * apaisada. Aquí es siempre el mismo, y sigue por encima del mínimo para * acertarle con el dedo. */ /* * El selector lleva `.tarjeta` delante a propósito: los estilos del botón * vienen de un componente y Svelte les añade su clase de ámbito, así que con * menos peso no se aplicarían. Y nada de `:global()`, que aquí no es sintaxis * válida —esto es CSS normal— y hace que se descarte la regla entera sin avisar. */ .tarjeta .tarjeta__flotante button { min-width: 2.25rem; min-height: 2.25rem; width: 2.25rem; height: 2.25rem; padding: 0; } /* * En pantallas táctiles no hay puntero que lo revele, y un botón invisible * pero pulsable es peor que ninguno: ahí se queda siempre a la vista. Sin * puntero tampoco hay reposo que apagar, así que la portada va a su color. */ @media (hover: none) { .tarjeta__flotante { opacity: 1; transform: none; } .tarjeta__medio img { filter: none; transform: none; } } /* Lo que se apoya sobre la tarjeta y tiene que quedar por encima del enlace. */ .tarjeta__encima { position: relative; z-index: 2; } @media (prefers-reduced-motion: reduce) { [data-revelar='visible'] { animation: none; } .tarjeta, .tarjeta::before, .tarjeta__medio img, .tarjeta__medio::after, .tarjeta__enlace, .tarjeta__flotante { transition: none; } .tarjeta:hover, .tarjeta:focus-within, .tarjeta:active, .tarjeta:hover .tarjeta__medio img, .tarjeta:focus-within .tarjeta__medio img { transform: none; } .tarjeta__flotante { opacity: 1; transform: none; } } /* --- términos del glosario ------------------------------------------------ * * El subrayado punteado es la convención de «esto tiene definición» desde * mucho antes que la web, y se distingue de un enlace de verdad: un enlace * lleva a otra página, esto abre un globo y te deja donde estabas. * * Va aquí y no en un componente porque el botón lo escribe el servidor dentro * del HTML del capítulo, donde el ámbito de Svelte no llega. */ .termino { border: 0; padding: 0; background: none; font: inherit; color: inherit; cursor: help; text-decoration: underline dotted; text-decoration-color: color-mix(in oklab, var(--c-accent) 60%, transparent); text-underline-offset: 0.2em; text-decoration-thickness: 1px; } .termino:hover, .termino:focus-visible { color: var(--c-accent); text-decoration-color: var(--c-accent); }