@nanoporetech-digital/components 5.9.6 → 5.10.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.
Files changed (87) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/cjs/index-1d3ebe1a.js +0 -4
  3. package/dist/cjs/loader.cjs.js +1 -1
  4. package/dist/cjs/nano-algolia.cjs.entry.js +13 -1
  5. package/dist/cjs/nano-algolia.cjs.entry.js.map +1 -1
  6. package/dist/cjs/nano-components.cjs.js +1 -1
  7. package/dist/cjs/nano-global-nav.cjs.entry.js +85 -48
  8. package/dist/cjs/nano-global-nav.cjs.entry.js.map +1 -1
  9. package/dist/cjs/nano-global-search-results.cjs.entry.js +6 -7
  10. package/dist/cjs/nano-global-search-results.cjs.entry.js.map +1 -1
  11. package/dist/cjs/{nano-table-49b4b3a6.js → nano-table-72d5dc63.js} +2 -2
  12. package/dist/cjs/{nano-table-49b4b3a6.js.map → nano-table-72d5dc63.js.map} +1 -1
  13. package/dist/cjs/nano-table.cjs.entry.js +1 -1
  14. package/dist/cjs/{table.worker-da980a2f.js → table.worker-3df34efe.js} +2 -2
  15. package/dist/cjs/table.worker-3df34efe.js.map +1 -0
  16. package/dist/collection/collection-manifest.json +0 -1
  17. package/dist/collection/components/algolia/algolia-interface.js.map +1 -1
  18. package/dist/collection/components/algolia/algolia.js +17 -5
  19. package/dist/collection/components/algolia/algolia.js.map +1 -1
  20. package/dist/collection/components/global-nav/global-nav.js +85 -48
  21. package/dist/collection/components/global-nav/global-nav.js.map +1 -1
  22. package/dist/collection/components/global-search-results/global-search-results.js +6 -7
  23. package/dist/collection/components/global-search-results/global-search-results.js.map +1 -1
  24. package/dist/components/algolia.js +13 -2
  25. package/dist/components/algolia.js.map +1 -1
  26. package/dist/components/index.d.ts +0 -1
  27. package/dist/components/index.js +0 -1
  28. package/dist/components/index.js.map +1 -1
  29. package/dist/components/nano-global-nav.js +85 -48
  30. package/dist/components/nano-global-nav.js.map +1 -1
  31. package/dist/components/nano-global-search-results.js +6 -7
  32. package/dist/components/nano-global-search-results.js.map +1 -1
  33. package/dist/esm/index-06666022.js +0 -4
  34. package/dist/esm/loader.js +1 -1
  35. package/dist/esm/nano-algolia.entry.js +13 -1
  36. package/dist/esm/nano-algolia.entry.js.map +1 -1
  37. package/dist/esm/nano-components.js +1 -1
  38. package/dist/esm/nano-global-nav.entry.js +85 -48
  39. package/dist/esm/nano-global-nav.entry.js.map +1 -1
  40. package/dist/esm/nano-global-search-results.entry.js +6 -7
  41. package/dist/esm/nano-global-search-results.entry.js.map +1 -1
  42. package/dist/esm/{nano-table-673838b5.js → nano-table-5af42ba4.js} +2 -2
  43. package/dist/esm/{nano-table-673838b5.js.map → nano-table-5af42ba4.js.map} +1 -1
  44. package/dist/esm/nano-table.entry.js +1 -1
  45. package/dist/esm/{table.worker-608a4868.js → table.worker-3cae908c.js} +2 -2
  46. package/dist/esm/table.worker-3cae908c.js.map +1 -0
  47. package/dist/nano-components/nano-components.esm.js +1 -1
  48. package/dist/nano-components/nano-components.esm.js.map +1 -1
  49. package/dist/nano-components/{p-06c85b64.js → p-1987f7a9.js} +2 -2
  50. package/dist/nano-components/{p-24dcd788.entry.js → p-2c0218e6.entry.js} +2 -2
  51. package/dist/nano-components/p-2c0218e6.entry.js.map +1 -0
  52. package/dist/nano-components/p-abd11243.entry.js +5 -0
  53. package/dist/nano-components/p-abd11243.entry.js.map +1 -0
  54. package/dist/nano-components/{p-d18c0a7a.js → p-dc4020f8.js} +2 -2
  55. package/dist/nano-components/p-dc6cb252.entry.js +5 -0
  56. package/dist/nano-components/p-dc6cb252.entry.js.map +1 -0
  57. package/dist/nano-components/{p-0b7c676c.entry.js → p-fbde7010.entry.js} +2 -2
  58. package/dist/types/components/algolia/algolia-interface.d.ts +8 -2
  59. package/dist/types/components/algolia/algolia.d.ts +3 -4
  60. package/dist/types/components/global-nav/global-nav.d.ts +32 -0
  61. package/dist/types/components.d.ts +2 -127
  62. package/docs-json.json +5 -257
  63. package/docs-vscode.json +2 -63
  64. package/hydrate/index.js +107 -242
  65. package/package.json +2 -2
  66. package/dist/cjs/nano-algolia-input.cjs.entry.js +0 -168
  67. package/dist/cjs/nano-algolia-input.cjs.entry.js.map +0 -1
  68. package/dist/cjs/table.worker-da980a2f.js.map +0 -1
  69. package/dist/collection/components/algolia/algolia-input.js +0 -463
  70. package/dist/collection/components/algolia/algolia-input.js.map +0 -1
  71. package/dist/components/nano-algolia-input.d.ts +0 -11
  72. package/dist/components/nano-algolia-input.js +0 -195
  73. package/dist/components/nano-algolia-input.js.map +0 -1
  74. package/dist/esm/nano-algolia-input.entry.js +0 -164
  75. package/dist/esm/nano-algolia-input.entry.js.map +0 -1
  76. package/dist/esm/table.worker-608a4868.js.map +0 -1
  77. package/dist/nano-components/p-02b727d3.entry.js +0 -5
  78. package/dist/nano-components/p-02b727d3.entry.js.map +0 -1
  79. package/dist/nano-components/p-24dcd788.entry.js.map +0 -1
  80. package/dist/nano-components/p-7dd30a3f.entry.js +0 -7
  81. package/dist/nano-components/p-7dd30a3f.entry.js.map +0 -1
  82. package/dist/nano-components/p-842f826a.entry.js +0 -5
  83. package/dist/nano-components/p-842f826a.entry.js.map +0 -1
  84. package/dist/types/components/algolia/algolia-input.d.ts +0 -103
  85. /package/dist/nano-components/{p-06c85b64.js.map → p-1987f7a9.js.map} +0 -0
  86. /package/dist/nano-components/{p-d18c0a7a.js.map → p-dc4020f8.js.map} +0 -0
  87. /package/dist/nano-components/{p-0b7c676c.entry.js.map → p-fbde7010.entry.js.map} +0 -0
