/*
Theme Name: Z-Designstudio
Theme URI: http://stuntarts.com
Author: Stuntarts GmbH
Author URI: http://stuntarts.com
Description: Z-Designstudio, merged standalone build. Nebula 1.1.5 (parent) and the former zumbuehl child theme 1.1.0 combined into one theme folder called z-design, so the theme no longer needs its parent theme directory to exist.
Version: 2.1.54
License: The License with which you bought this theme from ThemeForest
License URI: http://themeforest.net/wiki/support/legal-terms/licensing-terms/
Tags: white, light, three-columns, right-sidebar, left-sidebar, responsive-layout, custom-menu, editor-style, featured-images, full-width-template, post-formats, sticky-post, theme-options, translation-ready
Text Domain: nebula
*/

@import "assets/css/fonts.css";
@import "assets/css/font-icon.css";

/* ==========================================================================
   HTML / Body 
   ========================================================================== */
html {
  height: 100%;
}

body {
  min-height: 100%;
  overflow-y: none;
}

a {
	outline: 0;
}

/* ==========================================================================
   Fonts 
   ========================================================================== */
body, input, textarea, select, h1, h2, h3, h4, h5, h6, .post-title, .widget-title {
    font-family: 'Z-Bold', 'Open Sans', Arial, sans-serif !important;
    font-weight: normal;
}
.industrial-design body, .industrial-design p, .industrial-design input, .industrial-design textarea, .industrial-design select, .industrial-design h1, .industrial-design h2, .industrial-design h3, .industrial-design h4, .industrial-design h5, .industrial-design h6, .industrial-design .post-title, .industrial-design .widget-title, .left-navigation, .left-language-switch, .industrial-design .footer-description, .industrial-design .atp-filter-label, .industrial-design .atp-filter-opener, .industrial-design .atp-project-details {
    font-family: 'Z-Light', 'Open Sans', Arial, sans-serif !important;
 	font-weight: normal;
}

.content-container p, .page-content p{
	font-size: 23px;
	line-height: 1.5em;
	letter-spacing: 0.02em;
}

.section-title span, .menu a, h1, h2, h3, h4, h5, h6, .single .post-title, .post-title {
	font-size: 33px;
	font-weight: normal;
}

.single .post-title, .post-title {
	line-height: 1.4em;
}

.section-title span, .menu a {
	letter-spacing: 0.02em;
}

h1, h2, h3, h4, h5, h6, .post-title, .widget-title {
    letter-spacing: -0.01px;
    margin-bottom: 28px;
}

.language-switch, .footer-description, .atp-filter-opener:after, .atp-filter-label, .atp-project-details-container a, .sidebar-right p {
	font-size: 14px !important;
	font-weight: normal !important;
	letter-spacing: 0.05em !important;
}

.sidebar-right p {
	line-height: 1.4em;
}

/* ==========================================================================
   Home
   ========================================================================== */
body.landingpage {
	overflow: none !important;
	max-height: 100vh;
}

.landingpage #main-container {
	padding-top: 0px !important;
	position: fixed;
	top: 0px;
	left: 0px;
	height: 100vh;
}

.landingpage #main-container, .landingpage .main-container-wrapper, .landingpage #content, .landingpage .content-home {
	min-height: 100%;
	max-height: 100%;
	height: 100%;
	display: block;
}

.landingpage #content {
	background-size: cover;
	background-position: center center;
	background-color: #f7f7f7;
	background-repeat: no-repeat;
}

body.landingpage #content {
	padding-left: 0px !important;
	padding-right: 0px !important;
}

.content-landing {
	width: 50%;
	height: 100%;
	display: block;
	float: left;
}

.content-landing:hover {
	background-color: #FFF;
	opacity: 0.15;
}

a.content-landing {
	transition: none;
	-webkit-transition: none;
}

/* ==========================================================================
   Header
   ========================================================================== */
#header {
	position: inherit !important;
   	background: none !important;
   	top: 0px !important;
   	height: 0px;
}

.header-wrapper {
	text-align: center;
	position: relative;
	z-index: 9999;
	margin-left: auto;
	margin-right: auto;
	text-align: center;
	width: 210px;
}

.header-small .header-wrapper, .header-minimal .header-wrapper {
	min-height: 0px;
}
	
/* ==========================================================================
   Logo
   ========================================================================== */
.logo-wrapper {
	margin-left: auto !important;
	margin-right: auto !important;
	margin-top: 75px;
	position: fixed;
	display: inline-block;
}

.logo-wrapper, .image-logo-dark {
	width: 80px !important;
	height: 144px !important;
}

.image-logo-dark {
	background-size: 100% 100%;
}

.logo {
	position: fixed;
	z-index: 999;
	display: block;
	margin-left: -80px;
}

.logo img {
	width: 100%;
	height: 100%;
}


/* ==========================================================================
   Left or Right
   ========================================================================== */
.interior-design .main-navigation.left-navigation, .interior-design .left-language-switch {
	display: none;
}

.industrial-design .main-navigation.right-navigation, .industrial-design .right-language-switch {
	display: none;
}

.interior-design .page-title, .interior-design #main-container, .interior-design .page-content, .interior-design .post-title {
	text-align: right;
}

.industrial-design .content-container {
	float: right;
}

.industrial-design .sidebar {
	float: left;
	padding-right: 5.3%;
	padding-left: 0px;
}

.industrial-design .page-title, .industrial-design #main-container, .industrial-design .page-content, .industrial-design #main-container, .industrial-design #main-container .post-title, .sidebar-right .post-title {
	text-align: left;
}

/* ==========================================================================
   Update 2020
   ========================================================================== */
.language-switch {
	display: none;
}

@media screen and (max-width: 720px) {
	.industrial-design .logo-wrapper, 
	.industrial-design .image-logo-dark,
	.interior-design .logo-wrapper, 
	.interior-design .image-logo-dark {
		width: 32px !important;
		height: 55px !important;
	}

	.industrial-design .logo-wrapper,
	.interior-design .logo-wrapper {
		margin-top: 25px;
		position: absolute;
	}

	.industrial-design .logo,
	.interior-design .logo {
		margin-left: 0px;
	}

	.industrial-design .logo-wrapper {
		right: 0px !important;
	}

	.interior-design .logo-wrapper {
		left: 0px !important;
	}
}

/* ==========================================================================
   Navigation
   ========================================================================== */
.main-navigation {
	top: 25px;
	position: fixed;
}

.main-navigation.left-navigation{
	left: 18px;
	float: none;
	text-align: left;
}

.main-navigation.right-navigation{
	right: 18px;
	float: none;
	text-align: right;
}

.main-navigation.left-navigation .menu-icon {
	float: left;
}

.section-title {
	padding-bottom: 20px;
}

.section-title span {
	float: none;
	display: block;
	margin-bottom: 10px;
}

.section-title span, .menu a {
	margin-right: 0px;
	text-shadow: none;
	padding: 0 5px 0 5px;
	text-transform: uppercase;
}

.main-navigation a {
	text-decoration: none;
}

.menu li {
	list-style: none;
	padding-bottom: 7px;
}

.menu ul {
	margin-left: 0px;
}

/* ==========================================================================
   Menu Hidden
   ========================================================================== */
 .main-navigation .menu {
  clear: both;
  max-height: 0;
  transition: max-height .2s ease-out;
  overflow: hidden;
}

/* ==========================================================================
   Navigation Menu Icon
   ========================================================================== */

.main-navigation .menu-icon {
  cursor: pointer;
  display: inline-block;
  float: right;
  padding: 20px 20px;
  position: relative;
  user-select: none;
  margin-bottom: 10px;
  margin-right: -12px;
}

.main-navigation.left-navigation .menu-icon {
	margin-left: -12px;
}
 
.main-navigation .menu-icon .navicon {
  background: #000;
  display: block;
  height: 4px;
  position: relative;
  transition: background .2s ease-out;
  width: 30px;
}

.main-navigation.left-navigation .menu-icon .navicon {
  height: 3px;
}

.main-navigation .menu-icon .navicon:before,
.main-navigation .menu-icon .navicon:after {
  background: #000;
  content: '';
  display: block;
  height: 100%;
  position: absolute;
  transition: all .2s ease-out;
  width: 100%;
}

.main-navigation .menu-icon .navicon:before {
  top: 10px;
}
 
.main-navigation .menu-icon .navicon:after {
  top: -10px;
}

/* ==========================================================================
   Navigation Menu Icon Animation for closing
   ========================================================================== */
.main-navigation .menu-btn {
  display: none;
}
 
.main-navigation .menu-btn:checked ~ .menu {
  max-height: 500px;
  padding-bottom: 20px;
}
 
.main-navigation .menu-btn:checked ~ .menu-icon .navicon {
  background: transparent;
}
 
.main-navigation .menu-btn:checked ~ .menu-icon .navicon:before {
  transform: rotate(-45deg);
}
 
.main-navigation .menu-btn:checked ~ .menu-icon .navicon:after {
  transform: rotate(45deg);
}

.main-navigation.left-navigation .menu-btn:checked ~ .menu-icon .navicon:before {
  width: 34px;
  transform: rotate(-43deg);

}
 
.main-navigation.left-navigation .menu-btn:checked ~ .menu-icon .navicon:after {
  width: 34px;
  transform: rotate(43deg);
}
 
.main-navigation .menu-btn:checked ~ .menu-icon:not(.steps) .navicon:before,
.main-navigation .menu-btn:checked ~ .menu-icon:not(.steps) .navicon:after {
  top: 0;
}

/* ==========================================================================
   Language Switcher
   ========================================================================== */
.industrial .right-navigation, .industrial .right-language-switch{
	display: none;
}

.interior .left-navigation, .interior .left-language-switch {
	display: none;
}

/* ==========================================================================
   Language Switcher
   ========================================================================== */
.language-switch {
    position: fixed;
    bottom: 25px;
    z-index: 999;
    text-align: right;
	font-size: 14px;
}

.left-language-switch {
	float: left;
	left: 25px;
}

.right-language-switch {
	float: right;
	right: 25px;
}

.bogo-language-switcher .en-US, .bogo-language-switcher .de-DE {
	background: none !important;
}

ul.bogo-language-switcher li {
	padding-left: 0px;
	float: right;
	line-height: 1.2em;
	list-style: none;
}

ul.bogo-language-switcher li:first-child {
	margin-left: 7px;
}

/*
 * The current language is marked by colour, not by an underline - see
 * work/overrides/zumbuehl-2.1.26-language-switch.css for the measurements.
 *
 * This block used to underline the current item and its hover state. `text-decoration` spans the inline box rather
 * than the glyph ink, so at 14px the line ran wider than the two letters, and the two subsites resolved it to
 * different thicknesses (1.26px on the right switcher, 1px on the left). Colour marks the current language without
 * either defect; the underline now only appears under something you can click.
 */
ul.bogo-language-switcher li,
ul.bogo-language-switcher li.current,
ul.bogo-language-switcher li a {
	text-decoration: none;
}

ul.bogo-language-switcher li a {
	color: #5c5c5c;
}

ul.bogo-language-switcher li.current a {
	color: #000;
}

ul.bogo-language-switcher li a:hover,
ul.bogo-language-switcher li a:focus-visible {
	color: #000;
	text-decoration: underline;
	text-decoration-thickness: 1px;
	text-underline-offset: 1px;
}

ul.bogo-language-switcher li a   {
	text-decoration: none;
}

/* ==========================================================================
   Portfolio
   ========================================================================== */
.three-fourths .atp-project-thumb {
	max-height: 502px;
	overflow: hidden;
}

.atp-load-more-wrapper {
	display: none;
}


@media screen and (max-width: 1280px) and (min-width: 706px) {
	.atp-projects-wrapper {
		margin-top: 60px;
	}
}

/* ==========================================================================
   Portfolio Awards
   ========================================================================== */
