/**
* Kinjo — JS API карты ЖК на сайте застройщика. Типы для TypeScript: https://map.kinjo.ru/kinjo.d.ts
* Документация: docs/embed-api.md. Протокол — версия 1 (Kinjo.protocol).
*
*
*
*
*
* Страница квартиры (#53) — только ЖК с подсвеченным домом квартиры и кнопка «Открыть карту» (полная карта модалкой):
* Kinjo.mount('#flat-map', { project: 'atlas-unique', house: 'Дом 2', view: 'house' });
*
* Подключить в проекте: скачайте файл рядом с кодом (например, types/kinjo.d.ts) — window.Kinjo станет типизированным.
*/
export type KinjoMapTheme = 'light' | 'dark' | 'mono' | 'warm' | 'brand';
export type KinjoMode = '2d' | '3d';
/** Категория мест: id или подпись («Школы и сады»). */
export type KinjoCategory = 'edu' | 'shops' | 'health' | 'transport' | 'leisure' | (string & {});
export type KinjoControl = 'header' | 'categories' | 'time' | 'city' | 'route' | 'walk' | 'mapButtons' | 'compass' | 'card';
/** Какие наши элементы управления показывать: 'none' (или false) — только карта; { time: false } — всё, кроме времени. */
export type KinjoControls = 'none' | 'all' | boolean | Partial>;
/** Форма пинов мест: pin — значок с точкой на земле (как было), badge — значок без точки, dot — компактная метка. */
export type KinjoPinShape = 'pin' | 'badge' | 'dot';
export interface KinjoMountOptions {
/** Проект (адрес карты в кабинете): ?project=. Обязательно. */
project: string;
/** Тема карты. По умолчанию — как в проекте. */
theme?: KinjoMapTheme;
/** 2D — плоская карта (быстрее), 3D — сцена с солнцем и тенями. По умолчанию — как в проекте. */
mode?: KinjoMode;
/** Раскладка: dock — панель снизу, sidebar — боковая панель (sidebar:theme — в цвете интерфейса). */
layout?: string;
/** Категории на компьютере: icons — значки, legend — легенда. */
dock?: 'icons' | 'legend';
/** Шапка: full — логотип и название, logo — только логотип, none — без шапки. */
logo?: 'full' | 'logo' | 'none';
/** «Пешком за N минут»: [15, 30] или 'off'. */
isochrones?: number[] | string;
/** Пин ЖК с фото: '3d,pin', 'off' … */
hero?: string;
/** Высота блока: число px или 'auto' (по содержимому на телефоне). По умолчанию 560. */
height?: number | 'auto';
/** Подпись блока для экранного диктора. */
title?: string;
/** Наши элементы управления. По умолчанию — все. */
controls?: KinjoControls;
/** Форма пинов мест. По умолчанию — как в проекте. */
pinShape?: KinjoPinShape;
/** Скругление пинов, % от стороны: 0 — квадрат, 50 — круг. По умолчанию — как в проекте. */
pinRadius?: number;
/** Размер пинов: s, m, l. По умолчанию — как в проекте. */
pinSize?: 's' | 'm' | 'l';
/**
* Скругление интерфейса, px (0–24): док, кнопки карты, карточки, плашки, панели, лист на телефоне — под стиль сайта.
* 0 — прямые углы, 24 — капсулы. По умолчанию — как в проекте.
*/
uiRadius?: number;
/**
* Размер дока — нижней капсулы со временем, «Городом», «Маршрутом» и категориями: m — стандартный, s — маленький,
* xs — очень маленький. Больше стандартного не бывает. По умолчанию — как в проекте.
*/
dockSize?: 'm' | 's' | 'xs';
/**
* Время суток открыто сразу: лента часов с ▶ видна при входе капсулой над доком, «☀» её сворачивает. false — лента
* по нажатию на «☀». По умолчанию — как в проекте.
*/
timeOpen?: boolean;
/**
* Цены, квартиры и свои строки карточек корпусов: { 'k1' | 'Корпус 1': {…} }. Живут только на странице сайта —
* на сервер Kinjo не уходят. Перекрывают заполненное в кабинете.
*/
houses?: Record;
/** true — загрузить карту, когда блок долистают (команда загрузит раньше). По умолчанию — сразу. */
lazy?: boolean;
/**
* Вид карты. 'house' — для страницы квартиры: только ЖК с подсвеченным домом (house), без мест, категорий, солнца,
* шапки и карточек, спокойный ракурс на дом; вращать и приближать можно (на компьютере колесо — с Ctrl/⌘, на
* телефоне — двумя пальцами). Кнопка «Открыть карту» в углу открывает полную карту модалкой: тот же дом выбран, его
* карточка открыта, данные houses — и в ней. Высота — у блока (CSS) или height, по умолчанию 420 px.
*/
view?: 'house';
/** Дом квартиры (view: 'house'): ID, ID части, название или подпись — как в selectHouse. */
house?: string | number;
/** Секция или подъезд дома квартиры (view: 'house'): подсветить только эту часть, если дом из частей. */
section?: string;
/** Подпись кнопки «Открыть карту» (view: 'house'); false — без кнопки. */
openLabel?: string | false;
}
/** Данные корпуса со страницы сайта. Всё необязательно; null — убрать поле, заполненное в кабинете. Только текст. */
export interface KinjoPageHouse {
/** «Цена от», ₽: число или строка «5 200 000». */
priceFrom?: number | string | null;
flatsOnSale?: number | string | null;
/** Ссылка «Смотреть квартиры»: только https. */
url?: string | null;
/** Примечание под ценой, до 200 знаков: «Скидка 5% до 31.10». */
note?: string | null;
/** Подпись кнопки, до 40 знаков: «Выбрать квартиру». Без неё — «Смотреть квартиры», у нежилого дома (стилобат, коммерция, офисы) — «Смотреть помещения». */
button?: string | null;
/** Свои строки карточки, до 6: [{ label: 'Сдача', value: 'IV кв. 2026' }]. */
lines?: { label: string; value: string }[] | null;
}
export interface KinjoHousesResult {
/** ID домов, к которым применилось. */
applied: string[];
/** Ключи, для которых корпус не нашёлся. */
unknown: string[];
/** Что пропущено и почему. */
warnings: string[];
}
export interface KinjoSales {
/** Ссылка на выдачу квартир корпуса (с utm_source=kinjo). */
url: string | null;
/** «Цена от», ₽. */
priceFrom: number | null;
/** Квартир в продаже. */
flatsOnSale: number | null;
note: string | null;
button: string | null;
lines: { label: string; value: string }[];
/** Когда обновили в кабинете (ISO 8601); со страницы — null. */
updatedAt: string | null;
/** page — есть данные со страницы сайта, cabinet — только из кабинета. */
source: 'page' | 'cabinet' | null;
/** «от 5,2 млн ₽». */
priceText: string | null;
/** «12 квартир в продаже». */
flatsText: string | null;
}
export interface KinjoHouse {
/** ID дома — тот же, что в кабинете и в API продаж. */
id: string;
name: string;
/** Подпись над крышей. */
label: string;
floors: number | null;
/** Очередь. */
queue: string | null;
status: 'built' | 'construction' | 'project';
/** Срок сдачи: «4 кв. 2027», «Сдан». */
deadline: string | null;
/** Ссылка «Смотреть квартиры» (продажи или ссылка корпуса из модели). */
url: string | null;
/** Продажи — если застройщик их задал. */
sales: KinjoSales | null;
}
export interface KinjoReady {
version: number;
project: string;
title: string;
mode: KinjoMode | null;
houses: KinjoHouse[];
categories: { id: KinjoCategory; label: string; count: number }[];
/** Зоны «пешком за N минут», которые можно включить setWalkZone. */
walkZones: number[];
/** Есть ли «Город» (аэропорт, вокзал, центр). */
city: boolean;
/** Работает ли «Маршрут до адреса». */
route: boolean;
/** Часовой пояс ЖК, минуты от UTC: время в setTime и timeChange — по нему. */
utcOffsetMinutes: number;
}
export interface KinjoTime {
/** YYYY-MM-DD по времени ЖК. */
date: string;
/** «13:00». */
time: string;
minutes: number;
}
export interface KinjoPlace {
name: string;
kind: string;
kindLabel: string;
category: KinjoCategory;
lngLat: [number, number];
/** «≈ 7 мин пешком»; у места прямо в ЖК — null (маршрут к нему не строится). */
walk: string | null;
/** Место прямо в ЖК: арендатор первого этажа, двор — без маршрута, времени и расстояния. */
inComplex: boolean;
}
export interface KinjoRoute {
/** Откуда маршрут: место рядом, «Город» или адрес. */
kind: 'place' | 'city' | 'address';
to: string;
lngLat: [number, number];
mode: 'walk' | 'drive';
minutes: number | null;
km: number | null;
approx?: boolean;
}
export interface KinjoError {
code: string;
message: string;
}
export interface KinjoEvents {
ready: KinjoReady;
/** Выбрали дом на карте или командой; null — выбор сняли. */
houseSelect: KinjoHouse | null;
placeSelect: KinjoPlace;
routeBuilt: KinjoRoute;
routeClear: { kind: 'place' | 'city' | 'address' };
/** Время на карте (3D), не чаще 4 раз в секунду. */
timeChange: KinjoTime;
modeChange: { mode: KinjoMode };
/** Нажали «Смотреть квартиры». */
flatsClick: { id: string; name: string; url: string };
/** Страница квартиры (view: 'house'): нажали «Открыть карту»; house — ключ дома квартиры. */
mapOpen: { house: string | null };
/** Страница квартиры: полную карту закрыли (✕, Esc, «назад», свайп). */
mapClose: null;
error: KinjoError;
}
export interface KinjoCamera {
center?: [number, number];
/** Масштаб карты; ближе предела приближения проекта (по умолчанию 17 или масштаб стартового вида, если он ближе) камера не подойдёт. */
zoom?: number;
bearing?: number;
pitch?: number;
/** мс. */
duration?: number;
}
/** Ошибка команды: error.code — not_ready, unknown_house, bad_args, unavailable, route_failed, origin_not_allowed, timeout. */
export interface KinjoCallError extends Error {
code: string;
}
export interface KinjoMap {
readonly version: number;
/** Блок (Kinjo.mount) или null (Kinjo.connect). */
readonly el: HTMLElement | null;
readonly iframe: HTMLIFrameElement | null;
/** Карта загрузилась (данные события ready). */
readonly ready: Promise;
on(name: K, fn: (data: KinjoEvents[K]) => void): this;
off(name: K, fn: (data: KinjoEvents[K]) => void): this;
once(name: K, fn: (data: KinjoEvents[K]) => void): this;
/** Выбрать дом по ID, ID части, названию или подписи («Корпус 1»): карточка и камера к нему. */
selectHouse(ref: string | number): Promise;
clearSelection(): Promise;
flyTo(camera: KinjoCamera): Promise;
/** Начальный вид проекта. */
resetView(): Promise;
/** «13:00» — время суток, Date или ISO — день и время (по времени ЖК). В 2D запоминается для 3D (ответ null). */
setTime(time: string | Date): Promise;
/** «2026-06-21» или Date — день (время суток то же). */
setDate(date: string | Date): Promise;
setMode(mode: KinjoMode): Promise<{ mode: KinjoMode }>;
setTheme(theme: KinjoMapTheme): Promise<{ theme: KinjoMapTheme }>;
/** Показать только эти категории мест. */
showCategories(categories: KinjoCategory[]): Promise<{ shown: KinjoCategory[] }>;
showAllPlaces(): Promise<{ shown: KinjoCategory[] }>;
/** Маршрут от ЖК до адреса (первая подсказка поиска по городу) или до точки. */
routeTo(to: { address: string } | { lngLat: [number, number]; label?: string }, options?: { mode?: 'walk' | 'drive' }): Promise<{ mode: 'walk' | 'drive'; minutes: number; km: number; label: string; lngLat: [number, number] }>;
clearRoute(): Promise;
/** Открыть «Город» (false — закрыть). */
openCity(open?: boolean): Promise;
/** «Пешком за N минут» (одна из ready.walkZones); null — убрать. */
setWalkZone(minutes: number | null): Promise;
/** Данные корпусов со страницы — целиком (прежние со страницы заменяются). */
setHouses(houses: Record): Promise;
/** Данные одного корпуса поверх прежних; null — убрать данные страницы у корпуса. */
updateHouse(ref: string, house: KinjoPageHouse | null): Promise;
/** Наши элементы управления на лету. */
setControls(controls: 'none' | 'all' | Partial>): Promise<{ hidden: KinjoControl[] }>;
getState(): Promise<{ mode: KinjoMode; house: KinjoHouse | null; time: KinjoTime | null; hidden: KinjoControl[] }>;
/** Убрать карту (Kinjo.mount) или отключиться (Kinjo.connect). */
destroy(): void;
}
export interface KinjoStatic {
version: number;
protocol: number;
/** Блок по параметрам (или по data-атрибутам элемента) → объект карты. */
mount(el: HTMLElement | string, options?: KinjoMountOptions): KinjoMap;
/** Свой iframe с картой (https://map.kinjo.ru/?project=…&embed=1). origin — адрес карты, если не из src. */
connect(iframe: HTMLIFrameElement | string, options?: { origin?: string }): KinjoMap;
unmount(el: HTMLElement): void;
/**
* Новые параметры блока: квартира и дата — на лету; проект, тема и вид элементов (pinShape, pinRadius, pinSize,
* uiRadius, dockSize, timeOpen) — перезагрузкой карты.
*/
update(el: HTMLElement, params: Partial & Record): void;
scan(): void;
}
declare global {
interface Window {
Kinjo: KinjoStatic;
}
const Kinjo: KinjoStatic;
}