@nanoporetech-digital/components 4.0.0 → 4.2.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 (116) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/dist/cjs/{local-my-account-a3362993.js → local-my-account-d79ed0a2.js} +1 -1
  3. package/dist/cjs/{local-my-account-a3362993.js.map → local-my-account-d79ed0a2.js.map} +1 -1
  4. package/dist/cjs/nano-checkbox.cjs.entry.js +1 -1
  5. package/dist/cjs/nano-checkbox.cjs.entry.js.map +1 -1
  6. package/dist/cjs/nano-demo.cjs.entry.js +48 -47
  7. package/dist/cjs/nano-demo.cjs.entry.js.map +1 -1
  8. package/dist/cjs/nano-global-nav-user-profile_3.cjs.entry.js +1 -1
  9. package/dist/cjs/nano-global-nav-user-profile_3.cjs.entry.js.map +1 -1
  10. package/dist/cjs/nano-global-nav.cjs.entry.js +4 -3
  11. package/dist/cjs/nano-global-nav.cjs.entry.js.map +1 -1
  12. package/dist/cjs/nano-icon.cjs.entry.js +1 -1
  13. package/dist/cjs/nano-icon.cjs.entry.js.map +1 -1
  14. package/dist/cjs/nano-overflow-nav.cjs.entry.js +2 -0
  15. package/dist/cjs/nano-overflow-nav.cjs.entry.js.map +1 -1
  16. package/dist/cjs/{nano-table-737365b7.js → nano-table-d5eb9221.js} +2 -2
  17. package/dist/cjs/nano-table-d5eb9221.js.map +1 -0
  18. package/dist/cjs/nano-table.cjs.entry.js +1 -1
  19. package/dist/cjs/{table.worker-c3b11144.js → table.worker-37f25c78.js} +2 -2
  20. package/dist/cjs/table.worker-37f25c78.js.map +1 -0
  21. package/dist/collection/components/checkbox/checkbox.css +18 -12
  22. package/dist/collection/components/demo/demo.js +48 -47
  23. package/dist/collection/components/demo/demo.js.map +1 -1
  24. package/dist/collection/components/global-nav/assets/local-my-account.json +341 -0
  25. package/dist/collection/components/global-nav/global-nav-user-profile.js +1 -1
  26. package/dist/collection/components/global-nav/global-nav-user-profile.js.map +1 -1
  27. package/dist/collection/components/global-nav/global-nav.js +3 -2
  28. package/dist/collection/components/global-nav/global-nav.js.map +1 -1
  29. package/dist/collection/components/global-nav/style/global-nav.css +7 -4
  30. package/dist/collection/components/icon/utils.js +1 -1
  31. package/dist/collection/components/icon/utils.js.map +1 -1
  32. package/dist/collection/components/overflow-nav/overflow-nav.js +2 -0
  33. package/dist/collection/components/overflow-nav/overflow-nav.js.map +1 -1
  34. package/dist/collection/components/table/table-interface.js.map +1 -1
  35. package/dist/collection/components/table/table.js +8 -4
  36. package/dist/collection/components/table/table.js.map +1 -1
  37. package/dist/components/global-nav-user-profile.js +1 -1
  38. package/dist/components/global-nav-user-profile.js.map +1 -1
  39. package/dist/components/icon.js +1 -1
  40. package/dist/components/icon.js.map +1 -1
  41. package/dist/components/nano-checkbox.js +1 -1
  42. package/dist/components/nano-checkbox.js.map +1 -1
  43. package/dist/components/nano-demo.js +48 -47
  44. package/dist/components/nano-demo.js.map +1 -1
  45. package/dist/components/nano-global-nav.js +3 -2
  46. package/dist/components/nano-global-nav.js.map +1 -1
  47. package/dist/components/nano-overflow-nav.js +2 -0
  48. package/dist/components/nano-overflow-nav.js.map +1 -1
  49. package/dist/components/table.js.map +1 -1
  50. package/dist/esm/{local-my-account-964c8ad7.js → local-my-account-6662da72.js} +1 -1
  51. package/dist/esm/{local-my-account-964c8ad7.js.map → local-my-account-6662da72.js.map} +1 -1
  52. package/dist/esm/nano-checkbox.entry.js +1 -1
  53. package/dist/esm/nano-checkbox.entry.js.map +1 -1
  54. package/dist/esm/nano-demo.entry.js +48 -47
  55. package/dist/esm/nano-demo.entry.js.map +1 -1
  56. package/dist/esm/nano-global-nav-user-profile_3.entry.js +1 -1
  57. package/dist/esm/nano-global-nav-user-profile_3.entry.js.map +1 -1
  58. package/dist/esm/nano-global-nav.entry.js +4 -3
  59. package/dist/esm/nano-global-nav.entry.js.map +1 -1
  60. package/dist/esm/nano-icon.entry.js +1 -1
  61. package/dist/esm/nano-icon.entry.js.map +1 -1
  62. package/dist/esm/nano-overflow-nav.entry.js +2 -0
  63. package/dist/esm/nano-overflow-nav.entry.js.map +1 -1
  64. package/dist/esm/{nano-table-75d755ae.js → nano-table-81cc50c7.js} +2 -2
  65. package/dist/esm/nano-table-81cc50c7.js.map +1 -0
  66. package/dist/esm/nano-table.entry.js +1 -1
  67. package/dist/esm/{table.worker-d60d6df4.js → table.worker-86754436.js} +2 -2
  68. package/dist/esm/table.worker-86754436.js.map +1 -0
  69. package/dist/nano-assets/hash.txt +1 -1
  70. package/dist/nano-assets/local-my-account.json +341 -0
  71. package/dist/nano-components/assets/local-my-account.json +341 -0
  72. package/dist/nano-components/assets/ont-logo.svg +89 -0
  73. package/dist/nano-components/assets/ont-wheel-light.svg +31 -0
  74. package/dist/nano-components/nano-components.esm.js +1 -1
  75. package/dist/nano-components/{p-42e7f253.js → p-099a573a.js} +2 -2
  76. package/dist/nano-components/{p-42e7f253.js.map → p-099a573a.js.map} +1 -1
  77. package/dist/nano-components/p-0c077605.entry.js +5 -0
  78. package/dist/nano-components/p-0c077605.entry.js.map +1 -0
  79. package/dist/nano-components/{p-1b7bad31.entry.js → p-1525c97b.entry.js} +2 -2
  80. package/dist/nano-components/p-173cc842.entry.js +5 -0
  81. package/dist/nano-components/p-173cc842.entry.js.map +1 -0
  82. package/dist/nano-components/{p-c53b232e.js → p-2155fc2c.js} +1 -1
  83. package/dist/nano-components/p-6c47fdc2.js +5 -0
  84. package/dist/nano-components/p-7730ce8e.entry.js +5 -0
  85. package/dist/nano-components/{p-d0e15e46.entry.js.map → p-7730ce8e.entry.js.map} +1 -1
  86. package/dist/nano-components/{p-f93bd976.entry.js → p-b38cabe2.entry.js} +2 -2
  87. package/dist/nano-components/p-b38cabe2.entry.js.map +1 -0
  88. package/dist/nano-components/p-dc8fd62d.entry.js +5 -0
  89. package/dist/nano-components/p-dc8fd62d.entry.js.map +1 -0
  90. package/dist/nano-components/p-fa658659.entry.js +5 -0
  91. package/dist/nano-components/p-fa658659.entry.js.map +1 -0
  92. package/dist/types/components/demo/demo.d.ts +1 -0
  93. package/dist/types/components/table/table-interface.d.ts +5 -2
  94. package/dist/types/components/table/table.d.ts +1 -1
  95. package/dist/types/components.d.ts +2 -2
  96. package/docs-json.json +18 -8
  97. package/hydrate/index.js +55 -51
  98. package/package.json +2 -2
  99. package/dist/cjs/nano-table-737365b7.js.map +0 -1
  100. package/dist/cjs/table.worker-c3b11144.js.map +0 -1
  101. package/dist/esm/nano-table-75d755ae.js.map +0 -1
  102. package/dist/esm/table.worker-d60d6df4.js.map +0 -1
  103. package/dist/nano-components/p-583d8d70.entry.js +0 -5
  104. package/dist/nano-components/p-583d8d70.entry.js.map +0 -1
  105. package/dist/nano-components/p-b2655717.entry.js +0 -5
  106. package/dist/nano-components/p-b2655717.entry.js.map +0 -1
  107. package/dist/nano-components/p-d0e15e46.entry.js +0 -5
  108. package/dist/nano-components/p-d4cebdef.entry.js +0 -5
  109. package/dist/nano-components/p-d4cebdef.entry.js.map +0 -1
  110. package/dist/nano-components/p-d98c6a62.js +0 -5
  111. package/dist/nano-components/p-f471a392.entry.js +0 -5
  112. package/dist/nano-components/p-f471a392.entry.js.map +0 -1
  113. package/dist/nano-components/p-f93bd976.entry.js.map +0 -1
  114. /package/dist/nano-components/{p-1b7bad31.entry.js.map → p-1525c97b.entry.js.map} +0 -0
  115. /package/dist/nano-components/{p-c53b232e.js.map → p-2155fc2c.js.map} +0 -0
  116. /package/dist/nano-components/{p-d98c6a62.js.map → p-6c47fdc2.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","processSearchResults","alogliaIndex","attributesToSnippet","hitsPerPage","filters","Math","floor","Date","now","console","error","scopeSearch","onSearchSubmit","showAutocompleteResults","algoliaSearchResults","queries","internalSearchIndeces","map","index","indexName","query","facets","algoliaClient","multipleQueries","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","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","undefined","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","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, { SearchClient as AlgoliaClient } from 'algoliasearch';\nimport { clientFetch } from '../../utils/fetch';\nimport { ComponentStore } from '../../utils/store/component-store';\nimport { debounce } from '../../utils/throttle';\nimport { displayTransition } from '../../utils/transitions';\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@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 @State() internalSearchIndeces: Array<SearchIndex> = [];\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 @State() modalOpen: boolean = false;\n @State() modalIsOpen: boolean = false;\n @State() searchBarShown: boolean = false;\n @State() scrollingUp: boolean = true;\n @State() searchLoading: boolean = false;\n @State() showAutocomplete: boolean = false;\n @State() secondaryMenuOpen: HTMLNanoNavItemElement = null;\n @State() userMenuOpen: boolean = false;\n @State() menuFullScreen: boolean = false;\n @State() searchValInternal: string = '';\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 @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://community.nanoporetech.com/profile/me';\n case 'local':\n case 'dev':\n case 'test':\n default:\n this.userProfileUrl =\n 'https://community-test.nanoporetech.com/profile/me';\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.multipleQueries(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 role=\"navigation\"\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 >\n <div\n class=\"gn-menu_wrap\"\n ref={(div) => (this.menuWrapDiv = div)}\n tabindex=\"-1\"\n >\n <div class=\"gn-menu_actions\">\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\">\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 {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 >\n <div class=\"bars\">\n <nav\n class=\"main-bar\"\n aria-label=\"Main site navigation\"\n tabindex=\"-1\"\n ref={(div) => (this.mainBarDiv = div)}\n role={\n !!this.mainSlotLen &&\n this.threshold >= this.THRESHOLDLIMIT - THRESHOLDBREAKS.main\n ? 'menu'\n : undefined\n }\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\">\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 >\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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"}
@@ -2,5 +2,6 @@ import { ComponentInterface } from '../../stencil-public-runtime';
2
2
  export declare class Demo implements ComponentInterface {
3
3
  private order;
4
4
  private lineItemTotal;
5
+ private columns;
5
6
  render(): any;
6
7
  }
@@ -191,7 +191,7 @@ export declare namespace TableTypes {
191
191
  * Row renderer property. Called during the rendering of a tables head and foot
192
192
  * controlling their visual state.
193
193
  */
194
- interface HeadFootRenderer {
194
+ interface HeadFootRenderer<T = RowData> {
195
195
  /** Function to decide whether the row is vertically pinned. Defaults to `start` for the header and `end` the footer */
196
196
  pinned: Position;
197
197
  /**
@@ -200,7 +200,7 @@ export declare namespace TableTypes {
200
200
  * If used, and you want to see the rendered row, you *must* nest it within your
201
201
  * jsx function e.g. `(h, props) => { return [props.renderedRow, <tr><td>Custom thing</td></tr>]}`
202
202
  **/
203
- template?: RowTemplateFunc<VNode | VNode[], null>;
203
+ template?: RowTemplateFunc<VNode | VNode[], T>;
204
204
  /** A function which can be used to apply any html attribute/s onto a table row `tr` */
205
205
  rowProperties?: () => RowProps | void | undefined;
206
206
  }
@@ -211,6 +211,9 @@ export declare namespace TableTypes {
211
211
  class NanoTable<T = RowGeneric> {
212
212
  rows: T[];
213
213
  columns: ColumnConfig<T>[];
214
+ rowRender: RowRenderer<T>;
215
+ headRender: HeadFootRenderer<T>;
216
+ footRender: HeadFootRenderer<T>;
214
217
  }
215
218
  type Falsy = false | 0 | '' | null | undefined;
216
219
  }
@@ -40,7 +40,7 @@ export declare class Table implements ComponentInterface {
40
40
  rows: TableTypes.NanoTable['rows'] | Promise<TableTypes.NanoTable['rows']>;
41
41
  handleRowsChange(): void;
42
42
  /** The column config used to present the rows of data */
43
- columns: TableTypes.NanoTable['columns'];
43
+ columns: TableTypes.NanoTable<any>['columns'];
44
44
  handleColsChange(): Promise<void>;
45
45
  /** Used for custom thead row rendering */
46
46
  headRender: TableTypes.HeadFootRenderer;
@@ -2264,7 +2264,7 @@ export namespace Components {
2264
2264
  /**
2265
2265
  * The column config used to present the rows of data
2266
2266
  */
2267
- "columns": TableTypes.NanoTable['columns'];
2267
+ "columns": TableTypes.NanoTable<any>['columns'];
2268
2268
  /**
2269
2269
  * A custom filtering function. Should return a promise. If the promise resolves as `true` the column UI will be updated. If the promise resolves as falsey, the sort will be performed by the component. A good use-case would be performing the filter on a server / via fetch. Then on success, updating the table's data via the `rows` property
2270
2270
  */
@@ -5494,7 +5494,7 @@ declare namespace LocalJSX {
5494
5494
  /**
5495
5495
  * The column config used to present the rows of data
5496
5496
  */
5497
- "columns"?: TableTypes.NanoTable['columns'];
5497
+ "columns"?: TableTypes.NanoTable<any>['columns'];
5498
5498
  /**
5499
5499
  * A custom filtering function. Should return a promise. If the promise resolves as `true` the column UI will be updated. If the promise resolves as falsey, the sort will be performed by the component. A good use-case would be performing the filter on a server / via fetch. Then on success, updating the table's data via the `rows` property
5500
5500
  */
package/docs-json.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "timestamp": "2023-03-04T00:35:53",
2
+ "timestamp": "2023-03-08T12:32:01",
3
3
  "compiler": {
4
4
  "name": "@stencil/core",
5
5
  "version": "2.23.0",
@@ -2045,10 +2045,20 @@
2045
2045
  "annotation": "prop",
2046
2046
  "docs": "Initial Bg color of radio / checkbox controls. Changes for [checked] and [disabled] states. Defaults to #fff;"
2047
2047
  },
2048
+ {
2049
+ "name": "--check-border-color",
2050
+ "annotation": "prop",
2051
+ "docs": "initial border color. Defaults to #b5aea7;"
2052
+ },
2053
+ {
2054
+ "name": "--check-border-size",
2055
+ "annotation": "prop",
2056
+ "docs": "initial border size. Default to 1px;"
2057
+ },
2048
2058
  {
2049
2059
  "name": "--check-border-style",
2050
2060
  "annotation": "prop",
2051
- "docs": "Initial border style. Defaults to 1px solid #b5aea7;"
2061
+ "docs": "Initial border style. Defaults to var(--check-border-size) solid var(--check-border-color);"
2052
2062
  },
2053
2063
  {
2054
2064
  "name": "--check-checked-bg-color",
@@ -15125,7 +15135,7 @@
15125
15135
  },
15126
15136
  {
15127
15137
  "name": "columns",
15128
- "type": "ColumnConfig<RowGeneric>[]",
15138
+ "type": "ColumnConfig<any>[]",
15129
15139
  "mutable": true,
15130
15140
  "reflectToAttr": false,
15131
15141
  "docs": "The column config used to present the rows of data",
@@ -15133,7 +15143,7 @@
15133
15143
  "default": "[]",
15134
15144
  "values": [
15135
15145
  {
15136
- "type": "ColumnConfig<RowGeneric>[]"
15146
+ "type": "ColumnConfig<any>[]"
15137
15147
  }
15138
15148
  ],
15139
15149
  "optional": false,
@@ -15221,7 +15231,7 @@
15221
15231
  },
15222
15232
  {
15223
15233
  "name": "footRender",
15224
- "type": "HeadFootRenderer",
15234
+ "type": "HeadFootRenderer<RowData<RowGeneric>>",
15225
15235
  "mutable": false,
15226
15236
  "reflectToAttr": false,
15227
15237
  "docs": "Used for custom tfoot row rendering",
@@ -15229,7 +15239,7 @@
15229
15239
  "default": "{ pinned: 'bottom' }",
15230
15240
  "values": [
15231
15241
  {
15232
- "type": "HeadFootRenderer"
15242
+ "type": "HeadFootRenderer<RowData<RowGeneric>>"
15233
15243
  }
15234
15244
  ],
15235
15245
  "optional": false,
@@ -15239,7 +15249,7 @@
15239
15249
  },
15240
15250
  {
15241
15251
  "name": "headRender",
15242
- "type": "HeadFootRenderer",
15252
+ "type": "HeadFootRenderer<RowData<RowGeneric>>",
15243
15253
  "mutable": false,
15244
15254
  "reflectToAttr": false,
15245
15255
  "docs": "Used for custom thead row rendering",
@@ -15247,7 +15257,7 @@
15247
15257
  "default": "{ pinned: 'top' }",
15248
15258
  "values": [
15249
15259
  {
15250
- "type": "HeadFootRenderer"
15260
+ "type": "HeadFootRenderer<RowData<RowGeneric>>"
15251
15261
  }
15252
15262
  ],
15253
15263
  "optional": false,