'),linear-gradient(rgba(50,98,149,.1),rgba(50,98,149,.1));background-position-x:center,center,center;background-position-y:top,220px,bottom;background-repeat:no-repeat,no-repeat,no-repeat;background-size:100% 220px,100% 90px,100% 100%;height:100%}@media screen and (min-width:650px){.basicPageContainer{background-size:100% 220px,100% 150px,100% 100%}}@media screen and (min-width:1400px){.basicPageContainer{background-size:100% 220px,100% 230px,100% 100%}}.basicPageContainer p.quick-text{font-size:1.125rem;font-weight:500;line-height:1.7rem;margin:0;max-width:28rem;padding-bottom:1.7rem}@media screen and (min-width:1100px){.basicPageContainer p.quick-text{font-size:1.5rem;line-height:2.25rem}}.basicPageContainer .info h2{font-size:1.125rem;font-weight:500;line-height:1.7rem;text-transform:uppercase}@media screen and (min-width:1100px){.basicPageContainer .info h2{font-size:1.5rem;line-height:2.25rem}}.basicPageContainer .info p:last-of-type{-webkit-margin-after:0;margin-block-end:0}.team-module--card--5835e{box-shadow:0 2px 13px 0 rgba(0,0,0,.17)}.team-module--title--16e43{color:#322f31;font-size:1.125rem;line-height:1.375rem}@media screen and (min-width:500px){.team-module--title--16e43{font-size:1.25rem;line-height:1.5rem}}@media screen and (min-width:800px){.team-module--title--16e43{font-size:1.5rem}}@media screen and (min-width:1250px){.team-module--title--16e43{font-size:2rem;line-height:3.063rem}}@media screen and (min-width:1400px){.team-module--title--16e43{font-size:2.5rem;line-height:3.063rem}}.team-module--teamGrid--96589{display:grid;gap:2rem;grid-template-columns:minmax(100%,34rem);margin:0 0 1rem}@media screen and (min-width:650px){.team-module--teamGrid--96589{grid-template-columns:minmax(22rem,34rem)}}@media screen and (min-width:58rem){.team-module--teamGrid--96589{grid-template-columns:repeat(auto-fill,minmax(22rem,1fr))}}.team-module--card--5835e{border-radius:8px;overflow:hidden;position:relative;width:100%}.team-module--card--5835e.team-module--active--7bb1b .team-module--cardBack--63236{top:-1rem}.team-module--card--5835e.team-module--active--7bb1b .team-module--bio--5a7f9{opacity:1}.team-module--card--5835e.team-module--active--7bb1b .team-module--bio--5a7f9 a{visibility:initial}@media screen and (max-width:350px){.team-module--card--5835e.team-module--active--7bb1b h3,.team-module--card--5835e.team-module--active--7bb1b h4{display:none}}.team-module--headshot--30898{height:clamp(34rem,90vh,40rem);width:100%}.team-module--cardBack--63236{display:grid;grid-template-columns:1fr;grid-template-rows:4rem auto;height:100%;position:absolute;top:calc(94% - 9rem);transition:all .4s;width:100%;z-index:1}.team-module--swoosh--fac15{grid-column:1;grid-row:1/-1;width:100%}.team-module--info--3bb88{grid-column:1;grid-row:2;margin:1rem;z-index:1}.team-module--info--3bb88 h3{text-transform:uppercase}.team-module--info--3bb88 h3,.team-module--info--3bb88 h4{color:#fff;font-size:1rem;font-weight:600;line-height:1.5rem;margin:0 0 .25rem}@media screen and (min-width:650px){.team-module--info--3bb88 h3{font-size:1.5rem;line-height:1.875rem}.team-module--info--3bb88 h4{font-size:1.125rem;line-height:1.688rem}}.team-module--bio--5a7f9{color:#fff;margin-top:1rem;opacity:0;transition:all .4s;transition-timing-function:ease-in}.team-module--bio--5a7f9 a{color:#ff6720;visibility:hidden}.team-module--button--bd19c{margin:1rem 0;padding:.25rem .5rem;width:100%}.image-text-module--grid--b1f56{background-color:#fff;border-radius:8px;box-shadow:0 2px 13px 0 rgba(0,0,0,.17);display:grid;grid-template-areas:"image" "text";grid-template-columns:1fr;grid-template-rows:auto auto;margin-bottom:2rem;overflow:hidden}@media screen and (min-width:950px){.image-text-module--grid--b1f56{grid-template-areas:"text image";grid-template-columns:1fr 1fr;grid-template-rows:1fr;margin-bottom:3.75rem}}.image-text-module--image--7e538{-webkit-clip-path:url(#bottomCurve);clip-path:url(#bottomCurve);grid-area:image}@media screen and (min-width:650px){.image-text-module--image--7e538{max-height:40vw}}@media screen and (min-width:950px){.image-text-module--image--7e538{-webkit-clip-path:url(#leftCurve);clip-path:url(#leftCurve);max-height:unset}}.image-text-module--text--243f8{grid-area:text;padding:1.5rem}.image-text-module--text--243f8>p{font-size:1.125rem;line-height:1.688rem;margin:0}@media screen and (min-width:1400px){.image-text-module--text--243f8>p{font-size:1.5rem;line-height:2.25rem}}.contact-module--form--6131c,.contact-module--reachOut--f4b3d{box-shadow:0 2px 13px 0 rgba(0,0,0,.17)}.contact-module--form--6131c a,.contact-module--info--aa60c a{-webkit-text-decoration-skip:ink;color:#a6192e;text-decoration-color:#a6192e;text-decoration:none;text-decoration-skip-ink:auto}.contact-module--form--6131c a:focus,.contact-module--form--6131c a:hover,.contact-module--info--aa60c a:focus,.contact-module--info--aa60c a:hover{text-decoration:underline;text-underline-offset:1px}.contact-module--grid--b38a2{display:grid;grid-template-columns:100%;grid-template-rows:minmax(300px,445px) minmax(300px,500px)}@media screen and (min-width:500px){.contact-module--grid--b38a2{grid-template-columns:minmax(300px,445px)}}@media screen and (min-width:1100px){.contact-module--grid--b38a2{grid-template-columns:minmax(300px,550px) minmax(300px,445px);grid-template-rows:minmax(300px,500px);padding-bottom:2rem}}.contact-module--reachOut--f4b3d{background-color:#fff;border-radius:.5rem;display:flex;flex-direction:column;justify-content:space-between;margin:1.5rem 0}@media screen and (min-width:1100px){.contact-module--reachOut--f4b3d{margin:0}}.contact-module--reachOut--f4b3d>div:last-of-type{background-color:#fafafa;border-radius:0 0 .5rem .5rem}.contact-module--form--6131c{background-color:#fff;border-radius:.5rem;overflow:hidden;position:relative}@media screen and (min-width:1100px){.contact-module--form--6131c{margin-right:3rem}}.contact-module--form--6131c form{padding:1rem}@media screen and (min-width:1100px){.contact-module--form--6131c form{padding:3rem 3.75rem}}.contact-module--form--6131c p{max-width:24rem;padding:2rem}@media screen and (min-width:1100px){.contact-module--form--6131c p{padding:0}}.contact-module--form--6131c label{font-size:1.125rem;font-weight:700;line-height:1.5rem}.contact-module--form--6131c input,.contact-module--form--6131c textarea{background-color:#fff;border:1px solid #ebebeb;border-radius:8px;box-shadow:inset 0 1px 2px 0 rgba(0,0,0,.33);box-shadow:inset 0 1px 3px 0 rgba(0,0,0,.33);box-sizing:border-box;color:#322f31;display:block;font-family:Open Sans,Helvetica,Arial,sans-serif;font-size:1.125rem;height:2rem;margin-bottom:1rem;margin-top:.25rem;padding:.5rem;width:100%}.contact-module--form--6131c input:focus,.contact-module--form--6131c textarea:focus{box-shadow:0 0 2px 1px #326295;outline:0}.contact-module--form--6131c textarea{height:5rem}.contact-module--form--6131c button{background-color:#a6192e;border:none;border-radius:1.8125rem;color:#fff;font-size:1.5rem;font-weight:700;height:3.625rem;text-transform:uppercase;transition:all .4s;width:100%}.contact-module--form--6131c button:active,.contact-module--form--6131c button:hover{cursor:pointer}.contact-module--form--6131c button:active,.contact-module--form--6131c button:focus,.contact-module--form--6131c button:hover{background-color:#cf3a1f}.contact-module--error--b0458,.contact-module--success--78658{color:#322f31;font-size:1.5rem;font-weight:500;line-height:36px;padding:1rem}.contact-module--info--aa60c header{font-size:1.5rem;font-weight:500;line-height:2.25rem}.contact-module--info--aa60c>div{display:flex;margin-bottom:2.5rem}.contact-module--info--aa60c .contact-module--icon--e8062{height:62px;padding-left:1rem;padding-right:1rem;width:62px}@media screen and (min-width:1100px){.contact-module--info--aa60c .contact-module--icon--e8062{padding-left:2.4375rem;padding-right:1.5rem}}.contact-module--wait--ad0cb{display:flex;height:100%;justify-content:center}.contact-module--wait--ad0cb img{max-width:50%}.hero-module--heroContainer--578a3{background-position:50%;background-repeat:no-repeat;background-size:cover;-webkit-clip-path:url(#bottomCurve);clip-path:url(#bottomCurve);width:100%}@media screen and (min-width:650px){.hero-module--heroContainer--578a3{-webkit-clip-path:url(#horizontalWave);clip-path:url(#horizontalWave)}}.hero-module--heroGrid--889ec{grid-row-gap:0;display:grid;grid-template-columns:1fr;grid-template-rows:auto 6rem;padding-top:0}.hero-module--heroInfo--e5bb6{grid-column:1;grid-row:1;margin:1rem 0;padding:0 1rem}.hero-module--heroInfo--e5bb6>a{margin:1.5rem 0}@media screen and (min-width:500px){.hero-module--heroInfo--e5bb6{padding:0 1.875rem}}@media screen and (min-width:1400px){.hero-module--heroInfo--e5bb6{padding:0 4rem}}.hero-module--heroTitle--e813a{color:#fff;margin-bottom:1rem;margin-top:1.5rem;max-width:47rem}@media screen and (min-width:500px){.hero-module--heroTitle--e813a{margin-top:0}}@media screen and (min-width:1400px){.hero-module--heroTitle--e813a{font-size:4rem;line-height:4.875rem}}.hero-module--heroSubtitle--4fbd7{color:#fff;font-family:Open Sans,Helvetica,Arial,sans-serif;font-size:1.5rem;font-weight:400;line-height:1.875rem;margin-bottom:0;margin-top:0;max-width:47rem}.card-module--card--a46d9{background-color:#fff;border-radius:8px;box-shadow:0 2px 13px 0 rgba(0,0,0,.17)}.card-module--info--33d6e{padding:.5rem 1rem}.card-module--info--33d6e h3{font-size:1.125rem;line-height:1.375rem;margin:1rem 0;text-transform:uppercase}@media screen and (min-width:650px){.card-module--info--33d6e h3{font-size:1.375rem;line-height:1.688rem}}@media screen and (min-width:1400px){.card-module--info--33d6e h3{font-size:1.75rem;line-height:2.125rem}}.card-module--info--33d6e p{line-height:1.6rem}@media screen and (min-width:1400px){.card-module--info--33d6e p{font-size:1.125rem}}@media screen and (min-width:650px){.services-module--intro--53b28{margin-bottom:60px}.services-module--details--74612{align-items:center;display:flex;justify-content:space-between;max-width:75rem}}.services-module--text--de767{font-size:1.125rem;font-weight:500;line-height:1.688rem;margin:1rem 0}@media screen and (min-width:650px){.services-module--text--de767{margin-right:2rem}}@media screen and (min-width:1400px){.services-module--text--de767{font-size:1.5rem;line-height:2.2rem}}.services-module--grid--b1648{grid-gap:1rem;background-image:url('data:image/svg+xml;utf8, '),url('data:image/svg+xml;utf8, '),linear-gradient(rgba(50,98,149,.1),rgba(50,98,149,.1));background-position-x:center,center,center;background-position-y:top,bottom,center;background-repeat:no-repeat,no-repeat,no-repeat;background-size:100% 200px,100% 200px,100% 100%;display:grid;grid-template-columns:repeat(auto-fit,minmax(288px,1fr));margin:2rem 0;padding:0 1rem}@media screen and (min-width:650px){.services-module--grid--b1648{grid-gap:1.25rem;padding:0 1.875rem}}@media screen and (min-width:1400px){.services-module--grid--b1648{grid-gap:3rem;padding:0 4rem}}.teaser-module--teaser--299df{box-shadow:0 2px 13px 0 rgba(0,0,0,.17)}.teaser-module--teaserList--1ece4{grid-gap:1rem;display:grid;grid-template-columns:repeat(auto-fill,minmax(18.75rem,1fr));margin:0}@media screen and (min-width:1100px){.teaser-module--teaserList--1ece4{grid-template-columns:100%}.teaser-module--teaserList--1ece4>:nth-child(2n) img:nth-last-of-type(2),.teaser-module--teaserList--1ece4>:nth-child(odd) img:last-of-type{display:inline}}.teaser-module--teaser--299df{background-color:#fff;border-radius:.5rem;color:#322f31;display:grid;grid-template-areas:"image" "info";grid-template-rows:17rem 1fr;max-width:30rem;overflow:hidden;text-decoration:none;width:auto}.teaser-module--teaser--299df:active,.teaser-module--teaser--299df:focus,.teaser-module--teaser--299df:hover{box-shadow:0 2px 23px 0 rgba(0,0,0,.17)}.teaser-module--teaser--299df:active h2,.teaser-module--teaser--299df:focus h2,.teaser-module--teaser--299df:hover h2{text-decoration:underline}@media screen and (min-width:1100px){.teaser-module--teaser--299df{grid-column-gap:1rem;grid-template-areas:"image info";grid-template-columns:1.2fr 2fr;grid-template-rows:1fr;margin-bottom:1rem;max-width:unset;padding-right:3.625rem}}.teaser-module--image--6da35{align-self:stretch;-webkit-clip-path:url(#horizontalWave);clip-path:url(#horizontalWave);grid-area:image}@media screen and (min-width:1100px){.teaser-module--image--6da35{-webkit-clip-path:url(#verticalWave);clip-path:url(#verticalWave)}}.teaser-module--info--4a3e6{align-self:stretch;font-size:1.125rem;font-weight:300;grid-area:info;line-height:1.7rem;margin-left:1rem;margin-right:1rem;padding-bottom:1rem}.teaser-module--info--4a3e6 h2,.teaser-module--info--4a3e6 h3{margin:0}.teaser-module--info--4a3e6>p{margin-bottom:0}@media screen and (max-width:1099px){.teaser-module--info--4a3e6{display:flex;flex-direction:column;justify-content:space-between}.teaser-module--info--4a3e6>p:last-of-type{display:none}}@media screen and (min-width:1100px){.teaser-module--info--4a3e6{align-self:center;margin-bottom:1rem;margin-right:0;margin-top:1rem}.teaser-module--info--4a3e6 h3{font-size:1.5rem}.teaser-module--info--4a3e6.teaser-module--single--48dd4{align-self:center;margin-bottom:1rem;margin-top:1rem}.teaser-module--info--4a3e6.teaser-module--single--48dd4>p:last-of-type{display:inline-block}}.featured-module--featured--1b186{margin-bottom:1rem;padding:0 1rem}@media screen and (min-width:650px){.featured-module--featured--1b186{padding:0 1.875rem}}@media screen and (min-width:1400px){.featured-module--featured--1b186{margin-bottom:2rem;padding:0 4rem}}.featured-module--featured--1b186{grid-gap:1rem;display:grid}@media screen and (min-width:500px){.featured-module--featured--1b186{grid-gap:2rem;margin-bottom:1rem}}@media screen and (min-width:800px){.featured-module--featured--1b186{grid-gap:2rem;margin-bottom:1rem}}@media screen and (min-width:1100px){.featured-module--featured--1b186{grid-gap:4rem;margin-top:6rem}}.featured-module--intro--aae94{align-items:center;display:flex;flex-direction:row;justify-content:space-between}.featured-module--intro--aae94>h2{margin-right:2rem}@media screen and (min-width:1100px){.featured-module--intro--aae94{margin-bottom:1rem}}.post-module--header--1a8e4{background-color:#fff;display:grid;grid-template-columns:1fr;grid-template-rows:repeat(7,1fr)}.post-module--header--1a8e4 h1{color:#000;margin:0 0 1.5rem;padding:0}@media screen and (min-width:950px){.post-module--header--1a8e4 h1{padding:2rem 0 0 1rem}.post-module--header--1a8e4{align-items:stretch;grid-template-columns:repeat(26,1fr);grid-template-rows:minmax(190px,auto)}}.post-module--image--e04be{-webkit-clip-path:url(#bottomCurve);clip-path:url(#bottomCurve);grid-column:1;grid-row:1/8;height:25vh}@media screen and (min-width:650px){.post-module--image--e04be{height:55vh}}@media screen and (min-width:950px){.post-module--image--e04be{-webkit-clip-path:url(#rightCurve);clip-path:url(#rightCurve);grid-column:1/13;grid-row:1;height:auto}}.post-module--info--7af7f{padding-left:1rem}@media screen and (min-width:950px){.post-module--info--7af7f{align-self:center;grid-column:13/26;grid-row:1;padding:0}}.post-module--byLine--10047{font-size:1rem;line-height:1.125rem;margin-bottom:1rem}@media screen and (min-width:950px){.post-module--byLine--10047{font-size:1.125rem;line-height:1.6875rem;padding-left:1rem}}.post-module--summary--ef59d{font-size:1.25rem;font-weight:500;line-height:2.25rem;margin:0 0 1em}@media screen and (min-width:500px){.post-module--summary--ef59d{font-size:1.5rem}}@media screen and (min-width:950px){.post-module--summary--ef59d{margin:0;min-height:200px;padding-left:1rem}}.post-module--article--0419c{display:flex;flex-direction:column;padding:0 1rem 2rem}@media screen and (min-width:950px){.post-module--article--0419c{padding:0 0 1rem}}a.post-module--button--81712{border-radius:29px;font-size:1.5rem;letter-spacing:1px;line-height:3.5rem;padding-left:1.5rem;padding-right:1.5rem;white-space:nowrap;width:revert}.wysiwyg-module--wysiwyg--78dcb div:not([class^=not-safari]) a,.wysiwyg-module--wysiwyg--78dcb div[class^=not-safari] a,.wysiwyg-module--wysiwyg--78dcb div[class^=safari] a{-webkit-text-decoration-skip:ink;color:#a6192e;text-decoration-color:#a6192e;text-decoration:none;text-decoration-skip-ink:auto}.wysiwyg-module--wysiwyg--78dcb div:not([class^=not-safari]) a:focus,.wysiwyg-module--wysiwyg--78dcb div:not([class^=not-safari]) a:hover,.wysiwyg-module--wysiwyg--78dcb div[class^=not-safari] a:focus,.wysiwyg-module--wysiwyg--78dcb div[class^=not-safari] a:hover,.wysiwyg-module--wysiwyg--78dcb div[class^=safari] a:focus,.wysiwyg-module--wysiwyg--78dcb div[class^=safari] a:hover{text-decoration:underline;text-underline-offset:1px}.wysiwyg-module--wysiwyg--78dcb div[class^=not-safari] a{font-weight:600}@supports(-webkit-text-fill-color:transparent){@media screen and (min-width:500px){.wysiwyg-module--wysiwyg--78dcb div[class^=not-safari] a{-webkit-text-fill-color:transparent;background:linear-gradient(145.1deg,#d44126,#a6192e 90%);-webkit-background-clip:text}}}.wysiwyg-module--wysiwyg--78dcb ul.file-structure,.wysiwyg-module--wysiwyg--78dcb ul.yaml{font-family:Inconsolata,monospace;list-style:none;padding:0}.wysiwyg-module--wysiwyg--78dcb ul.file-structure ul,.wysiwyg-module--wysiwyg--78dcb ul.yaml ul{list-style:inherit}.wysiwyg-module--wysiwyg--78dcb{word-wrap:break-word;font-size:1.125rem;font-weight:300;-webkit-hyphens:auto;hyphens:auto;line-height:1.6875rem;margin:0 auto;max-width:100%;overflow-wrap:break-word;padding-top:2rem}@media screen and (min-width:800px){.wysiwyg-module--wysiwyg--78dcb{max-width:600px}}.wysiwyg-module--wysiwyg--78dcb div:not([class^=not-safari]) a,.wysiwyg-module--wysiwyg--78dcb div[class^=safari] a{font-weight:600}.wysiwyg-module--wysiwyg--78dcb p{margin:0 0 1rem}.wysiwyg-module--wysiwyg--78dcb img{height:auto;max-width:100%}.wysiwyg-module--wysiwyg--78dcb figure{margin:2rem 0}@media screen and (min-width:650px){.wysiwyg-module--wysiwyg--78dcb figure{margin:4rem 0}}.wysiwyg-module--wysiwyg--78dcb figcaption{font-size:.875rem;font-weight:300;line-height:1rem}.wysiwyg-module--wysiwyg--78dcb blockquote{-o-border-image:linear-gradient(180deg,#ff6720,#a6192e) 1 100%;border-image:linear-gradient(180deg,#ff6720,#a6192e) 1 100%;border-left-style:solid;border-width:0 0 0 1rem;font-size:1.125rem;font-weight:500;margin:0 0 1rem;padding-left:2rem}.wysiwyg-module--wysiwyg--78dcb blockquote>h3{margin:0}.wysiwyg-module--wysiwyg--78dcb code{display:block}.wysiwyg-module--wysiwyg--78dcb li code,.wysiwyg-module--wysiwyg--78dcb p code{display:inline}.wysiwyg-module--wysiwyg--78dcb ul.file-structure li{display:grid;grid-template-columns:40px -webkit-max-content;grid-template-columns:40px max-content}.wysiwyg-module--wysiwyg--78dcb ul.file-structure li:before{content:"├── "}.wysiwyg-module--wysiwyg--78dcb ul.file-structure li:last-of-type:before{content:"└── "}.wysiwyg-module--wysiwyg--78dcb ul.file-structure li ul{grid-column-end:span 2;padding-left:40px}.wysiwyg-module--wysiwyg--78dcb ul.file-structure li:not(:last-of-type)>ul{border-left:1.5px solid;margin-left:4.5px;padding-left:35.5px}
The 'Disclosure Menu' Module | Redfin Solutions Skip to content
It's a standard component:
a menu where the user can hover over a top-level menu item to see its submenu
Almost every one of our clients has requested a variation of this at the top of every page of their website. Starting with Drupal 7, we became accustomed to a specific toolset for building these. There were lots of options, mobile support, and everything worked from our perspective and our client's perspective. But our menus had a bias towards visual users with a mouse. The words "hover" and "see" were in the definition of the component, actions only a subset of users can accomplish. Accessibility and inclusivity need to start at the roots, so we redefined the component:
a menu where each top-level menu item has a submenu that the user can choose to navigate
With this definition, it became obvious the component was broken for keyboard users, because they did not have a choice. Using a keyboard to navigate through menu links meant tabbing through every single submenu. So how do we do this better?
We started by looking at recommendations from the WAI Authoring Practices Guide and found the Disclosure Navigation Hybrid Menu . This component simply adds a toggle button to open submenus. Now all users have a choice.
Re-handling Hover With the basic interface set, we needed to re-add the hover navigation. But this created a conflict. If a user hovers over the toggle button, the submenu should open. If a user clicks the toggle button, the submenu should toggle. So if a user hovers over a toggle button and clicks it, then the submenu is toggled open and immediately toggled shut. Here are some solutions we've built to resolve this behavior:
Keyboard only: the toggle button can only be triggered by keyboard, not pointer devices. Only open: clicking the toggle button only opens the submenu. Hide until focused: visually hide the toggle button until it receives tab focus, so pointers can't access it by default. Leveraging the Full-stack in Drupal When rebuilding this component, we looked at existing Javascript libraries, but kept running into the same issues. Either they were so opinionated about the HTML that it was difficult to template in Drupal, or they were so generic that they were inconsistent and hard to customize. Finally we realized that we could write the template and Javascript in tandem and created a customizable component with less than 200 lines of Javascript and no external dependencies. In fact our accessibility standards actually made the functionality easier to code with the aria-controls
and aria-labelledby
attributes. For example, a toggle button for a submenu would have an aria-controls
attribute set to the ID of the corresponding submenu, and the submenu would have its aria-labelledby
attribute set to the ID of the toggle button. This is necessary for screen readers to communicate connections between elements that can't be seen, but it also makes it trivial to code the toggle interaction. Other libraries often create data-models of the menu to track these connections, but that's not necessary when everything is explicitly defined in the HTML. The only issue is generating unique ID's for all the toggles and submenus. But Drupal makes this easy for us with its HTML utility class which provides a simple getUniqueId
method . And now in Drupal 10.2 there's a clean_unique_id
function for Twig templates.
Contribution And once all of that was figured out, we gave the component back to Drupal and, thanks to the community, made it stable and secure. So the next time a client needs a complex menu without losing accessibility, load up Disclosure menu and see if it fits your needs. If not, file an issue and let's make it better for everyone.