/* LoadingStatus Control */
:root {
	--ishSafeAreaTop: var(--NativeSafeAreaTop, env(safe-area-inset-top, 0px));
	--ishSafeAreaRight: var(--NativeSafeAreaRight, env(safe-area-inset-right, 0px));
	--ishSafeAreaBottom: var(--NativeSafeAreaBottom, env(safe-area-inset-bottom, 0px));
	--ishSafeAreaLeft: var(--NativeSafeAreaLeft, env(safe-area-inset-left, 0px));
}

html, body#contentBody.sapUiBody {
	width: 100%;
	height: 100%;
	min-height: 100dvh;
}

body#contentBody.sapUiBody {
	box-sizing: border-box;
	padding-top: var(--ishSafeAreaTop);
	padding-right: var(--ishSafeAreaRight);
	padding-bottom: var(--ishSafeAreaBottom);
	padding-left: var(--ishSafeAreaLeft);
}

body#contentBody.sapUiBody > .sapUiComponentContainer,
body#contentBody.sapUiBody > .sapUiComponentContainer > div {
	width: 100%;
	height: 100%;
}

body#contentBody.sapUiBody .sapTntToolPage {
	padding-top: calc(0.5rem + var(--ishSafeAreaTop));
	padding-right: calc(0.5rem + var(--ishSafeAreaRight));
	padding-bottom: calc(0.5rem + var(--ishSafeAreaBottom));
	padding-left: calc(0.5rem + var(--ishSafeAreaLeft));
}

.loadingStatusClass>span>span>span {
  animation: LoadingStatusRotation 1.2s linear infinite;
}
@keyframes LoadingStatusRotation {
  from { transform: rotate(0deg); }
  to   { transform: rotate(360deg); }
}
.ishZugewieseneGrundstucke {
	max-height: 40rem;
	overflow-y: auto;
}

/* AI Button Animation */
.aiMagicButton .sapMBtnIcon {
    animation: aiSpinGlow 2.2s ease-in-out infinite;
    filter: drop-shadow(0 0 4px var(--ishAiButtonGlowShadow));
}

.aiMagicButton .sapMBtnInner {
    animation: aiPulse 1.8s ease-in-out infinite;
    border: 1px solid var(--ishAiButtonGlowBorder);
}

@keyframes aiSpinGlow {
    0% { transform: rotate(0deg) scale(1); opacity: 0.9; }
    50% { transform: rotate(14deg) scale(1.12); opacity: 1; }
    100% { transform: rotate(0deg) scale(1); opacity: 0.9; }
}

@keyframes aiPulse {
    0% { box-shadow: 0 0 0 var(--ishAiButtonGlowTransparent); }
    50% { box-shadow: 0 0 12px var(--ishAiButtonGlowBorder); }
    100% { box-shadow: 0 0 0 var(--ishAiButtonGlowTransparent); }
}

.CardBodyVBoxPadding {
	padding-bottom: 48px;
}
/**
Start Side Panel CSS
**/
.maxDialogWidth {
	max-width: 40rem !important;
}
.whiteSpaceNormal {
	white-space: normal !important;
}
.ishSidePanelPositionLeft {
	right: -1rem;
	left: unset !important;
}
.ellipsisText {
	white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.mailTel {
	white-space: pre-line !important;
	overflow-wrap: break-word !important;
	line-height: normal;
}

.forceAutoHeight {
	height: auto !important;
}

.ish_firmen_telliststatus {
	padding-left: 5px;
}

.sapUiSizeCompact .sapTntNavLI img.sapTntNavLIGroupIcon.ishCustomIconButton {
	padding: 0.6875rem 0.9375rem;
}
.ScrollMaxHeight {
	max-height: 500px;
}
.SelectMinWidth {
	min-width: 8rem !important;
}
.ish_iframe {
	display: none;
	border: 0;
	width: 100%;
	height: 100%;
}
.sapUiTableRowSel {
	background-color: var(--ishTableRowSelectedBackground) !important;
}
.qr-display {
	width: 100%;
	height: 100%;
	text-align: center;
	display: flex;
	align-items: center;
	justify-content: center;
	position: relative;
	overflow: hidden;
}
.qr-roi-frame {
	position: absolute;
	border: 2px solid var(--ishQrRoiFrameBorder);
	border-radius: 8px;
	pointer-events: none;
	box-shadow: 0 0 0 100vmax var(--ishQrOverlayDim);
	display: none;
}
.qr-display.scanned .qr-roi-frame {
	display: none !important;
}
.DontShowLineBreak {
	white-space: nowrap !important;
    overflow: hidden !important;
    text-overflow: ellipsis;
}
.qr-display.scanned video, .qr-display canvas {
	display: none;
}

.qr-display video, .qr-display.scanned canvas {
	display: inline-block;
	max-width: 100%;
	max-height: 100%;
}


.ishTitleLink a {
	font-size: inherit;
	color: var(--ishHeaderTextColor) !important;

}

.ishTitleLink a *{
	font-family: 'Arial', Arial, sans-serif !important;
	font-weight: bold !important;
	font-size: 28px !important;
}

.ishUserbutton *{
	color: var(--ishHeaderTextColor) !important;
}

.ishTitleLink.wrap a {
	text-overflow: inherit;
	white-space: inherit;
}
.ishHomeIcon {
	width:48px;
	height:48px;
	font-size:44px;
}
.ishBibliothekTable .sapMText {
	text-overflow: ellipsis;
	overflow: hidden;
}
.ishBibliothekPreview {
	max-width: 100%;
	max-height: 100%;
}
.ishBibliothekPreviewWrapper {
	display: block;
	width: 100%;
	height: 145px;
}
.ishStatus {
	width: 20px;
	height: 20px;
	display: block;
	border: 3px solid var(--ishColorSwatchBorderColor);
	border-radius: 24px;
}
.ishColorCircle {
	width: 20px;
	height: 20px;
	display: block;
	border: 3px solid var(--ishColorSwatchBorderColor);
	border-radius: 24px;
}

.ishDokumente span.sapMText {
	display:inline-block;
	margin-right: -15px;
}
.ish4pxTopMargin {
	margin-top: 4px;
}
.ish7pxTopMargin {
	margin-top: 7px;
}
.ish8pxTopMargin {
	margin-top: 8px;
}
.ish8pxTopMarginimportant {
	margin-top: 8px !important;
}
.ish8pxLeftMarginimportant {
	margin-left: 8px !important;
}

.StripeClass {
	width: 100%;
	max-width: 400px;
}

.ishMarginLeft {
	margin-left: 0.28rem !important;
}
.ishMaxHeight {
	max-height: calc( 100% - 100px );
	min-height: calc( 100% - 100px );
}
.ishMaxHeightAuftrag {
	max-height: 80vw
}
.ishMaximumHeight {
	height: 100%
}
.fullHeightClass > section > div{
	height: 100% !important;
}
.ishCommentHeightFuerAuftrag {
	height: 70vh
}
.ishLieferscheinliste{
	min-width: 130px;
	text-align: right;
}
.ishPinMaskeDialogMaxWidth {
	max-width: 1300px !important;
}
.ishPersonalListe{
	height: 75% !important;
}

.ishHBoxMarginTop {
    margin-top: 8% !important;
    text-align: center !important;
}

.noBottomBorder .sapMPanelContent,
.noBottomBorder .sapMPanelBG,
.noBottomBorder .sapMPanelWrappingDiv {
    border-bottom: none !important;
    box-shadow: none !important;
}

.lineSpacing {
    margin-bottom: 20px;
}
.boldText {
    font-weight: bold;
}

#copyBeschreibungen{
	position: absolute;
	left: -10000px;
}
.sapMText.ish-errorText{
	color: var(--ishErrorTextColor);
}
.ishRichTextEditorTextArea{
	width: 100%;
	height: 400px;
}

.ishManagedSplitter.ishSplitterCollapsed .sapUiLoSplitterBar {
	opacity: 0;
	pointer-events: none;
	width: 0 !important;
	min-width: 0 !important;
	border: none !important;
}

.ishManagedSplitter.ishSplitterCollapsed .sapUiLoSplitterOverlay {
	display: none !important;
}

.ishManagedSplitter.ishSplitterMobile .sapUiLoSplitterBar {
	opacity: 0;
	pointer-events: none;
	width: 0 !important;
	min-width: 0 !important;
	border: none !important;
}

.ishManagedSplitter.ishSplitterMobile .sapUiLoSplitterOverlay {
	display: none !important;
}

@media screen and (max-width: 1000px) {
	div.ishRichTextEditorDialog{
		width: 100%;
	}
}
.ishRichTextEditorDialog{
	width: 80%;
}
.ishRichTextEditorTextDiv{
	display: inline-block;
	font-size: 0.875rem;
}

.ishDokWidthLimiter {
    display: inline-block;
	width: 64px;
}
.ishDisplayInlineBlock {
    display: inline-block;
}

.ishFavSLI {
	position: relative;
}
.ishFavSLI .ishFavSLIStar {
	position: absolute;
	right: 0.75rem;
	top: 50%;
	transform: translateY(-50%);
	display: flex;
	align-items: center;
	justify-content: center;
	z-index: 1;
}
.ishFavSLI .ishFavSLIStarIcon {
	cursor: pointer;
	color: var(--ishFavoriteStarColor);
}
.ishFavSLI .sapMSLIDiv,
.ishFavSLI .sapMSLIDescription {
	padding-right: 2.25rem;
}

.ishFloatRight {
    float: right;
}
.ishFontWeightBold {
    font-weight: bold;
}

/* Fett auch an einem sap.m.Title: dort gewinnt sonst die Themenregel `.sapMTitle` den
   Spezifitaetsgleichstand, weil library.css nach dieser Datei geladen wird (nachgemessen:
   font-weight blieb 400). Zwei Klassen im Selektor schlagen sie. */
.sapMTitle.ishFontWeightBold {
    font-weight: bold;
}
.ishFormLabelText {
	font-weight: bold;
	color: var(--sapContent_LabelColor) !important;
}
.ishBAFooterRightPadding {
	padding-right: 32px;
}
button.sapMBtn.ishFMSBaumButton {
	padding: 0;
	margin-top: -3.5px;
}
.sapMListTbl .sapUiIcon.ishInvBarcodeIcon {
	font-size: 2rem !important;
}
.sapMPopover.ishInvRaumFilterPopover .sapMPopover.ishInvSettingsPopover .sapMPopover.ishNewInventurPopover{
	max-width: 200px;
}
.sapMLIBTypeActive.ishInvListInventuren {
	background-color: var(--ishInvListActiveBackground);
}
.ishpersonenselektor.sapMInputBaseContentWrapperState, 
.ishStandortSelektor.sapMInputBaseContentWrapperState,
.ishMultiplePersonenSelektor.sapMInputBaseContentWrapperState,
.ishRichTextEditor.sapMInputBaseContentWrapperState,
.ishkostselektor.sapMInputBaseContentWrapperState {
    border-width: 2px;
    border-style: solid;
}
.ishpersonenselektor .sapMBtn, 
.ishStandortSelektor .sapMBtn,
.ishMultiplePersonenSelektor .sapMBtn,
.ishRichTextEditor .sapMBtn,
.ishDokumente .sapMBtn{
    min-width: 0 !important;
}
.ishMultiplePersonenSelektor {
    display: flex;
    align-items: center;
    gap: 0.5rem;
}
.ishMultiplePersonenSelektor > .sapMInputBase {
    flex: 1 1 auto;
    min-width: 0;
}
.ishMultiplePersonenSelektor > .sapMBtn {
    flex: 0 0 auto;
}
.sapUiFormLblColon .sapUiFormElementLbl>.labelNoColon.sapMLabel::after {
	content: ""; 
 }

