<h-include>
<div class="eyecatcher eyecatcher--event">
<p class="eyecatcher--event__text">
INNOQ Technology Lunch: Software Architecture for Agile Enterprises 👉
<a href="#" class="eyecatcher--event__link">20. Mai, 12:15 Uhr</a>
</p>
</div>
</h-include>
<a href="#main" class="skip-link">Zum Inhalt springen</a>
<nav class="main-navigation main-navigation--black" aria-label="Webseite Navigation">
<a href="#" class="brand-link">
<img alt="" class="brand-logo" src="../../assets/logos/edition-02/svg/innoq-logo--whiteapricot.svg" />
<span class="link-alt">INNOQ Homepage</span>
</a>
<a href="#" class="search-link">
<span class="icon icon-search icon--brand-white"></span>
<span class="link-alt">Suche</span>
</a>
<!--
NOTE: in order to ensure that users of assistive technologies can
easily find the content that is being collapsed and expanded, it is
important for the content to directly follow the toggle button in the
focus order on the page. When this doesn't match the visual design that
we are trying to achieve, we can change the visual order of the
elements with CSS.
See: https://inclusive-components.design/menus-menu-buttons/#ariacontrols
-->
<menu-toggle hidden>
<button>Menü</button>
</menu-toggle>
<!--
NOTE: for each `ul` list in the navbar, we should explicitly set
an `aria-label` that correctly describes the contents of the list to
provide this information to assistive technologies. Additionally, we
set the `role="list"` attribute to ensure that the lists will be
announced as lists in Safari/VoiceOver
See: https://www.scottohara.me/blog/2019/01/12/lists-and-safari.html
and note in CSS file
-->
<ul class="navigation-links navigation-links--black" role="list" aria-label="Seitennavigation">
<li>
<sub-menu>
<details>
<summary>
Leistungen
<span class="icon icon-chevron-down-filled icon--brand-white"></span>
</summary>
<ul role="list" aria-label="Leistungen Untermenü">
<li>
<a href="#">Strategie- und Technologieberatung</a>
</li>
</ul>
</details>
</sub-menu>
</li>
<li>
<a href="#">Success Stories</a>
</li>
<li>
<sub-menu>
<details>
<summary>
Kultur
<span class="icon icon-chevron-down-filled icon--brand-white"></span>
</summary>
<ul role="list" aria-label="Kultur Untermenü">
<li>
<!--
NOTE: use `aria-current="page"` for the link within the
navbar representing the current page. The CSS rules to
visually highlight this link are hooked to that attribute.
See: https://adrianroselli.com/2021/06/using-css-to-enforce-accessibility.html
and note in CSS file
-->
<a href="#" aria-current="page">Wie wir zusammenarbeiten</a>
</li>
<li>
<a href="#">Was uns wichtig ist</a>
</li>
<li>
<a href="#">Arbeiten bei INNOQ</a>
</li>
</ul>
</details>
</sub-menu>
</li>
<li>
<sub-menu>
<details>
<summary>
Magazin
<span class="icon icon-chevron-down-filled icon--brand-white"></span>
</summary>
<ul role="list" aria-label="Magazin Untermenü">
<li>
<a href="#">Blog & Artikel</a>
</li>
<li>
<a href="#">Podcasts</a>
</li>
<li>
<a href="#">Vorträge</a>
</li>
<li>
<a href="#">Primer</a>
</li>
</ul>
</details>
</sub-menu>
</li>
<li>
<sub-menu>
<details>
<summary>
Trends
<span class="icon icon-chevron-down-filled icon--brand-white"></span>
</summary>
<ul role="list" aria-label="Trends Untermenü">
<li>
<a href="#">Accessibility</a>
</li>
<li>
<a href="#">Cloud Migration</a>
</li>
<li>
<a href="#">Data Mesh</a>
</li>
</ul>
</details>
</sub-menu>
</li>
<li>
<sub-menu>
<details>
<summary>
Schulungen
<span class="icon icon-chevron-down-filled icon--brand-white"></span>
</summary>
<ul role="list" aria-label="Schulungen Untermenü">
<li>
<a href="#">Warum Online-Schulungen?</a>
</li>
<li>
<a href="#">Softwarearchitektur Kickstart</a>
</li>
<li>
<a href="#">Data Mesh</a>
</li>
<li>
<a href="#">iSAQB CPSA-F Foundation Level</a>
</li>
<li>
<a href="#">Accessibility</a>
</li>
<li>
<a href="#">Blockchain</a>
</li>
<li>
<a href="#">Cloud Native Infrastruktur</a>
</li>
<li>
<a href="#">Cloud Migration</a>
</li>
<li>
<a href="#">Domain-driven Design</a>
</li>
<li>
<a href="#">DDD für Machine Learning</a>
</li>
<li>
<a href="#">Flexible Architekturen</a>
</li>
<li>
<a href="#">JavaScript</a>
</li>
<li>
<a href="#">Modernisierung</a>
</li>
<li>
<a href="#">Product Ownership</a>
</li>
<li>
<a href="#">Remote Mob Programming</a>
</li>
<li>
<a href="#">Software Analytics</a>
</li>
<li>
<a href="#">Web-Architekturen</a>
</li>
<li>
<a href="#">Web-Security</a>
</li>
</ul>
</details>
</sub-menu>
</li>
</ul>
<div class="navigation-meta">
<a href="#">
<span lang="ru" aria-label="Ви з України та розробляєте програмнi (software) продукти? Зв’язатися з нами.">💙💛</span>
</a>
<a href="#">Kontakt</a>
<ul role="list" aria-label="Verfügbare Sprachen">
<li>
<!--
NOTE: use the `aria-current="true"` attribute to specify the language
which is currently selected. As with `aria-current="page"`, setting
this attribute correctly is necessary to obtain the visual CSS styles.
-->
<a lang="de" href="#" title="Zu Deutsch wechseln" aria-label="Zu Deutsch wechseln" aria-current="true">de</a>
</li>
<li>
<a lang="de_CH" href="#" title="Zu Schweizerdeutsch wechseln" aria-label="Zu Schweizerdeutsch wechseln">ch</a>
</li>
<li>
<a lang="en" href="#" title="Switch to English" aria-label="Switch to English">en</a>
</li>
</ul>
</div>
</nav>
<h-include>
<div class="eyecatcher eyecatcher--event">
<p class="eyecatcher--event__text">
INNOQ Technology Lunch: Software Architecture for Agile Enterprises 👉
<a href="#" class="eyecatcher--event__link">20. Mai, 12:15 Uhr</a>
</p>
</div>
</h-include>
<a href="#main" class="skip-link">Zum Inhalt springen</a>
<nav class="main-navigation" aria-label="Webseite Navigation">
<a href="#" class="brand-link">
<img alt="" class="brand-logo" src="../../assets/logos/edition-02/svg/innoq-logo--whiteapricot.svg" />
<span class="link-alt">INNOQ Homepage</span>
</a>
<a href="#" class="search-link">
<span class="icon icon-search icon--brand-white"></span>
<span class="link-alt">Suche</span>
</a>
<!--
NOTE: in order to ensure that users of assistive technologies can
easily find the content that is being collapsed and expanded, it is
important for the content to directly follow the toggle button in the
focus order on the page. When this doesn't match the visual design that
we are trying to achieve, we can change the visual order of the
elements with CSS.
See: https://inclusive-components.design/menus-menu-buttons/#ariacontrols
-->
<menu-toggle hidden>
<button>Menü</button>
</menu-toggle>
<!--
NOTE: for each `ul` list in the navbar, we should explicitly set
an `aria-label` that correctly describes the contents of the list to
provide this information to assistive technologies. Additionally, we
set the `role="list"` attribute to ensure that the lists will be
announced as lists in Safari/VoiceOver
See: https://www.scottohara.me/blog/2019/01/12/lists-and-safari.html
and note in CSS file
-->
<ul class="navigation-links" role="list" aria-label="Seitennavigation">
<li>
<sub-menu>
<details>
<summary>
Leistungen
<span class="icon icon-chevron-down-filled icon--brand-white"></span>
</summary>
<ul role="list" aria-label="Leistungen Untermenü">
<li>
<a href="#">Strategie- und Technologieberatung</a>
</li>
</ul>
</details>
</sub-menu>
</li>
<li>
<a href="#">Success Stories</a>
</li>
<li>
<sub-menu>
<details>
<summary>
Kultur
<span class="icon icon-chevron-down-filled icon--brand-white"></span>
</summary>
<ul role="list" aria-label="Kultur Untermenü">
<li>
<!--
NOTE: use `aria-current="page"` for the link within the
navbar representing the current page. The CSS rules to
visually highlight this link are hooked to that attribute.
See: https://adrianroselli.com/2021/06/using-css-to-enforce-accessibility.html
and note in CSS file
-->
<a href="#" aria-current="page">Wie wir zusammenarbeiten</a>
</li>
<li>
<a href="#">Was uns wichtig ist</a>
</li>
<li>
<a href="#">Arbeiten bei INNOQ</a>
</li>
</ul>
</details>
</sub-menu>
</li>
<li>
<sub-menu>
<details>
<summary>
Magazin
<span class="icon icon-chevron-down-filled icon--brand-white"></span>
</summary>
<ul role="list" aria-label="Magazin Untermenü">
<li>
<a href="#">Blog & Artikel</a>
</li>
<li>
<a href="#">Podcasts</a>
</li>
<li>
<a href="#">Vorträge</a>
</li>
<li>
<a href="#">Primer</a>
</li>
</ul>
</details>
</sub-menu>
</li>
<li>
<sub-menu>
<details>
<summary>
Trends
<span class="icon icon-chevron-down-filled icon--brand-white"></span>
</summary>
<ul role="list" aria-label="Trends Untermenü">
<li>
<a href="#">Accessibility</a>
</li>
<li>
<a href="#">Cloud Migration</a>
</li>
<li>
<a href="#">Data Mesh</a>
</li>
</ul>
</details>
</sub-menu>
</li>
<li>
<sub-menu>
<details>
<summary>
Schulungen
<span class="icon icon-chevron-down-filled icon--brand-white"></span>
</summary>
<ul role="list" aria-label="Schulungen Untermenü">
<li>
<a href="#">Warum Online-Schulungen?</a>
</li>
<li>
<a href="#">Softwarearchitektur Kickstart</a>
</li>
<li>
<a href="#">Data Mesh</a>
</li>
<li>
<a href="#">iSAQB CPSA-F Foundation Level</a>
</li>
<li>
<a href="#">Accessibility</a>
</li>
<li>
<a href="#">Blockchain</a>
</li>
<li>
<a href="#">Cloud Native Infrastruktur</a>
</li>
<li>
<a href="#">Cloud Migration</a>
</li>
<li>
<a href="#">Domain-driven Design</a>
</li>
<li>
<a href="#">DDD für Machine Learning</a>
</li>
<li>
<a href="#">Flexible Architekturen</a>
</li>
<li>
<a href="#">JavaScript</a>
</li>
<li>
<a href="#">Modernisierung</a>
</li>
<li>
<a href="#">Product Ownership</a>
</li>
<li>
<a href="#">Remote Mob Programming</a>
</li>
<li>
<a href="#">Software Analytics</a>
</li>
<li>
<a href="#">Web-Architekturen</a>
</li>
<li>
<a href="#">Web-Security</a>
</li>
</ul>
</details>
</sub-menu>
</li>
</ul>
<div class="navigation-meta">
<a href="#">
<span lang="ru" aria-label="Ви з України та розробляєте програмнi (software) продукти? Зв’язатися з нами.">💙💛</span>
</a>
<a href="#">Kontakt</a>
<ul role="list" aria-label="Verfügbare Sprachen">
<li>
<!--
NOTE: use the `aria-current="true"` attribute to specify the language
which is currently selected. As with `aria-current="page"`, setting
this attribute correctly is necessary to obtain the visual CSS styles.
-->
<a lang="de" href="#" title="Zu Deutsch wechseln" aria-label="Zu Deutsch wechseln" aria-current="true">de</a>
</li>
<li>
<a lang="de_CH" href="#" title="Zu Schweizerdeutsch wechseln" aria-label="Zu Schweizerdeutsch wechseln">ch</a>
</li>
<li>
<a lang="en" href="#" title="Switch to English" aria-label="Switch to English">en</a>
</li>
</ul>
</div>
</nav>
<h-include>
<div class="eyecatcher eyecatcher--event">
<p class="eyecatcher--event__text">
INNOQ Technology Lunch: Software Architecture for Agile Enterprises 👉
<a href="#" class="eyecatcher--event__link">20. Mai, 12:15 Uhr</a>
</p>
</div>
</h-include>
<a href="#main" class="skip-link">Zum Inhalt springen</a>
<nav class="main-navigation main-navigation--black" aria-label="Webseite Navigation">
<a href="#" class="brand-link">
<img alt="" class="brand-logo" src="{{ path '/assets/logos/edition-02/svg/innoq-logo--whiteapricot.svg' }}" />
<span class="link-alt">INNOQ Homepage</span>
</a>
<a href="#" class="search-link">
<span class="icon icon-search icon--brand-white"></span>
<span class="link-alt">Suche</span>
</a>
<!--
NOTE: in order to ensure that users of assistive technologies can
easily find the content that is being collapsed and expanded, it is
important for the content to directly follow the toggle button in the
focus order on the page. When this doesn't match the visual design that
we are trying to achieve, we can change the visual order of the
elements with CSS.
See: https://inclusive-components.design/menus-menu-buttons/#ariacontrols
-->
<menu-toggle hidden>
<button>Menü</button>
</menu-toggle>
<!--
NOTE: for each `ul` list in the navbar, we should explicitly set
an `aria-label` that correctly describes the contents of the list to
provide this information to assistive technologies. Additionally, we
set the `role="list"` attribute to ensure that the lists will be
announced as lists in Safari/VoiceOver
See: https://www.scottohara.me/blog/2019/01/12/lists-and-safari.html
and note in CSS file
-->
<ul class="navigation-links navigation-links--black" role="list" aria-label="Seitennavigation">
<li>
<sub-menu>
<details>
<summary>
Leistungen
<span class="icon icon-chevron-down-filled icon--brand-white"></span>
</summary>
<ul role="list" aria-label="Leistungen Untermenü">
<li>
<a href="#">Strategie- und Technologieberatung</a>
</li>
</ul>
</details>
</sub-menu>
</li>
<li>
<a href="#">Success Stories</a>
</li>
<li>
<sub-menu>
<details>
<summary>
Kultur
<span class="icon icon-chevron-down-filled icon--brand-white"></span>
</summary>
<ul role="list" aria-label="Kultur Untermenü">
<li>
<!--
NOTE: use `aria-current="page"` for the link within the
navbar representing the current page. The CSS rules to
visually highlight this link are hooked to that attribute.
See: https://adrianroselli.com/2021/06/using-css-to-enforce-accessibility.html
and note in CSS file
-->
<a href="#" aria-current="page">Wie wir zusammenarbeiten</a>
</li>
<li>
<a href="#">Was uns wichtig ist</a>
</li>
<li>
<a href="#">Arbeiten bei INNOQ</a>
</li>
</ul>
</details>
</sub-menu>
</li>
<li>
<sub-menu>
<details>
<summary>
Magazin
<span class="icon icon-chevron-down-filled icon--brand-white"></span>
</summary>
<ul role="list" aria-label="Magazin Untermenü">
<li>
<a href="#">Blog & Artikel</a>
</li>
<li>
<a href="#">Podcasts</a>
</li>
<li>
<a href="#">Vorträge</a>
</li>
<li>
<a href="#">Primer</a>
</li>
</ul>
</details>
</sub-menu>
</li>
<li>
<sub-menu>
<details>
<summary>
Trends
<span class="icon icon-chevron-down-filled icon--brand-white"></span>
</summary>
<ul role="list" aria-label="Trends Untermenü">
<li>
<a href="#">Accessibility</a>
</li>
<li>
<a href="#">Cloud Migration</a>
</li>
<li>
<a href="#">Data Mesh</a>
</li>
</ul>
</details>
</sub-menu>
</li>
<li>
<sub-menu>
<details>
<summary>
Schulungen
<span class="icon icon-chevron-down-filled icon--brand-white"></span>
</summary>
<ul role="list" aria-label="Schulungen Untermenü">
<li>
<a href="#">Warum Online-Schulungen?</a>
</li>
<li>
<a href="#">Softwarearchitektur Kickstart</a>
</li>
<li>
<a href="#">Data Mesh</a>
</li>
<li>
<a href="#">iSAQB CPSA-F Foundation Level</a>
</li>
<li>
<a href="#">Accessibility</a>
</li>
<li>
<a href="#">Blockchain</a>
</li>
<li>
<a href="#">Cloud Native Infrastruktur</a>
</li>
<li>
<a href="#">Cloud Migration</a>
</li>
<li>
<a href="#">Domain-driven Design</a>
</li>
<li>
<a href="#">DDD für Machine Learning</a>
</li>
<li>
<a href="#">Flexible Architekturen</a>
</li>
<li>
<a href="#">JavaScript</a>
</li>
<li>
<a href="#">Modernisierung</a>
</li>
<li>
<a href="#">Product Ownership</a>
</li>
<li>
<a href="#">Remote Mob Programming</a>
</li>
<li>
<a href="#">Software Analytics</a>
</li>
<li>
<a href="#">Web-Architekturen</a>
</li>
<li>
<a href="#">Web-Security</a>
</li>
</ul>
</details>
</sub-menu>
</li>
</ul>
<div class="navigation-meta">
<a href="#">
<span lang="ru" aria-label="Ви з України та розробляєте програмнi (software) продукти? Зв’язатися з нами.">💙💛</span>
</a>
<a href="#">Kontakt</a>
<ul role="list" aria-label="Verfügbare Sprachen">
<li>
<!--
NOTE: use the `aria-current="true"` attribute to specify the language
which is currently selected. As with `aria-current="page"`, setting
this attribute correctly is necessary to obtain the visual CSS styles.
-->
<a lang="de" href="#" title="Zu Deutsch wechseln" aria-label="Zu Deutsch wechseln" aria-current="true">de</a>
</li>
<li>
<a lang="de_CH" href="#" title="Zu Schweizerdeutsch wechseln" aria-label="Zu Schweizerdeutsch wechseln">ch</a>
</li>
<li>
<a lang="en" href="#" title="Switch to English" aria-label="Switch to English">en</a>
</li>
</ul>
</div>
</nav>
<h-include>
<div class="eyecatcher eyecatcher--event">
<p class="eyecatcher--event__text">
INNOQ Technology Lunch: Software Architecture for Agile Enterprises 👉
<a href="#" class="eyecatcher--event__link">20. Mai, 12:15 Uhr</a>
</p>
</div>
</h-include>
<a href="#main" class="skip-link">Zum Inhalt springen</a>
<nav class="main-navigation" aria-label="Webseite Navigation">
<a href="#" class="brand-link">
<img alt="" class="brand-logo" src="{{ path '/assets/logos/edition-02/svg/innoq-logo--whiteapricot.svg' }}" />
<span class="link-alt">INNOQ Homepage</span>
</a>
<a href="#" class="search-link">
<span class="icon icon-search icon--brand-white"></span>
<span class="link-alt">Suche</span>
</a>
<!--
NOTE: in order to ensure that users of assistive technologies can
easily find the content that is being collapsed and expanded, it is
important for the content to directly follow the toggle button in the
focus order on the page. When this doesn't match the visual design that
we are trying to achieve, we can change the visual order of the
elements with CSS.
See: https://inclusive-components.design/menus-menu-buttons/#ariacontrols
-->
<menu-toggle hidden>
<button>Menü</button>
</menu-toggle>
<!--
NOTE: for each `ul` list in the navbar, we should explicitly set
an `aria-label` that correctly describes the contents of the list to
provide this information to assistive technologies. Additionally, we
set the `role="list"` attribute to ensure that the lists will be
announced as lists in Safari/VoiceOver
See: https://www.scottohara.me/blog/2019/01/12/lists-and-safari.html
and note in CSS file
-->
<ul class="navigation-links" role="list" aria-label="Seitennavigation">
<li>
<sub-menu>
<details>
<summary>
Leistungen
<span class="icon icon-chevron-down-filled icon--brand-white"></span>
</summary>
<ul role="list" aria-label="Leistungen Untermenü">
<li>
<a href="#">Strategie- und Technologieberatung</a>
</li>
</ul>
</details>
</sub-menu>
</li>
<li>
<a href="#">Success Stories</a>
</li>
<li>
<sub-menu>
<details>
<summary>
Kultur
<span class="icon icon-chevron-down-filled icon--brand-white"></span>
</summary>
<ul role="list" aria-label="Kultur Untermenü">
<li>
<!--
NOTE: use `aria-current="page"` for the link within the
navbar representing the current page. The CSS rules to
visually highlight this link are hooked to that attribute.
See: https://adrianroselli.com/2021/06/using-css-to-enforce-accessibility.html
and note in CSS file
-->
<a href="#" aria-current="page">Wie wir zusammenarbeiten</a>
</li>
<li>
<a href="#">Was uns wichtig ist</a>
</li>
<li>
<a href="#">Arbeiten bei INNOQ</a>
</li>
</ul>
</details>
</sub-menu>
</li>
<li>
<sub-menu>
<details>
<summary>
Magazin
<span class="icon icon-chevron-down-filled icon--brand-white"></span>
</summary>
<ul role="list" aria-label="Magazin Untermenü">
<li>
<a href="#">Blog & Artikel</a>
</li>
<li>
<a href="#">Podcasts</a>
</li>
<li>
<a href="#">Vorträge</a>
</li>
<li>
<a href="#">Primer</a>
</li>
</ul>
</details>
</sub-menu>
</li>
<li>
<sub-menu>
<details>
<summary>
Trends
<span class="icon icon-chevron-down-filled icon--brand-white"></span>
</summary>
<ul role="list" aria-label="Trends Untermenü">
<li>
<a href="#">Accessibility</a>
</li>
<li>
<a href="#">Cloud Migration</a>
</li>
<li>
<a href="#">Data Mesh</a>
</li>
</ul>
</details>
</sub-menu>
</li>
<li>
<sub-menu>
<details>
<summary>
Schulungen
<span class="icon icon-chevron-down-filled icon--brand-white"></span>
</summary>
<ul role="list" aria-label="Schulungen Untermenü">
<li>
<a href="#">Warum Online-Schulungen?</a>
</li>
<li>
<a href="#">Softwarearchitektur Kickstart</a>
</li>
<li>
<a href="#">Data Mesh</a>
</li>
<li>
<a href="#">iSAQB CPSA-F Foundation Level</a>
</li>
<li>
<a href="#">Accessibility</a>
</li>
<li>
<a href="#">Blockchain</a>
</li>
<li>
<a href="#">Cloud Native Infrastruktur</a>
</li>
<li>
<a href="#">Cloud Migration</a>
</li>
<li>
<a href="#">Domain-driven Design</a>
</li>
<li>
<a href="#">DDD für Machine Learning</a>
</li>
<li>
<a href="#">Flexible Architekturen</a>
</li>
<li>
<a href="#">JavaScript</a>
</li>
<li>
<a href="#">Modernisierung</a>
</li>
<li>
<a href="#">Product Ownership</a>
</li>
<li>
<a href="#">Remote Mob Programming</a>
</li>
<li>
<a href="#">Software Analytics</a>
</li>
<li>
<a href="#">Web-Architekturen</a>
</li>
<li>
<a href="#">Web-Security</a>
</li>
</ul>
</details>
</sub-menu>
</li>
</ul>
<div class="navigation-meta">
<a href="#">
<span lang="ru"
aria-label="Ви з України та розробляєте програмнi (software) продукти? Зв’язатися з нами.">💙💛</span>
</a>
<a href="#">Kontakt</a>
<ul role="list" aria-label="Verfügbare Sprachen">
<li>
<!--
NOTE: use the `aria-current="true"` attribute to specify the language
which is currently selected. As with `aria-current="page"`, setting
this attribute correctly is necessary to obtain the visual CSS styles.
-->
<a lang="de" href="#" title="Zu Deutsch wechseln" aria-label="Zu Deutsch wechseln"
aria-current="true">de</a>
</li>
<li>
<a lang="de_CH" href="#" title="Zu Schweizerdeutsch wechseln"
aria-label="Zu Schweizerdeutsch wechseln">ch</a>
</li>
<li>
<a lang="en" href="#" title="Switch to English" aria-label="Switch to English">en</a>
</li>
</ul>
</div>
</nav>
/* No context defined. */
$navbar-primary-font-size-big: ms(7);
$navbar-primary-font-size: ms(3);
$navbar-secondary-font-size: ms(-2);
$navbar-focus-outline-width: 2px;
$navbar-btn-transition: color 0.175s ease;
$navbar-toggle-width: calc((#{$navbar-focus-outline-width} * 2) + (#{$navbar-padding} * 3));
$navbar-toggle-transition-speed: $transition-time-standard * 3;
/* stylelint-disable-next-line scss/dollar-variable-colon-space-after */
$navbar-dropdown-shadow:
0 20px 25px -5px rgb(0 0 0 / 0.1),
0 8px 10px -6px rgb(0 0 0 / 0.1);
$navbar-dropdown-z-index: 1;
$navbar-dropdown-z-index-expanding: 2;
$navbar-dropdown-z-index-hover: 3;
%navigation-action {
cursor: pointer;
display: inline-block;
margin: var(--forced-colors-action-margin);
color: $navbar-link-color;
transition: $navbar-btn-transition;
&:hover,
&:focus {
color: $navbar-link-hover-color;
transition: $navbar-btn-transition;
.icon {
background-color: $navbar-link-hover-color;
}
}
&:focus {
border-color: $navbar-link-hover-color;
outline: $navbar-focus-outline-width solid $navbar-lightened-bg;
}
&:focus-visible {
border-color: $navbar-link-hover-color;
outline: $navbar-focus-outline-width solid $navbar-lightened-bg;
}
// Remove outline styles when the user is not navigating with the keyboard
&:focus:not(:focus-visible) {
border-color: transparent;
outline: none;
}
}
%navigation-link {
@extend %navigation-action;
text-decoration: var(--forced-colors-link-decoration, none);
border: var(--forced-colors-link-border-width, #{$navbar-focus-outline-width}) solid transparent;
}
%navigation-button {
@extend %navigation-action;
background-color: transparent;
border: $navbar-focus-outline-width solid transparent;
}
.skip-link {
@extend %heading-font-regular;
@extend %navigation-link;
display: block;
margin-bottom: $navbar-focus-outline-width;
padding: $navbar-padding;
background-color: $navbar-lightened-bg;
&:not(:focus) {
@extend %sr-only;
}
}
.main-navigation {
--navbar-background-color: #{$navbar-body-bg};
@extend %heading-font-regular;
display: grid;
grid-template-areas:
'brand menu search'
'nav nav nav'
'meta meta meta';
grid-template-columns: 1fr auto auto;
background-color: var(--navbar-background-color);
// A helper for providing alternative text for images and icons to assistive
// technologies. This is similar to the `.sr-only` helper, but the
// `.link-alt` helper will additionally be shown to users using a
// `forced-colors` mode where icons/images are also difficult to discern
.link-alt {
@extend %sr-only;
}
&--transparent {
--navbar-background-color: transparent;
}
&--black {
/* stylelint-disable-next-line */
--navbar-background-color: #242424;
}
ul {
padding: 0;
}
a:hover,
a:focus {
background-color: transparent; // Override style from a:not([class])
}
// Removing `list-style` attributes causes the list to no longer appear as a
// list in the accessibility tree. As a workaround, this only removes the
// list styling once the ARIA `role="list"` has been set to reinstate the
// list semantics for the list.
// See: https://www.scottohara.me/blog/2019/01/12/lists-and-safari.html
ul[role='list'],
ol[role='list'] {
list-style: none;
list-style-type: none;
}
.brand-link {
@extend %navigation-link;
display: flex;
grid-area: brand;
flex-direction: column;
padding: $navbar-padding;
.brand-logo {
width: $navbar-logo-height-small * 3.94;
height: $navbar-logo-height-small;
}
}
.search-link {
@extend %navigation-link;
display: flex;
grid-area: search;
align-items: center;
padding: $navbar-padding;
.icon {
width: $navbar-padding;
height: $navbar-padding;
}
}
menu-toggle {
grid-area: menu;
align-items: center;
&::after {
content: '';
width: 0;
height: $navbar-padding;
border: 1px solid $navbar-link-color;
}
&:not([hidden]) {
display: flex;
}
button {
@extend %navigation-button;
padding: $navbar-padding;
font-size: $navbar-primary-font-size;
font-weight: bold;
}
}
.navigation-links {
grid-area: nav;
font-size: $navbar-primary-font-size;
background-color: $navbar-lightened-bg;
&--black {
/* stylelint-disable-next-line */
background-color: #242424;
sub-menu {
/* stylelint-disable-next-line */
details > ul,
> div {
/* stylelint-disable-next-line */
background-color: #242424;
}
}
}
> :first-child {
margin-top: $navbar-padding * 2;
}
> :last-child {
margin-bottom: $navbar-padding * 2;
}
a {
@extend %navigation-link;
}
summary,
button {
@extend %navigation-button;
}
a,
summary,
button {
display: flex;
align-items: center;
padding: ($navbar-padding * 0.5) $navbar-padding;
background-color: transparent;
}
/* stylelint-disable-next-line selector-max-compound-selectors */
> li > a,
summary,
button {
font-size: $navbar-primary-font-size-big;
font-weight: bold;
}
// Use CSS rules to enforce the accessibility of the current link within the
// navbar. If it is visually correct, it will also be semantically correct.
// See: https://adrianroselli.com/2021/06/using-css-to-enforce-accessibility.html
a[aria-current='page'] {
text-decoration: underline;
text-decoration-color: $navbar-link-active-color;
text-decoration-thickness: 3px;
text-underline-offset: $spacer-xs;
}
}
.navigation-meta {
position: sticky;
bottom: 0;
display: flex;
grid-area: meta;
align-items: center;
justify-content: space-around;
padding: 0 $navbar-padding;
font-size: var(--pointer-fine-navbar-meta-font-size, inherit);
color: $navbar-link-color;
text-transform: uppercase;
background-color: var(--navbar-background-color);
> * {
margin: $navbar-padding 0;
}
a {
@extend %navigation-link;
padding: var(--pointer-fine-navbar-meta-spacer, #{$spacer-xs});
// Styles to indicate that the language is the current language selected
// for the site.
&[aria-current='true'] {
text-decoration: underline;
text-decoration-color: $navbar-link-active-color;
text-decoration-thickness: 2px;
text-underline-offset: $spacer-xxs;
}
}
ul {
display: flex;
}
li {
display: flex;
align-items: center;
&:not(:last-child)::after {
content: '|';
}
}
}
// CSS Styles for expanding/collapsing the navbar on mobile devices
// This animates the changing height for browsers which support animation
// of the `grid-row-transition` property.
//
// See: https://nemzes.net/posts/animating-height-auto/
// Browser Support: https://developer.mozilla.org/en-US/docs/Web/CSS/grid-template-rows#browser_compatibility
&[data-expanded] {
grid-template-rows: var(--main-navigation-grid-template-rows);
transition: var(--grid-row-transition);
.navigation-links,
.navigation-meta {
overflow: hidden;
min-height: 0;
visibility: var(--main-navigation-menu-visibility);
transition: var(--visibility-transition);
}
}
&[data-expanded='true'] {
--main-navigation-grid-template-rows: min-content 1fr min-content;
--main-navigation-menu-visibility: visibility;
}
&[data-expanded='false'] {
--main-navigation-grid-template-rows: min-content 0fr 0fr;
--main-navigation-menu-visibility: hidden;
}
sub-menu {
display: flex;
flex-direction: column;
.icon {
transform: rotate(-90deg);
width: $spacer-xs;
height: $spacer-xs;
margin-left: auto;
transition: standard-transition(all);
&:hover,
&:focus {
background: $sharing-interaction-color;
}
}
details[open],
[aria-expanded='true'] {
/* stylelint-disable-next-line selector-max-compound-selectors */
.icon {
transform: rotate(0);
}
}
// CSS Styles for expanding/collapsing the submenu
// This animates the changing height for browsers which support animation
// of the `grid-template-rows` property.
// In order for this to work properly, we need to animate the
// `grid-template-rows` of the outer container and the `visibility` of the
// inner container.
//
// When we absolutely position the menu on larger viewports, the animation
// no longer works when we use the `sub-menu` as the outer container.
// For this reason, we add a `div` element surrounding the `ul` with
// JavaScript to enable us to have a container on which to place the
// necessary transition.
//
// See: https://nemzes.net/posts/animating-height-auto/
// Browser Support: https://developer.mozilla.org/en-US/docs/Web/CSS/grid-template-rows#browser_compatibility
div {
overflow: hidden;
display: grid;
grid-template-rows: var(--submenu-grid-template-rows);
transition: var(--grid-row-transition);
}
ul {
min-height: 0;
margin-bottom: $spacer-xs;
visibility: var(--submenu-visibility);
transition: var(--visibility-transition);
}
/* stylelint-disable-next-line selector-max-compound-selectors */
[aria-expanded='false'] + div {
--submenu-grid-template-rows: 0fr;
--submenu-visibility: hidden;
}
/* stylelint-disable-next-line selector-max-compound-selectors */
[aria-expanded='true'] + div {
--submenu-grid-template-rows: 1fr;
--submenu-visibility: visible;
}
}
// Use CSS properties to tweak the navbar theme based on CSS media features
@media (prefers-reduced-motion: no-preference) {
--grid-row-transition: grid-template-rows #{$navbar-toggle-transition-speed} #{$transition-easing-standard};
--visibility-transition: visibility #{$navbar-toggle-transition-speed} #{$transition-easing-standard};
}
@media (forced-colors: active) {
--forced-colors-link-border-width: 0;
--forced-colors-action-margin: #{$navbar-focus-outline-width};
--forced-colors-link-decoration: underline;
--forced-colors-navbar-toggler-width: 10rem;
.link-alt {
all: revert;
text-align: left;
}
}
@media (pointer: fine) {
--pointer-fine-navbar-meta-font-size: #{$navbar-secondary-font-size * 0.9};
--pointer-fine-navbar-meta-spacer: #{$spacer-xs * 0.5};
}
//
// Breakpoints for larger devices
//
@media (min-width: $grid-breakpoint-xs-sm) {
.navigation-meta {
gap: $spacer-sm;
justify-content: center;
}
}
@media (min-width: $nav-breakpoint-px) {
--navbar-toggler-width: var(--forced-colors-navbar-toggler-width, #{$navbar-toggle-width});
grid-template-areas:
'. . brand meta search'
'nav nav nav nav nav';
grid-template-columns: var(--navbar-toggler-width) 1fr 1fr 1fr var(--navbar-toggler-width);
.brand-link {
align-items: center;
}
menu-toggle:not([hidden]) {
display: none;
}
.navigation-links {
display: flex;
justify-content: center;
padding: 0 ($navbar-padding * 0.5);
background-color: var(--navbar-background-color);
a {
white-space: nowrap;
}
/* stylelint-disable-next-line selector-max-compound-selectors */
> li > a,
summary,
button {
padding: $navbar-padding ($navbar-padding * 0.5);
font-size: $navbar-primary-font-size;
}
> :first-child {
margin-top: 0;
}
> :last-child {
--submenu-position-right: 0;
margin-bottom: 0;
}
}
.navigation-meta {
display: flex;
justify-content: flex-end;
padding: 0;
}
&[data-expanded] {
.navigation-links,
.navigation-meta {
overflow: visible;
min-height: auto;
visibility: visible;
}
}
sub-menu {
position: relative;
display: grid;
grid-template-areas:
'button .'
'menu menu';
> button {
grid-area: button;
}
> div {
grid-area: menu;
}
.icon {
transform: rotate(0deg);
margin-left: $spacer-xs;
}
details[open],
ul {
margin-bottom: 0;
}
li:first-child {
margin-top: $navbar-padding * 0.5;
}
li:last-child {
margin-bottom: $navbar-padding * 0.5;
}
/* stylelint-disable-next-line selector-max-compound-selectors */
details > ul,
> div {
position: absolute;
z-index: $navbar-dropdown-z-index;
right: var(--submenu-position-right);
background-color: $navbar-lightened-bg;
box-shadow: $navbar-dropdown-shadow;
}
/* stylelint-disable-next-line selector-max-compound-selectors */
[aria-expanded='true'] + div {
z-index: $navbar-dropdown-z-index-expanding;
}
&:hover {
z-index: $navbar-dropdown-z-index-hover;
/* stylelint-disable-next-line max-nesting-depth */
> div {
--submenu-visibility: visible;
--submenu-grid-template-rows: 1fr;
}
}
}
}
@media (min-width: $default-page-layout-content-width-xl) {
$logo-width: 10rem; // Magic Number
$side-column-width: calc(
(#{$default-page-layout-content-width-xl} - #{$logo-width} - var(--navbar-toggler-width) * 2) * 0.5
);
grid-template-areas:
'. . . brand meta search .'
'. . nav nav nav . .';
grid-template-columns:
1fr var(--navbar-toggler-width) $side-column-width $logo-width $side-column-width var(--navbar-toggler-width)
1fr;
.navigation-links {
gap: $navbar-padding;
}
}
}
export default class MenuToggle extends HTMLElement {
connectedCallback() {
if (!this.button) {
return
}
this.hidden = false
this.button.type = 'button'
this.button.addEventListener('click', () => this.toggle())
this.toggle(false)
}
toggle(expanded = !(this.button.getAttribute('aria-expanded') === 'true')) {
let button = this.button
button.setAttribute('aria-expanded', expanded)
this.navbar.setAttribute('data-expanded', expanded)
}
get button() {
return this.querySelector('button')
}
get navbar() {
return this.closest('nav')
}
}
export default class Submenu extends HTMLElement {
connectedCallback() {
let summary = this.querySelector('summary')
let ul = this.querySelector('ul')
if (!summary && !ul) {
return
}
// With out method of animating the collapsing/expanding of the menu, it is
// necessary to wrap the content of the menu in a `<div>`
this.innerHTML = `<button type="button" aria-expanded="false">${summary.innerHTML}</button><div>${ul.outerHTML}</div>`
this.button.addEventListener('click', () => this.toggle())
this.navigation.addEventListener('submenu-toggle', (ev) => {
if (ev.detail && ev.detail.expanded && ev.target !== this.button) {
if (this.button.getAttribute('aria-expanded') === 'true') {
this.toggle(false)
}
}
})
this.toggle(false)
}
toggle(expanded = !(this.button.getAttribute('aria-expanded') === 'true')) {
let button = this.button
button.setAttribute('aria-expanded', expanded)
button.dispatchEvent(new CustomEvent('submenu-toggle', { detail: { expanded }, bubbles: true }))
}
get navigation() {
return this.closest('ul')
}
get button() {
return this.querySelector('button')
}
get div() {
return this.querySelector('div')
}
get ul() {
return this.querySelector('ul')
}
}
This version of the INNOQ navbar has been built from the ground up with accessibility in mind. The HTML structure for the navigation bar was tested with a screenreader before the actual implementation with HTML, CSS and JavaScript was begun.
The tests for the navbar can be found here. Many thanks to Andreas Maier for his support with the testing.
This navbar was built using progressive enhancement. Each layer adds specific functionality and improves the component without removing necessary functionality. The following sections describe the design decisions that were made in each layer.
The navigation consists of an unordered list (<ul>
) of elements containing
either a link (<a>
) to a page or a <details>
disclosure widget containing
an unordered list of links representing the submenu for that specific topic.
At the HTML layer, we also add a
skip link before the navigation
region in order to allow a keyboard user to spring directly to the main content
area. For the INNOQ logo image and search icon, we add a <span>
including a
textual label to ensure that these links are usable even when CSS is not
available.
We also have tried to ensure that the order of the items is intuitive when navigating with the keyboard. For instance, the main navigation topics preceed the list of links for changing the language within the HTML DOM. If and when the logical order of the navigational items differs from the visual order prescribed by the design, we can change the order using CSS in the next step.
The first version of the INNOQ Navbar included both a link to a topic page and a toggle button which disclosed a submenu of options. The content of the topic page was virtually identical to the list of links provided by the submenu. In accessibility testing, this construct was found to be confusing because both the link and the toggle button appear as interactive elements in the accessibility tree (with almost identical functionality). This finding was in alignment with other user feedback -- when clicking on a link in the navbar, users expected a submenu dropdown to open and were surprised when they instead navigated to a completely different page. For these reasons, the link to the topic page was completely removed from the navbar.
The decision to wrap the submenu links inside of a <details>
disclosure
widget is unconventional because usually a
Disclosure Navigation Menu
is implemented using HTML <button>
elements with an aria-expanded
attribute corresponding to whether or not the submenu is expanded or collapsed.
However, the <details>
element provides a similar functionality
out-of-the-box and is also exposed to assistive technologies in a way that is
intuitive to use.
Moreover, using the <details>
element provides a valuable function to users
who do not have JavaScript
activated or for whom
JavaScript does not work,
namely it hides a (theoretically) long submenu until the user has indicated
that they are interested in viewing it. This also should improve the usability
of the HTML only version of the site for users with cognitive difficulties
by making it easier to find the actual content of the page (the user no longer
has to scroll past a large list of links in order to reach the main content)
and by reducing the amount of visible information on a page that the user needs
to process before making a decision about what they want to do.
At the HTML layer, we also add a few ARIA roles and attributes in order to improve the accessibility of the component. These include:
aria-label
attribute to let assistive
technologies know what the list contains (e.g. the list of links for the
submenu "Services" will be labelled Services submenu
).aria-current="page"
attribute.aria-current="true"
attribute.role="list"
attribute to all navigation lists. This actually
duplicates the default role of the list, but it is a fix to ensure that the
list is still exposed as a list to assistive technologies even when we remove
the list styling and change the display
property.
See: https://www.scottohara.me/blog/2019/01/12/lists-and-safari.htmlThe CSS layer adds the INNOQ corporate design on top of the HTML bones of the navbar. The navbar was developed using a mobile-first approach to ensure that it works for any given viewport and device.
We hide the skip link using CSS but ensure that it is shown to keyboard users
by disclosing it upon focus. We also visually hide the <span>
labels that we
added to the INNOQ logo and search icons.
We ensure the navbar is accessible for keyboard users by adding clear focus styles to the interactive elements. This is always the default, although we do use the absense of the focus-visible pseudo-class where supported to identify user agents which do not require a focus ring (e.g. when a user is navigating using a mouse) and then remove the focus style.
We also ensure that the navbar is accessible for user agents with a
forced-colors
mode. Our focus style uses a combination of the border
and outline
property
in order to draw a two-colored ring around an interactive element. In order to
reduce layout shift, all interactive elements have a transparent border
by
default, but we remove it when forced-colors
are active so that it doesn't
show up everywhere. We also add a small margin around the interactive elements
to ensure that the focus ring is correctly shown. We also determined that the
search icon and INNOQ logo are not consistently shown when a forced-colors
mode is activated, because we no longer control the color of the background of
the navbar. For this reason, we display the <span>
labels for these images
when forced-colors
mode is activated, even though these are visually hidden
for other user agents.
The navbar includes two JavaScript components for enhancing the navbar.
By default, on smaller viewports the main navigation topics will always be
visible and vertically stacked. When JavaScript is activated, the
<menu-toggle>
component will reveal a toggle button that can be used to
expand and collapse the navbar. The non-JavaScript version does take up some
vertical real estate, but because the desired layout differs quite a bit from
what a <details>
element offers and because the main navigation only
includes six main navigation items, the extra JavaScript that would have been
required to progressively enhance the <details>
element wasn't deemed to be
worth it.
The <sub-menu>
component wraps around the <details>
element containing the
submenu and progressively enhances it to replace the <details>
element with
the more "conventional" toggle button which then expands and collapses the
menu. This enhancement is primarily because we then have more control over the
HTML DOM and can expand the menu on larger viewports when hovering over the
toggle button which is a behavior that users will expect. It also makes it
possible to add an animation for collapsing and expanding the menus.
Both of these toggle components use the same approach for animating the collapsing and expanding of the content. However, since animation on websites can trigger discomfort for certain user groups, we only activate the animations if the user has specified no preference for prefers-reduced-motion.