{"version":3,"sources":["webpack:///./node_modules/tabbyjs/dist/js/tabby.polyfills.js"],"names":["root","Element","prototype","matches","msMatchesSelector","webkitMatchesSelector","closest","s","ancestor","this","document","documentElement","contains","parentElement","global","window","defaults","idPrefix","default","toggle","tab","getAttribute","content","querySelector","hash","details","newTab","tabGroup","setAttribute","previousTab","previousContent","removeAttribute","focus","event","CustomEvent","bubbles","cancelable","detail","createEvent","initCustomEvent","dispatchEvent","selector","options","settings","tabWrapper","publicAPIs","tabs","querySelectorAll","Array","forEach","call","id","slice","length","removeEventListener","clickHandler","keyHandler","target","preventDefault","activeElement","indexOf","key","map","index","switchTabs","merged","arguments","obj","hasOwnProperty","setup","location","addEventListener"],"mappings":"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","file":"14.js","sourcesContent":["/*!\n * tabbyjs v12.0.3\n * Lightweight, accessible vanilla JS toggle tabs.\n * (c) 2019 Chris Ferdinandi\n * MIT License\n * http://github.com/cferdinandi/tabby\n */\n\n/**\n * Element.matches() polyfill (simple version)\n * https://developer.mozilla.org/en-US/docs/Web/API/Element/matches#Polyfill\n */\nif (!Element.prototype.matches) {\n\tElement.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;\n}\n/**\n * Element.closest() polyfill\n * https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill\n */\nif (!Element.prototype.closest) {\n\tif (!Element.prototype.matches) {\n\t\tElement.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;\n\t}\n\tElement.prototype.closest = function (s) {\n\t\tvar el = this;\n\t\tvar ancestor = this;\n\t\tif (!document.documentElement.contains(el)) return null;\n\t\tdo {\n\t\t\tif (ancestor.matches(s)) return ancestor;\n\t\t\tancestor = ancestor.parentElement;\n\t\t} while (ancestor !== null);\n\t\treturn null;\n\t};\n}\n(function (root, factory) {\n\tif ( typeof define === 'function' && define.amd ) {\n\t\tdefine([], (function () {\n\t\t\treturn factory(root);\n\t\t}));\n\t} else if ( typeof exports === 'object' ) {\n\t\tmodule.exports = factory(root);\n\t} else {\n\t\troot.Tabby = factory(root);\n\t}\n})(typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : this, (function (window) {\n\n\t'use strict';\n\n\t//\n\t// Variables\n\t//\n\n\tvar defaults = {\n\t\tidPrefix: 'tabby-toggle_',\n\t\tdefault: '[data-tabby-default]'\n\t};\n\n\n\t//\n\t// Methods\n\t//\n\n\t/**\n\t * Merge two or more objects together.\n\t * @param {Object} objects The objects to merge together\n\t * @returns {Object} Merged values of defaults and options\n\t */\n\tvar extend = function () {\n\t\tvar merged = {};\n\t\tArray.prototype.forEach.call(arguments, (function (obj) {\n\t\t\tfor (var key in obj) {\n\t\t\t\tif (!obj.hasOwnProperty(key)) return;\n\t\t\t\tmerged[key] = obj[key];\n\t\t\t}\n\t\t}));\n\t\treturn merged;\n\t};\n\n\t/**\n\t * Emit a custom event\n\t * @param {String} type The event type\n\t * @param {Node} tab The tab to attach the event to\n\t * @param {Node} details Details about the event\n\t */\n\tvar emitEvent = function (tab, details) {\n\n\t\t// Create a new event\n\t\tvar event;\n\t\tif (typeof window.CustomEvent === 'function') {\n\t\t\tevent = new CustomEvent('tabby', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcancelable: true,\n\t\t\t\tdetail: details\n\t\t\t});\n\t\t} else {\n\t\t\tevent = document.createEvent('CustomEvent');\n\t\t\tevent.initCustomEvent('tabby', true, true, details);\n\t\t}\n\n\t\t// Dispatch the event\n\t\ttab.dispatchEvent(event);\n\n\t};\n\n\t/**\n\t * Remove roles and attributes from a tab and its content\n\t * @param {Node} tab The tab\n\t * @param {Node} content The tab content\n\t * @param {Object} settings User settings and options\n\t */\n\tvar destroyTab = function (tab, content, settings) {\n\n\t\t// Remove the generated ID\n\t\tif (tab.id.slice(0, settings.idPrefix.length) === settings.idPrefix) {\n\t\t\ttab.id = '';\n\t\t}\n\n\t\t// Remove roles\n\t\ttab.removeAttribute('role');\n\t\ttab.removeAttribute('aria-controls');\n\t\ttab.removeAttribute('aria-selected');\n\t\ttab.removeAttribute('tabindex');\n\t\ttab.closest('li').removeAttribute('role');\n\t\tcontent.removeAttribute('role');\n\t\tcontent.removeAttribute('aria-labelledby');\n\t\tcontent.removeAttribute('hidden');\n\n\t};\n\n\t/**\n\t * Add the required roles and attributes to a tab and its content\n\t * @param {Node} tab The tab\n\t * @param {Node} content The tab content\n\t * @param {Object} settings User settings and options\n\t */\n\tvar setupTab = function (tab, content, settings) {\n\n\t\t// Give tab an ID if it doesn't already have one\n\t\tif (!tab.id) {\n\t\t\ttab.id = settings.idPrefix + content.id;\n\t\t}\n\n\t\t// Add roles\n\t\ttab.setAttribute('role', 'tab');\n\t\ttab.setAttribute('aria-controls', content.id);\n\t\ttab.closest('li').setAttribute('role', 'presentation');\n\t\tcontent.setAttribute('role', 'tabpanel');\n\t\tcontent.setAttribute('aria-labelledby', tab.id);\n\n\t\t// Add selected state\n\t\tif (tab.matches(settings.default)) {\n\t\t\ttab.setAttribute('aria-selected', 'true');\n\t\t} else {\n\t\t\ttab.setAttribute('aria-selected', 'false');\n\t\t\ttab.setAttribute('tabindex', '-1');\n\t\t\tcontent.setAttribute('hidden', 'hidden');\n\t\t}\n\n\t};\n\n\t/**\n\t * Hide a tab and its content\n\t * @param {Node} newTab The new tab that's replacing it\n\t */\n\tvar hide = function (newTab) {\n\n\t\t// Variables\n\t\tvar tabGroup = newTab.closest('[role=\"tablist\"]');\n\t\tif (!tabGroup) return {};\n\t\tvar tab = tabGroup.querySelector('[role=\"tab\"][aria-selected=\"true\"]');\n\t\tif (!tab) return {};\n\t\tvar content = document.querySelector(tab.hash);\n\n\t\t// Hide the tab\n\t\ttab.setAttribute('aria-selected', 'false');\n\t\ttab.setAttribute('tabindex', '-1');\n\n\t\t// Hide the content\n\t\tif (!content) return {previousTab: tab};\n\t\tcontent.setAttribute('hidden', 'hidden');\n\n\t\t// Return the hidden tab and content\n\t\treturn {\n\t\t\tpreviousTab: tab,\n\t\t\tpreviousContent: content\n\t\t};\n\n\t};\n\n\t/**\n\t * Show a tab and its content\n\t * @param {Node} tab The tab\n\t * @param {Node} content The tab content\n\t */\n\tvar show = function (tab, content) {\n\t\ttab.setAttribute('aria-selected', 'true');\n\t\ttab.setAttribute('tabindex', '0');\n\t\tcontent.removeAttribute('hidden');\n\t\ttab.focus();\n\t};\n\n\t/**\n\t * Toggle a new tab\n\t * @param {Node} tab The tab to show\n\t */\n\tvar toggle = function (tab) {\n\n\t\t// Make sure there's a tab to toggle and it's not already active\n\t\tif (!tab || tab.getAttribute('aria-selected') == 'true') return;\n\n\t\t// Variables\n\t\tvar content = document.querySelector(tab.hash);\n\t\tif (!content) return;\n\n\t\t// Hide active tab and content\n\t\tvar details = hide(tab);\n\n\t\t// Show new tab and content\n\t\tshow(tab, content);\n\n\t\t// Add event details\n\t\tdetails.tab = tab;\n\t\tdetails.content = content;\n\n\t\t// Emit a custom event\n\t\temitEvent(tab, details);\n\n\t};\n\n\t/**\n\t * Get all of the tabs in a tablist\n\t * @param {Node} tab A tab from the list\n\t * @return {Object} The tabs and the index of the currently active one\n\t */\n\tvar getTabsMap = function (tab) {\n\t\tvar tabGroup = tab.closest('[role=\"tablist\"]');\n\t\tvar tabs = tabGroup ? tabGroup.querySelectorAll('[role=\"tab\"]') : null;\n\t\tif (!tabs) return;\n\t\treturn {\n\t\t\ttabs: tabs,\n\t\t\tindex: Array.prototype.indexOf.call(tabs, tab)\n\t\t};\n\t};\n\n\t/**\n\t * Switch the active tab based on keyboard activity\n\t * @param {Node} tab The currently active tab\n\t * @param {Key} key The key that was pressed\n\t */\n\tvar switchTabs = function (tab, key) {\n\n\t\t// Get a map of tabs\n\t\tvar map = getTabsMap(tab);\n\t\tif (!map) return;\n\t\tvar length = map.tabs.length - 1;\n\t\tvar index;\n\n\t\t// Go to previous tab\n\t\tif (['ArrowUp', 'ArrowLeft', 'Up', 'Left'].indexOf(key) > -1) {\n\t\t\tindex = map.index < 1 ? length : map.index - 1;\n\t\t}\n\n\t\t// Go to next tab\n\t\telse if (['ArrowDown', 'ArrowRight', 'Down', 'Right'].indexOf(key) > -1) {\n\t\t\tindex = map.index === length ? 0 : map.index + 1;\n\t\t}\n\n\t\t// Go to home\n\t\telse if (key === 'Home') {\n\t\t\tindex = 0;\n\n\t\t}\n\n\t\t// Go to end\n\t\telse if (key === 'End') {\n\t\t\tindex = length;\n\t\t}\n\n\t\t// Toggle the tab\n\t\ttoggle(map.tabs[index]);\n\n\t};\n\n\t/**\n\t * Activate a tab based on the URL\n\t * @param {String} selector The selector for this instantiation\n\t */\n\tvar loadFromURL = function (selector) {\n\t\tif (window.location.hash.length < 1) return;\n\t\tvar tab = document.querySelector(selector + ' [role=\"tab\"][href*=\"' + window.location.hash + '\"]');\n\t\ttoggle(tab);\n\t};\n\n\t/**\n\t * Create the Constructor object\n\t */\n\tvar Constructor = function (selector, options) {\n\n\t\t//\n\t\t// Variables\n\t\t//\n\n\t\tvar publicAPIs = {};\n\t\tvar settings, tabWrapper;\n\n\n\t\t//\n\t\t// Methods\n\t\t//\n\n\t\tpublicAPIs.destroy = function () {\n\n\t\t\t// Get all tabs\n\t\t\tvar tabs = tabWrapper.querySelectorAll('a');\n\n\t\t\t// Add roles to tabs\n\t\t\tArray.prototype.forEach.call(tabs, (function (tab) {\n\n\t\t\t\t// Get the tab content\n\t\t\t\tvar content = document.querySelector(tab.hash);\n\t\t\t\tif (!content) return;\n\n\t\t\t\t// Setup the tab\n\t\t\t\tdestroyTab(tab, content, settings);\n\n\t\t\t}));\n\n\t\t\t// Remove role from wrapper\n\t\t\ttabWrapper.removeAttribute('role');\n\n\t\t\t// Remove event listeners\n\t\t\tdocument.documentElement.removeEventListener('click', clickHandler, true);\n\t\t\ttabWrapper.removeEventListener('keydown', keyHandler, true);\n\n\t\t\t// Reset variables\n\t\t\tsettings = null;\n\t\t\ttabWrapper = null;\n\n\t\t};\n\n\t\t/**\n\t\t * Setup the DOM with the proper attributes\n\t\t */\n\t\tpublicAPIs.setup = function () {\n\n\t\t\t// Variables\n\t\t\ttabWrapper = document.querySelector(selector);\n\t\t\tif (!tabWrapper) return;\n\t\t\tvar tabs = tabWrapper.querySelectorAll('a');\n\n\t\t\t// Add role to wrapper\n\t\t\ttabWrapper.setAttribute('role', 'tablist');\n\n\t\t\t// Add roles to tabs\n\t\t\tArray.prototype.forEach.call(tabs, (function (tab) {\n\n\t\t\t\t// Get the tab content\n\t\t\t\tvar content = document.querySelector(tab.hash);\n\t\t\t\tif (!content) return;\n\n\t\t\t\t// Setup the tab\n\t\t\t\tsetupTab(tab, content, settings);\n\n\t\t\t}));\n\n\t\t};\n\n\t\t/**\n\t\t * Toggle a tab based on an ID\n\t\t * @param {String|Node} id The tab to toggle\n\t\t */\n\t\tpublicAPIs.toggle = function (id) {\n\n\t\t\t// Get the tab\n\t\t\tvar tab = id;\n\t\t\tif (typeof id === 'string') {\n\t\t\t\ttab = document.querySelector(selector + ' [role=\"tab\"][href*=\"' + id + '\"]');\n\t\t\t}\n\n\t\t\t// Toggle the tab\n\t\t\ttoggle(tab);\n\n\t\t};\n\n\t\t/**\n\t\t * Handle click events\n\t\t */\n\t\tvar clickHandler = function (event) {\n\n\t\t\t// Only run on toggles\n\t\t\tvar tab = event.target.closest(selector + ' [role=\"tab\"]');\n\t\t\tif (!tab) return;\n\n\t\t\t// Prevent link behavior\n\t\t\tevent.preventDefault();\n\n\t\t\t// Toggle the tab\n\t\t\ttoggle(tab);\n\n\t\t};\n\n\t\t/**\n\t\t * Handle keydown events\n\t\t */\n\t\tvar keyHandler = function (event) {\n\n\t\t\t// Only run if a tab is in focus\n\t\t\tvar tab = document.activeElement;\n\t\t\tif (!tab.matches(selector + ' [role=\"tab\"]')) return;\n\n\t\t\t// Only run for specific keys\n\t\t\tif (['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Up', 'Down', 'Left', 'Right', 'Home', 'End'].indexOf(event.key) < 0) return;\n\n\t\t\t// Switch tabs\n\t\t\tswitchTabs(tab, event.key);\n\n\t\t};\n\n\t\t/**\n\t\t * Initialize the instance\n\t\t */\n\t\tvar init = function () {\n\n\t\t\t// Merge user options with defaults\n\t\t\tsettings = extend(defaults, options || {});\n\n\t\t\t// Setup the DOM\n\t\t\tpublicAPIs.setup();\n\n\t\t\t// Load a tab from the URL\n\t\t\tloadFromURL(selector);\n\n\t\t\t// Add event listeners\n\t\t\tdocument.documentElement.addEventListener('click', clickHandler, true);\n\t\t\ttabWrapper.addEventListener('keydown', keyHandler, true);\n\n\t\t};\n\n\n\t\t//\n\t\t// Initialize and return the Public APIs\n\t\t//\n\n\t\tinit();\n\t\treturn publicAPIs;\n\n\t};\n\n\n\t//\n\t// Return the Constructor\n\t//\n\n\treturn Constructor;\n\n}));"],"sourceRoot":""}