li.atp-project.awards {
}

.atp-projects {
	padding-top: 25px; /* to show awards labels on top*/
}

li.atp-project.awards:before {
	width: 150px;
	height: 40px;
	color: #FFFFFF;
	text-transform: uppercase;
	letter-spacing: 0.4em;
	font-size: 20px;
	text-align: center;
	padding-top: 11px;
	padding-left: 3px;
	content: 'award';
	position: absolute;
	right: 25px;
	top: -25px;
	z-index: 999;
	overflow: visible;
	background: url('assets/img/awards_label_bg.png') no-repeat left top;
	background-size: 100% 100%;
}


img.attachment-award-image-thumbnail {
	width: 180px;
	height: auto;
	/*grayscale for background image*/
	filter: url("data:image/svg+xml;utf8,&lt;svg xmlns=\'http://www.w3.org/2000/svg\'&gt;&lt;filter id=\'grayscale\'&gt;&lt;feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/&gt;&lt;/filter&gt;&lt;/svg&gt;#grayscale"); /* Firefox 10+, Firefox on Android */
	filter: grayscale(100%); 
	-webkit-filter: grayscale(100%); /* Chrome 19+, Safari 6+, Safari 6+ iOS */
}

/* ==========================================================================
   Article surface and real images
   ========================================================================== */

/*
 * Portfolio articles sit on a light grey surface.
 *
 * Only `body` paints on this template: measured 2026-11-03, `#main-container`, `#content`, the article and every
 * wrapper report a transparent background, so the grey has to go on the body. `#f7f7f7` is already in the theme's
 * palette, not a new value.
 */
body.single-atp_project {
	background-color: #f7f7f7;
}

/*
 * The header slider is a real image now.
 *
 * It used to be `background-image` on an empty div, so a slide carried no alt text and no width/height. The template
 * prints `<img class="slide-img-bg slide-desktop|slide-mobile">`, and `object-fit: cover` reproduces
 * `background-size: cover` exactly.
 *
 * `display` is deliberately NOT set on `.slide-img-bg` itself: that single class lost the desktop/mobile switch, because
 * `.slide-mobile { display: none }` above is also one class and this file comes later. Both images then rendered, one
 * under the other, and the slider stood 1400 px tall inside a 700 px header (measured live 2026-11-03). The switch is
 * restated below with the two-class pair, which outranks either single class.
 */
.slide-img-bg {
	object-fit: cover;
	object-position: center center;
	background-image: none;
}

@media screen and (min-width: 480px) {
	.slide-img-bg.slide-desktop {
		display: block;
	}

	.slide-img-bg.slide-mobile {
		display: none;
	}
}

@media screen and (max-width: 479px) {
	.slide-img-bg.slide-desktop {
		display: none;
	}

	.slide-img-bg.slide-mobile {
		display: block;
	}
}

/*
 * Logo walls (clients, awards): the logo is a real image inside the box that used to hold the background.
 *
 * `object-fit: contain` reproduces `background-size: contain`, and the grayscale filter moves onto the image.
 *
 * The selector here used to be `.logo-block-bg > .logo-block-img`, from a first pass that wrapped the image. The
 * templates print `<div class="logo-block"><img class="logo-block-img">` with no wrapper, so it matched nothing:
 * measured 2026-11-03 on /interior/kunden/ and /interior/erfolg/, `filter: none` and `display: inline` on every logo -
 * the walls had lost both their grayscale and their `contain` fit. The old `.logo-block-bg` selectors stay for any page
 * that still renders the wrapper.
 */
.logo-block > .logo-block-img,
.logo-block-bg > .logo-block-img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: contain;
	object-position: center center;
	filter: grayscale(100%);
	-webkit-filter: grayscale(100%);
}

/* ==========================================================================
   Portfolio Filter
   ========================================================================== */
.atp-filter-wrapper {
	position: relative;
	top: -5px !important;
	max-width: 100%;
	padding-bottom: 20px;
	padding-top: 0px;
	text-align: center;
	z-index: 100;
}


ul.atp-filters {
	display: inline-block;
	max-width: 100%;
	-webkit-margin-before: 0px;
	-webkit-margin-after: 0px;
	-webkit-margin-start: 0px;
	-webkit-margin-end: 0px;
	-webkit-padding-start: 0px;
}


.atp-filter-opener {
	position: relative !important;
	display: inline-block;
	padding: 0px 0px;
	z-index: 99 !important;
	top: 20px !important;
	text-align: center;
	width: 100%;
}


.atp-fallback-filters {
	display: none;
}

.atp-filter-opener:after {
	content: 'Projektfilter';
	margin-left: 10px;
	z-index: 999;
}

#atp-filter-openee {
	width: 100%;
}

#atp-filter-openee:checked ~ .atp-filter-opener  {
	background: none;
	//width: 0px;
	//height: 0px;
}

#atp-filter-openee:checked ~ .atp-filter-opener:after  {
	content: '';
}

#atp-filter-openee:checked ~ .site-control {
	width: 50px !important;
	height: 50px !important;
	background: blue !important;
	display: inline-block;
}

#atp-filter-openee:checked ~ .atp-projects-wrapper, #atp-filter-openee:checked ~ .atp-filter-wrapper, #atp-filter-openee:checked ~ .atp-filter-opener,
.atp-projects-wrapper, .atp-filter-wrapper, .atp-filter-opener, .atp-filters  {
	-webkit-transition: none;
	transform: none;
}

.atp-filter-opener-icon {
	background: url('assets/img/filter_icon_open.png') no-repeat center center;
	background-size: 100% 100%;
	height: 12px;
	width: 14px;
	margin-left: -70px;
}

.atp-filters li:first-of-type {
	padding-left: 20px;
}

#atp-filter-openee:checked ~ .atp-filter-opener .atp-filter-opener-icon {
	/*background: url('assets/img/filter_icon_close.png') no-repeat center center;
	background-size: 14px 14px;
	height: 20px;
	width: 14px;
	left: 50%;
	top: 0px;
	margin-top: 8px;
	margin-left: -330px;*/
	display: none;
}

.industrial-design #atp-filter-openee:checked ~ .atp-filter-opener .atp-filter-opener-icon {
	//margin-left: -210px;
}

#atp-filter-openee:checked ~ .atp-filter-wrapper .atp-filters {
	//padding-left: 30px;
}

~ .atp-filter-opener-icon  {
	display: none;
}

.atp-filter-opener .bar {
	display: none;
}

#atp-filter-openee:checked ~ .atp-projects-wrapper {
	position: relative;
}

.atp-projects {
	margin-top: 35px;
}

.atp-filters li {
	text-transform: none;
	margin: 0 8px !important;
}

.atp-filters li a {
	color: #000 !important;
	line-height: 1.3em;
}

/*
 * Filter hover used `border-bottom`, drawn across the box and therefore wider than the word by its padding.
 * `text-decoration` hugs the glyphs - the operator's "underline width need to fit font width", 2026-11-03.
 *
 * Thickness follows the menu rule: as thick as the face's stems, so the filter row does not undercut the navigation
 * it sits under (0.12em -> 4px painted on Z-Bold at the menu's 33px, 0.09em on the light face).
 */
.atp-filters li a:hover,
.atp-filters li a:focus-visible {
	text-decoration: underline;
	text-decoration-thickness: max(1px, 0.12em);
	text-underline-offset: var(--zd-menu-underline-offset);
}

.industrial-design .atp-filters li a:hover,
.industrial-design .atp-filters li a:focus-visible {
	text-decoration-thickness: max(1px, 0.09em);
}

/* ==========================================================================
   Portfolio Single Post
   ========================================================================== */
.sidebar-right h1 {
	line-height: 1.2em;
}

.sidebar-right p {
	margin-bottom: 20px;
}

.content-left {
	background: none;
}

.content-left, .content-right {
	width: 60%;
}

.sidebar-right, .sidebar-left {
	width: 40%;
}

@media screen and (max-width: 1100px) {
	.content-left, .content-right {
		float: none;
		width: 100%;
	}
	
	.sidebar-right {
		width: 100%;
		padding-left: 0px;
	}
}

@media screen and (max-width: 840px) {
	.sidebar-left, .sidebar-right {
	    margin-top: 0px;
	}
}


/* ==========================================================================
   Slider
   ========================================================================== */
#header-image-wrapper {
	height: auto !important;
	min-height: 300px;
	max-height: 80% !important;
}

.dynamic-image-slider .header-image {
	background: none;
}

.slide-img-bg {
	min-height: 80%;
	background-size: cover;
	height: 700px;
	width: 100%;
	min-width: 100% !important;
	background-position: center center;
	background-repeat: no-repeat;
}

.slick-slider {
	margin-bottom: 0px !important;
}

.scroll-down-indicator {
	display: none;
}

.slick-slider img {
	min-width: 100%;
	max-width: 100%;
}

ul.slick-dots {
	margin-bottom: 0px;
}

.slick-dots li {
	width: 10px !important;
}

.slick-dots {
	bottom: 25px !important;
}

.slick-prev:before, .slick-next:before {
	color: #000 !important;
}

.slick-prev, .slick-next {
	z-index: 999;
}

.slick-prev {
	left: 0px !important;
}

.slick-next {
	right: 25px !important;
}

button.slick-prev, button.slick-next {
	height: 100%;
}

button.slick-prev {
	padding-left: 25px;
	padding-right: 50px;
}

button.slick-next {
	padding-left: 50px;
	padding-right: 25px;
}

.slick-prev:before, .slick-next:before {
	font-family: zdesignstudio !important;
	font-size: 50px !important;
	opacity: 1 !important;
}

.slick-prev:before {
	content: '\e900' !important;
}

.slick-next:before {
    content: '\e901' !important;
}

.slick-dots li button:before {
	font-family: zdesignstudio !important;
	font-size: 10px !important;
	line-height: 20px;
	opacity: 1 !important;
}

.slick-dots li button:before {
	content: '\e902' !important;
}

.slick-dots li.slick-active button:before {
	content: '\e903' !important;
}


.industrial-design .slick-prev:before {
	content: '\e904' !important;
}

.industrial-design .slick-next:before {
    content: '\e905' !important;
}

.industrial-design .slick-dots li button:before {
	content: '\e906' !important;
}

.industrial-design .slick-dots li.slick-active button:before {
	content: '\e907' !important;
}

@media screen and (max-width: 479px) {
	#header-image-wrapper, .slide-img-bg {
		min-height: 260px;
		max-height: 260px;
	}
	
	.slide-desktop {
		display: none;
	}
	
	.slide-mobile {
		display: block;
	}
	
}

@media screen and (min-width: 480px) {
	.slide-desktop {
		display: block;
	}
	
	.slide-mobile {
		display: none;
	}
	
}

@media screen and (min-width: 480px) and (max-width: 639px) {
	#header-image-wrapper, .slide-img-bg {
		min-height: 300px;
		max-height: 300px;
	}
}

@media screen and (min-width: 640px) {
	#header-image-wrapper, .slide-img-bg {
		min-height: 420px;
		max-height: 420px;
	}
}

@media screen and (min-width: 720px) {
	#header-image-wrapper, .slide-img-bg {
		min-height: 560px;
		max-height: 560px;
	}
	
	.slick-dots{
		bottom: 25px !important;
	}
}

@media screen and (min-width: 960px) {
	#header-image-wrapper, .slide-img-bg {
		min-height: 700px;
	}
}

@media screen and (min-height: 1280px) and (min-width: 1680px) {
	#header-image-wrapper, .slide-img-bg {
		min-height: 1080px !important;
		max-height: 1080px
	}
}

@media screen and (min-height: 960px) and (min-width: 1680px) {
	#header-image-wrapper, .slide-img-bg {
		min-height: 800px;
	}
}

/* ==========================================================================
   Content
   ========================================================================== */
