fix(carousel): las flechas apuntaban hacia adentro en RTL

Reportado por el usuario mirando la demo. La POSICION de los triggers si se
espejaba —los insets del recipe son logicos— pero el GLIFO no: `chevronDir`
solo mira `orientation`, nunca la direccion. Resultado: prev acababa a la
derecha apuntando a la izquierda y next a la izquierda apuntando a la
derecha, las dos flechas al centro. Medido:

              LTR                    RTL (antes)
  prev    izq, apunta izq  ✓     der, apunta izq  ✗
  next    der, apunta der  ✓     izq, apunta der  ✗

`SvgChevron` escribe `transform: rotate()` INLINE, asi que ninguna regla lo
re-apunta sin `!important`. Se voltea con la propiedad independiente
`rotate`, que COMPONE con ese transform en vez de reemplazarlo — el mismo
motivo por el que el centrado de los triggers usa `translate` y no
`transform`, cosa que el propio recipe ya documentaba dos reglas mas arriba.

Se lee `[data-dir='rtl']`, el atributo PROPIO del componente que soma estampa
desde `resolvedDir` — no el `dir` del DOM, asi que no es el `[dir='rtl']`
prohibido. Ademas garantiza que el glifo coincida con la matematica del
arrastre y del teclado, que resuelven de esa misma fuente; con `:dir()`
podrian discrepar si DOM y prefs divergen. `eidos-lint carousel`: invalid 0,
y la regla sale clasificada morfo-backed.

Solo el eje inline: en vertical los chevrons son up/down y no giran.

Es lo que hace shadcn (`rtl:rotate-180`); nuxt/ui tuvo este bug exacto
(nuxt/ui#1354), donde ademas fallaban las posiciones y el signo de la
navegacion — aqui ambos ya estaban bien.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
alpha-0.1-dir-prefs
dev 2 months ago
parent 07515eedf5
commit a82e8ebb3e

@ -50,6 +50,15 @@ Fuentes:
`data-*` y estilos.
- `verticalBlockSize` es Eidos-only: el eje vertical necesita una altura
acotada para que el viewport pueda recortar, pero no cambia el contrato ARIA.
- **El glifo de los triggers se voltea en RTL desde el recipe, no desde el
markup.** `SvgChevron direction='left'` escribe un `transform: rotate()`
inline, asi que la vuelta se da con la propiedad independiente `rotate`, que
COMPONE con ese transform en vez de reemplazarlo (mismo motivo por el que el
centrado usa `translate`). La regla lee `[data-dir='rtl']` — el atributo
propio del componente, que Soma estampa desde `resolvedDir` — para que la
flecha coincida siempre con la matematica del arrastre y del teclado, que
resuelven de esa misma fuente. Solo aplica al eje inline: en vertical los
chevrons son up/down y no giran. Es lo que hace shadcn con `rtl:rotate-180`.
## Gaps

@ -232,6 +232,25 @@
inset-inline-end: var(--_carousel-trigger-offset);
}
/* The chevron GLYPH is physical: `<SvgChevron direction='left'>` writes an
inline `transform: rotate(90deg)`, so no rule could re-aim it without
`!important`. The trigger POSITIONS already mirror (the logical insets
above), so in RTL prev landed on the right still pointing left and next on
the left still pointing right — both arrows aiming INWARD. Flipping through
the `rotate` PROPERTY composes with that inline `transform` instead of
replacing it, the same reason the centring above uses `translate`. This is
what shadcn does with `rtl:rotate-180`.
`data-dir` is the component's OWN attr — soma stamps `resolvedDir`, so it
is always present and this is NOT the forbidden `[dir='rtl']`. Reading it
(rather than `:dir()`) also guarantees the glyph agrees with the drag and
keyboard maths, which resolve from that same `resolvedDir`. Scoped to the
inline axis: vertical chevrons point up/down and never flip. */
[data-carousel][data-orientation='horizontal'][data-dir='rtl'] [data-carousel-prev-trigger] svg,
[data-carousel][data-orientation='horizontal'][data-dir='rtl'] [data-carousel-next-trigger] svg {
rotate: 180deg;
}
[data-carousel-prev-trigger][data-disabled],
[data-carousel-next-trigger][data-disabled] {
opacity: var(--opacity-disabled);

Loading…
Cancel
Save

Powered by TurnKey Linux.