@mdn/fred 1.6.2 → 1.8.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 (149) hide show
  1. package/.env-dist +4 -0
  2. package/CHANGELOG.md +66 -0
  3. package/CONTRIBUTING.md +2 -2
  4. package/README.md +31 -2
  5. package/build/eslint-fred.js +6 -4
  6. package/build/plugins/generate-element-map.js +3 -2
  7. package/build/utils.js +0 -23
  8. package/components/breadcrumbs-bar/server.css +12 -0
  9. package/components/color-theme/element.js +1 -0
  10. package/components/content-feedback/element.js +58 -22
  11. package/components/content-section/server.css +15 -2
  12. package/components/curriculum/module.css +1 -0
  13. package/components/curriculum-module/server.css +1 -0
  14. package/components/env/index.js +6 -0
  15. package/components/footer/server.js +1 -1
  16. package/components/heading-anchor/server.js +0 -2
  17. package/components/issues-table/element.js +6 -4
  18. package/components/language-switcher/element.js +1 -0
  19. package/components/live-sample-result/element.js +1 -0
  20. package/components/menu/base.css +2 -1
  21. package/components/menu/constants.js +438 -147
  22. package/components/menu/missing-docs.json +133 -0
  23. package/components/menu/server.js +78 -657
  24. package/components/menu/types.d.ts +50 -0
  25. package/components/menu/update-missing-docs.js +66 -0
  26. package/components/modal/element.js +3 -2
  27. package/components/navigation/server.js +1 -1
  28. package/components/observatory-tests-and-scores/element.js +13 -7
  29. package/components/outer-layout/utils.js +2 -2
  30. package/components/play-runner/element.js +14 -6
  31. package/components/playground/element.js +11 -5
  32. package/components/recently-visited/element.js +4 -2
  33. package/components/scrim-inline/element.js +11 -5
  34. package/components/search-modal/element.js +1 -0
  35. package/components/writer-reload/element.js +10 -2
  36. package/entry.client.js +1 -0
  37. package/hooks/ga-init.js +31 -0
  38. package/hooks/glean-init.js +2 -6
  39. package/l10n/en-US.ftl +6 -0
  40. package/l10n/fr.ftl +145 -1
  41. package/out/service-worker.js +1 -1
  42. package/out/service-worker.js.map +1 -1
  43. package/out/static/client/{1231.84c230e0fa92f2d4.js → 1231.6a66b96b566b2cca.js} +14 -10
  44. package/out/static/client/1231.6a66b96b566b2cca.js.map +1 -0
  45. package/out/static/client/{2190.7995f19655987265.js → 2190.a21d8b0d7b75a20d.js} +5 -5
  46. package/out/static/client/2190.a21d8b0d7b75a20d.js.map +1 -0
  47. package/out/static/client/{2319.2034183eaacce69a.js → 2319.a419f6d93c814f50.js} +12 -8
  48. package/out/static/client/2319.a419f6d93c814f50.js.map +1 -0
  49. package/out/static/client/{3092.94a3edc866458ab7.js → 3092.54b703ff89ccdaf7.js} +6 -6
  50. package/out/static/client/3092.54b703ff89ccdaf7.js.map +1 -0
  51. package/out/static/client/{3200.024a6b1d06d80026.js → 3200.dc89d9709a81e853.js} +2 -1
  52. package/out/static/client/{3200.024a6b1d06d80026.js.map → 3200.dc89d9709a81e853.js.map} +1 -1
  53. package/out/static/client/{486.bb14d2f437221509.js → 486.b6950b0a4cfb9116.js} +2 -2
  54. package/out/static/client/{486.bb14d2f437221509.js.map → 486.b6950b0a4cfb9116.js.map} +1 -1
  55. package/out/static/client/{5446.3e0ac5aa93616c6f.js → 5446.2e663885069b1680.js} +4 -2
  56. package/out/static/client/5446.2e663885069b1680.js.map +1 -0
  57. package/out/static/client/{603.775311ee1356e86f.js → 603.45bf3e185d1b890d.js} +7 -7
  58. package/out/static/client/603.45bf3e185d1b890d.js.map +1 -0
  59. package/out/static/client/{6465.08012ddcd4597c76.js → 6465.2dc41017ae6abc34.js} +2 -1
  60. package/out/static/client/6465.2dc41017ae6abc34.js.map +1 -0
  61. package/out/static/client/{6480.09f744cd2fb69ed8.js → 6480.c839ead24f125a7e.js} +3 -2
  62. package/out/static/client/{6480.09f744cd2fb69ed8.js.map → 6480.c839ead24f125a7e.js.map} +1 -1
  63. package/out/static/client/7185.278701dcd05fcd30.js +2 -0
  64. package/out/static/client/7185.278701dcd05fcd30.js.map +1 -0
  65. package/out/static/client/9379.edc05ee9f550804e.js +2 -0
  66. package/out/static/client/9379.edc05ee9f550804e.js.map +1 -0
  67. package/out/static/client/{9784.3c73a0debfcca553.js → 9784.1c8d6e465137fd58.js} +13 -9
  68. package/out/static/client/{9784.3c73a0debfcca553.js.map → 9784.1c8d6e465137fd58.js.map} +1 -1
  69. package/out/static/client/{9804.d9ffbe6b7c44eab3.js → 9804.ba52ea55253eca7b.js} +2 -2
  70. package/out/static/client/{9804.d9ffbe6b7c44eab3.js.map → 9804.ba52ea55253eca7b.js.map} +1 -1
  71. package/out/static/client/9914.021220acc0d3e777.js +11 -0
  72. package/out/static/client/9914.021220acc0d3e777.js.map +1 -0
  73. package/out/static/client/index.0f05d4ac6b3b88a1.js +419 -0
  74. package/out/static/client/index.0f05d4ac6b3b88a1.js.map +1 -0
  75. package/out/static/client/{runtime.b178b9749f31202a.js → runtime.c323b9d2153b4ebf.js} +2 -2
  76. package/out/static/client/{runtime.b178b9749f31202a.js.map → runtime.c323b9d2153b4ebf.js.map} +1 -1
  77. package/out/static/client/stats.json +200 -200
  78. package/out/static/client/styles-breadcrumbs-bar.02910e49bb8b2372.css +2 -0
  79. package/out/static/client/styles-breadcrumbs-bar.02910e49bb8b2372.css.map +1 -0
  80. package/out/static/client/{styles-content-section.d18f07ab3d79a1d2.css → styles-content-section.6dc04fb9b3f3d595.css} +2 -2
  81. package/out/static/client/{styles-content-section.d18f07ab3d79a1d2.css.map → styles-content-section.6dc04fb9b3f3d595.css.map} +1 -1
  82. package/out/static/client/styles-curriculum-landing.cbaf6ff367369a26.css.map +1 -1
  83. package/out/static/client/styles-curriculum-module.c7ec78d3e724cf64.css.map +1 -1
  84. package/out/static/client/{styles-global.fb7afecd89ca2dff.js → styles-global.01d60465c4584631.js} +1 -1
  85. package/out/static/client/styles-global.4031cdde644ed6ce.css +2 -0
  86. package/out/static/client/{styles-global.684fd2c5254c94b8.css.map → styles-global.4031cdde644ed6ce.css.map} +1 -1
  87. package/out/static/client/styles-menu.c41c14be9597dcd9.css +2 -0
  88. package/out/static/client/styles-menu.c41c14be9597dcd9.css.map +1 -0
  89. package/out/static/client/watify_bg.c5a182c47876cd2b.wasm +0 -0
  90. package/out/static/legacy/{1539.ad5e9bc68ca36ebd.js → 1539.f16c6732d55f64b7.js} +3 -3
  91. package/out/static/legacy/{1539.ad5e9bc68ca36ebd.js.map → 1539.f16c6732d55f64b7.js.map} +1 -1
  92. package/out/static/legacy/7185.278701dcd05fcd30.js +2 -0
  93. package/out/static/legacy/7185.278701dcd05fcd30.js.map +1 -0
  94. package/out/static/legacy/asset-manifest.json +9 -9
  95. package/out/static/legacy/{index.ad3600b01e18974e.html → index.19cded28f6c1e506.html} +1 -1
  96. package/out/static/legacy/{index.5592b02d966df8ba.js → index.e979e65eb8758f6f.js} +3 -3
  97. package/out/static/legacy/{index.5592b02d966df8ba.js.map → index.e979e65eb8758f6f.js.map} +1 -1
  98. package/out/static/legacy/stats.json +13 -13
  99. package/out/static/legacy/watify_bg.c5a182c47876cd2b.wasm +0 -0
  100. package/out/static/legacy/{yari.8ce0be252d1ae155.js → yari.7f26dc58679ef833.js} +3 -3
  101. package/out/static/legacy/{yari.8ce0be252d1ae155.js.map → yari.7f26dc58679ef833.js.map} +1 -1
  102. package/out/static/ssr/7185.js +1 -1
  103. package/out/static/ssr/7185.js.map +1 -1
  104. package/out/static/ssr/index.js +369 -620
  105. package/out/static/ssr/index.js.map +1 -1
  106. package/out/static/ssr/stats.json +4 -4
  107. package/out/static/ssr/watify_bg.c5a182c47876cd2b.wasm +0 -0
  108. package/package.json +20 -20
  109. package/scripts/npm-test.js +22 -0
  110. package/server.js +22 -4
  111. package/utils/dnt-helper.js +59 -0
  112. package/utils/name-transformation.js +40 -0
  113. package/utils/telemetry-opt-out.js +12 -0
  114. package/wdio.conf.js +4 -2
  115. package/components/menu/check-missing-docs.js +0 -44
  116. package/out/static/client/1231.84c230e0fa92f2d4.js.map +0 -1
  117. package/out/static/client/2190.7995f19655987265.js.map +0 -1
  118. package/out/static/client/2319.2034183eaacce69a.js.map +0 -1
  119. package/out/static/client/3092.94a3edc866458ab7.js.map +0 -1
  120. package/out/static/client/5446.3e0ac5aa93616c6f.js.map +0 -1
  121. package/out/static/client/603.775311ee1356e86f.js.map +0 -1
  122. package/out/static/client/6465.08012ddcd4597c76.js.map +0 -1
  123. package/out/static/client/7185.a014a928e9a39779.js +0 -2
  124. package/out/static/client/7185.a014a928e9a39779.js.map +0 -1
  125. package/out/static/client/9379.7cdf58b4fb5efa66.js +0 -2
  126. package/out/static/client/9379.7cdf58b4fb5efa66.js.map +0 -1
  127. package/out/static/client/9914.251fe19f0038e97b.js +0 -11
  128. package/out/static/client/9914.251fe19f0038e97b.js.map +0 -1
  129. package/out/static/client/index.26176fe4ab13dce5.js +0 -268
  130. package/out/static/client/index.26176fe4ab13dce5.js.map +0 -1
  131. package/out/static/client/styles-breadcrumbs-bar.e2fa6dfb04a38166.css +0 -2
  132. package/out/static/client/styles-breadcrumbs-bar.e2fa6dfb04a38166.css.map +0 -1
  133. package/out/static/client/styles-global.684fd2c5254c94b8.css +0 -2
  134. package/out/static/client/styles-menu.5193bf2642ae7d64.css +0 -2
  135. package/out/static/client/styles-menu.5193bf2642ae7d64.css.map +0 -1
  136. package/out/static/client/watify_bg.9877982a693ec402.wasm +0 -0
  137. package/out/static/legacy/7185.a014a928e9a39779.js +0 -2
  138. package/out/static/legacy/7185.a014a928e9a39779.js.map +0 -1
  139. package/out/static/legacy/watify_bg.9877982a693ec402.wasm +0 -0
  140. package/out/static/ssr/watify_bg.9877982a693ec402.wasm +0 -0
  141. /package/out/static/client/{2190.7995f19655987265.js.LICENSE.txt → 2190.a21d8b0d7b75a20d.js.LICENSE.txt} +0 -0
  142. /package/out/static/client/{2319.2034183eaacce69a.js.LICENSE.txt → 2319.a419f6d93c814f50.js.LICENSE.txt} +0 -0
  143. /package/out/static/client/{603.775311ee1356e86f.js.LICENSE.txt → 603.45bf3e185d1b890d.js.LICENSE.txt} +0 -0
  144. /package/out/static/client/{6480.09f744cd2fb69ed8.js.LICENSE.txt → 6480.c839ead24f125a7e.js.LICENSE.txt} +0 -0
  145. /package/out/static/client/{9784.3c73a0debfcca553.js.LICENSE.txt → 9784.1c8d6e465137fd58.js.LICENSE.txt} +0 -0
  146. /package/out/static/client/{index.26176fe4ab13dce5.js.LICENSE.txt → index.0f05d4ac6b3b88a1.js.LICENSE.txt} +0 -0
  147. /package/out/static/legacy/{1539.ad5e9bc68ca36ebd.js.LICENSE.txt → 1539.f16c6732d55f64b7.js.LICENSE.txt} +0 -0
  148. /package/out/static/legacy/{index.5592b02d966df8ba.js.LICENSE.txt → index.e979e65eb8758f6f.js.LICENSE.txt} +0 -0
  149. /package/out/static/legacy/{yari.8ce0be252d1ae155.js.LICENSE.txt → yari.7f26dc58679ef833.js.LICENSE.txt} +0 -0