#main-container {
	margin-top: 0px !important;
}

#main-container {
	padding-top: 300px;
}

.has-header-image #main-container {
	padding-top: 50px;
}

.page-template-template-portfolio #main-container{
	padding-top: 0px !important;
}

.content-wrapper {
	margin-left: auto;
	margin-right: auto;
}

body:not(.boxbuilder-content) #content, .footer-widgets-wrapper, .footer-copyright-wrapper, .section-background, .boxbuilder-content .section-full-width.section-rows-normal .atbb-row, .boxbuilder-content .atbb-section.section-normal-width, .footer-pagination-wrapper, .single:not(.boxbuilder-content) #content>.hentry, .comment-list-wrapper, .comments-form, .boxbuilder-content .atbb-section.section-normal-width {
	padding-left: 25px;
	padding-right: 25px;
}

@media screen and (max-width: 480px) {
	#header, .footer-copyright, body:not(.boxbuilder-content):not(.single) #content, .footer-widgets-wrapper, .footer-copyright-wrapper, .section-background, .boxbuilder-content .section-full-width.section-rows-normal .atbb-row, .boxbuilder-content .atbb-section.section-normal-width, .single #content>.hentry, .comment-list-wrapper, .comments-form {
		padding-left: 25px;
		padding-right: 25px;
	}
}

.post-title {
	text-align: left;
	margin-left: auto;
	margin-right: auto;
	padding: 0 0;
}

.interior #main-container, .interior #main-container .post-title, .sidebar-right .post-title {
	text-align: right;
}

.industrial .content-left {
	float: right;
}

body.success {
	background-color: #FFF !important;
}

body.success:before {
	display: none;
}

.page-header {
	margin-bottom: 17px;
}

/* ==========================================================================
   Footer
   ========================================================================== */
.footer-description-wrapper {
	position: fixed;
	bottom: 0px;
	left: 0px;
	text-align: center;
	height: auto;
	width: 100%;
	max-width: 100%;
	padding-bottom: 25px;
}

.footer-description a {
	text-decoration: none !important;
}


/* ==========================================================================
   Partner
   ========================================================================== */

.logo-block {
	margin-bottom: 50px;
	padding: 25px 25px;
	height: 150px;
}

.logo-block-bg {
	background-repeat: no-repeat;
	background-size: contain;
	background-position: center center;
	display: block;
	height: 100%;
	/*grayscale for background image*/
	filter: url("data:image/svg+xml;utf8,&lt;svg xmlns=\'http://www.w3.org/2000/svg\'&gt;&lt;filter id=\'grayscale\'&gt;&lt;feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/&gt;&lt;/filter&gt;&lt;/svg&gt;#grayscale"); /* Firefox 10+, Firefox on Android */
	filter: grayscale(100%); 
	-webkit-filter: grayscale(100%); /* Chrome 19+, Safari 6+, Safari 6+ iOS */
}

.logo-block:hover .logo-block-bg {
	/*opacity: 0.7;*/
}

.one-third-column:nth-child(3n) {
	margin-right: 0px !important;
}

.page-template-template-clients .page-title{
	visibility: hidden;
}

/* ==========================================================================
   Motivation
   ========================================================================== */

.motivation-content h1.post-title, .motivation-content h2.sidebar-title {
	font-size: 23px;
}

.motivation-content .content-container {
	float: left;
}

.industrial-design .motivation-content .content-container {
	float: right;
}

/* ==========================================================================
   Responsive
   ========================================================================== */
@media screen and (max-width: 720px) {
	.main-navigation {
		position: relative;
	}
	
	.main-navigation.left-navigation{
		left: -2px;
	}
	
	.main-navigation.right-navigation{
		right: -2px;
	}
	
	#header {
		display: block;
		position: relative !important;
		height: auto;
		min-height: auto;
		max-height: 500px !important;
	}
	
	.menu-btn:checked ~ #header {
		height: 700px;
	}
	
	.logo-wrapper {
		/*display: none;*/
	}
	
	button.slick-prev, button.slick-next {
		height: auto;
	}
	
	.slick-prev:before, .slick-next:before {
		display: none;
	}
		
	.interior-design .footer-description {
		text-align: left;
		margin-left: 25px;		
	}
	
	.industrial-design .footer-description {
		text-align: right;
		margin-right: 25px;
	}
	
	footer {
		display: none;
	}
	
	.footer-description {
		display: none;
	}
	
	.language-switch {
		bottom: initial;
		top: 25px;
		position: absolute;
	}
	
	.left-language-switch {
		left: initial;
		right: 25px;
	}
	
	.right-language-switch {
		right: initial;
		left: 25px;
	}
	
	#main-container {
	    padding-top: 0px;
	}

	.atp-projects {
		margin-top: -25px;
	}
	
	.landingpage .logo-wrapper {
		display: inline-block;
		left:50%;
		top:50%;
		margin:-72px 0 0 -40px;
	}
	
	.landingpage .main-navigation.right-navigation {
		right: 18px;
	}
	
	.landingpage .main-navigation.left-navigation{
		left: 18px;
	}
	
	.landingpage .main-navigation.right-navigation{
		right: 18px;
		bottom: 16px !important;
		top: initial;
	}
	
	.landingpage .menu-icon, .landingpage .language-switch, .landingpage .menu {
		display: none;
	}
	
	.landingpage .main-navigation {
		position: fixed;
	}
	
	.landingpage #header {
		position: fixed !important;
	}
	
	.has-header-image #main-container {
		padding-top: 25px;
	}
	
	/* Font Sizes */
	
	.section-title span, .menu a, h1, .single .post-title, .post-title {
		font-size: 28px;
		line-height: 0.8em;
	}
	
	.section-title span, .menu a {
		letter-spacing: 0.01em;
	}
	
	.content-container p, .page-content p, .sidebar-right p{
		font-size: 14px;
		line-height: 1.5em;
		letter-spacing: 0.02em;
		margin-bottom: 15px;
	}
	
	h1, h2, h3, h4, h5, h6 {
		font-size: 18px;
		line-height: 1.4em;
		letter-spacing: 0px;
		margin-bottom: 15px;
	}
	
	.single .post-title, .post-title, .sidebar-title {
		line-height: 1.0em;
		margin-bottom: 15px;
	}

	.language-switch, .footer-description, .atp-filter-opener:after, .atp-filter-label, .atp-project-details-container a, .sidebar-right p {
		font-size: 14px !important;
	}
	
	li.atp-project.awards:before {
		width: 100px;
		height: 28px;
		color: #FFFFFF;
		letter-spacing: 0.2em;
		font-size: 15px;
		padding-top: 1px;
		right: 15px;
		top: -7px;
	}
	
}

@media screen and (max-width: 640px) {
	.one-third-column {
	    width: 48%;
	    margin-right: 2%;
	}
	
	.logo-block {
	    margin-bottom: 20px;
	    padding: 10px 10px;
	    height: 50px;
	}
	
	.page-template-template-awards .logo-block {
		height: 90px;
		margin-bottom: 25px;
	}
}

@media screen and (max-width: 944px) and (max-height: 680px) {
	.footer-description {
		display: none;
	}
}

@media screen and (min-width: 945px) and (max-height: 800px) {
	.footer-description {
		display: none;
	}
}
/* ---- override: zumbuehl-2.0.1-links.css ---- */
/* ==========================================================================
   Link affordances - menu underline, logo/site-title fade
   --------------------------------------------------------------------------
   The theme underlines only the language switcher and the portfolio filters;
   navigation links had no hover state at all and the logo/site title had none
   either. Rules use text-decoration (not border-bottom) so nothing shifts by a
   pixel, and they cover :focus-visible so keyboard users get the same cue.

   Opacity 0.6, not 0.55: black at 60% over white resolves to #666, ~5.7:1,
   which still clears AA. The inherited transition only covers colour, so
   opacity is added explicitly; reduced motion turns the fade into a snap.
   ========================================================================== */

/*
 * Menu underline placement.
 *
 * `--zd-menu-underline-offset` is the one knob: the rule sits this far below the text. Measured with the
 * theme's own Z-Bold at the menu's 33px (painted pixels, 4x render):
 *
 *   0.30em  9.5px gap   - what the supplied theme shipped, reads as a separate line
 *   0.08em  2.5px gap   - was judged detached when the rule was only 3px thick
 *   0.04em  0.5px gap   - "attached", but with a heavy rule it merged into the strokes
 *   0.09em  2.5px gap   <- current: gap is a bit under the rule's own thickness, which is what makes a
 *                          thick underline read as part of the word instead of a separate line
 *
 * It is a variable rather than a literal so it can be tuned from the browser (or a child stylesheet)
 * without rebuilding the theme.
 */
:root {
	--zd-menu-underline-offset: 0.09em;
}

/*
 * Menu items: underline on hover and on focus. The weight of the rule follows the weight of the face.
 *
 * Measured from a 4x render with the theme's own fonts at the menu's 33px (painted pixels): Z-Bold's stems
 * are 4px wide, Z-Light's are 2-3px. The rules were 2.97px and 1.32px, so the underline was thinner than the
 * strokes it belonged to and read as a separate hairline - the operator's "don't match the font weight in thickness"
 * (2026-11-03). Each face now gets a rule as thick as its stems: 0.12em -> 4px painted on Bold, 0.09em -> 3px on
 * Light. `max(1px, ...)` keeps it from vanishing in the smaller breakpoints, where em resolves below a pixel.
 *
 * Thickness and offset are repeated in the state block below on purpose: an underline set by the shorthand resets
 * both to their initial values.
 */
.main-navigation li > a {
	text-decoration: none;
	text-decoration-thickness: max(1px, 0.12em);
	text-underline-offset: var(--zd-menu-underline-offset);
}

/*
 * The light face needs a finer rule: the industrial subsite (and the portal) carries the theme's
 * `industrial-design` body class, which swaps in Z-Light, and the theme renders the left
 * navigation in the light face as well. Its stems measure 2-3px, so 0.09em -> 3px painted at 33px.
 */
.industrial-design .main-navigation li > a,
.industrial-design .main-navigation li > a:hover,
.industrial-design .main-navigation li > a:focus-visible,
.main-navigation.left-navigation li > a,
.main-navigation.left-navigation li > a:hover,
.main-navigation.left-navigation li > a:focus-visible {
	text-decoration-thickness: max(1px, 0.09em);
	text-underline-offset: var(--zd-menu-underline-offset);
}

/*
 * Hover and keyboard focus only.
 *
 * The current page used to be underlined as well. The operator does not want the menu to mark where you already are
 * (2026-11-03: "active page should not be marked"), so the four `current-*` selectors are gone. This block is what
 * overrides the base theme's own marking rule, so nothing else applies an underline in the menu.
 */
.main-navigation li > a:hover,
.main-navigation li > a:focus-visible {
	text-decoration: underline;
	text-decoration-thickness: max(1px, 0.12em);
	text-underline-offset: var(--zd-menu-underline-offset);
}

/* Logo and site title - only when they are links. The Z mark is a background
   image on a span inside the anchor, so fading the anchor fades the mark too. */
a.logo,
a.section-title {
	transition: opacity 0.3s ease, color 0.3s ease;
}

a.logo:hover,
a.logo:focus-visible,
a.section-title:hover,
a.section-title:focus-visible {
	opacity: 0.6;
}

@media (prefers-reduced-motion: reduce) {
	a.logo,
	a.section-title {
		transition: none;
	}
}

/* ---- override: zumbuehl-2.0.1-theme.css ---- */
/* ==========================================================================
   Theme fixes for 2.0.1 - switcher visibility, Z mark centring
   --------------------------------------------------------------------------
   Appended by `merge-theme.py` after the child stylesheet, so it wins on order
   without touching the backup or the generated code.

   1. `.language-switch { display: none }` comes from the client's "Update 2020"
      block in the original stylesheet: the switcher is printed and labelled
      (the footer script shortens it to D/E) but hidden. The per-site corner
      rules stay untouched, so each subsite keeps showing its own corner only
      (interior -> right, industrial -> left), and the door stays clean.
   2. At <=720px the subsites shrink the mark to 32x55 and push it into a
      corner, while the portal centres it. Centring matches the door.
   ========================================================================== */

