@nordhealth/components 2.8.1 → 2.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/Layout.js CHANGED
@@ -1,2 +1,2 @@
1
- import{_ as e,e as n}from"./query-assigned-elements-e6cbac30.js";import{i as t,s as a,y as i,b as o}from"./lit-element-9178eae5.js";import{e as s}from"./property-03f59dce.js";import{t as r}from"./state-70f38ceb.js";import{i as d}from"./query-2d22378e.js";import{o as l}from"./class-map-949b7d3b.js";import{D as h}from"./DirectionController-8b298382.js";import{E as p}from"./EventController-d99ebeef.js";import{L as c}from"./LightDismissController-a2645ae6.js";import{S as v}from"./SlotController-89834aef.js";import{o as u}from"./observe-a9c6dfb6.js";import{c as g}from"./cond-338158e9.js";import{f as m}from"./fsm-50373df9.js";import{c as b}from"./number-c3ab3e95.js";import"./NavToggle.js";import{s as y}from"./Component-92eb6234.js";import"./directive-de55b00a.js";import"./ShortcutController-87615e31.js";import"./tinykeys.module-84e6cc41.js";import"./ref-0e619221.js";import"./LocalizeController.js";import"./translation.js";import"./en-us.js";import"./localization.js";import"./localization2.js";import"./localization3.js";import"./localization4.js";import"./localization5.js";import"./DraftComponentMixin-9e4b7b34.js";import"./FocusableMixin-34870ed3.js";import"./Button.js";import"./LightDomController-3c726b20.js";import"./Spinner.js";import"./if-defined-4598a996.js";import"./InputMixin-158f63fb.js";import"./Icon.js";import"./unsafe-html-6be42999.js";import"./VisuallyHidden.js";const w=t`:host{--_n-layout-padding:var(--n-layout-padding, var(--n-space-l));--_n-layout-drawer-inline-size:var(--n-layout-drawer-inline-size, 320px);--_n-layout-nav-transition-duration:var(--n-transition-mobile);background:var(--n-color-background);color:var(--n-color-text)}.n-layout-main,.n-layout-nav{background:var(--n-color-background);min-block-size:100%}.n-layout-nav{position:fixed;user-select:none;inline-size:var(--_n-layout-nav-width);z-index:var(--n-index-nav);inset-block-start:0;inset-inline-start:0;inset-block-end:0;transform:translateX(var(--n-nav-transform));box-shadow:var(--n-box-shadow-nav)}.n-layout-main{position:relative}main{padding:var(--_n-layout-padding)}aside{position:fixed;z-index:var(--n-index-nav);inset-block:0;inset-inline-end:0;inline-size:var(--_n-layout-drawer-inline-size);max-inline-size:100%;background:var(--n-color-surface);box-shadow:var(--n-box-shadow-nav)}@media (min-width:1240px){.n-has-drawer{margin-inline-end:var(--_n-layout-drawer-inline-size)}aside{box-shadow:var(--n-box-shadow-header);border-inline-start:1px solid var(--n-color-border)}}slot[name=drawer]::slotted(*){block-size:100%!important}:is([data-nav=closed],[data-nav=unpeek]) .n-layout-nav{transform:translateX(-110%)}.n-rtl:is([data-nav=closed],[data-nav=unpeek]) .n-layout-nav{transform:translateX(110%)}[data-screen=narrow] .n-layout-nav{transition:transform var(--_n-layout-nav-transition-duration)}[data-screen=wide]:is([data-nav=peek],[data-nav=wait],[data-nav=unpeek],[data-nav=blocked]) .n-layout-nav{transition:transform var(--_n-layout-nav-transition-duration);border-start-end-radius:var(--n-border-radius);border-end-end-radius:var(--n-border-radius);min-block-size:0;inset-block-start:calc(var(--n-space-m) * 4);inset-block-end:var(--n-space-l)}[data-screen=wide][data-nav=opened] .n-layout-nav{border-inline-end:1px solid var(--n-color-border);box-shadow:none}[data-screen=wide][data-nav=opened] .n-layout-main{margin-inline-start:var(--_n-layout-nav-width)}.n-resize{touch-action:none;position:absolute;min-block-size:100%;inset-block:0;inset-inline-end:-8px;inline-size:10px;background:0 0}[data-nav=opened] .n-resize{cursor:col-resize}.n-resize::after{content:"";position:absolute;z-index:var(--n-index-sticky);inset-block:0;inset-inline-end:5px;inline-size:3px;background:var(--n-color-accent);transition:opacity var(--n-transition-slowly);opacity:0}.n-resize:focus{outline:0}.n-dragging .n-resize::after,.n-resize:focus::after,[data-nav=opened] .n-resize:hover::after{opacity:1;transition-delay:.15s}@supports selector(:focus-visible){.n-resize:focus::after{opacity:0}.n-resize:focus-visible::after{opacity:1}}.n-dragging{cursor:col-resize!important;-webkit-user-select:none;user-select:none}:host([padding=none]){--_n-layout-padding:var(--n-layout-padding, 0)}.n-nav-toggle-container{position:absolute;padding:var(--n-space-m) var(--n-space-l);min-block-size:var(--n-space-xxl);display:flex;align-items:center}[data-screen=wide][data-nav=opened] .n-nav-toggle-container{display:none}:is([data-screen=wide]:not([data-nav=opened]),[data-screen=narrow]) .n-has-own-nav-toggle ::slotted(nord-header){--_n-header-gutter:calc(var(--n-space-l) * 3)}`,f=matchMedia("(min-width: 768px)"),k=function(e,n,t=JSON.stringify,a=JSON.parse){return{get value(){try{const t=localStorage.getItem(e);return t?a(t):n}catch(e){return n}},set value(n){try{localStorage.setItem(e,t(n))}catch(e){}}}}("nord-layout.navWidth",250),T=m({opened:{toggle:"closed",close:"closed"},closed:{toggle:"opened",open:"opened",focusin:"peek",pointerenter:"peek"},peek:{toggle:"opened",focusout:"unpeek",pointerleave:"wait",dropdownOpen:"blocked",click:"unpeek",open:"opened"},blocked:{dropdownClose:"peek",open:"opened"},wait:{toggle:"opened",focusin:"peek",pointerenter:"peek",timeout:"unpeek"},unpeek:{toggle:"opened",focusin:"peek",pointerenter:"peek",transitionend:"closed"}});let j=class extends a{constructor(){super(...arguments),this.navSlot=new v(this,"nav"),this.drawerSlot=new v(this,"drawer"),this.direction=new h(this),this.events=new p(this),this.lightDismiss=new c(this,{isOpen:()=>"opened"===this.navState&&!this.wideScreen,onDismiss:()=>this.navTransition("close"),isDismissible:e=>e!==this.navEl}),this.navWidth=k.value,this.isDragging=!1,this.navState=f.matches?"opened":"closed",this.wideScreen=f.matches,this.navOpen="opened"===this.navState,this.padding="m",this.handleMediaQueryChange=()=>{this.wideScreen=f.matches,this.navTransition(this.wideScreen?"open":"close")},this.handleToggleClick=()=>{this.navTransition("toggle")},this.handleNavFocus=()=>{this.navTransition("focusin")},this.handleMainFocus=()=>{this.navTransition("focusout")},this.handleMouseEnter=()=>{this.wideScreen&&this.navTransition("pointerenter")},this.handleMouseLeave=()=>{this.navTransition("pointerleave")},this.handleTransitionEnd=()=>{this.navTransition("transitionend")}}connectedCallback(){super.connectedCallback(),this.events.listen(f,"change",this.handleMediaQueryChange),this.events.listen(this,"click",(e=>{this.isNavToggle(e.target)&&this.handleToggleClick()})),this.events.listen(this,"mouseover",(e=>{this.isNavToggle(e.target)&&this.handleMouseEnter()})),this.events.listen(this,"mouseout",(e=>{this.isNavToggle(e.target)&&this.handleMouseLeave()}))}render(){const{navWidth:e,navState:n,navSlot:t,isDragging:a,direction:s}=this,r="opened"===n&&this.wideScreen?e:250,d=t.hasContent&&!this.navToggle;return i`<div class="${l({"n-layout":!0,"n-rtl":s.isRTL,"n-dragging":a})}" style="${`--_n-layout-nav-width: ${r}px`}" data-nav="${t.hasContent?n:"closed"}" data-screen="${this.wideScreen?"wide":"narrow"}"><div class="n-layout-nav" ?hidden="${t.isEmpty}" @focusin="${this.handleNavFocus}" @mouseenter="${this.handleMouseEnter}" @mouseleave="${this.handleMouseLeave}" @open="${this.handleDropdownOpen}" @close="${this.handleDropdownClose}"><slot name="nav"></slot><div class="n-resize" role="separator" aria-orientation="vertical" tabindex="0" @pointerdown="${g("opened"===n,this.startDragging)}" @pointermove="${g(a,this.handleDrag)}" @pointerleave="${this.stopDragging}" @pointerup="${this.stopDragging}" @keydown="${this.handleKeyboardResize}"></div></div><div class="${l({"n-layout-main":!0,"n-has-own-nav-toggle":d})}" @focusin="${this.handleMainFocus}" @click="${this.handleClick}">${d?this.renderNavToggle():o}<div class="${l({"n-has-drawer":this.drawerSlot.hasContent})}"><slot name="header"></slot><main><slot></slot></main></div><aside ?hidden="${this.drawerSlot.isEmpty}"><slot name="drawer"></slot></aside></div></div>`}renderNavToggle(){return i`<div class="n-nav-toggle-container"><slot name="nav-toggle" @click="${this.handleToggleClick}" @mouseover="${this.handleMouseEnter}" @mouseout="${this.handleMouseLeave}"><nord-nav-toggle></nord-nav-toggle></slot></div>`}handleNavWidthChange(){k.value=this.navWidth}handleNavStateChange(e){switch("wait"===e&&this.peekTimeoutId&&clearTimeout(this.peekTimeoutId),"unpeek"===e&&this.navEl.removeEventListener("transitionend",this.handleTransitionEnd),this.navState){case"closed":this.navOpen=!1;break;case"opened":this.navOpen=!0;break;case"wait":this.peekTimeoutId=setTimeout((()=>this.navTransition("timeout")),300);break;case"unpeek":this.navEl.addEventListener("transitionend",this.handleTransitionEnd,{once:!0})}}handleOpenChange(){this.isDragging||this.setNavWidth(Math.max(this.navWidth,250)),this.navTransition(this.navOpen?"open":"close")}navTransition(e){this.navState=T.transition(this.navState,e)}handleClick(){this.navTransition("click")}handleDropdownOpen(e){"nord-dropdown"===e.target.localName&&this.navTransition("dropdownOpen")}handleDropdownClose(e){"nord-dropdown"===e.target.localName&&this.navTransition("dropdownClose")}isNavToggle(e){return Boolean(this.navToggle)&&(null!=(n=e)&&n.nodeType===Node.ELEMENT_NODE)&&e.id===this.navToggle;var n}handleKeyboardResize(e){const{navWidth:n,direction:{isLTR:t}}=this;switch(e.key){case"ArrowLeft":this.setNavWidth(n+(t?-30:30));break;case"ArrowRight":this.setNavWidth(n+(t?30:-30));break;case"Enter":this.navTransition("toggle");break;case"Home":this.setNavWidth(220);break;case"End":this.setNavWidth(400);break;default:return}e.preventDefault()}setNavWidth(e){this.navWidth=b(Math.round(e),220,400)}startDragging(e){if(0===e.button){e.target.setPointerCapture(e.pointerId),this.isDragging=!0}}stopDragging(){this.isDragging=!1}handleDrag(e){const n=this.direction.isRTL?this.clientWidth-e.clientX:e.clientX;this.setNavWidth(n),this.navTransition(n>=100?"open":"close")}};j.styles=[y,w],e([d(".n-layout-nav",!0)],j.prototype,"navEl",void 0),e([r()],j.prototype,"navWidth",void 0),e([r()],j.prototype,"isDragging",void 0),e([r()],j.prototype,"navState",void 0),e([r()],j.prototype,"wideScreen",void 0),e([s({reflect:!0,type:Boolean,attribute:"nav-open"})],j.prototype,"navOpen",void 0),e([s({attribute:"nav-toggle"})],j.prototype,"navToggle",void 0),e([s({reflect:!0})],j.prototype,"padding",void 0),e([u("navWidth","updated")],j.prototype,"handleNavWidthChange",null),e([u("navState")],j.prototype,"handleNavStateChange",null),e([u("navOpen","updated")],j.prototype,"handleOpenChange",null),j=e([n("nord-layout")],j);var x=j;export{x as default};
1
+ import{_ as e,e as n}from"./query-assigned-elements-e6cbac30.js";import{i as t,s as a,y as i,b as o}from"./lit-element-9178eae5.js";import{e as s}from"./property-03f59dce.js";import{t as r}from"./state-70f38ceb.js";import{i as d}from"./query-2d22378e.js";import{o as l}from"./class-map-949b7d3b.js";import{D as h}from"./DirectionController-8b298382.js";import{E as c}from"./EventController-d99ebeef.js";import{L as p}from"./LightDismissController-a2645ae6.js";import{S as v}from"./SlotController-89834aef.js";import{o as u}from"./observe-a9c6dfb6.js";import{c as g}from"./cond-338158e9.js";import{f as m}from"./fsm-50373df9.js";import{c as b}from"./number-c3ab3e95.js";import"./NavToggle.js";import{s as y}from"./Component-92eb6234.js";import"./directive-de55b00a.js";import"./ShortcutController-87615e31.js";import"./tinykeys.module-84e6cc41.js";import"./ref-0e619221.js";import"./LocalizeController.js";import"./translation.js";import"./en-us.js";import"./localization.js";import"./localization2.js";import"./localization3.js";import"./localization4.js";import"./localization5.js";import"./DraftComponentMixin-9e4b7b34.js";import"./FocusableMixin-34870ed3.js";import"./Button.js";import"./LightDomController-3c726b20.js";import"./Spinner.js";import"./if-defined-4598a996.js";import"./InputMixin-158f63fb.js";import"./Icon.js";import"./unsafe-html-6be42999.js";import"./VisuallyHidden.js";const k=t`:host{--_n-layout-padding:var(--n-layout-padding, var(--n-space-l));--_n-layout-drawer-inline-size:var(--n-layout-drawer-inline-size, 320px);--_n-layout-background-color:var(--n-layout-background-color, var(--n-color-background));--_n-layout-nav-transition-duration:var(--n-transition-mobile);background:var(--_n-layout-background-color);color:var(--n-color-text)}.n-layout-main,.n-layout-nav{background:var(--_n-layout-background-color);min-block-size:100%}.n-layout-nav{position:fixed;user-select:none;inline-size:var(--_n-layout-nav-width);z-index:var(--n-index-nav);inset-block-start:0;inset-inline-start:0;inset-block-end:0;transform:translateX(var(--n-nav-transform));box-shadow:var(--n-box-shadow-nav)}.n-layout-main{position:relative}main{padding:var(--_n-layout-padding)}aside{position:fixed;z-index:var(--n-index-nav);inset-block:0;inset-inline-end:0;inline-size:var(--_n-layout-drawer-inline-size);max-inline-size:100%;background:var(--n-color-surface);box-shadow:var(--n-box-shadow-nav)}@media (min-width:1240px){.n-has-drawer{margin-inline-end:var(--_n-layout-drawer-inline-size)}aside{box-shadow:var(--n-box-shadow-header);border-inline-start:1px solid var(--n-color-border)}}slot[name=drawer]::slotted(*){block-size:100%!important}:is([data-nav=closed],[data-nav=unpeek]) .n-layout-nav{transform:translateX(-110%)}.n-rtl:is([data-nav=closed],[data-nav=unpeek]) .n-layout-nav{transform:translateX(110%)}[data-screen=narrow] .n-layout-nav{transition:transform var(--_n-layout-nav-transition-duration)}[data-screen=wide]:is([data-nav=peek],[data-nav=wait],[data-nav=unpeek],[data-nav=blocked]) .n-layout-nav{transition:transform var(--_n-layout-nav-transition-duration);border-start-end-radius:var(--n-border-radius);border-end-end-radius:var(--n-border-radius);min-block-size:0;inset-block-start:calc(var(--n-space-m) * 4);inset-block-end:var(--n-space-l)}[data-screen=wide][data-nav=opened] .n-layout-nav{border-inline-end:1px solid var(--n-color-border);box-shadow:none}[data-screen=wide][data-nav=opened] .n-layout-main{margin-inline-start:var(--_n-layout-nav-width)}.n-resize{touch-action:none;position:absolute;min-block-size:100%;inset-block:0;inset-inline-end:-8px;inline-size:10px;background:0 0}[data-nav=opened] .n-resize{cursor:col-resize}.n-resize::after{content:"";position:absolute;z-index:var(--n-index-sticky);inset-block:0;inset-inline-end:5px;inline-size:3px;background:var(--n-color-accent);transition:opacity var(--n-transition-slowly);opacity:0}.n-resize:focus{outline:0}.n-dragging .n-resize::after,.n-resize:focus::after,[data-nav=opened] .n-resize:hover::after{opacity:1;transition-delay:.15s}@supports selector(:focus-visible){.n-resize:focus::after{opacity:0}.n-resize:focus-visible::after{opacity:1}}.n-dragging{cursor:col-resize!important;-webkit-user-select:none;user-select:none}:host([padding=none]){--_n-layout-padding:var(--n-layout-padding, 0)}.n-nav-toggle-container{position:absolute;padding:var(--n-space-m) var(--n-space-l);min-block-size:calc(var(--n-space-xxl) - var(--n-space-s)/ 2);display:flex;align-items:center}[data-screen=wide][data-nav=opened] .n-nav-toggle-container{display:none}:is([data-screen=wide]:not([data-nav=opened]),[data-screen=narrow]) .n-has-own-nav-toggle ::slotted(nord-header){--_n-header-gutter:calc(var(--n-space-l) * 3)}`,w=matchMedia("(min-width: 768px)"),f=function(e,n,t=JSON.stringify,a=JSON.parse){return{get value(){try{const t=localStorage.getItem(e);return t?a(t):n}catch(e){return n}},set value(n){try{localStorage.setItem(e,t(n))}catch(e){}}}}("nord-layout.navWidth",250),T=m({opened:{toggle:"closed",close:"closed"},closed:{toggle:"opened",open:"opened",focusin:"peek",pointerenter:"peek"},peek:{toggle:"opened",focusout:"unpeek",pointerleave:"wait",dropdownOpen:"blocked",click:"unpeek",open:"opened"},blocked:{dropdownClose:"peek",open:"opened"},wait:{toggle:"opened",focusin:"peek",pointerenter:"peek",timeout:"unpeek"},unpeek:{toggle:"opened",focusin:"peek",pointerenter:"peek",transitionend:"closed"}});let j=class extends a{constructor(){super(...arguments),this.navSlot=new v(this,"nav"),this.drawerSlot=new v(this,"drawer"),this.direction=new h(this),this.events=new c(this),this.lightDismiss=new p(this,{isOpen:()=>"opened"===this.navState&&!this.wideScreen,onDismiss:()=>this.navTransition("close"),isDismissible:e=>e!==this.navEl}),this.navWidth=f.value,this.isDragging=!1,this.navState=w.matches?"opened":"closed",this.wideScreen=w.matches,this.navOpen="opened"===this.navState,this.padding="m",this.handleMediaQueryChange=()=>{this.wideScreen=w.matches,this.navTransition(this.wideScreen?"open":"close")},this.handleToggleClick=()=>{this.navTransition("toggle")},this.handleNavFocus=()=>{this.navTransition("focusin")},this.handleMainFocus=()=>{this.navTransition("focusout")},this.handleMouseEnter=()=>{this.wideScreen&&this.navTransition("pointerenter")},this.handleMouseLeave=()=>{this.navTransition("pointerleave")},this.handleTransitionEnd=()=>{this.navTransition("transitionend")}}connectedCallback(){super.connectedCallback(),this.events.listen(w,"change",this.handleMediaQueryChange),this.events.listen(this,"click",(e=>{this.isNavToggle(e.target)&&this.handleToggleClick()})),this.events.listen(this,"mouseover",(e=>{this.isNavToggle(e.target)&&this.handleMouseEnter()})),this.events.listen(this,"mouseout",(e=>{this.isNavToggle(e.target)&&this.handleMouseLeave()}))}render(){const{navWidth:e,navState:n,navSlot:t,isDragging:a,direction:s}=this,r="opened"===n&&this.wideScreen?e:250,d=t.hasContent&&!this.navToggle;return i`<div class="${l({"n-layout":!0,"n-rtl":s.isRTL,"n-dragging":a})}" style="${`--_n-layout-nav-width: ${r}px`}" data-nav="${t.hasContent?n:"closed"}" data-screen="${this.wideScreen?"wide":"narrow"}"><div class="n-layout-nav" ?hidden="${t.isEmpty}" @focusin="${this.handleNavFocus}" @mouseenter="${this.handleMouseEnter}" @mouseleave="${this.handleMouseLeave}" @open="${this.handleDropdownOpen}" @close="${this.handleDropdownClose}"><slot name="nav"></slot><div class="n-resize" role="separator" aria-orientation="vertical" tabindex="0" @pointerdown="${g("opened"===n,this.startDragging)}" @pointermove="${g(a,this.handleDrag)}" @pointerleave="${this.stopDragging}" @pointerup="${this.stopDragging}" @keydown="${this.handleKeyboardResize}"></div></div><div class="${l({"n-layout-main":!0,"n-has-own-nav-toggle":d})}" @focusin="${this.handleMainFocus}" @click="${this.handleClick}">${d?this.renderNavToggle():o}<div class="${l({"n-has-drawer":this.drawerSlot.hasContent})}"><slot name="header"></slot><main><slot></slot></main></div><aside ?hidden="${this.drawerSlot.isEmpty}"><slot name="drawer"></slot></aside></div></div>`}renderNavToggle(){return i`<div class="n-nav-toggle-container"><slot name="nav-toggle" @click="${this.handleToggleClick}" @mouseover="${this.handleMouseEnter}" @mouseout="${this.handleMouseLeave}"><nord-nav-toggle></nord-nav-toggle></slot></div>`}handleNavWidthChange(){f.value=this.navWidth}handleNavStateChange(e){switch("wait"===e&&this.peekTimeoutId&&clearTimeout(this.peekTimeoutId),"unpeek"===e&&this.navEl.removeEventListener("transitionend",this.handleTransitionEnd),this.navState){case"closed":this.navOpen=!1;break;case"opened":this.navOpen=!0;break;case"wait":this.peekTimeoutId=setTimeout((()=>this.navTransition("timeout")),300);break;case"unpeek":this.navEl.addEventListener("transitionend",this.handleTransitionEnd,{once:!0})}}handleOpenChange(){this.isDragging||this.setNavWidth(Math.max(this.navWidth,250)),this.navTransition(this.navOpen?"open":"close")}navTransition(e){this.navState=T.transition(this.navState,e)}handleClick(){this.navTransition("click")}handleDropdownOpen(e){"nord-dropdown"===e.target.localName&&this.navTransition("dropdownOpen")}handleDropdownClose(e){"nord-dropdown"===e.target.localName&&this.navTransition("dropdownClose")}isNavToggle(e){return Boolean(this.navToggle)&&(null!=(n=e)&&n.nodeType===Node.ELEMENT_NODE)&&e.id===this.navToggle;var n}handleKeyboardResize(e){const{navWidth:n,direction:{isLTR:t}}=this;switch(e.key){case"ArrowLeft":this.setNavWidth(n+(t?-30:30));break;case"ArrowRight":this.setNavWidth(n+(t?30:-30));break;case"Enter":this.navTransition("toggle");break;case"Home":this.setNavWidth(220);break;case"End":this.setNavWidth(400);break;default:return}e.preventDefault()}setNavWidth(e){this.navWidth=b(Math.round(e),220,400)}startDragging(e){if(0===e.button){e.target.setPointerCapture(e.pointerId),this.isDragging=!0}}stopDragging(){this.isDragging=!1}handleDrag(e){const n=this.direction.isRTL?this.clientWidth-e.clientX:e.clientX;this.setNavWidth(n),this.navTransition(n>=100?"open":"close")}};j.styles=[y,k],e([d(".n-layout-nav",!0)],j.prototype,"navEl",void 0),e([r()],j.prototype,"navWidth",void 0),e([r()],j.prototype,"isDragging",void 0),e([r()],j.prototype,"navState",void 0),e([r()],j.prototype,"wideScreen",void 0),e([s({reflect:!0,type:Boolean,attribute:"nav-open"})],j.prototype,"navOpen",void 0),e([s({attribute:"nav-toggle"})],j.prototype,"navToggle",void 0),e([s({reflect:!0})],j.prototype,"padding",void 0),e([u("navWidth","updated")],j.prototype,"handleNavWidthChange",null),e([u("navState")],j.prototype,"handleNavStateChange",null),e([u("navOpen","updated")],j.prototype,"handleOpenChange",null),j=e([n("nord-layout")],j);var x=j;export{x as default};
2
2
  //# sourceMappingURL=Layout.js.map
