11import { JsxProps , VNode } from 'dom-renderer' ;
22import { observable } from 'mobx' ;
3- import { FC , WebCellProps , attribute , component , observer } from 'web-cell' ;
4- import { uniqueID } from 'web-utility' ;
3+ import {
4+ FC ,
5+ WebCell ,
6+ WebCellProps ,
7+ attribute ,
8+ component ,
9+ observer
10+ } from 'web-cell' ;
11+ import { delegate , uniqueID } from 'web-utility' ;
512
613import { Container , ContainerProps } from './Grid' ;
714import {
@@ -73,12 +80,14 @@ export interface OffcanvasNavbarProps
7380 brand ?: VNode ;
7481}
7582
83+ export interface OffcanvasNavbar extends WebCell { }
84+
7685@component ( {
7786 tagName : 'offcanvas-navbar' ,
7887 mode : 'open'
7988} )
8089@observer
81- export class OffcanvasNavbar extends HTMLElement {
90+ export class OffcanvasNavbar extends HTMLElement implements WebCell {
8291 declare props : OffcanvasNavbarProps ;
8392
8493 @attribute
@@ -124,6 +133,30 @@ export class OffcanvasNavbar extends HTMLElement {
124133 @observable
125134 accessor closeButton = true ;
126135
136+ connectedCallback ( ) {
137+ globalThis . addEventListener ?.( 'keyup' , this . close , true ) ;
138+
139+ this . addEventListener ( 'click' , this . handleLink ) ;
140+ }
141+
142+ disconnectedCallback ( ) {
143+ globalThis . removeEventListener ?.( 'keyup' , this . close , true ) ;
144+
145+ this . addEventListener ( 'click' , this . handleLink ) ;
146+ }
147+
148+ close = ( event ?: KeyboardEvent | MouseEvent ) => {
149+ if (
150+ event instanceof KeyboardEvent &&
151+ ! [ 'Escape' , 'Enter' ] . includes ( event . key )
152+ )
153+ return ;
154+
155+ this . open = false ;
156+ } ;
157+
158+ handleLink = delegate ( 'a[href].nav-link' , this . close ) ;
159+
127160 renderContent ( ) {
128161 const { variant, bg, expand, fixed, sticky, fluid, brand } = this ,
129162 { title, titleId, offcanvasId, open, closeButton } = this ;
@@ -141,6 +174,7 @@ export class OffcanvasNavbar extends HTMLElement {
141174 id = { offcanvasId }
142175 aria-labelledby = { titleId }
143176 show = { open }
177+ onHide = { this . close }
144178 >
145179 < OffcanvasHeader
146180 closeButton = { closeButton }
0 commit comments