@mdn/fred 1.1.1 → 1.2.0

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 (61) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +4 -0
  3. package/build/env.js +11 -2
  4. package/build/render.js +4 -8
  5. package/build/ssr.js +2 -2
  6. package/components/env/README.md +28 -0
  7. package/components/env/index.js +2 -29
  8. package/components/env/runtime.js +6 -0
  9. package/components/env/types.d.ts +5 -0
  10. package/components/env/utils.js +45 -0
  11. package/components/outer-layout/server.js +12 -0
  12. package/out/service-worker.js +1 -1
  13. package/out/static/client/{1231.df3f6728f4b7e36e.js → 1231.84c230e0fa92f2d4.js} +2 -2
  14. package/out/static/client/{1231.df3f6728f4b7e36e.js.map → 1231.84c230e0fa92f2d4.js.map} +1 -1
  15. package/out/static/client/{1274.5c4c7493aa8334bf.js → 1274.e98f5c68889cda35.js} +2 -2
  16. package/out/static/client/{1274.5c4c7493aa8334bf.js.map → 1274.e98f5c68889cda35.js.map} +1 -1
  17. package/out/static/client/{2936.2446688864e1a136.js → 2936.7d85bf584b89578b.js} +2 -2
  18. package/out/static/client/{2936.2446688864e1a136.js.map → 2936.7d85bf584b89578b.js.map} +1 -1
  19. package/out/static/client/{370.85e6b0ff8596c5ae.js → 370.d2e13711140af6d1.js} +3 -3
  20. package/out/static/client/{370.85e6b0ff8596c5ae.js.map → 370.d2e13711140af6d1.js.map} +1 -1
  21. package/out/static/client/{451.d36f6f80badd6af6.js → 451.cd85e2808f388a00.js} +2 -2
  22. package/out/static/client/{451.d36f6f80badd6af6.js.map → 451.cd85e2808f388a00.js.map} +1 -1
  23. package/out/static/client/{606.221fc4347a8278e8.js → 606.d22d2cf33232a730.js} +2 -2
  24. package/out/static/client/{606.221fc4347a8278e8.js.map → 606.d22d2cf33232a730.js.map} +1 -1
  25. package/out/static/client/{8093.81b1b345d454a85e.js → 8093.b03f1cb1e8b0984a.js} +3 -3
  26. package/out/static/client/{8093.81b1b345d454a85e.js.map → 8093.b03f1cb1e8b0984a.js.map} +1 -1
  27. package/out/static/client/{9784.0096d3445a2a7e98.js → 9784.214845ec6d3b77e3.js} +3 -3
  28. package/out/static/client/{9784.0096d3445a2a7e98.js.map → 9784.214845ec6d3b77e3.js.map} +1 -1
  29. package/out/static/client/{9837.2374d8bd425a9866.js → 9837.6876cb5a9d3ad763.js} +2 -2
  30. package/out/static/client/{9837.2374d8bd425a9866.js.map → 9837.6876cb5a9d3ad763.js.map} +1 -1
  31. package/out/static/client/{9914.9b7171874efa4629.js → 9914.d49932c28ec56667.js} +2 -2
  32. package/out/static/client/{9914.9b7171874efa4629.js.map → 9914.d49932c28ec56667.js.map} +1 -1
  33. package/out/static/client/{index.dfccf913556b909a.js → index.0910bee955d71d1b.js} +5 -5
  34. package/out/static/client/index.0910bee955d71d1b.js.map +1 -0
  35. package/out/static/client/{runtime.05472639a6b3fea7.js → runtime.3216007ef48b58b9.js} +2 -2
  36. package/out/static/client/{runtime.05472639a6b3fea7.js.map → runtime.3216007ef48b58b9.js.map} +1 -1
  37. package/out/static/client/stats.json +112 -112
  38. package/out/static/client/{styles-global.1edda3f0378c4985.js → styles-global.5e83bb0f2c4c0268.js} +1 -1
  39. package/out/static/client/styles-global.a9d314985c899197.css +2 -0
  40. package/out/static/client/{styles-global.c9f2a49e47bf5c55.css.map → styles-global.a9d314985c899197.css.map} +1 -1
  41. package/out/static/legacy/asset-manifest.json +5 -5
  42. package/out/static/legacy/{index.c10af7d92675e9fd.html → index.bde4adba6f0cf3ac.html} +1 -1
  43. package/out/static/legacy/{index.4b9e35f28a890bda.js → index.e03b3082693746b6.js} +3 -3
  44. package/out/static/legacy/{index.4b9e35f28a890bda.js.map → index.e03b3082693746b6.js.map} +1 -1
  45. package/out/static/legacy/stats.json +10 -10
  46. package/out/static/legacy/{yari.2771217736dd92b4.js → yari.bd680acb6063d7c4.js} +3 -3
  47. package/out/static/legacy/{yari.2771217736dd92b4.js.map → yari.bd680acb6063d7c4.js.map} +1 -1
  48. package/out/static/ssr/index.js +10 -7
  49. package/out/static/ssr/index.js.map +1 -1
  50. package/out/static/ssr/stats.json +4 -4
  51. package/package.json +1 -1
  52. package/rspack.config.js +8 -7
  53. package/server.js +3 -3
  54. package/out/static/client/index.dfccf913556b909a.js.map +0 -1
  55. package/out/static/client/styles-global.c9f2a49e47bf5c55.css +0 -2
  56. /package/out/static/client/{370.85e6b0ff8596c5ae.js.LICENSE.txt → 370.d2e13711140af6d1.js.LICENSE.txt} +0 -0
  57. /package/out/static/client/{8093.81b1b345d454a85e.js.LICENSE.txt → 8093.b03f1cb1e8b0984a.js.LICENSE.txt} +0 -0
  58. /package/out/static/client/{9784.0096d3445a2a7e98.js.LICENSE.txt → 9784.214845ec6d3b77e3.js.LICENSE.txt} +0 -0
  59. /package/out/static/client/{index.dfccf913556b909a.js.LICENSE.txt → index.0910bee955d71d1b.js.LICENSE.txt} +0 -0
  60. /package/out/static/legacy/{index.4b9e35f28a890bda.js.LICENSE.txt → index.e03b3082693746b6.js.LICENSE.txt} +0 -0
  61. /package/out/static/legacy/{yari.2771217736dd92b4.js.LICENSE.txt → yari.bd680acb6063d7c4.js.LICENSE.txt} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"9837.2374d8bd425a9866.js","sources":["webpack://@mdn/fred/./components/observatory-results/element.css","webpack://@mdn/fred/./components/observatory-results/print.css?18a8","webpack://@mdn/fred/./components/observatory/assets/stars.svg","webpack://@mdn/fred/./components/observatory/assets/tooltip-arrow.svg","webpack://@mdn/fred/./components/observatory/constants.js","webpack://@mdn/fred/./components/observatory-results/csp.js","webpack://@mdn/fred/./components/observatory-results/element.js","webpack://@mdn/fred/./components/observatory-results/rating.js","webpack://@mdn/fred/./components/observatory-results/tooltip.js","webpack://@mdn/fred/./components/observatory-results/trend.js","webpack://@mdn/fred/./components/observatory-results/tabs.js","webpack://@mdn/fred/./components/observatory-results/scoring.js","webpack://@mdn/fred/./components/observatory-results/cookies.js","webpack://@mdn/fred/./components/observatory-results/raw-headers.js","webpack://@mdn/fred/./components/observatory-results/history.js","webpack://@mdn/fred/./components/observatory-results/comparison.js"],"sourcesContent":["import { css } from \"lit\";\n// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_0___ from \"-!../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[4].use[1]!../../build/loaders/fix-light-dark.js!../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[4].use[3]!../global/global.css\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_1___ from \"-!../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[4].use[1]!../../build/loaders/fix-light-dark.js!../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[4].use[3]!../visually-hidden/global.css\";\nimport ___CSS_LOADER_GET_URL_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/getUrl.js\";\nvar ___CSS_LOADER_URL_IMPORT_0___ = new URL(\"../observatory/assets/summary-icon.svg\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_1___ = new URL(\"../observatory/assets/results-icon.svg\", import.meta.url);\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_0___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_1___);\nvar ___CSS_LOADER_URL_REPLACEMENT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___);\nvar ___CSS_LOADER_URL_REPLACEMENT_1___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_1___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `:host{line-height:var(--font-line-content)}.scan-result{column-gap:2rem;display:grid;grid-template-areas:\"grade data actions\";grid-template-columns:auto 3fr 1fr;justify-content:space-between;max-width:var(--max-width)}.scan-result a{color:var(--color-text-primary)}.scan-result{background-color:var(--color-background-primary);border-radius:.3rem;margin-bottom:3rem;padding:2rem}@media (width <= 1200px){.scan-result{align-items:flex-start;grid-template-areas:\"grade data actions\";grid-template-columns:auto 1fr auto;justify-content:space-between;row-gap:calc(var(--spacing)/2)}}@media (width <= 992px){.scan-result{grid-template-areas:\"grade data \" \"grade actions\";grid-template-columns:min-content 1fr}}.trend{margin-top:1rem}.arrow-down{color:var(--observatory-arrow-down-color)}.arrow-up{color:var(--observatory-arrow-up-color)}h2{font-size:var(--font-size-large);font-weight:var(--font-weight-bold);margin-bottom:1rem;margin-top:1.5rem}h2:before{background-color:var(--color-text-primary);content:\"\";display:inline-block;-webkit-mask-position:left;mask-position:left;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}h2 .host{font-weight:var(--font-weight-normal)}h2.summary:before{height:1.4rem;-webkit-mask-image:url(${___CSS_LOADER_URL_REPLACEMENT_0___});mask-image:url(${___CSS_LOADER_URL_REPLACEMENT_0___});width:2rem}h2.result:before{height:1.2rem;-webkit-mask-image:url(${___CSS_LOADER_URL_REPLACEMENT_1___});mask-image:url(${___CSS_LOADER_URL_REPLACEMENT_1___});width:2rem}code{font-weight:var(--font-weight-bold)}.grade-trend{grid-area:grade;justify-self:start}.grade-trend .overall{position:relative}.data{grid-area:data}.actions{grid-area:actions}@media (width <= 992px){.actions{margin-top:1rem}}mdn-observatory-rescan-button{min-width:30rem}.info-tooltip{background:none;border:none;cursor:pointer;display:inline-block}.scan-another{font-size:var(--font-size-small);font-weight:var(--font-weight-normal);margin-top:1.2rem}.grade,.label{font-weight:var(--font-weight-bold)}.grade{background:var(--grade-bg);border:1px solid var(--grade-border);border-radius:.2em;color:var(--grade-border);display:inline-block;font-size:var(--font-size-large);height:5rem;line-height:5rem;text-align:center;width:5rem}.grade-a{--grade-bg:var(--observatory-grade-a-bg);--grade-border:var(--observatory-grade-a-border)}.grade-b{--grade-bg:var(--observatory-grade-b-bg);--grade-border:var(--observatory-grade-b-border)}.grade-c{--grade-bg:var(--observatory-grade-c-bg);--grade-border:var(--observatory-grade-c-border)}.grade-d{--grade-bg:var(--observatory-grade-d-bg);--grade-border:var(--observatory-grade-d-border)}.grade-f{--grade-bg:var(--observatory-grade-f-bg);--grade-border:var(--observatory-grade-f-border)}.tooltip-popup{--csstools-light-dark-toggle-fd181dce-0:var(--csstools-color-scheme--light) #696969;--color-tooltip:var(--csstools-light-dark-toggle-fd181dce-0,#b3b3b3);--csstools-light-dark-toggle-fd181dce-1:var(--csstools-color-scheme--light) #1b1b1b;--color-tooltip-highlight:var(--csstools-light-dark-toggle-fd181dce-1,#fff);--csstools-light-dark-toggle-fd181dce-2:var(--csstools-color-scheme--light) #fff;--color-bg-tooltip:var(--csstools-light-dark-toggle-fd181dce-2,#1b1b1b);background-color:var(--color-bg-tooltip);border-radius:var(--border-radius);border-width:0;color:var(--color-tooltip);inset:unset;left:50%;line-height:var(--font-line-content);margin-top:.5rem;max-width:min(100vw,20rem);overflow:visible;padding:1.5rem;position:absolute;text-align:center;transform:translateX(-50%);width:max-content;z-index:1}@supports (color:light-dark(red,red)){.tooltip-popup{--color-tooltip:light-dark(#b3b3b3,#696969);--color-tooltip-highlight:light-dark(#fff,#1b1b1b);--color-bg-tooltip:light-dark(#1b1b1b,#fff)}}@supports not (color:light-dark(tan,tan)){.tooltip-popup *{--csstools-light-dark-toggle-fd181dce-0:var(--csstools-color-scheme--light) #696969;--color-tooltip:var(--csstools-light-dark-toggle-fd181dce-0,#b3b3b3);--csstools-light-dark-toggle-fd181dce-1:var(--csstools-color-scheme--light) #1b1b1b;--color-tooltip-highlight:var(--csstools-light-dark-toggle-fd181dce-1,#fff);--csstools-light-dark-toggle-fd181dce-2:var(--csstools-color-scheme--light) #fff;--color-bg-tooltip:var(--csstools-light-dark-toggle-fd181dce-2,#1b1b1b)}}.tooltip-popup .arrow{margin-left:-1rem;margin-top:-2rem;padding:0;position:absolute;fill:var(--color-bg-tooltip)}.tooltip-popup table{border:0;border-collapse:collapse;white-space:nowrap;width:10rem}:is(.tooltip-popup table) tr{color:var(--color-tooltip);font-size:var(--font-size-small)}.current:is(:is(.tooltip-popup table) tr){color:var(--color-tooltip-highlight);font-weight:var(--font-weight-bold)}:is(.tooltip-popup table) td,:is(.tooltip-popup table) th{background-color:unset;border:0;font-weight:var(--font-body);text-align:left;width:50%}:is(.tooltip-popup table) th{font-size:var(--font-size-normal);padding:0 0 .75rem}:is(.tooltip-popup table) td{padding:0}:is(:is(.tooltip-popup table) td) svg{vertical-align:-.3rem}.scroll-container{margin-bottom:1.5rem;margin-top:.8rem;overflow-x:auto;overscroll-behavior-x:none}.detail-header{display:flex;gap:.5rem;padding:0 1.5rem 0 0}.detail-header .arrow{color:var(--color-text-secondary)}.detail-header .detail-header-title{font-weight:var(--font-weight-bold);padding-right:.2rem}.detail-header p{margin:1rem 0}:is(.obs-pass-icon svg.pass) path{fill:var(--observatory-pass-icon-bg)}:is(.obs-pass-icon svg.pass) circle{fill:var(--observatory-pass-icon-color)}:is(.obs-pass-icon svg.fail) path{fill:var(--observatory-fail-icon-bg)}:is(.obs-pass-icon svg.fail) circle{fill:var(--observatory-fail-icon-color)}.footnote{font-size:var(--font-size-small);margin-top:1rem}.scan-results table{background:var(--observatory-table-bg);border:none;border-collapse:collapse;min-width:calc(992px - 14rem);width:100%}:is(.scan-results table) th{background:var(--observatory-table-header-bg);color:var(--color-text-secondary);font-weight:500;vertical-align:top}:is(:is(.scan-results table) th) tr{background-color:unset}:is(.scan-results table) tr:nth-child(2n){background-color:var(--observatory-table-bg-alternate)}:is(.scan-results table) td{overflow-wrap:anywhere;padding:.5rem 1.5rem;vertical-align:top}.cookie-name:is(:is(.scan-results table) td):first-child{max-width:15rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.score:is(:is(.scan-results table) td)>span{display:flex;flex-direction:row;justify-content:space-between}:is(.scan-results table) a{color:var(--color-text-primary);-webkit-text-decoration:underline;text-decoration:underline;text-decoration-color:var(--color-text-secondary)}:is(:is(.scan-results table) a):active,:is(:is(.scan-results table) a):hover{-webkit-text-decoration:none;text-decoration:none}:is(.scan-results table) span.not-counted{color:var(--color-text-secondary)}:is(:is(.scan-results table) span.not-counted) a{-webkit-text-decoration:none;text-decoration:none}:is(.tests:is(.scan-results table) th,.tests:is(.scan-results table) td):first-of-type{width:25%}.tests:is(.scan-results table) td.score{white-space:nowrap}:is(.csp:is(.scan-results table) th,.csp:is(.scan-results table) td):first-of-type{width:45%}:is(.headers:is(.scan-results table) th,.headers:is(.scan-results table) td):first-of-type{width:30%}:is(.cookies:is(.scan-results table) th,.cookies:is(.scan-results table) td):nth-of-type(n+3){text-align:center}:is(.scan-results table) td,:is(.scan-results table) th{border:none;padding:1.5rem}:is(:is(.scan-results table) th,:is(.scan-results table) td) :first-child{margin-top:0}:is(:is(.scan-results table) th,:is(.scan-results table) td) :last-child{margin-bottom:0}:is(.scan-results table) .icon{height:1.3rem;width:1.3rem}@media (width <= 426px){:is(:is(:is(.scan-results table) td) .iso-date) code{font-size:x-small}}@media not print{@media (width <= 992px){.scan-results table{min-width:0}:is(.scan-results table) thead{display:none}:is(.scan-results table) tbody{display:block}:is(.scan-results table) tr{display:grid;grid-template-columns:max-content auto}:is(.scan-results table) tr:nth-of-type(odd){background:var(--observatory-table-header-bg)}:is(.scan-results table) td{column-gap:2em;display:grid;grid-auto-flow:column;grid-column:span 2;grid-template-columns:subgrid}:is(:is(.scan-results table) td) .humanized-duration{display:none}}:is(.scan-results table) td:before{content:attr(data-header);display:inline;font-weight:var(--font-weight-bold)}:is(.tests:is(.scan-results table),.csp:is(.scan-results table),.headers:is(.scan-results table),.cookies:is(.scan-results table)) td:first-of-type{width:auto}:is(.scan-results table) td:not(:last-of-type){padding-bottom:0}:is(.scan-results table) td:nth-of-type(n+2){padding-top:.75rem}.cookies:is(.scan-results table) td:nth-of-type(n+3){text-align:left}:is(.scan-results table) td.score{display:grid}:is(:is(.scan-results table) td.score)>span{display:block}:is(:is(.scan-results table) td.score) .obs-pass-icon{display:inline-block;height:1.5em;vertical-align:top}}ol.tabs-list{column-gap:3rem;display:grid;grid-template-areas:\"tab-0 tab-1 tab-2 tab-3 tab-4 tab-5 .\" \"hr hr hr hr hr hr hr \" \"mod mod mod mod mod mod mod\";grid-template-columns:repeat(6,max-content) 1fr;margin:0;overflow-x:auto;overscroll-behavior-x:none;padding:0}@media (width <= 992px){ol.tabs-list{column-gap:1.75rem;grid-template-columns:repeat(6,max-content) auto}}ol.tabs-list:before{border:none;border-top:1px solid var(--color-border-primary);content:\"\";grid-area:hr;margin:0;width:100%}ol.tabs-list input[type=radio]:not(:checked)~.tab-content{display:none}ol.tabs-list li.tabs-list-item{display:contents}:is(ol.tabs-list li.tabs-list-item)>input:checked+label{border-bottom:2px solid var(--observatory-accent);color:var(--color-text-primary)}:is(ol.tabs-list li.tabs-list-item)>input:not(:checked)+label:hover{border-bottom:2px solid var(--observatory-accent-light);color:var(--color-text-primary)}:is(ol.tabs-list li.tabs-list-item)>input:checked:focus-visible+label{outline-color:var(--accent-primary);outline-offset:1px;outline-style:auto}:is(ol.tabs-list li.tabs-list-item)>input:not(:checked)+label{color:var(--color-text-secondary);opacity:.775}:is(ol.tabs-list li.tabs-list-item)>label{cursor:pointer;height:2.2rem;width:max-content}#tabs-0:is(ol.tabs-list li.tabs-list-item)>input,#tabs-0:is(ol.tabs-list li.tabs-list-item)>label{grid-area:tab-0}#tabs-1:is(ol.tabs-list li.tabs-list-item)>input,#tabs-1:is(ol.tabs-list li.tabs-list-item)>label{grid-area:tab-1}#tabs-2:is(ol.tabs-list li.tabs-list-item)>input,#tabs-2:is(ol.tabs-list li.tabs-list-item)>label{grid-area:tab-2}#tabs-3:is(ol.tabs-list li.tabs-list-item)>input,#tabs-3:is(ol.tabs-list li.tabs-list-item)>label{grid-area:tab-3}#tabs-4:is(ol.tabs-list li.tabs-list-item)>input,#tabs-4:is(ol.tabs-list li.tabs-list-item)>label{grid-area:tab-4}#tabs-5:is(ol.tabs-list li.tabs-list-item)>input,#tabs-5:is(ol.tabs-list li.tabs-list-item)>label{grid-area:tab-5}:is(ol.tabs-list li.tabs-list-item)>section.tab-content{grid-area:mod;left:0;margin:0;position:sticky;width:calc(100vw - 18rem)}@media (1200px < width){:is(ol.tabs-list li.tabs-list-item)>section.tab-content{width:100%}}@media (width <= 769px){:is(ol.tabs-list li.tabs-list-item)>section.tab-content{width:calc(100vw - 2rem)}}@media print{.scan-result{grid-template-columns:1fr 3fr!important;padding:.5rem!important}.obs-pass-icon svg{height:1.5em!important;width:1.5em!important}.scroll-container{overflow:hidden!important}ol.tabs-list input[type=radio]:not(:checked)~.tab-content{display:block!important}ol.tabs-list input[type=radio]{display:none!important}li.tabs-list-item input:checked+label,li.tabs-list-item input:checked+label:hover,li.tabs-list-item input:checked:focus-visible+label,li.tabs-list-item input:not(:checked)+label,li.tabs-list-item input:not(:checked)+label:hover{color:var(--color-text-primary)!important;display:block!important;font-size:1.5rem!important;font-weight:700!important;-webkit-text-decoration:none!important;text-decoration:none!important}ol.tabs-list,ol.tabs-list li.tabs-list-item{display:block!important}td,th{padding:.5rem!important}}`, \"\"]);\n// Exports\nexport default css([___CSS_LOADER_EXPORT___.toString()]);\n","import { css } from \"lit\";\n// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `@media print{.observatory-results-wrapper{background-color:#fff!important;grid-template-columns:[full-start] minmax(0,1fr) [full-end]!important}.observatory-results{grid-area:full!important}.actions,.button-wrap,.observatory-results-toc,.page-layout__header,.page_layout__banner,.rescan-button{display:none!important}}`, \"\"]);\n// Exports\nexport default css([___CSS_LOADER_EXPORT___.toString()]);\n","import { svg } from \"lit\"; export default svg`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\" fill=\"none\" role=\"presentation\" viewBox=\"0 0 22 22\"><path fill=\"#DFD172\" d=\"m18 0-1.26 2.75L14 4l2.74 1.26L18 8l1.25-2.74L22 4l-2.75-1.25M8 3 5.5 8.5 0 11l5.5 2.5L8 19l2.5-5.5L16 11l-5.5-2.5M18 14l-1.26 2.74L14 18l2.74 1.25L18 22l1.25-2.75L22 18l-2.75-1.26\"/></svg>`;","import { svg } from \"lit\"; export default svg`<svg width=\"22\" height=\"22\" class=\"arrow\" role=\"presentation\" viewBox=\"0 0 22 22\"><path id=\"path1\" d=\"M12.124 1.733a1 1 0 0 1 1.673 0l8.811 13.423a1 1 0 0 1-.835 1.548l-17.614.007a1 1 0 0 1-.837-1.548Z\"/></svg>`;","/**\n * Scoring table for Observatory grades\n * @type {Array<{grade: string, scoreText: string, score: number, stars?: boolean}>}\n */\nconst SCORING_TABLE = [\n { grade: \"A+\", scoreText: \"100+\", score: 100, stars: true },\n { grade: \"A\", scoreText: \"90\", score: 90, stars: true },\n { grade: \"A-\", scoreText: \"85\", score: 85, stars: true },\n { grade: \"B+\", scoreText: \"80\", score: 80 },\n { grade: \"B\", scoreText: \"70\", score: 70 },\n { grade: \"B-\", scoreText: \"65\", score: 65 },\n { grade: \"C+\", scoreText: \"60\", score: 60 },\n { grade: \"C\", scoreText: \"50\", score: 50 },\n { grade: \"C-\", scoreText: \"45\", score: 45 },\n { grade: \"D+\", scoreText: \"40\", score: 40 },\n { grade: \"D\", scoreText: \"30\", score: 30 },\n { grade: \"D-\", scoreText: \"25\", score: 25 },\n { grade: \"F\", scoreText: \"0\", score: 0 },\n];\n\n/**\n * Maintain consistent test order.\n * @type {string[]}\n */\nconst TEST_NAMES_IN_ORDER = [\n \"content-security-policy\",\n \"cookies\",\n \"cross-origin-resource-sharing\",\n \"redirection\",\n \"referrer-policy\",\n \"strict-transport-security\",\n \"subresource-integrity\",\n \"x-content-type-options\",\n \"x-frame-options\",\n \"cross-origin-resource-policy\",\n];\n\n// Export the constants\nexport { SCORING_TABLE, TEST_NAMES_IN_ORDER };\n","import { html } from \"lit\";\n\nimport { PassIcon } from \"../observatory/utils.js\";\n\n/** @type {(keyof import(\"@observatory\").CSPPolicy)[]} */\nconst policyTests = [\n \"unsafeInline\",\n \"unsafeEval\",\n \"unsafeObjects\",\n \"unsafeInlineStyle\",\n \"insecureSchemeActive\",\n \"insecureSchemePassive\",\n \"antiClickjacking\",\n \"defaultNone\",\n \"insecureBaseUri\",\n \"insecureFormAction\",\n \"strictDynamic\",\n];\n\n// Policies where pass means bad\nconst negatedPolicies = new Set([\n \"insecureBaseUri\",\n \"insecureFormAction\",\n \"insecureSchemeActive\",\n \"insecureSchemePassive\",\n \"unsafeEval\",\n \"unsafeInline\",\n \"unsafeInlineStyle\",\n \"unsafeObjects\",\n]);\n\n/**\n *\n * @param {{result: import(\"@observatory\").Result}} props\n * @returns { import(\"@lit\").TemplateResult }\n */\nexport function CSP({ result }) {\n const policy = result.tests[\"content-security-policy\"]?.policy;\n const pass = result.tests[\"content-security-policy\"]?.pass || false;\n\n if (!policy) {\n if (\n result.tests[\"content-security-policy\"]?.result ===\n \"csp-not-implemented-but-reporting-enabled\"\n ) {\n return html`\n <table class=\"csp\">\n <tbody>\n <tr>\n <td>\n <p>\n <code>Content-Security-Policy-Report-Only</code> header\n detected. Implement an enforced policy; see\n <a href=\"/en-US/docs/Web/HTTP/CSP\" target=\"_blank\">\n MDN's Content Security Policy (CSP) documentation </a\n >.\n </p>\n </td>\n </tr>\n </tbody>\n </table>\n `;\n }\n\n return html`\n <table class=\"csp\">\n <tbody>\n <tr>\n <td>\n <p>No CSP headers detected</p>\n </td>\n </tr>\n </tbody>\n </table>\n `;\n }\n\n const rows = policyTests.map((pt) => {\n if (!policy[pt]) return null;\n /** @type {import(\"@observatory\").PolicyItem} */\n const p = policy[pt];\n\n return html`\n <tr>\n <td data-header=\"Test\" .innerHTML=${p.description}></td>\n <td data-header=\"Pass\">\n ${PassIcon({\n pass: negatedPolicies.has(pt) ? !p.pass : p.pass,\n })}\n </td>\n <td data-header=\"Info\" .innerHTML=${p.info}></td>\n </tr>\n `;\n });\n\n return html`\n <div class=\"detail-header\">\n <p class=\"arrow\">${PassIcon({ pass })}</p>\n <div\n class=\"detail-header-content\"\n .innerHTML=${result.tests[\"content-security-policy\"]\n ?.score_description ?? `<p class=\"obs-none\">None</p>`}\n ></div>\n </div>\n\n <table class=\"csp\">\n <thead>\n <tr>\n <th>Test</th>\n <th>Result</th>\n <th>Info</th>\n </tr>\n </thead>\n <tbody>\n ${rows}\n </tbody>\n </table>\n `;\n}\n","import { Task } from \"@lit/task\";\nimport { LitElement, html } from \"lit\";\nimport { nothing } from \"lit\";\n\nimport { OBSERVATORY_API_URL } from \"../env/index.js\";\n\nimport styles from \"./element.css?lit\";\nimport printStyles from \"./print.css?lit\";\nimport { Rating } from \"./rating.js\";\nimport { Tabs } from \"./tabs.js\";\n\nimport \"../../components/progress-bar/element.js\";\nimport \"../../components/observatory-comparison-table/element.js\";\nimport \"../../components/observatory-human-duration/element.js\";\n\nexport class MDNObservatoryResults extends LitElement {\n static styles = [styles, printStyles];\n\n constructor() {\n super();\n /** @type { string | null } */\n this.host = null;\n /** @type { number } */\n this.selectedTab = 0;\n /** @type { boolean } */\n this._usePostInApi = false;\n }\n\n /**\n * @type { import(\"@lit\").PropertyDeclarations }\n */\n static properties = {\n host: { type: String },\n selectedTab: { state: true, type: Number },\n _usePostInApi: { state: true, type: Boolean },\n };\n\n _apiTask = new Task(this, {\n args: () => [this.host],\n task: async ([host], { signal }) => {\n if (!host) {\n throw new Error(\"No host provided\");\n }\n try {\n const res = await fetch(\n `${OBSERVATORY_API_URL}/api/v2/analyze?host=${encodeURIComponent(\n host,\n )}`,\n { signal, method: this._usePostInApi ? \"POST\" : \"GET\" },\n );\n if (!res.ok) {\n let message = `${res.status}: ${res.statusText}`;\n try {\n const data = await res.json();\n if (data.error) {\n message = data.message;\n }\n } catch {\n // Ignore.\n }\n throw new Error(message);\n }\n return await res.json();\n } catch (error) {\n throw new Error(\"Observatory API request for scan data failed\", {\n cause: error,\n });\n }\n },\n });\n\n connectedCallback() {\n super.connectedCallback();\n this._updateSelectedTab = this._updateSelectedTab.bind(this);\n this.selectedTab = this._getSelectedTab();\n globalThis.addEventListener(\"hashchange\", this._updateSelectedTab);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n globalThis.removeEventListener(\"hashchange\", this._updateSelectedTab);\n }\n\n firstUpdated() {\n const params = new URLSearchParams(globalThis.location.search);\n this.host = params.get(\"host\");\n }\n\n _updateSelectedTab() {\n this.selectedTab = this._getSelectedTab();\n }\n\n /**\n * @returns {number}\n */\n _getSelectedTab() {\n const hash = globalThis.location.hash.replace(\"#\", \"\");\n const tabs = [\n \"scoring\",\n \"csp\",\n \"cookies\",\n \"headers\",\n \"history\",\n \"benchmark\",\n ];\n const index = tabs.indexOf(hash);\n return index === -1 ? 0 : index;\n }\n\n /**\n *\n * @param {Event} e\n */\n async _rescan(e) {\n e.preventDefault();\n if (!this.host) {\n return;\n }\n this._usePostInApi = true;\n this._apiTask.run();\n }\n\n /**\n *\n * @param {number} index\n * @param {string} key\n */\n _handleTabSelect(index, key) {\n this.selectedTab = index;\n globalThis.history.replaceState(\n \"\",\n \"\",\n globalThis.location.pathname + globalThis.location.search + \"#\" + key,\n );\n }\n\n render() {\n if (!this.host) {\n return nothing;\n }\n return this._apiTask.render({\n pending: () =>\n html` <label class=\"visually-hidden\" for=\"progress-bar\">\n Rescanning ${this.host} </label\n ><mdn-progress-bar id=\"progress-bar\"></mdn-progress-bar>`,\n\n complete: (data) => html`\n <section class=\"summary\">\n ${Rating({\n result: data,\n host: this.host || \"\",\n rescan: this._rescan,\n })}\n </section>\n <section class=\"results\">\n ${Tabs({\n result: data,\n selectedTab: this.selectedTab,\n onTabSelect: (index, key) => this._handleTabSelect(index, key),\n })}\n </section>\n </div>`,\n\n error: (e) => html`<div class=\"error\">${e}</div>`,\n });\n }\n}\n\ncustomElements.define(\"mdn-observatory-results\", MDNObservatoryResults);\n","import { html } from \"lit\";\n\nimport { formatMinus, hostAsRedirectChain } from \"../observatory/utils.js\";\n\nimport { Tooltip } from \"./tooltip.js\";\nimport { Trend } from \"./trend.js\";\n\nimport \"../observatory-rescan-button/element.js\";\nimport \"../dropdown/element.js\";\n\n/**\n *\n * @param {{result: import(\"@observatory\").Result, host: string, rescan: Function}} props\n * @returns {import(\"@lit\").TemplateResult}\n */\nexport function Rating({ result, host, rescan }) {\n return html`\n <h2 class=\"summary\">\n Scan summary:\n <span class=\"host\">${hostAsRedirectChain(host, result)}</span>\n </h2>\n <section class=\"scan-result\">\n <section class=\"grade-trend\">\n <div class=\"overall\">\n <mdn-dropdown>\n <button\n slot=\"button\"\n aria-label=\"show info tooltip\"\n class=\"info-tooltip\"\n tabindex=\"0\"\n >\n <div\n class=${`grade grade-${result.scan.grade?.[0]?.toLowerCase()}`}\n >\n ${formatMinus(result.scan.grade)}\n </div>\n </button>\n ${Tooltip(result)}\n </mdn-dropdown>\n </div>\n ${Trend({ result })}\n </section>\n <section class=\"data\">\n <div>\n <a href=\"/en-US/observatory/docs/tests_and_scoring\" target=\"_blank\">\n <span class=\"label\">Score</span></a\n >: ${result.scan.score}&thinsp;/&thinsp;100\n </div>\n <div>\n <a href=\"#history\"> <span class=\"label\">Scan Time</span></a\n >:\n <mdn-observatory-human-duration\n .date=${new Date(result.scan.scanned_at)}\n ></mdn-observatory-human-duration>\n </div>\n <a href=\"/en-US/observatory/docs/tests_and_scoring\" target=\"_blank\">\n <span class=\"label\">Tests Passed</span></a\n >: ${result.scan.tests_passed}&thinsp;/&thinsp;\n ${result.scan.tests_quantity}\n </section>\n <section class=\"actions\">\n <mdn-observatory-rescan-button\n .from=${new Date(result.scan.scanned_at)}\n .duration=${60}\n @click=${rescan}\n ></mdn-observatory-rescan-button>\n <div class=\"scan-another\">\n <a href=\"/en-US/observatory\"> Scan another website </a>\n </div>\n </section>\n </section>\n `;\n}\n","import { html } from \"lit\";\n\nimport starsSvg from \"../observatory/assets/stars.svg?lit\";\nimport arrowSvg from \"../observatory/assets/tooltip-arrow.svg?lit\";\nimport { SCORING_TABLE } from \"../observatory/constants.js\";\nimport { formatMinus } from \"../observatory/utils.js\";\n\n/**\n */\n\n/**\n *\n * @param {import(\"@observatory\").Result} result\n */\nexport function Tooltip(result) {\n const rows = SCORING_TABLE.map((st) => {\n return html`\n <tr class=${result.scan.grade === st.grade ? \"current\" : \"\"}>\n <td>${formatMinus(st.grade)}</td>\n <td>\n ${st.scoreText}\n ${result.scan.grade === st.grade && st.stars ? starsSvg : \"\"}\n </td>\n </tr>\n `;\n });\n\n return html`\n <div\n slot=\"dropdown\"\n id=\"grade-popover\"\n aria-describedby=\"grade-table\"\n class=\"tooltip-popup\"\n >\n ${arrowSvg}\n <table class=\"grade-tooltip\" id=\"grades-table\" role=\"tooltip\">\n <thead>\n <tr>\n <th>Grade</th>\n <th>Score</th>\n </tr>\n </thead>\n <tbody>\n ${rows}\n </tbody>\n </table>\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\n\n/**\n *\n * @param {{result: import(\"@observatory\").Result}} props\n * @returns {import(\"@lit\").TemplateResult | nothing}\n */\nexport function Trend({ result }) {\n switch (arrowState(result)) {\n case \"up\": {\n return html`\n <div class=\"trend\">\n <span class=\"arrow-up\" aria-hidden=\"true\"> ↗︎ </span>\n since last scan\n </div>\n `;\n }\n case \"down\": {\n return html`\n <div class=\"trend\">\n <span class=\"arrow-down\" aria-hidden=\"true\"> ↘︎ </span>\n since last scan\n </div>\n `;\n }\n default: {\n return nothing;\n }\n }\n}\n\n/**\n *\n * @param {import(\"@observatory\").Result} result\n * @returns {\"up\" | \"down\" | \"none\"}\n */\nfunction arrowState(result) {\n const [oldScore, oldGrade] =\n result.history.length > 0\n ? [result.history.at(-2)?.score, result.history.at(-2)?.grade]\n : [undefined, undefined];\n const newScore = result.scan.score;\n const newGrade = result.scan.grade;\n if (\n typeof newScore === \"number\" &&\n typeof oldScore === \"number\" &&\n newGrade !== oldGrade &&\n newScore !== oldScore\n ) {\n return oldScore < newScore ? \"up\" : \"down\";\n } else {\n return \"none\";\n }\n}\n","import { html } from \"lit\";\n\nimport { Comparison } from \"./comparison.js\";\nimport { Cookies } from \"./cookies.js\";\nimport { CSP } from \"./csp.js\";\nimport { History } from \"./history.js\";\nimport { RawHeaders } from \"./raw-headers.js\";\nimport { Scoring } from \"./scoring.js\";\n\n/**\n * @param {{\n * result: import(\"@observatory\").Result,\n * selectedTab: number,\n * onTabSelect: (index: number, key: string) => void\n * }} props\n * @returns {import(\"@lit\").TemplateResult}\n */\nexport function Tabs({ result, selectedTab = 0, onTabSelect }) {\n const tabs = [\n {\n label: \"Scoring\",\n key: \"scoring\",\n element: html`${Scoring({ result })}`,\n },\n {\n label: \"CSP analysis\",\n key: \"csp\",\n element: html`${CSP({ result })}`,\n },\n {\n label: \"Cookies\",\n key: \"cookies\",\n element: html`${Cookies({ result })}`,\n },\n {\n label: \"Raw server headers\",\n key: \"headers\",\n element: html`${RawHeaders({ result })}`,\n },\n {\n label: \"Scan history\",\n key: \"history\",\n element: html`${History({ result })}`,\n },\n {\n label: \"Benchmark comparison\",\n key: \"benchmark\",\n element: html`${Comparison({ result })}`,\n },\n ];\n\n const tabElements = tabs.map((tab, i) => {\n const onChange = () => onTabSelect(i, tab.key);\n return html`\n <li id=\"tabs-${i}\" class=\"tabs-list-item\">\n <input\n class=\"visually-hidden\"\n id=\"tab-${i}\"\n name=\"selected\"\n type=\"radio\"\n role=\"tab\"\n .checked=${i === selectedTab}\n aria-controls=\"tab-container-${i}\"\n @change=${onChange}\n />\n <label for=\"tab-${i}\" id=\"tab-label-${i}\">${tab.label}</label>\n <section\n class=\"tab-content\"\n role=\"tabpanel\"\n aria-labelledby=\"tab-label-${i}\"\n id=\"tab-container-${i}\"\n >\n <div class=\"scroll-container\">${tab.element}</div>\n </section>\n </li>\n `;\n });\n\n return html`\n <section class=\"scan-results\">\n <h2 class=\"result\" id=\"scan-results-header\">Scan results</h2>\n <ol\n class=\"tabs-list\"\n role=\"tablist\"\n aria-labelledby=\"scan-results-header\"\n >\n ${tabElements}\n </ol>\n </section>\n `;\n}\n","import { html } from \"lit\";\n\nimport { TEST_NAMES_IN_ORDER } from \"../observatory/constants.js\";\nimport { PassIcon, formatMinus } from \"../observatory/utils.js\";\n\n/**\n * @param {{overallScore: number, scoreModifier: number}} props\n * @returns {import(\"@lit\").TemplateResult}\n */\nfunction ScoreModifier({ overallScore, scoreModifier }) {\n const bonusEligible = overallScore >= 90;\n const formattedScoreModifier = formatMinus(\n `${scoreModifier > 0 ? `+${scoreModifier}` : scoreModifier}`,\n );\n\n return html`\n <span class=${!bonusEligible && scoreModifier > 0 ? \"not-counted\" : \"\"}>\n ${!bonusEligible && scoreModifier > 0\n ? html`0<sup><a href=\"#bonus-points-explanation\">*</a></sup>`\n : formattedScoreModifier}\n </span>\n `;\n}\n\n/**\n *\n * @param {{ result: import(\"@observatory\").Result}} result\n * @returns {import(\"@lit\").TemplateResult}\n */\nexport function Scoring({ result }) {\n const showFootnote =\n (result.scan.score || 0) <= 90 &&\n Object.entries(result.tests).find(([_n, t]) => t.score_modifier > 0);\n\n // empty case, should not happen\n if (Object.keys(result.tests).length === 0) {\n return html`No tests found.`;\n }\n\n const rows = TEST_NAMES_IN_ORDER.map((name) => {\n const test = result.tests[name];\n if (!test) return null;\n\n return html`\n <tr>\n <td data-header=\"Test\">\n <a\n href=${test.link}\n target=\"_blank\"\n rel=\"noreferrer\"\n class=${test.link.startsWith(\"/\") ? \"\" : \"external\"}\n >\n ${test.title}\n </a>\n </td>\n ${test.pass === null\n ? html`<td data-header=\"Score\">-</td>`\n : html` <td class=\"score\" data-header=\"Score\">\n <span>\n <span class=\"obs-score-value\">\n ${ScoreModifier({\n overallScore: result.scan.score || 0,\n scoreModifier: test.score_modifier,\n })}\n </span>\n ${PassIcon({ pass: test.pass })}\n </span>\n </td>`}\n <td data-header=\"Reason\" .innerHTML=${test.score_description}></td>\n <td\n data-header=\"Advice\"\n .innerHTML=${test.recommendation || `<p class=\"obs-none\">None</p>`}\n ></td>\n </tr>\n `;\n });\n\n return html`\n <table class=\"tests\">\n <thead>\n <tr>\n <th>Test</th>\n <th>Score</th>\n <th>Reason</th>\n <th>Recommendation</th>\n </tr>\n </thead>\n <tbody>\n ${rows}\n </tbody>\n </table>\n ${showFootnote\n ? html` <section class=\"footnote\" id=\"bonus-points-explanation\">\n <sup>*</sup> Normally awards bonus points, however, in this case they\n are not included in the overall score (\n <a href=\"/en-US/observatory/docs/tests_and_scoring\" target=\"_blank\">\n find out why\n </a>\n ).\n </section>`\n : null}\n `;\n}\n","import { html } from \"lit\";\n\nimport {\n CookiePrefix,\n PassIcon,\n Timestamp,\n upperCaseHeaderName,\n} from \"../observatory/utils.js\";\n\n/**\n *\n * @param {{result: import(\"@observatory\").Result}} props\n * @returns { import(\"@lit\").TemplateResult }\n */\nexport function Cookies({ result }) {\n const cookies = result.tests[\"cookies\"]?.data;\n const pass = result.tests[\"cookies\"]?.pass;\n\n if (!cookies || Object.keys(cookies).length === 0) {\n return html`\n <table class=\"cookies\">\n <tbody>\n <tr>\n <td>No cookies detected</td>\n </tr>\n </tbody>\n </table>\n `;\n }\n\n const rows = Object.entries(cookies).map(\n ([key, value]) => html`\n <tr>\n <td data-header=\"Name\" class=\"cookie-name\">${key}</td>\n <td data-header=\"Expires\">\n ${value.expires ? Timestamp({ expires: value.expires }) : \"Session\"}\n </td>\n <td data-header=\"Path\">\n <code>${value.path}</code>\n </td>\n <td data-header=\"Secure\">${PassIcon({ pass: value.secure })}</td>\n <td data-header=\"HttpOnly\">${PassIcon({ pass: value.httponly })}</td>\n <td data-header=\"SameSite\">\n ${value.samesite\n ? html`<code>${upperCaseHeaderName(value.samesite)}</code>`\n : \"-\"}\n </td>\n <td data-header=\"Prefixed\">${CookiePrefix({ cookieName: key })}</td>\n </tr>\n `,\n );\n\n return html`\n <div class=\"detail-header\">\n <p class=\"arrow\">\n ${PassIcon({ pass: pass === undefined ? null : pass })}\n </p>\n <div\n class=\"detail-header-content\"\n .innerHTML=${result.tests[\"cookies\"]?.score_description ??\n `<p class=\"obs-none\">None</p>`}\n ></div>\n </div>\n <table class=\"cookies\">\n <thead>\n <tr>\n <th>Name</th>\n <th>\n <a\n target=\"_blank\"\n href=\"/en-US/docs/Web/Security/Practical_implementation_guides/Cookies#expires\"\n >Expires</a\n >\n </th>\n <th>\n <a\n target=\"_blank\"\n href=\"/en-US/docs/Web/Security/Practical_implementation_guides/Cookies#path\"\n >Path</a\n >\n </th>\n <th>\n <a\n target=\"_blank\"\n href=\"/en-US/docs/Web/Security/Practical_implementation_guides/Cookies#secure\"\n >Secure</a\n >\n </th>\n <th>\n <a\n target=\"_blank\"\n href=\"/en-US/docs/Web/Security/Practical_implementation_guides/Cookies#httponly\"\n >HttpOnly</a\n >\n </th>\n <th>\n <a\n target=\"_blank\"\n href=\"/en-US/docs/Web/Security/Practical_implementation_guides/Cookies#samesite\"\n >SameSite</a\n >\n </th>\n <th>\n <a\n target=\"_blank\"\n href=\"/en-US/docs/Web/Security/Practical_implementation_guides/Cookies#name\"\n >Prefix</a\n >\n </th>\n </tr>\n </thead>\n <tbody>\n ${rows}\n </tbody>\n </table>\n `;\n}\n","import { html } from \"lit\";\n\nimport { headerLink } from \"../observatory/utils.js\";\n\nimport \"../observatory-header-link/element.js\";\n\n/**\n *\n * @param {{result: import(\"@observatory\").Result}} props\n * @returns { import(\"@lit\").TemplateResult }\n */\nexport function RawHeaders({ result }) {\n if (!result.scan.response_headers) {\n return html`\n <table class=\"headers\">\n <tbody>\n <tr>\n <td>No headers detected</td>\n </tr>\n </tbody>\n </table>\n `;\n }\n\n const rows = Object.entries(result.scan.response_headers).map(\n ([header, value]) => html`\n <tr>\n <td data-header=\"Header\">\n <mdn-observatory-header-link header=${header}>\n ${headerLink(header)}\n </mdn-observatory-header-link>\n </td>\n <td data-header=\"Value\">${value}</td>\n </tr>\n `,\n );\n\n return html`\n <table class=\"headers\">\n <thead>\n <tr>\n <th>Header</th>\n <th>Value</th>\n </tr>\n </thead>\n <tbody>\n ${rows}\n </tbody>\n </table>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport { formatDateTime, formatMinus } from \"../observatory/utils.js\";\n\n/**\n *\n * @param {{result: import(\"@observatory\").Result}} props\n * @returns { import(\"@lit\").TemplateResult | nothing }\n */\nexport function History({ result }) {\n if (result.history.length === 0) {\n return nothing;\n }\n\n const rows = [...result.history].reverse().map(\n ({ scanned_at, score, grade }) => html`\n <tr>\n <td data-header=\"Date\">${formatDateTime(new Date(scanned_at))}</td>\n <td data-header=\"Score\">${score}</td>\n <td data-header=\"Grade\">${formatMinus(grade)}</td>\n </tr>\n `,\n );\n\n return html`\n <h2>Changes in score over time</h2>\n <table class=\"history\">\n <thead>\n <tr>\n <th>Date</th>\n <th>Score</th>\n <th>Grade</th>\n </tr>\n </thead>\n <tbody>\n ${rows}\n </tbody>\n </table>\n `;\n}\n","import { html } from \"lit\";\n\n/**\n *\n * @param {{result: import(\"@observatory\").Result}} result\n * @returns { import(\"@lit\").TemplateResult }\n */\nexport function Comparison({ result }) {\n return html`\n <h2>Performance trends from the past year</h2>\n <mdn-observatory-comparison-table\n .result=${result}\n ></mdn-observatory-comparison-table>\n <p>\n Refer to this graph to assess the website's current status. By following\n the recommendations provided and rescanning, you can expect an improvement\n in the website's grade.\n </p>\n `;\n}\n"],"names":["Set","MDNObservatoryResults","String","Number","Boolean","Error","fetch","encodeURIComponent","globalThis","URLSearchParams","Date","Object","t","customElements"],"mappings":"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"}
