/**
 * PE Konfigurator — Stufe 1
 * Ablage: wp-content/plugins/pe-configurator/assets/pe-configurator.css
 *
 * Enthält bewusst KEIN Layout des äußeren Rasters — keine Spalten, keine
 * Abstände zwischen Visual und Optionen, keine maximale Breite. Das gehört
 * in Bricks. Hier stehen nur Zustände, die CSS allein abbilden kann.
 *
 * Die Vorschau mit Rahmen- und Passepartout-Compositing ist Stufe 2 und
 * steht am Ende dieser Datei als kommentiertes Gerüst — nicht aktiv.
 */

/* =========================================================
 * Stellwerte
 * ---------------------------------------------------------
 * Neutralgrau statt Schwarz: funktioniert auf hellem UND dunklem
 * Hintergrund. Die frühere Fassung war auf einem Dark Theme unsichtbar.
 * Schriftgrößen sind relativ (em) — setz die Basisgröße in Bricks am
 * Container, alles darunter skaliert mit.
 * ======================================================= */
/* Die Stellwerte galten nur unter `.pe-configurator`.
 *
 * Die Raumvorschau baut ihre Optionsgruppen aber in `.pe-aus` — dort
 * loesten `--pe-media-width` und `--pe-group-gap` zu NICHTS auf. Und
 * eine Variable ohne Wert macht die ganze Angabe ungueltig: aus
 * `grid-template-columns: var(--pe-media-width) 1fr` wurde gar keine
 * Spaltenangabe (die Bilder massen sich selbst, 122 gegen 200 Pixel),
 * aus `margin: 0 0 var(--pe-group-gap)` wurde null Abstand zwischen den
 * Gruppen. Am 24.08.2026 beides gemessen.
 *
 * **Eine fehlende Variable faellt nicht auf einen Standardwert zurueck —
 * sie nimmt die Regel mit.** Deshalb gelten die Stellwerte jetzt auch
 * hier, und die wichtigsten Verwendungen tragen zusaetzlich einen
 * Rueckfall. */
.pe-configurator,
.pe-aus,
[data-pe-configurator] {
	--pe-border:        rgba(128, 128, 128, 0.35);
	--pe-border-hover:  rgba(128, 128, 128, 0.75);
	--pe-accent:        currentColor;
	--pe-selected-bg:   rgba(128, 128, 128, 0.14);
	--pe-group-gap:     2rem;
	--pe-media-width:   42%;
	/* 0, damit Werk, Bedienleiste und die Textzeilen darunter auf
	   derselben Kante stehen. Der Abstand zur Spalte gehört in Bricks an
	   den Container — sonst hätte das Werk einen Innenabstand, den die
	   MwSt-Zeile daneben nicht kennt, und nichts fluchtet. */
	--pe-view-pad:      0rem;
}


/* =========================================================
 * Optionsgruppen
 * ======================================================= */
/* Jede Gruppe nimmt die VOLLE Breite ihres Containers.
   ---------------------------------------------------------
   Der Sammelcontainer [data-pe-groups] ist ein Bricks-Block. Steht der
   auf Flex — und Bricks-Blöcke stehen häufig auf Flex —, dann sind die
   Gruppen Flex-Elemente und werden nach ihrem INHALT bemessen. Die
   Rahmengruppe enthält ein breites Bild und wird breit, die
   Formatgruppe enthält nur Text und wird schmaler.

   Und weil die Spaltenbreite im Raster als Prozentwert dieser Breite
   definiert ist, sind 42 % in der Formatgruppe dann schlicht weniger
   Pixel als 42 % in der Rahmengruppe. Genau das war der Versatz, den
   keine Rechnung einholen konnte: die Bezugsgröße war je Gruppe eine
   andere.

   Diese vier Zeilen zwingen alle Gruppen auf dieselbe Bezugsbreite —
   unabhängig davon, was der Bricks-Block vorgibt. */
.pe-group {
	border: 0;
	padding: 0;
	margin: 0 0 var(--pe-group-gap, 2rem);
	box-sizing: border-box;
	width: 100%;
	flex: 1 1 100%;
	grid-column: 1 / -1;
	min-inline-size: 0;
	font-size: inherit;
}

.pe-group__legend {
	padding: 0;
	/* Groesser und mit Luft davor: der Titel trennt zwei Gruppen
	   voneinander und stand zwischen Regler und naechstem Bild wie
	   eingequetscht. Simon am 24.08.2026: *„'Passepartout' Titel soll
	   größer sein."* */
	margin: 2.2em 0 0.6em;
	font-size: 0.95em;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	opacity: 0.8;
}
/* Die erste Gruppe braucht den Abstand nach oben nicht. */
.pe-group:first-of-type > .pe-group__legend { margin-top: 0; }

/* Innenraum: EIN Raster für alle Gruppen.
   ---------------------------------------------------------
   Zwei Spalten, an genau einer Stelle definiert. Links das
   Übersichtsbild, rechts die Auswahlliste.

   Vorher war das ein Flex-Container. Ein Flex-Container definiert aber
   keine Spalten, er verteilt Platz: `flex: 1 1 auto` heißt „so breit wie
   der Inhalt, dann wachsen". Bei einer Liste je Gruppe fällt das nicht
   auf. Bei zwei Listen nebeneinander — den beiden Formatspalten —
   verhandeln beide über ihren Inhalt, und die Spaltengrenze hängt dann
   daran, wie lang gerade ein Preis ist. Genau daran sind drei Anläufe
   gescheitert.

   Im Raster liegen die Spaltenkanten fest, unabhängig vom Inhalt. Jede
   Gruppe benutzt dieselbe Definition, also fluchtet alles miteinander,
   ohne dass irgendwo etwas ausgeglichen werden müsste. */
.pe-group__inner {
	display: grid;
	/* Mit RUECKFALLWERT.
	 *
	 * `--pe-media-width` ist auf `[data-pe-configurator]` gesetzt und
	 * loeste in der Raumvorschau zu nichts auf — damit war die ganze
	 * Angabe ungueltig, und der Browser mass die Spalte am Bild. Ergebnis
	 * am 24.08.2026: Rahmenbild 122 Pixel breit, Passepartoutbild 200.
	 * Simon: *„Rahmen + Passepartoutbild nicht gleich breit."*
	 *
	 * Eine Variable ohne Rueckfall ist eine Angabe, die auch fehlen
	 * kann — und dann faellt nicht der Wert aus, sondern die Regel. */
	grid-template-columns: var(--pe-media-width, 42%) 1fr;
	/* Zwischen den Spalten viel, zwischen den Zeilen wenig: unter Bild
	   und Liste folgen die Regler, und die gehoeren dicht heran. Simon am
	   24.08.2026: *„Slider haben zuviel Abstand zu den Optionsbilder,
	   sollen direkt darunter liegen."* */
	/* Zwischen den Spalten viel, zwischen den Zeilen fast nichts: unter
	   Bild und Liste folgen die Regler, und die gehoeren unmittelbar
	   heran. Simon am 24.08.2026: *„Bild > 'Rahmenbreite' > slider soll
	   geringere Abstände sein."* */
	gap: .15rem 1.5rem;
	align-items: start;
}

.pe-group__media {
	/* Immer dieselbe Breite, gleich welches Bild darin liegt.
	 *
	 * Die Spalte ist zwar fest, das Bild darin richtete sich aber nach
	 * seinem eigenen Seitenverhaeltnis — Rahmenmuster und
	 * Passepartoutboegen sind unterschiedlich proportioniert, und die
	 * Gruppen sprangen dadurch in der Breite. Simon am 24.08.2026:
	 * *„Optionsbilder Rahmen / Passepartouts sollen immer gleich breit
	 * bleiben."* */
	width: 100%;
	grid-column: 1;
	min-width: 0;
	display: flex;
	justify-content: flex-end;
}

/* ---- Die Eckenvorschau im Gruppenbild --------------------------------
 *
 * Sie liegt UEBER dem Katalogbild und verdeckt es, sobald sie einen
 * Inhalt hat. Das Katalogbild bleibt darunter stehen: es zeigt die
 * Materialqualitaet und ist der Rueckfall, solange kein Werk gerendert
 * ist — im Portfolio-Overlay vor dem Aufbau, bei einem Werk ohne Bild.
 *
 * Der Zoom entsteht aus der Breite der Buehne, nicht aus `transform`:
 * die Massekette im `.pe-frameset` rechnet in `cqw`, also waechst mit
 * der Buehne auch das Rahmenprofil. Ein `transform: scale()` haette
 * stattdessen die Pixel vergroessert — dasselbe Bild, nur unschaerfer. */
.pe-group__media { position: relative; }

.pe-ecke {
	position: absolute;
	inset: 0;
	overflow: hidden;
	container-type: inline-size;
	/* Durchsichtig, nicht eingefaerbt: der Klon deckt den Kasten bei
	 * jedem gewoehnlichen Seitenverhaeltnis vollstaendig ab (bei 300 %
	 * Buehnenbreite erst ab einem Panorama breiter als 3,2:1 nicht mehr),
	 * und darunter liegt das Katalogbild. Eine geratene Hintergrundfarbe
	 * waere auf der einen Seite richtig und auf der anderen falsch —
	 * der Konfigurator laeuft auf einer dunklen Werkseite UND in einem
	 * Overlay. */
	/* Die Farbe setzt `eckeAktualisieren()` — sie ist die des
	   Passepartouts und schliesst damit den Haarriss zwischen
	   Rahmen- und Innenebene optisch. Bis dahin durchsichtig, damit
	   ein leerer Kasten das Katalogbild zeigt. */
	background: transparent;
	pointer-events: none;
}

/* Steht ein Klon, bestimmt nicht mehr das Katalogbild die Groesse.
   ---------------------------------------------------------
   Bis 2.190.0 bekam der Kasten seine Hoehe vom Bild darin — und die
   beiden Katalogfotos haben verschiedene Seitenverhaeltnisse. Am
   01.09.2026 auf live gemessen: Rahmen 1301x1209 (1,076) ergab einen
   Kasten von 222x206, Passepartout 1448x1086 (1,333) einen von 222x166.
   Vierzig Pixel Unterschied, ohne dass es dafuer einen Grund gaebe.
   Simon: *„der Passepartout Detail frame ist niedriger als der Rahmen
   frame, obwohl genug Platz da ist."*

   Sobald eine Eckenvorschau steht, gilt deshalb ein festes Verhaeltnis
   fuer BEIDE. **Quadratisch**, weil ein Eckausschnitt keine bevorzugte
   Richtung hat: er zeigt oben und links gleich viel, gleich welches
   Werk gerade darin steht. Nebenbei entspricht 222x222 fast genau dem
   bisher hoeheren der beiden Kaesten — es springt also nichts.

   Das Bild liegt dabei absolut und nimmt keinen Platz mehr; verdeckt
   ist es ohnehin. `visibility` statt `display`, damit es geladen bleibt
   und beim Wegfallen des Klons sofort wieder traegt. */
.pe-group__media:has(.pe-ecke .pe-frameset) { aspect-ratio: 1 / 1; }

.pe-group__media:has(.pe-ecke .pe-frameset) > img,
.pe-group__media:has(.pe-ecke .pe-frameset) > figure,
.pe-group__media:has(.pe-ecke .pe-frameset) > .brxe-image {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	visibility: hidden;
}

/* Ohne Inhalt unsichtbar — dann gilt das Katalogbild darunter.
 * `:has()` statt `:empty`: der Kasten traegt immer seine Buehne, leer
 * ist nur die Buehne. */
.pe-ecke:not(:has(.pe-frameset)) { display: none; }

.pe-ecke__buehne {
	position: absolute;
	top: 0;
	left: 0;
	/* Dreifach: genug, um Profil und Passepartoutrand zu erkennen, und
	 * wenig genug, dass noch ein Stueck Werk im Bild ist. */
	width: 300%;
}

.pe-ecke__buehne .pe-frameset {
	width: 100%;
	max-width: none;
}

/* Was in der Ecke nichts zu suchen hat: das Glas spiegelt, der
 * Vorgaengerrahmen blendet ueber — beides ist eine Bewegung der grossen
 * Buehne und im Daumennagel nur Unruhe. */
.pe-ecke__buehne .pe-frameset__glass,
.pe-ecke__buehne .pe-frameset__frame--prev { display: none; }

.pe-group__media img,
.pe-group__media .brxe-image,
.pe-group__media figure {
	display: block;
	/* `width: 100%` statt `max-width`: sonst bleibt ein schmaleres Bild
	   schmal, und die Gruppen stehen unterschiedlich breit nebeneinander. */
	width: 100%;
	max-width: 100%;
	height: auto;
	margin: 0;
}

/* Die Liste sitzt in der zweiten Spalte. Ohne Bild nimmt sie beide. */
.pe-group__list {
	grid-column: 2;
	min-width: 0;
	display: flex;
	flex-wrap: wrap;
	gap: 0.4em 0.6em;
	align-content: flex-start;
	align-items: flex-start;
}

.pe-group:not(.has-media):not(.pe-group--format) .pe-group__list {
	grid-column: 1 / -1;
}

/* Mit Bild daneben untereinander, sonst wird die Spalte zu schmal. */
.pe-group.has-media .pe-group__list {
	flex-direction: column;
	flex-wrap: nowrap;
	align-items: stretch;
}

/* Formate: zwei Listen in denselben zwei Rasterspalten.
   Die linke belegt die Spalte der Gruppenbilder, die rechte die Spalte
   der Auswahllisten — dieselben Kanten, dieselbe Breite, ohne dass
   irgendwo etwas ausgeglichen werden müsste. */
.pe-group__list--slot-media {
	grid-column: 1;
}

/* Ein Format je Zeile, wie in den Gruppen mit Bild. */
.pe-group--format .pe-group__list {
	flex-direction: column;
	flex-wrap: nowrap;
	align-items: stretch;
}

/* Bezeichnung und Aufpreis stehen in einer Zeile, SOLANGE sie
   hineinpassen — und brechen um, wenn nicht.
   ---------------------------------------------------------
   Der vorherige Versuch erzwang mit flex-wrap: nowrap eine Zeile. Das
   spart keinen Platz, es verschiebt ihn nur: der Aufpreis läuft dann
   über die Spaltenkante hinaus und legt sich in der linken Spalte über
   die Auswahlbox der rechten. Die Spalten fluchten dabei korrekt — es
   ist der INHALT, der übersteht, und das sieht aus wie ein Versatz.

   Umbruch ist hier die ehrlichere Lösung: eine zweite Zeile ist
   sichtbar und harmlos, ein überlappender Betrag ist es nicht. */
.pe-group--format .pe-choice__text {
	flex-wrap: wrap;
	align-items: baseline;
	column-gap: 0.5em;
}

/* Die Maßangabe selbst bricht nie mitten im Format um. */
.pe-group--format .pe-choice__name  { white-space: nowrap; }
.pe-group--format .pe-choice__price { white-space: nowrap; }

@media (max-width: 700px) {
	.pe-group__list--slot-media { grid-column: 1 / -1; }
}

/* Der Sammelcontainer legt die Gruppen SCHLICHT untereinander.
   ---------------------------------------------------------
   Er ist ein Bricks-Block und bringt von dort eine Flex- oder
   Rasterausrichtung mit. Sobald die Gruppen dadurch nach ihrem Inhalt
   bemessen werden, sind sie unterschiedlich breit — gemessen 535 gegen
   546 Pixel —, und weil die Spaltenbreite ein Prozentwert dieser Breite
   ist, wandert die Spaltenkante mit. Fünf Pixel Versatz aus elf Pixeln
   Gruppenbreite.

   Blockfluss ist hier die richtige Anordnung: jede Gruppe nimmt die
   volle Breite, alle dieselbe. Der Container hat keine andere Aufgabe —
   er ist im Template ausdrücklich als leerer Sammelbehälter angelegt. */
[data-pe-groups] {
	display: block !important;
}

/* Vom Bricks-Element gelieferte Gruppenbilder sind unsichtbar, solange
   sie noch im Sammelcontainer liegen. Sobald das JS sie in die Gruppe
   verschoben hat, sind sie kein direktes Kind mehr und erscheinen. */
[data-pe-groups] > [data-pe-group-media] {
	display: none !important;
}

@media (max-width: 700px) {
	.pe-group__inner  { grid-template-columns: 1fr; }
	.pe-group__media  { justify-content: flex-start; }
	.pe-group__list   { grid-column: 1 / -1; }
	.pe-group.has-media .pe-group__list { align-items: stretch; }

	/* Gleicher Abstand zu beiden Rändern. Auf dem Desktop kommt er vom
	   Bricks-Container, auf dem Handy steht der Konfigurator dort ohne
	   Rand. Für .pe-view steht dieselbe Angabe weiter unten — hier wäre
	   sie wirkungslos, weil die Basisregel von .pe-view erst danach kommt
	   und mit ihrer padding-Kurzschreibweise alles zurücksetzt. */
	.pe-group { padding-inline: var(--pe-mobile-pad, 1.25rem); }
}


/* =========================================================
 * Auswahl-Element
 * ---------------------------------------------------------
 * Der Radio wird SICHTBAR gerendert, nicht versteckt. Die frühere
 * Fassung blendete ihn aus und verließ sich auf Rahmen und Hintergrund
 * — auf einem dunklen Theme war davon nichts zu sehen.
 * ======================================================= */
.pe-choice {
	position: relative;
	display: flex;
	align-items: flex-start;
	gap: 0.6em;
	/* Enger als vorher: bei fuenf Rahmenfarben und vier
	   Passepartouttoenen wuchs die Liste sonst ueber die Bildhoehe
	   hinaus und die Regler rutschten weit nach unten. Simon am
	   24.08.2026: *„Alle Radiobuttons vertikal geringerer Abstand."* */
	padding: 0.28em 0.7em;
	border: 1px solid transparent;
	border-radius: 2px;
	cursor: pointer;
	transition: border-color 0.15s ease, background-color 0.15s ease;
}

.pe-choice__input {
	flex: 0 0 auto;
	width: 1.05em;
	height: 1.05em;
	margin: 0.15em 0 0;
	accent-color: var(--pe-accent);
	cursor: pointer;
}

.pe-choice:hover {
	border-color: var(--pe-border-hover);
}

.pe-choice.is-selected,
.pe-choice:has(.pe-choice__input:checked) {
	border-color: var(--pe-accent);
	background: var(--pe-selected-bg);
}

.pe-choice:focus-within {
	outline: 2px solid var(--pe-accent);
	outline-offset: 2px;
}

/* Gesperrte Optionen sind blass — aber NICHT ueber `opacity` am
 * Elternelement.
 *
 * Deckkraft am Elternteil legt sich ueber alles darin, auch ueber den
 * Infokasten, und laesst sich im Kind nicht zurueckholen: `opacity: 1`
 * an einem Nachfahren hebt sie nicht auf. Der Kasten war deshalb
 * durchscheinend und der Text darunter mitzulesen — Simon am 24.08.2026:
 * *„Infobox nicht lesbar, weil auch transparent."*
 *
 * Also blass gemacht wird, was blass sein soll: Beschriftung, Notiz,
 * Preis und der Auswahlknopf. Der Kasten bleibt deckend. */
/* Ein gesperrter Knopf in der Ansichtsleiste — dieselbe Sprache wie eine
   gesperrte Option: gedaempft, aber da. Der Grund erscheint nach dem
   Tippen in der Meldungszeile darunter. */
.pe-btn.is-blocked {
	opacity: .4;
	cursor: default;
}
.pe-btn.is-blocked:hover { border-color: var(--pe-line, currentColor); }

.pe-choice.is-blocked {
	cursor: not-allowed;
}
.pe-choice.is-blocked .pe-choice__name,
.pe-choice.is-blocked .pe-choice__note,
.pe-choice.is-blocked .pe-choice__price,
.pe-choice.is-blocked .pe-choice__swatch,
.pe-choice.is-blocked .pe-choice__input { opacity: .4; }

.pe-choice.is-blocked:hover { border-color: transparent; }


/* =========================================================
 * Swatch — nur wenn eingeschaltet
 * ======================================================= */
.pe-choice__swatch {
	flex: 0 0 auto;
	width: 2em;
	height: 2em;
	border-radius: 1px;
	background-size: cover;
	background-position: center;
	box-shadow: inset 0 0 0 1px rgba(128, 128, 128, 0.3);
}

.pe-choice__swatch--plain {
	background: repeating-linear-gradient(
		45deg, transparent, transparent 4px,
		rgba(128, 128, 128, 0.25) 4px, rgba(128, 128, 128, 0.25) 8px
	);
}


/* =========================================================
 * Beschriftung — erbt die Schriftgröße vom Container
 * ======================================================= */
/* Name und Aufpreis stehen in einer Zeile, der Zusatztext bricht darunter
   um. Untereinander kostete jede Option eine Zeile mehr — bei fünf Gruppen
   summiert sich das auf einen halben Bildschirm, den niemand braucht. */
.pe-choice__text {
	display: flex;
	flex-direction: row;
	flex-wrap: wrap;
	align-items: baseline;
	column-gap: 0.6em;
	line-height: 1.35;
	min-width: 0;
}

.pe-choice__name  { font-size: 1em; }
.pe-choice__price { font-size: 0.85em; opacity: 0.7; font-variant-numeric: tabular-nums; }
/* Eigene Zeile — der Zusatztext ist oft ein ganzer Satz. */
.pe-choice__note  { flex: 1 1 100%; font-size: 0.8em; opacity: 0.6; }

/* Sperrgrund direkt an der Option, in ganzer Breite unter dem Namen. */
/* Der Sperrgrund steht hinter einem „i".
 *
 * In der schmalen Optionsspalte brach er sonst in vier bis sechs kurze
 * Zeilen um. Das Zeichen erscheint nur an gesperrten Zeilen; der Satz
 * beim Ueberfahren, bei Tastaturfokus und auf Tippen. */
.pe-choice__info {
	display: none;
	flex: 0 0 auto;
	width: 1.4em;
	height: 1.4em;
	align-items: center;
	justify-content: center;
	margin-left: .4em;
	font-size: .74em;
	font-style: italic;
	line-height: 1;
	border: 1px solid currentColor;
	border-radius: 50%;
	opacity: .6;
	cursor: help;
}
.pe-choice.is-blocked .pe-choice__info { display: inline-flex; }
.pe-choice.is-blocked:hover .pe-choice__info { opacity: 1; }

.pe-choice__reason {
	position: absolute;
	top: calc(100% - .2em);
	left: 0;
	right: 0;
	z-index: 7;
	width: max(100%, 13rem);
	padding: .7em .9em;
	font-size: 0.78em;
	line-height: 1.45;
	color: #f2f2f2;
	background: #0d0d0d;
	border: 1px solid rgba(255, 255, 255, .55);
	border-radius: 3px;
	box-shadow: 0 .5rem 1.4rem rgba(0, 0, 0, .55);
	opacity: 0;
	visibility: hidden;
	pointer-events: none;
	transition: opacity .15s, visibility 0s linear .15s;
}

.pe-choice.is-blocked:hover .pe-choice__reason,
.pe-choice.is-blocked:focus-within .pe-choice__reason,
.pe-choice.zeigt-grund .pe-choice__reason {
	opacity: 1;
	visibility: visible;
	transition: opacity .15s, visibility 0s;
}

/* Die letzte Zeile einer Liste haette ihren Kasten sonst ausserhalb. */
.pe-choice:last-child .pe-choice__reason { top: auto; bottom: calc(100% - .2em); }

.pe-choice__price:empty,
.pe-choice__note:empty { display: none; }

/* Sperrgrund steht EINMAL unter der Gruppe, nicht an jeder Option.
   Vorher stand derselbe Satz fünfmal untereinander. */
.pe-group__reason {
	margin-top: 0.6em;
	font-size: 0.8em;
	line-height: 1.45;
	opacity: 0.75;
	max-width: 44ch;
}

.pe-group__reason:empty { display: none; }


/* =========================================================
 * Preis und Hinweise
 * ======================================================= */
.pe-total {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: 1rem;
}

.pe-total__value {
	font-variant-numeric: tabular-nums;
	font-size: 1.9em;
}

.pe-vat,
.pe-hint,
.pe-price-from__vat,
.pe-price-from__detail,
.pe-edition__line--muted {
	font-size: 0.8em;
	opacity: 0.6;
	line-height: 1.5;
}

.pe-price-from {
	font-variant-numeric: tabular-nums;
}

.pe-edition {
	display: flex;
	flex-direction: column;
	gap: 0.15rem;
	font-size: 0.9em;
}

.pe-edition--soldout { opacity: 0.6; }


/* =========================================================
 * Ausverkaufte Edition
 * ======================================================= */
.pe-soldout {
	padding: 1.25rem;
	border: 1px solid var(--pe-border);
	border-radius: 2px;
}

.pe-soldout__title {
	margin: 0 0 0.4rem;
	font-size: 1.05em;
}

.pe-soldout__body {
	margin: 0;
	font-size: 0.9em;
	opacity: 0.7;
	line-height: 1.5;
}

/* Das Anfrageformular bleibt bestehen, aber ohne Preisbezug.
   Optionsgruppen und Preis verschwinden — die Warteliste ist der
   verbleibende Zweck des Formulars. */
.pe-is-soldout [data-pe-groups],
.pe-is-soldout [data-pe-total],
.pe-is-soldout .pe-total,
.pe-is-soldout .pe-vat {
	display: none;
}


/* =========================================================
 * Reduced motion
 * ======================================================= */
@media (prefers-reduced-motion: reduce) {
	.pe-choice { transition: none; }
}


/* =========================================================
 * VOLLVORSCHAU
 * ---------------------------------------------------------
 * Ebenen von außen nach innen, jede mit Prozent-Padding. Prozent-Padding
 * bezieht sich auf ALLEN vier Seiten auf die Breite des Elternelements —
 * deshalb ist jeder Wert direkt aus den cm-Angaben ableitbar und die
 * Vorschau stimmt bei jedem Seitenverhältnis, ohne dass JS misst.
 *
 * border-width braucht eine echte Länge, keine Prozentangabe. cqw löst
 * das: 1cqw ist ein Prozent der Containerbreite, aber als Länge.
 * ======================================================= */
.pe-frameset {
	container-type: inline-size;
	position: relative;
	width: 100%;
	--pe-frame-pad: 0;
	--pe-mount-pad: 0;
	--pe-paper-x: 0;
	--pe-paper-y: 0;
	--pe-mount-color: transparent;
	--pe-paper-color: transparent;
	--pe-frame-image: none;
	--pe-frame-slice: 0;
	--pe-frame-filter: none;
	--pe-frame-repeat: round;
	--pe-art-ratio: auto;
	/* Der Schatten kommt pro Raum aus dem Backend. Die Vorgabe hier gilt
	   in der Werkansicht und bei eigenen Fotos des Nutzers. */
	filter: var(--pe-shadow, drop-shadow(2.1cqw 1.2cqw 1.4cqw rgba(0, 0, 0, 0.34)));
	transition: filter 0.25s ease;
}

/* Prozent-Padding, unverändert und ohne Mischrechnung.
   Der frühere Versuch, den Haarriss über max(0px, calc(… - 1px)) zu
   schließen, mischte Prozent und Pixel innerhalb einer Padding-Angabe.
   Das ist heikel und war der Verdacht für die verschwundene
   Passepartout-Fläche. Die Überlappung macht jetzt ein negativer
   Außenabstand am KIND — dieselbe Wirkung, gewöhnliches CSS. */
.pe-frameset__inner  { padding: calc(var(--pe-frame-pad) * 1%); }
/* Farbe und Anschnitt blenden über, die Maße folgen in derselben Zeit.
   Ohne das springt die Passepartout-Fläche schlagartig ins Bild. */
.pe-frameset__mount {
	/* Vier Seiten, nicht eine.
	 *
	 * Prozentwerte beziehen sich in CSS bei allen vier Seiten auf die
	 * BREITE — das Skript rechnet deshalb ueberall durch die
	 * Passepartoutbreite. Rueckfall auf den einen Wert, damit aeltere
	 * Zustaende nichts kaputtmachen. */
	padding:
		calc(var(--pe-mount-pad-o, var(--pe-mount-pad)) * 1%)
		calc(var(--pe-mount-pad-r, var(--pe-mount-pad)) * 1%)
		calc(var(--pe-mount-pad-u, var(--pe-mount-pad)) * 1%)
		calc(var(--pe-mount-pad-l, var(--pe-mount-pad)) * 1%);
	background: var(--pe-mount-color);
	transition: background-color 0.35s ease, padding 0.35s ease;
}
.pe-frameset__paper {
	transition: background-color 0.35s ease, padding 0.35s ease;
}
.pe-frameset__paper::after {
	transition: box-shadow 0.35s ease;
}
.pe-frameset__inner {
	transition: padding 0.35s ease;
}

/* Ein Pixel unter die Rahmenebene geschoben. Die Rahmenebene liegt
   absolut und misst in cqw, die Innenebene im Fluss und in Prozent —
   beide runden unabhängig auf ganze Gerätepixel, und wo sie um einen
   halben Pixel auseinanderfallen, malt keine von beiden. Genau das war
   der Haarriss, durch den der Seitenhintergrund schien.

   ABER NIE WEITER ALS DER RAHMEN BREIT IST.
   ---------------------------------------------------------
   Ein fester Pixel setzt voraus, dass der Rahmenring breiter als ein
   Pixel ist. In der flachen Ansicht stimmt das immer: die Bühne ist
   rund 600 px breit, der Ring damit etwa sieben. In der verzerrten
   Ansicht nicht: dort ist die LAYOUTbox nur rund 150 px breit — die
   Matrix macht die Grösse, nicht das Layout —, und der Ring misst
   je nach Profil 0,4 bis 1,7 px. Wird er schmaler als ein Pixel,
   schiebt dieser Rand das Passepartout über den Aufbau HINAUS, und
   die Matrix vergrössert den Überstand mit.

   Am 27.08.2026 gemessen, Rahmen 10 mm auf Passepartout 140 mm:
   Innenabstand 0,672 px, Überstand oben/links/unten/rechts
   +1,15 / +0,62 / +0,76 / +0,36 px — in Chrome und in Safari
   dieselben Zahlen. Sichtbar war es nur in Safari, weil Chrome die
   Rahmenbreite auf 1 px aufrundet (Safari auf 0,5) und den Rest
   wegrundet. Der Fehler lag also nie in Safari; Safari hat ihn
   gezeigt.

   `min()` bindet den Flicken an das, was er flicken soll. Ist der
   Ring breiter als ein Pixel, bleibt es beim Pixel und in der
   flachen Ansicht ändert sich nichts. Ist er schmaler, reicht das
   Passepartout höchstens bis an die Aussenkante — nie darüber. Und
   ohne Rahmen (`--pe-frame-pad: 0`) ist der Rand null: dort gibt es
   keinen Ring, unter den sich etwas schieben liesse. */
.pe-frameset__mount {
	margin: calc(-1 * min(1px, var(--pe-frame-pad) * 1cqw));
}
.pe-frameset__paper  {
	padding: calc(var(--pe-paper-y) * 1%) calc(var(--pe-paper-x) * 1%);
	background: var(--pe-paper-color);
}

.pe-frameset__art {
	display: block;
	width: 100%;
	height: auto;
	aspect-ratio: var(--pe-art-ratio);
	object-fit: cover;

	/* Auch der ZUSCHNITT laeuft weich.
	 * ---------------------------------------------------------
	 * Jede Option, die den Falz aendert, aendert das Verhaeltnis der
	 * Sichtflaeche: `artRatio` rechnet mit `iw - 2*cutX` durch
	 * `ih - 2*cutY`. Rundum steht alles auf `.35s` — Passepartoutbreite,
	 * Farbe, Anschnitt —, nur das Bild sprang. Man sah es als kurzes
	 * Zucken im Motiv, waehrend der Karton noch wuchs.
	 *
	 * `aspect-ratio` ist ein interpolierbarer Wert, und beide Motoren
	 * koennen es. Am 29.08.2026 an einem eigens gebauten Fall gemessen,
	 * 2:1 auf 1:1 ueber 0,3 s: Chrome 151 laeuft 100 -> 108 -> 117 ->
	 * ... -> 200, WebKit 100 -> 115 -> 134 -> ... -> 200. Beide
	 * interpolieren, keiner springt. */
	transition: aspect-ratio 0.35s ease;
}

/* Schnittkante des Passepartouts — die Tiefenwirkung, für die sonst ein
   Foto nötig wäre.
   Sie sitzt auf der PAPIER-Ebene mit inset: 0, nicht auf der Mount-Ebene
   mit einem Prozent-Inset. Prozentwerte in `inset` lösen vertikal gegen
   die Höhe auf, horizontal gegen die Breite — die Linie wäre bei
   Panoramaformaten sichtbar verschoben. Derselbe Fehler steckte in der
   allerersten Fassung dieser Datei. */
.pe-frameset__paper { position: relative; }
.pe-frameset__paper::after {
	content: '';
	position: absolute;
	inset: 0;
	pointer-events: none;
	box-shadow: inset 0 0 0 0.12cqw rgba(0, 0, 0, 0.22);
}

/* ---------------------------------------------------------
 * Anschnitt (Schrägschnitt) des Passepartouts
 * ---------------------------------------------------------
 * Ein Passepartout wird im 45-Grad-Winkel geschnitten. Die dabei
 * entstehende Schnittfläche steht schräg im Raum — und weil das Fenster
 * eine VERTIEFUNG ist, zeigen die vier Flächen in vier Richtungen: die
 * obere nach unten, die untere nach oben, die linke nach rechts, die
 * rechte nach links.
 *
 * Genau deshalb ist eine Hoch- und eine Längsseite heller als die
 * Passepartoutfläche und die beiden gegenüberliegenden dunkler. Bei
 * Licht von links oben sind das unten und rechts hell, oben und links
 * dunkel — bei einer Vertiefung umgekehrt zu einer Erhebung.
 *
 * Umgesetzt als BORDER, nicht als Innenschatten.
 * ---------------------------------------------------------
 * Ein Rahmen aus vier Kanten trifft sich in der Ecke auf Gehrung — das
 * ist die Geometrie eines Schrägschnitts, unmittelbar und ohne
 * Nachhilfe. Vier Innenschatten dagegen sind vier weiche Verläufe, die
 * einander überlagern; damit lässt sich „diese Seite heller als die
 * Fläche, jene dunkler" nicht sauber sagen, weil jeder Verlauf über die
 * ganze Kante reicht. Drei Anläufe mit gestapelten Schatten sind genau
 * daran gescheitert.
 *
 * Die vier Farben rechnet das JS aus Anschnittfarbe und Lichtwinkel des
 * Raumes. Alle Maße in cqw, damit sie in jedem Format stimmen.
 * ------------------------------------------------------- */