html div.sapMDialog.ishMultiplePersonenSelektorDialog {
	min-width: 31.5rem;
}
.ishNoMinWidth {
	min-width: 0 !important;
}
.ish2pxLeftMargin {
	margin-left: 2px !important;
}
.renderNoDisplay, .renderNoDisplay div, .renderNoDisplay input {
	width: 0 !important;
	height: 0 !important;
	border: none !important;
	margin: 0 !important;
	padding: 0 !important;
}

.imageKategorie {
	border-style: solid !important;
	border-color: var(--ishImageKategorieBorderColor) !important;
	border-width: 3px;
}

/* .imageKategorieSelectStyle {
	background-color: #fff110 !important;
} */

.imageKategorieSelectStyle {
  background-color: var(--imageCatColor) !important;
}


.imageKategorieStyleError {
	background-color: var(--ishImageKategorieErrorBackground) !important;
}

.imageKategorieBorder {
	border-style: solid !important;
	border-color: var(--ishImageKategorieBorderColor) !important;
	border-width: thin !important;
}

.RadioPirioBorder {
	border-style: solid !important;
	border-color: var(--ishRadioPrioBorderColor) !important;
	border-width: thin !important;
}

.imageKategorieError {
	border-style: solid !important;
	border-color: var(--ishImageKategorieErrorBorderColor) !important;
	border-width: 3px;
}

/* Inventar: Chrome-Android Pull-to-refresh im Inventar-Scrollcontainer unterbinden (per Klasse gescopet, kein globaler Effekt). */
.ishInvNoOverscroll section {
	overscroll-behavior-y: contain;
}

@media print {
	.sapMPage section{
		position: initial !important;
		overflow: visible !important;
	}
	.sapMNavItem, .sapMNavItem.sapMPage, .sapTntToolPageMainContentWrapper, .sapTntToolPage  {
		height: initial !important;
		position: relative !important;
	}
	.sapUiView, .sapUiComponentContainer, .sapUiComponentContainer>div, .sapMApp, .sapTntToolPageMainContent {
		height: initial !important;
	}
	.sapTntToolPageMain {
		height: fit-content !important;
	}
	.sapTntToolPageContentWrapper {
		height: initial !important;
		max-height: initial !important;
	}
}
.faded {
	opacity: 0;
}
.fade-in {
	animation: ISHfadeIn 1s forwards;
}
.fade-out {
	animation: ISHfadeOut 1s forwards;
}

@keyframes ISHfadeIn {
	from {
		opacity: 0;
	}
	to {
		opacity: 1;
	}
}
@keyframes ISHfadeOut {
	from {
		opacity: 1;
	}
	to {
		opacity: 0;
	}
}
.hide-animation {
animation: fadeOut 1s forwards; /* 'forwards' makes sure the final state (opacity: 0) is retained after the animation ends */
}
.LeftSideOverflowToolbar {
	display: flex;
    flex-direction: column;
    align-items: flex-start;
    width: 45px;
}

.TopSideOverflowToolbar {
	display: flex;
	position: absolute;
	right: 0px;
	/* flex-direction: row-reverse */
}
.RotateNorth::before {
	display: block;
    content: "";
    width: 46px;
    height: 40px;
    background-size: 38px;
    background-image: url("../planview/lib/Kompass.svg");
    background-color: transparent;
    background-repeat: no-repeat;
    background-position: center;
    font-size: 0;
}
.ISHMarginLeft {
	margin-left: 10px !important;
}
  


.ishRBIBAPage section .sapUxAPObjectPageSectionHeader {
	border-bottom: 0.25rem solid var(--ishRbibaSectionHeaderBorder);
}
.ishRBIBAPage section .sapUxAPObjectPageSectionTitle {
	border-bottom: 0.25rem solid var(--ishRbibaSectionTitleBorder);
}

.sapMText[data-ish-text-bold="true"] {
	font-weight: bold;
}

.sapMDialogScrollCont {
	color: var(--ishDialogScrollTextColor);
	margin-left: 15px;
	margin-right: 15px;
}


.ishIconButtonWeight {
	font-variation-settings:
	'FILL' 1,
	'wght' 300,
	'GRAD' -25,
	'opsz' 24
}
.ishIconButtonWeight ::before {
	font-size: 1.5rem;
	width: 100% !important;
}

/* Die geteilten Knoepfe im IFC-Viewer ("Messen" sowie "Zeiger / Springen") tragen ZWEI Symbole: links das Messwerkzeug (aus
   Material-Symbols, gross und dick wie die uebrigen Werkzeuge), rechts den Aufklapp-Pfeil von UI5.
   Ohne Zutun bekommt der Pfeil beide Masse des Messwerkzeugs und wird zum Block ueber dem ganzen
   Knopf - nachgemessen 34px Symbol in einem 50px breiten Pfeilteil, bei 48px Knopfbreite.

   Drei Vorgaben stehen dem entgegen, deshalb hier `!important` - gemessen an der laufenden Anwendung,
   nicht aus Bequemlichkeit:
   - `.ishIconButtonWeight ::before` (weiter oben) traf jedes Symbol im Knopf, auch den Pfeil;
   - `.sapMBtnIcon { width: 2.125rem !important }` aus `Theme_Overide.css` gilt app-weit;
   - `.sapUiSizeCompact .sapMMenuBtn .sapMBtnIcon` gibt jedem Symbol 7px Abstand je Seite (gleiche
     Spezifitaet wie hier, aber spaeter geladen) - der Pfeil wurde damit 30 statt 20px breit.
   Dasselbe Vorgehen wie beim Fahnen-Knopf im Plan (s. `.ishPlanFlag .ishPlanFlagActionBtn`).

   Der Pfeil bleibt dabei SCHMAL: er ist kein zweites Werkzeug, sondern nur der Zugang zum Menue, und
   die Leiste soll nicht breiter werden als noetig. UI5 gibt jedem Knopfinneren 2rem Mindestbreite -
   damit waere der Pfeil so breit wie das Werkzeug daneben und die Leiste muesste auf 4.5rem wachsen
   (ausprobiert, sah nach doppeltem Knopf aus). So misst er 20px, und die Leiste behaelt am
   Desktop ihre 3rem: 24px Symbol plus 20px Pfeil.

   Auf Touch-Geraeten ("cozy") sind die Symbole selbst groesser - 34px statt 24 - und 34 plus 20
   passen nicht mehr in 3rem. Dort, und nur dort, waechst die Leiste auf 3.5rem. `!important`, weil die
   Breite im View als Eigenschaft der VBox steht und damit als Stil am Element landet.

   Nur die senkrechte Leiste braucht eine Breitenvorgabe. Steht der Knopf in der waagrechten
   Werkzeugzeile (am Handy, s. `IfcViewer._werkzeugeAmHandyInDieLeiste`), findet er seine Breite
   selbst, und im "..."-Menue nimmt er wie die uebrigen Eintraege die volle Breite. */
.ishIconButtonWeight .sapMSBArrow ::before {
	font-size: 1rem;
	width: auto !important;
}

.ishIfcSplitTool .sapMSBArrow .sapMBtnIcon {
	width: 0.875rem !important;
	margin-left: 0.125rem !important;
	margin-right: 0.125rem !important;
}

.ishIfcSplitTool .sapMSBArrow .sapMBtnInner {
	min-width: 0 !important;
}

/* Beim Druck springen sonst beide Symbole: UI5 stellt das Symbol eines gedrueckten, hervorgehobenen
   geteilten Knopfs auf `position: absolute; left: 0` und legt dem Knopfinneren Innenabstand an - fuer
   einen Knopf MIT TEXT gedacht, bei einem reinen Symbolknopf verrutscht es nur (nachgemessen: Symbol
   4,5px zur Seite und 10px breiter, Pfeil 8px). Betroffen ist genau der Zustand, in dem man den Knopf
   am haeufigsten drueckt - hervorgehoben ist er, solange eine Messung laeuft.
   Die Rueckmeldung auf den Druck bleibt: Farbe und Rahmen aendern sich weiterhin. */
.ishIfcSplitTool .sapMBtnInner.sapMBtnActive .sapUiIcon {
	position: static !important;
	padding-right: 0 !important;
}

.ishIfcSplitTool .sapMBtnInner.sapMBtnActive {
	padding-left: 0 !important;
	padding-right: 0 !important;
}

.ishIfcToolRail .ishIfcSplitTool {
	width: 100%;
}

.sapUiSizeCozy .ishIfcToolRail {
	width: 3.5rem !important;
}

/* Werkzeugzeile des Modells am HANDY (gesetzt von `IfcViewer._werkzeugeAmHandyInDieLeiste`).

   Sie traegt dort alle elf Werkzeuge - im Hochformat passen die nicht nebeneinander. Statt sie ins
   "..."-Menue zu raeumen (jedes Werkzeug hinter zwei Antippern), bricht die Zeile um: gemessen sieben
   Eintraege in der ersten Reihe, vier in der zweiten, 89 px hoch statt 44. Im Querformat passt alles
   in eine Reihe, dann bricht nichts um - der Umbruch richtet sich von selbst nach dem Platz.

   Die Abstaende der Knoepfe muessen dafuer weg - alle vier Seiten, und der Abstand kommt stattdessen
   vom `gap` der Zeile selbst. Zwei Gruende:
   - senkrecht: `sapUiMediumMarginTopBottom` bzw. `sapUiSmallMarginTop` stammen aus der senkrechten
     Leiste; uebereinander gestapelt machten sie aus 97 px derer 169;
   - waagrecht: `sapUiTinyMarginBeginEnd` liegt zusaetzlich zum Abstand, den die Zeile ihren Knoepfen
     ohnehin gibt. Die zweite Reihe stand dadurch 8 px weiter innen und ihre Knoepfe 16 statt 8 px
     auseinander. Mit `gap` beginnt JEDE Reihe gleich (gemessen: beide bei 8 px, Schrittweite 44).
   `!important`, weil die UI5-Abstandsklassen selbst `!important` setzen. */
.ishIfcToolBarWrap {
	flex-wrap: wrap !important;
	height: auto !important;
	gap: 0.5rem;
}

.ishIfcToolBarWrap > .sapMBtn,
.ishIfcToolBarWrap > .sapMMenuBtn {
	margin: 0 !important;
}

/* Werkzeugleiste des IFC-Viewers auf TOUCH-GERAETEN (Tablet/Handy laufen in der Dichte "cozy").
   Zwei Dinge zusammen, eines allein waere falsch:

   1. Trefferflaeche. Der Knopf selbst ist 32px hoch (gemessen), die 48px des Kaestchens sind
      groesstenteils Abstand - fuer den Finger zu wenig. 2.75rem (44px) ist das uebliche Mindestmass
      und zugleich die Hoehe, die UI5 seinen cozy-Knoepfen sonst gibt.
   2. Abstaende. Groessere Knoepfe brauchen weniger Luft dazwischen, sonst waechst die Leiste ueber die
      Hoehe des Modellbereichs hinaus - im Querformat eines Handys bleiben dafuer nur rund 275px
      (gemessen bei 812x375). Mit 0.5rem statt 1rem passen die fuenf Eintraege dort.

   `!important` bei den Abstaenden, weil die UI5-Klasse `sapUiSmallMarginTop` selbst `!important`
   setzt; bei der Hoehe genuegt die hoehere Spezifitaet. */
