dom-scripts.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. /* expandable sections */
  2. (function () {
  3. function toggle (button, target) {
  4. var expanded = button.getAttribute('aria-expanded') === 'true'
  5. button.setAttribute('aria-expanded', !expanded)
  6. target.hidden = !target.hidden
  7. }
  8. var expanders = document.querySelectorAll('[data-expands]')
  9. Array.prototype.forEach.call(expanders, function (expander) {
  10. var target = document.getElementById(expander.getAttribute('data-expands'))
  11. expander.addEventListener('click', function () {
  12. toggle(expander, target)
  13. })
  14. })
  15. }());
  16. /* menu button */
  17. (function () {
  18. var button = document.getElementById('menu-button')
  19. if (button) {
  20. var menu = document.getElementById('patterns-list')
  21. button.addEventListener('click', function() {
  22. var expanded = this.getAttribute('aria-expanded') === 'true'
  23. this.setAttribute('aria-expanded', !expanded)
  24. })
  25. }
  26. }());
  27. /* persist navigation scroll point */
  28. (function () {
  29. var patternsNav = document.getElementById('patterns-nav')
  30. if (patternsNav) {
  31. var scrollPoint = patternsNav.scrollTop
  32. window.onunload = function () {
  33. localStorage.setItem('scrollPoint', scrollPoint)
  34. }
  35. }
  36. window.addEventListener('DOMContentLoaded', function () {
  37. if (window.location.href.indexOf('patterns/') !== -1) {
  38. scrollPoint = parseInt(localStorage.getItem('scrollPoint'))
  39. } else {
  40. scrollPoint = 0
  41. }
  42. })
  43. }());
  44. /* Add "link here" links to <h2> headings */
  45. (function () {
  46. var headings = document.querySelectorAll('main > h2')
  47. Array.prototype.forEach.call(headings, function (heading) {
  48. var id = heading.getAttribute('id')
  49. if (id) {
  50. var newHeading = heading.cloneNode(true)
  51. var container = document.createElement('div')
  52. container.setAttribute('class', 'h2-container')
  53. container.appendChild(newHeading)
  54. heading.parentNode.insertBefore(container, heading)
  55. var link = document.createElement('a')
  56. link.setAttribute('href', '#' + id)
  57. link.setAttribute('aria-label', 'link for this section')
  58. link.innerHTML = '<svg aria-hidden="true" viewBox="0 0 50 50"><use xlink:href="#link"></use></svg>'
  59. container.appendChild(link)
  60. heading.parentNode.removeChild(heading);
  61. }
  62. })
  63. }());
  64. // SVG scaling fix for IE10-11
  65. (function () {
  66. if (window.matchMedia('(-ms-high-contrast: none), (-ms-high-contrast: active)').matches) {
  67. // Get all the SVGs on the page except the symbol defs
  68. var svgs = document.querySelectorAll('a svg, button svg, h1 svg')
  69. // ... iterate over SVGs
  70. Array.prototype.forEach.call(svgs, function(svg) {
  71. // Set preserveAspectRatio to 'XMidYMin slice'
  72. svg.setAttribute('preserveAspectRatio', 'xMidYMin slice')
  73. // Turn the viewBox values into an array
  74. var viewBox = svg.getAttribute('viewBox').split(' ')
  75. // Calculate padding value needed (width/height x 100)
  76. var padding = (viewBox[2] / viewBox[3]) * 100
  77. // Set inline styles
  78. svg.setAttribute('style', 'width: 100%; padding-bottom: ' + padding + '%; height: 1px; overflow: visible')
  79. // Create span wrapper
  80. var span = document.createElement('span')
  81. span.setAttribute('class', 'svg-outer')
  82. span.style.width = '0.75em'
  83. svg.parentNode.insertBefore(span, svg)
  84. span.appendChild(svg)
  85. })
  86. }
  87. }());