1
+ {"version":3,"file":"9837.6876cb5a9d3ad763.js","sources":["webpack://@mdn/fred/./components/observatory-results/element.css","webpack://@mdn/fred/./components/observatory-results/print.css?18a8","webpack://@mdn/fred/./components/observatory/assets/stars.svg","webpack://@mdn/fred/./components/observatory/assets/tooltip-arrow.svg","webpack://@mdn/fred/./components/observatory/constants.js","webpack://@mdn/fred/./components/observatory-results/csp.js","webpack://@mdn/fred/./components/observatory-results/element.js","webpack://@mdn/fred/./components/observatory-results/rating.js","webpack://@mdn/fred/./components/observatory-results/tooltip.js","webpack://@mdn/fred/./components/observatory-results/trend.js","webpack://@mdn/fred/./components/observatory-results/tabs.js","webpack://@mdn/fred/./components/observatory-results/scoring.js","webpack://@mdn/fred/./components/observatory-results/cookies.js","webpack://@mdn/fred/./components/observatory-results/raw-headers.js","webpack://@mdn/fred/./components/observatory-results/history.js","webpack://@mdn/fred/./components/observatory-results/comparison.js"],"sourcesContent":["import { css } from \"lit\";\n// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_0___ from \"-!../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[4].use[1]!../../build/loaders/fix-light-dark.js!../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[4].use[3]!../global/global.css\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_1___ from \"-!../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[4].use[1]!../../build/loaders/fix-light-dark.js!../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[4].use[3]!../visually-hidden/global.css\";\nimport ___CSS_LOADER_GET_URL_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/getUrl.js\";\nvar ___CSS_LOADER_URL_IMPORT_0___ = new URL(\"../observatory/assets/summary-icon.svg\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_1___ = new URL(\"../observatory/assets/results-icon.svg\", import.meta.url);\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_0___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_1___);\nvar ___CSS_LOADER_URL_REPLACEMENT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___);\nvar ___CSS_LOADER_URL_REPLACEMENT_1___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_1___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `:host{line-height:var(--font-line-content)}.scan-result{column-gap:2rem;display:grid;grid-template-areas:\"grade data actions\";grid-template-columns:auto 3fr 1fr;justify-content:space-between;max-width:var(--max-width)}.scan-result a{color:var(--color-text-primary)}.scan-result{background-color:var(--color-background-primary);border-radius:.3rem;margin-bottom:3rem;padding:2rem}@media (width <= 1200px){.scan-result{align-items:flex-start;grid-template-areas:\"grade data actions\";grid-template-columns:auto 1fr auto;justify-content:space-between;row-gap:calc(var(--spacing)/2)}}@media (width <= 992px){.scan-result{grid-template-areas:\"grade data \" \"grade actions\";grid-template-columns:min-content 1fr}}.trend{margin-top:1rem}.arrow-down{color:var(--observatory-arrow-down-color)}.arrow-up{color:var(--observatory-arrow-up-color)}h2{font-size:var(--font-size-large);font-weight:var(--font-weight-bold);margin-bottom:1rem;margin-top:1.5rem}h2:before{background-color:var(--color-text-primary);content:\"\";display:inline-block;-webkit-mask-position:left;mask-position:left;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}h2 .host{font-weight:var(--font-weight-normal)}h2.summary:before{height:1.4rem;-webkit-mask-image:url(${___CSS_LOADER_URL_REPLACEMENT_0___});mask-image:url(${___CSS_LOADER_URL_REPLACEMENT_0___});width:2rem}h2.result:before{height:1.2rem;-webkit-mask-image:url(${___CSS_LOADER_URL_REPLACEMENT_1___});mask-image:url(${___CSS_LOADER_URL_REPLACEMENT_1___});width:2rem}code{font-weight:var(--font-weight-bold)}.grade-trend{grid-area:grade;justify-self:start}.grade-trend .overall{position:relative}.data{grid-area:data}.actions{grid-area:actions}@media (width <= 992px){.actions{margin-top:1rem}}mdn-observatory-rescan-button{min-width:30rem}.info-tooltip{background:none;border:none;cursor:pointer;display:inline-block}.scan-another{font-size:var(--font-size-small);font-weight:var(--font-weight-normal);margin-top:1.2rem}.grade,.label{font-weight:var(--font-weight-bold)}.grade{background:var(--grade-bg);border:1px solid var(--grade-border);border-radius:.2em;color:var(--grade-border);display:inline-block;font-size:var(--font-size-large);height:5rem;line-height:5rem;text-align:center;width:5rem}.grade-a{--grade-bg:var(--observatory-grade-a-bg);--grade-border:var(--observatory-grade-a-border)}.grade-b{--grade-bg:var(--observatory-grade-b-bg);--grade-border:var(--observatory-grade-b-border)}.grade-c{--grade-bg:var(--observatory-grade-c-bg);--grade-border:var(--observatory-grade-c-border)}.grade-d{--grade-bg:var(--observatory-grade-d-bg);--grade-border:var(--observatory-grade-d-border)}.grade-f{--grade-bg:var(--observatory-grade-f-bg);--grade-border:var(--observatory-grade-f-border)}.tooltip-popup{--csstools-light-dark-toggle-fd181dce-0:var(--csstools-color-scheme--light) #696969;--color-tooltip:var(--csstools-light-dark-toggle-fd181dce-0,#b3b3b3);--csstools-light-dark-toggle-fd181dce-1:var(--csstools-color-scheme--light) #1b1b1b;--color-tooltip-highlight:var(--csstools-light-dark-toggle-fd181dce-1,#fff);--csstools-light-dark-toggle-fd181dce-2:var(--csstools-color-scheme--light) #fff;--color-bg-tooltip:var(--csstools-light-dark-toggle-fd181dce-2,#1b1b1b);background-color:var(--color-bg-tooltip);border-radius:var(--border-radius);border-width:0;color:var(--color-tooltip);inset:unset;left:50%;line-height:var(--font-line-content);margin-top:.5rem;max-width:min(100vw,20rem);overflow:visible;padding:1.5rem;position:absolute;text-align:center;transform:translateX(-50%);width:max-content;z-index:1}@supports (color:light-dark(red,red)){.tooltip-popup{--color-tooltip:light-dark(#b3b3b3,#696969);--color-tooltip-highlight:light-dark(#fff,#1b1b1b);--color-bg-tooltip:light-dark(#1b1b1b,#fff)}}@supports not (color:light-dark(tan,tan)){.tooltip-popup *{--csstools-light-dark-toggle-fd181dce-0:var(--csstools-color-scheme--light) #696969;--color-tooltip:var(--csstools-light-dark-toggle-fd181dce-0,#b3b3b3);--csstools-light-dark-toggle-fd181dce-1:var(--csstools-color-scheme--light) #1b1b1b;--color-tooltip-highlight:var(--csstools-light-dark-toggle-fd181dce-1,#fff);--csstools-light-dark-toggle-fd181dce-2:var(--csstools-color-scheme--light) #fff;--color-bg-tooltip:var(--csstools-light-dark-toggle-fd181dce-2,#1b1b1b)}}.tooltip-popup .arrow{margin-left:-1rem;margin-top:-2rem;padding:0;position:absolute;fill:var(--color-bg-tooltip)}.tooltip-popup table{border:0;border-collapse:collapse;white-space:nowrap;width:10rem}:is(.tooltip-popup table) tr{color:var(--color-tooltip);font-size:var(--font-size-small)}.current:is(:is(.tooltip-popup table) tr){color:var(--color-tooltip-highlight);font-weight:var(--font-weight-bold)}:is(.tooltip-popup table) td,:is(.tooltip-popup table) th{background-color:unset;border:0;font-weight:var(--font-body);text-align:left;width:50%}:is(.tooltip-popup table) th{font-size:var(--font-size-normal);padding:0 0 .75rem}:is(.tooltip-popup table) td{padding:0}:is(:is(.tooltip-popup table) td) svg{vertical-align:-.3rem}.scroll-container{margin-bottom:1.5rem;margin-top:.8rem;overflow-x:auto;overscroll-behavior-x:none}.detail-header{display:flex;gap:.5rem;padding:0 1.5rem 0 0}.detail-header .arrow{color:var(--color-text-secondary)}.detail-header .detail-header-title{font-weight:var(--font-weight-bold);padding-right:.2rem}.detail-header p{margin:1rem 0}:is(.obs-pass-icon svg.pass) path{fill:var(--observatory-pass-icon-bg)}:is(.obs-pass-icon svg.pass) circle{fill:var(--observatory-pass-icon-color)}:is(.obs-pass-icon svg.fail) path{fill:var(--observatory-fail-icon-bg)}:is(.obs-pass-icon svg.fail) circle{fill:var(--observatory-fail-icon-color)}.footnote{font-size:var(--font-size-small);margin-top:1rem}.scan-results table{background:var(--observatory-table-bg);border:none;border-collapse:collapse;min-width:calc(992px - 14rem);width:100%}:is(.scan-results table) th{background:var(--observatory-table-header-bg);color:var(--color-text-secondary);font-weight:500;vertical-align:top}:is(:is(.scan-results table) th) tr{background-color:unset}:is(.scan-results table) tr:nth-child(2n){background-color:var(--observatory-table-bg-alternate)}:is(.scan-results table) td{overflow-wrap:anywhere;padding:.5rem 1.5rem;vertical-align:top}.cookie-name:is(:is(.scan-results table) td):first-child{max-width:15rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.score:is(:is(.scan-results table) td)>span{display:flex;flex-direction:row;justify-content:space-between}:is(.scan-results table) a{color:var(--color-text-primary);-webkit-text-decoration:underline;text-decoration:underline;text-decoration-color:var(--color-text-secondary)}:is(:is(.scan-results table) a):active,:is(:is(.scan-results table) a):hover{-webkit-text-decoration:none;text-decoration:none}:is(.scan-results table) span.not-counted{color:var(--color-text-secondary)}:is(:is(.scan-results table) span.not-counted) a{-webkit-text-decoration:none;text-decoration:none}:is(.tests:is(.scan-results table) th,.tests:is(.scan-results table) td):first-of-type{width:25%}.tests:is(.scan-results table) td.score{white-space:nowrap}:is(.csp:is(.scan-results table) th,.csp:is(.scan-results table) td):first-of-type{width:45%}:is(.headers:is(.scan-results table) th,.headers:is(.scan-results table) td):first-of-type{width:30%}:is(.cookies:is(.scan-results table) th,.cookies:is(.scan-results table) td):nth-of-type(n+3){text-align:center}:is(.scan-results table) td,:is(.scan-results table) th{border:none;padding:1.5rem}:is(:is(.scan-results table) th,:is(.scan-results table) td) :first-child{margin-top:0}:is(:is(.scan-results table) th,:is(.scan-results table) td) :last-child{margin-bottom:0}:is(.scan-results table) .icon{height:1.3rem;width:1.3rem}@media (width <= 426px){:is(:is(:is(.scan-results table) td) .iso-date) code{font-size:x-small}}@media not print{@media (width <= 992px){.scan-results table{min-width:0}:is(.scan-results table) thead{display:none}:is(.scan-results table) tbody{display:block}:is(.scan-results table) tr{display:grid;grid-template-columns:max-content auto}:is(.scan-results table) tr:nth-of-type(odd){background:var(--observatory-table-header-bg)}:is(.scan-results table) td{column-gap:2em;display:grid;grid-auto-flow:column;grid-column:span 2;grid-template-columns:subgrid}:is(:is(.scan-results table) td) .humanized-duration{display:none}}:is(.scan-results table) td:before{content:attr(data-header);display:inline;font-weight:var(--font-weight-bold)}:is(.tests:is(.scan-results table),.csp:is(.scan-results table),.headers:is(.scan-results table),.cookies:is(.scan-results table)) td:first-of-type{width:auto}:is(.scan-results table) td:not(:last-of-type){padding-bottom:0}:is(.scan-results table) td:nth-of-type(n+2){padding-top:.75rem}.cookies:is(.scan-results table) td:nth-of-type(n+3){text-align:left}:is(.scan-results table) td.score{display:grid}:is(:is(.scan-results table) td.score)>span{display:block}:is(:is(.scan-results table) td.score) .obs-pass-icon{display:inline-block;height:1.5em;vertical-align:top}}ol.tabs-list{column-gap:3rem;display:grid;grid-template-areas:\"tab-0 tab-1 tab-2 tab-3 tab-4 tab-5 .\" \"hr hr hr hr hr hr hr \" \"mod mod mod mod mod mod mod\";grid-template-columns:repeat(6,max-content) 1fr;margin:0;overflow-x:auto;overscroll-behavior-x:none;padding:0}@media (width <= 992px){ol.tabs-list{column-gap:1.75rem;grid-template-columns:repeat(6,max-content) auto}}ol.tabs-list:before{border:none;border-top:1px solid var(--color-border-primary);content:\"\";grid-area:hr;margin:0;width:100%}ol.tabs-list input[type=radio]:not(:checked)~.tab-content{display:none}ol.tabs-list li.tabs-list-item{display:contents}:is(ol.tabs-list li.tabs-list-item)>input:checked+label{border-bottom:2px solid var(--observatory-accent);color:var(--color-text-primary)}:is(ol.tabs-list li.tabs-list-item)>input:not(:checked)+label:hover{border-bottom:2px solid var(--observatory-accent-light);color:var(--color-text-primary)}:is(ol.tabs-list li.tabs-list-item)>input:checked:focus-visible+label{outline-color:var(--accent-primary);outline-offset:1px;outline-style:auto}:is(ol.tabs-list li.tabs-list-item)>input:not(:checked)+label{color:var(--color-text-secondary);opacity:.775}:is(ol.tabs-list li.tabs-list-item)>label{cursor:pointer;height:2.2rem;width:max-content}#tabs-0:is(ol.tabs-list li.tabs-list-item)>input,#tabs-0:is(ol.tabs-list li.tabs-list-item)>label{grid-area:tab-0}#tabs-1:is(ol.tabs-list li.tabs-list-item)>input,#tabs-1:is(ol.tabs-list li.tabs-list-item)>label{grid-area:tab-1}#tabs-2:is(ol.tabs-list li.tabs-list-item)>input,#tabs-2:is(ol.tabs-list li.tabs-list-item)>label{grid-area:tab-2}#tabs-3:is(ol.tabs-list li.tabs-list-item)>input,#tabs-3:is(ol.tabs-list li.tabs-list-item)>label{grid-area:tab-3}#tabs-4:is(ol.tabs-list li.tabs-list-item)>input,#tabs-4:is(ol.tabs-list li.tabs-list-item)>label{grid-area:tab-4}#tabs-5:is(ol.tabs-list li.tabs-list-item)>input,#tabs-5:is(ol.tabs-list li.tabs-list-item)>label{grid-area:tab-5}:is(ol.tabs-list li.tabs-list-item)>section.tab-content{grid-area:mod;left:0;margin:0;position:sticky;width:calc(100vw - 18rem)}@media (1200px < width){:is(ol.tabs-list li.tabs-list-item)>section.tab-content{width:100%}}@media (width <= 769px){:is(ol.tabs-list li.tabs-list-item)>section.tab-content{width:calc(100vw - 2rem)}}@media print{.scan-result{grid-template-columns:1fr 3fr!important;padding:.5rem!important}.obs-pass-icon svg{height:1.5em!important;width:1.5em!important}.scroll-container{overflow:hidden!important}ol.tabs-list input[type=radio]:not(:checked)~.tab-content{display:block!important}ol.tabs-list input[type=radio]{display:none!important}li.tabs-list-item input:checked+label,li.tabs-list-item input:checked+label:hover,li.tabs-list-item input:checked:focus-visible+label,li.tabs-list-item input:not(:checked)+label,li.tabs-list-item input:not(:checked)+label:hover{color:var(--color-text-primary)!important;display:block!important;font-size:1.5rem!important;font-weight:700!important;-webkit-text-decoration:none!important;text-decoration:none!important}ol.tabs-list,ol.tabs-list li.tabs-list-item{display:block!important}td,th{padding:.5rem!important}}`, \"\"]);\n// Exports\nexport default css([___CSS_LOADER_EXPORT___.toString()]);\n","import { css } from \"lit\";\n// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `@media print{.observatory-results-wrapper{background-color:#fff!important;grid-template-columns:[full-start] minmax(0,1fr) [full-end]!important}.observatory-results{grid-area:full!important}.actions,.button-wrap,.observatory-results-toc,.page-layout__header,.page_layout__banner,.rescan-button{display:none!important}}`, \"\"]);\n// Exports\nexport default css([___CSS_LOADER_EXPORT___.toString()]);\n","import { svg } from \"lit\"; export default svg`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\" fill=\"none\" role=\"presentation\" viewBox=\"0 0 22 22\"><path fill=\"#DFD172\" d=\"m18 0-1.26 2.75L14 4l2.74 1.26L18 8l1.25-2.74L22 4l-2.75-1.25M8 3 5.5 8.5 0 11l5.5 2.5L8 19l2.5-5.5L16 11l-5.5-2.5M18 14l-1.26 2.74L14 18l2.74 1.25L18 22l1.25-2.75L22 18l-2.75-1.26\"/></svg>`;","import { svg } from \"lit\"; export default svg`<svg width=\"22\" height=\"22\" class=\"arrow\" role=\"presentation\" viewBox=\"0 0 22 22\"><path id=\"path1\" d=\"M12.124 1.733a1 1 0 0 1 1.673 0l8.811 13.423a1 1 0 0 1-.835 1.548l-17.614.007a1 1 0 0 1-.837-1.548Z\"/></svg>`;","/**\n * Scoring table for Observatory grades\n * @type {Array<{grade: string, scoreText: string, score: number, stars?: boolean}>}\n */\nconst SCORING_TABLE = [\n { grade: \"A+\", scoreText: \"100+\", score: 100, stars: true },\n { grade: \"A\", scoreText: \"90\", score: 90, stars: true },\n { grade: \"A-\", scoreText: \"85\", score: 85, stars: true },\n { grade: \"B+\", scoreText: \"80\", score: 80 },\n { grade: \"B\", scoreText: \"70\", score: 70 },\n { grade: \"B-\", scoreText: \"65\", score: 65 },\n { grade: \"C+\", scoreText: \"60\", score: 60 },\n { grade: \"C\", scoreText: \"50\", score: 50 },\n { grade: \"C-\", scoreText: \"45\", score: 45 },\n { grade: \"D+\", scoreText: \"40\", score: 40 },\n { grade: \"D\", scoreText: \"30\", score: 30 },\n { grade: \"D-\", scoreText: \"25\", score: 25 },\n { grade: \"F\", scoreText: \"0\", score: 0 },\n];\n\n/**\n * Maintain consistent test order.\n * @type {string[]}\n */\nconst TEST_NAMES_IN_ORDER = [\n \"content-security-policy\",\n \"cookies\",\n \"cross-origin-resource-sharing\",\n \"redirection\",\n \"referrer-policy\",\n \"strict-transport-security\",\n \"subresource-integrity\",\n \"x-content-type-options\",\n \"x-frame-options\",\n \"cross-origin-resource-policy\",\n];\n\n// Export the constants\nexport { SCORING_TABLE, TEST_NAMES_IN_ORDER };\n","import { html } from \"lit\";\n\nimport { PassIcon } from \"../observatory/utils.js\";\n\n/** @type {(keyof import(\"@observatory\").CSPPolicy)[]} */\nconst policyTests = [\n \"unsafeInline\",\n \"unsafeEval\",\n \"unsafeObjects\",\n \"unsafeInlineStyle\",\n \"insecureSchemeActive\",\n \"insecureSchemePassive\",\n \"antiClickjacking\",\n \"defaultNone\",\n \"insecureBaseUri\",\n \"insecureFormAction\",\n \"strictDynamic\",\n];\n\n// Policies where pass means bad\nconst negatedPolicies = new Set([\n \"insecureBaseUri\",\n \"insecureFormAction\",\n \"insecureSchemeActive\",\n \"insecureSchemePassive\",\n \"unsafeEval\",\n \"unsafeInline\",\n \"unsafeInlineStyle\",\n \"unsafeObjects\",\n]);\n\n/**\n *\n * @param {{result: import(\"@observatory\").Result}} props\n * @returns { import(\"@lit\").TemplateResult }\n */\nexport function CSP({ result }) {\n const policy = result.tests[\"content-security-policy\"]?.policy;\n const pass = result.tests[\"content-security-policy\"]?.pass || false;\n\n if (!policy) {\n if (\n result.tests[\"content-security-policy\"]?.result ===\n \"csp-not-implemented-but-reporting-enabled\"\n ) {\n return html`\n <table class=\"csp\">\n <tbody>\n <tr>\n <td>\n <p>\n <code>Content-Security-Policy-Report-Only</code> header\n detected. Implement an enforced policy; see\n <a href=\"/en-US/docs/Web/HTTP/CSP\" target=\"_blank\">\n MDN's Content Security Policy (CSP) documentation </a\n >.\n </p>\n </td>\n </tr>\n </tbody>\n </table>\n `;\n }\n\n return html`\n <table class=\"csp\">\n <tbody>\n <tr>\n <td>\n <p>No CSP headers detected</p>\n </td>\n </tr>\n </tbody>\n </table>\n `;\n }\n\n const rows = policyTests.map((pt) => {\n if (!policy[pt]) return null;\n /** @type {import(\"@observatory\").PolicyItem} */\n const p = policy[pt];\n\n return html`\n <tr>\n <td data-header=\"Test\" .innerHTML=${p.description}></td>\n <td data-header=\"Pass\">\n ${PassIcon({\n pass: negatedPolicies.has(pt) ? !p.pass : p.pass,\n })}\n </td>\n <td data-header=\"Info\" .innerHTML=${p.info}></td>\n </tr>\n `;\n });\n\n return html`\n <div class=\"detail-header\">\n <p class=\"arrow\">${PassIcon({ pass })}</p>\n <div\n class=\"detail-header-content\"\n .innerHTML=${result.tests[\"content-security-policy\"]\n ?.score_description ?? `<p class=\"obs-none\">None</p>`}\n ></div>\n </div>\n\n <table class=\"csp\">\n <thead>\n <tr>\n <th>Test</th>\n <th>Result</th>\n <th>Info</th>\n </tr>\n </thead>\n <tbody>\n ${rows}\n </tbody>\n </table>\n `;\n}\n","import { Task } from \"@lit/task\";\nimport { LitElement, html } from \"lit\";\nimport { nothing } from \"lit\";\n\nimport { OBSERVATORY_API_URL } from \"../env/index.js\";\n\nimport styles from \"./element.css?lit\";\nimport printStyles from \"./print.css?lit\";\nimport { Rating } from \"./rating.js\";\nimport { Tabs } from \"./tabs.js\";\n\nimport \"../../components/progress-bar/element.js\";\nimport \"../../components/observatory-comparison-table/element.js\";\nimport \"../../components/observatory-human-duration/element.js\";\n\nexport class MDNObservatoryResults extends LitElement {\n static styles = [styles, printStyles];\n\n constructor() {\n super();\n /** @type { string | null } */\n this.host = null;\n /** @type { number } */\n this.selectedTab = 0;\n /** @type { boolean } */\n this._usePostInApi = false;\n }\n\n /**\n * @type { import(\"@lit\").PropertyDeclarations }\n */\n static properties = {\n host: { type: String },\n selectedTab: { state: true, type: Number },\n _usePostInApi: { state: true, type: Boolean },\n };\n\n _apiTask = new Task(this, {\n args: () => [this.host],\n task: async ([host], { signal }) => {\n if (!host) {\n throw new Error(\"No host provided\");\n }\n try {\n const res = await fetch(\n `${OBSERVATORY_API_URL}/api/v2/analyze?host=${encodeURIComponent(\n host,\n )}`,\n { signal, method: this._usePostInApi ? \"POST\" : \"GET\" },\n );\n if (!res.ok) {\n let message = `${res.status}: ${res.statusText}`;\n try {\n const data = await res.json();\n if (data.error) {\n message = data.message;\n }\n } catch {\n // Ignore.\n }\n throw new Error(message);\n }\n return await res.json();\n } catch (error) {\n throw new Error(\"Observatory API request for scan data failed\", {\n cause: error,\n });\n }\n },\n });\n\n connectedCallback() {\n super.connectedCallback();\n this._updateSelectedTab = this._updateSelectedTab.bind(this);\n this.selectedTab = this._getSelectedTab();\n globalThis.addEventListener(\"hashchange\", this._updateSelectedTab);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n globalThis.removeEventListener(\"hashchange\", this._updateSelectedTab);\n }\n\n firstUpdated() {\n const params = new URLSearchParams(globalThis.location.search);\n this.host = params.get(\"host\");\n }\n\n _updateSelectedTab() {\n this.selectedTab = this._getSelectedTab();\n }\n\n /**\n * @returns {number}\n */\n _getSelectedTab() {\n const hash = globalThis.location.hash.replace(\"#\", \"\");\n const tabs = [\n \"scoring\",\n \"csp\",\n \"cookies\",\n \"headers\",\n \"history\",\n \"benchmark\",\n ];\n const index = tabs.indexOf(hash);\n return index === -1 ? 0 : index;\n }\n\n /**\n *\n * @param {Event} e\n */\n async _rescan(e) {\n e.preventDefault();\n if (!this.host) {\n return;\n }\n this._usePostInApi = true;\n this._apiTask.run();\n }\n\n /**\n *\n * @param {number} index\n * @param {string} key\n */\n _handleTabSelect(index, key) {\n this.selectedTab = index;\n globalThis.history.replaceState(\n \"\",\n \"\",\n globalThis.location.pathname + globalThis.location.search + \"#\" + key,\n );\n }\n\n render() {\n if (!this.host) {\n return nothing;\n }\n return this._apiTask.render({\n pending: () =>\n html` <label class=\"visually-hidden\" for=\"progress-bar\">\n Rescanning ${this.host} </label\n ><mdn-progress-bar id=\"progress-bar\"></mdn-progress-bar>`,\n\n complete: (data) => html`\n <section class=\"summary\">\n ${Rating({\n result: data,\n host: this.host || \"\",\n rescan: this._rescan,\n })}\n </section>\n <section class=\"results\">\n ${Tabs({\n result: data,\n selectedTab: this.selectedTab,\n onTabSelect: (index, key) => this._handleTabSelect(index, key),\n })}\n </section>\n </div>`,\n\n error: (e) => html`<div class=\"error\">${e}</div>`,\n });\n }\n}\n\ncustomElements.define(\"mdn-observatory-results\", MDNObservatoryResults);\n","import { html } from \"lit\";\n\nimport { formatMinus, hostAsRedirectChain } from \"../observatory/utils.js\";\n\nimport { Tooltip } from \"./tooltip.js\";\nimport { Trend } from \"./trend.js\";\n\nimport \"../observatory-rescan-button/element.js\";\nimport \"../dropdown/element.js\";\n\n/**\n *\n * @param {{result: import(\"@observatory\").Result, host: string, rescan: Function}} props\n * @returns {import(\"@lit\").TemplateResult}\n */\nexport function Rating({ result, host, rescan }) {\n return html`\n <h2 class=\"summary\">\n Scan summary:\n <span class=\"host\">${hostAsRedirectChain(host, result)}</span>\n </h2>\n <section class=\"scan-result\">\n <section class=\"grade-trend\">\n <div class=\"overall\">\n <mdn-dropdown>\n <button\n slot=\"button\"\n aria-label=\"show info tooltip\"\n class=\"info-tooltip\"\n tabindex=\"0\"\n >\n <div\n class=${`grade grade-${result.scan.grade?.[0]?.toLowerCase()}`}\n >\n ${formatMinus(result.scan.grade)}\n </div>\n </button>\n ${Tooltip(result)}\n </mdn-dropdown>\n </div>\n ${Trend({ result })}\n </section>\n <section class=\"data\">\n <div>\n <a href=\"/en-US/observatory/docs/tests_and_scoring\" target=\"_blank\">\n <span class=\"label\">Score</span></a\n >: ${result.scan.score}&thinsp;/&thinsp;100\n </div>\n <div>\n <a href=\"#history\"> <span class=\"label\">Scan Time</span></a\n >:\n <mdn-observatory-human-duration\n .date=${new Date(result.scan.scanned_at)}\n ></mdn-observatory-human-duration>\n </div>\n <a href=\"/en-US/observatory/docs/tests_and_scoring\" target=\"_blank\">\n <span class=\"label\">Tests Passed</span></a\n >: ${result.scan.tests_passed}&thinsp;/&thinsp;\n ${result.scan.tests_quantity}\n </section>\n <section class=\"actions\">\n <mdn-observatory-rescan-button\n .from=${new Date(result.scan.scanned_at)}\n .duration=${60}\n @click=${rescan}\n ></mdn-observatory-rescan-button>\n <div class=\"scan-another\">\n <a href=\"/en-US/observatory\"> Scan another website </a>\n </div>\n </section>\n </section>\n `;\n}\n","import { html } from \"lit\";\n\nimport starsSvg from \"../observatory/assets/stars.svg?lit\";\nimport arrowSvg from \"../observatory/assets/tooltip-arrow.svg?lit\";\nimport { SCORING_TABLE } from \"../observatory/constants.js\";\nimport { formatMinus } from \"../observatory/utils.js\";\n\n/**\n */\n\n/**\n *\n * @param {import(\"@observatory\").Result} result\n */\nexport function Tooltip(result) {\n const rows = SCORING_TABLE.map((st) => {\n return html`\n <tr class=${result.scan.grade === st.grade ? \"current\" : \"\"}>\n <td>${formatMinus(st.grade)}</td>\n <td>\n ${st.scoreText}\n ${result.scan.grade === st.grade && st.stars ? starsSvg : \"\"}\n </td>\n </tr>\n `;\n });\n\n return html`\n <div\n slot=\"dropdown\"\n id=\"grade-popover\"\n aria-describedby=\"grade-table\"\n class=\"tooltip-popup\"\n >\n ${arrowSvg}\n <table class=\"grade-tooltip\" id=\"grades-table\" role=\"tooltip\">\n <thead>\n <tr>\n <th>Grade</th>\n <th>Score</th>\n </tr>\n </thead>\n <tbody>\n ${rows}\n </tbody>\n </table>\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\n\n/**\n *\n * @param {{result: import(\"@observatory\").Result}} props\n * @returns {import(\"@lit\").TemplateResult | nothing}\n */\nexport function Trend({ result }) {\n switch (arrowState(result)) {\n case \"up\": {\n return html`\n <div class=\"trend\">\n <span class=\"arrow-up\" aria-hidden=\"true\"> ↗︎ </span>\n since last scan\n </div>\n `;\n }\n case \"down\": {\n return html`\n <div class=\"trend\">\n <span class=\"arrow-down\" aria-hidden=\"true\"> ↘︎ </span>\n since last scan\n </div>\n `;\n }\n default: {\n return nothing;\n }\n }\n}\n\n/**\n *\n * @param {import(\"@observatory\").Result} result\n * @returns {\"up\" | \"down\" | \"none\"}\n */\nfunction arrowState(result) {\n const [oldScore, oldGrade] =\n result.history.length > 0\n ? [result.history.at(-2)?.score, result.history.at(-2)?.grade]\n : [undefined, undefined];\n const newScore = result.scan.score;\n const newGrade = result.scan.grade;\n if (\n typeof newScore === \"number\" &&\n typeof oldScore === \"number\" &&\n newGrade !== oldGrade &&\n newScore !== oldScore\n ) {\n return oldScore < newScore ? \"up\" : \"down\";\n } else {\n return \"none\";\n }\n}\n","import { html } from \"lit\";\n\nimport { Comparison } from \"./comparison.js\";\nimport { Cookies } from \"./cookies.js\";\nimport { CSP } from \"./csp.js\";\nimport { History } from \"./history.js\";\nimport { RawHeaders } from \"./raw-headers.js\";\nimport { Scoring } from \"./scoring.js\";\n\n/**\n * @param {{\n * result: import(\"@observatory\").Result,\n * selectedTab: number,\n * onTabSelect: (index: number, key: string) => void\n * }} props\n * @returns {import(\"@lit\").TemplateResult}\n */\nexport function Tabs({ result, selectedTab = 0, onTabSelect }) {\n const tabs = [\n {\n label: \"Scoring\",\n key: \"scoring\",\n element: html`${Scoring({ result })}`,\n },\n {\n label: \"CSP analysis\",\n key: \"csp\",\n element: html`${CSP({ result })}`,\n },\n {\n label: \"Cookies\",\n key: \"cookies\",\n element: html`${Cookies({ result })}`,\n },\n {\n label: \"Raw server headers\",\n key: \"headers\",\n element: html`${RawHeaders({ result })}`,\n },\n {\n label: \"Scan history\",\n key: \"history\",\n element: html`${History({ result })}`,\n },\n {\n label: \"Benchmark comparison\",\n key: \"benchmark\",\n element: html`${Comparison({ result })}`,\n },\n ];\n\n const tabElements = tabs.map((tab, i) => {\n const onChange = () => onTabSelect(i, tab.key);\n return html`\n <li id=\"tabs-${i}\" class=\"tabs-list-item\">\n <input\n class=\"visually-hidden\"\n id=\"tab-${i}\"\n name=\"selected\"\n type=\"radio\"\n role=\"tab\"\n .checked=${i === selectedTab}\n aria-controls=\"tab-container-${i}\"\n @change=${onChange}\n />\n <label for=\"tab-${i}\" id=\"tab-label-${i}\">${tab.label}</label>\n <section\n class=\"tab-content\"\n role=\"tabpanel\"\n aria-labelledby=\"tab-label-${i}\"\n id=\"tab-container-${i}\"\n >\n <div class=\"scroll-container\">${tab.element}</div>\n </section>\n </li>\n `;\n });\n\n return html`\n <section class=\"scan-results\">\n <h2 class=\"result\" id=\"scan-results-header\">Scan results</h2>\n <ol\n class=\"tabs-list\"\n role=\"tablist\"\n aria-labelledby=\"scan-results-header\"\n >\n ${tabElements}\n </ol>\n </section>\n `;\n}\n","import { html } from \"lit\";\n\nimport { TEST_NAMES_IN_ORDER } from \"../observatory/constants.js\";\nimport { PassIcon, formatMinus } from \"../observatory/utils.js\";\n\n/**\n * @param {{overallScore: number, scoreModifier: number}} props\n * @returns {import(\"@lit\").TemplateResult}\n */\nfunction ScoreModifier({ overallScore, scoreModifier }) {\n const bonusEligible = overallScore >= 90;\n const formattedScoreModifier = formatMinus(\n `${scoreModifier > 0 ? `+${scoreModifier}` : scoreModifier}`,\n );\n\n return html`\n <span class=${!bonusEligible && scoreModifier > 0 ? \"not-counted\" : \"\"}>\n ${!bonusEligible && scoreModifier > 0\n ? html`0<sup><a href=\"#bonus-points-explanation\">*</a></sup>`\n : formattedScoreModifier}\n </span>\n `;\n}\n\n/**\n *\n * @param {{ result: import(\"@observatory\").Result}} result\n * @returns {import(\"@lit\").TemplateResult}\n */\nexport function Scoring({ result }) {\n const showFootnote =\n (result.scan.score || 0) <= 90 &&\n Object.entries(result.tests).find(([_n, t]) => t.score_modifier > 0);\n\n // empty case, should not happen\n if (Object.keys(result.tests).length === 0) {\n return html`No tests found.`;\n }\n\n const rows = TEST_NAMES_IN_ORDER.map((name) => {\n const test = result.tests[name];\n if (!test) return null;\n\n return html`\n <tr>\n <td data-header=\"Test\">\n <a\n href=${test.link}\n target=\"_blank\"\n rel=\"noreferrer\"\n class=${test.link.startsWith(\"/\") ? \"\" : \"external\"}\n >\n ${test.title}\n </a>\n </td>\n ${test.pass === null\n ? html`<td data-header=\"Score\">-</td>`\n : html` <td class=\"score\" data-header=\"Score\">\n <span>\n <span class=\"obs-score-value\">\n ${ScoreModifier({\n overallScore: result.scan.score || 0,\n scoreModifier: test.score_modifier,\n })}\n </span>\n ${PassIcon({ pass: test.pass })}\n </span>\n </td>`}\n <td data-header=\"Reason\" .innerHTML=${test.score_description}></td>\n <td\n data-header=\"Advice\"\n .innerHTML=${test.recommendation || `<p class=\"obs-none\">None</p>`}\n ></td>\n </tr>\n `;\n });\n\n return html`\n <table class=\"tests\">\n <thead>\n <tr>\n <th>Test</th>\n <th>Score</th>\n <th>Reason</th>\n <th>Recommendation</th>\n </tr>\n </thead>\n <tbody>\n ${rows}\n </tbody>\n </table>\n ${showFootnote\n ? html` <section class=\"footnote\" id=\"bonus-points-explanation\">\n <sup>*</sup> Normally awards bonus points, however, in this case they\n are not included in the overall score (\n <a href=\"/en-US/observatory/docs/tests_and_scoring\" target=\"_blank\">\n find out why\n </a>\n ).\n </section>`\n : null}\n `;\n}\n","import { html } from \"lit\";\n\nimport {\n CookiePrefix,\n PassIcon,\n Timestamp,\n upperCaseHeaderName,\n} from \"../observatory/utils.js\";\n\n/**\n *\n * @param {{result: import(\"@observatory\").Result}} props\n * @returns { import(\"@lit\").TemplateResult }\n */\nexport function Cookies({ result }) {\n const cookies = result.tests[\"cookies\"]?.data;\n const pass = result.tests[\"cookies\"]?.pass;\n\n if (!cookies || Object.keys(cookies).length === 0) {\n return html`\n <table class=\"cookies\">\n <tbody>\n <tr>\n <td>No cookies detected</td>\n </tr>\n </tbody>\n </table>\n `;\n }\n\n const rows = Object.entries(cookies).map(\n ([key, value]) => html`\n <tr>\n <td data-header=\"Name\" class=\"cookie-name\">${key}</td>\n <td data-header=\"Expires\">\n ${value.expires ? Timestamp({ expires: value.expires }) : \"Session\"}\n </td>\n <td data-header=\"Path\">\n <code>${value.path}</code>\n </td>\n <td data-header=\"Secure\">${PassIcon({ pass: value.secure })}</td>\n <td data-header=\"HttpOnly\">${PassIcon({ pass: value.httponly })}</td>\n <td data-header=\"SameSite\">\n ${value.samesite\n ? html`<code>${upperCaseHeaderName(value.samesite)}</code>`\n : \"-\"}\n </td>\n <td data-header=\"Prefixed\">${CookiePrefix({ cookieName: key })}</td>\n </tr>\n `,\n );\n\n return html`\n <div class=\"detail-header\">\n <p class=\"arrow\">\n ${PassIcon({ pass: pass === undefined ? null : pass })}\n </p>\n <div\n class=\"detail-header-content\"\n .innerHTML=${result.tests[\"cookies\"]?.score_description ??\n `<p class=\"obs-none\">None</p>`}\n ></div>\n </div>\n <table class=\"cookies\">\n <thead>\n <tr>\n <th>Name</th>\n <th>\n <a\n target=\"_blank\"\n href=\"/en-US/docs/Web/Security/Practical_implementation_guides/Cookies#expires\"\n >Expires</a\n >\n </th>\n <th>\n <a\n target=\"_blank\"\n href=\"/en-US/docs/Web/Security/Practical_implementation_guides/Cookies#path\"\n >Path</a\n >\n </th>\n <th>\n <a\n target=\"_blank\"\n href=\"/en-US/docs/Web/Security/Practical_implementation_guides/Cookies#secure\"\n >Secure</a\n >\n </th>\n <th>\n <a\n target=\"_blank\"\n href=\"/en-US/docs/Web/Security/Practical_implementation_guides/Cookies#httponly\"\n >HttpOnly</a\n >\n </th>\n <th>\n <a\n target=\"_blank\"\n href=\"/en-US/docs/Web/Security/Practical_implementation_guides/Cookies#samesite\"\n >SameSite</a\n >\n </th>\n <th>\n <a\n target=\"_blank\"\n href=\"/en-US/docs/Web/Security/Practical_implementation_guides/Cookies#name\"\n >Prefix</a\n >\n </th>\n </tr>\n </thead>\n <tbody>\n ${rows}\n </tbody>\n </table>\n `;\n}\n","import { html } from \"lit\";\n\nimport { headerLink } from \"../observatory/utils.js\";\n\nimport \"../observatory-header-link/element.js\";\n\n/**\n *\n * @param {{result: import(\"@observatory\").Result}} props\n * @returns { import(\"@lit\").TemplateResult }\n */\nexport function RawHeaders({ result }) {\n if (!result.scan.response_headers) {\n return html`\n <table class=\"headers\">\n <tbody>\n <tr>\n <td>No headers detected</td>\n </tr>\n </tbody>\n </table>\n `;\n }\n\n const rows = Object.entries(result.scan.response_headers).map(\n ([header, value]) => html`\n <tr>\n <td data-header=\"Header\">\n <mdn-observatory-header-link header=${header}>\n ${headerLink(header)}\n </mdn-observatory-header-link>\n </td>\n <td data-header=\"Value\">${value}</td>\n </tr>\n `,\n );\n\n return html`\n <table class=\"headers\">\n <thead>\n <tr>\n <th>Header</th>\n <th>Value</th>\n </tr>\n </thead>\n <tbody>\n ${rows}\n </tbody>\n </table>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport { formatDateTime, formatMinus } from \"../observatory/utils.js\";\n\n/**\n *\n * @param {{result: import(\"@observatory\").Result}} props\n * @returns { import(\"@lit\").TemplateResult | nothing }\n */\nexport function History({ result }) {\n if (result.history.length === 0) {\n return nothing;\n }\n\n const rows = [...result.history].reverse().map(\n ({ scanned_at, score, grade }) => html`\n <tr>\n <td data-header=\"Date\">${formatDateTime(new Date(scanned_at))}</td>\n <td data-header=\"Score\">${score}</td>\n <td data-header=\"Grade\">${formatMinus(grade)}</td>\n </tr>\n `,\n );\n\n return html`\n <h2>Changes in score over time</h2>\n <table class=\"history\">\n <thead>\n <tr>\n <th>Date</th>\n <th>Score</th>\n <th>Grade</th>\n </tr>\n </thead>\n <tbody>\n ${rows}\n </tbody>\n </table>\n `;\n}\n","import { html } from \"lit\";\n\n/**\n *\n * @param {{result: import(\"@observatory\").Result}} result\n * @returns { import(\"@lit\").TemplateResult }\n */\nexport function Comparison({ result }) {\n return html`\n <h2>Performance trends from the past year</h2>\n <mdn-observatory-comparison-table\n .result=${result}\n ></mdn-observatory-comparison-table>\n <p>\n Refer to this graph to assess the website's current status. By following\n the recommendations provided and rescanning, you can expect an improvement\n in the website's grade.\n </p>\n `;\n}\n"],"names":["Set","MDNObservatoryResults","String","Number","Boolean","Error","fetch","encodeURIComponent","globalThis","URLSearchParams","Date","Object","t","customElements"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- export const __webpack_id__="9914";export const __webpack_ids__=["9914"];export const __webpack_modules__={10632:function(e,t,s){s.d(t,{A:()=>l});var a=s(63819),n=s(31601),i=s.n(n),r=s(76314),o=s.n(r)()(i());o.push([e.id,"iframe{border:none;box-sizing:initial;height:100%;width:100%}",""]);let l=(0,a.AH)([o.toString()])},86129:function(e,t,s){s.r(t),s.d(t,{MDNPlayRunner:()=>MDNPlayRunner});var a=s(64889),n=s(63819),i=s(62963),r=s(70209),o=s(69392),l=s(93957),c=s(79097),d=s(45842),h=s(10632);let MDNPlayRunner=class MDNPlayRunner extends n.WF{static ssr=!1;static properties={code:{type:Object},defaults:{type:String},srcPrefix:{type:String,attribute:"src-prefix"},allow:{type:String},sandbox:{type:String},_src:{state:!0}};static styles=h.A;constructor(){super(),this.theme=new l.W(this),this.code=void 0,this.defaults=void 0,this.srcPrefix=void 0,this.allow=void 0,this.sandbox=void 0,this._subdomain=crypto.randomUUID(),this.ready=new Promise(e=>{this._resolveReady=()=>e(!0)}),this._src="about:blank"}_iframe=(0,o._)();_onMessage({data:{typ:e,prop:t,args:s,uuid:a},origin:n}){a||(a=new URL(n,"https://example.com").hostname.split(".")[0]),a===this._subdomain&&("console"===e?this.dispatchEvent(new CustomEvent("console",{bubbles:!0,composed:!0,detail:{prop:t,args:s}})):"ready"===e&&this._resolveReady())}_updateSrc=new a.YZ(this,{args:()=>[this.code,this.defaults,this.theme.value,this.srcPrefix],task:async([e,t,s,a],{signal:n})=>{if(e&&e.js&&e.wat){let t=await u(e.wat);e.js=e.js.replace("{%wasm-url%}",t)}let{state:i}=await (0,d.$)(JSON.stringify({html:e?.html||"",css:e?.css||"",js:e?.js||"",defaults:t,theme:s})),r=(a||"").replace(/\/$/,"");n.throwIfAborted();let o=new URL(`${r}/runner.html`,c.sR?location.origin.replace("3000","3001"):`${location.protocol}//${this._subdomain}.${c.tf}`);o.searchParams.set("uuid",this._subdomain),o.searchParams.set("state",i),this._src=o.href,this.dispatchEvent(new CustomEvent("mdn-play-runner-src",{bubbles:!0,composed:!0,detail:o.href}))}});connectedCallback(){super.connectedCallback(),this._onMessage=this._onMessage.bind(this),window.addEventListener("message",this._onMessage)}async postMessage(e){await this.ready,this._iframe.value?.contentWindow?.postMessage(e,"*")}render(){return(0,r.D)(this._src,(0,n.qy)`
1
+ export const __webpack_id__="9914";export const __webpack_ids__=["9914"];export const __webpack_modules__={10632:function(e,t,s){s.d(t,{A:()=>l});var a=s(63819),n=s(31601),i=s.n(n),r=s(76314),o=s.n(r)()(i());o.push([e.id,"iframe{border:none;box-sizing:initial;height:100%;width:100%}",""]);let l=(0,a.AH)([o.toString()])},86129:function(e,t,s){s.r(t),s.d(t,{MDNPlayRunner:()=>MDNPlayRunner});var a=s(64889),n=s(63819),i=s(62963),r=s(70209),o=s(69392),l=s(93957),c=s(36728),d=s(45842),h=s(10632);let MDNPlayRunner=class MDNPlayRunner extends n.WF{static ssr=!1;static properties={code:{type:Object},defaults:{type:String},srcPrefix:{type:String,attribute:"src-prefix"},allow:{type:String},sandbox:{type:String},_src:{state:!0}};static styles=h.A;constructor(){super(),this.theme=new l.W(this),this.code=void 0,this.defaults=void 0,this.srcPrefix=void 0,this.allow=void 0,this.sandbox=void 0,this._subdomain=crypto.randomUUID(),this.ready=new Promise(e=>{this._resolveReady=()=>e(!0)}),this._src="about:blank"}_iframe=(0,o._)();_onMessage({data:{typ:e,prop:t,args:s,uuid:a},origin:n}){a||(a=new URL(n,"https://example.com").hostname.split(".")[0]),a===this._subdomain&&("console"===e?this.dispatchEvent(new CustomEvent("console",{bubbles:!0,composed:!0,detail:{prop:t,args:s}})):"ready"===e&&this._resolveReady())}_updateSrc=new a.YZ(this,{args:()=>[this.code,this.defaults,this.theme.value,this.srcPrefix],task:async([e,t,s,a],{signal:n})=>{if(e&&e.js&&e.wat){let t=await u(e.wat);e.js=e.js.replace("{%wasm-url%}",t)}let{state:i}=await (0,d.$)(JSON.stringify({html:e?.html||"",css:e?.css||"",js:e?.js||"",defaults:t,theme:s})),r=(a||"").replace(/\/$/,"");n.throwIfAborted();let o=new URL(`${r}/runner.html`,c.sR?location.origin.replace("3000","3001"):`${location.protocol}//${this._subdomain}.${c.tf}`);o.searchParams.set("uuid",this._subdomain),o.searchParams.set("state",i),this._src=o.href,this.dispatchEvent(new CustomEvent("mdn-play-runner-src",{bubbles:!0,composed:!0,detail:o.href}))}});connectedCallback(){super.connectedCallback(),this._onMessage=this._onMessage.bind(this),window.addEventListener("message",this._onMessage)}async postMessage(e){await this.ready,this._iframe.value?.contentWindow?.postMessage(e,"*")}render(){return(0,r.D)(this._src,(0,n.qy)`
2
2
  <iframe
3
3
  ${(0,o.K)(this._iframe)}
4
4
  src=${this._src}
@@ -8,4 +8,4 @@ export const __webpack_id__="9914";export const __webpack_ids__=["9914"];export
8
8
  aria-live="polite"
9
9
  ></iframe>
10
10
  `)}disconnectedCallback(){super.disconnectedCallback(),window.removeEventListener("message",this._onMessage)}};async function u(e){let{default:t,watify:a}=await s.e("7185").then(s.bind(s,12456));await t();let n=a(e);return`data:application/wasm;base64,${btoa(Array.from(n,e=>String.fromCodePoint(e)).join(""))}`}customElements.define("mdn-play-runner",MDNPlayRunner)},45842:function(e,t,s){async function a(e){let t=new Blob([e]),s=new CompressionStream("deflate-raw"),a=new Response(t.stream().pipeThrough(s)).arrayBuffer(),n=await a,i=[...new Uint8Array(await globalThis.crypto.subtle.digest("SHA-256",n))].slice(0,20).map(e=>e.toString(16).padStart(2,"0")).join("");return{state:btoa(Array.from(new Uint8Array(n),e=>String.fromCodePoint(e)).join("")),hash:i}}async function n(e){if(!e)return{state:null,hash:null};let t=function(e){let t=atob(e),s=t.length,a=new Uint8Array(s);for(let e=0;e<s;e++)a[e]=t.charCodeAt(e);return a.buffer}(e),s=[...new Uint8Array(await crypto.subtle.digest("SHA-256",t))].slice(0,20).map(e=>e.toString(16).padStart(2,"0")).join(""),a=new DecompressionStream("deflate-raw"),n=new Response(new Blob([t]).stream().pipeThrough(a)).arrayBuffer();return{state:new TextDecoder().decode(await n),hash:s}}s.d(t,{$:()=>a,p:()=>n})}};
11
- //# sourceMappingURL=9914.9b7171874efa4629.js.map
11
+ //# sourceMappingURL=9914.d49932c28ec56667.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"9914.9b7171874efa4629.js","sources":["webpack://@mdn/fred/./components/play-runner/element.css","webpack://@mdn/fred/./components/play-runner/element.js","webpack://@mdn/fred/./components/playground/utils.js"],"sourcesContent":["import { css } from \"lit\";\n// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `iframe{border:none;box-sizing:initial;height:100%;width:100%}`, \"\"]);\n// Exports\nexport default css([___CSS_LOADER_EXPORT___.toString()]);\n","import { Task } from \"@lit/task\";\nimport { LitElement, html } from \"lit\";\nimport { ifDefined } from \"lit/directives/if-defined.js\";\nimport { keyed } from \"lit/directives/keyed.js\";\nimport { createRef, ref } from \"lit/directives/ref.js\";\n\nimport { ThemeController } from \"../color-theme/controller.js\";\nimport { PLAYGROUND_BASE_HOST, PLAYGROUND_LOCAL } from \"../env/index.js\";\nimport { compressAndBase64Encode } from \"../playground/utils.js\";\n\nimport styles from \"./element.css?lit\";\n\n/**\n * @import { RunnerDefaults } from \"./types.js\"\n * @import { VConsole } from \"../play-console/types.js\"\n * @import { Ref } from \"lit/directives/ref.js\";\n */\n\nexport class MDNPlayRunner extends LitElement {\n static ssr = false;\n\n static properties = {\n code: { type: Object },\n defaults: { type: String },\n srcPrefix: { type: String, attribute: \"src-prefix\" },\n allow: { type: String },\n sandbox: { type: String },\n _src: { state: true },\n };\n\n static styles = styles;\n\n constructor() {\n super();\n this.theme = new ThemeController(this);\n /** @type {Record<string, string> | undefined} */\n this.code = undefined;\n /** @type {RunnerDefaults | undefined} */\n this.defaults = undefined;\n /** @type {string | undefined} */\n this.srcPrefix = undefined;\n /** @type {string | undefined} */\n this.allow = undefined;\n /** @type {string | undefined} */\n this.sandbox = undefined;\n this._subdomain = crypto.randomUUID();\n /** @type {Promise<true>} */\n this.ready = new Promise((resolve) => {\n this._resolveReady = () => resolve(true);\n });\n this._src = \"about:blank\";\n }\n\n /** @type {Ref<HTMLIFrameElement>} */\n _iframe = createRef();\n\n /** @param {MessageEvent} e */\n _onMessage({ data: { typ, prop, args, uuid }, origin }) {\n if (!uuid) {\n uuid = new URL(origin, \"https://example.com\").hostname.split(\".\")[0];\n }\n if (uuid !== this._subdomain) {\n return;\n }\n if (typ === \"console\") {\n /** @type {VConsole} */\n const detail = { prop, args };\n this.dispatchEvent(\n new CustomEvent(\"console\", { bubbles: true, composed: true, detail }),\n );\n } else if (typ === \"ready\") {\n this._resolveReady();\n }\n }\n\n _updateSrc = new Task(this, {\n args: () =>\n /** @type {const} */ ([\n this.code,\n this.defaults,\n this.theme.value,\n this.srcPrefix,\n ]),\n task: async ([code, defaults, theme, srcPrefix], { signal }) => {\n if (code && code.js && code.wat) {\n const watUrl = await compileAndEncodeWatToDataUrl(code.wat);\n code.js = code.js.replace(\"{%wasm-url%}\", watUrl);\n }\n const { state } = await compressAndBase64Encode(\n JSON.stringify({\n html: code?.html || \"\",\n css: code?.css || \"\",\n js: code?.js || \"\",\n defaults: defaults,\n theme: theme,\n }),\n );\n const prefix = (srcPrefix || \"\").replace(/\\/$/, \"\");\n signal.throwIfAborted();\n // We're using a random subdomain for origin isolation.\n const url = new URL(\n `${prefix}/runner.html`,\n PLAYGROUND_LOCAL\n ? location.origin.replace(\"3000\", \"3001\")\n : `${location.protocol}//${this._subdomain}.${PLAYGROUND_BASE_HOST}`,\n );\n // pass the uuid for postMessage isolation\n url.searchParams.set(\"uuid\", this._subdomain);\n url.searchParams.set(\"state\", state);\n this._src = url.href;\n this.dispatchEvent(\n new CustomEvent(\"mdn-play-runner-src\", {\n bubbles: true,\n composed: true,\n detail: url.href,\n }),\n );\n },\n });\n\n connectedCallback() {\n super.connectedCallback();\n this._onMessage = this._onMessage.bind(this);\n window.addEventListener(\"message\", this._onMessage);\n }\n\n /** @param {any} message */\n async postMessage(message) {\n await this.ready;\n this._iframe.value?.contentWindow?.postMessage(message, \"*\");\n }\n\n render() {\n // use `keyed` to replace the iframe when src updates\n // this ensures we don't add to browser history\n return keyed(\n this._src,\n html`\n <iframe\n ${ref(this._iframe)}\n src=${this._src}\n title=\"runner\"\n allow=${ifDefined(this.allow)}\n sandbox=${[\n ...new Set([\n \"allow-scripts\",\n \"allow-same-origin\",\n \"allow-forms\",\n \"allow-modals\",\n ...(this.sandbox?.split(\" \") || []),\n ]),\n ].join(\" \")}\n aria-live=\"polite\"\n ></iframe>\n `,\n );\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n window.removeEventListener(\"message\", this._onMessage);\n }\n}\n\n/**\n * Converts a Uint8Array to a base64 encoded string\n * @param {Uint8Array} bytes - The array of bytes to convert\n * @returns {string} The base64 encoded string representation of the input bytes\n */\nfunction uInt8ArrayToBase64(bytes) {\n const binString = Array.from(bytes, (byte) =>\n String.fromCodePoint(byte),\n ).join(\"\");\n return btoa(binString);\n}\n\n/**\n * compiles the wat code to wasm\n * @param {string} wat\n * @returns {Promise<string>} a data-url with the compiled wasm, base64 encoded\n */\nasync function compileAndEncodeWatToDataUrl(wat) {\n const { default: init, watify } = await import(\"@mdn/watify\");\n await init();\n const binary = watify(wat);\n const b64 = `data:application/wasm;base64,${uInt8ArrayToBase64(binary)}`;\n return b64;\n}\n\ncustomElements.define(\"mdn-play-runner\", MDNPlayRunner);\n","// import { PLAYGROUND_BASE_HOST } from \"../env\";\n\n// /**\n// * @import { EditorContent } from \"./types.js\";\n// */\n\n// /**\n// * @param {EditorContent} code\n// * @returns {string}\n// */\n// export function codeToMarkdown(code) {\n// const parts = [];\n// if (code.html) {\n// parts.push([\"```html\", code.html, \"```\"].join(\"\\n\"));\n// }\n// if (code.css) {\n// parts.push([\"```css\", code.css, \"```\"].join(\"\\n\"));\n// }\n// if (code.js) {\n// parts.push([\"```js\", code.js, \"```\"].join(\"\\n\"));\n// }\n// return parts.join(\"\\n\\n\");\n// }\n\n// /**\n// * @param {HTMLIFrameElement | null} iframe\n// * @param {EditorContent | null} editorContent\n// * @param {boolean} fullscreen\n// */\n// export async function initPlayIframe(\n// iframe,\n// editorContent,\n// fullscreen = false\n// ) {\n// if (!iframe || !editorContent) {\n// return;\n// }\n// const { state, hash } = await compressAndBase64Encode(\n// JSON.stringify(editorContent)\n// );\n// const path = iframe.getAttribute(\"data-live-path\");\n// const url = new URL(\n// `${path || \"\"}${path?.endsWith(\"/\") ? \"\" : \"/\"}runner.html`,\n// window.location.origin\n// );\n// if (!window.location.hostname.endsWith(\"localhost\")) {\n// const host = PLAYGROUND_BASE_HOST.startsWith(\"localhost\")\n// ? PLAYGROUND_BASE_HOST\n// : `${hash}.${PLAYGROUND_BASE_HOST}`;\n// url.port = \"\";\n// url.host = host;\n// }\n// url.search = \"\";\n// url.searchParams.set(\"state\", state);\n// iframe.src = url.href;\n// if (fullscreen) {\n// const urlWithoutHash = new URL(window.location.href);\n// urlWithoutHash.hash = \"\";\n// window.history.replaceState(null, \"\", urlWithoutHash);\n// window.location.href = url.href;\n// }\n// }\n\n/**\n * @param {ArrayBuffer} bytes\n */\nfunction bytesToBase64(bytes) {\n const binString = Array.from(new Uint8Array(bytes), (byte) =>\n String.fromCodePoint(byte),\n ).join(\"\");\n return btoa(binString);\n}\n\n/**\n * @param {string} inputString\n */\nexport async function compressAndBase64Encode(inputString) {\n const inputArray = new Blob([inputString]);\n\n const compressionStream = new CompressionStream(\"deflate-raw\");\n\n const compressedStream = new Response(\n inputArray.stream().pipeThrough(compressionStream),\n ).arrayBuffer();\n\n const compressed = await compressedStream;\n const hashBuffer = await globalThis.crypto.subtle.digest(\n \"SHA-256\",\n compressed,\n );\n const hashArray = [...new Uint8Array(hashBuffer)].slice(0, 20);\n const hash = hashArray.map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n const state = bytesToBase64(compressed);\n\n return { state, hash };\n}\n\n/**\n * @param {string} base64\n * @returns {ArrayBuffer}\n */\nfunction base64ToBytes(base64) {\n const binString = atob(base64);\n const len = binString.length;\n const bytes = new Uint8Array(len);\n for (let i = 0; i < len; i++) {\n // eslint-disable-next-line unicorn/prefer-code-point\n bytes[i] = binString.charCodeAt(i);\n }\n return bytes.buffer;\n}\n\n/**\n * This is the browser version of `libs/play/index.js`. Keep in sync!\n * @param {string} base64String\n */\nexport async function decompressFromBase64(base64String) {\n if (!base64String) {\n return { state: null, hash: null };\n }\n const bytes = base64ToBytes(base64String);\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", bytes);\n const hashArray = [...new Uint8Array(hashBuffer)].slice(0, 20);\n const hash = hashArray.map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n\n const decompressionStream = new DecompressionStream(\"deflate-raw\");\n\n const decompressedStream = new Response(\n new Blob([bytes]).stream().pipeThrough(decompressionStream),\n ).arrayBuffer();\n\n const state = new TextDecoder().decode(await decompressedStream);\n return { state, hash };\n}\n"],"names":["MDNPlayRunner","Object","String","crypto","Promise","URL","CustomEvent","JSON","location","window","i","Set","btoa","Array","customElements","Blob","CompressionStream","Response","Uint8Array","globalThis","atob","DecompressionStream","TextDecoder"],"mappings":"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"}
1
+ {"version":3,"file":"9914.d49932c28ec56667.js","sources":["webpack://@mdn/fred/./components/play-runner/element.css","webpack://@mdn/fred/./components/play-runner/element.js","webpack://@mdn/fred/./components/playground/utils.js"],"sourcesContent":["import { css } from \"lit\";\n// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `iframe{border:none;box-sizing:initial;height:100%;width:100%}`, \"\"]);\n// Exports\nexport default css([___CSS_LOADER_EXPORT___.toString()]);\n","import { Task } from \"@lit/task\";\nimport { LitElement, html } from \"lit\";\nimport { ifDefined } from \"lit/directives/if-defined.js\";\nimport { keyed } from \"lit/directives/keyed.js\";\nimport { createRef, ref } from \"lit/directives/ref.js\";\n\nimport { ThemeController } from \"../color-theme/controller.js\";\nimport { PLAYGROUND_BASE_HOST, PLAYGROUND_LOCAL } from \"../env/index.js\";\nimport { compressAndBase64Encode } from \"../playground/utils.js\";\n\nimport styles from \"./element.css?lit\";\n\n/**\n * @import { RunnerDefaults } from \"./types.js\"\n * @import { VConsole } from \"../play-console/types.js\"\n * @import { Ref } from \"lit/directives/ref.js\";\n */\n\nexport class MDNPlayRunner extends LitElement {\n static ssr = false;\n\n static properties = {\n code: { type: Object },\n defaults: { type: String },\n srcPrefix: { type: String, attribute: \"src-prefix\" },\n allow: { type: String },\n sandbox: { type: String },\n _src: { state: true },\n };\n\n static styles = styles;\n\n constructor() {\n super();\n this.theme = new ThemeController(this);\n /** @type {Record<string, string> | undefined} */\n this.code = undefined;\n /** @type {RunnerDefaults | undefined} */\n this.defaults = undefined;\n /** @type {string | undefined} */\n this.srcPrefix = undefined;\n /** @type {string | undefined} */\n this.allow = undefined;\n /** @type {string | undefined} */\n this.sandbox = undefined;\n this._subdomain = crypto.randomUUID();\n /** @type {Promise<true>} */\n this.ready = new Promise((resolve) => {\n this._resolveReady = () => resolve(true);\n });\n this._src = \"about:blank\";\n }\n\n /** @type {Ref<HTMLIFrameElement>} */\n _iframe = createRef();\n\n /** @param {MessageEvent} e */\n _onMessage({ data: { typ, prop, args, uuid }, origin }) {\n if (!uuid) {\n uuid = new URL(origin, \"https://example.com\").hostname.split(\".\")[0];\n }\n if (uuid !== this._subdomain) {\n return;\n }\n if (typ === \"console\") {\n /** @type {VConsole} */\n const detail = { prop, args };\n this.dispatchEvent(\n new CustomEvent(\"console\", { bubbles: true, composed: true, detail }),\n );\n } else if (typ === \"ready\") {\n this._resolveReady();\n }\n }\n\n _updateSrc = new Task(this, {\n args: () =>\n /** @type {const} */ ([\n this.code,\n this.defaults,\n this.theme.value,\n this.srcPrefix,\n ]),\n task: async ([code, defaults, theme, srcPrefix], { signal }) => {\n if (code && code.js && code.wat) {\n const watUrl = await compileAndEncodeWatToDataUrl(code.wat);\n code.js = code.js.replace(\"{%wasm-url%}\", watUrl);\n }\n const { state } = await compressAndBase64Encode(\n JSON.stringify({\n html: code?.html || \"\",\n css: code?.css || \"\",\n js: code?.js || \"\",\n defaults: defaults,\n theme: theme,\n }),\n );\n const prefix = (srcPrefix || \"\").replace(/\\/$/, \"\");\n signal.throwIfAborted();\n // We're using a random subdomain for origin isolation.\n const url = new URL(\n `${prefix}/runner.html`,\n PLAYGROUND_LOCAL\n ? location.origin.replace(\"3000\", \"3001\")\n : `${location.protocol}//${this._subdomain}.${PLAYGROUND_BASE_HOST}`,\n );\n // pass the uuid for postMessage isolation\n url.searchParams.set(\"uuid\", this._subdomain);\n url.searchParams.set(\"state\", state);\n this._src = url.href;\n this.dispatchEvent(\n new CustomEvent(\"mdn-play-runner-src\", {\n bubbles: true,\n composed: true,\n detail: url.href,\n }),\n );\n },\n });\n\n connectedCallback() {\n super.connectedCallback();\n this._onMessage = this._onMessage.bind(this);\n window.addEventListener(\"message\", this._onMessage);\n }\n\n /** @param {any} message */\n async postMessage(message) {\n await this.ready;\n this._iframe.value?.contentWindow?.postMessage(message, \"*\");\n }\n\n render() {\n // use `keyed` to replace the iframe when src updates\n // this ensures we don't add to browser history\n return keyed(\n this._src,\n html`\n <iframe\n ${ref(this._iframe)}\n src=${this._src}\n title=\"runner\"\n allow=${ifDefined(this.allow)}\n sandbox=${[\n ...new Set([\n \"allow-scripts\",\n \"allow-same-origin\",\n \"allow-forms\",\n \"allow-modals\",\n ...(this.sandbox?.split(\" \") || []),\n ]),\n ].join(\" \")}\n aria-live=\"polite\"\n ></iframe>\n `,\n );\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n window.removeEventListener(\"message\", this._onMessage);\n }\n}\n\n/**\n * Converts a Uint8Array to a base64 encoded string\n * @param {Uint8Array} bytes - The array of bytes to convert\n * @returns {string} The base64 encoded string representation of the input bytes\n */\nfunction uInt8ArrayToBase64(bytes) {\n const binString = Array.from(bytes, (byte) =>\n String.fromCodePoint(byte),\n ).join(\"\");\n return btoa(binString);\n}\n\n/**\n * compiles the wat code to wasm\n * @param {string} wat\n * @returns {Promise<string>} a data-url with the compiled wasm, base64 encoded\n */\nasync function compileAndEncodeWatToDataUrl(wat) {\n const { default: init, watify } = await import(\"@mdn/watify\");\n await init();\n const binary = watify(wat);\n const b64 = `data:application/wasm;base64,${uInt8ArrayToBase64(binary)}`;\n return b64;\n}\n\ncustomElements.define(\"mdn-play-runner\", MDNPlayRunner);\n","// import { PLAYGROUND_BASE_HOST } from \"../env\";\n\n// /**\n// * @import { EditorContent } from \"./types.js\";\n// */\n\n// /**\n// * @param {EditorContent} code\n// * @returns {string}\n// */\n// export function codeToMarkdown(code) {\n// const parts = [];\n// if (code.html) {\n// parts.push([\"```html\", code.html, \"```\"].join(\"\\n\"));\n// }\n// if (code.css) {\n// parts.push([\"```css\", code.css, \"```\"].join(\"\\n\"));\n// }\n// if (code.js) {\n// parts.push([\"```js\", code.js, \"```\"].join(\"\\n\"));\n// }\n// return parts.join(\"\\n\\n\");\n// }\n\n// /**\n// * @param {HTMLIFrameElement | null} iframe\n// * @param {EditorContent | null} editorContent\n// * @param {boolean} fullscreen\n// */\n// export async function initPlayIframe(\n// iframe,\n// editorContent,\n// fullscreen = false\n// ) {\n// if (!iframe || !editorContent) {\n// return;\n// }\n// const { state, hash } = await compressAndBase64Encode(\n// JSON.stringify(editorContent)\n// );\n// const path = iframe.getAttribute(\"data-live-path\");\n// const url = new URL(\n// `${path || \"\"}${path?.endsWith(\"/\") ? \"\" : \"/\"}runner.html`,\n// window.location.origin\n// );\n// if (!window.location.hostname.endsWith(\"localhost\")) {\n// const host = PLAYGROUND_BASE_HOST.startsWith(\"localhost\")\n// ? PLAYGROUND_BASE_HOST\n// : `${hash}.${PLAYGROUND_BASE_HOST}`;\n// url.port = \"\";\n// url.host = host;\n// }\n// url.search = \"\";\n// url.searchParams.set(\"state\", state);\n// iframe.src = url.href;\n// if (fullscreen) {\n// const urlWithoutHash = new URL(window.location.href);\n// urlWithoutHash.hash = \"\";\n// window.history.replaceState(null, \"\", urlWithoutHash);\n// window.location.href = url.href;\n// }\n// }\n\n/**\n * @param {ArrayBuffer} bytes\n */\nfunction bytesToBase64(bytes) {\n const binString = Array.from(new Uint8Array(bytes), (byte) =>\n String.fromCodePoint(byte),\n ).join(\"\");\n return btoa(binString);\n}\n\n/**\n * @param {string} inputString\n */\nexport async function compressAndBase64Encode(inputString) {\n const inputArray = new Blob([inputString]);\n\n const compressionStream = new CompressionStream(\"deflate-raw\");\n\n const compressedStream = new Response(\n inputArray.stream().pipeThrough(compressionStream),\n ).arrayBuffer();\n\n const compressed = await compressedStream;\n const hashBuffer = await globalThis.crypto.subtle.digest(\n \"SHA-256\",\n compressed,\n );\n const hashArray = [...new Uint8Array(hashBuffer)].slice(0, 20);\n const hash = hashArray.map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n const state = bytesToBase64(compressed);\n\n return { state, hash };\n}\n\n/**\n * @param {string} base64\n * @returns {ArrayBuffer}\n */\nfunction base64ToBytes(base64) {\n const binString = atob(base64);\n const len = binString.length;\n const bytes = new Uint8Array(len);\n for (let i = 0; i < len; i++) {\n // eslint-disable-next-line unicorn/prefer-code-point\n bytes[i] = binString.charCodeAt(i);\n }\n return bytes.buffer;\n}\n\n/**\n * This is the browser version of `libs/play/index.js`. Keep in sync!\n * @param {string} base64String\n */\nexport async function decompressFromBase64(base64String) {\n if (!base64String) {\n return { state: null, hash: null };\n }\n const bytes = base64ToBytes(base64String);\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", bytes);\n const hashArray = [...new Uint8Array(hashBuffer)].slice(0, 20);\n const hash = hashArray.map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n\n const decompressionStream = new DecompressionStream(\"deflate-raw\");\n\n const decompressedStream = new Response(\n new Blob([bytes]).stream().pipeThrough(decompressionStream),\n ).arrayBuffer();\n\n const state = new TextDecoder().decode(await decompressedStream);\n return { state, hash };\n}\n"],"names":["MDNPlayRunner","Object","String","crypto","Promise","URL","CustomEvent","JSON","location","window","i","Set","btoa","Array","customElements","Blob","CompressionStream","Response","Uint8Array","globalThis","atob","DecompressionStream","TextDecoder"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- /*! For license information please see index.dfccf913556b909a.js.LICENSE.txt */
2
- export const __webpack_id__="8410";export const __webpack_ids__=["8410"];export const __webpack_modules__={27887:function(e,t,n){n.d(t,{A:()=>p});var o=n(63819),a=n(31601),r=n.n(a),s=n(76314),i=n.n(s),l=n(4417),c=n.n(l),d=new n.U(n(34473)),u=i()(r()),m=c()(d);u.push([e.id,`*,:after,:before{box-sizing:border-box}dialog{border:0;padding:0}@media (width > 1006px){dialog{background-color:var(--color-background-primary);border:1px solid var(--color-border-primary);border-radius:.5rem;font-size:var(--font-size-large);margin:calc(var(--sticky-header-height) + 1rem) auto 1rem;max-height:calc(100% - var(--sticky-header-height) - 2rem);width:calc(var(--layout-content-max) + 1rem)}dialog::backdrop{--csstools-light-dark-toggle-dee8eb9e-0:var(--csstools-color-scheme--light) var(--color-black-alpha-75);-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);background-color:var(--csstools-light-dark-toggle-dee8eb9e-0,var(--color-white-alpha-75))}@supports (color:light-dark(red,red)){dialog::backdrop{background-color:light-dark(var(--color-white-alpha-75),var(--color-black-alpha-75))}}}@media (width <= 1006px){dialog{font-size:var(--font-size-normal);height:100%;margin:0;max-height:100%;max-width:100%;width:100%}}dialog[open]{display:grid;grid-template-areas:"search close" "progress progress" "results results";grid-template-columns:1fr min-content;grid-template-rows:var(--navigation-height) min-content min-content}progress{grid-area:progress;margin:0 1rem .5rem}@media (width <= 1006px){progress{margin-inline:.3rem}}.close{font-size:1.37rem;grid-area:close}@media (width > 1006px){.close{display:none}}form{display:grid;gap:.5rem;grid-area:search;grid-template-columns:min-content 1fr;padding:1rem;place-items:center}@media (width <= 1006px){form{align-self:center;background-color:var(--color-background-primary);border:1px solid var(--color-border-primary);border-radius:.5rem;margin-left:.3rem;padding:.5rem}}form:before{background-color:var(--color-border-secondary);content:"";height:1em;-webkit-mask-image:url(${m});mask-image:url(${m});-webkit-mask-size:contain;mask-size:contain;width:1em}input{background-color:initial;border:none;font-size:inherit;margin:0;outline:none;padding:0;width:100%}input::placeholder{color:var(--color-text-secondary)}ul{grid-area:results;margin:0;overflow:auto;overscroll-behavior:contain;padding:0}ul:has(li){border-top:1px solid var(--color-border-primary)}li[data-selected]{background:var(--color-background-blue);border-color:var(--color-blue-50)}li{border-inline-start:2px solid #0000;list-style-type:none}li:not([data-selected]):hover{background-color:var(--color-background-secondary)}li>*{padding:.5rem 1.5rem;width:100%}a{color:var(--color-link-normal);display:grid;-webkit-text-decoration:none;text-decoration:none}a:visited{color:var(--color-link-visited)}.slug{color:var(--color-text-secondary);font-size:var(--font-size-small)}mark{background-color:var(--color-background-yellow);color:var(--color-text-primary)}`,""]);let p=(0,o.AH)([u.toString()])},37940:function(e,t,n){n.d(t,{A:()=>a});var o=n(63819);let a=(0,o.JW)`<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24"><path d="M18 6 6 18M6 6l12 12"/></svg>`},47479:function(e,t,n){var o={"./code-example/element.js":["69208","3945","9963","7627","303","993","3187"],"./dropdown/element.js":["1783","220","7948"],"./live-sample-result/element.js":["4225","3945","8427","9963","9478","9914","7627","6480"],"./observatory-tests-and-scores/element.js":["37538","1231"],"./play-runner/element.js":["86129","3945","9478","9914","9696"],"./search-button/element.js":["69817","2002"],"./survey/element.js":["6674","3945","9963","3279"],"./ix-tab-wrapper/element.js":["56259","7072"],"./placement-sidebar/element.js":["43236","3945","8427","288","8797","2885","3733"],"./placement-hp-main/element.js":["9714","3945","8427","288","8797","2885","8607"],"./toggle-sidebar/element.js":["74540","9963","2860"],"./user-menu/element.js":["5265","9963","5124","1274"],"./interactive-example/element.js":["51851","3945","9379","9804","490","5745","2192","2936","6372","5123","9378","9963","9478","9914","3292","9679","7627","6536","303","4091","993","7072","3122","6040"],"./copy-button/element.js":["89842","9963","303","806"],"./observatory-comparison-table/element.js":["30077","7221","606"],"./sidebar-filter/element.js":["525","5534"],"./issues-table/element.js":["91423","3092"],"./scrim-inline/element.js":["1826","8427","2319"],"./switch/element.js":["89134","1363"],"./collection-save-button/element.js":["30931","9963","2190","1648"],"./contributor-list/element.js":["60642","479"],"./button/element.js":["99638","9963","5568"],"./homepage-search/element.js":["75509","1158"],"./modal/element.js":["53343","9963","2190"],"./color-theme/element.js":["23485","220","3200"],"./about-team-member/element.js":["7260","4781"],"./content-feedback/element.js":["21672","9963","603"],"./play-console/element.js":["75143","3292"],"./ix-tab/element.js":["11865","4091","3122"],"./observatory-header-link/element.js":["82767","7221","6452"],"./curriculum-tabs/element.js":["85804","3213"],"./placement-bottom/element.js":["64047","3945","8427","288","8797","2885","8036"],"./image-history/element.js":["69954","9935"],"./not-found/element.js":["11942","495","667"],"./placement-note/element.js":["55772","8797"],"./compat-table-lazy/element.js":["18526","5124","2308","451"],"./site-search/element.js":["59288","9963","9035"],"./placement-no/element.js":["10787","288"],"./play-controller/element.js":["99723","6536"],"./placement-top/element.js":["72135","3945","8427","288","8797","2885","3132"],"./observatory-form/element.js":["92691","3945","9963","8998","370"],"./observatory-results/element.js":["85324","9963","7221","220","8998","606","5019","6452","14","9837"],"./about-tabs/element.js":["49410","9519"],"./observatory-human-duration/element.js":["22061","7221","14"],"./playground/element.js":["75259","3945","9379","9804","490","5745","2192","2936","6372","5123","9963","9478","9914","3292","9679","6536","2190","9784"],"./ix-tab-panel/element.js":["20358","4091"],"./play-editor/element.js":["20002","9379","9804","490","5745","2192","2936","6372","5123","9478","9679"],"./themed-image/element.js":["10421","7462"],"./writer-open-editor/element.js":["91398","9963","8793"],"./progress-bar/element.js":["73589","8998"],"./compat-table/element.js":["30191","5124","2308"],"./login-button/element.js":["730","9963","8093"],"./observatory-rescan-button/element.js":["81512","9963","5019","7789"],"./language-always-redirect-button/element.js":["10860","4334","7741"],"./language-switcher/element.js":["82102","220","1363","495","4334","6465"],"./search-modal/element.js":["49818"],"./writer-reload/element.js":["7589","5446"]};function a(e){if(!n.o(o,e))return Promise.resolve().then(function(){var t=Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t});var t=o[e],a=t[0];return Promise.all(t.slice(1).map(n.e)).then(function(){return n(a)})}a.keys=()=>Object.keys(o),a.id=47479,e.exports=a},34473:function(e,t,n){e.exports=n.p+"search.5dd31cbeea7d1af9.svg"},79097:function(e,t,n){n.d(t,{Q:()=>m,QD:()=>d,_0:()=>i,g_:()=>l,i7:()=>c,iW:()=>u,kv:()=>s,sR:()=>a,tf:()=>o,vQ:()=>r});let o=h("PLAYGROUND_BASE_HOST","mdnplay.dev"),a=p("PLAYGROUND_LOCAL",!1),r=h("FXA_SIGNIN_URL","/users/fxa/login/authenticate/"),s=h("FXA_SIGNOUT_URL","/users/fxa/login/logout/"),i=p("GLEAN_ENABLED",!1),l=h("GLEAN_CHANNEL","dev"),c=p("GLEAN_DEBUG",!1);p("ROBOTS_GLOBAL_ALLOW",!0);let d=p("WRITER_MODE",!1),u=h("BCD_BASE_URL","https://bcd.developer.mozilla.org"),m=h("OBSERVATORY_API_URL","https://observatory-api.mdn.mozilla.net");function p(e,t){try{return!!JSON.parse({FRED_PLAYGROUND_LOCAL:"false",FRED_WRITER_MODE:"true",FRED_LEGACY:"true"}[`FRED_${e}`]||JSON.stringify(t))}catch{return t}}function h(e,t){return({FRED_PLAYGROUND_LOCAL:"false",FRED_WRITER_MODE:"true",FRED_LEGACY:"true"})[`FRED_${e}`]||t}},99217:function(){let e=document.querySelector('[aria-controls="navigation__popup"]'),t=document.querySelector(".navigation");e instanceof HTMLElement&&t instanceof HTMLElement&&e.addEventListener("click",()=>{let n=("true"!==t.dataset.open).toString();t.dataset.open=n,e.setAttribute("aria-expanded",n)})},49818:function(e,t,n){n.r(t),n.d(t,{MDNSearchModal:()=>MDNSearchModal,splitQuery:()=>c});var o=n(64889),a=n(63819),r=n(86484),s=n(90528),i=n(37940),l=n(27887);let MDNSearchModal=class MDNSearchModal extends(0,r.J)(a.WF){static styles=l.A;static properties={_index:{state:!0},_query:{state:!0},_selected:{state:!0},_shiftFocus:{state:!0}};constructor(){super(),this._index=void 0,this._query="",this._selected=0,this._shiftFocus=!1}async _loadIndex(){this._index||(this._index=this._fetchIndex())}async _fetchIndex(){let e=await fetch(`/${this.locale}/search-index.json`),t=await e.json();return{flex:t.map(({title:e,url:t},n)=>({index:n,title:e.toLowerCase(),slugTail:t.split("/").pop()?.toLowerCase()||""})),items:t}}showModal(){this._loadIndex(),this.shadowRoot?.querySelector("dialog")?.showModal(),this.shadowRoot?.querySelector("input")?.select()}_input({target:e}){e instanceof HTMLInputElement&&(this._query=e.value)}_keydown(e){switch(e.key){case"ArrowUp":e.preventDefault(),this._select(this._selected-1);break;case"ArrowDown":e.preventDefault(),this._select(this._selected+1);break;case"Enter":{let{ctrlKey:t,shiftKey:n,altKey:o,metaKey:a}=e,r=this._getSelectedItem();r instanceof HTMLElement&&(e.preventDefault(),r.dispatchEvent(new MouseEvent("click",{bubbles:!0,ctrlKey:t,shiftKey:n,altKey:o,metaKey:a})));break}default:return}}_getSelectedItem(){return this.shadowRoot?.querySelector("[data-selected] a")??null}_select(e){let t=(this._queryIndex.value?.length||0)+1,n=e%t;this._selected=n<0?t+e:n,setTimeout(()=>{let e=this._getSelectedItem();e instanceof HTMLElement&&e.scrollIntoView({behavior:"smooth",block:"nearest"})},0)}_submit(e){e.preventDefault();let t=this._getSelectedItem();t instanceof HTMLElement&&t.click()}_focus({target:e}){if(e instanceof HTMLElement){let t=e.closest("[data-result]");if(t instanceof HTMLElement){let e=Number.parseInt(t.dataset.result||"NaN",10);Number.isNaN(e)||(this._selected=e,this._shiftFocus=!0)}else this._shiftFocus=!1}}_globalKeydown(e){let t=e.composedPath()?.[0]||e.target;if(t instanceof HTMLElement&&(["TEXTAREA","INPUT"].includes(t.tagName)||t.isContentEditable))return;let n=globalThis.getSelection()?.toString(),o=e.key,a=e.ctrlKey||e.metaKey,r="k"===o&&a&&!e.shiftKey;("/"===o&&!a||r)&&(e.preventDefault(),this.showModal(),n&&(this._query=n))}_queryIndex=new o.YZ(this,{args:()=>[this._index,this._query],task:async([e,t])=>{if(e&&t){var n=t,o=await e;let a=n.toLowerCase().trim(),r=c(n);return o.flex.filter(({title:e})=>r.every(t=>e.includes(t))).map(({index:e,title:t,slugTail:n})=>[Number([t,n].includes(a)),e]).sort(([e],[t])=>t-e).map(([e,t])=>t).slice(0,10).map(e=>e&&(o.items||[])[e]).filter(Boolean)}}});_close(){this.shadowRoot?.querySelector("dialog")?.close()}connectedCallback(){super.connectedCallback(),this._globalKeydown=this._globalKeydown.bind(this),document.addEventListener("keydown",this._globalKeydown),this._loadIndex=this._loadIndex.bind(this),this.renderRoot.addEventListener("mouseover",this._loadIndex)}disconnectedCallback(){super.disconnectedCallback(),this.renderRoot.removeEventListener("mouseover",this._loadIndex),document.removeEventListener("keydown",this._globalKeydown)}_renderLoadingSearchIndex(){return(0,a.qy)`<progress
1
+ /*! For license information please see index.0910bee955d71d1b.js.LICENSE.txt */
2
+ export const __webpack_id__="8410";export const __webpack_ids__=["8410"];export const __webpack_modules__={27887:function(e,t,n){n.d(t,{A:()=>p});var o=n(63819),a=n(31601),r=n.n(a),s=n(76314),i=n.n(s),l=n(4417),c=n.n(l),d=new n.U(n(34473)),u=i()(r()),m=c()(d);u.push([e.id,`*,:after,:before{box-sizing:border-box}dialog{border:0;padding:0}@media (width > 1006px){dialog{background-color:var(--color-background-primary);border:1px solid var(--color-border-primary);border-radius:.5rem;font-size:var(--font-size-large);margin:calc(var(--sticky-header-height) + 1rem) auto 1rem;max-height:calc(100% - var(--sticky-header-height) - 2rem);width:calc(var(--layout-content-max) + 1rem)}dialog::backdrop{--csstools-light-dark-toggle-dee8eb9e-0:var(--csstools-color-scheme--light) var(--color-black-alpha-75);-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);background-color:var(--csstools-light-dark-toggle-dee8eb9e-0,var(--color-white-alpha-75))}@supports (color:light-dark(red,red)){dialog::backdrop{background-color:light-dark(var(--color-white-alpha-75),var(--color-black-alpha-75))}}}@media (width <= 1006px){dialog{font-size:var(--font-size-normal);height:100%;margin:0;max-height:100%;max-width:100%;width:100%}}dialog[open]{display:grid;grid-template-areas:"search close" "progress progress" "results results";grid-template-columns:1fr min-content;grid-template-rows:var(--navigation-height) min-content min-content}progress{grid-area:progress;margin:0 1rem .5rem}@media (width <= 1006px){progress{margin-inline:.3rem}}.close{font-size:1.37rem;grid-area:close}@media (width > 1006px){.close{display:none}}form{display:grid;gap:.5rem;grid-area:search;grid-template-columns:min-content 1fr;padding:1rem;place-items:center}@media (width <= 1006px){form{align-self:center;background-color:var(--color-background-primary);border:1px solid var(--color-border-primary);border-radius:.5rem;margin-left:.3rem;padding:.5rem}}form:before{background-color:var(--color-border-secondary);content:"";height:1em;-webkit-mask-image:url(${m});mask-image:url(${m});-webkit-mask-size:contain;mask-size:contain;width:1em}input{background-color:initial;border:none;font-size:inherit;margin:0;outline:none;padding:0;width:100%}input::placeholder{color:var(--color-text-secondary)}ul{grid-area:results;margin:0;overflow:auto;overscroll-behavior:contain;padding:0}ul:has(li){border-top:1px solid var(--color-border-primary)}li[data-selected]{background:var(--color-background-blue);border-color:var(--color-blue-50)}li{border-inline-start:2px solid #0000;list-style-type:none}li:not([data-selected]):hover{background-color:var(--color-background-secondary)}li>*{padding:.5rem 1.5rem;width:100%}a{color:var(--color-link-normal);display:grid;-webkit-text-decoration:none;text-decoration:none}a:visited{color:var(--color-link-visited)}.slug{color:var(--color-text-secondary);font-size:var(--font-size-small)}mark{background-color:var(--color-background-yellow);color:var(--color-text-primary)}`,""]);let p=(0,o.AH)([u.toString()])},37940:function(e,t,n){n.d(t,{A:()=>a});var o=n(63819);let a=(0,o.JW)`<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24"><path d="M18 6 6 18M6 6l12 12"/></svg>`},47479:function(e,t,n){var o={"./code-example/element.js":["69208","3945","9963","7627","303","993","3187"],"./dropdown/element.js":["1783","220","7948"],"./live-sample-result/element.js":["4225","3945","8427","9963","9478","9914","7627","6480"],"./observatory-tests-and-scores/element.js":["37538","1231"],"./play-runner/element.js":["86129","3945","9478","9914","9696"],"./search-button/element.js":["69817","2002"],"./survey/element.js":["6674","3945","9963","3279"],"./ix-tab-wrapper/element.js":["56259","7072"],"./placement-sidebar/element.js":["43236","3945","8427","288","8797","2885","3733"],"./placement-hp-main/element.js":["9714","3945","8427","288","8797","2885","8607"],"./toggle-sidebar/element.js":["74540","9963","2860"],"./user-menu/element.js":["5265","9963","5124","1274"],"./interactive-example/element.js":["51851","3945","9379","9804","490","5745","2192","2936","6372","5123","9378","9963","9478","9914","3292","9679","7627","6536","303","4091","993","7072","3122","6040"],"./copy-button/element.js":["89842","9963","303","806"],"./observatory-comparison-table/element.js":["30077","7221","606"],"./sidebar-filter/element.js":["525","5534"],"./issues-table/element.js":["91423","3092"],"./scrim-inline/element.js":["1826","8427","2319"],"./switch/element.js":["89134","1363"],"./collection-save-button/element.js":["30931","9963","2190","1648"],"./contributor-list/element.js":["60642","479"],"./button/element.js":["99638","9963","5568"],"./homepage-search/element.js":["75509","1158"],"./modal/element.js":["53343","9963","2190"],"./color-theme/element.js":["23485","220","3200"],"./about-team-member/element.js":["7260","4781"],"./content-feedback/element.js":["21672","9963","603"],"./play-console/element.js":["75143","3292"],"./ix-tab/element.js":["11865","4091","3122"],"./observatory-header-link/element.js":["82767","7221","6452"],"./curriculum-tabs/element.js":["85804","3213"],"./placement-bottom/element.js":["64047","3945","8427","288","8797","2885","8036"],"./image-history/element.js":["69954","9935"],"./not-found/element.js":["11942","495","667"],"./placement-note/element.js":["55772","8797"],"./compat-table-lazy/element.js":["18526","5124","2308","451"],"./site-search/element.js":["59288","9963","9035"],"./placement-no/element.js":["10787","288"],"./play-controller/element.js":["99723","6536"],"./placement-top/element.js":["72135","3945","8427","288","8797","2885","3132"],"./observatory-form/element.js":["92691","3945","9963","8998","370"],"./observatory-results/element.js":["85324","9963","7221","220","8998","606","5019","6452","14","9837"],"./about-tabs/element.js":["49410","9519"],"./observatory-human-duration/element.js":["22061","7221","14"],"./playground/element.js":["75259","3945","9379","9804","490","5745","2192","2936","6372","5123","9963","9478","9914","3292","9679","6536","2190","9784"],"./ix-tab-panel/element.js":["20358","4091"],"./play-editor/element.js":["20002","9379","9804","490","5745","2192","2936","6372","5123","9478","9679"],"./themed-image/element.js":["10421","7462"],"./writer-open-editor/element.js":["91398","9963","8793"],"./progress-bar/element.js":["73589","8998"],"./compat-table/element.js":["30191","5124","2308"],"./login-button/element.js":["730","9963","8093"],"./observatory-rescan-button/element.js":["81512","9963","5019","7789"],"./language-always-redirect-button/element.js":["10860","4334","7741"],"./language-switcher/element.js":["82102","220","1363","495","4334","6465"],"./search-modal/element.js":["49818"],"./writer-reload/element.js":["7589","5446"]};function a(e){if(!n.o(o,e))return Promise.resolve().then(function(){var t=Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t});var t=o[e],a=t[0];return Promise.all(t.slice(1).map(n.e)).then(function(){return n(a)})}a.keys=()=>Object.keys(o),a.id=47479,e.exports=a},34473:function(e,t,n){e.exports=n.p+"search.5dd31cbeea7d1af9.svg"},36728:function(e,t,n){n.d(t,{i7:()=>p,iW:()=>g,tf:()=>i,_0:()=>u,Q:()=>f,sR:()=>l,vQ:()=>c,kv:()=>d,g_:()=>m,QD:()=>h});let o=[],a=r("RUNTIME_ENV",!0);function r(e,t,n){try{return!!JSON.parse(s(e,n)||JSON.stringify(t))}catch{return t}}function s(e,t={}){let{runtime:n}={runtime:!1,...t};return(e=`FRED_${e}`,n&&a)?(o.push(e),process.env[e]||s(e)):({FRED_RUNTIME_ENV:"true",FRED_PLAYGROUND_LOCAL:"false",FRED_LEGACY:"true"})[e]}let i=s("PLAYGROUND_BASE_HOST",void 0)||"mdnplay.dev",l=r("PLAYGROUND_LOCAL",!1),c=s("FXA_SIGNIN_URL",void 0)||"/users/fxa/login/authenticate/",d=s("FXA_SIGNOUT_URL",void 0)||"/users/fxa/login/logout/",u=r("GLEAN_ENABLED",!1),m=s("GLEAN_CHANNEL",void 0)||"dev",p=r("GLEAN_DEBUG",!1);r("ROBOTS_GLOBAL_ALLOW",!0);let h=r("WRITER_MODE",!1,{runtime:!0}),g=s("BCD_BASE_URL",void 0)||"https://bcd.developer.mozilla.org",f=s("OBSERVATORY_API_URL",void 0)||"https://observatory-api.mdn.mozilla.net"},99217:function(){let e=document.querySelector('[aria-controls="navigation__popup"]'),t=document.querySelector(".navigation");e instanceof HTMLElement&&t instanceof HTMLElement&&e.addEventListener("click",()=>{let n=("true"!==t.dataset.open).toString();t.dataset.open=n,e.setAttribute("aria-expanded",n)})},49818:function(e,t,n){n.r(t),n.d(t,{MDNSearchModal:()=>MDNSearchModal,splitQuery:()=>c});var o=n(64889),a=n(63819),r=n(86484),s=n(90528),i=n(37940),l=n(27887);let MDNSearchModal=class MDNSearchModal extends(0,r.J)(a.WF){static styles=l.A;static properties={_index:{state:!0},_query:{state:!0},_selected:{state:!0},_shiftFocus:{state:!0}};constructor(){super(),this._index=void 0,this._query="",this._selected=0,this._shiftFocus=!1}async _loadIndex(){this._index||(this._index=this._fetchIndex())}async _fetchIndex(){let e=await fetch(`/${this.locale}/search-index.json`),t=await e.json();return{flex:t.map(({title:e,url:t},n)=>({index:n,title:e.toLowerCase(),slugTail:t.split("/").pop()?.toLowerCase()||""})),items:t}}showModal(){this._loadIndex(),this.shadowRoot?.querySelector("dialog")?.showModal(),this.shadowRoot?.querySelector("input")?.select()}_input({target:e}){e instanceof HTMLInputElement&&(this._query=e.value)}_keydown(e){switch(e.key){case"ArrowUp":e.preventDefault(),this._select(this._selected-1);break;case"ArrowDown":e.preventDefault(),this._select(this._selected+1);break;case"Enter":{let{ctrlKey:t,shiftKey:n,altKey:o,metaKey:a}=e,r=this._getSelectedItem();r instanceof HTMLElement&&(e.preventDefault(),r.dispatchEvent(new MouseEvent("click",{bubbles:!0,ctrlKey:t,shiftKey:n,altKey:o,metaKey:a})));break}default:return}}_getSelectedItem(){return this.shadowRoot?.querySelector("[data-selected] a")??null}_select(e){let t=(this._queryIndex.value?.length||0)+1,n=e%t;this._selected=n<0?t+e:n,setTimeout(()=>{let e=this._getSelectedItem();e instanceof HTMLElement&&e.scrollIntoView({behavior:"smooth",block:"nearest"})},0)}_submit(e){e.preventDefault();let t=this._getSelectedItem();t instanceof HTMLElement&&t.click()}_focus({target:e}){if(e instanceof HTMLElement){let t=e.closest("[data-result]");if(t instanceof HTMLElement){let e=Number.parseInt(t.dataset.result||"NaN",10);Number.isNaN(e)||(this._selected=e,this._shiftFocus=!0)}else this._shiftFocus=!1}}_globalKeydown(e){let t=e.composedPath()?.[0]||e.target;if(t instanceof HTMLElement&&(["TEXTAREA","INPUT"].includes(t.tagName)||t.isContentEditable))return;let n=globalThis.getSelection()?.toString(),o=e.key,a=e.ctrlKey||e.metaKey,r="k"===o&&a&&!e.shiftKey;("/"===o&&!a||r)&&(e.preventDefault(),this.showModal(),n&&(this._query=n))}_queryIndex=new o.YZ(this,{args:()=>[this._index,this._query],task:async([e,t])=>{if(e&&t){var n=t,o=await e;let a=n.toLowerCase().trim(),r=c(n);return o.flex.filter(({title:e})=>r.every(t=>e.includes(t))).map(({index:e,title:t,slugTail:n})=>[Number([t,n].includes(a)),e]).sort(([e],[t])=>t-e).map(([e,t])=>t).slice(0,10).map(e=>e&&(o.items||[])[e]).filter(Boolean)}}});_close(){this.shadowRoot?.querySelector("dialog")?.close()}connectedCallback(){super.connectedCallback(),this._globalKeydown=this._globalKeydown.bind(this),document.addEventListener("keydown",this._globalKeydown),this._loadIndex=this._loadIndex.bind(this),this.renderRoot.addEventListener("mouseover",this._loadIndex)}disconnectedCallback(){super.disconnectedCallback(),this.renderRoot.removeEventListener("mouseover",this._loadIndex),document.removeEventListener("keydown",this._globalKeydown)}_renderLoadingSearchIndex(){return(0,a.qy)`<progress
3
3
  aria-label=${this.l10n`Loading search index…`}
4
4
  ></progress>`}render(){let e=this._queryIndex.value?.length||0;return(0,a.qy)`
5
5
  <dialog @keydown=${this._keydown} @focusin=${this._focus} closedby="any">
@@ -53,7 +53,7 @@ export const __webpack_id__="8410";export const __webpack_ids__=["8410"];export
53
53
  </li>`:a.s6}
54
54
  </ul>
55
55
  </dialog>
56
- `}updated(){if(this._shiftFocus){let e=this._getSelectedItem();e instanceof HTMLElement&&e.focus()}}};function c(e){return(e=e.trim().toLowerCase()).startsWith(".")||e.endsWith(".")?e.split(/[ ,]+/):e.split(/[ ,.]+/)}customElements.define("mdn-search-modal",MDNSearchModal)},93526:function(e,t,n){let o;n.d(t,{L:()=>i});var a=n(79097);let r={country:"United States",country_iso:"US"},s={username:null,isAuthenticated:!1,avatarUrl:null,isSubscriber:!1,subscriptionType:null,email:null,geo:r,settings:null};function i(){return a.QD?new Promise(()=>{}):(o||(o=l().catch(e=>(console.error(e),s))),o)}async function l(){let e=await fetch("/api/v1/whoami");if(!e.ok)throw Error(e.statusText);try{let t=await e.json(),n=t?.settings?{aiHelpHistory:"boolean"==typeof t.settings?.ai_help_history?t.settings.ai_help_history:null,noAds:t.settings?.no_ads??null}:s.settings;return c.noAds=n?.noAds||!1,{username:t.username??s.username,isAuthenticated:t.is_authenticated??s.isAuthenticated,avatarUrl:t.avatar_url??s.avatarUrl,isSubscriber:t.is_subscriber??s.isSubscriber,subscriptionType:"core"===t.subscription_type?"mdn_core":t.subscription_type??s.subscriptionType,email:t.email??s.email,geo:{country:(t.geo&&t.geo.country)??r.country,country_iso:(t.geo&&t.geo.country_iso)??r.country_iso},settings:n}}catch{throw Error(e.statusText)}}let c={set noAds(value){value?globalThis.localStorage.setItem("nop","yes"):globalThis.localStorage.removeItem("nop")},get noAds(){return globalThis.localStorage?.getItem?.("nop")==="yes"}}},31051:function(e,t,n){n.a(e,async function(e,t){try{n(4591),n(68069),n(73013),n(23929),n(64989),n(64531),n(99217),n(41600);var o=n(42732),a=n(43531);n(7461);var r=n(99229),s=e([o,a,r]);[o,a,r]=s.then?(await s)():s,t()}catch(e){t(e)}})},42732:function(e,t,n){n.a(e,async function(e,t){try{for(let e of document.querySelectorAll('div.code-example pre:not(.hidden):not([class*="live-sample"]):not([class*="interactive-example"])')){let{upgradePre:t}=await Promise.all([n.e("3945"),n.e("9963"),n.e("7627"),n.e("303"),n.e("993"),n.e("3187")]).then(n.bind(n,69208));t(e)}t()}catch(e){t(e)}},1)},23929:function(){"closedBy"in HTMLDialogElement.prototype||addEventListener("click",e=>{let t=e.composedPath()[0];if(t instanceof HTMLDialogElement&&"any"===t.getAttribute("closedby")){let n=t.getBoundingClientRect(),{clientX:o,clientY:a}=e;n.top<=a&&a<=n.bottom&&n.left<=o&&o<=n.right||t.close()}})},73013:function(e,t,n){var o=n(32890),a=n(79097);let r=!document.cookie.split("; ").includes("moz-1st-party-data-opt-out=true")&&a._0;a.i7&&(o.Ay.setDebugViewTag("mdn-dev"),o.Ay.setLogPings(!0)),o.Ay.initialize("mdn-fred",r,{enableAutoPageLoadEvents:!0,enableAutoElementClickEvents:!0,channel:a.g_})},43531:function(e,t,n){n.a(e,async function(e,t){try{for(let e of document.querySelectorAll("iframe[data-live-id]"))if(e instanceof HTMLIFrameElement){let{liveId:t,livePath:o}=e.dataset;if(t){let a={},r=[],s=t.replaceAll(".",String.raw`\.`);for(let e of document.querySelectorAll(`.live-sample___${s}, .live-sample---${s}`)){let{MDNCodeExample:t,upgradePre:o}=await Promise.all([n.e("3945"),n.e("9963"),n.e("7627"),n.e("303"),n.e("993"),n.e("3187")]).then(n.bind(n,69208)),s=e instanceof t?e:o(e);if(s){r.push(s);let{language:e,code:t}=s;a[e]?a[e]+=t:a[e]=t}}await Promise.all([n.e("3945"),n.e("8427"),n.e("9963"),n.e("9478"),n.e("9914"),n.e("7627"),n.e("6480")]).then(n.bind(n,4225));let i=document.createElement("mdn-live-sample-result");for(let n of(i.liveId=t,i.code=a,i.srcPrefix=o,i.allow=e.allow||void 0,i.sandbox=e.sandbox.toString(),i.height=e.height,e.closest(".code-example")?.replaceWith(i),r))n.liveSample||=i}}t()}catch(e){t(e)}},1)},64989:function(e,t,n){let o=new Set;for(let e of document.querySelectorAll("*")){let t=e.tagName.toLowerCase();if(t.startsWith("mdn-")||"interactive-example"===t){let e=t.replace("mdn-","");o.has(e)||(o.add(e),n(47479)(`./${e}/element.js`).catch(t=>{console.error(`couldn't load code for <${e}>: does the element's code not match the naming schema?`,t)}))}}},64531:function(){let e=document.querySelector(".left-sidebar"),t=e?.querySelector('[aria-current="page"]');e&&t instanceof HTMLElement&&e.scrollTo({top:t.offsetTop-window.innerHeight/4})},7461:function(e,t,n){var o=n(49818);let a=document.querySelector('.a11y-menu a[href="#search"]');if(a instanceof HTMLAnchorElement){let e=document.querySelector("#search");e instanceof o.MDNSearchModal?a.addEventListener("click",t=>{let{target:n}=t;n instanceof HTMLElement&&(n.blur(),t.preventDefault()),e.showModal()}):(console.error("MDNSearchModal not found!"),a.hidden=!0)}},41600:function(){for(let e of document.querySelectorAll(".generic-toc, .reference-toc, .document-toc, .blog-toc"))e instanceof HTMLElement&&function(e){let t=[...e.querySelectorAll("a")],n=new Map;for(let e of t.reverse()){let t=document.querySelector(`[id="${decodeURIComponent(e.hash).slice(1)}"]`);if(!t)continue;let o=t.closest("section");for(;o&&o instanceof HTMLElement&&!n.has(o);)n.set(o,e),o=o.nextElementSibling}let o=new WeakMap,a=new Set,r={threshold:0},s=document.querySelector("header");s instanceof HTMLElement&&(r.rootMargin=`-${s.clientHeight}px 0px 0px 0px`);let i=new IntersectionObserver(e=>{for(let{target:t,isIntersecting:r}of e){if(!(t instanceof HTMLElement))continue;if(!a.has(t))if(!r)continue;else a.add(t);let e=n.get(t);if(!e)continue;let s=(o.get(e)??0)+(r?1:-1);e.ariaCurrent=s>0?"true":null,o.set(e,s)}},r);for(let e of n.keys())i.observe(e)}(e)},99229:function(e,t,n){n.a(e,async function(e,t){try{var o=n(93526);try{let e=await (0,o.L)(),t=new Date(localStorage.getItem("next-ping")||0);if(navigator.sendBeacon&&e.isAuthenticated&&t<new Date){let e=new URLSearchParams;navigator.sendBeacon("/api/v1/ping",e);let t=new Date;t.setUTCDate(t.getUTCDate()+1),t.setUTCHours(0),t.setUTCMinutes(0),t.setUTCSeconds(0),t.setUTCMilliseconds(0),localStorage.setItem("next-ping",t.toISOString())}}catch(e){console.error("Failed to send ping",e)}t()}catch(e){t(e)}},1)},86484:function(e,t,n){n.d(t,{J:()=>m});var o=n(24909),a=n(81233),r=n(58055);let s=`# TODO Use comments, see: https://firefox-source-docs.mozilla.org/l10n/fluent/review.html#comments
56
+ `}updated(){if(this._shiftFocus){let e=this._getSelectedItem();e instanceof HTMLElement&&e.focus()}}};function c(e){return(e=e.trim().toLowerCase()).startsWith(".")||e.endsWith(".")?e.split(/[ ,]+/):e.split(/[ ,.]+/)}customElements.define("mdn-search-modal",MDNSearchModal)},93526:function(e,t,n){let o;n.d(t,{L:()=>i});var a=n(36728);let r={country:"United States",country_iso:"US"},s={username:null,isAuthenticated:!1,avatarUrl:null,isSubscriber:!1,subscriptionType:null,email:null,geo:r,settings:null};function i(){return a.QD?new Promise(()=>{}):(o||(o=l().catch(e=>(console.error(e),s))),o)}async function l(){let e=await fetch("/api/v1/whoami");if(!e.ok)throw Error(e.statusText);try{let t=await e.json(),n=t?.settings?{aiHelpHistory:"boolean"==typeof t.settings?.ai_help_history?t.settings.ai_help_history:null,noAds:t.settings?.no_ads??null}:s.settings;return c.noAds=n?.noAds||!1,{username:t.username??s.username,isAuthenticated:t.is_authenticated??s.isAuthenticated,avatarUrl:t.avatar_url??s.avatarUrl,isSubscriber:t.is_subscriber??s.isSubscriber,subscriptionType:"core"===t.subscription_type?"mdn_core":t.subscription_type??s.subscriptionType,email:t.email??s.email,geo:{country:(t.geo&&t.geo.country)??r.country,country_iso:(t.geo&&t.geo.country_iso)??r.country_iso},settings:n}}catch{throw Error(e.statusText)}}let c={set noAds(value){value?globalThis.localStorage.setItem("nop","yes"):globalThis.localStorage.removeItem("nop")},get noAds(){return globalThis.localStorage?.getItem?.("nop")==="yes"}}},31051:function(e,t,n){n.a(e,async function(e,t){try{n(4591),n(68069),n(73013),n(23929),n(64989),n(64531),n(99217),n(41600);var o=n(42732),a=n(43531);n(7461);var r=n(99229),s=e([o,a,r]);[o,a,r]=s.then?(await s)():s,t()}catch(e){t(e)}})},42732:function(e,t,n){n.a(e,async function(e,t){try{for(let e of document.querySelectorAll('div.code-example pre:not(.hidden):not([class*="live-sample"]):not([class*="interactive-example"])')){let{upgradePre:t}=await Promise.all([n.e("3945"),n.e("9963"),n.e("7627"),n.e("303"),n.e("993"),n.e("3187")]).then(n.bind(n,69208));t(e)}t()}catch(e){t(e)}},1)},23929:function(){"closedBy"in HTMLDialogElement.prototype||addEventListener("click",e=>{let t=e.composedPath()[0];if(t instanceof HTMLDialogElement&&"any"===t.getAttribute("closedby")){let n=t.getBoundingClientRect(),{clientX:o,clientY:a}=e;n.top<=a&&a<=n.bottom&&n.left<=o&&o<=n.right||t.close()}})},73013:function(e,t,n){var o=n(32890),a=n(36728);let r=!document.cookie.split("; ").includes("moz-1st-party-data-opt-out=true")&&a._0;a.i7&&(o.Ay.setDebugViewTag("mdn-dev"),o.Ay.setLogPings(!0)),o.Ay.initialize("mdn-fred",r,{enableAutoPageLoadEvents:!0,enableAutoElementClickEvents:!0,channel:a.g_})},43531:function(e,t,n){n.a(e,async function(e,t){try{for(let e of document.querySelectorAll("iframe[data-live-id]"))if(e instanceof HTMLIFrameElement){let{liveId:t,livePath:o}=e.dataset;if(t){let a={},r=[],s=t.replaceAll(".",String.raw`\.`);for(let e of document.querySelectorAll(`.live-sample___${s}, .live-sample---${s}`)){let{MDNCodeExample:t,upgradePre:o}=await Promise.all([n.e("3945"),n.e("9963"),n.e("7627"),n.e("303"),n.e("993"),n.e("3187")]).then(n.bind(n,69208)),s=e instanceof t?e:o(e);if(s){r.push(s);let{language:e,code:t}=s;a[e]?a[e]+=t:a[e]=t}}await Promise.all([n.e("3945"),n.e("8427"),n.e("9963"),n.e("9478"),n.e("9914"),n.e("7627"),n.e("6480")]).then(n.bind(n,4225));let i=document.createElement("mdn-live-sample-result");for(let n of(i.liveId=t,i.code=a,i.srcPrefix=o,i.allow=e.allow||void 0,i.sandbox=e.sandbox.toString(),i.height=e.height,e.closest(".code-example")?.replaceWith(i),r))n.liveSample||=i}}t()}catch(e){t(e)}},1)},64989:function(e,t,n){let o=new Set;for(let e of document.querySelectorAll("*")){let t=e.tagName.toLowerCase();if(t.startsWith("mdn-")||"interactive-example"===t){let e=t.replace("mdn-","");o.has(e)||(o.add(e),n(47479)(`./${e}/element.js`).catch(t=>{console.error(`couldn't load code for <${e}>: does the element's code not match the naming schema?`,t)}))}}},64531:function(){let e=document.querySelector(".left-sidebar"),t=e?.querySelector('[aria-current="page"]');e&&t instanceof HTMLElement&&e.scrollTo({top:t.offsetTop-window.innerHeight/4})},7461:function(e,t,n){var o=n(49818);let a=document.querySelector('.a11y-menu a[href="#search"]');if(a instanceof HTMLAnchorElement){let e=document.querySelector("#search");e instanceof o.MDNSearchModal?a.addEventListener("click",t=>{let{target:n}=t;n instanceof HTMLElement&&(n.blur(),t.preventDefault()),e.showModal()}):(console.error("MDNSearchModal not found!"),a.hidden=!0)}},41600:function(){for(let e of document.querySelectorAll(".generic-toc, .reference-toc, .document-toc, .blog-toc"))e instanceof HTMLElement&&function(e){let t=[...e.querySelectorAll("a")],n=new Map;for(let e of t.reverse()){let t=document.querySelector(`[id="${decodeURIComponent(e.hash).slice(1)}"]`);if(!t)continue;let o=t.closest("section");for(;o&&o instanceof HTMLElement&&!n.has(o);)n.set(o,e),o=o.nextElementSibling}let o=new WeakMap,a=new Set,r={threshold:0},s=document.querySelector("header");s instanceof HTMLElement&&(r.rootMargin=`-${s.clientHeight}px 0px 0px 0px`);let i=new IntersectionObserver(e=>{for(let{target:t,isIntersecting:r}of e){if(!(t instanceof HTMLElement))continue;if(!a.has(t))if(!r)continue;else a.add(t);let e=n.get(t);if(!e)continue;let s=(o.get(e)??0)+(r?1:-1);e.ariaCurrent=s>0?"true":null,o.set(e,s)}},r);for(let e of n.keys())i.observe(e)}(e)},99229:function(e,t,n){n.a(e,async function(e,t){try{var o=n(93526);try{let e=await (0,o.L)(),t=new Date(localStorage.getItem("next-ping")||0);if(navigator.sendBeacon&&e.isAuthenticated&&t<new Date){let e=new URLSearchParams;navigator.sendBeacon("/api/v1/ping",e);let t=new Date;t.setUTCDate(t.getUTCDate()+1),t.setUTCHours(0),t.setUTCMinutes(0),t.setUTCSeconds(0),t.setUTCMilliseconds(0),localStorage.setItem("next-ping",t.toISOString())}}catch(e){console.error("Failed to send ping",e)}t()}catch(e){t(e)}},1)},86484:function(e,t,n){n.d(t,{J:()=>m});var o=n(24909),a=n(81233),r=n(58055);let s=`# TODO Use comments, see: https://firefox-source-docs.mozilla.org/l10n/fluent/review.html#comments
57
57
  # TODO Consider using terms, see: https://firefox-source-docs.mozilla.org/l10n/fluent/review.html#terms and https://projectfluent.org/fluent/guide/references.html#message-references
58
58
 
59
59
  article-footer-last-modified = This page was last modified on <time data-l10n-name="date">{ $date }</time> by <a data-l10n-name="contributors">MDN contributors</a>.
@@ -258,5 +258,5 @@ obs-mdn = Das HTTP Observatory bietet wirksame Sicherheitseinblicke auf Grundlag
258
258
  `,ru:`blog-toc-title = В этой статье
259
259
  `,"zh-CN":`blog-toc-title = 在本文中
260
260
  `,"zh-TW":`blog-toc-title = 在本文中
261
- `},l=["i","strong","br","em"],c=["title","aria-label"];let Fluent=class Fluent{constructor(e="en-US",t=[]){this.locale=e,this.usBundle=Fluent.constructBundle(new o.Np(e),[s]),t.length>0&&(this.bundle=Fluent.constructBundle(new o.Np(e),[s,...t]))}static constructBundle(e,t=[]){for(let n of t){let t=e.addResource(new o.B$(n),{allowOverrides:!0});t.length>0&&console.error(t)}return e}get(e,t,n,o){let a=this.getMessage(e,t,n);if(a)return Fluent.sanitize(a,o)}static sanitize(e,t={}){let n={};for(let e of Object.values(t))n[e.tag]=[...Object.keys(e).filter(e=>"tag"!==e),...c];let o=[...Object.values(t).map(e=>e.tag),...l],s=!0,i=a(e,{allowedAttributes:n,allowedTags:o,allowedSchemes:["http","https","mailto"],filter(e){let n=e.attrs["data-l10n-name"];if(n)for(let[o,a]of Object.entries(t[n]||{}))e.attrs[o]=a;return!!(l.includes(e.tag)||n&&Object.keys(t).includes(n)&&t[n]?.tag===e.tag)&&(s=!1,!0)}},!0);return s?i:(0,r._)(i)}getMessage(e,t,n={},o=this.bundle,a=!1){let r,s=o?o.getMessage(e):void 0;if("qa"===this.locale)return`[${e}${t?`.${t}`:""}]`;if(!s){if(a)return;return this.getMessage(e,t,n,this.usBundle,!0)}if(t){if(!(r=s.attributes[t])){if(a)return;return this.getMessage(e,t,n,this.usBundle,!0)}}else s.value&&(r=s.value);if(!r||!o)return"";let i=[],l=o?.formatPattern(r,n,i);return i.length>0&&console.error(i),l}};let d=new Map;function u(e){if(e){if(!d.has(e)){let t=i[e],n=new Fluent(e,t?[t]:void 0);d.set(e,n)}return d.get(e)}}let m=e=>class extends e{constructor(...e){super(...e);let t=function(){let e=globalThis.__MDNServerContext?.getStore(),t=globalThis.__MDNClientContext;return e||t}();this.locale=t.locale,this.l10n=function(e){function t(t,n){if("string"==typeof t){let n=u(e)?.get(t),o=`[${t}]`,a=e=>{let t=e[0];return n||t||o};return a.toString=()=>"string"==typeof n&&n||o,a}return t[0]||""}return t.raw=function({id:t,attr:n,args:o,elements:a}){let r=u(e);return r?r.get(t,n,o,a):`[${t}]`},t}(this.locale)}}},4591:function(){globalThis.__MDNClientContext={locale:globalThis.location.pathname.split("/")[1]||"en-US"}},90528:function(e,t,n){n.d(t,{o:()=>o});function o(e,t){let n=e.replaceAll("_"," ").split("/").filter(e=>!["",t,"docs"].includes(e));return(n=n.map(e=>"API"===e?"Web APIs":e)).length>1&&"Web"===n.at(0)&&n.splice(0,1),n.length>1&&n.splice(-1,1),n.join(" / ")}}};import e from"./runtime.05472639a6b3fea7.js";import*as t from"./5935.390ff5bf30990a40.js";e.C(t);import*as n from"./1127.f5563db9beba3133.js";e.C(n);import*as o from"./index.dfccf913556b909a.js";e.C(o),e(e.s=31051);
262
- //# sourceMappingURL=index.dfccf913556b909a.js.map
261
+ `},l=["i","strong","br","em"],c=["title","aria-label"];let Fluent=class Fluent{constructor(e="en-US",t=[]){this.locale=e,this.usBundle=Fluent.constructBundle(new o.Np(e),[s]),t.length>0&&(this.bundle=Fluent.constructBundle(new o.Np(e),[s,...t]))}static constructBundle(e,t=[]){for(let n of t){let t=e.addResource(new o.B$(n),{allowOverrides:!0});t.length>0&&console.error(t)}return e}get(e,t,n,o){let a=this.getMessage(e,t,n);if(a)return Fluent.sanitize(a,o)}static sanitize(e,t={}){let n={};for(let e of Object.values(t))n[e.tag]=[...Object.keys(e).filter(e=>"tag"!==e),...c];let o=[...Object.values(t).map(e=>e.tag),...l],s=!0,i=a(e,{allowedAttributes:n,allowedTags:o,allowedSchemes:["http","https","mailto"],filter(e){let n=e.attrs["data-l10n-name"];if(n)for(let[o,a]of Object.entries(t[n]||{}))e.attrs[o]=a;return!!(l.includes(e.tag)||n&&Object.keys(t).includes(n)&&t[n]?.tag===e.tag)&&(s=!1,!0)}},!0);return s?i:(0,r._)(i)}getMessage(e,t,n={},o=this.bundle,a=!1){let r,s=o?o.getMessage(e):void 0;if("qa"===this.locale)return`[${e}${t?`.${t}`:""}]`;if(!s){if(a)return;return this.getMessage(e,t,n,this.usBundle,!0)}if(t){if(!(r=s.attributes[t])){if(a)return;return this.getMessage(e,t,n,this.usBundle,!0)}}else s.value&&(r=s.value);if(!r||!o)return"";let i=[],l=o?.formatPattern(r,n,i);return i.length>0&&console.error(i),l}};let d=new Map;function u(e){if(e){if(!d.has(e)){let t=i[e],n=new Fluent(e,t?[t]:void 0);d.set(e,n)}return d.get(e)}}let m=e=>class extends e{constructor(...e){super(...e);let t=function(){let e=globalThis.__MDNServerContext?.getStore(),t=globalThis.__MDNClientContext;return e||t}();this.locale=t.locale,this.l10n=function(e){function t(t,n){if("string"==typeof t){let n=u(e)?.get(t),o=`[${t}]`,a=e=>{let t=e[0];return n||t||o};return a.toString=()=>"string"==typeof n&&n||o,a}return t[0]||""}return t.raw=function({id:t,attr:n,args:o,elements:a}){let r=u(e);return r?r.get(t,n,o,a):`[${t}]`},t}(this.locale)}}},4591:function(){globalThis.__MDNClientContext={locale:globalThis.location.pathname.split("/")[1]||"en-US"}},90528:function(e,t,n){n.d(t,{o:()=>o});function o(e,t){let n=e.replaceAll("_"," ").split("/").filter(e=>!["",t,"docs"].includes(e));return(n=n.map(e=>"API"===e?"Web APIs":e)).length>1&&"Web"===n.at(0)&&n.splice(0,1),n.length>1&&n.splice(-1,1),n.join(" / ")}}};import e from"./runtime.3216007ef48b58b9.js";import*as t from"./5935.390ff5bf30990a40.js";e.C(t);import*as n from"./1127.f5563db9beba3133.js";e.C(n);import*as o from"./index.0910bee955d71d1b.js";e.C(o),e(e.s=31051);
262
+ //# sourceMappingURL=index.0910bee955d71d1b.js.map