diff --git a/components/byu-footer/byu-footer.sass b/components/byu-footer/byu-footer.sass
index bc30094b..ba1c631c 100644
--- a/components/byu-footer/byu-footer.sass
+++ b/components/byu-footer/byu-footer.sass
@@ -190,7 +190,7 @@ $tabletBreak: 1024px // Put exact px to match Brightspot and so info doesn't wor
width: calc(#{$columnBaseWidth} * 3 - #{$calcSubtractWidth})
max-width: calc(100% - #{$columnMaxWidth} - #{$calcSubtractWidth})
- @media (min-width: 1300px)
+ @media (min-width: $breakXl)
.site-footer
margin: 0 auto
diff --git a/components/byu-menu/byu-menu.sass b/components/byu-menu/byu-menu.sass
index f12dea7f..cf3cbae4 100644
--- a/components/byu-menu/byu-menu.sass
+++ b/components/byu-menu/byu-menu.sass
@@ -41,14 +41,14 @@ $activeItemBorder: solid 3px $byuNavy
@media(min-width: $breakMd)
border-left: none
- border-bottom-color: $navy !important
+ border-bottom: 3px solid $navy !important
\::slotted(*:hover), ::slotted(*:focus)
background-color: $grey02
@media(min-width: $breakMd)
border-left: none
- border-bottom-color: $navy !important
+ border-bottom: 3px solid $navy !important
@media(min-width: $breakMd)
padding-left: 5.5em
diff --git a/dist/byu-theme-components.min.js b/dist/byu-theme-components.min.js
index 26fa9f12..7c23f401 100644
--- a/dist/byu-theme-components.min.js
+++ b/dist/byu-theme-components.min.js
@@ -23,4 +23,4 @@
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
- */console.log("--------------- Starting byu-theme-components 2.1.0 ---------------"),t="components.min.js",e("https://cdn.byu.edu/web-component-polyfills-v2/2.2.10"),window.WebComponents=window.WebComponents||{waitFor(e){addEventListener("WebComponentsReady",e)}},WebComponents.waitFor(()=>{!function(e){const t=new URL(e,n),o=document.createElement("script");"https:"!==t.protocol&&"localhost"!==t.hostname&&(t.protocol="https:"),o.src=t.href,o.type="module",document.head.append(o)}(t)})}();//# sourceMappingURL=byu-theme-components.min.js.map
+ */console.log("--------------- Starting byu-theme-components 2.1.1 ---------------"),t="components.min.js",e("https://cdn.byu.edu/web-component-polyfills-v2/2.2.10"),window.WebComponents=window.WebComponents||{waitFor(e){addEventListener("WebComponentsReady",e)}},WebComponents.waitFor(()=>{!function(e){const t=new URL(e,n),o=document.createElement("script");"https:"!==t.protocol&&"localhost"!==t.hostname&&(t.protocol="https:"),o.src=t.href,o.type="module",document.head.append(o)}(t)})}();//# sourceMappingURL=byu-theme-components.min.js.map
diff --git a/dist/components.min.js b/dist/components.min.js
index 93e0dd5e..10a03978 100644
--- a/dist/components.min.js
+++ b/dist/components.min.js
@@ -284,7 +284,7 @@ found at http://polymer.github.io/PATENTS.txt
- `}}]}}),Ie);var ye='/*!\n * / Copyright 2019 Brigham Young University\n * /\n * / Licensed under the Apache License, Version 2.0 (the "License");\n * / you may not use this file except in compliance with the License.\n * / You may obtain a copy of the License at\n * /\n * / http://www.apache.org/licenses/LICENSE-2.0\n * /\n * / Unless required by applicable law or agreed to in writing, software\n * / distributed under the License is distributed on an "AS IS" BASIS,\n * / WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * / See the License for the specific language governing permissions and\n * / limitations under the License.\n * / */\n/*!\n / Copyright 2019 Brigham Young University\n /\n / Licensed under the Apache License, Version 2.0 (the "License");\n / you may not use this file except in compliance with the License.\n / You may obtain a copy of the License at\n /\n / http://www.apache.org/licenses/LICENSE-2.0\n /\n / Unless required by applicable law or agreed to in writing, software\n / distributed under the License is distributed on an "AS IS" BASIS,\n / WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n / See the License for the specific language governing permissions and\n / limitations under the License.\n / */@import https://cdn.byu.edu/theme-fonts/1.x.x/ringside/fonts.css;@import https://cdn.byu.edu/theme-fonts/1.x.x/public-sans/fonts.css;.visually-hidden{position:absolute!important;height:1px;width:1px;overflow:hidden;clip:rect(1px,1px,1px,1px)}.hidden{display:none!important}\n\n/*!\n / Copyright 2019 Brigham Young University\n /\n / Licensed under the Apache License, Version 2.0 (the "License");\n / you may not use this file except in compliance with the License.\n / You may obtain a copy of the License at\n /\n / http://www.apache.org/licenses/LICENSE-2.0\n /\n / Unless required by applicable law or agreed to in writing, software\n / distributed under the License is distributed on an "AS IS" BASIS,\n / WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n / See the License for the specific language governing permissions and\n / limitations under the License.\n / */:host .byu-menu-el{margin:0;padding:0;font-size:.88889em!important;letter-spacing:0;background:#fff}:host .byu-menu-el ::slotted(a),:host .byu-menu-el ::slotted(a:link),:host .byu-menu-el ::slotted(a:visited){color:#002e5d!important;display:block;padding:11px 22px!important;border-bottom:3px solid transparent;margin-bottom:1px;line-height:1.6;font-size:1rem!important;transition:background .25s ease;text-decoration:none!important}@media (min-width:50rem){:host .byu-menu-el ::slotted(a),:host .byu-menu-el ::slotted(a:link),:host .byu-menu-el ::slotted(a:visited){display:inline-block}:host .byu-menu-el ::slotted(a) a,:host .byu-menu-el ::slotted(a) a:link,:host .byu-menu-el ::slotted(a) a:visited,:host .byu-menu-el ::slotted(a:link) a,:host .byu-menu-el ::slotted(a:link) a:link,:host .byu-menu-el ::slotted(a:link) a:visited,:host .byu-menu-el ::slotted(a:visited) a,:host .byu-menu-el ::slotted(a:visited) a:link,:host .byu-menu-el ::slotted(a:visited) a:visited{padding:.5em 1.35em!important;white-space:nowrap}}:host .byu-menu-el ::slotted(a.active){border-left:3px solid #002e5d;border-bottom:none}@media (min-width:50rem){:host .byu-menu-el ::slotted(a.active){border-left:none;border-bottom-color:#002e5d!important}}:host .byu-menu-el ::slotted(:focus),:host .byu-menu-el ::slotted(:hover){background-color:#fafafa}@media (min-width:50rem){:host .byu-menu-el ::slotted(:focus),:host .byu-menu-el ::slotted(:hover){border-left:none;border-bottom-color:#002e5d!important}}@media (min-width:50rem){:host .byu-menu-el{padding-left:5.5em;border-top:1px solid #f4f4f4}}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJ5dS1tZW51LnNhc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O01BY007QUFDTjs7Ozs7Ozs7Ozs7Ozs7SUFjSSxDQUNKLGdFQUFnRSxDQUNoRSxtRUFBbUUsQ0FDbkUsaUJBQ0UsMkJBQTZCLENBQzdCLFVBQVcsQ0FDWCxTQUFVLENBQ1YsZUFBZ0IsQ0FDaEIsMEJBQWdDLENBRWxDLFFBQ0Usc0JBQTBCOztBQUU1Qjs7Ozs7Ozs7Ozs7Ozs7SUFjSSxDQW1CSixtQkFDRSxRQUFTLENBQ1QsU0FBVSxDQUNWLDRCQUErQixDQUMvQixnQkFBaUIsQ0FDakIsZUFBa0IsQ0FDbEIsNkdBQ0UsdUJBQXlCLENBQ3pCLGFBQWMsQ0FDZCwyQkFBNkIsQ0FDN0IsbUNBQXlDLENBQ3pDLGlCQUFrQixDQUNsQixlQUFnQixDQUNoQix3QkFBMEIsQ0FDMUIsK0JBQWlDLENBQ2pDLDhCQUFrQyxDQUNsQyx5QkFDRSw2R0FDRSxvQkFBdUIsQ0FDdkIsZ1lBQ0UsNkJBQWdDLENBQ2hDLGtCQUFxQixDQUFFLENBQy9CLHVDQUNFLDZCQUE4QixDQUM5QixrQkFBcUIsQ0FDckIseUJBQ0UsdUNBQ0UsZ0JBQWlCLENBQ2pCLHFDQUF5QyxDQUFFLENBQ2pELDBFQUNFLHdCQUEyQixDQUMzQix5QkFDRSwwRUFDRSxnQkFBaUIsQ0FDakIscUNBQXlDLENBQUUsQ0FDakQseUJBQ0UsbUJBQ0Usa0JBQW1CLENBQ25CLDRCQUErQixDQUFFIiwiZmlsZSI6ImJ5dS1tZW51LnNhc3MiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIC8gICAgQ29weXJpZ2h0IDIwMTkgQnJpZ2hhbSBZb3VuZyBVbml2ZXJzaXR5XG4gKiAvXG4gKiAvICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiAvICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIC8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKiAvXG4gKiAvICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqIC9cbiAqIC8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiAvICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogLyAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiAvICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogLyAqL1xuLyohXG4gLyAgICBDb3B5cmlnaHQgMjAxOSBCcmlnaGFtIFlvdW5nIFVuaXZlcnNpdHlcbiAvXG4gLyAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuIC8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuIC8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gL1xuIC8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuIC9cbiAvICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAvICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAvICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuIC8gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuIC8gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gLyAqL1xuQGltcG9ydCBodHRwczovL2Nkbi5ieXUuZWR1L3RoZW1lLWZvbnRzLzEueC54L3JpbmdzaWRlL2ZvbnRzLmNzcztcbkBpbXBvcnQgaHR0cHM6Ly9jZG4uYnl1LmVkdS90aGVtZS1mb250cy8xLngueC9wdWJsaWMtc2Fucy9mb250cy5jc3M7XG4udmlzdWFsbHktaGlkZGVuIHtcbiAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7XG4gIGhlaWdodDogMXB4O1xuICB3aWR0aDogMXB4O1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBjbGlwOiByZWN0KDFweCwgMXB4LCAxcHgsIDFweCk7IH1cblxuLmhpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfVxuXG4vKiFcbiAvICAgIENvcHlyaWdodCAyMDE5IEJyaWdoYW0gWW91bmcgVW5pdmVyc2l0eVxuIC9cbiAvICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAvXG4gLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gL1xuIC8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuIC8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuIC8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gLyAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gLyAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAvICovXG4vKlxuICogQ29ybmVyIFJhZGl1c1xuICovXG4vKlxuICogQ29sb3JzXG4gKi9cbi8qXG4gKiBGb250c1xuICovXG4vKlxuICogU3BhY2luZ1xuICovXG4vKlxuICogQnJlYWtwb2ludHNcbiAqL1xuLypcbiAqIEZvdW5kYXRpb25zXG4gKi9cbjpob3N0IC5ieXUtbWVudS1lbCB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbiAgZm9udC1zaXplOiAwLjg4ODg5ZW0gIWltcG9ydGFudDtcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XG4gIGJhY2tncm91bmQ6ICNmZmY7IH1cbiAgOmhvc3QgLmJ5dS1tZW51LWVsIDo6c2xvdHRlZChhKSwgOmhvc3QgLmJ5dS1tZW51LWVsIDo6c2xvdHRlZChhOmxpbmspLCA6aG9zdCAuYnl1LW1lbnUtZWwgOjpzbG90dGVkKGE6dmlzaXRlZCkge1xuICAgIGNvbG9yOiAjMDAyZTVkICFpbXBvcnRhbnQ7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgcGFkZGluZzogMTFweCAyMnB4ICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyLWJvdHRvbTogc29saWQgM3B4IHJnYmEoMCwgMCwgMCwgMCk7XG4gICAgbWFyZ2luLWJvdHRvbTogMXB4O1xuICAgIGxpbmUtaGVpZ2h0OiAxLjY7XG4gICAgZm9udC1zaXplOiAxcmVtICFpbXBvcnRhbnQ7XG4gICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAyNTBtcyBlYXNlO1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50OyB9XG4gICAgQG1lZGlhIChtaW4td2lkdGg6IDUwcmVtKSB7XG4gICAgICA6aG9zdCAuYnl1LW1lbnUtZWwgOjpzbG90dGVkKGEpLCA6aG9zdCAuYnl1LW1lbnUtZWwgOjpzbG90dGVkKGE6bGluayksIDpob3N0IC5ieXUtbWVudS1lbCA6OnNsb3R0ZWQoYTp2aXNpdGVkKSB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsgfVxuICAgICAgICA6aG9zdCAuYnl1LW1lbnUtZWwgOjpzbG90dGVkKGEpIGEsIDpob3N0IC5ieXUtbWVudS1lbCA6OnNsb3R0ZWQoYSkgYTpsaW5rLCA6aG9zdCAuYnl1LW1lbnUtZWwgOjpzbG90dGVkKGEpIGE6dmlzaXRlZCwgOmhvc3QgLmJ5dS1tZW51LWVsIDo6c2xvdHRlZChhOmxpbmspIGEsIDpob3N0IC5ieXUtbWVudS1lbCA6OnNsb3R0ZWQoYTpsaW5rKSBhOmxpbmssIDpob3N0IC5ieXUtbWVudS1lbCA6OnNsb3R0ZWQoYTpsaW5rKSBhOnZpc2l0ZWQsIDpob3N0IC5ieXUtbWVudS1lbCA6OnNsb3R0ZWQoYTp2aXNpdGVkKSBhLCA6aG9zdCAuYnl1LW1lbnUtZWwgOjpzbG90dGVkKGE6dmlzaXRlZCkgYTpsaW5rLCA6aG9zdCAuYnl1LW1lbnUtZWwgOjpzbG90dGVkKGE6dmlzaXRlZCkgYTp2aXNpdGVkIHtcbiAgICAgICAgICBwYWRkaW5nOiAwLjVlbSAxLjM1ZW0gIWltcG9ydGFudDtcbiAgICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOyB9IH1cbiAgOmhvc3QgLmJ5dS1tZW51LWVsIDo6c2xvdHRlZChhLmFjdGl2ZSkge1xuICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAzcHggIzAwMmU1ZDtcbiAgICBib3JkZXItYm90dG9tOiBub25lOyB9XG4gICAgQG1lZGlhIChtaW4td2lkdGg6IDUwcmVtKSB7XG4gICAgICA6aG9zdCAuYnl1LW1lbnUtZWwgOjpzbG90dGVkKGEuYWN0aXZlKSB7XG4gICAgICAgIGJvcmRlci1sZWZ0OiBub25lO1xuICAgICAgICBib3JkZXItYm90dG9tLWNvbG9yOiAjMDAyZTVkICFpbXBvcnRhbnQ7IH0gfVxuICA6aG9zdCAuYnl1LW1lbnUtZWwgOjpzbG90dGVkKCo6aG92ZXIpLCA6aG9zdCAuYnl1LW1lbnUtZWwgOjpzbG90dGVkKCo6Zm9jdXMpIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhOyB9XG4gICAgQG1lZGlhIChtaW4td2lkdGg6IDUwcmVtKSB7XG4gICAgICA6aG9zdCAuYnl1LW1lbnUtZWwgOjpzbG90dGVkKCo6aG92ZXIpLCA6aG9zdCAuYnl1LW1lbnUtZWwgOjpzbG90dGVkKCo6Zm9jdXMpIHtcbiAgICAgICAgYm9yZGVyLWxlZnQ6IG5vbmU7XG4gICAgICAgIGJvcmRlci1ib3R0b20tY29sb3I6ICMwMDJlNWQgIWltcG9ydGFudDsgfSB9XG4gIEBtZWRpYSAobWluLXdpZHRoOiA1MHJlbSkge1xuICAgIDpob3N0IC5ieXUtbWVudS1lbCB7XG4gICAgICBwYWRkaW5nLWxlZnQ6IDUuNWVtO1xuICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNmNGY0ZjQ7IH0gfVxuIl19 */';de(ye);let Qe=s([te("byu-menu")],(function(e,t){return{F:class extends t{constructor(...t){super(...t),e(this)}},d:[{kind:"field",decorators:[se({type:String,attribute:"active-selector"})],key:"activeSelector",value:()=>""},{kind:"method",key:"firstUpdated",value:function(e){""!==this.activeSelector&&this._updateActiveSelector(this),this.classList.add("byu-component-rendered")}},{kind:"method",key:"_updateActiveSelector",value:function(e){const t=e.querySelector(this.activeSelector);t&&t.classList.add("active")}},{kind:"get",static:!0,key:"styles",value:function(){return ae`${ce(ye)}`}},{kind:"method",key:"render",value:function(){return E`
+ `}}]}}),Ie);var ye='/*!\n * / Copyright 2019 Brigham Young University\n * /\n * / Licensed under the Apache License, Version 2.0 (the "License");\n * / you may not use this file except in compliance with the License.\n * / You may obtain a copy of the License at\n * /\n * / http://www.apache.org/licenses/LICENSE-2.0\n * /\n * / Unless required by applicable law or agreed to in writing, software\n * / distributed under the License is distributed on an "AS IS" BASIS,\n * / WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * / See the License for the specific language governing permissions and\n * / limitations under the License.\n * / */\n/*!\n / Copyright 2019 Brigham Young University\n /\n / Licensed under the Apache License, Version 2.0 (the "License");\n / you may not use this file except in compliance with the License.\n / You may obtain a copy of the License at\n /\n / http://www.apache.org/licenses/LICENSE-2.0\n /\n / Unless required by applicable law or agreed to in writing, software\n / distributed under the License is distributed on an "AS IS" BASIS,\n / WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n / See the License for the specific language governing permissions and\n / limitations under the License.\n / */@import https://cdn.byu.edu/theme-fonts/1.x.x/ringside/fonts.css;@import https://cdn.byu.edu/theme-fonts/1.x.x/public-sans/fonts.css;.visually-hidden{position:absolute!important;height:1px;width:1px;overflow:hidden;clip:rect(1px,1px,1px,1px)}.hidden{display:none!important}\n\n/*!\n / Copyright 2019 Brigham Young University\n /\n / Licensed under the Apache License, Version 2.0 (the "License");\n / you may not use this file except in compliance with the License.\n / You may obtain a copy of the License at\n /\n / http://www.apache.org/licenses/LICENSE-2.0\n /\n / Unless required by applicable law or agreed to in writing, software\n / distributed under the License is distributed on an "AS IS" BASIS,\n / WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n / See the License for the specific language governing permissions and\n / limitations under the License.\n / */:host .byu-menu-el{margin:0;padding:0;font-size:.88889em!important;letter-spacing:0;background:#fff}:host .byu-menu-el ::slotted(a),:host .byu-menu-el ::slotted(a:link),:host .byu-menu-el ::slotted(a:visited){color:#002e5d!important;display:block;padding:11px 22px!important;border-bottom:3px solid transparent;margin-bottom:1px;line-height:1.6;font-size:1rem!important;transition:background .25s ease;text-decoration:none!important}@media (min-width:50rem){:host .byu-menu-el ::slotted(a),:host .byu-menu-el ::slotted(a:link),:host .byu-menu-el ::slotted(a:visited){display:inline-block}:host .byu-menu-el ::slotted(a) a,:host .byu-menu-el ::slotted(a) a:link,:host .byu-menu-el ::slotted(a) a:visited,:host .byu-menu-el ::slotted(a:link) a,:host .byu-menu-el ::slotted(a:link) a:link,:host .byu-menu-el ::slotted(a:link) a:visited,:host .byu-menu-el ::slotted(a:visited) a,:host .byu-menu-el ::slotted(a:visited) a:link,:host .byu-menu-el ::slotted(a:visited) a:visited{padding:.5em 1.35em!important;white-space:nowrap}}:host .byu-menu-el ::slotted(a.active){border-left:3px solid #002e5d;border-bottom:none}@media (min-width:50rem){:host .byu-menu-el ::slotted(a.active){border-left:none;border-bottom:3px solid #002e5d!important}}:host .byu-menu-el ::slotted(:focus),:host .byu-menu-el ::slotted(:hover){background-color:#fafafa}@media (min-width:50rem){:host .byu-menu-el ::slotted(:focus),:host .byu-menu-el ::slotted(:hover){border-left:none;border-bottom:3px solid #002e5d!important}}@media (min-width:50rem){:host .byu-menu-el{padding-left:5.5em;border-top:1px solid #f4f4f4}}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJ5dS1tZW51LnNhc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O01BY007QUFDTjs7Ozs7Ozs7Ozs7Ozs7SUFjSSxDQUNKLGdFQUFnRSxDQUNoRSxtRUFBbUUsQ0FDbkUsaUJBQ0UsMkJBQTZCLENBQzdCLFVBQVcsQ0FDWCxTQUFVLENBQ1YsZUFBZ0IsQ0FDaEIsMEJBQWdDLENBRWxDLFFBQ0Usc0JBQTBCOztBQUU1Qjs7Ozs7Ozs7Ozs7Ozs7SUFjSSxDQW1CSixtQkFDRSxRQUFTLENBQ1QsU0FBVSxDQUNWLDRCQUErQixDQUMvQixnQkFBaUIsQ0FDakIsZUFBa0IsQ0FDbEIsNkdBQ0UsdUJBQXlCLENBQ3pCLGFBQWMsQ0FDZCwyQkFBNkIsQ0FDN0IsbUNBQXlDLENBQ3pDLGlCQUFrQixDQUNsQixlQUFnQixDQUNoQix3QkFBMEIsQ0FDMUIsK0JBQWlDLENBQ2pDLDhCQUFrQyxDQUNsQyx5QkFDRSw2R0FDRSxvQkFBdUIsQ0FDdkIsZ1lBQ0UsNkJBQWdDLENBQ2hDLGtCQUFxQixDQUFFLENBQy9CLHVDQUNFLDZCQUE4QixDQUM5QixrQkFBcUIsQ0FDckIseUJBQ0UsdUNBQ0UsZ0JBQWlCLENBQ2pCLHlDQUE2QyxDQUFFLENBQ3JELDBFQUNFLHdCQUEyQixDQUMzQix5QkFDRSwwRUFDRSxnQkFBaUIsQ0FDakIseUNBQTZDLENBQUUsQ0FDckQseUJBQ0UsbUJBQ0Usa0JBQW1CLENBQ25CLDRCQUErQixDQUFFIiwiZmlsZSI6ImJ5dS1tZW51LnNhc3MiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIC8gICAgQ29weXJpZ2h0IDIwMTkgQnJpZ2hhbSBZb3VuZyBVbml2ZXJzaXR5XG4gKiAvXG4gKiAvICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiAvICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIC8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKiAvXG4gKiAvICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqIC9cbiAqIC8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiAvICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogLyAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiAvICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogLyAqL1xuLyohXG4gLyAgICBDb3B5cmlnaHQgMjAxOSBCcmlnaGFtIFlvdW5nIFVuaXZlcnNpdHlcbiAvXG4gLyAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuIC8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuIC8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gL1xuIC8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuIC9cbiAvICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAvICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAvICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuIC8gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuIC8gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gLyAqL1xuQGltcG9ydCBodHRwczovL2Nkbi5ieXUuZWR1L3RoZW1lLWZvbnRzLzEueC54L3JpbmdzaWRlL2ZvbnRzLmNzcztcbkBpbXBvcnQgaHR0cHM6Ly9jZG4uYnl1LmVkdS90aGVtZS1mb250cy8xLngueC9wdWJsaWMtc2Fucy9mb250cy5jc3M7XG4udmlzdWFsbHktaGlkZGVuIHtcbiAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7XG4gIGhlaWdodDogMXB4O1xuICB3aWR0aDogMXB4O1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBjbGlwOiByZWN0KDFweCwgMXB4LCAxcHgsIDFweCk7IH1cblxuLmhpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfVxuXG4vKiFcbiAvICAgIENvcHlyaWdodCAyMDE5IEJyaWdoYW0gWW91bmcgVW5pdmVyc2l0eVxuIC9cbiAvICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAvXG4gLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gL1xuIC8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuIC8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuIC8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gLyAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gLyAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAvICovXG4vKlxuICogQ29ybmVyIFJhZGl1c1xuICovXG4vKlxuICogQ29sb3JzXG4gKi9cbi8qXG4gKiBGb250c1xuICovXG4vKlxuICogU3BhY2luZ1xuICovXG4vKlxuICogQnJlYWtwb2ludHNcbiAqL1xuLypcbiAqIEZvdW5kYXRpb25zXG4gKi9cbjpob3N0IC5ieXUtbWVudS1lbCB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbiAgZm9udC1zaXplOiAwLjg4ODg5ZW0gIWltcG9ydGFudDtcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XG4gIGJhY2tncm91bmQ6ICNmZmY7IH1cbiAgOmhvc3QgLmJ5dS1tZW51LWVsIDo6c2xvdHRlZChhKSwgOmhvc3QgLmJ5dS1tZW51LWVsIDo6c2xvdHRlZChhOmxpbmspLCA6aG9zdCAuYnl1LW1lbnUtZWwgOjpzbG90dGVkKGE6dmlzaXRlZCkge1xuICAgIGNvbG9yOiAjMDAyZTVkICFpbXBvcnRhbnQ7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgcGFkZGluZzogMTFweCAyMnB4ICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyLWJvdHRvbTogc29saWQgM3B4IHJnYmEoMCwgMCwgMCwgMCk7XG4gICAgbWFyZ2luLWJvdHRvbTogMXB4O1xuICAgIGxpbmUtaGVpZ2h0OiAxLjY7XG4gICAgZm9udC1zaXplOiAxcmVtICFpbXBvcnRhbnQ7XG4gICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAyNTBtcyBlYXNlO1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50OyB9XG4gICAgQG1lZGlhIChtaW4td2lkdGg6IDUwcmVtKSB7XG4gICAgICA6aG9zdCAuYnl1LW1lbnUtZWwgOjpzbG90dGVkKGEpLCA6aG9zdCAuYnl1LW1lbnUtZWwgOjpzbG90dGVkKGE6bGluayksIDpob3N0IC5ieXUtbWVudS1lbCA6OnNsb3R0ZWQoYTp2aXNpdGVkKSB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsgfVxuICAgICAgICA6aG9zdCAuYnl1LW1lbnUtZWwgOjpzbG90dGVkKGEpIGEsIDpob3N0IC5ieXUtbWVudS1lbCA6OnNsb3R0ZWQoYSkgYTpsaW5rLCA6aG9zdCAuYnl1LW1lbnUtZWwgOjpzbG90dGVkKGEpIGE6dmlzaXRlZCwgOmhvc3QgLmJ5dS1tZW51LWVsIDo6c2xvdHRlZChhOmxpbmspIGEsIDpob3N0IC5ieXUtbWVudS1lbCA6OnNsb3R0ZWQoYTpsaW5rKSBhOmxpbmssIDpob3N0IC5ieXUtbWVudS1lbCA6OnNsb3R0ZWQoYTpsaW5rKSBhOnZpc2l0ZWQsIDpob3N0IC5ieXUtbWVudS1lbCA6OnNsb3R0ZWQoYTp2aXNpdGVkKSBhLCA6aG9zdCAuYnl1LW1lbnUtZWwgOjpzbG90dGVkKGE6dmlzaXRlZCkgYTpsaW5rLCA6aG9zdCAuYnl1LW1lbnUtZWwgOjpzbG90dGVkKGE6dmlzaXRlZCkgYTp2aXNpdGVkIHtcbiAgICAgICAgICBwYWRkaW5nOiAwLjVlbSAxLjM1ZW0gIWltcG9ydGFudDtcbiAgICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOyB9IH1cbiAgOmhvc3QgLmJ5dS1tZW51LWVsIDo6c2xvdHRlZChhLmFjdGl2ZSkge1xuICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAzcHggIzAwMmU1ZDtcbiAgICBib3JkZXItYm90dG9tOiBub25lOyB9XG4gICAgQG1lZGlhIChtaW4td2lkdGg6IDUwcmVtKSB7XG4gICAgICA6aG9zdCAuYnl1LW1lbnUtZWwgOjpzbG90dGVkKGEuYWN0aXZlKSB7XG4gICAgICAgIGJvcmRlci1sZWZ0OiBub25lO1xuICAgICAgICBib3JkZXItYm90dG9tOiAzcHggc29saWQgIzAwMmU1ZCAhaW1wb3J0YW50OyB9IH1cbiAgOmhvc3QgLmJ5dS1tZW51LWVsIDo6c2xvdHRlZCgqOmhvdmVyKSwgOmhvc3QgLmJ5dS1tZW51LWVsIDo6c2xvdHRlZCgqOmZvY3VzKSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZmFmYTsgfVxuICAgIEBtZWRpYSAobWluLXdpZHRoOiA1MHJlbSkge1xuICAgICAgOmhvc3QgLmJ5dS1tZW51LWVsIDo6c2xvdHRlZCgqOmhvdmVyKSwgOmhvc3QgLmJ5dS1tZW51LWVsIDo6c2xvdHRlZCgqOmZvY3VzKSB7XG4gICAgICAgIGJvcmRlci1sZWZ0OiBub25lO1xuICAgICAgICBib3JkZXItYm90dG9tOiAzcHggc29saWQgIzAwMmU1ZCAhaW1wb3J0YW50OyB9IH1cbiAgQG1lZGlhIChtaW4td2lkdGg6IDUwcmVtKSB7XG4gICAgOmhvc3QgLmJ5dS1tZW51LWVsIHtcbiAgICAgIHBhZGRpbmctbGVmdDogNS41ZW07XG4gICAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2Y0ZjRmNDsgfSB9XG4iXX0= */';de(ye);let Qe=s([te("byu-menu")],(function(e,t){return{F:class extends t{constructor(...t){super(...t),e(this)}},d:[{kind:"field",decorators:[se({type:String,attribute:"active-selector"})],key:"activeSelector",value:()=>""},{kind:"method",key:"firstUpdated",value:function(e){""!==this.activeSelector&&this._updateActiveSelector(this),this.classList.add("byu-component-rendered")}},{kind:"method",key:"_updateActiveSelector",value:function(e){const t=e.querySelector(this.activeSelector);t&&t.classList.add("active")}},{kind:"get",static:!0,key:"styles",value:function(){return ae`${ce(ye)}`}},{kind:"method",key:"render",value:function(){return E`
diff --git a/dist/components.min.js.map b/dist/components.min.js.map
index e36a0cbf..c9f77bb8 100644
--- a/dist/components.min.js.map
+++ b/dist/components.min.js.map
@@ -1 +1 @@
-{"version":3,"file":"components.min.js","sources":["../node_modules/lit-html/lib/dom.js","../node_modules/lit-html/lib/template.js","../node_modules/lit-html/lib/modify-template.js","../node_modules/lit-html/lib/directive.js","../node_modules/lit-html/lib/part.js","../node_modules/lit-html/lib/template-instance.js","../node_modules/lit-html/lib/template-result.js","../node_modules/lit-html/lib/parts.js","../node_modules/lit-html/lib/template-factory.js","../node_modules/lit-html/lib/render.js","../node_modules/lit-html/lib/default-template-processor.js","../node_modules/lit-html/lit-html.js","../node_modules/lit-html/lib/shady-render.js","../node_modules/lit-element/lib/updating-element.js","../node_modules/lit-element/lib/decorators.js","../node_modules/lit-element/lib/css-tag.js","../node_modules/lit-element/lit-element.js","../node_modules/style-inject/dist/style-inject.es.js","../components/byu-breadcrumbs/byu-breadcrumbs.js","../components/byu-footer/byu-footer.js","../components/byu-footer-action-button/byu-footer-action-button.js","../components/byu-footer-column/byu-footer-column.js","../components/byu-header/byu-header.js","../components/byu-menu/byu-menu.js","../node_modules/byu-web-component-utils/lib/matchesSelector.js","../node_modules/byu-web-component-utils/lib/querySelectorSlot.js","../components/byu-search/byu-search.js","../components/byu-social-media-links/byu-social-media-links.js","../components/byu-user-info/byu-user-info.js"],"sourcesContent":["/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n/**\n * True if the custom elements polyfill is in use.\n */\nexport const isCEPolyfill = typeof window !== 'undefined' &&\n window.customElements != null &&\n window.customElements.polyfillWrapFlushCallback !==\n undefined;\n/**\n * Reparents nodes, starting from `start` (inclusive) to `end` (exclusive),\n * into another container (could be the same container), before `before`. If\n * `before` is null, it appends the nodes to the container.\n */\nexport const reparentNodes = (container, start, end = null, before = null) => {\n while (start !== end) {\n const n = start.nextSibling;\n container.insertBefore(start, before);\n start = n;\n }\n};\n/**\n * Removes nodes, starting from `start` (inclusive) to `end` (exclusive), from\n * `container`.\n */\nexport const removeNodes = (container, start, end = null) => {\n while (start !== end) {\n const n = start.nextSibling;\n container.removeChild(start);\n start = n;\n }\n};\n//# sourceMappingURL=dom.js.map","/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n/**\n * An expression marker with embedded unique key to avoid collision with\n * possible text in templates.\n */\nexport const marker = `{{lit-${String(Math.random()).slice(2)}}}`;\n/**\n * An expression marker used text-positions, multi-binding attributes, and\n * attributes with markup-like text values.\n */\nexport const nodeMarker = ``;\nexport const markerRegex = new RegExp(`${marker}|${nodeMarker}`);\n/**\n * Suffix appended to all bound attribute names.\n */\nexport const boundAttributeSuffix = '$lit$';\n/**\n * An updatable Template that tracks the location of dynamic parts.\n */\nexport class Template {\n constructor(result, element) {\n this.parts = [];\n this.element = element;\n const nodesToRemove = [];\n const stack = [];\n // Edge needs all 4 parameters present; IE11 needs 3rd parameter to be null\n const walker = document.createTreeWalker(element.content, 133 /* NodeFilter.SHOW_{ELEMENT|COMMENT|TEXT} */, null, false);\n // Keeps track of the last index associated with a part. We try to delete\n // unnecessary nodes, but we never want to associate two different parts\n // to the same index. They must have a constant node between.\n let lastPartIndex = 0;\n let index = -1;\n let partIndex = 0;\n const { strings, values: { length } } = result;\n while (partIndex < length) {\n const node = walker.nextNode();\n if (node === null) {\n // We've exhausted the content inside a nested template element.\n // Because we still have parts (the outer for-loop), we know:\n // - There is a template in the stack\n // - The walker will find a nextNode outside the template\n walker.currentNode = stack.pop();\n continue;\n }\n index++;\n if (node.nodeType === 1 /* Node.ELEMENT_NODE */) {\n if (node.hasAttributes()) {\n const attributes = node.attributes;\n const { length } = attributes;\n // Per\n // https://developer.mozilla.org/en-US/docs/Web/API/NamedNodeMap,\n // attributes are not guaranteed to be returned in document order.\n // In particular, Edge/IE can return them out of order, so we cannot\n // assume a correspondence between part index and attribute index.\n let count = 0;\n for (let i = 0; i < length; i++) {\n if (endsWith(attributes[i].name, boundAttributeSuffix)) {\n count++;\n }\n }\n while (count-- > 0) {\n // Get the template literal section leading up to the first\n // expression in this attribute\n const stringForPart = strings[partIndex];\n // Find the attribute name\n const name = lastAttributeNameRegex.exec(stringForPart)[2];\n // Find the corresponding attribute\n // All bound attributes have had a suffix added in\n // TemplateResult#getHTML to opt out of special attribute\n // handling. To look up the attribute value we also need to add\n // the suffix.\n const attributeLookupName = name.toLowerCase() + boundAttributeSuffix;\n const attributeValue = node.getAttribute(attributeLookupName);\n node.removeAttribute(attributeLookupName);\n const statics = attributeValue.split(markerRegex);\n this.parts.push({ type: 'attribute', index, name, strings: statics });\n partIndex += statics.length - 1;\n }\n }\n if (node.tagName === 'TEMPLATE') {\n stack.push(node);\n walker.currentNode = node.content;\n }\n }\n else if (node.nodeType === 3 /* Node.TEXT_NODE */) {\n const data = node.data;\n if (data.indexOf(marker) >= 0) {\n const parent = node.parentNode;\n const strings = data.split(markerRegex);\n const lastIndex = strings.length - 1;\n // Generate a new text node for each literal section\n // These nodes are also used as the markers for node parts\n for (let i = 0; i < lastIndex; i++) {\n let insert;\n let s = strings[i];\n if (s === '') {\n insert = createMarker();\n }\n else {\n const match = lastAttributeNameRegex.exec(s);\n if (match !== null && endsWith(match[2], boundAttributeSuffix)) {\n s = s.slice(0, match.index) + match[1] +\n match[2].slice(0, -boundAttributeSuffix.length) + match[3];\n }\n insert = document.createTextNode(s);\n }\n parent.insertBefore(insert, node);\n this.parts.push({ type: 'node', index: ++index });\n }\n // If there's no text, we must insert a comment to mark our place.\n // Else, we can trust it will stick around after cloning.\n if (strings[lastIndex] === '') {\n parent.insertBefore(createMarker(), node);\n nodesToRemove.push(node);\n }\n else {\n node.data = strings[lastIndex];\n }\n // We have a part for each match found\n partIndex += lastIndex;\n }\n }\n else if (node.nodeType === 8 /* Node.COMMENT_NODE */) {\n if (node.data === marker) {\n const parent = node.parentNode;\n // Add a new marker node to be the startNode of the Part if any of\n // the following are true:\n // * We don't have a previousSibling\n // * The previousSibling is already the start of a previous part\n if (node.previousSibling === null || index === lastPartIndex) {\n index++;\n parent.insertBefore(createMarker(), node);\n }\n lastPartIndex = index;\n this.parts.push({ type: 'node', index });\n // If we don't have a nextSibling, keep this node so we have an end.\n // Else, we can remove it to save future costs.\n if (node.nextSibling === null) {\n node.data = '';\n }\n else {\n nodesToRemove.push(node);\n index--;\n }\n partIndex++;\n }\n else {\n let i = -1;\n while ((i = node.data.indexOf(marker, i + 1)) !== -1) {\n // Comment node has a binding marker inside, make an inactive part\n // The binding won't work, but subsequent bindings will\n // TODO (justinfagnani): consider whether it's even worth it to\n // make bindings in comments work\n this.parts.push({ type: 'node', index: -1 });\n partIndex++;\n }\n }\n }\n }\n // Remove text binding nodes after the walk to not disturb the TreeWalker\n for (const n of nodesToRemove) {\n n.parentNode.removeChild(n);\n }\n }\n}\nconst endsWith = (str, suffix) => {\n const index = str.length - suffix.length;\n return index >= 0 && str.slice(index) === suffix;\n};\nexport const isTemplatePartActive = (part) => part.index !== -1;\n// Allows `document.createComment('')` to be renamed for a\n// small manual size-savings.\nexport const createMarker = () => document.createComment('');\n/**\n * This regex extracts the attribute name preceding an attribute-position\n * expression. It does this by matching the syntax allowed for attributes\n * against the string literal directly preceding the expression, assuming that\n * the expression is in an attribute-value position.\n *\n * See attributes in the HTML spec:\n * https://www.w3.org/TR/html5/syntax.html#elements-attributes\n *\n * \" \\x09\\x0a\\x0c\\x0d\" are HTML space characters:\n * https://www.w3.org/TR/html5/infrastructure.html#space-characters\n *\n * \"\\0-\\x1F\\x7F-\\x9F\" are Unicode control characters, which includes every\n * space character except \" \".\n *\n * So an attribute is:\n * * The name: any character except a control character, space character, ('),\n * (\"), \">\", \"=\", or \"/\"\n * * Followed by zero or more space characters\n * * Followed by \"=\"\n * * Followed by zero or more space characters\n * * Followed by:\n * * Any character except space, ('), (\"), \"<\", \">\", \"=\", (`), or\n * * (\") then any non-(\"), or\n * * (') then any non-(')\n */\nexport const lastAttributeNameRegex = \n// eslint-disable-next-line no-control-regex\n/([ \\x09\\x0a\\x0c\\x0d])([^\\0-\\x1F\\x7F-\\x9F \"'>=/]+)([ \\x09\\x0a\\x0c\\x0d]*=[ \\x09\\x0a\\x0c\\x0d]*(?:[^ \\x09\\x0a\\x0c\\x0d\"'`<>=]*|\"[^\"]*|'[^']*))$/;\n//# sourceMappingURL=template.js.map","/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n/**\n * @module shady-render\n */\nimport { isTemplatePartActive } from './template.js';\nconst walkerNodeFilter = 133 /* NodeFilter.SHOW_{ELEMENT|COMMENT|TEXT} */;\n/**\n * Removes the list of nodes from a Template safely. In addition to removing\n * nodes from the Template, the Template part indices are updated to match\n * the mutated Template DOM.\n *\n * As the template is walked the removal state is tracked and\n * part indices are adjusted as needed.\n *\n * div\n * div#1 (remove) <-- start removing (removing node is div#1)\n * div\n * div#2 (remove) <-- continue removing (removing node is still div#1)\n * div\n * div <-- stop removing since previous sibling is the removing node (div#1,\n * removed 4 nodes)\n */\nexport function removeNodesFromTemplate(template, nodesToRemove) {\n const { element: { content }, parts } = template;\n const walker = document.createTreeWalker(content, walkerNodeFilter, null, false);\n let partIndex = nextActiveIndexInTemplateParts(parts);\n let part = parts[partIndex];\n let nodeIndex = -1;\n let removeCount = 0;\n const nodesToRemoveInTemplate = [];\n let currentRemovingNode = null;\n while (walker.nextNode()) {\n nodeIndex++;\n const node = walker.currentNode;\n // End removal if stepped past the removing node\n if (node.previousSibling === currentRemovingNode) {\n currentRemovingNode = null;\n }\n // A node to remove was found in the template\n if (nodesToRemove.has(node)) {\n nodesToRemoveInTemplate.push(node);\n // Track node we're removing\n if (currentRemovingNode === null) {\n currentRemovingNode = node;\n }\n }\n // When removing, increment count by which to adjust subsequent part indices\n if (currentRemovingNode !== null) {\n removeCount++;\n }\n while (part !== undefined && part.index === nodeIndex) {\n // If part is in a removed node deactivate it by setting index to -1 or\n // adjust the index as needed.\n part.index = currentRemovingNode !== null ? -1 : part.index - removeCount;\n // go to the next active part.\n partIndex = nextActiveIndexInTemplateParts(parts, partIndex);\n part = parts[partIndex];\n }\n }\n nodesToRemoveInTemplate.forEach((n) => n.parentNode.removeChild(n));\n}\nconst countNodes = (node) => {\n let count = (node.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? 0 : 1;\n const walker = document.createTreeWalker(node, walkerNodeFilter, null, false);\n while (walker.nextNode()) {\n count++;\n }\n return count;\n};\nconst nextActiveIndexInTemplateParts = (parts, startIndex = -1) => {\n for (let i = startIndex + 1; i < parts.length; i++) {\n const part = parts[i];\n if (isTemplatePartActive(part)) {\n return i;\n }\n }\n return -1;\n};\n/**\n * Inserts the given node into the Template, optionally before the given\n * refNode. In addition to inserting the node into the Template, the Template\n * part indices are updated to match the mutated Template DOM.\n */\nexport function insertNodeIntoTemplate(template, node, refNode = null) {\n const { element: { content }, parts } = template;\n // If there's no refNode, then put node at end of template.\n // No part indices need to be shifted in this case.\n if (refNode === null || refNode === undefined) {\n content.appendChild(node);\n return;\n }\n const walker = document.createTreeWalker(content, walkerNodeFilter, null, false);\n let partIndex = nextActiveIndexInTemplateParts(parts);\n let insertCount = 0;\n let walkerIndex = -1;\n while (walker.nextNode()) {\n walkerIndex++;\n const walkerNode = walker.currentNode;\n if (walkerNode === refNode) {\n insertCount = countNodes(node);\n refNode.parentNode.insertBefore(node, refNode);\n }\n while (partIndex !== -1 && parts[partIndex].index === walkerIndex) {\n // If we've inserted the node, simply adjust all subsequent parts\n if (insertCount > 0) {\n while (partIndex !== -1) {\n parts[partIndex].index += insertCount;\n partIndex = nextActiveIndexInTemplateParts(parts, partIndex);\n }\n return;\n }\n partIndex = nextActiveIndexInTemplateParts(parts, partIndex);\n }\n }\n}\n//# sourceMappingURL=modify-template.js.map","/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\nconst directives = new WeakMap();\n/**\n * Brands a function as a directive factory function so that lit-html will call\n * the function during template rendering, rather than passing as a value.\n *\n * A _directive_ is a function that takes a Part as an argument. It has the\n * signature: `(part: Part) => void`.\n *\n * A directive _factory_ is a function that takes arguments for data and\n * configuration and returns a directive. Users of directive usually refer to\n * the directive factory as the directive. For example, \"The repeat directive\".\n *\n * Usually a template author will invoke a directive factory in their template\n * with relevant arguments, which will then return a directive function.\n *\n * Here's an example of using the `repeat()` directive factory that takes an\n * array and a function to render an item:\n *\n * ```js\n * html`
<${repeat(items, (item) => html`
${item}
`)}
`\n * ```\n *\n * When `repeat` is invoked, it returns a directive function that closes over\n * `items` and the template function. When the outer template is rendered, the\n * return directive function is called with the Part for the expression.\n * `repeat` then performs it's custom logic to render multiple items.\n *\n * @param f The directive factory function. Must be a function that returns a\n * function of the signature `(part: Part) => void`. The returned function will\n * be called with the part object.\n *\n * @example\n *\n * import {directive, html} from 'lit-html';\n *\n * const immutable = directive((v) => (part) => {\n * if (part.value !== v) {\n * part.setValue(v)\n * }\n * });\n */\nexport const directive = (f) => ((...args) => {\n const d = f(...args);\n directives.set(d, true);\n return d;\n});\nexport const isDirective = (o) => {\n return typeof o === 'function' && directives.has(o);\n};\n//# sourceMappingURL=directive.js.map","/**\n * @license\n * Copyright (c) 2018 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n/**\n * A sentinel value that signals that a value was handled by a directive and\n * should not be written to the DOM.\n */\nexport const noChange = {};\n/**\n * A sentinel value that signals a NodePart to fully clear its content.\n */\nexport const nothing = {};\n//# sourceMappingURL=part.js.map","/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n/**\n * @module lit-html\n */\nimport { isCEPolyfill } from './dom.js';\nimport { isTemplatePartActive } from './template.js';\n/**\n * An instance of a `Template` that can be attached to the DOM and updated\n * with new values.\n */\nexport class TemplateInstance {\n constructor(template, processor, options) {\n this.__parts = [];\n this.template = template;\n this.processor = processor;\n this.options = options;\n }\n update(values) {\n let i = 0;\n for (const part of this.__parts) {\n if (part !== undefined) {\n part.setValue(values[i]);\n }\n i++;\n }\n for (const part of this.__parts) {\n if (part !== undefined) {\n part.commit();\n }\n }\n }\n _clone() {\n // There are a number of steps in the lifecycle of a template instance's\n // DOM fragment:\n // 1. Clone - create the instance fragment\n // 2. Adopt - adopt into the main document\n // 3. Process - find part markers and create parts\n // 4. Upgrade - upgrade custom elements\n // 5. Update - set node, attribute, property, etc., values\n // 6. Connect - connect to the document. Optional and outside of this\n // method.\n //\n // We have a few constraints on the ordering of these steps:\n // * We need to upgrade before updating, so that property values will pass\n // through any property setters.\n // * We would like to process before upgrading so that we're sure that the\n // cloned fragment is inert and not disturbed by self-modifying DOM.\n // * We want custom elements to upgrade even in disconnected fragments.\n //\n // Given these constraints, with full custom elements support we would\n // prefer the order: Clone, Process, Adopt, Upgrade, Update, Connect\n //\n // But Safari does not implement CustomElementRegistry#upgrade, so we\n // can not implement that order and still have upgrade-before-update and\n // upgrade disconnected fragments. So we instead sacrifice the\n // process-before-upgrade constraint, since in Custom Elements v1 elements\n // must not modify their light DOM in the constructor. We still have issues\n // when co-existing with CEv0 elements like Polymer 1, and with polyfills\n // that don't strictly adhere to the no-modification rule because shadow\n // DOM, which may be created in the constructor, is emulated by being placed\n // in the light DOM.\n //\n // The resulting order is on native is: Clone, Adopt, Upgrade, Process,\n // Update, Connect. document.importNode() performs Clone, Adopt, and Upgrade\n // in one step.\n //\n // The Custom Elements v1 polyfill supports upgrade(), so the order when\n // polyfilled is the more ideal: Clone, Process, Adopt, Upgrade, Update,\n // Connect.\n const fragment = isCEPolyfill ?\n this.template.element.content.cloneNode(true) :\n document.importNode(this.template.element.content, true);\n const stack = [];\n const parts = this.template.parts;\n // Edge needs all 4 parameters present; IE11 needs 3rd parameter to be null\n const walker = document.createTreeWalker(fragment, 133 /* NodeFilter.SHOW_{ELEMENT|COMMENT|TEXT} */, null, false);\n let partIndex = 0;\n let nodeIndex = 0;\n let part;\n let node = walker.nextNode();\n // Loop through all the nodes and parts of a template\n while (partIndex < parts.length) {\n part = parts[partIndex];\n if (!isTemplatePartActive(part)) {\n this.__parts.push(undefined);\n partIndex++;\n continue;\n }\n // Progress the tree walker until we find our next part's node.\n // Note that multiple parts may share the same node (attribute parts\n // on a single element), so this loop may not run at all.\n while (nodeIndex < part.index) {\n nodeIndex++;\n if (node.nodeName === 'TEMPLATE') {\n stack.push(node);\n walker.currentNode = node.content;\n }\n if ((node = walker.nextNode()) === null) {\n // We've exhausted the content inside a nested template element.\n // Because we still have parts (the outer for-loop), we know:\n // - There is a template in the stack\n // - The walker will find a nextNode outside the template\n walker.currentNode = stack.pop();\n node = walker.nextNode();\n }\n }\n // We've arrived at our part's node.\n if (part.type === 'node') {\n const part = this.processor.handleTextExpression(this.options);\n part.insertAfterNode(node.previousSibling);\n this.__parts.push(part);\n }\n else {\n this.__parts.push(...this.processor.handleAttributeExpressions(node, part.name, part.strings, this.options));\n }\n partIndex++;\n }\n if (isCEPolyfill) {\n document.adoptNode(fragment);\n customElements.upgrade(fragment);\n }\n return fragment;\n }\n}\n//# sourceMappingURL=template-instance.js.map","/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n/**\n * @module lit-html\n */\nimport { reparentNodes } from './dom.js';\nimport { boundAttributeSuffix, lastAttributeNameRegex, marker, nodeMarker } from './template.js';\nconst commentMarker = ` ${marker} `;\n/**\n * The return type of `html`, which holds a Template and the values from\n * interpolated expressions.\n */\nexport class TemplateResult {\n constructor(strings, values, type, processor) {\n this.strings = strings;\n this.values = values;\n this.type = type;\n this.processor = processor;\n }\n /**\n * Returns a string of HTML used to create a `` element.\n */\n getHTML() {\n const l = this.strings.length - 1;\n let html = '';\n let isCommentBinding = false;\n for (let i = 0; i < l; i++) {\n const s = this.strings[i];\n // For each binding we want to determine the kind of marker to insert\n // into the template source before it's parsed by the browser's HTML\n // parser. The marker type is based on whether the expression is in an\n // attribute, text, or comment position.\n // * For node-position bindings we insert a comment with the marker\n // sentinel as its text content, like .\n // * For attribute bindings we insert just the marker sentinel for the\n // first binding, so that we support unquoted attribute bindings.\n // Subsequent bindings can use a comment marker because multi-binding\n // attributes must be quoted.\n // * For comment bindings we insert just the marker sentinel so we don't\n // close the comment.\n //\n // The following code scans the template source, but is *not* an HTML\n // parser. We don't need to track the tree structure of the HTML, only\n // whether a binding is inside a comment, and if not, if it appears to be\n // the first binding in an attribute.\n const commentOpen = s.lastIndexOf('', commentOpen + 1) === -1;\n // Check to see if we have an attribute-like sequence preceding the\n // expression. This can match \"name=value\" like structures in text,\n // comments, and attribute values, so there can be false-positives.\n const attributeMatch = lastAttributeNameRegex.exec(s);\n if (attributeMatch === null) {\n // We're only in this branch if we don't have a attribute-like\n // preceding sequence. For comments, this guards against unusual\n // attribute values like
. Cases like\n // are handled correctly in the attribute branch\n // below.\n html += s + (isCommentBinding ? commentMarker : nodeMarker);\n }\n else {\n // For attributes we use just a marker sentinel, and also append a\n // $lit$ suffix to the name to opt-out of attribute-specific parsing\n // that IE and Edge do for style and certain SVG attributes.\n html += s.substr(0, attributeMatch.index) + attributeMatch[1] +\n attributeMatch[2] + boundAttributeSuffix + attributeMatch[3] +\n marker;\n }\n }\n html += this.strings[l];\n return html;\n }\n getTemplateElement() {\n const template = document.createElement('template');\n template.innerHTML = this.getHTML();\n return template;\n }\n}\n/**\n * A TemplateResult for SVG fragments.\n *\n * This class wraps HTML in an `
\n \n \n \n `;\n }\n}\n","/*\n * Copyright 2019 Brigham Young University\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { LitElement, html, customElement, css, unsafeCSS } from 'lit-element'\nimport style from './byu-footer-action-button.sass'\n\n@customElement('byu-footer-action-button')\nexport class BYUFooterActionButton extends LitElement {\n\n firstUpdated (_changedProperties) {\n this.classList.add('byu-component-rendered')\n }\n\n static get styles () {\n return css`${unsafeCSS(style)}`\n }\n\n render () {\n return html`\n
\n \n
\n `\n }\n}\n","/*\n * Copyright 2019 Brigham Young University\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { LitElement, html, customElement, css, unsafeCSS } from 'lit-element'\nimport style from './byu-footer-column.sass'\n\n@customElement('byu-footer-column')\nexport class BYUFooterColumn extends LitElement {\n\n firstUpdated (_changedProperties) {\n this.classList.add('byu-component-rendered')\n }\n\n static get styles () {\n return css`${unsafeCSS(style)}`\n }\n\n render () {\n return html`\n
\n \n
\n
\n \n
\n `\n }\n}\n","/*\n * Copyright 2019 Brigham Young University\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'use strict'\n\nimport { html, css, customElement, LitElement, unsafeCSS } from 'lit-element'\nimport style from './byu-header.sass'\n\nconst JS_INIT_CLASS = 'js-enabled'\nconst EXPANDED_ATTR = 'aria-expanded'\nconst MENU_OPEN_CLASS = 'menu-open'\nconst SITE_NAV_CLASS = 'byu-site-navigation'\nconst SITE_ACTION_CLASS = 'byu-action-id-search'\n\n@customElement('byu-header')\nexport class BYUHeader extends LitElement {\n\n firstUpdated (_changedProperties) {\n this.classList.add('byu-component-rendered')\n const headerEl = this.shadowRoot.querySelector('.byu-header-el')\n this._enableMobileMenu(headerEl)\n this.classList.add('byu-component-rendered')\n }\n\n _enableMobileMenu (headerEl) {\n headerEl.hasNav = headerEl.querySelector('#byu-nav-slot').assignedNodes().length > 0\n headerEl.hasAction = headerEl.querySelector('#byu-action-slot').assignedNodes().length > 0\n headerEl.hasSearch = headerEl.querySelector('#byu-search-slot').assignedNodes().length > 0\n headerEl.hasUserId = headerEl.querySelector('#byu-user-slot').assignedNodes().length > 0\n\n const showMenuButton = headerEl.hasNav || headerEl.hasAction || headerEl.hasSearch || headerEl.hasUserId\n\n if (!headerEl.hasAction) {\n headerEl.querySelector('.byu-action-btn').style.display = 'none'\n }\n\n if (showMenuButton) {\n headerEl.classList.add(JS_INIT_CLASS)\n this._initMenuButton(headerEl)\n }\n }\n\n _initMenuButton (headerEl) {\n const menuButton = headerEl.getElementsByClassName('byu-menu-button')[0]\n\n menuButton.addEventListener('click', (e) => {\n this._clickMenuButton(e.target, headerEl)\n })\n }\n\n _clickMenuButton (btn, headerEl) {\n const open = btn.getAttribute(EXPANDED_ATTR) !== 'false'\n const opening = false\n\n // Open\n if (!open && !opening) {\n this._openMenu(btn, headerEl)\n }\n\n // Close\n else {\n this._closeMenu(btn, headerEl)\n }\n }\n\n _openMenu (btn, headerEl) {\n // Set the open/closed attribute on the button\n btn.setAttribute(EXPANDED_ATTR, true)\n\n const hasMenuOpenClass = headerEl.getElementsByClassName(MENU_OPEN_CLASS).length > 0\n if (!hasMenuOpenClass) {\n headerEl.classList.add(MENU_OPEN_CLASS)\n }\n }\n\n _closeMenu (btn, headerEl) {\n\n // Set the open/closed attribute on the button\n btn.setAttribute(EXPANDED_ATTR, false)\n\n // Set the open/closed attribute on the header\n headerEl.classList.remove(MENU_OPEN_CLASS)\n }\n\n // Attach styles to component\n static get styles () {\n return css`${unsafeCSS(style)}`\n }\n\n // Render the component\n render () {\n return html`\n\n
\n \n\n `\n }\n}\n","/*\n * Copyright 2019 Brigham Young University\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'use strict'\n\nimport { html, css, customElement, LitElement, unsafeCSS, property } from 'lit-element'\nimport style from './byu-menu.sass'\n\nconst ACTIVE_MENU_ATTR = 'active'\n\n@customElement('byu-menu')\nexport class BYUMenu extends LitElement {\n @property ({ type: String, attribute: 'active-selector' }) activeSelector = ''\n\n firstUpdated (_changedProperties) {\n if (this.activeSelector !== '') {\n this._updateActiveSelector(this)\n }\n this.classList.add('byu-component-rendered')\n }\n\n _updateActiveSelector(menu) {\n const el = menu.querySelector(this.activeSelector)\n if (el)\n el.classList.add(ACTIVE_MENU_ATTR)\n }\n\n static get styles () {\n return css`${unsafeCSS(style)}`\n }\n\n render () {\n return html`\n\n `\n }\n}\n","/*\n * @license\n * Copyright 2017 Brigham Young University\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\"use strict\";\n\nexport default function matchesSelector(el, selector) {\n let proto = Element.prototype;\n let actual =\n proto.matches ||\n proto.matchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector ||\n proto.webkitMatchesSelector ||\n function (s) {\n let doc = this.document || this.ownerDocument;\n return doc.querySelectorAll(s).indexOf(this) !== -1;\n };\n\n return actual.call(el, selector);\n}\n","/*\n * @license\n * Copyright 2017 Brigham Young University\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\"use strict\";\n\nimport matches from './matchesSelector.js';\n\nexport default function querySelectorSlot(slot, selector) {\n let roots = slot.assignedNodes({flatten: true})\n .filter(n => n.nodeType === Node.ELEMENT_NODE);\n\n for (let i = 0, len = roots.length; i < len; i++) {\n let each = roots[i];\n if (matches(each, selector)) {\n return each;\n }\n let child = each.querySelector(selector);\n if (child) {\n return child;\n }\n }\n return null;\n}\n\n","/*\n * Copyright 2019 Brigham Young University\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'use strict'\n\nimport { html, css, customElement, LitElement, unsafeCSS, property } from 'lit-element'\nimport style from './byu-search.sass'\nimport * as util from 'byu-web-component-utils'\n\nconst CLASS_SELECTED_INPUT = '__byu-search-selected-input'\n\nconst ACTION_SUBMIT_FORM = 'submit-form'\nconst ACTION_CLICK = 'click'\nconst ACTION_NAVIGATE = 'navigate'\n\nconst DEFAULT_ACTION_TARGET_SUBMIT_FORM = 'form'\nconst DEFAULT_ACTION_TARGET_CLICK = 'button, input[type=\"submit\"], input[type=\"button\"]'\nconst DEFAULT_SEARCH_INPUT_SELECTOR = 'input[type=\"search\"], input[type=\"text\"]'\nconst DEFAULT_SEARCH_FORM_CLASS = 'default-byu-search-form'\nconst DEFAULT_PLACEHOLDER = 'Search'\nconst DEFAULT_ACTION_TARGET = {\n [ACTION_SUBMIT_FORM]: DEFAULT_ACTION_TARGET_SUBMIT_FORM,\n [ACTION_CLICK]: DEFAULT_ACTION_TARGET_CLICK\n}\n\nconst EVENT_TYPE = 'byu-search'\n\n@customElement('byu-search')\nexport class BYUSearch extends LitElement {\n @property({ type: String }) placeholder = 'Search'\n @property({ type: String, attribute: 'search-input-selector' }) searchInputSelector = DEFAULT_SEARCH_INPUT_SELECTOR\n @property({ type: String }) action = null\n @property({ type: String, attribute: 'action-target' }) actionTarget = null\n @property({ type: String }) onbyusearch = null\n\n get _searchSlot () {\n return this.shadowRoot.querySelector('#search')\n }\n\n firstUpdated (_changedProperties) {\n const searchElSlot = this.shadowRoot.querySelector('#search')\n const assignedNodesLength = searchElSlot.assignedNodes().length\n\n if (assignedNodesLength > 0) {\n let isDefaultForm = true\n\n for (let i = 0; i < assignedNodesLength; i++) {\n const type = searchElSlot.assignedNodes()[i].nodeType\n if (!(type === 3 || type === 8) && !searchElSlot.assignedNodes()[i].classList.contains(DEFAULT_SEARCH_FORM_CLASS)) {\n isDefaultForm = false\n }\n }\n\n if (!isDefaultForm) {\n this.shadowRoot.querySelector('#byu-site-search-label').remove()\n this.shadowRoot.querySelector('#byu-site-search').remove()\n }\n }\n\n this._input = this._lookupAndConfigureInputElement(this, this.searchInputSelector)\n this._hideExtraElements() // Hide extra inputs and buttons\n if (this.actionTarget === null) {\n this.actionTarget = this._defaultActionTarget(this.action)\n }\n this._setupSearchListeners(this)\n this.classList.add('byu-component-rendered')\n }\n\n search () {\n let el = this._input\n if (!el) {\n throw new Error(`Unable to perform search; no search element matching the selector '${this.searchInputSelector}' can be found!`)\n }\n let value = el.value\n if (!value) return\n\n let event = new CustomEvent(EVENT_TYPE, {\n detail: {\n search: value\n },\n bubbles: true,\n composed: true\n })\n\n let cancelled = !this.dispatchEvent(event)\n if (cancelled) return\n\n if (this.action) {\n this._runPredefinedAction(this, value)\n }\n }\n\n _setupSearchListeners (search) {\n let handler = search.__onbyusearchHandler = function (event) {\n let name = search.onbyusearch\n if (!name) return\n let handler = window[name]\n if (!handler) {\n throw new Error(`Unable to find a global function named '${name}'`)\n }\n handler.call(search, event)\n }\n\n search.addEventListener(EVENT_TYPE, handler, false)\n }\n\n _runPredefinedAction (search, value) {\n let action = search.action\n\n switch (action) {\n case ACTION_SUBMIT_FORM:\n this._runSubmitFormAction(search, value)\n break\n case ACTION_CLICK:\n this._runClickAction(search, value)\n break\n case ACTION_NAVIGATE:\n this._runNavigateAction(search, value)\n break\n default:\n throw new Error(`Invalid value for action: '${action}'`)\n }\n }\n\n _runSubmitFormAction (search, value) {\n let target = search.actionTarget\n\n let form = util.querySelectorSlot(search._searchSlot, target)\n\n if (!form) {\n throw new Error(`Unable to find target for 'submit-form' action using selector '${target}'`)\n }\n\n if (!(form instanceof HTMLFormElement)) {\n throw new Error(`Element found by selector '${target}' must be a