Редактирование приоритетов
Порядок, названия, цвета, добавление и удаление. Открывается удержанием любой строки списка на главном экране.

Зачем этот экран
Список приоритетов — единственная структура, которую человек настраивает под себя. Отдельный экран нужен, чтобы на главной не было ни одной кнопки, которая не про «отметить»: там всё должно занимать два касания.
Порядок здесь имеет смысл. Он определяет порядок строк на главной и порядок цветов внутри столбиков в статистике.
Что на экране
- Счётчик в шапке — сколько приоритетов из десяти занято.
- Ручка слева — потяните, чтобы поменять порядок перетаскиванием.
- Цветной кружок и название — нажатие открывает редактор.
- Стрелки ↑ ↓ — тот же порядок, но по одному шагу. Крайние заблокированы.
- ✕ — удалить. Заблокирована, когда остался последний приоритет.
- «Добавить приоритет» — превращается в «Максимум 10 приоритетов» на пределе.
- Архив — удалённые приоритеты, если они есть.
- «Готово» внизу — вернуться на главную.
Как этим пользоваться
Переставить местами
Потяните за ручку слева и отпустите на новом месте. Если тянуть неудобно — стрелки ↑ ↓ делают то же самое по одному шагу.
Переименовать или перекрасить

Нажмите на строку. Название — до 24 знаков, палитра — шестнадцать неоновых цветов двумя рядами (больше, чем максимум приоритетов, так что цвета всегда хватает с запасом).
Добавить приоритет

Здесь только название: цвет назначается сам — первый свободный из палитры. Выбирать его в момент создания незачем, а перекрасить можно потом.
Если название совпадает с приоритетом из архива, приоритет воскресает вместе со всей своей историей. Регистр и пробелы по краям при сравнении не учитываются.
Удалить приоритет

Удаление спросит подтверждение и не сотрёт время: приоритет уедет в архив, а его часы останутся видны в статистике с пометкой «архив». Иначе прошлые недели теряли бы подписи и переставали сходиться.
Пределы и предупреждения
От 1 до 10 приоритетов. На пределе меняется текст кнопки, а не только её доступность.

В архиве хранятся последние 40 приоритетов.
Название — до 24 знаков. Пустое имя при сохранении откатывается к прежнему.
Перетаскивание рассчитано на строки одинаковой высоты; вертикальные свайпы Telegram отключены специально, чтобы не отбирать жест.
Первое перетаскивание выдаёт достижение
r7, первая смена цвета —r6.
Чего здесь нельзя
- Удалить последний приоритет. Приложению нужно хотя бы одно направление.
- Стереть архив вручную. Он подрезается сам до сорока записей.
- Задать свой цвет. Только шестнадцать из палитры: неон держится на чёрном не любой, а подобранный.
- Слить два приоритета в один. Переименование не переносит историю: часы остаются у идентификатора, а не у названия.
Рядом
Приоритеты · Наборы · Пределы и лимиты
Как это работает внутри
- Экран —
src/screens/EditPrioritiesScreen.tsx; там же локальныеPriorityEditor,AddPriorityи общая для нихPriorityForm. - Перетаскивание — свой хук
src/components/useReorder.tsна Pointer Events, без библиотек. Он предполагает одинаковую высоту строк: индекс считается делением смещения на высоту первой строки. - Удаление вызывает
deletePriority, которая переносит в архив, а не удаляет, и отказывается опускать список нижеMIN_PRIORITIES. - Воскрешение из архива — в
addPriority: совпадение по названию без учёта регистра и пробелов возвращает прежний идентификатор, а с ним и историю. - История адресуется короткими устойчивыми идентификаторами, а не позициями в списке (
src/store/legacy/persistence.ts): позиционные массивы означали бы, что добавление приоритета задним числом переписывает прошлое. - Цвет нового приоритета выбирает
nextFreeColorIdизsrc/domain/palette.ts. MAX_PRIORITIES = 10,MIN_PRIORITIES = 1,MAX_ARCHIVED = 40.