@nanoporetech-digital/components 2.0.1 → 2.1.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 (80) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/cjs/{algoliasearch.umd-4d15f5e0.js → algoliasearch.umd-79e17a1a.js} +3 -3
  3. package/dist/cjs/{algoliasearch.umd-4d15f5e0.js.map → algoliasearch.umd-79e17a1a.js.map} +1 -1
  4. package/dist/cjs/nano-algolia-input.cjs.entry.js +1 -1
  5. package/dist/cjs/nano-algolia.cjs.entry.js +1 -1
  6. package/dist/cjs/nano-global-nav.cjs.entry.js +1 -1
  7. package/dist/cjs/nano-tab-group.cjs.entry.js +6 -3
  8. package/dist/cjs/nano-tab-group.cjs.entry.js.map +1 -1
  9. package/dist/collection/components/accordion/accordion.js +1 -1
  10. package/dist/collection/components/alert/alert.js +1 -1
  11. package/dist/collection/components/algolia/algolia-filter.js +2 -2
  12. package/dist/collection/components/algolia/algolia-input.js +5 -5
  13. package/dist/collection/components/algolia/algolia-results.js +1 -1
  14. package/dist/collection/components/algolia/algolia.js +6 -6
  15. package/dist/collection/components/checkbox/checkbox-group.js +2 -2
  16. package/dist/collection/components/checkbox/checkbox.js +3 -3
  17. package/dist/collection/components/datalist/datalist.js +1 -1
  18. package/dist/collection/components/date-input/date-input.js +7 -7
  19. package/dist/collection/components/date-picker/date-picker.js +5 -5
  20. package/dist/collection/components/details/details.js +1 -1
  21. package/dist/collection/components/dialog/dialog.js +1 -1
  22. package/dist/collection/components/file-upload/file-upload.js +4 -4
  23. package/dist/collection/components/global-nav/global-nav.js +4 -4
  24. package/dist/collection/components/grid/grid-item.js +1 -1
  25. package/dist/collection/components/icon/icon.js +1 -1
  26. package/dist/collection/components/input/input.js +5 -5
  27. package/dist/collection/components/nav-item/nav-item.js +4 -4
  28. package/dist/collection/components/range/range.js +4 -4
  29. package/dist/collection/components/resize-observe/resize-observe.js +1 -1
  30. package/dist/collection/components/select/select.js +7 -7
  31. package/dist/collection/components/slides/slides.js +7 -7
  32. package/dist/collection/components/tabs/tab-group.js +14 -5
  33. package/dist/collection/components/tabs/tab-group.js.map +1 -1
  34. package/dist/components/algoliasearch.umd.js +2 -2
  35. package/dist/components/algoliasearch.umd.js.map +1 -1
  36. package/dist/components/nano-tab-group.js +6 -3
  37. package/dist/components/nano-tab-group.js.map +1 -1
  38. package/dist/custom-elements/index.js +8 -5
  39. package/dist/custom-elements/index.js.map +1 -1
  40. package/dist/esm/{algoliasearch.umd-adbc4aa5.js → algoliasearch.umd-6d09b727.js} +3 -3
  41. package/dist/esm/{algoliasearch.umd-adbc4aa5.js.map → algoliasearch.umd-6d09b727.js.map} +1 -1
  42. package/dist/esm/nano-algolia-input.entry.js +1 -1
  43. package/dist/esm/nano-algolia.entry.js +1 -1
  44. package/dist/esm/nano-global-nav.entry.js +1 -1
  45. package/dist/esm/nano-tab-group.entry.js +6 -3
  46. package/dist/esm/nano-tab-group.entry.js.map +1 -1
  47. package/dist/esm-es5/{algoliasearch.umd-adbc4aa5.js → algoliasearch.umd-6d09b727.js} +3 -3
  48. package/dist/esm-es5/{algoliasearch.umd-adbc4aa5.js.map → algoliasearch.umd-6d09b727.js.map} +1 -1
  49. package/dist/esm-es5/nano-algolia-input.entry.js +1 -1
  50. package/dist/esm-es5/nano-algolia.entry.js +1 -1
  51. package/dist/esm-es5/nano-global-nav.entry.js +1 -1
  52. package/dist/esm-es5/nano-tab-group.entry.js +2 -2
  53. package/dist/esm-es5/nano-tab-group.entry.js.map +1 -1
  54. package/dist/nano-components/nano-components.esm.js +1 -1
  55. package/dist/nano-components/p-096682d9.system.js +1 -1
  56. package/dist/nano-components/{p-c7c50a7d.system.entry.js → p-0bee6fe6.system.entry.js} +2 -2
  57. package/dist/nano-components/{p-c7c50a7d.system.entry.js.map → p-0bee6fe6.system.entry.js.map} +0 -0
  58. package/dist/nano-components/{p-55535a0c.system.entry.js → p-3a725f1f.system.entry.js} +2 -2
  59. package/dist/nano-components/{p-55535a0c.system.entry.js.map → p-3a725f1f.system.entry.js.map} +0 -0
  60. package/dist/nano-components/{p-17ebff74.system.entry.js → p-3fc52f19.system.entry.js} +2 -2
  61. package/dist/nano-components/p-3fc52f19.system.entry.js.map +1 -0
  62. package/dist/nano-components/{p-cce0806e.entry.js → p-46d0bb7b.entry.js} +2 -2
  63. package/dist/nano-components/{p-cce0806e.entry.js.map → p-46d0bb7b.entry.js.map} +0 -0
  64. package/dist/nano-components/{p-7319fa52.system.js → p-67cc0d9b.system.js} +3 -3
  65. package/dist/nano-components/{p-7319fa52.system.js.map → p-67cc0d9b.system.js.map} +1 -1
  66. package/dist/nano-components/{p-c475b57f.system.entry.js → p-774e090b.system.entry.js} +2 -2
  67. package/dist/nano-components/{p-c475b57f.system.entry.js.map → p-774e090b.system.entry.js.map} +0 -0
  68. package/dist/nano-components/{p-e64daa92.entry.js → p-a4075d49.entry.js} +2 -2
  69. package/dist/nano-components/{p-e64daa92.entry.js.map → p-a4075d49.entry.js.map} +0 -0
  70. package/dist/nano-components/{p-dfe50fff.entry.js → p-e2ae11d2.entry.js} +2 -2
  71. package/dist/nano-components/p-e2ae11d2.entry.js.map +1 -0
  72. package/dist/nano-components/{p-305abcb0.js → p-e3583b00.js} +3 -3
  73. package/dist/nano-components/{p-305abcb0.js.map → p-e3583b00.js.map} +1 -1
  74. package/dist/nano-components/{p-7a9aeeb5.entry.js → p-f1bf1099.entry.js} +2 -2
  75. package/dist/nano-components/{p-7a9aeeb5.entry.js.map → p-f1bf1099.entry.js.map} +0 -0
  76. package/dist/types/components/tabs/tab-group.d.ts +6 -0
  77. package/docs-json.json +26 -6
  78. package/package.json +2 -2
  79. package/dist/nano-components/p-17ebff74.system.entry.js.map +0 -1
  80. package/dist/nano-components/p-dfe50fff.entry.js.map +0 -1
@@ -11,6 +11,12 @@ import { StorageMethods } from '../../utils/store/component-store';
11
11
  * @slot tabs - Add `nano-tab` elements to add clickable tabs.
12
12
  * @slot tab-content-header - a header bar displayed above tab content.
13
13
  * @slot - Add `nano-tab-content` elements to add tabbable content.
14
+ *
15
+ * @part base - the main tab-group wrapper
16
+ * @part nav - the bar surrounding all the tabs and nav buttons
17
+ * @part tabs - the wrapper around the `nano-tab` components
18
+ * @part active-tab-indicator - the active indicator line
19
+ * @part body - the wrapper around the `nano-tab-content` components
14
20
  */