/* 1. Switcher: visible again on content pages, still hidden on the door. */
.language-switch {
	display: block;
}

.landingpage .language-switch {
	display: none;
}

/* 2. #content keeps its 25px gutter without overflowing.
   The base sheet has `#content{float:left;width:100%}` and the child sheet adds
   `padding-left:25px; padding-right:25px`. Under content-box sizing that produced a 1490px box in a
   1440px viewport, so the 1060px column centred 25px right of the screen (measured: content centre 745
   against a viewport centre of 720). border-box keeps the gutter and the centring. */
#content {
	box-sizing: border-box;
}

/* 3. Z mark: exactly where the portal puts it, on every page of the two design subsites.
   Measured on `/`: the mark sits top-centre above 720px (80x144 at y=75, horizontal offset 0) and
   screen-centred at or below 720px (80x144, both offsets 0). The subsites already match above 720px; the
   difference was mobile, where the theme shrinks the mark to 32x55 while the wrapper stays 80x144, so the
   mark sat ~45px above the centre it was supposed to occupy. Sizing the mark with the wrapper fixes it.
   Transform instead of margins: the base stylesheet sets `margin-left: auto !important` on the wrapper
   and zeroes the mark's own margin below 720px, so offset hacks are overridden anyway. */
@media screen and (max-width: 720px) {
	.interior-design .logo-wrapper,
	.industrial-design .logo-wrapper {
		position: fixed;
		left: 50% !important;
		right: auto !important;
		top: 50%;
		margin: -72px 0 0 -40px !important;
		transform: none !important;
		width: 80px !important;
		height: 144px !important;
	}

	/* The mark has to fill the wrapper, otherwise centring the wrapper centres nothing.
	   The portal keeps the 80x144 mark at this width as well. */
	.interior-design .image-logo,
	.interior-design .image-logo-dark,
	.interior-design .logo .image-logo-wrapper,
	.industrial-design .image-logo,
	.industrial-design .image-logo-dark,
	.industrial-design .logo .image-logo-wrapper {
		width: 80px !important;
		height: 144px !important;
	}

	.interior-design .logo,
	.industrial-design .logo {
		margin-left: 0 !important;
	}

	/* Keep the switcher on screen: the base rules move it to `top: 25px; position: absolute`
	   below 720px, which put it past the bottom edge when the page is long. */
	.language-switch {
		position: fixed;
		top: auto;
		bottom: 25px;
		z-index: 999;
	}

	.left-language-switch {
		left: 25px;
		right: auto;
	}

	.right-language-switch {
		right: 25px;
		left: auto;
	}
}

/* ---- override: zumbuehl-2.0.2-slider-dots.css ---- */
/*
 * Project header slider: keep the pagination dots on screen.
 *
 * `.slick-dots` is `position:absolute; bottom:25px` inside `.header-slider`, so the dots sit on the lower
 * edge of a 700px-tall image and scroll away with it - on a short laptop viewport they are below the fold
 * before the visitor ever sees them.
 *
 * They cannot simply be pinned from where they are: `.header-image` carries a transform (which makes it
 * the containing block for `position:fixed`) and `.header-image-wrapper` is `overflow:hidden`. So the
 * script (overrides/*.js) moves the dots list to `<body>` and toggles `sc-slider-dots--visible` while the
 * slider is on screen. Same nodes, so slick's own click handling and `slick-active` tracking keep working.
 */
.sc-slider-dots {
	position: fixed !important;
	top: auto !important;
	right: 0;
	bottom: 25px !important;
	left: 0;
	width: 100%;
	margin: 0 !important;
	z-index: 98;
	opacity: 0;
	visibility: hidden;
	pointer-events: none;
	transition: opacity 0.25s ease, visibility 0.25s ease;
}

.sc-slider-dots.sc-slider-dots--visible {
	opacity: 1;
	visibility: visible;
	pointer-events: auto;
}

/* Keep the dots above the image but below the fixed site header (z-index 999). */

@media (prefers-reduced-motion: reduce) {
	.sc-slider-dots {
		transition: none;
	}
}

/* ---- override: zumbuehl-2.0.3-portal-bg.css ---- */
/*
 * Portal: a different landing image per visit.
 *
 * Two classes, on two different elements: `.zd-portal-bg-ready` is set on `<html>` by the head script
 * once it has chosen, `.zd-portal-random` on `<body>` by the theme's body_class filter. Hence the
 * descendant selector - a compound `.a.b` would never match.
 *
 * The image is an inline `style` attribute on `#content`, so `!important` is required to beat it.
 * Gating on `.zd-portal-bg-ready` means a visitor without JavaScript keeps the original image rather
 * than losing the background entirely.
 */
.zd-portal-bg-ready .zd-portal-random #content {
	background-image: var(--zd-portal-bg, none) !important;
}


/* ---- override: zumbuehl-2.1.0-project-meta.css ---- */
/*
 * Project details: label and value on one line.
 *
 * `single-atp_project.php` prints the label, a hardcoded `<br>`, then the value - so every project read
 *
 *     Material:
 *     Diverses
 *
 * The template ships inside the supplied theme source and stays untouched; hiding the break yields
 * "Material: Diverses" (the whitespace around the `<br>` collapses to one space) without touching markup
 * or data. Same for the Company line and for the "Year …" line, whose value is empty on projects without
 * a `Umgesetzt von` entry - that trailing break was rendering an empty line.
 *
 * The description prose itself contains no `<br>` at all (checked on three projects), so nothing else is
 * affected.
 */
.project-meta br {
	display: none;
}

/* ---- override: zumbuehl-2.1.3-interior-text.css ---- */
/*
 * Interior subsite: text centred, measure reduced to two thirds.
 *
 * The theme right-aligns body copy (`text-align: right` is inherited from `.page-content`), and the text
 * column is a 636px grid column inside the 1060px page. Requested: centred text, on a measure of about
 * two thirds of the regular content width, itself centred.
 *
 * Scoped to `.content-container` - the prose column - so the portfolio grid, the filter row and the
 * address sidebar keep their layout.
 */
.interior-design .page-content .content-wrapper:not(:has(.sidebar-right)) .content-container {
	float: none;
	width: 100%;
	max-width: 707px;
	margin-left: auto;
	margin-right: auto;
}

/* Text alignment is not set here: it comes from the shared setting in
   zumbuehl-2.1.4-content-align.css, so interior and industrial cannot disagree. */


/* Below the tablet breakpoint the measure follows the screen instead of a fixed 707px. */
@media screen and (max-width: 720px) {
	.interior-design .page-content .content-container {
		max-width: 100%;
	}
}

/* ---- override: zumbuehl-2.1.3-portal-contact.css ---- */
/*
 * Portal: unlock the single-screen lock and style the contact block below it.
 *
 * The landing template is deliberately one screen high: `body.landingpage` is overflow:hidden and
 * `#main-container` is fixed at 100vh, so there was nothing to scroll to and no scroll indicator element
 * at all (the 2016 capture behaves the same way - this is a new block, not a lost one).
 *
 * Releasing the lock: the container goes back into normal flow at the same 100vh, the body scrolls, and
 * the contact block printed by `zd_portal_contact_section()` (wp_footer) becomes reachable.
 */
body.landingpage {
	overflow-y: auto !important;
}

.landingpage #main-container {
	position: relative !important;
	top: auto !important;
	left: auto !important;
	height: 100vh;
}

.zd-portal-contact {
	position: relative;
	z-index: 3;
	background-color: #ffffff;
	padding: 90px 25px 110px;
}

/* Two thirds of the site's regular 1060px column, centred - the same measure as the contact page's
   text column, so the block reads as the same content rather than a different layout. */
.zd-portal-contact__grid {
	display: block;
	max-width: 707px;
	margin: 0 auto;
	text-align: center;
}

.zd-portal-contact__title {
	margin: 0 0 40px;
	text-align: center;
}

.zd-portal-contact__meta {
	margin: 0 0 40px;
	text-align: center;
}

.zd-portal-contact__meta p,
.zd-portal-contact__body p {
	margin: 0 0 18px;
	text-align: center;
}

.zd-portal-contact__body p:last-child,
.zd-portal-contact__meta p:last-child {
	margin-bottom: 0;
}

@media screen and (max-width: 720px) {
	.zd-portal-contact {
		padding: 60px 25px 80px;
	}
}

/* ---- override: zumbuehl-2.1.4-content-align.css ---- */
/*
 * Content alignment, shared by interior and industrial.
 *
 * Measured on the live sites: interior inherited `text-align: right` from `.page-content`, industrial uses
 * `left`. This makes both follow one setting (Network Admin -> Settings -> Content alignment), with left -
 * the industrial behaviour - as the default.
 *
 * Set on `.page-content` because paragraphs inherit from it, which is how the theme itself does it.
 */
body.interior-design .page-content,
body.industrial-design .page-content {
	text-align: left;
}

body.zd-content-align-right .page-content {
	text-align: right !important;
}

/* The centred measure from zumbuehl-2.1.3-interior-text.css is a width rule, not an alignment one; text
   inside it follows the setting like everywhere else. The contact form and address blocks stay centred
   on their own axis only while the setting is left. */
body.interior-design.zd-content-align-right .page-content .content-container {
	text-align: right !important;
}

/* ===== zumbuehl-2.1.5-signature.css ===== */
/*
 * The "Z-Designstudio" signature belongs after the content.
 *
 * Measured: the footer strip is pinned to the bottom of the viewport, so on the portfolio overview - a
 * 29,515px document - the signature floats over the grid the whole way down, and on the portal it sits
 * behind the full-screen image. Both already carry the brandmark, so the signature is redundant there.
 * On content pages (contact, project) the page ends at the footer, which is exactly "after the content".
 */
.landingpage .footer-description,
.page-template-template-portfolio .footer-description {
	display: none;
}
/*
 * Portal: the page's own content, between the hero and the contact block.
 *
 * Printed from `zd_portal_content_section()` on wp_footer (priority 4), so it sits outside the 100vh hero container
 * and above the contact block. Same measure as the contact block (707px, two thirds of the 1060 column) so the two
 * read as one column of content rather than two different layouts.
 */
.zd-portal-content {
	position: relative;
	z-index: 3;
	background-color: #ffffff;
	padding: 90px 25px 0;
}

.zd-portal-content__grid {
	display: block;
	max-width: 707px;
	margin: 0 auto;
	text-align: left;
}

.zd-portal-content__grid > :first-child {
	margin-top: 0;
}

.zd-portal-content__grid > :last-child {
	margin-bottom: 0;
}

.zd-portal-content__grid img {
	max-width: 100%;
	height: auto;
}
/*
 * Portal: let the hero keep one screen while the content and contact block flow UNDER it.
 *
 * The base theme pins `.landingpage #main-container` to `position: fixed; height: 100vh`, and the contact block is
 * printed by wp_footer INSIDE that container. Measured on live 2026-11-02: `.zd-portal-contact` had rect
 * [0,0,1440,1222] at `top: 0`, z-index 3, white - it covered the hero completely, and `scrollHeight` was 900, so
 * there was nothing to scroll either. That is the "background images not visible" report: the photo was there, the
 * white block was on top of it.
 *
 * So: container goes back into flow and is allowed to grow, `#content` keeps exactly one screen, and everything
 * printed after it - the page content section, then the contact block - stacks underneath.
 */
body.landingpage #main-container {
	position: relative !important;
	height: auto !important;
	min-height: 100vh !important;
	max-height: none !important;
	overflow: visible !important;
}

