Перейти к основному содержимому

Добавление режима обучения в раздел UI

Инструкция для людей и агентов: как устроен существующий режим обучения и как делать такой же для других экранов (Аналитика, Рассылки, Таблицы и т.д.).

Эталон реализации: страница «Сценарии ботов»
client/components/editor/scenariy/learn/ + ScenariyPage.tsx + ScenariyPageHeader.tsx.

Смежный, но другой паттерн: короткий диалог без шагов на экране «нет проектов»
(NoProjectsScreen + TypewriterDialogue + no-projects-intro-storage).

Документ для пользователей: interface/learn-mode.


Когда нужен learn-режим​

Добавляй, если экран:

  • сложный для первого визита (много вкладок / фильтров / карточек);
  • критичен для онбординга (создание первого проекта, запуск бота, понимание метрик);
  • выигрывает от постепенного раскрытия UI вместе с текстом.

Не делай «обучение ради обучения»: 3–8 шагов, один смысл на шаг. Длинный FAQ — в docs/спойлеры, не в learn.


Рекомендуемая архитектура (копировать паттерн сценариев)​

Вынеси в папку раздела …/learn/:

ФайлНазначение
{section}-learn-steps.tsМассив шагов: id, title, text, флаги UI (visibleX, focusY, showZ)
{section}-learn-storage.tslocalStorage: dismissed / clear / isDismissed
use-{section}-learn.tsСостояние: active, stepIndex, lineReady, next/back/skip/restart
{Section}LearnPanel.tsxUI панели: бейдж, прогресс, TypewriterText, Назад/Далее/Пропустить
index.tsПубличный реэкспорт

Переиспользуй уже существующие:

  • TypewriterText / useTypewriter — client/components/editor/auth/
  • Стили панели как у ScenariyLearnPanel (primary/5, бейдж «Режим обучения»)

Ключ storage: botcraft:{section}-learn-dismissed (префикс botcraft: обязателен).


Правила шагов и копирайта​

  1. Один блок текста на шаг — без списка реплик внутри шага (для сценариев так и сделано).
  2. Текст простой, без жаргона редактора нод; можно назвать продукт (BotCraft), если это помогает ориентиру.
  3. Шаг говорит только про то, что уже видно или появляется на этом шаге.
  4. Не смешивай «Далее» с кликом по вкладке: вкладку переключает код шага (focusTab / аналог), пользователь жмёт только Далее.
  5. Последний шаг — конкретное действие («нажмите …»), кнопка «Я понял» = dismiss.
  6. Кнопка «Обучение» в шапке/тулбаре раздела — всегда доступна для restart.

Автостарт только при осмысленном гейте, например:

  • нет проектов → сценарии (isOnboarding);
  • первый визит раздела (свой storage-флаг);
  • не автостартовать гостю, пока сессия/данные грузятся (избегать мигания UI).

Чеклист внедрения в новый раздел​

  1. Шаги — описать 3–8 шагов и флаги видимости элементов экрана.
  2. Storage — dismissed / clear / isDismissed.
  3. Хук — active = manual \|\| (autoStart && !closed); goNext только после lineReady.
  4. Панель — TypewriterText с key={step.id}, disabled «Далее» до onDone.
  5. Страница раздела — при active прятать/показывать куски UI по флагам шага; useEffect на focus*.
  6. Шапка — кнопка «Обучение» → restart.
  7. Документация людей — обновить interface/learn-mode (таблица шагов / где доступно).
  8. Не трогать серверные API ради обучения: только клиент + localStorage.

Фронтенд-файлы держать короткими (ориентир AGENTS.md: ~100–150 строк на файл в client/).


Анти-паттерны​

  • Суммировать/показывать весь UI сразу, а текст «прокручивать» отдельно — теряется смысл раскрытия.
  • Автостарт при каждой загрузке без dismissed-флага.
  • Блокировать основной CTA раздела до конца обучения без Пропустить.
  • Дублировать TypewriterText своей реализацией печати.
  • Писать шаги в JSX страницы вместо отдельного *-learn-steps.ts.
  • Хранить прогресс на сервере без явной задачи продукта.

Кандидаты на следующий learn-режим​

Приоритет по пользе для новичка (не обязательный порядок реализации):

РазделЧто объяснить по шагам
Редактор (первый холст)сделано: client/components/editor/canvas/learn/. Разделы — editor-learn-sections.ts: новый раздел = файл шагов + запись в EDITOR_LEARN_SECTIONS; задание click + clickTarget ждёт нажатия кнопки
Вкладка «Бот»токен → запуск → статус
Аналитикаактивные / новички / вернувшиеся / период
Рассылкиаудитория → текст → запуск
Пользователи / диалогисписок ↔ переписка

Сначала UI и тексты шагов, потом полировка анимаций.


Связанный код (эталон)​

client/components/editor/scenariy/learn/
scenariy-learn-steps.ts
scenariy-learn-storage.ts
use-scenariy-learn.ts
ScenariyLearnPanel.tsx
index.ts
client/components/editor/scenariy/ScenariyPage.tsx
client/components/editor/scenariy/ScenariyPageHeader.tsx
client/components/editor/auth/TypewriterText.tsx
client/components/editor/no-projects/ # диалог без шагов