15
21
  export declare class TabGroup implements ComponentInterface {
16
22
  private activeTab;
package/docs-json.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "timestamp": "2022-02-10T11:41:32",
2
+ "timestamp": "2022-03-02T21:32:06",
3
3
  "compiler": {
4
4
  "name": "@stencil/core",
5
5
  "version": "2.12.2",
@@ -12881,6 +12881,26 @@
12881
12881
  {
12882
12882
  "name": "slot",
12883
12883
  "text": "- Add `nano-tab-content` elements to add tabbable content."
12884
+ },
12885
+ {
12886
+ "name": "part",
12887
+ "text": "base - the main tab-group wrapper"
12888
+ },
12889
+ {
12890
+ "name": "part",
12891
+ "text": "nav - the bar surrounding all the tabs and nav buttons"
12892
+ },
12893
+ {
12894
+ "name": "part",
12895
+ "text": "tabs - the wrapper around the `nano-tab` components"
12896
+ },
12897
+ {
12898
+ "name": "part",
12899
+ "text": "active-tab-indicator - the active indicator line"
12900
+ },
12901
+ {
12902
+ "name": "part",
12903
+ "text": "body - the wrapper around the `nano-tab-content` components"
12884
12904
  }
12885
12905
  ],
12886
12906
  "usage": {},
@@ -13223,23 +13243,23 @@
13223
13243
  "parts": [
13224
13244
  {
13225
13245
  "name": "active-tab-indicator",
13226
- "docs": ""
13246
+ "docs": "the active indicator line"
13227
13247
  },
13228
13248
  {
13229
13249
  "name": "base",
13230
- "docs": ""
13250
+ "docs": "the main tab-group wrapper"
13231
13251
  },
13232
13252
  {
13233
13253
  "name": "body",
13234
- "docs": ""
13254
+ "docs": "the wrapper around the `nano-tab-content` components"
13235
13255
  },
13236
13256
  {
13237
13257
  "name": "nav",
13238
- "docs": ""
13258
+ "docs": "the bar surrounding all the tabs and nav buttons"
13239
13259
  },
13240
13260
  {
13241
13261
  "name": "tabs",
13242
- "docs": ""
13262
+ "docs": "the wrapper around the `nano-tab` components"
13243
13263
  }
13244
13264
  ],
13245
13265
  "dependents": [],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nanoporetech-digital/components",
3
- "version": "2.0.1",
3
+ "version": "2.1.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://git.oxfordnanolabs.local/Digital/nano-components"
@@ -124,5 +124,5 @@
124
124
  "peerDependencies": {
125
125
  "@stencil/core": "^2.5.0"
126
126
  },
127
- "gitHead": "cd185dd380c9f9e742761edd507af3a266527558"
127
+ "gitHead": "348edb52ff04678066cafdfe2cf02e1bafdd3cdc"
128
128
  }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["src/components/tabs/tab-group.scss?tag=nano-tab-group&encapsulation=shadow","src/components/tabs/tab-group.tsx"],"names":["tabGroupCss","TabGroup","exports","class_1","hostRef","_this","this","initialTouchX","initialTouchY","hasScrollControls","hideControlRight","hideControlLeft","isLegacy","document","head","attachShadow","placement","noScrollControls","storeMethod","updateScrollControls","includes","nav","scrollWidth","clientWidth","tabs","handleClick","event","target","tab","closest","setActiveTab","handleKeyDown","key","preventDefault","activeEl","activeElement","tagName","toLowerCase","getAllActiveTabs","index_1","indexOf","length","isRtl","Math","max","min","setFocus","scrollIntoView","handleTabScroll","endRight","scrollLeft","endLeft","handleBtnClick","goRight","navWidth","getNavWidth","leftAmt","scroll","left","behavior","e","handleTouchStart","disableSwipe","touch","changedTouches","pageX","pageY","handleTouchEnd","distX","distY","threshold","xDiff","clientX","yDiff","clientY","isHorizontalSwipe","abs","currIndex","findIndex","el","active","toGo","activePanel","setAttribute","prototype","handleTabNameChange","activeTab","panel","find","handlePlacementChange","syncActiveTabIndicator","handleNoScrollControlsChange","hideRightBtn","rightBtn","displayTransition","hideLeftBtn","leftBtn","watchScrollControls","setTimeout","_","show","Object","defineProperty","getAllTabs","filter","disabled","getDirectChildren","host","emitEvents","previousTab","map","getAllPanels","name","removeAttribute","nanoTabHide","emit","nanoTabShow","setAriaLabels","panels","getAttribute","forEach","getActiveTab","width","_a","shadowRoot","querySelector","height","clientHeight","offset","getOffset","offsetTop","top","scrollTop","offsetLeft","activeTabIndicator","style","transform","computedStyle","getComputedStyle","parseFloat","paddingLeft","paddingRight","handleTabClose","ev","tabIndex","stopImmediatePropagation","closeEv","nanoTabWillClose","defaultPrevented","prevTab","remove","nanoTabClose","componentDidLoad","observer","IntersectionObserver","entries","intersectionRatio","storeId","ComponentStore","init","unobserve","observe","focusVisible","tabGroup","resizeObserver","ResizeObserver","mutationObserver","MutationObserver","mutations","some","mutation","attributeName","attributes","childList","subtree","requestAnimationFrame","connectedCallback","dir","ownerDocument","disconnectedCallback","disconnect","render","h","Host","class","assign","createColorClasses","color","legacy","part","ref","nano-tab-group","nano-tab-group--top","nano-tab-group--start","nano-tab-group--has-scroll-controls","nano-tab-group--has-scroll-controls-left","nano-tab-group--has-scroll-controls-right","onClick","onKeyDown","nano-tab-group__scroll-button","nano-tab-group__scroll-button--left","btn","onScroll","role","nano-tab-group__scroll-button--right","onTouchStart","onTouchEnd"],"mappings":"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","sourcesContent":["@import '../../global/style/utilities/globals';\n@import '../../global/style/nano-theme/form';\n@import '../../global/style/nano-theme/base';\n@import '../../global/style/nano-theme/layers';\n\n/**\n * @prop --indicator-transition: Only relevant to placement 'start'. defaults to #{$transition-fast};\n * @prop --indicator-color: defaults to #{$color-lightblue} on placement 'top' and #{$color-blue} on placement 'start';\n * @prop --indicator-track-color: Only relevant to placement 'start'. defaults to #{$color-lightgrey};\n * @prop --indicator-size: defaults to 5px on placement 'top' and 2px on placement 'start';\n\n * @prop --border-radius: defaults to #{$layer-border-radius};\n * @prop --background-rgb: will be used as the default background colour for tabs and content. defaults to #{$layer-bg-color-rgb};\n * @prop --shadow-opacity: opacity of the shadow behind tabs. defaults to 0.1;\n * @prop --scroll-btn-color: defaults to 'currentColor';\n\n * @prop --content-padding: defaults to 2rem 2.5rem;\n * @prop --content-bg: defaults to rgb(var(--background-rgb));\n * @prop --content-border-radius: defaults to var(--border-radius);\n\n * @prop --tabs-padding-start: defaults to 2.5rem on placement 'top' and 0 on placement 'start';\n * @prop --tabs-padding-end: defaults to 2.5rem on placement 'top' and 0 on placement 'start';\n * @prop --tabs-padding-top: defaults to 0;\n * @prop --tabs-padding-bottom: defaults to 0;\n * @prop --tabs-bg-rgb: defaults to var(--bg-color);\n * @prop --tab-border-radius: defaults to var(--border-radius);\n * @prop --tab-text-color: defaults to #{$color-blue} on placement 'top' and #{$color-darkgrey} on placement 'start';\n */\n\n:host {\n --indicator-transition: #{$transition-fast};\n --indicator-color: #{$color-lightblue};\n --indicator-track-color: #{$color-lightgrey};\n --indicator-size: 0;\n --border-radius: #{$layer-border-radius};\n --background-rgb: #{$layer-bg-color-rgb};\n --scroll-btn-color: 'currentColor';\n --content-padding: 2rem 2.5rem;\n --content-bg: rgb(var(--background-rgb));\n --content-border-radius: var(--border-radius);\n --tabs-padding-start: 2.5rem;\n --tabs-padding-end: 2.5rem;\n --tabs-padding-top: 0;\n --tabs-padding-bottom: 0;\n --tabs-container-bg: 'transparent';\n --tabs-bg-rgb: var(--background-rgb);\n --tab-border-radius: var(--border-radius);\n --tab-text-color: #{$color-blue};\n --shadow-opacity: 0.1;\n\n display: block;\n position: relative;\n z-index: #{$layer-index-raised};\n\n @media only screen and (max-width: 768px) {\n --tabs-padding-start: 1.5rem;\n --tabs-padding-end: 1.5rem;\n }\n\n ::slotted(nano-tab) {\n --tab-indicator-color: var(--indicator-color);\n --bg-rgb: var(--tabs-bg-rgb);\n --border-radius: var(--tab-border-radius);\n }\n}\n\n// IE bugfix - set this stuff statically\n:host(.legacy) {\n ::slotted(nano-tab) {\n --tab-indicator-color: #{$color-lightblue};\n --border-radius: 3px;\n --tab-indicator-size: 5px;\n --bg-rgb: 255, 255, 255;\n }\n}\n\n:host([placement='start']),\n:host([placement='end']) {\n --content-padding: 1rem;\n --tabs-padding-start: 0;\n --tabs-padding-end: 0;\n --tabs-padding-top: 0;\n --tabs-padding-bottom: 0;\n --tab-text-color: #{$color-darkgrey};\n --indicator-color: #{$color-blue};\n --indicator-size: 2px;\n}\n\n:host(.nano-color) {\n --indicator-color: var(--nano-color-tint, #{nano-color(primary, tint)});\n --tab-text-color: rgba(var(--nano-color-base-rgb), 0.7);\n\n ::slotted(nano-tab) {\n --active-text-color: var(--nano-color-shade, #{nano-color(primary, shade)});\n }\n}\n\n.nano-tab-group {\n display: flex;\n border-radius: 0;\n width: 100%;\n flex: inherit;\n\n &__tabs {\n display: flex;\n position: relative;\n width: 100%;\n }\n\n &__active-tab-indicator {\n position: absolute;\n transition: var(--indicator-transition) transform ease;\n }\n\n &__body {\n background: var(--content-bg);\n }\n\n &:not(.focus-visible) ::slotted(nano-tab) {\n --focus-shadow: none;\n }\n\n .nano-tab-group__nav-container {\n position: relative;\n display: flex;\n background: var(--tabs-container-bg);\n }\n\n button {\n appearance: none;\n background-color: transparent;\n }\n\n &__scroll-button {\n display: flex;\n align-items: center;\n justify-content: center;\n position: absolute;\n top: 0;\n bottom: 0;\n border: unset;\n z-index: 2;\n transition: #{$transition-fast} ease opacity;\n opacity: 0;\n color: var(--scroll-btn-color);\n\n &:focus {\n outline: none;\n }\n\n &.is-shown {\n opacity: 1;\n }\n\n &.focus-visible:focus {\n box-shadow: #{$control-focus-style} inset;\n }\n\n &--left {\n left: 0;\n }\n\n &--right {\n right: 0;\n }\n\n nano-icon {\n font-size: 16px;\n }\n }\n\n ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n // Top\n ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n &--top {\n flex-direction: column;\n\n .nano-tab-group__nav-container {\n &::after {\n content: '';\n width: 86%;\n box-shadow: 0 10px 40px 10px rgba(0, 0, 0, var(--shadow-opacity));\n height: 10px;\n position: absolute;\n left: 7%;\n bottom: -10px;\n border-radius: 10px;\n z-index: -1;\n }\n }\n\n .nano-tab-group__nav {\n @include hide-scrollbar();\n @include padding(\n var(--tabs-padding-top),\n var(--tabs-padding-end),\n var(--tabs-padding-bottom),\n var(--tabs-padding-start)\n );\n\n display: flex;\n overflow-x: auto;\n overflow-y: hidden;\n transition: #{$transition-medium} ease;\n background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=);\n mask-repeat: no-repeat;\n mask-image:\n linear-gradient(\n to left,\n rgba(0, 0, 0, 0) 0,\n rgba(0, 0, 0, 0) var(--tabs-padding-start),\n rgba(0, 0, 0, 1) calc(var(--tabs-padding-start) * 2),\n rgba(0, 0, 0, 1) calc(100% - (var(--tabs-padding-end) * 2)),\n rgba(0, 0, 0, 0) calc(100% - var(--tabs-padding-end)),\n rgba(0, 0, 0, 0)\n );\n mask-size: calc(100% + calc(var(--tabs-padding-end) * 4));\n mask-position: calc(var(--tabs-padding-end) * -2);\n\n &::after {\n content: ' ';\n\n @include padding(\n var(--tabs-padding-top),\n var(--tabs-padding-end),\n var(--tabs-padding-bottom),\n 0\n );\n\n line-height: 1;\n flex: 0 0 auto;\n }\n }\n\n &.nano-tab-group--has-scroll-controls-left {\n .nano-tab-group__nav {\n mask-position: 0;\n mask-size: calc(100% + (var(--tabs-padding-end) * 2));\n }\n }\n\n &.nano-tab-group--has-scroll-controls-right {\n .nano-tab-group__nav {\n mask-position: calc(var(--tabs-padding-end) * -1);\n mask-size: calc(100% + var(--tabs-padding-end));\n }\n }\n\n &.nano-tab-group--has-scroll-controls-left.nano-tab-group--has-scroll-controls-right {\n .nano-tab-group__nav {\n mask-size: 100%;\n mask-position: 0;\n }\n }\n\n .nano-tab-group__tabs {\n flex: 1 1 auto;\n position: relative;\n flex-direction: row;\n text-align: center;\n color: var(--tab-text-color);\n width: auto;\n }\n\n .nano-tab-group__active-tab-indicator {\n bottom: -2px;\n border-bottom: solid var(--indicator-size) var(--indicator-color);\n }\n\n .nano-tab-group__body {\n order: 2;\n background: var(--content-bg);\n position: relative;\n overflow: hidden;\n width: auto;\n display: flex;\n justify-content: center;\n padding: var(--content-padding);\n border-radius: var(--content-border-radius);\n flex: 1 1 auto;\n }\n }\n\n ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n // Start\n ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n &--start {\n flex-direction: row;\n\n .nano-tab-group__tabs {\n flex: 0 0 auto;\n flex-direction: column;\n color: var(--tab-text-color);\n background: rgb(var(--tabs-bg-rgb));\n\n @include ltr-host() {\n border-left: solid var(--indicator-size) var(--indicator-track-color);\n text-align: left;\n }\n\n @include rtl-host() {\n border-right: solid var(--indicator-size) var(--indicator-track-color);\n text-align: right;\n }\n }\n\n .nano-tab-group__active-tab-indicator {\n @include ltr-host() {\n left: calc(-1 * 2px);\n border-left: solid var(--indicator-size) var(--indicator-color);\n }\n\n @include rtl-host() {\n right: calc(-1 * 2px);\n border-right: solid var(--indicator-size) var(--indicator-color);\n }\n }\n\n .nano-tab-group__body {\n flex: 1 1 auto;\n order: 2;\n padding: var(--content-padding);\n overflow: hidden;\n\n @include border-radius(\n 0,\n var(--content-border-radius),\n var(--content-border-radius),\n 0\n );\n }\n }\n}\n","import {\n Component,\n Element,\n ComponentInterface,\n Event,\n EventEmitter,\n Method,\n Prop,\n State,\n Watch,\n h,\n Host,\n Listen,\n} from '@stencil/core';\nimport ResizeObserver from 'resize-observer-polyfill';\n\nimport { scrollIntoView } from '../../utils/scroll';\nimport { focusVisible } from '../../utils/focus-visible';\nimport {\n displayTransition,\n createColorClasses,\n getOffset,\n getDirectChildren,\n} from '../../utils';\nimport { Color } from '../../interface';\nimport {\n ComponentStore,\n StorageMethods,\n} from '../../utils/store/component-store';\n\n/**\n * A tradtional tab implementation. It nests `nano-tab` and `nano-tab-content` sub-components.\n *\n * Tabs can be stacked vertically or horizontally (which presents different styling variations) using the `placement` attribute.\n * Horizonal tabs that don't fit will overflow and scroll appropriately.\n * Tab-content can also be swiped to change tabs.\n *\n * @slot tabs - Add `nano-tab` elements to add clickable tabs.\n * @slot tab-content-header - a header bar displayed above tab content.\n * @slot - Add `nano-tab-content` elements to add tabbable content.\n */\n\n@Component({\n tag: 'nano-tab-group',\n styleUrl: 'tab-group.scss',\n shadow: true,\n})\nexport class TabGroup implements ComponentInterface {\n private activeTab: HTMLNanoTabElement;\n private activePanel: HTMLNanoTabContentElement;\n private activeTabIndicator: HTMLElement;\n private nav: HTMLElement;\n private tabGroup: HTMLElement;\n private tabs: HTMLElement;\n private rightBtn: HTMLButtonElement;\n private leftBtn: HTMLButtonElement;\n\n private isRtl: boolean;\n private initialTouchX: number = null;\n private initialTouchY: number = null;\n\n private resizeObserver: ResizeObserver;\n private mutationObserver: MutationObserver;\n\n @Element() host: HTMLNanoTabGroupElement;\n\n @State() hasScrollControls = false;\n @State() hideControlRight = true;\n @State() hideControlLeft = true;\n @State() isLegacy = !document.head.attachShadow;\n @State() tab: string;\n\n /**\n * The placement of the tabs.\n */\n @Prop() placement: 'top' | 'start' = 'top';\n\n /**\n * Disables the scroll arrows that appear when tabs overflow.\n */\n @Prop() noScrollControls = false;\n\n /**\n * The color to use from the application's color palette.\n */\n @Prop() color?: Color;\n\n /**\n * Store the currently open tab (against this ID) in the component store.\n * Use in conjunction with storeMethod\n */\n @Prop() storeId?: string;\n\n /**\n * The method of storage.\n * Either session storage, url hash (after the '#') or url query (after the '?').\n */\n @Prop() storeMethod: StorageMethods = 'session';\n\n /**\n * Disable 'swipe to change tab' on devices with touch\n */\n @Prop() disableSwipe: boolean;\n\n @Watch('tab')\n handleTabNameChange() {\n if (this.activeTab && this.activeTab.panel === this.tab) return;\n const tab = this.getAllActiveTabs.find((el) => el.panel === this.tab);\n this.setActiveTab(tab);\n }\n\n @Watch('placement')\n handlePlacementChange() {\n this.syncActiveTabIndicator();\n }\n\n @Watch('noScrollControls')\n handleNoScrollControlsChange() {\n this.updateScrollControls();\n }\n\n @Watch('hideControlRight')\n hideRightBtn() {\n if (!this.rightBtn) return;\n displayTransition(this.rightBtn, 'is-shown', !this.hideControlRight);\n }\n\n @Watch('hideControlLeft')\n hideLeftBtn() {\n if (!this.leftBtn) return;\n displayTransition(this.leftBtn, 'is-shown', !this.hideControlLeft);\n }\n\n @Watch('hasScrollControls')\n watchScrollControls() {\n if (this.hasScrollControls) setTimeout((_) => this.handleTabScroll(), 20);\n else\n setTimeout((_) => {\n this.hideControlLeft = this.hideControlRight = true;\n }, 20);\n }\n\n /** Emitted when a tab is shown. */\n @Event() nanoTabShow: EventEmitter<{ name: string }>;\n\n /** Emitted when a tab is hidden. */\n @Event() nanoTabHide: EventEmitter<{ name: string }>;\n\n /** Emitted when the tab is closable and the close button is activated. */\n @Event() nanoTabWillClose: EventEmitter<{ name: string }>;\n\n /** Emitted when a closable tab is removed. */\n @Event() nanoTabClose: EventEmitter<{ name: string }>;\n\n /** Shows the specified tab panel. */\n @Method()\n async show(panel: string) {\n if (this.activeTab && this.activeTab.panel === panel) return;\n\n const tab = this.getAllActiveTabs.find((el) => el.panel === panel);\n\n if (tab) this.setActiveTab(tab);\n }\n\n // Internal Methods\n\n get getAllActiveTabs() {\n return this.getAllTabs.filter((el: any) => !el.disabled);\n }\n\n get getAllTabs() {\n return getDirectChildren<HTMLNanoTabElement>(this.host, 'nano-tab');\n }\n\n get getAllPanels() {\n return getDirectChildren<HTMLNanoTabContentElement>(\n this.host,\n 'nano-tab-content'\n );\n }\n\n get getActiveTab() {\n return this.getAllActiveTabs.find((el) => el.active);\n }\n\n private updateScrollControls = () => {\n if (this.noScrollControls) {\n this.hasScrollControls = false;\n } else {\n this.hasScrollControls =\n ['top'].includes(this.placement) &&\n this.nav.scrollWidth > this.nav.clientWidth &&\n this.nav.scrollWidth > this.tabs.clientWidth;\n }\n };\n\n private setActiveTab(tab: HTMLNanoTabElement, emitEvents = true) {\n if (\n tab &&\n tab !== this.activeTab &&\n !tab.disabled &&\n this.getAllActiveTabs.includes(tab)\n ) {\n const previousTab = this.activeTab;\n this.activeTab = tab;\n this.tab = tab.panel;\n\n // Sync tabs and panels\n this.getAllActiveTabs.map((el) => (el.active = el === this.activeTab));\n this.getAllPanels.map((el) => {\n if (el.name === this.activeTab.panel) {\n el.active = true;\n this.activePanel = el;\n } else el.active = false;\n el.removeAttribute('animation-dir');\n });\n // active tab can be changed on init - this won't be ready. No big thing\n this.syncActiveTabIndicator();\n if (['top'].includes(this.placement)) {\n scrollIntoView(this.activeTab, this.nav, 'horizontal', 'center');\n }\n\n // Emit events\n if (emitEvents) {\n if (previousTab) {\n this.nanoTabHide.emit({ name: previousTab.panel });\n }\n\n this.nanoTabShow.emit({ name: this.activeTab.panel });\n }\n }\n }\n\n private setAriaLabels() {\n const tabs = this.getAllActiveTabs;\n const panels = this.getAllPanels;\n\n // Link each tab with its corresponding panel\n tabs.map((tab) => {\n const panel = panels.find((el) => el.name === tab.panel);\n if (panel) {\n tab.setAttribute('aria-controls', panel.getAttribute('id'));\n panel.setAttribute('aria-labelledby', tab.getAttribute('id'));\n }\n });\n }\n\n private syncActiveTabIndicator() {\n this.getAllTabs.forEach((tab) =>\n tab.setAttribute(\n 'direction',\n this.placement === 'top' ? 'horizontal' : 'vertical'\n )\n );\n\n const tab = this.getActiveTab;\n const width = tab.shadowRoot.querySelector('.nanotab')?.clientWidth || 0;\n const height = tab.clientHeight;\n const offset = getOffset(tab, this.tabs);\n const offsetTop = offset.top + this.nav.scrollTop;\n const offsetLeft = offset.left;\n\n switch (this.placement) {\n case 'top':\n this.activeTabIndicator.style.width = `${width}px`;\n this.activeTabIndicator.style.height = null;\n this.activeTabIndicator.style.transform = `translateX(${offsetLeft}px)`;\n break;\n\n case 'start':\n this.activeTabIndicator.style.width = null;\n this.activeTabIndicator.style.height = `${height}px`;\n this.activeTabIndicator.style.transform = `translateY(${offsetTop}px)`;\n break;\n }\n }\n\n private getNavWidth() {\n if (!this.nav) return 0;\n const computedStyle = getComputedStyle(this.nav);\n let clientWidth = this.nav.clientWidth;\n return (clientWidth -=\n parseFloat(computedStyle.paddingLeft) +\n parseFloat(computedStyle.paddingRight));\n }\n\n // Event handlers\n\n @Listen('nanoTabClose')\n handleTabClose(ev: CustomEvent & { target: HTMLNanoTabElement }) {\n let tabIndex = this.getAllActiveTabs.indexOf(ev.target);\n const tab = ev.target;\n if (tabIndex < 0) return;\n\n const panel = this.getAllPanels.find((el) => el.name === tab.panel);\n if (!panel) return;\n\n ev.stopImmediatePropagation();\n\n const closeEv = this.nanoTabWillClose.emit({ name: tab.panel });\n if (closeEv.defaultPrevented) return;\n\n // Show the previous tab if the tab is currently active\n if (tab.active) {\n tabIndex = tabIndex === 0 ? 1 : tabIndex - 1;\n const prevTab = this.getAllActiveTabs[tabIndex]?.panel;\n if (prevTab) this.host.show(prevTab);\n }\n\n tab.remove();\n panel.remove();\n this.nanoTabClose.emit({ name: tab.panel });\n }\n\n private handleClick = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n const tab = target.closest('nano-tab');\n\n if (tab) this.setActiveTab(tab);\n };\n\n private handleKeyDown = (event: KeyboardEvent) => {\n // Activate a tab\n if (['Enter', ' '].includes(event.key)) {\n const target = event.target as HTMLElement;\n const tab = target.closest('nano-tab');\n\n if (tab) {\n this.setActiveTab(tab);\n event.preventDefault();\n }\n }\n\n // Move focus left or right\n if (\n [\n 'ArrowLeft',\n 'ArrowRight',\n 'ArrowUp',\n 'ArrowDown',\n 'Home',\n 'End',\n ].includes(event.key)\n ) {\n const activeEl = document.activeElement as any;\n\n if (activeEl && activeEl.tagName.toLowerCase() === 'nano-tab') {\n const tabs = this.getAllActiveTabs;\n let index = tabs.indexOf(activeEl);\n\n if (event.key === 'Home') {\n index = 0;\n } else if (event.key === 'End') {\n index = tabs.length - 1;\n } else if (\n (this.isRtl && event.key === 'ArrowRight') ||\n (!this.isRtl && event.key === 'ArrowLeft')\n ) {\n index = Math.max(0, index - 1);\n } else if (\n (this.isRtl && event.key === 'ArrowLeft') ||\n (!this.isRtl && event.key === 'ArrowRight')\n ) {\n index = Math.min(tabs.length - 1, index + 1);\n }\n tabs[index].setFocus();\n\n if (['top'].includes(this.placement)) {\n scrollIntoView(tabs[index], this.nav, 'horizontal', 'center');\n }\n event.preventDefault();\n }\n }\n };\n\n private handleTabScroll = () => {\n if (!this.hasScrollControls) {\n this.hideControlLeft = this.hideControlRight = true;\n return;\n }\n let endRight = this.isRtl\n ? this.nav.scrollLeft === 0\n : this.nav.scrollWidth - this.nav.scrollLeft === this.nav.clientWidth;\n let endLeft = this.isRtl\n ? this.nav.scrollWidth + this.nav.scrollLeft === this.nav.clientWidth\n : this.nav.scrollLeft === 0;\n\n if (endLeft) {\n this.hideControlLeft = true;\n this.hideControlRight = false;\n } else if (endRight) {\n this.hideControlLeft = false;\n this.hideControlRight = true;\n } else {\n this.hideControlRight = false;\n this.hideControlLeft = false;\n }\n };\n\n private handleBtnClick = (goRight: boolean = false) => {\n const navWidth = this.getNavWidth();\n let leftAmt;\n if (goRight) leftAmt = this.nav.scrollLeft + navWidth - 20;\n else leftAmt = this.nav.scrollLeft - navWidth + 20;\n\n try {\n this.nav.scroll({\n left: leftAmt,\n behavior: 'smooth',\n });\n } catch (e) {\n this.nav.scrollLeft = leftAmt;\n }\n };\n\n private handleTouchStart = (event: TouchEvent) => {\n if (this.disableSwipe) return;\n const touch = event.changedTouches[0];\n this.initialTouchX = touch.pageX;\n this.initialTouchY = touch.pageY;\n };\n\n private handleTouchEnd = (event: TouchEvent) => {\n if (this.disableSwipe) return;\n const touch = event.changedTouches[0];\n const distX = touch.pageX - this.initialTouchX; // get horizontal dist traveled\n const distY = touch.pageY - this.initialTouchY; // get vertical dist traveled\n const threshold = 70;\n\n var xDiff = this.initialTouchX - touch.clientX;\n var yDiff = this.initialTouchY - touch.clientY;\n\n const isHorizontalSwipe =\n Math.abs(distX) >= threshold && Math.abs(distY) <= threshold;\n\n const tabs = this.getAllActiveTabs;\n const currIndex = tabs.findIndex((el) => el.active);\n\n if (isHorizontalSwipe) {\n const toGo =\n (distX < 0 && this.placement === 'top') ||\n (distX > 0 && this.placement !== 'top')\n ? 1\n : -1;\n\n if (tabs[currIndex + toGo]) {\n this.setActiveTab(tabs[currIndex + toGo]);\n\n if (Math.abs(xDiff) > Math.abs(yDiff)) {\n if (xDiff > 0) this.activePanel.setAttribute('animation-dir', 'left');\n else this.activePanel.setAttribute('animation-dir', 'right');\n }\n }\n }\n this.initialTouchX = null;\n this.initialTouchY = null;\n };\n\n // Stencil hooks\n\n componentDidLoad() {\n // Initial IO - watching for all content to be loaded\n const observer = new IntersectionObserver((entries, observer) => {\n if (entries[0].intersectionRatio > 0) {\n this.setAriaLabels();\n this.setActiveTab(this.getActiveTab || this.getAllActiveTabs[0], false);\n\n if (this.storeId)\n ComponentStore.init(this, ['tab'], this.storeMethod, this.storeId);\n observer.unobserve(entries[0].target);\n }\n });\n observer.observe(this.host);\n focusVisible.observe(this.tabGroup);\n\n if (this.leftBtn) {\n focusVisible.observe(this.leftBtn);\n focusVisible.observe(this.rightBtn);\n }\n\n this.resizeObserver = new ResizeObserver(() => this.updateScrollControls());\n this.resizeObserver.observe(this.nav);\n\n this.mutationObserver = new MutationObserver((mutations) => {\n if (\n mutations.some((mutation) => {\n return !['aria-labelledby', 'aria-controls'].includes(\n mutation.attributeName\n );\n })\n ) {\n setTimeout(() => this.setAriaLabels());\n }\n setTimeout(() => this.handleTabScroll(), 500);\n\n this.setActiveTab(this.getActiveTab || this.getAllActiveTabs[0], false);\n if (this.activeTab)\n scrollIntoView(this.activeTab, this.nav, 'horizontal', 'center');\n });\n this.mutationObserver.observe(this.host, {\n attributes: true,\n childList: true,\n subtree: true,\n });\n\n requestAnimationFrame(() => this.updateScrollControls());\n }\n\n connectedCallback() {\n this.isRtl =\n this.host.dir === 'rtl' ||\n (this.host.ownerDocument as Document).dir === 'rtl';\n }\n\n disconnectedCallback() {\n if (this.mutationObserver) this.mutationObserver.disconnect();\n\n focusVisible.unobserve(this.tabGroup);\n if (this.leftBtn) {\n focusVisible.unobserve(this.leftBtn);\n focusVisible.unobserve(this.rightBtn);\n }\n if (this.resizeObserver) this.resizeObserver.unobserve(this.nav);\n }\n\n render() {\n this.isRtl = (this.host.ownerDocument as Document).dir === 'rtl';\n\n return (\n <Host\n class={{ ...createColorClasses(this.color), legacy: this.isLegacy }}\n dir={this.isRtl ? 'rtl' : null}\n >\n <div\n part=\"base\"\n ref={(el) => (this.tabGroup = el)}\n class={{\n 'nano-tab-group': true,\n 'nano-tab-group--top': this.placement === 'top',\n 'nano-tab-group--start': this.placement === 'start',\n 'nano-tab-group--has-scroll-controls': this.hasScrollControls,\n 'nano-tab-group--has-scroll-controls-left': !this.hideControlLeft,\n 'nano-tab-group--has-scroll-controls-right': !this.hideControlRight,\n }}\n onClick={this.handleClick}\n onKeyDown={this.handleKeyDown}\n >\n <div class=\"nano-tab-group__nav-container\">\n {this.placement === 'top' && (\n <button\n class={{\n 'nano-tab-group__scroll-button': true,\n 'nano-tab-group__scroll-button--left': true,\n }}\n ref={(btn) => (this.leftBtn = btn)}\n onClick={() => this.handleBtnClick(false)}\n >\n <nano-icon name=\"light/chevron-left\"></nano-icon>\n </button>\n )}\n <div\n ref={(el) => (this.nav = el)}\n key=\"nav\"\n part=\"nav\"\n class=\"nano-tab-group__nav\"\n onScroll={this.handleTabScroll}\n >\n <div\n ref={(el) => (this.tabs = el)}\n part=\"tabs\"\n class=\"nano-tab-group__tabs\"\n role=\"tablist\"\n >\n <div\n ref={(el) => (this.activeTabIndicator = el)}\n part=\"active-tab-indicator\"\n class=\"nano-tab-group__active-tab-indicator\"\n />\n <slot name=\"tabs\" />\n </div>\n </div>\n {this.placement === 'top' && (\n <button\n class={{\n 'nano-tab-group__scroll-button': true,\n 'nano-tab-group__scroll-button--right': true,\n }}\n ref={(btn) => (this.rightBtn = btn)}\n onClick={() => this.handleBtnClick(true)}\n >\n <nano-icon name=\"light/chevron-right\"></nano-icon>\n </button>\n )}\n </div>\n <slot name=\"tab-content-header\" />\n <div\n part=\"body\"\n class=\"nano-tab-group__body\"\n onTouchStart={this.handleTouchStart}\n onTouchEnd={this.handleTouchEnd}\n >\n <slot />\n </div>\n </div>\n </Host>\n );\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["src/components/tabs/tab-group.scss?tag=nano-tab-group&encapsulation=shadow","src/components/tabs/tab-group.tsx"],"names":["tabGroupCss","TabGroup","[object Object]","hostRef","this","initialTouchX","initialTouchY","hasScrollControls","hideControlRight","hideControlLeft","isLegacy","document","head","attachShadow","placement","noScrollControls","storeMethod","updateScrollControls","includes","nav","scrollWidth","clientWidth","tabs","handleClick","event","target","tab","closest","setActiveTab","handleKeyDown","key","preventDefault","activeEl","activeElement","tagName","toLowerCase","getAllActiveTabs","index","indexOf","length","isRtl","Math","max","min","setFocus","scrollIntoView","handleTabScroll","endRight","scrollLeft","endLeft","handleBtnClick","goRight","navWidth","getNavWidth","leftAmt","scroll","left","behavior","e","handleTouchStart","disableSwipe","touch","changedTouches","pageX","pageY","handleTouchEnd","distX","distY","threshold","xDiff","clientX","yDiff","clientY","isHorizontalSwipe","abs","currIndex","findIndex","el","active","toGo","activePanel","setAttribute","activeTab","panel","find","syncActiveTabIndicator","rightBtn","displayTransition","leftBtn","setTimeout","_","getAllTabs","filter","disabled","getDirectChildren","host","getAllPanels","getActiveTab","emitEvents","previousTab","map","name","removeAttribute","nanoTabHide","emit","nanoTabShow","panels","getAttribute","forEach","width","_a","shadowRoot","querySelector","height","clientHeight","offset","getOffset","offsetTop","top","scrollTop","offsetLeft","activeTabIndicator","style","transform","computedStyle","getComputedStyle","parseFloat","paddingLeft","paddingRight","ev","tabIndex","stopImmediatePropagation","closeEv","nanoTabWillClose","defaultPrevented","prevTab","show","remove","nanoTabClose","observer","IntersectionObserver","entries","intersectionRatio","setAriaLabels","storeId","ComponentStore","init","unobserve","observe","focusVisible","tabGroup","resizeObserver","ResizeObserver","mutationObserver","MutationObserver","mutations","some","mutation","attributeName","attributes","childList","subtree","requestAnimationFrame","dir","ownerDocument","disconnect","h","Host","class","Object","assign","createColorClasses","color","legacy","part","ref","nano-tab-group","nano-tab-group--top","nano-tab-group--start","nano-tab-group--has-scroll-controls","nano-tab-group--has-scroll-controls-left","nano-tab-group--has-scroll-controls-right","onClick","onKeyDown","nano-tab-group__scroll-button","nano-tab-group__scroll-button--left","btn","onScroll","role","nano-tab-group__scroll-button--right","onTouchStart","onTouchEnd"],"mappings":";;;8WAAA,MAAMA,EAAc,k0TC+CPC,EAAQ,MALrBC,YAAAC,6LAgBUC,KAAAC,cAAwB,KACxBD,KAAAE,cAAwB,KAOvBF,KAAAG,kBAAoB,MACpBH,KAAAI,iBAAmB,KACnBJ,KAAAK,gBAAkB,KAClBL,KAAAM,UAAYC,SAASC,KAAKC,aAM3BT,KAAAU,UAA6B,MAK7BV,KAAAW,iBAAmB,MAiBnBX,KAAAY,YAA8B,UAwF9BZ,KAAAa,qBAAuB,KAC7B,GAAIb,KAAKW,iBAAkB,CACzBX,KAAKG,kBAAoB,UACpB,CACLH,KAAKG,kBACH,CAAC,OAAOW,SAASd,KAAKU,YACtBV,KAAKe,IAAIC,YAAchB,KAAKe,IAAIE,aAChCjB,KAAKe,IAAIC,YAAchB,KAAKkB,KAAKD,cA0H/BjB,KAAAmB,YAAeC,IACrB,MAAMC,EAASD,EAAMC,OACrB,MAAMC,EAAMD,EAAOE,QAAQ,YAE3B,GAAID,EAAKtB,KAAKwB,aAAaF,IAGrBtB,KAAAyB,cAAiBL,IAEvB,GAAI,CAAC,QAAS,KAAKN,SAASM,EAAMM,KAAM,CACtC,MAAML,EAASD,EAAMC,OACrB,MAAMC,EAAMD,EAAOE,QAAQ,YAE3B,GAAID,EAAK,CACPtB,KAAKwB,aAAaF,GAClBF,EAAMO,kBAKV,GACE,CACE,YACA,aACA,UACA,YACA,OACA,OACAb,SAASM,EAAMM,KACjB,CACA,MAAME,EAAWrB,SAASsB,cAE1B,GAAID,GAAYA,EAASE,QAAQC,gBAAkB,WAAY,CAC7D,MAAMb,EAAOlB,KAAKgC,iBAClB,IAAIC,EAAQf,EAAKgB,QAAQN,GAEzB,GAAIR,EAAMM,MAAQ,OAAQ,CACxBO,EAAQ,OACH,GAAIb,EAAMM,MAAQ,MAAO,CAC9BO,EAAQf,EAAKiB,OAAS,OACjB,GACJnC,KAAKoC,OAAShB,EAAMM,MAAQ,eAC3B1B,KAAKoC,OAAShB,EAAMM,MAAQ,YAC9B,CACAO,EAAQI,KAAKC,IAAI,EAAGL,EAAQ,QACvB,GACJjC,KAAKoC,OAAShB,EAAMM,MAAQ,cAC3B1B,KAAKoC,OAAShB,EAAMM,MAAQ,aAC9B,CACAO,EAAQI,KAAKE,IAAIrB,EAAKiB,OAAS,EAAGF,EAAQ,GAE5Cf,EAAKe,GAAOO,WAEZ,GAAI,CAAC,OAAO1B,SAASd,KAAKU,WAAY,CACpC+B,EAAevB,EAAKe,GAAQjC,KAAKe,IAAK,aAAc,UAEtDK,EAAMO,oBAKJ3B,KAAA0C,gBAAkB,KACxB,IAAK1C,KAAKG,kBAAmB,CAC3BH,KAAKK,gBAAkBL,KAAKI,iBAAmB,KAC/C,OAEF,IAAIuC,EAAW3C,KAAKoC,MAChBpC,KAAKe,IAAI6B,aAAe,EACxB5C,KAAKe,IAAIC,YAAchB,KAAKe,IAAI6B,aAAe5C,KAAKe,IAAIE,YAC5D,IAAI4B,EAAU7C,KAAKoC,MACfpC,KAAKe,IAAIC,YAAchB,KAAKe,IAAI6B,aAAe5C,KAAKe,IAAIE,YACxDjB,KAAKe,IAAI6B,aAAe,EAE5B,GAAIC,EAAS,CACX7C,KAAKK,gBAAkB,KACvBL,KAAKI,iBAAmB,WACnB,GAAIuC,EAAU,CACnB3C,KAAKK,gBAAkB,MACvBL,KAAKI,iBAAmB,SACnB,CACLJ,KAAKI,iBAAmB,MACxBJ,KAAKK,gBAAkB,QAInBL,KAAA8C,eAAiB,CAACC,EAAmB,SAC3C,MAAMC,EAAWhD,KAAKiD,cACtB,IAAIC,EACJ,GAAIH,EAASG,EAAUlD,KAAKe,IAAI6B,WAAaI,EAAW,QACnDE,EAAUlD,KAAKe,IAAI6B,WAAaI,EAAW,GAEhD,IACEhD,KAAKe,IAAIoC,OAAO,CACdC,KAAMF,EACNG,SAAU,WAEZ,MAAOC,GACPtD,KAAKe,IAAI6B,WAAaM,IAIlBlD,KAAAuD,iBAAoBnC,IAC1B,GAAIpB,KAAKwD,aAAc,OACvB,MAAMC,EAAQrC,EAAMsC,eAAe,GACnC1D,KAAKC,cAAgBwD,EAAME,MAC3B3D,KAAKE,cAAgBuD,EAAMG,OAGrB5D,KAAA6D,eAAkBzC,IACxB,GAAIpB,KAAKwD,aAAc,OACvB,MAAMC,EAAQrC,EAAMsC,eAAe,GACnC,MAAMI,EAAQL,EAAME,MAAQ3D,KAAKC,cACjC,MAAM8D,EAAQN,EAAMG,MAAQ5D,KAAKE,cACjC,MAAM8D,EAAY,GAElB,IAAIC,EAAQjE,KAAKC,cAAgBwD,EAAMS,QACvC,IAAIC,EAAQnE,KAAKE,cAAgBuD,EAAMW,QAEvC,MAAMC,EACJhC,KAAKiC,IAAIR,IAAUE,GAAa3B,KAAKiC,IAAIP,IAAUC,EAErD,MAAM9C,EAAOlB,KAAKgC,iBAClB,MAAMuC,EAAYrD,EAAKsD,WAAWC,GAAOA,EAAGC,SAE5C,GAAIL,EAAmB,CACrB,MAAMM,EACHb,EAAQ,GAAK9D,KAAKU,YAAc,OAChCoD,EAAQ,GAAK9D,KAAKU,YAAc,MAC7B,GACC,EAEP,GAAIQ,EAAKqD,EAAYI,GAAO,CAC1B3E,KAAKwB,aAAaN,EAAKqD,EAAYI,IAEnC,GAAItC,KAAKiC,IAAIL,GAAS5B,KAAKiC,IAAIH,GAAQ,CACrC,GAAIF,EAAQ,EAAGjE,KAAK4E,YAAYC,aAAa,gBAAiB,aACzD7E,KAAK4E,YAAYC,aAAa,gBAAiB,WAI1D7E,KAAKC,cAAgB,KACrBD,KAAKE,cAAgB,MA9VvBJ,sBACE,GAAIE,KAAK8E,WAAa9E,KAAK8E,UAAUC,QAAU/E,KAAKsB,IAAK,OACzD,MAAMA,EAAMtB,KAAKgC,iBAAiBgD,MAAMP,GAAOA,EAAGM,QAAU/E,KAAKsB,MACjEtB,KAAKwB,aAAaF,GAIpBxB,wBACEE,KAAKiF,yBAIPnF,+BACEE,KAAKa,uBAIPf,eACE,IAAKE,KAAKkF,SAAU,OACpBC,EAAkBnF,KAAKkF,SAAU,YAAalF,KAAKI,kBAIrDN,cACE,IAAKE,KAAKoF,QAAS,OACnBD,EAAkBnF,KAAKoF,QAAS,YAAapF,KAAKK,iBAIpDP,sBACE,GAAIE,KAAKG,kBAAmBkF,YAAYC,GAAMtF,KAAK0C,mBAAmB,SAEpE2C,YAAYC,IACVtF,KAAKK,gBAAkBL,KAAKI,iBAAmB,OAC9C,IAiBPN,WAAWiF,GACT,GAAI/E,KAAK8E,WAAa9E,KAAK8E,UAAUC,QAAUA,EAAO,OAEtD,MAAMzD,EAAMtB,KAAKgC,iBAAiBgD,MAAMP,GAAOA,EAAGM,QAAUA,IAE5D,GAAIzD,EAAKtB,KAAKwB,aAAaF,GAK7BU,uBACE,OAAOhC,KAAKuF,WAAWC,QAAQf,IAAaA,EAAGgB,WAGjDF,iBACE,OAAOG,EAAsC1F,KAAK2F,KAAM,YAG1DC,mBACE,OAAOF,EACL1F,KAAK2F,KACL,oBAIJE,mBACE,OAAO7F,KAAKgC,iBAAiBgD,MAAMP,GAAOA,EAAGC,SAcvC5E,aAAawB,EAAyBwE,EAAa,MACzD,GACExE,GACAA,IAAQtB,KAAK8E,YACZxD,EAAImE,UACLzF,KAAKgC,iBAAiBlB,SAASQ,GAC/B,CACA,MAAMyE,EAAc/F,KAAK8E,UACzB9E,KAAK8E,UAAYxD,EACjBtB,KAAKsB,IAAMA,EAAIyD,MAGf/E,KAAKgC,iBAAiBgE,KAAKvB,GAAQA,EAAGC,OAASD,IAAOzE,KAAK8E,YAC3D9E,KAAK4F,aAAaI,KAAKvB,IACrB,GAAIA,EAAGwB,OAASjG,KAAK8E,UAAUC,MAAO,CACpCN,EAAGC,OAAS,KACZ1E,KAAK4E,YAAcH,OACdA,EAAGC,OAAS,MACnBD,EAAGyB,gBAAgB,oBAGrBlG,KAAKiF,yBACL,GAAI,CAAC,OAAOnE,SAASd,KAAKU,WAAY,CACpC+B,EAAezC,KAAK8E,UAAW9E,KAAKe,IAAK,aAAc,UAIzD,GAAI+E,EAAY,CACd,GAAIC,EAAa,CACf/F,KAAKmG,YAAYC,KAAK,CAAEH,KAAMF,EAAYhB,QAG5C/E,KAAKqG,YAAYD,KAAK,CAAEH,KAAMjG,KAAK8E,UAAUC,UAK3CjF,gBACN,MAAMoB,EAAOlB,KAAKgC,iBAClB,MAAMsE,EAAStG,KAAK4F,aAGpB1E,EAAK8E,KAAK1E,IACR,MAAMyD,EAAQuB,EAAOtB,MAAMP,GAAOA,EAAGwB,OAAS3E,EAAIyD,QAClD,GAAIA,EAAO,CACTzD,EAAIuD,aAAa,gBAAiBE,EAAMwB,aAAa,OACrDxB,EAAMF,aAAa,kBAAmBvD,EAAIiF,aAAa,WAKrDzG,+BACNE,KAAKuF,WAAWiB,SAASlF,GACvBA,EAAIuD,aACF,YACA7E,KAAKU,YAAc,MAAQ,aAAe,cAI9C,MAAMY,EAAMtB,KAAK6F,aACjB,MAAMY,IAAQC,EAAApF,EAAIqF,WAAWC,cAAc,eAAW,MAAAF,SAAA,OAAA,EAAAA,EAAEzF,cAAe,EACvE,MAAM4F,EAASvF,EAAIwF,aACnB,MAAMC,EAASC,EAAU1F,EAAKtB,KAAKkB,MACnC,MAAM+F,EAAYF,EAAOG,IAAMlH,KAAKe,IAAIoG,UACxC,MAAMC,EAAaL,EAAO3D,KAE1B,OAAQpD,KAAKU,WACX,IAAK,MACHV,KAAKqH,mBAAmBC,MAAMb,MAAQ,GAAGA,MACzCzG,KAAKqH,mBAAmBC,MAAMT,OAAS,KACvC7G,KAAKqH,mBAAmBC,MAAMC,UAAY,cAAcH,OACxD,MAEF,IAAK,QACHpH,KAAKqH,mBAAmBC,MAAMb,MAAQ,KACtCzG,KAAKqH,mBAAmBC,MAAMT,OAAS,GAAGA,MAC1C7G,KAAKqH,mBAAmBC,MAAMC,UAAY,cAAcN,OACxD,OAIEnH,cACN,IAAKE,KAAKe,IAAK,OAAO,EACtB,MAAMyG,EAAgBC,iBAAiBzH,KAAKe,KAC5C,IAAIE,EAAcjB,KAAKe,IAAIE,YAC3B,OAAQA,GACNyG,WAAWF,EAAcG,aACzBD,WAAWF,EAAcI,cAM7B9H,eAAe+H,SACb,IAAIC,EAAW9H,KAAKgC,iBAAiBE,QAAQ2F,EAAGxG,QAChD,MAAMC,EAAMuG,EAAGxG,OACf,GAAIyG,EAAW,EAAG,OAElB,MAAM/C,EAAQ/E,KAAK4F,aAAaZ,MAAMP,GAAOA,EAAGwB,OAAS3E,EAAIyD,QAC7D,IAAKA,EAAO,OAEZ8C,EAAGE,2BAEH,MAAMC,EAAUhI,KAAKiI,iBAAiB7B,KAAK,CAAEH,KAAM3E,EAAIyD,QACvD,GAAIiD,EAAQE,iBAAkB,OAG9B,GAAI5G,EAAIoD,OAAQ,CACdoD,EAAWA,IAAa,EAAI,EAAIA,EAAW,EAC3C,MAAMK,GAAUzB,EAAA1G,KAAKgC,iBAAiB8F,MAAS,MAAApB,SAAA,OAAA,EAAAA,EAAE3B,MACjD,GAAIoD,EAASnI,KAAK2F,KAAKyC,KAAKD,GAG9B7G,EAAI+G,SACJtD,EAAMsD,SACNrI,KAAKsI,aAAalC,KAAK,CAAEH,KAAM3E,EAAIyD,QAqJrCjF,mBAEE,MAAMyI,EAAW,IAAIC,sBAAqB,CAACC,EAASF,KAClD,GAAIE,EAAQ,GAAGC,kBAAoB,EAAG,CACpC1I,KAAK2I,gBACL3I,KAAKwB,aAAaxB,KAAK6F,cAAgB7F,KAAKgC,iBAAiB,GAAI,OAEjE,GAAIhC,KAAK4I,QACPC,EAAeC,KAAK9I,KAAM,CAAC,OAAQA,KAAKY,YAAaZ,KAAK4I,SAC5DL,EAASQ,UAAUN,EAAQ,GAAGpH,YAGlCkH,EAASS,QAAQhJ,KAAK2F,MACtBsD,EAAaD,QAAQhJ,KAAKkJ,UAE1B,GAAIlJ,KAAKoF,QAAS,CAChB6D,EAAaD,QAAQhJ,KAAKoF,SAC1B6D,EAAaD,QAAQhJ,KAAKkF,UAG5BlF,KAAKmJ,eAAiB,IAAIC,GAAe,IAAMpJ,KAAKa,yBACpDb,KAAKmJ,eAAeH,QAAQhJ,KAAKe,KAEjCf,KAAKqJ,iBAAmB,IAAIC,kBAAkBC,IAC5C,GACEA,EAAUC,MAAMC,IACN,CAAC,kBAAmB,iBAAiB3I,SAC3C2I,EAASC,iBAGb,CACArE,YAAW,IAAMrF,KAAK2I,kBAExBtD,YAAW,IAAMrF,KAAK0C,mBAAmB,KAEzC1C,KAAKwB,aAAaxB,KAAK6F,cAAgB7F,KAAKgC,iBAAiB,GAAI,OACjE,GAAIhC,KAAK8E,UACPrC,EAAezC,KAAK8E,UAAW9E,KAAKe,IAAK,aAAc,aAE3Df,KAAKqJ,iBAAiBL,QAAQhJ,KAAK2F,KAAM,CACvCgE,WAAY,KACZC,UAAW,KACXC,QAAS,OAGXC,uBAAsB,IAAM9J,KAAKa,yBAGnCf,oBACEE,KAAKoC,MACHpC,KAAK2F,KAAKoE,MAAQ,OACjB/J,KAAK2F,KAAKqE,cAA2BD,MAAQ,MAGlDjK,uBACE,GAAIE,KAAKqJ,iBAAkBrJ,KAAKqJ,iBAAiBY,aAEjDhB,EAAaF,UAAU/I,KAAKkJ,UAC5B,GAAIlJ,KAAKoF,QAAS,CAChB6D,EAAaF,UAAU/I,KAAKoF,SAC5B6D,EAAaF,UAAU/I,KAAKkF,UAE9B,GAAIlF,KAAKmJ,eAAgBnJ,KAAKmJ,eAAeJ,UAAU/I,KAAKe,KAG9DjB,SACEE,KAAKoC,MAASpC,KAAK2F,KAAKqE,cAA2BD,MAAQ,MAE3D,OACEG,EAACC,EAAI,CACHC,MAAKC,OAAAC,OAAAD,OAAAC,OAAA,GAAOC,EAAmBvK,KAAKwK,QAAM,CAAEC,OAAQzK,KAAKM,WACzDyJ,IAAK/J,KAAKoC,MAAQ,MAAQ,MAE1B8H,EAAA,MAAA,CACEQ,KAAK,OACLC,IAAMlG,GAAQzE,KAAKkJ,SAAWzE,EAC9B2F,MAAO,CACLQ,iBAAkB,KAClBC,sBAAuB7K,KAAKU,YAAc,MAC1CoK,wBAAyB9K,KAAKU,YAAc,QAC5CqK,sCAAuC/K,KAAKG,kBAC5C6K,4CAA6ChL,KAAKK,gBAClD4K,6CAA8CjL,KAAKI,kBAErD8K,QAASlL,KAAKmB,YACdgK,UAAWnL,KAAKyB,eAEhByI,EAAA,MAAA,CAAKE,MAAM,iCACRpK,KAAKU,YAAc,OAClBwJ,EAAA,SAAA,CACEE,MAAO,CACLgB,gCAAiC,KACjCC,sCAAuC,MAEzCV,IAAMW,GAAStL,KAAKoF,QAAUkG,EAC9BJ,QAAS,IAAMlL,KAAK8C,eAAe,QAEnCoH,EAAA,YAAA,CAAWjE,KAAK,wBAGpBiE,EAAA,MAAA,CACES,IAAMlG,GAAQzE,KAAKe,IAAM0D,EACzB/C,IAAI,MACJgJ,KAAK,MACLN,MAAM,sBACNmB,SAAUvL,KAAK0C,iBAEfwH,EAAA,MAAA,CACES,IAAMlG,GAAQzE,KAAKkB,KAAOuD,EAC1BiG,KAAK,OACLN,MAAM,uBACNoB,KAAK,WAELtB,EAAA,MAAA,CACES,IAAMlG,GAAQzE,KAAKqH,mBAAqB5C,EACxCiG,KAAK,uBACLN,MAAM,yCAERF,EAAA,OAAA,CAAMjE,KAAK,WAGdjG,KAAKU,YAAc,OAClBwJ,EAAA,SAAA,CACEE,MAAO,CACLgB,gCAAiC,KACjCK,uCAAwC,MAE1Cd,IAAMW,GAAStL,KAAKkF,SAAWoG,EAC/BJ,QAAS,IAAMlL,KAAK8C,eAAe,OAEnCoH,EAAA,YAAA,CAAWjE,KAAK,0BAItBiE,EAAA,OAAA,CAAMjE,KAAK,uBACXiE,EAAA,MAAA,CACEQ,KAAK,OACLN,MAAM,uBACNsB,aAAc1L,KAAKuD,iBACnBoI,WAAY3L,KAAK6D,gBAEjBqG,EAAA,OAAA","sourcesContent":["@import '../../global/style/utilities/globals';\n@import '../../global/style/nano-theme/form';\n@import '../../global/style/nano-theme/base';\n@import '../../global/style/nano-theme/layers';\n\n/**\n * @prop --indicator-transition: Only relevant to placement 'start'. defaults to #{$transition-fast};\n * @prop --indicator-color: defaults to #{$color-lightblue} on placement 'top' and #{$color-blue} on placement 'start';\n * @prop --indicator-track-color: Only relevant to placement 'start'. defaults to #{$color-lightgrey};\n * @prop --indicator-size: defaults to 5px on placement 'top' and 2px on placement 'start';\n\n * @prop --border-radius: defaults to #{$layer-border-radius};\n * @prop --background-rgb: will be used as the default background colour for tabs and content. defaults to #{$layer-bg-color-rgb};\n * @prop --shadow-opacity: opacity of the shadow behind tabs. defaults to 0.1;\n * @prop --scroll-btn-color: defaults to 'currentColor';\n\n * @prop --content-padding: defaults to 2rem 2.5rem;\n * @prop --content-bg: defaults to rgb(var(--background-rgb));\n * @prop --content-border-radius: defaults to var(--border-radius);\n\n * @prop --tabs-padding-start: defaults to 2.5rem on placement 'top' and 0 on placement 'start';\n * @prop --tabs-padding-end: defaults to 2.5rem on placement 'top' and 0 on placement 'start';\n * @prop --tabs-padding-top: defaults to 0;\n * @prop --tabs-padding-bottom: defaults to 0;\n * @prop --tabs-bg-rgb: defaults to var(--bg-color);\n * @prop --tab-border-radius: defaults to var(--border-radius);\n * @prop --tab-text-color: defaults to #{$color-blue} on placement 'top' and #{$color-darkgrey} on placement 'start';\n */\n\n:host {\n --indicator-transition: #{$transition-fast};\n --indicator-color: #{$color-lightblue};\n --indicator-track-color: #{$color-lightgrey};\n --indicator-size: 0;\n --border-radius: #{$layer-border-radius};\n --background-rgb: #{$layer-bg-color-rgb};\n --scroll-btn-color: 'currentColor';\n --content-padding: 2rem 2.5rem;\n --content-bg: rgb(var(--background-rgb));\n --content-border-radius: var(--border-radius);\n --tabs-padding-start: 2.5rem;\n --tabs-padding-end: 2.5rem;\n --tabs-padding-top: 0;\n --tabs-padding-bottom: 0;\n --tabs-container-bg: 'transparent';\n --tabs-bg-rgb: var(--background-rgb);\n --tab-border-radius: var(--border-radius);\n --tab-text-color: #{$color-blue};\n --shadow-opacity: 0.1;\n\n display: block;\n position: relative;\n z-index: #{$layer-index-raised};\n\n @media only screen and (max-width: 768px) {\n --tabs-padding-start: 1.5rem;\n --tabs-padding-end: 1.5rem;\n }\n\n ::slotted(nano-tab) {\n --tab-indicator-color: var(--indicator-color);\n --bg-rgb: var(--tabs-bg-rgb);\n --border-radius: var(--tab-border-radius);\n }\n}\n\n// IE bugfix - set this stuff statically\n:host(.legacy) {\n ::slotted(nano-tab) {\n --tab-indicator-color: #{$color-lightblue};\n --border-radius: 3px;\n --tab-indicator-size: 5px;\n --bg-rgb: 255, 255, 255;\n }\n}\n\n:host([placement='start']),\n:host([placement='end']) {\n --content-padding: 1rem;\n --tabs-padding-start: 0;\n --tabs-padding-end: 0;\n --tabs-padding-top: 0;\n --tabs-padding-bottom: 0;\n --tab-text-color: #{$color-darkgrey};\n --indicator-color: #{$color-blue};\n --indicator-size: 2px;\n}\n\n:host(.nano-color) {\n --indicator-color: var(--nano-color-tint, #{nano-color(primary, tint)});\n --tab-text-color: rgba(var(--nano-color-base-rgb), 0.7);\n\n ::slotted(nano-tab) {\n --active-text-color: var(--nano-color-shade, #{nano-color(primary, shade)});\n }\n}\n\n.nano-tab-group {\n display: flex;\n border-radius: 0;\n width: 100%;\n flex: inherit;\n\n &__tabs {\n display: flex;\n position: relative;\n width: 100%;\n }\n\n &__active-tab-indicator {\n position: absolute;\n transition: var(--indicator-transition) transform ease;\n }\n\n &__body {\n background: var(--content-bg);\n }\n\n &:not(.focus-visible) ::slotted(nano-tab) {\n --focus-shadow: none;\n }\n\n .nano-tab-group__nav-container {\n position: relative;\n display: flex;\n background: var(--tabs-container-bg);\n }\n\n button {\n appearance: none;\n background-color: transparent;\n }\n\n &__scroll-button {\n display: flex;\n align-items: center;\n justify-content: center;\n position: absolute;\n top: 0;\n bottom: 0;\n border: unset;\n z-index: 2;\n transition: #{$transition-fast} ease opacity;\n opacity: 0;\n color: var(--scroll-btn-color);\n\n &:focus {\n outline: none;\n }\n\n &.is-shown {\n opacity: 1;\n }\n\n &.focus-visible:focus {\n box-shadow: #{$control-focus-style} inset;\n }\n\n &--left {\n left: 0;\n }\n\n &--right {\n right: 0;\n }\n\n nano-icon {\n font-size: 16px;\n }\n }\n\n ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n // Top\n ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n &--top {\n flex-direction: column;\n\n .nano-tab-group__nav-container {\n &::after {\n content: '';\n width: 86%;\n box-shadow: 0 10px 40px 10px rgba(0, 0, 0, var(--shadow-opacity));\n height: 10px;\n position: absolute;\n left: 7%;\n bottom: -10px;\n border-radius: 10px;\n z-index: -1;\n }\n }\n\n .nano-tab-group__nav {\n @include hide-scrollbar();\n @include padding(\n var(--tabs-padding-top),\n var(--tabs-padding-end),\n var(--tabs-padding-bottom),\n var(--tabs-padding-start)\n );\n\n display: flex;\n overflow-x: auto;\n overflow-y: hidden;\n transition: #{$transition-medium} ease;\n background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=);\n mask-repeat: no-repeat;\n mask-image:\n linear-gradient(\n to left,\n rgba(0, 0, 0, 0) 0,\n rgba(0, 0, 0, 0) var(--tabs-padding-start),\n rgba(0, 0, 0, 1) calc(var(--tabs-padding-start) * 2),\n rgba(0, 0, 0, 1) calc(100% - (var(--tabs-padding-end) * 2)),\n rgba(0, 0, 0, 0) calc(100% - var(--tabs-padding-end)),\n rgba(0, 0, 0, 0)\n );\n mask-size: calc(100% + calc(var(--tabs-padding-end) * 4));\n mask-position: calc(var(--tabs-padding-end) * -2);\n\n &::after {\n content: ' ';\n\n @include padding(\n var(--tabs-padding-top),\n var(--tabs-padding-end),\n var(--tabs-padding-bottom),\n 0\n );\n\n line-height: 1;\n flex: 0 0 auto;\n }\n }\n\n &.nano-tab-group--has-scroll-controls-left {\n .nano-tab-group__nav {\n mask-position: 0;\n mask-size: calc(100% + (var(--tabs-padding-end) * 2));\n }\n }\n\n &.nano-tab-group--has-scroll-controls-right {\n .nano-tab-group__nav {\n mask-position: calc(var(--tabs-padding-end) * -1);\n mask-size: calc(100% + var(--tabs-padding-end));\n }\n }\n\n &.nano-tab-group--has-scroll-controls-left.nano-tab-group--has-scroll-controls-right {\n .nano-tab-group__nav {\n mask-size: 100%;\n mask-position: 0;\n }\n }\n\n .nano-tab-group__tabs {\n flex: 1 1 auto;\n position: relative;\n flex-direction: row;\n text-align: center;\n color: var(--tab-text-color);\n width: auto;\n }\n\n .nano-tab-group__active-tab-indicator {\n bottom: -2px;\n border-bottom: solid var(--indicator-size) var(--indicator-color);\n }\n\n .nano-tab-group__body {\n order: 2;\n background: var(--content-bg);\n position: relative;\n overflow: hidden;\n width: auto;\n display: flex;\n justify-content: center;\n padding: var(--content-padding);\n border-radius: var(--content-border-radius);\n flex: 1 1 auto;\n }\n }\n\n ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n // Start\n ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n &--start {\n flex-direction: row;\n\n .nano-tab-group__tabs {\n flex: 0 0 auto;\n flex-direction: column;\n color: var(--tab-text-color);\n background: rgb(var(--tabs-bg-rgb));\n\n @include ltr-host() {\n border-left: solid var(--indicator-size) var(--indicator-track-color);\n text-align: left;\n }\n\n @include rtl-host() {\n border-right: solid var(--indicator-size) var(--indicator-track-color);\n text-align: right;\n }\n }\n\n .nano-tab-group__active-tab-indicator {\n @include ltr-host() {\n left: calc(-1 * 2px);\n border-left: solid var(--indicator-size) var(--indicator-color);\n }\n\n @include rtl-host() {\n right: calc(-1 * 2px);\n border-right: solid var(--indicator-size) var(--indicator-color);\n }\n }\n\n .nano-tab-group__body {\n flex: 1 1 auto;\n order: 2;\n padding: var(--content-padding);\n overflow: hidden;\n\n @include border-radius(\n 0,\n var(--content-border-radius),\n var(--content-border-radius),\n 0\n );\n }\n }\n}\n","import {\n Component,\n Element,\n ComponentInterface,\n Event,\n EventEmitter,\n Method,\n Prop,\n State,\n Watch,\n h,\n Host,\n Listen,\n} from '@stencil/core';\nimport ResizeObserver from 'resize-observer-polyfill';\n\nimport { scrollIntoView } from '../../utils/scroll';\nimport { focusVisible } from '../../utils/focus-visible';\nimport {\n displayTransition,\n createColorClasses,\n getOffset,\n getDirectChildren,\n} from '../../utils';\nimport { Color } from '../../interface';\nimport {\n ComponentStore,\n StorageMethods,\n} from '../../utils/store/component-store';\n\n/**\n * A tradtional tab implementation. It nests `nano-tab` and `nano-tab-content` sub-components.\n *\n * Tabs can be stacked vertically or horizontally (which presents different styling variations) using the `placement` attribute.\n * Horizonal tabs that don't fit will overflow and scroll appropriately.\n * Tab-content can also be swiped to change tabs.\n *\n * @slot tabs - Add `nano-tab` elements to add clickable tabs.\n * @slot tab-content-header - a header bar displayed above tab content.\n * @slot - Add `nano-tab-content` elements to add tabbable content.\n */\n\n@Component({\n tag: 'nano-tab-group',\n styleUrl: 'tab-group.scss',\n shadow: true,\n})\nexport class TabGroup implements ComponentInterface {\n private activeTab: HTMLNanoTabElement;\n private activePanel: HTMLNanoTabContentElement;\n private activeTabIndicator: HTMLElement;\n private nav: HTMLElement;\n private tabGroup: HTMLElement;\n private tabs: HTMLElement;\n private rightBtn: HTMLButtonElement;\n private leftBtn: HTMLButtonElement;\n\n private isRtl: boolean;\n private initialTouchX: number = null;\n private initialTouchY: number = null;\n\n private resizeObserver: ResizeObserver;\n private mutationObserver: MutationObserver;\n\n @Element() host: HTMLNanoTabGroupElement;\n\n @State() hasScrollControls = false;\n @State() hideControlRight = true;\n @State() hideControlLeft = true;\n @State() isLegacy = !document.head.attachShadow;\n @State() tab: string;\n\n /**\n * The placement of the tabs.\n */\n @Prop() placement: 'top' | 'start' = 'top';\n\n /**\n * Disables the scroll arrows that appear when tabs overflow.\n */\n @Prop() noScrollControls = false;\n\n /**\n * The color to use from the application's color palette.\n */\n @Prop() color?: Color;\n\n /**\n * Store the currently open tab (against this ID) in the component store.\n * Use in conjunction with storeMethod\n */\n @Prop() storeId?: string;\n\n /**\n * The method of storage.\n * Either session storage, url hash (after the '#') or url query (after the '?').\n */\n @Prop() storeMethod: StorageMethods = 'session';\n\n /**\n * Disable 'swipe to change tab' on devices with touch\n */\n @Prop() disableSwipe: boolean;\n\n @Watch('tab')\n handleTabNameChange() {\n if (this.activeTab && this.activeTab.panel === this.tab) return;\n const tab = this.getAllActiveTabs.find((el) => el.panel === this.tab);\n this.setActiveTab(tab);\n }\n\n @Watch('placement')\n handlePlacementChange() {\n this.syncActiveTabIndicator();\n }\n\n @Watch('noScrollControls')\n handleNoScrollControlsChange() {\n this.updateScrollControls();\n }\n\n @Watch('hideControlRight')\n hideRightBtn() {\n if (!this.rightBtn) return;\n displayTransition(this.rightBtn, 'is-shown', !this.hideControlRight);\n }\n\n @Watch('hideControlLeft')\n hideLeftBtn() {\n if (!this.leftBtn) return;\n displayTransition(this.leftBtn, 'is-shown', !this.hideControlLeft);\n }\n\n @Watch('hasScrollControls')\n watchScrollControls() {\n if (this.hasScrollControls) setTimeout((_) => this.handleTabScroll(), 20);\n else\n setTimeout((_) => {\n this.hideControlLeft = this.hideControlRight = true;\n }, 20);\n }\n\n /** Emitted when a tab is shown. */\n @Event() nanoTabShow: EventEmitter<{ name: string }>;\n\n /** Emitted when a tab is hidden. */\n @Event() nanoTabHide: EventEmitter<{ name: string }>;\n\n /** Emitted when the tab is closable and the close button is activated. */\n @Event() nanoTabWillClose: EventEmitter<{ name: string }>;\n\n /** Emitted when a closable tab is removed. */\n @Event() nanoTabClose: EventEmitter<{ name: string }>;\n\n /** Shows the specified tab panel. */\n @Method()\n async show(panel: string) {\n if (this.activeTab && this.activeTab.panel === panel) return;\n\n const tab = this.getAllActiveTabs.find((el) => el.panel === panel);\n\n if (tab) this.setActiveTab(tab);\n }\n\n // Internal Methods\n\n get getAllActiveTabs() {\n return this.getAllTabs.filter((el: any) => !el.disabled);\n }\n\n get getAllTabs() {\n return getDirectChildren<HTMLNanoTabElement>(this.host, 'nano-tab');\n }\n\n get getAllPanels() {\n return getDirectChildren<HTMLNanoTabContentElement>(\n this.host,\n 'nano-tab-content'\n );\n }\n\n get getActiveTab() {\n return this.getAllActiveTabs.find((el) => el.active);\n }\n\n private updateScrollControls = () => {\n if (this.noScrollControls) {\n this.hasScrollControls = false;\n } else {\n this.hasScrollControls =\n ['top'].includes(this.placement) &&\n this.nav.scrollWidth > this.nav.clientWidth &&\n this.nav.scrollWidth > this.tabs.clientWidth;\n }\n };\n\n private setActiveTab(tab: HTMLNanoTabElement, emitEvents = true) {\n if (\n tab &&\n tab !== this.activeTab &&\n !tab.disabled &&\n this.getAllActiveTabs.includes(tab)\n ) {\n const previousTab = this.activeTab;\n this.activeTab = tab;\n this.tab = tab.panel;\n\n // Sync tabs and panels\n this.getAllActiveTabs.map((el) => (el.active = el === this.activeTab));\n this.getAllPanels.map((el) => {\n if (el.name === this.activeTab.panel) {\n el.active = true;\n this.activePanel = el;\n } else el.active = false;\n el.removeAttribute('animation-dir');\n });\n // active tab can be changed on init - this won't be ready. No big thing\n this.syncActiveTabIndicator();\n if (['top'].includes(this.placement)) {\n scrollIntoView(this.activeTab, this.nav, 'horizontal', 'center');\n }\n\n // Emit events\n if (emitEvents) {\n if (previousTab) {\n this.nanoTabHide.emit({ name: previousTab.panel });\n }\n\n this.nanoTabShow.emit({ name: this.activeTab.panel });\n }\n }\n }\n\n private setAriaLabels() {\n const tabs = this.getAllActiveTabs;\n const panels = this.getAllPanels;\n\n // Link each tab with its corresponding panel\n tabs.map((tab) => {\n const panel = panels.find((el) => el.name === tab.panel);\n if (panel) {\n tab.setAttribute('aria-controls', panel.getAttribute('id'));\n panel.setAttribute('aria-labelledby', tab.getAttribute('id'));\n }\n });\n }\n\n private syncActiveTabIndicator() {\n this.getAllTabs.forEach((tab) =>\n tab.setAttribute(\n 'direction',\n this.placement === 'top' ? 'horizontal' : 'vertical'\n )\n );\n\n const tab = this.getActiveTab;\n const width = tab.shadowRoot.querySelector('.nanotab')?.clientWidth || 0;\n const height = tab.clientHeight;\n const offset = getOffset(tab, this.tabs);\n const offsetTop = offset.top + this.nav.scrollTop;\n const offsetLeft = offset.left;\n\n switch (this.placement) {\n case 'top':\n this.activeTabIndicator.style.width = `${width}px`;\n this.activeTabIndicator.style.height = null;\n this.activeTabIndicator.style.transform = `translateX(${offsetLeft}px)`;\n break;\n\n case 'start':\n this.activeTabIndicator.style.width = null;\n this.activeTabIndicator.style.height = `${height}px`;\n this.activeTabIndicator.style.transform = `translateY(${offsetTop}px)`;\n break;\n }\n }\n\n private getNavWidth() {\n if (!this.nav) return 0;\n const computedStyle = getComputedStyle(this.nav);\n let clientWidth = this.nav.clientWidth;\n return (clientWidth -=\n parseFloat(computedStyle.paddingLeft) +\n parseFloat(computedStyle.paddingRight));\n }\n\n // Event handlers\n\n @Listen('nanoTabClose')\n handleTabClose(ev: CustomEvent & { target: HTMLNanoTabElement }) {\n let tabIndex = this.getAllActiveTabs.indexOf(ev.target);\n const tab = ev.target;\n if (tabIndex < 0) return;\n\n const panel = this.getAllPanels.find((el) => el.name === tab.panel);\n if (!panel) return;\n\n ev.stopImmediatePropagation();\n\n const closeEv = this.nanoTabWillClose.emit({ name: tab.panel });\n if (closeEv.defaultPrevented) return;\n\n // Show the previous tab if the tab is currently active\n if (tab.active) {\n tabIndex = tabIndex === 0 ? 1 : tabIndex - 1;\n const prevTab = this.getAllActiveTabs[tabIndex]?.panel;\n if (prevTab) this.host.show(prevTab);\n }\n\n tab.remove();\n panel.remove();\n this.nanoTabClose.emit({ name: tab.panel });\n }\n\n private handleClick = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n const tab = target.closest('nano-tab');\n\n if (tab) this.setActiveTab(tab);\n };\n\n private handleKeyDown = (event: KeyboardEvent) => {\n // Activate a tab\n if (['Enter', ' '].includes(event.key)) {\n const target = event.target as HTMLElement;\n const tab = target.closest('nano-tab');\n\n if (tab) {\n this.setActiveTab(tab);\n event.preventDefault();\n }\n }\n\n // Move focus left or right\n if (\n [\n 'ArrowLeft',\n 'ArrowRight',\n 'ArrowUp',\n 'ArrowDown',\n 'Home',\n 'End',\n ].includes(event.key)\n ) {\n const activeEl = document.activeElement as any;\n\n if (activeEl && activeEl.tagName.toLowerCase() === 'nano-tab') {\n const tabs = this.getAllActiveTabs;\n let index = tabs.indexOf(activeEl);\n\n if (event.key === 'Home') {\n index = 0;\n } else if (event.key === 'End') {\n index = tabs.length - 1;\n } else if (\n (this.isRtl && event.key === 'ArrowRight') ||\n (!this.isRtl && event.key === 'ArrowLeft')\n ) {\n index = Math.max(0, index - 1);\n } else if (\n (this.isRtl && event.key === 'ArrowLeft') ||\n (!this.isRtl && event.key === 'ArrowRight')\n ) {\n index = Math.min(tabs.length - 1, index + 1);\n }\n tabs[index].setFocus();\n\n if (['top'].includes(this.placement)) {\n scrollIntoView(tabs[index], this.nav, 'horizontal', 'center');\n }\n event.preventDefault();\n }\n }\n };\n\n private handleTabScroll = () => {\n if (!this.hasScrollControls) {\n this.hideControlLeft = this.hideControlRight = true;\n return;\n }\n let endRight = this.isRtl\n ? this.nav.scrollLeft === 0\n : this.nav.scrollWidth - this.nav.scrollLeft === this.nav.clientWidth;\n let endLeft = this.isRtl\n ? this.nav.scrollWidth + this.nav.scrollLeft === this.nav.clientWidth\n : this.nav.scrollLeft === 0;\n\n if (endLeft) {\n this.hideControlLeft = true;\n this.hideControlRight = false;\n } else if (endRight) {\n this.hideControlLeft = false;\n this.hideControlRight = true;\n } else {\n this.hideControlRight = false;\n this.hideControlLeft = false;\n }\n };\n\n private handleBtnClick = (goRight: boolean = false) => {\n const navWidth = this.getNavWidth();\n let leftAmt;\n if (goRight) leftAmt = this.nav.scrollLeft + navWidth - 20;\n else leftAmt = this.nav.scrollLeft - navWidth + 20;\n\n try {\n this.nav.scroll({\n left: leftAmt,\n behavior: 'smooth',\n });\n } catch (e) {\n this.nav.scrollLeft = leftAmt;\n }\n };\n\n private handleTouchStart = (event: TouchEvent) => {\n if (this.disableSwipe) return;\n const touch = event.changedTouches[0];\n this.initialTouchX = touch.pageX;\n this.initialTouchY = touch.pageY;\n };\n\n private handleTouchEnd = (event: TouchEvent) => {\n if (this.disableSwipe) return;\n const touch = event.changedTouches[0];\n const distX = touch.pageX - this.initialTouchX; // get horizontal dist traveled\n const distY = touch.pageY - this.initialTouchY; // get vertical dist traveled\n const threshold = 70;\n\n var xDiff = this.initialTouchX - touch.clientX;\n var yDiff = this.initialTouchY - touch.clientY;\n\n const isHorizontalSwipe =\n Math.abs(distX) >= threshold && Math.abs(distY) <= threshold;\n\n const tabs = this.getAllActiveTabs;\n const currIndex = tabs.findIndex((el) => el.active);\n\n if (isHorizontalSwipe) {\n const toGo =\n (distX < 0 && this.placement === 'top') ||\n (distX > 0 && this.placement !== 'top')\n ? 1\n : -1;\n\n if (tabs[currIndex + toGo]) {\n this.setActiveTab(tabs[currIndex + toGo]);\n\n if (Math.abs(xDiff) > Math.abs(yDiff)) {\n if (xDiff > 0) this.activePanel.setAttribute('animation-dir', 'left');\n else this.activePanel.setAttribute('animation-dir', 'right');\n }\n }\n }\n this.initialTouchX = null;\n this.initialTouchY = null;\n };\n\n // Stencil hooks\n\n componentDidLoad() {\n // Initial IO - watching for all content to be loaded\n const observer = new IntersectionObserver((entries, observer) => {\n if (entries[0].intersectionRatio > 0) {\n this.setAriaLabels();\n this.setActiveTab(this.getActiveTab || this.getAllActiveTabs[0], false);\n\n if (this.storeId)\n ComponentStore.init(this, ['tab'], this.storeMethod, this.storeId);\n observer.unobserve(entries[0].target);\n }\n });\n observer.observe(this.host);\n focusVisible.observe(this.tabGroup);\n\n if (this.leftBtn) {\n focusVisible.observe(this.leftBtn);\n focusVisible.observe(this.rightBtn);\n }\n\n this.resizeObserver = new ResizeObserver(() => this.updateScrollControls());\n this.resizeObserver.observe(this.nav);\n\n this.mutationObserver = new MutationObserver((mutations) => {\n if (\n mutations.some((mutation) => {\n return !['aria-labelledby', 'aria-controls'].includes(\n mutation.attributeName\n );\n })\n ) {\n setTimeout(() => this.setAriaLabels());\n }\n setTimeout(() => this.handleTabScroll(), 500);\n\n this.setActiveTab(this.getActiveTab || this.getAllActiveTabs[0], false);\n if (this.activeTab)\n scrollIntoView(this.activeTab, this.nav, 'horizontal', 'center');\n });\n this.mutationObserver.observe(this.host, {\n attributes: true,\n childList: true,\n subtree: true,\n });\n\n requestAnimationFrame(() => this.updateScrollControls());\n }\n\n connectedCallback() {\n this.isRtl =\n this.host.dir === 'rtl' ||\n (this.host.ownerDocument as Document).dir === 'rtl';\n }\n\n disconnectedCallback() {\n if (this.mutationObserver) this.mutationObserver.disconnect();\n\n focusVisible.unobserve(this.tabGroup);\n if (this.leftBtn) {\n focusVisible.unobserve(this.leftBtn);\n focusVisible.unobserve(this.rightBtn);\n }\n if (this.resizeObserver) this.resizeObserver.unobserve(this.nav);\n }\n\n render() {\n this.isRtl = (this.host.ownerDocument as Document).dir === 'rtl';\n\n return (\n <Host\n class={{ ...createColorClasses(this.color), legacy: this.isLegacy }}\n dir={this.isRtl ? 'rtl' : null}\n >\n <div\n part=\"base\"\n ref={(el) => (this.tabGroup = el)}\n class={{\n 'nano-tab-group': true,\n 'nano-tab-group--top': this.placement === 'top',\n 'nano-tab-group--start': this.placement === 'start',\n 'nano-tab-group--has-scroll-controls': this.hasScrollControls,\n 'nano-tab-group--has-scroll-controls-left': !this.hideControlLeft,\n 'nano-tab-group--has-scroll-controls-right': !this.hideControlRight,\n }}\n onClick={this.handleClick}\n onKeyDown={this.handleKeyDown}\n >\n <div class=\"nano-tab-group__nav-container\">\n {this.placement === 'top' && (\n <button\n class={{\n 'nano-tab-group__scroll-button': true,\n 'nano-tab-group__scroll-button--left': true,\n }}\n ref={(btn) => (this.leftBtn = btn)}\n onClick={() => this.handleBtnClick(false)}\n >\n <nano-icon name=\"light/chevron-left\"></nano-icon>\n </button>\n )}\n <div\n ref={(el) => (this.nav = el)}\n key=\"nav\"\n part=\"nav\"\n class=\"nano-tab-group__nav\"\n onScroll={this.handleTabScroll}\n >\n <div\n ref={(el) => (this.tabs = el)}\n part=\"tabs\"\n class=\"nano-tab-group__tabs\"\n role=\"tablist\"\n >\n <div\n ref={(el) => (this.activeTabIndicator = el)}\n part=\"active-tab-indicator\"\n class=\"nano-tab-group__active-tab-indicator\"\n />\n <slot name=\"tabs\" />\n </div>\n </div>\n {this.placement === 'top' && (\n <button\n class={{\n 'nano-tab-group__scroll-button': true,\n 'nano-tab-group__scroll-button--right': true,\n }}\n ref={(btn) => (this.rightBtn = btn)}\n onClick={() => this.handleBtnClick(true)}\n >\n <nano-icon name=\"light/chevron-right\"></nano-icon>\n </button>\n )}\n </div>\n <slot name=\"tab-content-header\" />\n <div\n part=\"body\"\n class=\"nano-tab-group__body\"\n onTouchStart={this.handleTouchStart}\n onTouchEnd={this.handleTouchEnd}\n >\n <slot />\n </div>\n </div>\n </Host>\n );\n }\n}\n"]}