/* eslint-disable */ /* global React, ReactDOM, TweaksPanel, useTweaks, TweakSection, TweakRadio */ const { useEffect } = React; // ============== DATA ============== const BENEFITS = [ { t: "Общаться без барьеров", b: "С любым человеком на планете — на английском, французском или китайском. Без «э-э-э» и без Google Translate.", span: 2 }, { t: "Уверенность везде", b: "В путешествиях, на работе, в учёбе. От заказа кофе до презентации на иностранном.", span: 2 }, { t: "Сдать экзамен", b: "Cambridge (KET/PET/FCE/CAE до C2), DELF до B2, HSK 1–3 и ЕГЭ по английскому. Разбираем формат и тренируем каждую часть.", span: 2 }, { t: "Игровой формат", b: "Интерактивные квесты и мини-викторины под твои интересы — не скучные диалоги из учебника.", span: 3 }, { t: "Свой темп", b: "Гибкий график, занятия 45 или 60 минут, удобная платформа ProgressMe.", span: 3 }, ]; const APPROACH = [ { n: "01", h: "Персональная программа", p: "Уроки под твои цели, уровень и интересы — сериалы, работа, путешествия, экзамен. Один учебник на всех — не мой подход." }, { n: "02", h: "Платформа ProgressMe", p: "Личный кабинет, история уроков, домашние задания и доступ к коллекции интерактивных игр — всё в одном месте." }, { n: "03", h: "Авторские квесты", p: "Создаю уроки-игры под конкретные темы: от детектива на английском до виртуальной поездки в Париж. Учиться так — правда весело." }, { n: "04", h: "Честный прогресс", p: "Раз в несколько недель сверяемся: что получается, что пока нет. Корректируем план, празднуем победы." }, ]; const REVIEWS = [ { q: "За пару месяцев с Таней разговорилась настолько, что обсуждаю сериалы и работу без подсказок. Английский стал частью кофе-брейка — жду урок, как новую серию любимого шоу.", n: "Мария Мамонова", r: "Консультант, блогер", img: "img/review1.jpeg", init: "ММ" }, { q: "Всегда хотела болтать по-английски без запинок — и наконец нашла своего учителя. Уроки пролетают, будто дружеский созвон, а знания оседают крепко.", n: "Виолетта Кондратюк", r: "Студентка", img: "img/review2.jpeg", init: "ВК" }, { q: "Думал, в аэропорту потеряюсь в трёх вывесках. За пару месяцев Таня превратила страх в «Hello, can you help me…?». Прошёл контроль, заказал такси, поболтал с баристой — всё без переводчика.", n: "Александр Воронцов", r: "Юрист", img: "img/review3.jpg", init: "АВ" }, { q: "Учимся год. Перешла от «э-э-э» к свободным диалогам на митингах. Атмосфера дружеская, задания чёткие, прогресс измеримый. Нужно быстро вывести язык в поле — Татьяна тот самый вариант.", n: "Марианна Никитушина", r: "Предприниматель", img: "img/review4.jpeg", init: "МН" }, ]; const TIERS = [ { kicker: "Стандарт", title: "45 минут", price: "1 500", unit: "₽", note: "за урок", feat: false, inc: ["Персональная программа под уровень и цели", "Личный кабинет в ProgressMe", "Доступ к коллекции интерактивных игр", "Интерактивная художественная книга"] }, { kicker: "Полный формат", title: "60 минут", price: "1 700", unit: "₽", note: "за урок", feat: true, badge: "Рекомендую", inc: ["Всё из стандартного тарифа", "Расширенная практика разговора", "Модули на Quizlet", "Больше времени на разбор материала"] }, ]; // ============== UI ============== function Arrow({ s = 14 }) { return ; } function Nav() { return (
SMAGLO Trial · free
); } function Hero() { return (
System online · индивидуальные онлайн-занятия EN · FR · ZH · v2026

Английский, французский, китайский — под твою цель.

Привет! Меня зовут Татьяна. Помогаю взрослым и подросткам заговорить на английском, французском или китайском — от нулевого уровня до Cambridge C2, DELF и HSK3.

Записаться бесплатно Как я учу
Татьяна Смагло
LIVE · ONLINE
Tatiana Smaglo
репетитор · переводчик
ID / 001
15+
Лет с языками
C2
Cambridge CAE
3
Языка · EN·FR·ZH
{[0,1].map(k => ( Hello English Bonjour Français 你好 中文 Cambridge · DELF · HSK ))}
); } function SectionHead({ id, title, aside }) { return (
SEC / {id}

{aside}

); } function About() { return (

Моя цель — чтобы ты не «учил язык», а начал на нём жить.

На занятиях мы говорим, играем, спорим, разбираем тексты, которые тебе правда интересны. Грамматика — только та, что нужна здесь и сейчас; лексика — под твой контекст, а не «темы про хобби и погоду из учебника».

Готовлю с нуля и до продвинутого уровня, вывожу в разговор, а если нужно — доводим до сертификата. Делать это в своём темпе и в удобное время — нормально.

CambridgeC2 · CAEСертификат продвинутого уровня английского
DELFB2Сертификат по французскому языку
ОбразованиеУниверситет Бордо-Монтень (Франция), «Филология»
Готовлю кCambridge (KET, PET, FCE, CAE), DELF, HSK 1–3, ЕГЭ по английскому
ФорматИндивидуальные онлайн-занятия на ProgressMe
); } function Benefits() { return (
— 01

Общаться без барьеров.

С любым человеком на планете — на английском, французском или китайском. Без «э-э-э» и без Google Translate.

progressme · live-session
T: How was your weekend?
S: I went hiking with friends!
T: Nice! Tell me more...
· live · 45 min
— 02

Уверенность везде

В путешествиях, работе, учёбе. От заказа кофе до презентации на иностранном.

— 03

Сдать экзамен

Cambridge (KET/PET/FCE/CAE до C2), DELF до B2, HSK 1–3 и ЕГЭ по английскому.

— 04

Игровой формат

Интерактивные квесты и мини-викторины под твои интересы. Не диалоги из учебника.

— 05

Свой темп.

Гибкий график, занятия 45 или 60 минут, удобная платформа ProgressMe.

— 06

Измеримый прогресс.

Понятные цели, честная обратная связь. Никакой воды и зубрёжки «на всякий случай».

); } function Approach() { return (
{APPROACH.map(a => (
{a.n}
{a.h}
{a.p}
))}
); } function Quiz() { return (

Проверь свой словарный запас за 2 минуты.

Мини-викторина на английском, французском и китайском. Выбери язык и уровень — и узнай, где ты сейчас. Бесплатно, без регистрации.

Пройти викторину
LEVEL · A203 / 10
umbrella
чемодан
зонт
облако
гора
); } function Reviews() { return (
{REVIEWS.map((r, i) => (
{r.q}
{r.init}
{r.n}
{r.r}
))}
); } function Pricing() { return (
{TIERS.map((t, i) => (
{t.badge &&
{t.badge}
}
{t.kicker}

Занятие · {t.title}

{t.price}{t.unit}
{t.note}
    {t.inc.map((x, j) =>
  • {x}
  • )}
Записаться
))}
); } function Final() { return (

Заговорим вместе?

Первый урок — бесплатный. Напиши мне в Телеграм, и мы договоримся о времени, которое подойдёт именно тебе.

Написать в Телеграм
); } function Foot() { return ( ); } function Tweaks() { const [t, set] = useTweaks({ palette: "neon", mode: "dark" }); useEffect(() => { if (t.palette && t.palette !== "neon") document.documentElement.setAttribute("data-palette", t.palette); else document.documentElement.removeAttribute("data-palette"); if (t.mode === "light") document.documentElement.setAttribute("data-mode", "light"); else document.documentElement.removeAttribute("data-mode"); }, [t.palette, t.mode]); return ( set({ palette: v })} options={[ { value: "neon", label: "Neon (пинк/циан)" }, { value: "cyber", label: "Cyber (зелёный/пинк)" }, { value: "sunset", label: "Sunset (оранж/жёлтый)" }, { value: "ice", label: "Ice (бирюза/лаванда)" }, { value: "mono", label: "Mono (ч/б)" }, ]} /> set({ mode: v })} options={[ { value: "dark", label: "Тёмный" }, { value: "light", label: "Светлый" }, ]} /> ); } function App() { useEffect(() => { const els = document.querySelectorAll(".section, .hero, .quiz, .review, .tier, .card, .step"); const io = new IntersectionObserver(entries => { entries.forEach(e => { if (e.isIntersecting) { e.target.classList.add("in"); io.unobserve(e.target); } }); }, { threshold: 0.05 }); els.forEach(el => { el.classList.add("reveal"); io.observe(el); }); // Subtle motion trail — only appears when actually moving const trailLayer = document.getElementById("cursorTrail"); let lastX = 0, lastY = 0, lastT = 0; const onMove = (e) => { const now = performance.now(); const dx = e.clientX - lastX, dy = e.clientY - lastY; const dist = Math.hypot(dx, dy); if (now - lastT < 28 || dist < 14) return; lastX = e.clientX; lastY = e.clientY; lastT = now; if (!trailLayer) return; const p = document.createElement("span"); p.className = "trail-dot"; p.style.left = e.clientX + "px"; p.style.top = e.clientY + "px"; trailLayer.appendChild(p); setTimeout(() => p.remove(), 900); }; window.addEventListener("mousemove", onMove); return () => { window.removeEventListener("mousemove", onMove); }; }, []); return ( <>