.sapUiSizeCozy .ishIfcToolRail .sapMBtn {
	min-height: 2.75rem;
}

.sapUiSizeCozy .ishIfcToolRail > * {
	margin-top: 0.5rem !important;
}

/* Zeilen aus Bedienelementen, die im schmalen Dock UMBRECHEN duerfen (KI-Zeile der Pin-Maske,
   Standpunkt-Aktionen im Foto-Reiter): Abstand zwischen den Teilen UND zwischen den Reihen ueber
   `gap` statt ueber Raender an den einzelnen Knoepfen - ein Rand nach oben haette den Knopf
   gegenueber der Auswahl in DERSELBEN Reihe nach unten geschoben (nachgemessen: 4px). */
.ishActionRowWrap {
	gap: 0.25rem 0.5rem;
}

/* Knoepfe einer Gruppe ALLE SO BREIT WIE DER BREITESTE - fuer ein einheitliches Bild, statt einer
   Reihe verschieden breiter Kaesten (gemessen vorher: 32 / 44 / 44 px nebeneinander).

   Umgesetzt als Raster mit gleich breiten Spalten (`grid-auto-columns: 1fr`): ein Raster misst seine
   Spalten am breitesten Inhalt und gibt allen dieselbe Breite. `width: max-content` haelt die Gruppe
   dabei so schmal wie noetig - mit `1fr` allein zoege sie die ganze Zeile auseinander, und die
   Knoepfe waeren zwar gleich, aber unnoetig breit.

   `display` doppelt spezifiziert (`.sapMFlexBox`), weil UI5 seiner HBox `display: flex` mitgibt. */
.ishEqualButtons.sapMFlexBox {
	display: inline-grid;
	grid-auto-flow: column;
	grid-auto-columns: 1fr;
	gap: 0.5rem;
	width: max-content;
	max-width: 100%;
}

/* Die Knoepfe fuellen ihre Rasterzelle - ohne das behielten sie ihre Eigenbreite und stuenden links
   in einer breiteren Zelle. `min-width: 0` erlaubt zusaetzlich das Schrumpfen, wenn die Gruppe in
   einem schmalen Dock nicht mehr ganz hinpasst.

   Die Mindestbreite des Dokumenten-Knopfs (`min-width: 4rem`, vom Control als STIL am Element
   gesetzt) muss dabei weichen: sie ist breiter als die Zelle und haette die Spalten wieder
   auseinandergezogen. Deshalb `!important` - gegen einen Stil am Element hilft nichts anderes. */
.ishEqualButtons > .sapMBtn,
.ishEqualButtons > .ishDokumente,
.ishEqualButtons > .ishDokumente > .sapMBtn {
	width: 100%;
	min-width: 0 !important;
}

/* Breite der Auswahl in einer solchen Zeile: hier statt als Eigenschaft im View, weil sie am Handy
   kleiner sein muss und eine Eigenschaft als Stil AM ELEMENT landet - dagegen kommt kein Stylesheet
   an. Mit 8rem passten Knopfgruppe, Beschriftung und Auswahl im Dock eines Handys gerade NICHT mehr
   nebeneinander (gemessen: 359 px gebraucht, 343 vorhanden), und die Zeile brach um - genau die
   Hoehe, die das Zusammenlegen der Zeilen eingespart hat. */
.ishActionRowWrap > .sapMSlt {
	width: 8rem;
}

.sap-phone .ishActionRowWrap > .sapMSlt {
	width: 6.5rem;
}

/* Der Knopf-INNENTEIL fuellt den Knopf: `.ishFotoSquareBtn` gibt ihm sonst feste 2.75rem, und in
   einer breiteren Zelle klebte er samt Symbol links statt in der Mitte zu stehen - genau der
   ungleiche Eindruck, obwohl die Knoepfe selbst gleich breit sind. `!important`, weil die feste
   Breite mit derselben Spezifitaet gesetzt ist und spaeter geladen wird. */
.ishEqualButtons .sapMBtn > .sapMBtnInner {
	width: 100% !important;
	min-width: 0 !important;
}

/* Am Handy bekommen die Zellen zusaetzlich ein festes Mass: 2.75rem ist die uebliche Trefferflaeche
   fuer Finger, und alle Knoepfe sind damit exakt gleich gross - ohne diese Vorgabe richtet sich die
   Spaltenbreite nach dem breitesten Knopf und die Gruppe wurde breiter als das Dock hergibt
   (gemessen: 176 px Gruppe, dazu Beschriftung und Auswahl = 348 px bei 343 px Platz - die Zeile brach
   um). */
.sap-phone .ishEqualButtons.sapMFlexBox {
	grid-auto-columns: 2.75rem;
}

/* Am HANDY tragen diese Knoepfe nur ihr Symbol: gleich gross heisst hier gleich gross wie der
   BREITESTE, und ein Knopf mit Text zieht die ganze Gruppe auf seine Breite (gemessen: 3 x 89 px
   statt 3 x 44). Die Gruppe brauchte damit mehr Platz als das Dock hat und die Zeile brach um - die
   Hoehe fehlte der Aufnahmenliste. Der Text steht weiter als Sprechblase am Knopf, die Bedeutung
   geht also nicht verloren. */
.sap-phone .ishEqualButtons .sapMBtn .sapMBtnContent {
	display: none;
}

/* Anlegen-/Bearbeiten-Maske der Pins: der Innenabstand des Panels kommt aus dem Theme (10px/16px)
   und lag zusaetzlich zum Aussenrand. Im Dock ist die Breite knapp - hier reichen 8px zur Kante, die
   Beschriftungen der Felder tragen ihren Abstand selbst. */
.ishPinMaskPanel > .sapMPanelContent {
	padding: 0.25rem 0.5rem;
}

.ishPinRowTitle { font-weight: 600; }
/* Angeheftete Zeile des im Plan gewaehlten Pins ueber der Pin-Liste.
   Sie muss sich klar als EIGENER Bereich lesen und nicht als erste Listenzeile - deshalb mehrere
   Mittel zusammen: farbiger Balken links, flaechige Toenung, Schatten und ein deutlicher Abstand
   zur Liste. Ein duenner Rahmen allein reichte nicht, die Zeile verschwamm mit der Liste darunter.

   Zwei Klassen im Selektor (`.sapMFlexBox.ishPinAngeheftet`), weil das Element selbst eine FlexBox
   ist: UI5s eigene `.sapMFlexBox`-Regel liegt bei einer einzelnen Klasse gleichauf und gewinnt
   ueber die Reihenfolge - Flaeche und Abstand blieben dadurch wirkungslos.

   Die Toenung steht bewusst als fester rgba-Wert und nicht als Theme-Variable: die hier passenden
   Listen-Variablen loesen im Theme zu transparent auf. */
.sapMFlexBox.ishPinAngeheftet {
	background: rgba(0, 100, 217, 0.07);
	border: 1px solid rgba(0, 100, 217, 0.35);
	border-left: 4px solid #0064d9;
	border-radius: 0.25rem;
	box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08);
	/* Abstand nach unten setzt den Block sichtbar von der Liste ab (schlaegt sapUiTinyMarginBottom). */
	margin-bottom: 0.75rem;
	/* Ein Cluster kann zweistellig viele Pins enthalten - ohne Deckel schoebe der Block die
	   eigentliche Liste komplett aus dem Sichtbereich. Ab dieser Hoehe scrollt er in sich. */
	max-height: 16rem;
	overflow-y: auto;
}
/* Der Zeileninhalt bringt eigene Flaechen mit - durchsichtig lassen, sonst uebermalt er die
   Toenung. Das Element selbst traegt die Flaeche. */
.ishPinAngeheftet .sapMFlexBox {
	background: transparent;
}

/* Kopfzeile der Auswahlanzeige - dieselbe Akzentfarbe wie der Balken des Blocks darunter. */
.ishPinAngeheftetKopf {
	color: #0064d9;
	font-weight: 600;
	margin: 0 0 0.25rem 0.25rem;
}
/* Trennlinie zwischen mehreren angehefteten Zeilen (Cluster-Auswahl); nach der letzten keine. */
.ishPinAngeheftetZeile + .ishPinAngeheftetZeile {
	border-top: 1px solid rgba(0, 100, 217, 0.25);
}
.ishPinRowNr { font-family: ui-monospace, Consolas, monospace; font-variant-numeric: tabular-nums; opacity: .75; }


.ishMaskSwitchSmallOffText {
	--sapFontSmallSize: 0.625rem;
}

/* Detail-Footer (u.a. Firmenverwaltung, Personaldatenverwaltung): nur der Speichern-Button soll
   sichtbar sein, nicht die volle weisse "Floating Footer"-Pille von sap.uxap.ObjectPageLayout dahinter. */
.ishTransparentObjectPageFooter {
	background: transparent !important;
	box-shadow: none !important;
}

/* Personaldatenverwaltung Bildvorschau: dezenter Rahmen ums Bild bzw. um den "Kein Bild
   gefunden"-Platzhalter, damit auch ohne Bild erkennbar ist, wo eines angezeigt wuerde. */