body.landingpage #content,
body.landingpage .main-container-wrapper {
	height: 100vh !important;
	min-height: 100vh !important;
	max-height: none !important;
}

/*
 * Portal: let the hero keep one screen while the content and contact block flow UNDER it.
 *
 * The base theme pins `.landingpage #main-container` to `position: fixed; height: 100vh`, and the contact block is
 * printed by wp_footer INSIDE that container. Measured on live 2026-11-02: `.zd-portal-contact` had rect
 * [0,0,1440,1222] at `top: 0`, z-index 3, white - it covered the hero completely, and `scrollHeight` was 900, so
 * there was nothing to scroll either. That is the "background images not visible" report: the photo was there, the
 * white block was on top of it.
 *
 * So: container goes back into flow and is allowed to grow, `#content` keeps exactly one screen, and everything
 * printed after it - the page content section, then the contact block - stacks underneath.
 */
body.landingpage #main-container {
	position: relative !important;
	height: auto !important;
	min-height: 100vh !important;
	max-height: none !important;
	overflow: visible !important;
}

body.landingpage #content,
body.landingpage .main-container-wrapper {
	height: 100vh !important;
	min-height: 100vh !important;
	max-height: none !important;
}

/*
 * ...and the container has to leave the float.
 *
 * The base theme has `#main-container { float: left }`. A float is out of normal flow, so the contact block that follows
 * it starts at y=0 and the float overlaps it - and because the contact block is white with z-index 3, it paints over the
 * photo. That is the mechanism behind "the portal images are not visible": the image element was there and full-bleed the
 * whole time. Measured on the clone: `#main-container` 0..984, `.zd-portal-contact` 0..1306, and `elementFromPoint` at the
 * centre of the first screen returned the contact block.
 */
body.landingpage #main-container {
	float: none !important;
	clear: both !important;
}

/*
 * The body was pinned to one screen as well: `body { height: 900px; overflow: hidden auto }` made the body its own scroll
 * box while `html.scrollHeight` stayed exactly at the viewport height, so the page itself could not be scrolled. Let the
 * document grow instead and scroll normally.
 */
body.landingpage {
	height: auto !important;
	min-height: 100vh !important;
	max-height: none !important;
}

/*
 * The awards badge: 25% larger than the 2.1.6 halving, snapped to a 4px scale.
 *
 * It is a `::before` label image (`awards_label_bg.png`, stretched with `background-size: 100% 100%`) with the word
 * "award" set as text on top, so the box, the type and the overhang have to scale together or the graphic squashes and
 * the word overflows.
 *
 * Operator, 2026-11-03: "award label make it 25% bigger, use 4px compatible number". The halved sizes were 75x20 with
 * 11px type and 50x14 with 8px; +25% is 93.75x25 / 13.75px and 62.5x17.5 / 10px, so each lands on the nearest multiple of
 * 4: **96x24 with 14px type** and **64x16 with 10px type**. The overhang was -20 -> -24, which put the whole label
 * above the tile and touched its edge.
 *
 * Operator, later the same day: "award label on tile should be half on card and half of card". The overhang is half the
 * box height now - `top: -12px` for 24px, `-8px` for 16px - so the label paints 12px above the tile edge and 12px over
 * the photo. The grid's 25px reserve above row 0 is left as it is: tightening it would shift every tile on the page.
 *
 * `line-height` equals the box height on purpose: half-leading then splits the space evenly (24-14)/2 = 5px above and
 * below, 16-10 = 3px on the phone. Equal padding by construction, not by two numbers that can drift.
 */
li.atp-project.awards:before {
	box-sizing: border-box;
	width: 96px;
	height: 24px;
	font-size: 14px;
	line-height: 24px;
	letter-spacing: 0.2em;
	padding: 0 0 0 4px;
	right: 12px;
	top: -12px;
}

@media screen and (max-width: 720px) {
	li.atp-project.awards:before {
		box-sizing: border-box;
		width: 64px;
		height: 16px;
		font-size: 10px;
		line-height: 16px;
		letter-spacing: 0.1em;
		padding: 0 0 0 4px;
		right: 8px;
		top: -8px;
	}
}

/*
 * Portfolio article: the title shares the copy column's axis; bigger and tighter on desktop, body copy a step smaller.
 *
 * The template prints the h1 as the first child of the `.content-right` copy column, so the title's left edge, width and
 * wrap point are the column's own at every breakpoint - nothing to keep in sync by hand. Measured on the clone
 * 2026-11-03: at 1440 px the copy column runs x 190 -> 826 (636 px) while the title sat at x 25 -> 1415, i.e. 165 px off
 * the text it belongs to. Below 1101 px the columns already stack and both were at x 25, so only the desktop was wrong.
 *
 * `padding: 0` cancels the base theme's `.post-title { padding: 0 45px }`, which would indent the title from the copy
 * underneath it. `text-align: left` keeps it left-aligned next to the copy: the base theme right-aligned the title for
 * the days when it sat in the narrow sidebar column.
 */
.single-atp_project .post-title {
	font-size: clamp(28px, 4.2vw, 52px);
	line-height: 1.05;
	margin: 0 0 0.3em;
	padding: 0;
	text-align: left;
}

/*
 * Narrow widths: the copy column (title + body copy) comes first.
 *
 * The template prints the meta panel before the copy column, which is what lets it float to the right on desktop
 * (the columns split at 1101 px, measured). Stacked below that, DOM order would open the article with "Material /
 * Company / Year" and only then the title. Ordering the copy column first keeps every width opening with the title,
 * and the meta panel follows underneath.
 */
@media (max-width: 1100px) {
	.single-atp_project .content-wrapper {
		display: flex;
		flex-direction: column;
	}

	.single-atp_project .content-wrapper .content-right {
		order: -1;
	}
}

/*
 * Body copy: 18 px at a 1.4 line-height from the first desktop breakpoint up.
 *
 * The theme shipped 23 px / 1.5 for page copy, and 2.1.6 set the portfolio article to 20 px / 1.3. The operator asked for
 * one size across the content (2026-11-03: "decrease text size of content to 18px and 1.4 on desktop"), so both selectors
 * are listed here - the article's copy sits in `.content-container`, a page's in `.page-content`.
 *
 * Below 721 px the theme's 14 px stays: shrinking that further would hurt readability on a phone. The right column keeps
 * its own 14 px, which is set with `!important` in the theme and is untouched by this.
 */
@media (min-width: 721px) {
	.single-atp_project .content-container p,
	.page-content p {
		font-size: 18px;
		line-height: 1.4;
	}
}

/* ==========================================================================
   Interior layout: titles above the content, right column right-aligned
   ========================================================================== */

/*
 * Page titles on the interior site sit above the content area and are left-aligned.
 *
 * The theme sets `.interior #main-container .post-title { text-align: right }` (style.css:1010) with an ID selector, so a
 * plain class cannot beat it. This carries the same ID plus the body class. The Motivation and Contact templates print the
 * <h1> as the first child of `.content-wrapper` now, so it is above the columns instead of inside one.
 */
body.interior-design #main-container .post-title {
	text-align: left;
}

/*
 * The right column stays right-aligned.
 *
 * The interior theme right-aligns `#main-container`, then the content-alignment override (zumbuehl-2.1.4-content-align.css)
 * left-aligns `.page-content`, and the column inherits that. This gives the column its own alignment back at ID-level
 * specificity, later in the cascade than the theme's rule.
 */
body.interior-design #main-container .sidebar-right,
body.interior-design #main-container .sidebar.sidebar-right {
	text-align: right;
}

/* A title that lives inside the right column follows that column, not the page axis. */
body.interior-design #main-container .sidebar-right .post-title {
	text-align: right;
}

/*
 * A hairline between the blocks inside the right column.
 *
 * Motivation and Contact stack child sections (`.section`); a project article stacks its meta lines
 * (`.project-meta p`). Both read as a column of separate blocks, and the operator asked for that separation to be visible
 * (2026-11-03). `rgba`, not a new palette hex, so it sits correctly on the white card and the grey article surface alike.
 */
body.interior-design #main-container .sidebar-right .section + .section,
body.interior-design #main-container .sidebar-right .project-meta p + p {
	border-top: 1px solid rgba(0, 0, 0, 0.15);
	margin-top: 18px;
	padding-top: 18px;
}

/* ==========================================================================
   Phone layout: the Z out of the grid, and a readable card title
   ========================================================================== */

/*
 * Below 720px the Z is a fixed, screen-centred watermark (zumbuehl-2.0.1-theme.css), so on a phone it lands on a project
 * card: measured 2026-11-03 at 515px, the mark sat at 218,528 while the first card spans 25,300 -> 490,765 - the letter
 * covered both the picture and its title. It stays fixed (so it does not scroll away) but moves to the top-left, where
 * the header is, at the theme's original phone size. The portal keeps the centred mark: this is scoped to the two
 * design subsites.
 */
@media screen and (max-width: 720px) {
	.interior-design .logo-wrapper,
	.industrial-design .logo-wrapper {
		left: 25px !important;
		right: auto !important;
		top: 25px !important;
		bottom: auto !important;
		margin: 0 !important;
	}

	.interior-design .image-logo,
	.interior-design .image-logo-dark,
	.interior-design .logo .image-logo-wrapper,
	.industrial-design .image-logo,
	.industrial-design .image-logo-dark,
	.industrial-design .logo .image-logo-wrapper {
		width: 32px !important;
		height: 55px !important;
	}
}

/*
 * The card title's ground used to be a 55% black scrim on the caption box, which the theme's Customizer CSS then covered
 * with a white 85% veil (`.atp-project-details::before`) - so the caption read as pale grey and, on a pale photo, the white
 * text was white on white (measured 2026-11-03 on a white test photo: ground #EAEAEA, text #FFF, about 1.1:1).
 *
 * The ground now lives on that veil instead, black and transparent, in `zumbuehl-2.1.16-card-hover.css`. This block's old
 * `.atp-project-details { background-color: rgba(0, 0, 0, 0.55) }` is deleted rather than left in place: two scrims stack,
 * and the second one is what turned the hover grey.
 */

/*
 * No text drop shadows anywhere on this site. Ever.
 *
 * The operator's instruction, 2026-11-03: "no text drop shadow never". One guard instead of trusting every present and
 * future rule: the shipped theme carries one in `resources/css/main-style.css`, the plugin carried one on its phone
 * caption, and these cards were given one earlier the same day. All of those are deleted; this stops a stylesheet, a
 * widget, a plugin update or a future edit from bringing the effect back.
 */
* {
	text-shadow: none !important;
}

/* ==========================================================================
   Design system: type scale, page patterns, alignment
   --------------------------------------------------------------------------
   Everything below states a rule ONCE, by role, so a page cannot end up with a private exception. It supersedes the
   per-page edits from 2.1.3 (centred measure), 2.1.4 (alignment), 2.1.6 (article type), 2.1.9 (surface), 2.1.10
   (interior layout) and 2.1.14 (motivation columns). Those files stay as history; this block is the one to edit.

   Measured confusion it replaces, 2026-11-03: 31 `text-align` declarations, 75 `width:` declarations, 22 `float:`
   declarations and 129 `!important`s in the merged sheet, several of them contradicting each other page by page.
   ========================================================================== */

/* --------------------------------------------------------------------------
   1. Type scale - four roles, no per-page sizes.
   -------------------------------------------------------------------------- */
:root {
	--zd-font-display: clamp(28px, 4.2vw, 52px); /* page and article titles */
	--zd-line-display: 1.05;
	--zd-font-body: 18px;                        /* prose, desktop */
	--zd-line-body: 1.4;
	--zd-font-meta: 14px;                        /* right column, captions, filters */
	--zd-line-meta: 1.5;
}

