/* Единственный владелец внешней геометрии. Подключается после style.css и
   app-shell.css; шрифты, цвета и внутренние размеры компонентов не меняет. */
:root {
  --app-height:100vh;
  --app-offset-top:0px;
  --app-safe-top:env(safe-area-inset-top,0px);
  --app-safe-right:env(safe-area-inset-right,0px);
  --app-safe-bottom:env(safe-area-inset-bottom,0px);
  --app-safe-left:env(safe-area-inset-left,0px);
}
@supports(height:100dvh) { :root { --app-height:100dvh; } }
html[data-app-viewport] { overflow:hidden; }
html[data-app-viewport] body {
  position:fixed; top:var(--app-offset-top); left:0; right:0; bottom:auto;
  display:flex; flex-direction:column; height:var(--app-height); min-height:0;
  margin:0; overflow:hidden; box-sizing:border-box;
  padding:var(--app-safe-top) var(--app-safe-right) var(--app-safe-bottom) var(--app-safe-left);
}
html[data-app-viewport] #app { height:auto; min-height:0; min-width:0; flex:1; }
/* Insets уже снаружи #app; legacy .fs и env внутри компонентов не суммируем. */
html[data-app-viewport] .hd { padding-top:12px; }
html[data-app-viewport] .lab-nav { padding-bottom:7px; }
html[data-app-viewport] .footmeta { padding-bottom:6px; }
html[data-app-viewport] .toast { bottom:var(--chrome-h); }
html[data-app-viewport] .toast.top { top:12px; bottom:auto; }
/* Fixed-слой не наследует padding тела. Его рамка совпадает с безопасным
   прямоугольником #app — в том числе сбоку после поворота и над клавиатурой. */
html[data-app-viewport] .veil {
  position:fixed; inset:auto;
  top:calc(var(--app-offset-top) + var(--app-safe-top));
  left:var(--app-safe-left); right:var(--app-safe-right); bottom:auto;
  height:max(0px,calc(var(--app-height) - var(--app-safe-top) - var(--app-safe-bottom)));
}
html[data-app-viewport] .sheet { padding-bottom:18px; }
/* Menu/toast находятся внутри #app. Обучение само измеряет его реальную
   рамку (onboarding.js), поэтому дополнительный padding порталу не нужен. */