.pe-frameset.has-mount .pe-frameset__paper::after {
	border-style: solid;
	/* VIER Breiten, nicht eine.
	   ---------------------------------------------------------
	   Der Anschnitt liegt im Karton VERTIEFT. Bei schrägem Blick sieht
	   man deshalb von der fernen Seite mehr und von der nahen weniger —
	   umgekehrt als bei der Rahmenflanke, die vorsteht. Ein Band mit
	   überall gleicher Breite dreht das um, weil die Perspektive die
	   nahe Seite vergrössert. Simon am 27.08.2026: *„rein die Verzerrung
	   macht den Anschnitt in der Nähe breiter = es sieht perspektivisch
	   nicht korrekt aus."*

	   Die Faktoren rechnet `bevelFaktoren()`. Ohne Verzerrung stehen
	   alle vier auf demselben Wert, und die Rückfallkette endet bei der
	   alten einen Breite — an dieser Regel ändert sich für die flache
	   Ansicht also nichts. */
	border-width:
		var(--pe-bevel-w-oben,   var(--pe-bevel-width, 0.42cqw))
		var(--pe-bevel-w-rechts, var(--pe-bevel-width, 0.42cqw))
		var(--pe-bevel-w-unten,  var(--pe-bevel-width, 0.42cqw))
		var(--pe-bevel-w-links,  var(--pe-bevel-width, 0.42cqw));
	border-color:
		var(--pe-bevel-top,    #fffdf8)
		var(--pe-bevel-right,  #fffdf8)
		var(--pe-bevel-bottom, #fffdf8)
		var(--pe-bevel-left,   #fffdf8);
	/* Haarfeine Trennlinie zum Werk. Innenschatten werden am
	   Innenrand des Rahmens beschnitten — sie sitzt also genau dort,
	   wo der Anschnitt auf das Bild trifft.

	   Dahinter der weiche Schlagschatten, den der Karton auf das Werk
	   wirft. Er ist der Grund, warum ein Passepartout auf einem Foto
	   plastisch wirkt und auf dem Bildschirm ohne ihn flach.

	   ZUR BREITE, weil sie leicht falsch gewaehlt wird: in Philipps
	   Referenzfoto (`assets/gruppen/passepartout_02.png`) laeuft der
	   Schatten ueber 96 von 1448 Pixeln, also 6,6 % der Bildbreite. Das
	   waere hier voellig falsch — das Foto ist eine Makroaufnahme unter
	   flachem Winkel. Massgeblich ist die Physik: ein Museumskarton ist
	   knapp 2 mm dick und wirft bei weichem Licht drei bis fuenf
	   Millimeter Schatten. Auf einem Werk von 100 cm Breite sind das
	   0,3 bis 0,5 %, und in dieser Groessenordnung steht der Wert.

	   In cqw, damit er in jedem Format gleich bleibt. */
	box-shadow:
		inset 0 0 0 0.04cqw rgba(0, 0, 0, 0.35),
		inset 0 0 0.45cqw 0.12cqw rgba(0, 0, 0, 0.30),
		inset 0 0 1.1cqw 0 rgba(0, 0, 0, 0.14);
}

/* Schattenfuge: das Werk schwebt, der Spalt liegt im Schatten.
   Kein Anschnitt — dort ist kein Material, das man anschneiden könnte. */
.pe-frameset.is-shadowgap .pe-frameset__paper::after {
	border: 0;
	box-shadow:
		inset 0 0 0 0.1cqw rgba(0, 0, 0, 0.75),
		inset 0 0 0.8cqw 0.2cqw rgba(0, 0, 0, 0.55),
		0 0 1.2cqw 0.3cqw rgba(0, 0, 0, 0.6);
}

/* Überblendebene für den Rahmenwechsel.
   border-image-source lässt sich nicht animieren — ein Rahmenwechsel
   springt deshalb hart um. Die zweite Ebene hält den alten Rahmen fest
   und blendet ihn aus, während darunter schon der neue steht. Dasselbe
   Verfahren wie beim Szenenwechsel. */
.pe-frameset__frame--prev {
	opacity: 0;
	transition: opacity 0.35s ease;
	z-index: 2;
}

/* Rahmen als eigene Ebene — sonst würde sein Farbfilter das Werk mit
   einfärben. 9-Slice: Ecken unverzerrt, Kanten gekachelt. */
.pe-frameset__frame {
	position: absolute;
	inset: 0;
	pointer-events: none;
	border-style: solid;
	/* Die vier Flaechen des lackierten Profils. Ein CSS-Rahmen laesst
	   sie von sich aus auf GEHRUNG zusammenlaufen — das ist der ganze
	   Grund, warum die einfarbigen Rahmen seit 2.189.0 keine
	   Neunerteilung mehr benutzen. Bei einem Rahmen MIT Bild stehen
	   alle vier auf `transparent`; dann malt allein `border-image`. */
	border-color:
		var(--pe-profil-oben,   transparent)
		var(--pe-profil-rechts, transparent)
		var(--pe-profil-unten,  transparent)
		var(--pe-profil-links,  transparent);
	border-width: calc(var(--pe-frame-pad) * 1cqw);
	border-image-source: var(--pe-frame-image);
	border-image-slice: var(--pe-frame-slice);
	border-image-repeat: var(--pe-frame-repeat, round);
	border-image-width: calc(var(--pe-frame-pad) * 1cqw);
	filter: var(--pe-frame-filter);

	/* Der Falzschatten — die Kante, an der der Rahmen auf das
	   Passepartout trifft.
	   
	   `inset` bezieht sich auf die PADDING-Box, und die ist bei diesem
	   Element genau die Rahmenoeffnung. Der Schatten liegt also innen am
	   Falz und faellt zur Bildmitte hin auf null. Weil die Rahmenebene
	   die oberste ist, faellt er auf das Passepartout — dorthin, wo ihn
	   ein Rahmen im Streiflicht auch wirft.
	   
	   Das ist der Anteil, der Tiefe wirklich verkauft: ein flaechig
	   lackiertes Profil ohne diese Kante sieht aufgeklebt aus, mit ihr
	   sitzt es im Rahmen. */
	box-shadow: var(--pe-falz-schatten, none);
}

/* Nur wo ein Rahmen ist. Ohne Rahmen und bei Alu-Dibond gaebe es keinen
   Falz — ein Schatten dort waere ein Rand, den niemand bestellt hat. */
.pe-frameset:not(.is-alu):not(.ohne-rahmen) .pe-frameset__frame {
	--pe-falz-schatten:
		inset 0 0 0.28cqw rgba(0, 0, 0, 0.55),
		inset 0.22cqw 0.22cqw 0.75cqw rgba(0, 0, 0, 0.30);
}

/* Museumsglas: dezente Reflexion, kein Kitsch. inset in cqw statt Prozent,
   weil Prozent vertikal gegen die Höhe auflöst und der Reflex sonst bei
   Panorama verrutscht. */
.pe-frameset__glass {
	position: absolute;
	inset: calc(var(--pe-frame-pad) * 1cqw);
	pointer-events: none;
	opacity: 0;
	transition: opacity 0.25s ease;
	background: linear-gradient(
		118deg,
		rgba(255, 255, 255, 0.15) 0%,
		rgba(255, 255, 255, 0.04) 26%,
		rgba(255, 255, 255, 0) 46%
	);
}
.pe-frameset.has-glass .pe-frameset__glass { opacity: 1; }

/* Alu-Dibond: randlos, kein Rahmen, dafür deutlich abgesetzt von der Wand. */
/* Alu-Dibond hängt auf Abstandhaltern und steht deutlich weiter von der
   Wand ab als ein Rahmen. Derselbe Lichteinfall, größerer Wurf. */
.pe-frameset.is-alu {
	filter: var(--pe-shadow-alu, drop-shadow(3cqw 1.7cqw 1.75cqw rgba(0, 0, 0, 0.47)));
}
.pe-frameset.is-alu .pe-frameset__art {
	box-shadow: 0 0 0 0.1cqw rgba(255, 255, 255, 0.08);
}


/* =========================================================
 * DER Anzeigebereich
 * ---------------------------------------------------------
 * Werkansicht: das Composite füllt die volle Spaltenbreite, immer.
 * Raumansicht: dieselbe Box, Szene im Hintergrund, Werk maßstäblich.
 * ======================================================= */
/* Eigener Container, EIN Kind des Bricks-Blocks.
   Die vier Eigenschaften unter `padding` sind kein Zierrat: sie sorgen
   dafür, dass dieser Container die volle Breite bekommt, egal ob der
   Bricks-Block eine Flex-Reihe, eine Flex-Spalte oder ein Raster ist.
   `grid-column: 1 / -1` greift nur im Raster und ist sonst wirkungslos. */
.pe-view {
	box-sizing: border-box;
	display: flex;
	flex-direction: column;
	align-items: stretch;
	gap: 1.4rem;
	padding: var(--pe-view-pad, 1.5rem);
	width: 100%;
	flex: 1 1 100%;
	grid-column: 1 / -1;
	justify-self: stretch;
	align-self: stretch;
}

.pe-view > * { min-width: 0; }

/* [hidden] MUSS gewinnen.
   Das UA-Stylesheet setzt [hidden] { display: none }, aber jede eigene
   display-Angabe schlägt es — und mehrere Ebenen hier haben eine.
   Historie: dieselbe Ursache hat das Szenenbild als zweites Flex-Kind
   neben dem Werk stehen lassen — beide mit width:100%, beide auf die
   Hälfte geschrumpft, 316 von 631 Pixeln. Das Szenenbild liegt deshalb
   inzwischen absolut und arbeitet mit Deckkraft statt mit hidden; für
   Thumbleiste, Hinweis und Maßstabsfeld gilt die Regel weiter. */
.pe-view [hidden],
.pe-lightbox [hidden] { display: none !important; }

/* Die Höhe kommt als Pixelwert aus dem JS, damit der Wechsel zwischen
   Werk- und Raumansicht laufen kann: das Seitenverhältnis der Box
   wechselt dabei vom gerahmten Werk auf das Raumfoto, und „auto" ist
   nicht animierbar. */
.pe-view__frame {
	position: relative;
	width: 100%;
	/* Zentriert, sobald das JS die Breite begrenzt hat — bei sehr hohen
	   Formaten ist die Bühne schmaler als die Spalte. */
	margin-inline: auto;
	/* Die Größenänderung beim Formatwechsel läuft weich. Der Weg ins
	   Vollbild NICHT über diese Angabe — dort übernimmt eine
	   Transform-Animation, die von der tatsächlichen Position ausgeht.
	   Beides gleichzeitig ergab das unsaubere Doppelspiel. */
	transition: height 0.4s ease;
	/* Nicht zusammendruecken lassen.
	 *
	 * Das Skript rechnet eine Hoehe und schreibt sie hin. Steht die Buehne
	 * in einem Flex-Behaelter — im Overlay tut sie das —, ist sie ein
	 * Flex-Element mit `flex-shrink: 1` und wird bei Platzmangel unter
	 * diese Hoehe gedrueckt. Der Rahmen darin richtet sich nach der
	 * BREITE und schrumpft nicht mit; er steht dann unten heraus.
	 *
	 * Am 25.08.2026 im Overlay gemessen: Inline 371,3 px, berechnet
	 * 363,3 — acht Pixel weggedrueckt, und der Rahmen brauchte 393. */
	flex-shrink: 0;
}
.pe-view__frame.is-flipping { transition: none; }

/* Das Szenenfoto liegt absolut und wird ein- und ausgeblendet.
   Es darf NIE im Fluss stehen: als zweites Flex-Kind neben dem Werk hat
   es die Bühne halbiert — das war der Fehler, der die Werkansicht drei
   Runden lang zerlegt hat. */
.pe-view__room-bg {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
	opacity: 0;
	pointer-events: none;
	transition: opacity 0.4s ease;
}
.pe-view__frame.is-room .pe-view__room-bg { opacity: 1; }

/* Überblendebene für den Szenenwechsel. Liegt über dem Hintergrundfoto,
   aber unter dem Werk, und zeigt beim Wechsel kurz das vorherige Foto.
   In der Werkansicht ganz aus dem Weg. */
.pe-view__room-fade {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
	opacity: 0;
	pointer-events: none;
	transition: opacity 0.45s ease;
}
.pe-view__frame:not(.is-room) .pe-view__room-fade { display: none; }

/* Werkansicht: normaler Fluss, volle Breite.
   Breite UND Position laufen weich, damit ein Szenenwechsel mit anderem
   Aufhängepunkt nicht springt. Beim Ziehen des eigenen Fotos wäre das
   Nachlaufen störend — dafür die Klasse is-dragging. */
.pe-view__slot {
	width: 100%;
	margin-inline: auto;
	transition: width 0.35s ease, left 0.35s ease, top 0.35s ease;

	/* Das Werk wird gezogen, nicht ausgewaehlt.
	 *
	 * Die Zieh-Geste beginnt mit 320 ms Halten (`HOLD_MS` in
	 * `enableDrag()`). Genau dieses Halten ist auf iOS ueber einem
	 * `<img>` die Geste, die das Kontextmenue oeffnet — „Bild sichern",
	 * „Kopieren", „Teilen". Der Besucher haelt, um das Werk an die Wand
	 * zu schieben, und bekommt statt dessen ein Blatt vor das Bild
	 * geschoben; das Ziehen faengt gar nicht erst an.
	 *
	 * `-webkit-touch-callout: none` schaltet dieses Blatt ab. Die
	 * Auswahl dazu, weil ein Halten sonst die blaue Markierung
	 * aufzieht und der Finger beim Ziehen Text markiert statt das Werk
	 * zu bewegen. Und die Antipp-Farbe, weil Android sonst bei jedem
	 * Zieh-Anfang kurz aufblitzt.
	 *
	 * Nur hier, nicht am ganzen Konfigurator: ueberall sonst darf
	 * markiert und kopiert werden — ein Preis, ein Mass, ein Titel
	 * sind Text, den jemand mitnehmen koennen soll. */
	-webkit-touch-callout: none;
	-webkit-user-select: none;
	user-select: none;
	-webkit-tap-highlight-color: transparent;
}
.pe-view__slot.is-dragging { transition: none; }

/* Der Rahmenbereich zentriert das Composite in der Werkansicht. */
.pe-view__frame:not(.is-room) {
	display: flex;
	align-items: center;
	justify-content: center;
}

/* Raumansicht: absolut, Breite maßstäblich zur Wandbreite. */
/* Nach dem Ausrichten steht das verzerrte Foto über die Bühne hinaus —
   der Zoom deckt die Bühne ab, die Überstände müssen weg. Nur in der
   Raumansicht, damit der Schlagschatten des Werks in der Werkansicht
   nicht angeschnitten wird. */
.pe-view__frame.is-room { overflow: hidden; }

.pe-view__frame.is-room .pe-view__slot {
	position: absolute;
	left: 50%;
	top: 50%;
	transform: translate(-50%, -50%);
}

/* KEIN touch-action: none mehr.
   ---------------------------------------------------------
   Es hat auf dem Handy das Scrollen blockiert, sobald ein eigenes Foto
   geladen war: jede Berührung, die auf dem Werk begann, war für das
   Verschieben reserviert, und das Werk nimmt in der Raumansicht einen
   großen Teil der Fläche ein. Ergebnis: die Seite ließ sich an genau
   der Stelle nicht mehr bewegen, an der man nachsehen will, ob die
   Einstellung passt.

   Verschieben per Finger übernimmt jetzt niemand — dafür gibt es die
   Regler, die ohnehin genauer sind. Mit der Maus bleibt das Ziehen. */
.pe-view__frame.is-user .pe-view__slot { cursor: grab; }
.pe-view__frame.is-user .pe-view__slot:active { cursor: grabbing; }

/* Das markierte Werk.
 *
 * Bis 2.154.0 hiess die Klasse `is-armed` und erschien erst NACH 320 ms
 * Halten — ein Zeichen, das kommt, wenn man es nicht mehr braucht.
 * Jetzt erscheint es beim ersten Tipp und sagt: ab hier gehoert die
 * Geste dem Werk.
 *
 * Die vier Ecken sind der eigentliche Hinweis. Eine Kontur allein sagt
 * „ausgewaehlt", Eckwinkel sagen „fassbar" — und genau das hat den drei
 * Testpersonen von Philipp gefehlt. */
.pe-view__slot.is-markiert {
	outline: 2px solid rgba(255, 255, 255, 0.85);
	outline-offset: 0.4cqw;
}
.pe-view__slot.is-markiert::after {
	content: '';
	position: absolute;
	inset: -0.4cqw;
	pointer-events: none;
	background:
		linear-gradient(#fff, #fff) 0 0 / 2.2cqw 2px no-repeat,
		linear-gradient(#fff, #fff) 0 0 / 2px 2.2cqw no-repeat,
		linear-gradient(#fff, #fff) 100% 0 / 2.2cqw 2px no-repeat,
		linear-gradient(#fff, #fff) 100% 0 / 2px 2.2cqw no-repeat,
		linear-gradient(#fff, #fff) 0 100% / 2.2cqw 2px no-repeat,
		linear-gradient(#fff, #fff) 0 100% / 2px 2.2cqw no-repeat,
		linear-gradient(#fff, #fff) 100% 100% / 2.2cqw 2px no-repeat,
		linear-gradient(#fff, #fff) 100% 100% / 2px 2.2cqw no-repeat;
}
.pe-view__frame.is-user .pe-view__slot:active { cursor: grabbing; }


/* =========================================================
 * Bedienleiste — gleiche Höhe, feste Box
 * ---------------------------------------------------------
 * height statt min-height und box-sizing: border-box. Mit min-height
 * und gemischten Elementtypen (button neben label) fallen die Höhen
 * auseinander, sobald die Zeilenhöhe abweicht.
 * ======================================================= */
/* Links Knöpfe und Thumbs, rechts Preis und Anfragen.
   Der Preisblock nimmt nur die Breite, die er braucht; die linke Spalte
   bekommt den Rest und bricht bei schmalem Fenster für sich um. */
.pe-view__actions {
	/* Ueber der Buehne, nicht darunter.
	 *
	 * `.pe-frameset` steht im Fluss mit `width: 100%` und einer
	 * Hoehe aus `aspect-ratio`. Rechnet die Buehne eine kleinere
	 * Hoehe aus als der Rahmen braucht — und sei es nur fuer die
	 * Dauer eines Bildes —, laeuft der Rahmen nach unten heraus und
	 * legt sich ueber die Knoepfe. Beschnitten wird nicht: der
	 * Schlagschatten des Rahmens gehoert zum Bild und darf ueber die
	 * Buehne hinausragen.
	 *
	 * Diese zwei Zeilen sind der Gurt zum Hosentraeger von
	 * `pe:neu-einpassen` beim Oeffnen des Overlays: selbst wenn
	 * einmal etwas ueberlaeuft, bleiben die Knoepfe sichtbar und
	 * anklickbar. Simon am 29.08.2026 im Portfolio gesehen. */
	position: relative;
	z-index: 1;
	display: flex;
	flex-wrap: wrap;
	align-items: flex-start;
	justify-content: space-between;
	gap: 1rem 1.5rem;
}

.pe-view__barcol {
	display: flex;
	flex-direction: column;
	gap: 0.75rem;
	flex: 1 1 22em;
	min-width: 0;
}

.pe-view__bar {
	display: flex;
	flex-wrap: wrap;
	align-items: flex-start;
	gap: 0.5rem;
}

/* Der Block nimmt die volle Breite der Spalte — seit 2.160.0.
 *
 * Bis dahin stand hier `flex: 0 0 auto`: „so breit wie das breiteste
 * Kind". Solange das der Preis war, stimmte das. Seit die Werkklasse mit
 * darin haengt, war es je nach Werk deren Kopfzeile — und die ist
 * unterschiedlich lang. Simon am 31.08.2026 mit drei Bildschirmfotos:
 * *„er aendert mit der Breite der Editionsinfo seine Breite … ergibt
 * schmalen Text oder immer noch ueberlaufenden Text"*. Bei „SIGNATURE
 * EDITION · Von Philipp Egger definiert, nummeriert · verfuegbar" lief
 * der Block aus der Spalte heraus.
 *
 * Gegengeprueft, ob die Spalte ueberhaupt je neben der Knopfspalte
 * steht: nein. `.pe-view__barcol` ist `flex: 1 1 22em` und waechst auf
 * die volle Breite — auf der Kunstdruckseite bei 1340 px, im Overlay bei
 * 1440 und bei 1920 px steht der Preisblock immer in einer eigenen
 * Zeile. Die alte Regel loeste damit ein Problem, das es nicht gab, und
 * verursachte eines, das es gab.
 *
 * `min-width: 0` gehoert dazu: ohne das kann ein Flexkind nicht unter
 * seine Inhaltsbreite schrumpfen, und genau das ist ein Ueberlauf. */
.pe-view__price {
	display: flex;
	flex-direction: column;
	align-items: stretch;
	gap: 0.6rem;
	flex: 1 1 100%;
	min-width: 0;
	max-width: 100%;
	/* Linksbuendig, seit 2.158.0.
	 *
	 * Bis dahin stand hier `right`. Solange die Spalte nur Knopf und
	 * Betrag trug, war das stimmig — „links was man bekommt, rechts was
	 * es kostet". Seit 2.157.2 haengt das Skript aber MwSt-Zeile und
	 * Werkklasse mit hinein, und die sind Fliesstext: der Betrag stand
	 * rechts, die Editionsinfo eine Zeile darunter links. Simon am
	 * 31.08.2026: *„Sieht unsauber aus."* Eine gemeinsame Kante ist
	 * mehr wert als die alte Trennung. */
	text-align: left;
	line-height: 1.05;
}

/* Der aufgeklappte Kasten darf die Spalte nicht breiter machen.
 *
 * `.pe-view__price` ist `flex: 0 0 auto` — sie ist so breit wie ihr
 * breitestes Kind. Am 31.08.2026 gemessen: zugeklappt 438 px, beim
 * Aufklappen des „i" sprang sie auf 1099 px und schob die Knopfspalte
 * daneben auf ein Drittel zusammen. Ein Kasten, der die Seite umbaut,
 * sobald man ihn oeffnet, ist schlimmer als einer, der zu schmal ist.
 *
 * `width: 0` nimmt den Kasten aus der Breitenrechnung der Spalte
 * heraus, `min-width: 100%` gibt ihm danach die volle Spaltenbreite
 * zurueck. Er waechst dann nur noch nach unten.
 *
 * Gezielt der TEXT, nicht die ganze Klappe: die Kopfzeile — Name,
 * Kurzsatz, Verfuegbarkeit — soll die Spalte weiter mitbestimmen.
 * Auf `.pe-klasse` angewandt fiel die Spalte von 438 auf 297 px, und
 * die Kopfzeile brach um. Simon am 31.08.2026 zur Preiszeile: *„OHNE
 * unschoen viele Zeilenumbrueche."* */
.pe-view__price .pe-klasse__text {
	width: 0;
	min-width: 100%;
}

/* Der Preisabsatz richtet sich sonst selbst nach rechts aus — er ist
   eine eigene Flexspalte mit `align-items: flex-end`. In der Preisspalte
   traegt die Spalte die Ausrichtung, und den seitlichen Innenabstand
   braucht er hier nicht: er stuende sonst weiter innen als der Knopf. */
.pe-view__price .pe-aus__preis {
	align-items: flex-start;
	text-align: left;
	padding: 0;
}
.pe-view__price:empty { display: none; }

/* Der Anfragen-Knopf so breit wie die drei Ansichtsknoepfe darueber.
 *
 * Simon: *„Darf gerne immer auf die Breite der drei Buttons unter dem
 * Werk (Werk / Raum / Vollbild) definiert sein."* Das Mass kommt aus
 * `knopfbreiteSetzen()` in `pe-configurator.js` — gemessen, weil die
 * Reihe in jeder Sprache anders breit ist. Fehlt die Variable, bleibt es
 * bei voller Spaltenbreite; ein Knopf, der zu breit ist, ist harmlos,
 * einer, der aus der Spalte laeuft, nicht.
 *
 * Die Werkklasse bleibt davon unberuehrt: ihr Text *darf* die Spalte
 * ausnutzen, sagt Simon ausdruecklich. */
.pe-view__price .pe-btn {
	width: 100%;
	max-width: var(--pe-anfrage-breite, 100%);
}

/* Auf schmalen Geräten stapelt sich alles in einer Spalte, und zwar in
   dieser Reihenfolge: Ansichtsknöpfe, Thumbleiste, Regler, Preis mit
   Anfragen-Knopf, danach erst die Hinweiszeilen.
   ---------------------------------------------------------
   Die Hinweiszeilen stehen im Markup innerhalb der Knopfspalte, der
   Preisblock daneben. `display: contents` löst die Knopfspalte auf, so
   dass alle Teile Geschwister derselben Reihenfolge werden — sonst
   ließe sich der Preis nicht zwischen Regler und Hinweise schieben. */
/* =========================================================
 * Ansicht auf schmalen Geräten
 * ---------------------------------------------------------
 * Dieser Block steht bewusst NACH allen Basisregeln der Ansicht. Eine
 * frühere Fassung stand weiter oben, und die padding-Kurzschreibweise
 * von .pe-view hat den seitlichen Abstand danach wieder auf null
 * gesetzt — sichtbar als Preis, der an der Bildschirmkante klebt.
 * ======================================================= */
@media (max-width: 700px) {
	.pe-view { padding-inline: var(--pe-mobile-pad, 1.25rem); }

	/* Alles stapelt sich in einer Spalte, in dieser Reihenfolge:
	   Ansichtsknöpfe, Thumbleiste, Regler, Preis mit Anfragen-Knopf,
	   danach erst die Hinweiszeilen.

	   Die Hinweiszeilen stehen im Markup innerhalb der Knopfspalte, der
	   Preisblock daneben. `display: contents` löst die Knopfspalte auf,
	   so dass alle Teile Geschwister derselben Reihenfolge werden — sonst
	   ließe sich der Preis nicht zwischen Regler und Hinweise schieben. */
	.pe-view__actions  { flex-direction: column; align-items: stretch; }
	.pe-view__barcol   { display: contents; }

	.pe-view__bar      { order: 1; }
	.pe-view__thumbs   { order: 2; }
	.pe-view__hint     { order: 3; }
	.pe-view__controls { order: 4; }
	.pe-view__price    { order: 5; }

	[data-pe-vat],
	[data-pe-hint],
	[data-pe-edition-note] { order: 6; }

	/* Knöpfe und Preis mittig über dem Anfragen-Knopf. Die Textzeilen
	   darunter bleiben linksbündig — zentrierter Fließtext liest sich
	   schlechter, zentrierte Bedienelemente sehen besser aus. */
	.pe-view__bar    { justify-content: center; }
	.pe-view__thumbs { justify-content: center; }

	.pe-view__price {
		width: 100%;
		align-items: stretch;
		/* Am Telefon aus demselben Grund links wie am Schreibtisch: der
		 * Block traegt jetzt auch MwSt-Zeile und Werkklasse. Die
		 * Ansichtsknoepfe darueber bleiben mittig — das sind
		 * Bedienelemente, kein Text. */
		text-align: left;
	}

	/* Der Preis selbst aber mittig — Simon am 31.08.2026: *„Mobil: Preis
	 * zentriert in der Spalte."* Er steht dort ueber der ganzen Breite
	 * und ueber dem Knopf, der ebenfalls die ganze Breite nimmt; links
	 * angeschlagen haengt die grosse Zahl schief im Kasten. Die
	 * Steuerangabe gehoert in denselben Absatz und geht mit. */
	.pe-view__price .pe-aus__preis {
		align-items: center;
		text-align: center;
	}
	.pe-view__price .pe-raum__preis { text-align: center; }
	/* Am Telefon nimmt der Knopf die ganze Breite — das hatte Simon so
	 * abgenommen, und die Knopfreihe darueber ist dort ohnehin fast so
	 * breit wie die Spalte. */
	.pe-view__price .pe-btn { width: 100%; max-width: none; }
}

/* Der Anfragen-Knopf ist die einzige Handlung auf dieser Seite, die
   wirklich zählt. Er darf aussehen wie eine. */
.pe-btn--primary {
	border-color: currentColor;
	background: var(--pe-selected-bg, rgba(128, 128, 128, 0.14));
}

/* Solange der Dialog verfügbar ist, steht das Formular nicht im Fluss.
   Ohne JavaScript wird die Klasse nie gesetzt und es bleibt sichtbar. */
.pe-form-hidden { display: none !important; }

.pe-btn {
	box-sizing: border-box;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	height: 2.9em;
	padding: 0 1.1em;
	margin: 0;
	appearance: none;
	background: none;
	border: 1px solid var(--pe-border, rgba(128, 128, 128, 0.35));
	border-radius: 2px;
	font: inherit;
	font-size: 0.85em;
	line-height: 1;
	color: inherit;
	cursor: pointer;
	white-space: nowrap;
	transition: border-color 0.15s ease, background-color 0.15s ease;
}

.pe-btn:hover { border-color: var(--pe-border-hover, rgba(128, 128, 128, 0.75)); }
/* Gedrückt sieht aus wie ausgewählt — und zwar aus DERSELBEN Quelle.
 *
 * `aria-pressed` steht ohnehin schon an den Knöpfen, die einen Zustand
 * halten: die beiden Ausrichtknöpfe und das Vollbild. Eine zweite
 * Klasse danebenzusetzen hiesse, denselben Zustand zweimal zu führen —
 * und die zweite Fassung ist die, die beim nächsten Umbau vergessen
 * wird. Das Vorlesegerät und das Auge lesen ab jetzt dasselbe Attribut.
 *
 * Simon am 26.08.2026: *„den Ausrichtungs-Button highlighten, der
 * gerade aktiv ist."* Es ist bewusst genau der Look, den
 * „Raumvorschau" schon trägt — ein zweites Aktiv-Aussehen auf
 * derselben Seite wäre eine Unterscheidung ohne Unterschied. */
.pe-btn.is-active,
.pe-btn[aria-pressed="true"] {
	border-color: currentColor;
	background: var(--pe-selected-bg, rgba(128, 128, 128, 0.14));
}
.pe-btn:focus-visible { outline: 2px solid currentColor; outline-offset: 2px; }


/* =========================================================
 * Thumbleiste — nur in der Raumansicht
 * ======================================================= */
.pe-view__thumbs {
	display: flex;
	flex-wrap: wrap;
	align-items: flex-start;
	gap: 0.5rem;
}
/* Ausgleich, damit Szenen-Thumbs und eigene Fotos auf einer Linie sitzen:
   die eigenen tragen oben und rechts Platz für den Löschknopf. */
.pe-view__thumbs > .pe-thumb { margin-top: 0.55em; }
/* In der Lightbox steht die Leiste wieder für sich. */
.pe-lightbox .pe-view__thumbs { margin-top: 0.5rem; }

/* Der [hidden]-Vorrang steht weiter oben, einmal für den ganzen Block. */

.pe-thumb {
	box-sizing: border-box;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 4.2em;
	height: 3.2em;
	padding: 0;
	margin: 0;
	appearance: none;
	background: none center/cover no-repeat;
	border: 1px solid var(--pe-border, rgba(128, 128, 128, 0.35));
	border-radius: 2px;
	color: inherit;
	cursor: pointer;
	transition: border-color 0.15s ease, box-shadow 0.15s ease;
}

.pe-thumb:hover { border-color: var(--pe-border-hover, rgba(128, 128, 128, 0.75)); }
.pe-thumb.is-active {
	border-color: currentColor;
	box-shadow: 0 0 0 1px currentColor;
}
.pe-thumb:focus-within { outline: 2px solid currentColor; outline-offset: 2px; }

.pe-thumb--upload { background-color: var(--pe-selected-bg, rgba(128, 128, 128, 0.14)); }

/* Eigene Fotos: Thumb plus Löschknopf. Der Knopf sitzt in der Ecke,
   überlappt den Thumb aber nicht — sonst verdeckt er das Bild und ist
   auf dem Touchgerät kaum sicher zu treffen. */
.pe-thumb-wrap {
	position: relative;
	display: inline-flex;
	padding-top: 0.55em;
	padding-right: 0.55em;
}

.pe-thumb__remove {
	position: absolute;
	top: 0;
	right: 0;
	width: 1.5em;
	height: 1.5em;
	padding: 0;
	display: flex;
	align-items: center;
	justify-content: center;
	appearance: none;
	background: var(--pe-bg, #1a1a1a);
	border: 1px solid var(--pe-border, rgba(128, 128, 128, 0.35));
	border-radius: 50%;
	color: inherit;
	font: inherit;
	font-size: 0.8em;
	line-height: 1;
	cursor: pointer;
	opacity: 0.75;
	transition: opacity 0.15s ease, border-color 0.15s ease;
}
.pe-thumb__remove:hover { opacity: 1; border-color: currentColor; }
.pe-thumb__remove:focus-visible { outline: 2px solid currentColor; outline-offset: 2px; }


/* =========================================================
 * Ausrichtungsviereck
 * ---------------------------------------------------------
 * Vier Griffe plus Umriss. Der Umriss liegt in einem SVG mit
 * viewBox 0..100 und preserveAspectRatio: none — damit sind die
 * Punktkoordinaten dieselben Prozentwerte, mit denen das JS rechnet,
 * ohne Umrechnung an zwei Stellen.
 * ======================================================= */
.pe-quad {
	position: absolute;
	inset: 0;
	pointer-events: none;
	z-index: 3;
}
.pe-quad[hidden] { display: none !important; }

.pe-quad__svg {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
}

.pe-quad__poly {
	fill: rgba(255, 255, 255, 0.06);
	stroke: rgba(255, 255, 255, 0.9);
	stroke-width: 0.35;
	vector-effect: non-scaling-stroke;
	filter: drop-shadow(0 0 2px rgba(0, 0, 0, 0.8));
}

/* Solange das Foto eingerichtet wird, liegt die Konfiguration still.
   Gedämpft und nicht bedienbar — sichtbar, dass es gleich wieder geht.
   Die Thumbleiste bleibt hell: ein anderes Foto ist kein Konfigurieren,
   sondern ein Neuanfang. */
.pe-aus.ist-eingerichtet .pe-aus__karten,
.pe-aus.ist-eingerichtet .pe-aus__groessen,
.pe-aus.ist-eingerichtet .pe-aus__bearbeiten,
.pe-aus.ist-eingerichtet .pe-aus__fein {
	opacity: .35;
	pointer-events: none;
	filter: grayscale(1);
	transition: opacity .25s ease, filter .25s ease;
}
.pe-aus__bearbeiten.ist-gesperrt > summary { cursor: default; }

@media (prefers-reduced-motion: reduce) {
	.pe-aus.ist-eingerichtet .pe-aus__karten,
	.pe-aus.ist-eingerichtet .pe-aus__groessen,
	.pe-aus.ist-eingerichtet .pe-aus__bearbeiten,
	.pe-aus.ist-eingerichtet .pe-aus__fein { transition: none; }
}

/* Foto anpassen — drei Regler hinter einer Klappe.
   Simons Entscheidung vom 01.09.2026: drei weitere Zeilen über volle
   Breite wären am Telefon in einer schon vollen Steuerung zu viel.
   Zugeklappt kosten sie eine. */
.pe-bildwerte {
	margin-top: .6rem;
	font-size: .92em;
}
.pe-bildwerte[hidden] { display: none !important; }
.pe-bildwerte__kopf {
	cursor: pointer;
	list-style: none;
	padding: .2em 0;
	opacity: .85;
}
.pe-bildwerte__kopf::-webkit-details-marker { display: none; }
.pe-bildwerte__kopf::marker { content: ''; }
.pe-bildwerte__kopf::before {
	content: '+';
	display: inline-block;
	width: 1.1em;
	font-variant-numeric: tabular-nums;
}
.pe-bildwerte[open] > .pe-bildwerte__kopf::before { content: '−'; }
.pe-bildwerte__feld { display: block; margin-top: .35em; }
.pe-bildwerte__regler { flex: 1 1 auto; min-width: 0; }
/* Feste Breite, damit die Regler nicht bei jedem Prozent springen —
   `tabular-nums` allein genügt nicht, „100 %" ist breiter als „99 %". */
.pe-bildwerte__wert {
	flex: 0 0 3.6em;
	text-align: right;
	font-variant-numeric: tabular-nums;
	opacity: .7;
}
.pe-bildwerte__zurueck { margin-top: .5em; }

/* =====================================================================
 * Die Führung nach dem Hochladen — zwei Schritte, mehr nicht
 * ---------------------------------------------------------------------
 * Philipp am 01.09.2026: *„von allen Testern das Feedback, dass keiner
 * es checkt, dass die Punkte im Raum platziert werden müssen."* Die
 * Vorlage ist die Smartist-App: Wandfläche wählen, dann Wandbreite.
 *
 * Sie steht ÜBER der Bühne, nicht darin — im Bild wäre sie ein Schild
 * vor dem, was sie erklärt, und am Telefon nähme sie die halbe Höhe.
 * ================================================================== */
.pe-fuehrung {
	display: flex;
	/* Text links, Knopf rechts, beide in EINER Zeile — Simon am
	   01.09.2026: *„der ‚Weiter‘ Button nicht so unten dran kleben,
	   sondern in einer Zeile mit dem Text aber rechtsbündig."* Oben
	   ausgerichtet, nicht mittig: bei zwei Textzeilen säße ein mittiger
	   Knopf zwischen ihnen statt an der ersten. */
	align-items: flex-start;
	justify-content: space-between;
	gap: 1rem;
	flex-wrap: nowrap;
	text-align: left;
	margin: 0 0 .8rem;
	padding: .8rem 1rem;
	border: 1px solid var(--pe-line, currentColor);
	background: var(--pe-aus-flaeche, rgba(128, 128, 128, .10));
}
.pe-fuehrung[hidden] { display: none !important; }
.pe-fuehrung__text { flex: 1 1 auto; min-width: 0; }
.pe-fuehrung__schritt {
	display: block;
	font-size: .72em;
	letter-spacing: .08em;
	text-transform: uppercase;
	opacity: .55;
}
.pe-fuehrung__titel {
	display: block;
	font-size: 1.05em;
	line-height: 1.3;
}
.pe-fuehrung__hilfe {
	display: block;
	font-size: .85em;
	opacity: .75;
	line-height: 1.4;
}
.pe-fuehrung__knopf { flex: 0 0 auto; }

/* Die Wahl im letzten Schritt liegt ÜBER dem Foto, unten mittig — dort,
   wo sonst nichts steht und wo sie neben dem liegt, worüber sie
   entscheidet. Simon: *„kann das im Schritt eine Art overlay werden?"* */
.pe-fuehrung__ueber {
	position: absolute;
	/* NICHT `left: 50%` mit Rückversatz: dann steht dem Kasten nur die
	   rechte Hälfte der Bühne zur Verfügung, und er bricht um, obwohl
	   Platz da wäre. Am 01.09.2026 gemessen — 336 px statt 672, und die
	   drei Knöpfe standen in zwei Reihen. Mit `left: 0; right: 0` und
	   `width: fit-content` ist beides beisammen: volle Breite als
	   Grundlage, und trotzdem nur so breit wie nötig. */
	left: 0;
	right: 0;
	bottom: .6rem;
	margin: 0 auto;
	width: fit-content;
	z-index: 6;
	display: flex;
	gap: .35rem;
	flex-wrap: wrap;
	justify-content: center;
	max-width: calc(100% - 1rem);
	/* Knapp gehalten — Simon: *„etwas kleinere, nicht zu viel padding,
	   damit das Foto gut sichtbar bleibt."* Drei Knöpfe liegen hier auf
	   dem Bild, das sie beurteilen lassen sollen. */
	padding: .3rem;
	border-radius: 2px;
	/* Dunkler Grund, damit die Knöpfe auf jedem Foto lesbar bleiben —
	   ein heller Knopf auf einer weißen Wand ist keiner. */
	background: rgba(0, 0, 0, .45);
	backdrop-filter: blur(2px);
}
.pe-fuehrung__ueber[hidden] { display: none !important; }
.pe-fuehrung__ueber > [hidden] { display: none !important; }
/* Dunkel, nicht hell — Simon am 01.09.2026. Zwei weisse Flaechen auf
   einem Foto sind zwei Loecher darin; dunkel bleibt es ein Schild, das
   darueber liegt. */
.pe-fuehrung__ueber .pe-btn {
	background: rgba(0, 0, 0, .55);
	color: #fff;
	border-color: rgba(255, 255, 255, .7);
}
.pe-fuehrung__ueber .pe-btn {
	height: 2.1em;
	padding: 0 .8em;
	font-size: .85em;
	white-space: nowrap;
}
.pe-fuehrung__ueber .pe-btn:hover,
.pe-fuehrung__ueber .pe-btn:focus-visible {
	background: rgba(0, 0, 0, .75);
	border-color: #fff;
}

/* Die gewählte Ausrichtung ist zu sehen, nicht nur zu ahnen: sie steht
   hell auf dunklem Grund, umgekehrt zu den beiden anderen. */
.pe-fuehrung__ueber .pe-btn.is-gewaehlt {
	background: rgba(255, 255, 255, .92);
	color: #111;
	border-color: #fff;
}

/* „Fertig" ist die Handlung, nicht die Wahl — abgesetzt durch einen
   Abstand, damit niemand sie für eine dritte Ausrichtung hält. */
.pe-fuehrung__ueber-fertig { margin-left: .5rem; }

/* Am Telefon passen die drei nicht nebeneinander: bei 374 px Bühne sind
   „Raum ausrichten" und „Werk ausrichten" allein schon 293 px breit.
   Gemessen standen sie deshalb in DREI Reihen und deckten 44 % des
   Fotos — genau das, was Simon nicht wollte.

   Kleiner gesetzt passen die beiden Ausrichtungen in eine Reihe und
   „Fertig" darunter: zwei Reihen statt drei, und das Foto bleibt zu
   drei Vierteln frei. */
@media (max-width: 700px) {
	.pe-fuehrung__ueber { gap: .3rem; padding: .25rem; }
	.pe-fuehrung__ueber .pe-btn {
		font-size: .74em;
		padding: 0 .6em;
		height: 2em;
	}
	.pe-fuehrung__ueber-fertig {
		margin-left: 0;
		flex: 0 0 100%;
		align-self: center;
		max-width: 8em;
	}
}

/* Das Maßband steht IN der Box, unter dem Text — Schritt 2. Kein
   seitlicher Innenabstand mehr: die Box bringt ihren eigenen mit. */
.pe-massband {
	display: flex;
	align-items: center;
	gap: .8rem;
	margin: .6rem 0 .1rem;
}
.pe-massband[hidden] { display: none !important; }
.pe-massband__regler { flex: 1 1 auto; min-width: 0; }
.pe-massband__wert {
	flex: 0 0 5.5em;
	text-align: right;
	font-variant-numeric: tabular-nums;
}

/* Schritt 3 holt die Bildregler in die Box. Dort brauchen sie weder
   Rahmen noch Klapp-Plus: die Überschrift der Box sagt schon, was sie
   sind, und zugeklappt wären sie ein Schritt, der nichts zeigt. */
.pe-bildwerte.is-fuehrung {
	margin-top: .6rem;
}
.pe-bildwerte.is-fuehrung > .pe-bildwerte__kopf { display: none; }

@media (max-width: 700px) {
	/* Auch am Telefon eine Zeile: der Text bricht um, der Knopf bleibt
	   rechts. Volle Knopfbreite hatte ihn unter den Text geschoben —
	   genau das, was Simon nicht wollte. */
	.pe-fuehrung { padding: .65rem .7rem; gap: .7rem; }
	.pe-fuehrung__knopf { width: auto; white-space: nowrap; }
}

/* Alles ausser der Wand wird gedämpft — das ist der ganze Trick daran:
   man sieht ohne ein Wort, was gemeint ist. Nur im ersten Schritt, und
   nie als Glasscheibe vor den Griffen. */
.pe-quad__schleier {
	fill: rgba(0, 0, 0, 0);
	pointer-events: none;
	transition: fill .25s ease;
}
.pe-quad.is-fuehrung .pe-quad__schleier { fill: rgba(0, 0, 0, .55); }

/* Und die vier Griffe atmen, solange die Führung im ersten Schritt
   steht. Dieselbe Bewegung wie am Portfolioknopf — wer sie einmal
   gesehen hat, kennt sie wieder. */
@keyframes pe-quad-atmen {
	0%, 100% { transform: scale(1);    box-shadow: 0 0 0 0 rgba(255, 255, 255, .55); }
	50%      { transform: scale(1.18); box-shadow: 0 0 0 .5em rgba(255, 255, 255, 0); }
}
.pe-quad.is-fuehrung .pe-quad__handle { animation: pe-quad-atmen 2s ease-in-out infinite; }

/* Im zweiten Schritt gilt dasselbe für das Maßfeld. */
.pe-quad__scale.is-fuehrung {
	outline: 2px solid #fff;
	outline-offset: 3px;
}

@media (prefers-reduced-motion: reduce) {
	.pe-quad.is-fuehrung .pe-quad__handle { animation: none; }
	.pe-quad__schleier { transition: none; }
}

.pe-quad__handle {
	position: absolute;
	width: 2em;
	height: 2em;
	margin: -1em 0 0 -1em;
	padding: 0;
	appearance: none;
	border: 2px solid #fff;
	border-radius: 50%;
	background: rgba(0, 0, 0, 0.55);
	box-shadow: 0 0 3px rgba(0, 0, 0, 0.9);
	pointer-events: auto;
	cursor: grab;
	touch-action: none;
}
.pe-quad__handle:active { cursor: grabbing; }
.pe-quad__handle:focus-visible { outline: 2px solid #fff; outline-offset: 2px; }
.pe-quad__handle[hidden] { display: none !important; }

/* Im ausgerichteten Zustand bleibt die Markierung stehen, nur leiser:
   sie sagt, worauf sich die Zentimeterangabe bezieht. Ohne sie wäre der
   Maßstab eine Zahl ohne Bezugsgröße. */
.pe-quad.is-aligned .pe-quad__poly {
	fill: none;
	stroke: rgba(255, 255, 255, 0.45);
	stroke-dasharray: 4 4;
}

/* Maßschild auf der Unterkante — ein Eingabefeld, kein Etikett.
   translate(-50%, -50%) setzt seinen Mittelpunkt auf die Linie; die
   Angabe sitzt damit AUF der Strecke, die sie beschreibt. */
.pe-quad__scale {
	position: absolute;
	transform: translate(-50%, -50%);
	display: inline-flex;
	align-items: baseline;
	gap: 0.25em;
	padding: 0.25em 0.5em;
	border-radius: 0.2em;
	border: 1px solid rgba(255, 255, 255, 0.55);
	background: rgba(0, 0, 0, 0.66);
	color: #fff;
	font-size: 0.78em;
	line-height: 1.2;
	white-space: nowrap;
	pointer-events: auto;
	box-shadow: 0 1px 4px rgba(0, 0, 0, 0.6);
}

.pe-quad__scale-input {
	appearance: none;
	margin: 0;
	padding: 0;
	border: 0;
	border-bottom: 1px dotted rgba(255, 255, 255, 0.5);
	background: transparent;
	color: inherit;
	-webkit-text-fill-color: currentColor;
	font: inherit;
	text-align: right;
	min-width: 2ch;
}
.pe-quad__scale-input:focus {
	outline: none;
	border-bottom-color: #fff;
}
.pe-quad__scale-unit { opacity: 0.75; }

/* Lupe. Beim Ziehen liegt der Finger auf genau der Stelle, die man
   treffen will — auf dem Handy verdeckt er sie vollständig. Deshalb
   derselbe Ausschnitt vergrößert daneben.

   Kein zweites <img>, sondern das Foto als Hintergrund: der Ausschnitt
   lässt sich so über background-position auf den Bruchteil eines Pixels
   genau setzen, ohne dass der Browser ein weiteres Bild lädt.
   pointer-events: none, damit sie dem Finger nie im Weg steht. */
.pe-loupe {
	position: absolute;
	width: 8em;
	height: 8em;
	border-radius: 50%;
	border: 2px solid rgba(255, 255, 255, 0.9);
	box-shadow: 0 2px 10px rgba(0, 0, 0, 0.6);
	background-repeat: no-repeat;
	background-color: rgba(0, 0, 0, 0.4);
	pointer-events: none;
	overflow: hidden;
	z-index: 4;
}
.pe-loupe[hidden] { display: none !important; }

/* Fadenkreuz: zeigt, welcher Punkt gerade gesetzt wird. Ohne das ist
   die Vergrößerung hübsch, aber man weiß nicht, worauf sie zielt. */
.pe-loupe__cross {
	position: absolute;
	inset: 0;
	background:
		linear-gradient(rgba(255, 255, 255, 0.9), rgba(255, 255, 255, 0.9)) center / 100% 1px no-repeat,
		linear-gradient(rgba(255, 255, 255, 0.9), rgba(255, 255, 255, 0.9)) center / 1px 100% no-repeat;
	mix-blend-mode: difference;
}
.pe-loupe__cross::after {
	content: '';
	position: absolute;
	left: 50%;
	top: 50%;
	width: 1.4em;
	height: 1.4em;
	margin: -0.7em 0 0 -0.7em;
	border: 1px solid rgba(255, 255, 255, 0.9);
	border-radius: 50%;
}

/* Der Knopf steht in derselben Zeile wie das Zahlenfeld und bekommt
   dessen Höhe. Über die Schriftgröße gerechnet wäre er niedriger als
   das Feld und säße sichtbar schief — deshalb align-items: stretch an
   der Zeile und keine eigene Höhe am Knopf. */
.pe-field__row { align-items: stretch; }

.pe-btn--small {
	/* Eine Hoehe fuer alle, nicht die Hoehe der Zeile.
	 *
	 * Vorher stand hier `height: auto; align-self: stretch`. Damit wurde
	 * jeder Knopf so hoch wie die Flexzeile, auf der er gerade landet —
	 * und das haengt allein an der Fensterbreite. Am 30.08.2026 bei
	 * 414 px in Chrome, WebKit und **echtem Safari** gemessen, alle drei
	 * bis auf die Nachkommastelle gleich:
	 *
	 *     Zeile 1  Breite | 400 | cm | [Raum ausrichten]     34,0 px
	 *     Zeile 2  [Werk ausrichten] [Zuruecksetzen]         40,5 px
	 *
	 * Oben streckt sich der Knopf auf das 34 px hohe Zahlenfeld, unten
	 * steht er allein und wird 40,5. Simon sah das als *„die Ausrichten
	 * Buttons sind nicht sauber"* — und hielt es fuer einen
	 * Safari-Fehler, weil sein Safari-Fenster schmaler war und deshalb
	 * anders umbrach. Es ist keiner: es ist in jedem Motor so.
	 *
	 * `1.85em` ist die Hoehe des Zahlenfelds, ausgedrueckt im Mass des
	 * KNOPFES: das Feld misst 34 px, die Knopfschrift 18,4 px. Erst
	 * gemessen, dann eingetragen — der erste Versuch mit 1.7em rechnete
	 * gegen die Schrift der Zeile statt gegen die des Knopfes und kam
	 * auf 31 px. */
	height: 1.85em;
	align-self: center;
	padding: 0 0.9em;
	font-size: 0.78em;
	white-space: nowrap;
}

/* Ein Zahlenfeld ohne Pfeilchen.
 *
 * `.pe-field__number` setzt Rahmen, Farbe und Schrift selbst, liess dem
 * Browser aber sein `appearance: auto` — am 30.08.2026 in allen drei
 * Motoren so gemessen. Safari zeichnet daraufhin die Stufenpfeile
 * dauerhaft ins Feld, Chrome nur beim Ueberfahren; auf Simons
 * Safari-Screenshot stehen sie mitten in der Zeile.
 *
 * Die Pfeile taugen hier ohnehin nichts: die Wandbreite wird getippt
 * oder aus der Markierung uebernommen, nicht in Einerschritten
 * hochgeklickt. */
.pe-field__number {
	appearance: none;
	-webkit-appearance: none;
}
.pe-field__number::-webkit-outer-spin-button,
.pe-field__number::-webkit-inner-spin-button {
	-webkit-appearance: none;
	margin: 0;
}

/* Der Übergang beim Ausrichten läuft weich — ein Foto, das
   schlagartig kippt, wirkt wie ein Fehler. */
.pe-view__room-bg,
.pe-view__room-fade {
	transition: opacity 0.4s ease, transform 0.45s cubic-bezier(0.2, 0.7, 0.25, 1);
}

/* =========================================================
 * Nutzereingaben zum eigenen Foto
 * ---------------------------------------------------------
 * Zwei Gruppen: Maßstab und Platzierung. Sechs gleich aussehende
 * Regler in einer Reihe wären nicht zu überblicken.
 * ======================================================= */
.pe-view__controls {
	display: flex;
	flex-wrap: wrap;
	gap: 0.75rem;
}
.pe-view__controls[hidden] { display: none !important; }

.pe-group-box {
	flex: 1 1 20em;
	min-width: 0;
	margin: 0;
	padding: 0.2em 0.9em 0.6em;
	border: 1px solid var(--pe-border, rgba(128, 128, 128, 0.35));
	border-radius: 2px;
	background: var(--pe-selected-bg, rgba(128, 128, 128, 0.08));
	display: flex;
	flex-wrap: wrap;
	align-items: flex-end;
	gap: 0.35rem 0.9rem;
}

.pe-group-box__title {
	padding: 0 0.4em;
	font-size: 0.72em;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	opacity: 0.75;
}

/* Der Hinweis am „i" der Ausrichten-Zeile — ein Kasten, kein Absatz.
 *
 * Er stand als Flex-Kind IM Fluss (`flex: 1 1 100%`) und wurde mit
 * `display` ein- und ausgeblendet. Damit schob er beim Aufgehen die
 * ganze Zeile nach unten — und weil dabei das „i" unter dem Zeiger
 * wegrutschte, kam sofort `pointerleave`, der Kasten schloss, die Zeile
 * sprang zurueck, `pointerenter` feuerte erneut. Das war Simons
 * *„flackert hart und zeigt nicht sauber an"*.
 *
 * Jetzt dieselbe Bauart wie der Kasten an den Ausfuehrungskarten:
 * absolut unter der Gruppe, aus dem Fluss genommen, ueber
 * `opacity`/`visibility` geschaltet. Es verschiebt sich nichts mehr,
 * also gibt es auch nichts, wovon der Zeiger rutschen koennte. */
.pe-group-box { position: relative; }

.pe-group-box__note {
	position: absolute;
	top: calc(100% + .35em);
	left: 0;
	right: 0;
	z-index: 8;
	margin: 0;
	padding: .8em 1em;
	font-size: 0.78em;
	line-height: 1.45;
	text-align: left;
	color: #f2f2f2;
	background: #0d0d0d;
	border: 1px solid rgba(255, 255, 255, .55);
	border-radius: 3px;
	box-shadow: 0 .6rem 1.6rem rgba(0, 0, 0, .55);
	opacity: 0;
	visibility: hidden;
	/* Beim Ueberfahren KEIN Ziel fuer den Zeiger: liefe er auf den Kasten,
	   verliesse er das „i", und das Flackern faenge von vorn an. Der
	   geklickte Zustand ist etwas anderes — dort darf man den Text
	   markieren. */
	pointer-events: none;
	transition: opacity .15s, visibility 0s linear .15s;
}

.pe-field {
	display: flex;
	flex-direction: column;
	gap: 0.15em;
	flex: 1 1 8em;
	min-width: 7em;
}

.pe-field__label {
	font-size: 0.7em;
	letter-spacing: 0.05em;
	text-transform: uppercase;
	opacity: 0.7;
	line-height: 1.2;
}

.pe-field__row {
	display: flex;
	align-items: center;
	gap: 0.5em;
}

.pe-field__number {
	box-sizing: border-box;
	width: 100%;
	height: 2em;
	padding: 0 0.6em;
	background: none;
	border: 1px solid var(--pe-border, rgba(128, 128, 128, 0.35));
	border-radius: 2px;
	color: inherit;
	font: inherit;
	font-size: 0.85em;
}
.pe-field__number:focus-visible { outline: 2px solid currentColor; outline-offset: 1px; }

.pe-field__unit {
	font-size: 0.8em;
	opacity: 0.65;
	white-space: nowrap;
}

.pe-field__range {
	box-sizing: border-box;
	width: 100%;
	height: 1.7em;
	margin: 0;
	padding: 0;
	background: none;
	accent-color: currentColor;
	cursor: pointer;
}
.pe-field__range:focus-visible { outline: 2px solid currentColor; outline-offset: 2px; }


/* =========================================================
 * Sticky linke Spalte
 * ---------------------------------------------------------
 * Auf schmalen Geräten abgeschaltet: dort stehen die Spalten
 * untereinander, und ein klebender Block würde den halben Bildschirm
 * dauerhaft belegen.
 * ======================================================= */
@media (min-width: 900px) {
	/* Ein klebender Block braucht eine Spalte, die HÖHER ist als er selbst
	   — er klebt innerhalb seines Elternelements, nicht innerhalb der
	   Seite. Steht am Bricks-Container `align-items: flex-start`, ist jede
	   Spalte exakt so hoch wie ihr Inhalt. Dann gibt es keinen Weg, an dem
	   etwas kleben könnte, und sticky sieht aus wie abgeschaltet, ohne
	   dass irgendwo ein Fehler stünde. Diese Zeile hebt das für die eine
	   betroffene Spalte auf. */
	:has(> [data-pe-sticky]) { align-self: stretch; }

	/* Doppelt geschriebenes Attribut, damit diese Regel gewinnt.
	 *
	 * In der Bricks-Anleitung stand als Vorgabe 1,5rem, und dieses
	 * Schnipsel steht als Seiten-CSS im Template. Bei gleicher
	 * Spezifität gewinnt das später geladene — also Bricks, und der
	 * Konfigurator klebte mit Abstand. Der doppelte Attributselektor
	 * hebt die Spezifität um eine Stufe und entscheidet die Sache
	 * eindeutig, ohne !important. Der Abstand bleibt über
	 * --pe-sticky-top einstellbar. */
	[data-pe-sticky][data-pe-sticky] {
		position: sticky;
		top: var(--pe-sticky-top, 0rem);
		/* KEIN z-index.
		   Er stand hier, damit das Anfrageformular beim Hochscrollen nicht
		   über das Werk läuft. Seit das Formular im Dialog liegt und gar
		   nicht mehr im Fluss steht, ist der Grund entfallen — und ein
		   z-index am klebenden Block hebt den Konfigurator über Elemente,
		   die über ihm liegen sollen, etwa das Kontaktfeld im Kopfbereich.
		   Falls doch einmal nötig: --pe-sticky-z setzen. */
		z-index: var(--pe-sticky-z, auto);
	}
}


/* =========================================================
 * Anfrage-Klappe
 * =======================================================
 * Bis 2.78.0 stand hier ein Modal (`.pe-modal`). Es haengte an
 * `document.body` und lag damit UNTER dem Konfigurator-Overlay, das als
 * modaler `<dialog>` in der obersten Ebene liegt — „'Anfragen' macht
 * scheinbar erstmal nichts". Das Formular klappt jetzt an Ort und Stelle
 * auf; begruendet in `pe-configurator.js` bei `openEnquiry`.
 *
 * Die Feldregeln darunter sind geblieben: sie galten ohnehin doppelt,
 * einmal fuer das Modal und einmal fuer das Formular an Ort und Stelle.
 * Uebrig ist die zweite Haelfte — dieselben Werte, ein Selektor weniger. */

/* Formulartext in voller Schriftfarbe.
   ---------------------------------------------------------
   Die Beschriftungen des Bricks-Formulars — vor allem der
   Datenschutzhinweis neben der Auswahlbox — kamen abgeschwächt daher und
   waren auf dunklem Grund kaum zu lesen. Bei einem Text, dem der Besucher
   ausdrücklich zustimmen soll, ist schlechte Lesbarkeit nicht nur ein
   Schönheitsfehler.

   Gilt im Dialog wie an Ort und Stelle, damit beide gleich aussehen. */
[data-pe-configurator] form {
	--pe-form-fg: currentColor;
}

/* Der EINGEGEBENE Text.
   ---------------------------------------------------------
   Die Farbe passt zum FELD, nicht zur Seite — sonst tippt man in ein
   Feld und sieht kaum, was man schreibt.

   Der Rückfall `#16161a` stammt aus der Zeit heller Felder. Seit dem
   22.08. sind sie dunkel, und `--pe-field-fg` wird in `.pe-anfrage`
   gesetzt. Der Rückfall bleibt stehen: er greift überall dort, wo ein
   Formular ohne diesen Block gerendert wird. */
[data-pe-configurator] form input:not([type="checkbox"]):not([type="radio"]),
[data-pe-configurator] form textarea,
[data-pe-configurator] form select {
	color: var(--pe-field-fg, #16161a);
	-webkit-text-fill-color: var(--pe-field-fg, #16161a);
	opacity: 1;
}

/* Der Platzhalter darf blasser sein — aber lesbar, nicht geraten. */
[data-pe-configurator] form input::placeholder,
[data-pe-configurator] form textarea::placeholder {
	color: var(--pe-field-placeholder, rgba(22, 22, 26, 0.55));
	-webkit-text-fill-color: var(--pe-field-placeholder, rgba(22, 22, 26, 0.55));
	opacity: 1;
}

[data-pe-configurator] form label,
[data-pe-configurator] form legend,
[data-pe-configurator] form .bricks-form__label {
	color: var(--pe-form-fg);
	opacity: 1;
}



.pe-view__hint {
	margin: 0;
	font-size: 0.78em;
	line-height: 1.5;
	opacity: 0.7;
	max-width: 62ch;
}


/* =========================================================
 * Lightbox — passt ein, beschneidet nicht
 * ---------------------------------------------------------
 * Die Höhe wird über die Breite begrenzt: --pe-outer-ratio kommt aus
 * dem JS und beschreibt das Außenverhältnis. Damit passt das Composite
 * in jeder Kombination vollständig ins Fenster.
 * ======================================================= */
.pe-lightbox {
	position: fixed;
	inset: 0;
	z-index: 9999;
	display: none;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: 1rem;
	padding: clamp(1rem, 4vw, 3rem);
	/* DECKEND, nicht 97 Prozent.
	 *
	 * Die drei Prozent Rest liessen im Overlay das Kreuz des Overlays
	 * durchscheinen — am 23.08. im Bild nachgesehen: zwei Kreuze oben
	 * rechts, eines echt, eines Schemen. Wer das schwaechere trifft,
	 * schliesst erst das Vollbild und muss ein zweites Mal klicken.
	 * Das ist die Haelfte von Simons „'x' muss dreimal geklickt werden". */
	background: #0a0a0c;
	color: #f2f2f2;
}
.pe-lightbox.is-open { display: flex; }

/* Im Vollbild rechnet fitStage() Breite UND Höhe der Bühne so, dass beides
   ins Fenster passt — dieselbe Rechnung, die hier vorher als 76vh im CSS
   stand, nur an einer Stelle statt an dreien und für beide Ansichten
   gleich. Deshalb steht hier nur noch die Zentrierung. */
.pe-lightbox .pe-view__frame {
	max-width: min(1600px, 100%);
	margin-inline: auto;
}

.pe-lightbox .pe-view__frame.is-room { display: block; }

.pe-lightbox .pe-view__thumbs  { justify-content: center; }
.pe-lightbox .pe-view__controls { justify-content: center; max-width: 40em; }
.pe-lightbox .pe-view__hint    { text-align: center; }

.pe-lightbox__close {
	position: absolute;
	top: 1rem;
	right: 1.25rem;
	appearance: none;
	background: none;
	border: 0;
	color: inherit;
	font-size: 2rem;
	line-height: 1;
	cursor: pointer;
}

body.pe-lightbox-open { overflow: hidden; }


/* =========================================================
 * Reduced motion — Vorschau
 * ======================================================= */
@media (prefers-reduced-motion: reduce) {
	.pe-frameset__frame--prev,
	.pe-frameset__inner,
	.pe-frameset__mount,
	.pe-frameset__paper,
	.pe-frameset__paper::after,
	.pe-frameset__art,
	.pe-view__frame,
	.pe-frameset,
	.pe-frameset__glass,
	.pe-view__room-fade,
	.pe-view__slot { transition: none; }
}

/* Ende der Datei. Es darf nur EINE Fassung des Vorschau-Blocks geben.
   Bis 2.3.0 lagen hier drei Generationen hintereinander; die älteste
   stand zuletzt und hat damit die neueste überschrieben. */

/* =====================================================================
 * Anfrageformular und Signature Works — ab 2.28.0
 * ---------------------------------------------------------------------
 * Bewusst zurückhaltend: das Formular soll sich in Philipps Layout
 * einfügen, nicht dagegen anarbeiten. Farben kommen deshalb, wo möglich,
 * aus `currentColor` und geerbten Werten statt aus festen Hexwerten.
 * ================================================================== */

/* Die Feldfarben gehoeren an die Wurzel, nicht an den Block.
 *
 * Das Anfrageformular wird beim Oeffnen in einen `<dialog>` am
 * `<body>` VERSCHOBEN. Damit verliert es jede Variable, die nur auf
 * `.pe-anfrage` steht — und eine undefinierte Variable ohne Rueckfall
 * macht die ganze Deklaration ungueltig. Am 22.08. im Klon gemessen:
 * `inAnfrage: false`, Schrift `rgb(22,22,26)`, Rand `0px none`. Simon sah
 * ein Formular mit vollstaendig unsichtbaren Feldern.
 *
 * Deshalb hier, wo sie das Verschieben ueberstehen. */
:root {
	--pe-field-fg: #f0f0f0;
	--pe-field-placeholder: rgba(240, 240, 240, .5);
	/* So hell wie der Rahmen des Overlays (`.pe-ov__dialog`). Mit .28
	   war er auf dunklem Grund kaum zu sehen, und das Formular stand ohne
	   erkennbare Fassung in der Seite. */
	--pe-anf-rand: rgba(255, 255, 255, .55);
	--pe-anf-flaeche: rgba(255, 255, 255, .04);
	/* Der Grund der Felder als eigener Wert — der Autofill braucht ihn
	   deckend, weil ein innerer Schatten keine Transparenz kennt. Gewaehlt
	   ist die Farbe, die `rgba(255,255,255,.07)` auf dem dunklen Grund der
	   Seite tatsaechlich ergibt: ein automatisch ausgefuelltes Feld soll
	   nicht anders aussehen als ein leeres daneben. */
	--pe-field-bg: #1f1f22;
}

/* Automatisch ausgefuellte Felder.
 *
 * Chrome malt darunter einen eigenen, HELLEN Grund und laesst sich das
 * per `background-color` nicht nehmen. Unsere Regel setzt gleichzeitig
 * eine helle Schrift — Ergebnis: hell auf hell, das Feld sieht leer aus,
 * obwohl etwas drinsteht. Simon am 24.08.2026 im Live-Test: *„Formular-
 * eingaben waren nicht sichtbar, weil Schrift hell auf hellem Hintergrund
 * war."*
 *
 * Der Grund laesst sich nur ueber einen inneren Schatten ueberschreiben;
 * das ist seit Jahren der uebliche Weg und funktioniert in allen
 * Chromium-Browsern und in Safari. Die Verzoegerung haelt ihn auch
 * waehrend der kurzen Einblendung, die Chrome beim Ausfuellen zeigt.
 *
 * Gilt fuer JEDES Feld im Konfigurator und im Anfrageformular — Simon:
 * *„suchen und für ALLE beheben."* */
.pe-anfrage input:-webkit-autofill,
.pe-anfrage textarea:-webkit-autofill,
.pe-anfrage select:-webkit-autofill,
[data-pe-configurator] input:-webkit-autofill,
[data-pe-configurator] textarea:-webkit-autofill,
[data-pe-configurator] select:-webkit-autofill,
.pe-werk input:-webkit-autofill,
.pe-werk textarea:-webkit-autofill,
.pe-werk select:-webkit-autofill {
	-webkit-text-fill-color: var(--pe-field-fg, #f0f0f0);
	caret-color: var(--pe-field-fg, #f0f0f0);
	-webkit-box-shadow: 0 0 0 100px var(--pe-field-bg, #2a2a2e) inset;
	box-shadow: 0 0 0 100px var(--pe-field-bg, #2a2a2e) inset;
	transition: background-color 100000s ease-in-out 0s;
}

.pe-anfrage {
	/* Zentriert, nicht linksbündig.
	 *
	 * Die Begrenzung auf 44rem bleibt — 860px breite Eingabefelder liest
	 * niemand gern. Aber `margin: 2rem 0` liess das Formular am linken
	 * Rand kleben: Simon am 22.08. in einem Container mit 20% Innenabstand
	 * nachgemessen, Container 864px, Formular 528px, rechts 336px uebrig.
	 * `auto` verteilt den Rest gleichmaessig. */
	margin: 2rem auto;
	max-width: 44rem;

	/* Ueber allem, was die Seite sonst noch klebt.
	 *
	 * Auf der Werkseite des Schattenjaegers liegt die Bricks-Ueberschrift
	 * als `position: sticky` mitten im Fluss — am 25.08.2026 gemessen:
	 * ein Band von 1080 x 146 px bei y = 124, quer ueber die ersten
	 * beiden Formularfelder. Sie ist positioniert, das Formular nicht;
	 * damit wird sie DARUEBER gezeichnet und faengt jeden Klick ab.
	 * Gemessen: Klick auf `pe_name` und `pe_email` -> `document.
	 * activeElement` bleibt BODY, nur die Textarea weiter unten nimmt den
	 * Fokus an. Simon: *„der Cursor in den Feldern kommt oft erst beim
	 * 4ten oder 5ten Klick ins Feld"* — beim vierten Klick war das Feld
	 * unter dem Band hervorgescrollt.
	 *
	 * Ein Formular ist Bedienung, kein Schmuck. Es gehoert ueber die
	 * Ueberschrift, nicht darunter — und weil die Ueberschrift `z-index:
	 * auto` traegt, genuegt dafuer die 2. */
	position: relative;
	z-index: 2;
}

.pe-anfrage__meldung {
	margin: 0 0 1.25rem;
	padding: .85em 1.1em;
	border-left: 3px solid currentColor;
	background: var(--pe-anf-flaeche);
	font-size: .95em;
}
.pe-anfrage__meldung--ok     { border-left-color: #2f6f3e; }
.pe-anfrage__meldung--fehler { border-left-color: #b32d2e; }

/* Ein feiner Rahmen um das ganze Formular.
 *
 * Simon: *„Gerne auch das ganze Anfrageformular in einen feinen Rahmen
 * wie das Overlay, damit das Layout etwas zusammenhaengender wird."*
 * Derselbe Rand und dieselbe leichte Aufhellung wie beim Overlay — so
 * liest sich das Formular als ein Block und nicht als Reihe loser
 * Zeilen. */
.pe-anfrage__form {
	padding: clamp(1.1rem, 3vw, 1.8rem);
	border: 1px solid var(--pe-anf-rand);
	border-radius: 3px;
	background: var(--pe-anf-flaeche);
}

.pe-anfrage__zeile {
	margin: 0 0 1rem;
	display: flex;
	flex-direction: column;
	gap: .35em;
}
.pe-anfrage__zeile label {
	font-size: .82em;
	letter-spacing: .04em;
	text-transform: uppercase;
	opacity: .7;
}
/* Eigene Farben statt `inherit`.
 *
 * `transparent` + `color: inherit` sah auf der Werkseite richtig aus
 * (helle Schrift) und im Konfigurator falsch: dort traf eine Themenregel
 * das `input` direkt und setzte `rgb(22,22,26)` — dunkle Schrift auf
 * dunklem Grund. Nachgemessen am 22.08.: Elternelement 240, Feld 22.
 *
 * Simon: *„Lieber recht dunkel (etwas heller als die sonstigen
 * Hintergründe, damit Kontrast entsteht) und helle Schrift."* Deshalb
 * eine eigene, leicht aufgehellte Flaeche statt Durchsichtigkeit — dann
 * ist das Feld auch dort zu sehen, wo der Grund schon dunkel ist.
 *
 * Die Selektoren sind zweistufig (`.pe-anfrage__form .pe-anfrage__zeile
 * input`), weil die einstufige Fassung gegen die Themenregel verlor. */
.pe-anfrage__zeile input,
.pe-anfrage__zeile textarea,
.pe-anfrage__form .pe-anfrage__zeile input,
.pe-anfrage__form .pe-anfrage__zeile textarea {
	width: 100%;
	padding: .7em .85em;
	border: 1px solid var(--pe-anf-rand);
	border-radius: 2px;
	background: rgba(255, 255, 255, .07);
	color: #f0f0f0;
	font: inherit;
	/* 16px verhindert, dass iOS beim Fokus hineinzoomt. Darunter zoomt
	   Safari immer, und der Besucher landet in einer verschobenen Seite. */
	font-size: max(1rem, 16px);
}
.pe-anfrage__zeile textarea { resize: vertical; }

.pe-anfrage__zeile input:focus-visible,
.pe-anfrage__zeile textarea:focus-visible,
.pe-anfrage__senden button:focus-visible {
	outline: 2px solid currentColor;
	outline-offset: 2px;
}

.pe-anfrage__zeile--haken {
	flex-direction: row;
	align-items: flex-start;
	gap: .6em;
	margin-top: 1.5rem;
}
.pe-anfrage__zeile--haken label {
	font-size: .9em;
	text-transform: none;
	letter-spacing: 0;
	opacity: .85;
	display: flex;
	gap: .6em;
	align-items: flex-start;
	line-height: 1.5;
}
/* Der Satz als EIN Flex-Element, das den Rest der Zeile fuellt und
 * gewoehnlich umbricht. `min-width: 0` ist noetig, weil ein Flex-Element
 * sonst nicht unter seine Inhaltsbreite schrumpft — genau daran lief der
 * Text am 23.08. rechts aus dem Kasten. */
.pe-anfrage__hakentext {
	flex: 1 1 auto;
	min-width: 0;
}
/* Die Auswahlbox ist kein Textfeld.
 *
 * Meine Feldregel (`width: 100%`) steht weiter oben und traf sie mit —
 * am 23.08. gemessen: die Box lief von 456 bis 984, also ueber die volle
 * Zeile, und der Text daneben rutschte weg. Simon sah eine „zentrierte"
 * Box mit ueberlaufendem Text. Diese Regel steht spaeter UND traegt drei
 * Klassen, damit sie gewinnt. */
.pe-anfrage .pe-anfrage__zeile--haken input,
.pe-anfrage__form .pe-anfrage__zeile--haken input,
.pe-anfrage__klappe .pe-anfrage__zeile--haken input {
	width: auto;
	min-width: 0;
	flex: 0 0 auto;
	margin-top: .2em;
	accent-color: currentColor;
}

.pe-anfrage__werk {
	margin: 1.5rem 0 0;
	padding: .8em 1em;
	background: var(--pe-anf-flaeche);
	font-size: .92em;
}

.pe-anfrage__senden { margin: 1.5rem 0 0; }
.pe-anfrage__senden button {
	padding: .85em 2em;
	border: 1px solid currentColor;
	border-radius: 2px;
	background: transparent;
	color: inherit;
	font: inherit;
	letter-spacing: .04em;
	cursor: pointer;
	transition: background .2s, color .2s;
}
.pe-anfrage__senden button:hover {
	/* Heller Grund, dunkle Schrift.
	 *
	 * Vorher: `background: currentColor; color: Canvas`. Auf dieser
	 * dunklen Seite ist `currentColor` hell UND `Canvas` weiss — heller
	 * Grund mit weisser Schrift, der Knopf war beim Ueberfahren nicht mehr
	 * zu lesen. Simon am 23.08. gemeldet. Jetzt ein fester dunkler Wert,
	 * derselbe wie die Overlayflaeche. */
	background: #f0f0f0;
	color: #0d0d0d;
	border-color: #f0f0f0;
}

.pe-anfrage__hinweis {
	margin: 1rem 0 0;
	font-size: .85em;
	opacity: .65;
	line-height: 1.6;
}

/* --- Signature Works ----------------------------------------------- */

/* EIN Rahmen um alles, was zum Werk gehoert.
 *
 * Angaben, Auslöser und — sobald aufgeklappt — das Formular. Simon am
 * 24.08.2026: *„ich meinte den Rahmen um alles zusammen, also auch die
 * Werksinfo oben, wenn Anfrage aufgeklappt ist, dann muss der Rahmen
 * natürlich entsprechend größer werden, dass er weiter alles umfasst."*
 *
 * Genau das tut er von selbst, weil die Klappe IM Block steht: der
 * Rahmen ist um den Block gelegt, nicht um seinen Inhalt. Das Formular
 * gibt seinen eigenen Rahmen dafuer ab — zwei ineinander sahen
 * unaufgeraeumt aus, und das war der Anlass. */
.pe-werk {
	padding: clamp(1.1rem, 3vw, 1.8rem);
	border: 1px solid var(--pe-anf-rand);
	border-radius: 3px;
	background: var(--pe-anf-flaeche);
}

/* Im Block kein zweiter Rahmen und keine zweite Flaeche. */
.pe-werk .pe-anfrage__form {
	padding: 0;
	border: 0;
	background: none;
}

.pe-werk__daten {
	margin: 0 0 2rem;
	display: grid;
	grid-template-columns: minmax(7rem, max-content) 1fr;
	gap: .7em 1.5em;
	font-size: .95em;
}
.pe-werk__daten dt {
	font-size: .82em;
	letter-spacing: .04em;
	text-transform: uppercase;
	opacity: .6;
	padding-top: .15em;
}
.pe-werk__daten dd { margin: 0; line-height: 1.55; }

.pe-werk__preis strong { font-size: 1.25em; }
.pe-werk__preis-zusatz {
	display: block;
	margin-top: .2em;
	font-size: .8em;
	opacity: .6;
}

.pe-werk__verf--knapp { color: #8a5a00; }
.pe-werk__verf--aus   { opacity: .6; }

@media (max-width: 40rem) {
	.pe-werk__daten { grid-template-columns: 1fr; gap: .2em; }
	.pe-werk__daten dd { margin-bottom: .9em; }
}

@media (prefers-reduced-motion: reduce) {
	.pe-anfrage__senden button { transition: none; }
}

/* =====================================================================
 * Auswahloberfläche — [pe_konfigurator], ab 2.31.0
 * ================================================================== */

.pe-aus {
	--pe-aus-rand: color-mix(in srgb, currentColor 16%, transparent);
	--pe-aus-flaeche: color-mix(in srgb, currentColor 5%, transparent);
	/* Zwei Spalten statt einer Saeule.
	 *
	 * `max-width: 46rem` liess den ganzen Konfigurator auf 552px stehen,
	 * bei 1440px Viewport also mit 859px Leerraum daneben — und die drei
	 * Ausfuehrungskarten quetschten sich auf je 178px, was die
	 * Beschreibungen zu schmalen Tuermen machte. Am 22.08. so gemessen.
	 *
	 * Links die Buehne, rechts die Bedienung. Die Spaltenbreite ist
	 * absichtlich nicht 50/50: das Bild traegt die Entscheidung, die
	 * Bedienung braucht Lesebreite, nicht mehr. */
	margin: 2rem 0;
	display: grid;
	grid-template-columns: minmax(0, 1.15fr) minmax(0, 1fr);
	gap: 2.5rem;
	align-items: start;
}

/* Die Buehne steht mittig in ihrer Spalte.
 *
 * Ein hochformatiges Raumfoto ist bei gedeckelter Hoehe schmaler als die
 * Spalte — bei 1440px gemessen: Werkansicht 687px breit, Raumansicht
 * 480px. Linksbuendig liest sich dieser Wechsel als Sprung zur Seite;
 * mittig als das, was er ist, naemlich eine Groessenaenderung. Die
 * Breite MUSS mitgehen, weil die Buehne genau das Seitenverhaeltnis des
 * Raumfotos traegt: sonst beschneidet `object-fit: cover` das Foto, und
 * die Werkplatzierung sitzt an den Bezugspunkten dieses Fotos. */
.pe-view,
.pe-raum__buehne { margin-inline: auto; }

/* --- links: Buehne, bleibt beim Scrollen stehen --- */

/* Zu hoch zum Kleben: dann gewoehnlich mitlaufen. Ein klebendes Element,
   das nicht ins Fenster passt, schnappt beim naechsten Umbruch an `top`
   und reisst das Werk zurueck ins Bild. Gesetzt wird die Klasse im
   Skript, weil CSS „passt hinein" nicht abfragen kann. */
.pe-aus__buehne.ist-zu-hoch { position: static; }

.pe-aus__buehne {
	position: sticky;
	/* Abstand nach oben, damit ein fixierter Seitenkopf nichts verdeckt. */
	top: 5rem;
	min-width: 0;
}

/* Keine Hoehendeckelung am Behaelter.
 *
 * In 2.67.0 stand hier `max-height: 60vh` auf `.pe-raum__buehne`. Das
 * klemmt den KASTEN, waehrend der Inhalt seine natuerliche Hoehe behaelt:
 * am 22.08. bei 1920x1200 gemessen, `.pe-view` 817px in einem 720px
 * hohen Elternteil — die 97px Ueberhang legten sich ueber Knoepfe,
 * Massangabe und Bildleiste. Simon sah genau das.
 *
 * Die Grenze gehoert in `fitStage()`, wo die Buehnenhoehe entsteht, und
 * nur dort, wo sie keinen Schaden anrichtet — siehe die Begruendung in
 * `pe-configurator.js`: eine Deckelung der Werkansicht zieht die Breite
 * mit, und dann steht ein Werk MIT Passepartout schmaler da als ohne. */
/* `dvh` mit `vh` als Rueckfall — an allen vier Stellen dieser Datei.
 *
 * Auf iOS ist `vh` die GROSSE Ansichtshoehe: die Hoehe, die das Fenster
 * haette, wenn die Adressleiste eingefahren waere. Sie ist eingefahren,
 * bis der Besucher scrollt — und beim ersten Aufruf einer Seite ist sie
 * ausgefahren. `60vh` sind dort also rund 60 Prozent von MEHR, als
 * tatsaechlich zu sehen ist, und der gedeckelte Kasten laeuft unten
 * unter die Leiste.
 *
 * `dvh` ist dieselbe Zahl auf der Hoehe, die gerade wirklich da ist.
 * Sie aendert sich, waehrend die Leiste ein- und ausfaehrt — genau das
 * ist gewollt, und es ist dieselbe Zahl, mit der `fitStage()` ohnehin
 * schon rechnet (`window.innerHeight` ist auf iOS die sichtbare Hoehe,
 * nicht die grosse).
 *
 * Die `vh`-Zeile bleibt DAVOR stehen. Ein Browser ohne `dvh` ueberliest
 * die zweite Zeile und behaelt die erste; einer mit `dvh` nimmt die
 * spaetere. Kein `@supports` noetig — die Kaskade tut es allein.
 * Gemessen am 27.08.2026 in WebKit: `CSS.supports('height','100dvh')`
 * ist wahr. */
.pe-aus__figur {
	max-height: 60vh;
	max-height: 60dvh;
}
.pe-aus__figur { display: flex; justify-content: center; }
.pe-aus__figur .pe-aus__bild {
	max-height: 60vh;
	max-height: 60dvh;
	width: auto;
	max-width: 100%;
	object-fit: contain;
}

/* Der Preis steht zweimal, und das war richtig, solange alles
   untereinander stand: `[data-pe-betrag]` gehoert der Auswahl,
   `[data-pe-total]` dem Preisblock der Raumvorschau — in einer Saeule lagen
   sie weit auseinander. Nebeneinander liest es sich als Fehler.
   Die linke Anzeige verschwindet, das Aussenmass darueber bleibt; beide
   werden weiterhin synchron beschrieben, damit die Vollbildansicht ihre
   eigene Zahl behaelt. */
@media (min-width: 60.01rem) {
	/* Drei Klassen, nicht zwei: das Skript verschiebt den Preis nach
	   `.pe-view__price`, und die dortige Regel steht weiter unten in der
	   Datei. Bei gleicher Spezifitaet gewinnt die spaetere — beim ersten
	   Versuch blieb der Preis deshalb stehen, obwohl die Regel geladen war. */
	.pe-aus__buehne .pe-view__price .pe-raum__preis { display: none; }

	/* Das Vollbild braucht keine Ausnahme: es ist eine `.pe-lightbox`, in
	   die das Skript die Ansicht **verschiebt** (`n.parentNode === lightbox`
	   in pe-configurator.js). Der Preis liegt dort nicht mehr unter
	   `.pe-aus__buehne`, die Regel greift also von selbst nicht mehr.
	   Erst mit `:fullscreen` versucht — falsch geraten, die Ansicht benutzt
	   die native Schnittstelle nicht. */
}

/* Der Werkblock einer Edition, zweispaltig — auf der Kunstdruckseite.
 *
 * Er traegt dort selbst die Klasse `.pe-aus` und bekommt damit ohne
 * eigene Regel dieselbe Spaltenteilung wie der Konfigurator: links
 * `.pe-aus__buehne` mit Werk und Vorschauleiste, rechts
 * `.pe-aus__steuerung` mit Bedienung, Angaben und Anfrage. Auch die
 * Mobilfassung unter 60rem kommt von dort.
 *
 * Bis 2.106.7 stand hier ein eigenes Raster mit Platzangaben je Kind.
 * Es hat zwei Dinge falsch gemacht: die Leiste lag als eigenes
 * Rasterelement ueber BEIDE Spalten, und die Hoehe ihrer Zeile richtete
 * sich nach der rechten Spalte — bei 1024 px war die Bedienung mit 529
 * px hoeher als die Buehne mit 504, und zwischen Werk und Leiste klaffte
 * eine Luecke. Simon am 26.08.2026: *„Thumbnailleiste beim Editionswerk
 * über die komplette Breite … Leerraum unter der Werksansicht."*
 *
 * Zwei Behaelter statt Platzangaben kennen dieses Problem nicht. Die
 * Reihenfolge im Quelltext stimmt damit auch einspaltig von selbst —
 * erst die Buehne, dann die Bedienung. */

/* Kein Kasten um den Block, wenn er an der Stelle des Konfigurators steht.
 *
 * `.pe-werk` bringt Rahmen, Radius, Flaeche und 21,6 px Polster mit —
 * richtig auf einer eigenen Werkseite, wo der Block allein steht und
 * sich als Einheit zeigen soll. Auf der Kunstdruckseite steht daneben
 * derselbe Konfigurator ohne all das, und beim Durchklicken der
 * Vorschauleiste sprang der Inhalt um 22 px hin und her. Gemessen am
 * 26.08.2026: gewoehnliches Werk Buehne bei x = 29, Edition bei x = 51. */
.pe-werk--spalten {
	padding: 0;
	border: 0;
	background: none;
}

/* --- Die gesperrte Bedienung ----------------------------------------
 *
 * Dieselben Bauteile an denselben Stellen wie im Konfigurator, nur ohne
 * Wahl. Sie sind nicht ausgeblendet, sondern sichtbar gesperrt: der
 * Kunde soll sehen, dass es diese Achsen gibt und dass sie hier
 * festliegen. Simon am 25.08.2026: *„alle Optionseinstellungen
 * ausgegraut."*
 *
 * `disabled` sitzt am `<fieldset>`, wirkt also auf alle Felder darin und
 * nimmt ihnen Fokus und Bedienbarkeit — nicht nur die Farbe. */
.pe-aus__gesperrt .pe-aus__karte,
.pe-aus__gesperrt .pe-aus__groesse {
	cursor: default;
	opacity: .48;
}
/* Die markierte Karte bleibt lesbar: sie ist die AUSSAGE dieser Spalte,
   nicht eine von drei Moeglichkeiten. Der Rest tritt zurueck. */
.pe-aus__gesperrt .pe-aus__karte.is-an,
.pe-aus__gesperrt .pe-aus__groesse.is-an {
	opacity: .92;
	border-color: currentColor;
}
.pe-aus__gesperrt .pe-aus__karte:hover { background: none; }
.pe-aus__gesperrt .pe-aus__karte.is-an { background: var(--pe-aus-flaeche); }

.pe-aus__gesperrt-satz {
	margin: .9rem 0 0;
	font-size: .84em;
	line-height: 1.5;
	opacity: .62;
}

/* --- rechts: Bedienung --- */
.pe-aus__steuerung {
	min-width: 0;
	/* Lesebreite. Ohne Begrenzung wandern die Beschreibungen bei sehr
	   breiten Schirmen ueber die Zeilenlaenge hinaus, die man noch gut
	   liest. */
	max-width: 44rem;
}

/* Unter 60rem gibt es keine zwei Spalten mehr — dann steht die Buehne
   oben und bleibt nicht kleben, sonst verdeckt sie die halbe Seite. */
@media (max-width: 60rem) {
	.pe-aus {
		grid-template-columns: minmax(0, 1fr);
		gap: 1.5rem;
	}
	.pe-aus__buehne { position: static; }
	.pe-aus__steuerung { max-width: none; }
}

.pe-aus__figur { margin: 0 0 1.5rem; }
.pe-aus__bild  { width: 100%; height: auto; display: block; }

.pe-aus__titel {
	margin: 0 0 1.5rem;
	font-size: 1.4em;
	font-weight: 400;
	letter-spacing: .02em;
}

.pe-aus__gruppe { border: 0; padding: 0; margin: 0 0 1.75rem; }
.pe-aus__gruppe legend {
	padding: 0;
	margin-bottom: .7em;
	font-size: .82em;
	letter-spacing: .06em;
	text-transform: uppercase;
	opacity: .6;
}

/* --- die drei Karten --- */
.pe-aus__karten {
	display: grid;
	/* 11rem waren zu wenig: bei drei Karten in einer 552px-Spalte blieben
	   178px je Karte, und „Maximale Tiefe, Ruhe und Schutz. Hahnemuehle
	   Fine Art, praezise gerahmt, …" wurde zu einem 384px hohen Turm.
	   Ab 15rem bricht der Satz in lesbare Zeilen. */
	grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr));
	gap: .8rem;
}
.pe-aus__karte {
	/* KEINE eigene Schriftgröße.
	 *
	 * Hier stand ein `clamp(.86rem … 1rem)` gegen Überläufe. Der Behälter
	 * gibt aber 20 px vor, und die absolute Angabe hat die Karte auf 12
	 * gedrückt — am 25.08.2026 gemessen, Simon: *„nein, jetzt viel zu
	 * klein."* Gegen Überlauf hilft `min-width: 0` an den Flex-Kindern,
	 * nicht das Verkleinern der Schrift; die eigentliche Ursache war der
	 * Umbruch des „i" und ein zweiwortiger Name, und beides ist behoben.
	 *
	 * Die Karte erbt also wieder. Damit steht der Name in einer Zeile,
	 * die Beschreibung darunter in zweien und die Auszeichnung in einer —
	 * so, wie es vorher war. */
	min-width: 0;
	display: flex;
	flex-direction: column;
	gap: .35em;
	padding: 1em 1.1em;
	border: 1px solid var(--pe-aus-rand);
	border-radius: 3px;
	cursor: pointer;
	transition: border-color .15s, background .15s;
}
/* Der Radiobutton bleibt bedienbar und für Screenreader da — er wird
   nur aus dem Sichtfeld geschoben, nicht mit display:none entfernt.
   Sonst wäre die Gruppe mit der Tastatur nicht mehr erreichbar. */
.pe-aus__karte input,
.pe-aus__groesse input {
	position: absolute;
	width: 1px; height: 1px;
	margin: -1px; padding: 0;
	overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%);
	white-space: nowrap;
}
.pe-aus__karte:hover { background: var(--pe-aus-flaeche); }
.pe-aus__karte.is-an { border-color: currentColor; background: var(--pe-aus-flaeche); }
.pe-aus__karte:focus-within { outline: 2px solid currentColor; outline-offset: 2px; }

/* Maßstab und Ausrichtung in EINER Zeile.
 *
 * Beschriftung, Feld, die beiden Knöpfe und das „i" nebeneinander; auf
 * schmalen Schirmen bricht die Zeile um, statt überzulaufen. Die
 * Anleitung steht hinter dem „i" — sichtbar nur, wenn jemand danach
 * fragt. Vorher lag sie mit elf Zeilen zwischen Thumbleiste und Preis. */
.pe-field--zeile .pe-field__row {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: .45rem;
}
.pe-field--zeile .pe-field__label {
	margin: 0;
	flex: 0 1 auto;
	min-width: 0;
}
.pe-field--zeile .pe-field__number { width: 4.6em; }

/* Die drei Ausrichtknöpfe als EIN Umbruchsblock.
   ---------------------------------------------------------
   Sie gehören zusammen, also brechen sie zusammen um: entweder stehen
   alle drei hinter dem Maß, oder alle drei in einer eigenen Zeile
   darunter — und dort linksbündig miteinander, nicht jeder für sich am
   Kastenrand.

   `flex-wrap` bleibt AN: wird der Schirm so schmal, dass auch die drei
   nicht nebeneinander passen, fällt „Zurücksetzen" nach unten. Das ist
   der einzige Umbruch, der dann noch übrig ist, und er sitzt bündig
   unter den beiden anderen. */
.pe-field__aktionen {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: .45rem;
	min-width: 0;
}

/* Am Telefon steht der Block IMMER in einer eigenen Zeile.
   ---------------------------------------------------------
   Ohne diese Zeile schrumpft er, statt umzubrechen: als Flexkind mit
   `min-width: 0` gibt er lieber nach und lässt seine eigenen Kinder
   umbrechen — am 01.09.2026 bei 414 und 390 px gemessen, „Raum
   ausrichten" blieb neben dem Zahlenfeld und nur „Werk ausrichten" fiel
   nach unten. Genau der Zustand, den Simon bemängelt hat.

   `flex: 1 1 100%` nimmt ihm die Wahl. Die Grenze ist dieselbe 700 px,
   an der auch der dritte Knopf der Ansichtszeile umschaltet — eine
   Telefongrenze im ganzen Konfigurator, nicht drei. */
@media (max-width: 700px) {
	.pe-field__aktionen { flex: 1 1 100%; }
}

/* Zurücksetzen als Zeichen statt als Wort.
 *
 * Spart in der Ausrichtungszeile rund 116 px und in jeder Reglerzeile
 * rund 90 — dort wandert der gewonnene Platz direkt in die Regler. Die
 * Fläche bleibt fingertauglich (2,2em ≈ 44 px bei 20px-Kontext). */
.pe-btn--symbol {
	/* Quadratisch, aber so hoch wie seine Nachbarn.
	 *
	 * Mit eigenen 2.2em stand der Zuruecksetzknopf am 30.08.2026 mit
	 * 40 px neben zwei Knoepfen zu 34 — in jedem Motor. Ein Quadrat
	 * bleibt er, es misst nur dasselbe wie der Rest der Zeile. */
	width: 1.85em;
	height: 1.85em;
	padding: 0;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex: 0 0 auto;
}
.pe-btn--symbol svg { width: 1.15em; height: 1.15em; display: block; }

/* `hidden` muss gewinnen.
 *
 * Das Attribut ist im Browserstylesheet nur `display: none` — jede
 * Autorenregel mit `display` schlaegt es. Die Zeile darueber setzt
 * `inline-flex`, und damit stand der verborgene Knopf der linken
 * Passepartoutzelle wieder im Fluss: am 25.08.2026 gemessen, linker
 * Regler 190 px gegen 235 rechts, also genau eine Knopfbreite samt
 * Abstand daneben. */
.pe-btn--symbol[hidden] { display: none; }
.pe-field--zeile .pe-btn { white-space: nowrap; }

/* Dasselbe Zeichen wie in den Karten, nur ohne deren Aufklapp-Logik. */
.pe-raum__info { margin-left: auto; }

/* `.ist-zu` gibt es nicht mehr — verborgen ist der Grundzustand.
   Sichtbar wird der Kasten nur ueber die beiden Klassen darunter. */

/* Beim Ueberfahren aufgehen — wie jedes andere „i" auf der Seite.
 *
 * Die Ausfuehrungskarten machen das rein in CSS
 * (`.pe-aus__info:hover ~ .pe-aus__karte-text`), weil der Kasten dort ein
 * Geschwister des Knopfes ist. Hier steht er eine Ebene hoeher, und ein
 * `:has()` am gemeinsamen Behaelter hat nicht gegriffen — am 25.08.2026
 * gemessen: `i.matches(':hover')` wahr, `box.matches(':has(…:hover)')`
 * wahr, und die Notiz trotzdem `display: none`.
 *
 * Statt weiter daran zu suchen setzt das Skript eine Klasse. Zwei
 * Zustaende, klar getrennt: `hidden` ist der geklickte, `.ist-zeiger`
 * der ueberfahrene. Am Finger gibt es kein Hover — dort bleibt der
 * Klick. */
/* Zwei Klassen statt `hidden`.
 *
 * Ueber `[hidden]` liess sich der Kasten in diesem Dokument nicht
 * aufmachen — am 25.08.2026 nachgemessen: der Selektor trifft, die Regel
 * ist geladen, ihre Spezifitaet ist hoeher, und selbst ein Inline-Stil
 * `display: block` blieb wirkungslos. Ein `!important` liess sich nicht
 * finden, eine frisch angelegte Probe mit `[hidden]` war dagegen
 * ueberschreibbar.
 *
 * Statt weiter zu suchen haengt die Sichtbarkeit jetzt an eigenen
 * Klassen: `.ist-offen` fuer den Klick, `.ist-zeiger` fuers Ueberfahren.
 * Das Attribut bleibt draussen; die Bedeutung fuer Vorleseprogramme
 * traegt `aria-expanded` am Knopf. */
.pe-group-box__note.ist-offen,
.pe-group-box__note.ist-zeiger {
	opacity: 1;
	visibility: visible;
	transition: opacity .15s, visibility 0s;
}
/* Geklickt heisst: er bleibt stehen und darf angefasst werden. */
.pe-group-box__note.ist-offen { pointer-events: auto; }

/* Das „i" bleibt neben dem Namen — immer.
 *
 * Hier stand `flex-wrap: wrap`. Sobald der Name breiter wurde als die
 * Karte, rutschte das Zeichen in eine eigene Zeile und die Karte wuchs um
 * gut zwei Zeilen. Am 25.08.2026 bei „Museum Edition" gesehen: 293 px
 * gegen 206 und 140 bei den Nachbarn — die Zeile stand ausgerichtet da
 * und sah doch schief aus.
 *
 * `nowrap` allein genügt nicht: ohne `min-width: 0` weigert sich ein
 * Flex-Element, unter seine Inhaltsbreite zu schrumpfen, und läuft
 * stattdessen aus der Karte. Der Name bricht jetzt in sich um, das „i"
 * behält seinen Platz. */
.pe-aus__karte-kopf { display: flex; align-items: baseline; gap: .5em; flex-wrap: nowrap; }
.pe-aus__karte-kopf strong {
	/* Kleiner werden, nicht brechen.
	 *
	 * `hyphens: auto` hat „Museum" zu „Muse-um" gemacht, „Galerie" zu
	 * „Gale-rie" und „Atelier" zu „Ate-lier", sobald die Karte schmal
	 * wurde. Simon am 25.08.2026: *„brechen die Konfigurationskarten …
	 * unschön mitten im Wort um … eher klein skaliert."*
	 *
	 * Also keine Trennung mehr, und stattdessen eine Groesse, die dem
	 * Behaelter folgt: `4.6cqi` ist die Breite der Kartenreihe, geteilt
	 * durch rund 22 — bei drei Karten also grob ein Fuenfzehntel der
	 * einzelnen Karte. Nach oben deckelt `1.05em`, damit auf breiten
	 * Schirmen genau die bisherige Groesse steht; nach unten `.72em`,
	 * damit die Zeile lesbar bleibt.
	 *
	 * `break-word` bleibt als letzte Rueckfallebene stehen — greifen
	 * soll es nicht, aber ein Wort, das aus der Karte laeuft, waere
	 * schlimmer als eines, das umbricht. */
	font-size: clamp(.72em, 4.6cqi, 1.05em);
	font-weight: 600;
	min-width: 0;
	hyphens: none;
	overflow-wrap: break-word;
}
.pe-aus__choice {
	font-style: normal;
	/* Die Groesse steht in der LETZTEN Regel zu dieser Klasse, weiter
	   unten — hier gesetzt wuerde sie dort ueberschrieben. */
	font-size: .68em;
	/* .08em brachen „Artist's Choice" in zwei Zeilen. Simon am
	   25.08.2026: *„Artists Choice darunter in einer."* */
	letter-spacing: .05em;
	text-transform: uppercase;
	opacity: .55;
	white-space: nowrap;
}
.pe-aus__karte-ui   { font-size: .82em; opacity: .55; }

/* „· angepasst" an der markierten Karte.
 *
 * Es steht direkt unter dem kurzen Zuruf und in derselben Groesse — es
 * qualifiziert den Namen darueber, es ist keine eigene Aussage. Kursiv
 * und mit dem Trennpunkt davor, damit es als Nachtrag zu lesen ist und
 * nicht als weitere Eigenschaft der Ausfuehrung.
 *
 * Sichtbar wird es nur an der markierten Karte, und nur dann, wenn
 * KEINE der drei Karten die Zusammenstellung beschreibt. Trifft eine
 * andere zu, wandert die Markierung dorthin — dann ist nichts
 * anzumerken. */
.pe-aus__angepasst {
	display: block;
	margin-top: .25em;
	font-size: .82em;
	font-style: italic;
	opacity: .72;
}
.pe-aus__angepasst::before { content: "· "; font-style: normal; }
/* `[hidden]` MUSS hier ausdruecklich gewinnen.
 *
 * Die globale Vorrangregel weiter oben gilt nur innerhalb `.pe-view` und
 * `.pe-lightbox`; die Karten stehen ausserhalb. `display: block` an der
 * Klasse schlaegt damit das `[hidden]` des UA-Stylesheets — und die
 * leere Marke stand als eigene Zeile in JEDER Karte, mit ihrem
 * Trennpunkt aus `::before` als einzigem Inhalt. Simon am 25.08.2026:
 * *„alle jetzt einen unnötigen Punkt, der vorher nicht da war."*
 *
 * Aus derselben Wurzel wie Falle 4 im CLAUDE.md, nur eine Ebene weiter:
 * dort gewann ein `display` im Stylesheet gegen `[hidden]`, hier gewinnt
 * meine eigene Regel gegen dasselbe Attribut. */
.pe-aus__angepasst[hidden] { display: none !important; }
.pe-aus__karte-text { font-size: .84em; line-height: 1.5; opacity: .8; }

/* --- Größen --- */
/* Alle Formate in EINER Zeile — Simon am 25.08.2026.
 *
 * `flex-wrap` mit Eigenbreiten liess die vierte Kachel umbrechen: die
 * Steuerspalte ist 388 px breit, und vier Kacheln in Textbreite brauchen
 * mehr. Ein Raster mit gleichen Spalten teilt den Platz stattdessen auf,
 * und alle vier sind gleich breit — was sie inhaltlich auch sind.
 *
 * `auto-fit` mit `minmax` statt fester Spaltenzahl: auf dem Telefon
 * (Spalte 234 px) passen zwei nebeneinander, und die Reihe bricht von
 * selbst auf zwei Zeilen um, statt waagerecht ueberzulaufen. Vier
 * Kacheln zu je 58 px waeren keine Zeile mehr, sondern ein Streifen. */
.pe-aus__groessen {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(6.5rem, 1fr));
	gap: .5rem;
}
.pe-aus__groesse {
	display: flex;
	align-items: center;
	justify-content: center;
	padding: .6em .5em;
	border: 1px solid var(--pe-aus-rand);
	border-radius: 3px;
	cursor: pointer;
	text-align: center;
	font-variant-numeric: tabular-nums;
	white-space: nowrap;
	transition: border-color .15s, background .15s;
}
.pe-aus__groesse:hover { background: var(--pe-aus-flaeche); }
.pe-aus__groesse.is-an { border-color: currentColor; background: var(--pe-aus-flaeche); }
.pe-aus__groesse:focus-within { outline: 2px solid currentColor; outline-offset: 2px; }

/* --- Preis ---
 *
 * Steht seit 2.78.0 unter dem Werk, nicht in der Optionsspalte. Damit
 * faellt der obere Trennstrich weg: er trennte dort Optionsgruppen
 * voneinander, hier haette er nichts zu trennen. Rechtsbuendig, weil die
 * Zahl mit der rechten Kante des Werks abschliessen soll. */
/* Aussenmass links, Preis rechts — eine Zeile, ab 2.79.0.
 *
 * `align-items: end` haelt beide auf derselben Grundlinie, obwohl der
 * Preis deutlich groesser gesetzt ist. `flex-wrap` faengt schmale
 * Geraete: dort steht der Preis wieder darunter, aber ohne die
 * Massangabe als Luecke dazwischen. */
.pe-raum__zeile {
	display: flex;
	flex-wrap: wrap;
	/* Auf der GRUNDLINIE, nicht auf der Unterkante.
	 *
	 * Der Betrag ist gut dreimal so gross gesetzt wie die Massangabe. An
	 * der Unterkante ausgerichtet stand die Zahl deutlich hoeher als der
	 * Text daneben und wirkte wie eine eigene Zeile darueber. Auf einer
	 * gemeinsamen Grundlinie lesen sich beide als das, was sie sind:
	 * links, was man bekommt, rechts, was es kostet. */
	align-items: baseline;
	justify-content: space-between;
	gap: .4rem 1.5rem;
}
.pe-raum__zeile > .pe-raum__mass { margin: 0; }
/* Innerhalb der Zeile traegt die Zeile die Einrueckung, nicht der Preis —
 * sonst stuende er um `--pe-view-pad` weiter innen als die Massangabe. */
.pe-raum__zeile > .pe-aus__preis { margin: 0; padding: 0; flex: 0 0 auto; }
.pe-raum__zeile { padding: 0 var(--pe-view-pad, 1.5rem); }

/* Der Hinweis fuellt die Breite unter der Zeile. */
.pe-raum__zeile + .pe-aus__platzhalter {
	margin: .8rem var(--pe-view-pad, 1.5rem) 0;
}

.pe-aus__preis {
	/* Buendig mit dem WERK, nicht mit der Spalte.
	 *
	 * `.pe-view` traegt innen `--pe-view-pad`; das Werk beginnt also
	 * eingerueckt. Ohne dieselbe Einrueckung stand der Preis am
	 * Telefon 15 Pixel weiter rechts als die Kante des Werks — auf
	 * 390 Pixel Breite faellt das sofort auf. */
	padding: 0 var(--pe-view-pad, 1.5rem);
	margin: .9rem 0 0;
	display: flex;
	flex-direction: column;
	align-items: flex-end;
	gap: .2em;
	text-align: right;
}
.pe-aus__betrag { font-size: 1.7em; font-variant-numeric: tabular-nums; }
.pe-aus__zusatz { font-size: .82em; opacity: .55; }

/* --- „Preis auf Anfrage" ---
 *
 * Ein Satz, kein Betrag — und deshalb NICHT in Ziffernbreite und nicht
 * in Zahlengroesse gesetzt. Bei 1,7em ueberlief „Preis auf Anfrage" auf
 * schmalen Schirmen in zwei Zeilen und schob die Massangabe daneben aus
 * der gemeinsamen Grundlinie; auf Italienisch („Prezzo su richiesta")
 * ist die Zeichenfolge noch laenger.
 *
 * Kursiv statt fett, weil es eine Aussage ist und keine Zahl. Bei einem
 * Werk dieser Preisklasse ist das eine normale, sogar hochwertige
 * Aussage — sie soll nicht wie eine Fehlermeldung aussehen. */
.pe-aus__preis.is-anfrage .pe-aus__betrag {
	font-size: 1.15em;
	font-style: italic;
	font-variant-numeric: normal;
	white-space: nowrap;
}

/* --- Wunschformat: die Kachel ---
 *
 * Sie steht in derselben Reihe wie die festen Groessen und sieht
 * bewusst gleich aus. Ein hervorgehobener vierter Knopf haette das
 * freie Format zum Hauptangebot gemacht; es ist der Sonderweg, nicht
 * der Regelfall. Unterscheidbar ist es am Wort und am gestrichelten
 * Rand — genug, um es zu finden, zu wenig, um es zu bewerben. */
.pe-aus__groesse--frei { border-style: dashed; }
.pe-aus__groesse--frei.is-an { border-style: solid; }

/* --- Wunschformat: die beiden Maszfelder ---
 *
 * `flex-wrap`, weil zwei Zahlenfelder, ein Mal-Zeichen und die Einheit
 * auf 390 Pixel Breite nicht nebeneinander passen. Der erklaerende Satz
 * bekommt `flex-basis: 100%` und steht damit immer in einer eigenen
 * Zeile darunter — dieselbe Ueberlegung wie beim Platzhalterhinweis,
 * der neben der Massangabe die Reihe gesprengt hat. */
/* --- Die Klappe ---
 *
 * Simon am 25.08.2026: *„Die Box zum eintragen soll ausgeblendet sein,
 * und erst mit Klick auf das Wunschformat animiert auf / zuklappen."*
 *
 * Animiert wird `grid-template-rows` von `0fr` auf `1fr`, nicht die
 * Hoehe. Auf `auto` laesst sich keine Hoehe animieren, und eine feste
 * Zahl waere geraten: der Erklaersatz ist auf Italienisch laenger als auf
 * Deutsch, und auf dem Telefon bricht er in mehr Zeilen um. Das Raster
 * rechnet die Hoehe selbst aus und interpoliert sie trotzdem.
 *
 * `visibility` faehrt mit — beim Oeffnen sofort, beim Schliessen erst
 * nach der Bewegung. Damit sind die beiden Zahlenfelder im geschlossenen
 * Zustand nicht mit dem Tabulator erreichbar; `overflow: hidden` allein
 * wuerde sie nur verstecken, nicht aus der Reihenfolge nehmen — und ein
 * Fokus, der in eine unsichtbare Box springt, ist genau die Sorte
 * Fehler, die niemand meldet (Falle 18, eine Ebene weiter).
 *
 * Der Aussenabstand gehoert ans KIND, nicht an die Klappe: eine Marge an
 * der Klappe bliebe auch bei `0fr` stehen, und unter der Formatreihe
 * saesse dauerhaft ein leerer Streifen. */
.pe-aus__frei-klappe {
	display: grid;
	grid-template-rows: 0fr;
	visibility: hidden;
	transition: grid-template-rows .28s ease, visibility 0s linear .28s;
}
.pe-aus__frei-klappe.is-offen {
	grid-template-rows: 1fr;
	visibility: visible;
	transition: grid-template-rows .28s ease, visibility 0s;
}
.pe-aus__frei-innen { overflow: hidden; min-height: 0; }

/* Beim Seitenaufbau NICHT animieren.
   Wer mit `?pe_gr=-1` ankommt, soll die Klappe offen vorfinden, nicht
   aufgehen sehen. Das Skript setzt diese Klasse fuer einen Bildaufbau. */
.pe-aus__frei-klappe.pe-keine-anim,
.pe-aus__frei-klappe.pe-keine-anim > * { transition: none !important; }

.pe-aus__frei {
	display: flex;
	flex-wrap: wrap;
	/* An der OBERKANTE ausrichten, nicht an der unteren.
	 *
	 * Mit `flex-end` standen „Lange Kante (cm)" und „Ergibt"
	 * auf verschiedener Hoehe: das Eingabefeld ist hoeher als die
	 * Ergebniszeile, also rutschte deren Beschriftung nach unten und
	 * schwebte zwischen den beiden Zeilen der anderen. Oben
	 * ausgerichtet fluchten die Beschriftungen, und die beiden Werte
	 * darunter tun es auch — dafuer sorgt die Mindesthoehe an der
	 * Ergebniszahl. */
	align-items: flex-start;
	gap: .5rem .7rem;
	margin-top: .9rem;
	padding: .9rem 1rem;
	background: var(--pe-aus-flaeche);
	border-left: 2px solid currentColor;
}
.pe-aus__frei-feld {
	display: flex;
	flex-direction: column;
	gap: .25em;
	font-size: .85em;
}
.pe-aus__frei-feld input {
	width: 6.5em;
	padding: .45em .6em;
	font: inherit;
	font-size: 1.05rem;
	font-variant-numeric: tabular-nums;
	border: 1px solid var(--pe-aus-rand);
	border-radius: 3px;
	background: transparent;
	color: inherit;
}
/* Das Ergebnis steht NEBEN dem Feld, nicht darunter.
 *
 * „Lange Kante 120" und „ergibt 120 × 72 cm" gehoeren zusammen gelesen —
 * Ursache und Wirkung in einer Zeile. Darunter waere es eine zweite
 * Angabe, und der Blick muesste springen. `align-items: flex-end` am
 * Kasten haelt beide auf der Grundlinie des Eingabefelds. */
.pe-aus__frei-ergebnis {
	margin: 0 0 .35em;
	display: flex;
	flex-direction: column;
	gap: .25em;
	font-size: .85em;
}
.pe-aus__frei-ergebnis-kopf { opacity: .62; }
.pe-aus__frei-ergebnis strong {
	display: flex;
	align-items: center;
	/* Genau die Hoehe des Eingabefelds daneben: Polsterung 2 x .45em
	   plus Zeile plus Rahmen. Damit steht die Zahl auf derselben Hoehe
	   wie die eingetippte — Ursache und Wirkung in einer Linie. */
	min-height: calc(1.05rem * 1.4 + .9em + 2px);
	font-size: 1.15rem;
	font-weight: 400;
	font-variant-numeric: tabular-nums;
	white-space: nowrap;
}
.pe-aus__frei-satz {
	flex: 1 0 100%;
	margin: .2rem 0 0;
	font-size: .8em;
	opacity: .72;
}

/* Wenn wirklich nichts darstellbar ist, steht hier ein Satz — nie eine
 * leere Flaeche. Siehe `pe_auswahl_render()`. */
.pe-aus__leer { padding: 1.5rem; opacity: .7; }

@media (prefers-reduced-motion: reduce) {
	.pe-aus__frei-klappe { transition: none; }
}
.pe-aus__platzhalter {
	margin-top: .4em;
	font-size: .8em;
	padding: .5em .8em;
	background: var(--pe-aus-flaeche);
	border-left: 2px solid currentColor;
	opacity: .75;
}
.pe-aus__platzhalter[hidden] { display: none; }

.pe-aus__spaeter { font-size: .82em; opacity: .5; margin: 0 0 1.5rem; }

/* Das GET-Formular um die Auswahl herum, ab 2.35.0. Es traegt kein
 * eigenes Layout — .pe-aus ist ein Blockfluss, kein Flex- oder
 * Rasterbehaelter, also aendert die zusaetzliche Ebene nichts an der
 * Anordnung. Die Randangabe steht trotzdem da, damit ein spaeterer
 * Umbau von .pe-aus auf Flex nicht ueber einen Standardrand des
 * Browsers stolpert. */
.pe-aus__wahl { margin: 0; padding: 0; border: 0; }

/* Nur ohne JavaScript sichtbar — mit Skript existiert der Knopf nicht,
 * weil <noscript> dann gar nicht geparst wird. */
.pe-aus__uebernehmen { margin: 0 0 1.5rem; }
.pe-aus__uebernehmen button {
	font: inherit;
	padding: .6em 1.4em;
	border: 1px solid currentColor;
	border-radius: 2px;
	background: transparent;
	color: inherit;
	cursor: pointer;
}
.pe-aus__uebernehmen button:hover { background: var(--pe-aus-flaeche); }
.pe-aus__uebernehmen button:focus-visible {
	outline: 2px solid currentColor;
	outline-offset: 2px;
}

/* Bearbeiterhinweis, ab 2.35.0. Bewusst auffaellig — er zeigt an, dass
 * eine Preisangabe nicht aufgeht, und soll nicht uebersehen werden. */
.pe-aus__luecken {
	font-size: .84em;
	line-height: 1.5;
	margin: 0 0 1.5rem;
	padding: .8em 1em;
	border-left: 3px solid currentColor;
	background: var(--pe-aus-flaeche);
}
.pe-aus__luecken ul { margin: .4em 0 0; padding-left: 1.2em; }

@media (prefers-reduced-motion: reduce) {
	.pe-aus__karte, .pe-aus__groesse { transition: none; }
}

/* =====================================================================
 * Portfolio-Knopf und Overlay — ab 2.36.0
 * ================================================================== */

/* `display: contents` ist hier die ganze Idee.
 *
 * Der Rahmen umschliesst ein Bild, das bei Bricks oft direkt in einem
 * Flex- oder Rasterbehaelter liegt. Ein zusaetzliches Element mit
 * eigener Darstellung waere dort ein zusaetzliches Kind und wuerde die
 * Anordnung verschieben — genau die Falle, die das Projekt bei einem
 * versteckten Bild schon einmal Zeit gekostet hat.
 *
 * Mit `contents` verschwindet der Rahmen aus dem Layout: das Bild bleibt
 * das Kind, das es vorher war. */
/* Kein Rahmen um das Bild — der Knopf ist ein Geschwister.
 *
 * Zwei Versuche vorher, beide im Klon nachgemessen und beide verworfen:
 *
 * `display: contents` am Rahmen laesst das Layout unberuehrt, gibt dem
 * absolut gesetzten Knopf aber keinen Bezugspunkt. Bild bei y = 2226,
 * Knopf bei y = 73555 — **70 868 px daneben**, ganz unten auf der Seite.
 *
 * Ein echter Rahmen mit `position: relative` loest das, bricht aber die
 * Bildregeln von Bricks: die zielen auf `Behaelter > Bild`, und mit
 * etwas dazwischen greift keine mehr. Gemessen: 756 x 461 wurde zu
 * 300 x 183, und das Bild rutschte von x = 0 auf x = 228.
 *
 * Der Knopf steht deshalb NEBEN dem Bild, nicht darum. Absolut gesetzt
 * ist er ausserhalb des Flusses und wird auch in einem Flex- oder
 * Rasterbehaelter kein zusaetzliches Element.
 *
 * Den Bezugspunkt liefert der Behaelter. Ist er von Bricks aus schon
 * positioniert — `#brxe-xxxxxx { position: sticky }` etwa —, dann ist
 * er ohnehin einer, und unsere Regel verliert zu Recht gegen die
 * ID-Regel (Falle 6). Ist er es nicht, greift sie. Beide Wege enden
 * beim selben Ergebnis, und in keinem wird fremdes Layout
 * ueberschrieben. */
:has(> .pe-ov__knopf) { position: relative; }

/* Warum die Platzierung am Ende doch das Skript macht
 *
 * Vier Wege wurden im Klon durchgemessen, ueber 91 echte
 * Portfoliobilder:
 *
 *   Rahmen mit `display: contents` — Layout unberuehrt, aber kein
 *   Bezugspunkt: Bild bei y = 2226, Knopf bei y = 73555.
 *
 *   Rahmen mit `position: relative` — Bezugspunkt da, aber das Bild ist
 *   bei Bricks ein Flex-Element. Mit etwas dazwischen verliert es diese
 *   Rolle: aus 756 x 461 wurde 300 x 183.
 *
 *   Knopf als Geschwister, Bezugspunkt am Behaelter — 13 von 89 sassen
 *   genau, Median 6 px. Aber 29 rutschten ueber 500 px ab, weil Bricks
 *   fuer diese Behaelter `#brxe-xxxxxx { position: static }` setzt. Eine
 *   ID-Regel ist mit Klassenselektoren nicht zu schlagen, und
 *   `!important` haette das Klebeverhalten ueberschrieben, das dort
 *   absichtlich steht.
 *
 *   Ankerpositionierung — im Browser vorhanden, aber nur 14 von 91
 *   Ankern loesten sich auf.
 *
 * Also platziert das Skript. Das kostet hier nichts: **das Portfolio
 * zeigt ohne JavaScript ohnehin kein einziges Bild**, weil Bricks'
 * Lazyload jedes `src` durch ein leeres SVG ersetzt. Ein Knopf ohne
 * Skript haette dort nichts, woran er haengen koennte.
 *
 * Der Knopf ist deshalb bis zur Platzierung nicht da — `display: none`,
 * nicht nur unsichtbar. Ein Knopf, der kurz an der falschen Stelle
 * aufblitzt, ist schlimmer als einer, der eine Zehntelsekunde spaeter
 * am richtigen Platz erscheint. */

/* Der Knopf richtet sich am Bild aus. Weil der Rahmen kein Layout
 * hergibt, ist der Bezugspunkt der naechste positionierte Vorfahr —
 * bei Bricks in aller Regel der Block um das Bild. Das genuegt: der
 * Knopf sitzt unten links im Bildbereich. */
.pe-ov__knopf {
	/* Bis das Skript den Platz kennt, gibt es den Knopf nicht. */
	display: none;
}

.pe-ov__knopf.is-platziert {
	position: absolute;
	/* Ueber den Bildern, nicht darunter.
	 *
	 * Auf der Infoseite tragen die Award-Bilder `z-index: 3` aus dem
	 * Builder; mit 2 lag der Knopf dahinter. Sichtbar war er nicht,
	 * anklickbar schon — Simon am 24.08.2026: *„bei hover kommt die
	 * klick-Maus, also er wird erkannt … Der Button scheint also einfach
	 * hinter dem GSAP animierten Werk zu liegen."*
	 *
	 * 5 statt 3, damit auch ein spaeter erhoehter Bildwert nicht wieder
	 * gewinnt. Der Wert bleibt oertlich: der umgebende Block ist durch
	 * seinen Transform ohnehin ein eigener Stapelkontext. */
	z-index: 5;
	max-width: 100%;
	display: flex;
	align-items: center;
	gap: .5em;
	padding: .85em 1.2em;

	/* Absichtlich in px, nicht in rem.
	 *
	 * Das Theme setzt die Wurzelschriftgroesse auf 12,5 px. Aus
	 * `clamp(.78rem, …)` wurden dadurch 9,78 px — im Klon nachgemessen,
	 * und das ist zu klein zum Lesen. Fuer einen Knopf, der auf einem
	 * Foto liegt und den einzigen Weg in den Konfigurator darstellt,
	 * darf die Groesse nicht davon abhaengen, was ein Theme spaeter am
	 * Wurzelwert dreht. */
	/* Einstellbar seit 2.145.0 — `--pe-ov-knopf-size` kommt aus dem
	   Reiter *Freigabe*. Ohne Einstellung bleibt die gleitende Vorgabe. */
	font-size: var(--pe-ov-knopf-size, clamp(13px, 12px + .25vw, 15px));
	line-height: 1.3;
	text-decoration: none;
	color: #fff;

	/* Sanft transparent mit Weichzeichner — wie KONTAKT und MENÜ.
	 *
	 * Der Knopf lag bis 2.81.0 mit 82 Prozent Deckung auf dem Foto und
	 * wirkte wie ein aufgeklebtes Schild. Die Knoepfe des Themes sind am
	 * 23.08. nachgemessen: `rgba(15, 15, 15, .35)` mit `blur(3px)`.
	 * Simon: *„'Werk in ihrem Raum erleben' Buttons sollen ALLE einen
	 * sanft transparenten Hintergrund haben, am liebsten mit sauberem
	 * blur (wie KONTAKT und MENÜ buttons)."* Dieselben Werte, nicht
	 * aehnliche — sonst faellt der Unterschied irgendwann jemandem auf,
	 * ohne dass er ihn benennen koennte.
	 *
	 * Der Textschatten kommt dazu, weil dieser Knopf auf einem FOTO
	 * liegt und nicht auf dem Seitenhintergrund: bei 35 Prozent Deckung
	 * traegt der Grund die Lesbarkeit nicht mehr allein. Er ist weich und
	 * dunkel, also auf hellen wie dunklen Motiven unauffaellig. */
	/* Noch durchscheinender als die Theme-Knoepfe: dieser hier liegt auf
	   einem Foto, das ihn traegt, nicht auf einer ruhigen Flaeche. Der
	   staerkere Weichzeichner haelt dabei die Lesbarkeit. */
	background: rgba(15, 15, 15, .20);
	backdrop-filter: blur(5px);
	-webkit-backdrop-filter: blur(5px);
	text-shadow: 0 1px 3px rgba(0, 0, 0, .55);
	border: 0;
	border-radius: 0 3px 0 0;

	/* Die Naht unter dem Knopf.
	 *
	 * Die Platzierung rechnet mit Bruchteilen und trifft die Bildkante
	 * genau — ausser bei Bildern, die GSAP gerade bewegt. Dort gilt
	 * bewusst der ganzzahlige Layoutwert (siehe pe-portfolio.php), und
	 * der kann bis zu einem halben Pixel danebenliegen. Gemessen: 19 von
	 * 82 Knoepfen, groesste Abweichung 0,47 px.
	 *
	 * Ein halber Pixel ist rechnerisch nichts und optisch ein heller
	 * Strich zwischen Knopf und Bildkante. Der Schatten fuellt ihn in
	 * derselben Farbe. Liegt der Knopf genau, ragt der Schatten einen
	 * Pixel unter das Foto — auf dunklem Grund unsichtbar, und deutlich
	 * harmloser als der Strich. */
	box-shadow: 0 1px 0 0 rgba(15, 15, 15, .20);

	/* Ruhezustand: nicht sichtbar, aber bedienbar.
	 *
	 * `visibility` statt `display`, damit der Knopf mit der Tastatur
	 * erreichbar bleibt und ein Screenreader ihn ankuendigt. Ein Knopf,
	 * den nur die Maus findet, ist auf einem Touchgeraet gar keiner. */
	opacity: 0;
	visibility: hidden;

	/* Kein `transform` im Ruhezustand: das Skript benutzt ihn, um den
	 * Knopf von der Bildunterkante nach oben zu schieben. Zwei Quellen
	 * fuer dieselbe Eigenschaft heben einander auf. */
	transition: opacity .22s ease, visibility .22s;
}

.pe-ov__knopf:hover,
.pe-ov__knopf:focus-visible {
	color: #fff;
	/* Beim Ueberfahren etwas fester, damit die Reaktion spuerbar ist —
	   aber weiterhin durchscheinend, sonst waere der Ruhezustand nur eine
	   blassere Fassung desselben Schildes. */
	background: rgba(15, 15, 15, .42);
}

.pe-ov__knopf:focus-visible {
	outline: 2px solid #fff;
	outline-offset: -4px;
}

/* Sichtbar, sobald der Zeiger oder der Fokus im Bildbereich ist. `:has`
 * traegt seit 2023 in allen laufenden Browsern; wo es fehlt, greift die
 * Touch-Regel weiter unten und der Knopf steht dauerhaft. */
/* `ist-nah` setzt das Skript, wenn der Zeiger ueber DIESEM Bild steht.
   Die frueher hier stehende `:has(…):hover`-Regel zeigte alle Knoepfe
   eines Elternelements zugleich — bei Bloecken mit mehreren Bildern also
   mehrere. Begruendung in `inc/pe-portfolio.php`. */
.pe-ov__knopf.is-platziert.ist-nah,
.pe-ov__knopf.is-platziert:focus-visible {
	opacity: 1;
	visibility: visible;
}

/* Ohne Zeigegeraet gibt es kein Hover. Dort steht der Knopf dauerhaft —
 * sonst ist er auf jedem Telefon unerreichbar. */
@media (hover: none) {
	.pe-ov__knopf.is-platziert {
		opacity: 1;
		visibility: visible;
	}
}

/* Auf schmalen Schirmen deutlich kleiner.
 *
 * Dort steht der Knopf DAUERHAFT — die Regel `(hover: none)` darueber
 * ist ohne Alternative, sonst waere er auf einem Telefon unerreichbar.
 * Damit liegt er aber auch dauerhaft auf dem Foto, und in der Groesse
 * fuer den Schreibtisch nimmt er einen Streifen des Bildes ein.
 *
 * Simon am 29.08.2026 nach dem mobilen Durchgang: *„Die Permanentanzeige
 * des ‚…im Raum erleben…' Buttons ist zu gross > mobil deutlich kleiner
 * ziehen!"*
 *
 * Kleiner heisst hier: Schrift, Innenabstand und Abstand zwischen Text
 * und Zeichen. Nur die Schrift zu verkleinern haette die Pille fast so
 * breit gelassen, wie sie war.
 *
 * Eine im Backend gesetzte Groesse gewinnt auch hier — sie steht in
 * derselben Variablen und ist eine ausdrueckliche Ansage. Wer sie leer
 * laesst, bekommt auf dem Telefon die kleinere Vorgabe. */
@media (max-width: 767px) {
	.pe-ov__knopf.is-platziert {
		font-size: var(--pe-ov-knopf-size, clamp(10px, 8.5px + .45vw, 12px));
		/* Enger als am Schreibtisch. Die Schrift allein kleiner zu machen
		 * liess die Pille fast so breit wie vorher — Simon am 30.08.:
		 * *„Rahmenpadding darf noch etwas kleiner werden."* */
		padding: .4em .6em;
		gap: .3em;
	}
}

/* Der Knopf atmet — nur dort, wo er dauerhaft steht.
 * ---------------------------------------------------------------------
 * Auf einem Geraet ohne Zeiger gibt es kein Hover, also steht der Knopf
 * standig auf dem Foto. Er ist damit der einzige Weg in den
 * Konfigurator — und zugleich das einzige, was dauerhaft das Werk
 * verdeckt. Beides gleichzeitig geht nur ueber die Zeit.
 *
 * Simon am 30.08.2026: *„Ich moechte den Button sanft animiert
 * pulsieren lassen, Zyklus 2 Sekunden, Opacity 20-90% … damit der
 * Nutzer das Bild sieht."*
 *
 * Hell beginnen, in der Mitte des Zyklus fast verschwinden: wer die
 * Seite oeffnet, sieht zuerst den Knopf und danach das Werk. Umgekehrt
 * herum waere der erste Eindruck ein halb sichtbarer Knopf.
 *
 * `opacity` auf dem ganzen Knopf, nicht auf dem Hintergrund. Der
 * Hintergrund hat seine eigene Deckung (`rgba(15,15,15,.35)` mit
 * `blur`); die bleibt unangetastet und wird von dieser hier
 * multipliziert. Genau das ist gewollt — bei 20 % ist der Knopf samt
 * Schrift fast fort, nicht nur seine Flaeche.
 *
 * NICHT fuer das Schild. `.pe-ov__marke` traegt dieselbe Klasse, ist
 * aber kein Knopf: ein blinkendes Schild verspricht eine Handlung, die
 * es nicht gibt. */
@keyframes pe-ov-atmen {
	0%   { opacity: .9; }
	50%  { opacity: .2; }
	100% { opacity: .9; }
}

@media (hover: none) {
	.pe-ov__knopf.is-platziert:not(.pe-ov__marke) {
		animation: pe-ov-atmen 2s ease-in-out infinite;
	}

	/* Wer ihn mit der Tastatur erreicht, braucht ihn ganz. Eine
	 * Animation schlaegt jede gewoehnliche Deklaration im Kaskadenrang —
	 * die `opacity: 1` der Fokusregel weiter oben kaeme sonst nicht
	 * durch. Deshalb wird hier die Animation angehalten, statt die
	 * Deckung noch einmal zu setzen. */
	.pe-ov__knopf.is-platziert:not(.pe-ov__marke):focus-visible {
		animation-play-state: paused;
		opacity: 1;
	}
}

@media (prefers-reduced-motion: reduce) {
	.pe-ov__knopf { transition: none; }
	/* Wer weniger Bewegung eingestellt hat, meint auch dieses Atmen.
	 * Der Knopf steht dann still und voll sichtbar da — die Aufgabe,
	 * das Werk zeitweise freizugeben, tritt hinter die Ansage des
	 * Nutzers zurueck. */
	/* Dieselbe Spezifitaet wie die Atemregel, sonst gewinnt sie nicht.
	 * `:not(.pe-ov__marke)` zaehlt mit — (0,3,0) gegen (0,2,0). Am
	 * 30.08.2026 gemessen: die Medienabfrage traf zu, die Animation lief
	 * trotzdem weiter. Eine Regel, die im richtigen Zweig steht und
	 * nicht durchkommt, sieht aus wie eine Regel, die es nicht gibt. */
	.pe-ov__knopf.is-platziert:not(.pe-ov__marke) { animation: none; opacity: 1; }
}

/* --- Die Kennzeichnung: derselbe Knopf, ohne Ziel -----------------
 *
 * `.pe-ov__marke` traegt zusaetzlich `.pe-ov__knopf` und erbt damit
 * Platzierung, Weichzeichner, Schrift und das Erscheinen beim
 * Ueberfahren — samt der Dauersichtbarkeit auf Geraeten ohne Zeiger.
 * Hier steht nur, was sich unterscheiden MUSS.
 *
 * Es ist ein `<span>`, kein `<a>`. Damit faellt jede Themeregel weg,
 * die auf `a` zielt; die Schrift kommt aber aus derselben Regel wie
 * beim Knopf, und `font-family` erbt in beiden Faellen vom Elternteil.
 * Im Klon nachgemessen (siehe CHANGELOG), damit sich die beiden nicht
 * still auseinanderentwickeln.
 *
 * **Kein Zeigerwechsel und keine Verdunkelung beim Ueberfahren.** Beides
 * verspricht eine Handlung. Ein Schild, das aussieht wie ein Knopf und
 * auf den Klick nicht reagiert, ist aergerlicher als eines, das von
 * vornherein keiner sein will. */
.pe-ov__marke {
	cursor: default;

	/* Es haengt an der UNTEREN Bildkante, mittig — nicht in der Ecke.
	 * Also sind die oberen Ecken gerundet und die unteren buendig, statt
	 * umgekehrt wie beim Knopf. */
	border-radius: 3px 3px 0 0;

	/* Keine Naht.
	 *
	 * Der Knopf traegt `box-shadow: 0 1px 0` gegen den hellen Strich, der
	 * bei Bruchteilen zwischen ihm und der Bildkante aufblitzt. Das
	 * Schild liegt durch `translateY(-100%)` mit seiner Unterkante AUF
	 * der Bildkante und mit dem Rest darueber — da ist keine Fuge, und
	 * der Schatten wuerde einen Pixel unter das Bild ragen. */
	box-shadow: none;
}

.pe-ov__marke:hover {
	background: rgba(15, 15, 15, .20);
}

/* --- Das Overlay ------------------------------------------------- */

/* Das Overlay soll als Overlay zu erkennen sein.
 *
 * Vorher: `background: Canvas` — auf dieser dunklen Seite ein weisser
 * Kasten, und der Werktitel stand weiss auf weiss. Im Klon fotografiert,
 * bevor etwas geaendert wurde: es las sich nicht als schwebende Flaeche,
 * sondern als Bruch.
 *
 * Jetzt eine dunkle Flaeche in der Farbe der Seite, mit feinem hellem
 * Rand, ueber der abgedunkelten Seite. Die Seite bleibt dahinter
 * erkennbar — das ist der Unterschied zwischen „Overlay" und „andere
 * Seite". */
/* Auf und zu mit Bewegung — ab 2.88.0.
 *
 * Simon am 24.08.2026: *„Ein & Ausblenden des Overlay soll auch animiert
 * sein > (von) sehr klein skaliert, ein/ausfaden."*
 *
 * Beim Oeffnen genuegt `[open]`: der Browser setzt das Merkmal, sobald
 * `showModal()` laeuft. Beim Schliessen braucht es einen Moment, in dem
 * der Dialog noch steht — den setzt das Skript mit `ist-zu`, wartet die
 * Dauer ab und schliesst dann erst. */
/* Der Fade laeuft SPAETER als die Skalierung.
 *
 * Simon am 24.08.2026: *„Fade darf später passieren, dass mehr von der
 * Skalierungsanimation sichtbar ist."* Also wird frueh sichtbar und
 * lange skaliert: bei 45 Prozent der Zeit ist die Deckkraft schon halb
 * da, die Groesse aber noch unterwegs. */
@keyframes pe-ov-auf {
	from { opacity: 0;   transform: scale(.82); }
	35%  { opacity: .18; }
	65%  { opacity: .6; }
	to   { opacity: 1;   transform: none; }
}
@keyframes pe-ov-zu {
	from { opacity: 1; transform: none; }
	to   { opacity: 0; transform: scale(.94); }
}
@keyframes pe-ov-schleier {
	from { opacity: 0; }
	to   { opacity: 1; }
}

.pe-ov__dialog[open]            { animation: pe-ov-auf .55s cubic-bezier(.2,.7,.3,1) both; }
.pe-ov__dialog[open]::backdrop  { animation: pe-ov-schleier .55s ease both; }
.pe-ov__dialog[open].ist-zu     { animation: pe-ov-zu .2s ease both; }
.pe-ov__dialog[open].ist-zu::backdrop { animation: pe-ov-schleier .2s ease reverse both; }

@media (prefers-reduced-motion: reduce) {
	.pe-ov__dialog[open],
	.pe-ov__dialog[open]::backdrop,
	.pe-ov__dialog[open].ist-zu,
	.pe-ov__dialog[open].ist-zu::backdrop { animation: none; }
}

.pe-ov__dialog {
	/* Fast der ganze Schirm.
	 *
	 * Simon: *„im Portfolio darf der Konfigurator viel breiter werden, fast
	 * den ganzen viewport nutzen, ausser das ist durch die Hoehe begrenzt,
	 * dass das Werk nicht ueberlaeuft."* Die Hoehe deckelt weiterhin bei
	 * 90vh, und die Buehne richtet sich in `fitStage()` danach — die Breite
	 * darf deshalb gross sein, ohne dass etwas herauslaeuft. */
	width: min(110rem, 94vw);
	max-height: 90vh;
	max-height: 90dvh;
	/* Oben verankert statt vertikal zentriert.
	 *
	 * Ein `<dialog>` zentriert sich von selbst. Waechst sein Inhalt —
	 * etwa weil „Konfiguration bearbeiten" aufklappt —, wandert dabei
	 * die OBERE Kante nach oben, und mit ihr das Werk. Am 24.08.2026
	 * gemessen: 40 Pixel. Simon: *„Werksposition springt zwischen
	 * geschlossenem DetailKonfigurator und geöffnetem … soll sauber auf
	 * Position bleiben."*
	 *
	 * Mit fester Oberkante waechst der Dialog nach unten, und darin
	 * scrollt `.pe-ov__inhalt`. Das Werk bleibt, wo es ist. */
	margin: 5vh auto;
	margin: 5dvh auto;
	padding: 0;
	border: 1px solid rgba(255, 255, 255, .55);
	border-radius: 3px;
	background: #0d0d0d;
	color: #f2f2f2;
	overflow: visible;
	box-shadow: 0 2rem 5rem rgba(0, 0, 0, .6);
}

/* Dunkler, aber nicht undurchsichtig. Ohne Weichzeichner: er macht die
   Seite dahinter unkenntlich, und gewollt ist erkennbar. */
.pe-ov__dialog::backdrop {
	background: rgba(0, 0, 0, .62);
}

.pe-ov__inhalt {
	max-height: 90vh;
	max-height: 90dvh;
	overflow-y: auto;
	/* Oben mehr, damit der Titel nicht unter das Schliesskreuz laeuft. */
	padding: 3rem clamp(1rem, 4vw, 2.5rem) 2rem;
}

/* Im Overlay traegt der Dialog die Breite. Der eigene Hoechstwert der
 * Auswahlflaeche wuerde sie ein zweites Mal begrenzen und links
 * anschlagen lassen. */
.pe-ov__inhalt .pe-aus { max-width: none; margin: 0; }

/* Das × sitzt in seiner Mitte.
 *
 * Als Textzeichen haengt es an der Grundlinie, und die liegt tiefer als
 * die optische Mitte des Kreises — Simon am 24.08.2026: *„das 'x' zum
 * schließen sitzt noch minimal zu weit unten."* `line-height: 1` allein
 * genuegt nicht, weil das Zeichen selbst nicht mittig in seiner
 * Kegelhoehe steht. Flexbox zentriert die Zeile, der kleine Ausgleich
 * darunter das Zeichen darin. */
.pe-ov__zu {
	position: absolute;
	/* Innen oben rechts. Aussen haengt es bei `max-height: 90vh`
	   schnell ueber dem Fensterrand und ist nicht mehr zu treffen. */
	top: .7rem;
	right: .7rem;
	z-index: 3;
	width: 2.4rem;
	height: 2.4rem;
	display: flex;
	align-items: center;
	justify-content: center;
	font-size: 1.4rem;
	line-height: 1;
	/* Der Ausgleich fuer die Grundlinie: das Zeichen steht in seiner
	   Kegelhoehe nicht mittig, also wird es um ein Zehntel seiner Groesse
	   angehoben. In `em`, damit es bei jeder Schriftgroesse stimmt. */
	padding-bottom: .1em;
	cursor: pointer;
	color: #fff;
	background: rgba(0, 0, 0, .55);
	border: 1px solid rgba(255, 255, 255, .55);
	border-radius: 50%;
}

.pe-ov__zu:focus-visible {
	outline: 2px solid currentColor;
	outline-offset: 2px;
}

/* =====================================================================
 * Anfrageformular als Klappe und Overlay — ab 2.40.0
 * ================================================================== */

/* Die Klappe ist die Grundlage: ohne JavaScript bleibt es dabei, und
 * sie muss dann so aussehen, als waere sie so gemeint. */
.pe-anfrage__klappe { margin: 1.5rem 0; }

.pe-anfrage__ausloeser {
	display: inline-flex;
	align-items: center;
	gap: .6em;
	padding: .85em 1.4em;
	font-size: 1em;
	line-height: 1.3;
	cursor: pointer;
	border: 1px solid currentColor;
	border-radius: 2px;
	list-style: none;
	user-select: none;
}

/* Das Dreieck des Browsers weg — der Ausloeser ist ein Knopf, keine
 * Gliederung. In Safari braucht es die eigene Pseudoklasse. */
.pe-anfrage__ausloeser::-webkit-details-marker { display: none; }
.pe-anfrage__ausloeser::marker { content: ''; }

.pe-anfrage__ausloeser:hover { background: color-mix(in srgb, currentColor 8%, transparent); }
.pe-anfrage__ausloeser:focus-visible { outline: 2px solid currentColor; outline-offset: 2px; }

/* Zentrierter Auslöser — `[pe_vortragsanfrage mitte="ja"]`.
 *
 * Nur der Knopf. Der aufgeklappte Inhalt bleibt linksbündig; ein
 * zentriertes Formular mit zentrierten Beschriftungen ist unlesbar.
 * Die Begründung, warum es `text-align` sein muss und nicht Flex,
 * steht bei `$mitte` in `pe-vortrag.php`. */
.pe-anfrage__klappe--mitte { text-align: center; }
.pe-anfrage__klappe--mitte .pe-anfrage__klappe-inhalt { text-align: start; }

.pe-anfrage__klappe-inhalt { padding-top: 1rem; }

/* Der Formulardialog ist ab 2.78.0 fort.
 *
 * Er lag in der obersten Ebene des Browsers und fing dort Klicks ab, die
 * dem Konfigurator-Overlay darunter galten. Das Formular klappt jetzt
 * auf, wie die Optionen auch — begruendet in `inc/pe-anfrage.php`.
 *
 * Die Klappe traegt keinen eigenen Rahmen: den bringt `.pe-anfrage__form`
 * mit, sonst laegen zwei Rahmen ineinander. */

/* =====================================================================
 * Raumvorschau in der Auswahloberflaeche — ab 2.43.0
 * ---------------------------------------------------------------------
 * Nur der Rahmen darum. Die Vorschau selbst (.pe-view und alles darin)
 * bringt das Stylesheet seit 2.21.0 mit — hier steht nichts, was dort
 * schon steht.
 * ================================================================== */

.pe-raum { margin: 0 0 1.5rem; }

.pe-raum__mass {
	display: flex;
	align-items: baseline;
	gap: .6em;
	flex-wrap: wrap;
	margin: .8rem 0 0;
	font-variant-numeric: tabular-nums;
}

.pe-raum__mass-note { font-size: .82em; opacity: .55; }

/* Der Preis der alten Ansicht.
   Er kommt als nacktes <span> aus dem Raumblock — in 2.21.0 brachte die
   Bricks-Vorlage ihre Typografie mit, jetzt gehoert sie hierher.

   Ausserhalb der Ansicht bleibt er versteckt: solange `pe-configurator.js`
   ihn nicht in seinen Preisblock geschoben hat, stuende die Zahl ein
   zweites Mal unter der Auswahl. Zwei Preise nebeneinander sind schlimmer
   als einer. Ohne JavaScript ist die alte Ansicht ohnehin nicht da, und
   der Preis steht dann in der Auswahl. */
.pe-raum > .pe-raum__preis { display: none; }

.pe-view__price .pe-raum__preis {
	display: block;
	/* `em`, nicht `rem` — dieselbe Zahl wie `.pe-aus__betrag`, damit beide
	   Preisanzeigen gleich gross wirken. Mit `rem` waeren es hier 20 px
	   statt 34: die Wurzelgroesse der Seite ist 12 px, die des
	   Elternelements 20. */
	font-size: 1.7em;
	font-variant-numeric: tabular-nums;
	line-height: 1.05;
	white-space: nowrap;
}

/* Fehlt das Vorschauskript, bleibt sonst eine leere Flaeche stehen und
 * niemand weiss warum. Nur fuer Bearbeiter sichtbar zu machen ginge hier
 * nicht — das Attribut setzt das Skript, das PHP weiss davon nichts. */
[data-pe-raum-fehler]::after {
	content: attr(data-pe-raum-fehler);
	display: block;
	padding: 1em;
	font-size: .84em;
	border-left: 3px solid currentColor;
	background: color-mix(in srgb, currentColor 6%, transparent);
}

/* --- „Konfiguration bearbeiten", ab 2.48.0 ------------------------ */

.pe-aus__bearbeiten { margin: 0 0 1.5rem; }

/* Auf- und zufahren wie die Wunschformat-Klappe — dieselbe Mechanik,
   damit sich beide gleich anfuehlen: ein Raster mit einer Zeile, die
   von `0fr` auf `1fr` waechst. Das Kind muss `overflow: hidden` und
   `min-height: 0` tragen, sonst laesst es sich nicht unter seine
   Inhaltshoehe druecken. */
.pe-aus__bearbeiten-inhalt {
	display: grid;
	grid-template-rows: 0fr;
	transition: grid-template-rows .28s ease;
}
.pe-aus__bearbeiten.ist-offen .pe-aus__bearbeiten-inhalt { grid-template-rows: 1fr; }
.pe-aus__bearbeiten-innen { overflow: hidden; min-height: 0; }

@media (prefers-reduced-motion: reduce) {
	.pe-aus__bearbeiten-inhalt { transition: none; }
}

.pe-aus__bearbeiten-knopf {
	display: inline-flex;
	align-items: center;
	gap: .5em;
	padding: .7em 1.2em;
	font-size: .92em;
	cursor: pointer;
	border: 1px solid var(--pe-aus-rand);
	border-radius: 2px;
	list-style: none;
	user-select: none;
}

.pe-aus__bearbeiten-knopf::-webkit-details-marker { display: none; }
.pe-aus__bearbeiten-knopf::marker { content: ''; }

/* Ein Winkel, der sich beim Aufklappen dreht — die einzige Rueckmeldung
 * darueber, dass hier etwas auf- und zugeht. */
.pe-aus__bearbeiten-knopf::after {
	content: '';
	width: .5em; height: .5em;
	border-right: 1.5px solid currentColor;
	border-bottom: 1.5px solid currentColor;
	transform: rotate(45deg) translate(-.1em, -.1em);
	transition: transform .2s ease;
}
.pe-aus__bearbeiten[open] .pe-aus__bearbeiten-knopf::after {
	transform: rotate(-135deg) translate(-.15em, -.15em);
}

.pe-aus__bearbeiten-knopf:hover { background: var(--pe-aus-flaeche); }
.pe-aus__bearbeiten-knopf:focus-visible { outline: 2px solid currentColor; outline-offset: 2px; }

/* Der Innenabstand gehoert ans KIND, nicht an die Klappe.
   An der Klappe bliebe er auch bei `0fr` stehen — dann faehrt die Box
   nicht aus der Null heraus, sondern aus einem 14 px hohen Streifen.
   Dieselbe Ueberlegung wie bei der Wunschformat-Klappe. */
.pe-aus__bearbeiten-innen { padding: 1.2rem 0 0; }

.pe-aus__bearbeiten-hinweis {
	font-size: .84em;
	line-height: 1.5;
	opacity: .65;
	margin: 0 0 1.2rem;
}

@media (prefers-reduced-motion: reduce) {
	.pe-aus__bearbeiten-knopf::after { transition: none; }
}

/* ==================================================================
 * Vorschauleiste aller Werke (A4b)
 * ------------------------------------------------------------------
 * Waagerecht scrollend statt umbrechend. Bei 88 Werken waeren vier
 * Reihen Kacheln kein Werkzeug mehr, sondern eine zweite Portfolioseite
 * mitten im Konfigurator.
 * ================================================================== */

.pe-leiste {
	margin: .9rem 0 1.4rem;
	/* Der Rand darf ueber die Spalte hinausgehen, damit die Leiste nicht
	   abgeschnitten wirkt, sondern weiterlaeuft. */
	overflow-x: auto;
	overflow-y: hidden;
	scrollbar-width: thin;
	-webkit-overflow-scrolling: touch;
	scroll-snap-type: x proximity;
}

.pe-leiste__liste {
	display: flex;
	gap: .5rem;
	margin: 0;
	padding: 0 0 .5rem;
	list-style: none;
}

.pe-leiste__el { flex: 0 0 auto; }

.pe-leiste__knopf {
	display: block;
	width: 76px;
	text-decoration: none;
	color: inherit;
	scroll-snap-align: center;
	/* Ohne Rahmen im Ruhezustand springt beim Markieren nichts —
	   der Platz ist immer schon da. */
	border: 2px solid transparent;
	border-radius: 3px;
	opacity: .55;
	transition: opacity .15s ease, border-color .15s ease;
}

.pe-leiste__knopf:hover,
.pe-leiste__knopf:focus-visible { opacity: 1; }

.pe-leiste__knopf.is-an {
	opacity: 1;
	border-color: currentColor;
}

.pe-leiste__bild {
	display: block;
	width: 100%;
	height: 60px;
	object-fit: cover;
	border-radius: 1px;
}

/* Der Titel ist fuer die Maus da, nicht fuer die Flaeche: er darf die
   Kachel nicht hoeher machen als das Bild plus eine Zeile. */
.pe-leiste__titel {
	display: block;
	margin-top: .3em;
	font-size: .7em;
	line-height: 1.2;
	max-height: 2.4em;
	overflow: hidden;
	text-align: center;
}

@media (max-width: 640px) {
	.pe-leiste__knopf { width: 62px; }
	.pe-leiste__bild  { height: 48px; }
	.pe-leiste__titel { display: none; }
}

.pe-leiste__luecke {
	margin: -.8rem 0 1.2rem;
	font-size: .78em;
	opacity: .6;
}

/* ==================================================================
 * Werkwechsel — Ueberblendung statt Schnitt
 * ------------------------------------------------------------------
 * Bis 2.135.3 war der Klick auf eine Kachel ein harter Schnitt mit
 * einer Einlaufanimation, die niemand entworfen hat. Am 29.08.2026
 * Bild fuer Bild gemessen (Werk 1 -> Werk 20, 1440 px):
 *
 *   t=10 ms   aria-busy gesetzt, altes Werk steht unveraendert
 *   t=405 ms  Antwort da: altes Werk WEG, neues Werk da — in EINEM
 *             Bild, ohne jede Ueberblendung. Buehne 511 -> 543 px,
 *             ebenfalls schlagartig
 *   t=405..735 ms  das neue Werk schrumpft von 725x474 auf 522x341
 *
 * Das Schrumpfen war keine Absicht. `.pe-frameset` bringt
 * `--pe-frame-pad: 0` und `--pe-mount-pad: 0` als Vorgabe mit, und
 * `__inner`/`__mount` haben `transition: padding .35s` — damit Rahmen
 * und Passepartout beim Umschalten einer OPTION weich wachsen. Auf
 * einem frisch eingesetzten Block laufen dieselben Uebergaenge von der
 * Vorgabe aus los: das Werk erscheint ohne Rahmen in voller Breite und
 * zieht sich dann auf sein Mass zusammen. Simon: *„aktuelles Bild wird
 * schlagartig ausgeblendet, angeklicktes Bild wird mit
 * Skalierungseffekt auf die Buehne geblendet."*
 *
 * Drei Regeln loesen das, jede gegen einen der drei Befunde.
 * ================================================================== */

/* 1) Das Standbild des vorherigen Werks — IN der Buehne, nicht darueber.
 *
 * Erster Anlauf (2.136.1) haengte es als `position: fixed` an den Body,
 * auf der Flaeche, die die alte Buehne im Fenster hatte. Das war falsch,
 * und Simon hat es am 29.08.2026 fotografiert: beim Wechsel von einem
 * Quer- auf ein Hochformat lag das Standbild ueber Knoepfen, Preis,
 * Massangabe und Vorschauleiste. Nachgestellt und gemessen, Werk 41 auf
 * Werk 53 bei 1440 x 900:
 *
 *   t=366 ms  Deckkraft 1 — ueberdeckt pe-view__actions, pe-raum__zeile,
 *             pe-aus__preis, pe-leiste
 *   t=455 ms  Deckkraft 0,76 — ueberdeckt nichts mehr
 *
 * Die Ursache war die Bezugsflaeche: ein fixiertes Element bleibt beim
 * Ausgleichsscrollen stehen, waehrend die Seite darunter wegrutscht.
 * Eine Rolle, die es Bild fuer Bild nachfuehrt, hat den Versatz zwar
 * kleiner gemacht — aber das erste Bild bleibt immer daneben, und beim
 * ersten Bild ist die Deckkraft 1.
 *
 * **Deshalb liegt es jetzt im Kasten der Buehne und wird an ihm
 * geschnitten.** Es kann dadurch gar nichts mehr ueberdecken, unabhaengig
 * von jeder Scrollbewegung — und es braucht keine Nachfuehrung mehr.
 *
 * `position: absolute` und nicht ein zweites Flex-Kind: `.pe-view__frame`
 * ist in der Werkansicht ein zentrierender Flex-Kasten. Ein Kind im Fluss
 * wuerde die Buehne teilen — genau der Fehler, der die Werkansicht im
 * August drei Runden lang zerlegt hat (Falle 4). */
.pe-blende {
	position: absolute;
	inset: 0;
	z-index: 3;
	overflow: hidden;
	display: flex;
	align-items: center;
	justify-content: center;
	pointer-events: none;
	opacity: 1;
	transition: opacity .38s ease;
}
.pe-blende.ist-weg { opacity: 0; }
/* Die Kopie behaelt ihr eigenes Mass und wird am Rand der Buehne
   abgeschnitten, statt darueber hinauszustehen. */
.pe-blende > * { flex: 0 0 auto; }

/* 2) Der frisch eingesetzte Block spielt keine Uebergaenge ab.
 *
 * Alles hier drin ist fuer den Wechsel EINER Option gedacht und auf
 * einem neuen Block schlicht falsch: es gibt keinen Vorzustand, von dem
 * aus etwas laufen koennte. Die Klasse nimmt das Tauschskript nach zwei
 * Bildern wieder ab — danach gelten die Uebergaenge wieder wie immer.
 *
 * `!important`, weil mehrere dieser Regeln aus laenger stehenden
 * Bloecken kommen und hier nicht nach Reihenfolge sortiert werden soll. */
.pe-aus.ist-frisch .pe-view__frame,
.pe-aus.ist-frisch .pe-view__slot,
.pe-aus.ist-frisch .pe-frameset,
.pe-aus.ist-frisch .pe-frameset__inner,
.pe-aus.ist-frisch .pe-frameset__mount,
.pe-aus.ist-frisch .pe-frameset__paper,
.pe-aus.ist-frisch .pe-frameset__paper::after,
.pe-aus.ist-frisch .pe-frameset__art,
.pe-aus.ist-frisch .pe-frameset__frame,
.pe-aus.ist-frisch .pe-frameset__frame--prev,
.pe-aus.ist-frisch .pe-frameset__glass,
.pe-aus.ist-frisch .pe-view__room-bg,
.pe-aus.ist-frisch .pe-view__room-fade { transition: none !important; }

/* 3) Die Buehne waechst in ihr neues Mass, statt zu springen.
 *
 * Hoehe und Breite laufen GEMEINSAM und gleich lang — sonst ist es
 * keine Groessenaenderung, sondern ein Verzerren. Die Breite traegt
 * dabei die eigentliche Arbeit: `.pe-frameset` ist ein
 * `container-type: inline-size`, alle Innenmasse haengen an der Breite.
 * Wer nur die Hoehe animiert, laesst das Werk ueber die Buehne
 * hinausstehen.
 *
 * Eigene Klassen statt der bestehenden Uebergaenge, weil beide dieselbe
 * Dauer und dieselbe Kurve brauchen — `.pe-view__slot` laeuft sonst
 * 0,35 s, `.pe-view__frame` 0,4 s, und das sieht man. */
/* Die Klasse `ist-am-wachsen` gibt es nicht mehr — die
   Groessenanimation beim Werkwechsel ist in 2.138.6 entfallen. Die
   Begruendung steht bei `wachsen()` in `inc/pe-auswahl.php`: sie schrieb
   eine Hoehe, die `fitStage()` gehoert, und das Ergebnis hing vom Lauf
   ab. Die Hoehe wechselt jetzt in einem Schritt, unter der ausblendenden
   Kopie. */

@media (prefers-reduced-motion: reduce) {
	.pe-blende { transition: none; }
	.pe-view__frame.ist-am-wachsen,
	.pe-view__slot.ist-am-wachsen { transition: none; }
}

/* ==================================================================
 * Feste Edition — eine Ausfuehrung, kein Radioknopf
 * ------------------------------------------------------------------
 * Bewusst KEINE Karte wie bei den drei Vorschlaegen: eine einzelne
 * Karte sieht aus wie die erste von mehreren und laesst den Besucher
 * nach den anderen suchen. Ein Textblock behauptet keine Wahl.
 * ================================================================== */

.pe-aus__fest {
	margin: 0 0 1.2rem;
	padding: 1rem 1.1rem;
	border-left: 2px solid currentColor;
	background: var(--pe-aus-flaeche, rgba(127,127,127,.07));
}

.pe-aus__fest-kopf {
	display: flex;
	align-items: baseline;
	gap: .7em;
	flex-wrap: wrap;
	margin: 0 0 .4em;
}

.pe-aus__fest-kopf strong { font-size: 1.15em; }

.pe-aus__fest-hinweis {
	font-size: .78em;
	letter-spacing: .06em;
	text-transform: uppercase;
	opacity: .6;
	font-style: normal;
}

.pe-aus__fest .pe-aus__karte-ui   { margin: 0 0 .5em; opacity: .75; }
.pe-aus__fest .pe-aus__karte-text { margin: 0; }

.pe-aus__fest-satz {
	margin: .8em 0 0;
	font-size: .85em;
	opacity: .6;
}

.pe-aus__fest-format {
	margin: 0 0 1rem;
	font-size: 1.15em;
	font-variant-numeric: tabular-nums;
}

/* Oben angelegt — auf allen Seiten ausser dem Portfolio.
   Dort liegen unten links die Awardlogos und wuerden den Knopf
   verdecken. Die Verschiebung nach oben entfaellt; gesetzt wird sie
   im Skript, hier steht nur, was daran anders aussieht. */
.pe-ov__knopf.is-oben { transform: none; }


/* =====================================================================
 * Stufenlose Feinabstimmung
 * ---------------------------------------------------------------------
 * Der Regler steht unter den Wahlmoeglichkeiten seiner Gruppe: erst
 * welcher Karton, dann wie breit. Er erscheint nur, wenn im Reiter
 * *Preise* eine Spanne gepflegt ist — und nur bei Optionen, die
 * ueberhaupt eine Breite haben. „Ohne Passepartout" bekommt keinen.
 * ================================================================== */

.pe-fein {
	margin: .9rem 0 .2rem;
	display: flex;
	flex-direction: column;
	gap: .4rem;
}

.pe-fein__kopf {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: 1rem;
}

.pe-fein__titel {
	font-size: .82em;
	letter-spacing: .04em;
	text-transform: uppercase;
	opacity: .7;
}

.pe-fein__wert {
	font-variant-numeric: tabular-nums;
	font-size: .95em;
}

.pe-fein__regler {
	width: 100%;
	/* 32 px an der Maus, 44 am Finger — siehe die Regel darunter.
	 *
	 * Der Kasten eines `input[type=range]` ist wesentlich hoeher als
	 * seine sichtbare Bahn; die sitzt mittig, der Rest ist Trefferflaeche.
	 * Am 25.08.2026 gemessen: Titelunterkante zu Bahnmitte 20,8 px,
	 * waehrend der Abstand von Kasten zu Kasten schon bei −2,6 px stand.
	 * Der Abstand, den Simon sieht, ist also fast vollstaendig toter Raum
	 * IM Regler, nicht Rand um ihn herum.
	 *
	 * Noch negativere Raender waeren der falsche Weg gewesen: der
	 * Reglerkasten steht bei −2,6 px bereits 1,2 px ueber der
	 * Textunterkante. Jeder weitere Pixel legt ihn UEBER den Titel — und
	 * ein Klick auf einen Titel, der in Wahrheit den Regler trifft,
	 * setzt den Wert an die geklickte Stelle. Das ist kein enger
	 * Abstand mehr, das ist eine Falle.
	 *
	 * Also den toten Raum kuerzen statt ihn zu ueberlagern. 28 px sind
	 * an der Maus reichlich — der Griff selbst misst rund 16 px, gezeigt
	 * wird eine 4 px hohe Bahn. */
	height: 28px;
	margin: 0;
	background: transparent;
	accent-color: currentColor;
	cursor: pointer;
}

/* Am Finger bleiben es 44 px.
 *
 * Unter 44 px ist ein Regler auf dem Telefon nicht sicher zu treffen —
 * das war der Grund fuer die Zahl, und er gilt unveraendert. Er gilt nur
 * nicht fuer eine Maus: dort ist der Zeiger ein Pixel gross, und die
 * zwoelf Pixel, die hier wegfallen, hat nie jemand getroffen, sondern
 * bloss als Abstand gesehen. `pointer: coarse` trennt genau diese beiden
 * Faelle. */
@media (pointer: coarse) {
	.pe-fein__regler { height: 44px; }
}

.pe-fein__regler:focus-visible {
	outline: 2px solid currentColor;
	outline-offset: 3px;
}

.pe-fein__zurueck {
	align-self: flex-start;
	padding: .3em .8em;
	font: inherit;
	font-size: .82em;
	color: inherit;
	background: transparent;
	border: 1px solid var(--pe-aus-rand, rgba(255,255,255,.28));
	border-radius: 2px;
	cursor: pointer;
}

.pe-fein[hidden] { display: none; }

/* =====================================================================
 * Vollbild INNERHALB des Overlays — ab 2.79.0
 * ---------------------------------------------------------------------
 * Simon am 23.08.2026: *„Ich meinte vorher, dass das Vollbild innerhalb
 * des Overlays gerendert wird, nicht als Extra Element, aber innerhalb
 * so, dass alle anderen Elemente die nicht gebraucht werden quasi
 * ausgeblendet werden."*
 *
 * Deshalb kein zweites Element und keine zweite Ebene: der Dialog traegt
 * ein Merkmal, und der Rest ist Sichtbarkeit. Was bleibt, ist das Werk
 * und die Knopfzeile — ohne sie kaeme man nur ueber Escape zurueck.
 * ================================================================== */
.pe-ov__dialog.ist-vollbild .pe-aus {
	grid-template-columns: 1fr;
}

.pe-ov__dialog.ist-vollbild .pe-aus__steuerung,
.pe-ov__dialog.ist-vollbild .pe-aus__preis,
.pe-ov__dialog.ist-vollbild .pe-aus__leiste,
.pe-ov__dialog.ist-vollbild .pe-raum__mass,
.pe-ov__dialog.ist-vollbild .pe-view__price,
.pe-ov__dialog.ist-vollbild .pe-view__thumbs,
.pe-ov__dialog.ist-vollbild .pe-view__controls,
.pe-ov__dialog.ist-vollbild .pe-view__hint,
.pe-ov__dialog.ist-vollbild [data-pe-vat],
.pe-ov__dialog.ist-vollbild [data-pe-hint],
.pe-ov__dialog.ist-vollbild [data-pe-edition-note] {
	display: none !important;
}

/* Die Buehne klebt sonst — im Vollbild gibt es nichts, woran sie kleben
   koennte, und `position: sticky` erzeugt einen Stapelkontext, den hier
   niemand braucht. */
/* Im Overlay klebt die Buehne — aber ohne Versatz.
 *
 * Simon am 24.08.2026: *„es soll sticky dort bleiben beim Optionen
 * durchscrollen."* Richtig: wer rechts durch die Optionen geht, will das
 * Werk sehen.
 *
 * Der Sprung von 60 Pixeln kam nicht vom Kleben selbst, sondern von
 * seinem Abstand: `top: 60px` haelt auf der Seite Platz fuer den festen
 * Seitenkopf frei. Im Dialog gibt es keinen Seitenkopf — dort ist der
 * richtige Abstand null, und dann faellt die Klebeposition mit der
 * natuerlichen zusammen. Kein Versatz, kein Sprung, und beim Scrollen
 * bleibt das Werk trotzdem stehen. */
.pe-ov__dialog .pe-aus__buehne { top: 0; }

.pe-ov__dialog.ist-vollbild .pe-aus__buehne {
	position: static;
	max-height: none;
}

/* Weniger Rand: das Werk soll den Dialog fuellen, nicht in ihm sitzen.
   Oben bleibt Platz fuer das Schliesskreuz. */
.pe-ov__dialog.ist-vollbild .pe-ov__inhalt {
	padding: 3rem 1rem 1rem;
}

.pe-ov__dialog.ist-vollbild .pe-view {
	gap: .9rem;
}

/* =====================================================================
 * Ausfuehrungskarten kompakt — ab 2.79.0
 * ---------------------------------------------------------------------
 * Der erklaerende Satz steht hinter einem „i". Sichtbar bleibt, was die
 * drei unterscheidet: Name und kurzer Zuruf. Damit passen sie in einer
 * Zeile nebeneinander, statt dass die dritte allein darunter steht und
 * daneben ein Loch bleibt.
 * ================================================================== */
.pe-aus__karten {
	/* ZWEI Spalten als Vorgabe, drei erst ab 28rem Behaelterbreite.
	 *
	 * `repeat(auto-fit, minmax(8.5rem, 1fr))` hat drei Karten
	 * nebeneinander erzwungen, solange 136px je Karte herauskamen — und
	 * 136px reichen fuer „Museum" nicht. Am 25.08.2026 bei 1024 x 768
	 * gemessen: Karte 141px, davon 44 Polster, 23 fuer das „i" und 10
	 * Abstand; fuer den Namen blieben 63,6 von den 82, die er braucht.
	 * Der Rest war Umbruch.
	 *
	 * Die Grenze ist gerechnet, nicht geraten. Fuer den Namen bleiben
	 * Kartenbreite − 44 (Polster) − 23,4 („i") − 10 (Abstand); gebraucht
	 * werden 3,9 × Schriftgroesse. An der Untergrenze der Skalierung
	 * (16px) sind das 62,5px, also eine Karte von 139,9 und ein Behaelter
	 * von 445. Mit etwas Luft: 460px. Darunter sind zwei Spalten die
	 * ehrlichere Antwort — eine von zwei Karten misst dort 217px, und
	 * dort steht wieder alles in voller Groesse.
	 *
	 * In PIXELN, nicht in `rem`. `rem` rechnet in einer Behaelterabfrage
	 * gegen die WURZELSCHRIFT, und die ist auf dieser Seite 12px: aus
	 * `28rem` wurden 336 statt 448, und die Dreispaltigkeit griff noch
	 * auf einem 390px breiten Telefon. Dieselbe Falle wie bei der
	 * Trefferflaeche des „i" weiter unten — ein Mass, das ein Layout
	 * traegt, darf nicht an der Schriftgroesse haengen. */
	grid-template-columns: repeat(2, minmax(0, 1fr));
	align-items: start;
}
@container (min-width: 460px) {
	.pe-aus__karten { grid-template-columns: repeat(3, minmax(0, 1fr)); }

	/* Nur im Dreispaltigen wird es eng genug zum Mitskalieren.
	 *
	 * Die Gerade ist durch zwei gemessene Punkte gelegt: bei 528px
	 * Behaelter (Konfigurator auf 1440) sollen es unveraendert 21px sein,
	 * bei 460px — der Grenze zum Zweispaltigen — passen noch 16,9px in
	 * die Karte. Daraus 6cqi − 10,7px. Nach unten deckelt .8em, nach oben
	 * die bisherige Groesse. */
	.pe-aus__karte-kopf strong {
		font-size: clamp(.8em, calc(6cqi - 10.7px), 1.05em);
	}
}
/* Die Karten muessen nicht gleich hoch sein: sie stehen nebeneinander,
   nicht in einer Tabelle. Gleiche Hoehe hiesse, dass die kuerzeste den
   Leerraum der laengsten mittraegt — genau das, was hier weg sollte. */
.pe-aus__karte { align-self: start; }

/* Der Kasten haengt an der REIHE, nicht an der einzelnen Karte.
 *
 * An der Karte verankert war er breiter als sie und ragte ueber die
 * Nachbarn — bei der letzten Karte nach links, bei der ersten nach
 * rechts, und immer schief zu irgendetwas. Simon am 23.08.2026: *„Infos
 * sind noch nicht sauber gelayoutet, boxen passen nicht perfekt
 * aneinander."*
 *
 * Unter der ganzen Reihe hat er eine feste Kante links und rechts und
 * kann nirgends anstossen. Welche Karte gemeint ist, zeigt die Karte
 * selbst: sie bleibt hervorgehoben, solange ihr Kasten offen ist. */
.pe-aus__karten { position: relative; }

/* Der Behaelter fuer die Karten — am Feldsatz, eine Ebene ueber der Reihe.
 *
 * Eine Bildschirmabfrage kann hier NICHTS ausrichten: die Karten werden
 * schmal, waehrend das Fenster breit bleibt. Im Portfolio-Overlay am
 * 25.08.2026 gemessen — Fenster 1512 CSS-Pixel, Kartenreihe 423, Karte
 * 133. `@media` sieht die 1512 und haelt alles fuer geraeumig. Genau
 * dieser Fall hat Simon die Karten „Muse-um" und „Gale-rie" gezeigt.
 *
 * Der Behaelter sitzt am FELDSATZ und nicht an der Reihe, weil ein
 * Element seinen eigenen Behaelter nicht abfragen kann — und abgefragt
 * werden soll auch die Spaltenzahl, nicht nur die Schriftgroesse.
 *
 * `container-type: inline-size` bringt `contain: layout` mit und macht
 * das Element zum Bezug fuer absolut positionierte Nachfahren. Der
 * Infokasten haengt an `.pe-aus__karten`, und die ist ohnehin schon
 * `position: relative` — an ihr aendert sich also nichts. */
.pe-aus__gruppe--ausfuehrung { container-type: inline-size; }

/* Die Bildschirmabfrage von 2.79.0 ist entfallen.
 *
 * Sie hielt bei bis zu 620px Fensterbreite zwei Spalten fest — richtig
 * gedacht, aber am falschen Mass: entscheidend ist die Breite der
 * KARTENREIHE, nicht die des Fensters. Im Overlay war das Fenster 1512px
 * breit und die Reihe 423. Die Spaltenzahl haengt jetzt oben am
 * Behaelter und deckt beide Faelle mit einer Regel ab. */

.pe-aus__karte-kopf {
	/* Ueber der Infobox: die Titel sollen stehen bleiben, wenn sie
	   aufgeht. Ohne `position` wirkt `z-index` nicht. */
	position: relative;
	z-index: 6;
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: .5em;
}

.pe-aus__info {
	flex: 0 0 auto;
	width: 1.5em;
	height: 1.5em;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	padding: 0;
	font: inherit;
	font-size: .78em;
	font-style: italic;
	line-height: 1;
	color: inherit;
	background: transparent;
	border: 1px solid currentColor;
	border-radius: 50%;
	opacity: .55;
	cursor: help;
	transition: opacity .15s;
}
.pe-aus__info:hover,
.pe-aus__info:focus-visible { opacity: 1; }

/* Am Finger groesser, am Zeiger nicht.
 *
 * Der sichtbare Kreis misst 23 Pixel — richtig fuer die Maus, zu klein
 * fuer den Daumen: 44 sind die Untergrenze, die im ganzen Konfigurator
 * gilt. Statt den Kreis aufzublasen, waechst nur die Trefferflaeche, und
 * das ausschliesslich auf Beruehrungsschirmen. */
@media (pointer: coarse) {
	.pe-aus__info { position: relative; }
	.pe-aus__info::after {
		content: '';
		position: absolute;
		/* In PIXELN, nicht in rem: die Grundschrift ist hier 12px, aus
		   `.7rem` wurden dadurch 8,4 statt 11,2 — und die Trefferflaeche
		   blieb mit 40px unter der Untergrenze von 44. Eine Mindestgroesse
		   fuer den Finger darf nicht an der Schriftgroesse haengen. */
		inset: -14px;
	}
}
.pe-aus__info:focus-visible { outline: 2px solid currentColor; outline-offset: 2px; }

/* Der Satz selbst: aus dem Fluss genommen, sonst bliebe die Karte hoch.
   `visibility` statt `display`, damit er ueberblendet werden kann und
   Vorleseprogramme ihn ueber `aria-controls` weiterhin finden. */
/* Die Box deckt die Karten AB, statt unter ihnen zu haengen.
 *
 * Unterhalb der Reihe schnitt sie in Format und „Konfiguration
 * bearbeiten" hinein — Simon am 24.08.2026: *„Sie schneidet aber immer
 * noch andere Boxen."* Jetzt liegt sie genau ueber den Karten: oben
 * beginnt sie unter den Titelzeilen (die Kante misst das Skript, weil
 * sie an Schriftgroesse und Umbruch haengt), unten endet sie mit der
 * Reihe. Sichtbar bleiben die drei Titel und der Satz — die
 * Beschreibungen der beiden anderen verschwinden dahinter, und darunter
 * wird nichts mehr angeschnitten. */
.pe-aus__karte-text {
	position: absolute;
	top: var(--pe-satz-oben, 100%);
	bottom: 0;
	left: 0;
	right: 0;
	z-index: 5;
	/* Notausgang: waere ein Text laenger als die Reihe hoch ist, scrollt
	   er in der Box, statt darunter herauszulaufen. */
	overflow: auto;
	padding: .8em 1em;
	font-size: .82em;
	line-height: 1.45;
	text-align: left;
	color: #f2f2f2;
	background: #0d0d0d;
	border: 1px solid rgba(255, 255, 255, .55);
	border-radius: 3px;
	box-shadow: 0 .6rem 1.6rem rgba(0, 0, 0, .55);
	opacity: 0;
	visibility: hidden;
	pointer-events: none;
	transition: opacity .15s, visibility 0s linear .15s;
}

/* Zeigen: beim Ueberfahren des „i", bei Tastaturfokus — und wenn ein
   Fingertipp die Karte aufgeschlagen hat. */
/* Hier stand eine dritte Zeile: `.pe-aus__info:hover ~ .pe-aus__karte-text`.
   Sie war TOT und sah aus wie die Rueckfallebene fuer Browser ohne
   `:has()`. Der Satz ist kein Geschwister des „i", sondern eines der
   Kopfzeile, in der das „i" steckt — ein `~` kommt dort nicht hin. Am
   29.08.2026 gemessen: der Selektor trifft **0** Elemente, auch ohne
   `:hover` geprueft; die beiden `:has()`-Zeilen treffen 2 und 3.

   Genau diese Sorte Zeile hat Falle 20 gekostet (`.pe-view__stage`, das
   es nie gab): ein Selektor, der ins Leere greift, ist von „absichtlich
   verborgen" nicht zu unterscheiden — und hier haette er den naechsten
   Leser glauben lassen, das Ueberfahren sei ohne `:has()` abgedeckt.

   Was ohne `:has()` bleibt: das Antippen. Der Klickzuhoerer in
   `inc/pe-auswahl.php` setzt `satz-offen`, und damit gilt die vierte
   Zeile unten — an der Tastatur wie am Finger. Verloren geht allein die
   Vorschau beim Ueberfahren mit der Maus, und das nur in Browsern ohne
   `:has()` (Safari vor 15.4, Firefox vor 121). */
.pe-aus__karte-kopf:has(.pe-aus__info:hover) ~ .pe-aus__karte-text,
.pe-aus__karte-kopf:has(.pe-aus__info:focus-visible) ~ .pe-aus__karte-text,
.pe-aus__karte.satz-offen .pe-aus__karte-text {
	opacity: 1;
	visibility: visible;
	pointer-events: auto;
	transition: opacity .15s, visibility 0s;
}

/* Solange ihr Kasten offen ist, bleibt die Karte hervorgehoben — sonst
   waere nicht zu sehen, wovon der Text unten handelt. */
.pe-aus__karte.satz-offen { border-color: currentColor; }
.pe-aus__karte.satz-offen .pe-aus__info { opacity: 1; }

/* Die Auszeichnung sitzt UNTEN in der Karte, abgesetzt durch einen
   feinen Strich. Sie darf dort umbrechen, ohne etwas zu verschieben —
   darueber ist alles schon gesetzt, und die Titel fluchten deshalb
   unabhaengig von der Kartenbreite. */
.pe-aus__choice {
	display: block;
	margin-top: auto;
	padding-top: .7em;
	border-top: 1px solid var(--pe-aus-rand);
	/* Die Groesse steht HIER, in der letzten Regel.
	 *
	 * Zwei fruehere Anlaeufe standen weiter oben und wurden von dieser
	 * Zeile ueberschrieben — `font-size: .7em` gewann bei gleicher
	 * Spezifitaet, weil sie spaeter kommt. Gemessen am 25.08.2026 auf
	 * 1180 x 820: Schrift 14px statt der gerechneten 13, Text 129px in
	 * einem 119px breiten Kasten. Falle 5 im CLAUDE.md, nur andersherum.
	 *
	 * Und gemessen wird jetzt der TEXT, nicht der Kasten:
	 * `scrollWidth > clientWidth`. Ein Kasten, der in die Karte passt,
	 * sagt nichts darueber, ob sein Inhalt hineinpasst — die Zeile darf
	 * ja nicht umbrechen. Genau daran ist die Pruefung in 2.105.3
	 * vorbeigegangen.
	 *
	 * Die Gerade gilt fuer ZWEI Spalten: Karte = (Behaelter − 12,8) / 2,
	 * davon 44 Polster ab, und „ARTIST'S CHOICE" braucht rund das
	 * 9,5fache der Schriftgroesse. Fuer drei Spalten steht eine eigene
	 * Gerade in der Behaelterabfrage weiter oben. */
	font-size: clamp(.48em, calc(5.26cqi - 5.3px), .7em);
	font-style: normal;
	letter-spacing: .06em;
	text-transform: uppercase;
	opacity: .8;
}
@container (min-width: 460px) {
	/* Drei Spalten: Karte = (Behaelter − 25,6) / 3. */
	.pe-aus__choice { font-size: clamp(.48em, calc(3.5cqi - 5.6px), .7em); }
}

/* Umfeld abdunkeln, solange eine Beschreibung offen ist.
 *
 * Der Kasten legte sich sonst ueber Format und „Konfiguration
 * bearbeiten", und beides blieb gleich hell — es sah aus, als waeren
 * zwei Dinge zugleich gemeint. Simon am 23.08.2026: *„jetzt überdeckt es
 * aber andere Infos … wenn drumherum alles abgedunkelt würde, dann würde
 * das passen."*
 *
 * Der Schleier liegt ueber der ganzen Oberflaeche; die Kartenreihe samt
 * Kasten wird darueber gehoben. Ein Klick darauf schliesst — dafuer
 * sorgt derselbe Zuhoerer, der auch sonst schliesst. */
.pe-aus {
	position: relative;

	/* Keine Scroll-Verankerung im Konfigurator.
	 *
	 * Ein Zug am Passepartoutregler aendert das Aussenverhaeltnis, und
	 * damit waechst die Buehne in der LINKEN Spalte. Der Browser haelt
	 * daraufhin etwas darunter fest und scrollt die Seite nach — die
	 * RECHTE Spalte wandert dabei unter dem Zeiger weg. Am 26.08.2026
	 * gemessen: Buehne 543 auf 559 px, `scrollY` 14179 auf 14195, und der
	 * Zuruecksetzen-Knopf sprang von 511 auf 495. Wer nach dem Loslassen
	 * auf den Knopf zielte, griff 16 px daneben — Simon: *„das
	 * Zurücksetzen der Passepartout slider hat nicht immer beim ersten
	 * mal sauber funktioniert."*
	 *
	 * Der Knopf steht im DOKUMENT unveraendert (14657 vor wie nach); es
	 * war nie das Layout, sondern die Seite darunter.
	 *
	 * Nur zweispaltig. Einspaltig steht die Buehne UEBER der Bedienung —
	 * dort haelt dieselbe Verankerung den Regler unter dem Finger still,
	 * und das ist dann genau richtig. */
	overflow-anchor: none;
}

@media (max-width: 60rem) {
	.pe-aus { overflow-anchor: auto; }
}

.pe-aus.hat-satz::after {
	content: '';
	position: absolute;
	inset: 0;
	z-index: 4;
	background: rgba(13, 13, 13, .74);
	animation: pe-schleier .15s ease both;
}

.pe-aus.hat-satz .pe-aus__gruppe--ausfuehrung {
	position: relative;
	z-index: 6;
}

@keyframes pe-schleier { from { opacity: 0; } to { opacity: 1; } }

@media (prefers-reduced-motion: reduce) {
	.pe-aus.hat-satz::after { animation: none; }
}

@media (prefers-reduced-motion: reduce) {
	.pe-aus__karte-text, .pe-aus__info { transition: none; }
}

/* =====================================================================
 * Vier Stegregler — ab 2.83.0
 * ---------------------------------------------------------------------
 * Oben, rechts, unten, links: die Reihenfolge von CSS, und dieselbe, in
 * der Philipps Werte gepflegt sind. Zwei Spalten, damit vier Regler die
 * Optionsspalte nicht zu einem Turm machen; auf schmalen Geraeten
 * untereinander.
 *
 * Der Zuruecksetzen-Knopf erscheint nur einmal — er setzt ohnehin alle
 * vier zugleich zurueck, und viermal derselbe Knopf waere viermal
 * dieselbe Frage.
 * ================================================================== */
/* Drei Zeilen, wie das Passepartout am Werk liegt:
 *
 *     ┌──────── oben ────────┐
 *     │ links   │   rechts   │
 *     └──────── unten ───────┘
 *
 * Simon am 24.08.2026: *„Zeile 1: ein slider volle Spaltenbreite 'oben'
 * … Zeile 2: zwei Slider, halbe Spaltenbreite jeweils 'links' /
 * 'rechts' … Zeile 3: ein slider volle Spaltenbreite 'unten'."*
 *
 * Die Reihenfolge im Markup bleibt die des Datenmodells — oben, rechts,
 * unten, links —, die Anordnung macht `order`. So muss niemand zwei
 * Reihenfolgen im Kopf behalten. */
.pe-fein--seite { min-width: 7.5rem; }

/* Die Rahmenbreite steht allein und nimmt die ganze Spalte — wie
   „oben" beim Passepartout. Der Zuruecksetzen-Knopf faellt dadurch in
   die naechste Zeile, also unter den Regler. Simon am 24.08.2026:
   *„Rahmenslider: Zurücksetzen button darunter … Volle Spaltenbreite."* */
.pe-fein--profil { flex: 1 1 100%; }

.pe-fein--steg0 { order: 1; flex: 1 1 100%; }   /* oben   */
/* Links schmaler, rechts breiter — um genau die halbe Knopfbreite samt
   ihrem Abstand. Danach sind die beiden REGLER gleich lang, obwohl nur
   die rechte Zelle einen Knopf traegt. Am 25.08.2026 vorher gemessen:
   257 px gegen 130 px. */
.pe-fein--steg3 { order: 2;                                  /* links  */
	flex: 1 1 calc(50% - .6rem - (var(--pe-fein-knopf, 7.4rem) + .7rem) / 2); }
.pe-fein--steg1 { order: 3;                                  /* rechts */
	flex: 1 1 calc(50% - .6rem + (var(--pe-fein-knopf, 7.4rem) + .7rem) / 2); }
.pe-fein--steg2 { order: 4; flex: 1 1 100%; }   /* unten  */

/* Bei Schattenfuge bleibt nur der erste stehen — dann ueber die ganze
   Breite, ohne Luecke daneben. */

/* Ein Regler ist zwei Zeilen hoch: Beschriftung mit Wert, darunter die
   Bahn — und rechts daneben der Zuruecksetzen-Knopf. */
.pe-fein {
	margin: 0;
	/* KEINE Luecke zwischen Titel und Regler.
	 *
	 * `.pe-fein` ist eine Flex-Spalte, und die trug `gap: .4rem` — 4,8 px.
	 * Gegen die hat `--pe-fein-eng` seit 2.102.2 angerechnet: ein
	 * negativer Rand hebt eine Luecke nicht auf, er verschiebt nur, was
	 * dahinter liegt. Deshalb hat jedes Nachziehen des Randes so wenig
	 * gebracht — es war ein Gegengewicht, keine Loesung.
	 *
	 * Am 25.08.2026 auseinandergenommen. Vom Titeltext bis zur Mitte der
	 * sichtbaren Bahn lagen 16,8 px, und die setzen sich zusammen aus:
	 * Luecke 4,8 + Rand −7,44 + Versatz in der Reglerzeile 4,0 + halbe
	 * Reglerhoehe 14 + Blindraum unter dem Text 1,4. Die Luecke ist der
	 * einzige Posten davon, der reiner Abstand ist. */
	row-gap: 0;
}

.pe-fein__zeile {
	display: flex;
	align-items: center;
	gap: .7rem;
}
.pe-fein__regler { flex: 1 1 auto; min-width: 0; margin: 0; }

/* Feste Breite, in allen drei Sprachen dieselbe.
 *
 * Sie ist die Rechengroesse fuer die Zeile „links / rechts": dort steht
 * nur EIN Knopf, und damit die beiden Regler trotzdem gleich lang
 * werden, gibt die linke Zelle die halbe Knopfbreite ab und die rechte
 * bekommt sie dazu. Waere der Knopf inhaltsbreit, staende in „Reset"
 * eine andere Zahl als in „Zurücksetzen" — und die Regler waeren wieder
 * ungleich, nur unauffaelliger. */
.pe-fein__zurueck { flex: 0 0 auto; }

/* Am Finger 44 statt 36 Pixel — dieselbe Untergrenze wie ueberall.
   In PIXELN, nicht in em: eine Mindestgroesse fuer den Finger darf nicht
   an der Schriftgroesse haengen. */
@media (pointer: coarse) {
	.pe-fein__zurueck { position: relative; }
	.pe-fein__zurueck::after {
		content: '';
		position: absolute;
		/* −5, nicht −4: der sichtbare Knopf misst 36,08 px, mit −4 kam die
		   Flaeche auf 42,08 und blieb damit unter der Untergrenze. */
		inset: -5px;
	}
}

/* Immer da, aber ausgegraut, solange nichts abweicht. Ein Knopf, der
   erscheint und verschwindet, laesst die Zeile springen. */
.pe-fein__zurueck[disabled] {
	opacity: .35;
	cursor: default;
	pointer-events: none;
}
/* Der Wert steht DIREKT neben der Beschriftung, nicht am rechten Rand.
 * Ueber die halbe Spaltenbreite hinweg gehoerten Titel und Zahl sonst
 * optisch nicht mehr zusammen. Simon am 24.08.2026: *„XXmm direkt rechts
 * neben die Titel."* */
.pe-fein__kopf {
	justify-content: flex-start;
	gap: .6em;
	margin-bottom: var(--pe-fein-eng, .15rem);
}

/* Der Behaelter der Regler steht im Innenraum der Gruppe und laeuft
   ueber beide Spalten — unter dem Optionsbild UND unter der Liste. */
/* Der Reglerblock steht UNTER DEM BILD, nicht unter der ganzen Gruppe.
 *
 * Als Zeile unter beiden Spalten begann er erst dort, wo die laengere
 * von beiden endet — bei fuenf Optionen also 260 Pixel unter dem Bild,
 * mit nichts dazwischen. Simon am 24.08.2026: *„Slider haben zuviel
 * Abstand zu den Optionsbilder, sollen direkt darunter liegen."*
 *
 * In der Bildspalte sitzt er unmittelbar darunter; die Auswahlliste
 * daneben laeuft ueber beide Zeilen. Der Preis dafuer ist Breite: die
 * Regler haben die Breite des Bildes statt der ganzen Spalte. Fuer
 * „oben" und „unten" ist das die volle Bildbreite, fuer „links" und
 * „rechts" je die Haelfte davon. */
/* Die Liste steht neben dem Bild, nicht ueber zwei Zeilen. Die Regler
   laufen darunter ueber die GANZE Breite — Simon am 24.08.2026:
   *„Slider gehen … über beide Spalten der rechten Spalte gemeinsam."* */

.pe-fein__gruppe {
	/* Titel und SEIN Regler gehoeren zusammen — der Abstand dazwischen
	   muss deutlich kleiner sein als der zur naechsten Zeile, sonst
	   liest man Regler und darunterstehenden Titel als Paar. Simon am
	   25.08.2026: *„Titel > Slider soll kleiner sein als Slider >
	   Titel darunter. Also Titel + Slider sollen optisch
	   zusammengehoeren."* Vorher .15 gegen .75 — gemessen 8 px gegen
	   9 px, also praktisch gleich. */
	--pe-fein-knopf: 7.4rem;
	/* Negativ, nicht null.
	 *
	 * Ein `input[type=range]` ist 44 px hoch — Fingermass —, die sichtbare
	 * Bahn sitzt darin mittig. Zwischen Titelunterkante und Bahn liegen
	 * deshalb rund 20 px unsichtbarer Kasten, auch wenn der Abstand
	 * rechnerisch null ist. Am 25.08.2026 gemessen: 5 px Abstand, gefühlt
	 * das Vierfache. Ein negativer Rand zieht die Zeile hoch, ohne die
	 * Trefferflaeche anzutasten. */
	--pe-fein-eng:   -0.62rem;
	--pe-fein-reihe: 1.35rem;
	--pe-fein-oben:  1.3rem;
	margin-top: var(--pe-fein-oben);
	/* `1 / span 2`, nicht `1 / -1`.
	 *
	 * Mit `-1` blieb der Block auf der Breite der ersten Spalte stehen —
	 * am 24.08.2026 gemessen: 310 statt 528 Pixel, obwohl der berechnete
	 * Wert „1 / -1" lautete. Die ausdrueckliche Spanne tut, was
	 * draufsteht.
	 *
	 * Ueber beide Spalten: so breit wie Optionsbild und Liste zusammen. */
	grid-column: 1 / span 2;
	display: flex;
	flex-wrap: wrap;
	/* Drei Abstaende, und nur drei — an einer Stelle definiert, damit sie
	 * zueinander passen:
	 *   --pe-fein-eng    Titel zu SEINEM Regler
	 *   --pe-fein-reihe  eine Reglerzeile zur naechsten
	 *   --pe-fein-oben   Optionsbild zum ersten Titel */
	gap: var(--pe-fein-reihe) 1.2rem;
	align-items: flex-start;
	margin-top: 0;
}


/* Der Datenschutzhinweis: da, aber nicht laut. Er ist Pflicht nach
   Art. 13 DSGVO und keine Einwilligung — deshalb steht er als Satz und
   nicht als Kaestchen. */
.pe-anfrage__datenschutz {
	margin: 1.5rem 0 0;
	font-size: .82em;
	line-height: 1.5;
	opacity: .7;
}
.pe-anfrage__datenschutz a { color: inherit; }

/* Die Felder laufen ueber die volle Breite des Rahmens.
 *
 * `.pe-anfrage` traegt eine Lesebreite von 528px — richtig, wenn das
 * Formular allein auf einer Seite steht, falsch im gerahmten Werkblock:
 * dort endeten die Felder bei 984, waehrend der Rahmen bis 1152 ging.
 * Im Block bestimmt der Block die Breite. */
.pe-werk .pe-anfrage { max-width: none; }

/* Volle Breite — aber NICHT fuer Auswahlboxen.
 *
 * Zum zweiten Mal dieselbe Falle: eine Feldregel ohne Ausnahme fuer
 * `checkbox` traf die Einwilligungsbox mit. Am 24.08.2026 gemessen: die
 * Box 797 Pixel breit, der Satz daneben auf null gequetscht und 405
 * Pixel hoch. Simon: *„Im Werksseitenformular ist die Checkbox unten +
 * Text im Layout komplett verschoben."*
 *
 * Beim ersten Mal (23.08.) habe ich die Ausnahme als spaetere Regel
 * nachgeschoben. Besser ist, sie gar nicht erst zu treffen. */
.pe-werk .pe-anfrage__zeile input:not([type="checkbox"]):not([type="radio"]),
.pe-werk .pe-anfrage__zeile textarea,
.pe-werk .pe-anfrage__zeile select {
	width: 100%;
	box-sizing: border-box;
}

/* =====================================================================
 * Weitere Bilder zum Werk — ab 2.84.0
 * ---------------------------------------------------------------------
 * Detailaufnahmen und gerahmte Gesamtansichten auf den Werksseiten.
 * Bewusst schlicht: die Bilder tragen sich selbst, ein Raster mit
 * Rahmen und Schatten stünde ihnen im Weg.
 * ================================================================== */
.pe-werkbilder { margin: 2.5rem 0 0; }

.pe-werkbilder__titel {
	margin: 0 0 1rem;
	font-size: .82em;
	letter-spacing: .12em;
	text-transform: uppercase;
	opacity: .7;
}

.pe-werkbilder__liste {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr));
	gap: 1.2rem;
}

.pe-werkbilder__el { margin: 0; }
.pe-werkbilder__bild { display: block; width: 100%; height: auto; }

.pe-werkbilder__text {
	margin: .5em 0 0;
	font-size: .82em;
	line-height: 1.5;
	opacity: .7;
}

/* „Seiten einzeln einstellen" — die Ausnahme, unter dem Regelfall. */
/* Der zweite Anfragen-Knopf am Ende der Konfiguration.
 *
 * Auf die Breite der Klappe, nicht auf Textbreite: er ist der Abschluss
 * des Blocks, und ein schmaler Knopf mittendrin sieht aus wie eine
 * Nebensache. Der obere behaelt seine Spaltenbreite — dort steht er
 * neben dem Preis. */
.pe-aus__bearbeiten-cta {
	margin-top: 1.4rem;
	display: flex;
}
.pe-aus__anfrage-unten { flex: 1 1 100%; }

/* `display: flex` schlaegt das UA-`[hidden]` — dieselbe Falle wie bei
   den Ebenen der Buehne, deshalb hier ausdruecklich. Ohne diese Zeile
   bliebe die Checkbox bei der Schattenfuge stehen. */
.pe-fein__einzeln[hidden] { display: none; }

.pe-fein__einzeln {
	flex: 1 1 100%;
	order: 50;
	display: flex;
	align-items: center;
	gap: .55em;
	margin-top: .2rem;
	font-size: .82em;
	opacity: .8;
	cursor: pointer;
}
.pe-fein__einzeln input {
	width: auto;
	min-width: 0;
	flex: 0 0 auto;
	margin: 0;
	accent-color: currentColor;
}
.pe-fein__einzeln[hidden] { display: none; }

/* Herunterladen — der Knopf im Bild, unten rechts.
 *
 * Dieselbe Sprache wie der Knopf am Portfoliobild: sanft transparent mit
 * Weichzeichner, damit er auf jedem Motiv liegen kann. Am Zeiger
 * erscheint er beim Ueberfahren, am Finger steht er dauerhaft — ohne
 * Hover gaebe es sonst keinen Weg hin. */
.pe-view__laden {
	position: absolute;
	right: .7rem;
	bottom: .7rem;
	z-index: 4;
	width: 2.6rem;
	height: 2.6rem;
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 0;
	color: #fff;
	background: rgba(15, 15, 15, .35);
	backdrop-filter: blur(5px);
	-webkit-backdrop-filter: blur(5px);
	border: 1px solid rgba(255, 255, 255, .45);
	border-radius: 50%;
	cursor: pointer;

	/* Unsichtbar, aber FOKUSSIERBAR.
	 *
	 * Hier stand `visibility: hidden`. Das nimmt einem Element nicht nur
	 * die Sicht, sondern auch die Fokussierbarkeit — und damit war die
	 * Regel `.pe-view__laden:focus-visible` weiter unten TOT: der Knopf
	 * konnte den Fokus nie annehmen, also konnte die Regel, die ihn beim
	 * Fokus sichtbar macht, nie greifen. Am Zeiger war der Knopf damit zu
	 * erreichen, an der Tastatur nie. Am 29.08.2026 gemessen:
	 * `n.focus(); document.activeElement === n` → **false**.
	 *
	 * `opacity: 0` verbirgt genauso, laesst den Fokus aber zu. Das ist
	 * das Muster jedes Sprunglinks: unsichtbar, bis der Tabulator
	 * hinkommt, dann da. `pointer-events: none` haelt dabei den
	 * Ruhezustand klickfest — sonst laege ein unsichtbarer Knopf ueber
	 * dem Foto. Der Zeiger kommt trotzdem hin: die Regel unten schaltet
	 * ihn wieder ein, und ausgeloest wird sie vom Ueberfahren des
	 * RAHMENS, nicht des Knopfes. */
	opacity: 0;
	pointer-events: none;
	transition: opacity .18s, background .15s;
}
.pe-view__laden svg { width: 1.15rem; height: 1.15rem; display: block; }

/* Die Meldungszeile unter den Knoepfen. Sie steht nur da, wenn etwas
   nicht ging — sonst ist sie `hidden` und nimmt keinen Platz. */
.pe-view__meldung {
	margin: .6rem 0 0;
	font-size: .84em;
	line-height: 1.45;
	opacity: .8;
}
.pe-view__meldung[hidden] { display: none !important; }

/* Am Finger 45 statt 31 Pixel.
 *
 * Der sichtbare Kreis misst 31 px — richtig fuer die Maus, zu klein fuer
 * den Daumen. Wie beim „i" an den Ausfuehrungskarten waechst nur die
 * TREFFERFLAECHE, nicht der Kreis, und nur auf Beruehrungsschirmen. Der
 * Knopf ist bereits `position: absolute`, das Pseudoelement haengt sich
 * also von selbst an ihn. */
@media (pointer: coarse) {
	.pe-view__laden::after {
		content: '';
		position: absolute;
		/* −8, nicht −7: `inset` bezieht sich auf den POLSTERKASTEN, und der
		   ist um die 1px-Umrandung kleiner als die sichtbaren 31px. Mit −7
		   kam die Flaeche auf 43 und blieb einen Pixel unter der Grenze —
		   nachgemessen, nicht geschaetzt. */
		inset: -8px;
	}
}
.pe-view__laden:hover { background: rgba(15, 15, 15, .6); }
.pe-view__laden:disabled { opacity: .5; cursor: progress; }

/* `.pe-view__frame`, nicht `.pe-view__stage`.
 *
 * Die Buehne heisst im Skript `pe-view__frame` — `pe-view__stage` ist der
 * Name der JS-Variablen, nicht der Klasse. Diese Regel war damit die
 * einzige Stelle im ganzen Projekt, an der `.pe-view__stage` vorkam, und
 * sie traf nichts: am Zeiger erschien der Knopf NIE.
 *
 * Am 25.08.2026 sah das in der Messung richtig aus — `opacity: 0` am
 * Zeiger, `1` am Finger, genau wie bestellt. Ein Selektor, der ins Leere
 * greift, ist von „absichtlich verborgen" nicht zu unterscheiden, solange
 * man nur den Ruhezustand misst. Simon hat es gesehen, ich nicht. */
.pe-view__frame:hover > .pe-view__laden,
.pe-view__laden:focus-visible {
	opacity: 1;
	pointer-events: auto;
	transition: opacity .18s, background .15s;
}

@media (hover: none) {
	.pe-view__laden { opacity: 1; pointer-events: auto; }
}

@media (prefers-reduced-motion: reduce) {
	.pe-view__laden { transition: none; }
}

/* =========================================================
 * Werk perspektivisch auf die markierte Wand
 * ---------------------------------------------------------
 * Die Matrix selbst setzt das Skript inline — sie steht in
 * Bühnenpixeln und ändert sich bei jeder Größenänderung. Hier steht
 * nur, was drumherum gilt.
 * ======================================================= */

/* KEIN Übergang auf der Matrix.
 *
 * `.pe-view__slot` lässt Breite, links und oben weich laufen. Die
 * Transformation bewusst nicht: zwischen einer affinen und einer
 * perspektivischen Matrix interpoliert der Browser über eine Zerlegung
 * in Drehung, Skalierung und Scherung — auf halbem Weg steht dabei
 * etwas, das keine von beiden ist, und das Werk kippt sichtbar durch
 * den Raum. Der Wechsel springt lieber. */
.pe-view__frame.is-werkwarp .pe-view__slot {
	transition: none;
}

/* Auf der verzerrten Fläche greift man mitten ins Werk — der Zeiger
   soll das sagen. `is-user` setzt bereits `grab`; hier bleibt es
   dabei, aber ohne die Umrandung des Haltens, die auf einer schrägen
   Fläche als schiefes Rechteck danebenläge. */
.pe-view__frame.is-werkwarp .pe-view__slot.is-markiert {
	outline: none;
	box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.85);
}

/* Drei Knöpfe statt zweier — die Zeile bricht schon um (flex-wrap),
   aber die Beschriftungen dürfen dabei nicht zerreißen. Auf schmalen
   Schirmen bekommt der Wechsler eine eigene Zeile, statt sich mit dem
   Zahlenfeld um den Platz zu streiten. */
.pe-field--zeile .pe-btn { flex: 0 1 auto; }

@media (max-width: 30em) {
	.pe-field--zeile .pe-field__number { width: 4em; }
	.pe-field--zeile .pe-btn { font-size: .92em; }
}

/* Die Flanke des Rahmens — die Kante, die man bei schrägem Blick sieht.
   ---------------------------------------------------------
   Liegt zwischen Raumfoto und Werk. Vier Punkte in Bühnenkoordinaten,
   gezeichnet als SVG-Polygon; das `viewBox` setzt das Skript auf die
   Bühnengrösse, damit eine Benutzereinheit ein Bühnenpixel ist.

   Kein `pointer-events`: das Werk darüber muss greifbar bleiben, und
   die Flanke ist nichts, was man anfassen können soll. */
.pe-flanken {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	overflow: visible;
	pointer-events: none;
}

/* Liegt ein echter Wandschatten, verschwindet der Filterschatten.
   ---------------------------------------------------------
   Zwei Schatten für ein Werk wären nicht doppelt so gut, sondern
   falsch — und der Filter ist genau der, dessen Perspektive nicht
   stimmt: er sitzt INNERHALB der verzerrten Ebene und wird deshalb
   mitverzerrt wie das Werk. Das heisst Licht senkrecht auf das Bild.

   Es ist bewusst eine Klasse und keine Variable: `applyShadow()`
   schreibt `--pe-shadow` bei jedem Durchgang neu, eine Überschreibung
   dort wäre ein Wettlauf. Und die Klasse räumt sich selbst auf.

   Die Regel gilt auch im Export: `schattenAus()` liest den GERECHNETEN
   Filter, und der ist dann `none`. Ohne Zutun keine zwei Schatten. */
.pe-view__frame.has-wandschatten .pe-frameset { filter: none; }

/* Der Lichtregler — eine Zeile unter dem Maßstab. */
.pe-licht__row {
	display: flex;
	align-items: center;
	gap: .5rem;
	flex-wrap: wrap;
}
.pe-licht__slider { flex: 1 1 8rem; min-width: 6rem; }
.pe-licht__wert {
	min-width: 3.2em;
	text-align: right;
	font-variant-numeric: tabular-nums;
	opacity: .8;
}

/* Die Ausrichtungsbox: zwei Zeilen, beide über die volle Breite.
   ---------------------------------------------------------
   Simon am 26.08.2026: *„Buttons zu schmal und Slider versetzt rechts
   darunter ist unsauber im Layout … Zeile 1: Breite / Maßfeld / Raum
   ausrichten / Werk ausrichten / Zurücksetzen. Zeile 2: „Licht" /
   Slider / XXX° / „i". Beide auf voller Breite der Ausrichtungsbox."*

   Die Ursache war `.pe-field { flex: 1 1 8em }`: beide Felder waren
   gleichberechtigte Flex-Kinder derselben Zeile und teilten sich den
   Platz, statt untereinander zu stehen. Deshalb wurden die Knöpfe
   gequetscht und der Regler rutschte neben das Zurücksetzen.

   `flex-basis: 100%` macht aus jedem Feld eine eigene Zeile. Und die
   Knöpfe schrumpfen nicht mehr: eine Beschriftung, die umbricht, ist
   schlimmer als eine Zeile, die umbricht. */
.pe-field--zeile,
.pe-field.pe-licht {
	flex: 1 1 100%;
	min-width: 0;
}
.pe-field--zeile .pe-btn { flex: 0 0 auto; }

/* Das Maßfeld gibt nach, bevor ein Knopf es tut — es hat sichtbar
   Reserve, eine Beschriftung nicht. */
.pe-field--zeile .pe-field__number { flex: 0 1 auto; }

/* Der Regler nimmt, was übrig bleibt. Das „i" schliesst die Zeile ab
   und braucht dafür kein `margin-left: auto` mehr — es steht ohnehin
   am Ende. */
.pe-licht .pe-raum__info { margin-left: 0; }

/* Das zweite Maßschild — die Höhe, an der linken Kante.
   ---------------------------------------------------------
   Solange niemand eine Zahl eingetragen hat, steht dort eine
   Schätzung. Sie ist leiser gezeichnet: eine geschätzte Zahl soll
   nicht so aussehen wie eine gewusste. Sobald der Besucher tippt,
   verschwindet der Unterschied — dann ist sie gewusst. */
.pe-quad__scale--hoch.ist-geschaetzt { opacity: .62; }
.pe-quad__scale--hoch.ist-geschaetzt:focus-within { opacity: 1; }

/* Die Maßschilder kleiner und ruhiger.
   ---------------------------------------------------------
   Simon am 26.08.2026: *„unnötig viele Punkte in der Maßbox = viel
   Platz, unnötig groß = nicht schön."*

   Die „Punkte" waren die gepunktete Linie unter der Zahl — sie sollte
   sagen „hier kann man tippen" und sagte es die ganze Zeit, auch wenn
   niemand tippen wollte. Ein Hinweis, der dauerhaft da ist, ist kein
   Hinweis mehr, sondern Dekor. Er erscheint jetzt beim Überfahren und
   beim Tippen; dann ist er nützlich.

   Seit es ZWEI Schilder sind, zählt die Größe doppelt: sie liegen im
   Bild und verdecken, wovon sie sprechen. */
.pe-quad__scale {
	gap: .12em;
	padding: .1em .35em;
	font-size: .7em;
	box-shadow: none;
	border-color: rgba(255, 255, 255, .4);
	background: rgba(0, 0, 0, .58);
}
.pe-quad__scale-input { border-bottom-color: transparent; }
.pe-quad__scale:hover .pe-quad__scale-input,
.pe-quad__scale-input:focus {
	border-bottom-color: rgba(255, 255, 255, .55);
}
/* Die Einheit ist die halbe Breite des Schilds und trägt nichts, was
   man nicht schon weiß. Sie bleibt, aber leiser. */
.pe-quad__scale-unit { opacity: .6; }

/* Im verzerrten Zustand laufen die Masse NICHT weich.
   ---------------------------------------------------------
   Simon am 26.08.2026: *„beim Umschalten der Größe werden teilweise
   Rahmenseiten nicht sauber mitgenommen, sondern stehen nur an Ecken
   über … Einmal an einem Regler ziehen holt alles zur sauberen Ansicht
   zurück."*

   Gemessen: beim Formatwechsel springt die Slotbreite sofort auf
   144,30 px, die Höhe läuft aber 0,35 s lang nach — 197,55 sofort,
   209,17 am Ende. `werkWarp()` liest sie am Anfang dieses Übergangs und
   rechnet mit einem Verhältnis von 1,369 statt 1,4496. Die Matrix, die
   Flanke und der Wandschatten stehen dann am alten Mass; erst der
   nächste Reglerzug ruft `applyGeometry()` erneut auf und räumt es.

   Es ist Falle 27 in Grün: nicht die MESSUNG las mitten im Übergang,
   sondern die RECHNUNG. Und hier hilft kein Warten — die Matrix muss
   sofort stimmen.

   Also gibt es im verzerrten Zustand keinen Übergang auf den Massen.
   Ein Werk, das perspektivisch auf einer Wand liegt, soll bei einem
   Formatwechsel ohnehin nicht weich wachsen: es wechselt die Grösse,
   das ist ein Sprung und kein Vorgang. */
.pe-view__frame.is-werkwarp .pe-frameset,
.pe-view__frame.is-werkwarp .pe-frameset__inner,
.pe-view__frame.is-werkwarp .pe-frameset__mount,
.pe-view__frame.is-werkwarp .pe-frameset__paper,
.pe-view__frame.is-werkwarp .pe-frameset__paper::after,
.pe-view__frame.is-werkwarp .pe-frameset__frame {
	transition: none;
}

/* Der Wandabstand so breit wie die Rahmenbreite darüber.
   `.pe-fein--profil` trägt diese Regel seit jeher; mein Regler aus
   2.117.0 hatte keine und fiel deshalb auf die Grundbreite zurück —
   so breit wie das Optionsbild in der linken Spalte. */
.pe-fein--alu { flex: 1 1 100%; }


/* =====================================================================
 * Projektanfrage — Kunstinstallationen (`[pe_projektanfrage]`)
 * ---------------------------------------------------------------------
 * Erbt alles vom Anfrageformular: Rahmen, Felder, Knopf, Meldung. Hier
 * steht nur, was dort noch nicht vorkam — Auswahlfelder, Kästchengruppen
 * und die zweispaltige Reihe für kurze Angaben.
 *
 * Der Block steht am ENDE der Datei, nicht neben `.pe-anfrage`. Grund
 * ist Falle 5: die Feldregel dort trägt `width: 100%` für `input` und
 * `textarea`, und meine Kästchen müssten sie überschreiben. Am Ende
 * gewinnen sie bei gleicher Spezifität ohne `!important`.
 * ================================================================== */

/* Ein Auswahlfeld ist ein Feld wie jedes andere.
 *
 * `.pe-anfrage__zeile input` weiter oben trifft `select` NICHT — ohne
 * diese Regel steht mitten im Formular ein Systemwidget in
 * Systemfarben: helle Fläche, dunkle Schrift, während alles daneben
 * dunkel ist. Deshalb dieselben Werte, zweistufig wie das Original,
 * damit sie gegen eine Themenregel bestehen.
 *
 * `appearance: none` nimmt dem Feld den Systempfeil; er kommt als
 * eigener zurück, sonst sieht ein leeres Auswahlfeld wie ein Textfeld
 * aus und niemand klickt es an. */
.pe-anfrage__zeile select,
.pe-anfrage__form .pe-anfrage__zeile select {
	width: 100%;
	padding: .7em 2.4em .7em .85em;
	border: 1px solid var(--pe-anf-rand);
	border-radius: 2px;
	background-color: rgba(255, 255, 255, .07);
	color: #f0f0f0;
	font: inherit;
	font-size: max(1rem, 16px);
	appearance: none;
	-webkit-appearance: none;
	background-image: linear-gradient(45deg, transparent 50%, currentColor 50%),
	                  linear-gradient(135deg, currentColor 50%, transparent 50%);
	background-position: calc(100% - 1.15em) 1.15em, calc(100% - .85em) 1.15em;
	background-size: .3em .3em, .3em .3em;
	background-repeat: no-repeat;
}
.pe-anfrage__zeile select:focus-visible {
	outline: 2px solid currentColor;
	outline-offset: 2px;
}
/* Die aufgeklappte Liste malt das Betriebssystem, nicht wir. Ohne diese
   Zeile erbt sie in Firefox die helle Schrift und steht weiss auf
   weiss. */
.pe-anfrage__zeile select option {
	background: #1f1f22;
	color: #f0f0f0;
}

/* --- Kästchengruppen ------------------------------------------------
 * `<fieldset>` bringt in vielen Themes einen eigenen Rahmen und eigene
 * Abstände mit. Beides wird zurückgesetzt: die Gruppe soll aussehen wie
 * eine Formularzeile, nicht wie ein Kasten im Kasten. */
.pe-anfrage__gruppe {
	margin: 0 0 1.5rem;
	padding: 0;
	border: 0;
	min-width: 0;   /* sonst schrumpft ein fieldset nicht unter seinen Inhalt */
}
.pe-anfrage__legende {
	display: block;
	padding: 0;
	margin: 0 0 .6em;
	font-size: .82em;
	letter-spacing: .04em;
	text-transform: uppercase;
	opacity: .7;
}
.pe-anfrage__wahlen {
	display: grid;
	gap: .55em;
}
.pe-anfrage__wahl {
	display: flex;
	align-items: flex-start;
	gap: .65em;
	font-size: .95em;
	line-height: 1.45;
	cursor: pointer;
}
/* Ohne diese Regel greift `.pe-anfrage__zeile input { width: 100% }`
   zwar nicht (die Zeile fehlt hier), wohl aber manche Themenregel für
   `input`. Zweimal Klasse, damit sie hält. */
.pe-anfrage__wahl input,
.pe-anfrage__form .pe-anfrage__wahl input {
	flex: 0 0 auto;
	width: auto;
	min-width: 0;
	margin: .25em 0 0;
	accent-color: currentColor;
}
.pe-anfrage__wahl input:focus-visible {
	outline: 2px solid currentColor;
	outline-offset: 2px;
}

/* --- Zwei kurze Angaben nebeneinander -------------------------------
 * Ort, Phase, Maß, Zeitrahmen und die vier Kontaktfelder sind kurz. In
 * einer Spalte untereinander wird das Formular so lang, dass der
 * Absendeknopf zweimal außer Sicht gerät — und ein Formular, dessen Ende
 * man nicht sieht, wirkt aufwendiger, als es ist.
 *
 * `1fr 1fr` statt Flexbox: Flexbox definiert keine Spalten. Das ist die
 * Erkenntnis aus vier gescheiterten Anläufen an der Spaltenausrichtung,
 * und sie gilt hier genauso. */
.pe-anfrage__paar {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 0 1rem;
}
.pe-anfrage__paar > .pe-anfrage__zeile { min-width: 0; }

/* Auf schmalen Schirmen eine Spalte. 34rem, weil zwei Felder mit je
   16px Schrift darunter enger stehen, als sich noch lesen lässt. */
@media (max-width: 34rem) {
	.pe-anfrage__paar { grid-template-columns: 1fr; }
}

/* Die kleine Zeile unter einem Feld — Begründung, Beispiel, Hinweis.
   Dieselbe Zurückhaltung wie `.pe-anfrage__hinweis`, aber näher am
   Feld, zu dem sie gehört. */
.pe-anfrage__mini {
	margin: -.4rem 0 1.25rem;
	font-size: .82em;
	opacity: .6;
	line-height: 1.5;
}
.pe-anfrage__gruppe .pe-anfrage__mini { margin: .6rem 0 0; }

/* --- Die Breite gehoert dem Bricks-Container, nicht mir -------------
 *
 * Simon am 28.08.2026: *„Formular darf noch breiter sein gerne, dann hab
 * ich für paddings etc innerhalb Bricks Container volle Kontrolle."*
 *
 * Vorher galt `max-width: 52rem` aus dem Block oben. Das war doppelt
 * unglücklich:
 *
 *   1. Es hat mit dem Bricks-Container um dieselbe Zuständigkeit
 *      gestritten. Wer im Builder die Breite einstellt, soll sie auch
 *      bekommen.
 *   2. **`rem` misst hier nicht, was man denkt.** Das Theme setzt
 *      `html { font-size: 12px }` — am 28.08. auf der echten Seite
 *      gemessen. 52rem sind damit **624 px**, nicht 832. Die auto-Ränder
 *      standen bei `24px 408px`: das Formular nahm knapp die Hälfte
 *      dessen, was der Container hergab. Zum Vergleich der Fliesstext
 *      derselben Seite: 1148 px.
 *
 * Deshalb gibt der Block hier beides ab — Breite und Aussenabstand.
 * `.pe-anfrage--projekt` und `.pe-anfrage--vortrag` nehmen jetzt genau
 * das, was der Container ihnen lässt. Dieselbe Übergabe, die `.pe-werk .pe-anfrage` weiter oben schon
 * macht, wo die Werkseite die Breite bestimmt.
 *
 * Es gibt danach KEINE Lesebreite mehr aus dem Plugin. Bei 1440 px
 * Container wird das Nachrichtenfeld 1440 px breit — das ist Absicht und
 * Simons Entscheidung, und es ist im Builder in einem Zug zu regeln. */
.pe-anfrage--projekt,
.pe-anfrage--vortrag {
	max-width: none;
	margin: 0;
}

/* Der Auslöser ist `display: inline-flex` — also ein Inline-Kasten in
 * einem Block. Damit richtet ihn `text-align` des Containers aus, und
 * Simon kann ihn in Bricks über *Typografie › Textausrichtung* mittig
 * setzen, ohne dass eine Zeile CSS dazukommt.
 *
 * Was dabei NICHT mitwandern darf, ist der Inhalt des Formulars:
 * `text-align` erbt, und zentrierte Feldbeschriftungen über
 * linksbündigen Feldern sind kein Entwurf, sondern ein Unfall. Der
 * Formularkörper verankert sich deshalb selbst.
 *
 * Die Meldung („Vielen Dank …") steht ausserhalb des Formulars und folgt
 * dem Container weiterhin — bei einem zentrierten Knopf ist eine
 * zentrierte Bestätigung richtig. */
.pe-anfrage__form { text-align: start; }


/* =========================================================
 * Am Finger, am Telefon, an der Tastatur
 * ---------------------------------------------------------
 * Dieser Block steht am ENDE der Datei, weil jede Regel darin eine
 * frühere überschreiben soll (Falle 5). Er sammelt, was aus dem
 * iOS-Voraudit vom 27.08.2026 und der Messrunde vom 29.08.2026 an
 * Nachbesserungen übrig blieb.
 * ======================================================= */

/* --- Weichzeichner nur, wo er nicht stört ---------------
 *
 * Zwei Stellen tragen `backdrop-filter: blur(5px)`: der Knopf am
 * Portfoliobild und der Ladeknopf in der Ansicht. Auf iOS ist ein
 * Hintergrund-Weichzeichner teuer — er zwingt den Compositor, bei jedem
 * Bild die Fläche darunter neu zu lesen —, und im Energiesparmodus
 * kostet er sichtbar Bildrate.
 *
 * Abschalten lässt er sich hier trotzdem nicht pauschal: es gibt keine
 * Medienabfrage für „schwache GPU", und die Wirkung ist Simons
 * ausdrückliche Bestellung („wie KONTAKT und MENÜ").
 *
 * Was es gibt, ist die Einstellung, mit der ein Besucher genau das
 * sagt: *Transparenz reduzieren* — auf iOS unter Bedienungshilfen ›
 * Anzeige & Textgröße, und dieselbe Einstellung, die
 * `prefers-reduced-transparency` meldet. Wer sie gesetzt hat, bekommt
 * eine deckende Fläche statt des Weichzeichners. Das ist keine
 * Notlösung für langsame Geräte, sondern die Antwort auf eine Ansage —
 * und sie nimmt nebenbei genau denen die teure Fläche ab, die sie am
 * ehesten aus Not eingeschaltet haben.
 *
 * Die Deckung steigt dabei mit, sonst bliebe ein Knopf mit 20 Prozent
 * Deckung ohne Weichzeichner auf einem unruhigen Foto unlesbar. */
@media (prefers-reduced-transparency: reduce) {
	.pe-ov__knopf,
	.pe-view__laden {
		backdrop-filter: none;
		-webkit-backdrop-filter: none;
	}
	.pe-ov__knopf  { background: rgba(15, 15, 15, .72); }
	.pe-view__laden { background: rgba(15, 15, 15, .78); }
}

/* --- 44 Pixel, auch dort, wo es bisher 40 waren --------
 *
 * Die Untergrenze steht schon zweimal in dieser Datei begründet („44
 * sind die Untergrenze, die im ganzen Konfigurator gilt") und ist am
 * „i" der Ausführungskarten und am Ladeknopf über eine gewachsene
 * TREFFERFLÄCHE gelöst — der sichtbare Kreis blieb klein.
 *
 * Hier geht das nicht. Die Optionszeilen der Feinabstimmung stehen ohne
 * Abstand untereinander; eine Trefferfläche, die über die Zeile
 * hinauswächst, überlappte die Nachbarzeile, und in der Naht träfe der
 * Finger die falsche Option. Bei den Formularfeldern wäre es genauso.
 *
 * Also wachsen hier die Kästen selbst — und nur am Finger, damit die
 * Maus-Fassung bleibt, wie Simon sie abgenommen hat.
 *
 * Gemessen am 29.08.2026, 390 × 844 mit Touch, vorher/nachher in
 * derselben Sitzung: `.pe-choice` 40 → 44 px, die Textfelder des
 * Anfrageformulars 42 → 44 px. */
@media (pointer: coarse) {
	/* +2px oben und unten auf die vorhandenen .28em. Nicht `min-height`:
	   die Zeile ist ein Flex-Kasten mit `align-items: flex-start`, und
	   eine Mindesthöhe hinge den Text an die Oberkante statt ihn mittig
	   zu lassen. Bei den mehrzeiligen Optionen (Schattenfuge, gesperrte
	   mit Begründung) kommen dieselben 4 px oben drauf und stören
	   nicht. */
	.pe-choice {
		padding-top: calc(.28em + 2px);
		padding-bottom: calc(.28em + 2px);
	}

	.pe-anfrage__zeile input,
	.pe-anfrage__zeile textarea,
	.pe-anfrage__form .pe-anfrage__zeile input,
	.pe-anfrage__form .pe-anfrage__zeile textarea,
	/* Und das Mass des Wunschformats — dasselbe Bild, andere Klasse.
	   Es steht in `.pe-aus__frei-feld` und wurde vom ersten Anlauf
	   nicht getroffen: 81 × 34 px, gemessen am 29.08.2026, nachdem die
	   Klappe ueber die Leertaste aufgegangen war. Genau die Sorte
	   Steuerung, die man beim Zaehlen uebersieht, weil sie erst
	   erscheint, wenn jemand sie aufruft. */
	.pe-aus__frei-feld input {
		min-height: 44px;
	}
	/* Die Auswahlbox ist kein Textfeld — sie hat ihre eigene Grösse und
	   sitzt in einer Zeile, deren LABEL der Treffer ist (gemessen 205 ×
	   81 und 205 × 135 px). Eine Mindesthöhe würde sie nur verzerren. */
	.pe-anfrage .pe-anfrage__zeile--haken input { min-height: 0; }

	/* „Seiten einzeln einstellen" ist auch ein Label um eine Auswahlbox
	   — nur eines, dessen Text in EINE Zeile passt. Damit misst es 27 px
	   statt der 135 der beiden langen Sätze im Anfrageformular; gemessen
	   am 29.08.2026 bei 390 und bei 768. Bei 320 fällt es nicht auf,
	   weil der Text dort umbricht und die Zeile von selbst hoch genug
	   wird — genau die Sorte Steuerung, die eine Messung an einer
	   einzigen Breite durchrutschen lässt. */
	.pe-fein__einzeln { min-height: 44px; }
}

/* --- Die Raumvorschau am Finger ------------------------
 *
 * Der Befund vom 29.08.2026, 390 × 844 mit Touch, mit einem eigenen
 * Foto geladen — also in dem Zustand, in dem die Ausrichtung überhaupt
 * erscheint. Gemessen wurde die volle Trefferfläche einschliesslich
 * gewachsener Pseudoelemente:
 *
 *   Ecke 1–4                    40 × 40
 *   Breite/Höhe im Bild         26 × 18
 *   Entfernen am Vorschaubild   24 × 24
 *   Zahlenfeld                  68 × 34
 *   „Raum ausrichten"          165 × 20
 *   „Werk ausrichten"          159 × 20
 *   „Zurücksetzen"              40 × 40
 *   Lichtregler                116 × 16
 *
 * **Es ist ein Fehler, nicht acht.** Alle diese Masse stehen in `em`,
 * und die Schriftgrösse dieses Bereichs ist auf dem Telefon kleiner als
 * am Schreibtisch. Am Schreibtisch stimmen dieselben Zeilen — der
 * Kommentar an `.pe-btn--symbol` rechnet mit „2,2em ≈ 44 px bei
 * 20px-Kontext", und genau das ist der Punkt: der Kontext ist auf dem
 * Telefon 18 px, und aus den 44 werden 40. Eine Mindestgrösse für den
 * Finger darf nicht an der Schriftgrösse hängen — derselbe Satz steht
 * schon einmal in dieser Datei, am „i" der Ausführungskarten.
 *
 * Deshalb hier Pixel, und nur am Finger. Am Zeiger bleibt jede Zeile,
 * wie Simon sie abgenommen hat.
 *
 * Zwei Wege, wie überall in dieser Datei:
 *   — Wo der Kasten wachsen darf, wächst der Kasten (`min-height`).
 *   — Wo er das Bild verstellen würde, wächst nur die Trefferfläche
 *     über ein `::after`. Das geht allerdings NICHT an einem `<input>`:
 *     ein ersetztes Element hat keine Pseudoelemente. Dort bleibt nur
 *     der Kasten.
 * ------------------------------------------------------- */
@media (pointer: coarse) {

	/* Die vier Ecken: der Kreis bleibt, die Fläche wächst.
	 *
	 * Der Griff liegt auf dem Foto, und ein grösserer Kreis verdeckt
	 * mehr von der Wand, die man gerade markiert. −2px rundum reichen
	 * für 44, und weil die vier Griffe unabhängig voneinander sitzen,
	 * überlappt dabei nichts, was jemand treffen wollte. */
	.pe-quad__handle::after {
		content: '';
		position: absolute;
		inset: -2px;
	}

	/* Das Massschild auf der Markierung. Hier hilft kein
	   Pseudoelement — es ist ein `<input>`. Also wächst das Feld, und
	   das Schild darum herum wächst mit. Es steht auf der Unterkante der
	   Markierung und verdeckt dort nichts, was man beim Ausrichten
	   ansieht. */
	.pe-quad__scale-input {
		min-height: 44px;
		/* `min-width: 2ch` steht in der Grundregel — zwei Ziffern breit.
		   Am Finger sind das 26 px, gemessen; die Höhe allein macht
		   daraus keinen Treffer. */
		min-width: 44px;
	}
	/* Und das Schild darf davon NICHT doppelt so gross werden.
	 *
	 * Der erste Anlauf setzte nur die Feldhöhe — das Schild wuchs
	 * daraufhin auf 88 px und legte sich als graue Platte über das Foto,
	 * auf dem man gerade eine Wand markiert. Ursache ist
	 * `align-items: baseline`: die Einheit „cm" richtet sich an der
	 * Grundlinie eines jetzt 44 px hohen Feldes aus, und die Zeile wird
	 * so hoch wie beides zusammen.
	 *
	 * Mittig ausgerichtet und ohne eigenes Polster oben und unten misst
	 * das Schild genau das Feld — 44 px plus Rand. Die Trefferfläche
	 * bleibt, die Platte ist weg. */
	.pe-quad__scale {
		align-items: center;
		padding-block: 0;
	}

	/* Das × am Vorschaubild wächst nach OBEN und nach RECHTS.
	 *
	 * Nach innen darf es nicht: dann läge es über dem Bild, und ein
	 * Tipp auf die obere rechte Ecke des Vorschaubildes löschte das
	 * Foto, statt es zu wählen. Genau davor warnt der Kommentar an
	 * `.pe-thumb-wrap` seit 2.43.0. Oben und rechts ist Luft — dort
	 * liegt der Abstand zum nächsten Bild. */
	.pe-thumb__remove::after {
		content: '';
		position: absolute;
		inset: -20px -20px 0 0;
	}

	/* Zahlenfeld, Regler und die beiden Ausrichtknöpfe: hier darf der
	   Kasten wachsen, sie stehen in der Steuerspalte und nicht im Bild.
	   Alle auf denselben Wert, damit die Zeile aus Feld und Knopf
	   weiterhin auf einer Linie steht — `.pe-field__row` streckt ihre
	   Kinder, und ein Knopf, der 44 fordert, während das Feld daneben
	   34 behält, macht aus der Zeile eine Treppe. */
	.pe-field__number,
	.pe-field__range,
	.pe-licht__slider,
	.pe-btn--small { min-height: 44px; }

	/* Der Zurücksetzen-Knopf ist quadratisch und trägt nur ein Zeichen —
	   er braucht die Breite genauso wie die Höhe. */
	.pe-btn--symbol {
		min-width: 44px;
		min-height: 44px;
	}
}

/* Der Lichtregler ist ein nacktes `<input type="range">`: er trägt
 * `.pe-licht__slider` und NICHT `.pe-field__range`, hat deshalb nie
 * deren Kastenhöhe und nie deren Fokusring bekommen. Am 29.08.2026
 * gemessen: 116 × 16 px, also die Vorgabe des Browsers.
 *
 * Beides wird hier nachgeholt. Die Höhe steht oben im Finger-Block, der
 * Ring hier — er gilt auch am Zeiger, denn eine Tastatur gibt es dort
 * ebenso. */
.pe-licht__slider {
	accent-color: currentColor;
	cursor: pointer;
}
.pe-licht__slider:focus-visible { outline: 2px solid currentColor; outline-offset: 2px; }

/* --- Das Massschild an der Tastatur --------------------
 *
 * `:focus` setzte `outline: none` und liess als einziges Zeichen den
 * gepunkteten Unterstrich weiss werden. Auf einem Foto ist das wenig:
 * ein heller Strich auf hellem Grund ist keiner. Der Unterstrich bleibt
 * — er gehört zum Entwurf —, aber wer mit der Tastatur hierher kommt,
 * bekommt zusätzlich einen Ring. `:focus-visible` und nicht `:focus`,
 * damit beim Antippen nichts aufblitzt, was dort nicht hingehört. */
.pe-quad__scale-input:focus-visible {
	outline: 2px solid #fff;
	outline-offset: 2px;
}

/* =====================================================================
 * Das Telefon — Platz zurückholen
 * ---------------------------------------------------------------------
 * Simon am 30.08.2026, nach dem mobilen Durchgang: *„allgemein darf
 * mobil im Overlay das Padding innerhalb des Overlay kleiner sein. Wir
 * verlieren sonst Platz durch die Overlay-Box + den Platz des Paddings
 * innerhalb = Werk und Raum werden sehr klein."*
 *
 * Im Klon bei 390 px gemessen, vorher:
 *
 *     Dialog                x=23  b=344      Rand 23 je Seite
 *     .pe-ov__inhalt        x=24  b=342      Polster 15,6 seitlich
 *     .pe-aus__titel        x=40  b=311      der Text
 *     .pe-view__bar         x=55  b=281      15 px WEITER eingerückt
 *
 * Die dritte und vierte Zeile sind Simons zweite Beobachtung: *„Der Text
 * unter dem Werk + Buttons hat sichtbar geringeres Padding links als
 * Werk + Buttons."* Das kommt aus `--pe-view-pad` — die Bühne trägt ihr
 * eigenes Polster INNERHALB des schon gepolsterten Inhalts. Zweimal
 * Rand für dieselbe Kante.
 *
 * Drei Schnitte, alle drei am selben Platz beteiligt: der Rand des
 * Dialogs, das Polster des Inhalts, das Polster der Bühne. Zusammen
 * geben sie der Bühne rund 78 px zurück — bei 390 px Schirm ein Viertel
 * mehr Werk.
 * ================================================================== */
@media (max-width: 767px) {

	/* 1) Der Dialog rückt an den Rand.
	 *
	 * `width` allein genügt nicht: das Browser-Stylesheet setzt auf
	 * jedem `<dialog>` ein `max-width: calc(100% - 6px - 2em)`. Bei
	 * 20 px Schriftgröße sind das 46 px, und die 96vw wurden davon auf
	 * 344 px gedeckelt — gemessen, bevor diese Zeile dazukam. */
	.pe-ov__dialog { width: 96vw; max-width: 96vw; margin-inline: 2vw; }

	/* 2) Ein Polster für alles, und zwar ein kleineres als das, was der
	 *    Text bisher hatte. Oben bleibt mehr Luft — dort sitzt das
	 *    Schliesskreuz, und der Titel darf nicht darunter laufen. */
	.pe-ov__inhalt { padding: 2.6rem .6rem 1.2rem; }

	/* 3) Die Bühne hört auf, ein zweites Mal einzurücken. Damit stehen
	 *    Werk, Knöpfe und Text auf derselben Kante.
	 *
	 * **Nur im Overlay.** Die 15 px kommen aus `--pe-mobile-pad`
	 * (`@media (max-width: 700px)`, weiter oben) und sind auf der
	 * Kunstdruckseite richtig: dort steht `.pe-view` unmittelbar auf der
	 * Seite und braucht seinen Seitenabstand selbst. Im Overlay gibt ihn
	 * schon `.pe-ov__inhalt` — zweimal Rand für dieselbe Kante. */
	.pe-ov__inhalt .pe-view { --pe-view-pad: 0; --pe-mobile-pad: 0; }

	/* Und auf der Kunstdruckseite genauso.
	 *
	 * Erst war das hier ausgenommen, mit der Begruendung, dort stehe
	 * `.pe-view` unmittelbar auf der Seite und brauche seinen Rand
	 * selbst. Am 30.08.2026 nachgemessen: **stimmt nicht.** Der
	 * Bricks-Container darum traegt bereits 7,8 px, und die 15 px
	 * darauf erzeugen dieselbe Stufe wie im Overlay —
	 *
	 *     Titel   x=8   b=374
	 *     Buehne  x=23  b=344
	 *
	 * Simon: *„auf Kunstdrucke … ist das Padding noch wie vorher
	 * beschrieben … zieh das Padding auch fuer den Kunstdruck
	 * Konfigurator nach."*
	 *
	 * `padding-inline`, nicht die Variable: `--pe-mobile-pad` gilt auch
	 * fuer `.pe-group`, und dort ist der Rand richtig. Wer die Variable
	 * nullt, nimmt ihn an einer Stelle mit, die niemand gemeint hat. */
	.pe-view { padding-inline: 0; }

	/* Und der Werkblock der Signature-Seiten dazu.
	 *
	 * `[pe_werk]` ist ein eigener Renderer, nicht `[pe_konfigurator]` —
	 * und blieb deshalb bei den beiden vorigen Runden aussen vor. Simon
	 * am 30.08.2026: *„Live finde ich auch das Padding in den
	 * Werkseiten ‚Konfigurator' noch nicht angepasst … damit alle
	 * Layouts gleich aussehen?"* Nein, hatte ich nicht — hier ist es.
	 *
	 * Der Block trägt Rahmen und Fläche, das Polster darf also nicht
	 * ganz verschwinden; es wird nur eng. Gemessen bei 472 px: 14,2 px
	 * rundum, danach 8. */
	.pe-werk { padding: .65rem; }

	/* Knöpfe enger. `Werkansicht · Raumvorschau · Vollbild` brauchten
	 * zusammen 375 px und standen deshalb in zwei Zeilen; mit dem
	 * gewonnenen Platz und diesem Polster sind es rund 336 bei 359
	 * verfügbaren — eine Zeile. */
	.pe-btn { padding: 0 .7em; }

	/* Die Ausführungskarten. Drei nebeneinander wären auf einem
	 * Telefon keine Wahl mehr, sondern drei Türme aus Silben: bei
	 * 359 px blieben je 113 px, und „kompromisslos und geschützt"
	 * bricht darin in fünf Zeilen. Sie bleiben zweispaltig und
	 * bekommen nur weniger Polster. */
	.pe-aus__karte { padding: .65em .7em; gap: .3em; }

	/* Die Formate dagegen passen in eine Zeile: „140 × 93" misst rund
	 * 52 px, mit diesem Polster 69 — vier davon plus Fugen bleiben
	 * unter den verfügbaren 359. */
	.pe-aus__groessen { grid-template-columns: repeat(auto-fit, minmax(4.5rem, 1fr)); }
	.pe-aus__groesse  { padding: .55em .35em; }
}

/* Der Wert bricht nicht zwischen Zahl und Einheit.
 * ---------------------------------------------------------------------
 * `.pe-fein__kopf` stellt Titel und Wert nebeneinander. Stehen zwei
 * Regler nebeneinander — LINKS und RECHTS —, ist jede Hälfte so schmal,
 * dass „80 mm" umbricht: die 80 blieb oben, das mm rutschte unter den
 * Titel. Simon am 30.08.2026 im Screenshot festgehalten.
 *
 * Ohne Medienabfrage: ein Maß, das zwischen Zahl und Einheit bricht,
 * ist auf jedem Schirm falsch. */
.pe-fein__wert { white-space: nowrap; }

/* Die Auszeichnung — dieselbe Zeile wie die Werkklasse, eine Stufe
   leiser. Sie steht unter dem Zeichen, weil sie dasselbe tut: den Preis
   begründen. Ein eigenes „i" braucht sie nicht — der Text IST die
   Begründung. */
.pe-aus__award {
	margin: 0 0 .4rem;
	font-size: .82em;
	line-height: 1.4;
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	gap: .5em;
	min-width: 0;
}
.pe-aus__award-titel {
	letter-spacing: .06em;
	text-transform: uppercase;
	font-size: .92em;
}
.pe-aus__award-text { opacity: .7; }

/* In der Preisspalte gilt fuer sie dasselbe wie fuer den Klassenkasten:
   sie darf die Spalte nicht breiter machen. */
.pe-view__price .pe-aus__award { width: 0; min-width: 100%; }

/* =====================================================================
 * Die Werkklasse — das Zeichen über dem Preis
 * ---------------------------------------------------------------------
 * Philipp am 30.08.2026: *„Eines ist 50000 € das andere 2000 €. Ist sehr
 * verwirrend und schreckt ab."* Gemessen stimmte es: bei drei von vier
 * Klassen stand auf der Seite kein Wort dazu.
 *
 * Ein `<details>`, kein Skript — dieselbe Wirkung wie das „i" an den
 * Ausführungskarten, aber auch ohne JavaScript bedienbar.
 * ================================================================== */
.pe-klasse {
	margin: 0 0 .4rem;
	font-size: .82em;
	line-height: 1.4;
}

.pe-klasse__kopf {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	gap: .5em;
	cursor: pointer;
	list-style: none;
	/* Das Dreieck des Browsers weg — hier steht ein „i". */
	padding: 0;
}
.pe-klasse__kopf::-webkit-details-marker { display: none; }
.pe-klasse__kopf::marker { content: ''; }

.pe-klasse__name {
	letter-spacing: .06em;
	text-transform: uppercase;
	font-size: .92em;
}

/* Der Kurzsatz trägt die Erklärung schon halb, ohne dass jemand tippen
   muss. Gedämpft, damit er den Namen nicht überstimmt. */
.pe-klasse__kurz { opacity: .6; }

/* Die Verfügbarkeit ist eine gerechnete Aussage — deshalb darf sie
   auffallen. Erfundene Knappheit verbietet Masterentscheidung 11; diese
   Zahl kommt aus Auflage minus verkauft minus reserviert. */
.pe-klasse__verf {
	opacity: .85;
	border-left: 1px solid currentColor;
	padding-left: .6em;
}

/* Verfuegbarkeit und „i" halten zusammen — und zwar in einer eigenen
 * Zeile.
 *
 * Vorher lagen beide als lose Geschwister im umbrechenden Kopf. Wo der
 * Bruch faellt, entschied damit der Platz, und bei mittlerer Spaltenbreite
 * fiel er zwischen die beiden: Zeile 1 endete mit „… verfuegbar", Zeile 2
 * trug nur noch das „i". Simon am 31.08.2026 gemeldet.
 *
 * `flex: 0 0 100%` heisst „eine ganze Zeile fuer mich" — der Umbruch ist
 * damit nicht mehr eine Folge der Breite, sondern eine Ansage.
 *
 * Ohne Verfuegbarkeit fehlt `--eigen`, und das „i" bleibt in Zeile 1. */
.pe-klasse__zeile2 {
	display: inline-flex;
	align-items: baseline;
	gap: .5em;
}
.pe-klasse__zeile2--eigen { flex: 0 0 100%; }

/* Der senkrechte Strich trennte „Limitiert und nummeriert" von
   „verfuegbar". In einer eigenen Zeile trennt er nichts mehr. */
.pe-klasse__zeile2--eigen .pe-klasse__verf {
	border-left: 0;
	padding-left: 0;
}

.pe-klasse__i {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 1.5em;
	height: 1.5em;
	border: 1px solid currentColor;
	border-radius: 50%;
	font-style: italic;
	font-size: .85em;
	opacity: .65;
	flex: 0 0 auto;
}
.pe-klasse__kopf:hover .pe-klasse__i,
.pe-klasse[open] .pe-klasse__i { opacity: 1; }
.pe-klasse__kopf:focus-visible { outline: 2px solid currentColor; outline-offset: 2px; }

/* Zugeklappt heisst zugeklappt — ausdruecklich.
 *
 * Ein `<details>` verbirgt seine Kinder nur, solange das `summary` seine
 * Vorgabedarstellung behaelt. Das hier steht auf `display: flex`, damit
 * Name, Kurzsatz, Verfuegbarkeit und „i" in einer Zeile stehen — und
 * damit greift die Automatik nicht mehr. Am 31.08.2026 gemessen:
 * `open=false`, Text trotzdem 169 px hoch und sichtbar.
 *
 * Also von Hand. Eine Zeile gegen einen Fall, den man sonst erst auf der
 * fertigen Seite sieht. */
.pe-klasse:not([open]) .pe-klasse__text { display: none; }

.pe-klasse {
	/* Ohne das hier waechst die Spalte mit dem Kasten mit statt ihn
	 * umzubrechen — die Vorgabe `min-width: auto` eines Flex- oder
	 * Rasterkindes. */
	min-width: 0;
}

.pe-klasse__text {
	margin-top: .5em;
	padding: .7em .8em;
	border-left: 2px solid currentColor;
	background: var(--pe-aus-flaeche, rgba(128, 128, 128, .10));
	/* NICHT `44em`.
	 *
	 * Das waren 685 px, und die linke Spalte im Overlay ist schmaler:
	 * am 31.08.2026 gemessen lief der aufgeklappte Kasten von 276 bis
	 * 962 px und damit quer ueber die rechte Spalte. Eine feste
	 * Lesebreite taugt nur dort, wo die Spalte breiter ist als sie. */
	max-width: 100%;
}
.pe-klasse__text p { margin: 0; }

/* Der gemeinsame Satz steht in JEDEM Kasten gleich — er ist die
   eigentliche Antwort auf „warum kostet das so viel". Abgesetzt, damit
   man ihn als das erkennt, was er ist: die Regel hinter allen vier. */
.pe-klasse__gemeinsam {
	margin-top: .5em !important;
	opacity: .7;
	font-style: italic;
}

/* =====================================================================
 * Die Reihenfolge am Telefon
 * ---------------------------------------------------------------------
 * Simon am 31.08.2026, nach dem mobilen Durchgang. Gemessen war die
 * Reihenfolge bei 390 px:
 *
 *     Ansichtsknöpfe · Thumbleiste · Regler · Anfragen · MwSt ·
 *     „Ihre Fotos bleiben…" · Außenmaß · Werkklasse · PREIS · Titel …
 *
 * Der Preis stand an neunter Stelle, die Steuerangabe vier Zeilen über
 * ihm ohne Bezug, und dazwischen ein Datenschutzsatz. Gewollt ist:
 *
 *     Anfragen · Preis · MwSt · Werkklasse · Thumbleiste · Regler
 *
 * **Warum das eine Abflachung braucht.** Die sechs Zeilen liegen in ZWEI
 * Behältern: `.pe-view__actions` trägt Knöpfe, MwSt und den
 * Anfragen-Knopf, `.pe-raum__zeile` trägt Werkklasse und Preis. `order`
 * wirkt nur unter Geschwistern desselben Flexbehälters — und die
 * gewünschte Folge verzahnt beide.
 *
 * Also wird `.pe-raum` zum Flexbehälter und alles dazwischen auf
 * `display: contents` gesetzt. Damit stehen die Zeilen als Geschwister
 * nebeneinander und lassen sich sortieren. `display: contents` nimmt
 * den Zwischenbehältern ihre eigene Darstellung — hier ist das
 * unschädlich, sie tragen auf schmalen Schirmen ohnehin keine Fläche,
 * keinen Rahmen und (seit 2.150.1) kein Polster mehr.
 * ================================================================== */
@media (max-width: 767px) {

	.pe-raum {
		display: flex;
		flex-direction: column;
		gap: .9rem;
	}

	/* Die Zwischenebenen verschwinden als Kästen und geben ihre Kinder
	 * an `.pe-raum` weiter. */
	.pe-raum__buehne,
	.pe-raum > .pe-raum__buehne > .pe-view,
	.pe-view__actions,
	.pe-view__barcol,
	.pe-raum__zeile { display: contents; }

	/* Und jetzt die Reihenfolge, die Simon aufgeschrieben hat. */
	.pe-view__frame    { order: 1; }
	.pe-view__bar      { order: 2; }
	.pe-view__meldung  { order: 3; }
	/* `.pe-view__price` traegt seit 2.157.2 den Knopf UND den Preis samt
	 * MwSt und Werkklasse — das Skript haengt sie dort ein, damit die
	 * Reihenfolge auch am Schreibtisch stimmt und nicht nur hier. Die
	 * drei brauchen deshalb keine eigene Sortierung mehr. */
	.pe-view__price    { order: 4; }
	.pe-view__thumbs   { order: 5; }
	.pe-view__hint     { order: 6; }
	.pe-view__controls { order: 7; }

	/* „Ihre Fotos bleiben auf Ihrem Gerät" stand bis 2.157.3 auf
	 * `order: 99`, ganz am Ende des Bühnenblocks — der Satz war Simon
	 * dort *„immer noch schrecklich"*. Seit 2.158.0 steht er, wo er
	 * hingehört: direkt unter der Thumbleiste, deren Fotos er erklärt.
	 * Der Umzug im Markup ist mitgemacht (`pe-configurator.js`), die
	 * Sortierung hier folgt ihm nur nach. */

	/* Die Preiszeile stand als eigener Absatz mit Innenabstand da; als
	 * Flexkind in der Reihe braucht sie ihn nicht mehr. */
	.pe-aus__preis { margin: 0; }
}

/* =====================================================================
 * Signature-Werkseite: dieselbe Reihenfolge am Telefon
 * ---------------------------------------------------------------------
 * Simon am 31.08.2026: *„Bei Schattenjäger und den anderen Signature
 * works greift die Umsortierung aber noch nicht. Desktop darf weiter
 * unverändert gelayoutet sein."*
 *
 * Gemessen war es dort bei 390 px so — die ganze Angabenliste stand VOR
 * dem Werk:
 *
 *     Angabenliste · Verfügbarkeit · Preis · Werkklasse ·
 *     BÜHNE · Ansichtsknöpfe · Thumbleiste · Regler · Fotohinweis
 *
 * Der Block ist anders gebaut als der Konfigurator: der Preis steht in
 * einer `<dl>`, nicht in `.pe-aus__preis`, und den Anfragen-Knopf gibt
 * es als eigene Klappe am Ende. Deshalb eine eigene Regel statt einer
 * gemeinsamen — dieselbe Reihenfolge, andere Bauteile.
 *
 * Abgeflacht wird hier eine Ebene mehr: die `<dl>` gibt ihre `dt`/`dd`
 * frei, damit Preis und Werkklasse zwischen die Knöpfe und die
 * Thumbleiste passen. Auf dem Schreibtisch bleibt sie ein Raster.
 * ================================================================== */
@media (max-width: 767px) {

	.pe-werk {
		display: flex;
		flex-direction: column;
		gap: .9rem;
	}

	/* Eine Ebene mehr als beim Konfigurator: auch die Angabenliste und
	 * der Raumblock geben ihre Kinder weiter. */
	.pe-werk > .pe-werk__daten,
	.pe-werk .pe-raum { display: contents; }

	/* `.pe-werk` steht auf `align-items: start` — die Kinder sind damit
	 * so breit wie ihr Inhalt, nicht so breit wie die Spalte. Fuer eine
	 * Zeile Text ist das richtig, fuer die Werkleiste nicht: sie traegt
	 * 88 Kacheln nebeneinander und scrollt normalerweise in sich selbst.
	 *
	 * Am 31.08.2026 bei `?pe_nr=9` auf 390 px gemessen: `.pe-aus__buehne`
	 * **5978 px** breit, die Leiste darin ebenso, `overflow-x: auto`
	 * wirkungslos, weil nichts sie einengt. Am Telefon war damit alles
	 * jenseits der ersten Kacheln unerreichbar. Mit `width: 100%` sind es
	 * 359 px, und die Leiste scrollt wieder.
	 *
	 * Aelter als die Umbauten dieser Sitzung — gegengeprueft, indem die
	 * Preisspalte erst auf die alte Regel zurueckgesetzt und dann ganz
	 * ausgeblendet wurde: 5978 px blieben in beiden Faellen. */
	.pe-werk > .pe-aus__buehne {
		width: 100%;
		min-width: 0;
	}

	/* Die Reihenfolge. `dt` und `dd` bekommen dieselbe Zahl — sie
	 * gehören zusammen und dürfen nicht auseinandergerissen werden. */
	.pe-werk .pe-view__frame        { order: 1; }
	.pe-werk .pe-view__bar          { order: 2; }
	/* Die Anfrageklappe steht HINTER dem Preis, seit 2.159.0 — dieselbe
	 * Folge wie in der Preisspalte des Konfigurators: was es ist, was es
	 * kostet, dann die Handlung. */
	.pe-werk .pe-anfrage__klappe    { order: 4; }
	/* Alles Übrige der Angabenliste — Format, Ausführung, Edition,
	 * Auszeichnung — folgt hinten, in seiner eigenen Reihenfolge.
	 *
	 * **Diese Regel steht ZUERST**, und das ist kein Zufall: sie ist mit
	 * `> dt` spezifischer als eine Klasse (0,2,1 gegen 0,2,0). Stünde sie
	 * hinter den beiden gezielten Regeln, gewönne sie trotzdem — am
	 * 31.08.2026 genau so gemessen, Preis und Werkklasse blieben unten.
	 * Die gezielten Regeln unten tragen deshalb den Behälter mit und
	 * kommen auf (0,3,0). */
	.pe-werk .pe-werk__daten > dt,
	.pe-werk .pe-werk__daten > dd   { order: 10; }

	.pe-werk .pe-werk__daten > .pe-werk__dt--preis,
	.pe-werk .pe-werk__daten > .pe-werk__preis      { order: 3; }

	/* Die Kopie des Preises ueber dem Knopf ist eine Antwort auf ein
	 * Problem des Schreibtischs: dort stehen zwei Spalten nebeneinander,
	 * und beim Durchklicken sprang die linke, weil der Preis nur rechts
	 * stand. Am Telefon steht ohnehin alles untereinander — die Kopie
	 * waere dort ein zweiter Preis zwei Zeilen unter dem ersten. */
	.pe-werk .pe-aus__preis--kopie { display: none; }
	.pe-werk .pe-werk__daten > .pe-werk__dt--klasse,
	.pe-werk .pe-werk__daten > .pe-werk__dd--klasse { order: 5; }
	.pe-werk .pe-view__thumbs       { order: 6; }
	.pe-werk .pe-view__hint         { order: 7; }
	.pe-werk .pe-view__controls     { order: 8; }

	/* Die Zeilen der Angabenliste standen im Raster untereinander mit
	 * eigenen Abständen. Als Flexkinder brauchen sie eine Trennung
	 * zwischen Begriff und Wert, sonst kleben sie aneinander. */
	.pe-werk .pe-werk__daten > dt { margin-bottom: -.5rem; }
	.pe-werk .pe-werk__daten > dd { margin: 0; }
}

/* --- Journal-Einladung nach dem Absenden (Weg 4, 2.191.0) -------------
 *
 * Sie steht unter der Erfolgsmeldung und darf ihr nicht die Aufmerksam-
 * keit nehmen: die Anfrage ist die Hauptsache, das Journal das Angebot
 * daneben. Deshalb abgesetzt statt hervorgehoben — eine Linie oben,
 * etwas Luft, keine Farbe. */
.pe-anfrage__einladung {
	margin-top: 1.8em;
	padding-top: 1.4em;
	border-top: 1px solid rgba(127, 127, 127, .28);
}
.pe-anfrage__einladung-titel {
	font-weight: 600;
	margin-bottom: .4em;
}
.pe-anfrage__einladung p {
	margin: 0 0 .9em;
}
.pe-anfrage__einladung form {
	margin: 0;
}
