# Карта: Заметки Приложение «Заметки» (`/apps/notes/`) на forbion.f7cloud.ru. Структура кнопок/меню снята **из кода** (метод mail/078): апстрим `nextcloud/notes` **v5.0.0** (`src/**/*.vue` — точная версия с forbion, канон README) + мобильная тема forbion (`design-reference/forbion-theme/css/pages/pages-mobile/_mobile-notes.css`, `css/pages/app-notes/`). Живой мобильный web (Browser 1, `cloude`, mail/079) — только для визуальной сверки «как выглядит/порядок»; **строго read-only** (mail/073): ничего не создаётся/не меняется/не удаляется. Приватность: реальные заголовки/тексты заметок не фиксируются — только структура UI и дерево переходов. > Статус визуальной сверки на живом forbion (Browser 1 `c9284989`, `cloude`, mail/079, > техника same-origin iframe 390px): **выполнена частично, 2026-07-12.** Мобильная вёрстка > подтверждена (`header__mobile`, `header__mobile-bottom`). **Подтверждено на живом сервере:** > пустое состояние Welcome (тексты 1:1 с кодом), кнопка «Новая заметка», поле поиска, «Создайте > образец заметки с помощью Markdown», навигация «Все заметки» (со счётчиком) / капшен > «Категории» / «Новая категория», «Меню настроек» (модалка открывается, секция «Мобильные > приложения» — Android / iPhone and iPad). **НЕ наблюдаемо read-only:** список строк-заметок, > меню заметки (⋮), редактор (rich/plain/preview), диалог конфликта, детальные секции настроек > «Общее» — у `cloude` заметок НЕТ, а создание/открытие = запись (запрещено mail/073). Эти узлы > остаются из кода (v5.0.0) — помечены `код-only` ниже. NB: при первом входе поверх приложения > всплывает глобальный онбординг-попап «Добро пожаловать в F7cloud!» (не notes-специфичный, не > закрывал — dismiss может писать флаг на сервер). ## Компоненты-источники (nextcloud/notes v5.0.0) `App.vue` (шелл: навигация категорий + настройки) · `NotesView.vue` (список + поиск + «Новая заметка») · `NotesList.vue`/`NoteItem.vue` (строка заметки + меню действий) · `CategoriesList.vue` (навигация: Все заметки / Категории) · `Note.vue`→`NoteRich.vue` (rich-редактор @nextcloud/text) / `NotePlain.vue` (простой/preview) · `AppSettings.vue` (модалка настроек) · `Welcome.vue` (пустое состояние) · `ConflictSolution.vue` (конфликт версий) · `NoteShareSidebar.vue` (шаринг). ## Вход Шторка приложений (по «трём полоскам») → «Заметки», или прямой URL `/apps/notes/`. Оболочку (нижняя панель, шторка, бургер) описывает `shell.md` (зона лида) — здесь только специфика приложения. На мобильном (узкий вьюпорт) сначала показывается **список заметок**; выбор заметки открывает **редактор** поверх (`NcAppContent` show-details), возврат — «назад». ## Экран: Список заметок (главный) **Шапка списка (`content-list__search`) — ✔ кнопка и поле подтверждены на forbion:** - Кнопка «**Новая заметка**» (primary, иконка +) → создаёт заметку и открывает редактор (write — на forbion НЕ нажимаю). - Поле «**Искать заметки**» (`Search for notes`) → фильтрация списка по заголовку по мере ввода; крестик (trailing) очищает поиск. **Тело:** список строк-заметок, сгруппированный. Группировка (`NotesView` groupedNotes): - если выбраны «Все заметки» и настроен режим — по **временным слотам** (заголовки-капшены через `NotesCaption`: сегодня/недавние/… — таймслоты) и/или по **категориям**; - избранные сортируются выше (favorite → вверх), затем по дате изменения. **Строка заметки (`NoteItem` = `NcListItem`):** - Тап по строке → открыть заметку в редакторе. - Индикатор «расшарена» (значок ShareVariant, если у заметки есть шаринг). - Кнопка «**действия**» (⋮, меню строки) → см. «Меню заметки». **Пустое состояние (нет заметок / `Welcome.vue`) — ✔ подтверждено на forbion (`cloude`, route `/apps/notes/welcome`):** заголовок «Заметки» + «Начните писать заметку, нажав «Новая заметка».» + кнопка «**Новая заметка**»; подсказки: «Записывайте свои мысли, ни на что не отвлекаясь.», «Поддержка языка разметки Markdown для оформления текста;», кнопка «**Создайте образец заметки с помощью Markdown**» (`CreateSampleButton` — write, не нажимаю), «Поддержка категорий;». **Состояние загрузки:** «Загрузка …» (`Loading …`). **Пустой поиск в категории:** кнопка «**Найти во всех категориях**» (сбрасывает выбранную категорию). ## Меню заметки (⋮ в строке — `NoteItem` #actions) — `код-only` (У `cloude` заметок нет → строку и её меню на forbion read-only не наблюдал; из кода v5.0.0.) Порядок пунктов: - «**Добавить в избранное**» / «**Удалить из избранного**» (тумблер, звезда) → `PUT /favorite`. - «**Поделиться**» (Share) → открывает сайдбар шаринга (`NoteShareSidebar`, стандартный NC-шэринг). *(состав панели — общий NC sharing; детально не раскрывал — визуал(?))* - «**<Категория>**» / «**Изменить категорию**» → инлайн-выбор категории (мультиселект с возможностью ввести новую, taggable) → `PUT /category`. - «**Переименовать**» → инлайн-поле ввода нового заголовка → `PUT /title`. - —— разделитель —— - «**Удалить заметку**» (если не read-only) → удаление (`DELETE`) с возможностью отмены (`POST /notes/undo`). (write — не выполняю на forbion.) ## Экран: Редактор заметки — `код-only` (Открытие/создание заметки = запись → на forbion read-only не наблюдал; из кода v5.0.0.) Открывается тапом по заметке или «Новая заметка». Режим определяется настройкой Display (rich / plain / preview, см. Настройки). **Заголовок:** формируется автоматически из первой строки (autotitle, `PUT /autotitle`); пустая заметка → «Новая заметка». **Rich-режим (`NoteRich` → редактор @nextcloud/text):** - **Панель форматирования** (`.text-menubar` — в теме `_mobile-notes.css` она переносится на мобильном: `flex-wrap: wrap`). Инструменты (из списка горячих клавиш `AppSettings`): жирный, курсив, цитата, моноширинный, очистить стиль, список, нумерованный список, заголовок / крупный заголовок, вставить ссылку. *(точный набор иконок на узком экране — визуал(?))* - Тело — редактируемый markdown-контент; автосохранение (debounce) → `PUT /notes/{id}` с заголовком `If-Match: ""`. **Plain-режим (`NotePlain`) — меню действий редактора (`NcActions`):** - «**Просмотр**» / «**Правка**» (тумблер preview⇄edit, подсказка «CTRL + /»). - «**Полный экран**» / «**Выйти из полноэкранного режима**» (тумблер). - Плейсхолдер пустого тела: «Write …» (или «Empty note» в preview). **Read-only заметка:** пункт-индикатор «**Заметка только для чтения. Вы не можете её изменить.**» (`PencilOffOutline`), редактирование заблокировано. **Ошибка сохранения:** пункт «**Сохранение не удалось. Нажмите, чтобы повторить.**» (`onManualSave`) — ручной повтор `PUT`. ## Диалог: Конфликт версий (`ConflictSolution`) — `код-only` Возникает, если заметка изменена в другой сессии (сервер вернул конфликт на `If-Match`): - Текст: «Заметка была изменена в другой сессии. Выберите, какую версию сохранить.» - Кнопка «**Использовать версию с сервера**». - Кнопка «**Использовать текущую версию**». > Прямое подтверждение моего плана (mail/071 п.2): конфликт разрешается ЯВНЫМ выбором, а не > молчаливой перезаписью. Нативный `NoteEditorScreen` обязан воспроизвести этот диалог. ## Навигация: Категории (левая шторка — `App.vue` + `CategoriesList`) На мобильном — за «бургером»/шторкой навигации приложения (не нижняя панель оболочки). ✔ На forbion подтверждены: «Все заметки» (со счётчиком `0`), капшен «Категории», «Новая категория», кнопка «Меню настроек». Список конкретных категорий пуст (у `cloude` нет заметок). - «**Новая категория**» (`NcAppNavigationNew`, иконка папка+) → создание категории (drag-n-drop заметки на неё тоже вешает категорию). (write — не выполняю.) - «**Все заметки**» + счётчик (bubble) → сброс фильтра категории, весь список. - Капшен «**Категории**», далее список категорий: - «**Без категории**» (uncategorized) + счётчик. - Каждая категория: название (иконка папки, в теме заменена на серую `folder-gray.svg`) + счётчик; действия: «**Переименовать категорию**» (инлайн-правка), «**Удалить категорию**» → подтверждение (диалог «Удалить категорию» / «Удалить» / «Отмена»). (write — не выполняю.) - Подкатегории: имя вида `parent/child` разворачивается вложенно. - Внизу навигации: «**Настройки заметок**» (шестерёнка) → модалка настроек. ## Модалка: Настройки заметок (`AppSettings`) На мобильном тема раскрывает её на весь экран (`_mobile-notes.css`: modal-container height 100%, скрыт заголовок modal-header). ✔ На forbion открыл модалку read-only и подтвердил секцию «**Мобильные приложения**» (подписи «Android», «iPhone and iPad» = `HelpMobile.vue`). Секции «Общее»/«Комбинации клавиш» детально не раскрывал (`код-only`, из v5.0.0). Секции: - **Общее** (`General`): - «**Отображение**» (Display): «Форматированный текст» (rich) / «Простой текст» (plain) / «Просмотр» (preview). - «**Расширение файла**» (для новых заметок): «.md» / «.txt» / «Свой» (+ поле «Своё расширение файла»). - «**Файлы**» → «**Папка заметок**» (`NcFormBoxButton`) → выбор папки хранения заметок (WebDAV picker). (write-настройка — не меняю.) - **Мобильные приложения** (`Mobile apps`) — ссылки/подсказки на приложения (в теме секция клавиш-шорткатов и это скрыты частично — визуал(?)). - **Комбинации клавиш** (`Shortcuts`) — справочный список (см. панель форматирования выше). В теме forbion секция `keyboard-shortcuts` **скрыта** (`display:none`) — на forbion её, вероятно, не видно. `визуал(?)` ## API-контур (для нативного модуля — подтверждает mail/071) Базовый путь `apps/notes/api/v1` (в вебе — `apps/notes/...`): - `GET /notes?pruneBefore=` — список (инкрементальный синк по времени; в нашем клиенте — `exclude=content` для лёгкого списка + ETag-коллекция). - `GET /notes/{id}` — заметка; `POST /notes` — создать; `PUT /notes/{id}` (тело `content`, заголовок `If-Match: ""`) — сохранить; `DELETE /notes/{id}`; `POST /notes/undo`. - `PUT /notes/{id}/favorite`, `/category`, `/title`, `/autotitle`; `PATCH /notes/category` (переименовать), `DELETE /notes/category` (удалить категорию). - Поля модели: `id, title, category, content, favorite, modified, etag, readonly`. ## Расхождения с нативным клиентом Модуль `feature/notes` ещё **не создан** (скелет заводит лид по mail/071) — поэтому полный список расхождений = весь функционал выше как первичный бэклог. Ключевые пункты к паритету при реализации плана 1→2→3 (mail/071): - Список: поиск по заголовку, группировка (таймслоты + категории), сортировка «избранное вверх», индикатор шаринга, пустое/загрузочное состояния. - Меню заметки: избранное, категория (с созданием новой), переименование, удаление с undo, шаринг. - Редактор: rich (панель форматирования) ↔ plain ↔ preview, полноэкранный режим, автосейв с `If-Match`, автозаголовок, read-only состояние. - **Диалог конфликта версий** (обязателен — не молчаливая перезапись). - Категории: навигация «Все/Без категории/по категориям» со счётчиками, CRUD категорий, вложенность `parent/child`. - Настройки: режим отображения, расширение файла, папка заметок.