@kyndryl-design-system/shidoka-applications 1.3.1 → 1.3.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/README.md CHANGED
@@ -89,3 +89,22 @@ Some options for React wrapper libraries:
89
89
  When using with an SSR framework like Next.js, you will encounter errors with code that only runs client-side, like `window` references for example. This is because web components cannot render on the server. Here is an article that provides some methods to work around this: [Using Non-SSR Friendly Components with Next.js](https://blog.bitsrc.io/using-non-ssr-friendly-components-with-next-js-916f38e8992c) and [How to entirely disable server-side rendering in next.js v13?](https://stackoverflow.com/questions/75406728/how-to-entirely-disable-server-side-rendering-in-next-js-v13). Basically, they need their rendering deferred to only happen on the client-side.
90
90
 
91
91
  Here is some additional information about why SSR does not work for web components, and some potential polyfills/solutions to enable server rendering: https://lit.dev/docs/ssr/overview/
92
+
93
+ ### Handling `Failed to execute 'define' on 'CustomElementRegistry'`
94
+
95
+ #### The Problem
96
+
97
+ This is a common bundling issue that can appear when you incorporate a component that has already bundled Shidoka components. Typically this would be caused by having a middle layer, for example a Common UI layer that has a cross-platform Header component built using Shidoka components.
98
+
99
+ #### Avoiding This
100
+
101
+ You can get around this in by not declaring Shidoka components as dependencies, and instead declaring them as external or peer dependencies in the middle/common layer.
102
+
103
+ For example, from the shidoka-applications rollup.js config using [the external option](https://rollupjs.org/configuration-options/#external): `external: [/shidoka-foundation\/components/]`. Since shidoka-foundation components are used within shidoka-applications components, this prevents the foundation components from being bundled, meaning it leaves the import statements unaltered (ex: `import '@kyndryl-design-system/...'`). This way, the application bundler can handle it instead.
104
+
105
+ This works with bundling from node_modules, but not with CDN hosted files since the deployed application wouldn't know how to resolve aliased node_modules imports like: `import '@kyndryl-design-system/...'`. In this case you probably need a workaround.
106
+
107
+ #### Workaround
108
+
109
+ If for some reason the above suggestion does not help, there is a library containing a script/polyfill that can be used which allows custom elements to be redefined:
110
+ https://github.com/caridy/redefine-custom-elements.
@@ -29,22 +29,17 @@ export declare class HeaderLink extends LitElement {
29
29
  * @ignore
30
30
  */
31
31
  breakpointHit: boolean;
32
- /**
33
- * Evaluates to true if level 2 links are slotted inside to generate a flyout menu.
34
- * @ignore
35
- */
36
- isSlotted: boolean;
37
32
  /**
38
33
  * Queries any slotted HTML elements.
39
34
  * @ignore
40
35
  */
41
36
  slottedElements: Array<HTMLElement>;
42
37
  render(): import("lit-html").TemplateResult<1>;
38
+ private _handleLinksSlotChange;
43
39
  private handlePointerEnter;
44
40
  private handlePointerLeave;
45
41
  private handleClick;
46
42
  private handleClickOut;
47
- private determineIfSlotted;
48
43
  private determineLevel;
49
44
  firstUpdated(): void;
50
45
  connectedCallback(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"headerLink.d.ts","sourceRoot":"","sources":["../../../../src/components/global/header/headerLink.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAQ,MAAM,KAAK,CAAC;AAWvC,OAAO,2DAA2D,CAAC;AAGnE;;;;;GAKG;AACH,qBACa,UAAW,SAAQ,UAAU;IACxC,OAAgB,MAAM,+BAAkB;IAExC,uBAAuB;IAEvB,IAAI,UAAS;IAEb,gBAAgB;IAEhB,IAAI,SAAM;IAEV,oIAAoI;IAEpI,MAAM,UAAoB;IAE1B,oIAAoI;IAEpI,GAAG,SAAM;IAET,sEAAsE;IAEtE,QAAQ,UAAS;IAEjB;;OAEG;IAEH,KAAK,SAAK;IAEV,mDAAmD;IAEnD,OAAO,UAAS;IAEhB;;;OAGG;IAEH,aAAa,UAAS;IAEtB;;;OAGG;IAEH,SAAS,UAAS;IAElB;;;OAGG;IAEH,eAAe,EAAG,KAAK,CAAC,WAAW,CAAC,CAAC;IAE5B,MAAM;IA8Cf,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,WAAW;IAenB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,cAAc;IASb,YAAY;IAKZ,iBAAiB;IAcjB,oBAAoB;IAa7B,OAAO,CAAC,cAAc;CAMvB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,qBAAqB,EAAE,UAAU,CAAC;KACnC;CACF"}
1
+ {"version":3,"file":"headerLink.d.ts","sourceRoot":"","sources":["../../../../src/components/global/header/headerLink.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAQ,MAAM,KAAK,CAAC;AAWvC,OAAO,2DAA2D,CAAC;AAGnE;;;;;GAKG;AACH,qBACa,UAAW,SAAQ,UAAU;IACxC,OAAgB,MAAM,+BAAkB;IAExC,uBAAuB;IAEvB,IAAI,UAAS;IAEb,gBAAgB;IAEhB,IAAI,SAAM;IAEV,oIAAoI;IAEpI,MAAM,UAAoB;IAE1B,oIAAoI;IAEpI,GAAG,SAAM;IAET,sEAAsE;IAEtE,QAAQ,UAAS;IAEjB;;OAEG;IAEH,KAAK,SAAK;IAEV,mDAAmD;IAEnD,OAAO,UAAS;IAEhB;;;OAGG;IAEH,aAAa,UAAS;IAEtB;;;OAGG;IAEH,eAAe,EAAG,KAAK,CAAC,WAAW,CAAC,CAAC;IAE5B,MAAM;IAkDf,OAAO,CAAC,sBAAsB;IAK9B,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,WAAW;IAenB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,cAAc;IASb,YAAY;IAIZ,iBAAiB;IAcjB,oBAAoB;IAa7B,OAAO,CAAC,cAAc;CAMvB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,qBAAqB,EAAE,UAAU,CAAC;KACnC;CACF"}
@@ -1,4 +1,4 @@
1
- import{__decorate as e}from"../../../_virtual/_tslib.js";import'./../../../external/@lit/reactive-element/reactive-element.js';import{html as t}from'./../../../external/lit-html/lit-html.js';import{LitElement as i}from'./../../../external/lit-element/lit-element.js';import{customElement as o}from'./../../../external/@lit/reactive-element/decorators/custom-element.js';import{property as s}from'./../../../external/@lit/reactive-element/decorators/property.js';import{state as n}from'./../../../external/@lit/reactive-element/decorators/state.js';import{queryAssignedElements as l}from'./../../../external/@lit/reactive-element/decorators/query-assigned-elements.js';import{classMap as r}from'./../../../external/lit-html/directives/class-map.js';import{querySelectorDeep as d}from'./../../../external/query-selector-shadow-dom/src/querySelectorDeep.js';import{debounce as a}from"../../../common/helpers/helpers.js";import p from"./headerLink.scss.js";import"@kyndryl-design-system/shidoka-foundation/components/icon";import h from'./../../../external/@carbon/icons/es/caret--down/16.js';let m=class extends i{constructor(){super(...arguments),this.open=!1,this.href="",this.target="_self",this.rel="",this.isActive=!1,this.level=1,this.divider=!1,this.breakpointHit=!1,this.isSlotted=!1}render(){const e={menu:this.isSlotted,"breakpoint-hit":this.breakpointHit,divider:this.divider,open:this.open},i={"nav-link":!0,active:this.isActive,"level--1":1==this.level,"level--2":2==this.level,interactive:1==this.level&&this.breakpointHit},o={menu__content:this.breakpointHit,static:!this.breakpointHit,slotted:this.slottedElements.length};return t`
1
+ import{__decorate as e}from"../../../_virtual/_tslib.js";import'./../../../external/@lit/reactive-element/reactive-element.js';import{html as t}from'./../../../external/lit-html/lit-html.js';import{LitElement as i}from'./../../../external/lit-element/lit-element.js';import{customElement as o}from'./../../../external/@lit/reactive-element/decorators/custom-element.js';import{property as s}from'./../../../external/@lit/reactive-element/decorators/property.js';import{state as n}from'./../../../external/@lit/reactive-element/decorators/state.js';import{queryAssignedElements as l}from'./../../../external/@lit/reactive-element/decorators/query-assigned-elements.js';import{classMap as r}from'./../../../external/lit-html/directives/class-map.js';import{querySelectorDeep as d}from'./../../../external/query-selector-shadow-dom/src/querySelectorDeep.js';import{debounce as a}from"../../../common/helpers/helpers.js";import p from"./headerLink.scss.js";import"@kyndryl-design-system/shidoka-foundation/components/icon";import h from'./../../../external/@carbon/icons/es/caret--down/16.js';let m=class extends i{constructor(){super(...arguments),this.open=!1,this.href="",this.target="_self",this.rel="",this.isActive=!1,this.level=1,this.divider=!1,this.breakpointHit=!1}render(){const e={menu:this.slottedElements.length,"breakpoint-hit":this.breakpointHit,divider:this.divider,open:this.open},i={"nav-link":!0,active:this.isActive,"level--1":1==this.level,"level--2":2==this.level,interactive:1==this.level&&this.breakpointHit},o={menu__content:this.breakpointHit,static:!this.breakpointHit,slotted:this.slottedElements.length};return t`
2
2
  <div
3
3
  class="${r(e)}"
4
4
  @pointerleave=${e=>this.handlePointerLeave(e)}
@@ -15,7 +15,11 @@ import{__decorate as e}from"../../../_virtual/_tslib.js";import'./../../../exter
15
15
 
16
16
  ${this.slottedElements.length&&this.breakpointHit?t` <kd-icon .icon=${h}></kd-icon> `:null}
17
17
  </a>
18
- <slot name="links" class=${r(o)}></slot>
18
+ <slot
19
+ name="links"
20
+ class=${r(o)}
21
+ @slotchange=${this._handleLinksSlotChange}
22
+ ></slot>
19
23
  </div>
20
- `}handlePointerEnter(e){"mouse"===e.pointerType&&(this.open=!0)}handlePointerLeave(e){"mouse"===e.pointerType&&(this.open=!1)}handleClick(e){let t=!1;this.slottedElements.length&&(t=!0,e.preventDefault(),this.open=!this.open);const i=new CustomEvent("on-click",{detail:{origEvent:e,defaultPrevented:t}});this.dispatchEvent(i)}handleClickOut(e){e.composedPath().includes(this)||(this.open=!1)}determineIfSlotted(){this.isSlotted=!!this.slottedElements.length}determineLevel(){const e=this.shadowRoot.host.parentNode.nodeName;this.level="KYN-HEADER-NAV"==e?1:2}firstUpdated(){this.determineIfSlotted(),this.determineLevel()}connectedCallback(){super.connectedCallback(),document.addEventListener("click",(e=>this.handleClickOut(e))),this.testBreakpoint(),null===window||void 0===window||window.addEventListener("resize",a((()=>{this.testBreakpoint()})))}disconnectedCallback(){document.removeEventListener("click",(e=>this.handleClickOut(e))),null===window||void 0===window||window.removeEventListener("resize",a((()=>{this.testBreakpoint()}))),super.disconnectedCallback()}testBreakpoint(){const e=d("kyn-header");e&&(this.breakpointHit=e.breakpointHit)}};m.styles=p,e([s({type:Boolean})],m.prototype,"open",void 0),e([s({type:String})],m.prototype,"href",void 0),e([s({type:String})],m.prototype,"target",void 0),e([s({type:String})],m.prototype,"rel",void 0),e([s({type:Boolean})],m.prototype,"isActive",void 0),e([n()],m.prototype,"level",void 0),e([s({type:Boolean})],m.prototype,"divider",void 0),e([n()],m.prototype,"breakpointHit",void 0),e([n()],m.prototype,"isSlotted",void 0),e([l({slot:"links"})],m.prototype,"slottedElements",void 0),m=e([o("kyn-header-link")],m);export{m as HeaderLink};
24
+ `}_handleLinksSlotChange(){this.determineLevel(),this.requestUpdate()}handlePointerEnter(e){"mouse"===e.pointerType&&(this.open=!0)}handlePointerLeave(e){"mouse"===e.pointerType&&(this.open=!1)}handleClick(e){let t=!1;this.slottedElements.length&&(t=!0,e.preventDefault(),this.open=!this.open);const i=new CustomEvent("on-click",{detail:{origEvent:e,defaultPrevented:t}});this.dispatchEvent(i)}handleClickOut(e){e.composedPath().includes(this)||(this.open=!1)}determineLevel(){const e=this.shadowRoot.host.parentNode.nodeName;this.level="KYN-HEADER-NAV"==e?1:2}firstUpdated(){this.determineLevel()}connectedCallback(){super.connectedCallback(),document.addEventListener("click",(e=>this.handleClickOut(e))),this.testBreakpoint(),null===window||void 0===window||window.addEventListener("resize",a((()=>{this.testBreakpoint()})))}disconnectedCallback(){document.removeEventListener("click",(e=>this.handleClickOut(e))),null===window||void 0===window||window.removeEventListener("resize",a((()=>{this.testBreakpoint()}))),super.disconnectedCallback()}testBreakpoint(){const e=d("kyn-header");e&&(this.breakpointHit=e.breakpointHit)}};m.styles=p,e([s({type:Boolean})],m.prototype,"open",void 0),e([s({type:String})],m.prototype,"href",void 0),e([s({type:String})],m.prototype,"target",void 0),e([s({type:String})],m.prototype,"rel",void 0),e([s({type:Boolean})],m.prototype,"isActive",void 0),e([n()],m.prototype,"level",void 0),e([s({type:Boolean})],m.prototype,"divider",void 0),e([n()],m.prototype,"breakpointHit",void 0),e([l({slot:"links"})],m.prototype,"slottedElements",void 0),m=e([o("kyn-header-link")],m);export{m as HeaderLink};
21
25
  //# sourceMappingURL=headerLink.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"headerLink.js","sources":["../../../../src/components/global/header/headerLink.ts"],"sourcesContent":["import { LitElement, html } from 'lit';\nimport {\n customElement,\n property,\n state,\n queryAssignedElements,\n} from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { querySelectorDeep } from 'query-selector-shadow-dom';\nimport { debounce } from '../../../common/helpers/helpers';\nimport HeaderLinkScss from './headerLink.scss';\nimport '@kyndryl-design-system/shidoka-foundation/components/icon';\nimport downIcon from '@carbon/icons/es/caret--down/16';\n\n/**\n * Component for navigation links within the Header.\n * @fires on-click - Captures the click event and emits the original event details.\n * @slot unnamed - Slot for link text/content.\n * @slot links - Slot for sublinks (up to two levels).\n */\n@customElement('kyn-header-link')\nexport class HeaderLink extends LitElement {\n static override styles = HeaderLinkScss;\n\n /** Link open state. */\n @property({ type: Boolean })\n open = false;\n\n /** Link url. */\n @property({ type: String })\n href = '';\n\n /** Defines a target attribute for where to load the URL. Possible options include \"_self\" (default), \"_blank\", \"_parent\", \"_top\" */\n @property({ type: String })\n target = '_self' as const;\n\n /** Defines a relationship between a linked resource and the document. An empty string (default) means no particular relationship */\n @property({ type: String })\n rel = '';\n\n /** Link active state, for example when URL path matches link href. */\n @property({ type: Boolean })\n isActive = false;\n\n /** Link level, supports two levels.\n * @ignore\n */\n @state()\n level = 1;\n\n /** Adds a 1px shadow to the bottom of the link. */\n @property({ type: Boolean })\n divider = false;\n\n /**\n * Determines if menu should be a flyout or inline depending on screen size.\n * @ignore\n */\n @state()\n breakpointHit = false;\n\n /**\n * Evaluates to true if level 2 links are slotted inside to generate a flyout menu.\n * @ignore\n */\n @state()\n isSlotted = false;\n\n /**\n * Queries any slotted HTML elements.\n * @ignore\n */\n @queryAssignedElements({ slot: 'links' })\n slottedElements!: Array<HTMLElement>;\n\n override render() {\n const classes = {\n menu: this.isSlotted,\n 'breakpoint-hit': this.breakpointHit,\n divider: this.divider,\n open: this.open,\n };\n\n const linkClasses = {\n 'nav-link': true,\n active: this.isActive,\n 'level--1': this.level == 1,\n 'level--2': this.level == 2,\n interactive: this.level == 1 && this.breakpointHit,\n };\n\n const slotClasses = {\n menu__content: this.breakpointHit,\n static: !this.breakpointHit,\n slotted: this.slottedElements.length,\n };\n\n return html`\n <div\n class=\"${classMap(classes)}\"\n @pointerleave=${(e: PointerEvent) => this.handlePointerLeave(e)}\n >\n <a\n target=${this.target}\n rel=${this.rel}\n href=${this.href}\n class=${classMap(linkClasses)}\n @click=${(e: Event) => this.handleClick(e)}\n @pointerenter=${(e: PointerEvent) => this.handlePointerEnter(e)}\n >\n <slot></slot>\n\n ${this.slottedElements.length && this.breakpointHit\n ? html` <kd-icon .icon=${downIcon}></kd-icon> `\n : null}\n </a>\n <slot name=\"links\" class=${classMap(slotClasses)}></slot>\n </div>\n `;\n }\n\n private handlePointerEnter(e: PointerEvent) {\n if (e.pointerType === 'mouse') {\n this.open = true;\n }\n }\n\n private handlePointerLeave(e: PointerEvent) {\n if (e.pointerType === 'mouse') {\n this.open = false;\n }\n }\n\n private handleClick(e: Event) {\n let preventDefault = false;\n\n if (this.slottedElements.length) {\n preventDefault = true;\n e.preventDefault();\n this.open = !this.open;\n }\n\n const event = new CustomEvent('on-click', {\n detail: { origEvent: e, defaultPrevented: preventDefault },\n });\n this.dispatchEvent(event);\n }\n\n private handleClickOut(e: Event) {\n if (!e.composedPath().includes(this)) {\n this.open = false;\n }\n }\n\n private determineIfSlotted() {\n this.isSlotted = this.slottedElements.length ? true : false;\n }\n\n private determineLevel() {\n const parentTagName = this.shadowRoot!.host.parentNode!.nodeName;\n if (parentTagName == 'KYN-HEADER-NAV') {\n this.level = 1;\n } else {\n this.level = 2;\n }\n }\n\n override firstUpdated() {\n this.determineIfSlotted();\n this.determineLevel();\n }\n\n override connectedCallback() {\n super.connectedCallback();\n\n document.addEventListener('click', (e) => this.handleClickOut(e));\n\n this.testBreakpoint();\n window?.addEventListener(\n 'resize',\n debounce(() => {\n this.testBreakpoint();\n })\n );\n }\n\n override disconnectedCallback() {\n document.removeEventListener('click', (e) => this.handleClickOut(e));\n\n window?.removeEventListener(\n 'resize',\n debounce(() => {\n this.testBreakpoint();\n })\n );\n\n super.disconnectedCallback();\n }\n\n private testBreakpoint() {\n const nav = querySelectorDeep('kyn-header');\n if (nav) {\n this.breakpointHit = nav!.breakpointHit;\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kyn-header-nav-link': HeaderLink;\n }\n}\n"],"names":["HeaderLink","LitElement","constructor","this","open","href","target","rel","isActive","level","divider","breakpointHit","isSlotted","render","classes","menu","linkClasses","active","interactive","slotClasses","menu__content","static","slotted","slottedElements","length","html","classMap","e","handlePointerLeave","handleClick","handlePointerEnter","downIcon","pointerType","preventDefault","event","CustomEvent","detail","origEvent","defaultPrevented","dispatchEvent","handleClickOut","composedPath","includes","determineIfSlotted","determineLevel","parentTagName","shadowRoot","host","parentNode","nodeName","firstUpdated","connectedCallback","super","document","addEventListener","testBreakpoint","window","debounce","disconnectedCallback","removeEventListener","nav","querySelectorDeep","styles","HeaderLinkScss","__decorate","property","type","Boolean","prototype","String","state","queryAssignedElements","slot","customElement"],"mappings":"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"}
1
+ {"version":3,"file":"headerLink.js","sources":["../../../../src/components/global/header/headerLink.ts"],"sourcesContent":["import { LitElement, html } from 'lit';\nimport {\n customElement,\n property,\n state,\n queryAssignedElements,\n} from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { querySelectorDeep } from 'query-selector-shadow-dom';\nimport { debounce } from '../../../common/helpers/helpers';\nimport HeaderLinkScss from './headerLink.scss';\nimport '@kyndryl-design-system/shidoka-foundation/components/icon';\nimport downIcon from '@carbon/icons/es/caret--down/16';\n\n/**\n * Component for navigation links within the Header.\n * @fires on-click - Captures the click event and emits the original event details.\n * @slot unnamed - Slot for link text/content.\n * @slot links - Slot for sublinks (up to two levels).\n */\n@customElement('kyn-header-link')\nexport class HeaderLink extends LitElement {\n static override styles = HeaderLinkScss;\n\n /** Link open state. */\n @property({ type: Boolean })\n open = false;\n\n /** Link url. */\n @property({ type: String })\n href = '';\n\n /** Defines a target attribute for where to load the URL. Possible options include \"_self\" (default), \"_blank\", \"_parent\", \"_top\" */\n @property({ type: String })\n target = '_self' as const;\n\n /** Defines a relationship between a linked resource and the document. An empty string (default) means no particular relationship */\n @property({ type: String })\n rel = '';\n\n /** Link active state, for example when URL path matches link href. */\n @property({ type: Boolean })\n isActive = false;\n\n /** Link level, supports two levels.\n * @ignore\n */\n @state()\n level = 1;\n\n /** Adds a 1px shadow to the bottom of the link. */\n @property({ type: Boolean })\n divider = false;\n\n /**\n * Determines if menu should be a flyout or inline depending on screen size.\n * @ignore\n */\n @state()\n breakpointHit = false;\n\n /**\n * Queries any slotted HTML elements.\n * @ignore\n */\n @queryAssignedElements({ slot: 'links' })\n slottedElements!: Array<HTMLElement>;\n\n override render() {\n const classes = {\n menu: this.slottedElements.length,\n 'breakpoint-hit': this.breakpointHit,\n divider: this.divider,\n open: this.open,\n };\n\n const linkClasses = {\n 'nav-link': true,\n active: this.isActive,\n 'level--1': this.level == 1,\n 'level--2': this.level == 2,\n interactive: this.level == 1 && this.breakpointHit,\n };\n\n const slotClasses = {\n menu__content: this.breakpointHit,\n static: !this.breakpointHit,\n slotted: this.slottedElements.length,\n };\n\n return html`\n <div\n class=\"${classMap(classes)}\"\n @pointerleave=${(e: PointerEvent) => this.handlePointerLeave(e)}\n >\n <a\n target=${this.target}\n rel=${this.rel}\n href=${this.href}\n class=${classMap(linkClasses)}\n @click=${(e: Event) => this.handleClick(e)}\n @pointerenter=${(e: PointerEvent) => this.handlePointerEnter(e)}\n >\n <slot></slot>\n\n ${this.slottedElements.length && this.breakpointHit\n ? html` <kd-icon .icon=${downIcon}></kd-icon> `\n : null}\n </a>\n <slot\n name=\"links\"\n class=${classMap(slotClasses)}\n @slotchange=${this._handleLinksSlotChange}\n ></slot>\n </div>\n `;\n }\n\n private _handleLinksSlotChange() {\n this.determineLevel();\n this.requestUpdate();\n }\n\n private handlePointerEnter(e: PointerEvent) {\n if (e.pointerType === 'mouse') {\n this.open = true;\n }\n }\n\n private handlePointerLeave(e: PointerEvent) {\n if (e.pointerType === 'mouse') {\n this.open = false;\n }\n }\n\n private handleClick(e: Event) {\n let preventDefault = false;\n\n if (this.slottedElements.length) {\n preventDefault = true;\n e.preventDefault();\n this.open = !this.open;\n }\n\n const event = new CustomEvent('on-click', {\n detail: { origEvent: e, defaultPrevented: preventDefault },\n });\n this.dispatchEvent(event);\n }\n\n private handleClickOut(e: Event) {\n if (!e.composedPath().includes(this)) {\n this.open = false;\n }\n }\n\n private determineLevel() {\n const parentTagName = this.shadowRoot!.host.parentNode!.nodeName;\n if (parentTagName == 'KYN-HEADER-NAV') {\n this.level = 1;\n } else {\n this.level = 2;\n }\n }\n\n override firstUpdated() {\n this.determineLevel();\n }\n\n override connectedCallback() {\n super.connectedCallback();\n\n document.addEventListener('click', (e) => this.handleClickOut(e));\n\n this.testBreakpoint();\n window?.addEventListener(\n 'resize',\n debounce(() => {\n this.testBreakpoint();\n })\n );\n }\n\n override disconnectedCallback() {\n document.removeEventListener('click', (e) => this.handleClickOut(e));\n\n window?.removeEventListener(\n 'resize',\n debounce(() => {\n this.testBreakpoint();\n })\n );\n\n super.disconnectedCallback();\n }\n\n private testBreakpoint() {\n const nav = querySelectorDeep('kyn-header');\n if (nav) {\n this.breakpointHit = nav!.breakpointHit;\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kyn-header-nav-link': HeaderLink;\n }\n}\n"],"names":["HeaderLink","LitElement","constructor","this","open","href","target","rel","isActive","level","divider","breakpointHit","render","classes","menu","slottedElements","length","linkClasses","active","interactive","slotClasses","menu__content","static","slotted","html","classMap","e","handlePointerLeave","handleClick","handlePointerEnter","downIcon","_handleLinksSlotChange","determineLevel","requestUpdate","pointerType","preventDefault","event","CustomEvent","detail","origEvent","defaultPrevented","dispatchEvent","handleClickOut","composedPath","includes","parentTagName","shadowRoot","host","parentNode","nodeName","firstUpdated","connectedCallback","super","document","addEventListener","testBreakpoint","window","debounce","disconnectedCallback","removeEventListener","nav","querySelectorDeep","styles","HeaderLinkScss","__decorate","property","type","Boolean","prototype","String","state","queryAssignedElements","slot","customElement"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kyndryl-design-system/shidoka-applications",
3
- "version": "1.3.1",
3
+ "version": "1.3.2",
4
4
  "description": "Shidoka Web Components for Applications",
5
5
  "main": "index.js",
6
6
  "type": "module",