# Verstak2 UX Design > Версия: 1.0 > Дата: 2026-07-01 > Статус: Design — UX контракт для реализации > База: текущая архитектура Verstak2 (plugin platform) --- ## 1. Product UX Principle **Пользователь управляет делами. Платформа — инструмент, а не интерфейс.** Verstak2 — локальное desktop-приложение вокруг дел (workspace). Дело собирает заметки, файлы, ссылки, браузерные захваты, активность, журнал работы и доступы. Архитектурный инвариант: все пользовательские функции живут в динамических плагинах (notes, files, markdown-editor, file-preview, activity, browser-inbox, journal, search, secrets). Core не содержит ни одной бизнес-функции — только shell, plugin runtime и навигацию. **UX-следствие для platform architecture:** пользователь не должен видеть, что Activity — это плагин `verstak.activity`, а Notes — `official.notes`. UI называет функции человеческими именами: Заметки, Файлы, Активность, Входящие, Сегодня. **Принципы:** 1. **Дело — центр контекста.** Каждый элемент (заметка, файл, захват) принадлежит делу. Глобальные инструменты (Today, Inbox, Search) — это агрегаторы, не конкуренты делам. 2. **Рабочая среда, не IDE.** Verstak — не редактор кода. Пользователь не открывает "файл" — он открывает заметку. Не "workspace" — а дело. 3. **Human-readable vault.** Пользователь может открыть папку vault в файловом менеджере и понять структуру: `Notes/`, `Files/`, `Links/`. `Overview.md` — обычный файл, не специальная сущность. 4. **Local-first, sync-augmented.** Приложение работает без интернета. Синхронизация — это плагин, а не ядро. 5. **Тишина — норма.** Приложение не кричит ошибками. Плагин упал → компактный badge в статусбаре. Пустое место → объяснение + действие. Нет данных → не паника, а "пока ничего нет". 6. **Консистентность.** Один язык в UI (определить какой). Одна навигационная модель. Один набор компонентов у всех плагинов. --- ## 2. Primary User Scenarios ### 2.1. Первый запуск Открываю Verstak → вижу **Today** (глобальный) → приветствие → предложение создать первое дело → после создания → автоматически в него. ### 2.2. Утренний вход Открываю приложение → Today: - захваты из всех дел (неразобранные) - недавняя активность - предыдущее дело → "Resume" (продолжить) ### 2.3. Ежедневная работа в деле Выбираю дело → **Overview** (Today дела): - захваты по этому делу - активность - быстрый create note / process captures - вкладки: Заметки | Файлы | Активность | Журнал | Доступы ### 2.4. Захват из браузера Отправил страницу в Verstak (extension) → Inbox → вижу захват → выбираю дело → Create Note / Create Link. **Текущая проблема:** captures без привязки к делу нельзя конвертировать — только удалить. Это блокер. ### 2.5. Работа с заметкой В деле → Notes → создаю/выбираю заметку → Markdown Editor → split preview. ### 2.6. Управление файлами В деле → Files → просмотр, создание, upload, open external. ### 2.7. Активность и журнал Activity показывает события (изменения, захваты, конвертации). Journal — ручные записи + импорт worklog suggestions из Activity. ### 2.8. Поиск Ctrl+K → Command Palette или Quick Open. Ищет по делам, файлам, заметкам, командам. ### 2.9. Секреты В деле → Доступы → защищённое хранилище credentials. Unlock → просмотр/копирование. ### 2.10. Синхронизация Sync плагин: статус в статусбаре, настройки в Plugin Manager. --- ## 3. Information Architecture ``` Application Shell ├── Sidebar (220px) │ ├── Header → лого Verstak │ ├── Today ★ (всегда видно) │ ├── Inbox ⌂ (если есть captures без привязки) │ ├── Workspaces │ │ ├── Дело 1 (expandable → вкладки) │ │ ├── Дело 2 │ │ └── ... │ └── Footer (vault status, settings gear) │ ├── Content Area (flexible) │ ├── Today (глобальный) │ ├── Inbox (глобальный, only если нет workspace) │ ├── Workspace │ │ ├── Tab bar: Overview | Заметки | Файлы | Активность | Журнал | Доступы │ │ └── Tool content │ ├── Plugin View (отдельные sidebar view-плагины) │ ├── Workbench (editor/preview split) │ └── Plugin Manager (settings) │ ├── Command Palette (Ctrl+K, overlay) └── Status Bar (28px, vault + sync + errors) ``` ### 3.1. Что относится к глобальному (cross-workspace) | Элемент | Где живёт | Зачем | |---------|-----------|-------| | **Today** | Sidebar + главная страница | Cross-workspace обзор: все захваты, активность, Resume | | **Inbox** | Sidebar (ссылка) | Все неразобранные captures без привязки к делу | | **Activity** | Внутри каждого дела | Только scoped к делу. Глобальная активность — через Today | | **Search** | Ctrl+K / overlay | Поиск по всем делам, файлам, заметкам | | **Plugin Manager** | Settings / StatusBar | Enable/disable, diagnostics, developer info | ### 3.2. Что относится к workspace | Элемент | Тип доступа | Зачем | |---------|-------------|-------| | **Overview** | tab (всегда первый) | Today дела: захваты, активность, быстрые действия | | **Заметки (Notes)** | tab | Список заметок дела | | **Файлы (Files)** | tab | Файлы дела | | **Активность (Activity)** | tab | События по делу | | **Журнал (Journal)** | tab | Worklog записи дела | | **Доступы (Secrets)** | tab | Credentials дела | ### 3.3. Чего НЕ должно быть в навигации - **Plugin Manager** — не первый экран. Только через Settings/StatusBar. - **Platform Test** — developer tool, не должен быть в sidebar или command palette. - **Технические plugin.ids** — не должны появляться в tooltips, заголовках, статусах. - **Capability/contribution details** — в Plugin Manager под "Technical details". ### 3.4. Mapping: архитектура → UX | Архитектурная сущность | UX-отображение | |------------------------|----------------| | Plugin `verstak.activity` | Вкладка "Активность" в деле | | Plugin `verstak.browser-inbox` | Inbox (глобальный) + захваты в Overview/Today | | Plugin `official.notes` | Вкладка "Заметки" в деле | | Plugin `official.files` | Вкладка "Файлы" | | Plugin `verstak.journal` | Вкладка "Журнал" | | Plugin `verstak.secrets` | Вкладка "Доступы" | | Plugin `verstak.search` | Ctrl+K CommandPalette, не вкладка | | Contribution `sidebarItems` | Глобальные sidebar элементы (только когда нужны cross-workspace) | | Contribution `workspaceItems` | Вкладки внутри дела | --- ## 4. Screen Roles ### 4.1. Today | Аспект | Значение | |--------|----------| | **Роль** | Стартовый экран и cross-workspace командный центр | | **Кто открывает** | При входе в приложение (default route). По клику ★ в sidebar | | **Главное действие** | Resume: продолжить последнее дело или разобрать захват | | **Вторичные действия** | Создать заметку, открыть Inbox, перейти в дело, Refresh | | **Empty state** | "Добро пожаловать. Создайте первое дело или отправьте захват из браузера." | | **Loading state** | Skeleton: 3 summary cards + 4 panel placeholders | | **Error state** | "Не удалось загрузить. [Retry]" — если Plugin settings API недоступен | | **Что не должно быть** | Plugin IDs, capability names, technical statuses | | **Текущая архитектура** | Читает plugin settings (`verstak.browser-inbox`, `verstak.activity`, `verstak.journal`) через `App.ReadPluginSettings()`. Global mode: ключи `captures:global`, `events:global`. | ### 4.2. Inbox (Browser Inbox — глобальный) | Аспект | Значение | |--------|----------| | **Роль** | Место для неразобранных захватов из браузера | | **Кто открывает** | Через sidebar ссылку, через кнопку "Process Captures" на Today | | **Главное действие** | Выбрать захват → конвертировать в заметку/ссылку/файл | | **Вторичные действия** | Assign to workspace, Remove, просмотр метаданных | | **Empty state** | "Нет захваченных материалов. Отправьте страницу, ссылку или файл из браузера." | | **Loading state** | "Загрузка захватов..." | | **Error state** | "Не удалось загрузить inbox: [причина]. [Retry]" | | **Что не должно быть** | Plugin IDs, storage keys (`captures:global`), encoding details | | **Критическая проблема (P0)** | Сейчас conversion buttons (Create Note/Link/File) доступны ТОЛЬКО если `capture.workspaceRootPath` уже установлен. Для глобальных captures (без привязки к делу) — только Remove. Нужен workspace picker → конвертация. | | **Текущая архитектура** | Plugin `verstak.browser-inbox`. Frontend на чистом JS, не Svelte. Хранит captures в plugin settings. Ключи: `captures:global`, `captures:workspace:`. | ### 4.3. Workspace Overview | Аспект | Значение | |--------|----------| | **Роль** | Today для конкретного дела | | **Кто открывает** | При выборе дела из sidebar (первый таб) | | **Главное действие** | Resume по этому делу: показать захваты, активность, быстрый create note | | **Вторичные действия** | Создать заметку, Process Captures, Review Activity | | **Empty state** | Дело пусто (нет захватов, активности, заметок). "В этом деле пока ничего нет. Создайте первую заметку или захватите материал." | | **Loading state** | Skeleton (как глобальный Today, но для одного дела) | | **Error state** | "Не удалось загрузить обзор дела." | | **Что не должно быть** | Plugin IDs, storage keys, encoded workspace paths | ### 4.4. Заметки (Notes) | Аспект | Значение | |--------|----------| | **Роль** | Список заметок в деле | | **Главное действие** | Создать новую заметку | | **Вторичные действия** | Выбрать → открыть в редакторе, rename, delete, search, sort | | **Empty state** | "Нет заметок. Создайте первую заметку." [+ кнопка] | | **Loading state** | Skeleton rows | | **Error state** | "Не удалось загрузить заметки." | | **Что не должно быть** | Plugin IDs, capability names, file paths как title | | **Текущая архитектура** | Plugin `official.notes`. Workspace-scoped. Вкладка в деле. | ### 4.5. Markdown Editor | Аспект | Значение | |--------|----------| | **Роль** | Редактор markdown заметок (split: editor + preview) | | **Главное действие** | Писать и форматировать текст | | **Вторичные действия** | Split/resize, save, open in system editor, copy path | | **Empty state** | "Выберите заметку для редактирования" (если открыт без файла) | | **Loading state** | "Загрузка документа..." | | **Error state** | "Не удалось загрузить/сохранить файл." | | **Что не должно быть** | Plugin tooltips, длинные tech paths в заголовке, "verstak.markdown-editor" в панели | | **Текущая архитектура** | Plugin `official.markdown-editor`. Backend: Go editor API. Frontend: Svelte. | ### 4.6. Файлы (Files) | Аспект | Значение | |--------|----------| | **Роль** | Файловый менеджер дела | | **Главное действие** | Навигация по папкам, открытие файлов | | **Вторичные действия** | Upload, download, rename, delete, create folder, open external, show in folder, preview | | **Empty state** (папка) | "Папка пуста." [+ Create File / Upload] | | **Error state** | "Не удалось загрузить файлы." | | **Что не должно быть** | Технические иконки без подписей, hash-имена без friendly отображения | | **Текущая архитектура** | Plugin `official.files`. Workspace-scoped. Backend: Go/Files API. Вкладка в деле. | ### 4.7. File Preview | Аспект | Значение | |--------|----------| | **Роль** | Просмотр изображений, metadata файлов | | **Главное действие** | Fit/Zoom изображения | | **Вторичные действия** | Open external, copy path, show metadata | | **Empty state** | "Нет файла для просмотра." | | **Error state** | "Этот формат не поддерживается для предпросмотра." + [Open external] | | **Что не должно быть** | Маленькое изображение в большой рамке без fit-адаптации | ### 4.8. Activity | Аспект | Значение | |--------|----------| | **Роль** | Лог событий дела (изменения, захваты, конвертации) | | **Главное действие** | Просмотр событий, импорт worklog suggestions в Journal | | **Вторичные действия** | Clear, filter by source/type | | **Empty state** | "Изменения файлов, захваты и конвертации появятся здесь." | | **Loading state** | "Загрузка активности..." | | **Error state** | "Не удалось загрузить активность." | | **Что не должно быть** | Plugin IDs, event internal keys | | **Текущая архитектура** | Plugin `verstak.activity`. Workspace-scoped. Вкладка в деле + sidebar (дублирование!). | ### 4.9. Journal | Аспект | Значение | |--------|----------| | **Роль** | Worklog (журнал работы) дела | | **Главное действие** | Создать запись + импорт из Activity | | **Вторичные действия** | Редактировать, удалить | | **Empty state** | "Нет записей. Начните вести журнал работы или импортируйте предложения из Активности." | | **Loading state** | "Загрузка журнала..." | | **Error state** | "Не удалось загрузить журнал." | | **Что не должно быть** | Technical date format, пустая форма без explainer | ### 4.10. Secrets | Аспект | Значение | |--------|----------| | **Роль** | Защищённое хранилище credentials для дела | | **Главное действие** | Unlock → просмотр/копирование | | **Вторичные действия** | Создать, редактировать, удалить credential | | **Locked state** (not empty) | "Доступы заблокированы. Введите мастер-пароль для просмотра." | | **Empty locked state** | "Нет сохранённых доступов. Заблокируйте хранилище для безопасности." | | **Error state** | "Неверный пароль" / "Не удалось разблокировать хранилище." | | **Что не должно быть** | Пароли в plain text, empty locked панель без explainer | ### 4.11. Sync / Status | Аспект | Значение | |--------|----------| | **Роль** | Индикатор и управление синхронизацией | | **Кто использует** | Все пользователи, но не daily | | **Empty/not configured** | Vault status в статусбаре: "Vault: open". Sync не настроен → не показывать ошибку. | | **Sync error** | Компактный icon в статусбаре + [Подробнее] по клику. Не загромождать workspace. | | **Что не должно быть** | Большие красные ошибки, занимающие контент. Технические детали без действия. | ### 4.12. Settings / Plugin Manager | Аспект | Значение | |--------|----------| | **Роль** | Управление плагинами и настройками vault | | **Кто использует** | Разработчики, power users (не daily) | | **Главное действие** | Enable/disable плагинов | | **Вторичные действия** | Просмотр settings панелей плагинов, diagnostics | | **Empty state** | "Нет установленных плагинов." | | **Что не должно быть** | Default/первая страница приложения | | **Текущая архитектура** | Core shell. Plugin Manager — обязательный core компонент. | --- ## 5. Component and Layout Rules ### 5.1. App Shell ``` ┌──────────┬────────────────────────────────┐ │ │ Content Area │ │ Sidebar │ ┌───┬───┬───┬───┬───┐ │ │ 220px │ │ │ │ │ │ │ tabs │ │ │ └───┴───┴───┴───┴───┘ │ │ │ │ │ │ [tool content] │ │ │ │ │ ├────────────────────────────────┤ │ │ Status Bar (28px) │ └──────────┴────────────────────────────────┘ ``` ### 5.2. Sidebar | Правило | Значение | |---------|----------| | Ширина | 220px, фиксированная | | Разделы | **Today** (★) → **Inbox** (⌂) → **Workspaces** → Vault status | | Workspace item | Клик → open дела. Expandable → вкладки дела (Overview, Заметки...) | | Workspace expand | Показывать текущую активную вкладку. Default: collapsed | | Размер шрифта | 0.78rem (items), 0.7rem (section labels, uppercase) | | Отступы | padding: 1rem 1.25rem (header), 0.45rem 0.6rem (sections) | | Секция "Tools" | Переименовать или убрать. Все plugin sidebarItems должны быть оправданы как cross-workspace инструменты | | Hover | background: rgba(15,52,96,0.4), color: #e0e0f0 | ### 5.3. Workspace Tabs | Правило | Значение | |---------|----------| | Порядок | Overview (всегда первый) → Notes → Files → Activity → Journal → Secrets | | Active tab | Accent underline/background | | Tab overflow | Scrollable, compact. Tab не переносится на новую строку | | Закрытие таба | Overview нельзя закрыть. Остальные — нет (вкладка = инструмент дела) | | Tooltip | Человеческое название, не plugin ID | ### 5.4. Buttons | Тип | CSS класс | Когда использовать | |-----|-----------|-------------------| | Primary | `.btn-primary` | Главное действие на экране (зелёный `#4ecca3`) | | Secondary | `.btn-secondary` | Вторичные действия | | Ghost | `.btn-ghost` | Toolbar actions, иконки (прозрачный, #a0a0b8) | | Danger | `.btn-danger` | Delete, Remove, опасные действия (красный `#e94560`) | | Disabled | `:disabled` | opacity 0.55, cursor not-allowed | **Правила:** - Icon-only buttons → обязательный title/aria-label - Icon + text где позволяет место (toolbar → ghost icon button с tooltip, panels → secondary/primary с label) - Все button: `type="button"`, min-height 2rem ### 5.5. Empty States (общие правила) ``` [icon or visual placeholder] [title: concise explanation] [description: 1-2 sentences, actionable] [action button(s): optional] ``` - Не использовать: "No items", "Empty list", "Nothing here" - Использовать: объяснение + что делать дальше - Всегда: action button если есть что предложить ### 5.6. Status Bar | Правило | Значение | |---------|----------| | Высота | 28px, фиксированная | | Слева | Vault status: "Vault: open" (icon + text). Plugin status items (compact) | | Справа | Settings gear | | Plugin errors | Compact icon с count. Click → detail. Не занимать workspace. | | Sync status | Отдельный icon (connected/syncing/disconnected). Click → detail. | | Размер шрифта | 0.72rem | ### 5.7. Toasts/Notifications (future) - Timed auto-dismiss (3-5s) - Типы: success (зелёный), error (красный), info (синий) - Не блокирующие. Появляются в правом нижнем углу. - Для: "Заметка создана", "Файл сохранён", "Ошибка синхронизации" ### 5.8. Metadata Display Rules | Тип данных | Формат | Пример | |------------|--------|--------| | Дата (capture) | "сегодня 14:23", "вчера", "2 июн" | Относительно, не ISO | | Дата (edit) | "изменено 2 часа назад" | Относительно | | Путь к файлу | `Дело/Notes/заметка.md` (без `/home/...`) | Внутри vault — vault-relative | | Workspace name | Человеческое имя | "Проект Верстак", не `/home/...` | | File size | Читаемый: "1.2 MB", "340 KB" | Не байты | | Capture type | Человеческий: "Страница", "Выделение", "Ссылка" | Не `kind: page` | | Plugin ID | НЕ показывать пользователю | В tooltip максимум, желательно убрать | ### 5.9. Technical IDs - Plugin IDs (`verstak.browser-inbox`) → НЕ показывать в UI - Storage keys (`captures:global`) → НЕ показывать - Internal events (`browser.capture.page`) → НЕ показывать - Component names (`BrowserInboxView`) → НЕ показывать - API versions (`apiVersion: 0.1.0`) → только в Plugin Manager → Technical Details - Capability names (`capture.browser`) → только в Plugin Manager → Technical Details --- ## 6. Language and Terminology ### 6.1. Язык UI по умолчанию **Английский.** Это язык разработки, документации и сообщества. **"Но интерфейс не должен смешивать языки"** — если английский, то последовательно. Без "Поиск" на фоне "Files". **Текущая ситуация:** mix — заголовки на EN (Activity, Browser Inbox), но отдельные фразы на RU (plugin descriptions, empty states). **Решение:** UI целиком на английском. Все заголовки, кнопки, подписи, empty states — на английском. Контент пользователя (заметки, файлы) — на любом языке. ### 6.2. Terminology Table | Current | Target | Context | Notes | |---------|--------|---------|-------| | Workspace | Workspace | Везде | "Дело" в русском контексте, но оставляем "workspace" в UI | | Today | Today | Sidebar, экран | Оставить | | Inbox | Inbox | Sidebar, Today | "Browser Inbox" → "Inbox" в sidebar, "Captures" как data | | Overview | Overview | Первый таб дела | Или "Today" (workspace-scoped) | | Activity | Activity | Таб дела | Not "Browser Inbox" | | Journal | Journal | Таб дела | Not "Worklog" | | Secrets | Secrets | Таб дела | Not "Credentials" | | Tools | — | Sidebar section | Убрать или "Views", если оправдано | | Captured | Captured | Today panel | Захваченный материал | | Resume Next | Resume | Today block | Продолжить | | Notes | Notes | Таб дела | Список заметок | | Files | Files | Таб дела | Файлы | | Search | Search | Ctrl+K | Поиск | | Plugin Manager | Settings | View | Plugin Manager — developer mode | | Create Note | New Note | Кнопка | Единообразно | | Create Link | New Link | Кнопка | | | Create File | New File | Кнопка | | | Remove | Remove | Delete action | | | Refresh | Refresh | Обновление | | | Vault | Vault | Хранилище | Оставить | ### 6.3. Что НЕ показывать в UI - `verstak.anything` — plugin IDs - `captures:global` — storage keys - `apiVersion`, `schemaVersion` — кроме Plugin Manager → Technical Details - `official.notes` — source qualify - Platform Test плагин — убрать из sidebar и command palette (developer mode only) --- ## 7. Interaction Rules | Действие | Поведение | |----------|-----------| | **Click** | Открыть/выбрать/активировать | | **Double click** | Открыть в редакторе (файл) или preview (изображение) | | **Enter** | Подтвердить (input), открыть выбранное (list) | | **Escape** | Закрыть модалку, панель detail, search overlay, отменить current | | **Back/Forward** | Alt+←/→ (browser history внутри приложения). В workspace: вперёд/назад по файловой навигации | | **Tab** | Форма, модалка: по порядку. Sidebar: ArrowUp/Down | | **Selection** | Click для выбора одной строки. Shift+click для range. | | **Context menu** | Right-click → actions (Rename, Delete, Copy path, Open external) | | **Drag and drop** | Будущее. Не в MVP. | | **Unsaved changes** | Закрыть модалку "Сохранить изменения?" + buttons: Save / Discard / Cancel | | **Delete/Trash** | Delete → trash (soft). Trash/restore в Files. | | **Restore** | Files → Restore metadata view | | **Open external** | Открыть файл в системном приложении | | **Copy path/link** | Copy vault-relative path или внешний URL | | **Import Activity** | В Journal: кнопка "Import Suggestion" рядом с worklog suggestion в Activity | | **Unlock/Lock secrets** | Master password prompt → unlock. Auto-lock after inactivity (future). | --- ## 8. Keyboard UX | Shortcut | Action | |----------|--------| | **Ctrl+K** | Command Palette (shell + plugin commands) | | **Ctrl+P** | Quick Open (файлы, заметки) | | **Ctrl+,** | Settings / Plugin Manager | | **Ctrl+W** | Close workspace tab (кроме Overview) | | **Ctrl+`** | Toggle sidebar (future) | | **Ctrl+S** | Save current editor | | **Ctrl+Z / Ctrl+Shift+Z** | Undo / Redo | | **Escape** | Close overlay, panel, modal, search | | **Return/Enter** | Activate selected | | **Delete** | Move to trash (with confirmation) | | **Arrow Up/Down** | Navigate list items | | **Arrow Left/Right** | Navigate workspace tabs | | **Tab / Shift+Tab** | Форма/диалог: next/prev field | | **F2** | Rename selected item | | **F5** | Refresh current view | | **Ctrl+Shift+F** | Search in files (future) | **Фокус:** Всегда видимый focus ring. Сейчас есть `:focus-visible` с `outline: 2px solid #4ecca3`. --- ## 9. Accessibility Baseline - **Видимый focus:** Есть (`outline: 2px solid #4ecca3`, `outline-offset: 2px`). OK. - **Минимальный размер клика:** 32x32px для icon-only. Сейчас min-height 2rem (~32px). OK. - **Контраст:** Тёмная тема (текст #e0e0f0 на bg #1a1a2e). OK. Проверить secondary text (#8b8ba8 на #101020 — может быть низкий контраст). - **Tooltip/aria-label для иконок:** Обязательно. Сейчас есть не везде. - **Disabled state:** Обязательно с объяснением если не очевидно. Сейчас opacity 0.55. - **Errors текстом:** Не только цвет, но и текст. - **Масштабирование:** UI должен корректно выглядеть при 150% zoom. Проверить sidebar width, text overflow. --- ## 10. Empty/Loading/Error States ### Empty States | Экран | Текст | |-------|-------| | Vault (no workspaces) | "No workspaces yet. Create your first workspace to get started." [+ Create Workspace] | | Today (no data at all) | "Welcome to Verstak. Create a workspace or capture something from your browser to get started." | | Inbox / Captures | "No captured items. Send a page, selection, or link from the browser extension." | | Notes | "No notes in this workspace. Create your first note." [+ New Note] | | Files (folder) | "This folder is empty." [+ Create File] | | Activity | "No activity events yet. File changes, captures, and conversions will appear here." | | Journal | "No journal entries. Start logging your work or import suggestions from Activity." | | Secrets (locked) | "Secrets are locked." Enter master password or set up secrets storage. | | Secrets (unlocked, empty) | "No saved secrets. Add a credential to get started." | | Search (no results) | "No results found." [Clear search] | | File Preview (no selection) | "Select a file to preview." | | Editor (no file) | "Open a note or file to start editing." | ### Loading States | Экран | Визуал | |-------|--------| | Today | Skeleton: 3 cards (summary) + 4 panel outlines | | Workspace Overview | Skeleton: 3 summary cards + 4 panel outlines | | Notes list | Skeleton rows (3-5 lines) | | Files | Skeleton: folder grid / file list (3-5 rows) | | Activity | Skeleton rows | | Journal | Skeleton rows | | Editor | Spinner + "Loading document..." | ### Error States | Ситуация | Текст | Action | |----------|-------|--------| | Plugin settings read failure | "Could not load. [Retry]" | Refresh button | | File load failure | "Could not load file." [Try again] | Open external | | File save failure | "Could not save file." [Retry] [Save As] | Discard | | Sync error | Error icon in status bar | Click → detail | | Plugin failed | "Plugin issue" badge in status bar | Click → detail → Plugin Manager | | File not previewable | "This file type cannot be previewed." | Open external | --- ## 11. Plugin UX Rules 1. **Плагин не ломает UI-словарь.** Title плагина (его `name` в manifest) используется как человеческое имя. `name: "Activity"` → UI показывает "Activity". Не `sidebartitle: "verstak.activity"`. 2. **Плагин не изобретает базовые компоненты.** Если нужен список — использовать host-контракт списка. Если есть `workspaceItems` — не дублировать в `sidebarItems`. 3. **Plugin ID не показывать в обычном UI.** Tooltip, заголовок, статус — только human name. 4. **Plugin error ≠ app crash.** Ошибка плагина → compact badge. Only Plugin Manager показывает full error. 5. **Developer diagnostics → Settings/Developer.** Platform Test, capability info, contribution debug — не в sidebar, не в command palette по умолчанию. 6. **Contribution points имеют UX-контракт:** - `sidebarItems`: title + icon + view (id). Must justify why cross-workspace. - `workspaceItems`: title + icon + component. Scoped to workspace. - `statusBarItems`: compact, position-aware (left/right). - `commands`: title + keyboard + handler. User-facing first, dev second. - `settingsPanels`: title + pluginId + panelId. Open from Plugin Manager. --- ## 12. UX Acceptance Checklist Для каждой новой фичи: - [ ] Пользователь понимает, где он находится? (заголовок, подпись, навигация) - [ ] Понятно главное действие? (кнопка или первый элемент фокуса) - [ ] Есть empty state? (не пустая страница) - [ ] Есть loading state? (не белый экран) - [ ] Есть error state с действием? (не техническая ошибка) - [ ] Есть клавиатурный путь? (Ctrl+K, Tab, Enter, Esc) - [ ] Нет технического жаргона? (plugin IDs, storage keys, capability names) - [ ] Есть обратная связь после действия? (toast, смена состояния, focus) - [ ] Можно отменить/закрыть/вернуться? (Escape, Cancel, Back) - [ ] Данные не выглядят потерянными? (undo, trash, confirmation) - [ ] После перезапуска состояние восстанавливается понятно? (state persistence) - [ ] Plugin работает без изменения ядра? (через contribution points, не прямые импорты) - [ ] Plugin error не ломает shell? (graceful degradation, compact error) --- *Конец UX Design Document*