{"version":3,"file":"tab_panel.vue.cjs","sources":["../../../components/tab/tab_panel.vue"],"sourcesContent":["<template>\n  <div\n    v-show=\"!hidePanel\"\n    :id=\"`dt-panel-${id}`\"\n    role=\"tabpanel\"\n    :tabindex=\"isFirstElementFocusable ? -1 : 0\"\n    :aria-labelledby=\"`dt-tab-${tabId}`\"\n    :aria-hidden=\"`${hidePanel}`\"\n    :class=\"tabPanelClass\"\n    data-qa=\"dt-tab-panel\"\n  >\n    <!-- @slot Default slot for Tab Panel -->\n    <slot />\n  </div>\n</template>\n\n<script>\nimport Modal from '@/common/mixins/modal';\nimport { returnFirstEl } from '@/common/utils';\n\n/**\n * Tabs allow users to navigation between grouped content in different views while within the same page context.\n * @see https://dialtone.dialpad.com/components/tabs.html\n */\nexport default {\n  compatConfig: { MODE: 3 },\n  name: 'DtTabPanel',\n\n  mixins: [Modal],\n\n  inject: ['groupContext'],\n\n  props: {\n    /**\n     * Id of the panel\n     */\n    id: {\n      type: String,\n      required: true,\n    },\n\n    /**\n     * Id of the associated tab\n     */\n    tabId: {\n      type: String,\n      required: true,\n    },\n\n    /**\n    * If true, hides the tab content\n     * @values true, false\n    */\n    hidden: {\n      type: Boolean,\n      default: false,\n    },\n\n    /**\n     * Used to customize the tab element\n     */\n    tabPanelClass: {\n      type: [String, Array, Object],\n      default: '',\n    },\n  },\n\n  data () {\n    return {\n      isFirstElementFocusable: false,\n    };\n  },\n\n  computed: {\n    hidePanel () {\n      return this.groupContext.selected !== this.id || this.hidden;\n    },\n  },\n\n  async mounted () {\n    const firstFocusableElement = await this.getFirstFocusableElement(returnFirstEl(this.$el));\n\n    if (!firstFocusableElement) {\n      this.isFirstElementFocusable = false;\n    } else {\n      // If the first focusable element isn't the first element in the panel,\n      // then we need to set the panel tabindex to 0.\n      // See notes in https://www.w3.org/WAI/ARIA/apg/patterns/tabpanel/\n      this.isFirstElementFocusable = this.isFirstElementOfPanel(firstFocusableElement);\n    }\n  },\n\n  methods: {\n    isFirstElementOfPanel (element) {\n      let current = element;\n      let isFirstElement = true;\n\n      while (current) {\n        if (current.previousElementSibling !== null) {\n          isFirstElement = false;\n          break;\n        }\n        current = current.parentNode !== returnFirstEl(this.$el) ? current.parentNode : null;\n      }\n\n      return isFirstElement;\n    },\n  },\n};\n</script>\n"],"names":["Modal","returnFirstEl","_createElementBlock","_normalizeClass","_renderSlot"],"mappings":";;;;;;AAwBA,MAAK,YAAU;AAAA,EACb,cAAc,EAAE,MAAM,EAAG;AAAA,EACzB,MAAM;AAAA,EAEN,QAAQ,CAACA,MAAAA,OAAK;AAAA,EAEd,QAAQ,CAAC,cAAc;AAAA,EAEvB,OAAO;AAAA;AAAA;AAAA;AAAA,IAIL,IAAI;AAAA,MACF,MAAM;AAAA,MACN,UAAU;AAAA,IACX;AAAA;AAAA;AAAA;AAAA,IAKD,OAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA,IACX;AAAA;AAAA;AAAA;AAAA;AAAA,IAMD,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,IACV;AAAA;AAAA;AAAA;AAAA,IAKD,eAAe;AAAA,MACb,MAAM,CAAC,QAAQ,OAAO,MAAM;AAAA,MAC5B,SAAS;AAAA,IACV;AAAA,EACF;AAAA,EAED,OAAQ;AACN,WAAO;AAAA,MACL,yBAAyB;AAAA;EAE5B;AAAA,EAED,UAAU;AAAA,IACR,YAAa;AACX,aAAO,KAAK,aAAa,aAAa,KAAK,MAAM,KAAK;AAAA,IACvD;AAAA,EACF;AAAA,EAED,MAAM,UAAW;AACf,UAAM,wBAAwB,MAAM,KAAK,yBAAyBC,aAAAA,cAAc,KAAK,GAAG,CAAC;AAEzF,QAAI,CAAC,uBAAuB;AAC1B,WAAK,0BAA0B;AAAA,WAC1B;AAIL,WAAK,0BAA0B,KAAK,sBAAsB,qBAAqB;AAAA,IACjF;AAAA,EACD;AAAA,EAED,SAAS;AAAA,IACP,sBAAuB,SAAS;AAC9B,UAAI,UAAU;AACd,UAAI,iBAAiB;AAErB,aAAO,SAAS;AACd,YAAI,QAAQ,2BAA2B,MAAM;AAC3C,2BAAiB;AACjB;AAAA,QACF;AACA,kBAAU,QAAQ,eAAeA,2BAAc,KAAK,GAAG,IAAI,QAAQ,aAAa;AAAA,MAClF;AAEA,aAAO;AAAA,IACR;AAAA,EACF;AACH;AA5GA,MAAA,aAAA,CAAA,MAAA,YAAA,mBAAA,aAAA;;8CACEC,IAAAA,mBAYM,OAAA;AAAA,IAVH,gBAAgB,OAAE,EAAA;AAAA,IACnB,MAAK;AAAA,IACJ,UAAU,MAAuB,0BAAA,KAAA;AAAA,IACjC,6BAA2B,OAAK,KAAA;AAAA,IAChC,kBAAgB,SAAS,SAAA;AAAA,IACzB,OARLC,IAAAA,eAQY,OAAa,aAAA;AAAA,IACrB,WAAQ;AAAA;IAGRC,eAAQ,KAAA,QAAA,SAAA;AAAA,EAZZ,GAAA,IAAA,UAAA,IAAA;AAAA,iBAEa,SAAS,SAAA;AAAA;;;;"}