@@ -0,0 +1 @@
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","algoliaHits","doAlgoliaSearch","scopeSearch","results","find","res","selected","showAutocompleteResults","onSearchSubmit","algoliaSearchResults","activeIndex","index","domain","filters","query","nanoSearchResult","meta","indexTitle","indexName","client","apiKey","searchApiKey","appId","searchAppId","onSearchIndexChange","indexStr","selectedIndex","internalSearchIndeces","alogliaIndex","searchIndex","switchIndexSubmit","onAutocompleteBlur","hits","onAutocompleteInteract","testIndex","el","shadowRoot","found","ele","i","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","console","error","foundIndex","changeInternalSearchVal","initAlgoliaClient","algoliaClient","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","className","show","widgetHeight","Math","floor","querySelector","toString","autocompleteSnippet","hit","lookFor","_snippetResult","prop","matchLevel","title","substring","queries","map","attributesToSnippet","facets","hitsPerPage","Date","now","processSearchResults","nanoSearchError","result","name","domains","allGroup","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","closeOnBlur","small_avatar_url","forgot_password","logout","quietMode","w","btn","showLogo","logoUrl","src","getAssetPath","alt","showSearch","_b","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 }, 300);\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, {\n className: 'show',\n show: this.userMenuOpen,\n });\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 /**\n * Constructs a multi-search query for all set search indices\n * (which are normally controlled via the myAccount payload) then sends to Algolia.\n * Post-processes results, adding correct domains to url fields.\n * @returns formatted algolia results\n */\n private async doAlgoliaSearch() {\n this.algoliaSearchResults = null;\n\n const queries = this.internalSearchIndeces.map((index) => {\n return {\n attributesToSnippet: ['body:5', 'title:8'],\n indexName: index.index,\n query: this.searchValInternal,\n facets: index.filters,\n hitsPerPage: 5,\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 return this.algoliaSearchResults;\n }\n\n /**\n * Called whenever the search input value changes.\n * Performs Algolia search and shows autocomplete results.\n * @param ev optional input change event\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 // start search\n this.searchLoading = true;\n const algoliaHits = await this.doAlgoliaSearch();\n\n this.scopeSearch = null;\n this.scopeSearch = algoliaHits;\n\n // set / show autocomplete results\n this.autocompleteResults = algoliaHits.results.find((res) => res.selected);\n this.showAutocompleteResults();\n\n this.searchLoading = false;\n };\n\n /**\n * Called whenever the search form is submitted (but can also be called manually).\n * Fires event which will activate / display `nano-global-search-results`\n * @param ev optional form submit event\n */\n private onSearchSubmit = async (ev?) => {\n if (ev) ev.preventDefault();\n if (!this.isSearchValSet()) return;\n\n if (!this.currentIndex) this.currentSelectedIndex();\n if (!this.algoliaSearchResults) await this.doAlgoliaSearch();\n\n const activeIndex = this.algoliaSearchResults.results.find(\n (res) => res.selected\n );\n const { index, domain, filters, query } = activeIndex;\n\n this.nanoSearchResult.emit({\n meta: {\n indexTitle: activeIndex.indexName,\n index,\n domain,\n filters,\n query,\n },\n client: { apiKey: this.searchApiKey, appId: this.searchAppId },\n });\n this.showAutocomplete = false;\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);\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 <\n this.THRESHOLDLIMIT - THRESHOLDBREAKS.login && (\n <nano-icon\n name=\"light/times\"\n aria-label=\"close menu\"\n ></nano-icon>\n )}\n {this.threshold >=\n this.THRESHOLDLIMIT - THRESHOLDBREAKS.login && (\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\n class=\"nano-global-nav nano-global-nav-menu\"\n closeOnBlur={false}\n >\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\n class=\"nano-global-nav user-nav nano-global-nav-menu\"\n closeOnBlur={false}\n >\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 - THRESHOLDBREAKS.login ||\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 /**\n * Finds a correct domain (as defined by myAccount data) for a given origin\n * @returns a domain string for this origin\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 /**\n * process a set, or multiple sets of algolia results\n * and applies correct domain names / http protocol to each result's url\n * @returns results where partial paths are turned to full urls\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 /**\n * Ingests the data blob from myAccount; turns prescient fields to internal state\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 /**\n * Ingests the data blob from myAccount links; applies prescient fields to internal state\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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"}
@@ -1,5 +1,5 @@
1
1
  /*!
2
2
  * Web Components for Nanopore digital Web Apps
3
3
  */
4
- export{T as nano_table}from"./p-d18c0a7a.js";import"./p-d6a04b3a.js";import"./p-ee045579.js";import"./p-7bff5224.js";import"./p-70747f20.js";
5
- //# sourceMappingURL=p-0b7c676c.entry.js.map
4
+ export{T as nano_table}from"./p-dc4020f8.js";import"./p-d6a04b3a.js";import"./p-ee045579.js";import"./p-7bff5224.js";import"./p-70747f20.js";
5
+ //# sourceMappingURL=p-fbde7010.entry.js.map
@@ -1,5 +1,5 @@
1
1
  import type { SearchIndex as AlgoliaIndex } from 'algoliasearch/lite';
2
- import type { AlgoliaResultHit, AlgoliaMultiResult } from '../../interface';
2
+ import type { AlgoliaResultHit } from '../../interface';
3
3
  export interface IndexResult {
4
4
  index?: string;
5
5
  indexName?: string;
@@ -40,7 +40,13 @@ export interface PageChangeEventDetail {
40
40
  page: number;
41
41
  }
42
42
  export interface AloliaSearchResultDetail {
43
- results: AlgoliaMultiResult[];
43
+ meta: {
44
+ index: string;
45
+ indexTitle: string;
46
+ domain: string;
47
+ filters: [string];
48
+ query: string;
49
+ };
44
50
  client: {
45
51
  apiKey: string;
46
52
  appId: string;
@@ -11,8 +11,7 @@ type FilterGroup = {
11
11
  };
12
12
  /**
13
13
  * Algolia search container to contain and sync nano-algolia-results and nano-algolia-filter components.
14
- * Can optionally contain nano-algolia-input components or use them as a 'resultsEmitter'
15
- * @slot search-input - optional. Should contain an algolia-input component.
14
+ * @slot search-input - optional. Should contain an `input` or `nano-input` component.
16
15
  * @slot loader - optional. Elements to show when search results are loading.
17
16
  * @slot template - optional. Template string (format depends on 'tplEngine' property). May contain other algolia-... components with nested templates.
18
17
  * @slot output - Search result output. Will be a placeholder for template output or optionally nest algolia-... components.
@@ -36,7 +35,6 @@ export declare class Algolia implements ComponentInterface {
36
35
  inputField: HTMLNanoInputElement | HTMLInputElement;
37
36
  algoliaIndex: AlgoliaIndex;
38
37
  indeces: IndexResult[];
39
- resultsEmitterEle: HTMLElement;
40
38
  indexResults: IndexResult;
41
39
  filterChanged: string;
42
40
  currentHits: AlgoliaResultHit[];
@@ -78,11 +76,12 @@ export declare class Algolia implements ComponentInterface {
78
76
  */
79
77
  searchIndexName: string;
80
78
  /**
81
- * JS querSelector string of a `nano-input` / `input` element from which
79
+ * JS querySelector string of a `nano-input` / `input` element from which
82
80
  * to listen to `nano-change` or `change` events and change the `query` prop.
83
81
  * Not required if an appropriate field is in the 'search-input' slot
84
82
  */
85
83
  listenTo?: string;
84
+ handleListenToChange(): void;
86
85
  /**
87
86
  * The query string used to search the index. Will automatically be set with any slotted
88
87
  * `search-input` input elements or from elements linked to from `listen-to`
@@ -248,7 +248,24 @@ export declare class GlobalNav implements ComponentInterface {
248
248
  private onSearchBarHidden;
249
249
  private autocompleteSnippet;
250
250
  private onSearchInput;
251
+ /**
252
+ * Constructs a multi-search query for all set search indices
253
+ * (which are normally controlled via the myAccount payload) then sends to Algolia.
254
+ * Post-processes results, adding correct domains to url fields.
255
+ * @returns formatted algolia results
256
+ */
257
+ private doAlgoliaSearch;
258
+ /**
259
+ * Called whenever the search input value changes.
260
+ * Performs Algolia search and shows autocomplete results.
261
+ * @param ev optional input change event
262
+ */
251
263
  private onSearchChange;
264
+ /**
265
+ * Called whenever the search form is submitted (but can also be called manually).
266
+ * Fires event which will activate / display `nano-global-search-results`
267
+ * @param ev optional form submit event
268
+ */
252
269
  private onSearchSubmit;
253
270
  private onSearchIndexChange;
254
271
  private isSearchValSet;
@@ -273,8 +290,23 @@ export declare class GlobalNav implements ComponentInterface {
273
290
  private autocompleteList;
274
291
  private searchWidget;
275
292
  render(): any;
293
+ /**
294
+ * Finds a correct domain (as defined by myAccount data) for a given origin
295
+ * @returns a domain string for this origin
296
+ */
276
297
  private domainFor;
298
+ /**
299
+ * process a set, or multiple sets of algolia results
300
+ * and applies correct domain names / http protocol to each result's url
301
+ * @returns results where partial paths are turned to full urls
302
+ */
277
303
  private processSearchResults;
304
+ /**
305
+ * Ingests the data blob from myAccount; turns prescient fields to internal state
306
+ */
278
307
  private processMyAccData;
308
+ /**
309
+ * Ingests the data blob from myAccount links; applies prescient fields to internal state
310
+ */
279
311
  private processMyAccLinks;
280
312
  }
@@ -70,7 +70,6 @@ export namespace Components {
70
70
  }
71
71
  /**
72
72
  * Algolia search container to contain and sync nano-algolia-results and nano-algolia-filter components.
73
- * Can optionally contain nano-algolia-input components or use them as a 'resultsEmitter'
74
73
  */
75
74
  interface NanoAlgolia {
76
75
  /**
@@ -90,7 +89,7 @@ export namespace Components {
90
89
  */
91
90
  "filters": Array<string>;
92
91
  /**
93
- * JS querSelector string of a `nano-input` / `input` element from which to listen to `nano-change` or `change` events and change the `query` prop. Not required if an appropriate field is in the 'search-input' slot
92
+ * JS querySelector string of a `nano-input` / `input` element from which to listen to `nano-change` or `change` events and change the `query` prop. Not required if an appropriate field is in the 'search-input' slot
94
93
  */
95
94
  "listenTo"?: string;
96
95
  /**
@@ -173,53 +172,6 @@ export namespace Components {
173
172
  */
174
173
  "value": string | Array<string>;
175
174
  }
176
- /**
177
- * @deprecated Component for querying Algolia Indeces.
178
- * Can be nested within an algolia element or used outside as a 'resultsEmitter' (see algolia component documentation)
179
- * Must include one 'nano-input' component
180
- */
181
- interface NanoAlgoliaInput {
182
- /**
183
- * An Algolia API Key. Used in conjunction with 'searchIndex' & 'appId'. Alternatively this will be set automatically when nested within an algolia component
184
- */
185
- "apiKey": string;
186
- /**
187
- * An Algolia App ID key. Used in conjunction with 'searchIndex' & 'apiKey'. Alternatively this will be set automatically when nested within an algolia component
188
- */
189
- "appId": string;
190
- /**
191
- * Automatically emit results data to algolia components. For example, if you wanted to provide an 'autocomplete' style dropdown before showing the main results with a submit button
192
- */
193
- "autoEmit": boolean;
194
- /**
195
- * Will maintain a search all / '*' on init and reset allowing for a view then filter experience rather than a search first experience
196
- */
197
- "browseIndex": boolean;
198
- /**
199
- * Minimum number of characters before performing a search
200
- */
201
- "minChars": number;
202
- /**
203
- * Manually emit search results to algolia components. Useful if you don't wish to search on input change / want to provide 'autocomplete' options or / and want to use a submit button
204
- */
205
- "search": () => Promise<void>;
206
- /**
207
- * Algolia search index. Used in conjunction with 'searchIndex' & 'appId'. Alternatively this will be set automatically if you're using a 'resultsEmitter' element. ``` { index: string, // algolia index name domain?: string, // used in template filers to resolve incomplete url fields filters?: [string], // algolia facets to retrive hitsPerPage?: number, name?: string // human readable index name } ```
208
- */
209
- "searchIndex": SearchIndex;
210
- /**
211
- * Algolia search index name. Alternative to 'searchIndex'. A simplified shortcut for setting an index. properties such as hitsPerPage and facets will come from the algolia index
212
- */
213
- "searchIndexName": string;
214
- /**
215
- * Store search queries (against this ID) to the component store. Use in conjunction with storeMethod
216
- */
217
- "storeId"?: string;
218
- /**
219
- * The method of storage. Either session storage, url hash (after the '#') or url query (after the '?').
220
- */
221
- "storeMethod": StorageMethods;
222
- }
223
175
  /**
224
176
  * Displays results from Algolia searches.
225
177
  * TODO / WIP
@@ -2590,10 +2542,6 @@ export interface NanoAlgoliaFilterCustomEvent<T> extends CustomEvent<T> {
2590
2542
  detail: T;
2591
2543
  target: HTMLNanoAlgoliaFilterElement;
2592
2544
  }
2593
- export interface NanoAlgoliaInputCustomEvent<T> extends CustomEvent<T> {
2594
- detail: T;
2595
- target: HTMLNanoAlgoliaInputElement;
2596
- }
2597
2545
  export interface NanoAlgoliaPaginationCustomEvent<T> extends CustomEvent<T> {
2598
2546
  detail: T;
2599
2547
  target: HTMLNanoAlgoliaPaginationElement;
@@ -2747,7 +2695,6 @@ declare global {
2747
2695
  };
2748
2696
  /**
2749
2697
  * Algolia search container to contain and sync nano-algolia-results and nano-algolia-filter components.
2750
- * Can optionally contain nano-algolia-input components or use them as a 'resultsEmitter'
2751
2698
  */
2752
2699
  interface HTMLNanoAlgoliaElement extends Components.NanoAlgolia, HTMLStencilElement {
2753
2700
  }
@@ -2765,17 +2712,6 @@ declare global {
2765
2712
  prototype: HTMLNanoAlgoliaFilterElement;
2766
2713
  new (): HTMLNanoAlgoliaFilterElement;
2767
2714
  };
2768
- /**
2769
- * @deprecated Component for querying Algolia Indeces.
2770
- * Can be nested within an algolia element or used outside as a 'resultsEmitter' (see algolia component documentation)
2771
- * Must include one 'nano-input' component
2772
- */
2773
- interface HTMLNanoAlgoliaInputElement extends Components.NanoAlgoliaInput, HTMLStencilElement {
2774
- }
2775
- var HTMLNanoAlgoliaInputElement: {
2776
- prototype: HTMLNanoAlgoliaInputElement;
2777
- new (): HTMLNanoAlgoliaInputElement;
2778
- };
2779
2715
  /**
2780
2716
  * Displays results from Algolia searches.
2781
2717
  * TODO / WIP
@@ -3260,7 +3196,6 @@ declare global {
3260
3196
  "nano-alert": HTMLNanoAlertElement;
3261
3197
  "nano-algolia": HTMLNanoAlgoliaElement;
3262
3198
  "nano-algolia-filter": HTMLNanoAlgoliaFilterElement;
3263
- "nano-algolia-input": HTMLNanoAlgoliaInputElement;
3264
3199
  "nano-algolia-pagination": HTMLNanoAlgoliaPaginationElement;
3265
3200
  "nano-algolia-results": HTMLNanoAlgoliaResultsElement;
3266
3201
  "nano-aspect-ratio": HTMLNanoAspectRatioElement;
@@ -3367,7 +3302,6 @@ declare namespace LocalJSX {
3367
3302
  }
3368
3303
  /**
3369
3304
  * Algolia search container to contain and sync nano-algolia-results and nano-algolia-filter components.
3370
- * Can optionally contain nano-algolia-input components or use them as a 'resultsEmitter'
3371
3305
  */
3372
3306
  interface NanoAlgolia {
3373
3307
  /**
@@ -3387,7 +3321,7 @@ declare namespace LocalJSX {
3387
3321
  */
3388
3322
  "filters"?: Array<string>;
3389
3323
  /**
3390
- * JS querSelector string of a `nano-input` / `input` element from which to listen to `nano-change` or `change` events and change the `query` prop. Not required if an appropriate field is in the 'search-input' slot
3324
+ * JS querySelector string of a `nano-input` / `input` element from which to listen to `nano-change` or `change` events and change the `query` prop. Not required if an appropriate field is in the 'search-input' slot
3391
3325
  */
3392
3326
  "listenTo"?: string;
3393
3327
  /**
@@ -3493,57 +3427,6 @@ declare namespace LocalJSX {
3493
3427
  */
3494
3428
  "value"?: string | Array<string>;
3495
3429
  }
3496
- /**
3497
- * @deprecated Component for querying Algolia Indeces.
3498
- * Can be nested within an algolia element or used outside as a 'resultsEmitter' (see algolia component documentation)
3499
- * Must include one 'nano-input' component
3500
- */
3501
- interface NanoAlgoliaInput {
3502
- /**
3503
- * An Algolia API Key. Used in conjunction with 'searchIndex' & 'appId'. Alternatively this will be set automatically when nested within an algolia component
3504
- */
3505
- "apiKey"?: string;
3506
- /**
3507
- * An Algolia App ID key. Used in conjunction with 'searchIndex' & 'apiKey'. Alternatively this will be set automatically when nested within an algolia component
3508
- */
3509
- "appId"?: string;
3510
- /**
3511
- * Automatically emit results data to algolia components. For example, if you wanted to provide an 'autocomplete' style dropdown before showing the main results with a submit button
3512
- */
3513
- "autoEmit"?: boolean;
3514
- /**
3515
- * Will maintain a search all / '*' on init and reset allowing for a view then filter experience rather than a search first experience
3516
- */
3517
- "browseIndex"?: boolean;
3518
- /**
3519
- * Minimum number of characters before performing a search
3520
- */
3521
- "minChars"?: number;
3522
- /**
3523
- * Emitted when search results are successfully returned from Algolia.
3524
- */
3525
- "onNanoSearch"?: (event: NanoAlgoliaInputCustomEvent<AloliaSearchResultDetail>) => void;
3526
- /**
3527
- * Emitted when search field is cleared.
3528
- */
3529
- "onNanoSearchReset"?: (event: NanoAlgoliaInputCustomEvent<AloliaSearchResultDetail>) => void;
3530
- /**
3531
- * Algolia search index. Used in conjunction with 'searchIndex' & 'appId'. Alternatively this will be set automatically if you're using a 'resultsEmitter' element. ``` { index: string, // algolia index name domain?: string, // used in template filers to resolve incomplete url fields filters?: [string], // algolia facets to retrive hitsPerPage?: number, name?: string // human readable index name } ```
3532
- */
3533
- "searchIndex"?: SearchIndex;
3534
- /**
3535
- * Algolia search index name. Alternative to 'searchIndex'. A simplified shortcut for setting an index. properties such as hitsPerPage and facets will come from the algolia index
3536
- */
3537
- "searchIndexName"?: string;
3538
- /**
3539
- * Store search queries (against this ID) to the component store. Use in conjunction with storeMethod
3540
- */
3541
- "storeId"?: string;
3542
- /**
3543
- * The method of storage. Either session storage, url hash (after the '#') or url query (after the '?').
3544
- */
3545
- "storeMethod"?: StorageMethods;
3546
- }
3547
3430
  /**
3548
3431
  * Displays results from Algolia searches.
3549
3432
  * TODO / WIP
@@ -6030,7 +5913,6 @@ declare namespace LocalJSX {
6030
5913
  "nano-alert": NanoAlert;
6031
5914
  "nano-algolia": NanoAlgolia;
6032
5915
  "nano-algolia-filter": NanoAlgoliaFilter;
6033
- "nano-algolia-input": NanoAlgoliaInput;
6034
5916
  "nano-algolia-pagination": NanoAlgoliaPagination;
6035
5917
  "nano-algolia-results": NanoAlgoliaResults;
6036
5918
  "nano-aspect-ratio": NanoAspectRatio;
@@ -6094,7 +5976,6 @@ declare module "@stencil/core" {
6094
5976
  "nano-alert": LocalJSX.NanoAlert & JSXBase.HTMLAttributes<HTMLNanoAlertElement>;
6095
5977
  /**
6096
5978
  * Algolia search container to contain and sync nano-algolia-results and nano-algolia-filter components.
6097
- * Can optionally contain nano-algolia-input components or use them as a 'resultsEmitter'
6098
5979
  */
6099
5980
  "nano-algolia": LocalJSX.NanoAlgolia & JSXBase.HTMLAttributes<HTMLNanoAlgoliaElement>;
6100
5981
  /**
@@ -6102,12 +5983,6 @@ declare module "@stencil/core" {
6102
5983
  * Must be nested within an nano-algolia component.
6103
5984
  */
6104
5985
  "nano-algolia-filter": LocalJSX.NanoAlgoliaFilter & JSXBase.HTMLAttributes<HTMLNanoAlgoliaFilterElement>;
6105
- /**
6106
- * @deprecated Component for querying Algolia Indeces.
6107
- * Can be nested within an algolia element or used outside as a 'resultsEmitter' (see algolia component documentation)
6108
- * Must include one 'nano-input' component
6109
- */
6110
- "nano-algolia-input": LocalJSX.NanoAlgoliaInput & JSXBase.HTMLAttributes<HTMLNanoAlgoliaInputElement>;
6111
5986
  /**
6112
5987
  * Displays results from Algolia searches.
6113
5988
  * TODO / WIP