{
  "name": "screen-shell",
  "type": "registry:file",
  "description": "Навигация и демо-данные, общие для экранов CRM.",
  "dependencies": [
    "@lucide/vue"
  ],
  "registryDependencies": [
    "avatar",
    "sidebar"
  ],
  "files": [
    {
      "path": "screens/CrmSidebar.vue",
      "type": "registry:file",
      "target": "screens/CrmSidebar.vue",
      "content": "<script setup lang=\"ts\">\n/**\n * Навигация CRM, общая для всех экранов примера. Собрана из компонента `sidebar`,\n * своих элементов не заводит; активный раздел приходит пропом.\n */\nimport {\n  BarChart3Icon,\n  BuildingIcon,\n  CheckSquareIcon,\n  HandshakeIcon,\n  SettingsIcon,\n  UsersIcon,\n} from '@lucide/vue'\nimport {\n  Sidebar,\n  SidebarContent,\n  SidebarFooter,\n  SidebarGroup,\n  SidebarGroupLabel,\n  SidebarHeader,\n  SidebarMenu,\n  SidebarMenuButton,\n  SidebarMenuItem,\n} from '@/components/ui/sidebar'\nimport { Avatar, AvatarFallback } from '@/components/ui/avatar'\nimport { owner } from './data'\n\nconst props = withDefaults(defineProps<{ section?: string }>(), { section: 'Сделки' })\n\nconst sections = [\n  { title: 'Сделки', icon: HandshakeIcon, to: '/screens/deals' },\n  { title: 'Контакты', icon: UsersIcon, to: '/screens/contact' },\n  { title: 'Компании', icon: BuildingIcon, to: '/screens/deals' },\n  { title: 'Задачи', icon: CheckSquareIcon, to: '/screens/deals' },\n  { title: 'Отчёты', icon: BarChart3Icon, to: '/screens/report' },\n]\n</script>\n\n<template>\n  <Sidebar collapsible=\"icon\">\n    <SidebarHeader>\n      <SidebarMenu>\n        <SidebarMenuItem>\n          <SidebarMenuButton size=\"lg\">\n            <div\n              class=\"bg-primary text-primary-foreground flex aspect-square size-8 items-center justify-center rounded-lg\"\n            >\n              <HandshakeIcon class=\"size-4\" />\n            </div>\n            <div class=\"grid flex-1 text-left text-sm leading-tight\">\n              <span class=\"truncate font-medium\">Продажи</span>\n              <span class=\"text-muted-foreground truncate text-xs\">Застройщики</span>\n            </div>\n          </SidebarMenuButton>\n        </SidebarMenuItem>\n      </SidebarMenu>\n    </SidebarHeader>\n\n    <SidebarContent>\n      <SidebarGroup>\n        <SidebarGroupLabel>Работа</SidebarGroupLabel>\n        <SidebarMenu>\n          <SidebarMenuItem v-for=\"section in sections\" :key=\"section.title\">\n            <SidebarMenuButton\n              as-child\n              :is-active=\"section.title === props.section\"\n              :tooltip=\"section.title\"\n            >\n              <RouterLink :to=\"section.to\">\n                <component :is=\"section.icon\" />\n                <span>{{ section.title }}</span>\n              </RouterLink>\n            </SidebarMenuButton>\n          </SidebarMenuItem>\n        </SidebarMenu>\n      </SidebarGroup>\n    </SidebarContent>\n\n    <SidebarFooter>\n      <SidebarMenu>\n        <SidebarMenuItem>\n          <SidebarMenuButton :tooltip=\"owner.name\" size=\"lg\">\n            <Avatar class=\"size-8 rounded-lg\">\n              <AvatarFallback class=\"rounded-lg\">{{ owner.initials }}</AvatarFallback>\n            </Avatar>\n            <div class=\"grid flex-1 text-left text-sm leading-tight\">\n              <span class=\"truncate font-medium\">{{ owner.name }}</span>\n              <span class=\"text-muted-foreground truncate text-xs\">Менеджер</span>\n            </div>\n          </SidebarMenuButton>\n        </SidebarMenuItem>\n        <SidebarMenuItem>\n          <SidebarMenuButton tooltip=\"Настройки\">\n            <SettingsIcon />\n            <span>Настройки</span>\n          </SidebarMenuButton>\n        </SidebarMenuItem>\n      </SidebarMenu>\n    </SidebarFooter>\n  </Sidebar>\n</template>\n"
    },
    {
      "path": "screens/data.ts",
      "type": "registry:file",
      "target": "screens/data.ts",
      "content": "/**\n * Демонстрационные данные экрана сделки.\n *\n * Компании и люди вымышлены: экран показывает сборку интерфейса, а не реальную воронку.\n * Данные вынесены из разметки, чтобы в шаблоне было видно структуру, а не литералы.\n */\n\nexport interface DealTask {\n  id: number\n  title: string\n  due: string\n  owner: string\n  state: 'overdue' | 'today' | 'planned' | 'done'\n}\n\nexport interface DealEvent {\n  id: number\n  author: string\n  initials: string\n  at: string\n  text: string\n}\n\n/** Ответственный менеджер — один на все экраны примера. */\nexport const owner = {\n  name: 'Ирина Соколова',\n  role: 'Менеджер по работе с застройщиками',\n  initials: 'ИС',\n}\n\nexport const deal = {\n  title: 'Северный квартал — платформа продаж',\n  company: 'ГК «Гранит-Девелопмент»',\n  amount: '2 400 000 ₽',\n  stageIndex: 4,\n  probability: 65,\n  createdAt: '12 июля 2026',\n  expectedClose: '30 сентября 2026',\n  source: 'Конференция «Движение»',\n  owner,\n}\n\nexport const stages = [\n  { step: 1, title: 'Квалификация', hint: 'Бюджет и роли подтверждены' },\n  { step: 2, title: 'Демо', hint: 'Показали платформу' },\n  { step: 3, title: 'Коммерческое', hint: 'КП отправлено 4 сентября' },\n  { step: 4, title: 'Договор', hint: 'На проверке у юриста' },\n  { step: 5, title: 'Оплата', hint: 'Счёт не выставлен' },\n  { step: 6, title: 'Внедрение', hint: 'Старт после оплаты' },\n]\n\nexport const terms = [\n  { name: 'Платформа продаж, годовая лицензия', qty: '1 год', price: '1 800 000 ₽' },\n  { name: 'Внедрение и перенос каталога', qty: '1 раз', price: '450 000 ₽' },\n  { name: 'Обучение отдела продаж', qty: '2 группы', price: '150 000 ₽' },\n]\n\nexport const tasks: DealTask[] = [\n  {\n    id: 1,\n    title: 'Отправить смету по внедрению',\n    due: 'Просрочено на 2 дня',\n    owner: 'Ирина Соколова',\n    state: 'overdue',\n  },\n  {\n    id: 2,\n    title: 'Созвон с юристом по правкам в договор',\n    due: 'Сегодня, 16:00',\n    owner: 'Ирина Соколова',\n    state: 'today',\n  },\n  {\n    id: 3,\n    title: 'Согласовать дату старта внедрения',\n    due: '18 сентября',\n    owner: 'Дмитрий Ким',\n    state: 'planned',\n  },\n  {\n    id: 4,\n    title: 'Отправить коммерческое предложение',\n    due: '4 сентября',\n    owner: 'Ирина Соколова',\n    state: 'done',\n  },\n]\n\nexport const contacts = [\n  { name: 'Павел Дорохов', role: 'Директор по продажам', initials: 'ПД', main: true },\n  { name: 'Марина Тен', role: 'Юрист', initials: 'МТ', main: false },\n  { name: 'Артём Волков', role: 'ИТ-директор', initials: 'АВ', main: false },\n]\n\nexport const history: DealEvent[] = [\n  {\n    id: 1,\n    author: 'Ирина Соколова',\n    initials: 'ИС',\n    at: 'Вчера, 18:20',\n    text: 'Юрист просит убрать автопролонгацию и добавить SLA на поддержку. Отдала правки в договор.',\n  },\n  {\n    id: 2,\n    author: 'Павел Дорохов',\n    initials: 'ПД',\n    at: '9 сентября',\n    text: 'Бюджет защитили. Просят старт внедрения не позже середины октября.',\n  },\n  {\n    id: 3,\n    author: 'Ирина Соколова',\n    initials: 'ИС',\n    at: '4 сентября',\n    text: 'Отправила коммерческое предложение на три года с рассрочкой платежа.',\n  },\n  {\n    id: 4,\n    author: 'Дмитрий Ким',\n    initials: 'ДК',\n    at: '28 августа',\n    text: 'Показали платформу отделу продаж. Больше всего вопросов про выгрузку каталога.',\n  },\n]\n\nexport const files = [\n  { name: 'КП_Северный_квартал.pdf', meta: 'PDF · 1,2 МБ · 4 сентября' },\n  { name: 'Смета_внедрение.xlsx', meta: 'XLSX · 320 КБ · 9 сентября' },\n  { name: 'Договор_правки_юриста.docx', meta: 'DOCX · 180 КБ · вчера' },\n]\n\n\n/* ---------------------------------------------------------------------------\n * Данные соседних экранов. Сделка «Северный квартал» повторяется в списке и в\n * канбане намеренно: так видно, что экраны показывают одну и ту же воронку.\n * ------------------------------------------------------------------------ */\n\nexport interface DealRow {\n  id: number\n  title: string\n  company: string\n  amount: number\n  stage: string\n  owner: string\n  initials: string\n  updated: string\n  risk: 'none' | 'stuck' | 'overdue'\n}\n\nexport const dealRows: DealRow[] = [\n  { id: 1, title: 'Северный квартал — платформа продаж', company: 'ГК «Гранит-Девелопмент»', amount: 2400000, stage: 'Договор', owner: 'Ирина Соколова', initials: 'ИС', updated: 'вчера', risk: 'overdue' },\n  { id: 2, title: 'Речной парк — каталог и бронирование', company: 'СЗ «Речной парк»', amount: 1750000, stage: 'Коммерческое', owner: 'Дмитрий Ким', initials: 'ДК', updated: '2 дня назад', risk: 'none' },\n  { id: 3, title: 'Пилот отдела продаж', company: 'ГК «Восток-Строй»', amount: 480000, stage: 'Демо', owner: 'Ирина Соколова', initials: 'ИС', updated: 'сегодня', risk: 'none' },\n  { id: 4, title: 'Интеграция с 1С', company: 'ГК «Гранит-Девелопмент»', amount: 620000, stage: 'Квалификация', owner: 'Анна Пирогова', initials: 'АП', updated: '5 дней назад', risk: 'stuck' },\n  { id: 5, title: 'Продление лицензии на 2027', company: 'СЗ «Дом на Каменной»', amount: 1900000, stage: 'Оплата', owner: 'Дмитрий Ким', initials: 'ДК', updated: 'вчера', risk: 'none' },\n  { id: 6, title: 'Каталог для второй очереди', company: 'СЗ «Речной парк»', amount: 540000, stage: 'Демо', owner: 'Анна Пирогова', initials: 'АП', updated: '3 дня назад', risk: 'none' },\n  { id: 7, title: 'Модуль ипотечных заявок', company: 'ГК «Восток-Строй»', amount: 1250000, stage: 'Коммерческое', owner: 'Ирина Соколова', initials: 'ИС', updated: '4 дня назад', risk: 'stuck' },\n  { id: 8, title: 'Обучение отдела продаж', company: 'СЗ «Дом на Каменной»', amount: 300000, stage: 'Договор', owner: 'Дмитрий Ким', initials: 'ДК', updated: 'сегодня', risk: 'none' },\n]\n\nexport const managers = ['Все менеджеры', 'Ирина Соколова', 'Дмитрий Ким', 'Анна Пирогова']\n\nexport const stageNames = [\n  'Квалификация',\n  'Демо',\n  'Коммерческое',\n  'Договор',\n  'Оплата',\n  'Внедрение',\n]\n\n/** Помесячная воронка для отчёта: закрыто против плана. */\nexport const monthly = [\n  { month: 'Апр', closed: 3.1, plan: 4 },\n  { month: 'Май', closed: 4.4, plan: 4 },\n  { month: 'Июн', closed: 2.8, plan: 4.5 },\n  { month: 'Июл', closed: 5.2, plan: 4.5 },\n  { month: 'Авг', closed: 3.9, plan: 5 },\n  { month: 'Сен', closed: 4.8, plan: 5 },\n]\n\n/** Сколько сделок стоит на каждой стадии — для отчёта и канбана. */\nexport const funnel = [\n  { stage: 'Квалификация', count: 12, amount: 6.4 },\n  { stage: 'Демо', count: 9, amount: 5.1 },\n  { stage: 'Коммерческое', count: 6, amount: 4.2 },\n  { stage: 'Договор', count: 4, amount: 3.3 },\n  { stage: 'Оплата', count: 2, amount: 2.2 },\n]\n\nexport const reportMetrics = [\n  { title: 'Выручка за квартал', value: '13,9 млн ₽', hint: 'план 14,0 млн', delta: '+18 % к прошлому' },\n  { title: 'Сделок закрыто', value: '11', hint: 'из 33 в работе', delta: '+2 к прошлому' },\n  { title: 'Средний чек', value: '1,26 млн ₽', hint: 'по закрытым сделкам', delta: '−4 % к прошлому' },\n  { title: 'Цикл сделки', value: '47 дней', hint: 'от заявки до оплаты', delta: '−6 дней' },\n]\n\n/** Карточка контакта: главный человек со стороны застройщика. */\nexport const contact = {\n  name: 'Павел Дорохов',\n  initials: 'ПД',\n  role: 'Директор по продажам',\n  company: 'ГК «Гранит-Девелопмент»',\n  phone: '+7 916 000-14-88',\n  email: 'p.dorokhov@granit-dev.example',\n  city: 'Москва',\n  since: 'в базе с марта 2025',\n  channel: 'Предпочитает почту, звонки после 15:00',\n}\n\nexport const contactDeals = [\n  { id: 1, title: 'Северный квартал — платформа продаж', amount: '2 400 000 ₽', stage: 'Договор' },\n  { id: 4, title: 'Интеграция с 1С', amount: '620 000 ₽', stage: 'Квалификация' },\n  { id: 9, title: 'Пилот на одном ЖК (2025)', amount: '390 000 ₽', stage: 'Закрыта' },\n]\n"
    }
  ]
}
