# Карта: Календарь Приложение «Календарь» (`/apps/calendar/`) на forbion.f7cloud.ru. Структура кнопок/меню снята **из кода** (метод mail/078): апстрим `nextcloud/calendar` **v6.4.0** (`src/**/*.vue` — точная версия с forbion, канон README) + мобильная тема forbion (`design-reference/forbion-theme/css/pages/pages-mobile/_mobile-calendar.css`, `css/pages/app-calendar/`). Живой мобильный web (Browser 1, `cloude`, mail/079) — только для визуальной сверки «как выглядит/порядок»; **строго read-only** (mail/073): ничего не создаётся/не меняется/не удаляется, приглашения не отправляются, free/busy-запросы не шлются. Приватность: реальные названия/участники событий не фиксируются — только структура UI. > Статус визуальной сверки на живом forbion: **ПРОЙДЕНА** 2026-07-12 (Browser 1 `c9284989`, > сессия `cloude` подтверждена `OC.getCurrentUser().uid`, мобильная вёрстка снята same-origin > iframe 390px — окно общее не трогал, [[f7-mobile-web-iframe-technique]]; строго read-only, > ничего не сохранял). Реальные русские ярлыки сверены с деревом из кода, порядок полей окна > события подтверждён. Сверка вскрыла разделы, которых в коде-выборке не было видно — внесены > ниже (Appointments, незапланированные задачи, Deck-источник). Оставшиеся `визуал(?)` — > условные состояния (корзина видна только при наличии удалённых, реальных событий у `cloude` нет). > **F7-форк**: окно события на forbion кастомизировано (тема адресует `.f7-calendar-event-view`, > `.f7-invitee-status-row`, `.f7-location-talk-row`, `.property-add-talk`) — набор кнопок тот же, > что в апстрим-компонентах `Editor/*`, отличается вёрстка/порядок (предмет попиксельной сверки). ## Компоненты-источники (nextcloud/calendar v6.4.0) `views/Calendar.vue` (шелл: навигация + сетка) · `components/CalendarGrid.vue` (сетка) · `AppNavigation/AppNavigationHeader.vue` (шапка: навигация периодов, «Создать», переключатель вида) · `AppNavigation/CalendarList/*` (список календарей, действия, корзина) · `AppNavigation/EditCalendarModal.vue` + `EditCalendarModal/ShareItem.vue` (правка/шаринг календаря) · `AppNavigation/Settings.vue` (настройки) · `views/EditSimple.vue`/`EditFull.vue` (окно события) · `Editor/Properties/*` (поля) · `Editor/Repeat/*` (повторение) · `Editor/Alarm/*` (напоминания) · `Editor/Invitees/*` + `InvitationResponseButtons.vue` (участники/ответы) · `Editor/Attachments/*` (вложения) · `Editor/AddTalkModal.vue` (беседа Talk) · `Editor/FreeBusy/*` (занятость). ## Вход Нижняя плавающая панель / шторка приложений (по «трём полоскам») → «Календарь», или прямой URL `/apps/calendar/`. Оболочку описывает `shell.md` (зона лида) — здесь только специфика приложения. ## Экран: Календарь (главный, сетка) **Шапка (`AppNavigationHeader`, реальные ярлыки мобильной версии сверены):** - «**Открыть навигацию**» (бургер) → сайдбар календарей (см. ниже). - «**Предыдущий месяц**» / «**Следующий месяц**» → сдвиг периода (aria-label зависит от вида: «…месяц»/«…неделя»/«…день»). - «**Сегодня**» → текущая дата. - «**Создать событие**» → окно события (см. «Экран: Событие»); write — на forbion не сохраняю. - «**Действия**» → меню переключения вида: «**День**», «**Неделя**», «**Месяц**», «**Год**», «**Список**» (сверено на живом — все 5 пунктов). - `отличие от десктопа:` в мобильной версии переключатель вида спрятан в дропдаун «Действия», а НЕ вынесен видимым тумблером. - `расхождение (натив):` в клиенте есть только День/Неделя/Месяц; «Год» и «Список» отсутствуют. **Тело:** сетка календаря. На мобильном (узкий вьюпорт) модель компактная — месяц сверху + список событий выбранного дня снизу. **Действия в теле:** - Тап по ячейке дня → выбор дня (список событий этого дня внизу). - Тап по пилюле события → открыть событие (просмотр/редактор). - «**Показать незапланированные задачи**» (сверено на живом) → шит/панель «Незапланированные задачи» (VTODO без даты из календарей с задачами); «×» закрыть. `расхождение (натив):` панели незапланированных задач в клиенте нет. ## Экран: Навигация календарей (сайдбар / бургер) Открытие: кнопка «**Открыть навигацию**» в шапке. **Тело (сверено на живом):** «**Мои календари**» (+ «Добавить новое»), список календарей, раздел «**Предложенные встречи**» / «**Расписание встреч**» (Appointments), внизу — «**Параметры календаря**» (+ Корзина при наличии удалённых). **Календари в списке `cloude` (пример состава):** «Личное», «Дни рождения контакта», «Карточки» (интеграция Deck — доски как источник событий). `визуал(?)`: набор зависит от аккаунта. **Строка календаря:** - Чекбокс видимости → включить/выключить показ календаря. - Название + счётчик. - «**⋯**» (действия) → меню: - «**Изменить**» / «**Изменить и поделиться**» → модалка правки календаря (ниже). write. - «**Копировать публичную ссылку**» / «**Копировать ссылку подписки**». - «**Экспорт**» → скачивание `.ics`. - «**Удалить**» → подтверждение. write. **Действия списка:** - «**+ Добавить новый**» → меню: - «**Новый календарь**» / «**Новый календарь со списком задач**». write. - «**Новая подписка по ссылке (только чтение)**». write. - «**Добавить календарь праздников**» / «**Добавить произвольный публичный календарь**». write. ### Подэкран: Корзина **Тело:** список удалённых календарей/событий. **Действия:** «**Восстановить**» (write) · «**Удалить навсегда**» (write) · «**Очистить корзину**» → подтверждение «Действительно очистить корзину?» (write). ### Подэкран: Изменить календарь (модалка `EditCalendarModal`) **Тело/действия:** - «**Имя календаря**» + выбор цвета. write. - «**Поделиться календарём**» → поиск «Share with users or groups» → строка получателя: право «может редактировать и видеть конфиденциальные события», снять доступ. write. - «**Напоминания по умолчанию**» для полнодневных/частичных событий этого календаря. - «**Не показывать меня занятым**» (сделать календарь прозрачным). - «**Экспорт**» · «**Удалить**» (write) · «**Убрать у меня**» (для расшаренных, write). ### Подэкран: Настройки (`Settings.vue`) **Тело (тумблеры/пункты):** «Номера недель», «Выходные», «Задачи в календаре», «Плотность в День/Неделя», «Лимит событий в Месяце», «Простой редактор событий» («"Подробнее" открывает детальный редактор»), «Календарь дней рождения», «Напоминание по умолчанию» (полнодневные/ частичные), «Календарь по умолчанию для входящих приглашений», «Настройки доступности» (write), «Импорт календарей» (write). - Блок «**CalDAV**»: «CalDAV URL», «Адрес сервера для iOS и macOS» — информационные (копирование). ### Подэкран: Расписания встреч / Appointments (`views/Appointments`, `AppointmentConfigList`) Раздел сайдбара «**Предложенные встречи**» / «**Расписание встреч**» (сверено на живом — у `cloude` пусто: «Нет активных предложенных встреч»). **Действия:** - «**Создать расписание встреч**» (`Create appointment schedule`) → модалка настройки (`AppointmentConfigModal`): имя, описание, местоположение, длительность, «Календарь бронирования», «Календари для проверки конфликтов», буферы до/после, макс. слотов в день, ограничение горизонта бронирования, «Создать комнату Talk». write. - Готовое расписание → публичная страница бронирования (внешний гость: выбор слота → «Подтвердить»). - `расхождение (натив):` функционала «Appointments»/страниц бронирования в клиенте нет. ## Экран: Событие (окно, `EditSimple`/`EditFull`, форк `.f7-calendar-event-view`) > Сверено на живом (mail/079): «Создать событие» открывает СРАЗУ полный редактор > (`/new/full/…`, F7-форк по умолчанию полный, не simple). Порядок и русские ярлыки полей > подтверждены: Название → С/По (дата+время нативными пикерами) → «Добавить местоположение» → > «Добавьте описание» → «Добавить напоминание» → «Поиск и добавление категорий» → > «Поиск и добавление участников (email/пользователи/контакты/группы/команды)». Открытие: пилюля события или «Создать событие». Переключение простой↔полный: «**Подробнее**». **Шапка:** - «**×**» (Закрыть) → при несохранённых правках диалог «Отменить изменения?» («Точно отменить изменения этого события?»). - «**✓ Сохранить**» (write). У повторяющегося события → выбор «Обновить это повторение» / «Обновить это и все будущие» (write). - «**⋯**» (действия) → меню: «Дублировать» (write), «Экспорт», «Удалить» (write); у серии — «Удалить это повторение» / «Удалить это и все будущие». **Тело — поля (`Editor/Properties`):** - «**Заголовок**» события. write. - «**Весь день**» (тумблер). - «**С**» / «**По**» — нативные пикеры даты/времени (в нативе совпадает). - Выбор «**Календаря**» (коллекции). - «Местоположение», «Описание», «Категории». - Выбор «**Цвета**» / «Убрать цвет». **Тело — Повторение (`Editor/Repeat`):** - «**Повтор**» («Не повторяется») → меню пресетов + «**Настроить повторение**»: - «Повторять каждые» N + частота (день/неделя/месяц/год). - Неделя: кружки дней недели (Пн…Вс). - Месяц: «В конкретный день» / «В N-й» (первый… / будний / выходной / день). - «Окончание»: «никогда» / «на дату» / «после» N «повторений». - Предупреждение о неполной поддержке rrule (часть повторений может быть потеряна при правке). - `расхождение (бэклог, mail/072):` натив НЕ разворачивает оккуренции в сетке (долг №2) и не поддерживает EXDATE/RECURRENCE-ID (долг №3); `toRrule` не сериализует «первый понедельник» (`BYDAY=1MO`). **Тело — Напоминания (`Editor/Alarm`):** - «**Добавить напоминание**» (write) → тип (Уведомление/Email/Аудио), смещение («за … минут/часов/дней/недель до») или «На дату»; «Удалить напоминание». **Тело — Участники / приглашения (`Editor/Invitees`, форк `.f7-invitee-status-row`):** - «**Участники**» («Пока нет участников») → поиск «эл. почты, пользователи, контакты, группы, команды». write. - Роль участника: «Обязательный»/«Необязательный»/«Председатель»/«Не участвует»; «Запросить ответ»; «Удалить участника». - «**Найти время**» → сетка занятости (ниже). - Настройка ответов: «Только приглашённые могут отвечать» / «Любой с приглашением может отвечать», «Разрешить пересылку». - «**Кнопки ответа на приглашение**» (входящее событие, `InvitationResponseButtons`): «**Принять**» / «**Отклонить**» / «**Под вопросом**». write (iTIP REPLY). - `расхождение (бэклог, mail/072, долг №4):` экрана accept/decline входящих приглашений в нативе нет. **Тело — Беседа Talk (`AddTalkModal`, форк `.property-add-talk`):** - «**Добавить беседу Talk**» → модалка: выбрать существующую беседу или создать публичную/приватную. write при создании. **Тело — Вложения (`Editor/Attachments`):** - «**Из файлов**» → навигация по WebDAV (добавить файл / поделиться ссылкой). - «**Загрузить с устройства**» (write). - Пункт вложения → «Удалить файл» (write); пусто — «Нет вложений». **Тело — Занятость (`Editor/FreeBusy`):** - «**Проверить доступность / Найти время**» → сетка Free/Busy: «Свободен»/«Занят»/«Занят (под вопросом)»/«Нет на месте», навигация «Пред./След. дата», легенда. write (POST в DAV outbox — на forbion НЕ выполняю), `визуал(?)`. ## Расхождения натив ↔ forbion (сводный бэклог, приоритет по mail/072) 1. Повторения не разворачиваются в сетке (долг №2, подтверждён лидом) — «Событие: Повторение» / сетка. 2. EXDATE / RECURRENCE-ID не поддержаны (долг №3) — «Событие: шапка / Повторение». 3. Входящие приглашения без «Принять/Отклонить» (долг №4) — «Событие: Участники». 4. Виды «Год» / «Список» отсутствуют в нативе — «Календарь: шапка». 5. `toRrule` не сериализует `BYDAY=1MO` («первый понедельник») — вскроется на развёртке повторений.