/* Titles: one size, one alignment, above the content. */
.post-title,
.page-title {
	font-size: var(--zd-font-display);
	line-height: var(--zd-line-display);
	text-align: left;
	padding: 0;
	margin: 0 0 0.6em;
}

/* Prose: one size. The theme's 14px below 721px is the phone size and is left alone. */
@media (min-width: 721px) {
	.content-container p,
	.page-content p {
		font-size: var(--zd-font-body);
		line-height: var(--zd-line-body);
	}
}

/* Small text: one size. */
.sidebar-right p,
.atp-project-title,
.atp-filters li a,
.bogo-language-switcher li a {
	font-size: var(--zd-font-meta);
	line-height: var(--zd-line-meta);
}

/* --------------------------------------------------------------------------
   2. Page patterns - a page is either prose-only or prose + right column.
      Both are stated here, once, for every template that uses those classes.
   -------------------------------------------------------------------------- */

/* 2a. Single-column prose: a centred reading measure. */
.page-content .content-container {
	max-width: 707px;
	margin-left: auto;
	margin-right: auto;
	float: none;
	width: 100%;
}

/* 2b. Two columns: copy 60% left, right column 40% right, gutter inside the right column.
      60 + 40 = 100 exactly - a margin on the copy as well would push the float to the next line (that bug cost a
      round on /interior/motivation/). */
@media (min-width: 1101px) {
	.page-content .content-container.content-left,
	.page-content .content-container.content-right,
	.page-content .content-container.two-third-column,
	.content-wrapper > .content-right.content-container {
		float: left;
		width: 60%;
		max-width: none;
		margin-left: 0;
		margin-right: 0;
	}

	.sidebar-right,
	.sidebar.sidebar-right {
		float: right;
		width: 40%;
		padding-left: 5.3%;
		margin-left: 0;
	}
}

/* 2c. Below the two-column breakpoint everything stacks, copy first. */
@media (max-width: 1100px) {
	.page-content .content-container,
	.content-wrapper > .content-right.content-container {
		float: none;
		width: 100%;
		max-width: none;
		margin-left: 0;
		margin-right: 0;
	}

	.content-wrapper {
		display: flex;
		flex-direction: column;
	}

	.content-wrapper > .content-right.content-container {
		order: -1;
	}
}

/* --------------------------------------------------------------------------
   3. Alignment - content left, right column right. Stated once.
   -------------------------------------------------------------------------- */
.page-content,
.content-container,
.post-title,
.page-title {
	text-align: left;
}

.sidebar-right,
.sidebar.sidebar-right {
	text-align: right;
}

.sidebar-right .post-title {
	text-align: right;
}

/* --------------------------------------------------------------------------
   4. Colour roles - text that sits on a photograph is white.
      The plugin set this only inside its no-hover/phone block, so on desktop the
      label was black on a dark scrim: measured 2026-11-03, rgb(0,0,0) on
      rgba(0,0,0,.55). The last two selectors carry the grid path on purpose -
      the theme's customizer prints `.atp-project-details-container > a { color: #000 }`
      into an inline <style> later in the document, so a shorter selector ties
      with it and loses on order.
   -------------------------------------------------------------------------- */
.atp-project-details,
.atp-project-details .atp-project-categories span,
.atp-project-details .atp-project-excerpt,
.atp-grid-portfolio .atp-projects > li .atp-project-details a,
.atp-grid-portfolio .atp-projects > li .atp-project-details-container > a {
	color: #fff;
}

/* ==========================================================================
   Card hover: the ground goes black - dark tile, no grey wash
   ========================================================================== */

/*
 * Operator, 2026-11-03: "the hover on cards/tiles is still grey instead of grey use black make tranparent a lot so dark".
 *
 * The grey was not the blur and not the tint - it was the veil *behind* both. The theme's Customizer CSS (printed inline in
 * the head, comment "/* grid *\/") puts a full-tile pseudo-element over every photo:
 *
 *   .atp-grid-portfolio .atp-project-details::before { background-color: #ffffff; opacity: 0.85; }
 *
 * Measured: white at 85%, on every device. Anything dark underneath it can only come out grey, because 85% white dominates
 * what is left - which is why three rounds of lowering the blur (6px -> 3px -> 2px) all still read grey.
 *
 * So the veil itself is repainted black and made transparent, and it becomes the single ground for the caption:
 *
 *   - black at 55% over the photo = 45% of the picture survives, which is exactly what the old 55% scrim on the caption box
 *     was doing, minus the white wash that made the white 14px title vanish on a pale photo (measured on a white test photo
 *     before this change: ground #EAEAEA, title #FFF, about 1.1:1 - invisible).
 *   - the caption box's own scrim stands down, in `zumbuehl-2.1.12-phone-legibility.css` for the theme's copy of the rule and
 *     here for the plugin's touch-screen copy. Two scrims stack into mud.
 *   - hover adds `brightness(0.85)` on the image, a uniform scale of every channel, so hue and saturation survive instead of
 *     being averaged away the way a blur averages them.
 *
 * Measured after, on a pure-white test photo: the veil alone composites to #737373, which is 4.74:1 for the white 14px title
 * (the phone case, where the caption is always visible), and hover adds the image darkening for #626262 and 6.10:1. On a
 * colour test photo the hover keeps 97% of the tile's saturation while dropping its luminance to 38% - dark, and still the
 * same picture instead of a grey wash. No text shadow anywhere (AGENTS.md).
 *
 * The `scale(1.03)` is gone with the blur: it existed only to push the blurred image's soft, semi-transparent fringe outside
 * the figure's `overflow: hidden`, so without a blur it was jitter for nothing.
 *
 * Two knobs, if it needs another pass: the veil's `opacity` for how black the tile gets, `blur()` for how soft the picture goes.
 */

/*
 * Operator, 2026-11-03 (after 2.1.45): "tile on hover background blur should be encreased".
 *
 * The blur had been taken out entirely in 2.1.40 - at the time it was the suspected source of the grey, which turned out to be the
 * theme's white veil. With the veil repainted black the picture can be softened again without washing out, so the hover filter carries
 * both: `blur(6px)` for the softness and `brightness(0.85)` for the darkening.
 *
 * 6px is deliberately a length and not a share of the tile: a cqi-based blur would be ~10px on the full-width hero and still 10px on a
 * 223px square, and the squares have no room for it. `scale(1.05)` is back with the blur for the same reason it existed the first
 * time - a blurred picture fades out over roughly the blur radius at its edges, which would show as a pale rim inside the tile. On the
 * narrowest tile (223px) 5% is 5.6px of headroom per side against 6px of blur, so the rim stays under a pixel; on the hero it is 26px.
 */
.atp-grid-portfolio .atp-projects > li .atp-project-details::before,
.atp-carousel-portfolio .atp-projects > li .atp-project-details::before {
	background-color: #000000;
	opacity: 0.55;
}

/*
 * One ground, not two. The plugin carries its own 55% scrim for the always-on touch caption, and its selector is
 * `.atp-hover-style-fade .atp-grid-portfolio .atp-projects > li .atp-project-details` - four classes, which outranks a
 * plain three-class rule whatever the load order (measured the naive version at 390px: ground #343434, i.e. scrim and veil
 * stacked).
 *
 * `li.atp-project` in the chain is what buys the fourth class. Note `.atp-portfolio-wrapper` and `.atp-grid-portfolio` sit on
 * the SAME div (`<div class="atp-portfolio-wrapper atp-grid-portfolio atp-columns-4">`), so they have to be written compound -
 * a descendant space between them made these rules match nothing, which is how the phone kept the stacked scrim.
 */
html body .atp-portfolio-wrapper.atp-grid-portfolio .atp-projects > li.atp-project .atp-project-details,
html body .atp-portfolio-wrapper.atp-carousel-portfolio .atp-projects > li.atp-project .atp-project-details,
html body .atp-grid-portfolio .atp-projects > li.atp-project .atp-project-details,
html body .atp-carousel-portfolio .atp-projects > li.atp-project .atp-project-details {
	background-color: transparent;
}

@media (hover: hover) and (pointer: fine) {
	ul.atp-projects li.atp-project .atp-project-thumb img {
		transition: filter 0.35s ease, transform 0.35s ease;
	}

	ul.atp-projects li.atp-project:hover .atp-project-thumb img,
	ul.atp-projects li.atp-project:focus-within .atp-project-thumb img {
		filter: blur(6px) brightness(0.85);
		transform: scale(1.05);
	}
}

@media (prefers-reduced-motion: reduce) {
	ul.atp-projects li.atp-project .atp-project-thumb img {
		transition: none;
	}
}

/* ==========================================================================
   Portal: the site's own text at the top of the text column
   ========================================================================== */

/*
 * Printer: `zd_portal_sitetext_section()` in functions.php, wp_footer priority **2** - above the page content (3) and the
 * contact block (5). Operator, 2026-11-03: "abovbe the content not below".
 *
 * Same treatment as `.zd-portal-content` so the page reads as one column: white ground, the 707px measure, left aligned.
 * No bottom padding: the content section that follows opens with its own 90px, and stacking both would double the gap.
 */
.zd-portal-sitetext {
	position: relative;
	z-index: 3;
	background-color: #ffffff;
	padding: 90px 25px 0;
}

.zd-portal-sitetext__grid {
	display: block;
	max-width: 707px;
	margin: 0 auto;
	text-align: left;
}

/*
 * The name is a step below the display size it used to take (28-52px): operator, 2026-11-03, "on portal site titel a bit
 * smaller". 22-38px is roughly three quarters of the old scale, which keeps it a heading over the body copy below without
 * competing with the hero - and it is a longer sentence now, so the same size wrapped to three lines.
 */
.zd-portal-sitetext__name {
	font-size: clamp(22px, 3.2vw, 38px);
	line-height: 1.15;
	text-align: left;
	margin: 0 0 0.4em;
	text-transform: none;
}

.zd-portal-sitetext__desc {
	font-size: var(--zd-font-body, 18px);
	line-height: var(--zd-line-body, 1.4);
	margin: 0;
}

.zd-portal-sitetext__desc:first-child {
	margin-top: 0;
}

/* ==========================================================================
   Project page: the meta panel starts level with the copy
   ========================================================================== */

/*
 * Operator, 2026-11-03: "meta should be further down on desktop and start with text content on the same height".
 *
 * It used to sit level with the <h1>: the right column began at the title's top while the left column's first
 * paragraph began a title-height lower - measured at 1440 on /interior/project/863/, meta at 750 and the first
 * paragraph at 820. Two starting heights on one page.
 *
 * Structural, not a nudge. Padding the meta down by 70px would only line up for single-line titles, and project
 * titles wrap at this width. So the <h1> moved out of the copy column and up to be a child of `.content-wrapper`
 * (single-atp_project.php), and the wrapper is a two-column grid: the title owns row 1 of the copy column, the copy
 * and the meta share row 2. Whatever height the title takes - one line or three - both columns start together.
 *
 * The meta's left indent is 13.25% of its own column rather than 5.3% of the wrapper: a percentage padding resolves
 * against the grid area it sits in, and 5.3% of 1060px is the same place as 13.25% of that 40% column (56px at 1440),
 * so the meta keeps exactly the left edge it had at every width.
 */
@media (min-width: 1101px) {
	.single-atp_project .content-wrapper {
		display: grid;
		grid-template-columns: 60% 40%;
		align-items: start;
	}

	.single-atp_project .content-wrapper > .content-right.content-container {
		grid-column: 1;
		grid-row: 2;
		float: none;
		width: auto;
	}

	.single-atp_project .content-wrapper > .sidebar-right {
		grid-column: 2;
		grid-row: 2;
		float: none;
		width: auto;
		padding-left: 13.25%;
	}

	.single-atp_project .content-wrapper > .post-title {
		grid-column: 1;
		grid-row: 1;
	}
}

