{"code":"(window.webpackJsonpGUI=window.webpackJsonpGUI||[]).push([[62],{1487:function(e,t,a){var n=a(261);(e.exports=a(9)(!1)).push([e.i,'/* Change z-indexes to allow more than 3 tabs */\\n[class*=\"gui_tab_\"][class*=\"gui_is-selected_\"] {\\n z-index: 10 !important;\\n}\\n[class*=\"gui_tab_\"]:nth-of-type(1) {\\n z-index: 9;\\n}\\n[class*=\"gui_tab_\"]:nth-of-type(2) {\\n z-index: 8;\\n}\\n[class*=\"gui_tab_\"]:nth-of-type(3) {\\n z-index: 7;\\n}\\n[class*=\"gui_tab_\"]:nth-of-type(4) {\\n z-index: 6;\\n}\\n\\n.sa-var-manager {\\n display: block;\\n padding: 18px;\\n /* weird hack to fix scrolling??? */\\n height: 50px;\\n overflow-y: auto;\\n}\\n\\n.sa-var-manager-searchbox {\\n background-image: url('+n(a(1488))+');\\n width: 25%;\\n margin-bottom: 4px;\\n padding: 8px;\\n padding-right: 32px; /* for the text to not overlap the image */\\n border-radius: 4px;\\n background-repeat: no-repeat;\\n background-size: 18px 18px;\\n background-position: calc(100% - 7px) center;\\n font-size: 0.75rem;\\n}\\n\\n[dir=\"rtl\"] .sa-var-manager-searchbox {\\n padding-right: 8px;\\n padding-left: 32px;\\n background-position: 7px center;\\n}\\n\\n.sa-var-manager.freeze .sa-var-manager-value *,\\n.sa-var-manager.freeze .sa-var-manager-name * {\\n opacity: 0.5;\\n}\\n\\n.sa-var-manager.freeze input:focus,\\n.sa-var-manager.freeze textarea:focus {\\n opacity: 1;\\n}\\n\\n.sa-var-manager-heading {\\n display: block;\\n font-weight: bold;\\n font-size: large;\\n margin-top: 6px;\\n margin-bottom: 6px;\\n}\\n\\n.sa-var-manager-name {\\n word-break: break-word;\\n}\\n\\n.sa-var-manager .sa-var-manager-value {\\n width: 75%;\\n}\\n\\n.sa-var-manager * > input {\\n background: none;\\n border: none;\\n padding: 8px;\\n width: 100%;\\n height: 100%;\\n}\\n\\n.sa-var-manager-value > textarea {\\n background: none;\\n border: none;\\n padding: 8px;\\n width: 100%;\\n height: 100%;\\n line-height: 2em;\\n resize: none;\\n}\\n\\n.sa-var-manager-too-big {\\n display: none;\\n cursor: pointer;\\n font: inherit;\\n font-style: italic;\\n color: inherit;\\n background: none;\\n border: none;\\n margin: 0;\\n padding: 8px;\\n opacity: 0.8;\\n width: 100%;\\n text-align: left;\\n}\\n.sa-var-manager-too-big:hover {\\n text-decoration: underline;\\n}\\n[data-too-big=\"true\"] .sa-var-manager-too-big {\\n display: block;\\n}\\n[data-too-big=\"true\"] .sa-var-manager-value-input {\\n display: none;\\n}\\n\\n.sa-var-manager table {\\n border-radius: 5px;\\n border-collapse: collapse;\\n width: 100%;\\n}\\n\\n.sa-var-manager td {\\n border: 1px solid var(--ui-black-transparent);\\n text-align: left;\\n}\\n\\n/* tr:nth-child(even) {\\n background-color: #dddddd;\\n} */\\n',\"\"])},1488:function(e,t){e.exports=\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCI+PHBhdGggZD0iTTE1LjUgMTRoLS43OWwtLjI4LS4yN0E2LjQ3MSA2LjQ3MSAwIDAgMCAxNiA5LjUgNi41IDYuNSAwIDEgMCA5LjUgMTZjMS42MSAwIDMuMDktLjU5IDQuMjMtMS41N2wuMjcuMjh2Ljc5bDUgNC45OUwyMC40OSAxOWwtNC45OS01em0tNiAwQzcuMDEgMTQgNSAxMS45OSA1IDkuNVM3LjAxIDUgOS41IDUgMTQgNy4wMSAxNCA5LjUgMTEuOTkgMTQgOS41IDE0eiIgZmlsbD0iI0QzRDNEMyIvPjxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz48L3N2Zz4=\"},1532:function(e,t,a){\"use strict\";a.r(t),a.d(t,\"resources\",(function(){return i}));var n=a(1487);const i={\"userscript.js\":async function(e){let{addon:t,console:a,msg:n}=e;const i=t.tab.traps.vm;let s=[],r=[],c=!1;const o=document.createElement(\"div\");o.classList.add(t.tab.scratchClass(\"asset-panel_wrapper\"),\"sa-var-manager\");const l=document.createElement(\"input\");l.placeholder=n(\"search\"),l.className=t.tab.scratchClass(\"input_input-form\",{others:\"sa-var-manager-searchbox\"}),l.addEventListener(\"input\",(e=>{for(const e of s)e.handleSearch(l.value);for(const e of r)e.handleSearch(l.value);I()})),o.appendChild(l);const d=document.createElement(\"div\"),u=document.createElement(\"span\"),g=document.createElement(\"table\");u.className=\"sa-var-manager-heading\",u.innerText=n(\"for-this-sprite\"),d.appendChild(u),d.appendChild(g);const h=document.createElement(\"div\"),p=document.createElement(\"span\"),b=document.createElement(\"table\");p.className=\"sa-var-manager-heading\",p.innerText=n(\"for-all-sprites\"),h.appendChild(p),h.appendChild(b),o.appendChild(d),o.appendChild(h);const M=document.createElement(\"li\");t.tab.displayNoneWhileDisabled(M,{display:\"flex\"}),M.classList.add(t.tab.scratchClass(\"react-tabs_react-tabs__tab\"),t.tab.scratchClass(\"gui_tab\")),M.id=\"react-tabs-sa-variable-manager\";const m=t.tab.recolorable();m.draggable=!1,m.src=t.self.getResource(\"/icon.svg\");const v=document.createElement(\"span\");function I(){let e=s.filter((e=>\"none\"!==e.row.style.display)),t=r.filter((e=>\"none\"!==e.row.style.display));u.style.display=0===e.length?\"none\":\"\",p.style.display=0===t.length?\"none\":\"\"}v.innerText=n(\"variables\"),M.appendChild(m),M.appendChild(v);const A=new WeakMap,x=new IntersectionObserver((e=>{for(const t of e){A.get(t.target).setVisible(t.isIntersecting)}}),{rootMargin:\"100px\"});class E{constructor(e,t){this.scratchVariable=e,this.target=t,this.visible=!1,this.ignoreTooBig=!1,this.buildDOM()}updateValue(e){if(!this.visible&&!e)return;let t,a;if(\"list\"===this.scratchVariable.type?(t=this.scratchVariable.value.join(\"\\n\"),a=5e6):(t=this.scratchVariable.value,a=1e6),!this.ignoreTooBig&&t.length>a)return this.input.value=\"\",void(this.row.dataset.tooBig=!0);this.row.dataset.tooBig=!1,t!==this.input.value&&(this.input.disabled=!1,this.input.value=t)}handleSearch(e){this.scratchVariable.name.toLowerCase().includes(e.toLowerCase())||!e?(this.row.style.display=\"\",this.updateValue(!0)):this.row.style.display=\"none\"}resizeInputIfList(){if(\"list\"===this.scratchVariable.type){this.input.style.height=\"auto\";const e=Math.min(1e3,this.input.scrollHeight);e>0&&(this.input.style.height=e+\"px\")}}setVisible(e){this.visible!==e&&(this.visible=e,e&&this.updateValue())}buildDOM(){const e=\"sa-variable-manager-\".concat(this.scratchVariable.id),t=document.createElement(\"tr\");this.row=t;const a=document.createElement(\"td\");a.className=\"sa-var-manager-name\";const s=document.createElement(\"input\");s.value=this.scratchVariable.name,s.htmlFor=e;s.addEventListener(\"keydown\",(e=>{\"Enter\"===e.key&&e.target.blur()})),s.addEventListener(\"focusout\",(e=>{e.preventDefault();const t=Blockly.getMainWorkspace();let a=s.value;if(a===this.scratchVariable.name)return;this.scratchVariable.isCloud&&(a.startsWith(\"☁\")?a.startsWith(\"☁ \")||(a=a.substring(0,1)+\" \"+a.substring(1)):a=\"☁ \"+a);let n=!1;if(this.target.isStage){n=i.runtime.getAllVarNamesOfType(this.scratchVariable.type).includes(a)}else n=!!t.getVariable(a,this.scratchVariable.type);!a.trim()||n?s.value=this.scratchVariable.name:(t.renameVariableById(this.scratchVariable.id,a),s.value!==a&&(s.value=a))})),s.addEventListener(\"focus\",(e=>{c=!0,o.classList.add(\"freeze\")})),s.addEventListener(\"blur\",(e=>{c=!1,o.classList.remove(\"freeze\")})),a.appendChild(s),A.set(t,this),x.observe(t);const r=document.createElement(\"td\");r.className=\"sa-var-manager-value\";const d=document.createElement(\"button\");let u;this.tooBigElement=d,d.textContent=n(\"too-big\"),d.className=\"sa-var-manager-too-big\",d.addEventListener(\"click\",(()=>{this.ignoreTooBig=!0,this.updateValue(!0)})),u=\"list\"===this.scratchVariable.type?document.createElement(\"textarea\"):document.createElement(\"input\"),u.className=\"sa-var-manager-value-input\",u.id=e,this.input=u,this.updateValue(!0),\"list\"===this.scratchVariable.type&&this.input.addEventListener(\"input\",(()=>this.resizeInputIfList()),!1);u.addEventListener(\"keydown\",(e=>{\"INPUT\"===e.target.nodeName&&\"Enter\"===e.key&&e.target.blur()})),u.addEventListener(\"focusout\",(e=>{e.preventDefault(),\"list\"===this.scratchVariable.type?i.setVariableValue(this.target.id,this.scratchVariable.id,u.value.split(\"\\n\")):i.setVariableValue(this.target.id,this.scratchVariable.id,u.value),u.blur()})),u.addEventListener(\"focus\",(e=>{c=!0,o.classList.add(\"freeze\")})),u.addEventListener(\"blur\",(e=>{c=!1,o.classList.remove(\"freeze\")})),r.appendChild(u),r.appendChild(d),t.appendChild(a),t.appendChild(r),this.handleSearch(l.value)}}function y(){var e,a,n;if(3!==(null===(e=t.tab.redux.state)||void 0===e||null===(a=e.scratchGui)||void 0===a||null===(n=a.editorTab)||void 0===n?void 0:n.activeTabIndex)||c)return;const o=i.runtime.getEditingTarget(),l=i.runtime.getTargetForStage();for(s=o.isStage?[]:Object.values(o.variables).filter((e=>\"\"===e.type||\"list\"===e.type)).map((e=>new E(e,o))),r=Object.values(l.variables).filter((e=>\"\"===e.type||\"list\"===e.type)).map((e=>new E(e,l))),I();g.firstChild;)g.removeChild(g.firstChild);for(;b.firstChild;)b.removeChild(b.firstChild);for(const e of s)g.appendChild(e.row),e.resizeInputIfList();for(const e of r)b.appendChild(e.row),e.resizeInputIfList()}function D(e){if(e){M.classList.add(t.tab.scratchClass(\"react-tabs_react-tabs__tab--selected\"),t.tab.scratchClass(\"gui_is-selected\"));document.querySelector(\"[class^=gui_tabs]\").insertAdjacentElement(\"beforeend\",o),y()}else M.classList.remove(t.tab.scratchClass(\"react-tabs_react-tabs__tab--selected\"),t.tab.scratchClass(\"gui_is-selected\")),o.remove(),s=[],r=[]}M.addEventListener(\"click\",(e=>{t.tab.redux.dispatch({type:\"scratch-gui/navigation/ACTIVATE_TAB\",activeTabIndex:3})})),t.tab.redux.initialize(),t.tab.redux.addEventListener(\"statechanged\",(e=>{let{detail:a}=e;if(\"scratch-gui/navigation/ACTIVATE_TAB\"===a.action.type){const e=document.body.contains(o),t=3===a.action.activeTabIndex;e&&!t&&queueMicrotask((()=>window.dispatchEvent(new Event(\"resize\")))),D(t)}else\"scratch-gui/mode/SET_PLAYER\"===a.action.type&&(a.action.isPlayerOnly||3!==t.tab.redux.state.scratchGui.editorTab.activeTabIndex||queueMicrotask((()=>D(!0))))})),i.runtime.on(\"PROJECT_LOADED\",(()=>{try{y()}catch(e){a.error(e)}})),i.runtime.on(\"TOOLBOX_EXTENSIONS_NEED_UPDATE\",(()=>{try{y()}catch(e){a.error(e)}}));const L=i.runtime._step;for(i.runtime._step=function(){for(var e=arguments.length,n=new Array(e),i=0;i{3===t.tab.redux.state.scratchGui.editorTab.activeTabIndex&&t.tab.redux.dispatch({type:\"scratch-gui/navigation/ACTIVATE_TAB\",activeTabIndex:2})}));;)await t.tab.waitForElement(\"[class^='react-tabs_react-tabs__tab-list']\",{markAsSeen:!0,reduxEvents:[\"scratch-gui/mode/SET_PLAYER\",\"fontsLoaded/SET_FONTS_LOADED\",\"scratch-gui/locales/SELECT_LOCALE\"],reduxCondition:e=>!e.scratchGui.mode.isPlayerOnly}),t.tab.appendToSharedSpace({space:\"afterSoundTab\",element:M,order:3})},\"style.css\":a.n(n).a,\"icon.svg\":\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMCAyMCIgZmlsbD0iIzg1NWNkNiI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNNC42NDkgMy4wODRBMSAxIDAgMCAxIDUuMTYzIDQuNCAxMy45NSAxMy45NSAwIDAgMCA0IDEwYzAgMS45OTMuNDE2IDMuODg2IDEuMTY0IDUuNmExIDEgMCAwIDEtMS44MzIuOEExNS45NSAxNS45NSAwIDAgMSAyIDEwYzAtMi4yNzQuNDc1LTQuNDQgMS4zMzItNi40YTEgMSAwIDAgMSAxLjMxNy0uNTE2ek0xMi45NiA3YTMgMyAwIDAgMC0yLjM0MiAxLjEyNmwtLjMyOC40MS0uMTExLS4yNzlBMiAyIDAgMCAwIDguMzIzIDdIOGExIDEgMCAwIDAgMCAyaC4zMjNsLjUzMiAxLjMzLTEuMDM1IDEuMjk1YTEgMSAwIDAgMS0uNzgxLjM3NUg3YTEgMSAwIDEgMCAwIDJoLjAzOWEzIDMgMCAwIDAgMi4zNDItMS4xMjZsLjMyOC0uNDEuMTExLjI3OUEyIDIgMCAwIDAgMTEuNjc3IDE0SDEyYTEgMSAwIDEgMCAwLTJoLS4zMjNsLS41MzItMS4zMyAxLjAzNS0xLjI5NUExIDEgMCAwIDEgMTIuOTYxIDlIMTNhMSAxIDAgMSAwIDAtMmgtLjAzOXptMS44NzQtMi42YTEgMSAwIDAgMSAxLjgzMy0uOEExNS45NSAxNS45NSAwIDAgMSAxOCAxMGMwIDIuMjc0LS40NzUgNC40NC0xLjMzMiA2LjRhMSAxIDAgMSAxLTEuODMyLS44QTEzLjk0OSAxMy45NDkgMCAwIDAgMTYgMTBjMC0xLjk5My0uNDE2LTMuODg2LTEuMTY1LTUuNnoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPgo=\",\"search.svg\":\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCI+PHBhdGggZD0iTTE1LjUgMTRoLS43OWwtLjI4LS4yN0E2LjQ3MSA2LjQ3MSAwIDAgMCAxNiA5LjUgNi41IDYuNSAwIDEgMCA5LjUgMTZjMS42MSAwIDMuMDktLjU5IDQuMjMtMS41N2wuMjcuMjh2Ljc5bDUgNC45OUwyMC40OSAxOWwtNC45OS01em0tNiAwQzcuMDEgMTQgNSAxMS45OSA1IDkuNVM3LjAxIDUgOS41IDUgMTQgNy4wMSAxNCA5LjUgMTEuOTkgMTQgOS41IDE0eiIgZmlsbD0iI0QzRDNEMyIvPjxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz48L3N2Zz4=\"}}}]);","name":"js/pentapod/addon-entry-variable-manager.2cc194cd4b6bb339bdfb.js","input":"(window[\"webpackJsonpGUI\"] = window[\"webpackJsonpGUI\"] || []).push([[62],{\n\n/***/ 1487:\n/***/ (function(module, exports, __webpack_require__) {\n\nvar escape = __webpack_require__(261);\nexports = module.exports = __webpack_require__(9)(false);\n// imports\n\n\n// module\nexports.push([module.i, \"/* Change z-indexes to allow more than 3 tabs */\\n[class*=\\\"gui_tab_\\\"][class*=\\\"gui_is-selected_\\\"] {\\n z-index: 10 !important;\\n}\\n[class*=\\\"gui_tab_\\\"]:nth-of-type(1) {\\n z-index: 9;\\n}\\n[class*=\\\"gui_tab_\\\"]:nth-of-type(2) {\\n z-index: 8;\\n}\\n[class*=\\\"gui_tab_\\\"]:nth-of-type(3) {\\n z-index: 7;\\n}\\n[class*=\\\"gui_tab_\\\"]:nth-of-type(4) {\\n z-index: 6;\\n}\\n\\n.sa-var-manager {\\n display: block;\\n padding: 18px;\\n /* weird hack to fix scrolling??? */\\n height: 50px;\\n overflow-y: auto;\\n}\\n\\n.sa-var-manager-searchbox {\\n background-image: url(\" + escape(__webpack_require__(1488)) + \");\\n width: 25%;\\n margin-bottom: 4px;\\n padding: 8px;\\n padding-right: 32px; /* for the text to not overlap the image */\\n border-radius: 4px;\\n background-repeat: no-repeat;\\n background-size: 18px 18px;\\n background-position: calc(100% - 7px) center;\\n font-size: 0.75rem;\\n}\\n\\n[dir=\\\"rtl\\\"] .sa-var-manager-searchbox {\\n padding-right: 8px;\\n padding-left: 32px;\\n background-position: 7px center;\\n}\\n\\n.sa-var-manager.freeze .sa-var-manager-value *,\\n.sa-var-manager.freeze .sa-var-manager-name * {\\n opacity: 0.5;\\n}\\n\\n.sa-var-manager.freeze input:focus,\\n.sa-var-manager.freeze textarea:focus {\\n opacity: 1;\\n}\\n\\n.sa-var-manager-heading {\\n display: block;\\n font-weight: bold;\\n font-size: large;\\n margin-top: 6px;\\n margin-bottom: 6px;\\n}\\n\\n.sa-var-manager-name {\\n word-break: break-word;\\n}\\n\\n.sa-var-manager .sa-var-manager-value {\\n width: 75%;\\n}\\n\\n.sa-var-manager * > input {\\n background: none;\\n border: none;\\n padding: 8px;\\n width: 100%;\\n height: 100%;\\n}\\n\\n.sa-var-manager-value > textarea {\\n background: none;\\n border: none;\\n padding: 8px;\\n width: 100%;\\n height: 100%;\\n line-height: 2em;\\n resize: none;\\n}\\n\\n.sa-var-manager-too-big {\\n display: none;\\n cursor: pointer;\\n font: inherit;\\n font-style: italic;\\n color: inherit;\\n background: none;\\n border: none;\\n margin: 0;\\n padding: 8px;\\n opacity: 0.8;\\n width: 100%;\\n text-align: left;\\n}\\n.sa-var-manager-too-big:hover {\\n text-decoration: underline;\\n}\\n[data-too-big=\\\"true\\\"] .sa-var-manager-too-big {\\n display: block;\\n}\\n[data-too-big=\\\"true\\\"] .sa-var-manager-value-input {\\n display: none;\\n}\\n\\n.sa-var-manager table {\\n border-radius: 5px;\\n border-collapse: collapse;\\n width: 100%;\\n}\\n\\n.sa-var-manager td {\\n border: 1px solid var(--ui-black-transparent);\\n text-align: left;\\n}\\n\\n/* tr:nth-child(even) {\\n background-color: #dddddd;\\n} */\\n\", \"\"]);\n\n// exports\n\n\n/***/ }),\n\n/***/ 1488:\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCI+PHBhdGggZD0iTTE1LjUgMTRoLS43OWwtLjI4LS4yN0E2LjQ3MSA2LjQ3MSAwIDAgMCAxNiA5LjUgNi41IDYuNSAwIDEgMCA5LjUgMTZjMS42MSAwIDMuMDktLjU5IDQuMjMtMS41N2wuMjcuMjh2Ljc5bDUgNC45OUwyMC40OSAxOWwtNC45OS01em0tNiAwQzcuMDEgMTQgNSAxMS45OSA1IDkuNVM3LjAxIDUgOS41IDUgMTQgNy4wMSAxNCA5LjUgMTEuOTkgMTQgOS41IDE0eiIgZmlsbD0iI0QzRDNEMyIvPjxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz48L3N2Zz4=\"\n\n/***/ }),\n\n/***/ 1532:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, \"resources\", function() { return /* binding */ resources; });\n\n// CONCATENATED MODULE: ./src/addons/addons/variable-manager/userscript.js\n/* harmony default export */ var userscript = (async function (_ref) {\n let {\n addon,\n console,\n msg\n } = _ref;\n const vm = addon.tab.traps.vm;\n let localVariables = [];\n let globalVariables = [];\n let preventUpdate = false;\n const manager = document.createElement(\"div\");\n manager.classList.add(addon.tab.scratchClass(\"asset-panel_wrapper\"), \"sa-var-manager\");\n const searchBox = document.createElement(\"input\");\n searchBox.placeholder = msg(\"search\");\n searchBox.className = addon.tab.scratchClass(\"input_input-form\", {\n others: \"sa-var-manager-searchbox\"\n });\n searchBox.addEventListener(\"input\", e => {\n for (const variable of localVariables) {\n variable.handleSearch(searchBox.value);\n }\n for (const variable of globalVariables) {\n variable.handleSearch(searchBox.value);\n }\n updateHeadingVisibility();\n });\n manager.appendChild(searchBox);\n const localVars = document.createElement(\"div\");\n const localHeading = document.createElement(\"span\");\n const localList = document.createElement(\"table\");\n localHeading.className = \"sa-var-manager-heading\";\n localHeading.innerText = msg(\"for-this-sprite\");\n localVars.appendChild(localHeading);\n localVars.appendChild(localList);\n const globalVars = document.createElement(\"div\");\n const globalHeading = document.createElement(\"span\");\n const globalList = document.createElement(\"table\");\n globalHeading.className = \"sa-var-manager-heading\";\n globalHeading.innerText = msg(\"for-all-sprites\");\n globalVars.appendChild(globalHeading);\n globalVars.appendChild(globalList);\n manager.appendChild(localVars);\n manager.appendChild(globalVars);\n const varTab = document.createElement(\"li\");\n addon.tab.displayNoneWhileDisabled(varTab, {\n display: \"flex\"\n });\n varTab.classList.add(addon.tab.scratchClass(\"react-tabs_react-tabs__tab\"), addon.tab.scratchClass(\"gui_tab\"));\n // Cannot use number due to conflict after leaving and re-entering editor\n varTab.id = \"react-tabs-sa-variable-manager\";\n const varTabIcon = addon.tab.recolorable();\n varTabIcon.draggable = false;\n varTabIcon.src = addon.self.getResource(\"/icon.svg\") /* rewritten by pull.js */;\n const varTabText = document.createElement(\"span\");\n varTabText.innerText = msg(\"variables\");\n varTab.appendChild(varTabIcon);\n varTab.appendChild(varTabText);\n function updateHeadingVisibility() {\n // used to hide the headings if there are no variables\n let filteredLocals = localVariables.filter(v => v.row.style.display !== \"none\");\n let filteredGlobals = globalVariables.filter(v => v.row.style.display !== \"none\");\n localHeading.style.display = filteredLocals.length === 0 ? \"none\" : \"\";\n globalHeading.style.display = filteredGlobals.length === 0 ? \"none\" : \"\";\n }\n const rowToVariableMap = new WeakMap();\n const observer = new IntersectionObserver(changes => {\n for (const change of changes) {\n const variable = rowToVariableMap.get(change.target);\n variable.setVisible(change.isIntersecting);\n }\n }, {\n rootMargin: \"100px\"\n });\n class WrappedVariable {\n constructor(scratchVariable, target) {\n this.scratchVariable = scratchVariable;\n this.target = target;\n this.visible = false;\n this.ignoreTooBig = false;\n this.buildDOM();\n }\n updateValue(force) {\n if (!this.visible && !force) return;\n let newValue;\n let maxSafeLength;\n if (this.scratchVariable.type === \"list\") {\n newValue = this.scratchVariable.value.join(\"\\n\");\n maxSafeLength = 5000000;\n } else {\n newValue = this.scratchVariable.value;\n maxSafeLength = 1000000;\n }\n if (!this.ignoreTooBig && newValue.length > maxSafeLength) {\n this.input.value = \"\";\n this.row.dataset.tooBig = true;\n return;\n }\n this.row.dataset.tooBig = false;\n if (newValue !== this.input.value) {\n this.input.disabled = false;\n this.input.value = newValue;\n }\n }\n handleSearch(search) {\n // this doesn't check if this.visible is true or whatever. maybe that would improve performance while typing into the search box but it's probably fine™\n if (this.scratchVariable.name.toLowerCase().includes(search.toLowerCase()) || !search) {\n // fuzzy searches are lame we are too cool for fuzzy searches (& i doubt they're even the right thing to use here, this should work fine enough)\n this.row.style.display = \"\"; // make the row normal\n this.updateValue(true); // force it to update because its hidden and it wouldn't be able to otherwise\n } else {\n this.row.style.display = \"none\"; // set the entire row as hidden\n }\n }\n resizeInputIfList() {\n if (this.scratchVariable.type === \"list\") {\n this.input.style.height = \"auto\";\n const height = Math.min(1000, this.input.scrollHeight);\n if (height > 0) {\n this.input.style.height = height + \"px\";\n }\n }\n }\n setVisible(visible) {\n if (this.visible === visible) return;\n this.visible = visible;\n if (visible) {\n this.updateValue();\n }\n }\n buildDOM() {\n const id = \"sa-variable-manager-\".concat(this.scratchVariable.id);\n const row = document.createElement(\"tr\");\n this.row = row;\n const labelCell = document.createElement(\"td\");\n labelCell.className = \"sa-var-manager-name\";\n const label = document.createElement(\"input\");\n label.value = this.scratchVariable.name;\n label.htmlFor = id;\n const onLabelOut = e => {\n e.preventDefault();\n const workspace = Blockly.getMainWorkspace();\n let newName = label.value;\n if (newName === this.scratchVariable.name) {\n // If the name is unchanged before we make sure the cloud prefix exists, there's nothing to do.\n return;\n }\n const CLOUD_SYMBOL = \"☁\";\n const CLOUD_PREFIX = CLOUD_SYMBOL + \" \";\n if (this.scratchVariable.isCloud) {\n if (newName.startsWith(CLOUD_SYMBOL)) {\n if (!newName.startsWith(CLOUD_PREFIX)) {\n // There isn't a space between the cloud symbol and the name, so add one.\n newName = newName.substring(0, 1) + \" \" + newName.substring(1);\n }\n } else {\n newName = CLOUD_PREFIX + newName;\n }\n }\n let nameAlreadyUsed = false;\n if (this.target.isStage) {\n // Global variables must not conflict with any global variables or local variables in any sprite.\n const existingNames = vm.runtime.getAllVarNamesOfType(this.scratchVariable.type);\n nameAlreadyUsed = existingNames.includes(newName);\n } else {\n // Local variables must not conflict with any global variables or local variables in this sprite.\n nameAlreadyUsed = !!workspace.getVariable(newName, this.scratchVariable.type);\n }\n const isEmpty = !newName.trim();\n if (isEmpty || nameAlreadyUsed) {\n label.value = this.scratchVariable.name;\n } else {\n workspace.renameVariableById(this.scratchVariable.id, newName);\n // Only update the input's value when we need to to avoid resetting undo history.\n if (label.value !== newName) {\n label.value = newName;\n }\n }\n };\n label.addEventListener(\"keydown\", e => {\n if (e.key === \"Enter\") e.target.blur();\n });\n label.addEventListener(\"focusout\", onLabelOut);\n label.addEventListener(\"focus\", e => {\n preventUpdate = true;\n manager.classList.add(\"freeze\");\n });\n label.addEventListener(\"blur\", e => {\n preventUpdate = false;\n manager.classList.remove(\"freeze\");\n });\n labelCell.appendChild(label);\n rowToVariableMap.set(row, this);\n observer.observe(row);\n const valueCell = document.createElement(\"td\");\n valueCell.className = \"sa-var-manager-value\";\n const tooBigElement = document.createElement(\"button\");\n this.tooBigElement = tooBigElement;\n tooBigElement.textContent = msg(\"too-big\");\n tooBigElement.className = \"sa-var-manager-too-big\";\n tooBigElement.addEventListener(\"click\", () => {\n this.ignoreTooBig = true;\n this.updateValue(true);\n });\n let input;\n if (this.scratchVariable.type === \"list\") {\n input = document.createElement(\"textarea\");\n } else {\n input = document.createElement(\"input\");\n }\n input.className = \"sa-var-manager-value-input\";\n input.id = id;\n this.input = input;\n this.updateValue(true);\n if (this.scratchVariable.type === \"list\") {\n this.input.addEventListener(\"input\", () => this.resizeInputIfList(), false);\n }\n const onInputOut = e => {\n e.preventDefault();\n if (this.scratchVariable.type === \"list\") {\n vm.setVariableValue(this.target.id, this.scratchVariable.id, input.value.split(\"\\n\"));\n } else {\n vm.setVariableValue(this.target.id, this.scratchVariable.id, input.value);\n }\n input.blur();\n };\n input.addEventListener(\"keydown\", e => {\n if (e.target.nodeName === \"INPUT\" && e.key === \"Enter\") e.target.blur();\n });\n input.addEventListener(\"focusout\", onInputOut);\n input.addEventListener(\"focus\", e => {\n preventUpdate = true;\n manager.classList.add(\"freeze\");\n });\n input.addEventListener(\"blur\", e => {\n preventUpdate = false;\n manager.classList.remove(\"freeze\");\n });\n valueCell.appendChild(input);\n valueCell.appendChild(tooBigElement);\n row.appendChild(labelCell);\n row.appendChild(valueCell);\n this.handleSearch(searchBox.value);\n }\n }\n function fullReload() {\n var _addon$tab$redux$stat, _addon$tab$redux$stat2, _addon$tab$redux$stat3;\n if (((_addon$tab$redux$stat = addon.tab.redux.state) === null || _addon$tab$redux$stat === void 0 ? void 0 : (_addon$tab$redux$stat2 = _addon$tab$redux$stat.scratchGui) === null || _addon$tab$redux$stat2 === void 0 ? void 0 : (_addon$tab$redux$stat3 = _addon$tab$redux$stat2.editorTab) === null || _addon$tab$redux$stat3 === void 0 ? void 0 : _addon$tab$redux$stat3.activeTabIndex) !== 3 || preventUpdate) return;\n const editingTarget = vm.runtime.getEditingTarget();\n const stage = vm.runtime.getTargetForStage();\n localVariables = editingTarget.isStage ? [] : Object.values(editingTarget.variables).filter(i => i.type === \"\" || i.type === \"list\").map(i => new WrappedVariable(i, editingTarget));\n globalVariables = Object.values(stage.variables).filter(i => i.type === \"\" || i.type === \"list\").map(i => new WrappedVariable(i, stage));\n updateHeadingVisibility();\n while (localList.firstChild) {\n localList.removeChild(localList.firstChild);\n }\n while (globalList.firstChild) {\n globalList.removeChild(globalList.firstChild);\n }\n for (const variable of localVariables) {\n localList.appendChild(variable.row);\n variable.resizeInputIfList();\n }\n for (const variable of globalVariables) {\n globalList.appendChild(variable.row);\n variable.resizeInputIfList();\n }\n }\n function quickReload() {\n var _addon$tab$redux$stat4, _addon$tab$redux$stat5, _addon$tab$redux$stat6;\n if (((_addon$tab$redux$stat4 = addon.tab.redux.state) === null || _addon$tab$redux$stat4 === void 0 ? void 0 : (_addon$tab$redux$stat5 = _addon$tab$redux$stat4.scratchGui) === null || _addon$tab$redux$stat5 === void 0 ? void 0 : (_addon$tab$redux$stat6 = _addon$tab$redux$stat5.editorTab) === null || _addon$tab$redux$stat6 === void 0 ? void 0 : _addon$tab$redux$stat6.activeTabIndex) !== 3 || preventUpdate) return;\n for (const variable of localVariables) {\n variable.updateValue();\n }\n for (const variable of globalVariables) {\n variable.updateValue();\n }\n }\n function cleanup() {\n localVariables = [];\n globalVariables = [];\n }\n varTab.addEventListener(\"click\", e => {\n addon.tab.redux.dispatch({\n type: \"scratch-gui/navigation/ACTIVATE_TAB\",\n activeTabIndex: 3\n });\n });\n function setVisible(visible) {\n if (visible) {\n varTab.classList.add(addon.tab.scratchClass(\"react-tabs_react-tabs__tab--selected\"), addon.tab.scratchClass(\"gui_is-selected\"));\n const contentArea = document.querySelector(\"[class^=gui_tabs]\");\n contentArea.insertAdjacentElement(\"beforeend\", manager);\n fullReload();\n } else {\n varTab.classList.remove(addon.tab.scratchClass(\"react-tabs_react-tabs__tab--selected\"), addon.tab.scratchClass(\"gui_is-selected\"));\n manager.remove();\n cleanup();\n }\n }\n addon.tab.redux.initialize();\n addon.tab.redux.addEventListener(\"statechanged\", _ref2 => {\n let {\n detail\n } = _ref2;\n if (detail.action.type === \"scratch-gui/navigation/ACTIVATE_TAB\") {\n const varManagerWasSelected = document.body.contains(manager);\n const switchedToVarManager = detail.action.activeTabIndex === 3;\n if (varManagerWasSelected && !switchedToVarManager) {\n // Fixes #5773\n queueMicrotask(() => window.dispatchEvent(new Event(\"resize\")));\n }\n setVisible(switchedToVarManager);\n } else if (detail.action.type === \"scratch-gui/mode/SET_PLAYER\") {\n if (!detail.action.isPlayerOnly && addon.tab.redux.state.scratchGui.editorTab.activeTabIndex === 3) {\n // DOM doesn't actually exist yet\n queueMicrotask(() => setVisible(true));\n }\n }\n });\n vm.runtime.on(\"PROJECT_LOADED\", () => {\n try {\n fullReload();\n } catch (e) {\n console.error(e);\n }\n });\n vm.runtime.on(\"TOOLBOX_EXTENSIONS_NEED_UPDATE\", () => {\n try {\n fullReload();\n } catch (e) {\n console.error(e);\n }\n });\n const oldStep = vm.runtime._step;\n vm.runtime._step = function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n const ret = oldStep.call(this, ...args);\n try {\n quickReload();\n } catch (e) {\n console.error(e);\n }\n return ret;\n };\n addon.self.addEventListener(\"disabled\", () => {\n if (addon.tab.redux.state.scratchGui.editorTab.activeTabIndex === 3) {\n addon.tab.redux.dispatch({\n type: \"scratch-gui/navigation/ACTIVATE_TAB\",\n activeTabIndex: 2\n });\n }\n });\n while (true) {\n await addon.tab.waitForElement(\"[class^='react-tabs_react-tabs__tab-list']\", {\n markAsSeen: true,\n reduxEvents: [\"scratch-gui/mode/SET_PLAYER\", \"fontsLoaded/SET_FONTS_LOADED\", \"scratch-gui/locales/SELECT_LOCALE\"],\n reduxCondition: state => !state.scratchGui.mode.isPlayerOnly\n });\n addon.tab.appendToSharedSpace({\n space: \"afterSoundTab\",\n element: varTab,\n order: 3\n });\n }\n});\n// EXTERNAL MODULE: ./node_modules/css-loader!./src/addons/addons/variable-manager/style.css\nvar style = __webpack_require__(1487);\nvar style_default = /*#__PURE__*/__webpack_require__.n(style);\n\n// CONCATENATED MODULE: ./node_modules/url-loader/dist/cjs.js!./src/addons/addons/variable-manager/icon.svg\n/* harmony default export */ var icon = (\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMCAyMCIgZmlsbD0iIzg1NWNkNiI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNNC42NDkgMy4wODRBMSAxIDAgMCAxIDUuMTYzIDQuNCAxMy45NSAxMy45NSAwIDAgMCA0IDEwYzAgMS45OTMuNDE2IDMuODg2IDEuMTY0IDUuNmExIDEgMCAwIDEtMS44MzIuOEExNS45NSAxNS45NSAwIDAgMSAyIDEwYzAtMi4yNzQuNDc1LTQuNDQgMS4zMzItNi40YTEgMSAwIDAgMSAxLjMxNy0uNTE2ek0xMi45NiA3YTMgMyAwIDAgMC0yLjM0MiAxLjEyNmwtLjMyOC40MS0uMTExLS4yNzlBMiAyIDAgMCAwIDguMzIzIDdIOGExIDEgMCAwIDAgMCAyaC4zMjNsLjUzMiAxLjMzLTEuMDM1IDEuMjk1YTEgMSAwIDAgMS0uNzgxLjM3NUg3YTEgMSAwIDEgMCAwIDJoLjAzOWEzIDMgMCAwIDAgMi4zNDItMS4xMjZsLjMyOC0uNDEuMTExLjI3OUEyIDIgMCAwIDAgMTEuNjc3IDE0SDEyYTEgMSAwIDEgMCAwLTJoLS4zMjNsLS41MzItMS4zMyAxLjAzNS0xLjI5NUExIDEgMCAwIDEgMTIuOTYxIDlIMTNhMSAxIDAgMSAwIDAtMmgtLjAzOXptMS44NzQtMi42YTEgMSAwIDAgMSAxLjgzMy0uOEExNS45NSAxNS45NSAwIDAgMSAxOCAxMGMwIDIuMjc0LS40NzUgNC40NC0xLjMzMiA2LjRhMSAxIDAgMSAxLTEuODMyLS44QTEzLjk0OSAxMy45NDkgMCAwIDAgMTYgMTBjMC0xLjk5My0uNDE2LTMuODg2LTEuMTY1LTUuNnoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPgo=\");\n// CONCATENATED MODULE: ./node_modules/url-loader/dist/cjs.js!./src/addons/addons/variable-manager/search.svg\n/* harmony default export */ var search = (\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCI+PHBhdGggZD0iTTE1LjUgMTRoLS43OWwtLjI4LS4yN0E2LjQ3MSA2LjQ3MSAwIDAgMCAxNiA5LjUgNi41IDYuNSAwIDEgMCA5LjUgMTZjMS42MSAwIDMuMDktLjU5IDQuMjMtMS41N2wuMjcuMjh2Ljc5bDUgNC45OUwyMC40OSAxOWwtNC45OS01em0tNiAwQzcuMDEgMTQgNSAxMS45OSA1IDkuNVM3LjAxIDUgOS41IDUgMTQgNy4wMSAxNCA5LjUgMTEuOTkgMTQgOS41IDE0eiIgZmlsbD0iI0QzRDNEMyIvPjxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz48L3N2Zz4=\");\n// CONCATENATED MODULE: ./src/addons/addons/variable-manager/_runtime_entry.js\n/* generated by pull.js */\n\n\n\n\nconst resources = {\n \"userscript.js\": userscript,\n \"style.css\": style_default.a,\n \"icon.svg\": icon,\n \"search.svg\": search\n};\n\n/***/ })\n\n}]);","inputSourceMap":null}