@@ -1,9 +1,9 @@
1
- /*! For license information please see 9784.3c73a0debfcca553.js.LICENSE.txt */
1
+ /*! For license information please see 9784.1c8d6e465137fd58.js.LICENSE.txt */
2
2
  export const __webpack_id__="9784";export const __webpack_ids__=["9784"];export const __webpack_modules__={68552:function(e,t,n){n.d(t,{A:()=>c});var r=n(63819),o=n(31601),i=n.n(o),a=n(76314),s=n.n(a),l=n(55196),d=s()(i());d.i(l.A),d.push([e.id,'.wrapper{display:grid;gap:1rem;grid-template-areas:"left runner";grid-template-columns:1fr 1fr;grid-template-rows:1fr;height:100%}.wrapper section{display:flex;flex-direction:column;flex-grow:1;gap:1rem;grid-area:left}:is(.wrapper section) aside{align-items:center;border:var(--border);border-radius:.25rem;display:flex;flex-wrap:wrap;gap:.5rem;padding:.5rem}:is(:is(.wrapper section) aside) h1{font-size:var(--font-size-normal);margin:0 auto 0 0}:is(:is(.wrapper section) aside) menu{display:flex;flex-wrap:wrap;gap:.5rem;margin:0;padding:0}:is(.wrapper section) details{border:var(--border);border-radius:.25rem;flex-direction:column;flex-shrink:0;overflow:hidden}[open]:is(:is(.wrapper section) details){flex-basis:0;flex-grow:1;min-height:12rem}[open]:is(:is(.wrapper section) details) mdn-play-editor{display:block}:is(:is(.wrapper section) details)::details-content{display:contents}:is(:is(.wrapper section) details) summary{cursor:pointer;height:2em;line-height:var(--font-line-ui);padding:.5em;-webkit-user-select:none;user-select:none}:is(:is(.wrapper section) details) mdn-play-editor{display:none;height:calc(100% - 2em)}.playground__runner-console:is(.wrapper section){border:var(--border);border-radius:.25rem;grid-area:runner;overflow:hidden}.playground__runner-console:is(.wrapper section) mdn-play-runner{flex-grow:1}.playground__runner-console:is(.wrapper section) .playground__console{background-color:var(--color-background-secondary);border-top:var(--border)}:is(.playground__runner-console:is(.wrapper section) .playground__console) div{font-size:var(--font-size-small);font-weight:var(--font-weight-bold);text-align:center}:is(.playground__runner-console:is(.wrapper section) .playground__console) mdn-play-console{height:6rem}.wrapper mdn-placement-sidebar{grid-area:place;justify-self:center}@media (width <= 992px){.wrapper{display:flex;flex-direction:column}}mdn-modal section{display:flex;flex-direction:column;gap:.5rem}:is(mdn-modal section):first-child{margin-bottom:1rem}mdn-modal h2{font-size:var(--font-size-normal);font-weight:400;margin:0}mdn-modal label{display:flex;flex-direction:column;gap:.5rem}mdn-modal p{margin:0}mdn-modal.share section{align-items:center}mdn-modal.report section:last-child{flex-direction:row;justify-content:flex-end}',""]);let c=(0,r.AH)([d.toString()])},55196:function(e,t,n){n.d(t,{A:()=>s});var r=n(31601),o=n.n(r),i=n(76314),a=n.n(i)()(o());a.push([e.id,"*,:after,:before{box-sizing:border-box}button,input,select,textarea{font:inherit}button{color:inherit;cursor:pointer}img{height:auto;max-width:100%}a{color:var(--color-link-normal)}[hidden]{display:none!important}",""]);let s=a.toString()},730:function(e,t,n){n.r(t),n.d(t,{MDNLoginButton:()=>MDNLoginButton});var r=n(63819);n(99638);var o=n(86484),i=n(36728);let MDNLoginButton=class MDNLoginButton extends(0,o.J)(r.WF){static ssr=!1;get _loginUrl(){let e=location.href.replace(location.origin,""),t=new URL(i.vQ,location.origin);return t.search=new URLSearchParams({next:e}).toString(),t.toString()}render(){return(0,r.qy)`<mdn-button href=${this._loginUrl}
3
3
  >${this.l10n`Login`}</mdn-button
4
4
  >`}};customElements.define("mdn-login-button",MDNLoginButton)},75259:function(e,t,n){n.r(t),n.d(t,{MDNPlayground:()=>MDNPlayground});var r=n(64889),o=n(63819),i=n(69392),a=n(86484),s=n(39943),l=n(93526),d=n(68552),c=n(45842);n(99723),n(99638),n(20002),n(86129),n(75143),n(53343),n(730);let p="playground-session-code";let MDNPlayground=class MDNPlayground extends(0,a.J)(o.WF){static styles=d.A;static properties={_gistID:{state:!0}};constructor(){super(),this._permalink="",this._autoRun=!0,this._gistId=void 0}_controller=(0,i._)();_shareModal=(0,i._)();_reportModal=(0,i._)();_user=new r.YZ(this,{task:async()=>await (0,l.L)()});_format(){this._controller.value?.format()}_run(){let e=this._controller.value;e&&(e.run(),this._autoRun||(this._autoRun=!0,e.runOnChange=!0,this._storeSession()))}_share(){this._shareModal.value?.showModal()}_clear(){let e=this._controller.value;if(confirm(this.l10n`Do you really want to clear everything?`)&&e){e.clear(),this._autoRun=!0,this._storeSession(),this.requestUpdate();let t=new URL(location.href);t.search="",history.replaceState(void 0,"",t)}}_reset(){let e=this._controller.value;confirm(this.l10n`Do you really want to revert your changes?`)&&e&&(e.reset(),this._storeSession(),this.requestUpdate())}async _copyMarkdown(){let e=this._controller.value;if(e){let t=Object.entries(e.code).map(([e,t])=>t&&`\`\`\`${e}
5
5
  ${t}
6
- \`\`\``).filter(Boolean).join("\n\n");await navigator.clipboard.writeText(t)}}async _createPermalink(){let e=this._controller.value;if(e){let t=await fetch("/api/v1/play/",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e.code)}),{id:n}=await t.json(),r=new URL(location.href);r.search=new URLSearchParams({id:n}).toString(),e.initialCode=e.code,this._permalink=r.toString(),history.replaceState(void 0,"",r),this.requestUpdate()}}async _copyPermalink(){this._permalink&&await navigator.clipboard.writeText(this._permalink)}_storeSession(){let e=this._controller.value;if(e){let{srcPrefix:t,initialCode:n,code:r}=e,o={srcPrefix:t,initialCode:n,code:r,autoRun:this._autoRun};sessionStorage.setItem(p,JSON.stringify(o))}}_loadSession(){let{srcPrefix:e,initialCode:t,code:n,autoRun:r}=u(JSON.parse(sessionStorage.getItem(p)||"{}")),o=this._controller.value;o&&(!1===r&&(this._autoRun=!1,o.runOnStart=!1,o.runOnChange=!1),o.srcPrefix=e,o.initialCode=t,o.code=n,this.requestUpdate())}async _loadFromUrl(){let e=this._controller.value;if(e){let t=new URLSearchParams(location.search),n=t.get("id"),r=t.get("state"),o=t.get("srcPrefix");n&&(this._gistId=n);let{srcPrefix:i,code:a}=await (n?this._sessionFromApi(n):r?this._sessionFromState(r):void 0)||{},s=o||i;if(void 0!==s&&void 0!==a&&(e.srcPrefix!==s||!m(e.initialCode,a))){try{if(!opener?.location?.origin||opener?.location?.origin!==location.origin)throw Error("origin doesn't match")}catch{this._autoRun=!1,e.runOnStart=!1,e.runOnChange=!1}e.srcPrefix=s,e.initialCode=a,e.code=a,this._storeSession()}this.requestUpdate()}}async _sessionFromApi(e){let t=await fetch(`/api/v1/play/${encodeURIComponent(e)}`);if(!t.ok)return void console.error(t.statusText);let n=new URL(location.href);return n.search=new URLSearchParams({id:e}).toString(),this._permalink=n.toString(),(0,s.w)("playground: load-shared"),u(await t.json())}async _sessionFromState(e){let{state:t}=await (0,c.p)(e);return u(JSON.parse(t||"{}"))}_editorUpdate(){this._storeSession(),this.requestUpdate()}_reportOpen(){this._reportModal.value?.showModal()}_reportCancel(){this._reportModal.value?.close()}async _reportSubmit(){await fetch("/api/v1/play/flag",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:this._gistId,reason:this._reportModal.value?.querySelector("textarea")?.value})}),this._reportModal.value?.close()}connectedCallback(){super.connectedCallback(),this._user.run()}render(){let{code:e,initialCode:t}=this._controller.value??{},n=Object.values(e??{}).some(Boolean),r=Object.values(t??{}).some(Boolean),a=r&&!m(e,t);return(0,o.qy)`
6
+ \`\`\``).filter(Boolean).join("\n\n");await navigator.clipboard.writeText(t)}}async _createPermalink(){let e=this._controller.value;if(e){let t=await fetch("/api/v1/play/",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e.code)}),{id:n}=await t.json(),r=new URL(location.href);r.search=new URLSearchParams({id:n}).toString(),e.initialCode=e.code,this._permalink=r.toString(),history.replaceState(void 0,"",r),this.requestUpdate()}}async _copyPermalink(){this._permalink&&await navigator.clipboard.writeText(this._permalink)}_storeSession(){let e=this._controller.value;if(e){let{srcPrefix:t,initialCode:n,code:r}=e,o={srcPrefix:t,initialCode:n,code:r,autoRun:this._autoRun};sessionStorage.setItem(p,JSON.stringify(o))}}_loadSession(){let{srcPrefix:e,initialCode:t,code:n,autoRun:r}=u(JSON.parse(sessionStorage.getItem(p)||"{}")),o=this._controller.value;o&&(!1===r&&(this._autoRun=!1,o.runOnStart=!1,o.runOnChange=!1),o.srcPrefix=e,o.initialCode=t,o.code=n,this.requestUpdate())}async _loadFromUrl(){let e=this._controller.value;if(e){let t=new URLSearchParams(location.search),n=t.get("id"),r=t.get("state"),o=t.get("srcPrefix");n&&(this._gistId=n);let{srcPrefix:i,code:a}=await (n?this._sessionFromApi(n):r?this._sessionFromState(r):void 0)||{},s=o||i;if(void 0!==s&&void 0!==a&&(e.srcPrefix!==s||!h(e.initialCode,a))){try{if(!opener?.location?.origin||opener?.location?.origin!==location.origin)throw Error("origin doesn't match")}catch{this._autoRun=!1,e.runOnStart=!1,e.runOnChange=!1}e.srcPrefix=s,e.initialCode=a,e.code=a,this._storeSession()}this.requestUpdate()}}async _sessionFromApi(e){let t=await fetch(`/api/v1/play/${encodeURIComponent(e)}`);if(!t.ok)return void console.error(t.statusText);let n=new URL(location.href);return n.search=new URLSearchParams({id:e}).toString(),this._permalink=n.toString(),(0,s.w)("playground: load-shared"),u(await t.json())}async _sessionFromState(e){let{state:t}=await (0,c.p)(e);return u(JSON.parse(t||"{}"))}_editorUpdate(){this._storeSession(),this.requestUpdate()}_reportOpen(){this._reportModal.value?.showModal()}_reportCancel(){this._reportModal.value?.close()}async _reportSubmit(){await fetch("/api/v1/play/flag",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:this._gistId,reason:this._reportModal.value?.querySelector("textarea")?.value})}),this._reportModal.value?.close()}connectedCallback(){super.connectedCallback(),this._user.run()}render(){let{code:e,initialCode:t}=this._controller.value??{},n=Object.values(e??{}).some(Boolean),r=Object.values(t??{}).some(Boolean),a=r&&!h(e,t);return(0,o.qy)`
7
7
  <div class="wrapper">
8
8
  <mdn-play-controller
9
9
  ${(0,i.K)(this._controller)}
@@ -70,7 +70,7 @@ ${t}
70
70
  </section>
71
71
  <section class="playground__runner-console">
72
72
  ${this._gistId?(0,o.qy)`<mdn-button @click=${this._reportOpen} variant="plain">
73
- Seeing something inappropriate?
73
+ ${this.l10n`Seeing something inappropriate?`}
74
74
  </mdn-button>`:o.s6}
75
75
  <mdn-play-runner></mdn-play-runner>
76
76
  <div class="playground__console">
@@ -103,18 +103,22 @@ ${t}
103
103
  </mdn-modal>
104
104
  <mdn-modal ${(0,i.K)(this._reportModal)} class="report">
105
105
  <section>
106
- <p>Report this malicious or inappropriate shared playground.</p>
106
+ <p>
107
+ ${this.l10n`Report this malicious or inappropriate shared playground.`}
108
+ </p>
107
109
  <label>
108
- Can you please share some details on what's wrong with this content:
110
+ ${this.l10n`Can you please share some details on what's wrong with this content:`}
109
111
  <textarea></textarea>
110
112
  </label>
111
113
  </section>
112
114
  <section>
113
115
  <mdn-button variant="secondary" @click=${this._reportCancel}
114
- >Cancel</mdn-button
116
+ >${this.l10n`Cancel`}</mdn-button
117
+ >
118
+ <mdn-button @click=${this._reportSubmit}
119
+ >${this.l10n`Report`}</mdn-button
115
120
  >
116
- <mdn-button @click=${this._reportSubmit}>Report</mdn-button>
117
121
  </section>
118
122
  </mdn-modal>
119
- `}firstUpdated(){this._loadSession(),this._loadFromUrl()}};function u(e){return"html"in e?{srcPrefix:e.src||"",code:{html:e.html,css:e.css,js:e.js}}:"srcPrefix"in e?e:{srcPrefix:"",code:{}}}function m(e,t){return void 0===e||void 0===t?e===t:Object.keys(e).length===Object.keys(t).length&&Object.entries(e).every(([e,n])=>t[e]===n)}customElements.define("mdn-playground",MDNPlayground)},70209:function(e,t,n){n.d(t,{D:()=>a});var r=n(97160),o=n(17316),i=n(98176);let a=(0,o.u$)(class extends o.WL{constructor(){super(...arguments),this.key=r.s6}render(e,t){return this.key=e,t}update(e,[t,n]){return t!==this.key&&((0,i.mY)(e),this.key=t),n}})}};
120
- //# sourceMappingURL=9784.3c73a0debfcca553.js.map
123
+ `}firstUpdated(){this._loadSession(),this._loadFromUrl()}};function u(e){return"html"in e?{srcPrefix:e.src||"",code:{html:e.html,css:e.css,js:e.js}}:"srcPrefix"in e?e:{srcPrefix:"",code:{}}}function h(e,t){return void 0===e||void 0===t?e===t:Object.keys(e).length===Object.keys(t).length&&Object.entries(e).every(([e,n])=>t[e]===n)}customElements.define("mdn-playground",MDNPlayground)},70209:function(e,t,n){n.d(t,{D:()=>a});var r=n(97160),o=n(17316),i=n(98176);let a=(0,o.u$)(class extends o.WL{constructor(){super(...arguments),this.key=r.s6}render(e,t){return this.key=e,t}update(e,[t,n]){return t!==this.key&&((0,i.mY)(e),this.key=t),n}})}};
124
+ //# sourceMappingURL=9784.1c8d6e465137fd58.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"9784.3c73a0debfcca553.js","sources":["webpack://@mdn/fred/./components/playground/element.css","webpack://@mdn/fred/./components/global/global.css?1b68","webpack://@mdn/fred/./components/login-button/element.js","webpack://@mdn/fred/./components/playground/element.js","webpack://@mdn/fred/./node_modules/lit-html/directives/keyed.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\";\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// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.wrapper{display:grid;gap:1rem;grid-template-areas:\"left runner\";grid-template-columns:1fr 1fr;grid-template-rows:1fr;height:100%}.wrapper section{display:flex;flex-direction:column;flex-grow:1;gap:1rem;grid-area:left}:is(.wrapper section) aside{align-items:center;border:var(--border);border-radius:.25rem;display:flex;flex-wrap:wrap;gap:.5rem;padding:.5rem}:is(:is(.wrapper section) aside) h1{font-size:var(--font-size-normal);margin:0 auto 0 0}:is(:is(.wrapper section) aside) menu{display:flex;flex-wrap:wrap;gap:.5rem;margin:0;padding:0}:is(.wrapper section) details{border:var(--border);border-radius:.25rem;flex-direction:column;flex-shrink:0;overflow:hidden}[open]:is(:is(.wrapper section) details){flex-basis:0;flex-grow:1;min-height:12rem}[open]:is(:is(.wrapper section) details) mdn-play-editor{display:block}:is(:is(.wrapper section) details)::details-content{display:contents}:is(:is(.wrapper section) details) summary{cursor:pointer;height:2em;line-height:var(--font-line-ui);padding:.5em;-webkit-user-select:none;user-select:none}:is(:is(.wrapper section) details) mdn-play-editor{display:none;height:calc(100% - 2em)}.playground__runner-console:is(.wrapper section){border:var(--border);border-radius:.25rem;grid-area:runner;overflow:hidden}.playground__runner-console:is(.wrapper section) mdn-play-runner{flex-grow:1}.playground__runner-console:is(.wrapper section) .playground__console{background-color:var(--color-background-secondary);border-top:var(--border)}:is(.playground__runner-console:is(.wrapper section) .playground__console) div{font-size:var(--font-size-small);font-weight:var(--font-weight-bold);text-align:center}:is(.playground__runner-console:is(.wrapper section) .playground__console) mdn-play-console{height:6rem}.wrapper mdn-placement-sidebar{grid-area:place;justify-self:center}@media (width <= 992px){.wrapper{display:flex;flex-direction:column}}mdn-modal section{display:flex;flex-direction:column;gap:.5rem}:is(mdn-modal section):first-child{margin-bottom:1rem}mdn-modal h2{font-size:var(--font-size-normal);font-weight:400;margin:0}mdn-modal label{display:flex;flex-direction:column;gap:.5rem}mdn-modal p{margin:0}mdn-modal.share section{align-items:center}mdn-modal.report section:last-child{flex-direction:row;justify-content:flex-end}`, \"\"]);\n// Exports\nexport default css([___CSS_LOADER_EXPORT___.toString()]);\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, `*,:after,:before{box-sizing:border-box}button,input,select,textarea{font:inherit}button{color:inherit;cursor:pointer}img{height:auto;max-width:100%}a{color:var(--color-link-normal)}[hidden]{display:none!important}`, \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___.toString();\n","import { LitElement, html } from \"lit\";\n\nimport \"../button/element.js\";\nimport { L10nMixin } from \"../../l10n/mixin.js\";\nimport { FXA_SIGNIN_URL } from \"../env/index.js\";\n\nexport class MDNLoginButton extends L10nMixin(LitElement) {\n static ssr = false;\n\n get _loginUrl() {\n const next = location.href.replace(location.origin, \"\");\n // TODO: deal with local login\n const loginUrl = new URL(FXA_SIGNIN_URL, location.origin);\n loginUrl.search = new URLSearchParams({ next }).toString();\n return loginUrl.toString();\n }\n\n render() {\n return html`<mdn-button href=${this._loginUrl}\n >${this.l10n`Login`}</mdn-button\n >`;\n }\n}\n\ncustomElements.define(\"mdn-login-button\", MDNLoginButton);\n","import { Task } from \"@lit/task\";\nimport { LitElement, html, nothing } from \"lit\";\nimport { createRef, ref } from \"lit/directives/ref.js\";\n\nimport { L10nMixin } from \"../../l10n/mixin.js\";\nimport { gleanClick } from \"../../utils/glean.js\";\nimport { globalUser } from \"../user/context.js\";\n\nimport styles from \"./element.css?lit\";\nimport { decompressFromBase64 } from \"./utils.js\";\n\nimport \"../play-controller/element.js\";\nimport \"../button/element.js\";\nimport \"../play-editor/element.js\";\nimport \"../play-runner/element.js\";\nimport \"../play-console/element.js\";\nimport \"../modal/element.js\";\nimport \"../login-button/element.js\";\n\n/**\n * @import { MDNPlayController } from \"../play-controller/element.js\";\n * @import { MDNModal } from \"../modal/element.js\";\n * @import { Ref } from \"lit/directives/ref.js\";\n */\n\nconst SESSION_KEY = \"playground-session-code\";\n\nexport class MDNPlayground extends L10nMixin(LitElement) {\n static styles = styles;\n\n static properties = {\n _gistID: { state: true },\n };\n\n constructor() {\n super();\n this._permalink = \"\";\n this._autoRun = true;\n /** @type {string | undefined} */\n this._gistId = undefined;\n }\n\n /** @type {Ref<MDNPlayController>} */\n _controller = createRef();\n /** @type {Ref<MDNModal>} */\n _shareModal = createRef();\n /** @type {Ref<MDNModal>} */\n _reportModal = createRef();\n\n _user = new Task(this, {\n task: async () => {\n return await globalUser();\n },\n });\n\n _format() {\n this._controller.value?.format();\n }\n\n _run() {\n const controller = this._controller.value;\n if (controller) {\n controller.run();\n if (!this._autoRun) {\n this._autoRun = true;\n controller.runOnChange = true;\n this._storeSession();\n }\n }\n }\n\n _share() {\n this._shareModal.value?.showModal();\n }\n\n _clear() {\n const controller = this._controller.value;\n if (\n confirm(this.l10n`Do you really want to clear everything?`) &&\n controller\n ) {\n controller.clear();\n this._autoRun = true;\n this._storeSession();\n this.requestUpdate();\n const urlWithoutSearch = new URL(location.href);\n urlWithoutSearch.search = \"\";\n history.replaceState(undefined, \"\", urlWithoutSearch);\n }\n }\n\n _reset() {\n const controller = this._controller.value;\n if (\n confirm(this.l10n`Do you really want to revert your changes?`) &&\n controller\n ) {\n controller.reset();\n this._storeSession();\n this.requestUpdate();\n }\n }\n\n async _copyMarkdown() {\n const controller = this._controller.value;\n if (controller) {\n const markdown = Object.entries(controller.code)\n .map(\n ([lang, code]) =>\n code &&\n `${\"```\"}${lang}\n${code}\n${\"```\"}`,\n )\n .filter(Boolean)\n .join(\"\\n\\n\");\n await navigator.clipboard.writeText(markdown);\n }\n }\n\n async _createPermalink() {\n const controller = this._controller.value;\n if (controller) {\n const res = await fetch(\"/api/v1/play/\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(controller.code),\n });\n const { id } = await res.json();\n const permalink = new URL(location.href);\n permalink.search = new URLSearchParams({ id }).toString();\n\n controller.initialCode = controller.code;\n this._permalink = permalink.toString();\n history.replaceState(undefined, \"\", permalink);\n this.requestUpdate();\n }\n }\n\n async _copyPermalink() {\n if (this._permalink) {\n await navigator.clipboard.writeText(this._permalink);\n }\n }\n\n _storeSession() {\n const controller = this._controller.value;\n if (controller) {\n const { srcPrefix, initialCode, code } = controller;\n /** @type {import(\"./types.js\").PlaygroundSession} */\n const session = {\n srcPrefix,\n initialCode,\n code,\n autoRun: this._autoRun,\n };\n sessionStorage.setItem(SESSION_KEY, JSON.stringify(session));\n }\n }\n\n _loadSession() {\n const { srcPrefix, initialCode, code, autoRun } = stateToSession(\n JSON.parse(sessionStorage.getItem(SESSION_KEY) || \"{}\"),\n );\n const controller = this._controller.value;\n if (controller) {\n if (autoRun === false) {\n this._autoRun = false;\n controller.runOnStart = false;\n controller.runOnChange = false;\n }\n controller.srcPrefix = srcPrefix;\n controller.initialCode = initialCode;\n controller.code = code;\n this.requestUpdate();\n }\n }\n\n async _loadFromUrl() {\n const controller = this._controller.value;\n if (controller) {\n const params = new URLSearchParams(location.search);\n const idParam = params.get(\"id\");\n const stateParam = params.get(\"state\");\n const srcPrefixParam = params.get(\"srcPrefix\");\n\n if (idParam) {\n this._gistId = idParam;\n }\n\n const { srcPrefix: srcPrefixState, code } =\n (await (idParam\n ? this._sessionFromApi(idParam)\n : stateParam\n ? this._sessionFromState(stateParam)\n : undefined)) || {};\n\n const srcPrefix = srcPrefixParam || srcPrefixState;\n\n if (\n srcPrefix !== undefined &&\n code !== undefined &&\n (controller.srcPrefix !== srcPrefix ||\n !compareCode(controller.initialCode, code))\n ) {\n try {\n if (\n !opener?.location?.origin ||\n opener?.location?.origin !== location.origin\n ) {\n throw new Error(\"origin doesn't match\");\n }\n } catch {\n this._autoRun = false;\n controller.runOnStart = false;\n controller.runOnChange = false;\n }\n controller.srcPrefix = srcPrefix;\n controller.initialCode = code;\n controller.code = code;\n this._storeSession();\n }\n\n this.requestUpdate();\n }\n }\n\n /** @param {string} id */\n async _sessionFromApi(id) {\n const response = await fetch(`/api/v1/play/${encodeURIComponent(id)}`);\n if (!response.ok) {\n console.error(response.statusText);\n return;\n }\n\n const permalink = new URL(location.href);\n permalink.search = new URLSearchParams({ id }).toString();\n this._permalink = permalink.toString();\n\n gleanClick(\"playground: load-shared\");\n const code = await response.json();\n return stateToSession(code);\n }\n\n /** @param {string} stateParam */\n async _sessionFromState(stateParam) {\n const { state } = await decompressFromBase64(stateParam);\n return stateToSession(JSON.parse(state || \"{}\"));\n }\n\n _editorUpdate() {\n this._storeSession();\n this.requestUpdate();\n }\n\n _reportOpen() {\n this._reportModal.value?.showModal();\n }\n\n _reportCancel() {\n this._reportModal.value?.close();\n }\n\n async _reportSubmit() {\n await fetch(\"/api/v1/play/flag\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n id: this._gistId,\n reason: this._reportModal.value?.querySelector(\"textarea\")?.value,\n }),\n });\n this._reportModal.value?.close();\n }\n\n connectedCallback() {\n super.connectedCallback();\n this._user.run();\n }\n\n render() {\n const { code, initialCode } = this._controller.value ?? {};\n const hasCode = Object.values(code ?? {}).some(Boolean);\n const hasInitialCode = Object.values(initialCode ?? {}).some(Boolean);\n const isResettable = hasInitialCode && !compareCode(code, initialCode);\n\n return html`\n <div class=\"wrapper\">\n <mdn-play-controller\n ${ref(this._controller)}\n run-on-start\n run-on-change\n >\n <section>\n <aside>\n <h1>${this.l10n`Playground`}</h1>\n <menu>\n <mdn-button\n variant=\"secondary\"\n @click=${this._format}\n ?disabled=${!hasCode}\n >${this.l10n`Format`}</mdn-button\n >\n <mdn-button\n variant=\"secondary\"\n @click=${this._run}\n ?disabled=${!hasCode}\n >${this.l10n`Run`}</mdn-button\n >\n <mdn-button\n variant=\"secondary\"\n @click=${this._share}\n ?disabled=${!hasCode}\n >${this.l10n`Share`}</mdn-button\n >\n <mdn-button\n variant=\"secondary\"\n @click=${this._clear}\n ?disabled=${!(hasCode || isResettable)}\n >${this.l10n`Clear`}</mdn-button\n >\n ${hasInitialCode\n ? html`<mdn-button\n variant=\"secondary\"\n @click=${this._reset}\n ?disabled=${!isResettable}\n >${this.l10n`Reset`}</mdn-button\n >`\n : nothing}\n </menu>\n </aside>\n <details open>\n <summary>HTML</summary>\n <mdn-play-editor\n language=\"html\"\n @update=${this._editorUpdate}\n ></mdn-play-editor>\n </details>\n <details open>\n <summary>CSS</summary>\n <mdn-play-editor\n language=\"css\"\n @update=${this._editorUpdate}\n ></mdn-play-editor>\n </details>\n <details open>\n <summary>JAVASCRIPT</summary>\n <mdn-play-editor\n language=\"js\"\n @update=${this._editorUpdate}\n ></mdn-play-editor>\n </details>\n </section>\n <section class=\"playground__runner-console\">\n ${this._gistId\n ? html`<mdn-button @click=${this._reportOpen} variant=\"plain\">\n Seeing something inappropriate?\n </mdn-button>`\n : nothing}\n <mdn-play-runner></mdn-play-runner>\n <div class=\"playground__console\">\n <div>${this.l10n`Console`}</div>\n <mdn-play-console></mdn-play-console>\n </div>\n </section>\n </mdn-play-controller>\n </div>\n <mdn-modal ${ref(this._shareModal)} class=\"share\">\n <section>\n <h2>${this.l10n`Share Markdown`}</h2>\n <mdn-button variant=\"secondary\" @click=${this._copyMarkdown}\n >${this.l10n`Copy markdown to clipboard`}</mdn-button\n >\n </section>\n <section>\n <h2>${this.l10n`Share your code via Permalink`}</h2>\n ${this._user.render({\n initial: () => html`<mdn-login-button></mdn-login-button>`,\n pending: () => html`<mdn-login-button></mdn-login-button>`,\n complete: (user) =>\n user.isAuthenticated\n ? this._permalink && !isResettable\n ? html`\n <input .value=${this._permalink} />\n <mdn-button\n variant=\"secondary\"\n @click=${this._copyPermalink}\n >${this.l10n`Copy to clipboard`}</mdn-button\n >\n `\n : html`<mdn-button @click=${this._createPermalink}\n >${this.l10n`Create link`}</mdn-button\n >`\n : html`<mdn-login-button></mdn-login-button>`,\n })}\n </section>\n </mdn-modal>\n <mdn-modal ${ref(this._reportModal)} class=\"report\">\n <section>\n <p>Report this malicious or inappropriate shared playground.</p>\n <label>\n Can you please share some details on what's wrong with this content:\n <textarea></textarea>\n </label>\n </section>\n <section>\n <mdn-button variant=\"secondary\" @click=${this._reportCancel}\n >Cancel</mdn-button\n >\n <mdn-button @click=${this._reportSubmit}>Report</mdn-button>\n </section>\n </mdn-modal>\n `;\n }\n\n firstUpdated() {\n this._loadSession();\n this._loadFromUrl();\n }\n}\n\ncustomElements.define(\"mdn-playground\", MDNPlayground);\n\n/**\n * @param {import(\"./types.js\").PlaygroundStateParam | import(\"./types.js\").PlaygroundSession | {}} stateOrSession\n * @returns {import(\"./types.js\").PlaygroundSession}\n */\nfunction stateToSession(stateOrSession) {\n if (\"html\" in stateOrSession) {\n return {\n srcPrefix: stateOrSession.src || \"\",\n code: {\n html: stateOrSession.html,\n css: stateOrSession.css,\n js: stateOrSession.js,\n },\n };\n }\n if (\"srcPrefix\" in stateOrSession) {\n return stateOrSession;\n }\n return {\n srcPrefix: \"\",\n code: {},\n };\n}\n\n/**\n * @param {Record<string, string>} [a]\n * @param {Record<string, string>} [b]\n * @returns {boolean}\n */\nfunction compareCode(a, b) {\n return a === undefined || b === undefined\n ? a === b\n : Object.keys(a).length === Object.keys(b).length &&\n Object.entries(a).every(([k, v]) => b[k] === v);\n}\n","import{nothing as r}from\"../lit-html.js\";import{directive as t,Directive as e}from\"../directive.js\";import{setCommittedValue as s}from\"../directive-helpers.js\";\n/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const i=t(class extends e{constructor(){super(...arguments),this.key=r}render(r,t){return this.key=r,t}update(r,[t,e]){return t!==this.key&&(s(r),this.key=t),e}});export{i as keyed};\n//# sourceMappingURL=keyed.js.map\n"],"names":["MDNLoginButton","location","URL","URLSearchParams","customElements","MDNPlayground","confirm","history","Object","Boolean","navigator","fetch","JSON","sessionStorage","s","opener","Error","encodeURIComponent","console","arguments","r","t"],"mappings":"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"}
1
+ {"version":3,"file":"9784.1c8d6e465137fd58.js","sources":["webpack://@mdn/fred/./components/playground/element.css","webpack://@mdn/fred/./components/global/global.css?1b68","webpack://@mdn/fred/./components/login-button/element.js","webpack://@mdn/fred/./components/playground/element.js","webpack://@mdn/fred/./node_modules/lit-html/directives/keyed.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\";\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// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.wrapper{display:grid;gap:1rem;grid-template-areas:\"left runner\";grid-template-columns:1fr 1fr;grid-template-rows:1fr;height:100%}.wrapper section{display:flex;flex-direction:column;flex-grow:1;gap:1rem;grid-area:left}:is(.wrapper section) aside{align-items:center;border:var(--border);border-radius:.25rem;display:flex;flex-wrap:wrap;gap:.5rem;padding:.5rem}:is(:is(.wrapper section) aside) h1{font-size:var(--font-size-normal);margin:0 auto 0 0}:is(:is(.wrapper section) aside) menu{display:flex;flex-wrap:wrap;gap:.5rem;margin:0;padding:0}:is(.wrapper section) details{border:var(--border);border-radius:.25rem;flex-direction:column;flex-shrink:0;overflow:hidden}[open]:is(:is(.wrapper section) details){flex-basis:0;flex-grow:1;min-height:12rem}[open]:is(:is(.wrapper section) details) mdn-play-editor{display:block}:is(:is(.wrapper section) details)::details-content{display:contents}:is(:is(.wrapper section) details) summary{cursor:pointer;height:2em;line-height:var(--font-line-ui);padding:.5em;-webkit-user-select:none;user-select:none}:is(:is(.wrapper section) details) mdn-play-editor{display:none;height:calc(100% - 2em)}.playground__runner-console:is(.wrapper section){border:var(--border);border-radius:.25rem;grid-area:runner;overflow:hidden}.playground__runner-console:is(.wrapper section) mdn-play-runner{flex-grow:1}.playground__runner-console:is(.wrapper section) .playground__console{background-color:var(--color-background-secondary);border-top:var(--border)}:is(.playground__runner-console:is(.wrapper section) .playground__console) div{font-size:var(--font-size-small);font-weight:var(--font-weight-bold);text-align:center}:is(.playground__runner-console:is(.wrapper section) .playground__console) mdn-play-console{height:6rem}.wrapper mdn-placement-sidebar{grid-area:place;justify-self:center}@media (width <= 992px){.wrapper{display:flex;flex-direction:column}}mdn-modal section{display:flex;flex-direction:column;gap:.5rem}:is(mdn-modal section):first-child{margin-bottom:1rem}mdn-modal h2{font-size:var(--font-size-normal);font-weight:400;margin:0}mdn-modal label{display:flex;flex-direction:column;gap:.5rem}mdn-modal p{margin:0}mdn-modal.share section{align-items:center}mdn-modal.report section:last-child{flex-direction:row;justify-content:flex-end}`, \"\"]);\n// Exports\nexport default css([___CSS_LOADER_EXPORT___.toString()]);\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, `*,:after,:before{box-sizing:border-box}button,input,select,textarea{font:inherit}button{color:inherit;cursor:pointer}img{height:auto;max-width:100%}a{color:var(--color-link-normal)}[hidden]{display:none!important}`, \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___.toString();\n","import { LitElement, html } from \"lit\";\n\nimport \"../button/element.js\";\nimport { L10nMixin } from \"../../l10n/mixin.js\";\nimport { FXA_SIGNIN_URL } from \"../env/index.js\";\n\nexport class MDNLoginButton extends L10nMixin(LitElement) {\n static ssr = false;\n\n get _loginUrl() {\n const next = location.href.replace(location.origin, \"\");\n // TODO: deal with local login\n const loginUrl = new URL(FXA_SIGNIN_URL, location.origin);\n loginUrl.search = new URLSearchParams({ next }).toString();\n return loginUrl.toString();\n }\n\n render() {\n return html`<mdn-button href=${this._loginUrl}\n >${this.l10n`Login`}</mdn-button\n >`;\n }\n}\n\ncustomElements.define(\"mdn-login-button\", MDNLoginButton);\n","import { Task } from \"@lit/task\";\nimport { LitElement, html, nothing } from \"lit\";\nimport { createRef, ref } from \"lit/directives/ref.js\";\n\nimport { L10nMixin } from \"../../l10n/mixin.js\";\nimport { gleanClick } from \"../../utils/glean.js\";\nimport { globalUser } from \"../user/context.js\";\n\nimport styles from \"./element.css?lit\";\nimport { decompressFromBase64 } from \"./utils.js\";\n\nimport \"../play-controller/element.js\";\nimport \"../button/element.js\";\nimport \"../play-editor/element.js\";\nimport \"../play-runner/element.js\";\nimport \"../play-console/element.js\";\nimport \"../modal/element.js\";\nimport \"../login-button/element.js\";\n\n/**\n * @import { MDNPlayController } from \"../play-controller/element.js\";\n * @import { MDNModal } from \"../modal/element.js\";\n * @import { Ref } from \"lit/directives/ref.js\";\n */\n\nconst SESSION_KEY = \"playground-session-code\";\n\nexport class MDNPlayground extends L10nMixin(LitElement) {\n static styles = styles;\n\n static properties = {\n _gistID: { state: true },\n };\n\n constructor() {\n super();\n this._permalink = \"\";\n this._autoRun = true;\n /** @type {string | undefined} */\n this._gistId = undefined;\n }\n\n /** @type {Ref<MDNPlayController>} */\n _controller = createRef();\n /** @type {Ref<MDNModal>} */\n _shareModal = createRef();\n /** @type {Ref<MDNModal>} */\n _reportModal = createRef();\n\n _user = new Task(this, {\n task: async () => {\n return await globalUser();\n },\n });\n\n _format() {\n this._controller.value?.format();\n }\n\n _run() {\n const controller = this._controller.value;\n if (controller) {\n controller.run();\n if (!this._autoRun) {\n this._autoRun = true;\n controller.runOnChange = true;\n this._storeSession();\n }\n }\n }\n\n _share() {\n this._shareModal.value?.showModal();\n }\n\n _clear() {\n const controller = this._controller.value;\n if (\n confirm(this.l10n`Do you really want to clear everything?`) &&\n controller\n ) {\n controller.clear();\n this._autoRun = true;\n this._storeSession();\n this.requestUpdate();\n const urlWithoutSearch = new URL(location.href);\n urlWithoutSearch.search = \"\";\n history.replaceState(undefined, \"\", urlWithoutSearch);\n }\n }\n\n _reset() {\n const controller = this._controller.value;\n if (\n confirm(this.l10n`Do you really want to revert your changes?`) &&\n controller\n ) {\n controller.reset();\n this._storeSession();\n this.requestUpdate();\n }\n }\n\n async _copyMarkdown() {\n const controller = this._controller.value;\n if (controller) {\n const markdown = Object.entries(controller.code)\n .map(\n ([lang, code]) =>\n code &&\n `${\"```\"}${lang}\n${code}\n${\"```\"}`,\n )\n .filter(Boolean)\n .join(\"\\n\\n\");\n await navigator.clipboard.writeText(markdown);\n }\n }\n\n async _createPermalink() {\n const controller = this._controller.value;\n if (controller) {\n const res = await fetch(\"/api/v1/play/\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(controller.code),\n });\n const { id } = await res.json();\n const permalink = new URL(location.href);\n permalink.search = new URLSearchParams({ id }).toString();\n\n controller.initialCode = controller.code;\n this._permalink = permalink.toString();\n history.replaceState(undefined, \"\", permalink);\n this.requestUpdate();\n }\n }\n\n async _copyPermalink() {\n if (this._permalink) {\n await navigator.clipboard.writeText(this._permalink);\n }\n }\n\n _storeSession() {\n const controller = this._controller.value;\n if (controller) {\n const { srcPrefix, initialCode, code } = controller;\n /** @type {import(\"./types.js\").PlaygroundSession} */\n const session = {\n srcPrefix,\n initialCode,\n code,\n autoRun: this._autoRun,\n };\n sessionStorage.setItem(SESSION_KEY, JSON.stringify(session));\n }\n }\n\n _loadSession() {\n const { srcPrefix, initialCode, code, autoRun } = stateToSession(\n JSON.parse(sessionStorage.getItem(SESSION_KEY) || \"{}\"),\n );\n const controller = this._controller.value;\n if (controller) {\n if (autoRun === false) {\n this._autoRun = false;\n controller.runOnStart = false;\n controller.runOnChange = false;\n }\n controller.srcPrefix = srcPrefix;\n controller.initialCode = initialCode;\n controller.code = code;\n this.requestUpdate();\n }\n }\n\n async _loadFromUrl() {\n const controller = this._controller.value;\n if (controller) {\n const params = new URLSearchParams(location.search);\n const idParam = params.get(\"id\");\n const stateParam = params.get(\"state\");\n const srcPrefixParam = params.get(\"srcPrefix\");\n\n if (idParam) {\n this._gistId = idParam;\n }\n\n const { srcPrefix: srcPrefixState, code } =\n (await (idParam\n ? this._sessionFromApi(idParam)\n : stateParam\n ? this._sessionFromState(stateParam)\n : undefined)) || {};\n\n const srcPrefix = srcPrefixParam || srcPrefixState;\n\n if (\n srcPrefix !== undefined &&\n code !== undefined &&\n (controller.srcPrefix !== srcPrefix ||\n !compareCode(controller.initialCode, code))\n ) {\n try {\n if (\n !opener?.location?.origin ||\n opener?.location?.origin !== location.origin\n ) {\n throw new Error(\"origin doesn't match\");\n }\n } catch {\n this._autoRun = false;\n controller.runOnStart = false;\n controller.runOnChange = false;\n }\n controller.srcPrefix = srcPrefix;\n controller.initialCode = code;\n controller.code = code;\n this._storeSession();\n }\n\n this.requestUpdate();\n }\n }\n\n /** @param {string} id */\n async _sessionFromApi(id) {\n const response = await fetch(`/api/v1/play/${encodeURIComponent(id)}`);\n if (!response.ok) {\n console.error(response.statusText);\n return;\n }\n\n const permalink = new URL(location.href);\n permalink.search = new URLSearchParams({ id }).toString();\n this._permalink = permalink.toString();\n\n gleanClick(\"playground: load-shared\");\n const code = await response.json();\n return stateToSession(code);\n }\n\n /** @param {string} stateParam */\n async _sessionFromState(stateParam) {\n const { state } = await decompressFromBase64(stateParam);\n return stateToSession(JSON.parse(state || \"{}\"));\n }\n\n _editorUpdate() {\n this._storeSession();\n this.requestUpdate();\n }\n\n _reportOpen() {\n this._reportModal.value?.showModal();\n }\n\n _reportCancel() {\n this._reportModal.value?.close();\n }\n\n async _reportSubmit() {\n await fetch(\"/api/v1/play/flag\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n id: this._gistId,\n reason: this._reportModal.value?.querySelector(\"textarea\")?.value,\n }),\n });\n this._reportModal.value?.close();\n }\n\n connectedCallback() {\n super.connectedCallback();\n this._user.run();\n }\n\n render() {\n const { code, initialCode } = this._controller.value ?? {};\n const hasCode = Object.values(code ?? {}).some(Boolean);\n const hasInitialCode = Object.values(initialCode ?? {}).some(Boolean);\n const isResettable = hasInitialCode && !compareCode(code, initialCode);\n\n return html`\n <div class=\"wrapper\">\n <mdn-play-controller\n ${ref(this._controller)}\n run-on-start\n run-on-change\n >\n <section>\n <aside>\n <h1>${this.l10n`Playground`}</h1>\n <menu>\n <mdn-button\n variant=\"secondary\"\n @click=${this._format}\n ?disabled=${!hasCode}\n >${this.l10n`Format`}</mdn-button\n >\n <mdn-button\n variant=\"secondary\"\n @click=${this._run}\n ?disabled=${!hasCode}\n >${this.l10n`Run`}</mdn-button\n >\n <mdn-button\n variant=\"secondary\"\n @click=${this._share}\n ?disabled=${!hasCode}\n >${this.l10n`Share`}</mdn-button\n >\n <mdn-button\n variant=\"secondary\"\n @click=${this._clear}\n ?disabled=${!(hasCode || isResettable)}\n >${this.l10n`Clear`}</mdn-button\n >\n ${hasInitialCode\n ? html`<mdn-button\n variant=\"secondary\"\n @click=${this._reset}\n ?disabled=${!isResettable}\n >${this.l10n`Reset`}</mdn-button\n >`\n : nothing}\n </menu>\n </aside>\n <details open>\n <summary>HTML</summary>\n <mdn-play-editor\n language=\"html\"\n @update=${this._editorUpdate}\n ></mdn-play-editor>\n </details>\n <details open>\n <summary>CSS</summary>\n <mdn-play-editor\n language=\"css\"\n @update=${this._editorUpdate}\n ></mdn-play-editor>\n </details>\n <details open>\n <summary>JAVASCRIPT</summary>\n <mdn-play-editor\n language=\"js\"\n @update=${this._editorUpdate}\n ></mdn-play-editor>\n </details>\n </section>\n <section class=\"playground__runner-console\">\n ${this._gistId\n ? html`<mdn-button @click=${this._reportOpen} variant=\"plain\">\n ${this.l10n`Seeing something inappropriate?`}\n </mdn-button>`\n : nothing}\n <mdn-play-runner></mdn-play-runner>\n <div class=\"playground__console\">\n <div>${this.l10n`Console`}</div>\n <mdn-play-console></mdn-play-console>\n </div>\n </section>\n </mdn-play-controller>\n </div>\n <mdn-modal ${ref(this._shareModal)} class=\"share\">\n <section>\n <h2>${this.l10n`Share Markdown`}</h2>\n <mdn-button variant=\"secondary\" @click=${this._copyMarkdown}\n >${this.l10n`Copy markdown to clipboard`}</mdn-button\n >\n </section>\n <section>\n <h2>${this.l10n`Share your code via Permalink`}</h2>\n ${this._user.render({\n initial: () => html`<mdn-login-button></mdn-login-button>`,\n pending: () => html`<mdn-login-button></mdn-login-button>`,\n complete: (user) =>\n user.isAuthenticated\n ? this._permalink && !isResettable\n ? html`\n <input .value=${this._permalink} />\n <mdn-button\n variant=\"secondary\"\n @click=${this._copyPermalink}\n >${this.l10n`Copy to clipboard`}</mdn-button\n >\n `\n : html`<mdn-button @click=${this._createPermalink}\n >${this.l10n`Create link`}</mdn-button\n >`\n : html`<mdn-login-button></mdn-login-button>`,\n })}\n </section>\n </mdn-modal>\n <mdn-modal ${ref(this._reportModal)} class=\"report\">\n <section>\n <p>\n ${this\n .l10n`Report this malicious or inappropriate shared playground.`}\n </p>\n <label>\n ${this\n .l10n`Can you please share some details on what's wrong with this content:`}\n <textarea></textarea>\n </label>\n </section>\n <section>\n <mdn-button variant=\"secondary\" @click=${this._reportCancel}\n >${this.l10n`Cancel`}</mdn-button\n >\n <mdn-button @click=${this._reportSubmit}\n >${this.l10n`Report`}</mdn-button\n >\n </section>\n </mdn-modal>\n `;\n }\n\n firstUpdated() {\n this._loadSession();\n this._loadFromUrl();\n }\n}\n\ncustomElements.define(\"mdn-playground\", MDNPlayground);\n\n/**\n * @param {import(\"./types.js\").PlaygroundStateParam | import(\"./types.js\").PlaygroundSession | {}} stateOrSession\n * @returns {import(\"./types.js\").PlaygroundSession}\n */\nfunction stateToSession(stateOrSession) {\n if (\"html\" in stateOrSession) {\n return {\n srcPrefix: stateOrSession.src || \"\",\n code: {\n html: stateOrSession.html,\n css: stateOrSession.css,\n js: stateOrSession.js,\n },\n };\n }\n if (\"srcPrefix\" in stateOrSession) {\n return stateOrSession;\n }\n return {\n srcPrefix: \"\",\n code: {},\n };\n}\n\n/**\n * @param {Record<string, string>} [a]\n * @param {Record<string, string>} [b]\n * @returns {boolean}\n */\nfunction compareCode(a, b) {\n return a === undefined || b === undefined\n ? a === b\n : Object.keys(a).length === Object.keys(b).length &&\n Object.entries(a).every(([k, v]) => b[k] === v);\n}\n","import{nothing as r}from\"../lit-html.js\";import{directive as t,Directive as e}from\"../directive.js\";import{setCommittedValue as s}from\"../directive-helpers.js\";\n/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const i=t(class extends e{constructor(){super(...arguments),this.key=r}render(r,t){return this.key=r,t}update(r,[t,e]){return t!==this.key&&(s(r),this.key=t),e}});export{i as keyed};\n//# sourceMappingURL=keyed.js.map\n"],"names":["MDNLoginButton","location","URL","URLSearchParams","customElements","MDNPlayground","confirm","history","Object","Boolean","navigator","fetch","JSON","sessionStorage","s","opener","Error","encodeURIComponent","console","arguments","r","t"],"mappings":"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"}