@nanoporetech-digital/components 5.8.2 → 5.9.0
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/CHANGELOG.md +24 -0
- package/dist/cjs/nano-details.cjs.entry.js +17 -4
- package/dist/cjs/nano-details.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-global-nav-user-profile_3.cjs.entry.js +9 -3
- package/dist/cjs/nano-global-nav-user-profile_3.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-global-nav.cjs.entry.js +5 -2
- package/dist/cjs/nano-global-nav.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-grid_2.cjs.entry.js +14 -15
- package/dist/cjs/nano-grid_2.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-tab-group.cjs.entry.js +9 -3
- package/dist/cjs/nano-tab-group.cjs.entry.js.map +1 -1
- package/dist/cjs/{nano-table-4a8a9f6e.js → nano-table-92aa0af6.js} +2 -2
- package/dist/cjs/{nano-table-4a8a9f6e.js.map → nano-table-92aa0af6.js.map} +1 -1
- package/dist/cjs/nano-table.cjs.entry.js +1 -1
- package/dist/cjs/{table.worker-8f63db76.js → table.worker-a1e24a67.js} +2 -2
- package/dist/cjs/table.worker-a1e24a67.js.map +1 -0
- package/dist/cjs/transitions-e410ef6a.js +52 -0
- package/dist/cjs/transitions-e410ef6a.js.map +1 -0
- package/dist/collection/components/details/details.css +19 -10
- package/dist/collection/components/details/details.js +43 -2
- package/dist/collection/components/details/details.js.map +1 -1
- package/dist/collection/components/global-nav/global-nav.js +4 -1
- package/dist/collection/components/global-nav/global-nav.js.map +1 -1
- package/dist/collection/components/grid/grid.js +14 -15
- package/dist/collection/components/grid/grid.js.map +1 -1
- package/dist/collection/components/nav-item/nav-item.js +8 -2
- package/dist/collection/components/nav-item/nav-item.js.map +1 -1
- package/dist/collection/components/tabs/tab-group.js +8 -2
- package/dist/collection/components/tabs/tab-group.js.map +1 -1
- package/dist/collection/utils/transitions.js +24 -20
- package/dist/collection/utils/transitions.js.map +1 -1
- package/dist/components/grid.js +14 -15
- package/dist/components/grid.js.map +1 -1
- package/dist/components/nano-details.js +16 -3
- package/dist/components/nano-details.js.map +1 -1
- package/dist/components/nano-global-nav.js +4 -1
- package/dist/components/nano-global-nav.js.map +1 -1
- package/dist/components/nano-tab-group.js +8 -2
- package/dist/components/nano-tab-group.js.map +1 -1
- package/dist/components/nav-item.js +8 -2
- package/dist/components/nav-item.js.map +1 -1
- package/dist/components/transitions.js +24 -20
- package/dist/components/transitions.js.map +1 -1
- package/dist/esm/nano-details.entry.js +17 -4
- package/dist/esm/nano-details.entry.js.map +1 -1
- package/dist/esm/nano-global-nav-user-profile_3.entry.js +9 -3
- package/dist/esm/nano-global-nav-user-profile_3.entry.js.map +1 -1
- package/dist/esm/nano-global-nav.entry.js +5 -2
- package/dist/esm/nano-global-nav.entry.js.map +1 -1
- package/dist/esm/nano-grid_2.entry.js +14 -15
- package/dist/esm/nano-grid_2.entry.js.map +1 -1
- package/dist/esm/nano-tab-group.entry.js +9 -3
- package/dist/esm/nano-tab-group.entry.js.map +1 -1
- package/dist/esm/{nano-table-658687f9.js → nano-table-27a6222d.js} +2 -2
- package/dist/esm/{nano-table-658687f9.js.map → nano-table-27a6222d.js.map} +1 -1
- package/dist/esm/nano-table.entry.js +1 -1
- package/dist/esm/{table.worker-0c061654.js → table.worker-d6be4e98.js} +2 -2
- package/dist/esm/table.worker-d6be4e98.js.map +1 -0
- package/dist/esm/transitions-d4403d6f.js +50 -0
- package/dist/esm/transitions-d4403d6f.js.map +1 -0
- package/dist/nano-components/nano-components.esm.js +1 -1
- package/dist/nano-components/p-059301fa.js +5 -0
- package/dist/nano-components/p-059301fa.js.map +1 -0
- package/dist/nano-components/{p-997319eb.entry.js → p-2588c39f.entry.js} +2 -2
- package/dist/nano-components/p-2588c39f.entry.js.map +1 -0
- package/dist/nano-components/{p-ee4bb8bc.js → p-7867967f.js} +2 -2
- package/dist/nano-components/p-7c82af28.entry.js +5 -0
- package/dist/nano-components/p-7c82af28.entry.js.map +1 -0
- package/dist/nano-components/p-80d4a23d.entry.js +5 -0
- package/dist/nano-components/p-80d4a23d.entry.js.map +1 -0
- package/dist/nano-components/{p-40672ece.entry.js → p-91b44f7a.entry.js} +2 -2
- package/dist/nano-components/{p-92195a83.entry.js → p-a6d90d7b.entry.js} +2 -2
- package/dist/nano-components/p-a6d90d7b.entry.js.map +1 -0
- package/dist/nano-components/p-d017a01c.entry.js +5 -0
- package/dist/nano-components/p-d017a01c.entry.js.map +1 -0
- package/dist/nano-components/{p-7024e2d0.js → p-f453329d.js} +2 -2
- package/dist/types/components/details/details.d.ts +4 -0
- package/dist/types/components/grid/grid.d.ts +0 -1
- package/dist/types/components.d.ts +8 -0
- package/dist/types/utils/transitions.d.ts +7 -3
- package/docs-json.json +24 -6
- package/hydrate/index.js +74 -43
- package/package.json +2 -2
- package/dist/cjs/table.worker-8f63db76.js.map +0 -1
- package/dist/cjs/transitions-1205f12b.js +0 -48
- package/dist/cjs/transitions-1205f12b.js.map +0 -1
- package/dist/esm/table.worker-0c061654.js.map +0 -1
- package/dist/esm/transitions-686c5fec.js +0 -46
- package/dist/esm/transitions-686c5fec.js.map +0 -1
- package/dist/nano-components/p-5ca9275c.entry.js +0 -5
- package/dist/nano-components/p-5ca9275c.entry.js.map +0 -1
- package/dist/nano-components/p-92195a83.entry.js.map +0 -1
- package/dist/nano-components/p-997319eb.entry.js.map +0 -1
- package/dist/nano-components/p-afd3cd17.entry.js +0 -5
- package/dist/nano-components/p-afd3cd17.entry.js.map +0 -1
- package/dist/nano-components/p-cfcf5242.entry.js +0 -5
- package/dist/nano-components/p-cfcf5242.entry.js.map +0 -1
- package/dist/nano-components/p-f6de2d5d.js +0 -5
- package/dist/nano-components/p-f6de2d5d.js.map +0 -1
- /package/dist/nano-components/{p-40672ece.entry.js.map → p-7867967f.js.map} +0 -0
- /package/dist/nano-components/{p-ee4bb8bc.js.map → p-91b44f7a.entry.js.map} +0 -0
- /package/dist/nano-components/{p-7024e2d0.js.map → p-f453329d.js.map} +0 -0
@@ -1,48 +0,0 @@
|
|
1
|
-
/*!
|
2
|
-
* Web Components for Nanopore digital Web Apps
|
3
|
-
*/
|
4
|
-
'use strict';
|
5
|
-
|
6
|
-
/**
|
7
|
-
* Quality of life for transition handling.
|
8
|
-
* Adds / removes transitionend events. Resolves on complete
|
9
|
-
*/
|
10
|
-
/**
|
11
|
-
* handles hiding and showing elements properly (with display),
|
12
|
-
* along with transitions, so they are no longer viewable in the dom.
|
13
|
-
* - OnHide remove show class, listen for transition end, then display: none on finish
|
14
|
-
* - OnShow, display block on start then add a show class
|
15
|
-
* @param el
|
16
|
-
* @param className
|
17
|
-
* @param show
|
18
|
-
* @returns a promise of resolving as either 'show' or 'hidden'
|
19
|
-
*/
|
20
|
-
const displayTransition = (el, className, show = true, showDisplay = 'block') => {
|
21
|
-
return new Promise((resolve) => {
|
22
|
-
if (show) {
|
23
|
-
el.addEventListener('transitionend', (e) => {
|
24
|
-
if (e.target === el ||
|
25
|
-
e.composedPath().some((el) => el === e.target)) {
|
26
|
-
resolve('shown');
|
27
|
-
}
|
28
|
-
}, { once: true });
|
29
|
-
el.style.display = showDisplay;
|
30
|
-
el.dataset.displayTransition = 'true';
|
31
|
-
setTimeout(() => el.classList.add(className), 20);
|
32
|
-
}
|
33
|
-
else {
|
34
|
-
el.addEventListener('transitionend', (e) => {
|
35
|
-
if (e.target === el ||
|
36
|
-
e.composedPath().some((el) => el === e.target)) {
|
37
|
-
el.style.display = 'none';
|
38
|
-
resolve('hidden');
|
39
|
-
}
|
40
|
-
}, { once: true });
|
41
|
-
el.classList.remove(className);
|
42
|
-
}
|
43
|
-
});
|
44
|
-
};
|
45
|
-
|
46
|
-
exports.displayTransition = displayTransition;
|
47
|
-
|
48
|
-
//# sourceMappingURL=transitions-1205f12b.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"file":"transitions-1205f12b.js","mappings":";;;;;AAAA;;;;AAiBA;;;;;;;;;;MAUa,iBAAiB,GAAG,CAC/B,EAAe,EACf,SAAiB,EACjB,OAAgB,IAAI,EACpB,cAAsB,OAAO;EAE7B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO;IACzB,IAAI,IAAI,EAAE;MACR,EAAE,CAAC,gBAAgB,CACjB,eAAe,EACf,CAAC,CAAQ;QACP,IACE,CAAC,CAAC,MAAM,KAAK,EAAE;UACf,CAAC,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,EAC9C;UACA,OAAO,CAAC,OAAO,CAAC,CAAC;SAClB;OACF,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;MACF,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,WAAW,CAAC;MAC/B,EAAE,CAAC,OAAO,CAAC,iBAAiB,GAAG,MAAM,CAAC;MACtC,UAAU,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;KACnD;SAAM;MACL,EAAE,CAAC,gBAAgB,CACjB,eAAe,EACf,CAAC,CAAQ;QACP,IACE,CAAC,CAAC,MAAM,KAAK,EAAE;UACf,CAAC,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,EAC9C;UACA,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;UAC1B,OAAO,CAAC,QAAQ,CAAC,CAAC;SACnB;OACF,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;MACF,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;KAChC;GACF,CAAC,CAAC;AACL;;;;","names":[],"sources":["./src/utils/transitions.ts"],"sourcesContent":["/**\n * Quality of life for transition handling.\n * Adds / removes transitionend events. Resolves on complete\n */\nexport const transitionDone = (\n el: HTMLElement\n): Promise<'shown' | 'hidden'> => {\n return new Promise((resolve) => {\n const callback = () => {\n el.removeEventListener('transitionend', callback);\n resolve;\n };\n el.addEventListener('transitionend', callback);\n // ??\n });\n};\n\n/**\n * handles hiding and showing elements properly (with display),\n * along with transitions, so they are no longer viewable in the dom.\n * - OnHide remove show class, listen for transition end, then display: none on finish\n * - OnShow, display block on start then add a show class\n * @param el\n * @param className\n * @param show\n * @returns a promise of resolving as either 'show' or 'hidden'\n */\nexport const displayTransition = (\n el: HTMLElement,\n className: string,\n show: boolean = true,\n showDisplay: string = 'block'\n): Promise<'shown' | 'hidden'> => {\n return new Promise((resolve) => {\n if (show) {\n el.addEventListener(\n 'transitionend',\n (e: Event) => {\n if (\n e.target === el ||\n e.composedPath().some((el) => el === e.target)\n ) {\n resolve('shown');\n }\n },\n { once: true }\n );\n el.style.display = showDisplay;\n el.dataset.displayTransition = 'true';\n setTimeout(() => el.classList.add(className), 20);\n } else {\n el.addEventListener(\n 'transitionend',\n (e: Event) => {\n if (\n e.target === el ||\n e.composedPath().some((el) => el === e.target)\n ) {\n el.style.display = 'none';\n resolve('hidden');\n }\n },\n { once: true }\n );\n el.classList.remove(className);\n }\n });\n};\n"],"version":3}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"file":"table.worker-0c061654.js","mappings":";;;;;;;;;;;;;;;;;;;","names":[],"sources":[],"sourcesContent":[],"version":3}
|
@@ -1,46 +0,0 @@
|
|
1
|
-
/*!
|
2
|
-
* Web Components for Nanopore digital Web Apps
|
3
|
-
*/
|
4
|
-
/**
|
5
|
-
* Quality of life for transition handling.
|
6
|
-
* Adds / removes transitionend events. Resolves on complete
|
7
|
-
*/
|
8
|
-
/**
|
9
|
-
* handles hiding and showing elements properly (with display),
|
10
|
-
* along with transitions, so they are no longer viewable in the dom.
|
11
|
-
* - OnHide remove show class, listen for transition end, then display: none on finish
|
12
|
-
* - OnShow, display block on start then add a show class
|
13
|
-
* @param el
|
14
|
-
* @param className
|
15
|
-
* @param show
|
16
|
-
* @returns a promise of resolving as either 'show' or 'hidden'
|
17
|
-
*/
|
18
|
-
const displayTransition = (el, className, show = true, showDisplay = 'block') => {
|
19
|
-
return new Promise((resolve) => {
|
20
|
-
if (show) {
|
21
|
-
el.addEventListener('transitionend', (e) => {
|
22
|
-
if (e.target === el ||
|
23
|
-
e.composedPath().some((el) => el === e.target)) {
|
24
|
-
resolve('shown');
|
25
|
-
}
|
26
|
-
}, { once: true });
|
27
|
-
el.style.display = showDisplay;
|
28
|
-
el.dataset.displayTransition = 'true';
|
29
|
-
setTimeout(() => el.classList.add(className), 20);
|
30
|
-
}
|
31
|
-
else {
|
32
|
-
el.addEventListener('transitionend', (e) => {
|
33
|
-
if (e.target === el ||
|
34
|
-
e.composedPath().some((el) => el === e.target)) {
|
35
|
-
el.style.display = 'none';
|
36
|
-
resolve('hidden');
|
37
|
-
}
|
38
|
-
}, { once: true });
|
39
|
-
el.classList.remove(className);
|
40
|
-
}
|
41
|
-
});
|
42
|
-
};
|
43
|
-
|
44
|
-
export { displayTransition as d };
|
45
|
-
|
46
|
-
//# sourceMappingURL=transitions-686c5fec.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"file":"transitions-686c5fec.js","mappings":";;;AAAA;;;;AAiBA;;;;;;;;;;MAUa,iBAAiB,GAAG,CAC/B,EAAe,EACf,SAAiB,EACjB,OAAgB,IAAI,EACpB,cAAsB,OAAO;EAE7B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO;IACzB,IAAI,IAAI,EAAE;MACR,EAAE,CAAC,gBAAgB,CACjB,eAAe,EACf,CAAC,CAAQ;QACP,IACE,CAAC,CAAC,MAAM,KAAK,EAAE;UACf,CAAC,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,EAC9C;UACA,OAAO,CAAC,OAAO,CAAC,CAAC;SAClB;OACF,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;MACF,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,WAAW,CAAC;MAC/B,EAAE,CAAC,OAAO,CAAC,iBAAiB,GAAG,MAAM,CAAC;MACtC,UAAU,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;KACnD;SAAM;MACL,EAAE,CAAC,gBAAgB,CACjB,eAAe,EACf,CAAC,CAAQ;QACP,IACE,CAAC,CAAC,MAAM,KAAK,EAAE;UACf,CAAC,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,EAC9C;UACA,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;UAC1B,OAAO,CAAC,QAAQ,CAAC,CAAC;SACnB;OACF,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;MACF,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;KAChC;GACF,CAAC,CAAC;AACL;;;;","names":[],"sources":["./src/utils/transitions.ts"],"sourcesContent":["/**\n * Quality of life for transition handling.\n * Adds / removes transitionend events. Resolves on complete\n */\nexport const transitionDone = (\n el: HTMLElement\n): Promise<'shown' | 'hidden'> => {\n return new Promise((resolve) => {\n const callback = () => {\n el.removeEventListener('transitionend', callback);\n resolve;\n };\n el.addEventListener('transitionend', callback);\n // ??\n });\n};\n\n/**\n * handles hiding and showing elements properly (with display),\n * along with transitions, so they are no longer viewable in the dom.\n * - OnHide remove show class, listen for transition end, then display: none on finish\n * - OnShow, display block on start then add a show class\n * @param el\n * @param className\n * @param show\n * @returns a promise of resolving as either 'show' or 'hidden'\n */\nexport const displayTransition = (\n el: HTMLElement,\n className: string,\n show: boolean = true,\n showDisplay: string = 'block'\n): Promise<'shown' | 'hidden'> => {\n return new Promise((resolve) => {\n if (show) {\n el.addEventListener(\n 'transitionend',\n (e: Event) => {\n if (\n e.target === el ||\n e.composedPath().some((el) => el === e.target)\n ) {\n resolve('shown');\n }\n },\n { once: true }\n );\n el.style.display = showDisplay;\n el.dataset.displayTransition = 'true';\n setTimeout(() => el.classList.add(className), 20);\n } else {\n el.addEventListener(\n 'transitionend',\n (e: Event) => {\n if (\n e.target === el ||\n e.composedPath().some((el) => el === e.target)\n ) {\n el.style.display = 'none';\n resolve('hidden');\n }\n },\n { once: true }\n );\n el.classList.remove(className);\n }\n });\n};\n"],"version":3}
|
@@ -1,5 +0,0 @@
|
|
1
|
-
/*!
|
2
|
-
* Web Components for Nanopore digital Web Apps
|
3
|
-
*/
|
4
|
-
import{r as t,c as r,B as e,h as o,g as i}from"./p-d6a04b3a.js";import{d as s}from"./p-f6de2d5d.js";const a=":host{box-sizing:border-box}*,*::before,*::after{box-sizing:border-box}[hidden]{display:none !important}:host{font-family:inherit;font-size:inherit;font-stretch:inherit;font-style:inherit;font-weight:inherit;letter-spacing:inherit;text-decoration:inherit;text-overflow:inherit;text-transform:inherit;text-align:inherit;white-space:inherit;color:inherit;--padding:1em;--btn-padding:var(--padding);--btn-bg-color:var(--nano-color-contrast, #dad6d3);--btn-bg-color--open:var(--nano-color-base, #dad6d3);--btn-bg-color--hover:var(--nano-color-tint, #f9f9fb);--btn-text-color:var(--nano-color-base, #455556);--btn-text-color--open:var(--nano-color-contrast, var(--btn-text-color));--btn-text-color--hover:var(--nano-color-contrast, var(--btn-text-color));--content-transition:height 0.2s ease-out;--border-width:none;--border-color:none;--border-style:none;--border-radius:none;--box-shadow:none;--focus-style:var(--nano-control-focus-shadow, 0 0 0 0.1875rem var(--nano-control-focus-color, rgba(144, 198, 231, 0.8)));display:block;border-style:var(--border-style);border-width:var(--border-width-dims);border-color:var(--border-color);border-radius:var(--border-radius-dims);box-shadow:var(--box-shadow)}:host([disabled]){opacity:0.5}:host(:last-of-type){--border-width-dims:0 var(--border-width) var(--border-width);--border-radius-dims:0 0 var(--border-radius) var(--border-radius)}:host(:last-of-type) .open .content{border-radius:0 0 var(--border-radius) var(--border-radius)}:host(:first-of-type){--border-radius-dims:var(--border-radius) var(--border-radius) 0 0;--border-width-dims:var(--border-width)}:host(:first-of-type:last-of-type){--border-radius-dims:var(--border-radius);--border-width-dims:var(--border-width)}:host(:not(:last-of-type):not(:first-of-type)){--border-width-dims:0 var(--border-width) var(--border-width)}.header{height:auto;padding:var(--btn-padding);text-align:inherit;position:relative;font-size:1em;line-height:1;margin:0;transition:0.3s ease background, 0.3s ease color, 0.15s ease box-shadow;display:flex;align-items:center;background:var(--btn-bg-color);color:var(--btn-text-color);border-radius:var(--border-radius-dims);cursor:pointer}.header::-webkit-details-marker{display:none}.header:focus{outline:none}.header:focus-visible{box-shadow:var(--focus-style);outline:none;position:relative;z-index:1}.header:hover{background:var(--btn-bg-color--hover);color:var(--btn-text-color--hover)}.open .header{background:var(--btn-bg-color--open);color:var(--btn-text-color--open);border-end-end-radius:0;border-end-start-radius:0}.disabled .header{cursor:not-allowed}.header .label{width:100%;max-width:100%;max-height:100%;flex:1;display:inline-block}.header .icon{line-height:0;flex-direction:column;justify-content:center;display:inline-block;color:currentcolor;transition:0.3s ease transform;transform-origin:center}.header .icon--start{margin-inline:0 var(--padding);margin-block:0}.header .icon--end{margin-inline:var(--padding) 0;margin-block:0}.header .icon ::slotted(nano-icon){--color:currentcolor}.body{overflow:hidden;transition:var(--content-transition), 0.2s ease border-radius;outline:none}.body>*{opacity:0;transition:opacity 0.2s ease-out}.open .body>*{opacity:1}.content{padding:var(--padding)}";const n=class{constructor(e){t(this,e);this.nanoOpened=r(this,"nanoOpened",7);this.nanoClosed=r(this,"nanoClosed",7);this.stateChanging=false;this.onKeyDown=t=>{if(this.stateChanging||this.disabled)return;switch(t.key){case"Enter":case" ":t.preventDefault();this.open=!this.open;break;case"ArrowUp":t.preventDefault();this.open=false;break;case"ArrowDown":t.preventDefault();this.open=true;break}};this.onMouseDown=t=>{t.preventDefault();this.headerEl.focus();if(this.stateChanging||this.disabled)return;this.open=!this.open};this.label="";this.open=false;this.disabled=false;this.noHandle=false;this.iconRotation=90;this.useCacheHeight=false}toggleClick(){this.stateChanging=true;if(this.open)this.show();else this.hide()}hide(){const t=this.nanoClosed.emit(this.open);if(t.defaultPrevented){this.open=true;this.detailsEl.open=true;return}this.cacheHeight=this.contentEl.scrollHeight;this.bodyEl.style.height=this.cacheHeight+"px";s(this.bodyEl,"is-shown",false).then((()=>{this.stateChanging=false;this.detailsEl.open=false}));requestAnimationFrame((()=>{this.bodyEl.style.height="0px"}))}show(){const t=this.nanoOpened.emit();this.detailsEl.open=true;if(t.defaultPrevented){this.open=false;this.detailsEl.open=false;return}s(this.bodyEl,"is-shown",true).then((()=>{this.stateChanging=false;this.bodyEl.style.height="auto"}));this.bodyEl.style.height=(this.useCacheHeight?this.cacheHeight:this.contentEl.scrollHeight)+"px"}attachMo(){if(this.mo||!this.detailsEl||!e.isBrowser)return;this.mo=new MutationObserver((t=>{if(this.stateChanging)return;for(const r of t){if(r.type==="attributes"&&r.attributeName==="open"){this.open=this.detailsEl.open}}}));this.mo.observe(this.detailsEl,{attributes:true})}componentWillLoad(){this.hasStartSlot=!!this.host.querySelector('[slot="icon-start"]');this.hasEndSlot=!!this.host.querySelector('[slot="icon-end"]')}componentDidLoad(){this.bodyEl.style.height=this.open?"auto":"0";if(this.open)this.detailsEl.setAttribute("open","true");this.attachMo()}connectedCallback(){this.attachMo()}disconnectedCallback(){if(this.mo){this.mo.disconnect();this.mo=undefined}}render(){return o("details",{part:"base",ref:t=>this.detailsEl=t,class:{details:true,open:this.open,disabled:this.disabled}},o("summary",{part:"header","aria-controls":"content","aria-expanded":this.open?"true":"false","aria-disabled":this.disabled?"true":"false",tabindex:this.disabled?"-1":"0",style:{display:this.noHandle?"none":""},id:"header",role:"button",class:"header",ref:t=>this.headerEl=t,onKeyDown:this.onKeyDown,onClick:this.onMouseDown},this.hasStartSlot?o("span",{part:"icon--start",class:"icon icon--start",style:{transform:this.open?`rotate(${this.iconRotation}deg)`:""}},o("slot",{name:"icon-start"})):"",o("div",{part:"label",class:"label"},this.label?this.label:o("slot",{name:"label"})),this.hasEndSlot?o("span",{part:"icon--end",class:"icon icon--end",style:{transform:this.open?`rotate(${this.iconRotation}deg)`:""}},o("slot",{name:"icon-end"})):""),o("div",{part:"body",class:"body",ref:t=>this.bodyEl=t,tabindex:"-1",role:"region","aria-labelledby":"header"},o("div",{part:"content",ref:t=>this.contentEl=t,class:"content",id:"content"},o("slot",null))))}get host(){return i(this)}static get watchers(){return{open:["toggleClick"]}}};n.style=a;export{n as nano_details};
|
5
|
-
//# sourceMappingURL=p-5ca9275c.entry.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"names":["detailsCss","Details","this","stateChanging","onKeyDown","e","disabled","key","preventDefault","open","onMouseDown","headerEl","focus","toggleClick","show","hide","nanoClose","nanoClosed","emit","defaultPrevented","detailsEl","cacheHeight","contentEl","scrollHeight","bodyEl","style","height","displayTransition","then","requestAnimationFrame","nanoOpen","nanoOpened","useCacheHeight","attachMo","mo","Build","isBrowser","MutationObserver","changes","change","type","attributeName","observe","attributes","componentWillLoad","hasStartSlot","host","querySelector","hasEndSlot","componentDidLoad","setAttribute","connectedCallback","disconnectedCallback","disconnect","undefined","render","h","part","ref","d","class","details","tabindex","display","noHandle","id","role","s","onClick","transform","iconRotation","name","label","div"],"sources":["./src/components/details/details.scss?tag=nano-details&encapsulation=shadow","./src/components/details/details.tsx"],"sourcesContent":["@use 'sass:map';\n@use 'sass:list';\n\n@import '../../global/style/utilities/globals';\n@import '../../global/style/nano-theme/colours';\n@import '../../global/style/nano-theme/base';\n@import '../../global/style/nano-theme/form';\n\n:host {\n /**\n * @prop --padding: Default to 1em;\n\n * @prop --btn-padding: Defaults to var(--padding);\n * @prop --btn-bg-color: Defaults to var(--nano-color-contrast, #dad6d3);\n * @prop --btn-bg-color--open: Defaults to var(--nano-color-base, #dad6d3);\n * @prop --btn-bg-color--hover: Defaults to var(--nano-color-tint, #{map.get($colors, offwhite)});\n\n * @prop --btn-text-color: Defaults to var(--nano-color-base, #455556);\n * @prop --btn-text-color--open: Defaults to var(--nano-color-contrast, var(--btn-text-color));\n * @prop --btn-text-color--hover: Defaults to var(--nano-color-contrast, var(--btn-text-color));\n\n * @prop --content-transition: Defaults to height .2s ease-out;\n\n * @prop --border-width: Defaults to none;\n * @prop --border-color: Defaults to none;\n * @prop --border-style: Defaults to none;\n * @prop --border-radius: Defaults to none;\n * @prop --box-shadow: Defaults to none;\n * @prop --focus-style: Defaults to #{$control-focus-style}\n */\n\n @include text-inherit();\n\n --padding: 1em;\n --btn-padding: var(--padding);\n --btn-bg-color: var(--nano-color-contrast, #dad6d3);\n --btn-bg-color--open: var(--nano-color-base, #dad6d3);\n --btn-bg-color--hover: var(--nano-color-tint, #{map.get($colors, offwhite)});\n --btn-text-color: var(--nano-color-base, #455556);\n --btn-text-color--open: var(--nano-color-contrast, var(--btn-text-color));\n --btn-text-color--hover: var(--nano-color-contrast, var(--btn-text-color));\n --content-transition: height 0.2s ease-out;\n --border-width: none;\n --border-color: none;\n --border-style: none;\n --border-radius: none;\n --box-shadow: none;\n --focus-style: #{$control-focus-style};\n\n display: block;\n border-style: var(--border-style);\n border-width: var(--border-width-dims);\n border-color: var(--border-color);\n border-radius: var(--border-radius-dims);\n box-shadow: var(--box-shadow);\n}\n\n:host([disabled]) {\n opacity: 0.5;\n}\n\n:host(:last-of-type) {\n --border-width-dims: 0 var(--border-width) var(--border-width);\n --border-radius-dims: 0 0 var(--border-radius) var(--border-radius);\n\n .open .content {\n border-radius: 0 0 var(--border-radius) var(--border-radius);\n }\n}\n\n:host(:first-of-type) {\n --border-radius-dims: var(--border-radius) var(--border-radius) 0 0;\n --border-width-dims: var(--border-width);\n}\n\n:host(:first-of-type:last-of-type) {\n --border-radius-dims: var(--border-radius);\n --border-width-dims: var(--border-width);\n}\n\n:host(:not(:last-of-type):not(:first-of-type)) {\n --border-width-dims: 0 var(--border-width) var(--border-width);\n}\n\n.header {\n height: auto;\n padding: var(--btn-padding);\n text-align: inherit;\n position: relative;\n font-size: 1em;\n line-height: 1;\n margin: 0;\n transition: 0.3s ease background, 0.3s ease color, 0.15s ease box-shadow;\n display: flex;\n align-items: center;\n background: var(--btn-bg-color);\n color: var(--btn-text-color);\n border-radius: var(--border-radius-dims);\n cursor: pointer;\n\n &::-webkit-details-marker {\n display: none;\n }\n\n &:focus {\n outline: none;\n }\n\n &:focus-visible {\n box-shadow: var(--focus-style);\n outline: none;\n position: relative;\n z-index: 1;\n }\n\n &:hover {\n background: var(--btn-bg-color--hover);\n color: var(--btn-text-color--hover);\n }\n\n .open & {\n background: var(--btn-bg-color--open);\n color: var(--btn-text-color--open);\n border-end-end-radius: 0;\n border-end-start-radius: 0;\n }\n\n .disabled & {\n cursor: not-allowed;\n }\n\n .label {\n width: 100%;\n max-width: 100%;\n max-height: 100%;\n flex: 1;\n display: inline-block;\n }\n\n .icon {\n line-height: 0;\n flex-direction: column;\n justify-content: center;\n display: inline-block;\n color: currentcolor;\n transition: 0.3s ease transform;\n transform-origin: center;\n\n &--start {\n margin-inline: 0 var(--padding);\n margin-block: 0;\n }\n\n &--end {\n margin-inline: var(--padding) 0;\n margin-block: 0;\n }\n\n ::slotted(nano-icon) {\n --color: currentcolor;\n }\n }\n}\n\n.body {\n overflow: hidden;\n transition: var(--content-transition), 0.2s ease border-radius;\n outline: none;\n\n > * {\n opacity: 0;\n transition: opacity 0.2s ease-out;\n\n .open & {\n opacity: 1;\n }\n }\n}\n\n.content {\n padding: var(--padding);\n}\n","import {\n Component,\n Event,\n EventEmitter,\n Prop,\n h,\n Element,\n Watch,\n Build,\n} from '@stencil/core';\nimport { displayTransition } from '../../utils/transitions';\n\n/**\n * A simple element used to hide or reveal more content with slide effect. Can be used independently or nested within a [accordion](story/components-accordion--accordion) element to add 'one item open at a time' support.\n */\n/**\n * @slot - content that will be hidden / revealed\n * @slot icon-start - used for icons at the start of the handle\n * @slot label - can be used when you wish to insert complex label markup\n * @slot icon-end - used for icons at the end of the handle\n *\n * @part base - the root `details` element\n * @part header - the main `summary` ui control\n * @part label - the text wrapper of the ui control\n * @part icon--start - the icon wrapper at the start of the ui control\n * @part icon--end - the icon wrapper at the end of the ui control\n * @part body - the wrapper around content\n * @part content - the main content wrapper\n */\n@Component({\n tag: 'nano-details',\n styleUrl: 'details.scss',\n shadow: true,\n})\nexport class Details {\n private hasStartSlot: boolean;\n private hasEndSlot: boolean;\n private mo?: MutationObserver;\n private stateChanging: boolean = false;\n private bodyEl: HTMLElement;\n private detailsEl: HTMLDetailsElement;\n private headerEl: HTMLElement;\n private contentEl: HTMLDivElement;\n private cacheHeight: number;\n\n @Element() private host: HTMLNanoDetailsElement;\n\n /** Summary / handle text. Use the `label` slot for HTML markup */\n @Prop() label: string = '';\n\n /** Should item be open on load */\n @Prop({ mutable: true, reflect: true }) open: boolean = false;\n\n /** Disables the details so it can't be toggled. */\n @Prop({ mutable: true, reflect: true }) disabled: boolean = false;\n\n /** Hide the handle. (You will need to control the hiding / showing of content with script) */\n @Prop() noHandle: boolean = false;\n\n /** Icon slot rotation amount (degrees) on open */\n @Prop() iconRotation: number = 90;\n\n /**\n * Sometimes, nested content will resize within the details component which results in choppy show/hide animations.\n * Set `useCacheHeight` to `true` try to keep animations smooth. */\n @Prop() useCacheHeight = false;\n\n /**\n * Emitted when the component opens.\n * Note: when wrapped in an accordion this event will not propogate. Use nanoToggle events instead.\n */\n @Event() nanoOpened: EventEmitter;\n\n /**\n * Emitted when the component closes.\n * Note: when wrapped in an accordion this event will not propogate. Use nanoToggle events instead.\n */\n @Event() nanoClosed: EventEmitter;\n\n @Watch('open')\n toggleClick() {\n this.stateChanging = true;\n if (this.open) this.show();\n else this.hide();\n }\n\n private onKeyDown = (e: KeyboardEvent) => {\n if (this.stateChanging || this.disabled) return;\n\n switch (e.key) {\n case 'Enter':\n case ' ':\n e.preventDefault();\n this.open = !this.open;\n break;\n case 'ArrowUp':\n e.preventDefault();\n this.open = false;\n break;\n case 'ArrowDown':\n e.preventDefault();\n this.open = true;\n break;\n }\n };\n\n private onMouseDown = (e: MouseEvent) => {\n e.preventDefault();\n this.headerEl.focus();\n\n if (this.stateChanging || this.disabled) return;\n this.open = !this.open;\n };\n\n private hide() {\n const nanoClose = this.nanoClosed.emit(this.open);\n\n if (nanoClose.defaultPrevented) {\n this.open = true;\n this.detailsEl.open = true;\n return;\n }\n\n this.cacheHeight = this.contentEl.scrollHeight;\n this.bodyEl.style.height = this.cacheHeight + 'px';\n\n displayTransition(this.bodyEl, 'is-shown', false).then(() => {\n this.stateChanging = false;\n this.detailsEl.open = false;\n });\n\n requestAnimationFrame(() => {\n this.bodyEl.style.height = '0px';\n });\n }\n\n private show() {\n const nanoOpen = this.nanoOpened.emit();\n this.detailsEl.open = true;\n\n if (nanoOpen.defaultPrevented) {\n this.open = false;\n this.detailsEl.open = false;\n return;\n }\n\n displayTransition(this.bodyEl, 'is-shown', true).then(() => {\n this.stateChanging = false;\n this.bodyEl.style.height = 'auto';\n });\n\n this.bodyEl.style.height =\n (this.useCacheHeight ? this.cacheHeight : this.contentEl.scrollHeight) +\n 'px';\n }\n\n private attachMo() {\n if (this.mo || !this.detailsEl || !Build.isBrowser) return;\n\n this.mo = new MutationObserver((changes) => {\n if (this.stateChanging) return;\n\n for (const change of changes) {\n if (change.type === 'attributes' && change.attributeName === 'open') {\n this.open = this.detailsEl.open;\n }\n }\n });\n this.mo.observe(this.detailsEl, { attributes: true });\n }\n\n componentWillLoad() {\n this.hasStartSlot = !!this.host.querySelector('[slot=\"icon-start\"]');\n this.hasEndSlot = !!this.host.querySelector('[slot=\"icon-end\"]');\n }\n\n componentDidLoad() {\n this.bodyEl.style.height = this.open ? 'auto' : '0';\n if (this.open) this.detailsEl.setAttribute('open', 'true');\n this.attachMo();\n }\n\n connectedCallback() {\n this.attachMo();\n }\n\n disconnectedCallback() {\n if (this.mo) {\n this.mo.disconnect();\n this.mo = undefined;\n }\n }\n\n render() {\n return (\n <details\n part=\"base\"\n ref={(d: HTMLDetailsElement) => (this.detailsEl = d)}\n class={{\n details: true,\n open: this.open,\n disabled: this.disabled,\n }}\n >\n <summary\n part=\"header\"\n aria-controls=\"content\"\n aria-expanded={this.open ? 'true' : 'false'}\n aria-disabled={this.disabled ? 'true' : 'false'}\n tabindex={this.disabled ? '-1' : '0'}\n style={{ display: this.noHandle ? 'none' : '' }}\n id=\"header\"\n role=\"button\"\n class=\"header\"\n ref={(s) => (this.headerEl = s)}\n onKeyDown={this.onKeyDown}\n onClick={this.onMouseDown}\n >\n {this.hasStartSlot ? (\n <span\n part=\"icon--start\"\n class=\"icon icon--start\"\n style={{\n transform: this.open ? `rotate(${this.iconRotation}deg)` : '',\n }}\n >\n <slot name=\"icon-start\" />\n </span>\n ) : (\n ''\n )}\n <div part=\"label\" class=\"label\">\n {this.label ? this.label : <slot name=\"label\" />}\n </div>\n {this.hasEndSlot ? (\n <span\n part=\"icon--end\"\n class=\"icon icon--end\"\n style={{\n transform: this.open ? `rotate(${this.iconRotation}deg)` : '',\n }}\n >\n <slot name=\"icon-end\" />\n </span>\n ) : (\n ''\n )}\n </summary>\n <div\n part=\"body\"\n class=\"body\"\n ref={(div) => (this.bodyEl = div)}\n tabindex=\"-1\"\n role=\"region\"\n aria-labelledby=\"header\"\n >\n <div\n part=\"content\"\n ref={(div) => (this.contentEl = div)}\n class=\"content\"\n id=\"content\"\n >\n <slot />\n </div>\n </div>\n </details>\n );\n }\n}\n"],"mappings":"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"}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"names":["tabGroupCss","TabGroup","this","initialTouchX","initialTouchY","mutationObservers","WeakMap","updateScrollControls","noScrollControls","hasScrollControls","includes","placement","nav","scrollWidth","clientWidth","tabs","handleClick","event","target","tab","closest","setActiveTab","handleKeyDown","activeEl","document","activeElement","tagName","toLowerCase","key","preventDefault","stopPropagation","getAllActiveTabs","index","indexOf","length","isRtl","Math","max","min","setFocus","scrollIntoView","handleTabScroll","hideControlLeft","hideControlRight","endRight","scrollLeft","endLeft","handleBtnClick","goRight","navWidth","getNavWidth","leftAmt","scroll","left","behavior","e","handleTouchStart","disableSwipe","touch","changedTouches","pageX","pageY","handleTouchEnd","distX","distY","threshold","xDiff","clientX","yDiff","clientY","isHorizontalSwipe","abs","currIndex","findIndex","el","active","toGo","activePanel","setAttribute","handleContentSlotChange","setTimeout","setAriaLabels","getActiveTab","handleTabSlotChange","ev","nodes","assignedElements","flatten","forEach","node","get","mo","MutationObserver","syncActiveTabIndicator","set","observe","characterData","childList","subtree","handleTabNameChange","activeTab","panel","find","handlePlacementChange","handleNoScrollControlsChange","hideRightBtn","rightBtn","displayTransition","hideLeftBtn","leftBtn","watchScrollControls","_","async","getAllTabs","filter","disabled","getDirectChildren","host","getAllPanels","emitEvents","previousTab","map","name","removeAttribute","nanoTabHide","emit","nanoTabShow","panels","getAttribute","width","_a","shadowRoot","querySelector","height","clientHeight","offset","getOffset","activeTabIndicator","offsetTop","top","scrollTop","offsetLeft","style","transform","computedStyle","getComputedStyle","parseFloat","paddingLeft","paddingRight","handleTabClose","tabIndex","stopImmediatePropagation","closeEv","nanoTabWillClose","defaultPrevented","prevTab","show","remove","nanoTabClose","componentDidLoad","observer","IntersectionObserver","entries","intersectionRatio","storeId","ComponentStore","init","storeMethod","unobserve","requestAnimationFrame","window","resizeObserver","ResizeObserver","connectedCallback","dir","ownerDocument","disconnectedCallback","render","h","Host","class","Object","assign","createColorClasses","color","part","onClick","onKeyDown","ref","btn","onScroll","role","onSlotchange","onTouchStart","onTouchEnd"],"sources":["./src/components/tabs/tab-group.scss?tag=nano-tab-group&encapsulation=shadow","./src/components/tabs/tab-group.tsx"],"sourcesContent":["@use 'sass:map';\n@use 'sass:list';\n\n@import '../../global/style/utilities/globals';\n@import '../../global/style/nano-theme/form';\n@import '../../global/style/nano-theme/base';\n@import '../../global/style/nano-theme/layers';\n\n/**\n * @prop --indicator-transition: Only relevant to placement 'start'. defaults to #{$transition-fast};\n * @prop --indicator-color: defaults to #{map.get($colors, lightblue)} on placement 'top' and #{map.get($colors, blue)} on placement 'start';\n * @prop --indicator-track-color: Only relevant to placement 'start'. defaults to #{map.get($colors, lightgrey)};\n * @prop --indicator-size: defaults to 5px on placement 'top' and 2px on placement 'start';\n\n * @prop --border-radius: defaults to #{$layer-border-radius};\n * @prop --background-rgb: will be used as the default background colour for tabs and content. defaults to #{$layer-bg-color-rgb};\n * @prop --shadow-opacity: opacity of the shadow behind tabs. defaults to 0.1;\n * @prop --scroll-btn-color: defaults to 'currentcolor';\n\n * @prop --content-padding: defaults to 2rem 2.5rem;\n * @prop --content-bg: defaults to rgb(var(--background-rgb));\n * @prop --content-border-radius: defaults to `var(--border-radius)` `position=\"top\"`. `0 var(--border-radius) var(--border-radius) 0` `position=\"start\"`;\n\n * @prop --tabs-padding-start: defaults to 2.5rem on placement 'top' and 0 on placement 'start';\n * @prop --tabs-padding-end: defaults to 2.5rem on placement 'top' and 0 on placement 'start';\n * @prop --tabs-padding-top: defaults to 0;\n * @prop --tabs-padding-bottom: defaults to 0;\n * @prop --tabs-bg-rgb: defaults to var(--bg-color);\n * @prop --tab-border-radius: defaults to `var(--border-radius) var(--border-radius) 0 0` `position=\"top\"`. `0` `position=\"start\"`. ;\n * @prop --tab-text-color: defaults to #{map.get($colors, blue)} on placement 'top' and #{map.get($colors, darkgrey)} on placement 'start';\n * @prop --fade-transparency: controls the strength of the fade on overflowing tabs, defaults to 0;\n */\n\n:host {\n --indicator-transition: #{$transition-fast};\n --indicator-color: #{map.get($colors, lightblue)};\n --indicator-track-color: #{map.get($colors, lightgrey)};\n --indicator-size: 0;\n --border-radius: #{$layer-border-radius};\n --background-rgb: #{$layer-bg-color-rgb};\n --scroll-btn-color: 'currentColor';\n --content-padding: 2rem 2.5rem;\n --content-bg: rgb(var(--background-rgb));\n --content-border-radius: var(--border-radius);\n --tabs-padding-start: 2.5rem;\n --tabs-padding-end: 2.5rem;\n --tabs-padding-top: 0;\n --tabs-padding-bottom: 0;\n --tabs-container-bg: 'transparent';\n --tabs-bg-rgb: var(--background-rgb);\n --tab-border-radius: var(--border-radius) var(--border-radius) 0 0;\n --tab-text-color: #{map.get($colors, blue)};\n --shadow-opacity: 0.1;\n --fade-transparency: 0;\n\n display: block;\n position: relative;\n z-index: #{$layer-index-raised};\n\n @media only screen and (max-width: 768px) {\n --tabs-padding-start: 1.5rem;\n --tabs-padding-end: 1.5rem;\n }\n\n ::slotted(nano-tab) {\n --tab-indicator-color: var(--indicator-color);\n --bg-rgb: var(--tabs-bg-rgb);\n --border-radius: var(--tab-border-radius);\n --grab-offset-x: var(--tabs-padding-start);\n }\n}\n\n:host([placement='start']) {\n --content-border-radius: 0 var(--border-radius) var(--border-radius) 0;\n --content-padding: 1rem;\n --tab-border-radius: 0;\n --tabs-padding-start: 0;\n --tabs-padding-end: 0;\n --tabs-padding-top: 0;\n --tabs-padding-bottom: 0;\n --tab-text-color: #{map.get($colors, darkgrey)};\n --indicator-color: #{map.get($colors, blue)};\n --indicator-size: 2px;\n}\n\n:host(.nano-color) {\n --indicator-color: var(--nano-color-tint, #{nano-color(primary, tint)});\n --tab-text-color: rgb(var(--nano-color-base-rgb) / 70%);\n\n ::slotted(nano-tab) {\n --active-text-color: var(--nano-color-shade, #{nano-color(primary, shade)});\n }\n}\n\n.nano-tab-group {\n display: flex;\n border-radius: 0;\n width: 100%;\n flex: inherit;\n\n &__tabs {\n display: flex;\n position: relative;\n width: 100%;\n }\n\n &__active-tab-indicator {\n position: absolute;\n transition:\n var(--indicator-transition) transform ease,\n var(--indicator-transition) width ease;\n }\n\n &__body {\n background: var(--content-bg);\n }\n\n .nano-tab-group__nav-container {\n position: relative;\n display: flex;\n background: var(--tabs-container-bg);\n }\n\n button {\n appearance: none;\n background-color: transparent;\n }\n\n &__scroll-button {\n display: flex;\n align-items: center;\n justify-content: center;\n position: absolute;\n inset-block: 0;\n border: unset;\n z-index: 2;\n transition: #{$transition-fast} ease opacity;\n opacity: 0;\n color: var(--scroll-btn-color);\n\n &:focus {\n outline: none;\n }\n\n &.is-shown {\n opacity: 1;\n }\n\n &:focus-visible {\n box-shadow: #{$control-focus-style} inset;\n }\n\n &--left {\n inset-inline-start: 0;\n }\n\n &--right {\n inset-inline-end: 0;\n }\n\n nano-icon {\n font-size: 16px;\n }\n }\n\n ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n // Top\n ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n &--top {\n flex-direction: column;\n\n .nano-tab-group__nav-container {\n &::after {\n content: '';\n width: 86%;\n box-shadow: 0 10px 40px 10px rgb(0 0 0 / var(--shadow-opacity));\n height: 10px;\n position: absolute;\n inset-inline-start: 7%;\n inset-block-end: -10px;\n border-radius: 10px;\n z-index: -1;\n }\n }\n\n .nano-tab-group__nav {\n @include hide-scrollbar();\n\n padding-inline: var(--tabs-padding-start) var(--tabs-padding-end);\n padding-block: var(--tabs-padding-top) var(--tabs-padding-bottom);\n display: flex;\n overflow-x: auto;\n overflow-y: hidden;\n transition: #{$transition-medium} ease;\n background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=');\n mask-repeat: no-repeat;\n mask-image:\n linear-gradient(\n to left,\n rgb(0 0 0 / var(--fade-transparency)) 0,\n rgb(0 0 0 / var(--fade-transparency)) var(--tabs-padding-start),\n rgb(0 0 0 / 100%) calc(var(--tabs-padding-start) * 2),\n rgb(0 0 0 / 100%) calc(100% - (var(--tabs-padding-end) * 2)),\n rgb(0 0 0 / var(--fade-transparency))\n calc(100% - var(--tabs-padding-end)),\n rgb(0 0 0 / var(--fade-transparency))\n );\n mask-size: calc(100% + calc(var(--tabs-padding-end) * 4));\n mask-position: calc(var(--tabs-padding-end) * -2);\n\n &::after {\n content: ' ';\n padding-inline: 0 var(--tabs-padding-end);\n padding-block: var(--tabs-padding-top) var(--tabs-padding-bottom);\n line-height: 1;\n flex: 0 0 auto;\n }\n }\n\n &.nano-tab-group--has-scroll-controls-left {\n .nano-tab-group__nav {\n mask-position: 0;\n mask-size: calc(100% + (var(--tabs-padding-end) * 2));\n }\n }\n\n &.nano-tab-group--has-scroll-controls-right {\n .nano-tab-group__nav {\n mask-position: calc(var(--tabs-padding-end) * -1);\n mask-size: calc(100% + var(--tabs-padding-end));\n }\n }\n\n &.nano-tab-group--has-scroll-controls-left.nano-tab-group--has-scroll-controls-right {\n .nano-tab-group__nav {\n mask-size: 100%;\n mask-position: 0;\n }\n }\n\n .nano-tab-group__tabs {\n flex: 1 1 auto;\n position: relative;\n flex-direction: row;\n text-align: center;\n color: var(--tab-text-color);\n width: auto;\n }\n\n .nano-tab-group__active-tab-indicator {\n inset-block-end: -2px;\n border-block-end: solid var(--indicator-size) var(--indicator-color);\n }\n\n .nano-tab-group__body {\n order: 2;\n background: var(--content-bg);\n position: relative;\n overflow: hidden;\n width: auto;\n display: flex;\n justify-content: center;\n padding: var(--content-padding);\n border-radius: var(--content-border-radius);\n flex: 1 1 auto;\n }\n }\n\n ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n // Start\n ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n &--start {\n flex-direction: row;\n\n .nano-tab-group__tabs {\n flex: 0 0 auto;\n flex-direction: column;\n color: var(--tab-text-color);\n background: rgb(var(--tabs-bg-rgb));\n border-inline-start:\n solid var(--indicator-size)\n var(--indicator-track-color);\n text-align: start;\n }\n\n .nano-tab-group__active-tab-indicator {\n inset-inline-start: calc(-1 * 2px);\n border-inline-start: solid var(--indicator-size) var(--indicator-color);\n }\n\n .nano-tab-group__body {\n flex: 1 1 auto;\n order: 2;\n padding: var(--content-padding);\n overflow: hidden;\n border-radius: var(--content-border-radius);\n }\n }\n}\n","import {\n Component,\n Element,\n ComponentInterface,\n Event,\n EventEmitter,\n Method,\n Prop,\n State,\n Watch,\n h,\n Host,\n Listen,\n Build,\n} from '@stencil/core';\n\nimport { getDirectChildren, getOffset } from '../../utils/dom';\nimport { scrollIntoView } from '../../utils/scroll';\nimport {\n ComponentStore,\n StorageMethods,\n} from '../../utils/store/component-store';\nimport { createColorClasses } from '../../utils/theme';\nimport { displayTransition } from '../../utils/transitions';\nimport type { Color } from '../../interface';\n\n/**\n * A traditional tab implementation. It nests `nano-tab` and `nano-tab-content` sub-components.\n *\n * Tabs can be stacked vertically or horizontally (which presents different styling variations) using the `placement` attribute.\n * Horizontal tabs that don't fit will overflow and scroll appropriately.\n * Tab-content can also be swiped to change tabs.\n *\n * @slot tabs - Add `nano-tab` elements to add clickable tabs.\n * @slot tab-content-header - a header bar displayed above tab content.\n * @slot - Add `nano-tab-content` elements to add tabbable content.\n *\n * @part base - the main tab-group wrapper\n * @part nav - the bar surrounding all the tabs and nav buttons\n * @part tabs - the wrapper around the `nano-tab` components\n * @part active-tab-indicator - the active indicator line\n * @part body - the wrapper around the `nano-tab-content` components\n */\n\n@Component({\n tag: 'nano-tab-group',\n styleUrl: 'tab-group.scss',\n shadow: true,\n})\nexport class TabGroup implements ComponentInterface {\n private activeTab: HTMLNanoTabElement;\n private activePanel: HTMLNanoTabContentElement;\n private activeTabIndicator: HTMLElement;\n private nav: HTMLElement;\n private tabs: HTMLElement;\n private rightBtn: HTMLButtonElement;\n private leftBtn: HTMLButtonElement;\n\n private isRtl: boolean;\n private initialTouchX: number = null;\n private initialTouchY: number = null;\n\n private resizeObserver: ResizeObserver;\n private mutationObservers: WeakMap<Node, MutationObserver> = new WeakMap();\n\n @Element() host: HTMLNanoTabGroupElement;\n\n @State() hasScrollControls = false;\n @State() hideControlRight = true;\n @State() hideControlLeft = true;\n @State() tab: string;\n\n /**\n * The placement of the tabs.\n */\n @Prop({ reflect: true }) placement: 'top' | 'start' = 'top';\n\n /**\n * Disables the scroll arrows that appear when tabs overflow.\n */\n @Prop() noScrollControls = false;\n\n /**\n * The color to use from the application's color palette.\n */\n @Prop() color?: Color;\n\n /**\n * Store the currently open tab (against this ID) in the component store.\n * Use in conjunction with storeMethod\n */\n @Prop() storeId?: string;\n\n /**\n * The method of storage.\n * Either session storage, url hash (after the '#') or url query (after the '?').\n */\n @Prop() storeMethod: StorageMethods = 'session';\n\n /**\n * Disable 'swipe to change tab' on devices with touch\n */\n @Prop() disableSwipe: boolean;\n\n @Watch('tab')\n handleTabNameChange() {\n if (this.activeTab && this.activeTab.panel === this.tab) return;\n const tab = this.getAllActiveTabs.find((el) => el.panel === this.tab);\n this.setActiveTab(tab);\n }\n\n @Watch('placement')\n handlePlacementChange() {\n this.syncActiveTabIndicator();\n }\n\n @Watch('noScrollControls')\n handleNoScrollControlsChange() {\n this.updateScrollControls();\n }\n\n @Watch('hideControlRight')\n hideRightBtn() {\n if (!this.rightBtn) return;\n displayTransition(this.rightBtn, 'is-shown', !this.hideControlRight);\n }\n\n @Watch('hideControlLeft')\n hideLeftBtn() {\n if (!this.leftBtn) return;\n displayTransition(this.leftBtn, 'is-shown', !this.hideControlLeft);\n }\n\n @Watch('hasScrollControls')\n watchScrollControls() {\n if (this.hasScrollControls) setTimeout((_) => this.handleTabScroll(), 20);\n else\n setTimeout((_) => {\n this.hideControlLeft = this.hideControlRight = true;\n }, 20);\n }\n\n /** Emitted when a tab is shown. */\n @Event() nanoTabShow: EventEmitter<{ name: string }>;\n\n /** Emitted when a tab is hidden. */\n @Event() nanoTabHide: EventEmitter<{ name: string }>;\n\n /** Emitted when the tab is closable and the close button is activated. */\n @Event() nanoTabWillClose: EventEmitter<{ name: string }>;\n\n /** Emitted when a closable tab is removed. */\n @Event() nanoTabClose: EventEmitter<{ name: string }>;\n\n /** Shows the specified tab panel. */\n @Method()\n async show(panel: string) {\n if (this.activeTab && this.activeTab.panel === panel) return;\n\n const tab = this.getAllActiveTabs.find((el) => el.panel === panel);\n\n if (tab) this.setActiveTab(tab);\n }\n\n // Internal Methods\n\n get getAllActiveTabs() {\n return this.getAllTabs.filter((el: any) => !el.disabled);\n }\n\n get getAllTabs() {\n return getDirectChildren<HTMLNanoTabElement>(this.host, 'nano-tab');\n }\n\n get getAllPanels() {\n return getDirectChildren<HTMLNanoTabContentElement>(\n this.host,\n 'nano-tab-content'\n );\n }\n\n get getActiveTab() {\n return this.getAllActiveTabs.find((el) => el.active);\n }\n\n private updateScrollControls = () => {\n if (this.noScrollControls) {\n this.hasScrollControls = false;\n } else {\n this.hasScrollControls =\n ['top'].includes(this.placement) &&\n this.nav.scrollWidth > this.nav.clientWidth &&\n this.nav.scrollWidth > this.tabs.clientWidth;\n }\n };\n\n private setActiveTab(tab: HTMLNanoTabElement, emitEvents = true) {\n if (\n tab &&\n tab !== this.activeTab &&\n !tab.disabled &&\n this.getAllActiveTabs.includes(tab)\n ) {\n const previousTab = this.activeTab;\n this.activeTab = tab;\n this.tab = tab.panel;\n\n // Sync tabs and panels\n this.getAllActiveTabs.map((el) => (el.active = el === this.activeTab));\n this.getAllPanels.map((el) => {\n if (el.name === this.activeTab.panel) {\n el.active = true;\n this.activePanel = el;\n } else el.active = false;\n el.removeAttribute('animation-dir');\n });\n\n this.syncActiveTabIndicator();\n\n // active tab can be changed on init - this won't be ready. No big thing\n if (this.nav && ['top'].includes(this.placement)) {\n scrollIntoView(this.activeTab, this.nav, 'horizontal', 'center');\n }\n\n // Emit events\n if (emitEvents) {\n if (previousTab) {\n this.nanoTabHide.emit({ name: previousTab.panel });\n }\n\n this.nanoTabShow.emit({ name: this.activeTab.panel });\n }\n }\n }\n\n private setAriaLabels() {\n const tabs = this.getAllActiveTabs;\n const panels = this.getAllPanels;\n\n // Link each tab with its corresponding panel\n tabs.map((tab) => {\n const panel = panels.find((el) => el.name === tab.panel);\n if (panel) {\n tab.setAttribute('aria-controls', panel.getAttribute('id'));\n panel.setAttribute('aria-labelledby', tab.getAttribute('id'));\n }\n });\n }\n\n private syncActiveTabIndicator() {\n this.getAllTabs.forEach((tab) =>\n tab.setAttribute(\n 'direction',\n this.placement === 'top' ? 'horizontal' : 'vertical'\n )\n );\n\n const tab = this.getActiveTab;\n if (!tab) return;\n\n const width = tab.shadowRoot.querySelector('.nanotab')?.clientWidth || 0;\n const height = tab.clientHeight;\n const offset = getOffset(tab, this.tabs);\n\n if (!this.activeTabIndicator) return;\n\n const offsetTop = offset.top + this.nav.scrollTop;\n const offsetLeft = offset.left;\n\n switch (this.placement) {\n case 'top':\n this.activeTabIndicator.style.width = `${width}px`;\n this.activeTabIndicator.style.height = null;\n this.activeTabIndicator.style.transform = `translateX(${offsetLeft}px)`;\n break;\n\n case 'start':\n this.activeTabIndicator.style.width = null;\n this.activeTabIndicator.style.height = `${height}px`;\n this.activeTabIndicator.style.transform = `translateY(${offsetTop}px)`;\n break;\n }\n }\n\n private getNavWidth() {\n if (!this.nav) return 0;\n const computedStyle = getComputedStyle(this.nav);\n let clientWidth = this.nav.clientWidth;\n return (clientWidth -=\n parseFloat(computedStyle.paddingLeft) +\n parseFloat(computedStyle.paddingRight));\n }\n\n // Event handlers\n\n @Listen('nanoTabClose')\n handleTabClose(ev: CustomEvent & { target: HTMLNanoTabElement }) {\n let tabIndex = this.getAllActiveTabs.indexOf(ev.target);\n const tab = ev.target;\n if (tabIndex < 0) return;\n\n const panel = this.getAllPanels.find((el) => el.name === tab.panel);\n if (!panel) return;\n\n ev.stopImmediatePropagation();\n\n const closeEv = this.nanoTabWillClose.emit({ name: tab.panel });\n if (closeEv.defaultPrevented) return;\n\n // Show the previous tab if the tab is currently active\n if (tab.active) {\n tabIndex = tabIndex === 0 ? 1 : tabIndex - 1;\n const prevTab = this.getAllActiveTabs[tabIndex]?.panel;\n if (prevTab) this.host.show(prevTab);\n }\n\n tab.remove();\n panel.remove();\n this.nanoTabClose.emit({ name: tab.panel });\n }\n\n private handleClick = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n const tab = target.closest('nano-tab');\n\n if (tab) this.setActiveTab(tab);\n };\n\n private handleKeyDown = (event: KeyboardEvent) => {\n const activeEl = document.activeElement as any;\n if (!activeEl || activeEl.tagName.toLowerCase() !== 'nano-tab') return;\n\n // Activate a tab\n if (['Enter', ' '].includes(event.key)) {\n const target = event.target as HTMLElement;\n const tab = target.closest('nano-tab');\n\n if (tab) {\n this.setActiveTab(tab);\n event.preventDefault();\n event.stopPropagation();\n }\n }\n\n // Move focus left or right\n if (\n ![\n 'ArrowLeft',\n 'ArrowRight',\n 'ArrowUp',\n 'ArrowDown',\n 'Home',\n 'End',\n ].includes(event.key)\n )\n return;\n\n const tabs = this.getAllActiveTabs;\n let index = tabs.indexOf(activeEl);\n\n if (event.key === 'Home') index = 0;\n if (event.key === 'End') index = tabs.length - 1;\n\n if (this.placement === 'top') {\n if (\n (this.isRtl && event.key === 'ArrowRight') ||\n (!this.isRtl && event.key === 'ArrowLeft')\n ) {\n index = Math.max(0, index - 1);\n }\n if (\n (this.isRtl && event.key === 'ArrowLeft') ||\n (!this.isRtl && event.key === 'ArrowRight')\n ) {\n index = Math.min(tabs.length - 1, index + 1);\n }\n }\n\n if (this.placement === 'start') {\n if (event.key === 'ArrowUp') index = Math.max(0, index - 1);\n if (event.key === 'ArrowDown')\n index = Math.min(tabs.length - 1, index + 1);\n }\n\n tabs[index].setFocus();\n\n if (this.placement === 'top') {\n scrollIntoView(tabs[index], this.nav, 'horizontal', 'center');\n }\n // need to stop bubbling otherwise it will focus on parent tabs if nested\n event.stopPropagation();\n // stop the browser moving about\n event.preventDefault();\n };\n\n private handleTabScroll = () => {\n if (!this.hasScrollControls) {\n this.hideControlLeft = this.hideControlRight = true;\n return;\n }\n const endRight = this.isRtl\n ? this.nav.scrollLeft === 0\n : this.nav.scrollWidth - this.nav.scrollLeft === this.nav.clientWidth;\n const endLeft = this.isRtl\n ? this.nav.scrollWidth + this.nav.scrollLeft === this.nav.clientWidth\n : this.nav.scrollLeft === 0;\n\n if (endLeft) {\n this.hideControlLeft = true;\n this.hideControlRight = false;\n } else if (endRight) {\n this.hideControlLeft = false;\n this.hideControlRight = true;\n } else {\n this.hideControlRight = false;\n this.hideControlLeft = false;\n }\n };\n\n private handleBtnClick = (goRight: boolean = false) => {\n const navWidth = this.getNavWidth();\n let leftAmt;\n if (goRight) leftAmt = this.nav.scrollLeft + navWidth - 20;\n else leftAmt = this.nav.scrollLeft - navWidth + 20;\n\n try {\n this.nav.scroll({\n left: leftAmt,\n behavior: 'smooth',\n });\n } catch (e) {\n this.nav.scrollLeft = leftAmt;\n }\n };\n\n private handleTouchStart = (event: TouchEvent) => {\n if (this.disableSwipe) return;\n const touch = event.changedTouches[0];\n this.initialTouchX = touch.pageX;\n this.initialTouchY = touch.pageY;\n };\n\n private handleTouchEnd = (event: TouchEvent) => {\n if (this.disableSwipe) return;\n const touch = event.changedTouches[0];\n const distX = touch.pageX - this.initialTouchX; // get horizontal dist traveled\n const distY = touch.pageY - this.initialTouchY; // get vertical dist traveled\n const threshold = 70;\n\n const xDiff = this.initialTouchX - touch.clientX;\n const yDiff = this.initialTouchY - touch.clientY;\n\n const isHorizontalSwipe =\n Math.abs(distX) >= threshold && Math.abs(distY) <= threshold;\n\n const tabs = this.getAllActiveTabs;\n const currIndex = tabs.findIndex((el) => el.active);\n\n if (isHorizontalSwipe) {\n const toGo =\n (distX < 0 && this.placement === 'top') ||\n (distX > 0 && this.placement !== 'top')\n ? 1\n : -1;\n\n if (tabs[currIndex + toGo]) {\n this.setActiveTab(tabs[currIndex + toGo]);\n\n if (Math.abs(xDiff) > Math.abs(yDiff)) {\n if (xDiff > 0) this.activePanel.setAttribute('animation-dir', 'left');\n else this.activePanel.setAttribute('animation-dir', 'right');\n }\n }\n }\n this.initialTouchX = null;\n this.initialTouchY = null;\n };\n\n private handleContentSlotChange = () => {\n setTimeout(() => {\n this.setAriaLabels();\n this.setActiveTab(this.getActiveTab || this.getAllActiveTabs[0], false);\n });\n };\n\n private handleTabSlotChange = (ev: Event & { target: HTMLSlotElement }) => {\n setTimeout(() => {\n this.setAriaLabels();\n this.handleTabScroll();\n this.setActiveTab(this.getActiveTab || this.getAllActiveTabs[0], false);\n this.updateScrollControls();\n }, 500);\n\n /** maintain a weakmap of mutation observers to maintain tab / indicator position on all changes. */\n const nodes = ev.target.assignedElements({ flatten: true });\n nodes.forEach((node) => {\n if (!this.mutationObservers.get(node)) {\n const mo = new MutationObserver(() => {\n setTimeout(() => {\n this.syncActiveTabIndicator();\n this.handleTabScroll();\n this.updateScrollControls();\n }, 500);\n });\n this.mutationObservers.set(node, mo);\n\n mo.observe(node, {\n characterData: true,\n childList: true,\n subtree: true,\n });\n }\n });\n };\n\n // Stencil hooks\n\n componentDidLoad() {\n // Initial IO - watching for all content to be loaded\n const observer = new IntersectionObserver((entries, observer) => {\n if (entries[0].intersectionRatio > 0) {\n this.setAriaLabels();\n this.setActiveTab(this.getActiveTab || this.getAllActiveTabs[0], false);\n\n if (this.storeId)\n ComponentStore.init(this, ['tab'], this.storeMethod, this.storeId);\n observer.unobserve(entries[0].target);\n }\n });\n observer.observe(this.host);\n\n requestAnimationFrame(() => this.updateScrollControls());\n\n if (!window['ResizeObserver']) return;\n\n this.resizeObserver = new ResizeObserver(() => {\n setTimeout(() => {\n this.updateScrollControls();\n this.syncActiveTabIndicator();\n scrollIntoView(this.activeTab, this.nav, 'horizontal', 'center');\n }, 500);\n });\n this.resizeObserver.observe(this.nav);\n }\n\n connectedCallback() {\n this.isRtl =\n this.host.dir === 'rtl' ||\n (this.host.ownerDocument as Document).dir === 'rtl';\n\n if (Build.isServer) {\n this.setActiveTab(this.getActiveTab || this.getAllActiveTabs[0], false);\n this.setAriaLabels();\n }\n }\n\n disconnectedCallback() {\n if (this.resizeObserver) this.resizeObserver.unobserve(this.nav);\n }\n\n render() {\n this.isRtl = (this.host.ownerDocument as Document).dir === 'rtl';\n\n return (\n <Host\n class={{ ...createColorClasses(this.color) }}\n dir={this.isRtl ? 'rtl' : null}\n >\n <div\n part=\"base\"\n class={{\n 'nano-tab-group': true,\n 'nano-tab-group--top': this.placement === 'top',\n 'nano-tab-group--start': this.placement === 'start',\n 'nano-tab-group--has-scroll-controls': this.hasScrollControls,\n 'nano-tab-group--has-scroll-controls-left': !this.hideControlLeft,\n 'nano-tab-group--has-scroll-controls-right': !this.hideControlRight,\n }}\n onClick={this.handleClick}\n onKeyDown={this.handleKeyDown}\n >\n <div class=\"nano-tab-group__nav-container\" part=\"nav\">\n {this.placement === 'top' && (\n <button\n disabled={!this.hasScrollControls}\n class={{\n 'nano-tab-group__scroll-button': true,\n 'nano-tab-group__scroll-button--left': true,\n }}\n ref={(btn) => (this.leftBtn = btn)}\n onClick={() => this.handleBtnClick(false)}\n >\n <nano-icon name=\"light/chevron-left\"></nano-icon>\n </button>\n )}\n <div\n ref={(el) => (this.nav = el)}\n class=\"nano-tab-group__nav\"\n onScroll={this.handleTabScroll}\n >\n <div\n ref={(el) => (this.tabs = el)}\n part=\"tabs\"\n class=\"nano-tab-group__tabs\"\n role=\"tablist\"\n aria-orientation={\n this.placement === 'start' ? 'vertical' : 'horizontal'\n }\n >\n <div\n ref={(el) => (this.activeTabIndicator = el)}\n part=\"active-tab-indicator\"\n class=\"nano-tab-group__active-tab-indicator\"\n />\n <slot name=\"tabs\" onSlotchange={this.handleTabSlotChange} />\n </div>\n </div>\n {this.placement === 'top' && (\n <button\n disabled={!this.hasScrollControls}\n class={{\n 'nano-tab-group__scroll-button': true,\n 'nano-tab-group__scroll-button--right': true,\n }}\n ref={(btn) => (this.rightBtn = btn)}\n onClick={() => this.handleBtnClick(true)}\n >\n <nano-icon name=\"light/chevron-right\"></nano-icon>\n </button>\n )}\n </div>\n <slot name=\"tab-content-header\" />\n <div\n part=\"body\"\n class=\"nano-tab-group__body\"\n onTouchStart={this.handleTouchStart}\n onTouchEnd={this.handleTouchEnd}\n >\n <slot onSlotchange={this.handleContentSlotChange} />\n </div>\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"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"}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"names":["async","clientFetch","url","_a","body","customConfig","__rest","headers","Accept","Cache","config","Object","assign","method","credentials","keepalive","mode","JSON","stringify","id","setTimeout","window","AbortController","controller","timeout","abort","signal","response","fetch","clearTimeout","ok","json","errorMessage","text","Error","globalNavCss","THRESHOLDBREAKS","about","main","login","search","icon","GlobalNav","constructor","hostRef","this","currSize","thresholdsGoingUp","THRESHOLDLIMIT","keys","length","autocompleteEles","currAIndex","isLoggedIn","myAccData","aboutNavItms","siteNavItms","loggedInNavItms","setResizingState","state","debounceSetResizingState","debounce","isResizing","onMenuBtnKeyDown","ev","key","modalOpen","menuClose","menuOpen","onMenuBtnClick","e","preventDefault","menuDiv","style","display","menuWrapDiv","focus","preventScroll","threshold","scrollHeight","innerHeight","document","overflow","menuFullScreen","overflowX","modalIsOpen","onMenuHidden","removeEventListener","activeElement","menuBtn","mainBarDiv","subMenuClose","target","closest","open","onUserBtnClick","userMenuOpen","onUserBtnKeyDown","onUserMenuBlur","relatedTarget","onSearchBtnClick","searchBarShown","searchbarShow","searchbarHide","onSearchBtnKeyDown","onSearchBarShown","searchBarEl","searchInput","setFocus","showAutocomplete","searchValInternal","addEventListener","onSearchBarHidden","height","onSearchInput","value","isSearchValSet","searchLoading","detail","type","onSearchChange","searchValue","autocompleteResults","nanoSearchReset","emit","currentIndex","currentSelectedIndex","processSearchResults","alogliaIndex","attributesToSnippet","hitsPerPage","filters","Math","floor","Date","now","console","error","scopeSearch","onSearchSubmit","showAutocompleteResults","algoliaSearchResults","queries","internalSearchIndeces","map","index","indexName","query","facets","algoliaClient","nanoSearchError","results","result","i","name","selected","domain","domains","allGroup","nanoSearchResult","client","apiKey","searchApiKey","appId","searchAppId","onSearchIndexChange","indexStr","selectedIndex","find","searchIndex","switchIndexSubmit","onAutocompleteBlur","hits","onAutocompleteInteract","testIndex","el","shadowRoot","found","ele","setActiveElement","click","assessSlottedContent","readTask","hasSiteSlot","querySelectorAll","hasLoggedinSlot","hasPromotionSlot","aboutSlotLen","iconSlotLen","mainSlotLen","overflowSlotLen","searchSlotLen","encodeURIComponent","location","href","protocol","host","bind","handleMyAccountData","myAccountData","user","links","myAccountUser","processMyAccLinks","processMyAccData","remoteDataReady","openClose","undefined","env","userProfileUrl","getMyAccountData","ssoDataUrl","import","foundIndex","changeInternalSearchVal","initAlgoliaClient","algoliasearch","addAlgoliaIndeces","addIndeces","searchIndeces","forEach","initIndex","thresholdChange","newThreshold","oldThreshold","ratioChange","intersectRatio","thresholdReady","menuItems","barItems","Array","from","push","writeTask","item","classList","add","remove","assessReady","ready","remoteReady","attachIO","isReady","nanoIsReady","setupAutocompleteBlur","closeSearchBar","secondaryMenuOpen","slotChange","thresholdClasses","classes","onWindowResize","innerWidth","secondaryOpen","secondaryMenu","stopPropagation","menuSelectedItems","menuContentDiv","minHeight","secondaryClose","force","composedPath","some","contains","requestAnimationFrame","displayTransition","userLinkPanel","widgetHeight","querySelector","toString","autocompleteSnippet","hit","lookFor","_snippetResult","prop","matchLevel","title","substring","resetHitFocus","autocompleteEle","setAttribute","io","root","IntersectionObserver","data","slice","intersectionRatio","observe","componentDidLoad","debounceResize","componentWillLoad","ComponentStore","init","disconnectedCallback","disconnect","mo","connectedCallback","getMyAccData","autocompleteList","content","scrollingUp","currentScopeHits","scopeChangeSuggestions","scopeSuggestReducer","total","currentSuggestReducer","reduce","scopeSuggestions","h","class","role","ref","a","tabindex","innerHTML","button","onClick","onMouseDown","hidden","onKeyDown","searchWidget","onSubmit","label","hideLabel","showInlineError","onNanoChange","mask","slot","placeholder","input","onNanoInput","onNanoFocus","render","isRtl","ownerDocument","dir","Host","join","resizing","div","part","activeMyAccountSections","includes","msgUrl","msgCount","cartUrl","cartCount","urls","ssoRedirect","onSlotchange","link","address","small_avatar_url","forgot_password","logout","quietMode","w","btn","showLogo","logoUrl","src","getAssetPath","alt","showSearch","_b","show","onTouchEnd","domainFor","origin","dm","multiResults","singleResult","match","indeces","api_key","app_id","cart","count","notifications","messages","area"],"sources":["./src/utils/fetch.ts","./src/components/global-nav/style/global-nav.scss?tag=nano-global-nav&encapsulation=shadow","./src/components/global-nav/global-nav.tsx"],"sourcesContent":["interface FetchInputConfig {\n body?: { [prop: string]: string };\n headers?: { [prop: string]: string };\n [prop: string]: any;\n}\n\nexport async function clientFetch(\n url: string,\n { body, ...customConfig }: FetchInputConfig = {}\n) {\n const headers: { [prop: string]: string } = {\n Accept: 'application/json, text/plain, */*',\n 'Access-Control-Allow-Origin': '*',\n 'Content-Type': 'application/json',\n Cache: 'no-cache',\n };\n const config: RequestInit = {\n method: body ? 'POST' : 'GET',\n credentials: 'include',\n keepalive: true,\n mode: 'cors',\n ...customConfig,\n headers: {\n ...headers,\n ...customConfig.headers,\n },\n };\n if (body) {\n config.body = JSON.stringify(body);\n }\n\n let id = setTimeout(() => {}, 0);\n if (window.AbortController) {\n const controller = new AbortController();\n const { timeout = 500 } = customConfig;\n id = setTimeout(() => controller.abort(), timeout);\n config.signal = controller.signal;\n }\n\n const response = await fetch(url, config);\n clearTimeout(id);\n\n if (response.ok) {\n return await response.json();\n } else {\n const errorMessage = await response.text();\n return new Error(errorMessage);\n }\n}\n","@use 'sass:map';\n@use 'sass:list';\n@use '../../../global/style/nano-theme/form' as nanoForm;\n\n// globals\n@import '../../../global/style/utilities/globals';\n@import '../../../global/style/nano-theme/base';\n@import '../../../global/style/nano-theme/colours';\n@import '../../../global/style/nano-theme/layers';\n\n// local\n@import 'setup';\n@import 'bar';\n@import 'burger';\n@import 'search';\n@import 'user';\n\n:host {\n /**\n * @prop --bar-vertical-padding: Defaults to 21px;\n * @prop --bar-item-spacing: Defaults to 16px;\n * @prop --bar-background: Defaults to white;\n * @prop --bar-text-color: Defaults to #196c82;\n * @prop --bar-color-shade: Defaults to rgb(19 89 111);\n * @prop --bar-color-tint: Defaults to rgb(19 89 111);\n * @prop --bar-color-focus: Defaults to #001a21;\n * @prop --bar-user-panel-bg: Defaults to #016d86;\n\n * @prop --menu-background: Defaults to #001a21;\n * @prop --menu-text-color: Defaults to white;\n * @prop --bar-dropdown-bg: Defaults to #196c82;\n * @prop --bar-dropdown-text: Defaults to white;\n * @prop --menu-user-profile-bg: Defaults to #001a21;\n * @prop --menu-user-panel-bg: Defaults to #193037;\n * @prop --menu-padding: Defaults to 12px;\n * @prop --menu-hint-color: Defaults to #33484d;\n * @prop --menu-title-text: Defaults to #{map.get($colors, lightblue)};\n * @prop --menu-icon-color: Defaults to white;\n\n * @prop --login-button-bg: Defaults to #17bb75;\n * @prop --login-button-text: Defaults to white;\n */\n\n --bar-vertical-padding: 21px;\n --bar-item-spacing: 13px;\n --bar-background: white;\n --bar-text-color: #196c82;\n --bar-color-shade: rgb(12 90 113);\n --bar-color-tint: rgb(19 89 111);\n --bar-color-focus: #99a3a6;\n --bar-user-panel-bg: #016d86;\n --bar-dropdown-bg: #196c82;\n --bar-dropdown-text: white;\n --menu-background: #001a21;\n --menu-text-color: white;\n --menu-user-profile-bg: #001a21;\n --menu-user-panel-bg: #193037;\n --menu-padding: 12px;\n --menu-hint-color: #33484d;\n --menu-title-text: #{map.get($colors, lightblue)};\n --menu-icon-color: white;\n --login-button-bg: #17bb75;\n --login-button-text: white;\n\n // not sure if this required any more.\n --padding: 12px;\n --padding-top: var(--padding);\n --padding-end: var(--padding);\n --padding-bottom: var(--padding);\n --padding-start: var(--padding);\n\n display: flex;\n flex-direction: column;\n position: relative;\n line-height: 1.5;\n height: 100%;\n font-size: 0.9375em;\n font-size: clamp(0.77rem, 1vw, 0.9rem);\n\n input,\n select,\n button {\n font-family: inherit;\n appearance: none;\n font-size: inherit;\n }\n\n a,\n button {\n &:focus {\n outline: none;\n }\n\n &:focus-visible {\n box-shadow: #{nanoForm.$control-focus-style};\n }\n }\n}\n","import {\n Component,\n h,\n Host,\n Element,\n State,\n Watch,\n Event,\n EventEmitter,\n Prop,\n Listen,\n Build,\n getAssetPath,\n readTask,\n writeTask,\n Method,\n VNode,\n ComponentInterface,\n} from '@stencil/core';\nimport algoliasearch from 'algoliasearch/dist/algoliasearch-lite.esm.browser';\nimport { clientFetch } from '../../utils/fetch';\nimport { ComponentStore } from '../../utils/store/component-store';\nimport { debounce } from '../../utils/throttle';\nimport { displayTransition } from '../../utils/transitions';\nimport type { SearchClient as AlgoliaClient } from 'algoliasearch/lite';\nimport type {\n InputChangeEventDetail,\n SelectChangeEventDetail,\n AlgoliaResults,\n SearchIndex,\n MyAccountLink,\n AloliaSearchResultDetail,\n AlgoliaMultiResult,\n MyAccountUser,\n MyAccountData,\n NavItemEventDetail,\n AlgoliaResultHit,\n AlgoliaNetworkError,\n AlgoliaMultiResults,\n} from '../../interface';\n\n// the 'breakpoints' where different segments of content go into or out-of the burger / overflow menu\nconst THRESHOLDBREAKS = {\n about: 0,\n main: 1,\n login: 2,\n search: 3,\n icon: 4,\n};\n\n/**\n * Nanopore digital global navigation and search bar.\n * Incorporates MyAccount / SSO states (messages / cart / user name etc).\n * Incorporates Algolia search.\n *\n * @slot main - main nav items. Should be used with nano-nav-item's\n * @slot icon - nano-nav-item's displayed alongside icon links that come from MyAccount\n * @slot loggedin - nano-nav-item's to display when users are signed in, alongside links from from MyAccount (within the overflow menu panel).\n * @slot about - nano-nav-item's to display with about links that come from MyAccount\n * @slot site - nano-nav-item's to display with site links that come from MyAccount\n * @slot overflow - items to always display in the overflow menu\n * @slot search - when not using myaccount search OR show-search=\"false\" you can utilise the search slot\n * @slot promotion - a free area for any promotional content, displayed within the overflow menu panel\n * @slot logo - when show-logo=\"false\" you can utilise the logo slot\n * @slot - if using search functionality, place a `<nano-search-results />` element in the default slot\n *\n * @part burger - the overflow / burger ui element\n * @part burger-menu - the overflow / burger menu\n * @part burger-actions-bar - the top bar of the overflow / burger menu\n * @part burger-content - the main content area of the overflow / burger menu\n * @part sticker - the `nano-sticker` wrapping the main nav-bar\n * @part bars - the main wrapper around the `main-bar` and `search-bar` nav bars\n * @part main-bar - the main nav menu bar\n * @part logo-link - the link wrapping the logo\n * @part search-bar - the search bar that appears under the main nav menu bar\n */\n@Component({\n tag: 'nano-global-nav',\n styleUrl: 'style/global-nav.scss',\n shadow: true,\n assetsDirs: ['assets'],\n})\nexport class GlobalNav implements ComponentInterface {\n // position and dimension state\n private io: IntersectionObserver;\n private debounceResize: () => {};\n private debounceSetResizingState: () => {};\n private currSize: number = 0;\n private thresholdsGoingUp: boolean = false;\n private THRESHOLDLIMIT = Object.keys(THRESHOLDBREAKS).length;\n\n // menu\n private menuDiv: HTMLElement;\n private menuBtn: HTMLButtonElement;\n private menuWrapDiv: HTMLDivElement;\n private menuContentDiv: HTMLDivElement;\n private menuSelectedItems: NodeListOf<HTMLNanoNavItemElement>;\n\n // search\n private searchBarEl: HTMLDivElement;\n private searchInput: HTMLNanoInputElement;\n private algoliaClient: AlgoliaClient;\n private currentIndex: SearchIndex;\n private autocompleteResults: AlgoliaResults | null;\n private autocompleteEles: Array<HTMLAnchorElement | HTMLButtonElement> = [];\n private currAIndex: number = -1;\n private algoliaSearchResults: AlgoliaMultiResults | null;\n private scopeSearch: AlgoliaMultiResults | null;\n\n // general\n private mainBarDiv: HTMLElement;\n // private barsDiv: HTMLDivElement;\n // private siteContent: HTMLDivElement;\n private userLinkPanel: HTMLDivElement;\n private isLoggedIn: boolean = false;\n\n private myAccData: MyAccountData = null;\n\n // myaccount links\n private aboutNavItms: MyAccountLink[] = [];\n private siteNavItms: MyAccountLink[] = [];\n private loggedInNavItms: MyAccountLink[] = [];\n\n constructor() {\n this.assessSlottedContent = debounce(\n this.assessSlottedContent.bind(this),\n 10\n );\n }\n\n // user profile link\n @State() userProfileUrl: string = '';\n\n // has slot tests\n private mo?: MutationObserver;\n @State() hasLoggedinSlot: boolean = false;\n @State() hasSiteSlot: boolean = false;\n @State() hasPromotionSlot: boolean = false;\n\n // slot item number tests\n @State() aboutSlotLen: number = 0;\n @State() iconSlotLen: number = 0;\n @State() mainSlotLen: number = 0;\n @State() overflowSlotLen: number = 0;\n @State() searchSlotLen: number = 0;\n\n // threshold / sizing\n @State() thresholdReady: boolean = false;\n @State() remoteDataReady: boolean = false;\n @State() ready: boolean = false;\n @State() isResizing: boolean = false;\n @State() intersectRatio: number;\n @State() threshold: number = this.THRESHOLDLIMIT;\n\n // modals state\n @State() modalOpen: boolean = false;\n @State() modalIsOpen: boolean = false;\n @State() searchBarShown: boolean = false;\n @State() scrollingUp: boolean = true;\n @State() showAutocomplete: boolean = false;\n @State() secondaryMenuOpen: HTMLNanoNavItemElement = null;\n @State() userMenuOpen: boolean = false;\n @State() menuFullScreen: boolean = false;\n\n // search\n @State() searchLoading: boolean = false;\n @State() searchValInternal: string = '';\n @State() internalSearchIndeces: Array<SearchIndex> = [];\n\n @Element() private el: HTMLNanoGlobalNavElement;\n\n /**\n * Connect to local, dev, test or prod MyAccount\n * environments to retrieve global nav / sso data.\n * Alternatively, you can use the `ssoDataUrl` prop.\n */\n @Prop() env?: 'local' | 'dev' | 'test' | 'prod' = 'prod';\n\n /**\n * A base url to retrieve global nav / sso data.\n * `nav_bar_data.json` will be appended to this url.\n * An alternative to the pre-defined `env` urls\n */\n @Prop() ssoDataUrl?: string;\n\n /**\n * An alternative to both 'env' and 'ssoDataUrl'.\n * You can directly provide a JSON object of myaccount data.\n * (e.g. https://myaccount.nanoporetech.com/nav_bar_data.json)\n * This is useful for SSR\n */\n @Prop() myAccountData: MyAccountData | null;\n @Watch('myAccountData')\n handleMyAccountData() {\n if (!this.myAccountData) return;\n\n if (!this.myAccountData.user || !this.myAccountData.links) return;\n\n this.myAccData = this.myAccountData;\n if (this.myAccData.user.id) {\n this.isLoggedIn = true;\n this.myAccountUser = this.myAccData.user;\n }\n\n this.processMyAccLinks();\n this.processMyAccData();\n this.remoteDataReady = true;\n }\n\n /**\n * Where to take user after SSO login\n */\n @Prop() ssoRedirect: string = encodeURIComponent(window.location.href);\n\n /**\n * Whether to attempt to get global nav / sso data from MyAccount\n */\n @Prop() getMyAccountData: boolean = true;\n\n /**\n * Active MyAccount link sections. By default all will show.\n */\n @Prop() activeMyAccountSections: (\n | 'about'\n | 'loggedin'\n | 'sites'\n | 'icons'\n )[] = null;\n\n /**\n * Whether to show search functionality\n */\n @Prop() showSearch: boolean = true;\n\n /**\n * Whether to show Nanopore logo\n */\n @Prop() showLogo: boolean = true;\n\n /**\n * The link to put on the logo\n */\n @Prop() logoUrl: string = location.protocol + '//' + location.host;\n\n /**\n * An array of Algolia search indexes (and optional display names). Will be automatically populated from MyAccount\n */\n @Prop() searchIndeces: Array<SearchIndex> = [];\n\n /**\n * Logged in user details automatically populated from MyAccount\n */\n @Prop({ mutable: true }) myAccountUser: MyAccountUser = null;\n\n /**\n * An Algolia App ID key. Will be automatically populated from MyAccount\n */\n @Prop({ mutable: true }) searchAppId: string;\n\n /**\n * An Algolia API Key. Will be automatically populated from MyAccount\n */\n @Prop({ mutable: true }) searchApiKey: string;\n\n /**\n * A search value to passed to Algolia to programmatically get or to preload search results\n */\n @Prop({ mutable: true }) searchValue: string = '';\n\n /**\n * Algolia search index to programmatically set or to set an initial index\n */\n @Prop({ mutable: true }) searchIndex: string = 'all_prod_en';\n\n /**\n * MyAccount store cart count.\n */\n @Prop({ mutable: true }) cartCount: number = 0;\n\n /**\n * MyAccount un-read message count.\n */\n @Prop({ mutable: true }) msgCount: number = 0;\n\n /**\n * Url to the Nanopore store cart. Will default to the url supplied by MyAccount\n */\n @Prop({ mutable: true }) cartUrl: string = null;\n\n /**\n * Url to the Nanopore message center. Will default to the url supplied by MyAccount\n */\n @Prop({ mutable: true }) msgUrl: string = null;\n\n /**\n * Emitted when the global nav is ready.\n */\n @Event() nanoIsReady!: EventEmitter<void>;\n\n /**\n * Emitted when search results are successfully returned from Algolia.\n */\n @Event() nanoSearchResult!: EventEmitter<AloliaSearchResultDetail>;\n\n /**\n * Emitted when algolia returns an error.\n */\n @Event() nanoSearchError!: EventEmitter<AlgoliaNetworkError>;\n\n /**\n * Emitted when search field is cleared.\n */\n @Event() nanoSearchReset!: EventEmitter<AloliaSearchResultDetail>;\n\n /**\n * Submit the search form (a search value must be present)\n */\n @Method()\n async submitSearch() {\n this.onSearchSubmit();\n this.showAutocomplete = false;\n return;\n }\n\n /**\n * Manually open or close the overflow (burger) menu\n * @param openClose - optionally force open (true) or close (false)\n */\n @Method()\n async toggleOverflowMenu(openClose?: boolean) {\n if (openClose === true || (openClose === undefined && !this.modalIsOpen)) {\n this.menuOpen();\n } else {\n this.menuClose(null, true);\n }\n }\n\n @Watch('env')\n @Watch('ssoDataUrl')\n async getMyAccData() {\n if (!!this.myAccData) return;\n\n switch (this.env) {\n case 'prod':\n this.userProfileUrl = 'https://myaccount.nanoporetech.com/';\n case 'local':\n case 'dev':\n case 'test':\n default:\n this.userProfileUrl = 'https://myaccount.nanoporetech.com/';\n break;\n }\n\n if (!this.getMyAccountData || this.myAccData) {\n this.remoteDataReady = true;\n return;\n }\n\n let url = this.ssoDataUrl;\n\n if (!url) {\n switch (this.env) {\n case 'dev':\n url = 'https://myaccount-dev.nanoporetech.com/';\n break;\n case 'test':\n url = 'https://myaccount-test.nanoporetech.com/';\n break;\n default:\n url = 'https://myaccount.nanoporetech.com/';\n break;\n }\n }\n\n const config = { timeout: 5000 };\n\n try {\n if (this.env === 'local') {\n this.myAccData = (await import(\n `./assets/local-my-account.json`\n )) as unknown as MyAccountData;\n } else {\n this.myAccData = await clientFetch(url + 'nav_bar_data.json', config);\n }\n if (this.myAccData.user.id) {\n this.isLoggedIn = true;\n this.myAccountUser = this.myAccData.user;\n }\n this.processMyAccLinks();\n this.processMyAccData();\n setTimeout(() => (this.remoteDataReady = true), 300);\n } catch (e) {\n console.error(e);\n this.remoteDataReady = true;\n }\n }\n\n @Watch('searchIndex')\n currentSelectedIndex() {\n if (!this.internalSearchIndeces.length) {\n return;\n }\n if (!this.searchIndex) return this.internalSearchIndeces[0];\n\n const foundIndex = this.internalSearchIndeces.find(\n (index) => index.index === this.searchIndex\n );\n\n if (!foundIndex) {\n this.currentIndex = this.internalSearchIndeces[0];\n console.error('index not found');\n return;\n }\n\n this.currentIndex = foundIndex;\n return foundIndex;\n }\n\n @Watch('searchValInternal')\n changeInternalSearchVal() {\n if (this.searchValInternal !== this.searchValue)\n this.searchValue = this.searchValInternal;\n }\n\n @Watch('searchApiKey')\n @Watch('searchAppId')\n initAlgoliaClient() {\n if (!this.searchAppId || !this.searchApiKey) return;\n\n this.algoliaClient = algoliasearch(this.searchAppId, this.searchApiKey);\n this.addAlgoliaIndeces();\n }\n\n @Watch('searchIndeces')\n addIndeces() {\n this.internalSearchIndeces = [\n ...this.internalSearchIndeces,\n ...this.searchIndeces,\n ];\n }\n\n @Watch('internalSearchIndeces')\n addAlgoliaIndeces() {\n if (!this.algoliaClient || !this.internalSearchIndeces.length) return;\n\n this.internalSearchIndeces.forEach((searchIndex) => {\n searchIndex.alogliaIndex = this.algoliaClient.initIndex(\n searchIndex.index\n );\n });\n if (!this.searchIndex)\n this.searchIndex = this.internalSearchIndeces[0].index;\n }\n\n @Watch('threshold')\n thresholdChange(newThreshold, oldThreshold) {\n if (newThreshold > oldThreshold) {\n // we've resized to larger screen.\n this.thresholdsGoingUp = true;\n this.setResizingState(true);\n }\n }\n\n /**\n * Primary logic for resizing changes.\n * When content doesn't fit - we loop down through break points until it does\n */\n @Watch('intersectRatio')\n ratioChange() {\n if (this.intersectRatio < 1 && this.threshold > 0) {\n // content doesn't fit\n if (this.thresholdsGoingUp) this.setResizingState(true);\n this.threshold--;\n setTimeout(() => this.ratioChange(), 500);\n } else {\n this.thresholdReady = true;\n\n // content now fits so add / remove context classes\n // on nav-items depending on whether they're added to bar or burger.\n\n let menuItems: Array<Element>, barItems: Array<Element>;\n readTask(() => {\n menuItems = [\n ...Array.from(this.el.querySelectorAll('nano-nav-item[slot=\"site\"]')),\n ...Array.from(\n this.el.querySelectorAll('nano-nav-item[slot=\"overflow\"]')\n ),\n ];\n barItems = [];\n\n if (this.threshold < this.THRESHOLDLIMIT - THRESHOLDBREAKS.icon)\n menuItems.push(\n ...Array.from(\n this.el.querySelectorAll('nano-nav-item[slot=\"icon\"]')\n )\n );\n else\n barItems.push(\n ...Array.from(\n this.el.querySelectorAll('nano-nav-item[slot=\"icon\"]')\n )\n );\n\n if (this.threshold < this.THRESHOLDLIMIT - THRESHOLDBREAKS.login)\n menuItems.push(\n ...Array.from(\n this.el.querySelectorAll('nano-nav-item[slot=\"loggedin\"]')\n )\n );\n else\n barItems.push(\n ...Array.from(\n this.el.querySelectorAll('nano-nav-item[slot=\"loggedin\"]')\n )\n );\n\n if (this.threshold < this.THRESHOLDLIMIT - THRESHOLDBREAKS.main)\n menuItems.push(\n ...Array.from(\n this.el.querySelectorAll('nano-nav-item[slot=\"main\"]')\n )\n );\n else\n barItems.push(\n ...Array.from(\n this.el.querySelectorAll('nano-nav-item[slot=\"main\"]')\n )\n );\n\n if (this.threshold < this.THRESHOLDLIMIT - THRESHOLDBREAKS.about)\n menuItems.push(\n ...Array.from(\n this.el.querySelectorAll('nano-nav-item[slot=\"about\"]')\n )\n );\n else\n barItems.push(\n ...Array.from(\n this.el.querySelectorAll('nano-nav-item[slot=\"about\"]')\n )\n );\n });\n\n writeTask(() => {\n menuItems.forEach((item) => {\n item.classList.add('nano-global-nav-menu');\n item.classList.remove('nano-global-nav-bar');\n });\n barItems.forEach((item) => {\n item.classList.remove('nano-global-nav-menu');\n item.classList.add('nano-global-nav-bar');\n });\n });\n }\n }\n\n @Watch('thresholdReady')\n @Watch('remoteDataReady')\n assessReady() {\n if (this.thresholdReady && this.remoteDataReady) {\n this.ready = true;\n }\n }\n\n @Watch('remoteDataReady')\n remoteReady() {\n this.attachIO();\n }\n\n @Watch('ready')\n isReady() {\n this.nanoIsReady.emit();\n }\n\n /**\n * Add / remove events when autocomplete results show / hide.\n */\n @Watch('showAutocomplete')\n setupAutocompleteBlur() {\n this.searchInput.clientWidth; // force reflow\n if (this.showAutocomplete) {\n this.el.shadowRoot.addEventListener('click', this.onAutocompleteBlur);\n } else {\n this.el.shadowRoot.removeEventListener('click', this.onAutocompleteBlur);\n }\n }\n\n @Watch('secondaryMenuOpen')\n closeSearchBar() {\n if (!!this.secondaryMenuOpen && this.searchBarShown) this.searchbarHide();\n }\n\n /**\n * As relevant slotted items change, reset resizing breakpoints\n */\n @Watch('aboutSlotLen')\n @Watch('iconSlotLen')\n @Watch('mainSlotLen')\n @Watch('overflowSlotLen')\n @Watch('searchSlotLen')\n slotChange() {\n this.threshold = this.THRESHOLDLIMIT;\n if (this.ready) this.ratioChange();\n }\n\n // General classes for visuals\n\n private thresholdClasses() {\n const classes = [];\n let i = 0;\n for (i; i < this.threshold; i++) classes.push('threshold-' + (i + 1));\n return classes;\n }\n\n /**\n * provides 'isResizing' - we use this to fade content out on 'breakpoint' increase\n * (when the screen size increases). Otherwise the stepping through of\n * breakpoints to calculate if content currently fits shows on screen (looks ugly)\n */\n private setResizingState = (state: boolean = false) => {\n if (typeof this.debounceSetResizingState === 'undefined') {\n this.debounceSetResizingState = debounce(this.setResizingState, 600);\n }\n if (state) {\n this.isResizing = true;\n this.debounceSetResizingState();\n } else {\n this.isResizing = false;\n this.thresholdsGoingUp = false;\n }\n };\n\n // Global DOM Events\n\n private onWindowResize() {\n if (\n this.threshold < this.THRESHOLDLIMIT &&\n window.innerWidth > this.currSize\n ) {\n this.threshold = this.THRESHOLDLIMIT;\n this.ratioChange();\n }\n this.currSize = window.innerWidth;\n this.searchBarShown = false;\n }\n\n // Burger / Overflow Menu\n\n // listen to nav-item secondary open / close events primarily for resizing the menu\n @Listen('nanoOpen')\n secondaryOpen(ev: CustomEvent & { target: HTMLNanoNavItemElement }) {\n if (!(ev.detail as NavItemEventDetail).secondaryMenu) return;\n ev.stopPropagation();\n this.secondaryMenuOpen = ev.target;\n\n if (!this.menuSelectedItems) {\n this.menuSelectedItems = this.el.querySelectorAll(\n 'nano-nav-item.selected'\n );\n this.menuSelectedItems.forEach((i) => i.classList.remove('selected'));\n this.menuSelectedItems.forEach((i) => (i.selected = false));\n }\n\n this.menuContentDiv.style.minHeight =\n (ev.detail as NavItemEventDetail).secondaryMenu.scrollHeight + 'px';\n }\n\n @Listen('nanoClose')\n secondaryClose(ev: CustomEvent & { target: HTMLNanoNavItemElement }) {\n if (!(ev.detail as NavItemEventDetail).secondaryMenu) return;\n ev.stopPropagation();\n\n setTimeout(() => {\n if (this.secondaryMenuOpen === ev.target && this.menuSelectedItems) {\n this.secondaryMenuOpen = null;\n this.menuContentDiv.style.minHeight = '';\n this.menuSelectedItems.forEach((i) => i.classList.add('selected'));\n this.menuSelectedItems.forEach((i) => (i.selected = true));\n this.menuSelectedItems = null;\n }\n }, 200);\n }\n\n private onMenuBtnKeyDown = (ev: KeyboardEvent) => {\n switch (ev.key) {\n case 'Enter':\n case ' ':\n this.modalOpen ? this.menuClose(ev, true) : this.menuOpen();\n break;\n }\n };\n\n private onMenuBtnClick = (ev: MouseEvent) => {\n this.menuClose(ev, true);\n };\n\n private menuOpen = (e?: MouseEvent) => {\n if (e) e.preventDefault();\n\n this.menuDiv.style.display = 'block';\n // need to open menu in stages\n // wait for re-flow after changing display\n // wait for repaint after animate, then focus\n\n this.modalOpen = true;\n this.menuDiv.clientWidth; // force reflow\n\n this.menuWrapDiv.focus({ preventScroll: true });\n if (\n this.threshold < 2 ||\n this.menuWrapDiv.scrollHeight > window.innerHeight\n ) {\n document.body.style.overflow = 'hidden';\n this.menuFullScreen = true;\n } else document.body.style.overflowX = 'hidden';\n\n setTimeout(() => (this.modalIsOpen = true), 300);\n };\n\n private onMenuHidden = () => {\n this.menuDiv.removeEventListener('transitionend', this.onMenuHidden);\n\n document.body.style.overflow = '';\n this.menuDiv.style.display = 'none';\n this.modalIsOpen = false;\n this.menuFullScreen = false;\n\n setTimeout(() => {\n if (document.activeElement === document.body && this.menuBtn)\n this.mainBarDiv.focus({ preventScroll: true });\n }, 50);\n };\n\n @Listen('click', { target: 'body' })\n menuClose(\n ev?: FocusEvent | MouseEvent | KeyboardEvent | TouchEvent,\n force: boolean = false\n ) {\n if (!this.modalIsOpen) return;\n\n if (force) {\n this.modalOpen = false;\n this.menuDiv.addEventListener('transitionend', this.onMenuHidden);\n return;\n }\n\n if (\n !ev\n .composedPath()\n .some(\n (el) =>\n el === this.menuContentDiv ||\n (el as Element).classList?.contains('gn-menu_actions')\n )\n ) {\n requestAnimationFrame(() => {\n if (!!this.secondaryMenuOpen) return;\n\n this.modalOpen = false;\n this.menuDiv.addEventListener('transitionend', this.onMenuHidden);\n });\n }\n }\n\n private subMenuClose = (ev?: MouseEvent) => {\n ev.preventDefault();\n (ev.target as HTMLNanoNavItemElement).closest('nano-nav-item').open = false;\n };\n\n // User profile menu\n\n private onUserBtnClick = (ev: MouseEvent) => {\n ev.preventDefault();\n this.userMenuOpen = !this.userMenuOpen;\n };\n\n private onUserBtnKeyDown = (ev: KeyboardEvent) => {\n switch (ev.key) {\n case 'Enter':\n case ' ':\n this.userMenuOpen = !this.userMenuOpen;\n break;\n }\n };\n\n private onUserMenuBlur = (ev: FocusEvent) => {\n if (!ev.relatedTarget) {\n this.userMenuOpen = false;\n return;\n }\n if (!!(ev.relatedTarget as HTMLElement).closest('.user-links-panel'))\n return false;\n this.userMenuOpen = false;\n };\n\n @Watch('userMenuOpen')\n async handleUserMenu() {\n await displayTransition(this.userLinkPanel, 'show', this.userMenuOpen);\n if (this.userMenuOpen) {\n this.userLinkPanel.focus();\n this.userLinkPanel.addEventListener('focusout', this.onUserMenuBlur);\n } else {\n this.userLinkPanel.removeEventListener('focusout', this.onUserMenuBlur);\n this.el.focus();\n }\n }\n\n // Search bar (smaller screens / mobile)\n\n private onSearchBtnClick = (ev: MouseEvent) => {\n ev.preventDefault();\n if (!this.searchBarShown) this.searchbarShow();\n else this.searchbarHide();\n };\n\n private onSearchBtnKeyDown = (ev: KeyboardEvent) => {\n switch (ev.key) {\n case 'Enter':\n case ' ':\n this.searchBarShown ? this.searchbarHide() : this.searchbarShow();\n break;\n }\n };\n\n private searchbarShow() {\n this.searchBarShown = true;\n this.searchBarEl.addEventListener('transitionend', this.onSearchBarShown);\n this.searchBarEl.style.display = 'block';\n\n setTimeout(() => {\n const widgetHeight =\n Math.floor(\n this.searchBarEl.querySelector('.search-widget').scrollHeight\n ) - 1;\n this.searchBarEl.style.height = widgetHeight.toString() + 'px';\n }, 50);\n }\n\n private onSearchBarShown = () => {\n this.searchBarEl.removeEventListener(\n 'transitionend',\n this.onSearchBarShown\n );\n if (this.searchInput) this.searchInput.setFocus();\n this.searchBarEl.style.overflow = 'visible';\n };\n\n private searchbarHide = (ev?: FocusEvent) => {\n if (\n ev &&\n ev.relatedTarget &&\n (ev.relatedTarget as HTMLElement).closest('#global-nav-search-bar')\n )\n return;\n\n this.showAutocomplete = false;\n if (this.searchValInternal.length && ev) return;\n\n this.searchBarEl.addEventListener('transitionend', this.onSearchBarHidden);\n this.searchBarEl.style.overflow = 'hidden';\n this.searchBarEl.style.height = '0px';\n };\n\n private onSearchBarHidden = () => {\n this.searchBarEl.removeEventListener(\n 'transitionend',\n this.onSearchBarHidden\n );\n this.searchBarEl.style.display = 'none';\n this.searchBarShown = false;\n };\n\n // Algolia search\n\n private autocompleteSnippet(hit: AlgoliaResultHit) {\n const lookFor = ['title']; // , 'body'\n if (hit._snippetResult) {\n const found = lookFor.find(\n (prop) =>\n hit._snippetResult[prop] &&\n hit._snippetResult[prop].matchLevel !== 'none'\n );\n\n if (found) {\n if (found !== 'title')\n return (\n (hit.title.length > 15\n ? hit.title.substring(0, 15) + ' ...'\n : hit.title) +\n ' ' +\n hit._snippetResult[found].value\n );\n else return hit._snippetResult['title'].value;\n }\n }\n return hit.title;\n }\n\n private onSearchInput = (ev: CustomEvent<InputEvent>) => {\n this.searchValInternal = this.searchInput.value;\n\n if (!this.isSearchValSet()) {\n this.searchLoading = false;\n return;\n }\n\n if (ev.detail.type === 'input') {\n this.showAutocomplete = false;\n this.searchLoading = true;\n }\n };\n\n private onSearchChange = async (ev?: CustomEvent<InputChangeEventDetail>) => {\n this.searchValInternal = this.searchValue = ev\n ? ev.detail.value\n : this.searchValInternal;\n this.showAutocomplete = false;\n this.autocompleteResults = null;\n\n if (!this.isSearchValSet()) {\n if (!this.searchValInternal.length) {\n this.nanoSearchReset.emit();\n }\n this.searchLoading = false;\n return;\n }\n if (!this.currentIndex) this.currentSelectedIndex();\n\n try {\n this.autocompleteResults = this.processSearchResults(\n (await this.currentIndex.alogliaIndex.search(this.searchValInternal, {\n attributesToSnippet: ['body:5', 'title:8'],\n hitsPerPage: 5,\n filters: 'created > ' + Math.floor((Date.now() - 63115200000) / 1000), // only get last 2 years\n })) as any\n ) as AlgoliaResults;\n } catch (e) {\n console.error(e);\n }\n\n this.scopeSearch = null;\n this.scopeSearch = await this.onSearchSubmit(null, false);\n\n this.searchLoading = false;\n this.showAutocompleteResults();\n };\n\n private onSearchSubmit = async (ev?, emit: boolean = true) => {\n if (ev) ev.preventDefault();\n if (!this.isSearchValSet()) return;\n this.searchLoading = true;\n this.algoliaSearchResults = null;\n\n if (!this.currentIndex) this.currentSelectedIndex();\n\n const queries = this.internalSearchIndeces.map((index) => {\n return {\n indexName: index.index,\n query: this.searchValInternal,\n facets: index.filters,\n hitsPerPage: 10,\n filters: 'created > ' + Math.floor((Date.now() - 63115200000) / 1000), // only get last 2 years\n };\n });\n\n try {\n this.algoliaSearchResults = this.processSearchResults(\n (await this.algoliaClient.search(queries)) as any\n ) as AlgoliaMultiResults;\n } catch (e) {\n this.nanoSearchError.emit(e as AlgoliaNetworkError);\n }\n this.searchLoading = false;\n if (!this.algoliaSearchResults) return;\n\n this.algoliaSearchResults.results.map((result, i) => {\n result.indexName = this.internalSearchIndeces[i].name;\n result.selected =\n this.currentIndex.name === this.internalSearchIndeces[i].name;\n result.domain = this.currentIndex.domain || null;\n result.domains = this.myAccData.domains || null;\n result.allGroup = !!this.internalSearchIndeces[i].allGroup;\n result.filters = this.internalSearchIndeces[i].filters;\n });\n\n if (emit) {\n this.nanoSearchResult.emit({\n results: this.algoliaSearchResults.results,\n client: { apiKey: this.searchApiKey, appId: this.searchAppId },\n });\n this.showAutocomplete = false;\n }\n return this.algoliaSearchResults;\n };\n\n private onSearchIndexChange = async (\n index: CustomEvent<SelectChangeEventDetail> | string\n ) => {\n const ev = index as CustomEvent<SelectChangeEventDetail>;\n let indexStr = index as string;\n\n if (!this.currentIndex) this.currentSelectedIndex();\n\n if (ev.detail && ev.detail.value.length)\n indexStr = ev.detail.value as string;\n if (!indexStr || !indexStr.length) return;\n if (this.currentIndex.index === indexStr) return;\n\n const selectedIndex = this.internalSearchIndeces.find(\n (index) => index.index === indexStr\n );\n if (!selectedIndex || !selectedIndex.alogliaIndex) return;\n\n this.searchIndex = selectedIndex.index;\n if (this.isSearchValSet()) await this.onSearchChange();\n };\n\n private isSearchValSet() {\n if (this.searchValInternal.length < 3) return false;\n return true;\n }\n\n private switchIndexSubmit = async (index: string) => {\n if (this.isSearchValSet()) {\n await this.onSearchIndexChange(index);\n this.onSearchSubmit();\n } else this.onSearchIndexChange(index);\n };\n\n // Autocomplete\n\n @Watch('showAutocomplete')\n resetHitFocus() {\n this.currAIndex = -1;\n }\n\n private onAutocompleteBlur = (ev: MouseEvent) => {\n if (!this.showAutocomplete || !this.autocompleteResults) return;\n if (ev && ev.target && (ev.target as HTMLElement).closest('.search-widget'))\n return;\n this.showAutocomplete = false;\n };\n\n private showAutocompleteResults = () => {\n if (!this.autocompleteResults || !this.autocompleteResults.hits) return;\n this.showAutocomplete = true;\n };\n\n private setActiveElement(\n autocompleteEle: HTMLAnchorElement | HTMLButtonElement\n ) {\n this.autocompleteEles.map((ele) =>\n ele.setAttribute('aria-selected', 'false')\n );\n autocompleteEle.focus({ preventScroll: true });\n autocompleteEle.setAttribute('aria-selected', 'true');\n }\n\n private onAutocompleteInteract = (ev: KeyboardEvent) => {\n // list open, navigate items with arrows\n if (!this.showAutocomplete || !this.autocompleteResults) return;\n let testIndex = this.currAIndex;\n\n switch (ev.key) {\n case 'Tab':\n setTimeout(() => {\n if (\n !this.el.shadowRoot.activeElement ||\n !this.el.shadowRoot.activeElement.closest('.search-widget')\n ) {\n this.showAutocomplete = false;\n return;\n } else {\n const found = this.autocompleteEles.find((ele, i) => {\n if (ele === this.el.shadowRoot.activeElement) {\n this.currAIndex = i;\n return true;\n }\n });\n if (found) this.setActiveElement(found);\n else this.currAIndex = -1;\n }\n });\n break;\n case 'ArrowDown':\n case 'ArrowUp':\n if (ev.key === 'ArrowDown') testIndex++;\n else if (ev.key === 'ArrowUp') testIndex--;\n\n const found = this.autocompleteEles[testIndex];\n if (\n found ||\n testIndex < 0 ||\n testIndex > this.autocompleteEles.length - 1\n )\n ev.preventDefault();\n this.searchInput.clientWidth; // force reflow\n\n if (found) {\n this.setActiveElement(found);\n this.currAIndex = testIndex;\n } else if (testIndex < 0) {\n this.searchInput.setFocus();\n this.currAIndex = -1;\n }\n break;\n case 'Enter':\n case ' ':\n if (this.autocompleteEles[this.currAIndex]) {\n this.autocompleteEles[this.currAIndex].click();\n }\n break;\n }\n };\n\n // Various.\n\n /**\n * Assesses what content is present in which slots\n */\n private assessSlottedContent = () => {\n readTask(() => {\n this.hasSiteSlot = !!this.el.querySelectorAll('[slot=\"site\"]').length;\n this.hasLoggedinSlot =\n !!this.el.querySelectorAll('[slot=\"loggedin\"]').length;\n this.hasPromotionSlot =\n !!this.el.querySelectorAll('[slot=\"promotion\"]').length;\n\n this.aboutSlotLen = this.el.querySelectorAll('[slot=\"about\"]').length;\n this.iconSlotLen = this.el.querySelectorAll('[slot=\"icon\"]').length;\n this.mainSlotLen = this.el.querySelectorAll('[slot=\"main\"]').length;\n this.overflowSlotLen =\n this.el.querySelectorAll('[slot=\"overflow\"]').length;\n this.searchSlotLen = this.el.querySelectorAll('[slot=\"search\"]').length;\n });\n };\n\n /**\n * Attach the IntersectionObserver - from which all threshold / breakpoint logic hinges\n */\n private attachIO() {\n if (this.io) return;\n const root = this.el.shadowRoot.querySelector('.global-nav .main-bar');\n if (\n Build.isBrowser &&\n typeof window !== 'undefined' &&\n (window as any).IntersectionObserver &&\n !!root\n ) {\n const io = (this.io = new (window as any).IntersectionObserver(\n (data: IntersectionObserverEntry[]) => {\n this.intersectRatio = data.slice(-1)[0].intersectionRatio;\n },\n { root, threshold: 1 }\n ));\n io.observe(root.querySelector('.measure-ele'));\n }\n }\n\n // Stencil Lifecycle / Rendering\n\n componentDidLoad() {\n if (Build.isBrowser) {\n this.debounceResize = debounce(this.onWindowResize.bind(this), 300);\n\n window.addEventListener('resize', this.debounceResize);\n this.currSize = window.innerWidth;\n }\n\n this.initAlgoliaClient();\n this.addAlgoliaIndeces();\n if (this.remoteDataReady) this.attachIO();\n }\n\n componentWillLoad() {\n ComponentStore.init(\n this,\n ['searchIndex', 'searchValue'],\n 'url-hash',\n 'gns'\n );\n\n this.assessSlottedContent();\n }\n\n disconnectedCallback() {\n if (this.io) {\n this.io.disconnect();\n this.io = undefined;\n }\n if (this.mo) {\n this.mo.disconnect();\n this.mo = undefined;\n }\n if (Build.isBrowser)\n window.removeEventListener('resize', this.debounceResize);\n }\n\n connectedCallback() {\n this.handleMyAccountData();\n this.getMyAccData();\n }\n\n // Render output\n\n private autocompleteList(): VNode {\n let content;\n if (this.showAutocomplete && this.scrollingUp) {\n let currentScopeHits = 0;\n let scopeChangeSuggestions = 0;\n\n const scopeSuggestReducer = (\n total: number,\n result: AlgoliaMultiResult\n ) => {\n return result.index !== this.currentIndex.index\n ? total + result.hits.length\n : total;\n };\n const currentSuggestReducer = (\n total: number,\n result: AlgoliaMultiResult\n ) => {\n return result.index === this.currentIndex.index\n ? total + result.hits.length\n : total;\n };\n\n if (this.scopeSearch) {\n scopeChangeSuggestions = this.scopeSearch.results.reduce(\n scopeSuggestReducer,\n 0\n );\n currentScopeHits = this.scopeSearch.results.reduce(\n currentSuggestReducer,\n 0\n );\n }\n\n if (\n (this.autocompleteResults && this.autocompleteResults.hits.length) ||\n (scopeChangeSuggestions && !currentScopeHits)\n ) {\n let scopeSuggestions = 0;\n\n content = (\n <div>\n {!currentScopeHits && (\n <div class=\"search-autocomplete-hit search-autocomplete-hit--no-result\">\n No results matching '{this.searchValInternal}' were found in{' '}\n <strong>{this.currentIndex.name}</strong>. Try another phrase.\n </div>\n )}\n {this.autocompleteResults && [\n this.autocompleteResults.hits.map((hit, i) => {\n return (\n <a\n role=\"option\"\n ref={(a) => this.autocompleteEles.push(a)}\n tabindex=\"-1\"\n id={'autocomplete-hit-' + i}\n href={hit.url}\n class=\"search-autocomplete-hit\"\n innerHTML={this.autocompleteSnippet(hit)}\n ></a>\n );\n }),\n ]}\n {(!currentScopeHits || this.currentIndex.allGroup) &&\n this.scopeSearch &&\n this.scopeSearch.results && [\n this.scopeSearch.results.map((result, i) => {\n if (\n !result.hits.length ||\n result.index === this.currentIndex.index ||\n scopeSuggestions > 1\n )\n return;\n scopeSuggestions++;\n return (\n <button\n role=\"option\"\n ref={(button) => this.autocompleteEles.push(button)}\n tabindex=\"-1\"\n id={'autocomplete-scope-' + i}\n class=\"search-autocomplete-hit\"\n onClick={() => this.switchIndexSubmit(result.index)}\n onMouseDown={() => this.switchIndexSubmit(result.index)}\n >\n \"{this.searchValInternal}\"{' '}\n <div class=\"search-autocomplete-hit-scope\">\n in {result.indexName}\n </div>\n </button>\n );\n }),\n ]}\n {!!currentScopeHits && (\n <div class=\"search-autocomplete-foot\">\n <button\n role=\"option\"\n class=\"search-autocomplete-submit\"\n ref={(button) => this.autocompleteEles.push(button)}\n id={'autocomplete-foot'}\n onClick={this.onSearchSubmit}\n onMouseDown={this.onSearchSubmit}\n >\n View all results\n </button>\n </div>\n )}\n </div>\n );\n } else if (!currentScopeHits) {\n content = (\n <div class=\"search-autocomplete-hit search-autocomplete-hit--no-result\">\n No results matching '{this.searchValInternal}' were found. Try\n another phrase.\n </div>\n );\n }\n }\n\n return (\n <div\n class=\"search-autocomplete\"\n role=\"listbox\"\n id=\"autocomplete-results\"\n aria-expanded={this.showAutocomplete ? 'true' : 'false'}\n hidden={!this.showAutocomplete}\n onKeyDown={this.onAutocompleteInteract}\n >\n {content}\n </div>\n );\n }\n\n private searchWidget(): VNode[] {\n return [\n <form\n class=\"search-inputs\"\n onSubmit={this.onSearchSubmit}\n id=\"global-nav-search\"\n >\n <nano-select\n class=\"search-input\"\n label=\"Which area of content would you like to search?\"\n hideLabel={true}\n showInlineError={false}\n value={this.searchIndex}\n onNanoChange={this.onSearchIndexChange}\n mask={true}\n >\n {this.internalSearchIndeces.map((index) => {\n return (\n <nano-option\n selected={index.index === this.searchIndex}\n value={index.index}\n >\n {index.name || index.index}\n </nano-option>\n );\n })}\n <nano-icon\n name=\"light/chevron-down\"\n class=\"select-input__arrow\"\n slot=\"down-arrow\"\n />\n </nano-select>\n <nano-input\n class=\"search-input\"\n label=\"What would you like to search for?\"\n aria-label=\"What would you like to search for\"\n hideLabel={true}\n showInlineError={false}\n clear-input\n placeholder=\"Search Nanopore\"\n type=\"text\"\n ref={(input) => (this.searchInput = input)}\n onNanoChange={this.onSearchChange}\n onNanoInput={this.onSearchInput}\n onKeyDown={this.onAutocompleteInteract}\n debounce={500}\n aria-autocomplete=\"list\"\n aria-activedescendant={\n this.autocompleteEles[this.currAIndex]\n ? this.autocompleteEles[this.currAIndex].id\n : false\n }\n aria-controls=\"autocomplete-results\"\n onNanoFocus={this.showAutocompleteResults}\n value={this.searchValue}\n role=\"textbox\"\n >\n <button\n class={{\n 'search-icon': true,\n 'search-icon--search': true,\n 'search-icon--show': !!this.searchValue && !this.searchLoading,\n }}\n slot=\"end\"\n onMouseDown={(e) => {\n this.searchValInternal = this.searchInput.value;\n this.onSearchSubmit(e, true);\n }}\n >\n <nano-icon name=\"light/search\"></nano-icon>\n </button>\n <span\n class={{\n 'search-icon': true,\n 'search-icon--loader': true,\n 'search-icon--show': this.searchLoading,\n }}\n slot=\"end\"\n >\n <nano-icon name=\"light/spinner-third\"></nano-icon>\n </span>\n </nano-input>\n <input type=\"submit\" />\n </form>,\n ];\n }\n\n render() {\n this.autocompleteEles = [];\n const isRtl = (this.el.ownerDocument as Document).dir === 'rtl';\n\n const searchWidget = this.searchWidget();\n searchWidget.push(this.autocompleteList());\n\n return (\n <Host\n class={{\n [this.thresholdClasses().join(' ')]: true,\n ready: this.ready,\n 'search-bar-shown': this.searchBarShown && this.scrollingUp,\n 'search-auto-complete-shown':\n this.showAutocomplete && this.scrollingUp,\n 'modal-open': this.modalIsOpen,\n resizing: this.isResizing,\n }}\n dir={isRtl ? 'rtl' : null}\n >\n <div\n class={{\n 'global-nav': true,\n 'scrolling-down': !this.scrollingUp,\n }}\n >\n {/* START BURGER / OVERFLOW MENU */}\n <nav\n id=\"global-nav-menu\"\n class={{\n 'gn-menu': true,\n open: this.modalOpen,\n 'has-promotion': this.hasPromotionSlot,\n 'menu-full-screen': this.menuFullScreen,\n 'secondary-open': !!this.secondaryMenuOpen,\n }}\n aria-expanded={this.modalOpen ? 'true' : 'false'}\n ref={(div) => (this.menuDiv = div)}\n part=\"burger\"\n >\n <div\n class=\"gn-menu_wrap\"\n ref={(div) => (this.menuWrapDiv = div)}\n tabindex=\"-1\"\n part=\"burger-menu\"\n >\n <div class=\"gn-menu_actions\" part=\"burger-actions-bar\">\n <button\n class=\"menu-btn icon-btn icon-btn\"\n onMouseDown={this.onMenuBtnClick}\n onKeyDown={this.onMenuBtnKeyDown}\n >\n {this.threshold < this.THRESHOLDLIMIT - 3 && (\n <nano-icon\n name=\"light/times\"\n aria-label=\"close menu\"\n ></nano-icon>\n )}\n {this.threshold >= this.THRESHOLDLIMIT - 3 && (\n <nano-icon\n name=\"light/bars\"\n aria-label=\"close menu\"\n ></nano-icon>\n )}\n </button>\n\n {this.threshold <\n this.THRESHOLDLIMIT - THRESHOLDBREAKS.icon && [\n !!this.iconSlotLen && <slot name=\"icon\" />,\n this.myAccData &&\n (!this.activeMyAccountSections ||\n this.activeMyAccountSections.includes('icons')) && [\n this.msgUrl && (\n <a href={this.msgUrl} class=\"icon-btn\">\n <nano-icon name=\"light/bell\"></nano-icon>\n {this.msgCount > 0 && (\n <span class=\"gn-menu_actions-counter\">\n {this.msgCount}\n </span>\n )}\n </a>\n ),\n this.cartUrl && (\n <a href={this.cartUrl} class=\"icon-btn\">\n <nano-icon name=\"light/shopping-cart\"></nano-icon>\n {this.cartCount > 0 && (\n <span class=\"gn-menu_actions-counter\">\n {this.cartCount}\n </span>\n )}\n </a>\n ),\n ],\n ]}\n\n {this.myAccData && this.myAccData.urls.login && (\n <a\n href={this.myAccData.urls.login + this.ssoRedirect}\n class=\"login-btn\"\n >\n Login / Register{' '}\n <nano-icon name=\"solid/chevron-right\"></nano-icon>\n </a>\n )}\n </div>\n\n <div\n class=\"content-wrap\"\n ref={(div) => (this.menuContentDiv = div)}\n >\n <div class=\"content\" part=\"burger-content\">\n <nav class=\"nav-links nav-links--main\" role=\"menu\">\n <slot\n name=\"overflow\"\n onSlotchange={this.assessSlottedContent}\n />\n {this.threshold <\n this.THRESHOLDLIMIT - THRESHOLDBREAKS.main &&\n !!this.mainSlotLen && (\n <slot\n name=\"main\"\n onSlotchange={this.assessSlottedContent}\n />\n )}\n </nav>\n\n {/* ABOUT AND SITE MENU IN BURGER */}\n {(((!!this.aboutSlotLen || !!this.aboutNavItms.length) &&\n this.hasSiteSlot) ||\n !!this.siteNavItms.length) && (\n <div>\n {/* SITES MENU (Always in burger) */}\n {(this.hasSiteSlot || !!this.siteNavItms.length) && [\n (this.threshold >= this.THRESHOLDLIMIT - 2 ||\n this.mainSlotLen < 2) &&\n this.overflowSlotLen < 2 && (\n <div class=\"nav-links-wrap\">\n <h4 class=\"nav-links_title nav-links_title--sites\">\n Sites\n </h4>\n <nav\n class=\"nav-links nav-links--sub nav-links--sites\"\n aria-label=\"Different company site links\"\n >\n <slot\n name=\"site\"\n onSlotchange={this.assessSlottedContent}\n />\n {this.siteNavItms.map((link) => {\n return (\n <nano-nav-item class=\"nano-global-nav nano-global-nav-menu\">\n <a\n href={link.address}\n target={link.target}\n >\n {link.title}\n </a>\n </nano-nav-item>\n );\n })}\n </nav>\n </div>\n ),\n ((this.threshold < this.THRESHOLDLIMIT - 2 &&\n this.mainSlotLen >= 2) ||\n this.overflowSlotLen >= 2) && (\n <nav\n class=\"nav-links\"\n aria-label=\"Different company site links\"\n >\n <nano-nav-item class=\"nano-global-nav nano-global-nav-menu\">\n Sites\n <nano-icon\n slot=\"icon-end\"\n name=\"solid/chevron-right\"\n ></nano-icon>\n <div slot=\"secondary\">\n <div class=\"content\">\n <button\n class=\"back-btn\"\n onClick={this.subMenuClose}\n >\n <nano-icon\n slot=\"icon-end\"\n name=\"solid/chevron-left\"\n aria-label=\"go back\"\n ></nano-icon>\n Sites\n </button>\n <div class=\"content--sub\">\n <slot\n name=\"site\"\n onSlotchange={this.assessSlottedContent}\n />\n {this.siteNavItms.map((link) => {\n return (\n <nano-nav-item class=\"nano-global-nav nano-global-nav-menu\">\n <a\n href={link.address}\n target={link.target}\n >\n {link.title}\n </a>\n </nano-nav-item>\n );\n })}\n </div>\n </div>\n </div>\n </nano-nav-item>\n </nav>\n ),\n ]}\n </div>\n )}\n </div>\n\n {/* USER PROFILE IN BURGER */}\n {this.isLoggedIn &&\n this.threshold <\n this.THRESHOLDLIMIT - THRESHOLDBREAKS.login &&\n (this.loggedInNavItms.length || this.hasLoggedinSlot) && (\n <nav class=\"nav-links\" aria-label=\"Your user account links\">\n <nano-nav-item class=\"nano-global-nav user-nav nano-global-nav-menu\">\n {this.myAccountUser.name}\n <nano-icon\n slot=\"icon-end\"\n name=\"solid/chevron-right\"\n ></nano-icon>\n <div slot=\"secondary\">\n <div class=\"content\">\n <button\n class=\"back-btn\"\n onClick={this.subMenuClose}\n >\n <nano-icon\n slot=\"icon-end\"\n name=\"solid/chevron-left\"\n aria-label=\"go back\"\n ></nano-icon>\n {this.myAccountUser.name}\n </button>\n {!!this.myAccountUser?.small_avatar_url && (\n <nano-global-nav-user-profile\n myAccountUser={this.myAccountUser}\n userProfileUrl={this.userProfileUrl}\n ></nano-global-nav-user-profile>\n )}\n <div class=\"content--sub\">\n <slot\n name=\"loggedin\"\n onSlotchange={this.assessSlottedContent}\n />\n {this.loggedInNavItms.map((link) => {\n return (\n <nano-nav-item class=\"nano-global-nav nano-global-nav-menu\">\n <a href={link.address} target={link.target}>\n {link.title}\n </a>\n </nano-nav-item>\n );\n })}\n <nano-nav-item class=\"nano-global-nav nano-global-nav-menu\">\n <a\n href={\n this.myAccData.urls.forgot_password +\n this.ssoRedirect\n }\n >\n Change Password\n </a>\n </nano-nav-item>\n </div>\n </div>\n </div>\n </nano-nav-item>\n </nav>\n )}\n\n <slot\n name=\"promotion\"\n onSlotchange={this.assessSlottedContent}\n />\n\n {this.myAccData && this.myAccData.urls.logout && (\n <div class=\"login-btn logout-btn\">\n <a href={this.myAccData.urls.logout + this.ssoRedirect}>\n Logout\n </a>\n </div>\n )}\n </div>\n </div>\n </nav>\n {/* END BURGER / OVERFLOW MENU */}\n\n {/* START MAIN NAV BAR */}\n <div class=\"sticker-trigger\" />\n <nano-sticker\n auto-resize=\"false\"\n break-point-max=\"800\"\n quietMode={{ h: 600, w: 800 }}\n part=\"sticker\"\n >\n <div class=\"bars\" part=\"bars\">\n <nav\n part=\"main-bar\"\n class=\"main-bar\"\n aria-label=\"Main site navigation\"\n tabindex=\"-1\"\n ref={(div) => (this.mainBarDiv = div)}\n >\n {(this.hasPromotionSlot ||\n !!this.overflowSlotLen ||\n ((this.myAccData || !!this.iconSlotLen) &&\n this.threshold <\n this.THRESHOLDLIMIT - THRESHOLDBREAKS.icon) ||\n (this.isLoggedIn &&\n (!!this.loggedInNavItms.length || this.hasLoggedinSlot) &&\n this.threshold <\n this.THRESHOLDLIMIT - THRESHOLDBREAKS.login) ||\n (!!this.mainSlotLen &&\n this.threshold <\n this.THRESHOLDLIMIT - THRESHOLDBREAKS.main) ||\n ((!!this.aboutSlotLen || !!this.aboutNavItms.length) &&\n this.threshold <\n this.THRESHOLDLIMIT - THRESHOLDBREAKS.about) ||\n this.hasSiteSlot ||\n !!this.siteNavItms.length) && (\n <button\n class=\"menu-btn icon-btn\"\n onMouseDown={this.menuOpen}\n onKeyDown={this.onMenuBtnKeyDown}\n aria-expanded={this.modalOpen ? 'true' : 'false'}\n aria-controls=\"global-nav-menu\"\n ref={(btn) => (this.menuBtn = btn)}\n >\n <nano-icon\n name=\"light/bars\"\n aria-label=\"open menu\"\n ></nano-icon>\n </button>\n )}\n\n {this.showLogo && (\n <a href={this.logoUrl} class=\"logo-link\" part=\"logo-link\">\n <img\n src={getAssetPath(`../nano-assets/ont-logo.svg`)}\n alt=\"Oxford Nanopore Technologies Logo\"\n class=\"logo\"\n />\n </a>\n )}\n {!this.showLogo && (\n <div class=\"logo-link\">\n <slot\n name=\"logo\"\n onSlotchange={this.assessSlottedContent}\n />\n </div>\n )}\n\n <div class=\"nav-links nav-links--main\">\n <slot name=\"main\" onSlotchange={this.assessSlottedContent} />\n </div>\n\n {/* search widget displayed in the bar (there is enough space to show it) */}\n {this.mainSlotLen === 0 &&\n this.threshold >=\n this.THRESHOLDLIMIT - THRESHOLDBREAKS.search && [\n this.showSearch && !!this.internalSearchIndeces.length && (\n <div\n class=\"search-widget\"\n role=\"combobox\"\n aria-owns=\"autocomplete-results\"\n aria-expanded={\n this.showAutocomplete && this.autocompleteResults\n ? 'true'\n : 'false'\n }\n >\n {searchWidget}\n </div>\n ),\n (!this.showSearch || !this.myAccData) &&\n !!this.searchSlotLen && (\n <slot\n name=\"search\"\n onSlotchange={this.assessSlottedContent}\n />\n ),\n ]}\n\n {/* Bar Icon buttons */}\n\n {/* Bar search icon button (when not enough to show search in bar) */}\n {(this.mainSlotLen > 0 ||\n this.threshold <\n this.THRESHOLDLIMIT - THRESHOLDBREAKS.search) &&\n ((this.showSearch && !!this.internalSearchIndeces.length) ||\n !!this.searchSlotLen) && (\n <button\n class={{\n 'icon-btn': true,\n 'search-btn': true,\n 'search-btn--open': this.searchBarShown,\n }}\n aria-controls=\"global-nav-search-bar\"\n aria-expanded={this.searchBarShown ? 'true' : 'false'}\n onMouseDown={this.onSearchBtnClick}\n onKeyDown={this.onSearchBtnKeyDown}\n >\n <nano-icon name=\"light/search\"></nano-icon>\n </button>\n )}\n\n {/* Bar cart and notifications */}\n {this.threshold >=\n this.THRESHOLDLIMIT - THRESHOLDBREAKS.icon && [\n !!this.iconSlotLen && <slot name=\"icon\" />,\n this.myAccData &&\n (!this.activeMyAccountSections ||\n this.activeMyAccountSections.includes('icons')) && [\n this.msgUrl && (\n <a href={this.msgUrl} class=\"icon-btn\">\n <nano-icon name=\"light/bell\"></nano-icon>\n {this.msgCount > 0 && (\n <span class=\"gn-menu_actions-counter\">\n {this.msgCount}\n </span>\n )}\n </a>\n ),\n this.cartUrl && !!this.cartCount && (\n <a href={this.cartUrl} class=\"icon-btn\">\n <nano-icon name=\"light/shopping-cart\"></nano-icon>\n {this.cartCount > 0 && (\n <span class=\"gn-menu_actions-counter\">\n {this.cartCount}\n </span>\n )}\n </a>\n ),\n ],\n ]}\n\n {/* Bar about links */}\n {(!!this.aboutSlotLen || !!this.aboutNavItms.length) &&\n this.threshold >=\n this.THRESHOLDLIMIT - THRESHOLDBREAKS.about && (\n <nav\n class=\"nav-links nav-links--sub\"\n aria-label=\"About the company. Links\"\n role=\"menu\"\n >\n <slot\n name=\"about\"\n onSlotchange={this.assessSlottedContent}\n />\n {!!this.aboutNavItms.length && (\n <nano-nav-item class=\"nano-global-nav nano-global-nav-bar\">\n <a\n href={this.aboutNavItms[0].address}\n target={this.aboutNavItms[0].target}\n >\n {this.aboutNavItms[0].title}\n </a>\n </nano-nav-item>\n )}\n </nav>\n )}\n\n {/* Bar login button / User panel */}\n {this.myAccData &&\n (!this.activeMyAccountSections ||\n this.activeMyAccountSections.includes('loggedin')) &&\n this.threshold >=\n this.THRESHOLDLIMIT - THRESHOLDBREAKS.login && [\n this.myAccData.urls.login && (\n <a\n href={this.myAccData.urls.login + this.ssoRedirect}\n class=\"login-btn\"\n >\n Login / Register\n </a>\n ),\n this.myAccountUser && (\n <div class=\"user-links\">\n <button\n class={{\n 'icon-btn': true,\n 'user-links-btn': true,\n open: this.userMenuOpen,\n }}\n onMouseDown={this.onUserBtnClick}\n onKeyDown={this.onUserBtnKeyDown}\n >\n {' '}\n {this.myAccountUser.name}\n <nano-icon name=\"solid/caret-down\"></nano-icon>\n </button>\n <div\n class=\"user-links-panel\"\n tabindex=\"-1\"\n ref={(div) => (this.userLinkPanel = div)}\n >\n {!!this.myAccountUser?.small_avatar_url && (\n <nano-global-nav-user-profile\n myAccountUser={this.myAccountUser}\n userProfileUrl={this.userProfileUrl}\n ></nano-global-nav-user-profile>\n )}\n <div class=\"user-links-panel-content\">\n {this.loggedInNavItms.map((link) => {\n return (\n <a href={link.address} target={link.target}>\n {link.title}\n </a>\n );\n })}\n </div>\n <div class=\"user-links-panel-foot\">\n <a\n href={\n this.myAccData.urls.forgot_password +\n this.ssoRedirect\n }\n >\n Change Password\n </a>\n <a\n href={\n this.myAccData.urls.logout + this.ssoRedirect\n }\n >\n Logout\n </a>\n </div>\n </div>\n </div>\n ),\n ]}\n <span class=\"measure-ele\"></span>\n </nav>\n\n {/* Search widget shown in bar underneath main bar when there is not enough space */}\n {(this.mainSlotLen > 0 ||\n this.threshold <\n this.THRESHOLDLIMIT - THRESHOLDBREAKS.search) && (\n <div\n id=\"global-nav-search-bar\"\n class={{\n 'search-bar': true,\n show: this.searchBarShown,\n }}\n aria-expanded={this.searchBarShown ? 'true' : 'false'}\n role=\"region\"\n tabindex=\"-1\"\n ref={(div) => (this.searchBarEl = div)}\n part=\"search-bar\"\n >\n <div class=\"search-widget\">\n {this.showSearch && !!this.internalSearchIndeces.length && (\n <div>{searchWidget}</div>\n )}\n {(!this.showSearch || !this.myAccData) &&\n !!this.searchSlotLen && (\n <slot\n name=\"search\"\n onSlotchange={this.assessSlottedContent}\n />\n )}\n </div>\n </div>\n )}\n </div>\n </nano-sticker>\n {/* END MAIN NAV BAR */}\n\n {(this.threshold < this.THRESHOLDLIMIT - 3 ||\n this.menuFullScreen) && (\n <div\n class={{\n mask: true,\n open: this.modalOpen,\n }}\n onClick={this.menuClose}\n onTouchEnd={this.menuClose}\n ></div>\n )}\n </div>\n <div class=\"site-content\">\n <slot />\n </div>\n </Host>\n );\n }\n\n // Data processing\n\n private domainFor(origin: string): string {\n if (!this.myAccData) return '';\n const domain = this.myAccData.domains.find((dm) => dm.origin === origin);\n return domain ? domain.domain : '';\n }\n\n private processSearchResults(results: AlgoliaMultiResults | AlgoliaResults) {\n const multiResults = results as AlgoliaMultiResults;\n const singleResult = results as AlgoliaResults;\n\n if (multiResults.results) {\n multiResults.results.forEach((result, i) => {\n multiResults.results[i] = this.processSearchResults(\n result\n ) as AlgoliaResults;\n });\n return multiResults;\n } else {\n singleResult.hits.map((hit) => {\n if (hit.url && !hit.url.match(/^http/))\n hit.url =\n location.protocol + '//' + this.domainFor(hit.origin) + hit.url;\n });\n return singleResult;\n }\n }\n\n private processMyAccData() {\n if (!this.myAccData || !this.myAccData.search.indeces.length) return;\n\n if (this.myAccData.search.api_key)\n this.searchApiKey = this.myAccData.search.api_key;\n if (this.myAccData.search.app_id)\n this.searchAppId = this.myAccData.search.app_id;\n\n if (this.myAccData.cart.count) this.cartCount = this.myAccData.cart.count;\n if (this.myAccData.notifications.count)\n this.msgCount = this.myAccData.notifications.count;\n\n if (!this.searchAppId || !this.searchApiKey) return;\n this.internalSearchIndeces = [\n ...this.myAccData.search.indeces,\n ...this.searchIndeces,\n ];\n\n if (this.myAccData.urls.cart && !this.cartUrl)\n this.cartUrl = this.myAccData.urls.cart;\n if (this.myAccData.urls.messages && !this.msgUrl)\n this.msgUrl = this.myAccData.urls.messages;\n }\n\n private processMyAccLinks() {\n if (!this.myAccData.links || !this.myAccData.links.length) return;\n\n this.myAccData.links.forEach((link) => {\n switch (link.area) {\n case 'left-side-logged-in':\n case 'left-side-logged-out':\n if (\n this.activeMyAccountSections &&\n !this.activeMyAccountSections.includes('sites')\n )\n break;\n if (this.isLoggedIn && link.area === 'left-side-logged-in')\n this.siteNavItms.push(link);\n else if (!this.isLoggedIn && link.area === 'left-side-logged-out')\n this.siteNavItms.push(link);\n break;\n case 'right-side-logged-in':\n case 'right-side-logged-out':\n if (\n this.activeMyAccountSections &&\n !this.activeMyAccountSections.includes('about')\n )\n break;\n if (this.isLoggedIn && link.area === 'right-side-logged-in')\n this.aboutNavItms.push(link);\n else if (!this.isLoggedIn && link.area === 'right-side-logged-out')\n this.aboutNavItms.push(link);\n break;\n case 'profile-panel-list':\n if (\n this.activeMyAccountSections &&\n !this.activeMyAccountSections.includes('loggedin')\n )\n break;\n this.loggedInNavItms.push(link);\n break;\n }\n });\n }\n}\n"],"mappings":"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"}
|