/* Stacked below the two-column breakpoint: the title is a wrapper child now, so it needs to say so. */
@media (max-width: 1100px) {
	.single-atp_project .content-wrapper > .post-title {
		order: -2;
	}
}

/* ==========================================================================
   Menu: same gap between the burger and its list on every subsite
   ========================================================================== */

/*
 * Operator, 2026-11-03: "move up the menu to the trigger same gap as industrial". The list now follows its own burger
 * again - the earlier attempt pinned it so both subsites' menus lined up, which left 47px of air between interior's
 * burger and its list. This keeps the list hanging off the trigger, as it did before, on both subsites.
 *
 * The last pixel: the hamburger's bar is 4px in the bold face and 3px in the light one, so the icon box is 44px on
 * interior against 43px on industrial and the gap under it differed by that 1px. Reserving the taller content height
 * makes both boxes 44px, so the burger-to-list gap measures the same on both.
 */
.main-navigation > .menu-icon {
	min-height: 4px;
}

/* ==========================================================================
   Modern text layout: balanced headings, pretty paragraphs
   ========================================================================== */

/*
 * Operator, 2026-11-03: "also use modern typgrpahy css rules to make titles and pargapahs look better".
 *
 * Everything here is progressive: each enhancement sits behind `@supports`, so a browser that does not know the property
 * renders exactly what it rendered before - no layout depends on it, and nothing is hidden or truncated. The two that
 * change how a block looks:
 *
 *   text-wrap: balance   headings break into even lines instead of leaving one long line and one orphan word. Chrome
 *                        caps it at ~6 lines, which is exactly the range a title lives in.
 *   text-wrap: pretty    paragraphs avoid a short last line (an orphan) by re-wrapping the last few lines. Body copy
 *                        only: on a long page it is a little more work than `wrap`, so it stays off headings.
 *
 * The rest is quiet typographic hygiene that the theme never set:
 *
 *   font-kerning + ligatures   the bundled face carries both; without the request the browser may skip them at small
 *                              sizes, which is where "Av" and "fi" look cheapest.
 *   overflow-wrap: break-word  a long German compound or a pasted URL breaks instead of pushing the column wide - the
 *                              prose measure is 707px and an unbreakable token used to overrun it.
 *   hyphens: auto              body copy only, never headings: hyphenation on a 2-3 line title reads as a mistake, on a
 *                              justified-looking German paragraph it is what keeps the rag calm.
 *   orphans / widows           three lines minimum either side of a break, for print and for paged previews.
 *   hanging-punctuation        Safari only; a leading quote then sits outside the measure instead of indenting the line.
 *   letter-spacing: -0.01em    on display sizes only. Large type needs a touch less tracking than body copy; the theme
 *                              carried -0.01px, which is a hundredth of a pixel and did nothing.
 */
@supports (text-wrap: balance) {
	h1,
	h2,
	h3,
	h4,
	h5,
	h6,
	.post-title,
	.page-title,
	.zd-portal-sitetext__name,
	.zd-portal-contact__title,
	.atp-project-title,
	.content-container h1,
	.content-container h2,
	.content-container h3 {
		text-wrap: balance;
	}
}

@supports (text-wrap: pretty) {
	p,
	li,
	blockquote,
	.content-container p,
	.page-content p,
	.sidebar-right p,
	.zd-portal-sitetext__desc {
		text-wrap: pretty;
	}
}

body {
	font-kerning: normal;
	font-variant-ligatures: common-ligatures contextual;
}

h1,
h2,
h3,
h4,
h5,
h6,
.post-title,
.page-title,
.zd-portal-sitetext__name {
	/* Long compounds and pasted URLs break instead of widening the column. */
	overflow-wrap: break-word;
	hanging-punctuation: first last;
	letter-spacing: -0.01em;
}

.content-container p,
.page-content p,
.sidebar-right p,
.zd-portal-sitetext__desc,
.zd-portal-contact__meta p,
blockquote {
	overflow-wrap: break-word;
	hyphens: auto;
	-webkit-hyphens: auto;
	hyphenate-limit-chars: 6 3 3;
	orphans: 3;
	widows: 3;
}

/* ==========================================================================
   Portal: the text area is a page with a right column
   ========================================================================== */

/*
 * Operator, 2026-11-03: "make contact a sperate colum next to the content like the other pages". The portal's white area
 * used to be three stacked full-width sections (site text, page copy, contact); `zd_portal_sitetext_section()` now prints
 * one section holding both columns, so the shape matches the interior and industrial pages: 60% copy, 40% right column,
 * 1060px measure, the same 5.3% indent on the column that the article pages use.
 *
 * Below 1100px the columns stack, copy first, exactly like `.content-wrapper` does on those pages.
 */
.zd-portal-text {
	position: relative;
	z-index: 3;
	background-color: #ffffff;
	padding: 90px 25px 110px;
}

.zd-portal-text__grid {
	display: grid;
	grid-template-columns: 60% 40%;
	align-items: start;
	max-width: 1060px;
	margin: 0 auto;
}

.zd-portal-text__main {
	min-width: 0;
}

/*
 * The contact column keeps the site's right-column convention: right-aligned, separated from the copy by the same
 * hairline the article sidebar uses rather than by a gap alone.
 */
.zd-portal-text__aside {
	min-width: 0;
	padding-left: 5.3%;
	text-align: right;
}

/*
 * Operator, 2026-11-03: "kontakt on portal should aligent right".
 *
 * It was not, even though the column is: `zumbuehl-2.1.3-portal-contact.css` pins the block's paragraphs to `text-align: center`
 * (`.zd-portal-contact__meta p, .zd-portal-contact__body p`), and a rule on the element beats an inherited value from the aside. So the
 * heading and the grid were right and the words under them were centred. These selectors carry `.zd-portal-text` on top, which is one
 * class more than the rule they replace, so they win without `!important` and without the order mattering.
 */
.zd-portal-text .zd-portal-contact,
.zd-portal-text .zd-portal-contact__grid,
.zd-portal-text .zd-portal-contact__title,
.zd-portal-text .zd-portal-contact__meta,
.zd-portal-text .zd-portal-contact__body,
.zd-portal-text .zd-portal-contact__meta p,
.zd-portal-text .zd-portal-contact__body p,
.zd-portal-text .zd-portal-contact__body li,
.zd-portal-text .zd-portal-contact a {
	text-align: right;
}

/* The two blocks lose their own section chrome now that they are columns inside a section. */
.zd-portal-text .zd-portal-sitetext,
.zd-portal-text .zd-portal-content,
.zd-portal-text .zd-portal-contact {
	position: static;
	background: none;
	padding: 0;
}

.zd-portal-text .zd-portal-sitetext__grid,
.zd-portal-text .zd-portal-content__grid,
.zd-portal-text .zd-portal-contact__grid {
	max-width: none;
	margin: 0;
	text-align: left;
}

.zd-portal-text .zd-portal-content {
	margin-top: 40px;
}

.zd-portal-text .zd-portal-contact__title {
	text-align: right;
	margin: 0 0 24px;
}

.zd-portal-text .zd-portal-contact__grid {
	text-align: right;
}

@media screen and (max-width: 1100px) {
	.zd-portal-text__grid {
		display: block;
	}

	.zd-portal-text__aside {
		padding-left: 0;
		margin-top: 48px;
		padding-top: 32px;
		border-top: 1px solid rgba(0, 0, 0, 0.15);
		/*
		 * Still right-aligned when stacked. The operator asked for the contact block to be right-aligned without qualifying the width,
		 * so the rule that used to flip it to left down here is gone - the column's own alignment carries.
		 */
	}
}

/* ==========================================================================
   The Z: black at rest, a dark glass lens on hover, never on the portal
   ========================================================================== */

/*
 * Operator, 2026-11-03, after seeing 2.1.41: "on pages with no header image z should remain black on be background blured on hover
 * already blurred z should be darken instead of my transprant. on portal z should also remain black".
 *
 * 2.1.41 made the mark *always* a lens, with a 4% white wash standing in for ink. On a page with no header image there is nothing
 * behind it to blur, so the mark simply disappeared; the wash also read as transparent rather than as the letter. So the lens is now a
 * *state*, not the default:
 *
 *   rest    the theme's own glyph, untouched - black, with the dark/light variants it already toggles
 *   hover   the glyph fades out and a masked backdrop blur fades in, tinted DARK (rgba(0,0,0,0.32)) so the letter reads as smoked
 *           glass instead of disappearing
 *   portal  `body.landingpage` never gets the hover state: the operator wants the mark solid black on the door
 *
 * Two elements, because the glyph is the theme's and the lens must not be: the glyph is `.image-logo`, the lens is a `::before` on the
 * wrapper with the glyph as its mask. The outline moved to `::after` for the same reason it exists at all - a `filter` on the wrapper
 * would become the backdrop root and kill the blur (measured in 2.1.41: centre sharpness 41.0 vs corner 41.3, no blur at all).
 *
 * Everything is inside a hover-capable query and an `@supports` guard, so touchscreens and engines without backdrop-filter simply keep
 * the black mark they always had.
 */
@supports ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
	@media (hover: hover) and (pointer: fine) {
		/*
		 * The lens is a hover state of the glyph, not a permanent treatment.
		 *
		 * Operator, 2026-11-03: "on pages with no header image z should remain black on be background blured on hover [...] on portal z
		 * should also remain black". 2.1.41 had it always on, so on a page with nothing behind it the mark vanished; masking the resting
		 * glyph was also not free - measured against the same glyph unmasked, 8.58% of its pixels changed by more than 12 luma because
		 * the SVG silhouette is not pixel-identical to the PNG artwork. Rest must be the theme's own glyph, untouched.
		 *
		 * So the whole treatment lives in the hover rule: background-image off, dark tint on, backdrop blur and mask applied together.
		 * Everything is `!important` because the theme writes the glyph as an inline background-image on the span.
		 *
		 * `body:not(.landingpage)` keeps the door out of it, so the portal mark simply never changes - the operator asked for that by name.
		 */
		body:not(.landingpage) .logo-wrapper:hover .logo-image-wrapper .image-logo,
		body:not(.landingpage) .logo-wrapper:focus-within .logo-image-wrapper .image-logo {
			background-image: none !important;
			/* Darkened, not transparent: "already blurred z should be darken instead of my transprant". 32% black over the blurred
			   backdrop is smoked glass; a white wash was the transparent version that disappeared. */
			background-color: rgba(0, 0, 0, 0.32) !important;
			background-size: 100% 100% !important;

			-webkit-backdrop-filter: blur(16px) saturate(112%);
			backdrop-filter: blur(16px) saturate(112%);

			-webkit-mask-image: url(assets/img/zumbuehl_logo_z.svg);
			mask-image: url(assets/img/zumbuehl_logo_z.svg);
			-webkit-mask-size: 100% 100%;
			mask-size: 100% 100%;
			-webkit-mask-repeat: no-repeat;
			mask-repeat: no-repeat;
			-webkit-mask-position: center;
			mask-position: center;
		}

		/*
		 * The thin edge that keeps the glass readable on a busy photo. Safe as a pseudo-element: it only draws a drop-shadow, it
		 * does not sample the backdrop (Chromium will not run `backdrop-filter` on a pseudo-element at all).
		 */
		.logo-image-wrapper::after {
			content: '';
			position: absolute;
			inset: 0;
			z-index: 2;
			pointer-events: none;
			-webkit-mask-image: url(assets/img/zumbuehl_logo_z.svg);
			mask-image: url(assets/img/zumbuehl_logo_z.svg);
			-webkit-mask-size: 100% 100%;
			mask-size: 100% 100%;
			-webkit-mask-repeat: no-repeat;
			mask-repeat: no-repeat;
			-webkit-mask-position: center;
			mask-position: center;
			filter: drop-shadow(0 0 1px rgba(255, 255, 255, 0.35)) drop-shadow(0 0 6px rgba(0, 0, 0, 0.22));
			opacity: 0;
			transition: opacity 0.28s ease;
		}

		.logo-wrapper:hover .logo-image-wrapper::after,
		.logo-wrapper:focus-within .logo-image-wrapper::after {
			opacity: 1;
		}

		.landingpage .logo-wrapper:hover .logo-image-wrapper::after,
		.landingpage .logo-wrapper:focus-within .logo-image-wrapper::after {
			opacity: 0;
		}

		/* A phone-sized mark gets a smaller lens: 16 px of blur over a 32 px letter is a smudge, not glass. */
		@media screen and (max-width: 720px) {
			body:not(.landingpage) .logo-wrapper:hover .logo-image-wrapper .image-logo,
			body:not(.landingpage) .logo-wrapper:focus-within .logo-image-wrapper .image-logo {
				-webkit-backdrop-filter: blur(9px) saturate(112%);
				backdrop-filter: blur(9px) saturate(112%);
			}
		}
	}
}

