Atomico предоставляет гибкий подход к разработке компонентов в JavaScript с возможностью полноценной поддержки Right-to-Left (RTL) интерфейсов. RTL критически важен для приложений на языках с письмом справа налево, таких как арабский, иврит или персидский. В Atomico это реализуется через сочетание встроенных механизмов стилей, реактивного состояния и атрибутов DOM.
dir и
реактивностьHTML поддерживает атрибут dir, который может принимать
значения ltr (слева направо) и rtl (справа
налево). В Atomico это используется как:
import { c, useHost } from "atomico";
function MyComponent() {
const host = useHost();
host.dir = "rtl"; // установка направления текста
return <div>Пример текста справа налево</div>;
}
customElements.define("my-component", c(MyComponent));
Ключевые моменты:
useHost() возвращает объект элемента, позволяя напрямую
управлять его свойствами.dir автоматически влияет на вложенные элементы,
наследуя направление текста.dir позволяет динамически менять
направление без перерисовки всего компонента.Atomico поддерживает реактивные состояния через
useState. Это позволяет переключать интерфейс между
направлениями в реальном времени:
import { c, useState, useHost } from "atomico";
function ToggleDirection() {
const host = useHost();
const [rtl, setRtl] = useState(true);
host.dir = rtl ? "rtl" : "ltr";
return (
<button oncl ick={() => setRtl(!rtl)}>
Переключить направление
</button>
);
}
customElements.define("toggle-direction", c(ToggleDirection));
Особенности:
rtl автоматически меняет атрибут
dir у хоста.Для корректного отображения элементов важно учитывать направление при использовании CSS. В Atomico можно определять стили прямо в компоненте:
import { c, css } from "atomico";
const style = css`
:host([dir="rtl"]) {
text-align: right;
direction: rtl;
}
:host([dir="ltr"]) {
text-align: left;
direction: ltr;
}
.container {
padding-inline-start: 1rem; /* автоматически учитывает направление */
}
`;
export default style;
Основные моменты:
:host([dir="rtl"]) позволяет задавать специфические
стили для RTL без изменения структуры DOM.padding-inline-start и
margin-inline-end автоматически адаптируются к текущему
направлению.left и right делает
компоненты более универсальными.Atomico позволяет внедрять RTL-логику на уровне приложения через глобальные стили:
import { css, adoptStyles } from "atomico";
const globalStyle = css`
body[dir="rtl"] {
direction: rtl;
text-align: right;
}
`;
adoptStyles(globalStyle);
Особенности:
body.RTL влияет на порядок элементов и их визуальное представление. Atomico позволяет использовать CSS-переменные и реактивные состояния для корректного позиционирования:
import { c, useState } from "atomico";
function List({ items }) {
const [rtl, setRtl] = useState(true);
return (
<ul style={{ direction: rtl ? "rtl" : "ltr", display: "flex" }}>
{items.map(item => <li>{item}</li>)}
</ul>
);
}
direction.RTL влияет на обработку событий, таких как drag-and-drop или swipe. Atomico позволяет учитывать это при создании интерактивных компонентов:
function SwipeComponent() {
const handleSwipe = (event) => {
const host = event.target.closest("swipe-component");
const isRtl = host.dir === "rtl";
if (isRtl) {
console.log("Свайп влево для RTL");
} else {
console.log("Свайп влево для LTR");
}
};
return <div ontouchm ove={handleSwipe}>Элемент для свайпа</div>;
}
host.dir позволяет корректно интерпретировать
пользовательские действия.dir на уровне хоста компонента, а не на
каждом дочернем элементе.padding-inline и margin-inline
вместо фиксированных left/right.Эти механизмы обеспечивают полную поддержку RTL интерфейсов в Atomico, сохраняя реактивность, производительность и удобство стилизации компонентов.