.ishPersonBildFrame {
	border: 1px solid var(--sapList_BorderColor, #ccc);
	border-radius: 4px;
}

/* "Keine Daten"-Text bei ISHTable noData (siehe z.Bsp. ZusaetzlicheLiegenschaften/
   AnsprechpartnerListe/VirtuelleFirmenzuweisung.fragment.xml, additionalContent statt
   IllustratedMessage title/description - deren SAP-eigene Darstellung bricht in schmalen
   Containern mitten im Wort um, z.Bsp. "vorhan-den"). Rein eigene Klasse, keine sap-Klasse. */
.ishNoDataMessageText {
	word-break: keep-all;
	overflow-wrap: normal;
}

/* ISHTable */
/* Row-Actions als Buttons: Icon im Button zentriert, Padding raus (Icons stehen exakt untereinander). */
.ishRowActionBtn.sapMBtn,
.ishRowActionBtn .sapMBtnInner {
	min-width: 0 !important;
}
.ishRowActionBtn .sapMBtnInner {
	padding-left: 0 !important;
	padding-right: 0 !important;
}
/* Kleines Badge oben rechts AM Icon. Anker = Button-/Icon-Mitte (Icon sitzt mittig), damit das Badge
   unabhängig von der Button-Breite am Icon-Eck sitzt und innerhalb des Buttons bleibt (rutscht nicht raus). */

   /* Bei solchen "Überschreibungen" wird NICHT die ganze CSS Class überschrieben wie z.B. sapMBadgeIndicator.
    Hier werden nur bestimmte Eigenschaften dieser CSS Class angepasst, und das auch NUR, wenn der Parent über der
	 gesetzten Class diese gewisse Klasse hat, z.B. hier ishRowActionBtn
	 
	Heißt, die CSS wird NUR dann angepasst, wenn Struktur wie folgt ist:

	<div class="ishRowActionBtn">
	...
		<span class="sapMBadgeIndicator">
		...
		</span>
	</div>

	 */
.ishRowActionBtn .sapMBadgeIndicator {
	/* sap.m setzt im Compact-Modus position:relative -> hier hart auf absolute, damit die Positionierung greift (sonst muss man die lib-Styles manuell deaktivieren) */
	position: absolute !important;
	inset-inline-start: 50% !important;
	left: 50% !important;
	inset-inline-end: auto !important;
	right: auto !important;
	top: 0 !important;
	bottom: auto !important;
	margin: 0 !important;
	transform: translate(0.1rem, -0.3rem) !important;
	min-width: 0.85rem !important;
	width: auto !important;
	height: 0.85rem !important;
	line-height: 0.85rem !important;
	padding: 0 0.2rem !important;
	font-size: 0.6rem !important;
	box-sizing: border-box !important;
}
.ishTableDiagramView {
	background: var(--sapBackgroundColor);
}
.ishTableDiagramSettingsPopover .sapMSlt {
	width: 100%;
	margin-bottom: .5rem;
}

.ishTableDiagramGrid {
	padding: .75rem;
	box-sizing: border-box;
	align-items: start;
}

.ishTableDiagramCard {
	width: auto !important;
	min-width: 0;
	height: 22.5rem;
	display: flex;
	flex-direction: column;
	border: 1px solid var(--sapGroup_ContentBorderColor);
	border-radius: .375rem;
	background: var(--sapGroup_ContentBackground);
	box-shadow: var(--sapContent_Shadow0);
	overflow: hidden;
}

.ishTableDiagramCardHeader,
.ishTableDiagramCardSettings {
	flex: 0 0 auto;
	min-height: 2.5rem;
	height: auto !important;
}

.ishTableDiagramCardHeader .sapMTitle {
	font-size: .875rem;
	line-height: 1.2;
	min-width: 0;
}

.ishTableDiagramCardSettings.sapMTB {
	flex-wrap: wrap;
	row-gap: .25rem;
	padding-top: .25rem;
	padding-bottom: .25rem;
}

.ishTableDiagramCardSettings .sapMSlt {
	max-width: 100%;
}

.ishTableDiagramCanvas {
	flex: 1 1 auto;
	min-height: 0;
	padding: .4rem .6rem .6rem .6rem;
	box-sizing: border-box;
}

.ishTableDiagramLegendBottom {
	display: grid;
	grid-template-rows: minmax(0, 1fr) auto;
	gap: .25rem;
}

.ishTableDiagramLegendRight {
	display: grid;
	grid-template-columns: minmax(0, 1fr) minmax(7rem, 11rem);
	grid-template-rows: minmax(0, 1fr);
	gap: .5rem;
}

.ishTableDiagramLegendHidden {
	display: grid;
	grid-template-rows: minmax(0, 1fr);
}

.ishTableDiagramCanvasHolder {
	min-width: 0;
	min-height: 0;
	position: relative;
}

.ishTableDiagramCanvas canvas {
	display: block;
}

.ishTableDiagramEmpty {
	position: absolute;
	inset: 0;
	display: flex;
	align-items: center;
	justify-content: center;
	color: var(--sapContent_LabelColor);
	font-size: .875rem;
}

.ishTableDiagramLegend {
	min-width: 0;
	min-height: 0;
	overflow: auto;
	font-size: .75rem;
	color: var(--sapContent_LabelColor);
}

.ishTableDiagramLegendBottom .ishTableDiagramLegend {
	display: flex;
	flex-wrap: wrap;
	align-content: flex-start;
	gap: .25rem .75rem;
	max-height: 4rem;
}

.ishTableDiagramLegendRight .ishTableDiagramLegend {
	display: block;
	padding-top: .25rem;
}

.ishTableDiagramLegendHidden .ishTableDiagramLegend {
	display: none;
}

.ishTableDiagramLegendItem {
	display: flex;
	align-items: center;
	min-width: 0;
	gap: .25rem;
	margin-bottom: .2rem;
}

.ishTableDiagramLegendSwatch {
	display: inline-block;
	width: .65rem;
	height: .65rem;
	border-radius: .1rem;
	flex: 0 0 auto;
	border: 1px solid var(--ishTableDiagramLegendSwatchBorder);
}

.ishTableDiagramLegendText {
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

/* div.sapUxAPBlockContainer:has(>div>div>div.ishTable) {
	padding: 0 !important;
}
div.sapUiRespGrid:has(>div>div.ishTable) {
	padding: 0 !important;
}
div:has(>div.ishTable) {
	margin: 0 !important;
	width: 100% !important;
}
.ishTableHeader {
	border-top-left-radius: 0.75rem !important;
	border-top-right-radius: 0.75rem !important;
}
.ishTableFooter {
	border-bottom-left-radius: 0.75rem !important;
	border-bottom-right-radius: 0.75rem !important;
} */

/* Personen Details Dialog */

.PersoneninTitle {
	font-size: 17px !important;
    font-weight: 700 !important;
	text-shadow: none !important;
	border-bottom: var(--ishPersonenTitleBorderColor) solid 2px;
	width: 290px;
	margin-bottom: 20px;
}
.PersoneninIcons .PersonenDisplayListItem {
	background: unset !important;
    border: none;
    padding-bottom: 35px;
    padding-left: 0;
}


/* Im Dokumente Dialog manuell die PAdding und margin abdrehen*/
.ishDokumenteDialog .sapMDialogScroll {
	padding: 0 !important;
}
.ishDokumenteDialog .sapMDialogScrollCont {
	margin: 0 !important;
}

.ishQRRatio{
	aspect-ratio: 1 !important;
}

.ishColoredLinkButton {
	width: 25px;
	height: 15px;
	display: block;
	border: 2px solid var(--ishColorSwatchBorderColor);
	border-radius: 5px;
    padding: 0px 5px 5px 5px;
}
.ishColorLink {
	color: var(--ishColorLinkColor) !important;
}

/* Dokumente-Control: Zaehler + Icon-Button auf einer Linie, vertikal zentriert (count+button-Modus) */
.ishDokumenteInline {
	display: inline-flex;
	align-items: center;
}

/* Bezugsgroessen-Gruppenueberschrift: dezenter kleiner Farbpunkt statt prominenter Kreis */
.ishRefGroupHeader .ishColorCircle {
	width: 10px;
	height: 10px;
	border: 1px solid var(--ishRefGroupHeaderBorder);
	border-radius: 50%;
}

/* Webmaske Spalten-Modus (MaskColumnGroupBuilder): partielle FormContainer-Zellen linksbuendig
   zu den Voll-Zeilen ausrichten - Grid-Gutter als rechtes statt linkes Padding. */
.ishMaskColumnGroup .sapUiFormResGridMain > [class*="sapUiRespGridSpan"] {
	padding-left: 0 !important;
	padding-right: 0.75rem !important;
}

/* StatusSelektor (Status-Auswahl mit Farbindikator, Nachbau Desktop-Statuscombo).
   Auswahlflaeche/Marker/Liste sind komponierte UI5-Built-ins; hier nur der Feld-Look -
   kein Hand-DOM-Styling mehr (Marker-Sichtbarkeit regelt _contrastMarkerColor im Control). */
.ishStatusSelektor {
	display: flex;
	align-items: center;
	gap: 0.5rem;
	width: 100%;
	/* Hoehe an die einzeiligen Nachbarfelder angleichen (sonst Masonry-Versatz im Spalten-Float-Grid). */
	height: 1.75rem;
	box-sizing: border-box;
	padding: 0 0.625rem;
	border: 1px solid var(--sapField_BorderColor, #89919a);
	border-radius: var(--sapField_BorderCornerRadius, 0.25rem);
	background: var(--sapField_Background, #fff);
}
.ishStatusSelektorEditable {
	cursor: pointer;
}
.ishStatusSelektorEditable:focus {
	outline: 1px dotted var(--sapContent_FocusColor, #0032a0);
	outline-offset: 1px;
}
.ishStatusSelektorReadonly {
	background: var(--sapField_ReadOnly_Background, #f5f6f7);
	border-style: dashed;
	cursor: default;
}
.ishStatusSelektorText {
	flex: 1 1 auto;
	min-width: 0;
}
.ishStatusSelektorCaret {
	flex-shrink: 0;
	font-size: 0.75rem;
	color: var(--sapContent_IconColor, #0070f2);
}
/* Sichtbarkeit heller/weisser (bzw. im Dark Mode dunkler) Status loest StatusSelektor._contrastMarkerColor
   ueber Farbanpassung - kein Rahmen mehr noetig. Marker wird als voll gefuellter Kreis gezeichnet
   (background = currentColor = die vom Control gesetzte Icon-Farbe), nicht als Font-Glyph - so ist er
   garantiert solide statt ringartig. */
.ishStatusMarker {
	flex-shrink: 0;
	box-sizing: border-box;
	display: inline-block;
	width: 0.75rem;
	height: 0.75rem;
	background-color: currentColor;
	border-radius: 50%;
	/* Glyph (SAP-icon record) sicher ausblenden - das record-Glyph ist ein Ring und wuerde sonst
	   ueber der Disc liegen (heller Kern). font-size:0 schlaegt den Spezifitaets-Gleichstand mit
	   der SAP-Regel .sapUiIcon::before zuverlaessig; die Disc-Groesse haengt an width/height. */
	font-size: 0;
}
.ishStatusMarker::before {
	content: none;
}
/* Abstand Marker -> Text in der Dropdown-Liste (zwischen Tiny 0.5 und Small 1.0). */
.ishStatusListMarker {
	margin-inline-end: 0.75rem;
}
/* Zeilenabstand in der aufgeklappten Liste: die Compact-Density quetscht die Eintraege sonst
   auf ~21px zusammen. Padding pro Eintrag gibt vertikale Luft zwischen den Status. */
.ishStatusSelektorPopover .sapMCLI {
	padding-block: 0.375rem;
}
/* Marker und Text exakt mittig in der Zeile: die HBox-Flex-Items (Wrapper-Divs) sind zeilenhoch,
   ihr Inhalt sitzt sonst oben (Text ~2px zu hoch, Marker auf Baseline). Wrapper selbst zentrieren. */
.ishStatusSelektorPopover .sapMCLI .sapMFlexItem {
	display: flex;
	align-items: center;
}

.ishReportGeneratorDropZone {
	box-sizing: border-box;
	min-height: 4rem;
	padding: 0.75rem;
	border: 1px dashed var(--sapField_BorderColor, #89919a);
	border-radius: 0.375rem;
	background: var(--sapGroup_ContentBackground, #fff);
	color: var(--sapContent_LabelColor, #55616f);
	justify-content: center;
	gap: 0.25rem;
}

.ishReportGeneratorDropZoneActive {
	border-color: var(--sapField_BorderColor, #89919a);
	background: var(--sapField_ReadOnly_Background, #f5f6f7);
}

.ishReportGeneratorDesignerContent {
	box-sizing: border-box;
	width: 100%;
	padding: 0.75rem 0.5rem 0.75rem 0.75rem;
}

.ishReportGeneratorElementRow {
	box-sizing: border-box;
	min-width: 0;
	padding-right: 0.25rem;
	cursor: grab;
}

.ishReportGeneratorElementRow:active {
	cursor: grabbing;
}

.ishReportGeneratorDragHandle {
	flex: 0 0 2rem;
	color: var(--sapContent_LabelColor, #55616f);
	cursor: grab;
	text-align: center;
}

.ishReportGeneratorElementText {
	min-width: 0;
}

.ishReportGeneratorElementText .sapMText {
	display: block;
	max-width: 100%;
	overflow: hidden;
	text-overflow: ellipsis;
}

.ishReportGeneratorElementActions {
	flex-shrink: 0;
	column-gap: 0.125rem;
}

.ishReportGeneratorColumnWidthList .sapMLIB {
	padding-left: 0;
	padding-right: 0;
}

.ishReportGeneratorColumnWidthRow {
	box-sizing: border-box;
	padding: 0.25rem 0;
}

.ishReportGeneratorColumnWidthLabel {
	width: calc(100% - 6.5rem);
	min-width: 0;
	padding-right: 0.5rem;
	overflow: hidden;
	text-overflow: ellipsis;
}

.ishReportGeneratorColorButton,
.ishReportGeneratorColorPaletteButton {
	box-sizing: border-box;
	width: 2.25rem;
	height: 2.25rem;
	border: 1px solid var(--sapField_BorderColor, #89919a);
	border-radius: 0.25rem;
	padding: 0;
	cursor: pointer;
}

.ishReportGeneratorColorButton:hover,
.ishReportGeneratorColorPaletteButton:hover {
	outline: 2px solid var(--sapField_BorderColor, #89919a);
	outline-offset: 1px;
}

.ishReportGeneratorColorPalette {
	display: grid;
	grid-template-columns: repeat(5, 2.25rem);
	gap: 0.5rem;
	padding: 0.75rem;
}

/* (Alt-Regeln des In-Panel-Foto-Viewers entfernt — Anzeige laeuft jetzt im Overlay-Fenster,
   Styling in planview/lib/ol.css: .ishFotoViewer / .ishFotoViewerMaximized.) */

/* PlanView-Sidepanel: die Reiterleiste der IconTabBar wird durch den Modul-Umschalter in der
   Kopfzeile ersetzt (MenuButton mit Dropdown + Favoriten). Die IconTabBar bleibt als Container
   erhalten, damit Panel-IDs, Hoehen- und Scrollverhalten unveraendert bleiben - sie hat aber KEINE
   Eigenschaft, um ihren Kopf auszublenden (`_header` ist eine hidden aggregation, UI5 1.143).
   `display: none` und nicht `visibility: hidden`, damit die Leiste auch aus der Tab-Reihenfolge
   faellt. ACHTUNG: haengt an der UI5-internen Klasse `.sapMITH` - bei einem UI5-Upgrade pruefen. */
.ishSidePageNoTabStrip > .sapMITH {
	display: none;
}

/* PlanView-Sidepanel: Mantel der Reiterzeile fuer die Unterreiter eines Moduls (heute die fuenf des
   IFC-Viewers). Die Zeile haengt in der `subHeader`-Aggregation der Page, weil nur die Page den Platz
   ueber dem absolut positionierten Inhaltsbereich selbst abrechnet (Begruendung: planviewng/views/
   SidePage.view.xml). `subHeader` nimmt aber nur einen `sap.m.IBar`, und das ist der IconTabHeader
   nicht - deshalb ein `sap.m.Toolbar` als Mantel. Beide brauchen eine Korrektur:

   1. Der Toolbar gibt sein waagrechtes Polster ab; das der Reiterleiste (Punkt 2) genuegt. Dazu bekommt
      er die HOEHE der Reiter, und der Inhaltsbereich der Page ein passendes `top` - die beiden Werte
      gehoeren zusammen (Punkt 3).
   2. Der IconTabHeader muss auf die Breite der Leiste gezwungen werden. Von sich aus ist er
      inhaltsbreit, und dann rechnet er seinen Ueberlauf gegen die eigene Inhaltsbreite - er verschiebt
      also NIE einen Reiter in sein "Mehr"-Menue, sondern laeuft aus der Leiste heraus (`overflow:
      hidden` am Toolbar schneidet ihn ab). `width: 100%` allein genuegt nicht: `.sapMITH` traegt
      `padding: 0 32px` bei `box-sizing: content-box`, die Randbox waere also 64px breiter als die
      Leiste (gemessen: 590 statt 526). Daher `border-box` UND kein waagrechtes Polster: die fuenf
      Reiter brauchen 483px, und der IconTabHeader haelt beim Entscheiden zusaetzlich Platz fuer sein
      "Mehr"-Menue frei. Schon mit 8px Polster je Seite (510px Inhalt) verschwand "Stockwerke" bei
      voller Dockbreite im "Mehr"-Menue; mit den vollen 526px stehen alle fuenf.
      Nachgemessen (frisch gerendert, nicht per Stil umgeschaltet - der Ueberlauf wird nur beim
      Rendern/Groessenwechsel neu berechnet): volle Breite = alle fuenf Reiter, "Mehr" eingeklappt;
      320px = zwei Reiter + "Mehr"; 220px = einer + "Mehr" - in keinem Fall ein abgeschnittener Reiter.
      Der Selektor nennt zusaetzlich `.sapMTB`, um das Polster ueberhaupt setzen zu koennen: UI5 vergibt
      es mit `.sapUiMedia-Std-Desktop .sapMITH` (bzw. `-Tablet`), also mit ZWEI Klassen - gleich
      spezifisch wie `.ishSidePageSubTabBar > .sapMITH`, und library.css wird nach dieser Datei geladen,
      gewinnt den Gleichstand also. Mit `.sapMTB` sind es drei Klassen und die Ladereihenfolge ist egal.
   3. Hoehe der Leiste UND `top` des Inhaltsbereichs muessen zusammen gesetzt werden - eines von beiden
      allein ist ein Fehler. Seit die Page KEINE Kopfzeile mehr traegt (Bedienung des Docks steht in der
      gemeinsamen Leiste der Ansicht, s. planviewng/views/SidePage.view.xml) ist `top` genau die Hoehe
      dieser Reiterzeile, also 2.875rem (46px) - in beiden Dichten derselbe Wert, weil der
      IconTabHeader dichteunabhaengig 45px hoch ist.

      GESCHICHTE, damit der Fehler nicht wiederkommt: vorher standen hier ZWEI Regeln (5.375rem fuer
      Compact, 5.625rem fuer Cozy = Kopfzeile + Leiste), beide auf
      `.sapMPageWithHeader.sapMPageWithSubHeader`. Mit der entfallenen Kopfzeile vergibt UI5 diese
      Klasse nicht mehr - die Regeln trafen also NICHTS, und es galt wieder der Themenwert
      (`.sapUiSizeCompact .sapMPageWithSubHeader > section{top:2rem}` bzw. per Geschwisterselektor
      2.75rem in Cozy). Der Inhalt begann damit 14px zu hoch, die Reiterzeile lag ueber ihm
      (nachgemessen in beiden Hosts: Zeile 99…145, Inhalt ab 131). Eine Regel, die nie trifft, ist
      schlimmer als keine - sie sieht nach Abdeckung aus.

      - Ein `sap.m.Toolbar` ist von sich aus 2rem hoch (32px, Compact; Cozy 2.75rem = 44px) und
        `overflow: hidden`, der IconTabHeader dagegen 45px
        (`.sapMITBInLine.sapMITBTextOnly … .sapMITBFilter{height:2.75rem}` plus 1px, in BEIDEN Dichten).
        Bei 32px wird er mittig auf die Leiste beschnitten - der Reitertext bleibt sichtbar, der
        AUSWAHL-INDIKATOR aber nicht: das ist der 3px-Balken `.sapMITBContentArrow::after`, er sass
        gemessen bei 143…146 und die Leiste endete bei 140, lag also vollstaendig im weggeschnittenen
        Bereich. Damit unterschied nur noch die Textfarbe die fuenf Reiter - Farbe als einziges
        Merkmal (WCAG 1.4.1), und der frueher unterstrichene aktive Reiter (Kundenwunsch) fehlte.
        Daher `height: 2.875rem` (46px): 2.75rem Reiterhoehe + 0.125rem, damit die 45px des
        IconTabHeader samt Indikator sicher hineinpassen. Ein Wert fuer beide Dichten - der
        IconTabHeader ist in beiden gleich hoch.
        Die Hoehe braucht DREI Klassen im Selektor: der Gegenspieler `.sapUiSizeCompact .sapMTB`
        (2rem) ist mit zwei Klassen genauso spezifisch wie `.ishSidePageSubTabBar.sapMTB`, und
        library.css wird nach dieser Datei geladen - gewinnt den Gleichstand also (nachgemessen: die
        Zeile blieb bei 32px). Mit `.ishSidePageStableHeight` als Vorfahre sind es drei.
      - `top` des Inhaltsbereichs ist ein FESTER Themenwert und wandert mit einer hoeheren Leiste NICHT
        mit - der Ueberhang liegt dann ueber dem Panelinhalt und faengt dessen Klicks ab (genau dieser
        Befund). Der `<section>` ist absolut positioniert und steht im DOM NACH der subHeader, gewinnt
        also die Ueberdeckung.
        Hier hilft Klassenzaehlen NICHT: der Compact-Themenwert kommt ueber einen Vorfahren
        (`.sapUiSizeCompact .sapMPageWithSubHeader`), der Cozy-Wert ueber Geschwisterselektoren
        (`.sapMPage > .sapMPageSubHeader + section`) - beides Konstruktionen, die ein
        Spezifitaetsgleichstand nicht sicher schlaegt. Deshalb `!important` wie bei der Hoehenregel
        oben. Bewusst OHNE Dichteklasse im Selektor: der Wert ist in beiden Dichten derselbe, und ein
        Selektor mit Dichteklasse traf schon einmal nichts mehr, als sich die Klassen der Page
        aenderten.
   ACHTUNG: haengt an den UI5-internen Klassen `.sapMTB`/`.sapMITH`/`.sapMPageWith*` - bei einem
   UI5-Upgrade pruefen (Messanleitung: `elementFromPoint` im Band der Zeile und knapp darunter muss
   Inhalt liefern, und `.sapMITBContentArrow::after` muss innerhalb der Leiste liegen). */
.ishSidePageSubTabBar.sapMTB {
	padding: 0;
}

.ishSidePageStableHeight .ishSidePageSubTabBar.sapMTB {
	height: 2.875rem;
}

/* Der Inhalt beginnt genau unter der Reiterzeile - ihre Hoehe von oben, kein Themenwert (s. Punkt 3). */
.sapMPage.ishSidePageStableHeight.sapMPageWithSubHeader > section {
	top: 2.875rem !important;
}

.ishSidePageSubTabBar.sapMTB > .sapMITH {
	box-sizing: border-box;
	width: 100%;
	padding-left: 0;
	padding-right: 0;
}

/* PlanView-Sidepanel: macht die Vorfahren-Hoehenkorrektur einer FREMDEN `sap.m.App` unschaedlich.
   Das ueber einen ComponentContainer im TGA-Reiter eingebettete Modul `ish.rkvviewweb.auftrag` bringt
   eine eigene `sap.m.App` mit `isTopLevel=true` mit. Deren `_adjustParentsHeight` setzt inline
   `height: 100%` auf jeden Vorfahren ohne inline-Hoehe - quer durch unser Sidepanel bis zur
   Splitter-Spalte. Es haengt an `onAfterRendering`, laeuft also bei JEDEM Re-Rendering; sichtbar wird
   nur der erste Lauf, weil die weiteren wirkungslos bleiben, solange die inline-Hoehen stehen. Wird
   eine dieser Hoehen irgendwo zurueckgesetzt, schlaegt der naechste Lauf wieder zu.
   Begruendung und Symptom: siehe planviewng/views/SidePage.view.xml.
   Nicht per `data-sap-ui-root-content` (die UI5-INTERNE Abbruchmarke von `_adjustParentsHeight` -
   nicht dokumentiert, nur in `sap/m/App.js`, `Shell*` und `SplitApp.js` verwendet) geloest: UI5
   verweigert `writeToDom` fuer CustomData-Keys, die mit `sap-ui` beginnen.

   Der Verursacher ist NICHT auf dieses Sidepanel beschraenkt: das Legacy-Sidepanel
   (ifcplan/views/SidePage.view.xml) hat denselben Aufbau (Page + customHeader + TGA-Reiter) und
   damit denselben Balken, und das Auftrag-Modul ist an fuenf weiteren Stellen genauso eingebettet
   (brandschutz/views/{Index,Brandschutzbuch,Rundgang}.view.xml,
   objektsicherheit/views/Rundgang.view.xml, projektmanagement/views/Uebersicht.view.xml).
   Die Wurzelbehebung waere `isTopLevel="false"` an core/views/ModuleBaseView.view.xml (`moduleRoot`
   ist nie die echte Top-Level-App, das ist die `sap.m.App` der Shell) - hier absichtlich NICHT
   gemacht, weil das alle Wirte auf einmal umstellt; das gehoert in einen Folge-Task. Wer den Balken
   an einer der anderen Stellen sieht: bitte hier weiterlesen statt Container oder Scrollverhalten
   umzustellen - die Ursache ist bereits analysiert.

   Regel 1 - der Inhaltsbereich der Page (`<section>`) ist absolut positioniert und wird allein von
   `top`/`bottom` bemessen; `height: auto` ist genau dieses Verhalten. `!important`, weil die fremde
   Hoehe inline gesetzt wird und sonst gewinnt.
   Regel 2 - der Inhalt-Div der IconTabBar traegt 16px Polster (`applyContentPadding`); mit einer
   100%-Hoehe im `content-box`-Modell wuerde er seinen Container um 32px ueberragen.
   ACHTUNG: haengt an den UI5-internen Klassen `.sapMITB*` - bei einem UI5-Upgrade pruefen. */
.ishSidePageStableHeight > section {
	height: auto !important;
}

.ishSidePageStableHeight > section > .sapMITB > .sapMITBContainerContent > .sapMITBContent {
	box-sizing: border-box;
}

/* Kleiner Abstand um den Inhalt der fuenf IFC-Unterreiter (Eigenschaften, Dokumente, Models,
   Schnitte, Stockwerke). Sie lagen bisher bundig an den Kanten - Schalter und Ueberschriften
   klebten links am Rand und direkt unter der Reiterzeile -, waehrend die uebrigen Panels
   (Pins, Fotostandpunkte, ...) ihre 0.5rem mitbringen.

   Warum eine eigene Regel und keine UI5-Standardklasse: UI5 hat fuer beliebige Controls nur MARGIN-
   Klassen (`sapUiTinyMargin` = 0.5rem, wie in den anderen Panels benutzt), und Margin traegt hier
   nicht: zwei der fuenf Wurzeln sind ein `ScrollContainer height="100%"`, eine dritte ein `FixFlex` -
   ein Aussenabstand liegt bei ihnen ausserhalb der 100% und erzeugt genau den Scrollbalken am Dock,
   der an anderer Stelle in dieser Datei schon einmal muehsam beseitigt wurde. Polster mit
   `border-box` waechst nach innen und laesst die Hoehe unberuehrt (gemessen: Ueberlauf 0 in allen
   fuenf Reitern). Dasselbe Mittel benutzt UI5 fuer sein eigenes Inhaltspolster
   (`.sapUiAFLayout.sapUiContentPadding{padding:1rem;box-sizing:border-box}`), nur greift dessen Klasse
   ausschliesslich in bestimmten Containern.

   DREI Klassen im Selektor, obwohl eine genuegen wuerde: der Eigenschaften-Reiter haengt sein Polster
   an eine `sap.m.List`, und dort trifft `.sapMList.sapUiNoContentPadding{padding:0}` - zwei Klassen,
   und library.css wird nach dieser Datei geladen, gewinnt den Gleichstand also (nachgemessen: das
   Polster blieb bei 0, waehrend die vier uebrigen Reiter ihre 8px hatten). Das `sapUiNoContentPadding`
   bleibt an den Wurzeln stehen: es schaltet UI5s eigenes, groesseres Inhaltspolster ab, unser kleineres
   kommt von hier. ACHTUNG: `.sapMITBContent` ist UI5-intern - bei einem UI5-Upgrade pruefen. */
.ishSidePageStableHeight .sapMITBContent .ishIfcTabContent {
	box-sizing: border-box;
	padding: 0.5rem;
}

.ifcSideNoOuterScroll,
.ifcSideNoOuterScroll > section,
.ifcSideNoOuterScroll .sapMITBContainer,
.ifcSideNoOuterScroll .sapMITBContainerContent {
  overflow: hidden !important;
  height: 100%;
  min-height: 0;
}

/* WICHTIG: Content selbst nicht hart clippen */
.ifcSideNoOuterScroll .sapMITBContent {
  overflow: auto !important;
  height: 100%;
  min-height: 0;
}

/* TGA-Page: eigener Scrollbereich + etwas Luft unten */
.tgaShowOverflow .sapMPageEnableScrolling {
  overflow-y: auto !important;
  padding-bottom: 2rem;
}

.ishAPIstSollRed.sapMText {
	color: red;
}
/* Historie-Tabelle im Pin-Dialog (planviewng): die Trennlinie unter der LETZTEN Zeile zeichnet einen
   Rahmen unter die Liste, obwohl darunter nichts mehr kommt - im Dialog sieht das aus wie ein
   abgeschnittener Kasten. Die Linien ZWISCHEN den Zeilen bleiben, sie trennen ja etwas. */
.ishHistorieTabelle .sapMListTbl > tbody > tr.sapMListTblRow:last-child > td {
	border-bottom: none;
}

/* Statusfarbe in der Pin-Tabelle: derselbe Marker wie sonst die Kugel (`StatusDisplay` setzt die
   Farbe als Inline-Stil), hier aber als schmaler senkrechter Balken am Zeilenanfang - so wie ihn die
   Karte im Block "Im Plan gewaehlt" traegt. Kein Rahmen, damit die Farbe voll zur Geltung kommt. */
.ishStatus.ishPinStatusBalken {
	width: 6px;
	height: 1.75rem;
	border: none;
	border-radius: 3px;
}


/* Titelzeile etwas kraeftiger - sie benennt das Objekt, alles darunter beschreibt es nur. */
.ishPlanFlag .ishPlanFlagContent > .sapMTitle {
	font-weight: bold;
}

/* Die Fahne am Kartenobjekt: ein OL-Overlay der Karte (s. planview/lib/PlanMap.showFlag) traegt den
   UI5-Inhalt (planviewng/fragments/PlanFlag.fragment.xml), und DIESER Inhalt ist die Sprechblase.
   Gestaltet wie im alten Viewer (`.popup` in Plan_Baudoku/src/ish.css), nur mit Theme-Farben und
   kraeftigerem Schatten - auf dem hellen, kleinteiligen Grundriss verschwimmt eine flache Blase.

   Bewusst KEIN `position`/`display` hier: der aeussere Overlay-Knoten gehoert OpenLayers, und der
   Inhalt darf dessen Groesse bestimmen (davon haengt die Ausrichtung `bottom-center` ab). */
/* Der Klassenname steht zweimal (`.ishPlanFlag.sapMFlexBox`), um die UI5-Klasse
   `sapMFlexBoxBGTransparent` zu ueberstimmen - sonst bleibt die Blase durchsichtig und der Text
   steht ohne Hintergrund auf dem Plan. */
.ishPlanFlag.sapMFlexBox {
	position: relative;
	/* Breite nach dem Inhalt, damit nicht jede Zeile Wort fuer Wort umbricht; nach oben begrenzt. */
	width: max-content;
	padding: 0.375rem 0.5rem;
	background: var(--sapGroup_ContentBackground, #fff);
	border: 1px solid var(--sapContent_ForegroundBorderColor, #c8c8c8);
	border-radius: 6px;
	box-shadow: 0 0.5rem 1.5rem rgba(0, 0, 0, 0.35);
	max-width: 22rem;
	z-index: 1;
}

/* Zipfel zum Objekt hin - dasselbe gedrehte Quadrat wie im Legacy, damit die Blase sichtbar an
   ihrem Pin haengt und nicht frei ueber dem Plan schwebt. */
/* `--ishFlagTailShift` setzt die Karte, wenn sie die Blase am Rand zur Seite ruecken musste
   (s. `PlanMap._fitFlagIntoView`): die Blase wandert, der Zipfel geht den Weg zurueck und zeigt
   weiter auf sein Objekt. Ohne Verschiebung ist die Variable 0 und alles steht wie zuvor. */
.ishPlanFlag::before {
	content: "";
	position: absolute;
	left: calc(50% + var(--ishFlagTailShift, 0px));
	bottom: -7px;
	width: 12px;
	height: 12px;
	background: var(--sapGroup_ContentBackground, #fff);
	border-right: 1px solid var(--sapContent_ForegroundBorderColor, #c8c8c8);
	border-bottom: 1px solid var(--sapContent_ForegroundBorderColor, #c8c8c8);
	transform: translateX(-50%) rotate(45deg);
}

/* Blase UNTER dem Objekt: dorthin klappt sie, wenn oben kein Platz mehr ist (s.
   `PlanMap._fitFlagIntoView`). Der Zipfel wechselt dabei die Seite - er sitzt jetzt oben und zeigt
   nach oben auf das Objekt. */
.ishPlanFlagOverlay[data-flag-below] .ishPlanFlag::before {
	top: -7px;
	bottom: auto;
	border-right: none;
	border-bottom: none;
	border-left: 1px solid var(--sapContent_ForegroundBorderColor, #c8c8c8);
	border-top: 1px solid var(--sapContent_ForegroundBorderColor, #c8c8c8);
}

/* Titelzeile kraeftiger - sie benennt das Objekt, alles darunter beschreibt es nur. */
.ishPlanFlag > .sapMVBox > .sapMTitle,
.ishPlanFlag > .sapMTitle {
	font-weight: bold;
}

/* Zeilenabstand knapp halten: die Fahne soll den Plan so wenig wie moeglich verdecken. */
.ishPlanFlag .ishPlanFlagLine {
	padding-top: 0.0625rem;
}

.ishPlanFlag .ishPlanFlagActions {
	padding-top: 0.25rem;
	/* `max-content`-Spalten wachsen ohne das sonst in den freien Platz (die Blase ist breiter als die
	   Knoepfe, weil Titel und Nachbarliste sie aufziehen). */
	justify-content: start;
}

/* Titel der Fahne kraeftiger. Eigene Regel, weil der Titel seit dem Statusbalken in einer weiteren
   HBox steckt - die beiden Kind-Selektoren weiter oben greifen dort nicht mehr. */
.ishPlanFlag .ishPlanFlagHeader .sapMTitle {
	font-weight: bold;
}

/* Beschriftung einer Angabe: gedaempft und auf gleicher Breite, damit die Werte eine Spalte bilden -
   dasselbe Bild wie eine eingeklappte Zeile der Pin-Liste. Bricht die Beschriftung laenger aus,
   waechst die Zeile mit; die Breite ist ein Mindestmass, keine Grenze. */
.ishPlanFlag .ishPlanFlagLineLabel {
	min-width: 3.5rem;
	padding-right: 0.25rem;
}

/* Im Raster fuellt jeder Knopf seine Spalte (`width="100%"`), sein Inhalt wird von UI5 aber mittig
   gesetzt - dann stehen Symbol und Text je Knopf woanders. Linksbuendig lesen die Beschriftungen sich
   als Spalte, so wie die Werte darueber. Der Abstand kommt vom `gridGap`, nicht von Raendern. */
.ishPlanFlag .ishPlanFlagActionBtn .sapMBtnInner {
	justify-content: flex-start;
}

/* Knoepfe schlanker machen. Das Symbol eines Knopfes MIT Text ist 34 px breit und das Knopfinnere
   hat 7 px Innenabstand je Seite - in einer Sprechblase, die den Plan verdeckt, ist das viel Luft
   fuer nichts (gemessen: 20 px je Knopf). Das Symbol bekommt seine eigene Groesse (1rem) plus einen
   schmalen Abstand zum Text; die HOEHE bleibt unberuehrt, sie ist das Fingerziel.

   `!important` ist hier noetig und nicht Bequemlichkeit - beide Werte kommen aus Regeln, die sonst
   gewinnen: die Breite aus `Theme_Overide.css` (`.sapMBtnIcon { width: 2.125rem !important }`, gilt
   app-weit), der Innenabstand aus der UI5-Bibliothek
   (`.sapUiSizeCompact .sapMBtnInner.sapMBtnText`, gleiche Spezifitaet wie hier, aber spaeter
   geladen). Beides gemessen an der laufenden Anwendung. */
.ishPlanFlag .ishPlanFlagActionBtn .sapMBtnInner {
	padding-left: 0.25rem !important;
	padding-right: 0.25rem !important;
}

.ishPlanFlag .ishPlanFlagActionBtn .sapMBtnIcon {
	width: 1rem !important;
	margin-right: 0.25rem;
}

/* Dasselbe Mass fuer ein BILD als Symbol: der Knopf "Pin hinzufuegen" traegt das Pin-Symbol des Plans
   (data-URI aus `svgIcons.getMangelIcon`), und UI5 rendert Bild-Symbole als `img` mit eigener Groesse. */
.ishPlanFlag .ishPlanFlagActionBtn img.sapMBtnCustomIcon {
	width: 1rem !important;
	height: 1rem;
	margin-right: 0.25rem;
}

/* Beschriftung der Statuswechsel in Inhaltsfarbe: ein gerahmter Knopf (`Default`) zeichnet seinen Text
   im Theme in der Markenfarbe, und blau liest sich in dieser Blase wie ein Verweis. Das Abgesetzte
   und der Rahmen sagen schon, dass hier geschrieben wird. */
.ishPlanFlag .ishPlanFlagStatusActions .sapMBtnInner .sapMBtnContent {
	color: var(--sapTextColor, #32363a) !important;
}

/* Eine Splitter-Leiste, die nichts bewegen kann, soll auch nicht dastehen: UI5 vergibt
   `sapUiLoSplitterNoResize`, sobald ein angrenzender Bereich `resizable=false` ist - in der PlanView
   also genau dann, wenn der Nachbar ausgeblendet ist (Breite 0). Ohne diese Regel stehen dort zwei
   Griffe uebereinander (Rueckmeldung des Auftraggebers). */
.ishManagedSplitter > .sapUiLoSplitterBar.sapUiLoSplitterNoResize {
	/* `!important`, weil die UI5-Bibliothek `display: inline-flex` mit gleicher Spezifitaet setzt
	   (`.sapUiLoSplitter.sapUiLoSplitterH > .sapUiLoSplitterBar`) und spaeter geladen wird - sie
	   verbirgt die taube Leiste zwar (`visibility: hidden`), laesst ihr aber ihre 16 px Breite. */
	display: none !important;
	/* Und sie darf auch keinen PLATZ mehr kosten: `Splitter._calcBarsSize` misst jede Leiste mit
	   jQuery `outerWidth()`, und das liefert fuer ein `display: none`-Element die "waere"-Breite
	   (jQuery schaltet dafuer kurz auf sichtbar). Die 16 px je Leiste wurden also weiter vom Platz der
	   Bereiche abgezogen - bei zwei tauben Leisten fehlten 32 px, sichtbar als leerer Streifen am
	   rechten Rand (nachgemessen: Splitter 359 px, Plan 327 px; Rueckmeldung des Auftraggebers am
	   Handy). Mit fester Nullbreite misst jQuery 0. */
	width: 0 !important;
	min-width: 0 !important;
	border-width: 0 !important;
	padding: 0 !important;
}

/* Sonderfall "Plan und Dock, Modell dazwischen aus": beide Leisten grenzen an den versteckten Bereich,
   UI5 haelt also beide fuer taub und die Regel darueber wuerde beide entfernen - zwischen Plan und Dock
   bliebe kein Griff. Gezeigt wird deshalb genau EINE davon (`splitbar-1`), und ziehen tut sie nicht
   UI5, sondern `ViewAreaBar._onJoinDragMove`: UI5s eigener Zug kann in dieser Lage nur Breite mit dem
   versteckten Modell tauschen und liess das Dock deshalb nicht wachsen (Begruendung dort).

   `visibility` muss mit zurueckgesetzt werden - die Bibliothek versteckt taube Leisten damit. Auswahl
   per Id-Endung, weil der Splitter seine Leisten als `<id>-splitbar-<n>` rendert. */
.ishPlanViewJoinPlanDock > [id$="-splitbar-0"] {
	display: none !important;
}

.ishManagedSplitter.ishPlanViewJoinPlanDock > .sapUiLoSplitterBar[id$="-splitbar-1"] {
	display: inline-flex !important;
	visibility: visible !important;
	cursor: col-resize !important;
	/* Auch Breite UND Rahmen zuruecknehmen: die Regel darueber setzt tauben Leisten Nullbreite und
	   nimmt ihnen den Rahmen, damit sie keinen Platz kosten. Diese eine Leiste zieht aber - ohne Breite
	   waere sie mit der Maus nicht zu fassen (gemessen: 0 px), und ohne Rahmen fehlten die beiden
	   feinen Linien, die sie im Plan/Modell-Zustand von den Bereichen abgrenzen (Rueckmeldung des
	   Auftraggebers; gemessen an einer lebenden Leiste: 0.0625rem solid, im Join-Zustand 0). 1rem ist
	   die Breite, die UI5 einer Leiste gibt. */
	width: 1rem !important;
	min-width: 1rem !important;
	border-left-width: 0.0625rem !important;
	border-right-width: 0.0625rem !important;
	/* `touch-action: none` ist am Tablet zwingend - dieselbe Begruendung wie beim Griff des Handy-Docks:
	   ohne das nimmt der Browser die waagrechte Fingerbewegung als eigene Geste (Wischen/Zoomen), bricht
	   die Zeigerfolge mit `pointercancel` ab und der Zug endet nach wenigen Pixeln. `preventDefault` im
	   `pointerdown` hilft dagegen nicht, es unterdrueckt das Scrollen des Browsers nicht. */
	touch-action: none !important;
}

/* Und der Griff darin: die Bibliothek nimmt einer tauben Leiste ihre Punkte
   (`.sapUiLoSplitter > .sapUiLoSplitterBar.sapUiLoSplitterNoResize > * { display: none }`). Eine leere
   16-px-Leiste sieht aber genauso tot aus, wie sie gemeint war - und ziehen laesst sie sich hier eben
   doch. `block` ist der Wert, den die drei Kinder an einer normalen Leiste tragen (nachgemessen). */
.ishManagedSplitter.ishPlanViewJoinPlanDock > .sapUiLoSplitterBar[id$="-splitbar-1"] > * {
	display: block !important;
}

/* Waehrend des eigenen Zugs (s. `ViewAreaBar._onJoinDragStart`) sind die eingebetteten Rahmen taub.
   Grund: Mausereignisse ueber einem iframe gehen an DESSEN Dokument. Im alten Viewer ist der Plan ein
   iframe, der Zug nach links - "Dock groesser" - endete deshalb an der Rahmenkante; und ein `mouseup`
   ueber dem Rahmen kam nie bei uns an, der Zug haette gar nicht mehr aufgehoert. Der Rahmen bleibt
   dabei stehen (kein Umhaengen, kein Neuladen). `user-select` verhindert nebenbei, dass der Zug Text
   im Dock markiert. */
.ishPlanViewAreaDragging iframe {
	pointer-events: none;
}

.ishPlanViewAreaDragging {
	cursor: col-resize;
	user-select: none;
}

/* Am Handy wird die Oberkante des Docks gezogen, nicht eine Seitenkante (s. `_onMobileGripDown`). */
.ishPlanViewAreaDragging.ishPlanViewAreaDraggingVertical {
	cursor: row-resize;
}

/* Dock auf dem Handy: es gehoert zur Ansicht und soll den Plan nicht ERSETZEN, sondern sich darueber
   schieben (Kundenwunsch). Der Splitter gibt ihm dafuer keine Breite (0 %), die Zeile hier hebt den
   dritten Bereich aus dem Fluss heraus und legt ihn als Blatt ueber die untere Haelfte. Die Auswahl per
   Id-Endung, weil der Splitter seine Bereiche als `<id>-content-<n>` rendert und `:nth-of-type` an den
   Leisten dazwischen scheitert. */
.ishPlanViewMobileDock > [id$="-content-2"] {
	position: absolute !important;
	left: 0;
	right: 0;
	bottom: 0;
	width: auto !important;
	/* `!important` auch hier: der Splitter setzt die Hoehe seiner Bereiche inline auf 100 %. Die Hoehe
	   ist ziehbar: `ViewAreaBar._applyMobileDockHeight` schreibt die Variable an den Splitter, der
	   Vorgabewert gilt, solange niemand gezogen hat. */
	height: var(--ishMobileDockHeight, 70%) !important;
	/* Platz fuer die Griffleiste an der Oberkante (absolut darin, s. unten). `border-box`, damit die
	   Hoehe oben unberuehrt bleibt. */
	padding-top: 2rem;
	box-sizing: border-box;
	z-index: 5;
	background: var(--sapGroup_ContentBackground, #fff);
	border-top: 1px solid var(--sapGroup_ContentBorderColor, #d9d9d9);
	box-shadow: 0 -0.25rem 1rem rgba(0, 0, 0, 0.25);
}

/* Griff an der Oberkante des Handy-Docks: damit laesst sich das Blatt hoeher und niedriger ziehen
   (Kundenwunsch). Das Element legt `ViewAreaBar._ensureMobileGrip` an - es gehoert zur Aufteilung der
   Ansicht und nicht in die geteilte SidePage-View, die am Desktop ohne Blatt-Layout laeuft.

   `touch-action: none` ist hier zwingend: ohne das nimmt der Browser die senkrechte Fingerbewegung als
   Scrollen an, schickt kein `pointermove` mehr und bricht den Zug ab. Es steht NUR am Griff, damit der
   Inhalt des Docks weiter mit dem Finger scrollt. */
.ishPlanViewMobileDockGrip {
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	height: 2rem;
	touch-action: none;
	cursor: row-resize;
	z-index: 6;
}

/* Die Ziehmarke: mittig, damit sie nicht mit den Knoepfen rechts kollidiert. */
.ishPlanViewMobileDockGrip::after {
	content: "";
	position: absolute;
	top: 50%;
	left: 50%;
	width: 2.5rem;
	height: 0.25rem;
	margin: -0.125rem 0 0 -1.25rem;
	border-radius: 0.125rem;
	background: var(--sapContent_ForegroundBorderColor, #b3b3b3);
}

/* Volle Hoehe und Zu (`ViewAreaBar._buildMobileGripButtons`): rechts in der Leiste, nebeneinander in
   einer Flex-Reihe. Die Knoepfe sind echte `sap.m.Button`, hier bekommen sie nur ihren Platz.
   `touch-action: auto` nimmt die Zug-Sperre der Leiste fuer die Knopfflaeche wieder zurueck - sonst
   schluckt sie den Fingertipp. */
.ishPlanViewMobileDockGripActions {
	position: absolute;
	top: 0;
	right: 0.25rem;
	height: 2rem;
	display: flex;
	align-items: center;
	gap: 0.25rem;
	touch-action: auto;
}

.ishPlanViewMobileDockGripActions .sapMBtn {
	cursor: pointer;
}

/* Der Planname in der Leiste ist ein Knopf (er oeffnet den FMS-Baum, s. `PlanSwitchDialog`), soll aber
   wie die Ueberschrift der Ansicht aussehen. Uebernommen werden Schriftgroesse und -schnitt eines
   `sap.m.Title`; die Farbe bleibt die des Knopfs, damit er nicht wie ein Verweis wirkt.
   `max-width` samt Kuerzung: lange Liegenschaftsnamen wuerden die Leiste sonst so weit fuellen, dass
   die Bereichsschalter ins Ueberlaufmenue wandern. */
/* Der Knopf selbst darf schrumpfen (`shrinkable` in der Leiste, s. ViewBar.fragment.xml): dafuer muss
   die Mindestbreite weg, sonst schiebt er die Bereichsschalter hinaus statt zu kuerzen. Am
   Desktop bleibt er bei hoechstens 24rem, damit lange Liegenschaftsnamen die Leiste nicht
   auffuellen. */
.ishPlanViewTitleButton {
	min-width: 0 !important;
	max-width: 24rem;
}

.ishPlanViewTitleButton .sapMBtnInner {
	max-width: 100%;
}

.ishPlanViewTitleButton .sapMBtnContent {
	font-size: var(--sapFontHeader6Size, 1rem);
	font-weight: bold;
	max-width: 100%;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

/* Bereichsschalter der PlanView-Leiste als EINE Auswahl: die drei Umschalter liegen aneinander, die
   Rundung sitzt nur aussen. Positionsklassen statt `:first-child`/`:last-child`, weil "Modell" ohne
   IFC-Daten unsichtbar ist - UI5 rendert dafuer einen Platzhalter, der die Geschwister-Selektoren
   sonst verschieben wuerde. Der negative Rand legt die beiden Rahmen aufeinander (sonst doppelte
   Linie zwischen den Knoepfen). */
.ishPlanViewSwitch .sapMBtn {
	margin: 0;
}

.ishPlanViewSwitch .sapMBtn .sapMBtnInner {
	border-radius: 0;
}

.ishPlanViewSwitch .ishPlanViewSwitchStart .sapMBtnInner {
	border-top-left-radius: var(--sapElement_BorderCornerRadius, 0.25rem);
	border-bottom-left-radius: var(--sapElement_BorderCornerRadius, 0.25rem);
}

.ishPlanViewSwitch .ishPlanViewSwitchEnd .sapMBtnInner {
	border-top-right-radius: var(--sapElement_BorderCornerRadius, 0.25rem);
	border-bottom-right-radius: var(--sapElement_BorderCornerRadius, 0.25rem);
}

.ishPlanViewSwitch .ishPlanViewSwitchMiddle .sapMBtnInner,
.ishPlanViewSwitch .ishPlanViewSwitchEnd .sapMBtnInner {
	margin-left: -1px;
}

/* Wartehinweis der Fahne: waehrend die Angaben geholt werden, ist die Blase fast leer - der Kreisel
   soll sie nicht zusaetzlich aufziehen. */
.ishPlanFlag .ishPlanFlagBusy {
	margin: 0.25rem 1.5rem;
}

/* Der Statusbalken nimmt die Hoehe seiner Zeile an, statt ein festes Mass zu behalten: bei einem
   zweizeiligen Titel (Fahnenkopf) oder einer zweizeiligen Nachbarzeile stand sonst ein kurzer Strich
   neben viel Text. `.ishStatus` mitschreiben, um die feste Hoehe aus `.ishPinStatusBalken` zu
   ueberstimmen; die Mindesthoehe haelt ihn bei einzeiligem Inhalt sichtbar.

   `height: 100%` und NICHT `align-self: stretch`: UI5 packt jedes Kind einer FlexBox in einen eigenen
   `div.sapMFlexItem`. Der DIV wird vom `Stretch` der Zeile schon auf die volle Hoehe gezogen (gemessen:
   40 px bei zweizeiligem Titel), er ist aber `display: block` - ein `align-self` am Balken darin haette
   nichts, an dem es sich ausrichten koennte. */
.ishPlanFlag .ishPlanFlagStatusBar.ishStatus {
	height: 100%;
	min-height: 1.25rem;
}

/* Statuswechsel abgesetzt: eine feine Linie darueber trennt "aendert etwas" von "fuehrt hin". */
.ishPlanFlag .ishPlanFlagStatusActions {
	margin-top: 0.25rem;
	padding-top: 0.25rem;
	justify-content: start;
	border-top: 1px solid var(--sapGroup_ContentBorderColor, #d9d9d9);
}

/* Liste weiterer Pins am selben Punkt: eigener Rollbereich, sonst wuerde die Fahne bei Dutzenden
   Pins ueber das Fenster hinauswachsen (Legacy `.popup-poslist`: 140px hoch, scrollend). */
.ishPlanFlag .ishPlanFlagCluster {
	max-height: 9rem;
	overflow-y: auto;
}

/* Kopfzeile einer Gruppe im Layer-Menue. Sie ist eine selbstgebaute Zeile (Gruppenname +
   Schalter fuer die ganze Gruppe, s. PlanToolbarBase.createLayerGroupHeader) und wuerde ohne diese
   Regel aussehen wie ein normaler Layer-Eintrag - der Aufbau der Liste waere nicht mehr ablesbar.
   Farben und Trennlinie sind die der UI5-Gruppenkopfzeile. */
.ishPlanLayerGroupHeader {
	background-color: var(--sapList_GroupHeaderBackground, #f5f5f5);
	border-bottom: 1px solid var(--sapList_BorderColor, #e5e5e5);
}

.ishPlanLayerGroupHeader .sapMTitle {
	color: var(--sapList_GroupHeaderTextColor, #32363a);
}

/* Vollbild ohne Rahmen: Kopfzeile und Seitennavigation der Anwendung ausblenden.
   Bewusst per CSS-Klasse an der ToolPage statt ueber `visible` der beiden Bereiche - `visible`
   loest ein Neurendern aus, dabei wandert der Inhaltsbereich in einen neuen Elternknoten, und ein
   `iframe` darin (IFC-Viewer) laedt neu. Gesetzt wird die Klasse in App.controller
   `onFullscreenChanged`. */
.ishHideNavigation > .sapTntToolPageHeaderWrapper,
.ishHideNavigation .sapTntToolPageAside {
	display: none !important;
}

/* Seiten-Vollbild ohne echte Fullscreen-API (iPhone, s. `ishcommon.setPageFullScreen`): Hier geht nur
   die Seitennavigation weg, die Kopfzeile bleibt - ueber ihr Menue kommt der Benutzer wieder heraus. */
.ishHideNavigationAside .sapTntToolPageAside {
	display: none !important;
}

/* Kopfzeile der Fahne: Titel links, Kreuz rechts. Der Knopf soll die Blase nicht auseinanderziehen -
   deshalb kleiner Rahmen, kein Mindestmass und die Zeile ohne zusaetzliche Hoehe. */
.ishPlanFlag .ishPlanFlagHeader {
	gap: 0.375rem;
}

.ishPlanFlag .ishPlanFlagClose.sapMBtn {
	min-width: 1.5rem;
	height: 1.5rem;
	margin: 0;
	padding: 0;
}

.ishPlanFlag .ishPlanFlagClose .sapMBtnInner {
	min-width: 1.5rem;
	height: 1.5rem;
	line-height: 1.5rem;
}


/* Fliegender Hinweis am unteren Rand des Plans, welcher Abschnitt gerade geladen wird
   (planview/views/PlanLoadHint.fragment.xml). Absolut im Inhaltsbereich der Seite - `sap.m.Page`
   positioniert ihren Inhaltsbereich selbst, der Hinweis rechnet sich also gegen die Kartenflaeche ab
   und nicht gegen das Fenster.

   `pointer-events: none`, weil es eine Anzeige ist und kein Bedienelement: ein Klick an dieser Stelle
   gehoert der Karte (Pin auswaehlen, verschieben), nicht dem Hinweis. Ohne das waere die Anzeige
   genau das, was sie nicht sein soll - im Weg.

   Der Klassenname steht zweimal (`.ishPlanLoadHint.sapMFlexBox`), um die UI5-Klasse
   `sapMFlexBoxBGTransparent` zu ueberstimmen - sonst bleibt der Hinweis durchsichtig und der Text
   steht ohne Hintergrund auf dem Plan (dieselbe Falle wie bei `.ishPlanFlag`).

   Der `z-index` liegt UEBER dem FotoViewer-Overlay (`.ishFotoViewer` 50, maximiert 60 - s.
   planview/lib/ol.css): das Fenster sitzt in derselben Ecke rechts unten und verdeckte den Hinweis
   sonst genau dann, wenn ein Foto offen ist. Verdraengen kann er nichts, er nimmt keine Klicks
   (`pointer-events: none`). */
.ishPlanLoadHint.sapMFlexBox {
	position: absolute;
	right: 1rem;
	bottom: 1rem;
	z-index: 70;
	display: flex;
	align-items: center;
	padding: 0.375rem 0.75rem;
	background: var(--sapGroup_ContentBackground, #fff);
	border: 1px solid var(--sapGroup_ContentBorderColor, #d9d9d9);
	border-radius: 1rem;
	box-shadow: 0 2px 6px rgba(0, 0, 0, 0.25);
	pointer-events: none;
}
