/*
 * Вьюпорт (снаружи) — фиксированная видимая область с обрезкой, panzoom.js
 * не трогает. .tnb-tree (внутри) — сама разметка дерева, её и трансформирует
 * panzoom при панораме/зуме. Если transform и overflow:auto оказываются на
 * одном и том же элементе, панорама двигает всю рамку целиком, а не
 * содержимое внутри неё — поэтому это два разных элемента.
 */
.tnb-tree-wrapper {
	position: relative;
}

.tnb-tree-toolbar {
	display: flex;
	justify-content: flex-end;
	gap: 8px;
	margin-bottom: 8px;
}

.tnb-tree-toolbar button {
	font-size: 13px;
	padding: 6px 12px;
	border: 1px solid #bbb;
	border-radius: 4px;
	background: #fff;
	cursor: pointer;
}

.tnb-tree-toolbar button:hover {
	border-color: #888;
}

/* Полноэкранный режим — не браузерный Fullscreen API, а CSS: обёртка (тулбар
   + вьюпорт дерева) становится fixed на весь экран, вьюпорт растягивается на
   всё оставшееся место (flex, max-height снят). Пересчёт границ панорамы
   panzoom.js после переключения — через искусственное событие resize, см.
   tnb-public.js. */
.tnb-tree-wrapper.tnb-tree-fullscreen {
	position: fixed;
	inset: 0;
	z-index: 999999;
	background: #fff;
	padding: 10px;
	display: flex;
	flex-direction: column;
	/* Доп. страховка от "резинового" оттягивания при перетаскивании/зуме у
	   самого края — тот же класс проблемы, что и body.overflow:hidden в
	   tnb-public.js (см. комментарий там), только со стороны браузерного
	   overscroll, а не скролла как такового. */
	overscroll-behavior: contain;
}

.tnb-tree-wrapper.tnb-tree-fullscreen .tnb-tree-viewport {
	flex: 1 1 auto;
	max-height: none;
	/* Без скруглённых углов в полноэкранном режиме — на весь экран они не
	   нужны; заодно чуть дешевле для рендера (без обрезки по маске на
	   большой площади), хотя известную проблему "дрожания" дерева у границы
	   при перетаскивании/стрелках это не устраняет — причина не найдена,
	   см. журнал работ. */
	border-radius: 0;
}

.tnb-tree-viewport {
	overflow: hidden;
	max-height: 70vh;
	border: 1px solid #e2e2e2;
	border-radius: 6px;
	cursor: grab;
	position: relative;
}

.tnb-tree {
	padding: 30px 10px;
	display: inline-block;
}

/* Подсказка браузеру держать трансформируемое дерево на отдельном
   GPU-слое во время перетаскивания в полноэкранном режиме — обычная практика
   для часто трансформируемых элементов на большой площади. Известную
   проблему "дрожания" дерева у границы при перетаскивании/стрелках это не
   устраняет — причина не найдена, см. журнал работ. */
.tnb-tree-fullscreen .tnb-tree {
	will-change: transform;
}

.tnb-tree-empty {
	color: #666;
}

.tnb-tree ul.tnb-family {
	position: relative;
	white-space: nowrap;
	margin: 0;
	/* !important обязателен: тема (Divi) стилизует ВЛОЖЕННЫЕ ul/ol внутри
	   li через селекторы с ID (например #left-area ul li ul { padding:
	   2px 0 2px 20px }, под обычные текстовые списки в контенте) — по
	   специфичности ID всегда побеждает любой набор классов, поэтому наш
	   собственный padding:0 без !important тихо перебивался бы, добавляя
	   лишние 20px+ слева на КАЖДОМ поколении дерева (накопительно на
	   глубоких ветках) — та самая "загадочная" разница в измерениях
	   ширины дерева, из-за которой раньше пришлось городить измерение
	   фактического положения карточек через JS (см. tnb-public.js,
	   measureEdges()). Список тут не текстовый (list-style:none у
	   li.tnb-node), поэтому переопределять безопасно.
	   List-style-type тоже сбрасываем на всякий случай (тема ставит disc
	   на ul в .entry-content) — маркеры и так скрыты через li, но лишним
	   не будет. */
	padding: 0 !important;
	list-style-type: none !important;
	text-align: center;
}

