{
 "sdk": {
  "name": "@f1/preset-sheets-core",
  "what": "Один модуль под всеми примерами: разбор книги, отрисовка листа, ввод, выделение, история. Примеры — не двадцать четыре разных продукта, а настройки поверх него.",
  "alias": "/examples/f1/latest/sdk.js",
  "library": "/sdk/f1/latest/sheets-core.js",
  "library_exports": [
   "createSheetsCore",
   "createMockTransport"
  ],
  "files": [
   {
    "file": "/examples/f1/app/assets/labels-CNOWWIim.js",
    "bytes": 328465
   },
   {
    "file": "/examples/f1/app/assets/sheets-core-DPEhuHDt.js",
    "bytes": 1959246
   }
  ],
  "bytes": 2287711,
  "note": "Общий модуль браузер скачивает один раз и держит в кэше: переключение с одной настройки на другую стоит килобайты, а не мегабайты. Именованных вызовов у раздаваемой сборки нет — она собрана как приложение, а не как библиотека, поэтому import { createSheetsCore } отсюда не сделать. Настройка подключается целиком, своим входным файлом. И две настройки на одной странице не уживаются: каждая ищет узел app, а он один. Рядом — только через iframe."
 },
 "production": {
  "what": "Промышленный путь, которым оба редактора уже работают: рядом с вашим сервером живёт менеджер кабинок, он держит настоящее ядро и отдаёт готовую поверхность. Ваше приложение открывает её рамкой. Так это устроено у нас самих.",
  "shape": [
   "Менеджер кабинок запускается на своём порту и знает два ваших адреса: «кто вошёл» (--auth-url) и «отдай файл по номеру» (--attach-url). Своих учётных записей у него нет.",
   "Ваш сервер проксирует его подпутём — например /a4/ и /f1/.",
   "В вашем интерфейсе у файла появляется рамка на этот подпуть."
  ],
  "nginx_required": [
   "proxy_http_version 1.1 и заголовки Upgrade/Connection: без переключения на WebSocket редактор не свяжется с ядром и покажет пустое место",
   "proxy_set_header Cookie: иначе менеджер не узнает вошедшего",
   "proxy_buffering off",
   "client_max_body_size — под ваши файлы",
   "proxy_read_timeout — длинный, сеанс живёт часами"
  ],
  "products": {
   "a4": {
    "editor": "документы DOCX",
    "core": "fastdoc-cli",
    "docs": "https://docs.plantype.ru/a4/webhost/"
   },
   "f1": {
    "editor": "таблицы XLSX",
    "core": "compute_contract_cli",
    "docs": "https://docs.plantype.ru/f1/environments/"
   }
  },
  "note": "Этим путём идут оба продукта. У таблиц есть и второй — лист внутри вашей страницы через SDK, тогда ядро подключается транспортом. У документов второго пути нет: поверхность поднимает сам процессор."
 },
 "about": "Пакеты примеров FastOffice: каждый — работающий проект целиком. Возьмите пакет по адресу из поля package, разложите файлы по путям и сделайте то, что сказано в поле run. У примеров F1 в пакете есть run.html: он открывается прямо в браузере и подтягивает собранные файлы движка с нашего адреса — ни npm, ни сборщик не нужны. Пакеты @f1/* в реестр npm пока не публикуются: первая стабильная версия ещё не вышла. Адрес указан в первой строке run.html одной переменной: сменится домен — правится только она, пути после него прежние.",
 "engine_note": "Поле engine у каждого примера говорит, что считает: дублёр или настоящее ядро. Это не мелочь — стенд показывает устройство встраивания, но не считает.",
 "docs": "https://docs.plantype.ru/start/kit/",
 "mcp": "https://docs.plantype.ru/mcp",
 "count": 24,
 "examples": [
  {
   "id": "minimal",
   "product": "f1",
   "title": "минимальный лист",
   "shows": "сколько строк нужно, чтобы получить работающий лист",
   "files": 7,
   "bytes": 10384,
   "package": "/kit/f1/minimal.json",
   "run": "откройте run.html в браузере — ставить ничего не нужно",
   "engine": "стенд: на месте ядра дублёр, числа в ячейках ничего не значат. Смотреть здесь нужно на объём кода вокруг листа и на способ встраивания. Настоящий пересчёт — в живом примере: https://docs.plantype.ru/f1/demo/",
   "capabilities": [
    "sheet"
   ],
   "integration": "module",
   "sdk_expressible": true
  },
  {
   "id": "ribbon",
   "product": "f1",
   "title": "лист с лентой",
   "shows": "как добавить нашу ленту, если она нужна",
   "files": 7,
   "bytes": 9045,
   "package": "/kit/f1/ribbon.json",
   "run": "откройте run.html в браузере — ставить ничего не нужно",
   "engine": "стенд: на месте ядра дублёр, числа в ячейках ничего не значат. Смотреть здесь нужно на объём кода вокруг листа и на способ встраивания. Настоящий пересчёт — в живом примере: https://docs.plantype.ru/f1/demo/",
   "capabilities": [
    "sheet",
    "ribbon"
   ],
   "integration": "module",
   "sdk_expressible": true
  },
  {
   "id": "embedded",
   "product": "f1",
   "title": "встраивание в чужую страницу",
   "shows": "что будет с ЧУЖОЙ страницей вокруг листа: её шрифт, фон и прокрутка",
   "files": 7,
   "bytes": 11100,
   "package": "/kit/f1/embedded.json",
   "run": "откройте run.html в браузере — ставить ничего не нужно",
   "engine": "стенд: на месте ядра дублёр, числа в ячейках ничего не значат. Смотреть здесь нужно на объём кода вокруг листа и на способ встраивания. Настоящий пересчёт — в живом примере: https://docs.plantype.ru/f1/demo/",
   "capabilities": [
    "sheet",
    "surface-embedding"
   ],
   "integration": "module",
   "sdk_expressible": true
  },
  {
   "id": "stress",
   "product": "f1",
   "title": "миллион строк",
   "shows": "цена трёх жестов на предельной книге — прокрутки, протяжки и МАСШТАБА: кадр p50 и p95 и обращения к ядру числами, а не обещанием",
   "files": 7,
   "bytes": 28572,
   "package": "/kit/f1/stress.json",
   "run": "откройте run.html в браузере — ставить ничего не нужно",
   "engine": "стенд: на месте ядра дублёр, числа в ячейках ничего не значат. Смотреть здесь нужно на объём кода вокруг листа и на способ встраивания. Настоящий пересчёт — в живом примере: https://docs.plantype.ru/f1/demo/",
   "capabilities": [
    "sheet",
    "large-data"
   ],
   "integration": "module",
   "sdk_expressible": false
  },
  {
   "id": "crosshair",
   "product": "f1",
   "title": "перекрестье",
   "shows": "подсветка строки и столбца активной ячейки: выключена по умолчанию и включается свойством",
   "files": 7,
   "bytes": 9565,
   "package": "/kit/f1/crosshair.json",
   "run": "откройте run.html в браузере — ставить ничего не нужно",
   "engine": "стенд: на месте ядра дублёр, числа в ячейках ничего не значат. Смотреть здесь нужно на объём кода вокруг листа и на способ встраивания. Настоящий пересчёт — в живом примере: https://docs.plantype.ru/f1/demo/",
   "capabilities": [
    "sheet"
   ],
   "integration": "module",
   "sdk_expressible": true
  },
  {
   "id": "read-only",
   "product": "f1",
   "title": "только чтение",
   "shows": "книга видна, но не правится: команды серые С ПРИЧИНОЙ, а не спрятаны, и правка не начинается вовсе",
   "files": 7,
   "bytes": 9513,
   "package": "/kit/f1/read-only.json",
   "run": "откройте run.html в браузере — ставить ничего не нужно",
   "engine": "стенд: на месте ядра дублёр, числа в ячейках ничего не значат. Смотреть здесь нужно на объём кода вокруг листа и на способ встраивания. Настоящий пересчёт — в живом примере: https://docs.plantype.ru/f1/demo/",
   "capabilities": [
    "sheet",
    "read-only",
    "refusal-with-reason"
   ],
   "integration": "module",
   "sdk_expressible": true
  },
  {
   "id": "custom-headers",
   "product": "f1",
   "title": "свои заголовки",
   "shows": "подписи строк и столбцов задаёт встраивающий, а ширина полосы считается по ЕГО тексту",
   "files": 7,
   "bytes": 10646,
   "package": "/kit/f1/custom-headers.json",
   "run": "откройте run.html в браузере — ставить ничего не нужно",
   "engine": "стенд: на месте ядра дублёр, числа в ячейках ничего не значат. Смотреть здесь нужно на объём кода вокруг листа и на способ встраивания. Настоящий пересчёт — в живом примере: https://docs.plantype.ru/f1/demo/",
   "capabilities": [
    "sheet"
   ],
   "integration": "module",
   "sdk_expressible": true
  },
  {
   "id": "no-headings",
   "product": "f1",
   "title": "лист без полос заголовков",
   "shows": "полосы прячутся одним свойством, и освободившееся место занимает сам лист",
   "files": 7,
   "bytes": 9359,
   "package": "/kit/f1/no-headings.json",
   "run": "откройте run.html в браузере — ставить ничего не нужно",
   "engine": "стенд: на месте ядра дублёр, числа в ячейках ничего не значат. Смотреть здесь нужно на объём кода вокруг листа и на способ встраивания. Настоящий пересчёт — в живом примере: https://docs.plantype.ru/f1/demo/",
   "capabilities": [
    "sheet"
   ],
   "integration": "module",
   "sdk_expressible": false
  },
  {
   "id": "custom-menu",
   "product": "f1",
   "title": "свой пункт меню",
   "shows": "чужой пункт в нашем меню: за чертой, под именем владельца и со СВОЕЙ командой — притвориться нашим он не может",
   "files": 7,
   "bytes": 10473,
   "package": "/kit/f1/custom-menu.json",
   "run": "откройте run.html в браузере — ставить ничего не нужно",
   "engine": "стенд: на месте ядра дублёр, числа в ячейках ничего не значат. Смотреть здесь нужно на объём кода вокруг листа и на способ встраивания. Настоящий пересчёт — в живом примере: https://docs.plantype.ru/f1/demo/",
   "capabilities": [
    "sheet",
    "custom-menu"
   ],
   "integration": "module",
   "sdk_expressible": false
  },
  {
   "id": "custom-shortcut",
   "product": "f1",
   "title": "своё сочетание клавиш",
   "shows": "чужое сочетание срабатывает, а занятые листом (Ctrl+D, Ctrl+R, F2, Shift+Пробел) остаются за листом — отказ виден словами",
   "files": 7,
   "bytes": 10212,
   "package": "/kit/f1/custom-shortcut.json",
   "run": "откройте run.html в браузере — ставить ничего не нужно",
   "engine": "стенд: на месте ядра дублёр, числа в ячейках ничего не значат. Смотреть здесь нужно на объём кода вокруг листа и на способ встраивания. Настоящий пересчёт — в живом примере: https://docs.plantype.ru/f1/demo/",
   "capabilities": [
    "sheet",
    "custom-shortcut"
   ],
   "integration": "module",
   "sdk_expressible": false
  },
  {
   "id": "custom-locale",
   "product": "f1",
   "title": "свой язык",
   "shows": "языка нет в наших трёх — его приносит хозяин страницы: подписи переводятся, непереведённое идёт запасной цепочкой, а не пропадает",
   "files": 8,
   "bytes": 16621,
   "package": "/kit/f1/custom-locale.json",
   "run": "откройте run.html в браузере — ставить ничего не нужно",
   "engine": "стенд: на месте ядра дублёр, числа в ячейках ничего не значат. Смотреть здесь нужно на объём кода вокруг листа и на способ встраивания. Настоящий пересчёт — в живом примере: https://docs.plantype.ru/f1/demo/",
   "capabilities": [
    "sheet",
    "locale"
   ],
   "integration": "module",
   "sdk_expressible": true
  },
  {
   "id": "open-bytes",
   "product": "f1",
   "title": "перетащите книгу сюда",
   "shows": "чужой документ открывается БАЙТАМИ: оболочка доносит файл, разбор остаётся за швом контракта, а отказ приходит словами того, кто открывал — на витрине это заглушка, она берёт csv, tsv и txt, а на xlsx честно отказывает",
   "files": 7,
   "bytes": 17629,
   "package": "/kit/f1/open-bytes.json",
   "run": "откройте run.html в браузере — ставить ничего не нужно",
   "engine": "стенд: на месте ядра дублёр, числа в ячейках ничего не значат. Смотреть здесь нужно на объём кода вокруг листа и на способ встраивания. Настоящий пересчёт — в живом примере: https://docs.plantype.ru/f1/demo/",
   "capabilities": [
    "sheet",
    "open-bytes"
   ],
   "integration": "module",
   "sdk_expressible": false
  },
  {
   "id": "presence",
   "product": "f1",
   "title": "двое в одном документе",
   "shows": "две рамки рядом: двигаете выделение в одной — во второй виден чужой курсор с именем; и прямо на экране написано, что видны ТОЛЬКО окна этого браузера",
   "files": 7,
   "bytes": 35295,
   "package": "/kit/f1/presence.json",
   "run": "откройте run.html в браузере — ставить ничего не нужно",
   "engine": "стенд: на месте ядра дублёр, числа в ячейках ничего не значат. Смотреть здесь нужно на объём кода вокруг листа и на способ встраивания. Настоящий пересчёт — в живом примере: https://docs.plantype.ru/f1/demo/",
   "capabilities": [
    "sheet",
    "presence",
    "multi-user"
   ],
   "integration": "module",
   "sdk_expressible": false
  },
  {
   "id": "driver",
   "product": "f1",
   "title": "помощники ведут лист",
   "shows": "до ДЕСЯТИ внешних участников, каждый в своём процессе: ходит по своей колонке, выделяет участок и вписывает итог — намерениями через тот же канал; отказ в лишнем виден и ему, и человеку; не запустили — страница так и говорит",
   "files": 9,
   "bytes": 57988,
   "package": "/kit/f1/driver.json",
   "run": "откройте run.html в браузере — ставить ничего не нужно",
   "engine": "стенд: на месте ядра дублёр, числа в ячейках ничего не значат. Смотреть здесь нужно на объём кода вокруг листа и на способ встраивания. Настоящий пересчёт — в живом примере: https://docs.plantype.ru/f1/demo/",
   "capabilities": [
    "sheet",
    "multi-user"
   ],
   "integration": "module",
   "sdk_expressible": false
  },
  {
   "id": "custom-event",
   "product": "f1",
   "title": "своё событие",
   "shows": "две точки расширения наружу: onCommand отдаёт ЛЮБОЕ намерение поверхности (наше и чужое), onGesture — цену закончившегося жеста числами",
   "files": 7,
   "bytes": 15574,
   "package": "/kit/f1/custom-event.json",
   "run": "откройте run.html в браузере — ставить ничего не нужно",
   "engine": "стенд: на месте ядра дублёр, числа в ячейках ничего не значат. Смотреть здесь нужно на объём кода вокруг листа и на способ встраивания. Настоящий пересчёт — в живом примере: https://docs.plantype.ru/f1/demo/",
   "capabilities": [
    "sheet"
   ],
   "integration": "module",
   "sdk_expressible": false
  },
  {
   "id": "hyperlink",
   "product": "f1",
   "title": "гиперссылка",
   "shows": "ссылка — СВОЙСТВО ячейки: одна операция ядра ставит её вместе с текстом, снимает, оставляя текст, и сама называет ссылки листа",
   "files": 7,
   "bytes": 31583,
   "package": "/kit/f1/hyperlink.json",
   "run": "откройте run.html в браузере — ставить ничего не нужно",
   "engine": "стенд: на месте ядра дублёр, числа в ячейках ничего не значат. Смотреть здесь нужно на объём кода вокруг листа и на способ встраивания. Настоящий пересчёт — в живом примере: https://docs.plantype.ru/f1/demo/",
   "capabilities": [
    "sheet",
    "hyperlink"
   ],
   "integration": "module",
   "sdk_expressible": false
  },
  {
   "id": "find-replace",
   "product": "f1",
   "title": "найти и заменить",
   "shows": "поиск — ОДИН запрос, замена — ДВА, и первый книгу не меняет: ядро вычисляет план правок, а пишет их та же дорога, что ввод",
   "files": 7,
   "bytes": 19108,
   "package": "/kit/f1/find-replace.json",
   "run": "откройте run.html в браузере — ставить ничего не нужно",
   "engine": "стенд: на месте ядра дублёр, числа в ячейках ничего не значат. Смотреть здесь нужно на объём кода вокруг листа и на способ встраивания. Настоящий пересчёт — в живом примере: https://docs.plantype.ru/f1/demo/",
   "capabilities": [
    "sheet",
    "find-replace"
   ],
   "integration": "module",
   "sdk_expressible": false
  },
  {
   "id": "annotations",
   "product": "f1",
   "title": "примечания",
   "shows": "шесть действий примечаний одной операцией контракта — перечислить, создать, удалить, ответить, отменить, повторить; текст, номер и нормализованный адрес называет ядро",
   "files": 7,
   "bytes": 20109,
   "package": "/kit/f1/annotations.json",
   "run": "откройте run.html в браузере — ставить ничего не нужно",
   "engine": "стенд: на месте ядра дублёр, числа в ячейках ничего не значат. Смотреть здесь нужно на объём кода вокруг листа и на способ встраивания. Настоящий пересчёт — в живом примере: https://docs.plantype.ru/f1/demo/",
   "capabilities": [
    "sheet",
    "comments"
   ],
   "integration": "module",
   "sdk_expressible": false
  },
  {
   "id": "outline",
   "product": "f1",
   "title": "структура листа",
   "shows": "восемь действий — одна операция: оболочка называет диапазон, ось и действие, а уровни и что спрятать считает ядро",
   "files": 7,
   "bytes": 16786,
   "package": "/kit/f1/outline.json",
   "run": "откройте run.html в браузере — ставить ничего не нужно",
   "engine": "стенд: на месте ядра дублёр, числа в ячейках ничего не значат. Смотреть здесь нужно на объём кода вокруг листа и на способ встраивания. Настоящий пересчёт — в живом примере: https://docs.plantype.ru/f1/demo/",
   "capabilities": [
    "sheet",
    "outline"
   ],
   "integration": "module",
   "sdk_expressible": false
  },
  {
   "id": "page-breaks",
   "product": "f1",
   "title": "разметка страниц",
   "shows": "где ляжет разрыв — единственный метод SDK, который СПРАШИВАЕТ и ничего не меняет; саму печать делает хост, и это граница, а не пробел",
   "files": 7,
   "bytes": 18059,
   "package": "/kit/f1/page-breaks.json",
   "run": "откройте run.html в браузере — ставить ничего не нужно",
   "engine": "стенд: на месте ядра дублёр, числа в ячейках ничего не значат. Смотреть здесь нужно на объём кода вокруг листа и на способ встраивания. Настоящий пересчёт — в живом примере: https://docs.plantype.ru/f1/demo/",
   "capabilities": [
    "sheet",
    "page-breaks"
   ],
   "integration": "module",
   "sdk_expressible": false
  },
  {
   "id": "protected-ranges",
   "product": "f1",
   "title": "разрешить изменение диапазонов",
   "shows": "шесть намерений из десяти, что есть у операции: пароль уходит за шов и не возвращается — обратно приходит только СПОСОБ защиты",
   "files": 7,
   "bytes": 19665,
   "package": "/kit/f1/protected-ranges.json",
   "run": "откройте run.html в браузере — ставить ничего не нужно",
   "engine": "стенд: на месте ядра дублёр, числа в ячейках ничего не значат. Смотреть здесь нужно на объём кода вокруг листа и на способ встраивания. Настоящий пересчёт — в живом примере: https://docs.plantype.ru/f1/demo/",
   "capabilities": [
    "sheet",
    "protected-ranges",
    "refusal-with-reason"
   ],
   "integration": "module",
   "sdk_expressible": false
  },
  {
   "id": "workbook-links",
   "product": "f1",
   "title": "связи книги",
   "shows": "формула считает по ЧУЖОЙ книге: список связей, их состояние и адрес источника приходят от ядра, а открывает книгу хозяин окна",
   "files": 7,
   "bytes": 21066,
   "package": "/kit/f1/workbook-links.json",
   "run": "откройте run.html в браузере — ставить ничего не нужно",
   "engine": "стенд: на месте ядра дублёр, числа в ячейках ничего не значат. Смотреть здесь нужно на объём кода вокруг листа и на способ встраивания. Настоящий пересчёт — в живом примере: https://docs.plantype.ru/f1/demo/",
   "capabilities": [
    "sheet",
    "workbook-links"
   ],
   "integration": "module",
   "sdk_expressible": false
  },
  {
   "id": "headless",
   "product": "f1",
   "title": "голова без экрана",
   "shows": "книга открывается, правится и читается из Node — без единого обращения к DOM",
   "files": 8,
   "bytes": 22542,
   "package": "/kit/f1/headless.json",
   "run": "откройте run.html в браузере — ставить ничего не нужно",
   "engine": "стенд: на месте ядра дублёр, числа в ячейках ничего не значат. Смотреть здесь нужно на объём кода вокруг листа и на способ встраивания. Настоящий пересчёт — в живом примере: https://docs.plantype.ru/f1/demo/",
   "capabilities": [
    "headless"
   ],
   "integration": "module",
   "sdk_expressible": false
  },
  {
   "id": "embed",
   "product": "a4",
   "title": "Встраивание поверхности A4",
   "shows": "страница, код рамки и хост — то, чем редактор подключается к чужому продукту",
   "files": 6,
   "bytes": 14741,
   "package": "/kit/a4/embed.json",
   "run": "npm install && node server/host.mjs",
   "engine": "настоящее ядро: страница обращается к поверхности A4, которую поднимает установленный процессор. Без него откроется страница, но редактора в ней не будет.",
   "capabilities": [],
   "integration": "server",
   "sdk_expressible": false
  }
 ]
}