@nationalarchives/frontend 0.1.17-prerelease → 0.1.19-prerelease

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 (170) hide show
  1. package/nationalarchives/all.css +12 -2
  2. package/nationalarchives/all.css.map +1 -1
  3. package/nationalarchives/all.js +1 -1
  4. package/nationalarchives/all.js.map +1 -1
  5. package/nationalarchives/all.mjs +26 -2
  6. package/nationalarchives/all.scss +20 -4
  7. package/nationalarchives/assets/fonts/OpenSans-Bold.ttf +0 -0
  8. package/nationalarchives/assets/fonts/OpenSans-Medium.ttf +0 -0
  9. package/nationalarchives/assets/fonts/RobotoMono-Regular.ttf +0 -0
  10. package/nationalarchives/components/_index.scss +18 -16
  11. package/nationalarchives/components/breadcrumbs/_index.scss +1 -109
  12. package/nationalarchives/components/breadcrumbs/breadcrumbs.css +1 -0
  13. package/nationalarchives/components/breadcrumbs/breadcrumbs.css.map +1 -0
  14. package/nationalarchives/components/breadcrumbs/breadcrumbs.js +1 -1
  15. package/nationalarchives/components/breadcrumbs/breadcrumbs.js.map +1 -1
  16. package/nationalarchives/components/breadcrumbs/breadcrumbs.scss +111 -0
  17. package/nationalarchives/components/button/_button-group.scss +3 -5
  18. package/nationalarchives/components/button/_index.scss +1 -73
  19. package/nationalarchives/components/button/button.css +13 -0
  20. package/nationalarchives/components/button/button.css.map +1 -0
  21. package/nationalarchives/components/button/button.scss +103 -0
  22. package/nationalarchives/components/button/button.stories.js +61 -0
  23. package/nationalarchives/components/button/macro-options.json +19 -1
  24. package/nationalarchives/components/button/template.njk +8 -2
  25. package/nationalarchives/components/card/_index.scss +1 -183
  26. package/nationalarchives/components/card/card.css +13 -0
  27. package/nationalarchives/components/card/card.css.map +1 -0
  28. package/nationalarchives/components/card/card.scss +171 -0
  29. package/nationalarchives/components/card/card.stories.js +185 -95
  30. package/nationalarchives/components/card/fixtures.json +57 -28
  31. package/nationalarchives/components/card/macro-options.json +77 -48
  32. package/nationalarchives/components/card/template.njk +47 -37
  33. package/nationalarchives/components/cookie-banner/_index.scss +1 -0
  34. package/nationalarchives/components/cookie-banner/cookie-banner.css +13 -0
  35. package/nationalarchives/components/cookie-banner/cookie-banner.css.map +1 -0
  36. package/nationalarchives/components/cookie-banner/cookie-banner.js +2 -0
  37. package/nationalarchives/components/cookie-banner/cookie-banner.js.map +1 -0
  38. package/nationalarchives/components/cookie-banner/cookie-banner.mjs +83 -0
  39. package/nationalarchives/components/cookie-banner/cookie-banner.scss +32 -0
  40. package/nationalarchives/components/cookie-banner/cookie-banner.stories.js +164 -0
  41. package/nationalarchives/components/cookie-banner/fixtures.json +4 -0
  42. package/nationalarchives/components/cookie-banner/macro-options.json +38 -0
  43. package/nationalarchives/components/cookie-banner/macro.njk +3 -0
  44. package/nationalarchives/components/cookie-banner/template.njk +61 -0
  45. package/nationalarchives/components/filters/_index.scss +1 -54
  46. package/nationalarchives/components/filters/filters.css +1 -0
  47. package/nationalarchives/components/filters/filters.css.map +1 -0
  48. package/nationalarchives/components/filters/filters.scss +53 -0
  49. package/nationalarchives/components/footer/_index.scss +1 -270
  50. package/nationalarchives/components/footer/footer.css +13 -0
  51. package/nationalarchives/components/footer/footer.css.map +1 -0
  52. package/nationalarchives/components/footer/footer.scss +265 -0
  53. package/nationalarchives/components/footer/footer.stories.js +6 -6
  54. package/nationalarchives/components/footer/macro-options.json +7 -1
  55. package/nationalarchives/components/footer/template.njk +10 -6
  56. package/nationalarchives/components/gallery/_index.scss +1 -0
  57. package/nationalarchives/components/gallery/fixtures.json +4 -0
  58. package/nationalarchives/components/gallery/gallery.css +13 -0
  59. package/nationalarchives/components/gallery/gallery.css.map +1 -0
  60. package/nationalarchives/components/gallery/gallery.js +2 -0
  61. package/nationalarchives/components/gallery/gallery.js.map +1 -0
  62. package/nationalarchives/components/gallery/gallery.mjs +80 -0
  63. package/nationalarchives/components/gallery/gallery.scss +129 -0
  64. package/nationalarchives/components/gallery/gallery.stories.js +76 -0
  65. package/nationalarchives/components/gallery/macro-options.json +104 -0
  66. package/nationalarchives/components/gallery/macro.njk +3 -0
  67. package/nationalarchives/components/gallery/template.njk +45 -0
  68. package/nationalarchives/components/grid/_index.scss +1 -79
  69. package/nationalarchives/components/grid/grid.css +1 -0
  70. package/nationalarchives/components/grid/grid.css.map +1 -0
  71. package/nationalarchives/components/grid/grid.scss +81 -0
  72. package/nationalarchives/components/header/_index.scss +1 -586
  73. package/nationalarchives/components/header/header.css +1 -0
  74. package/nationalarchives/components/header/header.css.map +1 -0
  75. package/nationalarchives/components/header/header.js +1 -1
  76. package/nationalarchives/components/header/header.js.map +1 -1
  77. package/nationalarchives/components/header/header.scss +594 -0
  78. package/nationalarchives/components/header/header.stories.js +5 -5
  79. package/nationalarchives/components/hero/_index.scss +1 -167
  80. package/nationalarchives/components/hero/hero.css +1 -0
  81. package/nationalarchives/components/hero/hero.css.map +1 -0
  82. package/nationalarchives/components/hero/hero.scss +169 -0
  83. package/nationalarchives/components/index-grid/_index.scss +1 -82
  84. package/nationalarchives/components/index-grid/index-grid.css +1 -0
  85. package/nationalarchives/components/index-grid/index-grid.css.map +1 -0
  86. package/nationalarchives/components/index-grid/index-grid.scss +84 -0
  87. package/nationalarchives/components/message/_index.scss +1 -35
  88. package/nationalarchives/components/message/message.css +1 -0
  89. package/nationalarchives/components/message/message.css.map +1 -0
  90. package/nationalarchives/components/message/message.scss +36 -0
  91. package/nationalarchives/components/phase-banner/_index.scss +1 -60
  92. package/nationalarchives/components/phase-banner/fixtures.json +8 -8
  93. package/nationalarchives/components/phase-banner/phase-banner.css +1 -0
  94. package/nationalarchives/components/phase-banner/phase-banner.css.map +1 -0
  95. package/nationalarchives/components/phase-banner/phase-banner.scss +31 -0
  96. package/nationalarchives/components/phase-banner/template.njk +2 -2
  97. package/nationalarchives/components/picture/_index.scss +1 -62
  98. package/nationalarchives/components/picture/picture.css +13 -0
  99. package/nationalarchives/components/picture/picture.css.map +1 -0
  100. package/nationalarchives/components/picture/picture.js +1 -1
  101. package/nationalarchives/components/picture/picture.js.map +1 -1
  102. package/nationalarchives/components/picture/picture.mjs +2 -1
  103. package/nationalarchives/components/picture/picture.scss +65 -0
  104. package/nationalarchives/components/profile/_index.scss +1 -2
  105. package/nationalarchives/components/profile/profile.css +1 -0
  106. package/nationalarchives/components/profile/profile.css.map +1 -0
  107. package/nationalarchives/components/profile/profile.scss +5 -0
  108. package/nationalarchives/components/sensitive-image/_index.scss +1 -77
  109. package/nationalarchives/components/sensitive-image/sensitive-image.css +1 -0
  110. package/nationalarchives/components/sensitive-image/sensitive-image.css.map +1 -0
  111. package/nationalarchives/components/sensitive-image/sensitive-image.js +1 -1
  112. package/nationalarchives/components/sensitive-image/sensitive-image.js.map +1 -1
  113. package/nationalarchives/components/sensitive-image/sensitive-image.scss +78 -0
  114. package/nationalarchives/components/skip-link/_index.scss +1 -63
  115. package/nationalarchives/components/skip-link/skip-link.css +1 -0
  116. package/nationalarchives/components/skip-link/skip-link.css.map +1 -0
  117. package/nationalarchives/components/skip-link/skip-link.scss +61 -0
  118. package/nationalarchives/components/tabs/_index.scss +1 -144
  119. package/nationalarchives/components/tabs/tabs.css +1 -0
  120. package/nationalarchives/components/tabs/tabs.css.map +1 -0
  121. package/nationalarchives/components/tabs/tabs.js +1 -1
  122. package/nationalarchives/components/tabs/tabs.js.map +1 -1
  123. package/nationalarchives/components/tabs/tabs.mjs +2 -0
  124. package/nationalarchives/components/tabs/tabs.scss +143 -0
  125. package/nationalarchives/components/tabs/tabs.stories.js +0 -1
  126. package/nationalarchives/lib/_font-awesome.scss +5 -0
  127. package/nationalarchives/lib/_index.scss +1 -0
  128. package/nationalarchives/lib/cookies.mjs +110 -0
  129. package/nationalarchives/lib/font-awesome/brands.css +5 -0
  130. package/nationalarchives/lib/font-awesome/brands.css.map +1 -0
  131. package/nationalarchives/lib/font-awesome/fontawesome.css +5 -0
  132. package/nationalarchives/lib/font-awesome/fontawesome.css.map +1 -0
  133. package/nationalarchives/lib/font-awesome/regular.css +5 -0
  134. package/nationalarchives/lib/font-awesome/regular.css.map +1 -0
  135. package/nationalarchives/lib/font-awesome/solid.css +5 -0
  136. package/nationalarchives/lib/font-awesome/solid.css.map +1 -0
  137. package/nationalarchives/lib/font-awesome/v4-shims.css +5 -0
  138. package/nationalarchives/lib/font-awesome/v4-shims.css.map +1 -0
  139. package/nationalarchives/stories/development/about.mdx +60 -0
  140. package/nationalarchives/stories/development/contributing.mdx +8 -5
  141. package/nationalarchives/stories/development/relationships.mdx +57 -0
  142. package/nationalarchives/stories/development/using.mdx +75 -0
  143. package/nationalarchives/stories/utilities/colour-schemes/colour-schemes.stories.js +176 -50
  144. package/nationalarchives/stories/utilities/typography/heading-groups.stories.js +3 -3
  145. package/nationalarchives/stories/utilities/typography/typography.stories.js +1 -1
  146. package/nationalarchives/templates/layouts/_generic.njk +7 -2
  147. package/nationalarchives/tools/_colour.scss +55 -17
  148. package/nationalarchives/tools/_index.scss +5 -4
  149. package/nationalarchives/tools/_spacing.scss +22 -0
  150. package/nationalarchives/tools/_typography.scss +0 -4
  151. package/nationalarchives/utilities/_a11y.scss +24 -0
  152. package/nationalarchives/utilities/_global.scss +3 -29
  153. package/nationalarchives/utilities/_index.scss +5 -5
  154. package/nationalarchives/utilities/_overrides.scss +5 -15
  155. package/nationalarchives/utilities/_typography.scss +68 -57
  156. package/nationalarchives/variables/_colour.scss +17 -9
  157. package/nationalarchives/variables/_grid.scss +1 -1
  158. package/nationalarchives/variables/_spacing.scss +12 -12
  159. package/nationalarchives/variables/_typography.scss +7 -7
  160. package/package.json +5 -2
  161. package/nationalarchives/assets/images/footer/facebook.svg +0 -11
  162. package/nationalarchives/assets/images/footer/flickr.svg +0 -11
  163. package/nationalarchives/assets/images/footer/instagram.svg +0 -17
  164. package/nationalarchives/assets/images/footer/rss.svg +0 -13
  165. package/nationalarchives/assets/images/footer/twitter.svg +0 -14
  166. package/nationalarchives/assets/images/footer/youtube.svg +0 -12
  167. package/nationalarchives/stories/development/dependencies.mdx +0 -11
  168. package/nationalarchives/stories/development/relationships.md +0 -91
  169. package/nationalarchives/stories/development/technologies.mdx +0 -65
  170. package/nationalarchives/utilities/_font-awesome.scss +0 -5