package/lib/Layout.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Layout.js","sources":["../src/layout/Layout.ts","../src/common/storage.ts"],"sourcesContent":["/* eslint-disable lit-a11y/click-events-have-key-events */\nimport { LitElement, html, nothing } from \"lit\"\nimport { customElement, property, query, state } from \"lit/decorators.js\"\nimport { classMap } from \"lit/directives/class-map.js\"\nimport { DirectionController } from \"../common/controllers/DirectionController.js\"\nimport { EventController } from \"../common/controllers/EventController.js\"\nimport { LightDismissController } from \"../common/controllers/LightDismissController.js\"\nimport { SlotController } from \"../common/controllers/SlotController.js\"\nimport { observe } from \"../common/decorators/observe.js\"\nimport { cond } from \"../common/directives/cond.js\"\nimport { Events, fsm, States } from \"../common/fsm.js\"\nimport { clamp } from \"../common/number.js\"\nimport { storage } from \"../common/storage.js\"\n\nimport \"../nav-toggle/NavToggle.js\"\n\nimport componentStyle from \"../common/styles/Component.css\"\nimport style from \"./Layout.css\"\n\nconst NAV_DEFAULT_WIDTH = 250\nconst NAV_MIN_WIDTH = 220\nconst NAV_MAX_WIDTH = 400\nconst NAV_COLLAPSE_WIDTH = 100\nconst NAV_RESIZE_STEP = 30\nconst NAV_PEEK_DELAY = 300\n\nconst mediaQuery = matchMedia(\"(min-width: 768px)\")\nconst store = storage(\"nord-layout.navWidth\", NAV_DEFAULT_WIDTH)\n\nconst navMachine = fsm({\n opened: {\n toggle: \"closed\",\n close: \"closed\",\n },\n closed: {\n toggle: \"opened\",\n open: \"opened\",\n focusin: \"peek\",\n pointerenter: \"peek\",\n },\n peek: {\n toggle: \"opened\",\n focusout: \"unpeek\",\n pointerleave: \"wait\",\n dropdownOpen: \"blocked\",\n click: \"unpeek\",\n open: \"opened\",\n },\n blocked: {\n dropdownClose: \"peek\",\n open: \"opened\",\n },\n wait: {\n toggle: \"opened\",\n focusin: \"peek\",\n pointerenter: \"peek\",\n timeout: \"unpeek\",\n },\n unpeek: {\n toggle: \"opened\",\n focusin: \"peek\",\n pointerenter: \"peek\",\n transitionend: \"closed\",\n },\n})\n\ntype NavState = States<typeof navMachine>\ntype NavEvent = Events<typeof navMachine>\n\nfunction isElement(el: any): el is Element {\n return el != null && el.nodeType === Node.ELEMENT_NODE\n}\n\n/**\n * Layout component is used to create the main layout of an app. Layout\n * currently comes with one main configuration: two-column.\n *\n * @status ready\n * @category structure\n * @slot - The default main section content.\n * @slot nav - Used to place content inside the navigation sidebar.\n * @slot header - Used to place content inside the header section.\n * @slot drawer - Used to place additional content/details relating to a selected item.\n * @slot nav-toggle - Used to place a own nav-toggle component, for cases where you might need to add a tooltip.\n *\n * @cssprop [--n-layout-padding=var(--n-space-l)] - Controls the padding around the main layout area (the main slot), using our [spacing tokens](/tokens/#space).\n * @cssprop [--n-layout-drawer-inline-size=320px] - Controls the width of the drawer area, when used.\n */\n@customElement(\"nord-layout\")\nexport default class Layout extends LitElement {\n static styles = [componentStyle, style]\n\n private peekTimeoutId?: ReturnType<typeof setTimeout>\n\n private navSlot = new SlotController(this, \"nav\")\n private drawerSlot = new SlotController(this, \"drawer\")\n private direction = new DirectionController(this)\n private events = new EventController(this)\n private lightDismiss = new LightDismissController(this, {\n isOpen: () => this.navState === \"opened\" && !this.wideScreen,\n onDismiss: () => this.navTransition(\"close\"),\n isDismissible: node => node !== this.navEl,\n })\n\n @query(\".n-layout-nav\", true) private navEl!: HTMLDivElement\n\n @state() private navWidth = store.value\n @state() private isDragging = false\n @state() private navState: NavState = mediaQuery.matches ? \"opened\" : \"closed\"\n @state() private wideScreen = mediaQuery.matches\n\n /**\n * Controls whether the navigation is hidden off-screen or not.\n * Defaults to `true` for wide viewports, and `false` otherwise.\n */\n @property({ reflect: true, type: Boolean, attribute: \"nav-open\" }) navOpen: boolean = this.navState === \"opened\"\n\n /**\n * ID reference of element used to toggle the navigation.\n * This is deprecated, the layout component will now render its own nav toggle to simplify usage.\n * @deprecated\n */\n @property({ attribute: \"nav-toggle\" }) navToggle?: string\n\n /**\n * Controls the padding of the default main section slot. When set to “none”,\n * the nav and header slots will still have padding.\n */\n @property({ reflect: true }) padding: \"m\" | \"none\" = \"m\"\n\n connectedCallback(): void {\n super.connectedCallback()\n\n this.events.listen(mediaQuery, \"change\", this.handleMediaQueryChange)\n\n this.events.listen(this, \"click\", e => {\n if (this.isNavToggle(e.target)) {\n this.handleToggleClick()\n }\n })\n this.events.listen(this, \"mouseover\", e => {\n if (this.isNavToggle(e.target)) {\n this.handleMouseEnter()\n }\n })\n this.events.listen(this, \"mouseout\", e => {\n if (this.isNavToggle(e.target)) {\n this.handleMouseLeave()\n }\n })\n }\n\n render() {\n const { navWidth, navState, navSlot, isDragging, direction } = this\n const adjustedNavWidth = navState === \"opened\" && this.wideScreen ? navWidth : NAV_DEFAULT_WIDTH\n const shouldRenderOwnNavToggle = navSlot.hasContent && !this.navToggle\n\n return html`\n <div\n class=${classMap({\n \"n-layout\": true,\n \"n-rtl\": direction.isRTL,\n \"n-dragging\": isDragging,\n })}\n style=${`--_n-layout-nav-width: ${adjustedNavWidth}px`}\n data-nav=${navSlot.hasContent ? navState : \"closed\"}\n data-screen=${this.wideScreen ? \"wide\" : \"narrow\"}\n >\n <div\n class=\"n-layout-nav\"\n ?hidden=${navSlot.isEmpty}\n @focusin=${this.handleNavFocus}\n @mouseenter=${this.handleMouseEnter}\n @mouseleave=${this.handleMouseLeave}\n @open=${this.handleDropdownOpen}\n @close=${this.handleDropdownClose}\n >\n <slot name=\"nav\"></slot>\n <div\n class=\"n-resize\"\n role=\"separator\"\n aria-orientation=\"vertical\"\n tabindex=\"0\"\n @pointerdown=${cond(navState === \"opened\", this.startDragging)}\n @pointermove=${cond(isDragging, this.handleDrag)}\n @pointerleave=${this.stopDragging}\n @pointerup=${this.stopDragging}\n @keydown=${this.handleKeyboardResize}\n ></div>\n </div>\n\n <div\n class=${classMap({ \"n-layout-main\": true, \"n-has-own-nav-toggle\": shouldRenderOwnNavToggle })}\n @focusin=${this.handleMainFocus}\n @click=${this.handleClick}\n >\n ${shouldRenderOwnNavToggle ? this.renderNavToggle() : nothing}\n <div class=${classMap({ \"n-has-drawer\": this.drawerSlot.hasContent })}>\n <slot name=\"header\"></slot>\n <main>\n <slot></slot>\n </main>\n </div>\n <aside ?hidden=${this.drawerSlot.isEmpty}>\n <slot name=\"drawer\"></slot>\n </aside>\n </div>\n </div>\n `\n }\n\n private renderNavToggle() {\n /* eslint-disable lit-a11y/mouse-events-have-key-events */\n return html`\n <div class=\"n-nav-toggle-container\">\n <slot\n name=\"nav-toggle\"\n @click=${this.handleToggleClick}\n @mouseover=${this.handleMouseEnter}\n @mouseout=${this.handleMouseLeave}\n >\n <nord-nav-toggle></nord-nav-toggle>\n </slot>\n </div>\n `\n /* eslint-enable lit-a11y/mouse-events-have-key-events */\n }\n\n @observe(\"navWidth\", \"updated\")\n protected handleNavWidthChange() {\n store.value = this.navWidth\n }\n\n @observe(\"navState\")\n protected handleNavStateChange(prev: NavState) {\n if (prev === \"wait\" && this.peekTimeoutId) {\n clearTimeout(this.peekTimeoutId)\n }\n if (prev === \"unpeek\") {\n this.navEl.removeEventListener(\"transitionend\", this.handleTransitionEnd)\n }\n\n switch (this.navState) {\n case \"closed\":\n this.navOpen = false\n break\n case \"opened\":\n this.navOpen = true\n break\n case \"wait\":\n this.peekTimeoutId = setTimeout(() => this.navTransition(\"timeout\"), NAV_PEEK_DELAY)\n break\n case \"unpeek\":\n this.navEl.addEventListener(\"transitionend\", this.handleTransitionEnd, { once: true })\n break\n default:\n break\n }\n }\n\n @observe(\"navOpen\", \"updated\")\n protected handleOpenChange() {\n if (!this.isDragging) {\n // when opening nav, it should restore to default width (or larger).\n // unless it is being dragged, in which case the drag width wins\n this.setNavWidth(Math.max(this.navWidth, NAV_DEFAULT_WIDTH))\n }\n\n this.navTransition(this.navOpen ? \"open\" : \"close\")\n }\n\n /* ---------------------------------------------\n / NAVIGATION OPEN/CLOSE LOGIC\n / --------------------------------------------- */\n\n private navTransition(event: NavEvent) {\n this.navState = navMachine.transition(this.navState, event)\n }\n\n private handleClick() {\n this.navTransition(\"click\")\n }\n\n private handleDropdownOpen(e: Event) {\n const target = e.target as Element\n\n if (target.localName === \"nord-dropdown\") {\n this.navTransition(\"dropdownOpen\")\n }\n }\n\n private handleDropdownClose(e: Event) {\n const target = e.target as Element\n\n if (target.localName === \"nord-dropdown\") {\n this.navTransition(\"dropdownClose\")\n }\n }\n\n private handleMediaQueryChange = () => {\n this.wideScreen = mediaQuery.matches\n this.navTransition(this.wideScreen ? \"open\" : \"close\")\n }\n\n private handleToggleClick = () => {\n this.navTransition(\"toggle\")\n }\n\n private handleNavFocus = () => {\n this.navTransition(\"focusin\")\n }\n\n private handleMainFocus = () => {\n this.navTransition(\"focusout\")\n }\n\n private handleMouseEnter = () => {\n if (this.wideScreen) {\n this.navTransition(\"pointerenter\")\n }\n }\n\n private handleMouseLeave = () => {\n this.navTransition(\"pointerleave\")\n }\n\n private handleTransitionEnd = () => {\n this.navTransition(\"transitionend\")\n }\n\n private isNavToggle(node: EventTarget | null) {\n return Boolean(this.navToggle) && isElement(node) && node.id === this.navToggle\n }\n\n /* ---------------------------------------------\n / RESIZE LOGIC\n / --------------------------------------------- */\n\n private handleKeyboardResize(e: KeyboardEvent) {\n const {\n navWidth,\n direction: { isLTR },\n } = this\n\n switch (e.key) {\n case \"ArrowLeft\":\n this.setNavWidth(navWidth + (isLTR ? -NAV_RESIZE_STEP : NAV_RESIZE_STEP))\n break\n case \"ArrowRight\":\n this.setNavWidth(navWidth + (isLTR ? NAV_RESIZE_STEP : -NAV_RESIZE_STEP))\n break\n case \"Enter\":\n this.navTransition(\"toggle\")\n break\n case \"Home\":\n this.setNavWidth(NAV_MIN_WIDTH)\n break\n case \"End\":\n this.setNavWidth(NAV_MAX_WIDTH)\n break\n default:\n return\n }\n\n e.preventDefault()\n }\n\n private setNavWidth(width: number) {\n this.navWidth = clamp(Math.round(width), NAV_MIN_WIDTH, NAV_MAX_WIDTH)\n }\n\n private startDragging(e: PointerEvent) {\n if (e.button === 0) {\n const target = e.target as Element\n target.setPointerCapture(e.pointerId)\n this.isDragging = true\n }\n }\n\n private stopDragging() {\n this.isDragging = false\n }\n\n private handleDrag(e: PointerEvent) {\n const width = this.direction.isRTL ? this.clientWidth - e.clientX : e.clientX\n\n this.setNavWidth(width)\n this.navTransition(width >= NAV_COLLAPSE_WIDTH ? \"open\" : \"close\")\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"nord-layout\": Layout\n }\n}\n","/**\n * Thin wrapper around local storage which simplifies (de)serialization and default values.\n * By default, (de)serializes as JSON.\n */\nexport function storage<T>(\n key: string,\n defaultValue: T,\n serialize: (value: T) => string = JSON.stringify,\n deserialize: (value: string) => T = JSON.parse\n) {\n return {\n get value(): T {\n try {\n const value = localStorage.getItem(key)\n return value ? deserialize(value) : defaultValue\n } catch {\n return defaultValue\n }\n },\n\n set value(value: T) {\n try {\n localStorage.setItem(key, serialize(value))\n } catch {\n // nothing we can do here\n }\n },\n }\n}\n"],"names":["mediaQuery","matchMedia","store","key","defaultValue","serialize","JSON","stringify","deserialize","parse","value","localStorage","getItem","_a","setItem","storage","navMachine","fsm","opened","toggle","close","closed","open","focusin","pointerenter","peek","focusout","pointerleave","dropdownOpen","click","blocked","dropdownClose","wait","timeout","unpeek","transitionend","Layout","LitElement","constructor","this","navSlot","SlotController","drawerSlot","direction","DirectionController","events","EventController","lightDismiss","LightDismissController","isOpen","navState","wideScreen","onDismiss","navTransition","isDismissible","node","navEl","navWidth","isDragging","matches","navOpen","padding","handleMediaQueryChange","handleToggleClick","handleNavFocus","handleMainFocus","handleMouseEnter","handleMouseLeave","handleTransitionEnd","connectedCallback","super","listen","e","isNavToggle","target","render","adjustedNavWidth","shouldRenderOwnNavToggle","hasContent","navToggle","html","classMap","isRTL","isEmpty","handleDropdownOpen","handleDropdownClose","cond","startDragging","handleDrag","stopDragging","handleKeyboardResize","handleClick","renderNavToggle","nothing","handleNavWidthChange","handleNavStateChange","prev","peekTimeoutId","clearTimeout","removeEventListener","setTimeout","addEventListener","once","handleOpenChange","setNavWidth","Math","max","event","transition","localName","Boolean","el","nodeType","Node","ELEMENT_NODE","id","isLTR","preventDefault","width","clamp","round","button","setPointerCapture","pointerId","clientWidth","clientX","styles","componentStyle","style","__decorate","query","prototype","state","property","reflect","type","attribute","observe","customElement"],"mappings":"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"}
1
+ {"version":3,"file":"Layout.js","sources":["../src/layout/Layout.ts","../src/common/storage.ts"],"sourcesContent":["/* eslint-disable lit-a11y/click-events-have-key-events */\nimport { LitElement, html, nothing } from \"lit\"\nimport { customElement, property, query, state } from \"lit/decorators.js\"\nimport { classMap } from \"lit/directives/class-map.js\"\nimport { DirectionController } from \"../common/controllers/DirectionController.js\"\nimport { EventController } from \"../common/controllers/EventController.js\"\nimport { LightDismissController } from \"../common/controllers/LightDismissController.js\"\nimport { SlotController } from \"../common/controllers/SlotController.js\"\nimport { observe } from \"../common/decorators/observe.js\"\nimport { cond } from \"../common/directives/cond.js\"\nimport { Events, fsm, States } from \"../common/fsm.js\"\nimport { clamp } from \"../common/number.js\"\nimport { storage } from \"../common/storage.js\"\n\nimport \"../nav-toggle/NavToggle.js\"\n\nimport componentStyle from \"../common/styles/Component.css\"\nimport style from \"./Layout.css\"\n\nconst NAV_DEFAULT_WIDTH = 250\nconst NAV_MIN_WIDTH = 220\nconst NAV_MAX_WIDTH = 400\nconst NAV_COLLAPSE_WIDTH = 100\nconst NAV_RESIZE_STEP = 30\nconst NAV_PEEK_DELAY = 300\n\nconst mediaQuery = matchMedia(\"(min-width: 768px)\")\nconst store = storage(\"nord-layout.navWidth\", NAV_DEFAULT_WIDTH)\n\nconst navMachine = fsm({\n opened: {\n toggle: \"closed\",\n close: \"closed\",\n },\n closed: {\n toggle: \"opened\",\n open: \"opened\",\n focusin: \"peek\",\n pointerenter: \"peek\",\n },\n peek: {\n toggle: \"opened\",\n focusout: \"unpeek\",\n pointerleave: \"wait\",\n dropdownOpen: \"blocked\",\n click: \"unpeek\",\n open: \"opened\",\n },\n blocked: {\n dropdownClose: \"peek\",\n open: \"opened\",\n },\n wait: {\n toggle: \"opened\",\n focusin: \"peek\",\n pointerenter: \"peek\",\n timeout: \"unpeek\",\n },\n unpeek: {\n toggle: \"opened\",\n focusin: \"peek\",\n pointerenter: \"peek\",\n transitionend: \"closed\",\n },\n})\n\ntype NavState = States<typeof navMachine>\ntype NavEvent = Events<typeof navMachine>\n\nfunction isElement(el: any): el is Element {\n return el != null && el.nodeType === Node.ELEMENT_NODE\n}\n\n/**\n * Layout component is used to create the main layout of an app. Layout\n * currently comes with one main configuration: two-column.\n *\n * @status ready\n * @category structure\n * @slot - The default main section content.\n * @slot nav - Used to place content inside the navigation sidebar.\n * @slot header - Used to place content inside the header section.\n * @slot drawer - Used to place additional content/details relating to a selected item.\n * @slot nav-toggle - Used to place a own nav-toggle component, for cases where you might need to add a tooltip.\n *\n * @cssprop [--n-layout-padding=var(--n-space-l)] - Controls the padding around the main layout area (the main slot), using our [spacing tokens](/tokens/#space).\n * @cssprop [--n-layout-drawer-inline-size=320px] - Controls the width of the drawer area, when used.\n * @cssprop [--n-layout-background-color=var(--n-color-background)] - Controls the background color of the layout, using [color tokens](/tokens/#color).\n */\n@customElement(\"nord-layout\")\nexport default class Layout extends LitElement {\n static styles = [componentStyle, style]\n\n private peekTimeoutId?: ReturnType<typeof setTimeout>\n\n private navSlot = new SlotController(this, \"nav\")\n private drawerSlot = new SlotController(this, \"drawer\")\n private direction = new DirectionController(this)\n private events = new EventController(this)\n private lightDismiss = new LightDismissController(this, {\n isOpen: () => this.navState === \"opened\" && !this.wideScreen,\n onDismiss: () => this.navTransition(\"close\"),\n isDismissible: node => node !== this.navEl,\n })\n\n @query(\".n-layout-nav\", true) private navEl!: HTMLDivElement\n\n @state() private navWidth = store.value\n @state() private isDragging = false\n @state() private navState: NavState = mediaQuery.matches ? \"opened\" : \"closed\"\n @state() private wideScreen = mediaQuery.matches\n\n /**\n * Controls whether the navigation is hidden off-screen or not.\n * Defaults to `true` for wide viewports, and `false` otherwise.\n */\n @property({ reflect: true, type: Boolean, attribute: \"nav-open\" }) navOpen: boolean = this.navState === \"opened\"\n\n /**\n * ID reference of element used to toggle the navigation.\n * This is deprecated, the layout component will now render its own nav toggle to simplify usage.\n * @deprecated\n */\n @property({ attribute: \"nav-toggle\" }) navToggle?: string\n\n /**\n * Controls the padding of the default main section slot. When set to “none”,\n * the nav and header slots will still have padding.\n */\n @property({ reflect: true }) padding: \"m\" | \"none\" = \"m\"\n\n connectedCallback(): void {\n super.connectedCallback()\n\n this.events.listen(mediaQuery, \"change\", this.handleMediaQueryChange)\n\n this.events.listen(this, \"click\", e => {\n if (this.isNavToggle(e.target)) {\n this.handleToggleClick()\n }\n })\n this.events.listen(this, \"mouseover\", e => {\n if (this.isNavToggle(e.target)) {\n this.handleMouseEnter()\n }\n })\n this.events.listen(this, \"mouseout\", e => {\n if (this.isNavToggle(e.target)) {\n this.handleMouseLeave()\n }\n })\n }\n\n render() {\n const { navWidth, navState, navSlot, isDragging, direction } = this\n const adjustedNavWidth = navState === \"opened\" && this.wideScreen ? navWidth : NAV_DEFAULT_WIDTH\n const shouldRenderOwnNavToggle = navSlot.hasContent && !this.navToggle\n\n return html`\n <div\n class=${classMap({\n \"n-layout\": true,\n \"n-rtl\": direction.isRTL,\n \"n-dragging\": isDragging,\n })}\n style=${`--_n-layout-nav-width: ${adjustedNavWidth}px`}\n data-nav=${navSlot.hasContent ? navState : \"closed\"}\n data-screen=${this.wideScreen ? \"wide\" : \"narrow\"}\n >\n <div\n class=\"n-layout-nav\"\n ?hidden=${navSlot.isEmpty}\n @focusin=${this.handleNavFocus}\n @mouseenter=${this.handleMouseEnter}\n @mouseleave=${this.handleMouseLeave}\n @open=${this.handleDropdownOpen}\n @close=${this.handleDropdownClose}\n >\n <slot name=\"nav\"></slot>\n <div\n class=\"n-resize\"\n role=\"separator\"\n aria-orientation=\"vertical\"\n tabindex=\"0\"\n @pointerdown=${cond(navState === \"opened\", this.startDragging)}\n @pointermove=${cond(isDragging, this.handleDrag)}\n @pointerleave=${this.stopDragging}\n @pointerup=${this.stopDragging}\n @keydown=${this.handleKeyboardResize}\n ></div>\n </div>\n\n <div\n class=${classMap({ \"n-layout-main\": true, \"n-has-own-nav-toggle\": shouldRenderOwnNavToggle })}\n @focusin=${this.handleMainFocus}\n @click=${this.handleClick}\n >\n ${shouldRenderOwnNavToggle ? this.renderNavToggle() : nothing}\n <div class=${classMap({ \"n-has-drawer\": this.drawerSlot.hasContent })}>\n <slot name=\"header\"></slot>\n <main>\n <slot></slot>\n </main>\n </div>\n <aside ?hidden=${this.drawerSlot.isEmpty}>\n <slot name=\"drawer\"></slot>\n </aside>\n </div>\n </div>\n `\n }\n\n private renderNavToggle() {\n /* eslint-disable lit-a11y/mouse-events-have-key-events */\n return html`\n <div class=\"n-nav-toggle-container\">\n <slot\n name=\"nav-toggle\"\n @click=${this.handleToggleClick}\n @mouseover=${this.handleMouseEnter}\n @mouseout=${this.handleMouseLeave}\n >\n <nord-nav-toggle></nord-nav-toggle>\n </slot>\n </div>\n `\n /* eslint-enable lit-a11y/mouse-events-have-key-events */\n }\n\n @observe(\"navWidth\", \"updated\")\n protected handleNavWidthChange() {\n store.value = this.navWidth\n }\n\n @observe(\"navState\")\n protected handleNavStateChange(prev: NavState) {\n if (prev === \"wait\" && this.peekTimeoutId) {\n clearTimeout(this.peekTimeoutId)\n }\n if (prev === \"unpeek\") {\n this.navEl.removeEventListener(\"transitionend\", this.handleTransitionEnd)\n }\n\n switch (this.navState) {\n case \"closed\":\n this.navOpen = false\n break\n case \"opened\":\n this.navOpen = true\n break\n case \"wait\":\n this.peekTimeoutId = setTimeout(() => this.navTransition(\"timeout\"), NAV_PEEK_DELAY)\n break\n case \"unpeek\":\n this.navEl.addEventListener(\"transitionend\", this.handleTransitionEnd, { once: true })\n break\n default:\n break\n }\n }\n\n @observe(\"navOpen\", \"updated\")\n protected handleOpenChange() {\n if (!this.isDragging) {\n // when opening nav, it should restore to default width (or larger).\n // unless it is being dragged, in which case the drag width wins\n this.setNavWidth(Math.max(this.navWidth, NAV_DEFAULT_WIDTH))\n }\n\n this.navTransition(this.navOpen ? \"open\" : \"close\")\n }\n\n /* ---------------------------------------------\n / NAVIGATION OPEN/CLOSE LOGIC\n / --------------------------------------------- */\n\n private navTransition(event: NavEvent) {\n this.navState = navMachine.transition(this.navState, event)\n }\n\n private handleClick() {\n this.navTransition(\"click\")\n }\n\n private handleDropdownOpen(e: Event) {\n const target = e.target as Element\n\n if (target.localName === \"nord-dropdown\") {\n this.navTransition(\"dropdownOpen\")\n }\n }\n\n private handleDropdownClose(e: Event) {\n const target = e.target as Element\n\n if (target.localName === \"nord-dropdown\") {\n this.navTransition(\"dropdownClose\")\n }\n }\n\n private handleMediaQueryChange = () => {\n this.wideScreen = mediaQuery.matches\n this.navTransition(this.wideScreen ? \"open\" : \"close\")\n }\n\n private handleToggleClick = () => {\n this.navTransition(\"toggle\")\n }\n\n private handleNavFocus = () => {\n this.navTransition(\"focusin\")\n }\n\n private handleMainFocus = () => {\n this.navTransition(\"focusout\")\n }\n\n private handleMouseEnter = () => {\n if (this.wideScreen) {\n this.navTransition(\"pointerenter\")\n }\n }\n\n private handleMouseLeave = () => {\n this.navTransition(\"pointerleave\")\n }\n\n private handleTransitionEnd = () => {\n this.navTransition(\"transitionend\")\n }\n\n private isNavToggle(node: EventTarget | null) {\n return Boolean(this.navToggle) && isElement(node) && node.id === this.navToggle\n }\n\n /* ---------------------------------------------\n / RESIZE LOGIC\n / --------------------------------------------- */\n\n private handleKeyboardResize(e: KeyboardEvent) {\n const {\n navWidth,\n direction: { isLTR },\n } = this\n\n switch (e.key) {\n case \"ArrowLeft\":\n this.setNavWidth(navWidth + (isLTR ? -NAV_RESIZE_STEP : NAV_RESIZE_STEP))\n break\n case \"ArrowRight\":\n this.setNavWidth(navWidth + (isLTR ? NAV_RESIZE_STEP : -NAV_RESIZE_STEP))\n break\n case \"Enter\":\n this.navTransition(\"toggle\")\n break\n case \"Home\":\n this.setNavWidth(NAV_MIN_WIDTH)\n break\n case \"End\":\n this.setNavWidth(NAV_MAX_WIDTH)\n break\n default:\n return\n }\n\n e.preventDefault()\n }\n\n private setNavWidth(width: number) {\n this.navWidth = clamp(Math.round(width), NAV_MIN_WIDTH, NAV_MAX_WIDTH)\n }\n\n private startDragging(e: PointerEvent) {\n if (e.button === 0) {\n const target = e.target as Element\n target.setPointerCapture(e.pointerId)\n this.isDragging = true\n }\n }\n\n private stopDragging() {\n this.isDragging = false\n }\n\n private handleDrag(e: PointerEvent) {\n const width = this.direction.isRTL ? this.clientWidth - e.clientX : e.clientX\n\n this.setNavWidth(width)\n this.navTransition(width >= NAV_COLLAPSE_WIDTH ? \"open\" : \"close\")\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"nord-layout\": Layout\n }\n}\n","/**\n * Thin wrapper around local storage which simplifies (de)serialization and default values.\n * By default, (de)serializes as JSON.\n */\nexport function storage<T>(\n key: string,\n defaultValue: T,\n serialize: (value: T) => string = JSON.stringify,\n deserialize: (value: string) => T = JSON.parse\n) {\n return {\n get value(): T {\n try {\n const value = localStorage.getItem(key)\n return value ? deserialize(value) : defaultValue\n } catch {\n return defaultValue\n }\n },\n\n set value(value: T) {\n try {\n localStorage.setItem(key, serialize(value))\n } catch {\n // nothing we can do here\n }\n },\n }\n}\n"],"names":["mediaQuery","matchMedia","store","key","defaultValue","serialize","JSON","stringify","deserialize","parse","value","localStorage","getItem","_a","setItem","storage","navMachine","fsm","opened","toggle","close","closed","open","focusin","pointerenter","peek","focusout","pointerleave","dropdownOpen","click","blocked","dropdownClose","wait","timeout","unpeek","transitionend","Layout","LitElement","constructor","this","navSlot","SlotController","drawerSlot","direction","DirectionController","events","EventController","lightDismiss","LightDismissController","isOpen","navState","wideScreen","onDismiss","navTransition","isDismissible","node","navEl","navWidth","isDragging","matches","navOpen","padding","handleMediaQueryChange","handleToggleClick","handleNavFocus","handleMainFocus","handleMouseEnter","handleMouseLeave","handleTransitionEnd","connectedCallback","super","listen","e","isNavToggle","target","render","adjustedNavWidth","shouldRenderOwnNavToggle","hasContent","navToggle","html","classMap","isRTL","isEmpty","handleDropdownOpen","handleDropdownClose","cond","startDragging","handleDrag","stopDragging","handleKeyboardResize","handleClick","renderNavToggle","nothing","handleNavWidthChange","handleNavStateChange","prev","peekTimeoutId","clearTimeout","removeEventListener","setTimeout","addEventListener","once","handleOpenChange","setNavWidth","Math","max","event","transition","localName","Boolean","el","nodeType","Node","ELEMENT_NODE","id","isLTR","preventDefault","width","clamp","round","button","setPointerCapture","pointerId","clientWidth","clientX","styles","componentStyle","style","__decorate","query","prototype","state","property","reflect","type","attribute","observe","customElement"],"mappings":"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"}