/* lk-content-widgets.jsx — пилот виджетизации контента зон (кросс-зонное перемещение).
   Контент-карты (KPI и т.п.) как ПОРТИРУЕМЫЕ виджеты WidgetRegistry: рендерит ops-field,
   значит для них уже работает cross-container DnD — их можно таскать между зонами и в поле,
   в отличие от bespoke-JSX внутри зон (те двигает lk-arrange только внутри своей зоны).

   Грузится после widget-registry. Ничего не ломает: только добавляет виджеты в каталог. */
(function () {
  const R = window.React;
  const K = window.WorkspaceKit;
  const Reg = window.WidgetRegistry;
  if (!R || !K || !Reg || !K.MetricStack) return;

  /* fn.items — движок поля читает первую метрику, чтобы покрасить ЕДИНСТВЕННЫЙ
     глиф карточки (в заголовке) в тон состояния. Второй плашки в теле нет. */
  const M = (items) => {
    const fn = ({ tier }) => R.createElement(K.MetricStack, { items, ch: tier === 0 ? 120 : 170 });
    fn.items = items;
    return fn;
  };

  /* Этапы — последовательность, а не список: пройденные закрашены, текущий
     выделен акцентом, будущие контуром. Плоский «label → 100%» не отвечал на
     вопрос «где мы сейчас». steps: [{ t, pct }] — pct 100 = пройден. */
  const S = (head, steps) => {
    const fn = ({ tier }) => {
      const cur = steps.findIndex((x) => x.pct > 0 && x.pct < 100);
      const done = steps.filter((x) => x.pct >= 100).length;
      return R.createElement('div', { className: 'lkc-steps' },
        R.createElement('div', { className: 'lkc-steps-head' },
          R.createElement('b', null, done + ' / ' + steps.length),
          R.createElement('span', null, head)),
        R.createElement('ol', { className: 'lkc-steps-list' + (tier === 0 ? ' is-dense' : '') },
          steps.map((st, i) => {
            const state = st.pct >= 100 ? 'done' : (i === cur ? 'now' : 'next');
            return R.createElement('li', { key: i, className: 'lkc-step is-' + state },
              R.createElement('span', { className: 'lkc-step-dot', 'aria-hidden': 'true' },
                state === 'done' ? R.createElement(window.Ic, { n: 'check', s: 11, sw: 3 }) : null),
              R.createElement('span', { className: 'lkc-step-t' }, st.t),
              R.createElement('span', { className: 'lkc-step-v' },
                state === 'done' ? 'готов' : (state === 'now' ? st.pct + '%' : '—')),
              state === 'now'
                ? R.createElement('span', { className: 'lkc-step-bar', 'aria-hidden': 'true' },
                    R.createElement('i', { style: { width: st.pct + '%' } }))
                : null);
          })));
    };
    fn.items = [{ v: steps.filter((x) => x.pct >= 100).length + ' / ' + steps.length, sub: head }];
    return fn;
  };

  /* портируемые контент-карты (значения — как в зоне «Сегодня» менеджера) */
  const CARDS = {
    'm-receivables': {
      title: 'Дебиторка к действию', icon: 'wallet', cat: 'Продажи',
      render: M([{ v: 3, sub: 'дожать / выставить', delta: { v: '+540к ₽', dir: 'up' } }]),
    },
    'm-pipeline': {
      title: 'Пайплайн', icon: 'trending-up', cat: 'Продажи',
      render: M([{ v: '28,58', unit: 'млн ₽', sub: 'активные сделки', delta: { v: '+2.4 млн', dir: 'up' } },
        { label: 'план', v: '30 млн ₽' }]),
    },
    'm-foreman-estimate': {
      title: 'Смета у прораба >48ч', icon: 'clock-alert', cat: 'Продажи',
      render: M([{ v: 1, sub: 'нужен пинг', delta: { v: '-2', dir: 'down', good: true } }]),
    },
    'm-hot-sla': {
      title: 'Горящие SLA', icon: 'flame', cat: 'Продажи',
      render: M([{ v: 2, sub: 'лид + follow-up просрочены', delta: { v: '+1', dir: 'up', good: false } }]),
    },
    /* карты зоны «Продажи» */
    's-funnel': {
      title: 'Воронка', icon: 'filter', cat: 'Продажи',
      render: M([{ v: 18, sub: 'лидов в воронке' }, { label: 'Замеры', v: 11 }, { label: 'Сметы', v: 7 }, { label: 'Договоры', v: 3 }]),
    },
    's-deals': {
      title: 'Сделки', icon: 'handshake', cat: 'Продажи',
      render: M([{ v: 7, sub: 'сделок в работе' }, { label: '—', v: '3,2 млн' }, { label: '—', v: '2,1 млн' }]),
    },
    's-inbox': {
      title: 'Входящие сметы', icon: 'inbox', cat: 'Продажи',
      render: M([{ v: 6, sub: 'входящих смет' }, { label: 'Нужен замер', v: 1 }, { label: 'У прораба', v: 2 }, { label: 'Готовится', v: 1 }]),
    },
    's-forecast': {
      title: 'Прогноз', icon: 'target', cat: 'Продажи',
      render: M([{ v: '30', unit: '%', sub: 'план менеджера' }, { label: 'Прогноз', v: '1,2 / 4 млн ₽' }]),
    },
    's-receivables': {
      title: 'Дебиторка', icon: 'wallet', cat: 'Продажи',
      render: M([{ v: 3, sub: 'в дебиторке' }, { label: '—', v: '1,6 млн' }, { label: '—', v: '0,9 млн' }]),
    },
    /* карты зоны «Клиенты и handoff» */
    'c-clients': {
      title: 'Клиенты', icon: 'users', cat: 'Клиенты',
      render: M([{ v: 3, sub: 'активных клиентов' }, { label: '—', v: '4,98 млн' }, { label: '—', v: '3,2 млн' }]),
    },
    'c-handoff': {
      title: 'Handoff', icon: 'clipboard-check', cat: 'Клиенты',
      render: M([{ v: '6/8', sub: 'чек-лист передачи' }, { label: 'Договор', v: '✓' }, { label: 'Предоплата', v: '✓' }, { label: 'Смета', v: '✓' }]),
    },
    /* карты зоны «Календарь» (сетка упрощена до списка событий) */
    'c-week': {
      title: 'Неделя', icon: 'calendar', cat: 'Клиенты',
      render: M([{ v: 5, sub: 'событий на неделе' }, { label: 'Пн 14:30', v: 'Замер' }, { label: 'Вт 10:00', v: 'Встреча' }]),
    },
    'c-events': {
      title: 'Ближайшие события', icon: 'calendar-clock', cat: 'Клиенты',
      render: M([{ v: 5, sub: 'ближайших' }, { label: 'Пн · Замер', v: '—' }, { label: 'Ср · Монтаж', v: '—' }]),
    },
    /* карты бухгалтера (зоны dash/queue/registry/close) */
    'a-finq': { title: 'Очередь финконтроля', icon: 'list-checks', cat: 'Финансы',
      render: M([{ v: 5, sub: 'в очереди' }, { label: 'Подтвердить оплату', v: 'INV-042' }]) },
    'a-ar': { title: 'Дебиторка · AR-aging', icon: 'wallet', cat: 'Финансы',
      render: M([{ v: '8,57', unit: 'млн ₽', sub: 'дебиторка' }, { label: 'Текущая', v: '4,2 млн' }, { label: '>30 дн', v: '2,1 млн' }]) },
    'a-ap': { title: 'Кредиторка · AP', icon: 'credit-card', cat: 'Финансы',
      render: M([{ v: '159,2', unit: 'к ₽', sub: 'кредиторка' }, { label: 'КерамаСтиль', v: 'PO-130' }]) },
    'a-payments': { title: 'Платежи к подтверждению', icon: 'banknote', cat: 'Финансы',
      render: M([{ v: 3, sub: 'платежей' }, { label: 'INV-2026-042', v: '1,6 млн' }]) },
    'a-docs': { title: 'Документы к верификации', icon: 'file-check', cat: 'Финансы',
      render: M([{ v: 2, sub: 'документов' }, { label: 'УПД керамогранит', v: 'проверить' }]) },
    'a-projects': { title: 'Проекты', icon: 'folder-kanban', cat: 'Финансы',
      render: M([{ v: 3, sub: 'активных' }, { label: '—', v: 'оплачено' }]) },
    'a-periods': { title: 'Периоды по проектам', icon: 'calendar-range', cat: 'Финансы',
      render: M([{ v: 2, sub: 'открыто' }, { label: '—', v: 'закрыть' }]) },
  };

  /* Производственный контур: прораб и исполнитель. Сложные интерактивные
     таблицы, kanban и чаты остаются цельными zone-* виджетами. */
  Object.assign(CARDS, {
    'f-objects-active': { title: 'Объекты в работе', icon: 'folder-kanban', cat: 'Производство',
      render: M([{ v: 4, sub: 'объекта в работе' }, { label: 'На финише', v: 2 }]) },
    'f-submits-pending': { title: 'Задачи на приёмке', icon: 'clipboard-check', cat: 'Производство',
      render: M([{ v: 6, sub: 'ждут решения' }, { label: 'Критичные', v: 1 }]) },
    'f-submits-overdue': { title: 'Просроченные submit', icon: 'clock-alert', cat: 'Производство',
      render: M([{ v: 2, sub: '>24 ч без решения' }]) },
    'f-materials-missing': { title: 'Материал не на объекте', icon: 'package-x', cat: 'Производство',
      render: M([{ v: 3, sub: 'старт работ под угрозой' }]) },
    'f-smart-queue': { title: 'Требует внимания', icon: 'siren', cat: 'Производство',
      render: M([{ v: 3, sub: 'сигнала' }, { label: 'Пресс-тест', v: 'приёмка' }, { label: 'Керамогранит', v: 'не на объекте' }, { label: 'Электрика', v: 'gate' }]) },
    'f-objects-glance': { title: 'Мои объекты', icon: 'building-2', cat: 'Производство',
      render: M([{ v: 4, sub: 'объекта' }, { label: '—', v: '72%' }, { label: '—', v: '88%' }]) },
    'f-crew-glance': { title: 'Бригада', icon: 'users-round', cat: 'Команда',
      render: M([{ v: 7, sub: 'исполнителей' }, { label: '—', v: '3 задачи' }, { label: '—', v: '2 задачи' }]) },
    'f-inbox-estimates': { title: 'Входящие сметы', icon: 'inbox', cat: 'Производство',
      render: M([{ v: 2, sub: 'сметы' }, { label: '—', v: '2,3 млн ₽' }, { label: '—', v: '2,6 млн ₽' }]) },
    'f-approvals-queue': { title: 'Очередь приёмки', icon: 'list-checks', cat: 'Производство',
      render: M([{ v: 2, sub: 'на проверке' }, { label: 'Заливка стяжки', v: '1 пункт' }, { label: 'Пресс-тест', v: '2 пункта' }]) },
    'f-team-roster': { title: 'Состав бригады', icon: 'users', cat: 'Команда',
      render: M([{ v: 7, sub: 'человек' }, { label: '—', v: '3 задачи' }, { label: '—', v: '2 задачи' }]) },
    'f-alerts-feed': { title: 'Алерты', icon: 'triangle-alert', cat: 'Производство',
      render: M([{ v: 3, sub: 'активных' }, { label: 'Керамогранит', v: 'критично' }, { label: 'Пресс-тест', v: 'критично' }]) },

    'e-tasks-today': { title: 'Задачи сегодня', icon: 'list-checks', cat: 'Производство',
      render: M([{ v: 3, sub: 'задачи' }, { label: 'Готова к сдаче', v: 1 }]) },
    'e-hours-week': { title: 'Часы: факт / план', icon: 'clock-3', cat: 'Производство',
      render: M([{ v: '17 / 46', unit: 'ч', sub: 'эта неделя' }]) },
    'e-returns-kpi': { title: 'Возврат на доработку', icon: 'undo-2', cat: 'Производство',
      render: M([{ v: 1, sub: 'нужно исправить' }]) },
    'e-quality-score': { title: 'Оценка качества', icon: 'star', cat: 'Производство',
      render: M([{ v: '4,7', sub: 'оценка прораба · 30 дней' }]) },
    'e-smart-queue': { title: 'Требует внимания', icon: 'siren', cat: 'Производство',
      render: M([{ v: 3, sub: 'действия' }, { label: 'Покраска', v: 'возврат' }, { label: 'Стяжка', v: 'нет фото' }, { label: 'Плитка', v: 'ack' }]) },
    'e-today-list': { title: 'Задачи на сегодня', icon: 'calendar-check', cat: 'Производство',
      render: M([{ v: 3, sub: 'в плане' }, { label: 'Стяжка · гостиная', v: '70%' }, { label: 'Грунтование · кухня', v: '100%' }]) },
    'e-tasks-all': { title: 'Все задачи', icon: 'rows-3', cat: 'Производство',
      render: M([{ v: 7, sub: 'активных' }, { label: 'Стяжка', v: 'в работе' }, { label: 'Плитка', v: 'заблокировано' }]) },
    'e-review-pending': { title: 'У прораба', icon: 'clipboard-clock', cat: 'Производство',
      render: M([{ v: 2, sub: 'на проверке' }, { label: 'Пресс-тест', v: '40 мин' }, { label: 'Потолки', v: 'вчера' }]) },
    'e-returns-queue': { title: 'На доработке', icon: 'rotate-ccw', cat: 'Производство',
      render: M([{ v: 1, sub: 'задача' }, { label: 'Покраска спальни', v: '2 замечания' }]) },
    'e-timesheet': { title: 'Смены', icon: 'calendar-days', cat: 'Производство',
      render: M([{ v: 164, unit: 'ч', sub: 'за месяц' }, { label: 'Смен', v: '21 / 22' }, { label: 'Объектов', v: 3 }]) },
    'e-docs-list': { title: 'Документы раздела', icon: 'files', cat: 'Производство',
      render: M([{ v: 3, sub: 'документа' }, { label: 'Инструкция штробление', v: 'PDF' }, { label: 'Схема щита', v: 'PNG' }]) },
    'e-object-summary': { title: '—', icon: 'building', cat: 'Производство',
      render: M([{ v: 3, sub: 'активные задачи' }, { label: 'Объект', v: '—' }, { label: 'Прораб', v: '—' }]) },
  });

  /* Дизайнер и клиент. Формы, материалы, лента и чат остаются цельными:
     у них связанное состояние, bulk-действия и drawers. */
  Object.assign(CARDS, {
    'd-projects-kpi': { title: 'Проекты с ДП', icon: 'folder-kanban', cat: 'Клиенты',
      render: M([{ v: 3, sub: 'активных проекта' }]) },
    'd-approvals-kpi': { title: 'Ждут согласования', icon: 'stamp', cat: 'Клиенты',
      render: M([{ v: 5, sub: 'этапы и интерьер' }]) },
    'd-completeness-kpi': { title: 'Укомплектованность', icon: 'circle-gauge', cat: 'Клиенты',
      render: M([{ v: 78, unit: '%', sub: 'средняя по ДП' }]) },
    'd-client-wait-kpi': { title: 'Ждут клиента', icon: 'user-round-clock', cat: 'Клиенты',
      render: M([{ v: 2, sub: 'пресеты и замены' }]) },
    'd-smart-queue': { title: 'Требует внимания', icon: 'list-checks', cat: 'Клиенты',
      render: M([{ v: 3, sub: 'вопроса' }, { label: 'Тёплый пол', v: 'срочно' }, { label: 'Смеситель', v: 'не выбран' }, { label: 'Замена пола', v: 'согласовать' }]) },
    'd-projects-chart': { title: 'Прогресс дизайн-проектов', icon: 'chart-no-axes-column', cat: 'Клиенты',
      render: M([{ v: 3, sub: 'проекта' }, { label: 'ДП v2', v: '82%' }, { label: 'ДП v1', v: '64%' }, { label: 'ДП v3', v: '90%' }]) },
    'd-projects-cards': { title: 'Проекты', icon: 'panels-top-left', cat: 'Клиенты',
      render: M([{ v: 3, sub: 'в работе' }, { label: '—', v: '82%' }, { label: '—', v: '64%' }]) },
    'd-approvals': { title: 'Согласования', icon: 'badge-check', cat: 'Клиенты',
      render: M([{ v: 3, sub: 'позиции' }, { label: 'Развёртка стен', v: 'в работе' }, { label: 'Пресет санузла', v: 'ждёт клиента' }]) },
    'd-completeness': { title: 'Комплектность ДП', icon: 'table-properties', cat: 'Клиенты',
      render: M([{ v: 4, sub: 'помещения' }, { label: 'Гостиная', v: '67%' }, { label: 'Кухня', v: '33%' }, { label: 'Санузел', v: '79%' }]) },
    'd-specs-table': { title: 'Спецификации', icon: 'sheet', cat: 'Клиенты',
      render: M([{ v: 3, sub: 'ключевые позиции' }, { label: 'Керамогранит 60×60', v: 'согласован' }, { label: 'Смеситель', v: 'не выбран' }]) },
    'd-presets-grid': { title: 'Интерьерные пресеты', icon: 'swatch-book', cat: 'Клиенты',
      render: M([{ v: 4, sub: 'пресета' }, { label: 'Санузел · лофт', v: '12 поз.' }, { label: 'Кухня · сканди', v: '18 поз.' }]) },
    'd-docs-list': { title: 'Документы дизайнера', icon: 'files', cat: 'Клиенты',
      render: M([{ v: 3, sub: 'документа' }, { label: 'ДП санузел v3', v: 'PDF' }, { label: 'Спецификация плитки', v: 'XLSX' }]) },

    'cl-hero': { title: 'Статус проекта', icon: 'home', cat: 'Клиенты',
      render: M([{ v: 72, unit: '%', sub: 'чистовая отделка' }, { label: 'Бригада', v: '4 человека' }, { label: 'До сдачи', v: '12 дней' }]) },
    'cl-action': { title: 'Требуется действие', icon: 'bell-ring', cat: 'Клиенты',
      render: M([{ v: 2, sub: 'решения' }, { label: 'Акт черновой', v: 'подписать' }, { label: 'Этап 2', v: '1,6 млн ₽' }]) },
    'cl-paid-kpi': { title: 'Оплачено', icon: 'wallet-cards', cat: 'Финансы',
      render: M([{ v: '3,6 / 5,4', unit: 'млн ₽', sub: '67% бюджета' }]) },
    'cl-stages-kpi': { title: 'Этапы закрыты', icon: 'milestone', cat: 'Производство',
      render: M([{ v: '2 / 4', sub: 'третий в работе' }]) },
    'cl-deadline-kpi': { title: 'До сдачи', icon: 'calendar-clock', cat: 'Производство',
      render: M([{ v: 12, unit: 'дн', sub: 'сдача 28 июня' }]) },
    'cl-doc-sign-kpi': { title: 'Документ на подпись', icon: 'file-signature', cat: 'Клиенты',
      render: M([{ v: 1, sub: 'акт черновой' }]) },
    'cl-stages-widget': { title: 'Этапы ремонта', icon: 'route', cat: 'Производство',
      render: S('этапа закрыто', [{ t: 'Демонтаж', pct: 100 }, { t: 'Черновая', pct: 100 }, { t: 'Чистовая', pct: 72 }, { t: 'Сдача', pct: 0 }]) },
    'cl-feed-widget': { title: 'Последние события', icon: 'activity', cat: 'Клиенты',
      render: M([{ v: 3, sub: 'события' }, { label: 'Плитка доставлена', v: 'сегодня' }, { label: 'Пресет согласован', v: 'вчера' }]) },
    'cl-design-zones': { title: 'Дизайн-проект по помещениям', icon: 'layout-template', cat: 'Клиенты',
      render: M([{ v: 4, sub: 'помещения' }, { label: 'Санузел', v: 'согласован' }, { label: 'Кухня', v: 'на согласовании' }]) },
    'cl-stages-roadmap': { title: 'Дорожная карта проекта', icon: 'map', cat: 'Производство',
      render: S('этапа закрыто', [{ t: 'Демонтаж', pct: 100 }, { t: 'Черновая отделка', pct: 100 }, { t: 'Чистовая отделка', pct: 72 }, { t: 'Приёмка и сдача', pct: 0 }]) },
    'cl-gallery-grid': { title: 'Фото по этапам', icon: 'images', cat: 'Клиенты',
      render: M([{ v: 39, sub: 'фотографий' }, { label: 'Демонтаж', v: 8 }, { label: 'Черновая электрика', v: 14 }, { label: 'Плитка', v: 17 }]) },
    'cl-docs-hub': { title: 'Документы', icon: 'files', cat: 'Клиенты',
      render: M([{ v: 3, sub: 'документа' }, { label: 'Договор №47-2026', v: 'подписан' }, { label: 'Акт черновой', v: 'на подпись' }]) },
    'cl-payments-schedule': { title: 'График платежей', icon: 'calendar-range', cat: 'Финансы',
      render: M([{ v: 3, sub: 'платежа' }, { label: 'Аванс', v: '1,2 млн ₽' }, { label: 'Черновая', v: '1,6 млн ₽' }]) },
    'cl-payments-spent': { title: 'Освоено', icon: 'circle-gauge', cat: 'Финансы',
      render: M([{ v: 67, unit: '%', sub: 'оплачено 3,6 млн ₽' }]) },
    'cl-approvals': { title: 'Согласования', icon: 'badge-check', cat: 'Клиенты',
      render: M([{ v: 4, sub: 'позиции' }, { label: 'Смета v2', v: 'согласовано' }, { label: 'Акт черновой', v: 'ожидает' }]) },
  });

  /* Закупки, People Ops и Super. На dashboard переносим отдельные сигналы;
     транзакционные очереди и drawer-сценарии переносятся цельной зоной. */
  Object.assign(CARDS, {
    'pr-to-order-kpi': { title: 'К заказу', icon: 'shopping-cart', cat: 'Производство',
      render: M([{ v: 4, sub: 'позиции' }]) },
    'pr-overdue-kpi': { title: 'Просрочено', icon: 'clock-alert', cat: 'Производство',
      render: M([{ v: 1, sub: 'поставка' }]) },
    'pr-blocking-kpi': { title: 'Блокируют работы', icon: 'octagon-alert', cat: 'Производство',
      render: M([{ v: 3, sub: 'позиции' }]) },
    'pr-acceptance-kpi': { title: 'На приёмке', icon: 'package-check', cat: 'Производство',
      render: M([{ v: 1, sub: 'поставка' }]) },
    'pr-smart-queue': { title: 'Что сделать сейчас', icon: 'list-checks', cat: 'Производство',
      render: M([{ v: 2, sub: 'критичных' }, { label: 'Kerlite', v: 'задержка' }, { label: 'Coswick', v: 'риск' }]) },
    'pr-deliveries-today': { title: 'Поставки сегодня', icon: 'truck', cat: 'Производство',
      render: M([{ v: 2, sub: 'слота' }, { label: 'Grohe', v: 'прибыл' }, { label: 'Kerlite', v: '18:00' }]) },
    'pr-completeness': { title: 'Укомплектованность ДП', icon: 'chart-no-axes-column', cat: 'Производство',
      render: M([{ v: 4, sub: 'помещения' }, { label: 'Санузел', v: '25%' }, { label: 'Кухня', v: '70%' }]) },
    'pr-docs-list': { title: 'Документы закупок', icon: 'files', cat: 'Производство',
      render: M([{ v: 3, sub: 'документа' }, { label: 'INV-2026-051', v: 'PDF' }, { label: 'УПД', v: 'проверить' }]) },

    'pe-active-kpi': { title: 'Активные исполнители', icon: 'users', cat: 'Команда',
      render: M([{ v: 42, sub: 'в штате и на объектах' }]) },
    'pe-load-kpi': { title: 'Средняя загрузка', icon: 'gauge', cat: 'Команда',
      render: M([{ v: 78, unit: '%', sub: 'по команде' }]) },
    'pe-skill-gaps-kpi': { title: 'Дефицит навыков', icon: 'badge-alert', cat: 'Команда',
      render: M([{ v: 2, sub: 'профиля' }]) },
    'pe-docs-risk-kpi': { title: 'Документы под риском', icon: 'file-warning', cat: 'Команда',
      render: M([{ v: 3, sub: 'требуют обновления' }]) },
    'pe-onboard-kpi': { title: 'На онбординге', icon: 'user-round-plus', cat: 'Команда',
      render: M([{ v: 2, sub: 'человека' }]) },
    'pe-risk-kpi': { title: 'Высокий риск', icon: 'triangle-alert', cat: 'Команда',
      render: M([{ v: 1, sub: 'исполнитель' }]) },
    'pe-accounts-kpi': { title: 'Аккаунты', icon: 'key-round', cat: 'Команда',
      render: M([{ v: 39, sub: 'активных' }]) },
    'pe-smart-queue': { title: 'Требует внимания', icon: 'list-checks', cat: 'Команда',
      render: M([{ v: 3, sub: 'действия' }, { label: 'Документы', v: 'критично' }, { label: 'Назначение', v: 'skill gap' }]) },
    'pe-quality-chart': { title: 'Качество команды', icon: 'chart-no-axes-column', cat: 'Команда',
      render: M([{ v: 94, sub: 'лучший score' }, { label: '—', v: 94 }, { label: '—', v: 61 }]) },
    'pe-availability-week': { title: 'Доступность на неделю', icon: 'calendar-days', cat: 'Команда',
      render: M([{ v: 8, sub: 'доступны' }, { label: 'Назначены', v: 21 }, { label: 'Отпуск', v: 2 }]) },
    'pe-availability-table': { title: 'Доступность', icon: 'calendar-range', cat: 'Команда',
      render: M([{ v: 31, sub: 'исполнитель' }, { label: 'Назначены', v: 21 }, { label: 'Доступны', v: 8 }]) },
    'pe-performance-rank': { title: 'Рейтинг', icon: 'trophy', cat: 'Команда',
      render: M([{ v: 94, sub: 'лучший результат' }, { label: '—', v: 94 }, { label: '—', v: 61 }]) },
    'pe-docs-alerts': { title: 'Документы', icon: 'file-warning', cat: 'Команда',
      render: M([{ v: 2, sub: 'проблемы' }, { label: '—', v: '5 дней' }, { label: '—', v: 'нет' }]) },
    'pe-onboarding-queue': { title: 'Онбординг', icon: 'user-round-check', cat: 'Команда',
      render: M([{ v: 2, sub: 'в процессе' }, { label: '—', v: '40%' }, { label: 'Ким', v: '75%' }]) },
    'pe-activity-feed': { title: 'Лента People Ops', icon: 'activity', cat: 'Команда',
      render: M([{ v: 3, sub: 'события' }, { label: 'Онбординг', v: 'завершён' }, { label: 'Документ', v: 'истекает' }]) },
    'pe-skills-matrix': { title: 'Матрица навыков', icon: 'grid-3x3', cat: 'Команда',
      render: M([{ v: 12, sub: 'специализаций' }, { label: 'Электрика', v: 'ур. 3' }, { label: 'Плитка', v: 'ур. 3' }]) },
    'pe-returns-open': { title: 'Возвраты', icon: 'undo-2', cat: 'Команда',
      render: M([{ v: 2, sub: 'открытых' }, { label: '—', v: '2 дня' }, { label: '—', v: '1 день' }]) },
    'pe-rates-table': { title: 'Ставки', icon: 'badge-dollar-sign', cat: 'Команда',
      render: M([{ v: 8, sub: 'видов работ' }, { label: 'Плитка', v: '1200–1600 ₽' }, { label: 'Электрика', v: '450–600 ₽' }]) },

    'su-ar-kpi': { title: 'Дебиторка', icon: 'wallet', cat: 'Финансы',
      render: M([{ v: '8,6', unit: 'млн ₽', sub: 'AR' }]) },
    'su-critical-kpi': { title: 'Критичные сигналы', icon: 'siren', cat: 'Операционный центр',
      render: M([{ v: 3, sub: 'требуют решения' }]) },
    'su-doc-debt-kpi': { title: 'Долг по документам', icon: 'file-warning', cat: 'Операционный центр',
      render: M([{ v: 5, sub: 'документов' }]) },
    'su-gates-kpi': { title: 'Зависшие gate', icon: 'git-pull-request-closed', cat: 'Операционный центр',
      render: M([{ v: 3, sub: 'процесса' }]) },
    'su-attention': { title: 'Требует внимания', icon: 'list-checks', cat: 'Операционный центр',
      render: M([{ v: 3, sub: 'исключения' }, { label: 'KSH-047', v: 'спор' }, { label: 'KSH-044', v: 'поставка' }]) },
    'su-ar-mini': { title: 'AR · мини', icon: 'chart-pie', cat: 'Финансы',
      render: M([{ v: '8,57', unit: 'млн ₽', sub: 'дебиторка' }, { label: '>30 дней', v: '2,1 млн ₽' }]) },
    'su-managers': { title: 'Лидерборд менеджеров', icon: 'ranking', cat: 'Продажи',
      render: M([{ v: 3, sub: 'менеджера' }, { label: '—', v: '112%' }, { label: '—', v: '96%' }]) },
    'su-documents': { title: 'Очередь документов', icon: 'files', cat: 'Операционный центр',
      render: M([{ v: 6, sub: 'документов' }, { label: 'На проверке', v: 2 }, { label: 'Отклонены', v: 1 }]) },
  });

  Object.keys(CARDS).forEach((id) => {
    const c = CARDS[id];
    Reg.define(id, {
      title: c.title, icon: c.icon, cat: c.cat,
      defaults: { cols: 2, minCols: 1, maxCols: 6, height: 'auto' },
      behaviors: { drag: true, resize: true, color: true, expand: true },
      render: c.render,
      metrics: () => [{ v: c.title, sub: 'карта' }],
    });
  });

  /* Smart queue — портируемый виджет (статичный порт контента зоны «Сегодня»);
     действия зовут ctx.openDeal, если он проброшен. Широкий: дефолт 4 колонки. */
  const QUEUE = [
    { who: '—', deal: 'D-405', tag: 'urgent', sum: '2.7 млн ₽', act: 'Позвонить' },
    { who: '—', deal: 'D-403', tag: 'просрочено', sum: '1.9 млн ₽', act: 'Follow-up' },
    { who: '—', deal: 'D-401', tag: 'hot', sum: '3.2 млн ₽', act: 'Позвонить' },
    { who: '—', deal: 'D-402', tag: 'commit', sum: '4.1 млн ₽', act: 'Согласовать' },
  ];
  const el = R.createElement;
  Reg.define('m-smart-queue', {
    title: 'Smart queue · Next Best Action', icon: 'list-checks', cat: 'Продажи',
    defaults: { cols: 4, minCols: 2, maxCols: 6, height: 'auto' },
    behaviors: { drag: true, resize: true, color: true, expand: true },
    metrics: () => [{ v: QUEUE.length, sub: 'горящих' }],
    render: ({ ctx }) => el('div', { className: 'lkc-queue' },
      QUEUE.map((r, i) => el('div', { className: 'lkc-queue-row', key: i },
        el('div', { className: 'lkc-queue-main' },
          el('div', { className: 'lkc-queue-who' }, r.who),
          el('div', { className: 'lkc-queue-meta' }, r.deal + ' · ' + r.tag)),
        el('div', { className: 'lkc-queue-sum' }, r.sum),
        el('button', {
          className: 'lkc-queue-act', type: 'button',
          onClick: () => { if (ctx && ctx.openDeal) ctx.openDeal(r.deal); },
        }, r.act)))),
  });

  /* Зоны рендерятся группами портируемых виджетов вместо единого embed.
     Старые localStorage-раскладки мигрирует lk-field-config при загрузке. */
  window.LK_WIDGET_ZONES = window.LK_WIDGET_ZONES || {};
  window.LK_WIDGET_ZONES.manager = Object.assign({}, window.LK_WIDGET_ZONES.manager, {
    today: [
      { wid: 'm-receivables', cols: 2 }, { wid: 'm-pipeline', cols: 2 },
      { wid: 'm-foreman-estimate', cols: 2 }, { wid: 'm-hot-sla', cols: 2 },
      { wid: 'm-smart-queue', cols: 6 },
    ],
    sales: [
      { wid: 's-funnel', cols: 2 }, { wid: 's-deals', cols: 2 }, { wid: 's-inbox', cols: 2 },
      { wid: 's-forecast', cols: 3 }, { wid: 's-receivables', cols: 3 },
    ],
    clients: [{ wid: 'c-clients', cols: 3 }, { wid: 'c-handoff', cols: 3 }],
    calendar: [{ wid: 'c-week', cols: 3 }, { wid: 'c-events', cols: 3 }],
  });
  window.LK_WIDGET_ZONES.accountant = Object.assign({}, window.LK_WIDGET_ZONES.accountant, {
    dash: [
      { wid: 'a-finq', cols: 2 }, { wid: 'a-ar', cols: 2 }, { wid: 'a-ap', cols: 2 },
    ],
    queue: [{ wid: 'a-payments', cols: 3 }, { wid: 'a-docs', cols: 3 }],
    registry: [{ wid: 'a-projects', cols: 6 }],
    close: [{ wid: 'a-periods', cols: 6 }],
  });
  window.LK_WIDGET_ZONES.foreman = Object.assign({}, window.LK_WIDGET_ZONES.foreman, {
    dash: [
      { wid: 'f-objects-active', cols: 2 }, { wid: 'f-submits-pending', cols: 2 },
      { wid: 'f-submits-overdue', cols: 2 }, { wid: 'f-materials-missing', cols: 2 },
      { wid: 'f-smart-queue', cols: 4 }, { wid: 'f-objects-glance', cols: 3 },
      { wid: 'f-crew-glance', cols: 3 },
    ],
    inbox: [{ wid: 'f-inbox-estimates', cols: 6 }],
    approvals: [{ wid: 'f-approvals-queue', cols: 6 }],
    team: [{ wid: 'f-team-roster', cols: 6 }],
    alerts: [{ wid: 'f-alerts-feed', cols: 6 }],
  });
  window.LK_WIDGET_ZONES.executor = Object.assign({}, window.LK_WIDGET_ZONES.executor, {
    today: [
      { wid: 'e-tasks-today', cols: 2 }, { wid: 'e-hours-week', cols: 2 },
      { wid: 'e-returns-kpi', cols: 2 }, { wid: 'e-quality-score', cols: 2 },
      { wid: 'e-smart-queue', cols: 4 }, { wid: 'e-today-list', cols: 6 },
    ],
    tasks: [{ wid: 'e-tasks-all', cols: 6 }],
    review: [{ wid: 'e-review-pending', cols: 6 }],
    returns: [{ wid: 'e-returns-queue', cols: 6 }],
    timesheet: [{ wid: 'e-timesheet', cols: 6 }],
    docs: [{ wid: 'e-docs-list', cols: 6 }],
    object: [{ wid: 'e-object-summary', cols: 6 }],
  });
  window.LK_WIDGET_ZONES.designer = Object.assign({}, window.LK_WIDGET_ZONES.designer, {
    queue: [
      { wid: 'd-projects-kpi', cols: 2 }, { wid: 'd-approvals-kpi', cols: 2 },
      { wid: 'd-completeness-kpi', cols: 2 }, { wid: 'd-client-wait-kpi', cols: 2 },
      { wid: 'd-smart-queue', cols: 4 },
    ],
    projects: [{ wid: 'd-projects-chart', cols: 4 }, { wid: 'd-projects-cards', cols: 2 }],
    approvals: [{ wid: 'd-approvals', cols: 6 }],
    completeness: [{ wid: 'd-completeness', cols: 6 }],
    specs: [{ wid: 'd-specs-table', cols: 6 }],
    interior: [{ wid: 'd-presets-grid', cols: 6 }],
    documents: [{ wid: 'd-docs-list', cols: 6 }],
  });
  window.LK_WIDGET_ZONES.client = Object.assign({}, window.LK_WIDGET_ZONES.client, {
    overview: [
      { wid: 'cl-hero', cols: 4 }, { wid: 'cl-action', cols: 2 },
      { wid: 'cl-paid-kpi', cols: 2 }, { wid: 'cl-stages-kpi', cols: 2 },
      { wid: 'cl-deadline-kpi', cols: 2 }, { wid: 'cl-doc-sign-kpi', cols: 2 },
      { wid: 'cl-stages-widget', cols: 3 }, { wid: 'cl-feed-widget', cols: 3 },
    ],
    design: [{ wid: 'cl-design-zones', cols: 6 }],
    stages: [{ wid: 'cl-stages-roadmap', cols: 6 }],
    media: [{ wid: 'cl-gallery-grid', cols: 6 }],
    documents: [{ wid: 'cl-docs-hub', cols: 6 }],
    payments: [{ wid: 'cl-payments-schedule', cols: 3 }, { wid: 'cl-payments-spent', cols: 3 }],
    approvals: [{ wid: 'cl-approvals', cols: 6 }],
  });
  window.LK_WIDGET_ZONES.procurement = Object.assign({}, window.LK_WIDGET_ZONES.procurement, {
    dash: [
      { wid: 'pr-to-order-kpi', cols: 2 }, { wid: 'pr-overdue-kpi', cols: 2 },
      { wid: 'pr-blocking-kpi', cols: 2 }, { wid: 'pr-acceptance-kpi', cols: 2 },
      { wid: 'pr-smart-queue', cols: 4 }, { wid: 'pr-deliveries-today', cols: 3 },
      { wid: 'pr-completeness', cols: 3 },
    ],
    documents: [{ wid: 'pr-docs-list', cols: 6 }],
  });
  window.LK_WIDGET_ZONES.people = Object.assign({}, window.LK_WIDGET_ZONES.people, {
    dash: [
      { wid: 'pe-active-kpi', cols: 2 }, { wid: 'pe-load-kpi', cols: 2 },
      { wid: 'pe-skill-gaps-kpi', cols: 2 }, { wid: 'pe-docs-risk-kpi', cols: 2 },
      { wid: 'pe-onboard-kpi', cols: 2 }, { wid: 'pe-risk-kpi', cols: 2 },
      { wid: 'pe-accounts-kpi', cols: 2 }, { wid: 'pe-smart-queue', cols: 4 },
      { wid: 'pe-quality-chart', cols: 3 }, { wid: 'pe-availability-week', cols: 3 },
    ],
    availability: [{ wid: 'pe-availability-table', cols: 6 }],
    performance: [{ wid: 'pe-performance-rank', cols: 6 }],
    documents: [{ wid: 'pe-docs-alerts', cols: 6 }],
    onboarding: [{ wid: 'pe-onboarding-queue', cols: 6 }],
    activity: [{ wid: 'pe-activity-feed', cols: 6 }],
    skills: [{ wid: 'pe-skills-matrix', cols: 6 }],
    returns: [{ wid: 'pe-returns-open', cols: 6 }],
    rates: [{ wid: 'pe-rates-table', cols: 6 }],
  });
  window.LK_WIDGET_ZONES.super = Object.assign({}, window.LK_WIDGET_ZONES.super, {
    dash: [
      { wid: 'su-ar-kpi', cols: 2 }, { wid: 'su-critical-kpi', cols: 2 },
      { wid: 'su-doc-debt-kpi', cols: 2 }, { wid: 'su-gates-kpi', cols: 2 },
      { wid: 'su-attention', cols: 4 }, { wid: 'su-ar-mini', cols: 3 },
      { wid: 'su-managers', cols: 3 },
    ],
    documents: [{ wid: 'su-documents', cols: 6 }],
  });
})();
