{
  "$comment": "ПРЕФИКС МОНТИРОВАНИЯ во всех путях ниже подставляет vite-плагин dd:panel-manifest из config.base — см. vite.config.ts (в исходнике файла на его месте стоит плейсхолдер). Сегодня это '/panel/' (панель за прокси приложения торгов), после переезда на panel.dropdealer.ru станет '/', и правки этого файла не потребуется. Абсолютных адресов здесь нет намеренно: захардкоженный origin ломается ровно в момент переезда.",
  "id": "/panel/",
  "name": "DropDealer — Панель управления",
  "short_name": "DD Панель",
  "description": "Рабочее место дилера и администратора: лоты, торги, пользователи",
  "start_url": "/panel/",
  "scope": "/panel/",
  "display": "standalone",
  "orientation": "any",
  "background_color": "#292823",
  "theme_color": "#2a5e47",
  "categories": ["business", "productivity"],
  "lang": "ru",
  "dir": "ltr",
  "icons": [
    { "src": "/panel/icons/icon-192x192.png", "sizes": "192x192", "type": "image/png", "purpose": "any" },
    { "src": "/panel/icons/icon-512x512.png", "sizes": "512x512", "type": "image/png", "purpose": "any" },
    { "src": "/panel/icons/icon-maskable-192.png", "sizes": "192x192", "type": "image/png", "purpose": "maskable" },
    { "src": "/panel/icons/icon-maskable-512.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable" }
  ],
  "screenshots": [
    {
      "src": "/panel/screenshots/dashboard.png",
      "sizes": "375x812",
      "type": "image/png",
      "form_factor": "narrow",
      "label": "Сводка по торгам"
    },
    {
      "src": "/panel/screenshots/lots.png",
      "sizes": "375x812",
      "type": "image/png",
      "form_factor": "narrow",
      "label": "Лоты — список и действия"
    },
    {
      "src": "/panel/screenshots/dashboard-wide.png",
      "sizes": "1280x800",
      "type": "image/png",
      "form_factor": "wide",
      "label": "Панель управления на десктопе"
    }
  ],
  "shortcuts": [
    {
      "$comment": "Единственный ярлык — раздел, доступный ОБЕИМ ролям панели (у дилера LOTS_READ_OWN, у админа LOTS_READ_ANY). Ярлык на раздел, закрытый правом (например «Пользователи»), у дилера вёл бы в тупик «Доступ запрещён» с домашнего экрана — тупик с ярлыка хуже отсутствующего ярлыка.",
      "name": "Лоты",
      "short_name": "Лоты",
      "url": "/panel/lots",
      "icons": [{ "src": "/panel/icons/icon-96x96.png", "sizes": "96x96", "type": "image/png" }]
    }
  ],
  "$comment_related": "ССЫЛКА НА СОБСТВЕННЫЙ МАНИФЕСТ — это не самоповтор, а ЕДИНСТВЕННЫЙ достоверный способ узнать «панель уже установлена, а я — вкладка браузера»: navigator.getInstalledRelatedApps() отвечает только про приложения, перечисленные ЗДЕСЬ, и без этого блока физически возвращает пустой массив. Проверка через display-mode:standalone отвечает на другой вопрос («я сам сейчас запущен как приложение») и сценарий «оператор поставил панель, потом открыл её же по ссылке из чата» не ловит; флагу в localStorage доверять нельзя — он переживает удаление приложения. ПУТЬ, А НЕ АБСОЛЮТНЫЙ АДРЕС, и это несущее решение при общем origin: панель и торги живут на одном хосте, манифест торгов лежит в корне ('/manifest.webmanifest'), и промах на один сегмент означал бы, что установленные ТОРГИ отдаются как установленная панель. '/panel/manifest.webmanifest' разрешается от адреса ЭТОГО манифеста и структурно не может указать на чужой: сегодня даёт '<origin>/panel/manifest.webmanifest', после переезда на panel.dropdealer.ru — '<origin>/manifest.webmanifest', и правки не потребует. prefer_related_applications: false — иначе браузер счёл бы, что установку надо предлагать не эту, а перечисленную, и предложение установки исчезло бы совсем.",
  "related_applications": [
    { "platform": "webapp", "url": "/panel/manifest.webmanifest" }
  ],
  "prefer_related_applications": false
}