@@ -0,0 +1,2 @@
1
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("TNAFrontend",[],t):"object"==typeof exports?exports.TNAFrontend=t():e.TNAFrontend=t()}(self,(()=>(()=>{"use strict";var e={774:(e,t,o)=>{function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}function i(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,n)}return o}function r(e){for(var t=1;t<arguments.length;t++){var o=null!=arguments[t]?arguments[t]:{};t%2?i(Object(o),!0).forEach((function(t){c(e,t,o[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(o)):i(Object(o)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(o,t))}))}return e}function c(e,t,o){return(t=a(t))in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function s(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,a(n.key),n)}}function a(e){var t=function(e,t){if("object"!==n(e)||null===e)return e;var o=e[Symbol.toPrimitive];if(void 0!==o){var i=o.call(e,"string");if("object"!==n(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===n(t)?t:String(t)}function u(e,t){l(e,t),t.add(e)}function l(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")}function f(e,t,o){return function(e,t,o){if(t.set)t.set.call(e,o);else{if(!t.writable)throw new TypeError("attempted to set read only private field");t.value=o}}(e,y(e,t,"set"),o),o}function p(e,t,o){if(!t.has(e))throw new TypeError("attempted to get private field on non-instance");return o}function h(e,t){return function(e,t){return t.get?t.get.call(e):t.value}(e,y(e,t,"get"))}function y(e,t,o){if(!t.has(e))throw new TypeError("attempted to "+o+" private field on non-instance");return t.get(e)}o.d(t,{Z:()=>m});var d=new WeakMap,v=new WeakSet,b=new WeakSet,m=function(){function e(){var t,o,n=this,i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["analytics","settings"],r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"cookies_policy",c=arguments.length>2&&void 0!==arguments[2]&&arguments[2];!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),u(this,b),u(this,v),o={writable:!0,value:{}},l(this,t=d),t.set(this,o),this.cookiesPolicyKey=r,this.crossDomain=c,i.forEach((function(e){h(n,d)[e]=!1})),p(this,v,g).call(this)}var t,o;return t=e,o=[{key:"data",get:function(){return p(this,b,k).call(this,document.cookie)}},{key:"all",get:function(){return this.data}},{key:"allPolicies",get:function(){return JSON.parse(this.get(this.cookiesPolicyKey))}},{key:"exists",value:function(e){return Object.prototype.hasOwnProperty.call(this.data,e)}},{key:"hasValue",value:function(e,t){return this.get(e)===t}},{key:"get",value:function(e){return decodeURIComponent(this.data[e])}},{key:"delete",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"/";this.set(e,"",0,t)}},{key:"acceptPolicy",value:function(e){this.setPolicy(e,!0)}},{key:"rejectPolicy",value:function(e){this.setPolicy(e,!1)}},{key:"setPolicy",value:function(e,t){f(this,d,r(r({},h(this,d)),{},c({},e,t))),this.set(this.cookiesPolicyKey,JSON.stringify(h(this,d)))}},{key:"acceptAllPolicies",value:function(){var e=this;Object.keys(h(this,d)).filter((function(t){return!1===h(e,d)[t]})).forEach((function(t){return e.acceptPolicy(t)}))}},{key:"rejectAllPolicies",value:function(){var e=this;Object.keys(h(this,d)).filter((function(t){return!0===h(e,d)[t]})).forEach((function(t){return e.rejectPolicy(t)}))}},{key:"isPolicyAccepted",value:function(e){return p(this,v,g).call(this),Object.prototype.hasOwnProperty.call(h(this,d),e)?!0===h(this,d)[e]:null}},{key:"set",value:function(e,t){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:31536e3,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"/";document.cookie="".concat(encodeURIComponent(e),"=").concat(encodeURIComponent(t),"; SameSite=").concat(this.crossDomain?"None":"Lax","; path=").concat(n,"; max-age=").concat(o,"; Secure"),p(this,v,g).call(this)}},{key:"policy",value:function(e){return h(this,d)[e]}}],o&&s(t.prototype,o),Object.defineProperty(t,"prototype",{writable:!1}),e}();function g(){this.exists(this.cookiesPolicyKey)&&f(this,d,r(r({},h(this,d)),this.allPolicies))}function k(e){var t={};return e.split(";").forEach((function(e){var o=e.trim().split("=");t[o[0]]=o[1]})),t}}},t={};function o(n){var i=t[n];if(void 0!==i)return i.exports;var r=t[n]={exports:{}};return e[n](r,r.exports,o),r.exports}o.d=(e,t)=>{for(var n in t)o.o(t,n)&&!o.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var n={};return(()=>{o.r(n),o.d(n,{CookieBanner:()=>r});var e=o(774);function t(e){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t(e)}function i(e,o){for(var n=0;n<o.length;n++){var i=o[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,(void 0,r=function(e,o){if("object"!==t(e)||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var i=n.call(e,"string");if("object"!==t(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(i.key),"symbol"===t(r)?r:String(r)),i)}var r}var r=function(){function t(e){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),this.$module=e,this.$acceptButton=e&&e.querySelector('[value="accept"]'),this.$rejectButton=e&&e.querySelector('[value="reject"]'),this.$prompt=e&&e.querySelector(".tna-cookie-banner__message--prompt"),this.$acceptedMessage=e&&e.querySelector(".tna-cookie-banner__message--accepted"),this.$rejectedMessage=e&&e.querySelector(".tna-cookie-banner__message--rejected"),this.$closeButtons=e&&e.querySelectorAll('[value="close"]')}var o,n;return o=t,(n=[{key:"init",value:function(){var t=this;if(this.$module&&this.$acceptButton&&this.$rejectButton&&this.$prompt&&this.$acceptedMessage&&this.$rejectedMessage&&this.$closeButtons){var o=this.$module.getAttribute("data-policies");o&&(this.cookies=new e.Z(o.split(",").map((function(e){return e.trim()}))),this.loadScriptsOnAccept=this.$module.getAttribute("data-acceptscripts"),this.hideCookieBannerKey=this.$module.getAttribute("data-hidekey"),this.cookies.exists(this.hideCookieBannerKey)||(this.$module.removeAttribute("hidden"),this.$acceptButton.addEventListener("click",(function(){return t.accept()})),this.$rejectButton.addEventListener("click",(function(){return t.reject()})),this.$closeButtons.forEach((function(e){e.addEventListener("click",(function(){return t.close()}))}))))}}},{key:"accept",value:function(){this.$prompt.setAttribute("hidden",!0),this.complete(),this.$acceptedMessage.removeAttribute("hidden"),this.cookies.acceptAllPolicies(),this.loadScriptsOnAccept&&this.loadScriptsOnAccept.split(",").forEach((function(e){var t=document.createElement("script");t.src=e,document.head.appendChild(t)}))}},{key:"reject",value:function(){this.$prompt.setAttribute("hidden",!0),this.complete(),this.$rejectedMessage.removeAttribute("hidden"),this.cookies.rejectAllPolicies()}},{key:"complete",value:function(){this.cookies.set(this.hideCookieBannerKey,!0)}},{key:"close",value:function(){this.$module.setAttribute("hidden",!0)}}])&&i(o.prototype,n),Object.defineProperty(o,"prototype",{writable:!1}),t}()})(),n})()));
2
+ //# sourceMappingURL=cookie-banner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components/cookie-banner/cookie-banner.js","mappings":"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","sources":["webpack://TNAFrontend/webpack/universalModuleDefinition","webpack://TNAFrontend/./src/nationalarchives/lib/cookies.mjs","webpack://TNAFrontend/webpack/bootstrap","webpack://TNAFrontend/webpack/runtime/define property getters","webpack://TNAFrontend/webpack/runtime/hasOwnProperty shorthand","webpack://TNAFrontend/webpack/runtime/make namespace object","webpack://TNAFrontend/./src/nationalarchives/components/cookie-banner/cookie-banner.mjs"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"TNAFrontend\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"TNAFrontend\"] = factory();\n\telse\n\t\troot[\"TNAFrontend\"] = factory();\n})(self, () => {\nreturn ","export default class Cookies {\n #policies = {};\n\n constructor(\n policies = [\"analytics\", \"settings\"],\n cookiesPolicyKey = \"cookies_policy\",\n crossDomain = false,\n ) {\n this.cookiesPolicyKey = cookiesPolicyKey;\n this.crossDomain = crossDomain;\n policies.forEach((policy) => {\n this.#policies[policy] = false;\n });\n this.#getPolicies();\n }\n\n #getPolicies() {\n if (this.exists(this.cookiesPolicyKey)) {\n this.#policies = {\n ...this.#policies,\n ...this.allPolicies,\n };\n }\n }\n\n get data() {\n return this.#deserialise(document.cookie);\n }\n\n #deserialise(cookieString) {\n const deserialised = {};\n cookieString.split(\";\").forEach((cookie) => {\n const parts = cookie.trim().split(\"=\");\n deserialised[parts[0]] = parts[1];\n });\n return deserialised;\n }\n\n get all() {\n return this.data;\n }\n\n get allPolicies() {\n return JSON.parse(this.get(this.cookiesPolicyKey));\n }\n\n exists(key) {\n return Object.prototype.hasOwnProperty.call(this.data, key);\n }\n\n hasValue(key, value) {\n return this.get(key) === value;\n }\n\n get(key) {\n return decodeURIComponent(this.data[key]);\n }\n\n delete(key, path = \"/\") {\n this.set(key, \"\", 0, path);\n }\n\n acceptPolicy(policy) {\n this.setPolicy(policy, true);\n }\n\n rejectPolicy(policy) {\n this.setPolicy(policy, false);\n }\n\n setPolicy(policy, accepted) {\n this.#policies = {\n ...this.#policies,\n [policy]: accepted,\n };\n this.set(this.cookiesPolicyKey, JSON.stringify(this.#policies));\n }\n\n acceptAllPolicies() {\n Object.keys(this.#policies)\n .filter((policy) => this.#policies[policy] === false)\n .forEach((policy) => this.acceptPolicy(policy));\n }\n\n rejectAllPolicies() {\n Object.keys(this.#policies)\n .filter((policy) => this.#policies[policy] === true)\n .forEach((policy) => this.rejectPolicy(policy));\n }\n\n isPolicyAccepted(policy) {\n this.#getPolicies();\n return Object.prototype.hasOwnProperty.call(this.#policies, policy)\n ? this.#policies[policy] === true\n : null;\n }\n\n set(key, value, maxAge = 60 * 60 * 24 * 365, path = \"/\") {\n document.cookie = `${encodeURIComponent(key)}=${encodeURIComponent(\n value,\n )}; SameSite=${\n this.crossDomain ? \"None\" : \"Lax\"\n }; path=${path}; max-age=${maxAge}; Secure`;\n this.#getPolicies();\n }\n\n policy(policy) {\n return this.#policies[policy];\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import Cookies from \"../../lib/cookies.mjs\";\n\nexport class CookieBanner {\n constructor($module) {\n this.$module = $module;\n this.$acceptButton = $module && $module.querySelector('[value=\"accept\"]');\n this.$rejectButton = $module && $module.querySelector('[value=\"reject\"]');\n this.$prompt =\n $module && $module.querySelector(\".tna-cookie-banner__message--prompt\");\n this.$acceptedMessage =\n $module && $module.querySelector(\".tna-cookie-banner__message--accepted\");\n this.$rejectedMessage =\n $module && $module.querySelector(\".tna-cookie-banner__message--rejected\");\n this.$closeButtons = $module && $module.querySelectorAll('[value=\"close\"]');\n }\n\n init() {\n if (\n !this.$module ||\n !this.$acceptButton ||\n !this.$rejectButton ||\n !this.$prompt ||\n !this.$acceptedMessage ||\n !this.$rejectedMessage ||\n !this.$closeButtons\n ) {\n return;\n }\n\n const policies = this.$module.getAttribute(\"data-policies\");\n if (!policies) {\n return;\n }\n this.cookies = new Cookies(\n policies.split(\",\").map((policy) => policy.trim()),\n );\n\n this.loadScriptsOnAccept = this.$module.getAttribute(\"data-acceptscripts\");\n\n this.hideCookieBannerKey = this.$module.getAttribute(\"data-hidekey\");\n const cookiePreferencesSet = this.cookies.exists(this.hideCookieBannerKey);\n\n if (!cookiePreferencesSet) {\n this.$module.removeAttribute(\"hidden\");\n\n this.$acceptButton.addEventListener(\"click\", () => this.accept());\n this.$rejectButton.addEventListener(\"click\", () => this.reject());\n\n this.$closeButtons.forEach(($closeButton) => {\n $closeButton.addEventListener(\"click\", () => this.close());\n });\n }\n }\n\n accept() {\n this.$prompt.setAttribute(\"hidden\", true);\n this.complete();\n this.$acceptedMessage.removeAttribute(\"hidden\");\n this.cookies.acceptAllPolicies();\n if (this.loadScriptsOnAccept) {\n this.loadScriptsOnAccept.split(\",\").forEach((script) => {\n const $script = document.createElement(\"script\");\n $script.src = script;\n document.head.appendChild($script);\n });\n }\n }\n\n reject() {\n this.$prompt.setAttribute(\"hidden\", true);\n this.complete();\n this.$rejectedMessage.removeAttribute(\"hidden\");\n this.cookies.rejectAllPolicies();\n }\n\n complete() {\n this.cookies.set(this.hideCookieBannerKey, true);\n }\n\n close() {\n this.$module.setAttribute(\"hidden\", true);\n }\n}\n"],"names":["root","factory","exports","module","define","amd","self","Cookies","_this","policies","arguments","length","undefined","cookiesPolicyKey","crossDomain","_classCallCheck","_classPrivateMethodInitSpec","_deserialise","_getPolicies","writable","value","_policies","this","forEach","policy","_classPrivateFieldGet","_classPrivateMethodGet","_getPolicies2","call","key","get","_deserialise2","document","cookie","data","JSON","parse","Object","prototype","hasOwnProperty","decodeURIComponent","path","set","setPolicy","accepted","_classPrivateFieldSet","_objectSpread","_defineProperty","stringify","_this2","keys","filter","acceptPolicy","_this3","rejectPolicy","maxAge","concat","encodeURIComponent","exists","allPolicies","cookieString","deserialised","split","parts","trim","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","d","definition","o","defineProperty","enumerable","obj","prop","r","Symbol","toStringTag","CookieBanner","$module","$acceptButton","querySelector","$rejectButton","$prompt","$acceptedMessage","$rejectedMessage","$closeButtons","querySelectorAll","getAttribute","cookies","map","loadScriptsOnAccept","hideCookieBannerKey","removeAttribute","addEventListener","accept","reject","$closeButton","close","setAttribute","complete","acceptAllPolicies","script","$script","createElement","src","head","appendChild","rejectAllPolicies"],"sourceRoot":""}
@@ -0,0 +1,83 @@
1
+ import Cookies from "../../lib/cookies.mjs";
2
+
3
+ export class CookieBanner {
4
+ constructor($module) {
5
+ this.$module = $module;
6
+ this.$acceptButton = $module && $module.querySelector('[value="accept"]');
7
+ this.$rejectButton = $module && $module.querySelector('[value="reject"]');
8
+ this.$prompt =
9
+ $module && $module.querySelector(".tna-cookie-banner__message--prompt");
10
+ this.$acceptedMessage =
11
+ $module && $module.querySelector(".tna-cookie-banner__message--accepted");
12
+ this.$rejectedMessage =
13
+ $module && $module.querySelector(".tna-cookie-banner__message--rejected");
14
+ this.$closeButtons = $module && $module.querySelectorAll('[value="close"]');
15
+ }
16
+
17
+ init() {
18
+ if (
19
+ !this.$module ||
20
+ !this.$acceptButton ||
21
+ !this.$rejectButton ||
22
+ !this.$prompt ||
23
+ !this.$acceptedMessage ||
24
+ !this.$rejectedMessage ||
25
+ !this.$closeButtons
26
+ ) {
27
+ return;
28
+ }
29
+
30
+ const policies = this.$module.getAttribute("data-policies");
31
+ if (!policies) {
32
+ return;
33
+ }
34
+ this.cookies = new Cookies(
35
+ policies.split(",").map((policy) => policy.trim()),
36
+ );
37
+
38
+ this.loadScriptsOnAccept = this.$module.getAttribute("data-acceptscripts");
39
+
40
+ this.hideCookieBannerKey = this.$module.getAttribute("data-hidekey");
41
+ const cookiePreferencesSet = this.cookies.exists(this.hideCookieBannerKey);
42
+
43
+ if (!cookiePreferencesSet) {
44
+ this.$module.removeAttribute("hidden");
45
+
46
+ this.$acceptButton.addEventListener("click", () => this.accept());
47
+ this.$rejectButton.addEventListener("click", () => this.reject());
48
+
49
+ this.$closeButtons.forEach(($closeButton) => {
50
+ $closeButton.addEventListener("click", () => this.close());
51
+ });
52
+ }
53
+ }
54
+
55
+ accept() {
56
+ this.$prompt.setAttribute("hidden", true);
57
+ this.complete();
58
+ this.$acceptedMessage.removeAttribute("hidden");
59
+ this.cookies.acceptAllPolicies();
60
+ if (this.loadScriptsOnAccept) {
61
+ this.loadScriptsOnAccept.split(",").forEach((script) => {
62
+ const $script = document.createElement("script");
63
+ $script.src = script;
64
+ document.head.appendChild($script);
65
+ });
66
+ }
67
+ }
68
+
69
+ reject() {
70
+ this.$prompt.setAttribute("hidden", true);
71
+ this.complete();
72
+ this.$rejectedMessage.removeAttribute("hidden");
73
+ this.cookies.rejectAllPolicies();
74
+ }
75
+
76
+ complete() {
77
+ this.cookies.set(this.hideCookieBannerKey, true);
78
+ }
79
+
80
+ close() {
81
+ this.$module.setAttribute("hidden", true);
82
+ }
83
+ }
@@ -0,0 +1,32 @@
1
+ @use "../../tools/colour";
2
+ @use "../../tools/spacing";
3
+ @use "../../tools/media";
4
+ @use "../../tools/typography";
5
+ @use "../../utilities";
6
+ @use "../button";
7
+ @use "../grid";
8
+
9
+ .tna-cookie-banner {
10
+ @include colour.invert;
11
+
12
+ padding-top: 2rem;
13
+ padding-bottom: 2rem;
14
+
15
+ @include media.on-tiny {
16
+ padding-top: 1rem;
17
+ padding-bottom: 1rem;
18
+
19
+ @include typography.relative-font-size(16);
20
+ }
21
+
22
+ &__message {
23
+ &--prompt {
24
+ }
25
+
26
+ &--accepted {
27
+ }
28
+
29
+ &--rejected {
30
+ }
31
+ }
32
+ }
@@ -0,0 +1,164 @@
1
+ import CookieBanner from "./template.njk";
2
+ import macroOptions from "./macro-options.json";
3
+ import { expect } from "@storybook/jest";
4
+ import { within, userEvent } from "@storybook/testing-library";
5
+ import Cookies from "../../lib/cookies.mjs";
6
+
7
+ const argTypes = {
8
+ url: { control: "text" },
9
+ policies: { control: "text" },
10
+ hideCookieBannerKey: { control: "text" },
11
+ loadScriptsOnAccept: { control: "text" },
12
+ classes: { control: "text" },
13
+ attributes: { control: "object" },
14
+ };
15
+
16
+ Object.keys(argTypes).forEach((argType) => {
17
+ argTypes[argType].description = macroOptions.find(
18
+ (option) => option.name === argType,
19
+ )?.description;
20
+ });
21
+
22
+ export default {
23
+ title: "Components/Cookie banner",
24
+ argTypes,
25
+ };
26
+
27
+ const Template = ({
28
+ url,
29
+ policies,
30
+ hideCookieBannerKey,
31
+ loadScriptsOnAccept,
32
+ classes,
33
+ attributes,
34
+ }) =>
35
+ CookieBanner({
36
+ params: {
37
+ url,
38
+ policies,
39
+ hideCookieBannerKey,
40
+ loadScriptsOnAccept,
41
+ classes,
42
+ attributes,
43
+ },
44
+ });
45
+
46
+ export const Standard = Template.bind({});
47
+ Standard.args = {
48
+ cookiesUrl: "#",
49
+ classes: "tna-cookie-banner--demo",
50
+ };
51
+
52
+ const deleteAllCookies = (cookies) => {
53
+ Object.keys(cookies.all).forEach((cookie) => cookies.delete(cookie));
54
+ };
55
+
56
+ export const Accept = Template.bind({});
57
+ Accept.args = {
58
+ cookiesUrl: "#",
59
+ classes: "tna-cookie-banner--demo",
60
+ };
61
+ Accept.play = async ({ canvasElement }) => {
62
+ const cookies = new Cookies();
63
+ deleteAllCookies(cookies);
64
+
65
+ await expect(cookies.isPolicyAccepted("analytics")).toEqual(false);
66
+ await expect(cookies.isPolicyAccepted("settings")).toEqual(false);
67
+ await expect(cookies.isPolicyAccepted("unknown")).toEqual(null);
68
+
69
+ const canvas = within(canvasElement);
70
+ const acceptButton = canvas.getByText("Accept cookies");
71
+ await expect(acceptButton).toBeVisible();
72
+ await userEvent.click(acceptButton);
73
+
74
+ await expect(cookies.isPolicyAccepted("analytics")).toEqual(true);
75
+ await expect(cookies.isPolicyAccepted("settings")).toEqual(true);
76
+ await expect(cookies.isPolicyAccepted("unknown")).toEqual(null);
77
+ await expect(acceptButton).not.toBeVisible();
78
+
79
+ // const closeButton = canvas.getByText("Close this message");
80
+ // await expect(closeButton).toBeVisible();
81
+ // await userEvent.click(closeButton);
82
+
83
+ // await expect(closeButton).not.toBeVisible();
84
+
85
+ deleteAllCookies(cookies);
86
+ };
87
+
88
+ export const Reject = Template.bind({});
89
+ Reject.args = {
90
+ cookiesUrl: "#",
91
+ classes: "tna-cookie-banner--demo",
92
+ };
93
+ Reject.play = async ({ canvasElement }) => {
94
+ const cookies = new Cookies();
95
+ deleteAllCookies(cookies);
96
+
97
+ await expect(cookies.isPolicyAccepted("analytics")).toEqual(false);
98
+ await expect(cookies.isPolicyAccepted("settings")).toEqual(false);
99
+ await expect(cookies.isPolicyAccepted("unknown")).toEqual(null);
100
+
101
+ const canvas = within(canvasElement);
102
+ const rejectButton = canvas.getByText("Reject cookies");
103
+ await expect(rejectButton).toBeVisible();
104
+ await userEvent.click(rejectButton);
105
+
106
+ await expect(cookies.isPolicyAccepted("analytics")).toEqual(false);
107
+ await expect(cookies.isPolicyAccepted("settings")).toEqual(false);
108
+ await expect(cookies.isPolicyAccepted("unknown")).toEqual(null);
109
+
110
+ deleteAllCookies(cookies);
111
+ };
112
+
113
+ export const CustomPolicies = Template.bind({});
114
+ CustomPolicies.args = {
115
+ cookiesUrl: "#",
116
+ policies: "custom",
117
+ classes: "tna-cookie-banner--demo",
118
+ };
119
+ CustomPolicies.play = async ({ args, canvasElement }) => {
120
+ const cookies = new Cookies(args.policies.split(","));
121
+ deleteAllCookies(cookies);
122
+
123
+ await expect(cookies.isPolicyAccepted("analytics")).toEqual(null);
124
+ await expect(cookies.isPolicyAccepted("settings")).toEqual(null);
125
+ await expect(cookies.isPolicyAccepted("custom")).toEqual(false);
126
+
127
+ const canvas = within(canvasElement);
128
+ const acceptButton = canvas.getByText("Accept cookies");
129
+ await userEvent.click(acceptButton);
130
+
131
+ await expect(cookies.isPolicyAccepted("analytics")).toEqual(null);
132
+ await expect(cookies.isPolicyAccepted("settings")).toEqual(null);
133
+ await expect(cookies.isPolicyAccepted("custom")).toEqual(true);
134
+
135
+ deleteAllCookies(cookies);
136
+ };
137
+
138
+ export const AddScriptsOnAccept = Template.bind({});
139
+ AddScriptsOnAccept.args = {
140
+ cookiesUrl: "#",
141
+ loadScriptsOnAccept: "my-analytics-script.js",
142
+ classes: "tna-cookie-banner--demo",
143
+ };
144
+ AddScriptsOnAccept.play = async ({ args, canvasElement }) => {
145
+ const cookies = new Cookies();
146
+ deleteAllCookies(cookies);
147
+
148
+ const noScript = document.querySelector(
149
+ `script[src="${args.loadScriptsOnAccept}"]`,
150
+ );
151
+ await expect(noScript).toEqual(null);
152
+
153
+ const canvas = within(canvasElement);
154
+ const acceptButton = canvas.getByText("Accept cookies");
155
+ await userEvent.click(acceptButton);
156
+
157
+ const script = document.querySelector(
158
+ `script[src="${args.loadScriptsOnAccept}"]`,
159
+ );
160
+ await expect(script).toBeTruthy();
161
+
162
+ deleteAllCookies(cookies);
163
+ script.remove();
164
+ };
@@ -0,0 +1,4 @@
1
+ {
2
+ "component": "cookie-banner",
3
+ "fixtures": []
4
+ }
@@ -0,0 +1,38 @@
1
+ [
2
+ {
3
+ "name": "cookiesUrl",
4
+ "type": "string",
5
+ "required": true,
6
+ "description": ""
7
+ },
8
+ {
9
+ "name": "policies",
10
+ "type": "string",
11
+ "required": false,
12
+ "description": ""
13
+ },
14
+ {
15
+ "name": "hideCookieBannerKey",
16
+ "type": "string",
17
+ "required": false,
18
+ "description": ""
19
+ },
20
+ {
21
+ "name": "loadScriptsOnAccept",
22
+ "type": "string",
23
+ "required": false,
24
+ "description": ""
25
+ },
26
+ {
27
+ "name": "classes",
28
+ "type": "string",
29
+ "required": false,
30
+ "description": "Classes to add to the cookie banner."
31
+ },
32
+ {
33
+ "name": "attributes",
34
+ "type": "object",
35
+ "required": false,
36
+ "description": "HTML attributes (for example data attributes) to add to the cookie banner."
37
+ }
38
+ ]
@@ -0,0 +1,3 @@
1
+ {% macro tnaCookieBanner(params) %}
2
+ {%- include "nationalarchives/components/cookie-banner/template.njk" -%}
3
+ {% endmacro %}
@@ -0,0 +1,61 @@
1
+ {% from "nationalarchives/components/button/macro.njk" import tnaButton %}
2
+
3
+ {%- set containerClasses = [params.classes] if params.classes else [] -%}
4
+ <div class="tna-cookie-banner {{ containerClasses | join(' ') }}" role="region" aria-label="Cookie usage" data-module="tna-cookie-banner" data-policies="{{ params.policies if params.policies else 'analytics,settings' }}" data-hidekey="{{ params.hideCookieBannerKey if params.hideCookieBannerKey else 'hide_tna_cookie_banner' }}"{% if params.loadScriptsOnAccept %} data-acceptscripts="{{ params.loadScriptsOnAccept }}"{% endif %}{%- for attribute, value in params.attributes %} {{ attribute }}="{{ value }}"{% endfor %} hidden>
5
+ <div class="tna-container">
6
+ <div class="tna-column tna-column--full tna-cookie-banner__message tna-cookie-banner__message--prompt">
7
+ <h2>This website uses cookies</h2>
8
+ <p>We use some essential cookies to make this service work.</p>
9
+ <p>We'd also like to use analytics cookies so we can understand how you use the service and make improvements.</p>
10
+ <div class="tna-button-group">
11
+ {{ tnaButton({
12
+ text: "Accept cookies",
13
+ buttonElement: true,
14
+ attributes: {
15
+ value: "accept"
16
+ }
17
+ }) }}
18
+ {{ tnaButton({
19
+ text: "Reject cookies",
20
+ buttonElement: true,
21
+ attributes: {
22
+ value: "reject"
23
+ }
24
+ }) }}
25
+ {{ tnaButton({
26
+ text: "Set cookie preferences",
27
+ href: "#",
28
+ plain: true
29
+ }) }}
30
+ </div>
31
+ </div>
32
+ <div class="tna-column tna-column--full tna-cookie-banner__message tna-cookie-banner__message--accepted" hidden>
33
+ <p>
34
+ You have accepted optional cookies. You can change your cookie settings on the <a href="#">Cookies page</a>.
35
+ </p>
36
+ <div class="tna-button-group">
37
+ {{ tnaButton({
38
+ text: "Close this message",
39
+ buttonElement: true,
40
+ attributes: {
41
+ value: "close"
42
+ }
43
+ }) }}
44
+ </div>
45
+ </div>
46
+ <div class="tna-column tna-column--full tna-cookie-banner__message tna-cookie-banner__message--rejected" hidden>
47
+ <p>
48
+ You have rejected optional cookies. You can change your cookie settings on the <a href="#">Cookies page</a>.
49
+ </p>
50
+ <div class="tna-button-group">
51
+ {{ tnaButton({
52
+ text: "Close this message",
53
+ buttonElement: true,
54
+ attributes: {
55
+ value: "close"
56
+ }
57
+ }) }}
58
+ </div>
59
+ </div>
60
+ </div>
61
+ </div>
@@ -1,54 +1 @@
1
- .tna-filters {
2
- margin-bottom: 2rem;
3
-
4
- display: flex;
5
- flex-wrap: wrap;
6
- gap: 1rem;
7
-
8
- &:last-child {
9
- margin-bottom: 0;
10
- }
11
-
12
- &__item {
13
- }
14
-
15
- &__item--selected #{&}__link {
16
- background-color: #004c7e;
17
-
18
- &,
19
- &:link,
20
- &:visited {
21
- color: #fff;
22
- }
23
- }
24
-
25
- &__link {
26
- padding: 0.125rem 0.75rem;
27
-
28
- text-decoration: none;
29
-
30
- background-color: #d4e5ef;
31
-
32
- border-radius: 99rem;
33
-
34
- transition:
35
- color 200ms,
36
- background-color 200ms;
37
-
38
- &,
39
- &:link,
40
- &:visited {
41
- color: #000;
42
- }
43
-
44
- &:hover {
45
- color: #fff;
46
-
47
- background-color: #004c7e;
48
-
49
- transition:
50
- color 50ms,
51
- background-color 50ms;
52
- }
53
- }
54
- }
1
+ @use "filters";
@@ -0,0 +1 @@
1
+ @import"https://use.typekit.net/hkj3kuz.css";.tna-filters,.tna-ul,.tna-ol,.tna-chip-list,.tna-blockquote,.tna-scene-setter,.tna-aside{margin-bottom:2rem}.tna-filters:last-child,.tna-ul:last-child,.tna-ol:last-child,.tna-chip-list:last-child,.tna-blockquote:last-child,.tna-scene-setter:last-child,.tna-aside:last-child{margin-bottom:0}.tna-visually-hidden{width:1px !important;height:1px !important;margin:0 !important;padding:0 !important;position:absolute !important;top:-9999px !important;left:-9999px !important;z-index:-1 !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;border:0 !important;background-color:rgba(0,0,0,0) !important}.tna-visually-hidden::before,.tna-visually-hidden::after{content:" "}.tna-background--contrast{--font-base: var(--contrast-font-base);--font-dark: var(--contrast-font-dark);--font-light: var(--contrast-font-light);--link: var(--contrast-link);--link-visited: var(--contrast-link-visited);--keyline: var(--contrast-keyline);--keyline-dark: var(--contrast-keyline-dark);--button-text: var(--contrast-button-text);--button-background: var(--contrast-button-background);--button-hover-text: var(--contrast-button-hover-text);--button-hover-background: var(--contrast-button-hover-background);background-color:#1e1e1e;background-color:var(--contrast-background);color:rgba(255,255,255,.95);color:var(--font-base)}.tna-chip,.tna-hgroup__supertitle,.tna-background--accent{--font-base: var(--accent-font-base);--font-dark: var(--accent-font-dark);--font-light: var(--accent-font-light);--link: var(--accent-link);--link-visited: var(--accent-link-visited);--keyline: var(--accent-keyline);--keyline-dark: var(--accent-keyline-dark);background-color:#111;background-color:var(--accent-background);color:rgba(255,255,255,.95);color:var(--font-base)}.tna-background--accent-light{background-color:#d9d9d6;background-color:var(--accent-background-light);--font-base: #343338;--font-dark: #000;--font-light: rgba(52, 51, 56, 0.7);--link: #000;--link-visited: #4c2c92;--keyline: #ccc;--keyline-dark: #26262a;--button-text: #fff;--button-background: #000;--button-hover-text: #000;--button-hover-background: #fff}:root{--page-background: #f4f4f4;--font-base: #343338;--font-dark: #000;--font-light: rgba(52, 51, 56, 0.7);--link: #1d70ab;--link-visited: #4c2c92;--focus-outline: #00b0ff;--keyline: #ccc;--keyline-dark: #26262a;--button-text: #fff;--button-background: #000;--button-hover-text: #000;--button-hover-background: #fff;--contrast-background: #1e1e1e;--contrast-font-base: #fff;--contrast-font-dark: #fff;--contrast-font-light: rgba(255, 255, 255, 0.7);--contrast-link: #fff;--contrast-link-visited: #fff;--contrast-keyline: rgba(255, 255, 255, 0.5);--contrast-keyline-dark: rgba(255, 255, 255, 0.8);--contrast-button-text: #000;--contrast-button-background: #fff;--contrast-button-hover-text: #fff;--contrast-button-hover-background: #000;--accent: #d9d9d6;--accent-background: #111;--accent-background-light: #d9d9d6;--accent-font-base: #fff;--accent-font-dark: #fff;--accent-font-light: rgba(255, 255, 255, 0.7);--accent-link: #fff;--accent-link-visited: #b9f;--accent-keyline: rgba(255, 255, 255, 0.5);--accent-keyline-dark: rgba(255, 255, 255, 0.8);--button-accent-text: #000;--button-accent-background: #8c9694}.tna-template{min-width:320px;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;-webkit-overflow-scrolling:touch;font-size:16px;background-color:#f4f4f4;background-color:var(--page-background);accent-color:var(--accent);--accent-font-base: #fff !important;--accent-font-dark: #fff !important;--accent-font-light: rgba(255, 255, 255, 0.7) !important;--accent-link: #fff !important;--accent-link-visited: #fff !important;--accent-keyline: rgba(255, 255, 255, 0.5) !important;--accent-keyline-dark: rgba(255, 255, 255, 0.8) !important}.tna-template--system-theme{--page-background: #f4f4f4;--font-base: #343338;--font-dark: #000;--font-light: rgba(52, 51, 56, 0.7);--link: #1d70ab;--link-visited: #4c2c92;--focus-outline: #00b0ff;--keyline: #ccc;--keyline-dark: #26262a;--button-text: #fff;--button-background: #000;--button-hover-text: #000;--button-hover-background: #fff;--contrast-background: #1e1e1e;--contrast-font-base: #fff;--contrast-font-dark: #fff;--contrast-font-light: rgba(255, 255, 255, 0.7);--contrast-link: #fff;--contrast-link-visited: #fff;--contrast-keyline: rgba(255, 255, 255, 0.5);--contrast-keyline-dark: rgba(255, 255, 255, 0.8);--contrast-button-text: #000;--contrast-button-background: #fff;--contrast-button-hover-text: #fff;--contrast-button-hover-background: #000;--accent: #d9d9d6;--accent-background: #111;--accent-background-light: #d9d9d6;--accent-font-base: #fff;--accent-font-dark: #fff;--accent-font-light: rgba(255, 255, 255, 0.7);--accent-link: #fff;--accent-link-visited: #b9f;--accent-keyline: rgba(255, 255, 255, 0.5);--accent-keyline-dark: rgba(255, 255, 255, 0.8);--button-accent-text: #000;--button-accent-background: #8c9694}@media(prefers-color-scheme: dark){.tna-template--system-theme{--page-background: #111;--font-base: rgba(255, 255, 255, 0.95);--font-dark: #fff;--font-light: rgba(255, 255, 255, 0.5);--link: #00b0ff;--link-visited: #fff;--focus-outline: #00b0ff;--keyline: rgba(255, 255, 255, 0.25);--keyline-dark: #fff;--button-text: #000;--button-background: #fff;--button-hover-text: #fff;--button-hover-background: #000;--contrast-background: #1e1e1e;--contrast-font-base: #fff;--contrast-font-dark: #fff;--contrast-font-light: rgba(255, 255, 255, 0.7);--contrast-link: #fff;--contrast-link-visited: #fff;--contrast-keyline: rgba(255, 255, 255, 0.5);--contrast-keyline-dark: rgba(255, 255, 255, 0.8);--contrast-button-text: #000;--contrast-button-background: #fff;--contrast-button-hover-text: #fff;--contrast-button-hover-background: #000;--accent: #d9d9d6;--accent-background: #111;--accent-background-light: #8c9694;--accent-font-base: #fff;--accent-font-dark: #fff;--accent-font-light: rgba(255, 255, 255, 0.7);--accent-link: #fff;--accent-link-visited: #b9f;--accent-keyline: rgba(255, 255, 255, 0.5);--accent-keyline-dark: rgba(255, 255, 255, 0.8);--button-accent-text: #000;--button-accent-background: #8c9694}}@media(prefers-contrast: more){.tna-template--system-theme{--page-background: #fff;--font-base: #000;--font-dark: #000;--font-light: #000;--link: #004c7e;--link-visited: #000;--focus-outline: #fd3f03;--keyline: #000;--keyline-dark: #000;--button-text: #fff;--button-background: #000;--button-hover-text: #000;--button-hover-background: #fff;--contrast-background: #f4f4f4;--contrast-font-base: #000;--contrast-font-dark: #000;--contrast-font-light: #000;--contrast-link: #004c7e;--contrast-link-visited: #000;--contrast-keyline: #000;--contrast-keyline-dark: #000;--contrast-button-text: #fff;--contrast-button-background: #000;--contrast-button-hover-text: #000;--contrast-button-hover-background: #fff;--accent: #d9d9d6;--accent-background: #111;--accent-background-light: #d9d9d6;--accent-font-base: #fff;--accent-font-dark: #fff;--accent-font-light: rgba(255, 255, 255, 0.7);--accent-link: #fff;--accent-link-visited: #b9f;--accent-keyline: rgba(255, 255, 255, 0.5);--accent-keyline-dark: rgba(255, 255, 255, 0.8);--button-accent-text: #000;--button-accent-background: #8c9694}.tna-template--system-theme *{background-image:none !important}}@media(prefers-contrast: more)and (prefers-color-scheme: dark){.tna-template--system-theme{--page-background: #000;--font-base: #fff;--font-dark: #fff;--font-light: #fff;--link: #fff;--link-visited: #fff;--focus-outline: #00b0ff;--keyline: #fff;--keyline-dark: #fff;--button-text: #000;--button-background: #fff;--button-hover-text: #fff;--button-hover-background: #000;--contrast-background: #111;--contrast-font-base: #fff;--contrast-font-dark: #fff;--contrast-font-light: rgba(255, 255, 255, 0.7);--contrast-link: #fff;--contrast-link-visited: #fff;--contrast-keyline: rgba(255, 255, 255, 0.5);--contrast-keyline-dark: rgba(255, 255, 255, 0.8);--contrast-button-text: #000;--contrast-button-background: #fff;--contrast-button-hover-text: #fff;--contrast-button-hover-background: #000;--accent: #d9d9d6;--accent-background: #111;--accent-background-light: #8c9694;--accent-font-base: #fff;--accent-font-dark: #fff;--accent-font-light: rgba(255, 255, 255, 0.7);--accent-link: #fff;--accent-link-visited: #b9f;--accent-keyline: rgba(255, 255, 255, 0.5);--accent-keyline-dark: rgba(255, 255, 255, 0.8);--button-accent-text: #000;--button-accent-background: #8c9694}}.tna-template--light-theme{--page-background: #f4f4f4;--font-base: #343338;--font-dark: #000;--font-light: rgba(52, 51, 56, 0.7);--link: #1d70ab;--link-visited: #4c2c92;--focus-outline: #00b0ff;--keyline: #ccc;--keyline-dark: #26262a;--button-text: #fff;--button-background: #000;--button-hover-text: #000;--button-hover-background: #fff;--contrast-background: #1e1e1e;--contrast-font-base: #fff;--contrast-font-dark: #fff;--contrast-font-light: rgba(255, 255, 255, 0.7);--contrast-link: #fff;--contrast-link-visited: #fff;--contrast-keyline: rgba(255, 255, 255, 0.5);--contrast-keyline-dark: rgba(255, 255, 255, 0.8);--contrast-button-text: #000;--contrast-button-background: #fff;--contrast-button-hover-text: #fff;--contrast-button-hover-background: #000;--accent: #d9d9d6;--accent-background: #111;--accent-background-light: #d9d9d6;--accent-font-base: #fff;--accent-font-dark: #fff;--accent-font-light: rgba(255, 255, 255, 0.7);--accent-link: #fff;--accent-link-visited: #b9f;--accent-keyline: rgba(255, 255, 255, 0.5);--accent-keyline-dark: rgba(255, 255, 255, 0.8);--button-accent-text: #000;--button-accent-background: #8c9694}.tna-template--dark-theme{--page-background: #111;--font-base: rgba(255, 255, 255, 0.95);--font-dark: #fff;--font-light: rgba(255, 255, 255, 0.5);--link: #00b0ff;--link-visited: #fff;--focus-outline: #00b0ff;--keyline: rgba(255, 255, 255, 0.25);--keyline-dark: #fff;--button-text: #000;--button-background: #fff;--button-hover-text: #fff;--button-hover-background: #000;--contrast-background: #1e1e1e;--contrast-font-base: #fff;--contrast-font-dark: #fff;--contrast-font-light: rgba(255, 255, 255, 0.7);--contrast-link: #fff;--contrast-link-visited: #fff;--contrast-keyline: rgba(255, 255, 255, 0.5);--contrast-keyline-dark: rgba(255, 255, 255, 0.8);--contrast-button-text: #000;--contrast-button-background: #fff;--contrast-button-hover-text: #fff;--contrast-button-hover-background: #000;--accent: #d9d9d6;--accent-background: #111;--accent-background-light: #8c9694;--accent-font-base: #fff;--accent-font-dark: #fff;--accent-font-light: rgba(255, 255, 255, 0.7);--accent-link: #fff;--accent-link-visited: #b9f;--accent-keyline: rgba(255, 255, 255, 0.5);--accent-keyline-dark: rgba(255, 255, 255, 0.8);--button-accent-text: #000;--button-accent-background: #8c9694}.tna-template--high-contrast-theme{--page-background: #fff;--font-base: #000;--font-dark: #000;--font-light: #000;--link: #004c7e;--link-visited: #000;--focus-outline: #fd3f03;--keyline: #000;--keyline-dark: #000;--button-text: #fff;--button-background: #000;--button-hover-text: #000;--button-hover-background: #fff;--contrast-background: #f4f4f4;--contrast-font-base: #000;--contrast-font-dark: #000;--contrast-font-light: #000;--contrast-link: #004c7e;--contrast-link-visited: #000;--contrast-keyline: #000;--contrast-keyline-dark: #000;--contrast-button-text: #fff;--contrast-button-background: #000;--contrast-button-hover-text: #000;--contrast-button-hover-background: #fff;--accent: #d9d9d6;--accent-background: #111;--accent-background-light: #d9d9d6;--accent-font-base: #fff;--accent-font-dark: #fff;--accent-font-light: rgba(255, 255, 255, 0.7);--accent-link: #fff;--accent-link-visited: #b9f;--accent-keyline: rgba(255, 255, 255, 0.5);--accent-keyline-dark: rgba(255, 255, 255, 0.8);--button-accent-text: #000;--button-accent-background: #8c9694}.tna-template--high-contrast-theme *{background-image:none !important}.tna-template--high-contrast-theme.tna-template--dark-theme{--page-background: #000;--font-base: #fff;--font-dark: #fff;--font-light: #fff;--link: #fff;--link-visited: #fff;--focus-outline: #00b0ff;--keyline: #fff;--keyline-dark: #fff;--button-text: #000;--button-background: #fff;--button-hover-text: #fff;--button-hover-background: #000;--contrast-background: #111;--contrast-font-base: #fff;--contrast-font-dark: #fff;--contrast-font-light: rgba(255, 255, 255, 0.7);--contrast-link: #fff;--contrast-link-visited: #fff;--contrast-keyline: rgba(255, 255, 255, 0.5);--contrast-keyline-dark: rgba(255, 255, 255, 0.8);--contrast-button-text: #000;--contrast-button-background: #fff;--contrast-button-hover-text: #fff;--contrast-button-hover-background: #000;--accent: #d9d9d6;--accent-background: #111;--accent-background-light: #8c9694;--accent-font-base: #fff;--accent-font-dark: #fff;--accent-font-light: rgba(255, 255, 255, 0.7);--accent-link: #fff;--accent-link-visited: #b9f;--accent-keyline: rgba(255, 255, 255, 0.5);--accent-keyline-dark: rgba(255, 255, 255, 0.8);--button-accent-text: #000;--button-accent-background: #8c9694}.tna-template--yellow-accent{--accent: #fc0 !important;--accent-background: #fc0 !important;--accent-background-light: #f9f7e2 !important;--accent-font-base: #000 !important;--accent-font-dark: #000 !important;--accent-font-light: rgba(0, 0, 0, 0.7) !important;--accent-link: #000 !important;--accent-link-visited: #000 !important;--accent-keyline: rgba(0, 0, 0, 0.5) !important;--accent-keyline-dark: rgba(0, 0, 0, 0.8) !important;--button-accent-background: #fc0 !important}.tna-template--pink-accent{--accent-font-base: #fff !important;--accent-font-dark: #fff !important;--accent-font-light: rgba(255, 255, 255, 0.7) !important;--accent-link: #fff !important;--accent-link-visited: #fff !important;--accent-keyline: rgba(255, 255, 255, 0.5) !important;--accent-keyline-dark: rgba(255, 255, 255, 0.8) !important;--button-accent-text: #fff !important;--accent: #fe1d57 !important;--accent-background: #9c193a !important;--accent-background-light: #fad3d4 !important;--button-accent-background: #9c193a !important}.tna-template--orange-accent{--accent-font-base: #fff !important;--accent-font-dark: #fff !important;--accent-font-light: rgba(255, 255, 255, 0.7) !important;--accent-link: #fff !important;--accent-link-visited: #fff !important;--accent-keyline: rgba(255, 255, 255, 0.5) !important;--accent-keyline-dark: rgba(255, 255, 255, 0.8) !important;--button-accent-text: #fff !important;--accent: #fd3f03 !important;--accent-background: #8f3415 !important;--accent-background-light: #f9e1bc !important;--button-accent-background: #8f3415 !important}.tna-template--green-accent{--accent-font-base: #fff !important;--accent-font-dark: #fff !important;--accent-font-light: rgba(255, 255, 255, 0.7) !important;--accent-link: #fff !important;--accent-link-visited: #fff !important;--accent-keyline: rgba(255, 255, 255, 0.5) !important;--accent-keyline-dark: rgba(255, 255, 255, 0.8) !important;--button-accent-text: #fff !important;--accent: #86bc25 !important;--accent-background: #00623b !important;--accent-background-light: #dde5d5 !important;--button-accent-background: #00623b !important}.tna-template--blue-accent{--accent-font-base: #fff !important;--accent-font-dark: #fff !important;--accent-font-light: rgba(255, 255, 255, 0.7) !important;--accent-link: #fff !important;--accent-link-visited: #fff !important;--accent-keyline: rgba(255, 255, 255, 0.5) !important;--accent-keyline-dark: rgba(255, 255, 255, 0.8) !important;--button-accent-text: #fff !important;--accent: #00b0ff !important;--accent-background: #004c7e !important;--accent-background-light: #d4e5ef !important;--button-accent-background: #004c7e !important}@media(prefers-reduced-motion){.tna-template *{animation:none !important;transition:none !important}}.tna-template__body{min-height:100%;margin:0;padding:0;overflow:auto}.tna-template__body:has(.tna-header):has(#main-content[role=main]):has(.tna-footer){display:flex;flex-direction:column}.tna-template__body:has(.tna-header):has(#main-content[role=main]):has(.tna-footer) #main-content[role=main]{flex:1}img,svg,picture,video,canvas{max-width:100%;display:block}video,canvas{width:100%}[hidden]{display:none}*:focus{outline:.3125rem solid;outline-color:#00b0ff;outline-color:var(--focus-outline);outline-offset:.125rem}hr{margin:2rem 0;border-width:1px 0 0;border-color:#ccc;border-color:var(--keyline);border-style:solid}.tna-section{padding-top:3rem;padding-bottom:3rem}@media(max-width: 48em){.tna-section{padding-top:2rem;padding-bottom:2rem}}.tna-aside{padding:2rem}@media(max-width: 48em){.tna-aside{padding:1rem}}.tna-template--high-contrast-theme .tna-aside{border:1px #26262a solid;border:1px var(--keyline-dark) solid}@media(prefers-contrast: more){.tna-template--system-theme .tna-aside{border:1px #26262a solid;border:1px var(--keyline-dark) solid}}.tna-\!--no-margin-top,.tna-\!--no-margin-vertical{margin-top:0 !important}.tna-\!--no-margin-bottom,.tna-\!--no-margin-vertical{margin-bottom:0 !important}.tna-\!--no-padding-top,.tna-\!--no-padding-vertical{padding-top:0 !important}.tna-\!--no-padding-bottom,.tna-\!--no-padding-vertical{padding-bottom:0 !important}.tna-\!--margin-top-xs,.tna-\!--margin-vertical-xs{margin-top:0.5rem !important}.tna-\!--margin-top-s,.tna-\!--margin-vertical-s{margin-top:1rem !important}.tna-\!--margin-top-m,.tna-\!--margin-vertical-m{margin-top:2rem !important}.tna-\!--margin-top-l,.tna-\!--margin-vertical-l{margin-top:3rem !important}.tna-\!--margin-top-xl,.tna-\!--margin-vertical-xl{margin-top:5rem !important}.tna-\!--margin-top-xxl,.tna-\!--margin-vertical-xxl{margin-top:8rem !important}.tna-\!--margin-bottom-xs,.tna-\!--margin-vertical-xs{margin-bottom:0.5rem !important}.tna-\!--margin-bottom-s,.tna-\!--margin-vertical-s{margin-bottom:1rem !important}.tna-\!--margin-bottom-m,.tna-\!--margin-vertical-m{margin-bottom:2rem !important}.tna-\!--margin-bottom-l,.tna-\!--margin-vertical-l{margin-bottom:3rem !important}.tna-\!--margin-bottom-xl,.tna-\!--margin-vertical-xl{margin-bottom:5rem !important}.tna-\!--margin-bottom-xxl,.tna-\!--margin-vertical-xxl{margin-bottom:8rem !important}.tna-\!--padding-top-xs,.tna-\!--padding-vertical-xs{padding-top:0.5rem !important}.tna-\!--padding-top-s,.tna-\!--padding-vertical-s{padding-top:1rem !important}.tna-\!--padding-top-m,.tna-\!--padding-vertical-m{padding-top:2rem !important}.tna-\!--padding-top-l,.tna-\!--padding-vertical-l{padding-top:3rem !important}.tna-\!--padding-top-xl,.tna-\!--padding-vertical-xl{padding-top:5rem !important}.tna-\!--padding-top-xxl,.tna-\!--padding-vertical-xxl{padding-top:8rem !important}.tna-\!--padding-bottom-xs,.tna-\!--padding-vertical-xs{padding-bottom:0.5rem !important}.tna-\!--padding-bottom-s,.tna-\!--padding-vertical-s{padding-bottom:1rem !important}.tna-\!--padding-bottom-m,.tna-\!--padding-vertical-m{padding-bottom:2rem !important}.tna-\!--padding-bottom-l,.tna-\!--padding-vertical-l{padding-bottom:3rem !important}.tna-\!--padding-bottom-xl,.tna-\!--padding-vertical-xl{padding-bottom:5rem !important}.tna-\!--padding-bottom-xxl,.tna-\!--padding-vertical-xxl{padding-bottom:8rem !important}@media(min-width: 48.0625em)and (max-width: 64em){.tna-\!--no-margin-top-medium,.tna-\!--no-margin-vertical-medium{margin-top:0 !important}.tna-\!--no-margin-bottom-medium,.tna-\!--no-margin-vertical-medium{margin-bottom:0 !important}.tna-\!--no-padding-top-medium,.tna-\!--no-padding-vertical-medium{padding-top:0 !important}.tna-\!--no-padding-bottom-medium,.tna-\!--no-padding-vertical-medium{padding-bottom:0 !important}.tna-\!--margin-top-xs-medium,.tna-\!--margin-vertical-xs-medium{margin-top:0.5rem !important}.tna-\!--margin-top-s-medium,.tna-\!--margin-vertical-s-medium{margin-top:1rem !important}.tna-\!--margin-top-m-medium,.tna-\!--margin-vertical-m-medium{margin-top:2rem !important}.tna-\!--margin-top-l-medium,.tna-\!--margin-vertical-l-medium{margin-top:3rem !important}.tna-\!--margin-top-xl-medium,.tna-\!--margin-vertical-xl-medium{margin-top:5rem !important}.tna-\!--margin-top-xxl-medium,.tna-\!--margin-vertical-xxl-medium{margin-top:8rem !important}.tna-\!--margin-bottom-xs-medium,.tna-\!--margin-vertical-xs-medium{margin-bottom:0.5rem !important}.tna-\!--margin-bottom-s-medium,.tna-\!--margin-vertical-s-medium{margin-bottom:1rem !important}.tna-\!--margin-bottom-m-medium,.tna-\!--margin-vertical-m-medium{margin-bottom:2rem !important}.tna-\!--margin-bottom-l-medium,.tna-\!--margin-vertical-l-medium{margin-bottom:3rem !important}.tna-\!--margin-bottom-xl-medium,.tna-\!--margin-vertical-xl-medium{margin-bottom:5rem !important}.tna-\!--margin-bottom-xxl-medium,.tna-\!--margin-vertical-xxl-medium{margin-bottom:8rem !important}.tna-\!--padding-top-xs-medium,.tna-\!--padding-vertical-xs-medium{padding-top:0.5rem !important}.tna-\!--padding-top-s-medium,.tna-\!--padding-vertical-s-medium{padding-top:1rem !important}.tna-\!--padding-top-m-medium,.tna-\!--padding-vertical-m-medium{padding-top:2rem !important}.tna-\!--padding-top-l-medium,.tna-\!--padding-vertical-l-medium{padding-top:3rem !important}.tna-\!--padding-top-xl-medium,.tna-\!--padding-vertical-xl-medium{padding-top:5rem !important}.tna-\!--padding-top-xxl-medium,.tna-\!--padding-vertical-xxl-medium{padding-top:8rem !important}.tna-\!--padding-bottom-xs-medium,.tna-\!--padding-vertical-xs-medium{padding-bottom:0.5rem !important}.tna-\!--padding-bottom-s-medium,.tna-\!--padding-vertical-s-medium{padding-bottom:1rem !important}.tna-\!--padding-bottom-m-medium,.tna-\!--padding-vertical-m-medium{padding-bottom:2rem !important}.tna-\!--padding-bottom-l-medium,.tna-\!--padding-vertical-l-medium{padding-bottom:3rem !important}.tna-\!--padding-bottom-xl-medium,.tna-\!--padding-vertical-xl-medium{padding-bottom:5rem !important}.tna-\!--padding-bottom-xxl-medium,.tna-\!--padding-vertical-xxl-medium{padding-bottom:8rem !important}}@media(min-width: 30.0625em)and (max-width: 48em){.tna-\!--no-margin-top-small,.tna-\!--no-margin-vertical-small{margin-top:0 !important}.tna-\!--no-margin-bottom-small,.tna-\!--no-margin-vertical-small{margin-bottom:0 !important}.tna-\!--no-padding-top-small,.tna-\!--no-padding-vertical-small{padding-top:0 !important}.tna-\!--no-padding-bottom-small,.tna-\!--no-padding-vertical-small{padding-bottom:0 !important}.tna-\!--margin-top-xs-small,.tna-\!--margin-vertical-xs-small{margin-top:0.5rem !important}.tna-\!--margin-top-s-small,.tna-\!--margin-vertical-s-small{margin-top:0.75rem !important}.tna-\!--margin-top-m-small,.tna-\!--margin-vertical-m-small{margin-top:1.5rem !important}.tna-\!--margin-top-l-small,.tna-\!--margin-vertical-l-small{margin-top:2rem !important}.tna-\!--margin-top-xl-small,.tna-\!--margin-vertical-xl-small{margin-top:3rem !important}.tna-\!--margin-top-xxl-small,.tna-\!--margin-vertical-xxl-small{margin-top:5rem !important}.tna-\!--margin-bottom-xs-small,.tna-\!--margin-vertical-xs-small{margin-bottom:0.5rem !important}.tna-\!--margin-bottom-s-small,.tna-\!--margin-vertical-s-small{margin-bottom:0.75rem !important}.tna-\!--margin-bottom-m-small,.tna-\!--margin-vertical-m-small{margin-bottom:1.5rem !important}.tna-\!--margin-bottom-l-small,.tna-\!--margin-vertical-l-small{margin-bottom:2rem !important}.tna-\!--margin-bottom-xl-small,.tna-\!--margin-vertical-xl-small{margin-bottom:3rem !important}.tna-\!--margin-bottom-xxl-small,.tna-\!--margin-vertical-xxl-small{margin-bottom:5rem !important}.tna-\!--padding-top-xs-small,.tna-\!--padding-vertical-xs-small{padding-top:0.5rem !important}.tna-\!--padding-top-s-small,.tna-\!--padding-vertical-s-small{padding-top:0.75rem !important}.tna-\!--padding-top-m-small,.tna-\!--padding-vertical-m-small{padding-top:1.5rem !important}.tna-\!--padding-top-l-small,.tna-\!--padding-vertical-l-small{padding-top:2rem !important}.tna-\!--padding-top-xl-small,.tna-\!--padding-vertical-xl-small{padding-top:3rem !important}.tna-\!--padding-top-xxl-small,.tna-\!--padding-vertical-xxl-small{padding-top:5rem !important}.tna-\!--padding-bottom-xs-small,.tna-\!--padding-vertical-xs-small{padding-bottom:0.5rem !important}.tna-\!--padding-bottom-s-small,.tna-\!--padding-vertical-s-small{padding-bottom:0.75rem !important}.tna-\!--padding-bottom-m-small,.tna-\!--padding-vertical-m-small{padding-bottom:1.5rem !important}.tna-\!--padding-bottom-l-small,.tna-\!--padding-vertical-l-small{padding-bottom:2rem !important}.tna-\!--padding-bottom-xl-small,.tna-\!--padding-vertical-xl-small{padding-bottom:3rem !important}.tna-\!--padding-bottom-xxl-small,.tna-\!--padding-vertical-xxl-small{padding-bottom:5rem !important}}@media(max-width: 30em){.tna-\!--no-margin-top-tiny,.tna-\!--no-margin-vertical-tiny{margin-top:0 !important}.tna-\!--no-margin-bottom-tiny,.tna-\!--no-margin-vertical-tiny{margin-bottom:0 !important}.tna-\!--no-padding-top-tiny,.tna-\!--no-padding-vertical-tiny{padding-top:0 !important}.tna-\!--no-padding-bottom-tiny,.tna-\!--no-padding-vertical-tiny{padding-bottom:0 !important}.tna-\!--margin-top-xs-tiny,.tna-\!--margin-vertical-xs-tiny{margin-top:0.5rem !important}.tna-\!--margin-top-s-tiny,.tna-\!--margin-vertical-s-tiny{margin-top:0.75rem !important}.tna-\!--margin-top-m-tiny,.tna-\!--margin-vertical-m-tiny{margin-top:1.5rem !important}.tna-\!--margin-top-l-tiny,.tna-\!--margin-vertical-l-tiny{margin-top:2rem !important}.tna-\!--margin-top-xl-tiny,.tna-\!--margin-vertical-xl-tiny{margin-top:3rem !important}.tna-\!--margin-top-xxl-tiny,.tna-\!--margin-vertical-xxl-tiny{margin-top:5rem !important}.tna-\!--margin-bottom-xs-tiny,.tna-\!--margin-vertical-xs-tiny{margin-bottom:0.5rem !important}.tna-\!--margin-bottom-s-tiny,.tna-\!--margin-vertical-s-tiny{margin-bottom:0.75rem !important}.tna-\!--margin-bottom-m-tiny,.tna-\!--margin-vertical-m-tiny{margin-bottom:1.5rem !important}.tna-\!--margin-bottom-l-tiny,.tna-\!--margin-vertical-l-tiny{margin-bottom:2rem !important}.tna-\!--margin-bottom-xl-tiny,.tna-\!--margin-vertical-xl-tiny{margin-bottom:3rem !important}.tna-\!--margin-bottom-xxl-tiny,.tna-\!--margin-vertical-xxl-tiny{margin-bottom:5rem !important}.tna-\!--padding-top-xs-tiny,.tna-\!--padding-vertical-xs-tiny{padding-top:0.5rem !important}.tna-\!--padding-top-s-tiny,.tna-\!--padding-vertical-s-tiny{padding-top:0.75rem !important}.tna-\!--padding-top-m-tiny,.tna-\!--padding-vertical-m-tiny{padding-top:1.5rem !important}.tna-\!--padding-top-l-tiny,.tna-\!--padding-vertical-l-tiny{padding-top:2rem !important}.tna-\!--padding-top-xl-tiny,.tna-\!--padding-vertical-xl-tiny{padding-top:3rem !important}.tna-\!--padding-top-xxl-tiny,.tna-\!--padding-vertical-xxl-tiny{padding-top:5rem !important}.tna-\!--padding-bottom-xs-tiny,.tna-\!--padding-vertical-xs-tiny{padding-bottom:0.5rem !important}.tna-\!--padding-bottom-s-tiny,.tna-\!--padding-vertical-s-tiny{padding-bottom:0.75rem !important}.tna-\!--padding-bottom-m-tiny,.tna-\!--padding-vertical-m-tiny{padding-bottom:1.5rem !important}.tna-\!--padding-bottom-l-tiny,.tna-\!--padding-vertical-l-tiny{padding-bottom:2rem !important}.tna-\!--padding-bottom-xl-tiny,.tna-\!--padding-vertical-xl-tiny{padding-bottom:3rem !important}.tna-\!--padding-bottom-xxl-tiny,.tna-\!--padding-vertical-xxl-tiny{padding-bottom:5rem !important}}@font-face{font-family:"Open Sans";src:url("assets/fonts/OpenSans-Medium.ttf");font-weight:normal;font-style:normal}@font-face{font-family:"Open Sans";src:url("assets/fonts/OpenSans-Bold.ttf");font-weight:bold;font-style:normal}@font-face{font-family:"Roboto Mono";src:url("assets/fonts/RobotoMono-Regular.ttf");font-weight:normal;font-style:normal}.tna-template{color:#343338;color:var(--font-base);font-family:"Open Sans",serif;font-weight:normal;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-webkit-text-size-adjust:none;direction:ltr}.tna-template__body{color:inherit;font-size:1.125rem;line-height:1.7777777778}h1,h2,h3,h4,h5,h6,ul,ol{margin-top:0}h1,h2,h3,h4,h5,h6,strong{font-weight:bold}p{margin:0 0 1.5rem}@media(max-width: 30em){p{margin-bottom:1rem}}p:last-child{margin-bottom:0}a{color:#1d70ab;color:var(--link);text-decoration-thickness:1.5px}a:visited{color:#4c2c92;color:var(--link-visited)}a:hover,a:active{text-decoration:underline;text-decoration-thickness:3.5px}a.tna-chip{text-decoration:none}a.tna-chip,a.tna-chip:link,a.tna-chip:visited{color:#000;color:var(--font-dark)}a.tna-chip:hover{text-decoration:underline;text-decoration-thickness:3.5px}.tna-ul,.tna-ol{margin-top:0;margin-right:0;margin-left:0;padding:0 0 0 2rem}.tna-ul li::marker,.tna-ol li::marker{color:#111;color:var(--accent-background);font-weight:700}.tna-ul--plain,.tna-ol--plain{padding-left:0;list-style:none}.tna-hgroup__supertitle,.tna-chip{max-width:max-content;padding:.375em .5rem;display:block;color:#000;color:var(--font-dark);font-family:"Roboto Mono",monospace;font-weight:normal;font-size:0.875rem;text-transform:uppercase;line-height:1.1428571429;line-height:1}.tna-chip-list{padding-left:0;display:flex;flex-wrap:wrap;gap:1rem;list-style:none}.tna-hgroup__title,.tna-heading{color:#000;color:var(--font-dark);font-family:supria-sans-condensed,"Arial Narrow",sans-serif;font-weight:400}.tna-hgroup__title a,.tna-heading a{display:inline-block}.tna-hgroup__title a::after,.tna-heading a::after{padding-left:.25rem;display:inline-block;font-weight:700;content:"›"}.tna-hgroup__title a:hover::after,.tna-heading a:hover::after{padding-left:.5rem}.tna-hgroup--xl .tna-hgroup__title,.tna-heading--xl{font-size:4rem;line-height:1.2}@media(min-width: 48.0625em)and (max-width: 64em){.tna-hgroup--xl .tna-hgroup__title,.tna-heading--xl{font-size:3.125rem}}@media(max-width: 48em){.tna-hgroup--xl .tna-hgroup__title,.tna-heading--xl{font-size:2.25rem}}.tna-hgroup--l .tna-hgroup__title,.tna-heading--l{font-size:2rem;line-height:1.4}@media(min-width: 48.0625em)and (max-width: 64em){.tna-hgroup--l .tna-hgroup__title,.tna-heading--l{font-size:1.75rem}}@media(max-width: 48em){.tna-hgroup--l .tna-hgroup__title,.tna-heading--l{font-size:1.5rem}}.tna-hgroup--m .tna-hgroup__title,.tna-heading--m{font-size:1.25rem;line-height:1.6}.tna-hgroup--s .tna-hgroup__title,.tna-heading--s{font-size:1.125rem;line-height:1.6}.tna-hgroup__supertitle{margin:0 0 .5rem}.tna-hgroup__title{margin:0;display:block}.tna-heading,.tna-hgroup{margin-top:3rem;margin-bottom:1rem}.tna-heading:first-child,.tna-hgroup:first-child{margin-top:0}.tna-heading:last-child,.tna-hgroup:last-child{margin-bottom:0}.tna-blockquote{margin-top:0;margin-right:0;margin-left:0;padding:1rem 1rem 1rem 2rem;border-left:.35rem #111 solid;border-left:.35rem var(--accent-background) solid}.tna-blockquote__quote{font-weight:700}.tna-blockquote__author{font-style:italic}.tna-blockquote .tna-blockquote__author{margin:1rem 0 0}.tna-blockquote__author::before{content:"—" " "}.tna-scene-setter{font-family:"Roboto Mono",monospace;font-weight:normal;color:#000;color:var(--font-dark);font-size:1.875rem;line-height:1.6666666667}@media(max-width: 48em){.tna-scene-setter{font-size:1.5rem;line-height:2}}.tna-scene-setter a{color:inherit;text-decoration-thickness:2px}.tna-scene-setter a:hover{text-decoration-thickness:4.5px}.tna-columns{column-gap:2rem}.tna-columns--2{column-count:2}.tna-columns--3{column-count:3}@media(max-width: 48em){.tna-columns{column-gap:1.5rem}}@media(min-width: 30.0625em)and (max-width: 48em){.tna-columns--1-small{column-count:1}.tna-columns--2-small{column-count:2}.tna-columns--3-small{column-count:3}.tna-columns--4-small{column-count:4}}@media(max-width: 30em){.tna-columns--1-tiny{column-count:1}.tna-columns--2-tiny{column-count:2}.tna-columns--3-tiny{column-count:3}.tna-columns--4-tiny{column-count:4}}.tna-columns__block{break-inside:avoid}.tna-columns:has(.tna-columns__block:only-of-type){column-count:1}.tna-filters{display:flex;flex-wrap:wrap;gap:1rem}.tna-filters__item--selected .tna-filters__link{background-color:#004c7e}.tna-filters__item--selected .tna-filters__link,.tna-filters__item--selected .tna-filters__link:link,.tna-filters__item--selected .tna-filters__link:visited{color:#fff}.tna-filters__link{padding:.125rem .75rem;text-decoration:none;background-color:#d4e5ef;border-radius:99rem;transition:color 200ms,background-color 200ms}.tna-filters__link,.tna-filters__link:link,.tna-filters__link:visited{color:#000}.tna-filters__link:hover{color:#fff;background-color:#004c7e;transition:color 50ms,background-color 50ms}/*# sourceMappingURL=filters.css.map */