@media (prefers-reduced-motion: reduce) {
	.logo-image-wrapper::after {
		transition: none;
	}
}

/*
 * ==========================================================================
   The portal: black at rest, glass on hover or as soon as the page moves
   ==========================================================================
 *
 * Operator, 2026-11-03, in order: "Z-Designstudio is mising on portal image in the middle", "z on portal black", "on z hover is also blurred
 * background", "on scroll down Z mark get background blured instead of black like we had in eralier version", and finally "on hover z need
 * background blurred, also as soon you start scrolling gconvert z to background blured version with animation".
 *
 * Three states, and the last two are animated:
 *
 *   - **at rest and at the top** (`html` without `zd-scrolled`, nothing pointed at the mark): the theme's own black glyph. The guard forces it
 *     with `!important` on every property, so no stale or later lens rule can ghost the mark.
 *   - **hovered or focused**: the glass, whether or not the page has moved.
 *   - **scrolled** past 8 px (class from `zumbuehl-2.1.54-portal-z-scroll.js`): the glass.
 *
 * The animation is on the glass, not on the silhouette. The letter is the same Z in both states - the glyph's background image is swapped for
 * the `mask-image` in the same frame - so the *shape* never jumps; what ramps over 380 ms is `backdrop-filter` (blur radius 0 to 16 px), the
 * 32 % black tint, and the hairline's opacity. `background-image` and `mask-image` are discrete and cannot interpolate, which is exactly why
 * the transition is written on the properties that can.
 */
.landingpage .logo-image-wrapper {
	filter: none !important;
}

/*
 * The transition sits on the element in both states, so it runs both ways. `prefers-reduced-motion` switches it off further up this file, and
 * the script writes the scroll class at most once per frame, so a flick cannot restart the ramp.
 */
.landingpage .logo-image-wrapper .image-logo {
	transition: -webkit-backdrop-filter 0.38s ease, backdrop-filter 0.38s ease, background-color 0.38s ease;
}

/*
 * The hairline that keeps the glass readable on a busy photograph. A `filter` on the wrapper could not do it: it would become the backdrop
 * root and the blur below it would sample nothing. It exists in both states and fades, so the glass arrives rather than appearing.
 */
.landingpage .logo-image-wrapper::after {
	content: '';
	position: absolute;
	inset: 0;
	z-index: 2;
	pointer-events: none;
	opacity: 0;
	transition: opacity 0.38s ease;
	-webkit-mask-image: url(assets/img/zumbuehl_logo_z.svg);
	mask-image: url(assets/img/zumbuehl_logo_z.svg);
	-webkit-mask-size: 100% 100%;
	mask-size: 100% 100%;
	-webkit-mask-repeat: no-repeat;
	mask-repeat: no-repeat;
	-webkit-mask-position: center;
	mask-position: center;
	filter: drop-shadow(0 0 1px rgba(255, 255, 255, 0.35)) drop-shadow(0 0 6px rgba(0, 0, 0, 0.22));
}
html:not(.zd-scrolled) .landingpage .logo-wrapper:not(:hover):not(:focus-within) .logo-image-wrapper .image-logo {
	/* The letter is paint, not a window: no blur, no mask, no wash, no inverted blend. */
	-webkit-backdrop-filter: none !important;
	backdrop-filter: none !important;
	-webkit-mask-image: none !important;
	mask-image: none !important;
	background-color: transparent !important;
	filter: none !important;
	mix-blend-mode: normal !important;
	opacity: 1 !important;
}

html.zd-scrolled .landingpage .logo-image-wrapper .image-logo,
html:not(.zd-scrolled) .landingpage .logo-wrapper:hover .logo-image-wrapper .image-logo,
html:not(.zd-scrolled) .landingpage .logo-wrapper:focus-within .logo-image-wrapper .image-logo {
	/* Scrolled, or pointed at / focused: the letter becomes the hole the blur is seen through. */
	background-image: none !important;
	background-color: rgba(0, 0, 0, 0.32) !important;
	background-size: 100% 100% !important;

	-webkit-backdrop-filter: blur(16px) saturate(112%);
	backdrop-filter: blur(16px) saturate(112%);

	-webkit-mask-image: url(assets/img/zumbuehl_logo_z.svg);
	mask-image: url(assets/img/zumbuehl_logo_z.svg);
	-webkit-mask-size: 100% 100%;
	mask-size: 100% 100%;
	-webkit-mask-repeat: no-repeat;
	mask-repeat: no-repeat;
	-webkit-mask-position: center;
	mask-position: center;
}

/* The hairline fades in with the glass; it is the same pseudo-element for both triggers. */
html.zd-scrolled .landingpage .logo-image-wrapper::after,
html:not(.zd-scrolled) .landingpage .logo-wrapper:hover .logo-image-wrapper::after,
html:not(.zd-scrolled) .landingpage .logo-wrapper:focus-within .logo-image-wrapper::after {
	opacity: 1;
}

/* ==========================================================================
   Scroll reveals - only what the script has marked, only while it is running
   ========================================================================== */

/*
 * Operator, 2026-11-03: "also what happend to the modern anmaiations i asked for which are triggerd on scroll". Nothing existed in
 * this rebuild; the pair to this file is `zumbuehl-2.1.42-scroll-reveal.js`.
 *
 * Every rule is keyed off `html.zd-reveal-ready`, which only the script adds, and only to elements it decided are below the fold.
 * So there is no state in which a browser without JS - or one where the script failed - shows a hidden page. The transition touches
 * opacity and transform only: no height, no margin, no display, so nothing reflows and the scrollbar does not jump.
 *
 * `fade` is the opacity-only variant, used where the element already owns its own transform (polaroid tiles rotate ±1.1°). `rise`
 * is the default: 24 px up into place on the same curve the theme uses for its own motion.
 */
html.zd-reveal-ready [data-zd-reveal] {
	opacity: 0;
	transform: translate3d(0, 24px, 0);
	transition:
		opacity 0.7s cubic-bezier(0.19, 1, 0.22, 1) var(--zd-delay, 0ms),
		transform 0.7s cubic-bezier(0.19, 1, 0.22, 1) var(--zd-delay, 0ms);
	will-change: opacity, transform;
}

html.zd-reveal-ready [data-zd-reveal="fade"] {
	transform: none;
}

html.zd-reveal-ready [data-zd-reveal].is-revealed {
	opacity: 1;
	transform: none;
}

/* Done animating: drop the hint so the compositor is not left holding a layer for every tile on the page. */
html.zd-reveal-ready [data-zd-reveal].is-revealed {
	will-change: auto;
}

/*
 * The script already refuses to run under reduced motion; this is the belt to that braces, so a half-written rule or a later state
 * change can never leave content invisible.
 */
@media (prefers-reduced-motion: reduce) {
	html.zd-reveal-ready [data-zd-reveal],
	html.zd-reveal-ready [data-zd-reveal].is-revealed {
		opacity: 1 !important;
		transform: none !important;
		transition: none !important;
		will-change: auto !important;
	}
}

/* ==========================================================================
   Language switcher: the site's own face, and an active underline cut to fit
   ========================================================================== */

/*
 * Operator, 2026-11-03: "also for lnaguge switcher use same font weight as site your in and makr active with underline that fit that
 * font weight".
 *
 * Measured on the live clone before touching anything:
 *
 *   /interior/     body + nav = Z-Bold      switcher = Z-Light   <- the mismatch
 *   /industrial/   body = Z-Bold, nav = Z-Light   switcher = Z-Light   (already right)
 *
 * The cause is one unscoped selector: the theme's font block lists `.left-language-switch` next to `.industrial-design body`,
 * `.left-navigation` and friends, so the *left* switcher is pinned to Z-Light on both subsites - and the interior switcher, on the
 * bold subsite, is the only piece of UI in the light face.
 *
 * So the face is set per subsite to match that site's own navigation: Z-Bold on interior, Z-Light on industrial. `inherit` would not do
 * it: the industrial body carries Z-Bold while its entire UI is drawn in Z-Light, so inheriting from the body would move the mistake
 * rather than fix it.
 *
 * The active marker is the underline again - the operator asked for it - but cut to the face rather than to a fixed value. At 14px a
 * 0.12em rule from the menu (33px type) would land at 1.68px and render as a fuzzy 1-2px bar, which is what made it ugly the first
 * time. Integer px scale with the stems instead: Z-Bold stems are about 2px at this size, Z-Light about 1px, so the underline is 2px
 * and 1px respectively, both at a 2px offset so it never touches the glyph.
 */
.left-language-switch,
.right-language-switch,
.left-language-switch ul,
.right-language-switch ul,
.left-language-switch ul.bogo-language-switcher li,
.right-language-switch ul.bogo-language-switcher li,
.left-language-switch ul.bogo-language-switcher li a,
.right-language-switch ul.bogo-language-switcher li a {
	font-family: 'Z-Bold', 'Open Sans', Arial, sans-serif !important;
	font-weight: normal !important;
}

.industrial-design .left-language-switch,
.industrial-design .right-language-switch,
.industrial-design .left-language-switch ul,
.industrial-design .right-language-switch ul,
.industrial-design .left-language-switch ul.bogo-language-switcher li,
.industrial-design .right-language-switch ul.bogo-language-switcher li,
.industrial-design .left-language-switch ul.bogo-language-switcher li a,
.industrial-design .right-language-switch ul.bogo-language-switcher li a {
	font-family: 'Z-Light', 'Open Sans', Arial, sans-serif !important;
	font-weight: normal !important;
}

/* The item in the other language stays a plain link; only the language you are in is marked. */
ul.bogo-language-switcher li a {
	color: #5c5c5c;
	text-decoration: none;
}

ul.bogo-language-switcher li.current a {
	color: #000;
	text-decoration: underline;
	text-decoration-thickness: 2px;
	text-underline-offset: 2px;
	text-decoration-skip-ink: none;
}

/* The light face gets the finer rule, the same rule-of-thumb the menu uses. */
.industrial-design ul.bogo-language-switcher li.current a {
	text-decoration-thickness: 1px;
}

/* Hover and keyboard focus draw the same marker as the active language: black, at the weight of the face. */
ul.bogo-language-switcher li a:hover,
ul.bogo-language-switcher li a:focus-visible {
	color: #000;
	text-decoration: underline;
	text-decoration-thickness: 2px;
	text-underline-offset: 2px;
	text-decoration-skip-ink: none;
}

/*
 * Operator, 2026-11-03: "languag switcher shoul always be black underline on hover smae as active one". It was a 1px hairline, so
 * hovering a language looked like a *different* state from being in it - thinner and dimmer than the marker on the current one. Now
 * the hover rule is a copy of the active rule, and the light face gets the same finer 1px the active marker gets.
 */
.industrial-design ul.bogo-language-switcher li a:hover,
.industrial-design ul.bogo-language-switcher li a:focus-visible {
	text-decoration-thickness: 1px;
}