.tnb-tree li.tnb-node {
	display: inline-block;
	vertical-align: top;
	list-style: none;
	position: relative;
	padding: 16px 6px 0 6px;
}

.tnb-tree .tnb-person-group {
	display: inline-flex;
	align-items: center;
	white-space: nowrap;
}

.tnb-ind {
	display: inline-block;
	position: relative;
	border: 1px solid #bbb;
	border-radius: 6px;
	padding: 4px 8px;
	min-width: 70px;
	background: #fff;
	font-size: 13px;
	line-height: 1.3;
	white-space: normal;
	vertical-align: top;
}

.tnb-ind.tnb-sex-m { background: #eaf2fb; }
.tnb-ind.tnb-sex-f { background: #fbeaf0; }
.tnb-ind.tnb-sex-u { background: #f2f2f2; }

/* Карточка-ссылка (клик по узлу дерева/списка ведёт на сингл-страницу
   персоны) не должна выглядеть как обычная синяя подчёркнутая ссылка. */
a.tnb-ind {
	color: inherit;
	text-decoration: none;
	cursor: pointer;
}

a.tnb-ind:hover {
	border-color: #888;
}

.tnb-ind .tnb-photo img {
	max-width: 60px;
	height: auto;
	border-radius: 4px;
	display: block;
	margin: 0 auto 4px;
}

/* Показывать ли фото в ДЕРЕВЕ, решает рендер по настройке "Фото персон в
   дереве" (Tnb_Tree_Renderer::render_card(), $in_tree) — при выключенной
   настройке разметка .tnb-photo в дерево вообще не попадает, отдельного
   скрывающего CSS-правила больше нет. */

.tnb-ind .tnb-name {
	font-weight: 600;
}

/* Имя и отчество/фамилия — раздельными строками, а не одной длинной
   строкой "Имя Отчество": заметно уже карточка и, как следствие, весь
   ряд поколения по горизонтали. */
.tnb-ind .tnb-first-name,
.tnb-ind .tnb-last-name {
	display: block;
}

.tnb-ind .tnb-dates {
	color: #555;
	font-size: 12px;
}

.tnb-spouse-connector {
	display: inline-block;
	width: 18px;
	height: 1px;
	border-top: 1px solid #999;
	vertical-align: middle;
	margin: 0 -1px;
}

.tnb-ind.tnb-spouse {
	border-style: dashed;
}

/* См. Tnb_Tree_Renderer::render_spouse_mirror() — невидимый двойник
   блока супруга(ов), той же ширины, перед карточкой персоны. Занимает
   место в раскладке (не display:none), но не виден и не мешает
   табуляции/скринридерам. */
.tnb-spouse-mirror {
	visibility: hidden;
}

/* Настоящую (не "зеркальную") карточку супруга(и) в дереве не показываем —
   только скрываем (visibility, не display:none), т.к. её ширина по-прежнему
   нужна для симметрии с невидимым "зеркалом" перед карточкой персоны (см.
   render_spouse_mirror() выше): без неё сместится центр, на который
   целится линия между соседями по поколению. Селектор — только ПРЯМОЙ
   потомок .tnb-person-group, чтобы не задеть уже скрытое "зеркало"
   (оно вложено в .tnb-spouse-mirror, а не является прямым потомком). */
.tnb-tree .tnb-person-group > .tnb-spouse-connector,
.tnb-tree .tnb-person-group > .tnb-ind.tnb-spouse {
	visibility: hidden;
}

.tnb-persons-list {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
}

.tnb-persons-list-item {
	list-style: none;
}

.tnb-person-single {
	display: block;
	max-width: 480px;
}

.tnb-person-profile {
	display: block;
	width: 100%;
}

.tnb-profile-header {
	display: flex;
	flex-wrap: wrap;
	gap: 24px;
	align-items: flex-start;
}

.tnb-profile-photo {
	flex: 0 0 250px;
	max-width: 100%;
}

.tnb-profile-photo a {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 250px;
	max-width: 100%;
	height: 350px;
	border-radius: 4px;
	border: 1px solid #ddd;
	overflow: hidden;
	cursor: zoom-in;
}

.tnb-profile-photo img {
	display: block;
	max-width: 100%;
	max-height: 100%;
	width: auto;
	height: auto;
}

/* Заглушка вместо фото, если у персоны нет изображения: тот же размер
   250x350 и те же фоновые цвета по полу, что и у карточки в дереве
   (.tnb-sex-m/.tnb-sex-f/.tnb-sex-u), плюс белый контурный силуэт
   мужчины/женщины/нейтральной фигуры (для tnb-sex-u — пол не указан). */
.tnb-profile-photo-placeholder {
	display: block;
	width: 250px;
	max-width: 100%;
	height: 350px;
	border-radius: 4px;
	border: 1px solid #ddd;
	background-repeat: no-repeat;
	background-position: center;
	background-size: 110px auto;
}

.tnb-profile-photo-placeholder.tnb-sex-m {
	background-color: #eaf2fb;
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ccircle cx='50' cy='20' r='14' fill='none' stroke='%23fff' stroke-width='4'/%3E%3Crect x='34' y='38' width='32' height='34' rx='6' fill='none' stroke='%23fff' stroke-width='4'/%3E%3Crect x='36' y='72' width='10' height='26' rx='3' fill='none' stroke='%23fff' stroke-width='4'/%3E%3Crect x='54' y='72' width='10' height='26' rx='3' fill='none' stroke='%23fff' stroke-width='4'/%3E%3C/svg%3E");
}

.tnb-profile-photo-placeholder.tnb-sex-f {
	background-color: #fbeaf0;
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ccircle cx='50' cy='20' r='14' fill='none' stroke='%23fff' stroke-width='4'/%3E%3Cpath d='M38 38h24c3 0 5 2 6 5l8 34c1 4-2 7-6 7h-8l2 22h-24l2-22h-8c-4 0-7-3-6-7l8-34c1-3 3-5 6-5z' fill='none' stroke='%23fff' stroke-width='4'/%3E%3C/svg%3E");
}

.tnb-profile-photo-placeholder.tnb-sex-u {
	background-color: #f2f2f2;
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ccircle cx='50' cy='20' r='14' fill='none' stroke='%23fff' stroke-width='4'/%3E%3Cpath d='M50 38c-16 0-28 12-28 28v32h56V66c0-16-12-28-28-28z' fill='none' stroke='%23fff' stroke-width='4'/%3E%3C/svg%3E");
}

.tnb-profile-data {
	flex: 1 1 0;
	min-width: 240px;
}

.tnb-profile-name {
	margin: 0 0 4px;
}

.tnb-person-extra {
	margin-top: 12px;
	font-size: 14px;
	line-height: 1.6;
}

.tnb-person-relations {
	margin-top: 16px;
	font-size: 14px;
	line-height: 1.6;
}

.tnb-relation {
	margin: 0 0 4px;
}

.tnb-relation-label {
	font-weight: 600;
}

/* Список детей — один под другим, без маркеров/отступа списка. !important
   обязателен: тема (Divi) стилизует ЛЮБОЙ <ul> внутри #left-area через
   селектор с ID (`#left-area ul { list-style-type:disc; padding:0 0 23px
   1em }`) — та же утечка специфичности, что уже чинилась для дерева
   (см. .tnb-tree ul.tnb-family выше), классами её не перебить. */
.tnb-relation-list {
	list-style: none !important;
	margin: 0 0 4px !important;
	padding: 0 !important;
}

.tnb-relation-list li {
	margin: 0 0 2px;
}

.tnb-person-notes {
	margin-top: 24px;
	font-size: 14px;
	line-height: 1.5;
}

.tnb-person-gallery {
	display: grid;
	grid-template-columns: repeat(5, 1fr);
	gap: 8px;
	margin-top: 24px;
}

.tnb-person-gallery-item {
	display: block;
}

.tnb-person-gallery-item img {
	display: block;
	width: 100%;
	height: auto;
	border-radius: 4px;
	border: 1px solid #ddd;
	cursor: zoom-in;
}

.tnb-person-documents {
	display: grid;
	grid-template-columns: repeat(5, 1fr);
	gap: 8px;
	margin-top: 24px;
}

.tnb-person-documents-item {
	display: block;
	text-align: center;
	font-size: 12px;
	line-height: 1.4;
	color: inherit;
	text-decoration: none;
	border: 1px solid #ddd;
	border-radius: 4px;
	padding: 8px;
}

.tnb-person-documents-item img {
	display: block;
	width: 100%;
	height: auto;
	border-radius: 2px;
}

.tnb-person-documents-item.tnb-lightbox img {
	cursor: zoom-in;
}

.tnb-person-documents-item img.tnb-person-documents-icon {
	width: 48px;
	height: 48px;
	margin: 0 auto;
}

@media (max-width: 782px) {
	.tnb-person-gallery,
	.tnb-person-documents {
		grid-template-columns: repeat(3, 1fr);
	}
}

@media (max-width: 480px) {
	.tnb-person-gallery,
	.tnb-person-documents {
		grid-template-columns: repeat(2, 1fr);
	}
}

/* --- Попап (лайтбокс) для изображений галереи/документов --- */

.tnb-lightbox-overlay {
	position: fixed;
	inset: 0;
	background: rgba(0, 0, 0, 0.85);
	display: flex;
	align-items: center;
	justify-content: center;
	z-index: 100000;
	padding: 24px;
	cursor: zoom-out;
}

.tnb-lightbox-overlay img {
	display: block;
	max-width: 100%;
	max-height: 800px;
	width: auto;
	height: auto;
	cursor: default;
	box-shadow: 0 4px 24px rgba(0, 0, 0, 0.5);
}

.tnb-lightbox-close {
	position: absolute;
	top: 16px;
	right: 24px;
	color: #fff;
	font-size: 32px;
	line-height: 1;
	background: none;
	border: 0;
	cursor: pointer;
	padding: 8px;
}

/* Тема (Divi) выводит заголовок/мета/крупное изображение ДО .entry-content
   (см. .et_post_meta_wrapper) — недоступно фильтру the_content, поэтому
   основной заголовок страницы, дублирующаяся строка "от Автор | Дата" и
   второе крупное фото скрываются только через CSS, по классу body, который
   WordPress сам добавляет на сингл-страницах CPT (single-tnb_person). */
body.single-tnb_person .et_post_meta_wrapper .entry-title,
body.single-tnb_person .et_post_meta_wrapper .post-meta,
body.single-tnb_person .et_post_meta_wrapper > img {
	display: none;
}

/* --- Соединительные линии между поколениями ---
 * Два независимых набора линий:
 * 1) Линия между СОСЕДЯМИ по поколению (li.tnb-node::before/::after) —
 *    неизбежно завязана на ширину li (тянется от одного соседа к
 *    другому), тут ничего не поделать иначе.
 * 2) "Усы" от конкретной карточки К родителю/к детям
 *    (.tnb-ind.tnb-has-parent/.tnb-has-children) — раньше были тоже
 *    завязаны на ширину li (или всего блока "персона+супруг(и)"), из-за
 *    чего при наличии жены рядом линия отходила не от мужа, а от
 *    середины всего блока и визуально сливалась с карточкой жены.
 *    Теперь это псевдоэлементы САМОЙ карточки мужчины — центр линии
 *    всегда строго совпадает с центром его карточки, независимо от
 *    того, сколько жён показано рядом. */

.tnb-tree li.tnb-node::before,
.tnb-tree li.tnb-node::after {
	content: '';
	position: absolute;
}

/* Раньше единственный ребёнок получал padding-top:0 (обнулялся весь
   отступ, а не только линия между несуществующими "соседями") — из-за
   этого между такой персоной и её единственным родителем не оставалось
   видимого зазора для соединительной линии вообще. Теперь отступ не
   трогаем — только скрываем линию между "соседями" (которых нет), хотя
   для единственного ребёнка она и так невидима (:first-child и
   :last-child совпадают в одном элементе, border-top обнуляется у обеих
   половин). */
.tnb-tree li.tnb-node:only-child::before,
.tnb-tree li.tnb-node:only-child::after {
	display: none;
}

.tnb-tree ul.tnb-family-root > li.tnb-node::before,
.tnb-tree ul.tnb-family-root > li.tnb-node::after {
	display: none;
}

/* Вертикальная ориентация: поколения сверху вниз. Горизонтальная линия
   между соседями рисуется НЕ вплотную к родителю (top:0), а ровно
   посередине зазора (top: половина padding-top у li) — иначе почти весь
   зазор уходит на "спуск к ребёнку", а к родителю линия визуально липнет
   вплотную. "Усы" от карточки (has-parent/has-children) — той же длины,
   что и половина зазора, чтобы ровно доставать до этой линии с обеих
   сторон. */

.tnb-tree-vertical li.tnb-node::before,
.tnb-tree-vertical li.tnb-node::after {
	top: 8px;
	right: 50%;
	border-top: 1px solid #999;
	width: 50%;
}

.tnb-tree-vertical li.tnb-node::after {
	right: auto;
	left: 50%;
}

.tnb-tree-vertical li.tnb-node:first-child::before,
.tnb-tree-vertical li.tnb-node:last-child::after {
	border-top: 0 none;
}

.tnb-tree-vertical .tnb-ind.tnb-has-parent::before {
	content: '';
	position: absolute;
	/* 100% + 1px: top/bottom-проценты у абсолютно спозиционированного
	   элемента считаются от padding-box родителя, без учёта его border
	   (1px у .tnb-ind) — без поправки линия не дотягивалась бы на 1px
	   до общей горизонтальной линии между поколениями. */
	bottom: calc(100% + 1px);
	left: 50%;
	width: 0;
	height: 8px;
	border-left: 1px solid #999;
}

.tnb-tree-vertical .tnb-ind.tnb-has-children::after {
	content: '';
	position: absolute;
	top: calc(100% + 1px);
	left: 50%;
	width: 0;
	height: 8px;
	border-left: 1px solid #999;
}

/* Горизонтальная ориентация: поколения слева направо, коннекторы повёрнуты
   на 90°. */
.tnb-tree-horizontal ul.tnb-family {
	white-space: normal;
	text-align: left;
}

.tnb-tree-horizontal li.tnb-node {
	display: block;
	padding: 6px 0 6px 24px;
}

.tnb-tree-horizontal .tnb-person-group {
	white-space: nowrap;
}

.tnb-tree-horizontal li.tnb-node::before,
.tnb-tree-horizontal li.tnb-node::after {
	top: 0;
	left: 8px;
	border-top: 0 none;
	border-left: 1px solid #999;
	height: 50%;
}

.tnb-tree-horizontal li.tnb-node::after {
	bottom: 0;
	top: 50%;
}

.tnb-tree-horizontal li.tnb-node:first-child::before,
.tnb-tree-horizontal li.tnb-node:last-child::after {
	border-left: 0 none;
}

.tnb-tree-horizontal .tnb-ind.tnb-has-parent::before {
	content: '';
	position: absolute;
	/* +1px — та же поправка на border родителя, что и в вертикальной
	   ориентации (см. комментарий там). */
	right: calc(100% + 1px);
	top: 50%;
	width: 8px;
	height: 0;
	border-top: 1px solid #999;
}

.tnb-tree-horizontal .tnb-ind.tnb-has-children::after {
	content: '';
	position: absolute;
	left: calc(100% + 1px);
	top: 50%;
	width: 8px;
	height: 0;
	border-top: 1px solid #999;
}

/* --- Шаблон карточки "Компактная" --- */

.tnb-ind.tnb-ind-compact {
	min-width: 0;
	padding: 3px 8px;
	white-space: nowrap;
}

.tnb-ind.tnb-ind-compact .tnb-dates {
	display: inline;
	margin-left: 4px;
}

/* --- Шаблон дерева "Компактный" --- */

.tnb-tree-template-compact li.tnb-node {
	padding-top: 10px;
}

.tnb-tree-template-compact.tnb-tree-horizontal li.tnb-node {
	padding: 4px 0 4px 16px;
}

.tnb-tree-template-compact.tnb-tree-vertical li.tnb-node::before,
.tnb-tree-template-compact.tnb-tree-vertical li.tnb-node::after {
	top: 5px;
}

.tnb-tree-template-compact.tnb-tree-vertical .tnb-ind.tnb-has-parent::before,
.tnb-tree-template-compact.tnb-tree-vertical .tnb-ind.tnb-has-children::after {
	height: 5px;
}

.tnb-tree-template-compact.tnb-tree-horizontal li.tnb-node::before,
.tnb-tree-template-compact.tnb-tree-horizontal li.tnb-node::after {
	left: 5px;
	height: 50%;
}

.tnb-tree-template-compact.tnb-tree-horizontal .tnb-ind.tnb-has-parent::before,
.tnb-tree-template-compact.tnb-tree-horizontal .tnb-ind.tnb-has-children::after {
	width: 5px;
}
